diff --git a/.gitignore b/.gitignore index 7959f7300..568b040ea 100644 --- a/.gitignore +++ b/.gitignore @@ -7,12 +7,18 @@ client/node_modules client/.pnp client.pnp.js +admin/node_modules +admin/.pnp +admin.pnp.js # testing /coverage client/coverage +admin/coverage + # production /build client/build +admin/build # misc .DS_Store .env @@ -25,7 +31,12 @@ client/.env npm-debug.log* yarn-debug.log* yarn-error.log* - +client/npm-debug.log* +client/yarn-debug.log* +client/yarn-error.log* +admin/npm-debug.log* +admin/yarn-debug.log* +admin/yarn-error.log* #Firebase Ignore # Logs diff --git a/.vscode/bodyshopsnippets.code-snippets b/.vscode/bodyshopsnippets.code-snippets new file mode 100644 index 000000000..570672e7b --- /dev/null +++ b/.vscode/bodyshopsnippets.code-snippets @@ -0,0 +1,64 @@ +{ + // Place your bodyshop workspace snippets here. Each snippet is defined under a snippet name and has a scope, prefix, body and + // description. Add comma separated ids of the languages where the snippet is applicable in the scope field. If scope + // is left empty or omitted, the snippet gets applied to all languages. The prefix is what is + // used to trigger the snippet and the body will be expanded and inserted. Possible variables are: + // $1, $2 for tab stops, $0 for the final cursor position, and ${1:label}, ${2:another} for placeholders. + // Placeholders with the same ids are connected. + // Example: + // "Print to console": { + // "scope": "javascript,typescript", + // "prefix": "log", + // "body": [ + // "console.log('$1');", + // "$2" + // ], + // "description": "Log output to console" + // } + "Const T useTranslation": { + "prefix": "ttt", + "body": ["const { t } = useTranslation();"], + "description": "Use Translation Destructing." + }, + " useTranslation import": { + "prefix": "tti", + "body": ["import { useTranslation } from \"react-i18next\";"], + "description": "Use Translation import." + }, + "Redux Setup": { + "prefix": "rdx", + "body": [ + "import { connect } from \"react-redux\";", + "import { createStructuredSelector } from \"reselect\";", + "const mapStateToProps = createStructuredSelector({", + " //currentUser: selectCurrentUser", + "});", + "const mapDispatchToProps = dispatch => ({", + " //setUserLanguage: language => dispatch(setUserLanguage(language))", + "});", + "export default connect (mapStateToProps,mapDispatchToProps)();" + ], + "description": "General Redux." + }, + " Apollo Loading Error Handling import": { + "prefix": "ale", + "body": [ + "if (loading) return ;", + "if (error) return ;" + ], + "description": "Apollo Loading Error Handling import." + }, + "Log IMEX EVent Import": { + "prefix": "liei", + "body": [ + "import { logImEXEvent } from \"../../firebase/firebase.utils\"; " + ], + "description": "Apollo Loading Error Handling import." + }, + + "Log IMEX EVent": { + "prefix": "lie", + "body": ["logImEXEvent(\"EventName\", { prop: \"value\" });"], + "description": "" + } +} diff --git a/.vscode/launch.json b/.vscode/launch.json index 675e19b5c..857567401 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -1,13 +1,19 @@ { - "version": "0.2.0", - "configurations": [ - { - "name": "Chrome", - "type": "chrome", - "request": "launch", - "url": "http://localhost:3000", - "webRoot": "${workspaceRoot}/src" - - } - ] -} \ No newline at end of file + "version": "0.2.0", + "configurations": [ + { + "name": "Chrome", + "type": "chrome", + "request": "launch", + "url": "http://localhost:3000", + "webRoot": "${workspaceRoot}/src" + }, + { + "name": "Yarn Dev Server", + "type": "node", + "request": "launch", + "runtimeExecutable": "yarn", + "runtimeArgs": ["dev"] + } + ] +} diff --git a/README.MD b/README.MD index 33dfc36b0..c1e3d680b 100644 --- a/README.MD +++ b/README.MD @@ -12,3 +12,11 @@ npx hasura console --admin-secret Dev-BodyShopAppBySnaptSoftware! Migrating to Staging: npx hasura migrate apply --up 10 --endpoint https://bodyshop-staging-db.herokuapp.com/ --admin-secret Staging-BodyShopAppBySnaptSoftware! + +NGROK TEsting: + +./ngrok.exe http https://localhost:5000 -host-header="localhost:5000" + + +Finding deadfiles - run from client directory +npx deadfile ./src/index.js --exclude build templates diff --git a/_business_logic/NewShopSetup.md b/_business_logic/NewShopSetup.md index dc17f03f0..389582d25 100644 --- a/_business_logic/NewShopSetup.md +++ b/_business_logic/NewShopSetup.md @@ -49,3 +49,6 @@ --\* Set the region for the shop. -Counter Record - type: ronum + + +Create an in house vendor record and add it to the bodyshop record. \ No newline at end of file diff --git a/_reference/SampleEnv.md b/_reference/SampleEnv.md deleted file mode 100644 index aef3218b0..000000000 --- a/_reference/SampleEnv.md +++ /dev/null @@ -1,11 +0,0 @@ -server.env - -AWSAccessKeyId=AKIAJYNXY5KCA25PB2JA -AWSSecretKey=iYO/navUhHuEXc6fMgfUh1y3VZY1hF6ISrUMZ4de -Bucket=bodyshop-app-dev - - -client.env -REACT_APP_GRAPHQL_ENDPOINT=https://bodyshop-dev-db.herokuapp.com/v1/graphql -REACT_APP_GRAPHQL_ENDPOINT_WS=wss://bodyshop-dev-db.herokuapp.com/v1/graphql -REACT_APP_GA_CODE=217352234 diff --git a/_reference/SampleMetadata.md b/_reference/SampleMetadata.md new file mode 100644 index 000000000..f675a8b17 --- /dev/null +++ b/_reference/SampleMetadata.md @@ -0,0 +1,24 @@ +csiqueestions: +[{"name": "mailing", "type": "checkbox", "label": "Opt into our mailing list?", "required": false}, {"max": 5, "min": 0, "name": "slider", "type": "slider", "label": "Slide me.", "required": false}, {"name": "feedback", "type": "textarea", "label": "Do you have any general feedback you would like to share?", "required": false}, {"name": "overall", "type": "rate", "label": "How would you rate your overall experience with us?", "required": true}] + +md_ro_statuses +{"statuses": ["Open", "Scheduled", "Arrived", "Repair Plan", "Parts", "Body", "Prep", "Paint", "Reassembly", "Sublet", "Detail", "Completed", "Delivered", "Invoiced", "Exported"], "open_statuses": ["Open", "Scheduled", "Arrived", "Repair Plan", "Parts", "Body", "Prep", "Paint", "Reassembly", "Sublet", "Detail"], "default_arrived": "Arrived", "default_exported": "Exported", "default_imported": "Open", "default_invoiced": "Invoiced", "default_completed": "Completed", "default_delivered": "Delivered", "default_scheduled": "Scheduled", "production_statuses": ["Repair Plan", "Parts", "Body", "Prep", "Paint", "Reassembly", "Sublet", "Detail", "Completed"]} + +md_order_status +{"statuses": ["Ordered", "Received", "Canceled", "Backordered", "Returned"], "default_bo": "Backordered", "default_ordered": "Ordered", "default_canceled": "Canceled", "default_received": "Received", "default_returned": "Returned"} + +responsibilitycenters +{"ap": {"name": "AP", "accountdesc": "Pay to Others", "accountitem": "A/P", "accountname": "AP Acc#", "accountnumber": "Accounts Payable"}, "ar": {"name": "AR", "accountdesc": "1100", "accountitem": "A/R", "accountname": "ACCOUNTS RECEIVABLE", "accountnumber": "1100"}, "costs": [{"name": "Aftermarket", "accountdesc": "Aftermarketd", "accountitem": "Aftermarketi", "accountname": "BODY SHOP COST:PARTS:AFTERMARKET", "accountnumber": "Aftermarket"}, {"name": "ATP", "accountdesc": "ATPd", "accountitem": "BODY SHOP_ATP", "accountname": "BODY SHOP COST:ATP", "accountnumber": "ATP"}, {"name": "Body", "accountdesc": "BODY SHOP COST:LABOR", "accountitem": "BODY SHOP_LAB", "accountname": "BODY SHOP COST:LABOR:BODY", "accountnumber": "5001"}, {"name": "Detail", "accountdesc": "Detaild", "accountitem": "Detaili", "accountname": "BODY SHOP COST:LABOR:DETAIL", "accountnumber": "Detail"}, {"name": "Daignostic", "accountdesc": "Daignosticd", "accountitem": "Daignostici", "accountname": "Daignostic", "accountnumber": "Daignostic"}, {"name": "Electrical", "accountdesc": "Electricald", "accountitem": "Electricali", "accountname": "Electrical", "accountnumber": "Electrical"}, {"name": "Chrome", "accountdesc": "Chromed", "accountitem": "Chromei", "accountname": "Chrome", "accountnumber": "Chrome"}, {"name": "Frame", "accountdesc": "Framed", "accountitem": "Framei", "accountname": "BODY SHOP COST:LABOR:Frame", "accountnumber": "Frame"}, {"name": "Mechanical", "accountdesc": "Mechanicald", "accountitem": "Mechanicali", "accountname": "BODY SHOP COST:LABOR:MECHANICAL", "accountnumber": "Mechanical"}, {"name": "Refinish", "accountdesc": "Refinishd", "accountitem": "BODY SHOP_LAR", "accountname": "BODY SHOP COST:LABOR:REFINISH", "accountnumber": "5003"}, {"name": "Structural", "accountdesc": "Structurald", "accountitem": "Structurali", "accountname": "Structural", "accountnumber": "Structural"}, {"name": "Existing", "accountdesc": "Existingd", "accountitem": "Existingi", "accountname": "Existing", "accountnumber": "Existing"}, {"name": "Glass", "accountdesc": "Glassd", "accountitem": "Glassi", "accountname": "BODY SHOP COST:PARTS:Glass", "accountnumber": "Glass"}, {"name": "LKQ", "accountdesc": "LKQd", "accountitem": "LKQi", "accountname": "BODY SHOP COST:PARTS:LKQ", "accountnumber": "LKQ"}, {"name": "OEM", "accountdesc": "OEMd", "accountitem": "OEMi", "accountname": "BODY SHOP COST:PARTS:OEM", "accountnumber": "OEM"}, {"name": "OEM Partial", "accountdesc": "Partiald", "accountitem": "Partial", "accountname": "BODY SHOP COST:PARTS:OEM Partial", "accountnumber": "OEM Partial"}, {"name": "Re-cored", "accountdesc": "coredd", "accountitem": "coredi", "accountname": "Re-cored", "accountnumber": "Re-cored"}, {"name": "Remanufactured", "accountdesc": "Remanufacturedd", "accountitem": "Remanufacturedi", "accountname": "Remanufactured", "accountnumber": "Remanufactured"}, {"name": "Other", "accountdesc": "Otherd", "accountitem": "Otheri", "accountname": "Other", "accountnumber": "Other"}, {"name": "Sublet", "accountdesc": "Subletd", "accountitem": "Subleti", "accountname": "BODY SHOP COST:SUBLET", "accountnumber": "Sublet"}, {"name": "Towing", "accountdesc": "Towingd", "accountitem": "Towingi", "accountname": "BODY SHOP COST:TOWING", "accountnumber": "Towing"}, {"name": "Paint Mat", "accountdesc": "matd", "accountitem": "mati", "accountname": "BODY SHOP COST:PARTS:Materials", "accountnumber": "paint mat"}, {"name": "shop mat", "accountdesc": "shopd", "accountitem": "shopi", "accountname": "BODY SHOP COST:PARTS:Materials", "accountnumber": "shop"}], "taxes": {"local": {"name": "n", "rate": 0, "accountdesc": "n", "accountitem": "n", "accountname": "n", "accountnumber": "n"}, "state": {"name": "PST", "rate": 7, "accountdesc": "Ministry of Finance (BC)", "accountitem": "PST On Sales", "accountname": "PST Payable", "accountnumber": "2220"}, "federal": {"name": "GST", "rate": 5, "accountdesc": "Receiver General - GST", "accountitem": "GST On Sales", "accountname": "GST DUE-NET:GST Collected", "accountnumber": "2200a"}}, "profits": [{"name": "Aftermarket", "accountdesc": "Aftermarketd", "accountitem": "BODY SHOP_PAA", "accountname": "Aftermarket", "accountnumber": "Aftermarket"}, {"name": "ATP", "accountdesc": "ATPd", "accountitem": "BODY SHOP_ATP", "accountname": "ATP", "accountnumber": "ATP"}, {"name": "Body", "accountdesc": "BODY SHOP SALESLABOR:BODY", "accountitem": "BODY SHOP_LAB", "accountname": "BODY SHOP SALES:LABOR:BODY", "accountnumber": "5002"}, {"name": "Detail", "accountdesc": "Detaild", "accountitem": "BODY SHOP_DET", "accountname": "Detail", "accountnumber": "Detail"}, {"name": "Daignostic", "accountdesc": "Daignosticd", "accountitem": "BODY SHOP_LAD", "accountname": "Daignostic", "accountnumber": "Daignostic"}, {"name": "Electrical", "accountdesc": "Electricald", "accountitem": "BODY SHOP_LAE", "accountname": "Electrical", "accountnumber": "Electrical"}, {"name": "Chrome", "accountdesc": "Chromed", "accountitem": "BODY SHOP_PAC", "accountname": "Chrome", "accountnumber": "Chrome"}, {"name": "Frame", "accountdesc": "Framed", "accountitem": "BODY SHOP_LAF", "accountname": "Frame", "accountnumber": "Frame"}, {"name": "Mechanical", "accountdesc": "Mechanicald", "accountitem": "BODY SHOP_LAM", "accountname": "Mechanical", "accountnumber": "Mechanical"}, {"name": "Refinish", "accountdesc": "BODY SHOP SALES:LABOR:REFINISH", "accountitem": "BODY SHOP_LAR", "accountname": "BODY SHOP SALES:LABOR:REFINISH", "accountnumber": "5003"}, {"name": "Structural", "accountdesc": "Structurald", "accountitem": "BODY SHOP_LAS", "accountname": "Structural", "accountnumber": "Structural"}, {"name": "Existing", "accountdesc": "Existingd", "accountitem": "BODY SHOP_PAE", "accountname": "Existing", "accountnumber": "Existing"}, {"name": "Glass", "accountdesc": "Glassd", "accountitem": "BODY SHOP_PAG", "accountname": "Glass", "accountnumber": "Glass"}, {"name": "LKQ", "accountdesc": "LKQd", "accountitem": "BODY SHOP_PAL", "accountname": "LKQ", "accountnumber": "LKQ"}, {"name": "OEM", "accountdesc": "BODY SHOP SALES:PARTS:OEM", "accountitem": "BODY SHOP_PAN", "accountname": "BODY SHOP SALES:PARTS:OEM", "accountnumber": "OEM"}, {"name": "OEM Partial", "accountdesc": "Partiald", "accountitem": "BODY SHOP_PAP", "accountname": "OEM Partial", "accountnumber": "OEM Partial"}, {"name": "Re-cored", "accountdesc": "coredd", "accountitem": "BODY SHOP_PAO", "accountname": "Re-cored", "accountnumber": "Re-cored"}, {"name": "Remanufactured", "accountdesc": "Remanufacturedd", "accountitem": "BODY SHOP_PAO", "accountname": "Remanufactured", "accountnumber": "Remanufactured"}, {"name": "Other", "accountdesc": "Otherd", "accountitem": "BODY SHOP_PAO", "accountname": "Other", "accountnumber": "Other"}, {"name": "Sublet", "accountdesc": "Subletd", "accountitem": "BODY SHOP_PAS", "accountname": "Sublet", "accountnumber": "Sublet"}, {"name": "Towing", "accountdesc": "Towingd", "accountitem": "BODY SHOP_TOW", "accountname": "Towing", "accountnumber": "Towing"}, {"name": "paint", "accountdesc": "paintd", "accountitem": "BODY SHOP_MAPA", "accountname": "paint", "accountnumber": "paint"}, {"name": "shop", "accountdesc": "shopd", "accountitem": "BODY SHOP_MASH", "accountname": "shop", "accountnumber": "shop"}], "defaults": {"costs": {"ATP": "ATP", "LAB": "Body", "LAD": "Daignostic", "LAE": "Electrical", "LAF": "Frame", "LAG": "Glass", "LAM": "Mechanical", "LAR": "Refinish", "LAS": "Structural", "LAU": "Detail", "PAA": "Aftermarket", "PAC": "Chrome", "PAL": "LKQ", "PAM": "Remanufactured", "PAN": "OEM", "PAO": "Other", "PAP": "OEM Partial", "PAR": "Re-cored", "PAS": "Sublet", "TOW": "Towing", "MAPA": "Paint Mat", "MASH": "shop mat"}, "profits": {"ATP": "ATP", "LAB": "Body", "LAD": "Daignostic", "LAE": "Electrical", "LAF": "Frame", "LAG": "Glass", "LAM": "Mechanical", "LAR": "Refinish", "LAS": "Structural", "LAU": "Detail", "PAA": "Aftermarket", "PAC": "Chrome", "PAL": "LKQ", "PAM": "Remanufactured", "PAN": "OEM", "PAO": "Other", "PAP": "OEM Partial", "PAR": "Re-cored", "PAS": "Sublet", "TOW": "Towing", "MAPA": "paint", "MASH": "shop"}}} + +shoprates: {"rate_atp": 8.68} + +productionconfig: {"columnKeys": [{"key": "alert", "width": 57}, {"key": "ro_number", "width": 65}, {"key": "vehicle", "width": 264.1333465576172}, {"key": "clm_no", "width": 127.39999389648438}, {"key": "ownr", "width": 143}, {"key": "labhrs", "width": 48}, {"key": "larhrs", "width": 53.35003662109375}, {"key": "scheduled_completion", "width": 176}, {"key": "status", "width": 101}, {"key": "note", "width": 179}, {"key": "ct", "width": 74}, {"key": "clm_total"}], "tableState": {"sortedInfo": {"order": "descend", "columnKey": "larhrs"}, "filteredInfo": {}}} + +invoicetaxrates +{"local_tax_rate": 0, "state_tax_rate": 7, "federal_tax_rate": 5} + +intakechecklist +{"form": [{"name": "item1", "type": "checkbox", "label": "Checklist Item 1", "required": true}, {"name": "item2", "type": "checkbox", "label": "Checklist Item 2", "required": true}, {"name": "item3", "type": "checkbox", "label": "Checklist Item 3", "required": true}, {"name": "item4", "type": "checkbox", "label": "Checklist Item 4", "required": true}], "templates": ["estimate_detail", "estimate_detail2"]} + +ssbucekts +[{"id": "express", "lt": 10, "gte": 0, "label": "express", "target": 1}, {"id": "small", "lt": 20, "gte": 10, "label": "small", "target": 2}, {"id": "medium", "lt": 30, "gte": 20, "label": "medium", "target": 3}, {"id": "large", "lt": 40, "gte": 30, "label": "large", "target": 4}, {"id": "heavy", "lt": 60, "gte": 40, "label": "heavy", "target": 5}, {"id": "Insane", "gte": 60, "label": "Insane", "target": 1}] \ No newline at end of file diff --git a/_reference/dropletSetup.md b/_reference/dropletSetup.md new file mode 100644 index 000000000..209c71ac3 --- /dev/null +++ b/_reference/dropletSetup.md @@ -0,0 +1,75 @@ +**Create an SSH key for local computer** + +ssh-keygen -t rsa -C "your_email@example.com" + +Copy the new key to clipboard: +* Windows: clip < id_rsa.pub +* Linux: sudo apt-get install xclip + xclip -sel clip < ~/.ssh/id_rsa.pub +* Mac: pbcopy < ~/.ssh/id_rsa.pub +* Manual Copy: cat ~/.ssh/id_rsa.pub + +Add the SSH key to the drop creation screen. + +1. Create a new user to replace root user + 1. # adduser imex + 2. # usermod -aG sudo imex + 3. # su - imex + 4. $ mkdir ~/.ssh + 5. $ chmod 700 ~/.ssh + 6. $ nano ~/.ssh/authorized_keys + 7. Add the copied SSH key and save. + 8. $ chmod 600 ~/.ssh/authorized_keys #Restrict access to authorized keys. +2. Setup the Firewall + 1. $ sudo ufw allow OpenSSH. + 2. $ sudo ufw enable +3. Add Nginx & Configure + 1. $ sudo apt-get update + 2. $ sudo apt-get install nginx + 3. $ sudo ufw allow 'Nginx Full' + 4. $ sudo ufw app list + 1. Nginx Full: Opens both port 80 (normal, unencrypted web traffic) and port 443 (TLS/SSL encrypted traffic) + 2. Nginx Http: Opens only port 80 (normal, unencrypted web traffic) + 3. Nginx Https: Opens only port 443 (TLS/SSL encrypted traffic) + 5. Should now be able to go to IP and see nginx responding with a blank page. +6. Install NodeJs + 1. $ curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash - + 2. $ sudo apt install nodejs + 3. $ node --version +7. Clone Source Code + 1. $ git clone git@bitbucket.org:snaptsoft/bodyshop.git //Requires SSH setup. + 2. $ cd bodyshop && npm install //Install all server dependencies. +8. Setup PM2 + 1. $ npm install pm2 -g //Had to be run as root. + 2. $ pm2 start ecosystem.config.js + 3. $ pm2 startup ubuntu //Ensure it starts when server does. +9. Alter Nginx config + 1. sudo nano /etc/nginx/sites-available/default + 2. //Add Appropriate server names to the file. www. and non-www. + 3. Add the following inside the location of the server block: + proxy_pass http://localhost:5000; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'upgrade'; + proxy_set_header Host $host; + proxy_cache_bypass $http_upgrade; +10. Install Certbot + 4. $ sudo add-apt-repository ppa:certbot/certbot //Potential issue on ubuntu 20.04 + 5. $ sudo apt-get update + 6. $ sudo apt install python-certbot-nginx + 7. $ sudo nano /etc/nginx/sites-available/default + 8. Find the existing server_name line and replace the underscore with your domain name: + ... + server_name example.com www.example.com; + ... + 9. $ sudo nginx -t //Verify syntax. + 10. $ sudo systemctl reload nginx +11. Generate Certificate + 11. $ sudo certbot --nginx -d example.com -d www.example.com //Follow prompts. + 12. $ sudo certbot renew --dry-run //Dry run to test auto renewal. + + +ADding Yarn +curl -sL https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - + echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list + sudo apt-get update && sudo apt-get install yarn \ No newline at end of file diff --git a/_reference/firebase.md b/_reference/firebase.md new file mode 100644 index 000000000..ceb800e04 --- /dev/null +++ b/_reference/firebase.md @@ -0,0 +1,16 @@ +1. Create a new project +2. Setup sign in methods to be user and email only. +3. Update .env to include config. +4. Setup the Firebase CLI + 1. cd to client firebase at server directory. + 2. ensure all dependencies installed + 1. $ npm install firebase-functions@latest firebase-admin@latest --save + 2. $ npm install -g firebase-tools + 3. $ firebase login //Login as needed. +5. Set the current projct + 1. firebase use +6. Deploy the function + 1. $ firebase deploy --only functions +7. Add the allowed domains. +8. Update server variables including FIREBASE_ADMINSDK_JSON, FIREBASE_DATABASE_URL +9. Create the firestore and copy the rules from dev for userinstances. \ No newline at end of file diff --git a/admin/README.md b/admin/README.md new file mode 100644 index 000000000..9c40dcdc3 --- /dev/null +++ b/admin/README.md @@ -0,0 +1,68 @@ +This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app). + +## Available Scripts + +In the project directory, you can run: + +### `yarn start` + +Runs the app in the development mode.
+Open [http://localhost:3000](http://localhost:3000) to view it in the browser. + +The page will reload if you make edits.
+You will also see any lint errors in the console. + +### `yarn test` + +Launches the test runner in the interactive watch mode.
+See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information. + +### `yarn build` + +Builds the app for production to the `build` folder.
+It correctly bundles React in production mode and optimizes the build for the best performance. + +The build is minified and the filenames include the hashes.
+Your app is ready to be deployed! + +See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information. + +### `yarn eject` + +**Note: this is a one-way operation. Once you `eject`, you can’t go back!** + +If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project. + +Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own. + +You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it. + +## Learn More + +You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started). + +To learn React, check out the [React documentation](https://reactjs.org/). + +### Code Splitting + +This section has moved here: https://facebook.github.io/create-react-app/docs/code-splitting + +### Analyzing the Bundle Size + +This section has moved here: https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size + +### Making a Progressive Web App + +This section has moved here: https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app + +### Advanced Configuration + +This section has moved here: https://facebook.github.io/create-react-app/docs/advanced-configuration + +### Deployment + +This section has moved here: https://facebook.github.io/create-react-app/docs/deployment + +### `yarn build` fails to minify + +This section has moved here: https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify diff --git a/admin/package.json b/admin/package.json new file mode 100644 index 000000000..3030d72c9 --- /dev/null +++ b/admin/package.json @@ -0,0 +1,44 @@ +{ + "name": "admin", + "version": "0.1.0", + "private": true, + "dependencies": { + "@apollo/client": "^3.0.2", + "@testing-library/jest-dom": "^4.2.4", + "@testing-library/react": "^9.3.2", + "@testing-library/user-event": "^7.1.2", + "apollo-boost": "^0.4.9", + "apollo-link-context": "^1.0.20", + "apollo-link-logger": "^1.2.3", + "dotenv": "^8.2.0", + "firebase": "^7.17.0", + "graphql": "^15.3.0", + "prop-types": "^15.7.2", + "ra-data-hasura-graphql": "^0.1.12", + "react": "^16.13.1", + "react-admin": "^3.7.1", + "react-dom": "^16.13.1", + "react-scripts": "3.4.1" + }, + "scripts": { + "start": "set PORT=3001 && react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test", + "eject": "react-scripts eject" + }, + "eslintConfig": { + "extends": "react-app" + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + } +} diff --git a/admin/public/favicon.ico b/admin/public/favicon.ico new file mode 100644 index 000000000..bcd5dfd67 Binary files /dev/null and b/admin/public/favicon.ico differ diff --git a/admin/public/index.html b/admin/public/index.html new file mode 100644 index 000000000..5ce0f5032 --- /dev/null +++ b/admin/public/index.html @@ -0,0 +1,43 @@ + + + + + + + + + + + + + ImEX Online - ADMIN + + + +
+ + + diff --git a/admin/public/logo192.png b/admin/public/logo192.png new file mode 100644 index 000000000..fc44b0a37 Binary files /dev/null and b/admin/public/logo192.png differ diff --git a/admin/public/logo512.png b/admin/public/logo512.png new file mode 100644 index 000000000..a4e47a654 Binary files /dev/null and b/admin/public/logo512.png differ diff --git a/admin/public/manifest.json b/admin/public/manifest.json new file mode 100644 index 000000000..080d6c77a --- /dev/null +++ b/admin/public/manifest.json @@ -0,0 +1,25 @@ +{ + "short_name": "React App", + "name": "Create React App Sample", + "icons": [ + { + "src": "favicon.ico", + "sizes": "64x64 32x32 24x24 16x16", + "type": "image/x-icon" + }, + { + "src": "logo192.png", + "type": "image/png", + "sizes": "192x192" + }, + { + "src": "logo512.png", + "type": "image/png", + "sizes": "512x512" + } + ], + "start_url": ".", + "display": "standalone", + "theme_color": "#000000", + "background_color": "#ffffff" +} diff --git a/admin/public/robots.txt b/admin/public/robots.txt new file mode 100644 index 000000000..e9e57dc4d --- /dev/null +++ b/admin/public/robots.txt @@ -0,0 +1,3 @@ +# https://www.robotstxt.org/robotstxt.html +User-agent: * +Disallow: diff --git a/admin/src/App/App.css b/admin/src/App/App.css new file mode 100644 index 000000000..74b5e0534 --- /dev/null +++ b/admin/src/App/App.css @@ -0,0 +1,38 @@ +.App { + text-align: center; +} + +.App-logo { + height: 40vmin; + pointer-events: none; +} + +@media (prefers-reduced-motion: no-preference) { + .App-logo { + animation: App-logo-spin infinite 20s linear; + } +} + +.App-header { + background-color: #282c34; + min-height: 100vh; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + font-size: calc(10px + 2vmin); + color: white; +} + +.App-link { + color: #61dafb; +} + +@keyframes App-logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} diff --git a/admin/src/App/App.js b/admin/src/App/App.js new file mode 100644 index 000000000..5757d5c66 --- /dev/null +++ b/admin/src/App/App.js @@ -0,0 +1,12 @@ +import React from "react"; +import AdminRoot from "../components/admin-root/admin-root.component"; +import "./App.css"; +function App() { + return ( +
+ +
+ ); +} + +export default App; diff --git a/admin/src/App/App.test.js b/admin/src/App/App.test.js new file mode 100644 index 000000000..4db7ebc25 --- /dev/null +++ b/admin/src/App/App.test.js @@ -0,0 +1,9 @@ +import React from 'react'; +import { render } from '@testing-library/react'; +import App from './App'; + +test('renders learn react link', () => { + const { getByText } = render(); + const linkElement = getByText(/learn react/i); + expect(linkElement).toBeInTheDocument(); +}); diff --git a/admin/src/Assets/logo.svg b/admin/src/Assets/logo.svg new file mode 100644 index 000000000..6b60c1042 --- /dev/null +++ b/admin/src/Assets/logo.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/admin/src/components/admin-root/admin-root.component.jsx b/admin/src/components/admin-root/admin-root.component.jsx new file mode 100644 index 000000000..773005d6c --- /dev/null +++ b/admin/src/components/admin-root/admin-root.component.jsx @@ -0,0 +1,275 @@ +import { ApolloClient, InMemoryCache, ApolloProvider } from "@apollo/client"; +import { ApolloLink } from "apollo-boost"; +import { setContext } from "apollo-link-context"; +import { HttpLink } from "apollo-link-http"; +import apolloLogger from "apollo-link-logger"; +import buildHasuraProvider from "ra-data-hasura-graphql"; +import React, { Component } from "react"; +import { + Admin, + EditGuesser, + ListGuesser, + Resource, + ShowGuesser, +} from "react-admin"; +import { auth } from "../../firebase/admin-firebase-utils"; +import authProvider from "../auth-provider/auth-provider"; +import JoblinesCreate from "../joblines/joblines.create"; +import JoblinesEdit from "../joblines/joblines.edit"; +import JoblinesList from "../joblines/joblines.list"; +import JoblinesShow from "../joblines/joblines.show"; +import JobsCreate from "../jobs/jobs.create"; +import JobsEdit from "../jobs/jobs.edit"; +import JobsList from "../jobs/jobs.list"; +import JobsShow from "../jobs/jobs.show"; + +const httpLink = new HttpLink({ + uri: process.env.REACT_APP_GRAPHQL_ENDPOINT, + headers: { + "x-hasura-admin-secret": `Dev-BodyShopAppBySnaptSoftware!`, + // 'Authorization': `Bearer xxxx`, + }, +}); +const authLink = setContext((_, { headers }) => { + return ( + auth.currentUser && + auth.currentUser.getIdToken().then((token) => { + if (token) { + return { + headers: { + ...headers, + authorization: token ? `Bearer ${token}` : "", + }, + }; + } else { + return { headers }; + } + }) + ); +}); + +const middlewares = []; +if (process.env.NODE_ENV === "development") { + middlewares.push(apolloLogger); +} + +middlewares.push(authLink.concat(httpLink)); + +const client = new ApolloClient({ + link: ApolloLink.from(middlewares), + cache: new InMemoryCache(), +}); + +// const client = new ApolloClient({ +// uri: process.env.REACT_APP_GRAPHQL_ENDPOINT, +// cache: new InMemoryCache(), +// headers: { +// "x-hasura-admin-secret": `Dev-BodyShopAppBySnaptSoftware!`, +// // 'Authorization': `Bearer xxxx`, +// }, +// }); + +class AdminRoot extends Component { + constructor() { + super(); + this.state = { dataProvider: null }; + } + componentDidMount() { + buildHasuraProvider({ + client, + }).then((dataProvider) => this.setState({ dataProvider })); + } + + render() { + const { dataProvider } = this.state; + + if (!dataProvider) { + return
Loading
; + } + + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); + } +} + +export default AdminRoot; diff --git a/admin/src/components/auth-provider/auth-provider.js b/admin/src/components/auth-provider/auth-provider.js new file mode 100644 index 000000000..23eef0952 --- /dev/null +++ b/admin/src/components/auth-provider/auth-provider.js @@ -0,0 +1,46 @@ +import { auth, getCurrentUser } from "../../firebase/admin-firebase-utils"; + +const authProvider = { + login: async ({ username, password }) => { + console.log(username, password); + try { + const { user } = await auth.signInWithEmailAndPassword( + username, + password + ); + const token = await user.getIdToken(true); + console.log("token", token); + localStorage.setItem("token", token); + return Promise.resolve(); + } catch (error) { + console.log("error", error); + return Promise.reject(); + } + }, + logout: async (params) => { + await auth.signOut(); + localStorage.removeItem("token"); + return Promise.resolve(); + }, + checkAuth: async (params) => { + console.log("Check Auth", params); + const user = await getCurrentUser(); + if (!!user) { + console.log("AuthProvider => checkAuth => Authorized"); + return Promise.resolve(); + } else { + console.log("AuthProvider => checkAuth => Unauthorized"); + + return Promise.reject(); + } + }, + checkError: (error) => { + console.log("Check error"); + return Promise.resolve(); + }, + getPermissions: (params) => { + console.log("get permissions", params); + return Promise.resolve(); + }, +}; +export default authProvider; diff --git a/admin/src/components/joblines/joblines.create.jsx b/admin/src/components/joblines/joblines.create.jsx new file mode 100644 index 000000000..b1fa4fb97 --- /dev/null +++ b/admin/src/components/joblines/joblines.create.jsx @@ -0,0 +1,26 @@ +import React from "react"; +import { + Create, + + + + NumberInput, SimpleForm, + TextInput +} from "react-admin"; + +const JoblinesCreate = (props) => ( + + + + + + + + + + + + +); + +export default JoblinesCreate; diff --git a/admin/src/components/joblines/joblines.edit.jsx b/admin/src/components/joblines/joblines.edit.jsx new file mode 100644 index 000000000..3bd67ec90 --- /dev/null +++ b/admin/src/components/joblines/joblines.edit.jsx @@ -0,0 +1,73 @@ +import React from "react"; +import { + Edit, + EmailField, + DateTimeInput, + DateField, + NumberInput, + BooleanInput, + SimpleForm, + TextInput, +} from "react-admin"; +import { number } from "prop-types"; + +const JoblinesEdit = (props) => ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +); + +export default JoblinesEdit; diff --git a/admin/src/components/joblines/joblines.list.jsx b/admin/src/components/joblines/joblines.list.jsx new file mode 100644 index 000000000..f9c6500b6 --- /dev/null +++ b/admin/src/components/joblines/joblines.list.jsx @@ -0,0 +1,29 @@ +import React from "react"; +import { + Datagrid, List, + + + NumberField, + + ReferenceField, TextField +} from "react-admin"; + +const JoblinesList = (props) => ( + + + + + + + + + + + + + + + +); + +export default JoblinesList; diff --git a/admin/src/components/joblines/joblines.show.jsx b/admin/src/components/joblines/joblines.show.jsx new file mode 100644 index 000000000..3d7b4d5da --- /dev/null +++ b/admin/src/components/joblines/joblines.show.jsx @@ -0,0 +1,24 @@ +import React from "react"; +import { + NumberInput, Show, + + SimpleShowLayout, + TextInput +} from "react-admin"; + +const JoblinesShow = (props) => ( + + + + + + + + + + + + +); + +export default JoblinesShow; diff --git a/admin/src/components/jobs/jobs.create.jsx b/admin/src/components/jobs/jobs.create.jsx new file mode 100644 index 000000000..7c133229b --- /dev/null +++ b/admin/src/components/jobs/jobs.create.jsx @@ -0,0 +1,17 @@ +import React from "react"; +import { Create, EmailField, SimpleForm, TextInput } from "react-admin"; + +const JobsCreate = (props) => ( + + + + + + + + + + +); + +export default JobsCreate; diff --git a/admin/src/components/jobs/jobs.edit.jsx b/admin/src/components/jobs/jobs.edit.jsx new file mode 100644 index 000000000..754ef6a04 --- /dev/null +++ b/admin/src/components/jobs/jobs.edit.jsx @@ -0,0 +1,255 @@ +import React from "react"; +import { Edit, SimpleForm, TextInput } from "react-admin"; + +const JobsEdit = (props) => ( + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+); + +export default JobsEdit; diff --git a/admin/src/components/jobs/jobs.list.jsx b/admin/src/components/jobs/jobs.list.jsx new file mode 100644 index 000000000..3dd4b98d3 --- /dev/null +++ b/admin/src/components/jobs/jobs.list.jsx @@ -0,0 +1,62 @@ +import React from "react"; +import { + Datagrid, + Filter, + List, + ReferenceField, + TextField, + SelectInput, + TextInput, +} from "react-admin"; +import { useQuery } from "@apollo/client"; +import { QUERY_ALL_SHOPS } from "../../graphql/admin.shop.queries"; +import CircularProgress from "@material-ui/core/CircularProgress"; + +const JobsList = (props) => ( + } {...props}> + + + + + + + + + + + + + + + + + + + + + + + +); + +const JobsFilter = (props) => { + const { loading, error, data } = useQuery(QUERY_ALL_SHOPS); + if (loading) return ; + if (error) return JSON.stringify(error); + + return ( + + + { + return { id: b.id, name: b.shopname }; + })} + alwaysOn + allowEmpty={false} + /> + + ); +}; + +export default JobsList; diff --git a/admin/src/components/jobs/jobs.show.jsx b/admin/src/components/jobs/jobs.show.jsx new file mode 100644 index 000000000..5ed4fef45 --- /dev/null +++ b/admin/src/components/jobs/jobs.show.jsx @@ -0,0 +1,283 @@ +import React from "react"; +import { + Datagrid, + EditButton, + + NumberField, + ReferenceManyField, + Show, + + + Tab, TabbedShowLayout, + TextField +} from "react-admin"; + +const JobsShow = (props) => ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +); + +export default JobsShow; diff --git a/admin/src/firebase/admin-firebase-utils.js b/admin/src/firebase/admin-firebase-utils.js new file mode 100644 index 000000000..428178123 --- /dev/null +++ b/admin/src/firebase/admin-firebase-utils.js @@ -0,0 +1,31 @@ +import firebase from "firebase/app"; +import "firebase/firestore"; +import "firebase/auth"; + +const config = JSON.parse(process.env.REACT_APP_FIREBASE_CONFIG); +firebase.initializeApp(config); + +export const auth = firebase.auth(); +export const firestore = firebase.firestore(); + +export default firebase; + +export const getCurrentUser = () => { + return new Promise((resolve, reject) => { + const unsubscribe = auth.onAuthStateChanged((userAuth) => { + unsubscribe(); + resolve(userAuth); + }, reject); + }); +}; + +export const updateCurrentUser = (userDetails) => { + return new Promise((resolve, reject) => { + const unsubscribe = auth.onAuthStateChanged((userAuth) => { + userAuth.updateProfile(userDetails).then((r) => { + unsubscribe(); + resolve(userAuth); + }); + }, reject); + }); +}; diff --git a/admin/src/graphql/admin.shop.queries.js b/admin/src/graphql/admin.shop.queries.js new file mode 100644 index 000000000..04ef8d816 --- /dev/null +++ b/admin/src/graphql/admin.shop.queries.js @@ -0,0 +1,10 @@ +import gql from "graphql-tag"; + +export const QUERY_ALL_SHOPS = gql` + query QUERY_ALL_SHOPS { + bodyshops { + id + shopname + } + } +`; diff --git a/admin/src/index.css b/admin/src/index.css new file mode 100644 index 000000000..ec2585e8c --- /dev/null +++ b/admin/src/index.css @@ -0,0 +1,13 @@ +body { + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', + 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', + sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +code { + font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', + monospace; +} diff --git a/admin/src/index.js b/admin/src/index.js new file mode 100644 index 000000000..470331b8e --- /dev/null +++ b/admin/src/index.js @@ -0,0 +1,17 @@ +import React from "react"; +import ReactDOM from "react-dom"; +import "./index.css"; +import App from "./App/App"; +import * as serviceWorker from "./serviceWorker"; + +ReactDOM.render( + + + , + document.getElementById("root") +); + +// If you want your app to work offline and load faster, you can change +// unregister() to register() below. Note this comes with some pitfalls. +// Learn more about service workers: https://bit.ly/CRA-PWA +serviceWorker.unregister(); diff --git a/admin/src/serviceWorker.js b/admin/src/serviceWorker.js new file mode 100644 index 000000000..b04b771a8 --- /dev/null +++ b/admin/src/serviceWorker.js @@ -0,0 +1,141 @@ +// This optional code is used to register a service worker. +// register() is not called by default. + +// This lets the app load faster on subsequent visits in production, and gives +// it offline capabilities. However, it also means that developers (and users) +// will only see deployed updates on subsequent visits to a page, after all the +// existing tabs open on the page have been closed, since previously cached +// resources are updated in the background. + +// To learn more about the benefits of this model and instructions on how to +// opt-in, read https://bit.ly/CRA-PWA + +const isLocalhost = Boolean( + window.location.hostname === 'localhost' || + // [::1] is the IPv6 localhost address. + window.location.hostname === '[::1]' || + // 127.0.0.0/8 are considered localhost for IPv4. + window.location.hostname.match( + /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/ + ) +); + +export function register(config) { + if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) { + // The URL constructor is available in all browsers that support SW. + const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href); + if (publicUrl.origin !== window.location.origin) { + // Our service worker won't work if PUBLIC_URL is on a different origin + // from what our page is served on. This might happen if a CDN is used to + // serve assets; see https://github.com/facebook/create-react-app/issues/2374 + return; + } + + window.addEventListener('load', () => { + const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`; + + if (isLocalhost) { + // This is running on localhost. Let's check if a service worker still exists or not. + checkValidServiceWorker(swUrl, config); + + // Add some additional logging to localhost, pointing developers to the + // service worker/PWA documentation. + navigator.serviceWorker.ready.then(() => { + console.log( + 'This web app is being served cache-first by a service ' + + 'worker. To learn more, visit https://bit.ly/CRA-PWA' + ); + }); + } else { + // Is not localhost. Just register service worker + registerValidSW(swUrl, config); + } + }); + } +} + +function registerValidSW(swUrl, config) { + navigator.serviceWorker + .register(swUrl) + .then(registration => { + registration.onupdatefound = () => { + const installingWorker = registration.installing; + if (installingWorker == null) { + return; + } + installingWorker.onstatechange = () => { + if (installingWorker.state === 'installed') { + if (navigator.serviceWorker.controller) { + // At this point, the updated precached content has been fetched, + // but the previous service worker will still serve the older + // content until all client tabs are closed. + console.log( + 'New content is available and will be used when all ' + + 'tabs for this page are closed. See https://bit.ly/CRA-PWA.' + ); + + // Execute callback + if (config && config.onUpdate) { + config.onUpdate(registration); + } + } else { + // At this point, everything has been precached. + // It's the perfect time to display a + // "Content is cached for offline use." message. + console.log('Content is cached for offline use.'); + + // Execute callback + if (config && config.onSuccess) { + config.onSuccess(registration); + } + } + } + }; + }; + }) + .catch(error => { + console.error('Error during service worker registration:', error); + }); +} + +function checkValidServiceWorker(swUrl, config) { + // Check if the service worker can be found. If it can't reload the page. + fetch(swUrl, { + headers: { 'Service-Worker': 'script' }, + }) + .then(response => { + // Ensure service worker exists, and that we really are getting a JS file. + const contentType = response.headers.get('content-type'); + if ( + response.status === 404 || + (contentType != null && contentType.indexOf('javascript') === -1) + ) { + // No service worker found. Probably a different app. Reload the page. + navigator.serviceWorker.ready.then(registration => { + registration.unregister().then(() => { + window.location.reload(); + }); + }); + } else { + // Service worker found. Proceed as normal. + registerValidSW(swUrl, config); + } + }) + .catch(() => { + console.log( + 'No internet connection found. App is running in offline mode.' + ); + }); +} + +export function unregister() { + if ('serviceWorker' in navigator) { + navigator.serviceWorker.ready + .then(registration => { + registration.unregister(); + }) + .catch(error => { + console.error(error.message); + }); + } +} diff --git a/admin/src/setupTests.js b/admin/src/setupTests.js new file mode 100644 index 000000000..74b1a275a --- /dev/null +++ b/admin/src/setupTests.js @@ -0,0 +1,5 @@ +// jest-dom adds custom jest matchers for asserting on DOM nodes. +// allows you to do things like: +// expect(element).toHaveTextContent(/react/i) +// learn more: https://github.com/testing-library/jest-dom +import '@testing-library/jest-dom/extend-expect'; diff --git a/admin/yarn.lock b/admin/yarn.lock new file mode 100644 index 000000000..784eb4162 --- /dev/null +++ b/admin/yarn.lock @@ -0,0 +1,12234 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@apollo/client@^3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.0.2.tgz#fadb2b39a0e32950baaef2566442cb3f6de74a52" + integrity sha512-4ighan5Anlj4tK/tdUHs4Mi1njqXZ7AxRCVolz/H702DjPphAJfm+FRkIadPTmwz+OLO+d+tX+6V1VBshf02rg== + dependencies: + "@types/zen-observable" "^0.8.0" + "@wry/context" "^0.5.2" + "@wry/equality" "^0.1.9" + fast-json-stable-stringify "^2.0.0" + graphql-tag "^2.10.4" + hoist-non-react-statics "^3.3.2" + optimism "^0.12.1" + prop-types "^15.7.2" + symbol-observable "^1.2.0" + ts-invariant "^0.4.4" + tslib "^1.10.0" + zen-observable "^0.8.14" + +"@babel/code-frame@7.8.3", "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" + integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g== + dependencies: + "@babel/highlight" "^7.8.3" + +"@babel/code-frame@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" + integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== + dependencies: + "@babel/highlight" "^7.10.4" + +"@babel/compat-data@^7.8.6", "@babel/compat-data@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.9.0.tgz#04815556fc90b0c174abd2c0c1bb966faa036a6c" + integrity sha512-zeFQrr+284Ekvd9e7KAX954LkapWiOmQtsfHirhxqfdlX6MEC32iRE+pqUGlYIBchdevaCwvzxWGSy/YBNI85g== + dependencies: + browserslist "^4.9.1" + invariant "^2.2.4" + semver "^5.5.0" + +"@babel/core@7.9.0", "@babel/core@^7.1.0", "@babel/core@^7.4.5": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.0.tgz#ac977b538b77e132ff706f3b8a4dbad09c03c56e" + integrity sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w== + dependencies: + "@babel/code-frame" "^7.8.3" + "@babel/generator" "^7.9.0" + "@babel/helper-module-transforms" "^7.9.0" + "@babel/helpers" "^7.9.0" + "@babel/parser" "^7.9.0" + "@babel/template" "^7.8.6" + "@babel/traverse" "^7.9.0" + "@babel/types" "^7.9.0" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.13" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/generator@^7.10.5": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.10.5.tgz#1b903554bc8c583ee8d25f1e8969732e6b829a69" + integrity sha512-3vXxr3FEW7E7lJZiWQ3bM4+v/Vyr9C+hpolQ8BGFr9Y8Ri2tFLWTixmwKBafDujO1WVah4fhZBeU1bieKdghig== + dependencies: + "@babel/types" "^7.10.5" + jsesc "^2.5.1" + source-map "^0.5.0" + +"@babel/generator@^7.4.0", "@babel/generator@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.0.tgz#0f67adea4ec39dad6e63345f70eec33014d78c89" + integrity sha512-onl4Oy46oGCzymOXtKMQpI7VXtCbTSHK1kqBydZ6AmzuNcacEVqGk9tZtAS+48IA9IstZcDCgIg8hQKnb7suRw== + dependencies: + "@babel/types" "^7.9.0" + jsesc "^2.5.1" + lodash "^4.17.13" + source-map "^0.5.0" + +"@babel/helper-annotate-as-pure@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz#60bc0bc657f63a0924ff9a4b4a0b24a13cf4deee" + integrity sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz#c84097a427a061ac56a1c30ebf54b7b22d241503" + integrity sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helper-builder-react-jsx-experimental@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.9.0.tgz#066d80262ade488f9c1b1823ce5db88a4cedaa43" + integrity sha512-3xJEiyuYU4Q/Ar9BsHisgdxZsRlsShMe90URZ0e6przL26CCs8NJbDoxH94kKT17PcxlMhsCAwZd90evCo26VQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/helper-module-imports" "^7.8.3" + "@babel/types" "^7.9.0" + +"@babel/helper-builder-react-jsx@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.9.0.tgz#16bf391990b57732700a3278d4d9a81231ea8d32" + integrity sha512-weiIo4gaoGgnhff54GQ3P5wsUQmnSwpkvU0r6ZHq6TzoSzKy4JxHEgnxNytaKbov2a9z/CVNyzliuCOUPEX3Jw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/types" "^7.9.0" + +"@babel/helper-call-delegate@^7.8.7": + version "7.8.7" + resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.8.7.tgz#28a279c2e6c622a6233da548127f980751324cab" + integrity sha512-doAA5LAKhsFCR0LAFIf+r2RSMmC+m8f/oQ+URnUET/rWeEzC0yTRmAGyWkD4sSu3xwbS7MYQ2u+xlt1V5R56KQ== + dependencies: + "@babel/helper-hoist-variables" "^7.8.3" + "@babel/traverse" "^7.8.3" + "@babel/types" "^7.8.7" + +"@babel/helper-compilation-targets@^7.8.7": + version "7.8.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.7.tgz#dac1eea159c0e4bd46e309b5a1b04a66b53c1dde" + integrity sha512-4mWm8DCK2LugIS+p1yArqvG1Pf162upsIsjE7cNBjez+NjliQpVhj20obE520nao0o14DaTnFJv+Fw5a0JpoUw== + dependencies: + "@babel/compat-data" "^7.8.6" + browserslist "^4.9.1" + invariant "^2.2.4" + levenary "^1.1.1" + semver "^5.5.0" + +"@babel/helper-create-class-features-plugin@^7.10.5": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz#9f61446ba80e8240b0a5c85c6fdac8459d6f259d" + integrity sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A== + dependencies: + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-member-expression-to-functions" "^7.10.5" + "@babel/helper-optimise-call-expression" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-replace-supers" "^7.10.4" + "@babel/helper-split-export-declaration" "^7.10.4" + +"@babel/helper-create-class-features-plugin@^7.8.3": + version "7.8.6" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.6.tgz#243a5b46e2f8f0f674dc1387631eb6b28b851de0" + integrity sha512-klTBDdsr+VFFqaDHm5rR69OpEQtO2Qv8ECxHS1mNhJJvaHArR6a1xTf5K/eZW7eZpJbhCx3NW1Yt/sKsLXLblg== + dependencies: + "@babel/helper-function-name" "^7.8.3" + "@babel/helper-member-expression-to-functions" "^7.8.3" + "@babel/helper-optimise-call-expression" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-replace-supers" "^7.8.6" + "@babel/helper-split-export-declaration" "^7.8.3" + +"@babel/helper-create-regexp-features-plugin@^7.8.3", "@babel/helper-create-regexp-features-plugin@^7.8.8": + version "7.8.8" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.8.tgz#5d84180b588f560b7864efaeea89243e58312087" + integrity sha512-LYVPdwkrQEiX9+1R29Ld/wTrmQu1SSKYnuOk3g0CkcZMA1p0gsNxJFj/3gBdaJ7Cg0Fnek5z0DsMULePP7Lrqg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/helper-regex" "^7.8.3" + regexpu-core "^4.7.0" + +"@babel/helper-define-map@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz#a0655cad5451c3760b726eba875f1cd8faa02c15" + integrity sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g== + dependencies: + "@babel/helper-function-name" "^7.8.3" + "@babel/types" "^7.8.3" + lodash "^4.17.13" + +"@babel/helper-explode-assignable-expression@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz#a728dc5b4e89e30fc2dfc7d04fa28a930653f982" + integrity sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw== + dependencies: + "@babel/traverse" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helper-function-name@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz#d2d3b20c59ad8c47112fa7d2a94bc09d5ef82f1a" + integrity sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ== + dependencies: + "@babel/helper-get-function-arity" "^7.10.4" + "@babel/template" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/helper-function-name@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz#eeeb665a01b1f11068e9fb86ad56a1cb1a824cca" + integrity sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA== + dependencies: + "@babel/helper-get-function-arity" "^7.8.3" + "@babel/template" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helper-get-function-arity@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz#98c1cbea0e2332f33f9a4661b8ce1505b2c19ba2" + integrity sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A== + dependencies: + "@babel/types" "^7.10.4" + +"@babel/helper-get-function-arity@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz#b894b947bd004381ce63ea1db9f08547e920abd5" + integrity sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-hoist-variables@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz#1dbe9b6b55d78c9b4183fc8cdc6e30ceb83b7134" + integrity sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-member-expression-to-functions@^7.10.4", "@babel/helper-member-expression-to-functions@^7.10.5": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.5.tgz#172f56e7a63e78112f3a04055f24365af702e7ee" + integrity sha512-HiqJpYD5+WopCXIAbQDG0zye5XYVvcO9w/DHp5GsaGkRUaamLj2bEtu6i8rnGGprAhHM3qidCMgp71HF4endhA== + dependencies: + "@babel/types" "^7.10.5" + +"@babel/helper-member-expression-to-functions@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz#659b710498ea6c1d9907e0c73f206eee7dadc24c" + integrity sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-module-imports@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz#7fe39589b39c016331b6b8c3f441e8f0b1419498" + integrity sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-module-transforms@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz#43b34dfe15961918707d247327431388e9fe96e5" + integrity sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA== + dependencies: + "@babel/helper-module-imports" "^7.8.3" + "@babel/helper-replace-supers" "^7.8.6" + "@babel/helper-simple-access" "^7.8.3" + "@babel/helper-split-export-declaration" "^7.8.3" + "@babel/template" "^7.8.6" + "@babel/types" "^7.9.0" + lodash "^4.17.13" + +"@babel/helper-optimise-call-expression@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz#50dc96413d594f995a77905905b05893cd779673" + integrity sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg== + dependencies: + "@babel/types" "^7.10.4" + +"@babel/helper-optimise-call-expression@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz#7ed071813d09c75298ef4f208956006b6111ecb9" + integrity sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz#9ea293be19babc0f52ff8ca88b34c3611b208670" + integrity sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ== + +"@babel/helper-plugin-utils@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" + integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== + +"@babel/helper-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.8.3.tgz#139772607d51b93f23effe72105b319d2a4c6965" + integrity sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ== + dependencies: + lodash "^4.17.13" + +"@babel/helper-remap-async-to-generator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz#273c600d8b9bf5006142c1e35887d555c12edd86" + integrity sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/helper-wrap-function" "^7.8.3" + "@babel/template" "^7.8.3" + "@babel/traverse" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helper-replace-supers@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz#d585cd9388ea06e6031e4cd44b6713cbead9e6cf" + integrity sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.10.4" + "@babel/helper-optimise-call-expression" "^7.10.4" + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/helper-replace-supers@^7.8.3", "@babel/helper-replace-supers@^7.8.6": + version "7.8.6" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz#5ada744fd5ad73203bf1d67459a27dcba67effc8" + integrity sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.8.3" + "@babel/helper-optimise-call-expression" "^7.8.3" + "@babel/traverse" "^7.8.6" + "@babel/types" "^7.8.6" + +"@babel/helper-simple-access@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz#7f8109928b4dab4654076986af575231deb639ae" + integrity sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw== + dependencies: + "@babel/template" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helper-split-export-declaration@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz#2c70576eaa3b5609b24cb99db2888cc3fc4251d1" + integrity sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg== + dependencies: + "@babel/types" "^7.10.4" + +"@babel/helper-split-export-declaration@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz#31a9f30070f91368a7182cf05f831781065fc7a9" + integrity sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-validator-identifier@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" + integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== + +"@babel/helper-validator-identifier@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz#ad53562a7fc29b3b9a91bbf7d10397fd146346ed" + integrity sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw== + +"@babel/helper-wrap-function@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz#9dbdb2bb55ef14aaa01fe8c99b629bd5352d8610" + integrity sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ== + dependencies: + "@babel/helper-function-name" "^7.8.3" + "@babel/template" "^7.8.3" + "@babel/traverse" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helpers@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.9.0.tgz#ab2c1bc4821af766cab51d4868a5038874ea5a12" + integrity sha512-/9GvfYTCG1NWCNwDj9e+XlnSCmWW/r9T794Xi58vPF9WCcnZCAZ0kWLSn54oqP40SUvh1T2G6VwKmFO5AOlW3A== + dependencies: + "@babel/template" "^7.8.3" + "@babel/traverse" "^7.9.0" + "@babel/types" "^7.9.0" + +"@babel/highlight@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" + integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== + dependencies: + "@babel/helper-validator-identifier" "^7.10.4" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/highlight@^7.8.3": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.9.0.tgz#4e9b45ccb82b79607271b2979ad82c7b68163079" + integrity sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ== + dependencies: + "@babel/helper-validator-identifier" "^7.9.0" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.4.3", "@babel/parser@^7.7.0", "@babel/parser@^7.8.6", "@babel/parser@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.0.tgz#f821b32313f07ee570976d3f6238e8d2d66e0a8e" + integrity sha512-Iwyp00CZsypoNJcpXCbq3G4tcDgphtlMwMVrMhhZ//XBkqjXF7LW6V511yk0+pBX3ZwwGnPea+pTKNJiqA7pUg== + +"@babel/parser@^7.10.4", "@babel/parser@^7.10.5": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.10.5.tgz#e7c6bf5a7deff957cec9f04b551e2762909d826b" + integrity sha512-wfryxy4bE1UivvQKSQDU4/X6dr+i8bctjUjj8Zyt3DQy7NtPizJXT8M52nqpNKL+nq2PW8lxk4ZqLj0fD4B4hQ== + +"@babel/plugin-proposal-async-generator-functions@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz#bad329c670b382589721b27540c7d288601c6e6f" + integrity sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-remap-async-to-generator" "^7.8.3" + "@babel/plugin-syntax-async-generators" "^7.8.0" + +"@babel/plugin-proposal-class-properties@7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.8.3.tgz#5e06654af5cd04b608915aada9b2a6788004464e" + integrity sha512-EqFhbo7IosdgPgZggHaNObkmO1kNUe3slaKu54d5OWvy+p9QIKOzK1GAEpAIsZtWVtPXUHSMcT4smvDrCfY4AA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-proposal-decorators@7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.8.3.tgz#2156860ab65c5abf068c3f67042184041066543e" + integrity sha512-e3RvdvS4qPJVTe288DlXjwKflpfy1hr0j5dz5WpIYYeP7vQZg2WfAEIp8k5/Lwis/m5REXEteIz6rrcDtXXG7w== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-decorators" "^7.8.3" + +"@babel/plugin-proposal-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz#38c4fe555744826e97e2ae930b0fb4cc07e66054" + integrity sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + +"@babel/plugin-proposal-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz#da5216b238a98b58a1e05d6852104b10f9a70d6b" + integrity sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.0" + +"@babel/plugin-proposal-nullish-coalescing-operator@7.8.3", "@babel/plugin-proposal-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz#e4572253fdeed65cddeecfdab3f928afeb2fd5d2" + integrity sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + +"@babel/plugin-proposal-numeric-separator@7.8.3", "@babel/plugin-proposal-numeric-separator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.8.3.tgz#5d6769409699ec9b3b68684cd8116cedff93bad8" + integrity sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + +"@babel/plugin-proposal-object-rest-spread@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.0.tgz#a28993699fc13df165995362693962ba6b061d6f" + integrity sha512-UgqBv6bjq4fDb8uku9f+wcm1J7YxJ5nT7WO/jBr0cl0PLKb7t1O6RNR1kZbjgx2LQtsDI9hwoQVmn0yhXeQyow== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + +"@babel/plugin-proposal-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz#9dee96ab1650eed88646ae9734ca167ac4a9c5c9" + integrity sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + +"@babel/plugin-proposal-optional-chaining@7.9.0", "@babel/plugin-proposal-optional-chaining@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz#31db16b154c39d6b8a645292472b98394c292a58" + integrity sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + +"@babel/plugin-proposal-unicode-property-regex@^7.4.4", "@babel/plugin-proposal-unicode-property-regex@^7.8.3": + version "7.8.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.8.tgz#ee3a95e90cdc04fe8cd92ec3279fa017d68a0d1d" + integrity sha512-EVhjVsMpbhLw9ZfHWSx2iy13Q8Z/eg8e8ccVWt23sWQK5l1UdkoLJPN5w69UA4uITGBnEZD2JOe4QOHycYKv8A== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.8.8" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-async-generators@^7.8.0": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-decorators@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.8.3.tgz#8d2c15a9f1af624b0025f961682a9d53d3001bda" + integrity sha512-8Hg4dNNT9/LcA1zQlfwuKR8BUc/if7Q7NkTam9sGTcJphLwpf2g4S42uhspQrIrR+dpzE0dtTqBVFoHl8GtnnQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-dynamic-import@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-flow@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.8.3.tgz#f2c883bd61a6316f2c89380ae5122f923ba4527f" + integrity sha512-innAx3bUbA0KSYj2E2MNFSn9hiCeowOFLxlsuhXzw8hMQnzkDomUr9QCD7E9VF60NmnG1sNTuuv6Qf4f8INYsg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-json-strings@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.3.tgz#521b06c83c40480f1e58b4fd33b92eceb1d6ea94" + integrity sha512-WxdW9xyLgBdefoo0Ynn3MRSkhe5tFVxxKNVdnZSh318WrG2e2jH+E9wd/++JsqcLJZPfz87njQJ8j2Upjm0M0A== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.8.0", "@babel/plugin-syntax-numeric-separator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz#0e3fb63e09bea1b11e96467271c8308007e7c41f" + integrity sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-top-level-await@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz#3acdece695e6b13aaf57fc291d1a800950c71391" + integrity sha512-kwj1j9lL/6Wd0hROD3b/OZZ7MSrZLqqn9RAZ5+cYYsflQ9HZBIKCUkr3+uL1MEJ1NePiUbf98jjiMQSv0NMR9g== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-typescript@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.10.4.tgz#2f55e770d3501e83af217d782cb7517d7bb34d25" + integrity sha512-oSAEz1YkBCAKr5Yiq8/BNtvSAPwkp/IyUnwZogd8p+F0RuYQQrLeRUzIQhueQTTBy/F+a40uS7OFKxnkRvmvFQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-arrow-functions@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz#82776c2ed0cd9e1a49956daeb896024c9473b8b6" + integrity sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-async-to-generator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz#4308fad0d9409d71eafb9b1a6ee35f9d64b64086" + integrity sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ== + dependencies: + "@babel/helper-module-imports" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-remap-async-to-generator" "^7.8.3" + +"@babel/plugin-transform-block-scoped-functions@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz#437eec5b799b5852072084b3ae5ef66e8349e8a3" + integrity sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-block-scoping@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz#97d35dab66857a437c166358b91d09050c868f3a" + integrity sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + lodash "^4.17.13" + +"@babel/plugin-transform-classes@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.0.tgz#ab89c175ecf5b4c8911194aa8657966615324ce9" + integrity sha512-xt/0CuBRBsBkqfk95ILxf0ge3gnXjEhOHrNxIiS8fdzSWgecuf9Vq2ogLUfaozJgt3LDO49ThMVWiyezGkei7A== + dependencies: + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/helper-define-map" "^7.8.3" + "@babel/helper-function-name" "^7.8.3" + "@babel/helper-optimise-call-expression" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-replace-supers" "^7.8.6" + "@babel/helper-split-export-declaration" "^7.8.3" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz#96d0d28b7f7ce4eb5b120bb2e0e943343c86f81b" + integrity sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-destructuring@^7.8.3": + version "7.8.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.8.tgz#fadb2bc8e90ccaf5658de6f8d4d22ff6272a2f4b" + integrity sha512-eRJu4Vs2rmttFCdhPUM3bV0Yo/xPSdPw6ML9KHs/bjB4bLA5HXlbvYXPOD5yASodGod+krjYx21xm1QmL8dCJQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-dotall-regex@^7.4.4", "@babel/plugin-transform-dotall-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz#c3c6ec5ee6125c6993c5cbca20dc8621a9ea7a6e" + integrity sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-duplicate-keys@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz#8d12df309aa537f272899c565ea1768e286e21f1" + integrity sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-exponentiation-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz#581a6d7f56970e06bf51560cd64f5e947b70d7b7" + integrity sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-flow-strip-types@7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.9.0.tgz#8a3538aa40434e000b8f44a3c5c9ac7229bd2392" + integrity sha512-7Qfg0lKQhEHs93FChxVLAvhBshOPQDtJUTVHr/ZwQNRccCm4O9D79r9tVSoV8iNwjP1YgfD+e/fgHcPkN1qEQg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-flow" "^7.8.3" + +"@babel/plugin-transform-for-of@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.9.0.tgz#0f260e27d3e29cd1bb3128da5e76c761aa6c108e" + integrity sha512-lTAnWOpMwOXpyDx06N+ywmF3jNbafZEqZ96CGYabxHrxNX8l5ny7dt4bK/rGwAh9utyP2b2Hv7PlZh1AAS54FQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-function-name@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz#279373cb27322aaad67c2683e776dfc47196ed8b" + integrity sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ== + dependencies: + "@babel/helper-function-name" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-literals@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz#aef239823d91994ec7b68e55193525d76dbd5dc1" + integrity sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-member-expression-literals@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz#963fed4b620ac7cbf6029c755424029fa3a40410" + integrity sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-modules-amd@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.0.tgz#19755ee721912cf5bb04c07d50280af3484efef4" + integrity sha512-vZgDDF003B14O8zJy0XXLnPH4sg+9X5hFBBGN1V+B2rgrB+J2xIypSN6Rk9imB2hSTHQi5OHLrFWsZab1GMk+Q== + dependencies: + "@babel/helper-module-transforms" "^7.9.0" + "@babel/helper-plugin-utils" "^7.8.3" + babel-plugin-dynamic-import-node "^2.3.0" + +"@babel/plugin-transform-modules-commonjs@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.0.tgz#e3e72f4cbc9b4a260e30be0ea59bdf5a39748940" + integrity sha512-qzlCrLnKqio4SlgJ6FMMLBe4bySNis8DFn1VkGmOcxG9gqEyPIOzeQrA//u0HAKrWpJlpZbZMPB1n/OPa4+n8g== + dependencies: + "@babel/helper-module-transforms" "^7.9.0" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-simple-access" "^7.8.3" + babel-plugin-dynamic-import-node "^2.3.0" + +"@babel/plugin-transform-modules-systemjs@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.0.tgz#e9fd46a296fc91e009b64e07ddaa86d6f0edeb90" + integrity sha512-FsiAv/nao/ud2ZWy4wFacoLOm5uxl0ExSQ7ErvP7jpoihLR6Cq90ilOFyX9UXct3rbtKsAiZ9kFt5XGfPe/5SQ== + dependencies: + "@babel/helper-hoist-variables" "^7.8.3" + "@babel/helper-module-transforms" "^7.9.0" + "@babel/helper-plugin-utils" "^7.8.3" + babel-plugin-dynamic-import-node "^2.3.0" + +"@babel/plugin-transform-modules-umd@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.9.0.tgz#e909acae276fec280f9b821a5f38e1f08b480697" + integrity sha512-uTWkXkIVtg/JGRSIABdBoMsoIeoHQHPTL0Y2E7xf5Oj7sLqwVsNXOkNk0VJc7vF0IMBsPeikHxFjGe+qmwPtTQ== + dependencies: + "@babel/helper-module-transforms" "^7.9.0" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz#a2a72bffa202ac0e2d0506afd0939c5ecbc48c6c" + integrity sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.8.3" + +"@babel/plugin-transform-new-target@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz#60cc2ae66d85c95ab540eb34babb6434d4c70c43" + integrity sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-object-super@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz#ebb6a1e7a86ffa96858bd6ac0102d65944261725" + integrity sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-replace-supers" "^7.8.3" + +"@babel/plugin-transform-parameters@^7.8.7": + version "7.8.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.8.8.tgz#0381de466c85d5404565243660c4496459525daf" + integrity sha512-hC4Ld/Ulpf1psQciWWwdnUspQoQco2bMzSrwU6TmzRlvoYQe4rQFy9vnCZDTlVeCQj0JPfL+1RX0V8hCJvkgBA== + dependencies: + "@babel/helper-call-delegate" "^7.8.7" + "@babel/helper-get-function-arity" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-property-literals@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz#33194300d8539c1ed28c62ad5087ba3807b98263" + integrity sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-react-constant-elements@^7.0.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.9.0.tgz#a75abc936a3819edec42d3386d9f1c93f28d9d9e" + integrity sha512-wXMXsToAUOxJuBBEHajqKLFWcCkOSLshTI2ChCFFj1zDd7od4IOxiwLCOObNUvOpkxLpjIuaIdBMmNt6ocCPAw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-react-display-name@7.8.3", "@babel/plugin-transform-react-display-name@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.8.3.tgz#70ded987c91609f78353dd76d2fb2a0bb991e8e5" + integrity sha512-3Jy/PCw8Fe6uBKtEgz3M82ljt+lTg+xJaM4og+eyu83qLT87ZUSckn0wy7r31jflURWLO83TW6Ylf7lyXj3m5A== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-react-jsx-development@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.9.0.tgz#3c2a130727caf00c2a293f0aed24520825dbf754" + integrity sha512-tK8hWKrQncVvrhvtOiPpKrQjfNX3DtkNLSX4ObuGcpS9p0QrGetKmlySIGR07y48Zft8WVgPakqd/bk46JrMSw== + dependencies: + "@babel/helper-builder-react-jsx-experimental" "^7.9.0" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-jsx" "^7.8.3" + +"@babel/plugin-transform-react-jsx-self@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.9.0.tgz#f4f26a325820205239bb915bad8e06fcadabb49b" + integrity sha512-K2ObbWPKT7KUTAoyjCsFilOkEgMvFG+y0FqOl6Lezd0/13kMkkjHskVsZvblRPj1PHA44PrToaZANrryppzTvQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-jsx" "^7.8.3" + +"@babel/plugin-transform-react-jsx-source@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.9.0.tgz#89ef93025240dd5d17d3122294a093e5e0183de0" + integrity sha512-K6m3LlSnTSfRkM6FcRk8saNEeaeyG5k7AVkBU2bZK3+1zdkSED3qNdsWrUgQBeTVD2Tp3VMmerxVO2yM5iITmw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-jsx" "^7.8.3" + +"@babel/plugin-transform-react-jsx@^7.9.1": + version "7.9.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.9.1.tgz#d03af29396a6dc51bfa24eefd8005a9fd381152a" + integrity sha512-+xIZ6fPoix7h57CNO/ZeYADchg1tFyX9NDsnmNFFua8e1JNPln156mzS+8AQe1On2X2GLlANHJWHIXbMCqWDkQ== + dependencies: + "@babel/helper-builder-react-jsx" "^7.9.0" + "@babel/helper-builder-react-jsx-experimental" "^7.9.0" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-jsx" "^7.8.3" + +"@babel/plugin-transform-regenerator@^7.8.7": + version "7.8.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.7.tgz#5e46a0dca2bee1ad8285eb0527e6abc9c37672f8" + integrity sha512-TIg+gAl4Z0a3WmD3mbYSk+J9ZUH6n/Yc57rtKRnlA/7rcCvpekHXe0CMZHP1gYp7/KLe9GHTuIba0vXmls6drA== + dependencies: + regenerator-transform "^0.14.2" + +"@babel/plugin-transform-reserved-words@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz#9a0635ac4e665d29b162837dd3cc50745dfdf1f5" + integrity sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-runtime@7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.9.0.tgz#45468c0ae74cc13204e1d3b1f4ce6ee83258af0b" + integrity sha512-pUu9VSf3kI1OqbWINQ7MaugnitRss1z533436waNXp+0N3ur3zfut37sXiQMxkuCF4VUjwZucen/quskCh7NHw== + dependencies: + "@babel/helper-module-imports" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + resolve "^1.8.1" + semver "^5.5.1" + +"@babel/plugin-transform-shorthand-properties@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz#28545216e023a832d4d3a1185ed492bcfeac08c8" + integrity sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz#9c8ffe8170fdfb88b114ecb920b82fb6e95fe5e8" + integrity sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-sticky-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz#be7a1290f81dae767475452199e1f76d6175b100" + integrity sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-regex" "^7.8.3" + +"@babel/plugin-transform-template-literals@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz#7bfa4732b455ea6a43130adc0ba767ec0e402a80" + integrity sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-typeof-symbol@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz#ede4062315ce0aaf8a657a920858f1a2f35fc412" + integrity sha512-2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-typescript@^7.9.0": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.10.5.tgz#edf353944e979f40d8ff9fe4e9975d0a465037c5" + integrity sha512-YCyYsFrrRMZ3qR7wRwtSSJovPG5vGyG4ZdcSAivGwTfoasMp3VOB/AKhohu3dFtmB4cCDcsndCSxGtrdliCsZQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.10.5" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-typescript" "^7.10.4" + +"@babel/plugin-transform-unicode-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz#0cef36e3ba73e5c57273effb182f46b91a1ecaad" + integrity sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/preset-env@7.9.0", "@babel/preset-env@^7.4.5": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.9.0.tgz#a5fc42480e950ae8f5d9f8f2bbc03f52722df3a8" + integrity sha512-712DeRXT6dyKAM/FMbQTV/FvRCms2hPCx+3weRjZ8iQVQWZejWWk1wwG6ViWMyqb/ouBbGOl5b6aCk0+j1NmsQ== + dependencies: + "@babel/compat-data" "^7.9.0" + "@babel/helper-compilation-targets" "^7.8.7" + "@babel/helper-module-imports" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-proposal-async-generator-functions" "^7.8.3" + "@babel/plugin-proposal-dynamic-import" "^7.8.3" + "@babel/plugin-proposal-json-strings" "^7.8.3" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-proposal-numeric-separator" "^7.8.3" + "@babel/plugin-proposal-object-rest-spread" "^7.9.0" + "@babel/plugin-proposal-optional-catch-binding" "^7.8.3" + "@babel/plugin-proposal-optional-chaining" "^7.9.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.8.3" + "@babel/plugin-syntax-async-generators" "^7.8.0" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + "@babel/plugin-syntax-json-strings" "^7.8.0" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + "@babel/plugin-syntax-numeric-separator" "^7.8.0" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + "@babel/plugin-syntax-top-level-await" "^7.8.3" + "@babel/plugin-transform-arrow-functions" "^7.8.3" + "@babel/plugin-transform-async-to-generator" "^7.8.3" + "@babel/plugin-transform-block-scoped-functions" "^7.8.3" + "@babel/plugin-transform-block-scoping" "^7.8.3" + "@babel/plugin-transform-classes" "^7.9.0" + "@babel/plugin-transform-computed-properties" "^7.8.3" + "@babel/plugin-transform-destructuring" "^7.8.3" + "@babel/plugin-transform-dotall-regex" "^7.8.3" + "@babel/plugin-transform-duplicate-keys" "^7.8.3" + "@babel/plugin-transform-exponentiation-operator" "^7.8.3" + "@babel/plugin-transform-for-of" "^7.9.0" + "@babel/plugin-transform-function-name" "^7.8.3" + "@babel/plugin-transform-literals" "^7.8.3" + "@babel/plugin-transform-member-expression-literals" "^7.8.3" + "@babel/plugin-transform-modules-amd" "^7.9.0" + "@babel/plugin-transform-modules-commonjs" "^7.9.0" + "@babel/plugin-transform-modules-systemjs" "^7.9.0" + "@babel/plugin-transform-modules-umd" "^7.9.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.8.3" + "@babel/plugin-transform-new-target" "^7.8.3" + "@babel/plugin-transform-object-super" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.8.7" + "@babel/plugin-transform-property-literals" "^7.8.3" + "@babel/plugin-transform-regenerator" "^7.8.7" + "@babel/plugin-transform-reserved-words" "^7.8.3" + "@babel/plugin-transform-shorthand-properties" "^7.8.3" + "@babel/plugin-transform-spread" "^7.8.3" + "@babel/plugin-transform-sticky-regex" "^7.8.3" + "@babel/plugin-transform-template-literals" "^7.8.3" + "@babel/plugin-transform-typeof-symbol" "^7.8.4" + "@babel/plugin-transform-unicode-regex" "^7.8.3" + "@babel/preset-modules" "^0.1.3" + "@babel/types" "^7.9.0" + browserslist "^4.9.1" + core-js-compat "^3.6.2" + invariant "^2.2.2" + levenary "^1.1.1" + semver "^5.5.0" + +"@babel/preset-modules@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.3.tgz#13242b53b5ef8c883c3cf7dddd55b36ce80fbc72" + integrity sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/preset-react@7.9.1", "@babel/preset-react@^7.0.0": + version "7.9.1" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.9.1.tgz#b346403c36d58c3bb544148272a0cefd9c28677a" + integrity sha512-aJBYF23MPj0RNdp/4bHnAP0NVqqZRr9kl0NAOP4nJCex6OYVio59+dnQzsAWFuogdLyeaKA1hmfUIVZkY5J+TQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-transform-react-display-name" "^7.8.3" + "@babel/plugin-transform-react-jsx" "^7.9.1" + "@babel/plugin-transform-react-jsx-development" "^7.9.0" + "@babel/plugin-transform-react-jsx-self" "^7.9.0" + "@babel/plugin-transform-react-jsx-source" "^7.9.0" + +"@babel/preset-typescript@7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.9.0.tgz#87705a72b1f0d59df21c179f7c3d2ef4b16ce192" + integrity sha512-S4cueFnGrIbvYJgwsVFKdvOmpiL0XGw9MFW9D0vgRys5g36PBhZRL8NX8Gr2akz8XRtzq6HuDXPD/1nniagNUg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-transform-typescript" "^7.9.0" + +"@babel/runtime-corejs3@^7.10.2": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.10.5.tgz#a57fe6c13045ca33768a2aa527ead795146febe1" + integrity sha512-RMafpmrNB5E/bwdSphLr8a8++9TosnyJp98RZzI6VOx2R2CCMpsXXXRvmI700O9oEKpXdZat6oEK68/F0zjd4A== + dependencies: + core-js-pure "^3.0.0" + regenerator-runtime "^0.13.4" + +"@babel/runtime-corejs3@^7.8.3": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.9.0.tgz#0d4119c44ad05bfa0ca16f2f4f91cde430056c08" + integrity sha512-Fe3z3yVZNCUTaOFBAofwkEtFiYi7a7Gg2F5S1QX+mqP403i2iKJtyHJYEp/PV2ijUheT0PiKWbmXcqtwLhmBzg== + dependencies: + core-js-pure "^3.0.0" + regenerator-runtime "^0.13.4" + +"@babel/runtime@7.9.0", "@babel/runtime@^7.0.0", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.0.tgz#337eda67401f5b066a6f205a3113d4ac18ba495b" + integrity sha512-cTIudHnzuWLS56ik4DnRnqqNf8MkdUzV4iFFI1h7Jo9xvrpQROYaAnaSd2mHLQAzzZAPfATynX5ord6YlNYNMA== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.0", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.3": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.10.5.tgz#303d8bd440ecd5a491eae6117fd3367698674c5c" + integrity sha512-otddXKhdNn7d0ptoFRHtMLa8LqDxLYwTjB4nYgM1yy5N6gU/MUf8zqyyLltCH3yAVitBzmwK4us+DD0l/MauAg== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278" + integrity sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/parser" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/template@^7.4.0", "@babel/template@^7.8.3", "@babel/template@^7.8.6": + version "7.8.6" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.6.tgz#86b22af15f828dfb086474f964dcc3e39c43ce2b" + integrity sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg== + dependencies: + "@babel/code-frame" "^7.8.3" + "@babel/parser" "^7.8.6" + "@babel/types" "^7.8.6" + +"@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.7.0", "@babel/traverse@^7.8.3", "@babel/traverse@^7.8.6", "@babel/traverse@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.9.0.tgz#d3882c2830e513f4fe4cec9fe76ea1cc78747892" + integrity sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w== + dependencies: + "@babel/code-frame" "^7.8.3" + "@babel/generator" "^7.9.0" + "@babel/helper-function-name" "^7.8.3" + "@babel/helper-split-export-declaration" "^7.8.3" + "@babel/parser" "^7.9.0" + "@babel/types" "^7.9.0" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.13" + +"@babel/traverse@^7.10.4": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.10.5.tgz#77ce464f5b258be265af618d8fddf0536f20b564" + integrity sha512-yc/fyv2gUjPqzTz0WHeRJH2pv7jA9kA7mBX2tXl/x5iOE81uaVPuGPtaYk7wmkx4b67mQ7NqI8rmT2pF47KYKQ== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.10.5" + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-split-export-declaration" "^7.10.4" + "@babel/parser" "^7.10.5" + "@babel/types" "^7.10.5" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.19" + +"@babel/types@^7.0.0", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.7.0", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.8.7", "@babel/types@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.0.tgz#00b064c3df83ad32b2dbf5ff07312b15c7f1efb5" + integrity sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng== + dependencies: + "@babel/helper-validator-identifier" "^7.9.0" + lodash "^4.17.13" + to-fast-properties "^2.0.0" + +"@babel/types@^7.10.4", "@babel/types@^7.10.5": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.10.5.tgz#d88ae7e2fde86bfbfe851d4d81afa70a997b5d15" + integrity sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q== + dependencies: + "@babel/helper-validator-identifier" "^7.10.4" + lodash "^4.17.19" + to-fast-properties "^2.0.0" + +"@cnakazawa/watch@^1.0.3": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" + integrity sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ== + dependencies: + exec-sh "^0.3.2" + minimist "^1.2.0" + +"@csstools/convert-colors@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7" + integrity sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw== + +"@csstools/normalize.css@^10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@csstools/normalize.css/-/normalize.css-10.1.0.tgz#f0950bba18819512d42f7197e56c518aa491cf18" + integrity sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg== + +"@emotion/hash@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413" + integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow== + +"@firebase/analytics-types@0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@firebase/analytics-types/-/analytics-types-0.3.1.tgz#3c5f5d71129c88295e17e914e34b391ffda1723c" + integrity sha512-63vVJ5NIBh/JF8l9LuPrQYSzFimk7zYHySQB4Dk9rVdJ8kV/vGQoVTvRu1UW05sEc2Ug5PqtEChtTHU+9hvPcA== + +"@firebase/analytics@0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@firebase/analytics/-/analytics-0.4.0.tgz#15dfee56619af18c262d4b7cb2f1d4e7c25194de" + integrity sha512-8DC2OBXGYxeeRxCh6eFnrrswNcKm2WsD8EeqGcl0F1P7J0bJ4Q+WpP3DvxofQZ/PtVHdAhzmfmt9r6Xa9mHnrQ== + dependencies: + "@firebase/analytics-types" "0.3.1" + "@firebase/component" "0.1.16" + "@firebase/installations" "0.4.14" + "@firebase/logger" "0.2.6" + "@firebase/util" "0.2.50" + tslib "^1.11.1" + +"@firebase/app-types@0.6.1": + version "0.6.1" + resolved "https://registry.yarnpkg.com/@firebase/app-types/-/app-types-0.6.1.tgz#dcbd23030a71c0c74fc95d4a3f75ba81653850e9" + integrity sha512-L/ZnJRAq7F++utfuoTKX4CLBG5YR7tFO3PLzG1/oXXKEezJ0kRL3CMRoueBEmTCzVb/6SIs2Qlaw++uDgi5Xyg== + +"@firebase/app@0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@firebase/app/-/app-0.6.8.tgz#e7ccf31cc1d01f16744d6d27c5f9ba8b64338f12" + integrity sha512-Tm7Pi6Dtpx4FFKcpm0jcrZ/qI9oREBxmP3pWlw1jgDW4syRJHmN9/5DYvfFk6FAhj3FrY8E/6F+ngWJfqONotQ== + dependencies: + "@firebase/app-types" "0.6.1" + "@firebase/component" "0.1.16" + "@firebase/logger" "0.2.6" + "@firebase/util" "0.2.50" + dom-storage "2.1.0" + tslib "^1.11.1" + xmlhttprequest "1.8.0" + +"@firebase/auth-interop-types@0.1.5": + version "0.1.5" + resolved "https://registry.yarnpkg.com/@firebase/auth-interop-types/-/auth-interop-types-0.1.5.tgz#9fc9bd7c879f16b8d1bb08373a0f48c3a8b74557" + integrity sha512-88h74TMQ6wXChPA6h9Q3E1Jg6TkTHep2+k63OWg3s0ozyGVMeY+TTOti7PFPzq5RhszQPQOoCi59es4MaRvgCw== + +"@firebase/auth-types@0.10.1": + version "0.10.1" + resolved "https://registry.yarnpkg.com/@firebase/auth-types/-/auth-types-0.10.1.tgz#7815e71c9c6f072034415524b29ca8f1d1770660" + integrity sha512-/+gBHb1O9x/YlG7inXfxff/6X3BPZt4zgBv4kql6HEmdzNQCodIRlEYnI+/da+lN+dha7PjaFH7C7ewMmfV7rw== + +"@firebase/auth@0.14.9": + version "0.14.9" + resolved "https://registry.yarnpkg.com/@firebase/auth/-/auth-0.14.9.tgz#481db24d5bd6eded8ac2e5aea6edb9307040229c" + integrity sha512-PxYa2r5qUEdheXTvqROFrMstK8W4uPiP7NVfp+2Bec+AjY5PxZapCx/YFDLkU0D7YBI82H74PtZrzdJZw7TJ4w== + dependencies: + "@firebase/auth-types" "0.10.1" + +"@firebase/component@0.1.16": + version "0.1.16" + resolved "https://registry.yarnpkg.com/@firebase/component/-/component-0.1.16.tgz#7a0dbdfff1485d45b8485db87a982f053e68761a" + integrity sha512-FvffvFN0LWgv1H/FIyruTECOL69Dhy+JfwoTq+mV39V8Mz9lNpo41etonL5AOr7KmXxYJVbNwkx0L9Ei88i7JA== + dependencies: + "@firebase/util" "0.2.50" + tslib "^1.11.1" + +"@firebase/database-types@0.5.1": + version "0.5.1" + resolved "https://registry.yarnpkg.com/@firebase/database-types/-/database-types-0.5.1.tgz#fab2f3fb48eec374a9f435ed21e138635cb9b71c" + integrity sha512-onQxom1ZBYBJ648w/VNRzUewovEDAH7lvnrrpCd69ukkyrMk6rGEO/PQ9BcNEbhlNtukpsqRS0oNOFlHs0FaSA== + dependencies: + "@firebase/app-types" "0.6.1" + +"@firebase/database@0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@firebase/database/-/database-0.6.8.tgz#28c9fb4e6a3322cdf9b5f58e768f21d9ac948840" + integrity sha512-Psibz/LD9WBvZRS7A/kkYd5i5l6tBw49adSFmCM2ZJlKE9fxZhxay02AerwfXHiq3gPKVeqXUjBIRuHOWdEXmw== + dependencies: + "@firebase/auth-interop-types" "0.1.5" + "@firebase/component" "0.1.16" + "@firebase/database-types" "0.5.1" + "@firebase/logger" "0.2.6" + "@firebase/util" "0.2.50" + faye-websocket "0.11.3" + tslib "^1.11.1" + +"@firebase/firestore-types@1.12.0": + version "1.12.0" + resolved "https://registry.yarnpkg.com/@firebase/firestore-types/-/firestore-types-1.12.0.tgz#511e572e946b07f5a603c90e078f0cd714923fac" + integrity sha512-OqNxVb63wPZdUc7YnpacAW1WNIMSKERSewCRi+unCQ0YI0KNfrDSypyGCyel+S3GdOtKMk9KnvDknaGbnaFX4g== + +"@firebase/firestore@1.16.1": + version "1.16.1" + resolved "https://registry.yarnpkg.com/@firebase/firestore/-/firestore-1.16.1.tgz#ddf4e357b4d847abe6a57a89d3e2d5b950339176" + integrity sha512-TGtvNIGHMEFFEuOSsRswou576GPZY39vXIsenn0B1Dqz9ACpyDtvAT9YdbG38srlPq7ZKwsP5x04LB43zZ6eAg== + dependencies: + "@firebase/component" "0.1.16" + "@firebase/firestore-types" "1.12.0" + "@firebase/logger" "0.2.6" + "@firebase/util" "0.2.50" + "@firebase/webchannel-wrapper" "0.2.41" + "@grpc/grpc-js" "^1.0.0" + "@grpc/proto-loader" "^0.5.0" + tslib "^1.11.1" + +"@firebase/functions-types@0.3.17": + version "0.3.17" + resolved "https://registry.yarnpkg.com/@firebase/functions-types/-/functions-types-0.3.17.tgz#348bf5528b238eeeeeae1d52e8ca547b21d33a94" + integrity sha512-DGR4i3VI55KnYk4IxrIw7+VG7Q3gA65azHnZxo98Il8IvYLr2UTBlSh72dTLlDf25NW51HqvJgYJDKvSaAeyHQ== + +"@firebase/functions@0.4.48": + version "0.4.48" + resolved "https://registry.yarnpkg.com/@firebase/functions/-/functions-0.4.48.tgz#aee8efeacbfdd74834db0c1b44297f59c5bdddaf" + integrity sha512-BwI/JzO/f/nquKG1IS3VqmwMaKEhvM58/08vTnp46krHBsOYqsdD9T2amz+HXGT9fe2HhDsUhgFE8D00S0vqbg== + dependencies: + "@firebase/component" "0.1.16" + "@firebase/functions-types" "0.3.17" + "@firebase/messaging-types" "0.4.5" + isomorphic-fetch "2.2.1" + tslib "^1.11.1" + +"@firebase/installations-types@0.3.4": + version "0.3.4" + resolved "https://registry.yarnpkg.com/@firebase/installations-types/-/installations-types-0.3.4.tgz#589a941d713f4f64bf9f4feb7f463505bab1afa2" + integrity sha512-RfePJFovmdIXb6rYwtngyxuEcWnOrzdZd9m7xAW0gRxDIjBT20n3BOhjpmgRWXo/DAxRmS7bRjWAyTHY9cqN7Q== + +"@firebase/installations@0.4.14": + version "0.4.14" + resolved "https://registry.yarnpkg.com/@firebase/installations/-/installations-0.4.14.tgz#e0c240869bed834d1b5cc696bec0020e8fcb5f7b" + integrity sha512-hQPsaU7wdTq3CFMtFQwZy6LgdXZAkXoUToV4O+ekPbjM65QzaGVogJVU8O2H6ADXoq37SarcUXKe86pcUWdFLA== + dependencies: + "@firebase/component" "0.1.16" + "@firebase/installations-types" "0.3.4" + "@firebase/util" "0.2.50" + idb "3.0.2" + tslib "^1.11.1" + +"@firebase/logger@0.2.6": + version "0.2.6" + resolved "https://registry.yarnpkg.com/@firebase/logger/-/logger-0.2.6.tgz#3aa2ca4fe10327cabf7808bd3994e88db26d7989" + integrity sha512-KIxcUvW/cRGWlzK9Vd2KB864HlUnCfdTH0taHE0sXW5Xl7+W68suaeau1oKNEqmc3l45azkd4NzXTCWZRZdXrw== + +"@firebase/messaging-types@0.4.5": + version "0.4.5" + resolved "https://registry.yarnpkg.com/@firebase/messaging-types/-/messaging-types-0.4.5.tgz#452572d3c5b7fa83659fdb1884450477229f5dc4" + integrity sha512-sux4fgqr/0KyIxqzHlatI04Ajs5rc3WM+WmtCpxrKP1E5Bke8xu/0M+2oy4lK/sQ7nov9z15n3iltAHCgTRU3Q== + +"@firebase/messaging@0.6.20": + version "0.6.20" + resolved "https://registry.yarnpkg.com/@firebase/messaging/-/messaging-0.6.20.tgz#c6139dad753185706196972629e9235cdda8c2d6" + integrity sha512-1MqyljXnbFBeHYhL6QInVM9aO5MW820yhNmOIVxk58wNXq4tOQLzqnKuvlgZ+ttgqlDzrIYiVf3EOHh5DptttQ== + dependencies: + "@firebase/component" "0.1.16" + "@firebase/installations" "0.4.14" + "@firebase/messaging-types" "0.4.5" + "@firebase/util" "0.2.50" + idb "3.0.2" + tslib "^1.11.1" + +"@firebase/performance-types@0.0.13": + version "0.0.13" + resolved "https://registry.yarnpkg.com/@firebase/performance-types/-/performance-types-0.0.13.tgz#58ce5453f57e34b18186f74ef11550dfc558ede6" + integrity sha512-6fZfIGjQpwo9S5OzMpPyqgYAUZcFzZxHFqOyNtorDIgNXq33nlldTL/vtaUZA8iT9TT5cJlCrF/jthKU7X21EA== + +"@firebase/performance@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@firebase/performance/-/performance-0.3.9.tgz#01e27616aca8486c7602e4f51c325c2e7caae6e8" + integrity sha512-Fj22DZXRhhKv1OSUzDxX7AqpJUcDld6tzXK1yxOC8e3v1DFPQMQdM9FoG1m1b/Vrqa6pCCqnqG6gh6VPnEcAzQ== + dependencies: + "@firebase/component" "0.1.16" + "@firebase/installations" "0.4.14" + "@firebase/logger" "0.2.6" + "@firebase/performance-types" "0.0.13" + "@firebase/util" "0.2.50" + tslib "^1.11.1" + +"@firebase/polyfill@0.3.36": + version "0.3.36" + resolved "https://registry.yarnpkg.com/@firebase/polyfill/-/polyfill-0.3.36.tgz#c057cce6748170f36966b555749472b25efdb145" + integrity sha512-zMM9oSJgY6cT2jx3Ce9LYqb0eIpDE52meIzd/oe/y70F+v9u1LDqk5kUF5mf16zovGBWMNFmgzlsh6Wj0OsFtg== + dependencies: + core-js "3.6.5" + promise-polyfill "8.1.3" + whatwg-fetch "2.0.4" + +"@firebase/remote-config-types@0.1.9": + version "0.1.9" + resolved "https://registry.yarnpkg.com/@firebase/remote-config-types/-/remote-config-types-0.1.9.tgz#fe6bbe4d08f3b6e92fce30e4b7a9f4d6a96d6965" + integrity sha512-G96qnF3RYGbZsTRut7NBX0sxyczxt1uyCgXQuH/eAfUCngxjEGcZQnBdy6mvSdqdJh5mC31rWPO4v9/s7HwtzA== + +"@firebase/remote-config@0.1.25": + version "0.1.25" + resolved "https://registry.yarnpkg.com/@firebase/remote-config/-/remote-config-0.1.25.tgz#93c5bda311d6c1302697d6148bdb33bb8dcb9e15" + integrity sha512-8YWefBhy77HMbWXWdbenalx+IDY/XkS+iURQ9qRYvSIFYx6RL04DzlakZNOY9CQAcxTA+cTSt4NNlhjopBjf2Q== + dependencies: + "@firebase/component" "0.1.16" + "@firebase/installations" "0.4.14" + "@firebase/logger" "0.2.6" + "@firebase/remote-config-types" "0.1.9" + "@firebase/util" "0.2.50" + tslib "^1.11.1" + +"@firebase/storage-types@0.3.13": + version "0.3.13" + resolved "https://registry.yarnpkg.com/@firebase/storage-types/-/storage-types-0.3.13.tgz#cd43e939a2ab5742e109eb639a313673a48b5458" + integrity sha512-pL7b8d5kMNCCL0w9hF7pr16POyKkb3imOW7w0qYrhBnbyJTdVxMWZhb0HxCFyQWC0w3EiIFFmxoz8NTFZDEFog== + +"@firebase/storage@0.3.40": + version "0.3.40" + resolved "https://registry.yarnpkg.com/@firebase/storage/-/storage-0.3.40.tgz#4e6ea66d9c3ce489cd1a892940c57c3078853410" + integrity sha512-xTUvSSXh8tNSlch4V+kNbw736H0z/lbW3rHlx1kZVnT8V5M4bXE+TEcG4WpqvcWH3p+N6N1bUorkDbOFgBrztw== + dependencies: + "@firebase/component" "0.1.16" + "@firebase/storage-types" "0.3.13" + "@firebase/util" "0.2.50" + tslib "^1.11.1" + +"@firebase/util@0.2.50": + version "0.2.50" + resolved "https://registry.yarnpkg.com/@firebase/util/-/util-0.2.50.tgz#77666b845dcb49bc217650aa296a7a8986c06b44" + integrity sha512-vFE6+Jfc25u0ViSpFxxq0q5s+XmuJ/y7CL3ud79RQe+WLFFg+j0eH1t23k0yNSG9vZNM7h3uHRIXbV97sYLAyw== + dependencies: + tslib "^1.11.1" + +"@firebase/webchannel-wrapper@0.2.41": + version "0.2.41" + resolved "https://registry.yarnpkg.com/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.2.41.tgz#4e470c25a99fa0b1f629f1c5ef180a318d399fd0" + integrity sha512-XcdMT5PSZHiuf7LJIhzKIe+RyYa25S3LHRRvLnZc6iFjwXkrSDJ8J/HWO6VT8d2ZTbawp3VcLEjRF/VN8glCrA== + +"@grpc/grpc-js@^1.0.0": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.1.3.tgz#0b91b166d744b6a43b00430dceff0f0ff88c98d5" + integrity sha512-HtOsk2YUofBcm1GkPqGzb6pwHhv+74eC2CUO229USIDKRtg30ycbZmqC+HdNtY3nHqoc9IgcRlntFgopyQoYCA== + dependencies: + semver "^6.2.0" + +"@grpc/proto-loader@^0.5.0": + version "0.5.5" + resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.5.5.tgz#6725e7a1827bdf8e92e29fbf4e9ef0203c0906a9" + integrity sha512-WwN9jVNdHRQoOBo9FDH7qU+mgfjPc8GygPYms3M+y3fbQLfnCe/Kv/E01t7JRgnrsOHH8euvSbed3mIalXhwqQ== + dependencies: + lodash.camelcase "^4.3.0" + protobufjs "^6.8.6" + +"@hapi/address@2.x.x": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5" + integrity sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ== + +"@hapi/bourne@1.x.x": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-1.3.2.tgz#0a7095adea067243ce3283e1b56b8a8f453b242a" + integrity sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA== + +"@hapi/hoek@8.x.x", "@hapi/hoek@^8.3.0": + version "8.5.1" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-8.5.1.tgz#fde96064ca446dec8c55a8c2f130957b070c6e06" + integrity sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow== + +"@hapi/joi@^15.0.0": + version "15.1.1" + resolved "https://registry.yarnpkg.com/@hapi/joi/-/joi-15.1.1.tgz#c675b8a71296f02833f8d6d243b34c57b8ce19d7" + integrity sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ== + dependencies: + "@hapi/address" "2.x.x" + "@hapi/bourne" "1.x.x" + "@hapi/hoek" "8.x.x" + "@hapi/topo" "3.x.x" + +"@hapi/topo@3.x.x": + version "3.1.6" + resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-3.1.6.tgz#68d935fa3eae7fdd5ab0d7f953f3205d8b2bfc29" + integrity sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ== + dependencies: + "@hapi/hoek" "^8.3.0" + +"@jest/console@^24.7.1", "@jest/console@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-24.9.0.tgz#79b1bc06fb74a8cfb01cbdedf945584b1b9707f0" + integrity sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ== + dependencies: + "@jest/source-map" "^24.9.0" + chalk "^2.0.1" + slash "^2.0.0" + +"@jest/core@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-24.9.0.tgz#2ceccd0b93181f9c4850e74f2a9ad43d351369c4" + integrity sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A== + dependencies: + "@jest/console" "^24.7.1" + "@jest/reporters" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + ansi-escapes "^3.0.0" + chalk "^2.0.1" + exit "^0.1.2" + graceful-fs "^4.1.15" + jest-changed-files "^24.9.0" + jest-config "^24.9.0" + jest-haste-map "^24.9.0" + jest-message-util "^24.9.0" + jest-regex-util "^24.3.0" + jest-resolve "^24.9.0" + jest-resolve-dependencies "^24.9.0" + jest-runner "^24.9.0" + jest-runtime "^24.9.0" + jest-snapshot "^24.9.0" + jest-util "^24.9.0" + jest-validate "^24.9.0" + jest-watcher "^24.9.0" + micromatch "^3.1.10" + p-each-series "^1.0.0" + realpath-native "^1.1.0" + rimraf "^2.5.4" + slash "^2.0.0" + strip-ansi "^5.0.0" + +"@jest/environment@^24.3.0", "@jest/environment@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-24.9.0.tgz#21e3afa2d65c0586cbd6cbefe208bafade44ab18" + integrity sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ== + dependencies: + "@jest/fake-timers" "^24.9.0" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + jest-mock "^24.9.0" + +"@jest/fake-timers@^24.3.0", "@jest/fake-timers@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-24.9.0.tgz#ba3e6bf0eecd09a636049896434d306636540c93" + integrity sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A== + dependencies: + "@jest/types" "^24.9.0" + jest-message-util "^24.9.0" + jest-mock "^24.9.0" + +"@jest/reporters@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-24.9.0.tgz#86660eff8e2b9661d042a8e98a028b8d631a5b43" + integrity sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw== + dependencies: + "@jest/environment" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + chalk "^2.0.1" + exit "^0.1.2" + glob "^7.1.2" + istanbul-lib-coverage "^2.0.2" + istanbul-lib-instrument "^3.0.1" + istanbul-lib-report "^2.0.4" + istanbul-lib-source-maps "^3.0.1" + istanbul-reports "^2.2.6" + jest-haste-map "^24.9.0" + jest-resolve "^24.9.0" + jest-runtime "^24.9.0" + jest-util "^24.9.0" + jest-worker "^24.6.0" + node-notifier "^5.4.2" + slash "^2.0.0" + source-map "^0.6.0" + string-length "^2.0.0" + +"@jest/source-map@^24.3.0", "@jest/source-map@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-24.9.0.tgz#0e263a94430be4b41da683ccc1e6bffe2a191714" + integrity sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg== + dependencies: + callsites "^3.0.0" + graceful-fs "^4.1.15" + source-map "^0.6.0" + +"@jest/test-result@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-24.9.0.tgz#11796e8aa9dbf88ea025757b3152595ad06ba0ca" + integrity sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA== + dependencies: + "@jest/console" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/istanbul-lib-coverage" "^2.0.0" + +"@jest/test-sequencer@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz#f8f334f35b625a4f2f355f2fe7e6036dad2e6b31" + integrity sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A== + dependencies: + "@jest/test-result" "^24.9.0" + jest-haste-map "^24.9.0" + jest-runner "^24.9.0" + jest-runtime "^24.9.0" + +"@jest/transform@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-24.9.0.tgz#4ae2768b296553fadab09e9ec119543c90b16c56" + integrity sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ== + dependencies: + "@babel/core" "^7.1.0" + "@jest/types" "^24.9.0" + babel-plugin-istanbul "^5.1.0" + chalk "^2.0.1" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.1.15" + jest-haste-map "^24.9.0" + jest-regex-util "^24.9.0" + jest-util "^24.9.0" + micromatch "^3.1.10" + pirates "^4.0.1" + realpath-native "^1.1.0" + slash "^2.0.0" + source-map "^0.6.1" + write-file-atomic "2.4.1" + +"@jest/types@^24.3.0", "@jest/types@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.9.0.tgz#63cb26cb7500d069e5a389441a7c6ab5e909fc59" + integrity sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^1.1.1" + "@types/yargs" "^13.0.0" + +"@jest/types@^25.5.0": + version "25.5.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-25.5.0.tgz#4d6a4793f7b9599fc3680877b856a97dbccf2a9d" + integrity sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^1.1.1" + "@types/yargs" "^15.0.0" + chalk "^3.0.0" + +"@material-ui/core@^4.3.3": + version "4.11.0" + resolved "https://registry.yarnpkg.com/@material-ui/core/-/core-4.11.0.tgz#b69b26e4553c9e53f2bfaf1053e216a0af9be15a" + integrity sha512-bYo9uIub8wGhZySHqLQ833zi4ZML+XCBE1XwJ8EuUVSpTWWG57Pm+YugQToJNFsEyiKFhPh8DPD0bgupz8n01g== + dependencies: + "@babel/runtime" "^7.4.4" + "@material-ui/styles" "^4.10.0" + "@material-ui/system" "^4.9.14" + "@material-ui/types" "^5.1.0" + "@material-ui/utils" "^4.10.2" + "@types/react-transition-group" "^4.2.0" + clsx "^1.0.4" + hoist-non-react-statics "^3.3.2" + popper.js "1.16.1-lts" + prop-types "^15.7.2" + react-is "^16.8.0" + react-transition-group "^4.4.0" + +"@material-ui/icons@^4.2.1": + version "4.9.1" + resolved "https://registry.yarnpkg.com/@material-ui/icons/-/icons-4.9.1.tgz#fdeadf8cb3d89208945b33dbc50c7c616d0bd665" + integrity sha512-GBitL3oBWO0hzBhvA9KxqcowRUsA0qzwKkURyC8nppnC3fw54KPKZ+d4V1Eeg/UnDRSzDaI9nGCdel/eh9AQMg== + dependencies: + "@babel/runtime" "^7.4.4" + +"@material-ui/styles@^4.10.0", "@material-ui/styles@^4.3.3": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@material-ui/styles/-/styles-4.10.0.tgz#2406dc23aa358217aa8cc772e6237bd7f0544071" + integrity sha512-XPwiVTpd3rlnbfrgtEJ1eJJdFCXZkHxy8TrdieaTvwxNYj42VnnCyFzxYeNW9Lhj4V1oD8YtQ6S5Gie7bZDf7Q== + dependencies: + "@babel/runtime" "^7.4.4" + "@emotion/hash" "^0.8.0" + "@material-ui/types" "^5.1.0" + "@material-ui/utils" "^4.9.6" + clsx "^1.0.4" + csstype "^2.5.2" + hoist-non-react-statics "^3.3.2" + jss "^10.0.3" + jss-plugin-camel-case "^10.0.3" + jss-plugin-default-unit "^10.0.3" + jss-plugin-global "^10.0.3" + jss-plugin-nested "^10.0.3" + jss-plugin-props-sort "^10.0.3" + jss-plugin-rule-value-function "^10.0.3" + jss-plugin-vendor-prefixer "^10.0.3" + prop-types "^15.7.2" + +"@material-ui/system@^4.9.14": + version "4.9.14" + resolved "https://registry.yarnpkg.com/@material-ui/system/-/system-4.9.14.tgz#4b00c48b569340cefb2036d0596b93ac6c587a5f" + integrity sha512-oQbaqfSnNlEkXEziDcJDDIy8pbvwUmZXWNqlmIwDqr/ZdCK8FuV3f4nxikUh7hvClKV2gnQ9djh5CZFTHkZj3w== + dependencies: + "@babel/runtime" "^7.4.4" + "@material-ui/utils" "^4.9.6" + csstype "^2.5.2" + prop-types "^15.7.2" + +"@material-ui/types@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@material-ui/types/-/types-5.1.0.tgz#efa1c7a0b0eaa4c7c87ac0390445f0f88b0d88f2" + integrity sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A== + +"@material-ui/utils@^4.10.2", "@material-ui/utils@^4.9.6": + version "4.10.2" + resolved "https://registry.yarnpkg.com/@material-ui/utils/-/utils-4.10.2.tgz#3fd5470ca61b7341f1e0468ac8f29a70bf6df321" + integrity sha512-eg29v74P7W5r6a4tWWDAAfZldXIzfyO1am2fIsC39hdUUHm/33k6pGOKPbgDjg/U/4ifmgAePy/1OjkKN6rFRw== + dependencies: + "@babel/runtime" "^7.4.4" + prop-types "^15.7.2" + react-is "^16.8.0" + +"@mrmlnc/readdir-enhanced@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" + integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g== + dependencies: + call-me-maybe "^1.0.1" + glob-to-regexp "^0.3.0" + +"@nodelib/fs.stat@^1.1.2": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" + integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== + +"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" + integrity sha1-m4sMxmPWaafY9vXQiToU00jzD78= + +"@protobufjs/base64@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" + integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== + +"@protobufjs/codegen@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" + integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== + +"@protobufjs/eventemitter@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" + integrity sha1-NVy8mLr61ZePntCV85diHx0Ga3A= + +"@protobufjs/fetch@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" + integrity sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU= + dependencies: + "@protobufjs/aspromise" "^1.1.1" + "@protobufjs/inquire" "^1.1.0" + +"@protobufjs/float@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" + integrity sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E= + +"@protobufjs/inquire@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" + integrity sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik= + +"@protobufjs/path@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" + integrity sha1-bMKyDFya1q0NzP0hynZz2Nf79o0= + +"@protobufjs/pool@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" + integrity sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q= + +"@protobufjs/utf8@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" + integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA= + +"@redux-saga/core@^1.1.3": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@redux-saga/core/-/core-1.1.3.tgz#3085097b57a4ea8db5528d58673f20ce0950f6a4" + integrity sha512-8tInBftak8TPzE6X13ABmEtRJGjtK17w7VUs7qV17S8hCO5S3+aUTWZ/DBsBJPdE8Z5jOPwYALyvofgq1Ws+kg== + dependencies: + "@babel/runtime" "^7.6.3" + "@redux-saga/deferred" "^1.1.2" + "@redux-saga/delay-p" "^1.1.2" + "@redux-saga/is" "^1.1.2" + "@redux-saga/symbols" "^1.1.2" + "@redux-saga/types" "^1.1.0" + redux "^4.0.4" + typescript-tuple "^2.2.1" + +"@redux-saga/deferred@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@redux-saga/deferred/-/deferred-1.1.2.tgz#59937a0eba71fff289f1310233bc518117a71888" + integrity sha512-908rDLHFN2UUzt2jb4uOzj6afpjgJe3MjICaUNO3bvkV/kN/cNeI9PMr8BsFXB/MR8WTAZQq/PlTq8Kww3TBSQ== + +"@redux-saga/delay-p@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@redux-saga/delay-p/-/delay-p-1.1.2.tgz#8f515f4b009b05b02a37a7c3d0ca9ddc157bb355" + integrity sha512-ojc+1IoC6OP65Ts5+ZHbEYdrohmIw1j9P7HS9MOJezqMYtCDgpkoqB5enAAZrNtnbSL6gVCWPHaoaTY5KeO0/g== + dependencies: + "@redux-saga/symbols" "^1.1.2" + +"@redux-saga/is@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@redux-saga/is/-/is-1.1.2.tgz#ae6c8421f58fcba80faf7cadb7d65b303b97e58e" + integrity sha512-OLbunKVsCVNTKEf2cH4TYyNbbPgvmZ52iaxBD4I1fTif4+MTXMa4/Z07L83zW/hTCXwpSZvXogqMqLfex2Tg6w== + dependencies: + "@redux-saga/symbols" "^1.1.2" + "@redux-saga/types" "^1.1.0" + +"@redux-saga/symbols@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@redux-saga/symbols/-/symbols-1.1.2.tgz#216a672a487fc256872b8034835afc22a2d0595d" + integrity sha512-EfdGnF423glv3uMwLsGAtE6bg+R9MdqlHEzExnfagXPrIiuxwr3bdiAwz3gi+PsrQ3yBlaBpfGLtDG8rf3LgQQ== + +"@redux-saga/types@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@redux-saga/types/-/types-1.1.0.tgz#0e81ce56b4883b4b2a3001ebe1ab298b84237204" + integrity sha512-afmTuJrylUU/0OtqzaRkbyYFFNgCF73Bvel/sw90pvGrWIZ+vyoIJqA6eMSoA6+nb443kTmulmBtC9NerXboNg== + +"@sheerun/mutationobserver-shim@^0.3.2": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@sheerun/mutationobserver-shim/-/mutationobserver-shim-0.3.3.tgz#5405ee8e444ed212db44e79351f0c70a582aae25" + integrity sha512-DetpxZw1fzPD5xUBrIAoplLChO2VB8DlL5Gg+I1IR9b2wPqYIca2WSUxL5g1vLeR4MsQq1NeWriXAVffV+U1Fw== + +"@svgr/babel-plugin-add-jsx-attribute@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.2.0.tgz#dadcb6218503532d6884b210e7f3c502caaa44b1" + integrity sha512-j7KnilGyZzYr/jhcrSYS3FGWMZVaqyCG0vzMCwzvei0coIkczuYMcniK07nI0aHJINciujjH11T72ICW5eL5Ig== + +"@svgr/babel-plugin-remove-jsx-attribute@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-4.2.0.tgz#297550b9a8c0c7337bea12bdfc8a80bb66f85abc" + integrity sha512-3XHLtJ+HbRCH4n28S7y/yZoEQnRpl0tvTZQsHqvaeNXPra+6vE5tbRliH3ox1yZYPCxrlqaJT/Mg+75GpDKlvQ== + +"@svgr/babel-plugin-remove-jsx-empty-expression@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-4.2.0.tgz#c196302f3e68eab6a05e98af9ca8570bc13131c7" + integrity sha512-yTr2iLdf6oEuUE9MsRdvt0NmdpMBAkgK8Bjhl6epb+eQWk6abBaX3d65UZ3E3FWaOwePyUgNyNCMVG61gGCQ7w== + +"@svgr/babel-plugin-replace-jsx-attribute-value@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-4.2.0.tgz#310ec0775de808a6a2e4fd4268c245fd734c1165" + integrity sha512-U9m870Kqm0ko8beHawRXLGLvSi/ZMrl89gJ5BNcT452fAjtF2p4uRzXkdzvGJJJYBgx7BmqlDjBN/eCp5AAX2w== + +"@svgr/babel-plugin-svg-dynamic-title@^4.3.3": + version "4.3.3" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-4.3.3.tgz#2cdedd747e5b1b29ed4c241e46256aac8110dd93" + integrity sha512-w3Be6xUNdwgParsvxkkeZb545VhXEwjGMwExMVBIdPQJeyMQHqm9Msnb2a1teHBqUYL66qtwfhNkbj1iarCG7w== + +"@svgr/babel-plugin-svg-em-dimensions@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-4.2.0.tgz#9a94791c9a288108d20a9d2cc64cac820f141391" + integrity sha512-C0Uy+BHolCHGOZ8Dnr1zXy/KgpBOkEUYY9kI/HseHVPeMbluaX3CijJr7D4C5uR8zrc1T64nnq/k63ydQuGt4w== + +"@svgr/babel-plugin-transform-react-native-svg@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-4.2.0.tgz#151487322843359a1ca86b21a3815fd21a88b717" + integrity sha512-7YvynOpZDpCOUoIVlaaOUU87J4Z6RdD6spYN4eUb5tfPoKGSF9OG2NuhgYnq4jSkAxcpMaXWPf1cePkzmqTPNw== + +"@svgr/babel-plugin-transform-svg-component@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-4.2.0.tgz#5f1e2f886b2c85c67e76da42f0f6be1b1767b697" + integrity sha512-hYfYuZhQPCBVotABsXKSCfel2slf/yvJY8heTVX1PCTaq/IgASq1IyxPPKJ0chWREEKewIU/JMSsIGBtK1KKxw== + +"@svgr/babel-preset@^4.3.3": + version "4.3.3" + resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-4.3.3.tgz#a75d8c2f202ac0e5774e6bfc165d028b39a1316c" + integrity sha512-6PG80tdz4eAlYUN3g5GZiUjg2FMcp+Wn6rtnz5WJG9ITGEF1pmFdzq02597Hn0OmnQuCVaBYQE1OVFAnwOl+0A== + dependencies: + "@svgr/babel-plugin-add-jsx-attribute" "^4.2.0" + "@svgr/babel-plugin-remove-jsx-attribute" "^4.2.0" + "@svgr/babel-plugin-remove-jsx-empty-expression" "^4.2.0" + "@svgr/babel-plugin-replace-jsx-attribute-value" "^4.2.0" + "@svgr/babel-plugin-svg-dynamic-title" "^4.3.3" + "@svgr/babel-plugin-svg-em-dimensions" "^4.2.0" + "@svgr/babel-plugin-transform-react-native-svg" "^4.2.0" + "@svgr/babel-plugin-transform-svg-component" "^4.2.0" + +"@svgr/core@^4.3.3": + version "4.3.3" + resolved "https://registry.yarnpkg.com/@svgr/core/-/core-4.3.3.tgz#b37b89d5b757dc66e8c74156d00c368338d24293" + integrity sha512-qNuGF1QON1626UCaZamWt5yedpgOytvLj5BQZe2j1k1B8DUG4OyugZyfEwBeXozCUwhLEpsrgPrE+eCu4fY17w== + dependencies: + "@svgr/plugin-jsx" "^4.3.3" + camelcase "^5.3.1" + cosmiconfig "^5.2.1" + +"@svgr/hast-util-to-babel-ast@^4.3.2": + version "4.3.2" + resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-4.3.2.tgz#1d5a082f7b929ef8f1f578950238f630e14532b8" + integrity sha512-JioXclZGhFIDL3ddn4Kiq8qEqYM2PyDKV0aYno8+IXTLuYt6TOgHUbUAAFvqtb0Xn37NwP0BTHglejFoYr8RZg== + dependencies: + "@babel/types" "^7.4.4" + +"@svgr/plugin-jsx@^4.3.3": + version "4.3.3" + resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-4.3.3.tgz#e2ba913dbdfbe85252a34db101abc7ebd50992fa" + integrity sha512-cLOCSpNWQnDB1/v+SUENHH7a0XY09bfuMKdq9+gYvtuwzC2rU4I0wKGFEp1i24holdQdwodCtDQdFtJiTCWc+w== + dependencies: + "@babel/core" "^7.4.5" + "@svgr/babel-preset" "^4.3.3" + "@svgr/hast-util-to-babel-ast" "^4.3.2" + svg-parser "^2.0.0" + +"@svgr/plugin-svgo@^4.3.1": + version "4.3.1" + resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-4.3.1.tgz#daac0a3d872e3f55935c6588dd370336865e9e32" + integrity sha512-PrMtEDUWjX3Ea65JsVCwTIXuSqa3CG9px+DluF1/eo9mlDrgrtFE7NE/DjdhjJgSM9wenlVBzkzneSIUgfUI/w== + dependencies: + cosmiconfig "^5.2.1" + merge-deep "^3.0.2" + svgo "^1.2.2" + +"@svgr/webpack@4.3.3": + version "4.3.3" + resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-4.3.3.tgz#13cc2423bf3dff2d494f16b17eb7eacb86895017" + integrity sha512-bjnWolZ6KVsHhgyCoYRFmbd26p8XVbulCzSG53BDQqAr+JOAderYK7CuYrB3bDjHJuF6LJ7Wrr42+goLRV9qIg== + dependencies: + "@babel/core" "^7.4.5" + "@babel/plugin-transform-react-constant-elements" "^7.0.0" + "@babel/preset-env" "^7.4.5" + "@babel/preset-react" "^7.0.0" + "@svgr/core" "^4.3.3" + "@svgr/plugin-jsx" "^4.3.3" + "@svgr/plugin-svgo" "^4.3.1" + loader-utils "^1.2.3" + +"@testing-library/dom@*": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-7.21.4.tgz#24b045f3161b7c91fdb35da7c001908cdc99b55b" + integrity sha512-IXjKRTAH31nQ+mx6q3IPw85RTLul8VlWBm1rxURoxDt7JI0HPlAAfbtrKTdeq83XYCYO7HSHogyV+OsD+6FX0Q== + dependencies: + "@babel/runtime" "^7.10.3" + "@types/aria-query" "^4.2.0" + aria-query "^4.2.2" + dom-accessibility-api "^0.4.6" + pretty-format "^25.5.0" + +"@testing-library/dom@^5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-5.6.1.tgz#705a1cb4a039b877c1e69e916824038e837ab637" + integrity sha512-Y1T2bjtvQMewffn1CJ28kpgnuvPYKsBcZMagEH0ppfEMZPDc8AkkEnTk4smrGZKw0cblNB3lhM2FMnpfLExlHg== + dependencies: + "@babel/runtime" "^7.5.5" + "@sheerun/mutationobserver-shim" "^0.3.2" + aria-query "3.0.0" + pretty-format "^24.8.0" + wait-for-expect "^1.2.0" + +"@testing-library/dom@^6.15.0": + version "6.16.0" + resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-6.16.0.tgz#04ada27ed74ad4c0f0d984a1245bb29b1fd90ba9" + integrity sha512-lBD88ssxqEfz0wFL6MeUyyWZfV/2cjEZZV3YRpb2IoJRej/4f1jB0TzqIOznTpfR1r34CNesrubxwIlAQ8zgPA== + dependencies: + "@babel/runtime" "^7.8.4" + "@sheerun/mutationobserver-shim" "^0.3.2" + "@types/testing-library__dom" "^6.12.1" + aria-query "^4.0.2" + dom-accessibility-api "^0.3.0" + pretty-format "^25.1.0" + wait-for-expect "^3.0.2" + +"@testing-library/jest-dom@^4.2.4": + version "4.2.4" + resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-4.2.4.tgz#00dfa0cbdd837d9a3c2a7f3f0a248ea6e7b89742" + integrity sha512-j31Bn0rQo12fhCWOUWy9fl7wtqkp7In/YP2p5ZFyRuiiB9Qs3g+hS4gAmDWONbAHcRmVooNJ5eOHQDCOmUFXHg== + dependencies: + "@babel/runtime" "^7.5.1" + chalk "^2.4.1" + css "^2.2.3" + css.escape "^1.5.1" + jest-diff "^24.0.0" + jest-matcher-utils "^24.0.0" + lodash "^4.17.11" + pretty-format "^24.0.0" + redent "^3.0.0" + +"@testing-library/react@^8.0.7": + version "8.0.9" + resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-8.0.9.tgz#1ecd96bc3471b06dd2f9763b6e53a7ace28a54a2" + integrity sha512-I7zd+MW5wk8rQA5VopZgBfxGKUd91jgZ6Vzj2gMqFf2iGGtKwvI5SVTrIJcSFaOXK88T2EUsbsIKugDtoqOcZQ== + dependencies: + "@babel/runtime" "^7.5.5" + "@testing-library/dom" "^5.6.1" + +"@testing-library/react@^9.3.2": + version "9.5.0" + resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-9.5.0.tgz#71531655a7890b61e77a1b39452fbedf0472ca5e" + integrity sha512-di1b+D0p+rfeboHO5W7gTVeZDIK5+maEgstrZbWZSSvxDyfDRkkyBE1AJR5Psd6doNldluXlCWqXriUfqu/9Qg== + dependencies: + "@babel/runtime" "^7.8.4" + "@testing-library/dom" "^6.15.0" + "@types/testing-library__react" "^9.1.2" + +"@testing-library/user-event@^7.1.2": + version "7.2.1" + resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-7.2.1.tgz#2ad4e844175a3738cb9e7064be5ea070b8863a1c" + integrity sha512-oZ0Ib5I4Z2pUEcoo95cT1cr6slco9WY7yiPpG+RGNkj8YcYgJnM7pXmYmorNOReh8MIGcKSqXyeGjxnr8YiZbA== + +"@types/aria-query@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-4.2.0.tgz#14264692a9d6e2fa4db3df5e56e94b5e25647ac0" + integrity sha512-iIgQNzCm0v7QMhhe4Jjn9uRh+I6GoPmt03CbEtwx3ao8/EfoQcmgtqH4vQ5Db/lxiIGaWDv6nwvunuh0RyX0+A== + +"@types/babel__core@^7.1.0": + version "7.1.6" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.6.tgz#16ff42a5ae203c9af1c6e190ed1f30f83207b610" + integrity sha512-tTnhWszAqvXnhW7m5jQU9PomXSiKXk2sFxpahXvI20SZKu9ylPi8WtIxueZ6ehDWikPT0jeFujMj3X4ZHuf3Tg== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.1" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.1.tgz#4901767b397e8711aeb99df8d396d7ba7b7f0e04" + integrity sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.0.2.tgz#4ff63d6b52eddac1de7b975a5223ed32ecea9307" + integrity sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.9.tgz#be82fab304b141c3eee81a4ce3b034d0eba1590a" + integrity sha512-jEFQ8L1tuvPjOI8lnpaf73oCJe+aoxL6ygqSy6c8LcW98zaC+4mzWuQIRCEvKeCOu+lbqdXcg4Uqmm1S8AP1tw== + dependencies: + "@babel/types" "^7.3.0" + +"@types/color-name@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" + integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== + +"@types/eslint-visitor-keys@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" + integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== + +"@types/events@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" + integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== + +"@types/glob@^7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" + integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w== + dependencies: + "@types/events" "*" + "@types/minimatch" "*" + "@types/node" "*" + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#42995b446db9a48a11a07ec083499a860e9138ff" + integrity sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg== + +"@types/istanbul-lib-report@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" + integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz#7a8cbf6a406f36c8add871625b278eaf0b0d255a" + integrity sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA== + dependencies: + "@types/istanbul-lib-coverage" "*" + "@types/istanbul-lib-report" "*" + +"@types/json-schema@^7.0.3": + version "7.0.4" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.4.tgz#38fd73ddfd9b55abb1e1b2ed578cb55bd7b7d339" + integrity sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA== + +"@types/long@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.1.tgz#459c65fa1867dafe6a8f322c4c51695663cc55e9" + integrity sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w== + +"@types/minimatch@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" + integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== + +"@types/node@*": + version "13.9.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-13.9.2.tgz#ace1880c03594cc3e80206d96847157d8e7fa349" + integrity sha512-bnoqK579sAYrQbp73wwglccjJ4sfRdKU7WNEZ5FW4K2U6Kc0/eZ5kvXG0JKsEKFB50zrFmfFt52/cvBbZa7eXg== + +"@types/node@>=6": + version "14.0.24" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.24.tgz#b0f86f58564fa02a28b68f8b55d4cdec42e3b9d6" + integrity sha512-btt/oNOiDWcSuI721MdL8VQGnjsKjlTMdrKyTcLCKeQp/n4AAMFJ961wMbp+09y8WuGPClDEv07RIItdXKIXAA== + +"@types/node@^13.7.0": + version "13.13.15" + resolved "https://registry.yarnpkg.com/@types/node/-/node-13.13.15.tgz#fe1cc3aa465a3ea6858b793fd380b66c39919766" + integrity sha512-kwbcs0jySLxzLsa2nWUAGOd/s21WU1jebrEdtzhsj1D4Yps1EOuyI1Qcu+FD56dL7NRNIJtDDjcqIG22NwkgLw== + +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + +"@types/prop-types@*": + version "15.7.3" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7" + integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw== + +"@types/q@^1.5.1": + version "1.5.2" + resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8" + integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw== + +"@types/react-dom@*": + version "16.9.8" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.9.8.tgz#fe4c1e11dfc67155733dfa6aa65108b4971cb423" + integrity sha512-ykkPQ+5nFknnlU6lDd947WbQ6TE3NNzbQAkInC2EKY1qeYdTKp7onFusmYZb+ityzx2YviqT6BXSu+LyWWJwcA== + dependencies: + "@types/react" "*" + +"@types/react-transition-group@^4.2.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.0.tgz#882839db465df1320e4753e6e9f70ca7e9b4d46d" + integrity sha512-/QfLHGpu+2fQOqQaXh8MG9q03bFENooTb/it4jr5kKaZlDQfWvjqWZg48AwzPVMBHlRuTRAY7hRHCEOXz5kV6w== + dependencies: + "@types/react" "*" + +"@types/react@*": + version "16.9.43" + resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.43.tgz#c287f23f6189666ee3bebc2eb8d0f84bcb6cdb6b" + integrity sha512-PxshAFcnJqIWYpJbLPriClH53Z2WlJcVZE+NP2etUtWQs2s7yIMj3/LDKZT/5CHJ/F62iyjVCDu2H3jHEXIxSg== + dependencies: + "@types/prop-types" "*" + csstype "^2.2.0" + +"@types/stack-utils@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" + integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== + +"@types/testing-library__dom@*": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@types/testing-library__dom/-/testing-library__dom-7.5.0.tgz#e0a00dd766983b1d6e9d10d33e708005ce6ad13e" + integrity sha512-mj1aH4cj3XUpMEgVpognma5kHVtbm6U6cHZmEFzCRiXPvKkuHrFr3+yXdGLXvfFRBaQIVshPGHI+hGTOJlhS/g== + dependencies: + "@testing-library/dom" "*" + +"@types/testing-library__dom@^6.12.1": + version "6.14.0" + resolved "https://registry.yarnpkg.com/@types/testing-library__dom/-/testing-library__dom-6.14.0.tgz#1aede831cb4ed4a398448df5a2c54b54a365644e" + integrity sha512-sMl7OSv0AvMOqn1UJ6j1unPMIHRXen0Ita1ujnMX912rrOcawe4f7wu0Zt9GIQhBhJvH2BaibqFgQ3lP+Pj2hA== + dependencies: + pretty-format "^24.3.0" + +"@types/testing-library__react@^9.1.2": + version "9.1.3" + resolved "https://registry.yarnpkg.com/@types/testing-library__react/-/testing-library__react-9.1.3.tgz#35eca61cc6ea923543796f16034882a1603d7302" + integrity sha512-iCdNPKU3IsYwRK9JieSYAiX0+aYDXOGAmrC/3/M7AqqSDKnWWVv07X+Zk1uFSL7cMTUYzv4lQRfohucEocn5/w== + dependencies: + "@types/react-dom" "*" + "@types/testing-library__dom" "*" + pretty-format "^25.1.0" + +"@types/yargs-parser@*": + version "15.0.0" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-15.0.0.tgz#cb3f9f741869e20cce330ffbeb9271590483882d" + integrity sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw== + +"@types/yargs@^13.0.0": + version "13.0.8" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.8.tgz#a38c22def2f1c2068f8971acb3ea734eb3c64a99" + integrity sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA== + dependencies: + "@types/yargs-parser" "*" + +"@types/yargs@^15.0.0": + version "15.0.5" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.5.tgz#947e9a6561483bdee9adffc983e91a6902af8b79" + integrity sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w== + dependencies: + "@types/yargs-parser" "*" + +"@types/zen-observable@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.8.0.tgz#8b63ab7f1aa5321248aad5ac890a485656dcea4d" + integrity sha512-te5lMAWii1uEJ4FwLjzdlbw3+n0FZNOvFXHxQDKeT0dilh7HOzdMzV2TrJVUzq8ep7J4Na8OUYPRLSQkJHAlrg== + +"@typescript-eslint/eslint-plugin@^2.10.0": + version "2.24.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.24.0.tgz#a86cf618c965a462cddf3601f594544b134d6d68" + integrity sha512-wJRBeaMeT7RLQ27UQkDFOu25MqFOBus8PtOa9KaT5ZuxC1kAsd7JEHqWt4YXuY9eancX0GK9C68i5OROnlIzBA== + dependencies: + "@typescript-eslint/experimental-utils" "2.24.0" + eslint-utils "^1.4.3" + functional-red-black-tree "^1.0.1" + regexpp "^3.0.0" + tsutils "^3.17.1" + +"@typescript-eslint/experimental-utils@2.24.0": + version "2.24.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.24.0.tgz#a5cb2ed89fedf8b59638dc83484eb0c8c35e1143" + integrity sha512-DXrwuXTdVh3ycNCMYmWhUzn/gfqu9N0VzNnahjiDJvcyhfBy4gb59ncVZVxdp5XzBC77dCncu0daQgOkbvPwBw== + dependencies: + "@types/json-schema" "^7.0.3" + "@typescript-eslint/typescript-estree" "2.24.0" + eslint-scope "^5.0.0" + +"@typescript-eslint/parser@^2.10.0": + version "2.24.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.24.0.tgz#2cf0eae6e6dd44d162486ad949c126b887f11eb8" + integrity sha512-H2Y7uacwSSg8IbVxdYExSI3T7uM1DzmOn2COGtCahCC3g8YtM1xYAPi2MAHyfPs61VKxP/J/UiSctcRgw4G8aw== + dependencies: + "@types/eslint-visitor-keys" "^1.0.0" + "@typescript-eslint/experimental-utils" "2.24.0" + "@typescript-eslint/typescript-estree" "2.24.0" + eslint-visitor-keys "^1.1.0" + +"@typescript-eslint/typescript-estree@2.24.0": + version "2.24.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.24.0.tgz#38bbc8bb479790d2f324797ffbcdb346d897c62a" + integrity sha512-RJ0yMe5owMSix55qX7Mi9V6z2FDuuDpN6eR5fzRJrp+8in9UF41IGNQHbg5aMK4/PjVaEQksLvz0IA8n+Mr/FA== + dependencies: + debug "^4.1.1" + eslint-visitor-keys "^1.1.0" + glob "^7.1.6" + is-glob "^4.0.1" + lodash "^4.17.15" + semver "^6.3.0" + tsutils "^3.17.1" + +"@webassemblyjs/ast@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359" + integrity sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ== + dependencies: + "@webassemblyjs/helper-module-context" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/wast-parser" "1.8.5" + +"@webassemblyjs/floating-point-hex-parser@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz#1ba926a2923613edce496fd5b02e8ce8a5f49721" + integrity sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ== + +"@webassemblyjs/helper-api-error@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz#c49dad22f645227c5edb610bdb9697f1aab721f7" + integrity sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA== + +"@webassemblyjs/helper-buffer@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz#fea93e429863dd5e4338555f42292385a653f204" + integrity sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q== + +"@webassemblyjs/helper-code-frame@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz#9a740ff48e3faa3022b1dff54423df9aa293c25e" + integrity sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ== + dependencies: + "@webassemblyjs/wast-printer" "1.8.5" + +"@webassemblyjs/helper-fsm@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz#ba0b7d3b3f7e4733da6059c9332275d860702452" + integrity sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow== + +"@webassemblyjs/helper-module-context@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz#def4b9927b0101dc8cbbd8d1edb5b7b9c82eb245" + integrity sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g== + dependencies: + "@webassemblyjs/ast" "1.8.5" + mamacro "^0.0.3" + +"@webassemblyjs/helper-wasm-bytecode@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz#537a750eddf5c1e932f3744206551c91c1b93e61" + integrity sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ== + +"@webassemblyjs/helper-wasm-section@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz#74ca6a6bcbe19e50a3b6b462847e69503e6bfcbf" + integrity sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-buffer" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/wasm-gen" "1.8.5" + +"@webassemblyjs/ieee754@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz#712329dbef240f36bf57bd2f7b8fb9bf4154421e" + integrity sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.8.5.tgz#044edeb34ea679f3e04cd4fd9824d5e35767ae10" + integrity sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.8.5.tgz#a8bf3b5d8ffe986c7c1e373ccbdc2a0915f0cedc" + integrity sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw== + +"@webassemblyjs/wasm-edit@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz#962da12aa5acc1c131c81c4232991c82ce56e01a" + integrity sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-buffer" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/helper-wasm-section" "1.8.5" + "@webassemblyjs/wasm-gen" "1.8.5" + "@webassemblyjs/wasm-opt" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" + "@webassemblyjs/wast-printer" "1.8.5" + +"@webassemblyjs/wasm-gen@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz#54840766c2c1002eb64ed1abe720aded714f98bc" + integrity sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/ieee754" "1.8.5" + "@webassemblyjs/leb128" "1.8.5" + "@webassemblyjs/utf8" "1.8.5" + +"@webassemblyjs/wasm-opt@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz#b24d9f6ba50394af1349f510afa8ffcb8a63d264" + integrity sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-buffer" "1.8.5" + "@webassemblyjs/wasm-gen" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" + +"@webassemblyjs/wasm-parser@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz#21576f0ec88b91427357b8536383668ef7c66b8d" + integrity sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-api-error" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/ieee754" "1.8.5" + "@webassemblyjs/leb128" "1.8.5" + "@webassemblyjs/utf8" "1.8.5" + +"@webassemblyjs/wast-parser@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz#e10eecd542d0e7bd394f6827c49f3df6d4eefb8c" + integrity sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/floating-point-hex-parser" "1.8.5" + "@webassemblyjs/helper-api-error" "1.8.5" + "@webassemblyjs/helper-code-frame" "1.8.5" + "@webassemblyjs/helper-fsm" "1.8.5" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/wast-printer@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz#114bbc481fd10ca0e23b3560fa812748b0bae5bc" + integrity sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/wast-parser" "1.8.5" + "@xtuc/long" "4.2.2" + +"@wry/context@^0.4.0": + version "0.4.4" + resolved "https://registry.yarnpkg.com/@wry/context/-/context-0.4.4.tgz#e50f5fa1d6cfaabf2977d1fda5ae91717f8815f8" + integrity sha512-LrKVLove/zw6h2Md/KZyWxIkFM6AoyKp71OqpH9Hiip1csjPVoD3tPxlbQUNxEnHENks3UGgNpSBCAfq9KWuag== + dependencies: + "@types/node" ">=6" + tslib "^1.9.3" + +"@wry/context@^0.5.2": + version "0.5.2" + resolved "https://registry.yarnpkg.com/@wry/context/-/context-0.5.2.tgz#f2a5d5ab9227343aa74c81e06533c1ef84598ec7" + integrity sha512-B/JLuRZ/vbEKHRUiGj6xiMojST1kHhu4WcreLfNN7q9DqQFrb97cWgf/kiYsPSUCAMVN0HzfFc8XjJdzgZzfjw== + dependencies: + tslib "^1.9.3" + +"@wry/equality@^0.1.2", "@wry/equality@^0.1.9": + version "0.1.11" + resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.1.11.tgz#35cb156e4a96695aa81a9ecc4d03787bc17f1790" + integrity sha512-mwEVBDUVODlsQQ5dfuLUS5/Tf7jqUKyhKYHmVi4fPB6bDMOfWvUPJmKgS1Z7Za/sOI3vzWt4+O7yCiL/70MogA== + dependencies: + tslib "^1.9.3" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +abab@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.3.tgz#623e2075e02eb2d3f2475e49f99c91846467907a" + integrity sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg== + +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: + version "1.3.7" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" + integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== + dependencies: + mime-types "~2.1.24" + negotiator "0.6.2" + +acorn-globals@^4.1.0, acorn-globals@^4.3.0: + version "4.3.4" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7" + integrity sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A== + dependencies: + acorn "^6.0.1" + acorn-walk "^6.0.1" + +acorn-jsx@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe" + integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ== + +acorn-walk@^6.0.1: + version "6.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" + integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA== + +acorn@^5.5.3: + version "5.7.4" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e" + integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg== + +acorn@^6.0.1, acorn@^6.0.4, acorn@^6.2.1: + version "6.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" + integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== + +acorn@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf" + integrity sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg== + +address@1.1.2, address@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6" + integrity sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA== + +adjust-sourcemap-loader@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/adjust-sourcemap-loader/-/adjust-sourcemap-loader-2.0.0.tgz#6471143af75ec02334b219f54bc7970c52fb29a4" + integrity sha512-4hFsTsn58+YjrU9qKzML2JSSDqKvN8mUGQ0nNIrfPi8hmIONT4L3uUaT6MKdMsZ9AjsU6D2xDkZxCkbQPxChrA== + dependencies: + assert "1.4.1" + camelcase "5.0.0" + loader-utils "1.2.3" + object-path "0.11.4" + regex-parser "2.2.10" + +aggregate-error@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.1.tgz#db2fe7246e536f40d9b5442a39e117d7dd6a24e0" + integrity sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ajv-errors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" + integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== + +ajv-keywords@^3.1.0, ajv-keywords@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da" + integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ== + +ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.0, ajv@^6.5.5: + version "6.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.0.tgz#06d60b96d87b8454a5adaba86e7854da629db4b7" + integrity sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +alphanum-sort@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" + integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= + +ansi-colors@^3.0.0: + version "3.2.4" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" + integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== + +ansi-escapes@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== + +ansi-escapes@^4.2.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" + integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== + dependencies: + type-fest "^0.11.0" + +ansi-html@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" + integrity sha1-gTWEAhliqenm/QOflA0S9WynhZ4= + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-regex@^4.0.0, ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + +ansi-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" + integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" + integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== + dependencies: + "@types/color-name" "^1.1.1" + color-convert "^2.0.1" + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +anymatch@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" + integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +apollo-boost@^0.4.9: + version "0.4.9" + resolved "https://registry.yarnpkg.com/apollo-boost/-/apollo-boost-0.4.9.tgz#ab3ba539c2ca944e6fd156583a1b1954b17a6791" + integrity sha512-05y5BKcDaa8w47f8d81UVwKqrAjn8uKLv6QM9fNdldoNzQ+rnOHgFlnrySUZRz9QIT3vPftQkEz2UEASp1Mi5g== + dependencies: + apollo-cache "^1.3.5" + apollo-cache-inmemory "^1.6.6" + apollo-client "^2.6.10" + apollo-link "^1.0.6" + apollo-link-error "^1.0.3" + apollo-link-http "^1.3.1" + graphql-tag "^2.4.2" + ts-invariant "^0.4.0" + tslib "^1.10.0" + +apollo-cache-inmemory@^1.1.7, apollo-cache-inmemory@^1.6.6: + version "1.6.6" + resolved "https://registry.yarnpkg.com/apollo-cache-inmemory/-/apollo-cache-inmemory-1.6.6.tgz#56d1f2a463a6b9db32e9fa990af16d2a008206fd" + integrity sha512-L8pToTW/+Xru2FFAhkZ1OA9q4V4nuvfoPecBM34DecAugUZEBhI2Hmpgnzq2hTKZ60LAMrlqiASm0aqAY6F8/A== + dependencies: + apollo-cache "^1.3.5" + apollo-utilities "^1.3.4" + optimism "^0.10.0" + ts-invariant "^0.4.0" + tslib "^1.10.0" + +apollo-cache@1.3.5, apollo-cache@^1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/apollo-cache/-/apollo-cache-1.3.5.tgz#9dbebfc8dbe8fe7f97ba568a224bca2c5d81f461" + integrity sha512-1XoDy8kJnyWY/i/+gLTEbYLnoiVtS8y7ikBr/IfmML4Qb+CM7dEEbIUOjnY716WqmZ/UpXIxTfJsY7rMcqiCXA== + dependencies: + apollo-utilities "^1.3.4" + tslib "^1.10.0" + +apollo-client-preset@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/apollo-client-preset/-/apollo-client-preset-1.0.8.tgz#23bd7176849d0d815f12c648774d009b258a449e" + integrity sha512-vRrdBfoOBkSboUmkec/zDWK9dT22GoZ2NgTKxfPXaTRh82HGDejDAblMr7BuDtZQ6zxMUiD9kghmO+3HXsHKdQ== + dependencies: + apollo-cache-inmemory "^1.1.7" + apollo-client "^2.2.2" + apollo-link "^1.0.6" + apollo-link-http "^1.3.1" + graphql-tag "^2.4.2" + +apollo-client@^2.2.2, apollo-client@^2.6.10, apollo-client@^2.6.3: + version "2.6.10" + resolved "https://registry.yarnpkg.com/apollo-client/-/apollo-client-2.6.10.tgz#86637047b51d940c8eaa771a4ce1b02df16bea6a" + integrity sha512-jiPlMTN6/5CjZpJOkGeUV0mb4zxx33uXWdj/xQCfAMkuNAC3HN7CvYDyMHHEzmcQ5GV12LszWoQ/VlxET24CtA== + dependencies: + "@types/zen-observable" "^0.8.0" + apollo-cache "1.3.5" + apollo-link "^1.0.0" + apollo-utilities "1.3.4" + symbol-observable "^1.0.2" + ts-invariant "^0.4.0" + tslib "^1.10.0" + zen-observable "^0.8.0" + +apollo-link-context@^1.0.20: + version "1.0.20" + resolved "https://registry.yarnpkg.com/apollo-link-context/-/apollo-link-context-1.0.20.tgz#1939ac5dc65d6dff0c855ee53521150053c24676" + integrity sha512-MLLPYvhzNb8AglNsk2NcL9AvhO/Vc9hn2ZZuegbhRHGet3oGr0YH9s30NS9+ieoM0sGT11p7oZ6oAILM/kiRBA== + dependencies: + apollo-link "^1.2.14" + tslib "^1.9.3" + +apollo-link-error@^1.0.3: + version "1.1.13" + resolved "https://registry.yarnpkg.com/apollo-link-error/-/apollo-link-error-1.1.13.tgz#c1a1bb876ffe380802c8df0506a32c33aad284cd" + integrity sha512-jAZOOahJU6bwSqb2ZyskEK1XdgUY9nkmeclCrW7Gddh1uasHVqmoYc4CKdb0/H0Y1J9lvaXKle2Wsw/Zx1AyUg== + dependencies: + apollo-link "^1.2.14" + apollo-link-http-common "^0.2.16" + tslib "^1.9.3" + +apollo-link-http-common@^0.2.16: + version "0.2.16" + resolved "https://registry.yarnpkg.com/apollo-link-http-common/-/apollo-link-http-common-0.2.16.tgz#756749dafc732792c8ca0923f9a40564b7c59ecc" + integrity sha512-2tIhOIrnaF4UbQHf7kjeQA/EmSorB7+HyJIIrUjJOKBgnXwuexi8aMecRlqTIDWcyVXCeqLhUnztMa6bOH/jTg== + dependencies: + apollo-link "^1.2.14" + ts-invariant "^0.4.0" + tslib "^1.9.3" + +apollo-link-http@^1.3.1: + version "1.5.17" + resolved "https://registry.yarnpkg.com/apollo-link-http/-/apollo-link-http-1.5.17.tgz#499e9f1711bf694497f02c51af12d82de5d8d8ba" + integrity sha512-uWcqAotbwDEU/9+Dm9e1/clO7hTB2kQ/94JYcGouBVLjoKmTeJTUPQKcJGpPwUjZcSqgYicbFqQSoJIW0yrFvg== + dependencies: + apollo-link "^1.2.14" + apollo-link-http-common "^0.2.16" + tslib "^1.9.3" + +apollo-link-logger@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/apollo-link-logger/-/apollo-link-logger-1.2.3.tgz#1f3e6f7849ce7a7e3aa822141fe062cfa278b1e1" + integrity sha512-GaVwdHyXmawfvBlHfZkFkBHH3+YH7wibzSCc4/YpIbPVtbtZqi0Qop18w++jgpw385W083DMOdYe2eJsKkZdag== + +apollo-link@^1.0.0, apollo-link@^1.0.6, apollo-link@^1.2.14: + version "1.2.14" + resolved "https://registry.yarnpkg.com/apollo-link/-/apollo-link-1.2.14.tgz#3feda4b47f9ebba7f4160bef8b977ba725b684d9" + integrity sha512-p67CMEFP7kOG1JZ0ZkYZwRDa369w5PIjtMjvrQd/HnIV8FRsHRqLqK+oAZQnFa1DDdZtOtHTi+aMIW6EatC2jg== + dependencies: + apollo-utilities "^1.3.0" + ts-invariant "^0.4.0" + tslib "^1.9.3" + zen-observable-ts "^0.8.21" + +apollo-utilities@1.3.4, apollo-utilities@^1.3.0, apollo-utilities@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/apollo-utilities/-/apollo-utilities-1.3.4.tgz#6129e438e8be201b6c55b0f13ce49d2c7175c9cf" + integrity sha512-pk2hiWrCXMAy2fRPwEyhvka+mqwzeP60Jr1tRYi5xru+3ko94HI9o6lK0CT33/w4RDlxWchmdhDCrvdr+pHCig== + dependencies: + "@wry/equality" "^0.1.2" + fast-json-stable-stringify "^2.0.0" + ts-invariant "^0.4.0" + tslib "^1.10.0" + +aproba@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +aria-query@3.0.0, aria-query@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-3.0.0.tgz#65b3fcc1ca1155a8c9ae64d6eee297f15d5133cc" + integrity sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w= + dependencies: + ast-types-flow "0.0.7" + commander "^2.11.0" + +aria-query@^4.0.2, aria-query@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-4.2.2.tgz#0d2ca6c9aceb56b8977e9fed6aed7e15bbd2f83b" + integrity sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA== + dependencies: + "@babel/runtime" "^7.10.2" + "@babel/runtime-corejs3" "^7.10.2" + +arity-n@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/arity-n/-/arity-n-1.0.4.tgz#d9e76b11733e08569c0847ae7b39b2860b30b745" + integrity sha1-2edrEXM+CFacCEeuezmyhgswt0U= + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + +array-flatten@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" + integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== + +array-includes@^3.0.3, array-includes@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.1.tgz#cdd67e6852bdf9c1215460786732255ed2459348" + integrity sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0" + is-string "^1.0.5" + +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= + dependencies: + array-uniq "^1.0.1" + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +array.prototype.flat@^1.2.1: + version "1.2.3" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz#0de82b426b0318dbfdb940089e38b043d37f6c7b" + integrity sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + +arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= + +asap@~2.0.3, asap@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= + +asn1.js@^4.0.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" + integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +asn1@~0.2.3: + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + +assert@1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" + integrity sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE= + dependencies: + util "0.10.3" + +assert@^1.1.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" + integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== + dependencies: + object-assign "^4.1.1" + util "0.10.3" + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +ast-types-flow@0.0.7, ast-types-flow@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" + integrity sha1-9wtzXGvKGlycItmCw+Oef+ujva0= + +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== + +async-each@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== + +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== + +async@^2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" + integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== + dependencies: + lodash "^4.17.14" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +attr-accept@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/attr-accept/-/attr-accept-2.1.0.tgz#a231a854385d36ff7a99647bb77b33c8a5175aee" + integrity sha512-sLzVM3zCCmmDtDNhI0i96k6PUztkotSOXqE4kDGQt/6iDi5M+H0srjeF+QC6jN581l4X/Zq3Zu/tgcErEssavg== + +autoprefixer@^9.6.1: + version "9.7.4" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.7.4.tgz#f8bf3e06707d047f0641d87aee8cfb174b2a5378" + integrity sha512-g0Ya30YrMBAEZk60lp+qfX5YQllG+S5W3GYCFvyHTvhOki0AEQJLPEcIuGRsqVwLi8FvXPVtwTGhfr38hVpm0g== + dependencies: + browserslist "^4.8.3" + caniuse-lite "^1.0.30001020" + chalk "^2.4.2" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + postcss "^7.0.26" + postcss-value-parser "^4.0.2" + +autosuggest-highlight@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/autosuggest-highlight/-/autosuggest-highlight-3.1.1.tgz#70bb4f9125fe8a849e85f825f7bb2a1a4806743d" + integrity sha512-MQ6GNIGMMZbeA5FlBLXXgkZEthysCdYNkMV4MahB2/qB/9cwBnVsePUPnIqkMuzjzclTtDa67xln7cgLDu2f/g== + dependencies: + diacritic "0.0.2" + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + +aws4@^1.8.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.1.tgz#7e33d8f7d449b3f673cd72deb9abdc552dbe528e" + integrity sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug== + +axobject-query@^2.0.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.1.2.tgz#2bdffc0371e643e5f03ba99065d5179b9ca79799" + integrity sha512-ICt34ZmrVt8UQnvPl6TVyDTkmhXmAyAT4Jh5ugfGUX4MOrZ+U/ZY6/sdylRw3qGNr9Ub5AJsaHeDMzNLehRdOQ== + +babel-code-frame@^6.22.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + +babel-eslint@10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232" + integrity sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.7.0" + "@babel/traverse" "^7.7.0" + "@babel/types" "^7.7.0" + eslint-visitor-keys "^1.0.0" + resolve "^1.12.0" + +babel-extract-comments@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz#0a2aedf81417ed391b85e18b4614e693a0351a21" + integrity sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ== + dependencies: + babylon "^6.18.0" + +babel-jest@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-24.9.0.tgz#3fc327cb8467b89d14d7bc70e315104a783ccd54" + integrity sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw== + dependencies: + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/babel__core" "^7.1.0" + babel-plugin-istanbul "^5.1.0" + babel-preset-jest "^24.9.0" + chalk "^2.4.2" + slash "^2.0.0" + +babel-loader@8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.1.0.tgz#c611d5112bd5209abe8b9fa84c3e4da25275f1c3" + integrity sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw== + dependencies: + find-cache-dir "^2.1.0" + loader-utils "^1.4.0" + mkdirp "^0.5.3" + pify "^4.0.1" + schema-utils "^2.6.5" + +babel-plugin-dynamic-import-node@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz#f00f507bdaa3c3e3ff6e7e5e98d90a7acab96f7f" + integrity sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ== + dependencies: + object.assign "^4.1.0" + +babel-plugin-istanbul@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz#df4ade83d897a92df069c4d9a25cf2671293c854" + integrity sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + find-up "^3.0.0" + istanbul-lib-instrument "^3.3.0" + test-exclude "^5.2.3" + +babel-plugin-jest-hoist@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz#4f837091eb407e01447c8843cbec546d0002d756" + integrity sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw== + dependencies: + "@types/babel__traverse" "^7.0.6" + +babel-plugin-macros@2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz#0f958a7cc6556b1e65344465d99111a1e5e10138" + integrity sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg== + dependencies: + "@babel/runtime" "^7.7.2" + cosmiconfig "^6.0.0" + resolve "^1.12.0" + +babel-plugin-named-asset-import@^0.3.6: + version "0.3.6" + resolved "https://registry.yarnpkg.com/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.6.tgz#c9750a1b38d85112c9e166bf3ef7c5dbc605f4be" + integrity sha512-1aGDUfL1qOOIoqk9QKGIo2lANk+C7ko/fqH0uIyC71x3PEGz0uVP8ISgfEsFuG+FKmjHTvFK/nNM8dowpmUxLA== + +babel-plugin-syntax-object-rest-spread@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" + integrity sha1-/WU28rzhODb/o6VFjEkDpZe7O/U= + +babel-plugin-transform-object-rest-spread@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" + integrity sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY= + dependencies: + babel-plugin-syntax-object-rest-spread "^6.8.0" + babel-runtime "^6.26.0" + +babel-plugin-transform-react-remove-prop-types@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz#f2edaf9b4c6a5fbe5c1d678bfb531078c1555f3a" + integrity sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA== + +babel-preset-jest@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz#192b521e2217fb1d1f67cf73f70c336650ad3cdc" + integrity sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg== + dependencies: + "@babel/plugin-syntax-object-rest-spread" "^7.0.0" + babel-plugin-jest-hoist "^24.9.0" + +babel-preset-react-app@^9.1.2: + version "9.1.2" + resolved "https://registry.yarnpkg.com/babel-preset-react-app/-/babel-preset-react-app-9.1.2.tgz#54775d976588a8a6d1a99201a702befecaf48030" + integrity sha512-k58RtQOKH21NyKtzptoAvtAODuAJJs3ZhqBMl456/GnXEQ/0La92pNmwgWoMn5pBTrsvk3YYXdY7zpY4e3UIxA== + dependencies: + "@babel/core" "7.9.0" + "@babel/plugin-proposal-class-properties" "7.8.3" + "@babel/plugin-proposal-decorators" "7.8.3" + "@babel/plugin-proposal-nullish-coalescing-operator" "7.8.3" + "@babel/plugin-proposal-numeric-separator" "7.8.3" + "@babel/plugin-proposal-optional-chaining" "7.9.0" + "@babel/plugin-transform-flow-strip-types" "7.9.0" + "@babel/plugin-transform-react-display-name" "7.8.3" + "@babel/plugin-transform-runtime" "7.9.0" + "@babel/preset-env" "7.9.0" + "@babel/preset-react" "7.9.1" + "@babel/preset-typescript" "7.9.0" + "@babel/runtime" "7.9.0" + babel-plugin-macros "2.8.0" + babel-plugin-transform-react-remove-prop-types "0.4.24" + +babel-runtime@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +base64-js@^1.0.2: + version "1.3.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" + integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + dependencies: + tweetnacl "^0.14.3" + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +binary-extensions@^1.0.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== + +binary-extensions@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c" + integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow== + +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +bluebird@^3.5.5: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: + version "4.11.8" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" + integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== + +body-parser@1.19.0: + version "1.19.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" + integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== + dependencies: + bytes "3.1.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "1.7.2" + iconv-lite "0.4.24" + on-finished "~2.3.0" + qs "6.7.0" + raw-body "2.4.0" + type-is "~1.6.17" + +bonjour@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" + integrity sha1-jokKGD2O6aI5OzhExpGkK897yfU= + dependencies: + array-flatten "^2.1.0" + deep-equal "^1.0.1" + dns-equal "^1.0.0" + dns-txt "^2.0.2" + multicast-dns "^6.0.1" + multicast-dns-service-types "^1.1.0" + +boolbase@^1.0.0, boolbase@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^2.3.1, braces@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +brorand@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + +browser-process-hrtime@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" + integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== + +browser-resolve@^1.11.3: + version "1.11.3" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" + integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== + dependencies: + resolve "1.1.7" + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" + integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= + dependencies: + bn.js "^4.1.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" + integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg= + dependencies: + bn.js "^4.1.1" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.2" + elliptic "^6.0.0" + inherits "^2.0.1" + parse-asn1 "^5.0.0" + +browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== + dependencies: + pako "~1.0.5" + +browserslist@4.10.0, browserslist@^4.0.0, browserslist@^4.6.2, browserslist@^4.6.4, browserslist@^4.8.3, browserslist@^4.9.1: + version "4.10.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.10.0.tgz#f179737913eaf0d2b98e4926ac1ca6a15cbcc6a9" + integrity sha512-TpfK0TDgv71dzuTsEAlQiHeWQ/tiPqgNZVdv046fvNtBZrjbv2O3TsWCDU0AWGJJKCF/KsjNdLzR9hXOsh/CfA== + dependencies: + caniuse-lite "^1.0.30001035" + electron-to-chromium "^1.3.378" + node-releases "^1.1.52" + pkg-up "^3.1.0" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + +buffer-indexof@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" + integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g== + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + +buffer@^4.3.0: + version "4.9.2" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= + +bytes@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" + integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== + +cacache@^12.0.2: + version "12.0.3" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.3.tgz#be99abba4e1bf5df461cd5a2c1071fc432573390" + integrity sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw== + dependencies: + bluebird "^3.5.5" + chownr "^1.1.1" + figgy-pudding "^3.5.1" + glob "^7.1.4" + graceful-fs "^4.1.15" + infer-owner "^1.0.3" + lru-cache "^5.1.1" + mississippi "^3.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.3" + ssri "^6.0.1" + unique-filename "^1.1.1" + y18n "^4.0.0" + +cacache@^13.0.1: + version "13.0.1" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-13.0.1.tgz#a8000c21697089082f85287a1aec6e382024a71c" + integrity sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w== + dependencies: + chownr "^1.1.2" + figgy-pudding "^3.5.1" + fs-minipass "^2.0.0" + glob "^7.1.4" + graceful-fs "^4.2.2" + infer-owner "^1.0.4" + lru-cache "^5.1.1" + minipass "^3.0.0" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.2" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + p-map "^3.0.0" + promise-inflight "^1.0.1" + rimraf "^2.7.1" + ssri "^7.0.0" + unique-filename "^1.1.1" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +call-me-maybe@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" + integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= + +caller-callsite@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" + integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= + dependencies: + callsites "^2.0.0" + +caller-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" + integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= + dependencies: + caller-callsite "^2.0.0" + +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camel-case@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.1.tgz#1fc41c854f00e2f7d0139dfeba1542d6896fe547" + integrity sha512-7fa2WcG4fYFkclIvEmxBbTvmibwF2/agfEBc6q3lOpVu0A13ltLsA+Hr/8Hp6kp5f+G7hKi6t8lys6XxP+1K6Q== + dependencies: + pascal-case "^3.1.1" + tslib "^1.10.0" + +camelcase@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.0.0.tgz#03295527d58bd3cd4aa75363f35b2e8d97be2f42" + integrity sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA== + +camelcase@5.3.1, camelcase@^5.0.0, camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +caniuse-api@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== + dependencies: + browserslist "^4.0.0" + caniuse-lite "^1.0.0" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001020, caniuse-lite@^1.0.30001035: + version "1.0.30001035" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001035.tgz#2bb53b8aa4716b2ed08e088d4dc816a5fe089a1e" + integrity sha512-C1ZxgkuA4/bUEdMbU5WrGY4+UhMFFiXrgNAfxiMIqWgFTWfv/xsZCS2xEHT2LMq7xAZfuAnu6mcqyDl0ZR6wLQ== + +capture-exit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" + integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g== + dependencies: + rsvp "^4.8.4" + +case-sensitive-paths-webpack-plugin@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz#23ac613cc9a856e4f88ff8bb73bbb5e989825cf7" + integrity sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ== + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + +chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +change-emitter@^0.1.2: + version "0.1.6" + resolved "https://registry.yarnpkg.com/change-emitter/-/change-emitter-0.1.6.tgz#e8b2fe3d7f1ab7d69a32199aff91ea6931409515" + integrity sha1-6LL+PX8at9aaMhma/5HqaTFAlRU= + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +chokidar@^2.0.2, chokidar@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" + +chokidar@^3.3.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.1.tgz#c84e5b3d18d9a4d77558fef466b1bf16bbeb3450" + integrity sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.3.0" + optionalDependencies: + fsevents "~2.1.2" + +chownr@^1.1.1, chownr@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + +chrome-trace-event@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" + integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== + dependencies: + tslib "^1.9.0" + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +classnames@~2.2.5: + version "2.2.6" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" + integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q== + +clean-css@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.3.tgz#507b5de7d97b48ee53d84adb0160ff6216380f78" + integrity sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA== + dependencies: + source-map "~0.6.0" + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-width@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= + +cliui@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" + integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + wrap-ansi "^2.0.0" + +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + +clone-deep@^0.2.4: + version "0.2.4" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-0.2.4.tgz#4e73dd09e9fb971cc38670c5dced9c1896481cc6" + integrity sha1-TnPdCen7lxzDhnDF3O2cGJZIHMY= + dependencies: + for-own "^0.1.3" + is-plain-object "^2.0.1" + kind-of "^3.0.2" + lazy-cache "^1.0.3" + shallow-clone "^0.1.2" + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +clsx@^1.0.4: + version "1.1.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.1.1.tgz#98b3134f9abbdf23b2663491ace13c5c03a73188" + integrity sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA== + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= + +coa@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" + integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== + dependencies: + "@types/q" "^1.5.1" + chalk "^2.4.1" + q "^1.1.2" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0, color-convert@^1.9.1: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@^1.0.0, color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-string@^1.5.2: + version "1.5.3" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc" + integrity sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/color/-/color-3.1.2.tgz#68148e7f85d41ad7649c5fa8c8106f098d229e10" + integrity sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg== + dependencies: + color-convert "^1.9.1" + color-string "^1.5.2" + +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@^2.11.0, commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + +common-tags@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937" + integrity sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +compose-function@3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/compose-function/-/compose-function-3.0.3.tgz#9ed675f13cc54501d30950a486ff6a7ba3ab185f" + integrity sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8= + dependencies: + arity-n "^1.0.4" + +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +compute-scroll-into-view@^1.0.9: + version "1.0.14" + resolved "https://registry.yarnpkg.com/compute-scroll-into-view/-/compute-scroll-into-view-1.0.14.tgz#80e3ebb25d6aa89f42e533956cb4b16a04cfe759" + integrity sha512-mKDjINe3tc6hGelUMNDzuhorIUZ7kS7BwyY0r2wQd2HOH2tRuJykiC06iSEX8y1TuhNzvz4GcJnK16mM2J1NMQ== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +concat-stream@^1.5.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +confusing-browser-globals@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz#72bc13b483c0276801681871d4898516f8f54fdd" + integrity sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw== + +connect-history-api-fallback@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" + integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== + +connected-react-router@^6.5.2: + version "6.8.0" + resolved "https://registry.yarnpkg.com/connected-react-router/-/connected-react-router-6.8.0.tgz#ddc687b31d498322445d235d660798489fa56cae" + integrity sha512-E64/6krdJM3Ag3MMmh2nKPtMbH15s3JQDuaYJvOVXzu6MbHbDyIvuwLOyhQIuP4Om9zqEfZYiVyflROibSsONg== + dependencies: + prop-types "^15.7.2" + +console-browserify@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" + integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== + +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= + +contains-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" + integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= + +content-disposition@0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" + integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== + dependencies: + safe-buffer "5.1.2" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +convert-source-map@1.7.0, convert-source-map@^1.4.0, convert-source-map@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + dependencies: + safe-buffer "~5.1.1" + +convert-source-map@^0.3.3: + version "0.3.5" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-0.3.5.tgz#f1d802950af7dd2631a1febe0596550c86ab3190" + integrity sha1-8dgClQr33SYxof6+BZZVDIarMZA= + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + +cookie@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" + integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== + +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== + dependencies: + aproba "^1.1.1" + fs-write-stream-atomic "^1.0.8" + iferr "^0.1.5" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.0" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +core-js-compat@^3.6.2: + version "3.6.4" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.4.tgz#938476569ebb6cda80d339bcf199fae4f16fff17" + integrity sha512-zAa3IZPvsJ0slViBQ2z+vgyyTuhd3MFn1rBQjZSKVEgB0UMYhUkCj9jJUVPgGTGqWvsBVmfnruXgTcNyTlEiSA== + dependencies: + browserslist "^4.8.3" + semver "7.0.0" + +core-js-pure@^3.0.0: + version "3.6.4" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.6.4.tgz#4bf1ba866e25814f149d4e9aaa08c36173506e3a" + integrity sha512-epIhRLkXdgv32xIUFaaAry2wdxZYBi6bgM7cB136dzzXXa+dFyRLTZeLUJxnd8ShrmyVXBub63n2NHo2JAt8Cw== + +core-js@3.6.5: + version "3.6.5" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.5.tgz#7395dc273af37fb2e50e9bd3d9fe841285231d1a" + integrity sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA== + +core-js@^1.0.0: + version "1.2.7" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" + integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY= + +core-js@^2.4.0: + version "2.6.11" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" + integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== + +core-js@^3.5.0: + version "3.6.4" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.4.tgz#440a83536b458114b9cb2ac1580ba377dc470647" + integrity sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw== + +core-util-is@1.0.2, core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +cosmiconfig@^5.0.0, cosmiconfig@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" + integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== + dependencies: + import-fresh "^2.0.0" + is-directory "^0.3.1" + js-yaml "^3.13.1" + parse-json "^4.0.0" + +cosmiconfig@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" + integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.1.0" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.7.2" + +create-ecdh@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" + integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw== + dependencies: + bn.js "^4.1.0" + elliptic "^6.0.0" + +create-hash@^1.1.0, create-hash@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +cross-spawn@7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.1.tgz#0ab56286e0f7c24e153d04cc2aa027e43a9a5d14" + integrity sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +cross-spawn@^6.0.0, cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +crypto-browserify@^3.11.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +css-blank-pseudo@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz#dfdefd3254bf8a82027993674ccf35483bfcb3c5" + integrity sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w== + dependencies: + postcss "^7.0.5" + +css-color-names@0.0.4, css-color-names@^0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" + integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA= + +css-declaration-sorter@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22" + integrity sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA== + dependencies: + postcss "^7.0.1" + timsort "^0.3.0" + +css-has-pseudo@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz#3c642ab34ca242c59c41a125df9105841f6966ee" + integrity sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ== + dependencies: + postcss "^7.0.6" + postcss-selector-parser "^5.0.0-rc.4" + +css-loader@3.4.2: + version "3.4.2" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.4.2.tgz#d3fdb3358b43f233b78501c5ed7b1c6da6133202" + integrity sha512-jYq4zdZT0oS0Iykt+fqnzVLRIeiPWhka+7BqPn+oSIpWJAHak5tmB/WZrJ2a21JhCeFyNnnlroSl8c+MtVndzA== + dependencies: + camelcase "^5.3.1" + cssesc "^3.0.0" + icss-utils "^4.1.1" + loader-utils "^1.2.3" + normalize-path "^3.0.0" + postcss "^7.0.23" + postcss-modules-extract-imports "^2.0.0" + postcss-modules-local-by-default "^3.0.2" + postcss-modules-scope "^2.1.1" + postcss-modules-values "^3.0.0" + postcss-value-parser "^4.0.2" + schema-utils "^2.6.0" + +css-mediaquery@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/css-mediaquery/-/css-mediaquery-0.1.2.tgz#6a2c37344928618631c54bd33cedd301da18bea0" + integrity sha1-aiw3NEkoYYYxxUvTPO3TAdoYvqA= + +css-prefers-color-scheme@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz#6f830a2714199d4f0d0d0bb8a27916ed65cff1f4" + integrity sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg== + dependencies: + postcss "^7.0.5" + +css-select-base-adapter@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" + integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== + +css-select@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" + integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg= + dependencies: + boolbase "~1.0.0" + css-what "2.1" + domutils "1.5.1" + nth-check "~1.0.1" + +css-select@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef" + integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ== + dependencies: + boolbase "^1.0.0" + css-what "^3.2.1" + domutils "^1.7.0" + nth-check "^1.0.2" + +css-tree@1.0.0-alpha.37: + version "1.0.0-alpha.37" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" + integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg== + dependencies: + mdn-data "2.0.4" + source-map "^0.6.1" + +css-vendor@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/css-vendor/-/css-vendor-2.0.8.tgz#e47f91d3bd3117d49180a3c935e62e3d9f7f449d" + integrity sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ== + dependencies: + "@babel/runtime" "^7.8.3" + is-in-browser "^1.0.2" + +css-what@2.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" + integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== + +css-what@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.2.1.tgz#f4a8f12421064621b456755e34a03a2c22df5da1" + integrity sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw== + +css.escape@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" + integrity sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s= + +css@^2.0.0, css@^2.2.3: + version "2.2.4" + resolved "https://registry.yarnpkg.com/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929" + integrity sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw== + dependencies: + inherits "^2.0.3" + source-map "^0.6.1" + source-map-resolve "^0.5.2" + urix "^0.1.0" + +cssdb@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-4.4.0.tgz#3bf2f2a68c10f5c6a08abd92378331ee803cddb0" + integrity sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ== + +cssesc@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-2.0.0.tgz#3b13bd1bb1cb36e1bcb5a4dcd27f54c5dcb35703" + integrity sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +cssnano-preset-default@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz#51ec662ccfca0f88b396dcd9679cdb931be17f76" + integrity sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA== + dependencies: + css-declaration-sorter "^4.0.1" + cssnano-util-raw-cache "^4.0.1" + postcss "^7.0.0" + postcss-calc "^7.0.1" + postcss-colormin "^4.0.3" + postcss-convert-values "^4.0.1" + postcss-discard-comments "^4.0.2" + postcss-discard-duplicates "^4.0.2" + postcss-discard-empty "^4.0.1" + postcss-discard-overridden "^4.0.1" + postcss-merge-longhand "^4.0.11" + postcss-merge-rules "^4.0.3" + postcss-minify-font-values "^4.0.2" + postcss-minify-gradients "^4.0.2" + postcss-minify-params "^4.0.2" + postcss-minify-selectors "^4.0.2" + postcss-normalize-charset "^4.0.1" + postcss-normalize-display-values "^4.0.2" + postcss-normalize-positions "^4.0.2" + postcss-normalize-repeat-style "^4.0.2" + postcss-normalize-string "^4.0.2" + postcss-normalize-timing-functions "^4.0.2" + postcss-normalize-unicode "^4.0.1" + postcss-normalize-url "^4.0.1" + postcss-normalize-whitespace "^4.0.2" + postcss-ordered-values "^4.1.2" + postcss-reduce-initial "^4.0.3" + postcss-reduce-transforms "^4.0.2" + postcss-svgo "^4.0.2" + postcss-unique-selectors "^4.0.1" + +cssnano-util-get-arguments@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f" + integrity sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8= + +cssnano-util-get-match@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d" + integrity sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0= + +cssnano-util-raw-cache@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282" + integrity sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA== + dependencies: + postcss "^7.0.0" + +cssnano-util-same-parent@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3" + integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q== + +cssnano@^4.1.10: + version "4.1.10" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.10.tgz#0ac41f0b13d13d465487e111b778d42da631b8b2" + integrity sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ== + dependencies: + cosmiconfig "^5.0.0" + cssnano-preset-default "^4.0.7" + is-resolvable "^1.0.0" + postcss "^7.0.0" + +csso@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/csso/-/csso-4.0.2.tgz#e5f81ab3a56b8eefb7f0092ce7279329f454de3d" + integrity sha512-kS7/oeNVXkHWxby5tHVxlhjizRCSv8QdU7hB2FpdAibDU8FjTAolhNjKNTiLzXtUrKT6HwClE81yXwEk1309wg== + dependencies: + css-tree "1.0.0-alpha.37" + +cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0", cssom@^0.3.4: + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +cssstyle@^1.0.0, cssstyle@^1.1.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.4.0.tgz#9d31328229d3c565c61e586b02041a28fccdccf1" + integrity sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA== + dependencies: + cssom "0.3.x" + +csstype@^2.2.0, csstype@^2.5.2, csstype@^2.6.5, csstype@^2.6.7: + version "2.6.11" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.11.tgz#452f4d024149ecf260a852b025e36562a253ffc5" + integrity sha512-l8YyEC9NBkSm783PFTvh0FmJy7s5pFKrDp49ZL7zBGX3fWkO+N4EEyan1qqp8cwPLDcD0OSdyY6hAMoxp34JFw== + +cyclist@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" + integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= + +d@1, d@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" + integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== + dependencies: + es5-ext "^0.10.50" + type "^1.0.1" + +damerau-levenshtein@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz#143c1641cb3d85c60c32329e26899adea8701791" + integrity sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug== + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + dependencies: + assert-plus "^1.0.0" + +data-urls@^1.0.0, data-urls@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" + integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ== + dependencies: + abab "^2.0.0" + whatwg-mimetype "^2.2.0" + whatwg-url "^7.0.0" + +date-fns@^1.29.0: + version "1.30.1" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c" + integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw== + +debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^3.0.0, debug@^3.1.1, debug@^3.2.5: + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + dependencies: + ms "^2.1.1" + +debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + +decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +deep-equal@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" + integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== + dependencies: + is-arguments "^1.0.4" + is-date-object "^1.0.1" + is-regex "^1.0.4" + object-is "^1.0.1" + object-keys "^1.1.1" + regexp.prototype.flags "^1.2.0" + +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + +default-gateway@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b" + integrity sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA== + dependencies: + execa "^1.0.0" + ip-regex "^2.1.0" + +define-properties@^1.1.2, define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +del@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" + integrity sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ== + dependencies: + "@types/glob" "^7.1.1" + globby "^6.1.0" + is-path-cwd "^2.0.0" + is-path-in-cwd "^2.0.0" + p-map "^2.0.0" + pify "^4.0.1" + rimraf "^2.6.3" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +des.js@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" + integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + +detect-newline@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" + integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I= + +detect-node@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" + integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw== + +detect-port-alt@1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/detect-port-alt/-/detect-port-alt-1.1.6.tgz#24707deabe932d4a3cf621302027c2b266568275" + integrity sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q== + dependencies: + address "^1.0.1" + debug "^2.6.0" + +diacritic@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/diacritic/-/diacritic-0.0.2.tgz#fc2a887b5a5bc0a0a854fb614c7c2f209061ee04" + integrity sha1-/CqIe1pbwKCoVPthTHwvIJBh7gQ= + +diff-sequences@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.9.0.tgz#5715d6244e2aa65f48bba0bc972db0b0b11e95b5" + integrity sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew== + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +dir-glob@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034" + integrity sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag== + dependencies: + arrify "^1.0.1" + path-type "^3.0.0" + +dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= + +dns-packet@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.1.tgz#12aa426981075be500b910eedcd0b47dd7deda5a" + integrity sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg== + dependencies: + ip "^1.1.0" + safe-buffer "^5.0.1" + +dns-txt@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" + integrity sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY= + dependencies: + buffer-indexof "^1.0.0" + +doctrine@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" + integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dom-accessibility-api@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.3.0.tgz#511e5993dd673b97c87ea47dba0e3892f7e0c983" + integrity sha512-PzwHEmsRP3IGY4gv/Ug+rMeaTIyTJvadCb+ujYXYeIylbHJezIyNToe8KfEgHTCEYyC+/bUghYOGg8yMGlZ6vA== + +dom-accessibility-api@^0.4.6: + version "0.4.6" + resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.4.6.tgz#f3f2af68aee01b1c862f37918d41841bb1aaf92a" + integrity sha512-qxFVFR/ymtfamEQT/AsYLe048sitxFCoCHiM+vuOdR3fE94i3so2SCFJxyz/RxV69PZ+9FgToYWOd7eqJqcbYw== + +dom-converter@^0.2: + version "0.2.0" + resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" + integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== + dependencies: + utila "~0.4" + +dom-helpers@^5.0.1: + version "5.1.4" + resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.1.4.tgz#4609680ab5c79a45f2531441f1949b79d6587f4b" + integrity sha512-TjMyeVUvNEnOnhzs6uAn9Ya47GmMo3qq7m+Lr/3ON0Rs5kHvb8I+SQYjLUSYn7qhEm0QjW0yrBkvz9yOrwwz1A== + dependencies: + "@babel/runtime" "^7.8.7" + csstype "^2.6.7" + +dom-serializer@0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" + integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== + dependencies: + domelementtype "^2.0.1" + entities "^2.0.0" + +dom-storage@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/dom-storage/-/dom-storage-2.1.0.tgz#00fb868bc9201357ea243c7bcfd3304c1e34ea39" + integrity sha512-g6RpyWXzl0RR6OTElHKBl7nwnK87GUyZMYC7JWsB/IA73vpqK2K6LT39x4VepLxlSsWBFrPVLnsSR5Jyty0+2Q== + +domain-browser@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== + +domelementtype@1, domelementtype@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" + integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== + +domelementtype@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d" + integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ== + +domexception@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" + integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug== + dependencies: + webidl-conversions "^4.0.2" + +domhandler@^2.3.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" + integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA== + dependencies: + domelementtype "1" + +domutils@1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" + integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8= + dependencies: + dom-serializer "0" + domelementtype "1" + +domutils@^1.5.1, domutils@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" + integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== + dependencies: + dom-serializer "0" + domelementtype "1" + +dot-case@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.3.tgz#21d3b52efaaba2ea5fda875bb1aa8124521cf4aa" + integrity sha512-7hwEmg6RiSQfm/GwPL4AAWXKy3YNNZA3oFv2Pdiey0mwkRCPZ9x6SZbkLcn8Ma5PYeVokzoD4Twv2n7LKp5WeA== + dependencies: + no-case "^3.0.3" + tslib "^1.10.0" + +dot-prop@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.2.0.tgz#c34ecc29556dc45f1f4c22697b6f4904e0cc4fcb" + integrity sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A== + dependencies: + is-obj "^2.0.0" + +dotenv-expand@5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0" + integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== + +dotenv@8.2.0, dotenv@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" + integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== + +downshift@3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/downshift/-/downshift-3.2.7.tgz#0c40d78d1cbc24753c7a622cfc664df1c9480b4a" + integrity sha512-mbUO9ZFhMGtksIeVWRFFjNOPN237VsUqZSEYi0VS0Wj38XNLzpgOBTUcUjdjFeB8KVgmrcRa6GGFkTbACpG6FA== + dependencies: + "@babel/runtime" "^7.1.2" + compute-scroll-into-view "^1.0.9" + prop-types "^15.6.0" + react-is "^16.5.2" + +duplexer@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" + integrity sha1-rOb/gIwc5mtX0ev5eXessCM0z8E= + +duplexify@^3.4.2, duplexify@^3.6.0: + version "3.7.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + +electron-to-chromium@^1.3.378: + version "1.3.379" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.379.tgz#81dc5e82a3e72bbb830d93e15bc35eda2bbc910e" + integrity sha512-NK9DBBYEBb5f9D7zXI0hiE941gq3wkBeQmXs1ingigA/jnTg5mhwY2Z5egwA+ZI8OLGKCx0h1Cl8/xeuIBuLlg== + +elliptic@^6.0.0: + version "6.5.2" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz#05c5678d7173c049d8ca433552224a495d0e3762" + integrity sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw== + dependencies: + bn.js "^4.4.0" + brorand "^1.0.1" + hash.js "^1.0.0" + hmac-drbg "^1.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.0" + +emoji-regex@^7.0.1, emoji-regex@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emojis-list@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +encoding@^0.1.11: + version "0.1.13" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== + dependencies: + iconv-lite "^0.6.2" + +end-of-stream@^1.0.0, end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +enhanced-resolve@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz#2937e2b8066cd0fe7ce0990a98f0d71a35189f66" + integrity sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.5.0" + tapable "^1.0.0" + +entities@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" + integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== + +entities@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.0.tgz#68d6084cab1b079767540d80e56a39b423e4abf4" + integrity sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw== + +errno@^0.1.3, errno@~0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" + integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== + dependencies: + prr "~1.0.1" + +error-ex@^1.2.0, error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.2: + version "1.17.4" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.4.tgz#e3aedf19706b20e7c2594c35fc0d57605a79e184" + integrity sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ== + dependencies: + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.1.5" + is-regex "^1.0.5" + object-inspect "^1.7.0" + object-keys "^1.1.1" + object.assign "^4.1.0" + string.prototype.trimleft "^2.1.1" + string.prototype.trimright "^2.1.1" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +es5-ext@^0.10.35, es5-ext@^0.10.50: + version "0.10.53" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1" + integrity sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q== + dependencies: + es6-iterator "~2.0.3" + es6-symbol "~3.1.3" + next-tick "~1.0.0" + +es6-iterator@2.0.3, es6-iterator@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + +es6-symbol@^3.1.1, es6-symbol@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" + integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== + dependencies: + d "^1.0.1" + ext "^1.1.2" + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + +escape-string-regexp@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +escodegen@^1.11.0, escodegen@^1.9.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.1.tgz#ba01d0c8278b5e95a9a45350142026659027a457" + integrity sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ== + dependencies: + esprima "^4.0.1" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +eslint-config-react-app@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/eslint-config-react-app/-/eslint-config-react-app-5.2.1.tgz#698bf7aeee27f0cea0139eaef261c7bf7dd623df" + integrity sha512-pGIZ8t0mFLcV+6ZirRgYK6RVqUIKRIi9MmgzUEmrIknsn3AdO0I32asO86dJgloHq+9ZPl8UIg8mYrvgP5u2wQ== + dependencies: + confusing-browser-globals "^1.0.9" + +eslint-import-resolver-node@^0.3.2: + version "0.3.3" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz#dbaa52b6b2816b50bc6711af75422de808e98404" + integrity sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg== + dependencies: + debug "^2.6.9" + resolve "^1.13.1" + +eslint-loader@3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/eslint-loader/-/eslint-loader-3.0.3.tgz#e018e3d2722381d982b1201adb56819c73b480ca" + integrity sha512-+YRqB95PnNvxNp1HEjQmvf9KNvCin5HXYYseOXVC2U0KEcw4IkQ2IQEBG46j7+gW39bMzeu0GsUhVbBY3Votpw== + dependencies: + fs-extra "^8.1.0" + loader-fs-cache "^1.0.2" + loader-utils "^1.2.3" + object-hash "^2.0.1" + schema-utils "^2.6.1" + +eslint-module-utils@^2.4.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.5.2.tgz#7878f7504824e1b857dd2505b59a8e5eda26a708" + integrity sha512-LGScZ/JSlqGKiT8OC+cYRxseMjyqt6QO54nl281CK93unD89ijSeRV6An8Ci/2nvWVKe8K/Tqdm75RQoIOCr+Q== + dependencies: + debug "^2.6.9" + pkg-dir "^2.0.0" + +eslint-plugin-flowtype@4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-4.6.0.tgz#82b2bd6f21770e0e5deede0228e456cb35308451" + integrity sha512-W5hLjpFfZyZsXfo5anlu7HM970JBDqbEshAJUkeczP6BFCIfJXuiIBQXyberLRtOStT0OGPF8efeTbxlHk4LpQ== + dependencies: + lodash "^4.17.15" + +eslint-plugin-import@2.20.1: + version "2.20.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.20.1.tgz#802423196dcb11d9ce8435a5fc02a6d3b46939b3" + integrity sha512-qQHgFOTjguR+LnYRoToeZWT62XM55MBVXObHM6SKFd1VzDcX/vqT1kAz8ssqigh5eMj8qXcRoXXGZpPP6RfdCw== + dependencies: + array-includes "^3.0.3" + array.prototype.flat "^1.2.1" + contains-path "^0.1.0" + debug "^2.6.9" + doctrine "1.5.0" + eslint-import-resolver-node "^0.3.2" + eslint-module-utils "^2.4.1" + has "^1.0.3" + minimatch "^3.0.4" + object.values "^1.1.0" + read-pkg-up "^2.0.0" + resolve "^1.12.0" + +eslint-plugin-jsx-a11y@6.2.3: + version "6.2.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.3.tgz#b872a09d5de51af70a97db1eea7dc933043708aa" + integrity sha512-CawzfGt9w83tyuVekn0GDPU9ytYtxyxyFZ3aSWROmnRRFQFT2BiPJd7jvRdzNDi6oLWaS2asMeYSNMjWTV4eNg== + dependencies: + "@babel/runtime" "^7.4.5" + aria-query "^3.0.0" + array-includes "^3.0.3" + ast-types-flow "^0.0.7" + axobject-query "^2.0.2" + damerau-levenshtein "^1.0.4" + emoji-regex "^7.0.2" + has "^1.0.3" + jsx-ast-utils "^2.2.1" + +eslint-plugin-react-hooks@^1.6.1: + version "1.7.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.7.0.tgz#6210b6d5a37205f0b92858f895a4e827020a7d04" + integrity sha512-iXTCFcOmlWvw4+TOE8CLWj6yX1GwzT0Y6cUfHHZqWnSk144VmVIRcVGtUAzrLES7C798lmvnt02C7rxaOX1HNA== + +eslint-plugin-react@7.19.0: + version "7.19.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.19.0.tgz#6d08f9673628aa69c5559d33489e855d83551666" + integrity sha512-SPT8j72CGuAP+JFbT0sJHOB80TX/pu44gQ4vXH/cq+hQTiY2PuZ6IHkqXJV6x1b28GDdo1lbInjKUrrdUf0LOQ== + dependencies: + array-includes "^3.1.1" + doctrine "^2.1.0" + has "^1.0.3" + jsx-ast-utils "^2.2.3" + object.entries "^1.1.1" + object.fromentries "^2.0.2" + object.values "^1.1.1" + prop-types "^15.7.2" + resolve "^1.15.1" + semver "^6.3.0" + string.prototype.matchall "^4.0.2" + xregexp "^4.3.0" + +eslint-scope@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" + integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-scope@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9" + integrity sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-utils@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" + integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" + integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== + +eslint@^6.6.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb" + integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig== + dependencies: + "@babel/code-frame" "^7.0.0" + ajv "^6.10.0" + chalk "^2.1.0" + cross-spawn "^6.0.5" + debug "^4.0.1" + doctrine "^3.0.0" + eslint-scope "^5.0.0" + eslint-utils "^1.4.3" + eslint-visitor-keys "^1.1.0" + espree "^6.1.2" + esquery "^1.0.1" + esutils "^2.0.2" + file-entry-cache "^5.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^5.0.0" + globals "^12.1.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + inquirer "^7.0.0" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.3.0" + lodash "^4.17.14" + minimatch "^3.0.4" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + optionator "^0.8.3" + progress "^2.0.0" + regexpp "^2.0.1" + semver "^6.1.2" + strip-ansi "^5.2.0" + strip-json-comments "^3.0.1" + table "^5.2.3" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +espree@^6.1.2: + version "6.2.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a" + integrity sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw== + dependencies: + acorn "^7.1.1" + acorn-jsx "^5.2.0" + eslint-visitor-keys "^1.1.0" + +esprima@^4.0.0, esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.1.0.tgz#c5c0b66f383e7656404f86b31334d72524eddb48" + integrity sha512-MxYW9xKmROWF672KqjO75sszsA8Mxhw06YFeS5VHlB98KDHbOSurm3ArsjO60Eaf3QmGMCP1yn+0JQkNLo/97Q== + dependencies: + estraverse "^4.0.0" + +esrecurse@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" + integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== + dependencies: + estraverse "^4.1.0" + +estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +eventemitter3@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7" + integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q== + +eventemitter3@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.0.tgz#d65176163887ee59f386d64c82610b696a4a74eb" + integrity sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg== + +events@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.1.0.tgz#84279af1b34cb75aa88bf5ff291f6d0bd9b31a59" + integrity sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg== + +eventsource@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.0.7.tgz#8fbc72c93fcd34088090bc0a4e64f4b5cee6d8d0" + integrity sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ== + dependencies: + original "^1.0.0" + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +exec-sh@^0.3.2: + version "0.3.4" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.4.tgz#3a018ceb526cc6f6df2bb504b2bfe8e3a4934ec5" + integrity sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A== + +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expect@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-24.9.0.tgz#b75165b4817074fa4a157794f46fe9f1ba15b6ca" + integrity sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q== + dependencies: + "@jest/types" "^24.9.0" + ansi-styles "^3.2.0" + jest-get-type "^24.9.0" + jest-matcher-utils "^24.9.0" + jest-message-util "^24.9.0" + jest-regex-util "^24.9.0" + +express@^4.17.1: + version "4.17.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" + integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== + dependencies: + accepts "~1.3.7" + array-flatten "1.1.1" + body-parser "1.19.0" + content-disposition "0.5.3" + content-type "~1.0.4" + cookie "0.4.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "~1.1.2" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.5" + qs "6.7.0" + range-parser "~1.2.1" + safe-buffer "5.1.2" + send "0.17.1" + serve-static "1.14.1" + setprototypeof "1.1.1" + statuses "~1.5.0" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +ext@^1.1.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ext/-/ext-1.4.0.tgz#89ae7a07158f79d35517882904324077e4379244" + integrity sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A== + dependencies: + type "^2.0.0" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + +fast-deep-equal@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4" + integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA== + +fast-glob@^2.0.2: + version "2.2.7" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" + integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw== + dependencies: + "@mrmlnc/readdir-enhanced" "^2.2.1" + "@nodelib/fs.stat" "^1.1.2" + glob-parent "^3.1.0" + is-glob "^4.0.0" + merge2 "^1.2.3" + micromatch "^3.1.10" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +faye-websocket@0.11.3, faye-websocket@~0.11.1: + version "0.11.3" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.3.tgz#5c0e9a8968e8912c286639fde977a8b209f2508e" + integrity sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA== + dependencies: + websocket-driver ">=0.5.1" + +faye-websocket@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" + integrity sha1-TkkvjQTftviQA1B/btvy1QHnxvQ= + dependencies: + websocket-driver ">=0.5.1" + +fb-watchman@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" + integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== + dependencies: + bser "2.1.1" + +fbjs@^0.8.1: + version "0.8.17" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd" + integrity sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90= + dependencies: + core-js "^1.0.0" + isomorphic-fetch "^2.1.1" + loose-envify "^1.0.0" + object-assign "^4.1.0" + promise "^7.1.1" + setimmediate "^1.0.5" + ua-parser-js "^0.7.18" + +figgy-pudding@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" + integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w== + +figures@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" + integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== + dependencies: + flat-cache "^2.0.1" + +file-loader@4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-4.3.0.tgz#780f040f729b3d18019f20605f723e844b8a58af" + integrity sha512-aKrYPYjF1yG3oX0kWRrqrSMfgftm7oJW5M+m4owoldH5C51C0RkIwB++JbRvEW3IU6/ZG5n8UvEcdgwOt2UOWA== + dependencies: + loader-utils "^1.2.3" + schema-utils "^2.5.0" + +file-selector@^0.1.12: + version "0.1.12" + resolved "https://registry.yarnpkg.com/file-selector/-/file-selector-0.1.12.tgz#fe726547be219a787a9dcc640575a04a032b1fd0" + integrity sha512-Kx7RTzxyQipHuiqyZGf+Nz4vY9R1XGxuQl/hLoJwq+J4avk/9wxxgZyHKtbyIPJmbD4A66DWGYfyykWNpcYutQ== + dependencies: + tslib "^1.9.0" + +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + +filesize@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.0.1.tgz#f850b509909c7c86f7e450ea19006c31c2ed3d2f" + integrity sha512-u4AYWPgbI5GBhs6id1KdImZWn5yfyFrrQ8OWZdN7ZMfA8Bf4HcO0BGo9bmUIEV8yrp8I1xVfJ/dn90GtFNNJcg== + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +final-form-arrays@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/final-form-arrays/-/final-form-arrays-3.0.2.tgz#9f3bef778dec61432357744eb6f3abef7e7f3847" + integrity sha512-TfO8aZNz3RrsZCDx8GHMQcyztDNpGxSSi9w4wpSNKlmv2PfFWVVM8P7Yj5tj4n0OWax+x5YwTLhT5BnqSlCi+w== + +final-form@^4.18.5: + version "4.20.1" + resolved "https://registry.yarnpkg.com/final-form/-/final-form-4.20.1.tgz#525a7f7f27f55c28d8994b157b24d6104fc560e9" + integrity sha512-IIsOK3JRxJrN72OBj7vFWZxtGt3xc1bYwJVPchjVWmDol9DlzMSAOPB+vwe75TUYsw1JaH0fTQnIgwSQZQ9Acg== + dependencies: + "@babel/runtime" "^7.10.0" + +finalhandler@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + +find-cache-dir@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9" + integrity sha1-yN765XyKUqinhPnjHFfHQumToLk= + dependencies: + commondir "^1.0.1" + mkdirp "^0.5.1" + pkg-dir "^1.0.0" + +find-cache-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + +find-cache-dir@^3.2.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880" + integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-up@4.1.0, find-up@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +find-up@^2.0.0, find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + dependencies: + locate-path "^2.0.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +firebase@^7.17.0: + version "7.17.0" + resolved "https://registry.yarnpkg.com/firebase/-/firebase-7.17.0.tgz#85dcd7c85d6dbcba7740dd5920a7f56bf8177e12" + integrity sha512-+y7c1pCj8xp98CIDhVjg0rKhGtsFskGB8hyhjsyp549Upwa0cropdK5emCFTmMIbvDjZmP8rTuuDXPBeREAaCg== + dependencies: + "@firebase/analytics" "0.4.0" + "@firebase/app" "0.6.8" + "@firebase/app-types" "0.6.1" + "@firebase/auth" "0.14.9" + "@firebase/database" "0.6.8" + "@firebase/firestore" "1.16.1" + "@firebase/functions" "0.4.48" + "@firebase/installations" "0.4.14" + "@firebase/messaging" "0.6.20" + "@firebase/performance" "0.3.9" + "@firebase/polyfill" "0.3.36" + "@firebase/remote-config" "0.1.25" + "@firebase/storage" "0.3.40" + "@firebase/util" "0.2.50" + +flat-cache@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" + integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== + dependencies: + flatted "^2.0.0" + rimraf "2.6.3" + write "1.0.3" + +flatted@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08" + integrity sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg== + +flatten@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b" + integrity sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg== + +flush-write-stream@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" + integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== + dependencies: + inherits "^2.0.3" + readable-stream "^2.3.6" + +follow-redirects@^1.0.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.10.0.tgz#01f5263aee921c6a54fb91667f08f4155ce169eb" + integrity sha512-4eyLK6s6lH32nOvLLwlIOnr9zrL8Sm+OvW4pVTJNoXeGzYIkHVf+pADQi+OJ0E67hiuSLezPVPyBcIZO50TmmQ== + dependencies: + debug "^3.0.0" + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +for-in@^0.1.3: + version "0.1.8" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1" + integrity sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE= + +for-in@^1.0.1, for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +for-own@^0.1.3: + version "0.1.5" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= + dependencies: + for-in "^1.0.1" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + +fork-ts-checker-webpack-plugin@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-3.1.1.tgz#a1642c0d3e65f50c2cc1742e9c0a80f441f86b19" + integrity sha512-DuVkPNrM12jR41KM2e+N+styka0EgLkTnXmNcXdgOM37vtGeY+oCBK/Jx0hzSeEU6memFCtWb4htrHPMDfwwUQ== + dependencies: + babel-code-frame "^6.22.0" + chalk "^2.4.1" + chokidar "^3.3.0" + micromatch "^3.1.10" + minimatch "^3.0.4" + semver "^5.6.0" + tapable "^1.0.0" + worker-rpc "^0.1.0" + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +forwarded@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" + integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + +from2@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + +fs-extra@^4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" + integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + +fs-write-stream-atomic@^1.0.8: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= + dependencies: + graceful-fs "^4.1.2" + iferr "^0.1.5" + imurmurhash "^0.1.4" + readable-stream "1 || 2" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@2.1.2, fsevents@~2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805" + integrity sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA== + +fsevents@^1.2.7: + version "1.2.12" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.12.tgz#db7e0d8ec3b0b45724fd4d83d43554a8f1f0de5c" + integrity sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q== + dependencies: + bindings "^1.5.0" + nan "^2.12.1" + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + +gensync@^1.0.0-beta.1: + version "1.0.0-beta.1" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" + integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== + +get-caller-file@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" + integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== + +get-caller-file@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-own-enumerable-property-symbols@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" + integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== + +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + dependencies: + assert-plus "^1.0.0" + +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob-parent@^5.0.0, glob-parent@~5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2" + integrity sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw== + dependencies: + is-glob "^4.0.1" + +glob-to-regexp@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" + integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= + +glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global-modules@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" + integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== + dependencies: + global-prefix "^3.0.0" + +global-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" + integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== + dependencies: + ini "^1.3.5" + kind-of "^6.0.2" + which "^1.3.1" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^12.1.0: + version "12.4.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" + integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== + dependencies: + type-fest "^0.8.1" + +globby@8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-8.0.2.tgz#5697619ccd95c5275dbb2d6faa42087c1a941d8d" + integrity sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w== + dependencies: + array-union "^1.0.1" + dir-glob "2.0.0" + fast-glob "^2.0.2" + glob "^7.1.2" + ignore "^3.3.5" + pify "^3.0.0" + slash "^1.0.0" + +globby@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" + integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= + dependencies: + array-union "^1.0.1" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2: + version "4.2.3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" + integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== + +graphql-ast-types-browser@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/graphql-ast-types-browser/-/graphql-ast-types-browser-1.0.2.tgz#474305af7e76f9692df6e50a88fb668ce258c4a4" + integrity sha512-QuKZ+Et3dE7SyO5c41eNPlJc7+HwQxOzHfmIhqzj4cUgAGyhSwVkKb7K24zom8y6y0VnG7Xb3RRypjIVvfIevQ== + +graphql-tag@^2.10.1, graphql-tag@^2.10.4, graphql-tag@^2.4.2: + version "2.10.4" + resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.10.4.tgz#2f301a98219be8b178a6453bb7e33b79b66d8f83" + integrity sha512-O7vG5BT3w6Sotc26ybcvLKNTdfr4GfsIVMD+LdYqXCeJIYPRyp8BIsDOUtxw7S1PYvRw5vH3278J2EDezR6mfA== + +graphql@^15.3.0: + version "15.3.0" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.3.0.tgz#3ad2b0caab0d110e3be4a5a9b2aa281e362b5278" + integrity sha512-GTCJtzJmkFLWRfFJuoo9RWWa/FfamUHgiFosxi/X1Ani4AVWbeyBenZTNX6dM+7WSbbFfTo/25eh0LLkwHMw2w== + +growly@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= + +gzip-size@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274" + integrity sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA== + dependencies: + duplexer "^0.1.1" + pify "^4.0.1" + +handle-thing@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.0.tgz#0e039695ff50c93fc288557d696f3c1dc6776754" + integrity sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ== + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + +har-validator@~5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" + integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== + dependencies: + ajv "^6.5.5" + har-schema "^2.0.0" + +harmony-reflect@^1.4.6: + version "1.6.1" + resolved "https://registry.yarnpkg.com/harmony-reflect/-/harmony-reflect-1.6.1.tgz#c108d4f2bb451efef7a37861fdbdae72c9bdefa9" + integrity sha512-WJTeyp0JzGtHcuMsi7rw2VwtkvLa+JyfEKJCFyfcS0+CDkjQ5lHPu7zEhFZP+PDSRrEgXa5Ah0l1MbgbE41XjA== + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + dependencies: + ansi-regex "^2.0.0" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-symbols@^1.0.0, has-symbols@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" + integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.0, has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hash-base@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" + integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg= + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +he@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +hex-color-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" + integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== + +history@^4.9.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3" + integrity sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew== + dependencies: + "@babel/runtime" "^7.1.2" + loose-envify "^1.2.0" + resolve-pathname "^3.0.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + value-equal "^1.0.1" + +hmac-drbg@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +hoist-non-react-statics@^2.3.1: + version "2.5.5" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz#c5903cf409c0dfd908f388e619d86b9c1174cb47" + integrity sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw== + +hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" + +hosted-git-info@^2.1.4: + version "2.8.8" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" + integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI= + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +hsl-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e" + integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4= + +hsla-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" + integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= + +html-comment-regex@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7" + integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ== + +html-encoding-sniffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" + integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw== + dependencies: + whatwg-encoding "^1.0.1" + +html-entities@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" + integrity sha1-DfKTUfByEWNRXfueVUPl9u7VFi8= + +html-escaper@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.0.tgz#71e87f931de3fe09e56661ab9a29aadec707b491" + integrity sha512-a4u9BeERWGu/S8JiWEAQcdrg9v4QArtP9keViQjGMdff20fBdd8waotXaNmODqBe6uZ3Nafi7K/ho4gCQHV3Ig== + +html-minifier-terser@^5.0.1: + version "5.0.4" + resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-5.0.4.tgz#e8cc02748acb983bd7912ea9660bd31c0702ec32" + integrity sha512-fHwmKQ+GzhlqdxEtwrqLT7MSuheiA+rif5/dZgbz3GjoMXJzcRzy1L9NXoiiyxrnap+q5guSiv8Tz5lrh9g42g== + dependencies: + camel-case "^4.1.1" + clean-css "^4.2.3" + commander "^4.1.1" + he "^1.2.0" + param-case "^3.0.3" + relateurl "^0.2.7" + terser "^4.6.3" + +html-webpack-plugin@4.0.0-beta.11: + version "4.0.0-beta.11" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.0.0-beta.11.tgz#3059a69144b5aecef97708196ca32f9e68677715" + integrity sha512-4Xzepf0qWxf8CGg7/WQM5qBB2Lc/NFI7MhU59eUDTkuQp3skZczH4UA1d6oQyDEIoMDgERVhRyTdtUPZ5s5HBg== + dependencies: + html-minifier-terser "^5.0.1" + loader-utils "^1.2.3" + lodash "^4.17.15" + pretty-error "^2.1.1" + tapable "^1.1.3" + util.promisify "1.0.0" + +htmlparser2@^3.3.0: + version "3.10.1" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" + integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== + dependencies: + domelementtype "^1.3.1" + domhandler "^2.3.0" + domutils "^1.5.1" + entities "^1.1.1" + inherits "^2.0.1" + readable-stream "^3.1.1" + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= + +http-errors@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" + integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-errors@~1.7.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +"http-parser-js@>=0.4.0 <0.4.11": + version "0.4.10" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.10.tgz#92c9c1374c35085f75db359ec56cc257cbb93fa4" + integrity sha1-ksnBN0w1CF912zWexWzCV8u5P6Q= + +http-proxy-middleware@0.19.1: + version "0.19.1" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a" + integrity sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q== + dependencies: + http-proxy "^1.17.0" + is-glob "^4.0.0" + lodash "^4.17.11" + micromatch "^3.1.10" + +http-proxy@^1.17.0: + version "1.18.0" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.0.tgz#dbe55f63e75a347db7f3d99974f2692a314a6a3a" + integrity sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= + +hyphenate-style-name@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz#691879af8e220aea5750e8827db4ef62a54e361d" + integrity sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ== + +iconv-lite@0.4.24, iconv-lite@^0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.2.tgz#ce13d1875b0c3a674bd6a04b7f76b01b1b6ded01" + integrity sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +icss-utils@^4.0.0, icss-utils@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467" + integrity sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA== + dependencies: + postcss "^7.0.14" + +idb@3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/idb/-/idb-3.0.2.tgz#c8e9122d5ddd40f13b60ae665e4862f8b13fa384" + integrity sha512-+FLa/0sTXqyux0o6C+i2lOR0VoS60LU/jzUo5xjfY6+7sEEgy4Gz1O7yFBXvjd7N0NyIGWIRg8DcQSLEG+VSPw== + +identity-obj-proxy@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz#94d2bda96084453ef36fbc5aaec37e0f79f1fc14" + integrity sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ= + dependencies: + harmony-reflect "^1.4.6" + +ieee754@^1.1.4: + version "1.1.13" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" + integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== + +iferr@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= + +ignore@^3.3.5: + version "3.3.10" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" + integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== + +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +immer@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/immer/-/immer-1.10.0.tgz#bad67605ba9c810275d91e1c2a47d4582e98286d" + integrity sha512-O3sR1/opvCDGLEVcvrGTMtLac8GJ5IwZC4puPrLuRj3l7ICKvkmA0vGuU9OW8mV9WIBRnaxp5GJh9IEAaNOoYg== + +import-cwd@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9" + integrity sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk= + dependencies: + import-from "^2.1.0" + +import-fresh@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" + integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= + dependencies: + caller-path "^2.0.0" + resolve-from "^3.0.0" + +import-fresh@^3.0.0, import-fresh@^3.1.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" + integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-from@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1" + integrity sha1-M1238qev/VOqpHHUuAId7ja387E= + dependencies: + resolve-from "^3.0.0" + +import-local@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" + integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== + dependencies: + pkg-dir "^3.0.0" + resolve-cwd "^2.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +indexes-of@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= + +infer-owner@^1.0.3, infer-owner@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== + +inflection@~1.12.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/inflection/-/inflection-1.12.0.tgz#a200935656d6f5f6bc4dc7502e1aecb703228416" + integrity sha1-ogCTVlbW9fa8TcdQLhrstwMihBY= + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +ini@^1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== + +inquirer@7.0.4: + version "7.0.4" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.4.tgz#99af5bde47153abca23f5c7fc30db247f39da703" + integrity sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ== + dependencies: + ansi-escapes "^4.2.1" + chalk "^2.4.2" + cli-cursor "^3.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.15" + mute-stream "0.0.8" + run-async "^2.2.0" + rxjs "^6.5.3" + string-width "^4.1.0" + strip-ansi "^5.1.0" + through "^2.3.6" + +inquirer@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.1.0.tgz#1298a01859883e17c7264b82870ae1034f92dd29" + integrity sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg== + dependencies: + ansi-escapes "^4.2.1" + chalk "^3.0.0" + cli-cursor "^3.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.15" + mute-stream "0.0.8" + run-async "^2.4.0" + rxjs "^6.5.3" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + +internal-ip@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" + integrity sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg== + dependencies: + default-gateway "^4.2.0" + ipaddr.js "^1.9.0" + +internal-slot@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.2.tgz#9c2e9fb3cd8e5e4256c6f45fe310067fcfa378a3" + integrity sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g== + dependencies: + es-abstract "^1.17.0-next.1" + has "^1.0.3" + side-channel "^1.0.2" + +invariant@^2.2.2, invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +invert-kv@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" + integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== + +ip-regex@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" + integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= + +ip@^1.1.0, ip@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= + +ipaddr.js@1.9.1, ipaddr.js@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +is-absolute-url@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" + integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= + +is-absolute-url@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" + integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q== + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-arguments@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3" + integrity sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA== + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + dependencies: + binary-extensions "^1.0.0" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-buffer@^1.0.2, is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-callable@^1.1.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.0.tgz#83336560b54a38e35e3a2df7afd0454d691468bb" + integrity sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw== + +is-callable@^1.1.4, is-callable@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" + integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q== + +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + +is-color-stop@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" + integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U= + dependencies: + css-color-names "^0.0.4" + hex-color-regex "^1.1.0" + hsl-regex "^1.0.0" + hsla-regex "^1.0.0" + rgb-regex "^1.0.1" + rgba-regex "^1.0.0" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" + integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-directory@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" + integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= + +is-docker@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.0.0.tgz#2cb0df0e75e2d064fe1864c37cdeacb7b2dcf25b" + integrity sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ== + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-in-browser@^1.0.2, is-in-browser@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/is-in-browser/-/is-in-browser-1.1.3.tgz#56ff4db683a078c6082eb95dad7dc62e1d04f835" + integrity sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU= + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= + +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + +is-path-cwd@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" + integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== + +is-path-in-cwd@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz#bfe2dca26c69f397265a4009963602935a053acb" + integrity sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ== + dependencies: + is-path-inside "^2.1.0" + +is-path-inside@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-2.1.0.tgz#7c9810587d659a40d27bcdb4d5616eab059494b2" + integrity sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg== + dependencies: + path-is-inside "^1.0.2" + +is-plain-obj@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= + +is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= + +is-regex@^1.0.4, is-regex@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" + integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== + dependencies: + has "^1.0.3" + +is-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" + integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= + +is-resolvable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== + +is-root@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" + integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== + +is-stream@^1.0.1, is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-string@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" + integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== + +is-svg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75" + integrity sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ== + dependencies: + html-comment-regex "^1.1.0" + +is-symbol@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" + integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== + dependencies: + has-symbols "^1.0.1" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + +is-wsl@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.1.1.tgz#4a1c152d429df3d441669498e2486d3596ebaf1d" + integrity sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog== + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +isomorphic-fetch@2.2.1, isomorphic-fetch@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" + integrity sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk= + dependencies: + node-fetch "^1.0.1" + whatwg-fetch ">=0.10.0" + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + +istanbul-lib-coverage@^2.0.2, istanbul-lib-coverage@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#675f0ab69503fad4b1d849f736baaca803344f49" + integrity sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA== + +istanbul-lib-instrument@^3.0.1, istanbul-lib-instrument@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz#a5f63d91f0bbc0c3e479ef4c5de027335ec6d630" + integrity sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA== + dependencies: + "@babel/generator" "^7.4.0" + "@babel/parser" "^7.4.3" + "@babel/template" "^7.4.0" + "@babel/traverse" "^7.4.3" + "@babel/types" "^7.4.0" + istanbul-lib-coverage "^2.0.5" + semver "^6.0.0" + +istanbul-lib-report@^2.0.4: + version "2.0.8" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz#5a8113cd746d43c4889eba36ab10e7d50c9b4f33" + integrity sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ== + dependencies: + istanbul-lib-coverage "^2.0.5" + make-dir "^2.1.0" + supports-color "^6.1.0" + +istanbul-lib-source-maps@^3.0.1: + version "3.0.6" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz#284997c48211752ec486253da97e3879defba8c8" + integrity sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^2.0.5" + make-dir "^2.1.0" + rimraf "^2.6.3" + source-map "^0.6.1" + +istanbul-reports@^2.2.6: + version "2.2.7" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.2.7.tgz#5d939f6237d7b48393cc0959eab40cd4fd056931" + integrity sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg== + dependencies: + html-escaper "^2.0.0" + +jest-changed-files@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-24.9.0.tgz#08d8c15eb79a7fa3fc98269bc14b451ee82f8039" + integrity sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg== + dependencies: + "@jest/types" "^24.9.0" + execa "^1.0.0" + throat "^4.0.0" + +jest-cli@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-24.9.0.tgz#ad2de62d07472d419c6abc301fc432b98b10d2af" + integrity sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg== + dependencies: + "@jest/core" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + chalk "^2.0.1" + exit "^0.1.2" + import-local "^2.0.0" + is-ci "^2.0.0" + jest-config "^24.9.0" + jest-util "^24.9.0" + jest-validate "^24.9.0" + prompts "^2.0.1" + realpath-native "^1.1.0" + yargs "^13.3.0" + +jest-config@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-24.9.0.tgz#fb1bbc60c73a46af03590719efa4825e6e4dd1b5" + integrity sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ== + dependencies: + "@babel/core" "^7.1.0" + "@jest/test-sequencer" "^24.9.0" + "@jest/types" "^24.9.0" + babel-jest "^24.9.0" + chalk "^2.0.1" + glob "^7.1.1" + jest-environment-jsdom "^24.9.0" + jest-environment-node "^24.9.0" + jest-get-type "^24.9.0" + jest-jasmine2 "^24.9.0" + jest-regex-util "^24.3.0" + jest-resolve "^24.9.0" + jest-util "^24.9.0" + jest-validate "^24.9.0" + micromatch "^3.1.10" + pretty-format "^24.9.0" + realpath-native "^1.1.0" + +jest-diff@^24.0.0, jest-diff@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-24.9.0.tgz#931b7d0d5778a1baf7452cb816e325e3724055da" + integrity sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ== + dependencies: + chalk "^2.0.1" + diff-sequences "^24.9.0" + jest-get-type "^24.9.0" + pretty-format "^24.9.0" + +jest-docblock@^24.3.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-24.9.0.tgz#7970201802ba560e1c4092cc25cbedf5af5a8ce2" + integrity sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA== + dependencies: + detect-newline "^2.1.0" + +jest-each@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-24.9.0.tgz#eb2da602e2a610898dbc5f1f6df3ba86b55f8b05" + integrity sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog== + dependencies: + "@jest/types" "^24.9.0" + chalk "^2.0.1" + jest-get-type "^24.9.0" + jest-util "^24.9.0" + pretty-format "^24.9.0" + +jest-environment-jsdom-fourteen@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom-fourteen/-/jest-environment-jsdom-fourteen-1.0.1.tgz#4cd0042f58b4ab666950d96532ecb2fc188f96fb" + integrity sha512-DojMX1sY+at5Ep+O9yME34CdidZnO3/zfPh8UW+918C5fIZET5vCjfkegixmsi7AtdYfkr4bPlIzmWnlvQkP7Q== + dependencies: + "@jest/environment" "^24.3.0" + "@jest/fake-timers" "^24.3.0" + "@jest/types" "^24.3.0" + jest-mock "^24.0.0" + jest-util "^24.0.0" + jsdom "^14.1.0" + +jest-environment-jsdom@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz#4b0806c7fc94f95edb369a69cc2778eec2b7375b" + integrity sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA== + dependencies: + "@jest/environment" "^24.9.0" + "@jest/fake-timers" "^24.9.0" + "@jest/types" "^24.9.0" + jest-mock "^24.9.0" + jest-util "^24.9.0" + jsdom "^11.5.1" + +jest-environment-node@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-24.9.0.tgz#333d2d2796f9687f2aeebf0742b519f33c1cbfd3" + integrity sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA== + dependencies: + "@jest/environment" "^24.9.0" + "@jest/fake-timers" "^24.9.0" + "@jest/types" "^24.9.0" + jest-mock "^24.9.0" + jest-util "^24.9.0" + +jest-get-type@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.9.0.tgz#1684a0c8a50f2e4901b6644ae861f579eed2ef0e" + integrity sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q== + +jest-haste-map@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-24.9.0.tgz#b38a5d64274934e21fa417ae9a9fbeb77ceaac7d" + integrity sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ== + dependencies: + "@jest/types" "^24.9.0" + anymatch "^2.0.0" + fb-watchman "^2.0.0" + graceful-fs "^4.1.15" + invariant "^2.2.4" + jest-serializer "^24.9.0" + jest-util "^24.9.0" + jest-worker "^24.9.0" + micromatch "^3.1.10" + sane "^4.0.3" + walker "^1.0.7" + optionalDependencies: + fsevents "^1.2.7" + +jest-jasmine2@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz#1f7b1bd3242c1774e62acabb3646d96afc3be6a0" + integrity sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw== + dependencies: + "@babel/traverse" "^7.1.0" + "@jest/environment" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + chalk "^2.0.1" + co "^4.6.0" + expect "^24.9.0" + is-generator-fn "^2.0.0" + jest-each "^24.9.0" + jest-matcher-utils "^24.9.0" + jest-message-util "^24.9.0" + jest-runtime "^24.9.0" + jest-snapshot "^24.9.0" + jest-util "^24.9.0" + pretty-format "^24.9.0" + throat "^4.0.0" + +jest-leak-detector@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz#b665dea7c77100c5c4f7dfcb153b65cf07dcf96a" + integrity sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA== + dependencies: + jest-get-type "^24.9.0" + pretty-format "^24.9.0" + +jest-matcher-utils@^24.0.0, jest-matcher-utils@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz#f5b3661d5e628dffe6dd65251dfdae0e87c3a073" + integrity sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA== + dependencies: + chalk "^2.0.1" + jest-diff "^24.9.0" + jest-get-type "^24.9.0" + pretty-format "^24.9.0" + +jest-message-util@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-24.9.0.tgz#527f54a1e380f5e202a8d1149b0ec872f43119e3" + integrity sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw== + dependencies: + "@babel/code-frame" "^7.0.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/stack-utils" "^1.0.1" + chalk "^2.0.1" + micromatch "^3.1.10" + slash "^2.0.0" + stack-utils "^1.0.1" + +jest-mock@^24.0.0, jest-mock@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-24.9.0.tgz#c22835541ee379b908673ad51087a2185c13f1c6" + integrity sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w== + dependencies: + "@jest/types" "^24.9.0" + +jest-pnp-resolver@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz#ecdae604c077a7fbc70defb6d517c3c1c898923a" + integrity sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ== + +jest-regex-util@^24.3.0, jest-regex-util@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-24.9.0.tgz#c13fb3380bde22bf6575432c493ea8fe37965636" + integrity sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA== + +jest-resolve-dependencies@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz#ad055198959c4cfba8a4f066c673a3f0786507ab" + integrity sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g== + dependencies: + "@jest/types" "^24.9.0" + jest-regex-util "^24.3.0" + jest-snapshot "^24.9.0" + +jest-resolve@24.9.0, jest-resolve@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-24.9.0.tgz#dff04c7687af34c4dd7e524892d9cf77e5d17321" + integrity sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ== + dependencies: + "@jest/types" "^24.9.0" + browser-resolve "^1.11.3" + chalk "^2.0.1" + jest-pnp-resolver "^1.2.1" + realpath-native "^1.1.0" + +jest-runner@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-24.9.0.tgz#574fafdbd54455c2b34b4bdf4365a23857fcdf42" + integrity sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg== + dependencies: + "@jest/console" "^24.7.1" + "@jest/environment" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + chalk "^2.4.2" + exit "^0.1.2" + graceful-fs "^4.1.15" + jest-config "^24.9.0" + jest-docblock "^24.3.0" + jest-haste-map "^24.9.0" + jest-jasmine2 "^24.9.0" + jest-leak-detector "^24.9.0" + jest-message-util "^24.9.0" + jest-resolve "^24.9.0" + jest-runtime "^24.9.0" + jest-util "^24.9.0" + jest-worker "^24.6.0" + source-map-support "^0.5.6" + throat "^4.0.0" + +jest-runtime@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-24.9.0.tgz#9f14583af6a4f7314a6a9d9f0226e1a781c8e4ac" + integrity sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw== + dependencies: + "@jest/console" "^24.7.1" + "@jest/environment" "^24.9.0" + "@jest/source-map" "^24.3.0" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/yargs" "^13.0.0" + chalk "^2.0.1" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.1.15" + jest-config "^24.9.0" + jest-haste-map "^24.9.0" + jest-message-util "^24.9.0" + jest-mock "^24.9.0" + jest-regex-util "^24.3.0" + jest-resolve "^24.9.0" + jest-snapshot "^24.9.0" + jest-util "^24.9.0" + jest-validate "^24.9.0" + realpath-native "^1.1.0" + slash "^2.0.0" + strip-bom "^3.0.0" + yargs "^13.3.0" + +jest-serializer@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-24.9.0.tgz#e6d7d7ef96d31e8b9079a714754c5d5c58288e73" + integrity sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ== + +jest-snapshot@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-24.9.0.tgz#ec8e9ca4f2ec0c5c87ae8f925cf97497b0e951ba" + integrity sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew== + dependencies: + "@babel/types" "^7.0.0" + "@jest/types" "^24.9.0" + chalk "^2.0.1" + expect "^24.9.0" + jest-diff "^24.9.0" + jest-get-type "^24.9.0" + jest-matcher-utils "^24.9.0" + jest-message-util "^24.9.0" + jest-resolve "^24.9.0" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + pretty-format "^24.9.0" + semver "^6.2.0" + +jest-util@^24.0.0, jest-util@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-24.9.0.tgz#7396814e48536d2e85a37de3e4c431d7cb140162" + integrity sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg== + dependencies: + "@jest/console" "^24.9.0" + "@jest/fake-timers" "^24.9.0" + "@jest/source-map" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + callsites "^3.0.0" + chalk "^2.0.1" + graceful-fs "^4.1.15" + is-ci "^2.0.0" + mkdirp "^0.5.1" + slash "^2.0.0" + source-map "^0.6.0" + +jest-validate@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-24.9.0.tgz#0775c55360d173cd854e40180756d4ff52def8ab" + integrity sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ== + dependencies: + "@jest/types" "^24.9.0" + camelcase "^5.3.1" + chalk "^2.0.1" + jest-get-type "^24.9.0" + leven "^3.1.0" + pretty-format "^24.9.0" + +jest-watch-typeahead@0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/jest-watch-typeahead/-/jest-watch-typeahead-0.4.2.tgz#e5be959698a7fa2302229a5082c488c3c8780a4a" + integrity sha512-f7VpLebTdaXs81rg/oj4Vg/ObZy2QtGzAmGLNsqUS5G5KtSN68tFcIsbvNODfNyQxU78g7D8x77o3bgfBTR+2Q== + dependencies: + ansi-escapes "^4.2.1" + chalk "^2.4.1" + jest-regex-util "^24.9.0" + jest-watcher "^24.3.0" + slash "^3.0.0" + string-length "^3.1.0" + strip-ansi "^5.0.0" + +jest-watcher@^24.3.0, jest-watcher@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-24.9.0.tgz#4b56e5d1ceff005f5b88e528dc9afc8dd4ed2b3b" + integrity sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw== + dependencies: + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/yargs" "^13.0.0" + ansi-escapes "^3.0.0" + chalk "^2.0.1" + jest-util "^24.9.0" + string-length "^2.0.0" + +jest-worker@^24.6.0, jest-worker@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.9.0.tgz#5dbfdb5b2d322e98567898238a9697bcce67b3e5" + integrity sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw== + dependencies: + merge-stream "^2.0.0" + supports-color "^6.1.0" + +jest-worker@^25.1.0: + version "25.1.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.1.0.tgz#75d038bad6fdf58eba0d2ec1835856c497e3907a" + integrity sha512-ZHhHtlxOWSxCoNOKHGbiLzXnl42ga9CxDr27H36Qn+15pQZd3R/F24jrmjDelw9j/iHUIWMWs08/u2QN50HHOg== + dependencies: + merge-stream "^2.0.0" + supports-color "^7.0.0" + +jest@24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-24.9.0.tgz#987d290c05a08b52c56188c1002e368edb007171" + integrity sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw== + dependencies: + import-local "^2.0.0" + jest-cli "^24.9.0" + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= + +js-yaml@^3.13.1: + version "3.13.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" + integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + +jsdom@^11.5.1: + version "11.12.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8" + integrity sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw== + dependencies: + abab "^2.0.0" + acorn "^5.5.3" + acorn-globals "^4.1.0" + array-equal "^1.0.0" + cssom ">= 0.3.2 < 0.4.0" + cssstyle "^1.0.0" + data-urls "^1.0.0" + domexception "^1.0.1" + escodegen "^1.9.1" + html-encoding-sniffer "^1.0.2" + left-pad "^1.3.0" + nwsapi "^2.0.7" + parse5 "4.0.0" + pn "^1.1.0" + request "^2.87.0" + request-promise-native "^1.0.5" + sax "^1.2.4" + symbol-tree "^3.2.2" + tough-cookie "^2.3.4" + w3c-hr-time "^1.0.1" + webidl-conversions "^4.0.2" + whatwg-encoding "^1.0.3" + whatwg-mimetype "^2.1.0" + whatwg-url "^6.4.1" + ws "^5.2.0" + xml-name-validator "^3.0.0" + +jsdom@^14.1.0: + version "14.1.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-14.1.0.tgz#916463b6094956b0a6c1782c94e380cd30e1981b" + integrity sha512-O901mfJSuTdwU2w3Sn+74T+RnDVP+FuV5fH8tcPWyqrseRAb0s5xOtPgCFiPOtLcyK7CLIJwPyD83ZqQWvA5ng== + dependencies: + abab "^2.0.0" + acorn "^6.0.4" + acorn-globals "^4.3.0" + array-equal "^1.0.0" + cssom "^0.3.4" + cssstyle "^1.1.1" + data-urls "^1.1.0" + domexception "^1.0.1" + escodegen "^1.11.0" + html-encoding-sniffer "^1.0.2" + nwsapi "^2.1.3" + parse5 "5.1.0" + pn "^1.1.0" + request "^2.88.0" + request-promise-native "^1.0.5" + saxes "^3.1.9" + symbol-tree "^3.2.2" + tough-cookie "^2.5.0" + w3c-hr-time "^1.0.1" + w3c-xmlserializer "^1.1.2" + webidl-conversions "^4.0.2" + whatwg-encoding "^1.0.5" + whatwg-mimetype "^2.3.0" + whatwg-url "^7.0.0" + ws "^6.1.2" + xml-name-validator "^3.0.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + +json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + +json-stable-stringify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8= + dependencies: + jsonify "~0.0.0" + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + +json3@^3.3.2: + version "3.3.3" + resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81" + integrity sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA== + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +json5@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.2.tgz#43ef1f0af9835dd624751a6b7fa48874fb2d608e" + integrity sha512-MoUOQ4WdiN3yxhm7NEVJSJrieAo5hNSLQ5sj05OTRHPL9HOBy8u4Bu88jsC1jvqAdN+E1bJmsUcZH+1HQxliqQ== + dependencies: + minimist "^1.2.5" + +jsonexport@^2.4.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsonexport/-/jsonexport-2.5.2.tgz#fafbcdb2cb8e12d0a2a92cda6e0634c8d48005ac" + integrity sha512-4joNLCxxUAmS22GN3GA5os/MYFnq8oqXOKvoCymmcT0MPz/QPZ5eA+Fh5sIPxUji45RKq8DdQ1yoKq91p4E9VA== + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + optionalDependencies: + graceful-fs "^4.1.6" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +jss-plugin-camel-case@^10.0.3: + version "10.3.0" + resolved "https://registry.yarnpkg.com/jss-plugin-camel-case/-/jss-plugin-camel-case-10.3.0.tgz#ae4da53b39a6e3ea94b70a20fc41c11f0b87386a" + integrity sha512-tadWRi/SLWqLK3EUZEdDNJL71F3ST93Zrl9JYMjV0QDqKPAl0Liue81q7m/nFUpnSTXczbKDy4wq8rI8o7WFqA== + dependencies: + "@babel/runtime" "^7.3.1" + hyphenate-style-name "^1.0.3" + jss "^10.3.0" + +jss-plugin-default-unit@^10.0.3: + version "10.3.0" + resolved "https://registry.yarnpkg.com/jss-plugin-default-unit/-/jss-plugin-default-unit-10.3.0.tgz#cd74cf5088542620a82591f76c62c6b43a7e50a6" + integrity sha512-tT5KkIXAsZOSS9WDSe8m8lEHIjoEOj4Pr0WrG0WZZsMXZ1mVLFCSsD2jdWarQWDaRNyMj/I4d7czRRObhOxSuw== + dependencies: + "@babel/runtime" "^7.3.1" + jss "^10.3.0" + +jss-plugin-global@^10.0.3: + version "10.3.0" + resolved "https://registry.yarnpkg.com/jss-plugin-global/-/jss-plugin-global-10.3.0.tgz#6b883e74900bb71f65ac2b19bea78f7d1e85af3f" + integrity sha512-etYTG/y3qIR/vxZnKY+J3wXwObyBDNhBiB3l/EW9/pE3WHE//BZdK8LFvQcrCO48sZW1Z6paHo6klxUPP7WbzA== + dependencies: + "@babel/runtime" "^7.3.1" + jss "^10.3.0" + +jss-plugin-nested@^10.0.3: + version "10.3.0" + resolved "https://registry.yarnpkg.com/jss-plugin-nested/-/jss-plugin-nested-10.3.0.tgz#ae8aceac95e09c3d40c991ea32403fb647d9e0a8" + integrity sha512-qWiEkoXNEkkZ+FZrWmUGpf+zBsnEOmKXhkjNX85/ZfWhH9dfGxUCKuJFuOWFM+rjQfxV4csfesq4hY0jk8Qt0w== + dependencies: + "@babel/runtime" "^7.3.1" + jss "^10.3.0" + tiny-warning "^1.0.2" + +jss-plugin-props-sort@^10.0.3: + version "10.3.0" + resolved "https://registry.yarnpkg.com/jss-plugin-props-sort/-/jss-plugin-props-sort-10.3.0.tgz#5b0625f87b6431a7969c56b0d8c696525969bfe4" + integrity sha512-boetORqL/lfd7BWeFD3K+IyPqyIC+l3CRrdZr+NPq7Noqp+xyg/0MR7QisgzpxCEulk+j2CRcEUoZsvgPC4nTg== + dependencies: + "@babel/runtime" "^7.3.1" + jss "^10.3.0" + +jss-plugin-rule-value-function@^10.0.3: + version "10.3.0" + resolved "https://registry.yarnpkg.com/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.3.0.tgz#498b0e2bae16cb316a6bdb73fd783cf9604ba747" + integrity sha512-7WiMrKIHH3rwxTuJki9+7nY11r1UXqaUZRhHvqTD4/ZE+SVhvtD5Tx21ivNxotwUSleucA/8boX+NF21oXzr5Q== + dependencies: + "@babel/runtime" "^7.3.1" + jss "^10.3.0" + tiny-warning "^1.0.2" + +jss-plugin-vendor-prefixer@^10.0.3: + version "10.3.0" + resolved "https://registry.yarnpkg.com/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.3.0.tgz#b09c13a4d05a055429d8a24e19cc01ce049f0ed4" + integrity sha512-sZQbrcZyP5V0ADjCLwUA1spVWoaZvM7XZ+2fSeieZFBj31cRsnV7X70FFDerMHeiHAXKWzYek+67nMDjhrZAVQ== + dependencies: + "@babel/runtime" "^7.3.1" + css-vendor "^2.0.8" + jss "^10.3.0" + +jss@^10.0.3, jss@^10.3.0: + version "10.3.0" + resolved "https://registry.yarnpkg.com/jss/-/jss-10.3.0.tgz#2cf7be265f72b59c1764d816fdabff1c5dd18326" + integrity sha512-B5sTRW9B6uHaUVzSo9YiMEOEp3UX8lWevU0Fsv+xtRnsShmgCfIYX44bTH8bPJe6LQKqEXku3ulKuHLbxBS97Q== + dependencies: + "@babel/runtime" "^7.3.1" + csstype "^2.6.5" + is-in-browser "^1.1.3" + tiny-warning "^1.0.2" + +jsx-ast-utils@^2.2.1, jsx-ast-utils@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.2.3.tgz#8a9364e402448a3ce7f14d357738310d9248054f" + integrity sha512-EdIHFMm+1BPynpKOpdPqiOsvnIrInRGJD7bzPZdPkjitQEqpdpUuFpq4T0npZFKTiB3RhWFdGN+oqOJIdhDhQA== + dependencies: + array-includes "^3.0.3" + object.assign "^4.1.0" + +killable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" + integrity sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg== + +kind-of@>=6.0.3, kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +kind-of@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-2.0.1.tgz#018ec7a4ce7e3a86cb9141be519d24c8faa981b5" + integrity sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU= + dependencies: + is-buffer "^1.0.2" + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +last-call-webpack-plugin@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz#9742df0e10e3cf46e5c0381c2de90d3a7a2d7555" + integrity sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w== + dependencies: + lodash "^4.17.5" + webpack-sources "^1.1.0" + +lazy-cache@^0.2.3: + version "0.2.7" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-0.2.7.tgz#7feddf2dcb6edb77d11ef1d117ab5ffdf0ab1b65" + integrity sha1-f+3fLctu23fRHvHRF6tf/fCrG2U= + +lazy-cache@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + integrity sha1-odePw6UEdMuAhF07O24dpJpEbo4= + +lcid@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" + integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== + dependencies: + invert-kv "^2.0.0" + +left-pad@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" + integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA== + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levenary@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/levenary/-/levenary-1.1.1.tgz#842a9ee98d2075aa7faeedbe32679e9205f46f77" + integrity sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ== + dependencies: + leven "^3.1.0" + +levn@^0.3.0, levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +lines-and-columns@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" + integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= + +load-json-file@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + strip-bom "^3.0.0" + +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + +loader-fs-cache@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/loader-fs-cache/-/loader-fs-cache-1.0.2.tgz#54cedf6b727e1779fd8f01205f05f6e88706f086" + integrity sha512-70IzT/0/L+M20jUlEqZhZyArTU6VKLRTYRDAYN26g4jfzpJqjipLL3/hgYpySqI9PwsVRHHFja0LfEmsx9X2Cw== + dependencies: + find-cache-dir "^0.1.1" + mkdirp "0.5.1" + +loader-runner@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" + integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== + +loader-utils@1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" + integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== + dependencies: + big.js "^5.2.2" + emojis-list "^2.0.0" + json5 "^1.0.1" + +loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" + integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^1.0.1" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +lodash._reinterpolate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= + +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= + +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= + +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= + +lodash.template@^4.4.0, lodash.template@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" + integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== + dependencies: + lodash._reinterpolate "^3.0.0" + lodash.templatesettings "^4.0.0" + +lodash.templatesettings@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33" + integrity sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ== + dependencies: + lodash._reinterpolate "^3.0.0" + +lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= + +"lodash@>=3.5 <5", lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.5: + version "4.17.15" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" + integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== + +lodash@^4.17.19, lodash@~4.17.5: + version "4.17.19" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" + integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== + +loglevel@^1.6.6: + version "1.6.7" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.7.tgz#b3e034233188c68b889f5b862415306f565e2c56" + integrity sha512-cY2eLFrQSAfVPhCgH1s7JI73tMbg9YC3v3+ZHVW67sBS7UxWzNEk/ZBbSfLykBWHp33dqqtOv82gjhKEi81T/A== + +long@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" + integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== + +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lower-case@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.1.tgz#39eeb36e396115cc05e29422eaea9e692c9408c7" + integrity sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ== + dependencies: + tslib "^1.10.0" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +make-dir@^2.0.0, make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +make-dir@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.0.2.tgz#04a1acbf22221e1d6ef43559f43e05a90dbb4392" + integrity sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w== + dependencies: + semver "^6.0.0" + +makeerror@1.0.x: + version "1.0.11" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" + integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= + dependencies: + tmpl "1.0.x" + +mamacro@^0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4" + integrity sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA== + +map-age-cleaner@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" + integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== + dependencies: + p-defer "^1.0.0" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +mdn-data@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" + integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + +mem@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" + integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== + dependencies: + map-age-cleaner "^0.1.1" + mimic-fn "^2.0.0" + p-is-promise "^2.0.0" + +memory-fs@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +memory-fs@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" + integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +merge-deep@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/merge-deep/-/merge-deep-3.0.2.tgz#f39fa100a4f1bd34ff29f7d2bf4508fbb8d83ad2" + integrity sha512-T7qC8kg4Zoti1cFd8Cr0M+qaZfOwjlPDEdZIIPPB2JZctjaPM4fX+i7HOId69tAti2fvO6X5ldfYUONDODsrkA== + dependencies: + arr-union "^3.1.0" + clone-deep "^0.2.4" + kind-of "^3.0.2" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.2.3: + version "1.3.0" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.3.0.tgz#5b366ee83b2f1582c48f87e47cf1a9352103ca81" + integrity sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + +microevent.ts@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/microevent.ts/-/microevent.ts-0.1.1.tgz#70b09b83f43df5172d0205a63025bce0f7357fa0" + integrity sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g== + +micromatch@^3.1.10, micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +mime-db@1.43.0, "mime-db@>= 1.43.0 < 2": + version "1.43.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58" + integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ== + +mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24: + version "2.1.26" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06" + integrity sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ== + dependencies: + mime-db "1.43.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mime@^2.4.4: + version "2.4.4" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5" + integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA== + +mimic-fn@^2.0.0, mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + +mini-create-react-context@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/mini-create-react-context/-/mini-create-react-context-0.4.0.tgz#df60501c83151db69e28eac0ef08b4002efab040" + integrity sha512-b0TytUgFSbgFJGzJqXPKCFCBWigAjpjo+Fl7Vf7ZbKRDptszpppKxXH6DRXEABZ/gcEQczeb0iZ7JvL8e8jjCA== + dependencies: + "@babel/runtime" "^7.5.5" + tiny-warning "^1.0.3" + +mini-css-extract-plugin@0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz#47f2cf07aa165ab35733b1fc97d4c46c0564339e" + integrity sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A== + dependencies: + loader-utils "^1.1.0" + normalize-url "1.9.1" + schema-utils "^1.0.0" + webpack-sources "^1.1.0" + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + +minimatch@3.0.4, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= + +minimist@>=1.2.3, minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +minipass-collect@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" + integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== + dependencies: + minipass "^3.0.0" + +minipass-flush@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" + integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== + dependencies: + minipass "^3.0.0" + +minipass-pipeline@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.2.tgz#3dcb6bb4a546e32969c7ad710f2c79a86abba93a" + integrity sha512-3JS5A2DKhD2g0Gg8x3yamO0pj7YeKGwVlDS90pF++kxptwx/F+B//roxf9SqYil5tQo65bijy+dAuAFZmYOouA== + dependencies: + minipass "^3.0.0" + +minipass@^3.0.0, minipass@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.1.tgz#7607ce778472a185ad6d89082aa2070f79cedcd5" + integrity sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w== + dependencies: + yallist "^4.0.0" + +mississippi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" + integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^3.0.0" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mixin-object@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mixin-object/-/mixin-object-2.0.1.tgz#4fb949441dab182540f1fe035ba60e1947a5e57e" + integrity sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4= + dependencies: + for-in "^0.1.3" + is-extendable "^0.1.1" + +mkdirp@0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= + dependencies: + minimist "0.0.8" + +mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@~0.5.1: + version "0.5.3" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.3.tgz#5a514b7179259287952881e94410ec5465659f8c" + integrity sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg== + dependencies: + minimist "^1.2.5" + +move-concurrently@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= + dependencies: + aproba "^1.1.1" + copy-concurrently "^1.0.0" + fs-write-stream-atomic "^1.0.8" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.3" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +ms@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +multicast-dns-service-types@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" + integrity sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE= + +multicast-dns@^6.0.1: + version "6.2.3" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" + integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g== + dependencies: + dns-packet "^1.3.1" + thunky "^1.0.2" + +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + +nan@^2.12.1: + version "2.14.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" + integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + +negotiator@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" + integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== + +neo-async@^2.5.0, neo-async@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" + integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== + +next-tick@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" + integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +no-case@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.3.tgz#c21b434c1ffe48b39087e86cfb4d2582e9df18f8" + integrity sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw== + dependencies: + lower-case "^2.0.1" + tslib "^1.10.0" + +node-fetch@^1.0.1: + version "1.7.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" + integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + +node-forge@0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.9.0.tgz#d624050edbb44874adca12bb9a52ec63cb782579" + integrity sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ== + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= + +node-libs-browser@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" + integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== + dependencies: + assert "^1.1.1" + browserify-zlib "^0.2.0" + buffer "^4.3.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "^3.11.0" + domain-browser "^1.1.1" + events "^3.0.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" + path-browserify "0.0.1" + process "^0.11.10" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.3.3" + stream-browserify "^2.0.1" + stream-http "^2.7.2" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.11.0" + vm-browserify "^1.0.1" + +node-modules-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" + integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= + +node-notifier@^5.4.2: + version "5.4.3" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.3.tgz#cb72daf94c93904098e28b9c590fd866e464bd50" + integrity sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q== + dependencies: + growly "^1.3.0" + is-wsl "^1.1.0" + semver "^5.5.0" + shellwords "^0.1.1" + which "^1.3.0" + +node-polyglot@^2.2.2: + version "2.4.0" + resolved "https://registry.yarnpkg.com/node-polyglot/-/node-polyglot-2.4.0.tgz#0d2717ed06640d9ff48a2aebe8d13e39ef03518f" + integrity sha512-KRzKwzMWm3wSAjOSop7/WwNyzaMkCe9ddkwXTQsIZEJmvEnqy/bCqLpAVw6xBszKfy4iLdYVA0d83L+cIkYPbA== + dependencies: + for-each "^0.3.3" + has "^1.0.3" + string.prototype.trim "^1.1.2" + warning "^4.0.3" + +node-releases@^1.1.52: + version "1.1.52" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.52.tgz#bcffee3e0a758e92e44ecfaecd0a47554b0bcba9" + integrity sha512-snSiT1UypkgGt2wxPqS6ImEUICbNCMb31yaxWrOLXjhlt2z2/IBpaOxzONExqSm4y5oLnAqjjRWu+wsDzK5yNQ== + dependencies: + semver "^6.3.0" + +normalize-package-data@^2.3.2: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= + +normalize-url@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" + integrity sha1-LMDWazHqIwNkWENuNiDYWVTGbDw= + dependencies: + object-assign "^4.0.1" + prepend-http "^1.0.0" + query-string "^4.1.0" + sort-keys "^1.0.0" + +normalize-url@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" + integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.0.0" + +nth-check@^1.0.2, nth-check@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" + integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== + dependencies: + boolbase "~1.0.0" + +num2fraction@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" + integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + +nwsapi@^2.0.7, nwsapi@^2.1.3: + version "2.2.0" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" + integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-hash@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.0.3.tgz#d12db044e03cd2ca3d77c0570d87225b02e1e6ea" + integrity sha512-JPKn0GMu+Fa3zt3Bmr66JhokJU5BaNBIh4ZeTlaCBzrBsOeXzwcKKAK1tbLiPKgvwmPXsDvvLHoWh5Bm7ofIYg== + +object-inspect@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" + integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== + +object-is@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.0.2.tgz#6b80eb84fe451498f65007982f035a5b445edec4" + integrity sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ== + +object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object-path@0.11.4: + version "0.11.4" + resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.11.4.tgz#370ae752fbf37de3ea70a861c23bba8915691949" + integrity sha1-NwrnUvvzfePqcKhhwju6iRVpGUk= + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.assign@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" + integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + +object.entries@^1.1.0, object.entries@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.1.tgz#ee1cf04153de02bb093fec33683900f57ce5399b" + integrity sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + function-bind "^1.1.1" + has "^1.0.3" + +object.fromentries@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.2.tgz#4a09c9b9bb3843dd0f89acdb517a794d4f355ac9" + integrity sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + function-bind "^1.1.1" + has "^1.0.3" + +object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" + integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +object.values@^1.1.0, object.values@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e" + integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + function-bind "^1.1.1" + has "^1.0.3" + +obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +onetime@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" + integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== + dependencies: + mimic-fn "^2.1.0" + +open@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/open/-/open-7.0.3.tgz#db551a1af9c7ab4c7af664139930826138531c48" + integrity sha512-sP2ru2v0P290WFfv49Ap8MF6PkzGNnGlAwHweB4WR4mr5d2d0woiCluUeJ218w7/+PmoBy9JmYgD5A4mLcWOFA== + dependencies: + is-docker "^2.0.0" + is-wsl "^2.1.1" + +opn@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" + integrity sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA== + dependencies: + is-wsl "^1.1.0" + +optimism@^0.10.0: + version "0.10.3" + resolved "https://registry.yarnpkg.com/optimism/-/optimism-0.10.3.tgz#163268fdc741dea2fb50f300bedda80356445fd7" + integrity sha512-9A5pqGoQk49H6Vhjb9kPgAeeECfUDF6aIICbMDL23kDLStBn1MWk3YvcZ4xWF9CsSf6XEgvRLkXy4xof/56vVw== + dependencies: + "@wry/context" "^0.4.0" + +optimism@^0.12.1: + version "0.12.1" + resolved "https://registry.yarnpkg.com/optimism/-/optimism-0.12.1.tgz#933f9467b9aef0e601655adb9638f893e486ad02" + integrity sha512-t8I7HM1dw0SECitBYAqFOVHoBAHEQBTeKjIL9y9ImHzAVkdyPK4ifTgM4VJRDtTUY4r/u5Eqxs4XcGPHaoPkeQ== + dependencies: + "@wry/context" "^0.5.2" + +optimize-css-assets-webpack-plugin@5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.3.tgz#e2f1d4d94ad8c0af8967ebd7cf138dcb1ef14572" + integrity sha512-q9fbvCRS6EYtUKKSwI87qm2IxlyJK5b4dygW1rKUBT6mMDhdG5e5bZT63v6tnJR9F9FB/H5a0HTmtw+laUBxKA== + dependencies: + cssnano "^4.1.10" + last-call-webpack-plugin "^3.0.0" + +optionator@^0.8.1, optionator@^0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + +original@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" + integrity sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg== + dependencies: + url-parse "^1.4.3" + +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= + +os-locale@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" + integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== + dependencies: + execa "^1.0.0" + lcid "^2.0.0" + mem "^4.0.0" + +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +p-defer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" + integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= + +p-each-series@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-1.0.0.tgz#930f3d12dd1f50e7434457a22cd6f04ac6ad7f71" + integrity sha1-kw89Et0fUOdDRFeiLNbwSsatf3E= + dependencies: + p-reduce "^1.0.0" + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-is-promise@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" + integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-limit@^2.0.0, p-limit@^2.2.0, p-limit@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.2.tgz#61279b67721f5287aa1c13a9a7fbbc48c9291b1e" + integrity sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ== + dependencies: + p-try "^2.0.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + dependencies: + p-limit "^1.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-map@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" + integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== + +p-map@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" + integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== + dependencies: + aggregate-error "^3.0.0" + +p-reduce@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" + integrity sha1-GMKw3ZNqRpClKfgjH1ig/bakffo= + +p-retry@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-3.0.1.tgz#316b4c8893e2c8dc1cfa891f406c4b422bebf328" + integrity sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w== + dependencies: + retry "^0.12.0" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +pako@~1.0.5: + version "1.0.11" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + +parallel-transform@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" + integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== + dependencies: + cyclist "^1.0.1" + inherits "^2.0.3" + readable-stream "^2.1.5" + +param-case@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.3.tgz#4be41f8399eff621c56eebb829a5e451d9801238" + integrity sha512-VWBVyimc1+QrzappRs7waeN2YmoZFCGXWASRYX1/rGHtXqEcrGEIDm+jqIwFa2fRXNgQEwrxaYuIrX0WcAguTA== + dependencies: + dot-case "^3.0.3" + tslib "^1.10.0" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-asn1@^5.0.0: + version "5.1.5" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.5.tgz#003271343da58dc94cace494faef3d2147ecea0e" + integrity sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ== + dependencies: + asn1.js "^4.0.0" + browserify-aes "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + safe-buffer "^5.1.1" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= + dependencies: + error-ex "^1.2.0" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse-json@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.0.0.tgz#73e5114c986d143efa3712d4ea24db9a4266f60f" + integrity sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + lines-and-columns "^1.1.6" + +parse5@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" + integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA== + +parse5@5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2" + integrity sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ== + +parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascal-case@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.1.tgz#5ac1975133ed619281e88920973d2cd1f279de5f" + integrity sha512-XIeHKqIrsquVTQL2crjq3NfJUxmdLasn3TYOU0VBM+UX2a6ztAWBlJQBePLGY7VHW8+2dRadeIPK5+KImwTxQA== + dependencies: + no-case "^3.0.3" + tslib "^1.10.0" + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" + integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= + dependencies: + pinkie-promise "^2.0.0" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-is-inside@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + +path-to-regexp@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" + integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== + dependencies: + isarray "0.0.1" + +path-type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= + dependencies: + pify "^2.0.0" + +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pbkdf2@^3.0.3: + version "3.0.17" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" + integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + +picomatch@^2.0.4, picomatch@^2.0.7: + version "2.2.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.1.tgz#21bac888b6ed8601f831ce7816e335bc779f0a4a" + integrity sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA== + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + +pirates@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" + integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== + dependencies: + node-modules-regexp "^1.0.0" + +pkg-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" + integrity sha1-ektQio1bstYp1EcFb/TpyTFM89Q= + dependencies: + find-up "^1.0.0" + +pkg-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= + dependencies: + find-up "^2.1.0" + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + +pkg-dir@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +pkg-up@3.1.0, pkg-up@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" + integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== + dependencies: + find-up "^3.0.0" + +pluralize@~7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" + integrity sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow== + +pn@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" + integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== + +pnp-webpack-plugin@1.6.4: + version "1.6.4" + resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz#c9711ac4dc48a685dabafc86f8b6dd9f8df84149" + integrity sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg== + dependencies: + ts-pnp "^1.1.6" + +popper.js@1.16.1-lts: + version "1.16.1-lts" + resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1-lts.tgz#cf6847b807da3799d80ee3d6d2f90df8a3f50b05" + integrity sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA== + +portfinder@^1.0.25: + version "1.0.25" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.25.tgz#254fd337ffba869f4b9d37edc298059cb4d35eca" + integrity sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg== + dependencies: + async "^2.6.2" + debug "^3.1.1" + mkdirp "^0.5.1" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +postcss-attribute-case-insensitive@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz#d93e46b504589e94ac7277b0463226c68041a880" + integrity sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^6.0.2" + +postcss-browser-comments@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-browser-comments/-/postcss-browser-comments-3.0.0.tgz#1248d2d935fb72053c8e1f61a84a57292d9f65e9" + integrity sha512-qfVjLfq7HFd2e0HW4s1dvU8X080OZdG46fFbIBFjW7US7YPDcWfRvdElvwMJr2LI6hMmD+7LnH2HcmXTs+uOig== + dependencies: + postcss "^7" + +postcss-calc@^7.0.1: + version "7.0.2" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.2.tgz#504efcd008ca0273120568b0792b16cdcde8aac1" + integrity sha512-rofZFHUg6ZIrvRwPeFktv06GdbDYLcGqh9EwiMutZg+a0oePCCw1zHOEiji6LCpyRcjTREtPASuUqeAvYlEVvQ== + dependencies: + postcss "^7.0.27" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.0.2" + +postcss-color-functional-notation@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz#5efd37a88fbabeb00a2966d1e53d98ced93f74e0" + integrity sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-color-gray@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz#532a31eb909f8da898ceffe296fdc1f864be8547" + integrity sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw== + dependencies: + "@csstools/convert-colors" "^1.4.0" + postcss "^7.0.5" + postcss-values-parser "^2.0.0" + +postcss-color-hex-alpha@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz#a8d9ca4c39d497c9661e374b9c51899ef0f87388" + integrity sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw== + dependencies: + postcss "^7.0.14" + postcss-values-parser "^2.0.1" + +postcss-color-mod-function@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz#816ba145ac11cc3cb6baa905a75a49f903e4d31d" + integrity sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ== + dependencies: + "@csstools/convert-colors" "^1.4.0" + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-color-rebeccapurple@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz#c7a89be872bb74e45b1e3022bfe5748823e6de77" + integrity sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-colormin@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381" + integrity sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw== + dependencies: + browserslist "^4.0.0" + color "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-convert-values@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f" + integrity sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-custom-media@^7.0.8: + version "7.0.8" + resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz#fffd13ffeffad73621be5f387076a28b00294e0c" + integrity sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg== + dependencies: + postcss "^7.0.14" + +postcss-custom-properties@^8.0.11: + version "8.0.11" + resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz#2d61772d6e92f22f5e0d52602df8fae46fa30d97" + integrity sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA== + dependencies: + postcss "^7.0.17" + postcss-values-parser "^2.0.1" + +postcss-custom-selectors@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz#64858c6eb2ecff2fb41d0b28c9dd7b3db4de7fba" + integrity sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0-rc.3" + +postcss-dir-pseudo-class@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz#6e3a4177d0edb3abcc85fdb6fbb1c26dabaeaba2" + integrity sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0-rc.3" + +postcss-discard-comments@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033" + integrity sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg== + dependencies: + postcss "^7.0.0" + +postcss-discard-duplicates@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb" + integrity sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ== + dependencies: + postcss "^7.0.0" + +postcss-discard-empty@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765" + integrity sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w== + dependencies: + postcss "^7.0.0" + +postcss-discard-overridden@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57" + integrity sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg== + dependencies: + postcss "^7.0.0" + +postcss-double-position-gradients@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz#fc927d52fddc896cb3a2812ebc5df147e110522e" + integrity sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA== + dependencies: + postcss "^7.0.5" + postcss-values-parser "^2.0.0" + +postcss-env-function@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/postcss-env-function/-/postcss-env-function-2.0.2.tgz#0f3e3d3c57f094a92c2baf4b6241f0b0da5365d7" + integrity sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-flexbugs-fixes@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.1.0.tgz#e094a9df1783e2200b7b19f875dcad3b3aff8b20" + integrity sha512-jr1LHxQvStNNAHlgco6PzY308zvLklh7SJVYuWUwyUQncofaAlD2l+P/gxKHOdqWKe7xJSkVLFF/2Tp+JqMSZA== + dependencies: + postcss "^7.0.0" + +postcss-focus-visible@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz#477d107113ade6024b14128317ade2bd1e17046e" + integrity sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g== + dependencies: + postcss "^7.0.2" + +postcss-focus-within@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz#763b8788596cee9b874c999201cdde80659ef680" + integrity sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w== + dependencies: + postcss "^7.0.2" + +postcss-font-variant@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-4.0.0.tgz#71dd3c6c10a0d846c5eda07803439617bbbabacc" + integrity sha512-M8BFYKOvCrI2aITzDad7kWuXXTm0YhGdP9Q8HanmN4EF1Hmcgs1KK5rSHylt/lUJe8yLxiSwWAHdScoEiIxztg== + dependencies: + postcss "^7.0.2" + +postcss-gap-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz#431c192ab3ed96a3c3d09f2ff615960f902c1715" + integrity sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg== + dependencies: + postcss "^7.0.2" + +postcss-image-set-function@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz#28920a2f29945bed4c3198d7df6496d410d3f288" + integrity sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-initial@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-3.0.2.tgz#f018563694b3c16ae8eaabe3c585ac6319637b2d" + integrity sha512-ugA2wKonC0xeNHgirR4D3VWHs2JcU08WAi1KFLVcnb7IN89phID6Qtg2RIctWbnvp1TM2BOmDtX8GGLCKdR8YA== + dependencies: + lodash.template "^4.5.0" + postcss "^7.0.2" + +postcss-lab-function@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz#bb51a6856cd12289ab4ae20db1e3821ef13d7d2e" + integrity sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg== + dependencies: + "@csstools/convert-colors" "^1.4.0" + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-load-config@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.0.tgz#c84d692b7bb7b41ddced94ee62e8ab31b417b003" + integrity sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q== + dependencies: + cosmiconfig "^5.0.0" + import-cwd "^2.0.0" + +postcss-loader@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-3.0.0.tgz#6b97943e47c72d845fa9e03f273773d4e8dd6c2d" + integrity sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA== + dependencies: + loader-utils "^1.1.0" + postcss "^7.0.0" + postcss-load-config "^2.0.0" + schema-utils "^1.0.0" + +postcss-logical@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-3.0.0.tgz#2495d0f8b82e9f262725f75f9401b34e7b45d5b5" + integrity sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA== + dependencies: + postcss "^7.0.2" + +postcss-media-minmax@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz#b75bb6cbc217c8ac49433e12f22048814a4f5ed5" + integrity sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw== + dependencies: + postcss "^7.0.2" + +postcss-merge-longhand@^4.0.11: + version "4.0.11" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24" + integrity sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw== + dependencies: + css-color-names "0.0.4" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + stylehacks "^4.0.0" + +postcss-merge-rules@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650" + integrity sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ== + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + cssnano-util-same-parent "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + vendors "^1.0.0" + +postcss-minify-font-values@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6" + integrity sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-minify-gradients@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471" + integrity sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q== + dependencies: + cssnano-util-get-arguments "^4.0.0" + is-color-stop "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-minify-params@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874" + integrity sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg== + dependencies: + alphanum-sort "^1.0.0" + browserslist "^4.0.0" + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + uniqs "^2.0.0" + +postcss-minify-selectors@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8" + integrity sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g== + dependencies: + alphanum-sort "^1.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + +postcss-modules-extract-imports@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e" + integrity sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ== + dependencies: + postcss "^7.0.5" + +postcss-modules-local-by-default@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz#e8a6561be914aaf3c052876377524ca90dbb7915" + integrity sha512-jM/V8eqM4oJ/22j0gx4jrp63GSvDH6v86OqyTHHUvk4/k1vceipZsaymiZ5PvocqZOl5SFHiFJqjs3la0wnfIQ== + dependencies: + icss-utils "^4.1.1" + postcss "^7.0.16" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.0.0" + +postcss-modules-scope@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz#385cae013cc7743f5a7d7602d1073a89eaae62ee" + integrity sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ== + dependencies: + postcss "^7.0.6" + postcss-selector-parser "^6.0.0" + +postcss-modules-values@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10" + integrity sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg== + dependencies: + icss-utils "^4.0.0" + postcss "^7.0.6" + +postcss-nesting@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-7.0.1.tgz#b50ad7b7f0173e5b5e3880c3501344703e04c052" + integrity sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg== + dependencies: + postcss "^7.0.2" + +postcss-normalize-charset@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4" + integrity sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g== + dependencies: + postcss "^7.0.0" + +postcss-normalize-display-values@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a" + integrity sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ== + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-positions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f" + integrity sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA== + dependencies: + cssnano-util-get-arguments "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-repeat-style@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c" + integrity sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q== + dependencies: + cssnano-util-get-arguments "^4.0.0" + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-string@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c" + integrity sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA== + dependencies: + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-timing-functions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9" + integrity sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A== + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-unicode@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb" + integrity sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg== + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-url@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1" + integrity sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA== + dependencies: + is-absolute-url "^2.0.0" + normalize-url "^3.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-whitespace@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82" + integrity sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize@8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize/-/postcss-normalize-8.0.1.tgz#90e80a7763d7fdf2da6f2f0f82be832ce4f66776" + integrity sha512-rt9JMS/m9FHIRroDDBGSMsyW1c0fkvOJPy62ggxSHUldJO7B195TqFMqIf+lY5ezpDcYOV4j86aUp3/XbxzCCQ== + dependencies: + "@csstools/normalize.css" "^10.1.0" + browserslist "^4.6.2" + postcss "^7.0.17" + postcss-browser-comments "^3.0.0" + sanitize.css "^10.0.0" + +postcss-ordered-values@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee" + integrity sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw== + dependencies: + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-overflow-shorthand@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz#31ecf350e9c6f6ddc250a78f0c3e111f32dd4c30" + integrity sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g== + dependencies: + postcss "^7.0.2" + +postcss-page-break@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-page-break/-/postcss-page-break-2.0.0.tgz#add52d0e0a528cabe6afee8b46e2abb277df46bf" + integrity sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ== + dependencies: + postcss "^7.0.2" + +postcss-place@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-place/-/postcss-place-4.0.1.tgz#e9f39d33d2dc584e46ee1db45adb77ca9d1dcc62" + integrity sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-preset-env@6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz#c34ddacf8f902383b35ad1e030f178f4cdf118a5" + integrity sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg== + dependencies: + autoprefixer "^9.6.1" + browserslist "^4.6.4" + caniuse-lite "^1.0.30000981" + css-blank-pseudo "^0.1.4" + css-has-pseudo "^0.10.0" + css-prefers-color-scheme "^3.1.1" + cssdb "^4.4.0" + postcss "^7.0.17" + postcss-attribute-case-insensitive "^4.0.1" + postcss-color-functional-notation "^2.0.1" + postcss-color-gray "^5.0.0" + postcss-color-hex-alpha "^5.0.3" + postcss-color-mod-function "^3.0.3" + postcss-color-rebeccapurple "^4.0.1" + postcss-custom-media "^7.0.8" + postcss-custom-properties "^8.0.11" + postcss-custom-selectors "^5.1.2" + postcss-dir-pseudo-class "^5.0.0" + postcss-double-position-gradients "^1.0.0" + postcss-env-function "^2.0.2" + postcss-focus-visible "^4.0.0" + postcss-focus-within "^3.0.0" + postcss-font-variant "^4.0.0" + postcss-gap-properties "^2.0.0" + postcss-image-set-function "^3.0.1" + postcss-initial "^3.0.0" + postcss-lab-function "^2.0.1" + postcss-logical "^3.0.0" + postcss-media-minmax "^4.0.0" + postcss-nesting "^7.0.0" + postcss-overflow-shorthand "^2.0.0" + postcss-page-break "^2.0.0" + postcss-place "^4.0.1" + postcss-pseudo-class-any-link "^6.0.0" + postcss-replace-overflow-wrap "^3.0.0" + postcss-selector-matches "^4.0.0" + postcss-selector-not "^4.0.0" + +postcss-pseudo-class-any-link@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz#2ed3eed393b3702879dec4a87032b210daeb04d1" + integrity sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0-rc.3" + +postcss-reduce-initial@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df" + integrity sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA== + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + +postcss-reduce-transforms@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29" + integrity sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg== + dependencies: + cssnano-util-get-match "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-replace-overflow-wrap@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz#61b360ffdaedca84c7c918d2b0f0d0ea559ab01c" + integrity sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw== + dependencies: + postcss "^7.0.2" + +postcss-safe-parser@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-4.0.1.tgz#8756d9e4c36fdce2c72b091bbc8ca176ab1fcdea" + integrity sha512-xZsFA3uX8MO3yAda03QrG3/Eg1LN3EPfjjf07vke/46HERLZyHrTsQ9E1r1w1W//fWEhtYNndo2hQplN2cVpCQ== + dependencies: + postcss "^7.0.0" + +postcss-selector-matches@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz#71c8248f917ba2cc93037c9637ee09c64436fcff" + integrity sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww== + dependencies: + balanced-match "^1.0.0" + postcss "^7.0.2" + +postcss-selector-not@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-4.0.0.tgz#c68ff7ba96527499e832724a2674d65603b645c0" + integrity sha512-W+bkBZRhqJaYN8XAnbbZPLWMvZD1wKTu0UxtFKdhtGjWYmxhkUneoeOhRJKdAE5V7ZTlnbHfCR+6bNwK9e1dTQ== + dependencies: + balanced-match "^1.0.0" + postcss "^7.0.2" + +postcss-selector-parser@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz#b310f5c4c0fdaf76f94902bbaa30db6aa84f5270" + integrity sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA== + dependencies: + dot-prop "^5.2.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz#249044356697b33b64f1a8f7c80922dddee7195c" + integrity sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ== + dependencies: + cssesc "^2.0.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz#934cf799d016c83411859e09dcecade01286ec5c" + integrity sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg== + dependencies: + cssesc "^3.0.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-svgo@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.2.tgz#17b997bc711b333bab143aaed3b8d3d6e3d38258" + integrity sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw== + dependencies: + is-svg "^3.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + svgo "^1.0.0" + +postcss-unique-selectors@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac" + integrity sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg== + dependencies: + alphanum-sort "^1.0.0" + postcss "^7.0.0" + uniqs "^2.0.0" + +postcss-value-parser@^3.0.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" + integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== + +postcss-value-parser@^4.0.0, postcss-value-parser@^4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz#651ff4593aa9eda8d5d0d66593a2417aeaeb325d" + integrity sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg== + +postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz#da8b472d901da1e205b47bdc98637b9e9e550e5f" + integrity sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg== + dependencies: + flatten "^1.0.2" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss@7.0.21: + version "7.0.21" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.21.tgz#06bb07824c19c2021c5d056d5b10c35b989f7e17" + integrity sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + +postcss@^7, postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.23, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.5, postcss@^7.0.6: + version "7.0.27" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.27.tgz#cc67cdc6b0daa375105b7c424a85567345fc54d9" + integrity sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + +prepend-http@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= + +pretty-bytes@^5.1.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.3.0.tgz#f2849e27db79fb4d6cfe24764fc4134f165989f2" + integrity sha512-hjGrh+P926p4R4WbaB6OckyRtO0F0/lQBiT+0gnxjV+5kjPBrfVBFCsCLbMqVQeydvIoouYTCmmEURiH3R1Bdg== + +pretty-error@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.1.tgz#5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3" + integrity sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM= + dependencies: + renderkid "^2.0.1" + utila "~0.4" + +pretty-format@^24.0.0, pretty-format@^24.3.0, pretty-format@^24.8.0, pretty-format@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.9.0.tgz#12fac31b37019a4eea3c11aa9a959eb7628aa7c9" + integrity sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA== + dependencies: + "@jest/types" "^24.9.0" + ansi-regex "^4.0.0" + ansi-styles "^3.2.0" + react-is "^16.8.4" + +pretty-format@^25.1.0, pretty-format@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-25.5.0.tgz#7873c1d774f682c34b8d48b6743a2bf2ac55791a" + integrity sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ== + dependencies: + "@jest/types" "^25.5.0" + ansi-regex "^5.0.0" + ansi-styles "^4.0.0" + react-is "^16.12.0" + +private@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= + +promise-polyfill@8.1.3: + version "8.1.3" + resolved "https://registry.yarnpkg.com/promise-polyfill/-/promise-polyfill-8.1.3.tgz#8c99b3cf53f3a91c68226ffde7bde81d7f904116" + integrity sha512-MG5r82wBzh7pSKDRa9y+vllNHz3e3d4CNj1PQE4BQYxLme0gKYYBm9YENq+UkEikyZ0XbiGWxYlVw3Rl9O/U8g== + +promise@^7.1.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== + dependencies: + asap "~2.0.3" + +promise@^8.0.3: + version "8.1.0" + resolved "https://registry.yarnpkg.com/promise/-/promise-8.1.0.tgz#697c25c3dfe7435dd79fcd58c38a135888eaf05e" + integrity sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q== + dependencies: + asap "~2.0.6" + +prompts@^2.0.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.3.2.tgz#480572d89ecf39566d2bd3fe2c9fccb7c4c0b068" + integrity sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.4" + +prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.0, prop-types@^15.7.2: + version "15.7.2" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" + integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.8.1" + +protobufjs@^6.8.6: + version "6.10.1" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.10.1.tgz#e6a484dd8f04b29629e9053344e3970cccf13cd2" + integrity sha512-pb8kTchL+1Ceg4lFd5XUpK8PdWacbvV5SK2ULH2ebrYtl4GjJmS24m6CKME67jzV53tbJxHlnNOSqQHbTsR9JQ== + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.4" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.0" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.0" + "@types/long" "^4.0.1" + "@types/node" "^13.7.0" + long "^4.0.0" + +proxy-addr@~2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" + integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw== + dependencies: + forwarded "~0.1.2" + ipaddr.js "1.9.1" + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + +psl@^1.1.28: + version "1.7.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.7.0.tgz#f1c4c47a8ef97167dea5d6bbf4816d736e884a3c" + integrity sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ== + +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + +pump@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.3: + version "1.5.1" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= + +punycode@^1.2.4: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + +punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +q@^1.1.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= + +qs@6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" + integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== + +qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + +query-string@^4.1.0: + version "4.3.4" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" + integrity sha1-u7aTucqRXCMlFbIosaArYJBD2+s= + dependencies: + object-assign "^4.1.0" + strict-uri-encode "^1.0.0" + +query-string@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb" + integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw== + dependencies: + decode-uri-component "^0.2.0" + object-assign "^4.1.0" + strict-uri-encode "^1.0.0" + +querystring-es3@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + +querystringify@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.1.tgz#60e5a5fd64a7f8bfa4d2ab2ed6fdf4c85bad154e" + integrity sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA== + +ra-core@^3.7.1: + version "3.7.1" + resolved "https://registry.yarnpkg.com/ra-core/-/ra-core-3.7.1.tgz#369453d8cce3a1e8ef7d01a6bb2dcd6bbd5faa1c" + integrity sha512-T6gYppeTMoG4qbpD4cHJ76EQTuf0b6DedMSL8ekFuZdh+MDtpGywUlCzkcSQK9J4Ck31prtVvONXGm9uwEyEyg== + dependencies: + "@testing-library/react" "^8.0.7" + classnames "~2.2.5" + date-fns "^1.29.0" + eventemitter3 "^3.0.0" + inflection "~1.12.0" + lodash "~4.17.5" + prop-types "^15.6.1" + query-string "^5.1.1" + recompose "~0.26.0" + reselect "~3.0.0" + +ra-data-graphql@^3.6.1: + version "3.6.1" + resolved "https://registry.yarnpkg.com/ra-data-graphql/-/ra-data-graphql-3.6.1.tgz#680b90d939e301ee0db6eec763530ea4bbebb683" + integrity sha512-mEol0VlvgpIDTidWh0lmxBOFnFEXMybefIIOroj2FV9h39yTl877+Tm80GkhLrX/s0rpzwGMEB7nxWAUltyzVg== + dependencies: + apollo-client "^2.6.3" + apollo-client-preset "^1.0.8" + graphql-tag "^2.10.1" + lodash "~4.17.5" + pluralize "~7.0.0" + +ra-data-hasura-graphql@^0.1.12: + version "0.1.12" + resolved "https://registry.yarnpkg.com/ra-data-hasura-graphql/-/ra-data-hasura-graphql-0.1.12.tgz#5b512bd50bb84b1a0a387ed5b936cbd7592c8dc4" + integrity sha512-+UIv+glDABBYpg2O0ZrspOmen6CPzOCXzVaKPq1s7AZcYtgbkZgBhWa91O8HYa9cQf7trGnsLJStyC6BVO01zA== + dependencies: + graphql-ast-types-browser "~1.0.2" + kind-of ">=6.0.3" + lodash "~4.17.5" + minimist ">=1.2.3" + ra-data-graphql "^3.6.1" + +ra-i18n-polyglot@^3.7.1: + version "3.7.1" + resolved "https://registry.yarnpkg.com/ra-i18n-polyglot/-/ra-i18n-polyglot-3.7.1.tgz#68ae7ec78c43f2700dd0921d7263546ae35c5b34" + integrity sha512-BWYJKGp0nZP8ATsYqfWkvQpyaVx4KrYw/XT6Taf8HfhfPqZaiOQUhfw4a9co3Nm/0Gu3mFdHq5CVMDsEZL1r+w== + dependencies: + node-polyglot "^2.2.2" + ra-core "^3.7.1" + +ra-language-english@^3.7.1: + version "3.7.1" + resolved "https://registry.yarnpkg.com/ra-language-english/-/ra-language-english-3.7.1.tgz#ed1aa4dd827454572fcc43a53c3a2944d5619d68" + integrity sha512-85jgvpEdRgfQ1SVVVudUh7AOlmhbiLhT/iLn5tXO9N7HCudK7Fno37y+txjrPywki6Vs/XGkRLG/eNsrYmyMFQ== + dependencies: + ra-core "^3.7.1" + +ra-ui-materialui@^3.7.1: + version "3.7.1" + resolved "https://registry.yarnpkg.com/ra-ui-materialui/-/ra-ui-materialui-3.7.1.tgz#111883d4d27c197f3171e58a836811839619f509" + integrity sha512-EA5z/2fnqv1HTJuzXCoxZoCIgohHY+C+zVjDjEBQ/ABa/PosZT+epOsKK9Gn4gLuHbLHJCwdjcOZXJHH6F1jiQ== + dependencies: + autosuggest-highlight "^3.1.1" + classnames "~2.2.5" + connected-react-router "^6.5.2" + css-mediaquery "^0.1.2" + downshift "3.2.7" + inflection "~1.12.0" + jsonexport "^2.4.1" + lodash "~4.17.5" + prop-types "^15.7.0" + query-string "^5.1.1" + react-dropzone "^10.1.7" + react-transition-group "^4.3.0" + recompose "~0.26.0" + +raf@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" + integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA== + dependencies: + performance-now "^2.1.0" + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" + integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== + dependencies: + bytes "3.1.0" + http-errors "1.7.2" + iconv-lite "0.4.24" + unpipe "1.0.0" + +react-admin@^3.7.1: + version "3.7.1" + resolved "https://registry.yarnpkg.com/react-admin/-/react-admin-3.7.1.tgz#315573908361678125085005589c51512be2235e" + integrity sha512-eVOdvh7HIc83BmoFjZNTcRU5l9XNhk6rHn5vBu1zcl5i//91jPw0NTS1uxG18STjiERckh/DVphELC5tFRIGwA== + dependencies: + "@material-ui/core" "^4.3.3" + "@material-ui/icons" "^4.2.1" + "@material-ui/styles" "^4.3.3" + connected-react-router "^6.5.2" + final-form "^4.18.5" + final-form-arrays "^3.0.1" + ra-core "^3.7.1" + ra-i18n-polyglot "^3.7.1" + ra-language-english "^3.7.1" + ra-ui-materialui "^3.7.1" + react-final-form "^6.3.3" + react-final-form-arrays "^3.1.1" + react-redux "^7.1.0" + react-router "^5.1.0" + react-router-dom "^5.1.0" + redux "^3.7.2 || ^4.0.3" + redux-saga "^1.0.0" + +react-app-polyfill@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/react-app-polyfill/-/react-app-polyfill-1.0.6.tgz#890f8d7f2842ce6073f030b117de9130a5f385f0" + integrity sha512-OfBnObtnGgLGfweORmdZbyEz+3dgVePQBb3zipiaDsMHV1NpWm0rDFYIVXFV/AK+x4VIIfWHhrdMIeoTLyRr2g== + dependencies: + core-js "^3.5.0" + object-assign "^4.1.1" + promise "^8.0.3" + raf "^3.4.1" + regenerator-runtime "^0.13.3" + whatwg-fetch "^3.0.0" + +react-dev-utils@^10.2.1: + version "10.2.1" + resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-10.2.1.tgz#f6de325ae25fa4d546d09df4bb1befdc6dd19c19" + integrity sha512-XxTbgJnYZmxuPtY3y/UV0D8/65NKkmaia4rXzViknVnZeVlklSh8u6TnaEYPfAi/Gh1TP4mEOXHI6jQOPbeakQ== + dependencies: + "@babel/code-frame" "7.8.3" + address "1.1.2" + browserslist "4.10.0" + chalk "2.4.2" + cross-spawn "7.0.1" + detect-port-alt "1.1.6" + escape-string-regexp "2.0.0" + filesize "6.0.1" + find-up "4.1.0" + fork-ts-checker-webpack-plugin "3.1.1" + global-modules "2.0.0" + globby "8.0.2" + gzip-size "5.1.1" + immer "1.10.0" + inquirer "7.0.4" + is-root "2.1.0" + loader-utils "1.2.3" + open "^7.0.2" + pkg-up "3.1.0" + react-error-overlay "^6.0.7" + recursive-readdir "2.2.2" + shell-quote "1.7.2" + strip-ansi "6.0.0" + text-table "0.2.0" + +react-dom@^16.13.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.13.1.tgz#c1bd37331a0486c078ee54c4740720993b2e0e7f" + integrity sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + scheduler "^0.19.1" + +react-dropzone@^10.1.7: + version "10.2.2" + resolved "https://registry.yarnpkg.com/react-dropzone/-/react-dropzone-10.2.2.tgz#67b4db7459589a42c3b891a82eaf9ade7650b815" + integrity sha512-U5EKckXVt6IrEyhMMsgmHQiWTGLudhajPPG77KFSvgsMqNEHSyGpqWvOMc5+DhEah/vH4E1n+J5weBNLd5VtyA== + dependencies: + attr-accept "^2.0.0" + file-selector "^0.1.12" + prop-types "^15.7.2" + +react-error-overlay@^6.0.7: + version "6.0.7" + resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.7.tgz#1dcfb459ab671d53f660a991513cb2f0a0553108" + integrity sha512-TAv1KJFh3RhqxNvhzxj6LeT5NWklP6rDr2a0jaTfsZ5wSZWHOGeqQyejUp3xxLfPt2UpyJEcVQB/zyPcmonNFA== + +react-final-form-arrays@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/react-final-form-arrays/-/react-final-form-arrays-3.1.2.tgz#391ceee29d866f2128c807b510c6a17ff4dc72cc" + integrity sha512-ds1FUS8s3AnfbvfmBTPnjijS7veKBr6DrWOGQzDI7grE4OosVWOREwd2ZUkz3HPB3wXQcNWsqyDuQDBSMGUr2g== + dependencies: + "@babel/runtime" "^7.4.5" + +react-final-form@^6.3.3: + version "6.5.1" + resolved "https://registry.yarnpkg.com/react-final-form/-/react-final-form-6.5.1.tgz#baf798129d459c669cfda5ce60a77801ef52badc" + integrity sha512-+Hzd9PqYY1Cv3MnWzw64QOl5BjC5BtSDakx+N7Re49r0FASdFhgpXLFFCJ31fvegq2euP6hz6Ow9K6XM9BSqCA== + dependencies: + "@babel/runtime" "^7.10.0" + +react-is@^16.12.0, react-is@^16.5.2, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.0, react-is@^16.8.1, react-is@^16.8.4, react-is@^16.9.0: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-redux@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.2.0.tgz#f970f62192b3981642fec46fd0db18a074fe879d" + integrity sha512-EvCAZYGfOLqwV7gh849xy9/pt55rJXPwmYvI4lilPM5rUT/1NxuuN59ipdBksRVSvz0KInbPnp4IfoXJXCqiDA== + dependencies: + "@babel/runtime" "^7.5.5" + hoist-non-react-statics "^3.3.0" + loose-envify "^1.4.0" + prop-types "^15.7.2" + react-is "^16.9.0" + +react-router-dom@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.2.0.tgz#9e65a4d0c45e13289e66c7b17c7e175d0ea15662" + integrity sha512-gxAmfylo2QUjcwxI63RhQ5G85Qqt4voZpUXSEqCwykV0baaOTQDR1f0PmY8AELqIyVc0NEZUj0Gov5lNGcXgsA== + dependencies: + "@babel/runtime" "^7.1.2" + history "^4.9.0" + loose-envify "^1.3.1" + prop-types "^15.6.2" + react-router "5.2.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + +react-router@5.2.0, react-router@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.2.0.tgz#424e75641ca8747fbf76e5ecca69781aa37ea293" + integrity sha512-smz1DUuFHRKdcJC0jobGo8cVbhO3x50tCL4icacOlcwDOEQPq4TMqwx3sY1TP+DvtTgz4nm3thuo7A+BK2U0Dw== + dependencies: + "@babel/runtime" "^7.1.2" + history "^4.9.0" + hoist-non-react-statics "^3.1.0" + loose-envify "^1.3.1" + mini-create-react-context "^0.4.0" + path-to-regexp "^1.7.0" + prop-types "^15.6.2" + react-is "^16.6.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + +react-scripts@3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/react-scripts/-/react-scripts-3.4.1.tgz#f551298b5c71985cc491b9acf3c8e8c0ae3ada0a" + integrity sha512-JpTdi/0Sfd31mZA6Ukx+lq5j1JoKItX7qqEK4OiACjVQletM1P38g49d9/D0yTxp9FrSF+xpJFStkGgKEIRjlQ== + dependencies: + "@babel/core" "7.9.0" + "@svgr/webpack" "4.3.3" + "@typescript-eslint/eslint-plugin" "^2.10.0" + "@typescript-eslint/parser" "^2.10.0" + babel-eslint "10.1.0" + babel-jest "^24.9.0" + babel-loader "8.1.0" + babel-plugin-named-asset-import "^0.3.6" + babel-preset-react-app "^9.1.2" + camelcase "^5.3.1" + case-sensitive-paths-webpack-plugin "2.3.0" + css-loader "3.4.2" + dotenv "8.2.0" + dotenv-expand "5.1.0" + eslint "^6.6.0" + eslint-config-react-app "^5.2.1" + eslint-loader "3.0.3" + eslint-plugin-flowtype "4.6.0" + eslint-plugin-import "2.20.1" + eslint-plugin-jsx-a11y "6.2.3" + eslint-plugin-react "7.19.0" + eslint-plugin-react-hooks "^1.6.1" + file-loader "4.3.0" + fs-extra "^8.1.0" + html-webpack-plugin "4.0.0-beta.11" + identity-obj-proxy "3.0.0" + jest "24.9.0" + jest-environment-jsdom-fourteen "1.0.1" + jest-resolve "24.9.0" + jest-watch-typeahead "0.4.2" + mini-css-extract-plugin "0.9.0" + optimize-css-assets-webpack-plugin "5.0.3" + pnp-webpack-plugin "1.6.4" + postcss-flexbugs-fixes "4.1.0" + postcss-loader "3.0.0" + postcss-normalize "8.0.1" + postcss-preset-env "6.7.0" + postcss-safe-parser "4.0.1" + react-app-polyfill "^1.0.6" + react-dev-utils "^10.2.1" + resolve "1.15.0" + resolve-url-loader "3.1.1" + sass-loader "8.0.2" + semver "6.3.0" + style-loader "0.23.1" + terser-webpack-plugin "2.3.5" + ts-pnp "1.1.6" + url-loader "2.3.0" + webpack "4.42.0" + webpack-dev-server "3.10.3" + webpack-manifest-plugin "2.2.0" + workbox-webpack-plugin "4.3.1" + optionalDependencies: + fsevents "2.1.2" + +react-transition-group@^4.3.0, react-transition-group@^4.4.0: + version "4.4.1" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.1.tgz#63868f9325a38ea5ee9535d828327f85773345c9" + integrity sha512-Djqr7OQ2aPUiYurhPalTrVy9ddmFCCzwhqQmtN+J3+3DzLO209Fdr70QrN8Z3DsglWql6iY1lDWAfpFiBtuKGw== + dependencies: + "@babel/runtime" "^7.5.5" + dom-helpers "^5.0.1" + loose-envify "^1.4.0" + prop-types "^15.6.2" + +react@^16.13.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react/-/react-16.13.1.tgz#2e818822f1a9743122c063d6410d85c1e3afe48e" + integrity sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + +read-pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= + dependencies: + find-up "^2.0.0" + read-pkg "^2.0.0" + +read-pkg-up@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-4.0.0.tgz#1b221c6088ba7799601c808f91161c66e58f8978" + integrity sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA== + dependencies: + find-up "^3.0.0" + read-pkg "^3.0.0" + +read-pkg@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= + dependencies: + load-json-file "^2.0.0" + normalize-package-data "^2.3.2" + path-type "^2.0.0" + +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.0.6, readable-stream@^3.1.1: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + +readdirp@~3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.3.0.tgz#984458d13a1e42e2e9f5841b129e162f369aff17" + integrity sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ== + dependencies: + picomatch "^2.0.7" + +realpath-native@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.1.0.tgz#2003294fea23fb0672f2476ebe22fcf498a2d65c" + integrity sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA== + dependencies: + util.promisify "^1.0.0" + +recompose@~0.26.0: + version "0.26.0" + resolved "https://registry.yarnpkg.com/recompose/-/recompose-0.26.0.tgz#9babff039cb72ba5bd17366d55d7232fbdfb2d30" + integrity sha512-KwOu6ztO0mN5vy3+zDcc45lgnaUoaQse/a5yLVqtzTK13czSWnFGmXbQVmnoMgDkI5POd1EwIKSbjU1V7xdZog== + dependencies: + change-emitter "^0.1.2" + fbjs "^0.8.1" + hoist-non-react-statics "^2.3.1" + symbol-observable "^1.0.4" + +recursive-readdir@2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.2.tgz#9946fb3274e1628de6e36b2f6714953b4845094f" + integrity sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg== + dependencies: + minimatch "3.0.4" + +redent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== + dependencies: + indent-string "^4.0.0" + strip-indent "^3.0.0" + +redux-saga@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/redux-saga/-/redux-saga-1.1.3.tgz#9f3e6aebd3c994bbc0f6901a625f9a42b51d1112" + integrity sha512-RkSn/z0mwaSa5/xH/hQLo8gNf4tlvT18qXDNvedihLcfzh+jMchDgaariQoehCpgRltEm4zHKJyINEz6aqswTw== + dependencies: + "@redux-saga/core" "^1.1.3" + +"redux@^3.7.2 || ^4.0.3", redux@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/redux/-/redux-4.0.5.tgz#4db5de5816e17891de8a80c424232d06f051d93f" + integrity sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w== + dependencies: + loose-envify "^1.4.0" + symbol-observable "^1.2.0" + +regenerate-unicode-properties@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" + integrity sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA== + dependencies: + regenerate "^1.4.0" + +regenerate@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" + integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== + +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== + +regenerator-runtime@^0.13.3, regenerator-runtime@^0.13.4: + version "0.13.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697" + integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA== + +regenerator-transform@^0.14.2: + version "0.14.4" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.4.tgz#5266857896518d1616a78a0479337a30ea974cc7" + integrity sha512-EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw== + dependencies: + "@babel/runtime" "^7.8.4" + private "^0.1.8" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regex-parser@2.2.10: + version "2.2.10" + resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.10.tgz#9e66a8f73d89a107616e63b39d4deddfee912b37" + integrity sha512-8t6074A68gHfU8Neftl0Le6KTDwfGAj7IyjPIMSfikI2wJUTHDMaIq42bUsfVnj8mhx0R+45rdUXHGpN164avA== + +regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz#7aba89b3c13a64509dabcf3ca8d9fbb9bdf5cb75" + integrity sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + +regexpp@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" + integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== + +regexpp@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.0.0.tgz#dd63982ee3300e67b41c1956f850aa680d9d330e" + integrity sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g== + +regexpu-core@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.0.tgz#fcbf458c50431b0bb7b45d6967b8192d91f3d938" + integrity sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ== + dependencies: + regenerate "^1.4.0" + regenerate-unicode-properties "^8.2.0" + regjsgen "^0.5.1" + regjsparser "^0.6.4" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.2.0" + +regjsgen@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.1.tgz#48f0bf1a5ea205196929c0d9798b42d1ed98443c" + integrity sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg== + +regjsparser@^0.6.4: + version "0.6.4" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.4.tgz#a769f8684308401a66e9b529d2436ff4d0666272" + integrity sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw== + dependencies: + jsesc "~0.5.0" + +relateurl@^0.2.7: + version "0.2.7" + resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + +renderkid@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.3.tgz#380179c2ff5ae1365c522bf2fcfcff01c5b74149" + integrity sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA== + dependencies: + css-select "^1.1.0" + dom-converter "^0.2" + htmlparser2 "^3.3.0" + strip-ansi "^3.0.0" + utila "^0.4.0" + +repeat-element@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +request-promise-core@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.3.tgz#e9a3c081b51380dfea677336061fea879a829ee9" + integrity sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ== + dependencies: + lodash "^4.17.15" + +request-promise-native@^1.0.5: + version "1.0.8" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.8.tgz#a455b960b826e44e2bf8999af64dff2bfe58cb36" + integrity sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ== + dependencies: + request-promise-core "1.1.3" + stealthy-require "^1.1.1" + tough-cookie "^2.3.3" + +request@^2.87.0, request@^2.88.0: + version "2.88.2" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-main-filename@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= + +reselect@~3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/reselect/-/reselect-3.0.1.tgz#efdaa98ea7451324d092b2b2163a6a1d7a9a2147" + integrity sha1-79qpjqdFEyTQkrKyFjpqHXqaIUc= + +resolve-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= + dependencies: + resolve-from "^3.0.0" + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha1-six699nWiBvItuZTM17rywoYh0g= + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-pathname@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd" + integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== + +resolve-url-loader@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-3.1.1.tgz#28931895fa1eab9be0647d3b2958c100ae3c0bf0" + integrity sha512-K1N5xUjj7v0l2j/3Sgs5b8CjrrgtC70SmdCuZiJ8tSyb5J+uk3FoeZ4b7yTnH6j7ngI+Bc5bldHJIa8hYdu2gQ== + dependencies: + adjust-sourcemap-loader "2.0.0" + camelcase "5.3.1" + compose-function "3.0.3" + convert-source-map "1.7.0" + es6-iterator "2.0.3" + loader-utils "1.2.3" + postcss "7.0.21" + rework "1.0.1" + rework-visit "1.0.0" + source-map "0.6.1" + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +resolve@1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= + +resolve@1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.0.tgz#1b7ca96073ebb52e741ffd799f6b39ea462c67f5" + integrity sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw== + dependencies: + path-parse "^1.0.6" + +resolve@^1.10.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.15.1, resolve@^1.3.2, resolve@^1.8.1: + version "1.15.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8" + integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w== + dependencies: + path-parse "^1.0.6" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= + +rework-visit@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rework-visit/-/rework-visit-1.0.0.tgz#9945b2803f219e2f7aca00adb8bc9f640f842c9a" + integrity sha1-mUWygD8hni96ygCtuLyfZA+ELJo= + +rework@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/rework/-/rework-1.0.1.tgz#30806a841342b54510aa4110850cd48534144aa7" + integrity sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc= + dependencies: + convert-source-map "^0.3.3" + css "^2.0.0" + +rgb-regex@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" + integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE= + +rgba-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" + integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= + +rimraf@2.6.3: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + +rimraf@^2.5.4, rimraf@^2.6.3, rimraf@^2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +rsvp@^4.8.4: + version "4.8.5" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" + integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== + +run-async@^2.2.0, run-async@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.0.tgz#e59054a5b86876cfae07f431d18cbaddc594f1e8" + integrity sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg== + dependencies: + is-promise "^2.1.0" + +run-queue@^1.0.0, run-queue@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= + dependencies: + aproba "^1.1.1" + +rxjs@^6.5.3: + version "6.5.4" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.4.tgz#e0777fe0d184cec7872df147f303572d414e211c" + integrity sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q== + dependencies: + tslib "^1.9.0" + +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" + integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sane@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" + integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== + dependencies: + "@cnakazawa/watch" "^1.0.3" + anymatch "^2.0.0" + capture-exit "^2.0.0" + exec-sh "^0.3.2" + execa "^1.0.0" + fb-watchman "^2.0.0" + micromatch "^3.1.4" + minimist "^1.1.1" + walker "~1.0.5" + +sanitize.css@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/sanitize.css/-/sanitize.css-10.0.0.tgz#b5cb2547e96d8629a60947544665243b1dc3657a" + integrity sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg== + +sass-loader@8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-8.0.2.tgz#debecd8c3ce243c76454f2e8290482150380090d" + integrity sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ== + dependencies: + clone-deep "^4.0.1" + loader-utils "^1.2.3" + neo-async "^2.6.1" + schema-utils "^2.6.1" + semver "^6.3.0" + +sax@^1.2.4, sax@~1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +saxes@^3.1.9: + version "3.1.11" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-3.1.11.tgz#d59d1fd332ec92ad98a2e0b2ee644702384b1c5b" + integrity sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g== + dependencies: + xmlchars "^2.1.1" + +scheduler@^0.19.1: + version "0.19.1" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.1.tgz#4f3e2ed2c1a7d65681f4c854fa8c5a1ccb40f196" + integrity sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +schema-utils@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== + dependencies: + ajv "^6.1.0" + ajv-errors "^1.0.0" + ajv-keywords "^3.1.0" + +schema-utils@^2.5.0, schema-utils@^2.6.0, schema-utils@^2.6.1, schema-utils@^2.6.4, schema-utils@^2.6.5: + version "2.6.5" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.6.5.tgz#c758f0a7e624263073d396e29cd40aa101152d8a" + integrity sha512-5KXuwKziQrTVHh8j/Uxz+QUbxkaLW9X/86NBlx/gnKgtsZA2GIVMUn17qWhRFwF8jdYb3Dig5hRO/W5mZqy6SQ== + dependencies: + ajv "^6.12.0" + ajv-keywords "^3.4.1" + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= + +selfsigned@^1.10.7: + version "1.10.7" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.7.tgz#da5819fd049d5574f28e88a9bcc6dbc6e6f3906b" + integrity sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA== + dependencies: + node-forge "0.9.0" + +"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@6.3.0, semver@^6.0.0, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + +send@0.17.1: + version "0.17.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" + integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.7.2" + mime "1.6.0" + ms "2.1.1" + on-finished "~2.3.0" + range-parser "~1.2.1" + statuses "~1.5.0" + +serialize-javascript@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.2.tgz#ecec53b0e0317bdc95ef76ab7074b7384785fa61" + integrity sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ== + +serve-index@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + +serve-static@1.14.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" + integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.17.1" + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setimmediate@^1.0.4, setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shallow-clone@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-0.1.2.tgz#5909e874ba77106d73ac414cfec1ffca87d97060" + integrity sha1-WQnodLp3EG1zrEFM/sH/yofZcGA= + dependencies: + is-extendable "^0.1.1" + kind-of "^2.0.1" + lazy-cache "^0.2.3" + mixin-object "^2.0.1" + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" + integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== + +shellwords@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" + integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== + +side-channel@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.2.tgz#df5d1abadb4e4bf4af1cd8852bf132d2f7876947" + integrity sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA== + dependencies: + es-abstract "^1.17.0-next.1" + object-inspect "^1.7.0" + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= + +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= + dependencies: + is-arrayish "^0.3.1" + +sisteransi@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= + +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slice-ansi@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" + integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== + dependencies: + ansi-styles "^3.2.0" + astral-regex "^1.0.0" + is-fullwidth-code-point "^2.0.0" + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +sockjs-client@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.4.0.tgz#c9f2568e19c8fd8173b4997ea3420e0bb306c7d5" + integrity sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g== + dependencies: + debug "^3.2.5" + eventsource "^1.0.7" + faye-websocket "~0.11.1" + inherits "^2.0.3" + json3 "^3.3.2" + url-parse "^1.4.3" + +sockjs@0.3.19: + version "0.3.19" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.19.tgz#d976bbe800af7bd20ae08598d582393508993c0d" + integrity sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw== + dependencies: + faye-websocket "^0.10.0" + uuid "^3.0.1" + +sort-keys@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" + integrity sha1-RBttTTRnmPG05J6JIK37oOVD+a0= + dependencies: + is-plain-obj "^1.0.0" + +source-list-map@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== + +source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@^0.5.6, source-map-support@~0.5.12: + version "0.5.16" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" + integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + +source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@^0.5.0, source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +spdx-correct@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" + integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" + integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== + +spdx-expression-parse@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" + integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.5" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" + integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== + +spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" + integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== + dependencies: + debug "^4.1.0" + detect-node "^2.0.4" + hpack.js "^2.1.6" + obuf "^1.1.2" + readable-stream "^3.0.6" + wbuf "^1.7.3" + +spdy@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.1.tgz#6f12ed1c5db7ea4f24ebb8b89ba58c87c08257f2" + integrity sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA== + dependencies: + debug "^4.1.0" + handle-thing "^2.0.0" + http-deceiver "^1.2.7" + select-hose "^2.0.0" + spdy-transport "^3.0.0" + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +sshpk@^1.7.0: + version "1.16.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +ssri@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" + integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== + dependencies: + figgy-pudding "^3.5.1" + +ssri@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-7.1.0.tgz#92c241bf6de82365b5c7fb4bd76e975522e1294d" + integrity sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g== + dependencies: + figgy-pudding "^3.5.1" + minipass "^3.1.1" + +stable@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== + +stack-utils@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8" + integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA== + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +stealthy-require@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= + +stream-browserify@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" + integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-each@^1.1.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" + integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== + dependencies: + end-of-stream "^1.1.0" + stream-shift "^1.0.0" + +stream-http@^2.7.2: + version "2.8.3" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.3.6" + to-arraybuffer "^1.0.0" + xtend "^4.0.0" + +stream-shift@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" + integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== + +strict-uri-encode@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" + integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= + +string-length@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed" + integrity sha1-1A27aGo6zpYMHP/KVivyxF+DY+0= + dependencies: + astral-regex "^1.0.0" + strip-ansi "^4.0.0" + +string-length@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-3.1.0.tgz#107ef8c23456e187a8abd4a61162ff4ac6e25837" + integrity sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA== + dependencies: + astral-regex "^1.0.0" + strip-ansi "^5.2.0" + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +string-width@^2.0.0, string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string-width@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" + integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" + +string.prototype.matchall@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz#48bb510326fb9fdeb6a33ceaa81a6ea04ef7648e" + integrity sha512-N/jp6O5fMf9os0JU3E72Qhf590RSRZU/ungsL/qJUYVTNv7hTG0P/dbPjxINVN9jpscu3nzYwKESU3P3RY5tOg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0" + has-symbols "^1.0.1" + internal-slot "^1.0.2" + regexp.prototype.flags "^1.3.0" + side-channel "^1.0.2" + +string.prototype.trim@^1.1.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.1.tgz#141233dff32c82bfad80684d7e5f0869ee0fb782" + integrity sha512-MjGFEeqixw47dAMFMtgUro/I0+wNqZB5GKXGt1fFr24u3TzDXCPu7J9Buppzoe3r/LqkSDLDDJzE15RGWDGAVw== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + function-bind "^1.1.1" + +string.prototype.trimleft@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz#9bdb8ac6abd6d602b17a4ed321870d2f8dcefc74" + integrity sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag== + dependencies: + define-properties "^1.1.3" + function-bind "^1.1.1" + +string.prototype.trimright@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz#440314b15996c866ce8a0341894d45186200c5d9" + integrity sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g== + dependencies: + define-properties "^1.1.3" + function-bind "^1.1.1" + +string_decoder@^1.0.0, string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +stringify-object@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" + integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== + dependencies: + get-own-enumerable-property-symbols "^3.0.0" + is-obj "^1.0.1" + is-regexp "^1.0.0" + +strip-ansi@6.0.0, strip-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + dependencies: + ansi-regex "^5.0.0" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + +strip-comments@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/strip-comments/-/strip-comments-1.0.2.tgz#82b9c45e7f05873bee53f37168af930aa368679d" + integrity sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw== + dependencies: + babel-extract-comments "^1.0.0" + babel-plugin-transform-object-rest-spread "^6.26.0" + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" + +strip-json-comments@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" + integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== + +style-loader@0.23.1: + version "0.23.1" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.23.1.tgz#cb9154606f3e771ab6c4ab637026a1049174d925" + integrity sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg== + dependencies: + loader-utils "^1.1.0" + schema-utils "^1.0.0" + +stylehacks@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5" + integrity sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g== + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.0.0, supports-color@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" + integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== + dependencies: + has-flag "^4.0.0" + +svg-parser@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" + integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== + +svgo@^1.0.0, svgo@^1.2.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" + integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw== + dependencies: + chalk "^2.4.1" + coa "^2.0.2" + css-select "^2.0.0" + css-select-base-adapter "^0.1.1" + css-tree "1.0.0-alpha.37" + csso "^4.0.2" + js-yaml "^3.13.1" + mkdirp "~0.5.1" + object.values "^1.1.0" + sax "~1.2.4" + stable "^0.1.8" + unquote "~1.1.1" + util.promisify "~1.0.0" + +symbol-observable@^1.0.2, symbol-observable@^1.0.4, symbol-observable@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" + integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== + +symbol-tree@^3.2.2: + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + +table@^5.2.3: + version "5.4.6" + resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" + integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== + dependencies: + ajv "^6.10.2" + lodash "^4.17.14" + slice-ansi "^2.1.0" + string-width "^3.0.0" + +tapable@^1.0.0, tapable@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== + +terser-webpack-plugin@2.3.5: + version "2.3.5" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-2.3.5.tgz#5ad971acce5c517440ba873ea4f09687de2f4a81" + integrity sha512-WlWksUoq+E4+JlJ+h+U+QUzXpcsMSSNXkDy9lBVkSqDn1w23Gg29L/ary9GeJVYCGiNJJX7LnVc4bwL1N3/g1w== + dependencies: + cacache "^13.0.1" + find-cache-dir "^3.2.0" + jest-worker "^25.1.0" + p-limit "^2.2.2" + schema-utils "^2.6.4" + serialize-javascript "^2.1.2" + source-map "^0.6.1" + terser "^4.4.3" + webpack-sources "^1.4.3" + +terser-webpack-plugin@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz#5ecaf2dbdc5fb99745fd06791f46fc9ddb1c9a7c" + integrity sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA== + dependencies: + cacache "^12.0.2" + find-cache-dir "^2.1.0" + is-wsl "^1.1.0" + schema-utils "^1.0.0" + serialize-javascript "^2.1.2" + source-map "^0.6.1" + terser "^4.1.2" + webpack-sources "^1.4.0" + worker-farm "^1.7.0" + +terser@^4.1.2, terser@^4.4.3, terser@^4.6.3: + version "4.6.7" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.6.7.tgz#478d7f9394ec1907f0e488c5f6a6a9a2bad55e72" + integrity sha512-fmr7M1f7DBly5cX2+rFDvmGBAaaZyPrHYK4mMdHEDAdNTqXSZgSOfqsfGq2HqPGT/1V0foZZuCZFx8CHKgAk3g== + dependencies: + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" + +test-exclude@^5.2.3: + version "5.2.3" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.2.3.tgz#c3d3e1e311eb7ee405e092dac10aefd09091eac0" + integrity sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g== + dependencies: + glob "^7.1.3" + minimatch "^3.0.4" + read-pkg-up "^4.0.0" + require-main-filename "^2.0.0" + +text-table@0.2.0, text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +throat@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" + integrity sha1-iQN8vJLFarGJJua6TLsgDhVnKmo= + +through2@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +thunky@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" + integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== + +timers-browserify@^2.0.4: + version "2.0.11" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.11.tgz#800b1f3eee272e5bc53ee465a04d0e804c31211f" + integrity sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ== + dependencies: + setimmediate "^1.0.4" + +timsort@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" + integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= + +tiny-invariant@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.1.0.tgz#634c5f8efdc27714b7f386c35e6760991d230875" + integrity sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw== + +tiny-warning@^1.0.0, tiny-warning@^1.0.2, tiny-warning@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" + integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +tmpl@1.0.x: + version "1.0.4" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" + integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + +tough-cookie@^2.3.3, tough-cookie@^2.3.4, tough-cookie@^2.5.0, tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= + dependencies: + punycode "^2.1.0" + +ts-invariant@^0.4.0, ts-invariant@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.4.4.tgz#97a523518688f93aafad01b0e80eb803eb2abd86" + integrity sha512-uEtWkFM/sdZvRNNDL3Ehu4WVpwaulhwQszV8mrtcdeE8nN00BV9mAmQ88RkrBhFgl9gMgvjJLAQcZbnPXI9mlA== + dependencies: + tslib "^1.9.3" + +ts-pnp@1.1.6, ts-pnp@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.1.6.tgz#389a24396d425a0d3162e96d2b4638900fdc289a" + integrity sha512-CrG5GqAAzMT7144Cl+UIFP7mz/iIhiy+xQ6GGcnjTezhALT02uPMRw7tgDSESgB5MsfKt55+GPWw4ir1kVtMIQ== + +tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0: + version "1.11.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35" + integrity sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA== + +tslib@^1.11.1, tslib@^1.9.3: + version "1.13.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" + integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== + +tsutils@^3.17.1: + version "3.17.1" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759" + integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g== + dependencies: + tslib "^1.8.1" + +tty-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + dependencies: + prelude-ls "~1.1.2" + +type-fest@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" + integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== + +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + +type-is@~1.6.17, type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +type@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" + integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== + +type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/type/-/type-2.0.0.tgz#5f16ff6ef2eb44f260494dae271033b29c09a9c3" + integrity sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow== + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + +typescript-compare@^0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/typescript-compare/-/typescript-compare-0.0.2.tgz#7ee40a400a406c2ea0a7e551efd3309021d5f425" + integrity sha512-8ja4j7pMHkfLJQO2/8tut7ub+J3Lw2S3061eJLFQcvs3tsmJKp8KG5NtpLn7KcY2w08edF74BSVN7qJS0U6oHA== + dependencies: + typescript-logic "^0.0.0" + +typescript-logic@^0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/typescript-logic/-/typescript-logic-0.0.0.tgz#66ebd82a2548f2b444a43667bec120b496890196" + integrity sha512-zXFars5LUkI3zP492ls0VskH3TtdeHCqu0i7/duGt60i5IGPIpAHE/DWo5FqJ6EjQ15YKXrt+AETjv60Dat34Q== + +typescript-tuple@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/typescript-tuple/-/typescript-tuple-2.2.1.tgz#7d9813fb4b355f69ac55032e0363e8bb0f04dad2" + integrity sha512-Zcr0lbt8z5ZdEzERHAMAniTiIKerFCMgd7yjq1fPnDJ43et/k9twIFQMUYff9k5oXcsQ0WpvFcgzK2ZKASoW6Q== + dependencies: + typescript-compare "^0.0.2" + +ua-parser-js@^0.7.18: + version "0.7.21" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.21.tgz#853cf9ce93f642f67174273cc34565ae6f308777" + integrity sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ== + +unicode-canonical-property-names-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== + +unicode-match-property-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" + +unicode-match-property-value-ecmascript@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531" + integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ== + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4" + integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg== + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= + +uniqs@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" + integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI= + +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== + dependencies: + imurmurhash "^0.1.4" + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +unquote@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" + integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +upath@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== + +uri-js@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +url-loader@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-2.3.0.tgz#e0e2ef658f003efb8ca41b0f3ffbf76bab88658b" + integrity sha512-goSdg8VY+7nPZKUEChZSEtW5gjbS66USIGCeSJ1OVOJ7Yfuh/36YxCwMi5HVEJh6mqUYOoy3NJ0vlOMrWsSHog== + dependencies: + loader-utils "^1.2.3" + mime "^2.4.4" + schema-utils "^2.5.0" + +url-parse@^1.4.3: + version "1.4.7" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.7.tgz#a8a83535e8c00a316e403a5db4ac1b9b853ae278" + integrity sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +util.promisify@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" + integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== + dependencies: + define-properties "^1.1.2" + object.getownpropertydescriptors "^2.0.3" + +util.promisify@^1.0.0, util.promisify@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" + integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.2" + has-symbols "^1.0.1" + object.getownpropertydescriptors "^2.1.0" + +util@0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= + dependencies: + inherits "2.0.1" + +util@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" + integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== + dependencies: + inherits "2.0.3" + +utila@^0.4.0, utila@~0.4: + version "0.4.0" + resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" + integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw= + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + +uuid@^3.0.1, uuid@^3.3.2: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +v8-compile-cache@^2.0.3: + version "2.1.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e" + integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g== + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +value-equal@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c" + integrity sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw== + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + +vendors@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e" + integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w== + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +vm-browserify@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== + +w3c-hr-time@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" + integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== + dependencies: + browser-process-hrtime "^1.0.0" + +w3c-xmlserializer@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz#30485ca7d70a6fd052420a3d12fd90e6339ce794" + integrity sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg== + dependencies: + domexception "^1.0.1" + webidl-conversions "^4.0.2" + xml-name-validator "^3.0.0" + +wait-for-expect@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/wait-for-expect/-/wait-for-expect-1.3.0.tgz#65241ce355425f907f5d127bdb5e72c412ff830c" + integrity sha512-8fJU7jiA96HfGPt+P/UilelSAZfhMBJ52YhKzlmZQvKEZU2EcD1GQ0yqGB6liLdHjYtYAoGVigYwdxr5rktvzA== + +wait-for-expect@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/wait-for-expect/-/wait-for-expect-3.0.2.tgz#d2f14b2f7b778c9b82144109c8fa89ceaadaa463" + integrity sha512-cfS1+DZxuav1aBYbaO/kE06EOS8yRw7qOFoD3XtjTkYvCvh3zUvNST8DXK/nPaeqIzIv3P3kL3lRJn8iwOiSag== + +walker@^1.0.7, walker@~1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" + integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= + dependencies: + makeerror "1.0.x" + +warning@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" + integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== + dependencies: + loose-envify "^1.0.0" + +watchpack@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" + integrity sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA== + dependencies: + chokidar "^2.0.2" + graceful-fs "^4.1.2" + neo-async "^2.5.0" + +wbuf@^1.1.0, wbuf@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== + dependencies: + minimalistic-assert "^1.0.0" + +webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== + +webpack-dev-middleware@^3.7.2: + version "3.7.2" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz#0019c3db716e3fa5cecbf64f2ab88a74bab331f3" + integrity sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw== + dependencies: + memory-fs "^0.4.1" + mime "^2.4.4" + mkdirp "^0.5.1" + range-parser "^1.2.1" + webpack-log "^2.0.0" + +webpack-dev-server@3.10.3: + version "3.10.3" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.10.3.tgz#f35945036813e57ef582c2420ef7b470e14d3af0" + integrity sha512-e4nWev8YzEVNdOMcNzNeCN947sWJNd43E5XvsJzbAL08kGc2frm1tQ32hTJslRS+H65LCb/AaUCYU7fjHCpDeQ== + dependencies: + ansi-html "0.0.7" + bonjour "^3.5.0" + chokidar "^2.1.8" + compression "^1.7.4" + connect-history-api-fallback "^1.6.0" + debug "^4.1.1" + del "^4.1.1" + express "^4.17.1" + html-entities "^1.2.1" + http-proxy-middleware "0.19.1" + import-local "^2.0.0" + internal-ip "^4.3.0" + ip "^1.1.5" + is-absolute-url "^3.0.3" + killable "^1.0.1" + loglevel "^1.6.6" + opn "^5.5.0" + p-retry "^3.0.1" + portfinder "^1.0.25" + schema-utils "^1.0.0" + selfsigned "^1.10.7" + semver "^6.3.0" + serve-index "^1.9.1" + sockjs "0.3.19" + sockjs-client "1.4.0" + spdy "^4.0.1" + strip-ansi "^3.0.1" + supports-color "^6.1.0" + url "^0.11.0" + webpack-dev-middleware "^3.7.2" + webpack-log "^2.0.0" + ws "^6.2.1" + yargs "12.0.5" + +webpack-log@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" + integrity sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg== + dependencies: + ansi-colors "^3.0.0" + uuid "^3.3.2" + +webpack-manifest-plugin@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/webpack-manifest-plugin/-/webpack-manifest-plugin-2.2.0.tgz#19ca69b435b0baec7e29fbe90fb4015de2de4f16" + integrity sha512-9S6YyKKKh/Oz/eryM1RyLVDVmy3NSPV0JXMRhZ18fJsq+AwGxUY34X54VNwkzYcEmEkDwNxuEOboCZEebJXBAQ== + dependencies: + fs-extra "^7.0.0" + lodash ">=3.5 <5" + object.entries "^1.1.0" + tapable "^1.0.0" + +webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack-sources@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" + integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack@4.42.0: + version "4.42.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.42.0.tgz#b901635dd6179391d90740a63c93f76f39883eb8" + integrity sha512-EzJRHvwQyBiYrYqhyjW9AqM90dE4+s1/XtCfn7uWg6cS72zH+2VPFAlsnW0+W0cDi0XRjNKUMoJtpSi50+Ph6w== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-module-context" "1.8.5" + "@webassemblyjs/wasm-edit" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" + acorn "^6.2.1" + ajv "^6.10.2" + ajv-keywords "^3.4.1" + chrome-trace-event "^1.0.2" + enhanced-resolve "^4.1.0" + eslint-scope "^4.0.3" + json-parse-better-errors "^1.0.2" + loader-runner "^2.4.0" + loader-utils "^1.2.3" + memory-fs "^0.4.1" + micromatch "^3.1.10" + mkdirp "^0.5.1" + neo-async "^2.6.1" + node-libs-browser "^2.2.1" + schema-utils "^1.0.0" + tapable "^1.1.3" + terser-webpack-plugin "^1.4.3" + watchpack "^1.6.0" + webpack-sources "^1.4.1" + +websocket-driver@>=0.5.1: + version "0.7.3" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.3.tgz#a2d4e0d4f4f116f1e6297eba58b05d430100e9f9" + integrity sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg== + dependencies: + http-parser-js ">=0.4.0 <0.4.11" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" + integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg== + +whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3, whatwg-encoding@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== + dependencies: + iconv-lite "0.4.24" + +whatwg-fetch@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" + integrity sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng== + +whatwg-fetch@>=0.10.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.2.0.tgz#8e134f701f0a4ab5fda82626f113e2b647fd16dc" + integrity sha512-SdGPoQMMnzVYThUbSrEvqTlkvC1Ux27NehaJ/GUHBfNrh5Mjg+1/uRyFMwVnxO2MrikMWvWAqUGgQOfVU4hT7w== + +whatwg-fetch@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb" + integrity sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q== + +whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0, whatwg-mimetype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== + +whatwg-url@^6.4.1: + version "6.5.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" + integrity sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +whatwg-url@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" + integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +which@^1.2.9, which@^1.3.0, which@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +word-wrap@~1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +workbox-background-sync@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-background-sync/-/workbox-background-sync-4.3.1.tgz#26821b9bf16e9e37fd1d640289edddc08afd1950" + integrity sha512-1uFkvU8JXi7L7fCHVBEEnc3asPpiAL33kO495UMcD5+arew9IbKW2rV5lpzhoWcm/qhGB89YfO4PmB/0hQwPRg== + dependencies: + workbox-core "^4.3.1" + +workbox-broadcast-update@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-broadcast-update/-/workbox-broadcast-update-4.3.1.tgz#e2c0280b149e3a504983b757606ad041f332c35b" + integrity sha512-MTSfgzIljpKLTBPROo4IpKjESD86pPFlZwlvVG32Kb70hW+aob4Jxpblud8EhNb1/L5m43DUM4q7C+W6eQMMbA== + dependencies: + workbox-core "^4.3.1" + +workbox-build@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-build/-/workbox-build-4.3.1.tgz#414f70fb4d6de47f6538608b80ec52412d233e64" + integrity sha512-UHdwrN3FrDvicM3AqJS/J07X0KXj67R8Cg0waq1MKEOqzo89ap6zh6LmaLnRAjpB+bDIz+7OlPye9iii9KBnxw== + dependencies: + "@babel/runtime" "^7.3.4" + "@hapi/joi" "^15.0.0" + common-tags "^1.8.0" + fs-extra "^4.0.2" + glob "^7.1.3" + lodash.template "^4.4.0" + pretty-bytes "^5.1.0" + stringify-object "^3.3.0" + strip-comments "^1.0.2" + workbox-background-sync "^4.3.1" + workbox-broadcast-update "^4.3.1" + workbox-cacheable-response "^4.3.1" + workbox-core "^4.3.1" + workbox-expiration "^4.3.1" + workbox-google-analytics "^4.3.1" + workbox-navigation-preload "^4.3.1" + workbox-precaching "^4.3.1" + workbox-range-requests "^4.3.1" + workbox-routing "^4.3.1" + workbox-strategies "^4.3.1" + workbox-streams "^4.3.1" + workbox-sw "^4.3.1" + workbox-window "^4.3.1" + +workbox-cacheable-response@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-cacheable-response/-/workbox-cacheable-response-4.3.1.tgz#f53e079179c095a3f19e5313b284975c91428c91" + integrity sha512-Rp5qlzm6z8IOvnQNkCdO9qrDgDpoPNguovs0H8C+wswLuPgSzSp9p2afb5maUt9R1uTIwOXrVQMmPfPypv+npw== + dependencies: + workbox-core "^4.3.1" + +workbox-core@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-core/-/workbox-core-4.3.1.tgz#005d2c6a06a171437afd6ca2904a5727ecd73be6" + integrity sha512-I3C9jlLmMKPxAC1t0ExCq+QoAMd0vAAHULEgRZ7kieCdUd919n53WC0AfvokHNwqRhGn+tIIj7vcb5duCjs2Kg== + +workbox-expiration@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-expiration/-/workbox-expiration-4.3.1.tgz#d790433562029e56837f341d7f553c4a78ebe921" + integrity sha512-vsJLhgQsQouv9m0rpbXubT5jw0jMQdjpkum0uT+d9tTwhXcEZks7qLfQ9dGSaufTD2eimxbUOJfWLbNQpIDMPw== + dependencies: + workbox-core "^4.3.1" + +workbox-google-analytics@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-google-analytics/-/workbox-google-analytics-4.3.1.tgz#9eda0183b103890b5c256e6f4ea15a1f1548519a" + integrity sha512-xzCjAoKuOb55CBSwQrbyWBKqp35yg1vw9ohIlU2wTy06ZrYfJ8rKochb1MSGlnoBfXGWss3UPzxR5QL5guIFdg== + dependencies: + workbox-background-sync "^4.3.1" + workbox-core "^4.3.1" + workbox-routing "^4.3.1" + workbox-strategies "^4.3.1" + +workbox-navigation-preload@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-navigation-preload/-/workbox-navigation-preload-4.3.1.tgz#29c8e4db5843803b34cd96dc155f9ebd9afa453d" + integrity sha512-K076n3oFHYp16/C+F8CwrRqD25GitA6Rkd6+qAmLmMv1QHPI2jfDwYqrytOfKfYq42bYtW8Pr21ejZX7GvALOw== + dependencies: + workbox-core "^4.3.1" + +workbox-precaching@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-precaching/-/workbox-precaching-4.3.1.tgz#9fc45ed122d94bbe1f0ea9584ff5940960771cba" + integrity sha512-piSg/2csPoIi/vPpp48t1q5JLYjMkmg5gsXBQkh/QYapCdVwwmKlU9mHdmy52KsDGIjVaqEUMFvEzn2LRaigqQ== + dependencies: + workbox-core "^4.3.1" + +workbox-range-requests@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-range-requests/-/workbox-range-requests-4.3.1.tgz#f8a470188922145cbf0c09a9a2d5e35645244e74" + integrity sha512-S+HhL9+iTFypJZ/yQSl/x2Bf5pWnbXdd3j57xnb0V60FW1LVn9LRZkPtneODklzYuFZv7qK6riZ5BNyc0R0jZA== + dependencies: + workbox-core "^4.3.1" + +workbox-routing@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-routing/-/workbox-routing-4.3.1.tgz#a675841af623e0bb0c67ce4ed8e724ac0bed0cda" + integrity sha512-FkbtrODA4Imsi0p7TW9u9MXuQ5P4pVs1sWHK4dJMMChVROsbEltuE79fBoIk/BCztvOJ7yUpErMKa4z3uQLX+g== + dependencies: + workbox-core "^4.3.1" + +workbox-strategies@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-strategies/-/workbox-strategies-4.3.1.tgz#d2be03c4ef214c115e1ab29c9c759c9fe3e9e646" + integrity sha512-F/+E57BmVG8dX6dCCopBlkDvvhg/zj6VDs0PigYwSN23L8hseSRwljrceU2WzTvk/+BSYICsWmRq5qHS2UYzhw== + dependencies: + workbox-core "^4.3.1" + +workbox-streams@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-streams/-/workbox-streams-4.3.1.tgz#0b57da70e982572de09c8742dd0cb40a6b7c2cc3" + integrity sha512-4Kisis1f/y0ihf4l3u/+ndMkJkIT4/6UOacU3A4BwZSAC9pQ9vSvJpIi/WFGQRH/uPXvuVjF5c2RfIPQFSS2uA== + dependencies: + workbox-core "^4.3.1" + +workbox-sw@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-sw/-/workbox-sw-4.3.1.tgz#df69e395c479ef4d14499372bcd84c0f5e246164" + integrity sha512-0jXdusCL2uC5gM3yYFT6QMBzKfBr2XTk0g5TPAV4y8IZDyVNDyj1a8uSXy3/XrvkVTmQvLN4O5k3JawGReXr9w== + +workbox-webpack-plugin@4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-webpack-plugin/-/workbox-webpack-plugin-4.3.1.tgz#47ff5ea1cc074b6c40fb5a86108863a24120d4bd" + integrity sha512-gJ9jd8Mb8wHLbRz9ZvGN57IAmknOipD3W4XNE/Lk/4lqs5Htw4WOQgakQy/o/4CoXQlMCYldaqUg+EJ35l9MEQ== + dependencies: + "@babel/runtime" "^7.0.0" + json-stable-stringify "^1.0.1" + workbox-build "^4.3.1" + +workbox-window@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/workbox-window/-/workbox-window-4.3.1.tgz#ee6051bf10f06afa5483c9b8dfa0531994ede0f3" + integrity sha512-C5gWKh6I58w3GeSc0wp2Ne+rqVw8qwcmZnQGpjiek8A2wpbxSJb1FdCoQVO+jDJs35bFgo/WETgl1fqgsxN0Hg== + dependencies: + workbox-core "^4.3.1" + +worker-farm@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" + integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== + dependencies: + errno "~0.1.7" + +worker-rpc@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/worker-rpc/-/worker-rpc-0.1.1.tgz#cb565bd6d7071a8f16660686051e969ad32f54d5" + integrity sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg== + dependencies: + microevent.ts "~0.1.1" + +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +write-file-atomic@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.1.tgz#d0b05463c188ae804396fd5ab2a370062af87529" + integrity sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg== + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + +write@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" + integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== + dependencies: + mkdirp "^0.5.1" + +ws@^5.2.0: + version "5.2.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" + integrity sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA== + dependencies: + async-limiter "~1.0.0" + +ws@^6.1.2, ws@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" + integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA== + dependencies: + async-limiter "~1.0.0" + +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== + +xmlchars@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + +xmlhttprequest@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz#67fe075c5c24fef39f9d65f5f7b7fe75171968fc" + integrity sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw= + +xregexp@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.3.0.tgz#7e92e73d9174a99a59743f67a4ce879a04b5ae50" + integrity sha512-7jXDIFXh5yJ/orPn4SXjuVrWWoi4Cr8jfV1eHv9CixKSbU+jY4mxfrBwAuDvupPNKpMUY+FeIqsVw/JLT9+B8g== + dependencies: + "@babel/runtime-corejs3" "^7.8.3" + +xtend@^4.0.0, xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^1.7.2: + version "1.8.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.8.2.tgz#a29c03f578faafd57dcb27055f9a5d569cb0c3d9" + integrity sha512-omakb0d7FjMo3R1D2EbTKVIk6dAVLRxFXdLZMEUToeAvuqgG/YuHMuQOZ5fgk+vQ8cx+cnGKwyg+8g8PNT0xQg== + dependencies: + "@babel/runtime" "^7.8.7" + +yargs-parser@^11.1.1: + version "11.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" + integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^13.1.2: + version "13.1.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" + integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs@12.0.5: + version "12.0.5" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" + integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== + dependencies: + cliui "^4.0.0" + decamelize "^1.2.0" + find-up "^3.0.0" + get-caller-file "^1.0.1" + os-locale "^3.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1 || ^4.0.0" + yargs-parser "^11.1.1" + +yargs@^13.3.0: + version "13.3.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" + integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.2" + +zen-observable-ts@^0.8.21: + version "0.8.21" + resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-0.8.21.tgz#85d0031fbbde1eba3cd07d3ba90da241215f421d" + integrity sha512-Yj3yXweRc8LdRMrCC8nIc4kkjWecPAUVh0TI0OUrWXx6aX790vLcDlWca6I4vsyCGH3LpWxq0dJRcMOFoVqmeg== + dependencies: + tslib "^1.9.3" + zen-observable "^0.8.0" + +zen-observable@^0.8.0, zen-observable@^0.8.14: + version "0.8.15" + resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15" + integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ== diff --git a/bodyshop_translations.babel b/bodyshop_translations.babel index 47baf336f..cd6dec3d9 100644 --- a/bodyshop_translations.babel +++ b/bodyshop_translations.babel @@ -1,4 +1,4 @@ - + - BodyShop | ImEX Systems Inc. + ImEX Online diff --git a/client/public/manifest.json b/client/public/manifest.json index ad4743790..d7008ba45 100644 --- a/client/public/manifest.json +++ b/client/public/manifest.json @@ -1,7 +1,7 @@ { - "short_name": "Bodyshop.app", - "name": "Bodyshop Management System", - "description": "The ultimate bodyshop management system", + "short_name": "ImEX Online", + "name": "ImEX Online", + "description": "The ultimate bodyshop management system.", "icons": [ { "src": "favicon.ico", @@ -22,5 +22,6 @@ "start_url": ".", "display": "standalone", "theme_color": "#fff", - "background_color": "#fff" + "background_color": "#fff", + "gcm_sender_id": "103953800507" } diff --git a/client/src/App/App.container.jsx b/client/src/App/App.container.jsx index 07e338d4f..3d002b53e 100644 --- a/client/src/App/App.container.jsx +++ b/client/src/App/App.container.jsx @@ -9,117 +9,134 @@ import apolloLogger from "apollo-link-logger"; import { RetryLink } from "apollo-link-retry"; import { WebSocketLink } from "apollo-link-ws"; import { getMainDefinition } from "apollo-utilities"; -import React, { Component } from "react"; +import LogRocket from "logrocket"; +import React from "react"; import GlobalLoadingBar from "../components/global-loading-bar/global-loading-bar.component"; import { auth } from "../firebase/firebase.utils"; import errorLink from "../graphql/apollo-error-handling"; import App from "./App"; -export default class AppContainer extends Component { - constructor() { - super(); - const httpLink = new HttpLink({ - uri: process.env.REACT_APP_GRAPHQL_ENDPOINT - }); +import { ConfigProvider } from "antd"; +import enLocale from "antd/es/locale/en_US"; +import moment from "moment"; - const wsLink = new WebSocketLink({ - uri: process.env.REACT_APP_GRAPHQL_ENDPOINT_WS, - options: { - lazy: true, - reconnect: true, - connectionParams: async () => { - //const token = localStorage.getItem("token"); - const token = await auth.currentUser.getIdToken(true); - if (token) { - return { - headers: { - authorization: token ? `Bearer ${token}` : "" - } - }; - } - } +moment.locale("en-US"); + +if (process.env.NODE_ENV === "production") LogRocket.init("gvfvfw/bodyshopapp"); + +const httpLink = new HttpLink({ + uri: process.env.REACT_APP_GRAPHQL_ENDPOINT, +}); + +const wsLink = new WebSocketLink({ + uri: process.env.REACT_APP_GRAPHQL_ENDPOINT_WS, + options: { + lazy: true, + reconnect: true, + connectionParams: async () => { + const token = + auth.currentUser && (await auth.currentUser.getIdToken(true)); + if (token) { + return { + headers: { + authorization: token ? `Bearer ${token}` : "", + }, + }; } - }); - const subscriptionMiddleware = { - applyMiddleware: async (options, next) => { - options.authToken = await auth.currentUser.getIdToken(true); - next(); - } - }; - wsLink.subscriptionClient.use([subscriptionMiddleware]); + }, + }, +}); - const link = split( - // split based on operation type - ({ query }) => { - const definition = getMainDefinition(query); - // console.log( - // "##Intercepted GQL Transaction : " + - // definition.operation + - // "|" + - // definition.name.value + - // "##", - // query - // ); - return ( - definition.kind === "OperationDefinition" && - definition.operation === "subscription" - ); - }, - wsLink, - httpLink - ); - - const authLink = setContext((_, { headers }) => { - return auth.currentUser.getIdToken().then(token => { - if (token) { - return { - headers: { - ...headers, - authorization: token ? `Bearer ${token}` : "" - } - }; - } else { - return { headers }; - } - }); - }); - - const retryLink = new RetryLink({ - delay: { - initial: 300, - max: 5, - jitter: true - }, - attempts: { - max: 5, - retryIf: (error, _operation) => !!error - } - }); - - const middlewares = []; - if (process.env.NODE_ENV === "development") { - middlewares.push(apolloLogger); - } - - middlewares.push(retryLink.concat(errorLink.concat(authLink.concat(link)))); - - const cache = new InMemoryCache(); - const client = new ApolloClient({ - link: ApolloLink.from(middlewares), - cache, - connectToDevTools: true - }); - - this.state = { client }; - } - - render() { - const { client } = this.state; +const subscriptionMiddleware = { + applyMiddleware: async (options, next) => { + options.authToken = + auth.currentUser && (await auth.currentUser.getIdToken(true)); + next(); + }, +}; +wsLink.subscriptionClient.use([subscriptionMiddleware]); +const link = split( + // split based on operation type + ({ query }) => { + const definition = getMainDefinition(query); + // console.log( + // "##Intercepted GQL Transaction : " + + // definition.operation + + // "|" + + // definition.name.value + + // "##", + // query + // ); return ( - + definition.kind === "OperationDefinition" && + definition.operation === "subscription" + ); + }, + wsLink, + httpLink +); + +const authLink = setContext((_, { headers }) => { + return ( + auth.currentUser && + auth.currentUser.getIdToken().then((token) => { + if (token) { + return { + headers: { + ...headers, + authorization: token ? `Bearer ${token}` : "", + }, + }; + } else { + return { headers }; + } + }) + ); +}); + +const retryLink = new RetryLink({ + delay: { + initial: 500, + max: 5, + jitter: true, + }, + attempts: { + max: 5, + retryIf: (error, _operation) => !!error, + }, +}); + +const middlewares = []; +if (process.env.NODE_ENV === "development") { + middlewares.push(apolloLogger); +} + +middlewares.push(retryLink.concat(errorLink.concat(authLink.concat(link)))); + +const cache = new InMemoryCache({}); + +export const client = new ApolloClient({ + link: ApolloLink.from(middlewares), + cache, + connectToDevTools: process.env.NODE_ENV !== "production", + defaultOptions: { + watchQuery: { + fetchPolicy: "cache-and-network", + }, + }, +}); + +export default function AppContainer() { + return ( + + - - ); - } + + + ); } diff --git a/client/src/App/App.css b/client/src/App/App.css deleted file mode 100644 index bc8c8182d..000000000 --- a/client/src/App/App.css +++ /dev/null @@ -1 +0,0 @@ -@import "~antd/dist/antd.css"; \ No newline at end of file diff --git a/client/src/App/App.js b/client/src/App/App.js index 231d0f616..1ce5d674c 100644 --- a/client/src/App/App.js +++ b/client/src/App/App.js @@ -1,4 +1,5 @@ -import i18next from "i18next"; +import { Grid } from "antd"; +import "antd/dist/antd.css"; import React, { lazy, Suspense, useEffect } from "react"; import { useTranslation } from "react-i18next"; import { connect } from "react-redux"; @@ -7,41 +8,42 @@ import { createStructuredSelector } from "reselect"; import ErrorBoundary from "../components/error-boundary/error-boundary.component"; //Component Imports import LoadingSpinner from "../components/loading-spinner/loading-spinner.component"; +import TechPageContainer from "../pages/tech/tech.page.container"; import { checkUserSession } from "../redux/user/user.actions"; import { selectCurrentUser } from "../redux/user/user.selectors"; -// import { QUERY_BODYSHOP } from "../graphql/bodyshop.queries"; import PrivateRoute from "../utils/private-route"; -import "./App.css"; +import "./App.styles.scss"; const LandingPage = lazy(() => import("../pages/landing/landing.page")); +const ResetPassword = lazy(() => + import("../pages/reset-password/reset-password.component") +); const ManagePage = lazy(() => import("../pages/manage/manage.page.container")); const SignInPage = lazy(() => import("../pages/sign-in/sign-in.page")); const Unauthorized = lazy(() => import("../pages/unauthorized/unauthorized.component") ); +const CsiPage = lazy(() => import("../pages/csi/csi.container.page")); +const MobilePaymentContainer = lazy(() => + import("../pages/mobile-payment/mobile-payment.container") +); const mapStateToProps = createStructuredSelector({ - currentUser: selectCurrentUser + currentUser: selectCurrentUser, }); -const mapDispatchToProps = dispatch => ({ - checkUserSession: () => dispatch(checkUserSession()) +const mapDispatchToProps = (dispatch) => ({ + checkUserSession: () => dispatch(checkUserSession()), }); -export default connect( - mapStateToProps, - mapDispatchToProps -)(({ checkUserSession, currentUser }) => { +export function App({ checkUserSession, currentUser }) { useEffect(() => { checkUserSession(); - return () => {}; }, [checkUserSession]); + const b = Grid.useBreakpoint(); + console.log("Breakpoints:", b); + const { t } = useTranslation(); - if (currentUser && currentUser.language) - i18next.changeLanguage(currentUser.language, err => { - if (err) - return console.log("Error encountered when changing languages.", err); - }); if (currentUser.authorized === null) { return ; @@ -51,20 +53,32 @@ export default connect(
- }> - - - - - + }> + + + + + + +
); -}); +} + +export default connect(mapStateToProps, mapDispatchToProps)(App); diff --git a/client/src/App/App.styles.scss b/client/src/App/App.styles.scss new file mode 100644 index 000000000..e4e62f8d0 --- /dev/null +++ b/client/src/App/App.styles.scss @@ -0,0 +1,72 @@ +//Global Styles. + +.imex-table-header { + display: flex; + flex-wrap: wrap; + justify-content: center; + + &__search { + flex: 1; + } +} + +.imex-flex-row { + display: flex; + justify-content: flex-start; + flex-wrap: wrap; + align-items: center; + + &__grow { + flex: 1; + } + + &__margin { + margin: 0.2rem 0.2rem; + } + + &__margin-large { + margin: 0.5rem 0.5rem; + } + + &__flex-space-around { + justify-content: space-around; + } +} + +.ellipses { + display: inline-block; /* for em, a, span, etc (inline by default) */ + text-overflow: ellipsis; + width: calc(95%); + overflow: hidden; + white-space: nowrap; +} + +.tight-antd-rows { + .ant-row { + margin: 0rem; + line-height: 1rem; + } +} + +::-webkit-scrollbar-track { + -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3); + border-radius: 0.2rem; + background-color: #f5f5f5; +} + +::-webkit-scrollbar { + width: 0.25rem; + max-height: 0.25rem; + background-color: #f5f5f5; +} + +::-webkit-scrollbar-thumb { + border-radius: 0.2rem; + -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3); + background-color: #188fff; +} + +.ant-table-cell { + // background-color: red; + padding: 0.2rem !important; +} diff --git a/client/src/components/_test/test.component.jsx b/client/src/components/_test/test.component.jsx index 60f72bb3c..e32ebc2c9 100644 --- a/client/src/components/_test/test.component.jsx +++ b/client/src/components/_test/test.component.jsx @@ -1,150 +1,96 @@ -import { Editor } from "@tinymce/tinymce-react"; -import axios from "axios"; -import React, { useState } from "react"; +import { + PaymentRequestButtonElement, + useStripe +} from "@stripe/react-stripe-js"; +import React, { useEffect, useState } from "react"; import { connect } from "react-redux"; import { createStructuredSelector } from "reselect"; -import { EmailSettings } from "../../emails/constants"; -import { - endLoading, - startLoading, -} from "../../redux/application/application.actions"; +import { logImEXEvent } from "../../firebase/firebase.utils"; import { setEmailOptions } from "../../redux/email/email.actions"; import { selectBodyshop } from "../../redux/user/user.selectors"; +import { TemplateList } from "../../utils/TemplateConstants"; + const mapStateToProps = createStructuredSelector({ - //currentUser: selectCurrentUser bodyshop: selectBodyshop, }); + const mapDispatchToProps = (dispatch) => ({ setEmailOptions: (e) => dispatch(setEmailOptions(e)), - load: () => dispatch(startLoading()), - endload: () => dispatch(endLoading()), }); -export default connect( - mapStateToProps, - mapDispatchToProps -)(function Test({ setEmailOptions, load, endload, bodyshop }) { - const [state, setState] = useState(temp); - const handleEditorChange = (content, editor) => { - setState(content); - }; +function Test({ bodyshop, setEmailOptions }) { + const stripe = useStripe(); + + const [paymentRequest, setPaymentRequest] = useState(null); + useEffect(() => { + if (stripe) { + const pr = stripe.paymentRequest({ + country: "CA", + displayItems: [{ label: "Deductible", amount: 1099 }], + currency: "cad", + total: { + label: "Demo total", + amount: 1099, + }, + requestPayerName: true, + requestPayerEmail: true, + }); + + // Check the availability of the Payment Request API. + pr.canMakePayment().then((result) => { + if (result) { + setPaymentRequest(pr); + } else { + // var details = { + // total: { label: "", amount: { currency: "CAD", value: "0.00" } }, + // }; + new PaymentRequest( + [{ supportedMethods: ["basic-card"] }], + {} + // details + ).show(); + } + }); + } + }, [stripe]); + + if (paymentRequest) { + return ( +
+ +
+ ); + } return (
- - -
); -}); +} -const temp = `
-

This is a full-featured editor demo. Please explore! ←

-

 

-

TinyMCE is the world's most customizable, and flexible, rich text editor.

-

A featherweight download, TinyMCE can handle any challenge you throw at it.

-

 

-

 

- - - - - - - - - - - - - - - - - - - - - -
🛠 50+ Plugins💡 Premium Support🖍 Custom Skins⚙ Full API Access
{{#each people}}
{{this}}{{this}}{{this}}{{this}}
{{/each}}
-
`; +export default connect(mapStateToProps, mapDispatchToProps)(Test); diff --git a/client/src/components/accounting-payables-table/accounting-payables-table.component.jsx b/client/src/components/accounting-payables-table/accounting-payables-table.component.jsx new file mode 100644 index 000000000..d86aefc00 --- /dev/null +++ b/client/src/components/accounting-payables-table/accounting-payables-table.component.jsx @@ -0,0 +1,193 @@ +import { Input, Table, Checkbox } from "antd"; +import React, { useState } from "react"; +import { useTranslation } from "react-i18next"; +import { Link } from "react-router-dom"; +import CurrencyFormatter from "../../utils/CurrencyFormatter"; +import { alphaSort } from "../../utils/sorters"; +import InvoiceExportButton from "../invoice-export-button/invoice-export-button.component"; +import InvoiceExportAllButton from "../invoice-export-all-button/invoice-export-all-button.component"; +import { DateFormatter } from "../../utils/DateFormatter"; +import queryString from "query-string"; +import { logImEXEvent } from "../../firebase/firebase.utils"; + +export default function AccountingPayablesTableComponent({ + loading, + invoices, +}) { + const { t } = useTranslation(); + const [selectedInvoices, setSelectedInvoices] = useState([]); + const [transInProgress, setTransInProgress] = useState(false); + const [state, setState] = useState({ + sortedInfo: {}, + search: "", + }); + + const handleTableChange = (pagination, filters, sorter) => { + setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); + }; + + const columns = [ + { + title: t("invoices.fields.vendorname"), + dataIndex: "vendorname", + key: "vendorname", + sorter: (a, b) => alphaSort(a.vendor.name, b.vendor.name), + sortOrder: + state.sortedInfo.columnKey === "vendorname" && state.sortedInfo.order, + render: (text, record) => ( + + {record.vendor.name} + + ), + }, + { + title: t("invoices.fields.invoice_number"), + dataIndex: "invoice_number", + key: "invoice_number", + sorter: (a, b) => alphaSort(a.invoice_number, b.invoice_number), + sortOrder: + state.sortedInfo.columnKey === "invoice_number" && + state.sortedInfo.order, + render: (text, record) => ( + + {record.invoice_number} + + ), + }, + { + title: t("jobs.fields.ro_number"), + dataIndex: "ro_number", + key: "ro_number", + sorter: (a, b) => alphaSort(a.job.ro_number, b.job.ro_number), + sortOrder: + state.sortedInfo.columnKey === "ro_number" && state.sortedInfo.order, + render: (text, record) => ( + {record.job.ro_number} + ), + }, + { + title: t("invoices.fields.date"), + dataIndex: "date", + key: "date", + + sorter: (a, b) => a.date - b.date, + sortOrder: + state.sortedInfo.columnKey === "date" && state.sortedInfo.order, + render: (text, record) => {record.date}, + }, + { + title: t("invoices.fields.total"), + dataIndex: "total", + key: "total", + + sorter: (a, b) => a.total - b.total, + sortOrder: + state.sortedInfo.columnKey === "total" && state.sortedInfo.order, + render: (text, record) => ( + {record.total} + ), + }, + { + title: t("invoices.fields.is_credit_memo"), + dataIndex: "is_credit_memo", + key: "is_credit_memo", + sorter: (a, b) => a.is_credit_memo - b.is_credit_memo, + sortOrder: + state.sortedInfo.columnKey === "is_credit_memo" && + state.sortedInfo.order, + render: (text, record) => ( + + ), + }, + { + title: t("general.labels.actions"), + dataIndex: "actions", + key: "actions", + sorter: (a, b) => a.clm_total - b.clm_total, + + render: (text, record) => ( +
+ +
+ ), + }, + ]; + + const handleSearch = (e) => { + setState({ ...state, search: e.target.value }); + logImEXEvent("accounting_payables_table_search"); + }; + + const dataSource = state.search + ? invoices.filter( + (v) => + (v.vendor.name || "") + .toLowerCase() + .includes(state.search.toLowerCase()) || + (v.invoice_number || "") + .toLowerCase() + .includes(state.search.toLowerCase()) + ) + : invoices; + + return ( +
+ { + return ( +
+ + +
+ ); + }} + dataSource={dataSource} + size="small" + pagination={{ position: "top", pageSize: 50 }} + columns={columns} + rowKey="id" + onChange={handleTableChange} + rowSelection={{ + onSelectAll: (selected, selectedRows) => + setSelectedInvoices(selectedRows.map((i) => i.id)), + onSelect: (record, selected, selectedRows, nativeEvent) => { + setSelectedInvoices(selectedRows.map((i) => i.id)); + }, + getCheckboxProps: (record) => ({ + disabled: record.exported, + }), + selectedRowKeys: selectedInvoices, + type: "checkbox", + }} + /> + + ); +} diff --git a/client/src/components/accounting-payments-table/accounting-payments-table.component.jsx b/client/src/components/accounting-payments-table/accounting-payments-table.component.jsx new file mode 100644 index 000000000..006175863 --- /dev/null +++ b/client/src/components/accounting-payments-table/accounting-payments-table.component.jsx @@ -0,0 +1,191 @@ +import { Input, Table } from "antd"; +import React, { useState } from "react"; +import { useTranslation } from "react-i18next"; +import { Link } from "react-router-dom"; +import CurrencyFormatter from "../../utils/CurrencyFormatter"; +import { DateTimeFormatter } from "../../utils/DateFormatter"; +import { alphaSort } from "../../utils/sorters"; +import PaymentExportButton from "../payment-export-button/payment-export-button.component"; +import { PaymentsExportAllButton } from "../payments-export-all-button/payments-export-all-button.component"; +import { logImEXEvent } from "../../firebase/firebase.utils"; + +export default function AccountingPayablesTableComponent({ + loading, + payments, +}) { + const { t } = useTranslation(); + const [selectedPayments, setSelectedPayments] = useState([]); + const [transInProgress, setTransInProgress] = useState(false); + const [state, setState] = useState({ + sortedInfo: {}, + search: "", + }); + + const handleTableChange = (pagination, filters, sorter) => { + setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); + }; + + const columns = [ + { + title: t("jobs.fields.ro_number"), + dataIndex: "ro_number", + key: "ro_number", + sorter: (a, b) => alphaSort(a.job.ro_number, b.job.ro_number), + sortOrder: + state.sortedInfo.columnKey === "ro_number" && state.sortedInfo.order, + render: (text, record) => ( + {record.job.ro_number} + ), + }, + { + title: t("jobs.fields.est_number"), + dataIndex: "est_number", + key: "est_number", + sorter: (a, b) => a.job.est_number - b.job.est_number, + sortOrder: + state.sortedInfo.columnKey === "est_number" && state.sortedInfo.order, + render: (text, record) => ( + + {record.job.est_number} + + ), + }, + { + title: t("jobs.fields.owner"), + dataIndex: "owner", + key: "owner", + ellipsis: true, + sorter: (a, b) => alphaSort(a.job.ownr_ln, b.job.ownr_ln), + sortOrder: + state.sortedInfo.columnKey === "ownr_ln" && state.sortedInfo.order, + render: (text, record) => { + return record.job.owner ? ( + + {`${record.job.ownr_fn || ""} ${record.job.ownr_ln || ""}`} + + ) : ( + {`${record.job.ownr_fn || ""} ${ + record.job.ownr_ln || "" + }`} + ); + }, + }, + { + title: t("payments.fields.amount"), + dataIndex: "amount", + key: "amount", + render: (text, record) => ( + {record.amount} + ), + }, + { + title: t("payments.fields.memo"), + dataIndex: "memo", + key: "memo", + }, + { + title: t("payments.fields.transactionid"), + dataIndex: "transactionid", + key: "transactionid", + }, + { + title: t("payments.fields.stripeid"), + dataIndex: "stripeid", + key: "stripeid", + }, + { + title: t("payments.fields.created_at"), + dataIndex: "created_at", + key: "created_at", + render: (text, record) => ( + {record.created_at} + ), + }, + { + title: t("payments.fields.exportedat"), + dataIndex: "exportedat", + key: "exportedat", + render: (text, record) => ( + {record.exportedat} + ), + }, + + { + title: t("general.labels.actions"), + dataIndex: "actions", + key: "actions", + sorter: (a, b) => a.clm_total - b.clm_total, + + render: (text, record) => ( +
+ +
+ ), + }, + ]; + + const handleSearch = (e) => { + setState({ ...state, search: e.target.value }); + logImEXEvent("account_payments_table_search"); + }; + + const dataSource = state.search + ? payments.filter( + (v) => + (v.vendor.name || "") + .toLowerCase() + .includes(state.search.toLowerCase()) || + (v.invoice_number || "") + .toLowerCase() + .includes(state.search.toLowerCase()) + ) + : payments; + + return ( +
+
{ + return ( +
+ + +
+ ); + }} + dataSource={dataSource} + size='small' + pagination={{ position: "top", pageSize: 50 }} + columns={columns} + rowKey='id' + onChange={handleTableChange} + rowSelection={{ + onSelectAll: (selected, selectedRows) => + setSelectedPayments(selectedRows.map((i) => i.id)), + onSelect: (record, selected, selectedRows, nativeEvent) => { + setSelectedPayments(selectedRows.map((i) => i.id)); + }, + getCheckboxProps: (record) => ({ + disabled: record.exported, + }), + selectedRowKeys: selectedPayments, + type: "checkbox", + }} + /> + + ); +} diff --git a/client/src/components/accounting-receivables-table/accounting-receivables-table.component.jsx b/client/src/components/accounting-receivables-table/accounting-receivables-table.component.jsx new file mode 100644 index 000000000..23237e69d --- /dev/null +++ b/client/src/components/accounting-receivables-table/accounting-receivables-table.component.jsx @@ -0,0 +1,222 @@ +import { Input, Table, Button } from "antd"; +import React, { useState } from "react"; +import { useTranslation } from "react-i18next"; +import { Link } from "react-router-dom"; +import CurrencyFormatter from "../../utils/CurrencyFormatter"; +import { alphaSort } from "../../utils/sorters"; +import JobExportButton from "../jobs-close-export-button/jobs-close-export-button.component"; +import { logImEXEvent } from "../../firebase/firebase.utils"; +import { JobsExportAllButton } from "../jobs-export-all-button/jobs-export-all-button.component"; + +export default function AccountingReceivablesTableComponent({ loading, jobs }) { + const { t } = useTranslation(); + const [selectedJobs, setSelectedJobs] = useState([]); + const [transInProgress, setTransInProgress] = useState(false); + + const [state, setState] = useState({ + sortedInfo: {}, + search: "", + }); + + const handleTableChange = (pagination, filters, sorter) => { + setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); + }; + + const columns = [ + { + title: t("jobs.fields.ro_number"), + dataIndex: "ro_number", + key: "ro_number", + sorter: (a, b) => alphaSort(a.ro_number, b.ro_number), + sortOrder: + state.sortedInfo.columnKey === "ro_number" && state.sortedInfo.order, + render: (text, record) => ( + {record.ro_number} + ), + }, + { + title: t("jobs.fields.est_number"), + dataIndex: "est_number", + key: "est_number", + sorter: (a, b) => a.est_number - b.est_number, + sortOrder: + state.sortedInfo.columnKey === "est_number" && state.sortedInfo.order, + render: (text, record) => ( + {record.est_number} + ), + }, + { + title: t("jobs.fields.status"), + dataIndex: "status", + key: "status", + sorter: (a, b) => a.status - b.status, + sortOrder: + state.sortedInfo.columnKey === "status" && state.sortedInfo.order, + }, + { + title: t("jobs.fields.owner"), + dataIndex: "owner", + key: "owner", + sorter: (a, b) => alphaSort(a.ownr_ln, b.ownr_ln), + sortOrder: + state.sortedInfo.columnKey === "owner" && state.sortedInfo.order, + render: (text, record) => { + return record.owner ? ( + + {`${record.ownr_fn || ""} ${record.ownr_ln || ""}`} + + ) : ( + {`${record.ownr_fn || ""} ${record.ownr_ln || ""}`} + ); + }, + }, + { + title: t("jobs.fields.vehicle"), + dataIndex: "vehicle", + key: "vehicle", + ellipsis: true, + render: (text, record) => { + return record.vehicleid ? ( + + {`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${ + record.v_model_desc || "" + }`} + + ) : ( + {`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${ + record.v_model_desc || "" + }`} + ); + }, + }, + { + title: t("jobs.fields.clm_no"), + dataIndex: "clm_no", + key: "clm_no", + ellipsis: true, + sorter: (a, b) => alphaSort(a.clm_no, b.clm_no), + sortOrder: + state.sortedInfo.columnKey === "clm_no" && state.sortedInfo.order, + render: (text, record) => { + return record.clm_no ? ( + {record.clm_no} + ) : ( + t("general.labels.unknown") + ); + }, + }, + { + title: t("jobs.fields.clm_total"), + dataIndex: "clm_total", + key: "clm_total", + sorter: (a, b) => a.clm_total - b.clm_total, + sortOrder: + state.sortedInfo.columnKey === "clm_total" && state.sortedInfo.order, + render: (text, record) => { + return record.clm_total ? ( + {record.clm_total} + ) : ( + t("general.labels.unknown") + ); + }, + }, + { + title: t("general.labels.actions"), + dataIndex: "actions", + key: "actions", + sorter: (a, b) => a.clm_total - b.clm_total, + + render: (text, record) => ( +
+ + + + +
+ ), + }, + ]; + + const handleSearch = (e) => { + setState({ ...state, search: e.target.value }); + logImEXEvent("accounting_receivables_search"); + }; + + const dataSource = state.search + ? jobs.filter( + (v) => + (v.ro_number || "") + .toString() + .toLowerCase() + .includes(state.search.toLowerCase()) || + (v.est_number || "") + .toString() + .toLowerCase() + .includes(state.search.toLowerCase()) || + (v.ownr_fn || "") + .toLowerCase() + .includes(state.search.toLowerCase()) || + (v.ownr_ln || "") + .toLowerCase() + .includes(state.search.toLowerCase()) || + (v.ownr_co_nm || "") + .toLowerCase() + .includes(state.search.toLowerCase()) || + (v.v_model_desc || "") + .toLowerCase() + .includes(state.search.toLowerCase()) || + (v.v_make_desc || "") + .toLowerCase() + .includes(state.search.toLowerCase()) || + (v.clm_no || "").toLowerCase().includes(state.search.toLowerCase()) + ) + : jobs; + + return ( +
+
{ + return ( +
+ + +
+ ); + }} + dataSource={dataSource} + size="small" + pagination={{ position: "top" }} + columns={columns} + rowKey="id" + onChange={handleTableChange} + rowSelection={{ + onSelectAll: (selected, selectedRows) => + setSelectedJobs(selectedRows.map((i) => i.id)), + onSelect: (record, selected, selectedRows, nativeEvent) => { + setSelectedJobs(selectedRows.map((i) => i.id)); + }, + getCheckboxProps: (record) => ({ + disabled: record.exported, + }), + selectedRowKeys: selectedJobs, + type: "checkbox", + }} + /> + + ); +} diff --git a/client/src/components/alert/alert.component.jsx b/client/src/components/alert/alert.component.jsx index 5ba4768a9..c84b887fb 100644 --- a/client/src/components/alert/alert.component.jsx +++ b/client/src/components/alert/alert.component.jsx @@ -1,7 +1,8 @@ import { Alert } from "antd"; - +import { logImEXEvent } from "../../firebase/firebase.utils"; import React from "react"; export default function AlertComponent(props) { + if (props.type === "error") logImEXEvent("alert_render", { ...props }); return ; } diff --git a/client/src/components/allocations-employee-label/allocations-employee-label.component.jsx b/client/src/components/allocations-employee-label/allocations-employee-label.component.jsx index 427c2a2b9..41b14c593 100644 --- a/client/src/components/allocations-employee-label/allocations-employee-label.component.jsx +++ b/client/src/components/allocations-employee-label/allocations-employee-label.component.jsx @@ -4,10 +4,11 @@ import { MdRemoveCircleOutline } from "react-icons/md"; export default function AllocationsLabelComponent({ allocation, handleClick }) { return ( -
+
- {`${allocation.employee.first_name || ""} ${allocation.employee - .last_name || ""} (${allocation.hours || ""})`} + {`${allocation.employee.first_name || ""} ${ + allocation.employee.last_name || "" + } (${allocation.hours || ""})`} { + + const handleClick = (e) => { e.preventDefault(); deleteAllocation({ variables: { id: allocation.id } }) - .then(r => { + .then((r) => { notification["success"]({ - message: t("allocations.successes.deleted") + message: t("allocations.successes.deleted"), }); if (refetch) refetch(); }) - .catch(error => { + .catch((error) => { notification["error"]({ message: t("allocations.errors.deleting") }); }); }; + return ( {error ? ( - + ) : ( @@ -10,12 +10,11 @@ export default function BarcodePopupComponent({ value }) { content={ - } - > - {t("general.labels.barcode")} + }> + {children ? children : {t("general.labels.barcode")}}
); diff --git a/client/src/components/breadcrumbs/breadcrumbs.component.jsx b/client/src/components/breadcrumbs/breadcrumbs.component.jsx index 62ebb2b5a..4d6f37ca5 100644 --- a/client/src/components/breadcrumbs/breadcrumbs.component.jsx +++ b/client/src/components/breadcrumbs/breadcrumbs.component.jsx @@ -1,9 +1,11 @@ -import React from "react"; +import { HomeFilled } from "@ant-design/icons"; import { Breadcrumb } from "antd"; +import React from "react"; import { connect } from "react-redux"; +import { Link } from "react-router-dom"; import { createStructuredSelector } from "reselect"; import { selectBreadcrumbs } from "../../redux/application/application.selectors"; -import { Link } from "react-router-dom"; +import "./breadcrumbs.styles.scss"; const mapStateToProps = createStructuredSelector({ breadcrumbs: selectBreadcrumbs, @@ -11,18 +13,24 @@ const mapStateToProps = createStructuredSelector({ export function BreadCrumbs({ breadcrumbs }) { return ( - - Home - {breadcrumbs.map((item) => - item.link ? ( - - {item.label} - - ) : ( - {item.label} - ) - )} - +
+ + + + + + + {breadcrumbs.map((item) => + item.link ? ( + + {item.label} + + ) : ( + {item.label} + ) + )} + +
); } export default connect(mapStateToProps, null)(BreadCrumbs); diff --git a/client/src/components/breadcrumbs/breadcrumbs.styles.scss b/client/src/components/breadcrumbs/breadcrumbs.styles.scss new file mode 100644 index 000000000..e5a1661df --- /dev/null +++ b/client/src/components/breadcrumbs/breadcrumbs.styles.scss @@ -0,0 +1,3 @@ +.breadcrumb-container { + margin: 0.5rem 4rem; +} diff --git a/client/src/components/chat-affix/chat-affix.component.jsx b/client/src/components/chat-affix/chat-affix.component.jsx new file mode 100644 index 000000000..2e29c37a6 --- /dev/null +++ b/client/src/components/chat-affix/chat-affix.component.jsx @@ -0,0 +1,43 @@ +import { MessageOutlined } from "@ant-design/icons"; +import { Badge, Card } from "antd"; +import React from "react"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { toggleChatVisible } from "../../redux/messaging/messaging.actions"; +import { selectChatVisible } from "../../redux/messaging/messaging.selectors"; +import ChatPopupComponent from '../chat-popup/chat-popup.component' + +const mapStateToProps = createStructuredSelector({ + chatVisible: selectChatVisible, +}); +const mapDispatchToProps = (dispatch) => ({ + toggleChatVisible: () => dispatch(toggleChatVisible()), +}); + +export function ChatAffixComponent({ + chatVisible, + toggleChatVisible, + conversationList, + unreadCount, +}) { + const { t } = useTranslation(); + + return ( + + + {chatVisible ? ( + + ) : ( +
toggleChatVisible()} + style={{ cursor: "pointer" }}> + + {t("messaging.labels.messaging")} +
+ )} +
+
+ ); +} +export default connect(mapStateToProps, mapDispatchToProps)(ChatAffixComponent); diff --git a/client/src/components/chat-affix/chat-affix.container.jsx b/client/src/components/chat-affix/chat-affix.container.jsx new file mode 100644 index 000000000..6b6db1ecd --- /dev/null +++ b/client/src/components/chat-affix/chat-affix.container.jsx @@ -0,0 +1,32 @@ +import { useSubscription } from "@apollo/react-hooks"; +import React from "react"; +import { CONVERSATION_LIST_SUBSCRIPTION } from "../../graphql/conversations.queries"; +import AlertComponent from "../alert/alert.component"; +import LoadingSpinner from "../loading-spinner/loading-spinner.component"; +import ChatAffixComponent from "./chat-affix.component"; +import { Affix } from "antd"; +import "./chat-affix.styles.scss"; +export default function ChatAffixContainer() { + const { loading, error, data } = useSubscription( + CONVERSATION_LIST_SUBSCRIPTION + ); + if (loading) return ; + if (error) return ; + + return ( + +
+ { + return (acc = acc + val.messages_aggregate.aggregate.count); + }, 0)) || + 0 + } + /> +
+
+ ); +} diff --git a/client/src/components/chat-affix/chat-affix.styles.scss b/client/src/components/chat-affix/chat-affix.styles.scss new file mode 100644 index 000000000..b72a74763 --- /dev/null +++ b/client/src/components/chat-affix/chat-affix.styles.scss @@ -0,0 +1,4 @@ +.chat-affix { + position: absolute; + bottom: 2vh; +} diff --git a/client/src/components/chat-conversation-list/chat-conversation-list.component.jsx b/client/src/components/chat-conversation-list/chat-conversation-list.component.jsx index 5b76a552f..10100a3c8 100644 --- a/client/src/components/chat-conversation-list/chat-conversation-list.component.jsx +++ b/client/src/components/chat-conversation-list/chat-conversation-list.component.jsx @@ -1,41 +1,67 @@ -import { ShrinkOutlined } from "@ant-design/icons"; -import { Badge } from "antd"; +import { Badge, List } from "antd"; import React from "react"; +import { useTranslation } from "react-i18next"; import { connect } from "react-redux"; -import { - openConversation, - toggleChatVisible -} from "../../redux/messaging/messaging.actions"; -import PhoneNumberFormatter from "../../utils/PhoneFormatter"; +import { createStructuredSelector } from "reselect"; +import { setSelectedConversation } from "../../redux/messaging/messaging.actions"; +import { selectSelectedConversation } from "../../redux/messaging/messaging.selectors"; +import PhoneFormatter from "../../utils/PhoneFormatter"; +import "./chat-conversation-list.styles.scss"; -const mapDispatchToProps = dispatch => ({ - toggleChatVisible: () => dispatch(toggleChatVisible()), - openConversation: number => dispatch(openConversation(number)) +const mapStateToProps = createStructuredSelector({ + selectedConversation: selectSelectedConversation, +}); + +const mapDispatchToProps = (dispatch) => ({ + setSelectedConversation: (conversationId) => + dispatch(setSelectedConversation(conversationId)), }); export function ChatConversationListComponent({ - toggleChatVisible, conversationList, - openConversation + selectedConversation, + setSelectedConversation, }) { + const { t } = useTranslation(); + return ( -
- toggleChatVisible()} /> - {conversationList.map(item => ( - -
- openConversation({ phone_num: item.phone_num, id: item.id }) - }> -
- {item.phone_num} -
-
-
- ))} -
+ ( + setSelectedConversation(item.id)} + className={`chat-list-item ${ + item.id === selectedConversation + ? "chat-list-selected-conversation" + : null + }`} + > + {item.phone_num}} + description={ + item.job_conversations.length > 0 ? ( +
+ {item.job_conversations.map( + (j) => + `${j.job.ownr_fn || ""} ${j.job.ownr_ln || ""} ${ + j.job.ownr_co_nm || "" + }` + )} +
+ ) : ( + t("messaging.labels.nojobs") + ) + } + /> + +
+ )} + /> ); } -export default connect(null, mapDispatchToProps)(ChatConversationListComponent); +export default connect( + mapStateToProps, + mapDispatchToProps +)(ChatConversationListComponent); diff --git a/client/src/components/chat-conversation-list/chat-conversation-list.styles.scss b/client/src/components/chat-conversation-list/chat-conversation-list.styles.scss new file mode 100644 index 000000000..724f1daf6 --- /dev/null +++ b/client/src/components/chat-conversation-list/chat-conversation-list.styles.scss @@ -0,0 +1,10 @@ +.chat-list-selected-conversation { + background-color: rgba(128, 128, 128, 0.2); +} + +.chat-list-item { + &:hover { + cursor: pointer; + color: #ff7a00; + } +} diff --git a/client/src/components/chat-conversation-title-tags/chat-conversation-title-tags.component.jsx b/client/src/components/chat-conversation-title-tags/chat-conversation-title-tags.component.jsx new file mode 100644 index 000000000..af6acb11b --- /dev/null +++ b/client/src/components/chat-conversation-title-tags/chat-conversation-title-tags.component.jsx @@ -0,0 +1,42 @@ +import React from "react"; +import { Tag } from "antd"; +import { Link } from "react-router-dom"; +import { useMutation } from "@apollo/react-hooks"; +import { REMOVE_CONVERSATION_TAG } from "../../graphql/job-conversations.queries"; +import { logImEXEvent } from "../../firebase/firebase.utils"; +export default function ChatConversationTitleTags({ jobConversations }) { + const [removeJobConversation] = useMutation(REMOVE_CONVERSATION_TAG); + + const handleRemoveTag = (jobId) => { + const convId = jobConversations[0].conversationid; + if (!!convId) { + removeJobConversation({ + variables: { + conversationId: convId, + jobId: jobId, + }, + }); + logImEXEvent("messaging_remove_job_tag", { + conversationId: convId, + jobId: jobId, + }); + } + }; + + return ( +
+ {jobConversations.map((item) => ( + handleRemoveTag(item.job.id)}> + + {item.job.ro_number || "?"} + + + ))} +
+ ); +} diff --git a/client/src/components/chat-conversation-title/chat-conversation-title.component.jsx b/client/src/components/chat-conversation-title/chat-conversation-title.component.jsx new file mode 100644 index 000000000..cd2b89ebe --- /dev/null +++ b/client/src/components/chat-conversation-title/chat-conversation-title.component.jsx @@ -0,0 +1,32 @@ +import { Space } from "antd"; +import React from "react"; +import ChatConversationTitleTags from "../chat-conversation-title-tags/chat-conversation-title-tags.component"; +import ChatTagRoContainer from "../chat-tag-ro/chat-tag-ro.container"; +import ChatPresetsComponent from "../chat-presets/chat-presets.component"; + +export default function ChatConversationTitle({ conversation }) { + return ( +
+ + {conversation && conversation.phone_num} + + {conversation.job_conversations.map( + (j) => + `${j.job.ownr_fn || ""} ${j.job.ownr_ln || ""} ${ + j.job.ownr_co_nm || "" + } | ` + )} + + +
+ + + +
+
+ ); +} diff --git a/client/src/components/chat-conversation/chat-conversation.closed.component.jsx b/client/src/components/chat-conversation/chat-conversation.closed.component.jsx deleted file mode 100644 index ea6ccce1b..000000000 --- a/client/src/components/chat-conversation/chat-conversation.closed.component.jsx +++ /dev/null @@ -1,38 +0,0 @@ -import { CloseCircleFilled } from "@ant-design/icons"; -import React from "react"; -import { connect } from "react-redux"; -import { - closeConversation, - sendMessage, - toggleConversationVisible -} from "../../redux/messaging/messaging.actions"; -import PhoneFormatter from "../../utils/PhoneFormatter"; - -const mapDispatchToProps = dispatch => ({ - toggleConversationVisible: conversationId => - dispatch(toggleConversationVisible(conversationId)), - closeConversation: phone => dispatch(closeConversation(phone)), - sendMessage: message => dispatch(sendMessage(message)) -}); - -function ChatConversationClosedComponent({ - conversation, - toggleConversationVisible, - closeConversation -}) { - return ( -
toggleConversationVisible(conversation.id)}> - {conversation.phone_num} - closeConversation(conversation.phone_num)} - /> -
- ); -} - -export default connect( - null, - mapDispatchToProps -)(ChatConversationClosedComponent); diff --git a/client/src/components/chat-conversation/chat-conversation.component.jsx b/client/src/components/chat-conversation/chat-conversation.component.jsx index b017f6d19..6f4237d5a 100644 --- a/client/src/components/chat-conversation/chat-conversation.component.jsx +++ b/client/src/components/chat-conversation/chat-conversation.component.jsx @@ -1,29 +1,32 @@ -import { Badge, Card } from "antd"; import React from "react"; -import ChatConversationClosedComponent from "./chat-conversation.closed.component"; -import ChatConversationOpenComponent from "./chat-conversation.open.component"; +import AlertComponent from "../alert/alert.component"; +import ChatConversationTitle from "../chat-conversation-title/chat-conversation-title.component"; +import ChatMessageListComponent from "../chat-messages-list/chat-message-list.component"; +import ChatSendMessage from "../chat-send-message/chat-send-message.component"; +import LoadingSkeleton from "../loading-skeleton/loading-skeleton.component.jsx"; +import "./chat-conversation.styles.scss"; export default function ChatConversationComponent({ - conversation, - messages, subState, - unreadCount + conversation, + handleMarkConversationAsRead, }) { + const [loading, error] = subState; + + if (loading) return ; + if (error) return ; + + const messages = (conversation && conversation.messages) || []; + return ( -
- - - {conversation.open ? ( - - ) : ( - - )} - - +
+ + +
); } diff --git a/client/src/components/chat-conversation/chat-conversation.container.jsx b/client/src/components/chat-conversation/chat-conversation.container.jsx index 90d0ae032..4e7013290 100644 --- a/client/src/components/chat-conversation/chat-conversation.container.jsx +++ b/client/src/components/chat-conversation/chat-conversation.container.jsx @@ -1,34 +1,56 @@ -import { useSubscription } from "@apollo/react-hooks"; -import React from "react"; +import { useMutation, useSubscription } from "@apollo/react-hooks"; +import React, { useState } from "react"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; import { CONVERSATION_SUBSCRIPTION_BY_PK } from "../../graphql/conversations.queries"; +import { MARK_MESSAGES_AS_READ_BY_CONVERSATION } from "../../graphql/messages.queries"; +import { selectSelectedConversation } from "../../redux/messaging/messaging.selectors"; import ChatConversationComponent from "./chat-conversation.component"; +const mapStateToProps = createStructuredSelector({ + selectedConversation: selectSelectedConversation, +}); -export default function ChatConversationContainer({ conversation }) { +export default connect(mapStateToProps, null)(ChatConversationContainer); + +export function ChatConversationContainer({ selectedConversation }) { const { loading, error, data } = useSubscription( CONVERSATION_SUBSCRIPTION_BY_PK, { - variables: { conversationId: conversation.id } + variables: { conversationId: selectedConversation }, } ); + const [markingAsReadInProgress, setMarkingAsReadInProgress] = useState(false); + + const [markConversationRead] = useMutation( + MARK_MESSAGES_AS_READ_BY_CONVERSATION, + { + variables: { conversationId: selectedConversation }, + } + ); + + const unreadCount = + (data && + data.conversations_by_pk && + data.conversations_by_pk && + data.conversations_by_pk.messages_aggregate && + data.conversations_by_pk.messages_aggregate.aggregate && + data.conversations_by_pk.messages_aggregate.aggregate.count) || + 0; + + const handleMarkConversationAsRead = async () => { + if (unreadCount > 0 && !!selectedConversation && !markingAsReadInProgress) { + setMarkingAsReadInProgress(true); + await markConversationRead(); + setMarkingAsReadInProgress(false); + } + }; + return ( ); } diff --git a/client/src/components/chat-conversation/chat-conversation.open.component.jsx b/client/src/components/chat-conversation/chat-conversation.open.component.jsx deleted file mode 100644 index 7296458a0..000000000 --- a/client/src/components/chat-conversation/chat-conversation.open.component.jsx +++ /dev/null @@ -1,36 +0,0 @@ -import React from "react"; -import { connect } from "react-redux"; -import { toggleConversationVisible } from "../../redux/messaging/messaging.actions"; -import AlertComponent from "../alert/alert.component"; -import ChatMessageListComponent from "../chat-messages-list/chat-message-list.component"; -import ChatSendMessage from "../chat-send-message/chat-send-message.component"; -import LoadingSpinner from "../loading-spinner/loading-spinner.component"; -import { ShrinkOutlined } from "@ant-design/icons"; - -const mapDispatchToProps = dispatch => ({ - toggleConversationVisible: conversation => - dispatch(toggleConversationVisible(conversation)) -}); - -export function ChatConversationOpenComponent({ - conversation, - messages, - subState, - toggleConversationVisible -}) { - const [loading, error] = subState; - - if (loading) return ; - if (error) return ; - - return ( -
- toggleConversationVisible(conversation.id)} - /> - - -
- ); -} -export default connect(null, mapDispatchToProps)(ChatConversationOpenComponent); diff --git a/client/src/components/chat-conversation/chat-conversation.styles.scss b/client/src/components/chat-conversation/chat-conversation.styles.scss new file mode 100644 index 000000000..59d37e06a --- /dev/null +++ b/client/src/components/chat-conversation/chat-conversation.styles.scss @@ -0,0 +1,6 @@ +.chat-conversation { + display: flex; + height: 100%; + margin: 0rem 0.5rem; + flex-direction: column; +} diff --git a/client/src/components/chat-dock/chat-dock.container.jsx b/client/src/components/chat-dock/chat-dock.container.jsx deleted file mode 100644 index 8357a149c..000000000 --- a/client/src/components/chat-dock/chat-dock.container.jsx +++ /dev/null @@ -1,32 +0,0 @@ -import { Affix } from "antd"; -import React from "react"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectConversations } from "../../redux/messaging/messaging.selectors"; -import ChatConversationContainer from "../chat-conversation/chat-conversation.container"; -import ChatMessagesButtonContainer from "../chat-messages-button/chat-messages-button.container"; -import "./chat-dock.styles.scss"; - -const mapStateToProps = createStructuredSelector({ - activeConversations: selectConversations -}); - -export function ChatOverlayContainer({ activeConversations }) { - return ( - -
- - {activeConversations - ? activeConversations.map(conversation => ( - - )) - : null} -
-
- ); -} - -export default connect(mapStateToProps, null)(ChatOverlayContainer); diff --git a/client/src/components/chat-dock/chat-dock.styles.scss b/client/src/components/chat-dock/chat-dock.styles.scss deleted file mode 100644 index 97ab7395c..000000000 --- a/client/src/components/chat-dock/chat-dock.styles.scss +++ /dev/null @@ -1,188 +0,0 @@ -.chat-dock { - z-index: 5; - //overflow-x: scroll; - // overflow-y: hidden; - width: 100%; - display: flex; - align-items: baseline; -} - -.chat-conversation { - margin: 2em 1em 0em 1em; -} - -.chat-conversation-open { - height: 500px; -} -// .chat-messages { -// height: 80%; -// overflow-x: hidden; -// overflow-y: scroll; -// flex-grow: 1; - -// ul { -// list-style: none; -// margin: 0; -// padding: 0; -// } - -// ul li { -// display: inline-block; -// clear: both; -// padding: 3px 10px; -// border-radius: 30px; -// margin-bottom: 2px; -// } - -// .inbound { -// background: #eee; -// float: left; -// } - -// .outbound { -// float: right; -// background: #0084ff; -// color: #fff; -// } - -// .inbound + .outbound { -// border-bottom-right-radius: 5px; -// } - -// .outbound + .outbound { -// border-top-right-radius: 5px; -// border-bottom-right-radius: 5px; -// } - -// .outbound:last-of-type { -// border-bottom-right-radius: 30px; -// } -// } - -.messages { - height: auto; - min-height: calc(100% - 10px); - max-height: calc(100% - 93px); - overflow-y: scroll; - overflow-x: hidden; -} -@media screen and (max-width: 735px) { - .messages { - max-height: calc(100% - 105px); - } -} -.messages::-webkit-scrollbar { - width: 8px; - background: transparent; -} -.messages::-webkit-scrollbar-thumb { - background-color: rgba(0, 0, 0, 0.3); -} -.messages ul li { - display: inline-block; - clear: both; - //float: left; - margin: 5px; - width: calc(100% - 25px); - font-size: 0.9em; -} -.messages ul li:nth-last-child(1) { - margin-bottom: 20px; -} -.messages ul li.sent img { - margin: 6px 8px 0 0; -} -.messages ul li.sent p { - background: #435f7a; - color: #f5f5f5; -} -.messages ul li.replies img { - float: right; - margin: 6px 0 0 8px; -} -.messages ul li.replies p { - background: #f5f5f5; - float: right; -} -.messages ul li img { - width: 22px; - border-radius: 50%; - float: left; -} -.messages ul li p { - display: inline-block; - padding: 10px 15px; - border-radius: 20px; - max-width: 205px; - line-height: 130%; -} -@media screen and (min-width: 735px) { - .messages ul li p { - max-width: 300px; - } -} -.message-input { - position: absolute; - bottom: 0; - width: 100%; - z-index: 99; -} -.message-input .wrap { - position: relative; -} -.message-input .wrap input { - font-family: "proxima-nova", "Source Sans Pro", sans-serif; - float: left; - border: none; - width: calc(100% - 90px); - padding: 11px 32px 10px 8px; - font-size: 0.8em; - color: #32465a; -} -@media screen and (max-width: 735px) { - .message-input .wrap input { - padding: 15px 32px 16px 8px; - } -} -.message-input .wrap input:focus { - outline: none; -} -.message-input .wrap .attachment { - position: absolute; - right: 60px; - z-index: 4; - margin-top: 10px; - font-size: 1.1em; - color: #435f7a; - opacity: 0.5; - cursor: pointer; -} -@media screen and (max-width: 735px) { - .message-input .wrap .attachment { - margin-top: 17px; - right: 65px; - } -} -.message-input .wrap .attachment:hover { - opacity: 1; -} -.message-input .wrap button { - float: right; - border: none; - width: 50px; - padding: 12px 0; - cursor: pointer; - background: #32465a; - color: #f5f5f5; -} -@media screen and (max-width: 735px) { - .message-input .wrap button { - padding: 16px 0; - } -} -.message-input .wrap button:hover { - background: #435f7a; -} -.message-input .wrap button:focus { - outline: none; -} diff --git a/client/src/components/chat-messages-button/chat-messages-button.component.jsx b/client/src/components/chat-messages-button/chat-messages-button.component.jsx deleted file mode 100644 index 8b95eb12b..000000000 --- a/client/src/components/chat-messages-button/chat-messages-button.component.jsx +++ /dev/null @@ -1,47 +0,0 @@ -import { MessageFilled } from "@ant-design/icons"; -import { Badge, Card } from "antd"; -import React from "react"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { toggleChatVisible } from "../../redux/messaging/messaging.actions"; -import { selectChatVisible } from "../../redux/messaging/messaging.selectors"; -import ChatConversationListComponent from "../chat-conversation-list/chat-conversation-list.component"; - -const mapStateToProps = createStructuredSelector({ - chatVisible: selectChatVisible -}); -const mapDispatchToProps = dispatch => ({ - toggleChatVisible: () => dispatch(toggleChatVisible()) -}); - -export function ChatWindowComponent({ - chatVisible, - toggleChatVisible, - conversationList, - unreadCount -}) { - const { t } = useTranslation(); - return ( -
- - - {chatVisible ? ( - - ) : ( -
toggleChatVisible()}> - - {t("messaging.labels.messaging")} -
- )} -
-
-
- ); -} -export default connect( - mapStateToProps, - mapDispatchToProps -)(ChatWindowComponent); diff --git a/client/src/components/chat-messages-button/chat-messages-button.container.jsx b/client/src/components/chat-messages-button/chat-messages-button.container.jsx deleted file mode 100644 index a8f3ffe88..000000000 --- a/client/src/components/chat-messages-button/chat-messages-button.container.jsx +++ /dev/null @@ -1,27 +0,0 @@ -import { useSubscription } from "@apollo/react-hooks"; -import React from "react"; -import { CONVERSATION_LIST_SUBSCRIPTION } from "../../graphql/conversations.queries"; -import AlertComponent from "../alert/alert.component"; -import LoadingSpinner from "../loading-spinner/loading-spinner.component"; -import ChatMessagesButtonComponent from "./chat-messages-button.component"; - -export default function ChatMessagesButtonContainer() { - const { loading, error, data } = useSubscription( - CONVERSATION_LIST_SUBSCRIPTION - ); - if (loading) return ; - if (error) return ; - - return ( - { - return (acc = acc + val.messages_aggregate.aggregate.count); - }, 0)) || - 0 - } - /> - ); -} diff --git a/client/src/components/chat-messages-list/chat-message-list.component.jsx b/client/src/components/chat-messages-list/chat-message-list.component.jsx index 9e69d7af4..2f08657fa 100644 --- a/client/src/components/chat-messages-list/chat-message-list.component.jsx +++ b/client/src/components/chat-messages-list/chat-message-list.component.jsx @@ -1,44 +1,98 @@ -import { CheckCircleOutlined, CheckOutlined } from "@ant-design/icons"; +import Icon from "@ant-design/icons"; import React, { useEffect, useRef } from "react"; +import { FaCheck, FaCheckDouble } from "react-icons/fa"; +import { + AutoSizer, + CellMeasurer, + CellMeasurerCache, + List, +} from "react-virtualized"; +import "./chat-message-list.styles.scss"; export default function ChatMessageListComponent({ messages }) { - const messagesEndRef = useRef(null); + const virtualizedListRef = useRef(null); - const scrollToBottom = () => { - console.log("use"); - !!messagesEndRef.current && - messagesEndRef.current.scrollIntoView({ behavior: "smooth" }); + const _cache = new CellMeasurerCache({ + fixedWidth: true, + // minHeight: 50, + defaultHeight: 100, + }); + + const scrollToBottom = (renderedrows) => { + //console.log("Scrolling to", messages.length); + // !!virtualizedListRef.current && + // virtualizedListRef.current.scrollToRow(messages.length); + // Outstanding isue on virtualization: https://github.com/bvaughn/react-virtualized/issues/1179 + //Scrolling does not work on this version of React. }; useEffect(scrollToBottom, [messages]); - const StatusRender = status => { - switch (status) { - case "sent": - return ; - case "delivered": - return ( - - ); - default: - return null; - } + + const _rowRenderer = ({ index, key, parent, style }) => { + return ( + + {({ measure, registerChild }) => ( +
+
+ {MessageRender(messages[index])} + {StatusRender(messages[index].status)} +
+
+ )} +
+ ); }; return ( -
-
    - {messages.map(item => ( -
  • -

    - {item.text} - {StatusRender(item.status)} -

    -
  • - ))} -
  • -
+
+ + {({ height, width }) => ( + + )} +
); } + +const MessageRender = (message) => { + if (message.image) { + return ( + + Received + + ); + } else { + return {message.text}; + } +}; + +const StatusRender = (status) => { + switch (status) { + case "sent": + return ; + case "delivered": + return ; + default: + return null; + } +}; diff --git a/client/src/components/chat-messages-list/chat-message-list.styles.scss b/client/src/components/chat-messages-list/chat-message-list.styles.scss new file mode 100644 index 000000000..7677012a8 --- /dev/null +++ b/client/src/components/chat-messages-list/chat-message-list.styles.scss @@ -0,0 +1,112 @@ +.message-icon { + //position: absolute; + // bottom: 0rem; + color: whitesmoke; + border: #000000; + margin-left: 0.2rem; + margin-right: 0rem; + // z-index: 5; +} + +.chat { + flex: 1; + //width: 300px; + //border: solid 1px #eee; + display: flex; + flex-direction: column; + margin: 0.8rem 0rem; +} + +.messages { + //margin-top: 30px; + display: flex; + flex-direction: column; +} + +.message { + border-radius: 20px; + padding: 0.25rem 0.8rem; + //margin-top: 5px; + // margin-bottom: 5px; + //display: inline-block; + + .message-img { + max-width: 3rem; + max-height: 3rem; + object-fit: contain; + } +} + +.yours { + align-items: flex-start; +} +.msgmargin { + margin-top: 0.1rem; + margin-bottom: 0.1rem; +} + +.yours .message { + margin-right: 20%; + background-color: #eee; + position: relative; +} + +.yours .message.last:before { + content: ""; + position: absolute; + z-index: 0; + bottom: 0; + left: -7px; + height: 20px; + width: 20px; + background: #eee; + border-bottom-right-radius: 15px; +} +.yours .message.last:after { + content: ""; + position: absolute; + z-index: 1; + bottom: 0; + left: -10px; + width: 10px; + height: 20px; + background: white; + border-bottom-right-radius: 10px; +} + +.mine { + align-items: flex-end; +} + +.mine .message { + color: white; + margin-left: 25%; + background: linear-gradient(to bottom, #00d0ea 0%, #0085d1 100%); + background-attachment: fixed; + position: relative; +} + +.mine .message.last:before { + content: ""; + position: absolute; + z-index: 0; + bottom: 0; + right: -8px; + height: 20px; + width: 20px; + background: linear-gradient(to bottom, #00d0ea 0%, #0085d1 100%); + background-attachment: fixed; + border-bottom-left-radius: 15px; +} + +.mine .message.last:after { + content: ""; + position: absolute; + z-index: 1; + bottom: 0; + right: -10px; + width: 10px; + height: 20px; + background: white; + border-bottom-left-radius: 10px; +} diff --git a/client/src/components/chat-open-button/chat-open-button.component.jsx b/client/src/components/chat-open-button/chat-open-button.component.jsx index 236be79ed..211d70852 100644 --- a/client/src/components/chat-open-button/chat-open-button.component.jsx +++ b/client/src/components/chat-open-button/chat-open-button.component.jsx @@ -1,22 +1,16 @@ +import { MessageFilled } from "@ant-design/icons"; import React from "react"; import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { openConversation } from "../../redux/messaging/messaging.actions"; -import { MessageFilled } from "@ant-design/icons"; -const mapStateToProps = createStructuredSelector({ - //currentUser: selectCurrentUser +import { openChatByPhone } from "../../redux/messaging/messaging.actions"; +const mapDispatchToProps = (dispatch) => ({ + openChatByPhone: (phone) => dispatch(openChatByPhone(phone)), }); -const mapDispatchToProps = dispatch => ({ - openConversation: phone => dispatch(openConversation(phone)) -}); -export default connect( - mapStateToProps, - mapDispatchToProps -)(function ChatOpenButton({ openConversation, phone }) { +export function ChatOpenButton({ phone, jobid, openChatByPhone }) { return ( openConversation(phone)} + onClick={() => openChatByPhone({ phone_num: phone, jobid: jobid })} /> ); -}); +} +export default connect(null, mapDispatchToProps)(ChatOpenButton); diff --git a/client/src/components/chat-popup/chat-popup.component.jsx b/client/src/components/chat-popup/chat-popup.component.jsx new file mode 100644 index 000000000..c631936fe --- /dev/null +++ b/client/src/components/chat-popup/chat-popup.component.jsx @@ -0,0 +1,47 @@ +import { ShrinkOutlined } from "@ant-design/icons"; +import { Col, Row, Typography } from "antd"; +import React from "react"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { toggleChatVisible } from "../../redux/messaging/messaging.actions"; +import ChatConversationListComponent from "../chat-conversation-list/chat-conversation-list.component"; +import ChatConversationContainer from "../chat-conversation/chat-conversation.container"; +import { selectSelectedConversation } from "../../redux/messaging/messaging.selectors"; +import "./chat-popup.styles.scss"; + +const mapStateToProps = createStructuredSelector({ + selectedConversation: selectSelectedConversation, +}); +const mapDispatchToProps = (dispatch) => ({ + toggleChatVisible: () => dispatch(toggleChatVisible()), +}); + +export function ChatPopupComponent({ + conversationList, + selectedConversation, + toggleChatVisible, +}) { + const { t } = useTranslation(); + return ( +
+ + {t("messaging.labels.messaging")} + + toggleChatVisible()} + style={{ position: "absolute", right: ".5rem", top: ".5rem" }} + /> + + +
+ + + + {selectedConversation ? : null} + + + + ); +} +export default connect(mapStateToProps, mapDispatchToProps)(ChatPopupComponent); diff --git a/client/src/components/chat-popup/chat-popup.styles.scss b/client/src/components/chat-popup/chat-popup.styles.scss new file mode 100644 index 000000000..e10e8df18 --- /dev/null +++ b/client/src/components/chat-popup/chat-popup.styles.scss @@ -0,0 +1,20 @@ +.chat-popup { + width: 90vw; + height: 95vh; + display: flex; + flex-direction: column; +} + +.chat-popup-content { + //height: 50vh; + flex: 1; +} + +@media only screen and (min-width: 992px) { + .chat-popup { + width: 60vw; + height: 55vh; + display: flex; + flex-direction: column; + } +} diff --git a/client/src/components/chat-presets/chat-presets.component.jsx b/client/src/components/chat-presets/chat-presets.component.jsx new file mode 100644 index 000000000..70ea96406 --- /dev/null +++ b/client/src/components/chat-presets/chat-presets.component.jsx @@ -0,0 +1,49 @@ +import { DownOutlined } from "@ant-design/icons"; +import { Dropdown, Menu } from "antd"; +import React from "react"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { setMessage } from "../../redux/messaging/messaging.actions"; +import { selectBodyshop } from "../../redux/user/user.selectors"; + +const mapStateToProps = createStructuredSelector({ + //currentUser: selectCurrentUser + bodyshop: selectBodyshop, +}); +const mapDispatchToProps = (dispatch) => ({ + //setUserLanguage: language => dispatch(setUserLanguage(language)) + setMessage: (message) => dispatch(setMessage(message)), +}); + +export function ChatPresetsComponent({ bodyshop, setMessage }) { + const { t } = useTranslation(); + + const menu = ( + + {bodyshop.md_messaging_presets.map((i, idx) => ( + setMessage(i.text)} onItemHover key={idx}> + {i.label} + + ))} + + ); + + return ( + + ); +} +export default connect( + mapStateToProps, + mapDispatchToProps +)(ChatPresetsComponent); diff --git a/client/src/components/chat-send-message/chat-send-message.component.jsx b/client/src/components/chat-send-message/chat-send-message.component.jsx index 940de722f..810777688 100644 --- a/client/src/components/chat-send-message/chat-send-message.component.jsx +++ b/client/src/components/chat-send-message/chat-send-message.component.jsx @@ -1,60 +1,80 @@ +import { LoadingOutlined, SendOutlined } from "@ant-design/icons"; import { Input, Spin } from "antd"; -import { LoadingOutlined } from "@ant-design/icons"; -import React, { useState, useEffect } from "react"; +import React, { useEffect, useRef } from "react"; import { useTranslation } from "react-i18next"; import { connect } from "react-redux"; import { createStructuredSelector } from "reselect"; -import { sendMessage } from "../../redux/messaging/messaging.actions"; +import { logImEXEvent } from "../../firebase/firebase.utils"; +import { + sendMessage, + setMessage, +} from "../../redux/messaging/messaging.actions"; +import { + selectIsSending, + selectMessage, +} from "../../redux/messaging/messaging.selectors"; import { selectBodyshop } from "../../redux/user/user.selectors"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop -}); -const mapDispatchToProps = dispatch => ({ - sendMessage: message => dispatch(sendMessage(message)) + bodyshop: selectBodyshop, + isSending: selectIsSending, + message: selectMessage, }); -function ChatSendMessageComponent({ conversation, bodyshop, sendMessage }) { - const [message, setMessage] = useState(""); +const mapDispatchToProps = (dispatch) => ({ + sendMessage: (message) => dispatch(sendMessage(message)), + setMessage: (message) => dispatch(setMessage(message)), +}); +function ChatSendMessageComponent({ + conversation, + bodyshop, + sendMessage, + isSending, + message, + setMessage, +}) { + const inputArea = useRef(null); useEffect(() => { - if (conversation.isSending === false) { - setMessage(""); - } - }, [conversation, setMessage]); + inputArea.current.focus(); + }, [isSending, setMessage]); + const { t } = useTranslation(); const handleEnter = () => { + logImEXEvent("messaging_send_message"); sendMessage({ to: conversation.phone_num, body: message, messagingServiceSid: bodyshop.messagingservicesid, - conversationid: conversation.id + conversationid: conversation.id, }); }; return ( -
+
a} + ref={inputArea} autoSize={{ minRows: 1, maxRows: 4 }} value={message} - disabled={conversation.isSending} + disabled={isSending} placeholder={t("messaging.labels.typeamessage")} - onChange={e => setMessage(e.target.value)} - onPressEnter={event => { + onChange={(e) => setMessage(e.target.value)} + onPressEnter={(event) => { event.preventDefault(); if (!!!event.shiftKey) handleEnter(); }} /> + diff --git a/client/src/components/chat-tag-ro/chat-tag-ro.component.jsx b/client/src/components/chat-tag-ro/chat-tag-ro.component.jsx new file mode 100644 index 000000000..e32acd0b7 --- /dev/null +++ b/client/src/components/chat-tag-ro/chat-tag-ro.component.jsx @@ -0,0 +1,50 @@ +import React from "react"; +import { AutoComplete } from "antd"; +import { LoadingOutlined, CloseCircleOutlined } from "@ant-design/icons"; +import { useTranslation } from "react-i18next"; + +export default function ChatTagRoComponent({ + searchQueryState, + roOptions, + loading, + executeSearch, + handleInsertTag, + setVisible, +}) { + const { t } = useTranslation(); + + const setSearchQuery = searchQueryState[1]; + const handleSearchQuery = (value) => { + setSearchQuery(value); + }; + + const handleKeyDown = (event) => { + if (event.key === "Enter") { + executeSearch(); + } + }; + + return ( + + + {roOptions.map((item, idx) => ( + + {` ${item.ro_number || ""} | ${item.ownr_fn || ""} ${ + item.ownr_ln || "" + }`} + + ))} + + {loading ? ( + + ) : ( + setVisible(false)} /> + )} + + ); +} diff --git a/client/src/components/chat-tag-ro/chat-tag-ro.container.jsx b/client/src/components/chat-tag-ro/chat-tag-ro.container.jsx new file mode 100644 index 000000000..2cf1aa6d1 --- /dev/null +++ b/client/src/components/chat-tag-ro/chat-tag-ro.container.jsx @@ -0,0 +1,67 @@ +import React, { useState } from "react"; +import ChatTagRo from "./chat-tag-ro.component"; +import { useLazyQuery, useMutation } from "@apollo/react-hooks"; +import { SEARCH_FOR_JOBS } from "../../graphql/jobs.queries"; +import { INSERT_CONVERSATION_TAG } from "../../graphql/job-conversations.queries"; +import { Tag } from "antd"; +import { useTranslation } from "react-i18next"; +import { PlusOutlined } from "@ant-design/icons"; +import { logImEXEvent } from "../../firebase/firebase.utils"; + +export default function ChatTagRoContainer({ conversation }) { + const { t } = useTranslation(); + const [visible, setVisible] = useState(false); + const searchQueryState = useState(""); + const searchText = searchQueryState[0]; + + const [loadRo, { called, loading, data, refetch }] = useLazyQuery( + SEARCH_FOR_JOBS, + { + variables: { search: `%${searchText}%` }, + } + ); + + const executeSearch = () => { + logImEXEvent("messaging_search_job_tag", { searchTerm: searchText }); + if (called) refetch(); + else { + loadRo(); + } + }; + + const [insertTag] = useMutation(INSERT_CONVERSATION_TAG, { + variables: { conversationId: conversation.id }, + }); + + const handleInsertTag = (value, option) => { + logImEXEvent("messaging_add_job_tag"); + insertTag({ variables: { jobId: option.key } }); + setVisible(false); + }; + + const existingJobTags = conversation.job_conversations.map((i) => i.jobid); + + const roOptions = data + ? data.jobs.filter((job) => !existingJobTags.includes(job.id)) + : []; + + return ( +
+ {visible ? ( + + ) : ( + setVisible(true)}> + + {t("messaging.actions.link")} + + )} +
+ ); +} diff --git a/client/src/components/config-form-components/checkbox/checkbox.component.jsx b/client/src/components/config-form-components/checkbox/checkbox.component.jsx new file mode 100644 index 000000000..8b407dc65 --- /dev/null +++ b/client/src/components/config-form-components/checkbox/checkbox.component.jsx @@ -0,0 +1,23 @@ +import React from "react"; +import { Form, Checkbox } from "antd"; +import { useTranslation } from "react-i18next"; + +export default function JobIntakeFormCheckboxComponent({ formItem, readOnly }) { + const { name, label, required } = formItem; + const { t } = useTranslation(); + return ( + + + + ); +} diff --git a/client/src/components/config-form-components/config-form-components.component.jsx b/client/src/components/config-form-components/config-form-components.component.jsx new file mode 100644 index 000000000..abcd6a6b5 --- /dev/null +++ b/client/src/components/config-form-components/config-form-components.component.jsx @@ -0,0 +1,18 @@ +import React from "react"; +import FormTypes from "./config-form-types"; + +export default function ConfirmFormComponents({ componentList, readOnly }) { + return ( +
+ {componentList.map((f, idx) => { + const Comp = FormTypes[f.type]; + + if (!!Comp) { + return ; + } else { + return
Error
; + } + })} +
+ ); +} diff --git a/client/src/components/config-form-components/config-form-types.js b/client/src/components/config-form-components/config-form-types.js new file mode 100644 index 000000000..c2884a2c5 --- /dev/null +++ b/client/src/components/config-form-components/config-form-types.js @@ -0,0 +1,13 @@ +import CheckboxFormItem from "./checkbox/checkbox.component"; +import Rate from "./rate/rate.component"; +import Slider from "./slider/slider.component"; +import Text from "./text/text.component"; +import Textarea from "./textarea/textarea.component"; + +export default { + checkbox: CheckboxFormItem, + slider: Slider, + text: Text, + textarea: Textarea, + rate: Rate, +}; diff --git a/client/src/components/config-form-components/rate/rate.component.jsx b/client/src/components/config-form-components/rate/rate.component.jsx new file mode 100644 index 000000000..6b9d31e73 --- /dev/null +++ b/client/src/components/config-form-components/rate/rate.component.jsx @@ -0,0 +1,22 @@ +import React from "react"; +import { Form, Rate } from "antd"; +import { useTranslation } from "react-i18next"; + +export default function JobIntakeFormCheckboxComponent({ formItem, readOnly }) { + const { name, label, required } = formItem; + const { t } = useTranslation(); + return ( + + + + ); +} diff --git a/client/src/components/config-form-components/slider/slider.component.jsx b/client/src/components/config-form-components/slider/slider.component.jsx new file mode 100644 index 000000000..a3b3e7fe4 --- /dev/null +++ b/client/src/components/config-form-components/slider/slider.component.jsx @@ -0,0 +1,22 @@ +import { Form, Slider } from "antd"; +import React from "react"; +import { useTranslation } from "react-i18next"; + +export default function JobIntakeFormCheckboxComponent({ formItem, readOnly }) { + const { name, label, required, min, max } = formItem; + const { t } = useTranslation(); + return ( + + + + ); +} diff --git a/client/src/components/config-form-components/text/text.component.jsx b/client/src/components/config-form-components/text/text.component.jsx new file mode 100644 index 000000000..623b73666 --- /dev/null +++ b/client/src/components/config-form-components/text/text.component.jsx @@ -0,0 +1,22 @@ +import React from "react"; +import { Form, Input } from "antd"; +import { useTranslation } from "react-i18next"; + +export default function JobIntakeFormCheckboxComponent({ formItem, readOnly }) { + const { name, label, required } = formItem; + const { t } = useTranslation(); + return ( + + + + ); +} diff --git a/client/src/components/config-form-components/textarea/textarea.component.jsx b/client/src/components/config-form-components/textarea/textarea.component.jsx new file mode 100644 index 000000000..d60c58fdc --- /dev/null +++ b/client/src/components/config-form-components/textarea/textarea.component.jsx @@ -0,0 +1,22 @@ +import React from "react"; +import { Form, Input } from "antd"; +import { useTranslation } from "react-i18next"; + +export default function JobIntakeFormCheckboxComponent({ formItem, readOnly }) { + const { name, label, required, rows } = formItem; + const { t } = useTranslation(); + return ( + + + + ); +} diff --git a/client/src/components/conflict/conflict.component.jsx b/client/src/components/conflict/conflict.component.jsx new file mode 100644 index 000000000..efac77288 --- /dev/null +++ b/client/src/components/conflict/conflict.component.jsx @@ -0,0 +1,27 @@ +import React from "react"; +import { Result, Button } from "antd"; +import { useTranslation } from "react-i18next"; + +export default function ConflictComponent() { + const { t } = useTranslation(); + return ( +
+ +
{t("general.labels.instanceconflictext")}
+ +
+ } + /> +
+ ); +} diff --git a/client/src/components/contract-cars/contract-cars.component.jsx b/client/src/components/contract-cars/contract-cars.component.jsx index 7b4d01041..b0388db95 100644 --- a/client/src/components/contract-cars/contract-cars.component.jsx +++ b/client/src/components/contract-cars/contract-cars.component.jsx @@ -7,12 +7,12 @@ export default function ContractsCarsComponent({ loading, data, selectedCar, - handleSelect + handleSelect, }) { const [state, setState] = useState({ sortedInfo: {}, filteredInfo: { text: "" }, - search: "" + search: "", }); const { t } = useTranslation(); @@ -24,7 +24,7 @@ export default function ContractsCarsComponent({ key: "fleetnumber", sorter: (a, b) => alphaSort(a.fleetnumber, b.fleetnumber), sortOrder: - state.sortedInfo.columnKey === "fleetnumber" && state.sortedInfo.order + state.sortedInfo.columnKey === "fleetnumber" && state.sortedInfo.order, }, { title: t("courtesycars.fields.status"), @@ -32,21 +32,24 @@ export default function ContractsCarsComponent({ key: "status", sorter: (a, b) => alphaSort(a.status, b.status), sortOrder: - state.sortedInfo.columnKey === "status" && state.sortedInfo.order + state.sortedInfo.columnKey === "status" && state.sortedInfo.order, + render: (text, record) =>
{t(record.status)}
, }, { title: t("courtesycars.fields.year"), dataIndex: "year", key: "year", sorter: (a, b) => alphaSort(a.year, b.year), - sortOrder: state.sortedInfo.columnKey === "year" && state.sortedInfo.order + sortOrder: + state.sortedInfo.columnKey === "year" && state.sortedInfo.order, }, { title: t("courtesycars.fields.make"), dataIndex: "make", key: "make", sorter: (a, b) => alphaSort(a.make, b.make), - sortOrder: state.sortedInfo.columnKey === "make" && state.sortedInfo.order + sortOrder: + state.sortedInfo.columnKey === "make" && state.sortedInfo.order, }, { title: t("courtesycars.fields.model"), @@ -54,7 +57,7 @@ export default function ContractsCarsComponent({ key: "model", sorter: (a, b) => alphaSort(a.model, b.model), sortOrder: - state.sortedInfo.columnKey === "model" && state.sortedInfo.order + state.sortedInfo.columnKey === "model" && state.sortedInfo.order, }, { title: t("courtesycars.fields.plate"), @@ -62,8 +65,8 @@ export default function ContractsCarsComponent({ key: "plate", sorter: (a, b) => alphaSort(a.plate, b.plate), sortOrder: - state.sortedInfo.columnKey === "plate" && state.sortedInfo.order - } + state.sortedInfo.columnKey === "plate" && state.sortedInfo.order, + }, ]; const handleTableChange = (pagination, filters, sorter) => { @@ -74,7 +77,7 @@ export default function ContractsCarsComponent({ state.search === "" ? data : data.filter( - cc => + (cc) => (cc.fleetnumber || "") .toLowerCase() .includes(state.search.toLowerCase()) || @@ -100,19 +103,19 @@ export default function ContractsCarsComponent({ setState({ ...state, search: e.target.value })} + onChange={(e) => setState({ ...state, search: e.target.value })} /> )} size="small" pagination={{ position: "top" }} - columns={columns.map(item => ({ ...item }))} + columns={columns.map((item) => ({ ...item }))} rowKey="id" dataSource={filteredData} onChange={handleTableChange} rowSelection={{ onSelect: handleSelect, type: "radio", - selectedRowKeys: [selectedCar] + selectedRowKeys: [selectedCar], }} /> ); diff --git a/client/src/components/contract-convert-to-ro/contract-convert-to-ro.component.jsx b/client/src/components/contract-convert-to-ro/contract-convert-to-ro.component.jsx new file mode 100644 index 000000000..eca216735 --- /dev/null +++ b/client/src/components/contract-convert-to-ro/contract-convert-to-ro.component.jsx @@ -0,0 +1,270 @@ +import React, { useState } from "react"; +import { Button, notification, Popover, Radio, Form, InputNumber } from "antd"; +import { useTranslation } from "react-i18next"; +import { useMutation } from "react-apollo"; +import { INSERT_NEW_JOB } from "../../graphql/jobs.queries"; +import moment from "moment"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { + selectBodyshop, + selectCurrentUser, +} from "../../redux/user/user.selectors"; +import { useHistory } from "react-router-dom"; +const mapStateToProps = createStructuredSelector({ + //currentUser: selectCurrentUser + bodyshop: selectBodyshop, + currentUser: selectCurrentUser, +}); +const mapDispatchToProps = (dispatch) => ({ + //setUserLanguage: language => dispatch(setUserLanguage(language)) +}); + +export function ContractConvertToRo({ bodyshop, currentUser, contract }) { + const { t } = useTranslation(); + const [visible, setVisible] = useState(false); + const [loading, setLoading] = useState(false); + const [insertJob] = useMutation(INSERT_NEW_JOB); + const history = useHistory(); + + const handleFinish = async (values) => { + setLoading(true); + + const contractLength = moment(contract.actualreturn).diff( + moment(contract.start), + "days" + ); + const billingLines = [ + { + unq_seq: 1, + line_no: 1, + line_ref: 1, + line_desc: t("contracts.fields.dailyrate"), + db_price: contract.dailyrate, + act_price: contract.dailyrate, + part_qty: contractLength, + part_type: "CCDR", + tax_part: true, + mod_lb_hrs: 0, + // mod_lbr_ty: "PAL", + }, + ]; + + const mileageDiff = + contract.kmend - contract.kmstart - contract.dailyfreekm * contractLength; + if (mileageDiff > 0) { + billingLines.push({ + unq_seq: 2, + line_no: 2, + line_ref: 2, + line_desc: "Fuel Surcharge", + db_price: contract.excesskmrate, + act_price: contract.excesskmrate, + part_type: "CCM", + part_qty: mileageDiff, + tax_part: true, + mod_lb_hrs: 0, + }); + } + + if (values.refuelqty > 0) { + billingLines.push({ + unq_seq: 3, + line_no: 3, + line_ref: 3, + line_desc: t("contracts.fields.refuelcharge"), + db_price: contract.refuelcharge, + act_price: contract.refuelcharge, + part_qty: values.refuelqty, + part_type: "CCF", + tax_part: true, + mod_lb_hrs: 0, + }); + } + if (values.applyCleanupCharge) { + billingLines.push({ + unq_seq: 4, + line_no: 4, + line_ref: 4, + line_desc: t("contracts.fields.cleanupcharge"), + db_price: contract.cleanupcharge, + act_price: contract.cleanupcharge, + part_qty: 1, + part_type: "CCC", + tax_part: true, + mod_lb_hrs: 0, + }); + } + if (contract.damagewaiver) { + //Add for cleanup fee. + billingLines.push({ + unq_seq: 5, + line_no: 5, + line_ref: 5, + line_desc: t("contracts.fields.damagewaiver"), + db_price: contract.damagewaiver, + act_price: contract.damagewaiver, + part_type: "CCD", + part_qty: 1, + tax_part: true, + mod_lb_hrs: 0, + }); + } + + const newJob = { + // converted: true, + shopid: bodyshop.id, + ownerid: contract.job.ownerid, + vehicleid: contract.job.vehicleid, + federal_tax_rate: bodyshop.invoice_tax_rates.federal_tax_rate / 100, + state_tax_rate: bodyshop.invoice_tax_rates.state_tax_rate / 100, + local_tax_rate: bodyshop.invoice_tax_rates.local_tax_rate / 100, + clm_no: `${contract.job.clm_no}-CC`, + clm_total: 1234, //TODO + ownr_fn: contract.job.owner.ownr_fn, + ownr_ln: contract.job.owner.ownr_ln, + ownr_co_nm: contract.job.owner.ownr_co_nm, + ownr_ph1: contract.job.owner.ownr_ph1, + ownr_ea: contract.job.owner.ownr_ea, + v_model_desc: contract.job.vehicle.v_model_desc, + v_model_yr: contract.job.vehicle.v_model_yr, + v_make_desc: contract.job.vehicle.v_make_desc, + v_vin: contract.job.vehicle.v_vin, + status: bodyshop.md_ro_statuses.default_completed, + notes: { + data: [ + { + text: t("contracts.labels.noteconvertedfrom", { + agreementnumber: contract.agreementnumber, + }), + created_by: currentUser.email, + }, + ], + }, + joblines: { + data: billingLines, + }, + parts_tax_rates: { + CCDR: { + prt_type: "CCDR", + prt_discp: 0, + prt_mktyp: false, + prt_mkupp: 0, + prt_tax_in: true, + prt_tax_rt: 0.07, + }, + CCF: { + prt_type: "CCF", + prt_discp: 0, + prt_mktyp: false, + prt_mkupp: 0, + prt_tax_in: true, + prt_tax_rt: 0.07, + }, + CCM: { + prt_type: "CCM", + prt_discp: 0, + prt_mktyp: false, + prt_mkupp: 0, + prt_tax_in: true, + prt_tax_rt: 0.07, + }, + CCC: { + prt_type: "CCC", + prt_discp: 0, + prt_mktyp: false, + prt_mkupp: 0, + prt_tax_in: true, + prt_tax_rt: 0.07, + }, + CCD: { + prt_type: "CCD", + prt_discp: 0, + prt_mktyp: false, + prt_mkupp: 0, + prt_tax_in: true, + prt_tax_rt: 0.07, + }, + }, + }; + const result = await insertJob({ + variables: { job: [newJob] }, + // refetchQueries: ["GET_JOB_BY_PK"], + // awaitRefetchQueries: true, + }); + + if (!!result.errors) { + notification["error"]({ + message: t("jobs.errors.inserting", { + message: JSON.stringify(result.errors), + }), + }); + } else { + notification["success"]({ + message: t("jobs.successes.created"), + onClick: () => { + history.push( + `/manage/jobs/${result.data.insert_jobs.returning[0].id}` + ); + }, + }); + } + + setVisible(false); + setLoading(false); + }; + + const popContent = ( +
+
+ + + {t("general.labels.yes")} + {t("general.labels.no")} + + + + + + + + +
+ ); + + return ( +
+ + + +
+ ); +} +export default connect( + mapStateToProps, + mapDispatchToProps +)(ContractConvertToRo); diff --git a/client/src/components/contract-form/contract-form.component.jsx b/client/src/components/contract-form/contract-form.component.jsx index 6097abe93..9c24cbecc 100644 --- a/client/src/components/contract-form/contract-form.component.jsx +++ b/client/src/components/contract-form/contract-form.component.jsx @@ -1,264 +1,308 @@ -import React, { useState } from "react"; +import { Form, Input, InputNumber } from "antd"; +import React from "react"; import { useTranslation } from "react-i18next"; -import { Form, Input, DatePicker, InputNumber, Button } from "antd"; -import aamva from "aamva"; -import InputPhone from "../form-items-formatted/phone-form-item.component"; import ContractStatusSelector from "../contract-status-select/contract-status-select.component"; - -export default function ContractFormComponent() { - const [state, setState] = useState(""); +import FormDatePicker from "../form-date-picker/form-date-picker.component"; +import FormFieldsChanged from "../form-fields-changed-alert/form-fields-changed-alert.component"; +import InputPhone from "../form-items-formatted/phone-form-item.component"; +import LayoutFormRow from "../layout-form-row/layout-form-row.component"; +export default function ContractFormComponent({ form }) { const { t } = useTranslation(); return (
-
- TEST AREA - setState(e.target.value)} /> - +
+
+ + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
); } diff --git a/client/src/components/contract-license-decode-button/contract-license-decode-button.component.jsx b/client/src/components/contract-license-decode-button/contract-license-decode-button.component.jsx new file mode 100644 index 000000000..96b8b05f9 --- /dev/null +++ b/client/src/components/contract-license-decode-button/contract-license-decode-button.component.jsx @@ -0,0 +1,124 @@ +import { Button, Input, Modal, Typography } from "antd"; +import moment from "moment"; +import React, { useState } from "react"; +import { useTranslation } from "react-i18next"; +import aamva from "../../utils/aamva"; +import DataLabel from "../data-label/data-label.component"; +import LoadingSkeleton from "../loading-skeleton/loading-skeleton.component"; +import { logImEXEvent } from "../../firebase/firebase.utils"; + +export default function ContractLicenseDecodeButton({ form }) { + const { t } = useTranslation(); + const [modalVisible, setModalVisible] = useState(false); + const [loading, setLoading] = useState(false); + const [decodedBarcode, setDecodedBarcode] = useState(null); + console.log("form", form); + + const handleDecode = (e) => { + logImEXEvent("contract_license_decode"); + setLoading(true); + const aamvaParse = aamva.parse(e.currentTarget.value); + console.log("AAMVA", aamvaParse); + setDecodedBarcode(aamvaParse); + setLoading(false); + }; + + const handleInsertForm = () => { + logImEXEvent("contract_license_decode_fill_form"); + + const values = { + driver_dlnumber: decodedBarcode.dl, + driver_dlexpiry: moment( + `20${decodedBarcode.expiration_date}${moment( + decodedBarcode.birthday + ).format("DD")}` + ), + driver_dlst: decodedBarcode.state, + driver_fn: decodedBarcode.name.first, + driver_ln: decodedBarcode.name.last, + driver_addr1: decodedBarcode.address, + driver_city: decodedBarcode.city, + driver_state: decodedBarcode.state, + driver_zip: decodedBarcode.postal_code, + driver_dob: moment(decodedBarcode.birthday), + }; + + form.setFieldsValue(values); + setModalVisible(false); + setDecodedBarcode(null); + }; + const handleClick = () => { + setModalVisible(true); + }; + const handleCancel = () => { + setModalVisible(false); + }; + + return ( +
+ +
+
+ { + if (!loading) setLoading(true); + }} + onPressEnter={handleDecode} + /> +
+ + {decodedBarcode ? ( +
+ + {decodedBarcode.state} + + + {decodedBarcode.dl} + + + {decodedBarcode.name.first} + + + {decodedBarcode.name.last} + + + {decodedBarcode.address} + + + {decodedBarcode.address} + + + {moment( + `20${decodedBarcode.expiration_date}${moment( + decodedBarcode.birthday + ).format("DD")}` + ).format("MM/DD/YYYY")} + + + {moment(decodedBarcode.birthday).format("MM/DD/YYYY")} + +
+ + {t("contracts.labels.correctdataonform")} + +
+
+ ) : ( +
{t("contracts.labels.waitingforscan")}
+ )} +
+
+
+ +
+ ); +} diff --git a/client/src/components/contract-status-select/contract-status-select.component.jsx b/client/src/components/contract-status-select/contract-status-select.component.jsx index f622dafd0..5d675e6fd 100644 --- a/client/src/components/contract-status-select/contract-status-select.component.jsx +++ b/client/src/components/contract-status-select/contract-status-select.component.jsx @@ -1,26 +1,26 @@ -import React, { useState, useEffect } from "react"; +import React, { useState, useEffect, forwardRef } from "react"; import { Select } from "antd"; import { useTranslation } from "react-i18next"; const { Option } = Select; -const ContractStatusComponent = ({ - value = "contracts.status.new", - onChange -}) => { +const ContractStatusComponent = ( + { value = "contracts.status.new", onChange }, + ref +) => { const [option, setOption] = useState(value); const { t } = useTranslation(); useEffect(() => { - if (onChange) { + if (value !== option && onChange) { onChange(option); } - }, [option, onChange]); + }, [value, option, onChange]); return ( ); }; -export default ContractStatusComponent; +export default forwardRef(ContractStatusComponent); diff --git a/client/src/components/contracts-list/contracts-list.component.jsx b/client/src/components/contracts-list/contracts-list.component.jsx index 3a0ee8eaf..e9e9e2944 100644 --- a/client/src/components/contracts-list/contracts-list.component.jsx +++ b/client/src/components/contracts-list/contracts-list.component.jsx @@ -1,15 +1,21 @@ -import { Table } from "antd"; +import { SyncOutlined } from "@ant-design/icons"; +import { Button, Input, Table } from "antd"; +import queryString from "query-string"; import React, { useState } from "react"; import { useTranslation } from "react-i18next"; -import { Link } from "react-router-dom"; +import { Link, useHistory, useLocation } from "react-router-dom"; +import { DateTimeFormatter } from "../../utils/DateFormatter"; import { alphaSort } from "../../utils/sorters"; -import { DateFormatter } from "../../utils/DateFormatter"; +import TimeTicketsDatesSelector from "../ticket-tickets-dates-selector/time-tickets-dates-selector.component"; -export default function ContractsList({ loading, contracts }) { +export default function ContractsList({ loading, contracts, refetch, total }) { const [state, setState] = useState({ sortedInfo: {}, - filteredInfo: { text: "" } + filteredInfo: { text: "" }, }); + const history = useHistory(); + const search = queryString.parse(useLocation().search); + const { page } = search; const { t } = useTranslation(); @@ -26,21 +32,17 @@ export default function ContractsList({ loading, contracts }) { {record.agreementnumber || ""} - ) + ), }, { title: t("jobs.fields.ro_number"), dataIndex: "job.ro_number", key: "job.ro_number", - sorter: (a, b) => alphaSort(a.job.ro_number, b.job.ro_number), - sortOrder: - state.sortedInfo.columnKey === "job.ro_number" && - state.sortedInfo.order, render: (text, record) => ( {record.job.ro_number || ""} - ) + ), }, { title: t("contracts.fields.driver"), @@ -50,7 +52,17 @@ export default function ContractsList({ loading, contracts }) { sortOrder: state.sortedInfo.columnKey === "driver_ln" && state.sortedInfo.order, render: (text, record) => - `${record.driver_fn || ""} ${record.driver_ln || ""}` + `${record.driver_fn || ""} ${record.driver_ln || ""}`, + }, + { + title: t("contracts.fields.vehicle"), + dataIndex: "vehicle", + key: "vehicle", + //sorter: (a, b) => alphaSort(a.status, b.status), + //sortOrder: + // state.sortedInfo.columnKey === "status" && state.sortedInfo.order, + render: (text, record) => + `${record.courtesycar.fleetnumber} - ${record.courtesycar.year} ${record.courtesycar.make} ${record.courtesycar.model}`, }, { title: t("contracts.fields.status"), @@ -59,7 +71,7 @@ export default function ContractsList({ loading, contracts }) { sorter: (a, b) => alphaSort(a.status, b.status), sortOrder: state.sortedInfo.columnKey === "status" && state.sortedInfo.order, - render: (text, record) => t(record.status) + render: (text, record) => t(record.status), }, { title: t("contracts.fields.start"), @@ -68,7 +80,9 @@ export default function ContractsList({ loading, contracts }) { sorter: (a, b) => alphaSort(a.start, b.start), sortOrder: state.sortedInfo.columnKey === "start" && state.sortedInfo.order, - render: (text, record) => {record.start} + render: (text, record) => ( + {record.start} + ), }, { title: t("contracts.fields.scheduledreturn"), @@ -79,21 +93,61 @@ export default function ContractsList({ loading, contracts }) { state.sortedInfo.columnKey === "scheduledreturn" && state.sortedInfo.order, render: (text, record) => ( - {record.scheduledreturn} - ) - } + {record.scheduledreturn} + ), + }, + { + title: t("contracts.fields.actualreturn"), + dataIndex: "actualreturn", + key: "actualreturn", + sorter: (a, b) => alphaSort(a.actualreturn, b.actualreturn), + sortOrder: + state.sortedInfo.columnKey === "actualreturn" && state.sortedInfo.order, + render: (text, record) => ( + {record.actualreturn} + ), + }, ]; const handleTableChange = (pagination, filters, sorter) => { setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); + search.page = pagination.current; + search.sortcolumn = sorter.columnKey; + search.sortorder = sorter.order; + history.push({ search: queryString.stringify(search) }); }; return (
( +
+ +
+ +
+
+ { + search.search = value; + history.push({ search: queryString.stringify(search) }); + }} + /> +
+
+ )} size="small" - pagination={{ position: "top" }} - columns={columns.map(item => ({ ...item }))} + scroll={{ x: "50%", y: "40rem" }} + pagination={{ + position: "top", + pageSize: 25, + current: parseInt(page || 1), + total: total, + }} + columns={columns} rowKey="id" dataSource={contracts} onChange={handleTableChange} diff --git a/client/src/components/courtesy-car-form/courtesy-car-form.component.jsx b/client/src/components/courtesy-car-form/courtesy-car-form.component.jsx index 5542fb26c..3a05ff69c 100644 --- a/client/src/components/courtesy-car-form/courtesy-car-form.component.jsx +++ b/client/src/components/courtesy-car-form/courtesy-car-form.component.jsx @@ -1,25 +1,30 @@ +import { Button, Form, Input, InputNumber } from "antd"; import React from "react"; -import { Form, Input, InputNumber, DatePicker, Button } from "antd"; import { useTranslation } from "react-i18next"; -import CurrencyInput from "../form-items-formatted/currency-form-item.component"; -import CourtesyCarStatus from "../courtesy-car-status-select/courtesy-car-status-select.component"; import CourtesyCarFuelSlider from "../courtesy-car-fuel-select/courtesy-car-fuel-select.component"; +import CourtesyCarStatus from "../courtesy-car-status-select/courtesy-car-status-select.component"; +import FormDatePicker from '../form-date-picker/form-date-picker.component'; +import FormFieldsChanged from "../form-fields-changed-alert/form-fields-changed-alert.component"; +import CurrencyInput from "../form-items-formatted/currency-form-item.component"; -export default function CourtesyCarCreateFormComponent() { +export default function CourtesyCarCreateFormComponent({ form }) { const { t } = useTranslation(); return (
+
+ +
@@ -30,8 +35,8 @@ export default function CourtesyCarCreateFormComponent() { rules={[ { required: true, - message: t("general.validation.required") - } + message: t("general.validation.required"), + }, ]} > @@ -42,8 +47,8 @@ export default function CourtesyCarCreateFormComponent() { rules={[ { required: true, - message: t("general.validation.required") - } + message: t("general.validation.required"), + }, ]} > @@ -54,8 +59,8 @@ export default function CourtesyCarCreateFormComponent() { rules={[ { required: true, - message: t("general.validation.required") - } + message: t("general.validation.required"), + }, ]} > @@ -66,8 +71,8 @@ export default function CourtesyCarCreateFormComponent() { rules={[ { required: true, - message: t("general.validation.required") - } + message: t("general.validation.required"), + }, ]} > @@ -78,8 +83,8 @@ export default function CourtesyCarCreateFormComponent() { rules={[ { required: true, - message: t("general.validation.required") - } + message: t("general.validation.required"), + }, ]} > @@ -94,7 +99,7 @@ export default function CourtesyCarCreateFormComponent() { label={t("courtesycars.fields.purchasedate")} name="purchasedate" > - + - + - + @@ -132,8 +137,8 @@ export default function CourtesyCarCreateFormComponent() { rules={[ { required: true, - message: t("general.validation.required") - } + message: t("general.validation.required"), + }, ]} > @@ -144,11 +149,11 @@ export default function CourtesyCarCreateFormComponent() { rules={[ { required: true, - message: t("general.validation.required") - } + message: t("general.validation.required"), + }, ]} > - + @@ -162,8 +167,8 @@ export default function CourtesyCarCreateFormComponent() { rules={[ { required: true, - message: t("general.validation.required") - } + message: t("general.validation.required"), + }, ]} > @@ -174,11 +179,11 @@ export default function CourtesyCarCreateFormComponent() { rules={[ { required: true, - message: t("general.validation.required") - } + message: t("general.validation.required"), + }, ]} > - + - + diff --git a/client/src/components/courtesy-car-fuel-select/courtesy-car-fuel-select.component.jsx b/client/src/components/courtesy-car-fuel-select/courtesy-car-fuel-select.component.jsx index 45241dea5..fa62ebe39 100644 --- a/client/src/components/courtesy-car-fuel-select/courtesy-car-fuel-select.component.jsx +++ b/client/src/components/courtesy-car-fuel-select/courtesy-car-fuel-select.component.jsx @@ -1,23 +1,23 @@ import { Slider } from "antd"; -import React, { useEffect, useState } from "react"; +import React, { useEffect, useState, forwardRef } from "react"; import { useTranslation } from "react-i18next"; -const CourtesyCarFuelComponent = ({ value = 100, onChange }) => { +const CourtesyCarFuelComponent = ({ value = 100, onChange }, ref) => { const [option, setOption] = useState(value); const { t } = useTranslation(); useEffect(() => { - if (onChange) { + if (value !== option && onChange) { onChange(option); } - }, [option, onChange]); + }, [value, option, onChange]); const marks = { 0: { style: { - color: "#f50" + color: "#f50", }, - label: t("courtesycars.labels.fuel.empty") + label: t("courtesycars.labels.fuel.empty"), }, 13: t("courtesycars.labels.fuel.18"), 25: t("courtesycars.labels.fuel.14"), @@ -28,14 +28,15 @@ const CourtesyCarFuelComponent = ({ value = 100, onChange }) => { 88: t("courtesycars.labels.fuel.78"), 100: { style: { - color: "#008000" + color: "#008000", }, - label: {t("courtesycars.labels.fuel.full")} - } + label: {t("courtesycars.labels.fuel.full")}, + }, }; return ( { /> ); }; -export default CourtesyCarFuelComponent; +export default forwardRef(CourtesyCarFuelComponent); diff --git a/client/src/components/courtesy-car-return-modal/courtesy-car-return-modal.component.jsx b/client/src/components/courtesy-car-return-modal/courtesy-car-return-modal.component.jsx index 1a516a9ad..7966c8093 100644 --- a/client/src/components/courtesy-car-return-modal/courtesy-car-return-modal.component.jsx +++ b/client/src/components/courtesy-car-return-modal/courtesy-car-return-modal.component.jsx @@ -1,7 +1,8 @@ -import { Form, DatePicker, InputNumber } from "antd"; +import { Form, InputNumber } from "antd"; import React from "react"; import { useTranslation } from "react-i18next"; import CourtesyCarFuelSlider from "../courtesy-car-fuel-select/courtesy-car-fuel-select.component"; +import FormDatePicker from '../form-date-picker/form-date-picker.component'; export default function CourtesyCarReturnModalComponent() { const { t } = useTranslation(); @@ -18,7 +19,7 @@ export default function CourtesyCarReturnModalComponent() { } ]} > - + ({ - toggleModalVisible: () => dispatch(toggleModalVisible("courtesyCarReturn")) +const mapDispatchToProps = (dispatch) => ({ + toggleModalVisible: () => dispatch(toggleModalVisible("courtesyCarReturn")), }); export function InvoiceEnterModalContainer({ courtesyCarReturnModal, toggleModalVisible, - bodyshop + bodyshop, }) { + const [loading, setLoading] = useState(false); const { visible, context, actions } = courtesyCarReturnModal; const { t } = useTranslation(); const [form] = Form.useForm(); const [updateContract] = useMutation(RETURN_CONTRACT); - const handleFinish = values => { + const handleFinish = (values) => { + setLoading(true); updateContract({ variables: { contractId: context.contractId, cccontract: { kmend: values.kmend, actualreturn: values.actualreturn, - status: "contracts.status.returned" + status: "contracts.status.returned", }, courtesycarid: context.courtesyCarId, courtesycar: { status: "courtesycars.status.in", fuel: values.fuel, - mileage: values.kmend - } - } + mileage: values.kmend, + }, + }, }) - .then(r => { + .then((r) => { if (actions.refetch) actions.refetch(); toggleModalVisible(); }) - .catch(error => { + .catch((error) => { notification["error"]({ - message: t("contracts.errors.returning", { error: error }) + message: t("contracts.errors.returning", { error: error }), }); }); + setLoading(false); }; return ( @@ -65,7 +68,7 @@ export function InvoiceEnterModalContainer({ width={"90%"} okText={t("general.actions.save")} onOk={() => form.submit()} - okButtonProps={{ htmlType: "submit" }} + okButtonProps={{ htmlType: "submit", loading: loading }} >
{ +const CourtesyCarStatusComponent = ( + { value = "courtesycars.status.in", onChange }, + ref +) => { const [option, setOption] = useState(value); const { t } = useTranslation(); useEffect(() => { - if (onChange) { + if (value !== option && onChange) { onChange(option); } - }, [option, onChange]); + }, [value, option, onChange]); return ( ); }; -export default CourtesyCarStatusComponent; +export default forwardRef(CourtesyCarStatusComponent); diff --git a/client/src/components/courtesy-cars-list/courtesy-cars-list.component.jsx b/client/src/components/courtesy-cars-list/courtesy-cars-list.component.jsx index 5fa6e003e..aa3539770 100644 --- a/client/src/components/courtesy-cars-list/courtesy-cars-list.component.jsx +++ b/client/src/components/courtesy-cars-list/courtesy-cars-list.component.jsx @@ -1,15 +1,15 @@ -import { Table } from "antd"; +import { Table, Button, Input } from "antd"; import React, { useState } from "react"; import { useTranslation } from "react-i18next"; import { Link } from "react-router-dom"; import { alphaSort } from "../../utils/sorters"; - -export default function CourtesyCarsList({ loading, courtesycars }) { +import { SyncOutlined } from "@ant-design/icons"; +export default function CourtesyCarsList({ loading, courtesycars, refetch }) { const [state, setState] = useState({ sortedInfo: {}, - filteredInfo: { text: "" } + filteredInfo: { text: "" }, }); - + const [searchText, setSearchText] = useState(""); const { t } = useTranslation(); const columns = [ @@ -19,7 +19,7 @@ export default function CourtesyCarsList({ loading, courtesycars }) { key: "fleetnumber", sorter: (a, b) => alphaSort(a.fleetnumber, b.fleetnumber), sortOrder: - state.sortedInfo.columnKey === "fleetnumber" && state.sortedInfo.order + state.sortedInfo.columnKey === "fleetnumber" && state.sortedInfo.order, }, { title: t("courtesycars.fields.vin"), @@ -29,30 +29,43 @@ export default function CourtesyCarsList({ loading, courtesycars }) { sortOrder: state.sortedInfo.columnKey === "vin" && state.sortedInfo.order, render: (text, record) => ( {record.vin} - ) + ), }, { title: t("courtesycars.fields.status"), dataIndex: "status", key: "status", sorter: (a, b) => alphaSort(a.status, b.status), + filters: [ + { + text: t("courtesycars.status.in"), + value: "courtesycars.status.in", + }, + { + text: t("courtesycars.status.out"), + value: "courtesycars.status.out", + }, + ], + onFilter: (value, record) => value.includes(record.status), sortOrder: state.sortedInfo.columnKey === "status" && state.sortedInfo.order, - render: (text, record) => t(record.status) + render: (text, record) => t(record.status), }, { title: t("courtesycars.fields.year"), dataIndex: "year", key: "year", sorter: (a, b) => alphaSort(a.year, b.year), - sortOrder: state.sortedInfo.columnKey === "year" && state.sortedInfo.order + sortOrder: + state.sortedInfo.columnKey === "year" && state.sortedInfo.order, }, { title: t("courtesycars.fields.make"), dataIndex: "make", key: "make", sorter: (a, b) => alphaSort(a.make, b.make), - sortOrder: state.sortedInfo.columnKey === "make" && state.sortedInfo.order + sortOrder: + state.sortedInfo.columnKey === "make" && state.sortedInfo.order, }, { title: t("courtesycars.fields.model"), @@ -60,22 +73,69 @@ export default function CourtesyCarsList({ loading, courtesycars }) { key: "model", sorter: (a, b) => alphaSort(a.model, b.model), sortOrder: - state.sortedInfo.columnKey === "model" && state.sortedInfo.order - } + state.sortedInfo.columnKey === "model" && state.sortedInfo.order, + }, + { + title: t("courtesycars.fields.outwith"), + dataIndex: "outwith", + key: "outwith", + // sorter: (a, b) => alphaSort(a.model, b.model), + sortOrder: + state.sortedInfo.columnKey === "model" && state.sortedInfo.order, + render: (text, record) => ( +
+ {record.cccontracts.length === 1 + ? record.cccontracts[0].job.ro_number + : null} +
+ ), + }, ]; const handleTableChange = (pagination, filters, sorter) => { setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); }; + const tableData = searchText + ? courtesycars.filter( + (c) => + (c.fleetnumber || "") + .toLowerCase() + .includes(searchText.toLowerCase()) || + (c.vin || "").toLowerCase().includes(searchText.toLowerCase()) || + (c.year || "").toLowerCase().includes(searchText.toLowerCase()) || + (c.make || "").toLowerCase().includes(searchText.toLowerCase()) || + (c.model || "").toLowerCase().includes(searchText.toLowerCase()) || + (t(c.status) || "").toLowerCase().includes(searchText.toLowerCase()) + ) + : courtesycars; return (
( +
+ + + + + { + setSearchText(e.target.value); + }} + value={searchText} + enterButton + /> +
+ )} size="small" pagination={{ position: "top" }} - columns={columns.map(item => ({ ...item }))} + columns={columns.map((item) => ({ ...item }))} rowKey="id" - dataSource={courtesycars} + dataSource={tableData} onChange={handleTableChange} /> ); diff --git a/client/src/components/csi-response-form/csi-response-form.container.jsx b/client/src/components/csi-response-form/csi-response-form.container.jsx new file mode 100644 index 000000000..ff9bd0fb2 --- /dev/null +++ b/client/src/components/csi-response-form/csi-response-form.container.jsx @@ -0,0 +1,43 @@ +import { useQuery } from "@apollo/react-hooks"; +import { Form } from "antd"; +import queryString from "query-string"; +import React, { useEffect } from "react"; +import { useLocation } from "react-router-dom"; +import { QUERY_CSI_RESPONSE_BY_PK } from "../../graphql/csi.queries"; +import ConfigFormComponents from "../config-form-components/config-form-components.component"; +import { useTranslation } from "react-i18next"; +import LoadingSpinner from "../loading-spinner/loading-spinner.component"; +import AlertComponent from "../alert/alert.component"; + +export default function CsiResponseFormContainer() { + const { t } = useTranslation(); + const [form] = Form.useForm(); + const searchParams = queryString.parse(useLocation().search); + const { responseid } = searchParams; + const { loading, error, data } = useQuery(QUERY_CSI_RESPONSE_BY_PK, { + variables: { + id: responseid, + }, + skip: !!!responseid, + }); + + useEffect(() => { + form.resetFields(); + }, [data, form]); + + if (!!!responseid) return
{t("csi.labels.noneselected")}
; + + if (loading) return ; + if (error) return ; + + return ( +
+ + + +
+ ); +} diff --git a/client/src/components/csi-response-list-paginated/csi-response-list-paginated.component.jsx b/client/src/components/csi-response-list-paginated/csi-response-list-paginated.component.jsx new file mode 100644 index 000000000..dbbb3bcf7 --- /dev/null +++ b/client/src/components/csi-response-list-paginated/csi-response-list-paginated.component.jsx @@ -0,0 +1,159 @@ +import { SyncOutlined } from "@ant-design/icons"; +import { Button, Table } from "antd"; +import queryString from "query-string"; +import React, { useState } from "react"; +import { useTranslation } from "react-i18next"; +import { Link, useHistory, useLocation } from "react-router-dom"; +import { DateFormatter } from "../../utils/DateFormatter"; +import { alphaSort } from "../../utils/sorters"; + +export default function CsiResponseListPaginated({ + refetch, + loading, + responses, + total, +}) { + const search = queryString.parse(useLocation().search); + const { responseid, page, sortcolumn, sortorder } = search; + const history = useHistory(); + const [state, setState] = useState({ + sortedInfo: {}, + filteredInfo: { text: "" }, + }); + + const { t } = useTranslation(); + const columns = [ + { + title: t("jobs.fields.ro_number"), + dataIndex: "ro_number", + key: "ro_number", + width: "8%", + sorter: (a, b) => alphaSort(a.job.ro_number, b.job.ro_number), + sortOrder: sortcolumn === "ro_number" && sortorder, + + render: (text, record) => ( + {record.job.ro_number} + ), + }, + { + title: t("jobs.fields.est_number"), + dataIndex: "est_number", + key: "est_number", + width: "8%", + sorter: (a, b) => a.job.est_number - b.job.est_number, + sortOrder: sortcolumn === "est_number" && sortorder, + + render: (text, record) => ( + + {record.job.est_number} + + ), + }, + { + title: t("jobs.fields.owner"), + dataIndex: "owner", + key: "owner", + ellipsis: true, + sorter: (a, b) => alphaSort(a.job.ownr_ln, b.job.ownr_ln), + width: "25%", + sortOrder: sortcolumn === "owner" && sortorder, + render: (text, record) => { + return record.owner ? ( + + {`${record.job.ownr_fn || ""} ${record.job.ownr_ln || ""}`} + + ) : ( + {`${record.job.ownr_fn || ""} ${ + record.job.ownr_ln || "" + }`} + ); + }, + }, + { + title: t("csi.fields.completedon"), + dataIndex: "completedon", + key: "completedon", + ellipsis: true, + sorter: (a, b) => a.completedon - b.completedon, + width: "25%", + sortOrder: sortcolumn === "completedon" && sortorder, + render: (text, record) => { + return record.completedon ? ( + {record.completedon} + ) : null; + }, + }, + ]; + + const handleTableChange = (pagination, filters, sorter) => { + setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); + search.page = pagination.current; + search.sortcolumn = sorter.columnKey; + search.sortorder = sorter.order; + history.push({ search: queryString.stringify(search) }); + }; + + const handleOnRowClick = (record) => { + if (record) { + if (record.id) { + search.responseid = record.id; + history.push({ search: queryString.stringify(search) }); + } + } else { + delete search.responseid; + history.push({ search: queryString.stringify(search) }); + } + }; + + return ( +
+
{ + return ( +
+ + { + // { + // search.search = value; + // history.push({ search: queryString.stringify(search) }); + // }} + // enterButton + // /> + } +
+ ); + }} + size="small" + pagination={{ + position: "top", + pageSize: 25, + current: parseInt(page || 1), + total: total, + }} + columns={columns} + rowKey="id" + dataSource={responses} + onChange={handleTableChange} + rowSelection={{ + onSelect: (record) => { + handleOnRowClick(record); + }, + selectedRowKeys: [responseid], + type: "radio", + }} + onRow={(record, rowIndex) => { + return { + onClick: (event) => { + handleOnRowClick(record); + }, // click row + }; + }} + /> + + ); +} diff --git a/client/src/components/dashboard-components/monthly-revenue-graph/monthly-revenue-graph.component.jsx b/client/src/components/dashboard-components/monthly-revenue-graph/monthly-revenue-graph.component.jsx new file mode 100644 index 000000000..095c0d93d --- /dev/null +++ b/client/src/components/dashboard-components/monthly-revenue-graph/monthly-revenue-graph.component.jsx @@ -0,0 +1,82 @@ +import { Card } from "antd"; +import moment from "moment"; +import React from "react"; +import { useTranslation } from "react-i18next"; +import { + Area, + Bar, + CartesianGrid, + ComposedChart, + Legend, + ResponsiveContainer, + Tooltip, + XAxis, + YAxis +} from "recharts"; +import * as Utils from "../../scoreboard-targets-table/scoreboard-targets-table.util"; + +export default function DashboardMonthlyRevenueGraph({ data, ...cardProps }) { + const { t } = useTranslation(); + + const jobsByDate = { + "2020-07-5": [{ clm_total: 1224 }], + "2020-07-8": [{ clm_total: 987 }, { clm_total: 8755 }], + "2020-07-12": [{ clm_total: 684 }, { clm_total: 12022 }], + "2020-07-21": [{ clm_total: 15000 }], + "2020-07-28": [{ clm_total: 122 }, { clm_total: 4522 }], + }; + + const listOfDays = Utils.ListOfDaysInCurrentMonth(); + + const chartData = listOfDays.reduce((acc, val) => { + //Sum up the current day. + let dailySales; + if (!!jobsByDate[val]) { + dailySales = jobsByDate[val].reduce((dayAcc, dayVal) => { + return dayAcc + dayVal.clm_total; + }, 0); + } else { + dailySales = 0; + } + + const theValue = { + date: moment(val).format("D dd"), + dailySales, + accSales: + acc.length > 0 ? acc[acc.length - 1].accSales + dailySales : dailySales, + }; + + return [...acc, theValue]; + }, []); + + return ( + + + + + + + + + + + + + + ); +} diff --git a/client/src/components/dashboard-components/pojected-monthly-sales/projected-monthly-sales.component.jsx b/client/src/components/dashboard-components/pojected-monthly-sales/projected-monthly-sales.component.jsx new file mode 100644 index 000000000..65d3f8edc --- /dev/null +++ b/client/src/components/dashboard-components/pojected-monthly-sales/projected-monthly-sales.component.jsx @@ -0,0 +1,30 @@ +import { ArrowDownOutlined, ArrowUpOutlined } from "@ant-design/icons"; +import { Card, Statistic } from "antd"; +import React from "react"; +import { useTranslation } from "react-i18next"; + +export default function DashboardProjectedMonthlySales({ data, ...cardProps }) { + const { t } = useTranslation(); + const aboveTargetMonthlySales = false; + + return ( + + + {aboveTargetMonthlySales ? ( + + ) : ( + + )} + $ + + } + valueStyle={{ color: aboveTargetMonthlySales ? "green" : "red" }} + /> + + ); +} diff --git a/client/src/components/dashboard-components/total-production-dollars/total-production-dollars.component.jsx b/client/src/components/dashboard-components/total-production-dollars/total-production-dollars.component.jsx new file mode 100644 index 000000000..46e3e8f2c --- /dev/null +++ b/client/src/components/dashboard-components/total-production-dollars/total-production-dollars.component.jsx @@ -0,0 +1,33 @@ +import React from "react"; +import { Card, Statistic } from "antd"; +import { useTranslation } from "react-i18next"; +import { ArrowDownOutlined, ArrowUpOutlined } from "@ant-design/icons"; + +export default function DashboardTotalProductionDollars({ + data, + ...cardProps +}) { + const { t } = useTranslation(); + const aboveTargetProductionDollars = false; + + return ( + + + {aboveTargetProductionDollars ? ( + + ) : ( + + )} + $ + + } + valueStyle={{ color: aboveTargetProductionDollars ? "green" : "red" }} + /> + + ); +} diff --git a/client/src/components/dashboard-components/total-production-hours/total-production-hours.component.jsx b/client/src/components/dashboard-components/total-production-hours/total-production-hours.component.jsx new file mode 100644 index 000000000..48b087cd8 --- /dev/null +++ b/client/src/components/dashboard-components/total-production-hours/total-production-hours.component.jsx @@ -0,0 +1,19 @@ +import React from "react"; +import { Card, Statistic } from "antd"; +import { useTranslation } from "react-i18next"; +import { ArrowDownOutlined, ArrowUpOutlined } from "@ant-design/icons"; + +export default function DashboardTotalProductionHours({ data, ...cardProps }) { + const { t } = useTranslation(); + const aboveTargetHours = true; + return ( + + : } + valueStyle={{ color: aboveTargetHours ? "green" : "red" }} + /> + + ); +} diff --git a/client/src/components/dashboard-grid/dashboard-grid.component.jsx b/client/src/components/dashboard-grid/dashboard-grid.component.jsx index 353799588..a6b29f1eb 100644 --- a/client/src/components/dashboard-grid/dashboard-grid.component.jsx +++ b/client/src/components/dashboard-grid/dashboard-grid.component.jsx @@ -1,64 +1,185 @@ -import { Card } from "antd"; +import Icon from "@ant-design/icons"; +import { Button, Dropdown, Menu, notification } from "antd"; import React, { useState } from "react"; +import { useMutation, useQuery } from "react-apollo"; import { Responsive, WidthProvider } from "react-grid-layout"; -import styled from "styled-components"; +import { useTranslation } from "react-i18next"; +import { MdClose } from "react-icons/md"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { logImEXEvent } from "../../firebase/firebase.utils"; +import { QUERY_DASHBOARD_DETAILS } from "../../graphql/bodyshop.queries"; +import { UPDATE_DASHBOARD_LAYOUT } from "../../graphql/user.queries"; +import { + selectBodyshop, + selectCurrentUser, +} from "../../redux/user/user.selectors"; +import AlertComponent from "../alert/alert.component"; +import DashboardMonthlyRevenueGraph from "../dashboard-components/monthly-revenue-graph/monthly-revenue-graph.component"; +import DashboardProjectedMonthlySales from "../dashboard-components/pojected-monthly-sales/projected-monthly-sales.component"; +import DashboardTotalProductionDollars from "../dashboard-components/total-production-dollars/total-production-dollars.component"; +import DashboardTotalProductionHours from "../dashboard-components/total-production-hours/total-production-hours.component"; +import LoadingSkeleton from "../loading-skeleton/loading-skeleton.component"; //Combination of the following: // /node_modules/react-grid-layout/css/styles.css // /node_modules/react-resizable/css/styles.css import "./dashboard-grid.styles.css"; - -const Sdiv = styled.div` - position: absolute; - height: 80%; - width: 80%; - top: 10%; - left: 10%; - // background-color: #ffcc00; -`; +import "./dashboard-grid.styles.scss"; const ResponsiveReactGridLayout = WidthProvider(Responsive); -export default function DashboardGridComponent() { +const mapStateToProps = createStructuredSelector({ + currentUser: selectCurrentUser, + bodyshop: selectBodyshop, +}); +const mapDispatchToProps = (dispatch) => ({ + //setUserLanguage: language => dispatch(setUserLanguage(language)) +}); + +export function DashboardGridComponent({ currentUser, bodyshop }) { + const { loading, error, data } = useQuery(QUERY_DASHBOARD_DETAILS); + console.log("DashboardGridComponent -> data", data) + const { t } = useTranslation(); const [state, setState] = useState({ - layout: [ - { i: "1", x: 0, y: 0, w: 2, h: 2 }, - { i: "2", x: 2, y: 0, w: 2, h: 2 }, - { i: "3", x: 4, y: 0, w: 2, h: 2 } - ] + layout: bodyshop.associations[0].user.dashboardlayout || [ + { i: "ProductionDollars", x: 0, y: 0, w: 2, h: 2 }, + // { i: "ProductionHours", x: 2, y: 0, w: 2, h: 2 }, + ], }); + const [updateLayout] = useMutation(UPDATE_DASHBOARD_LAYOUT); - const defaultProps = { - className: "layout", - breakpoints: { lg: 1200, md: 996, sm: 768, xs: 480, xxs: 0 } - // cols: { lg: 12, md: 10, sm: 6, xs: 4, xxs: 2 }, - // rowHeight: 100 + const handleLayoutChange = async (newLayout) => { + logImEXEvent("dashboard_change_layout"); + setState({ ...state, layout: newLayout }); + const result = await updateLayout({ + variables: { email: currentUser.email, layout: newLayout }, + }); + + if (!!result.errors) { + notification["error"]({ + message: t("dashboard.errors.updatinglayout", { + message: JSON.stringify(result.errors), + }), + }); + } + }; + + const handleRemoveComponent = (key) => { + logImEXEvent("dashboard_remove_component", { name: key }); + + const idxToRemove = state.layout.findIndex((i) => i.i === key); + const newLayout = state.layout; + newLayout.splice(idxToRemove, 1); + console.log(newLayout); + handleLayoutChange(newLayout); + }; + + const handleAddComponent = (e) => { + logImEXEvent("dashboard_add_component", { name: e }); + + handleLayoutChange([ + ...state.layout, + { + i: e.key, + x: (state.layout.length * 2) % (state.cols || 12), + y: Infinity, // puts it at the bottom + w: componentList[e.key].w || 2, + h: componentList[e.key].h || 2, + }, + ]); }; - // We're using the cols coming back from this to calculate where to add new items. const onBreakpointChange = (breakpoint, cols) => { - console.log("breakpoint, cols", breakpoint, cols); - // setState({ ...state, breakpoint: breakpoint, cols: cols }); + setState({ ...state, breakpoint: breakpoint, cols: cols }); }; - if (true) return null; + + const existingLayoutKeys = state.layout.map((i) => i.i); + const addComponentOverlay = ( + + {Object.keys(componentList).map((key) => ( + + {componentList[key].label} + + ))} + + ); + + if (error) return ; + return ( - - The Grid. +
+ + + { - console.log("layout", layout); - setState({ ...state, layout }); - }}> + onLayoutChange={handleLayoutChange} + onBreakpointChange={onBreakpointChange}> {state.layout.map((item, index) => { + const TheComponent = componentList[item.i].component; return ( - - A Card {index} - +
+ + handleRemoveComponent(item.i)} + /> + + +
); })}
- +
); } + +export default connect( + mapStateToProps, + mapDispatchToProps +)(DashboardGridComponent); + +const componentList = { + ProductionDollars: { + label: "Production Dollars", + component: DashboardTotalProductionDollars, + w: 2, + h: 1, + }, + ProductionHours: { + label: "Production Hours", + component: DashboardTotalProductionHours, + w: 2, + h: 1, + }, + ProjectedMonthlySales: { + label: "Projected Monthly Sales", + component: DashboardProjectedMonthlySales, + w: 2, + h: 1, + }, + MonthlyRevenueGraph: { + label: "Monthly Sales Graph", + component: DashboardMonthlyRevenueGraph, + w: 2, + h: 2, + }, +}; diff --git a/client/src/components/dashboard-grid/dashboard-grid.styles.css b/client/src/components/dashboard-grid/dashboard-grid.styles.css index 10969c599..6b74ec5ee 100644 --- a/client/src/components/dashboard-grid/dashboard-grid.styles.css +++ b/client/src/components/dashboard-grid/dashboard-grid.styles.css @@ -124,3 +124,5 @@ .react-resizable-hide > .react-resizable-handle { display: none; } + + diff --git a/client/src/components/dashboard-grid/dashboard-grid.styles.scss b/client/src/components/dashboard-grid/dashboard-grid.styles.scss new file mode 100644 index 000000000..425ba3788 --- /dev/null +++ b/client/src/components/dashboard-grid/dashboard-grid.styles.scss @@ -0,0 +1,12 @@ +.dashboard-card { + // background-color: green; + + .ant-card-body { + // background-color: red; + height: 100%; + width: 100%; + display: flex; + flex-direction: column; + align-items: center; + } +} diff --git a/client/src/components/data-label/data-label.component.jsx b/client/src/components/data-label/data-label.component.jsx new file mode 100644 index 000000000..3e28c056e --- /dev/null +++ b/client/src/components/data-label/data-label.component.jsx @@ -0,0 +1,25 @@ +import React from "react"; + +export default function DataLabel({ + label, + hideIfNull, + children, + vertical, + visible = true, + ...props +}) { + if (!visible || (hideIfNull && !!!children)) return null; + + return ( +
+
{`${label}: `}
+
+ {children} +
+
+ ); +} diff --git a/client/src/components/documents-upload/documents-upload.container.jsx b/client/src/components/documents-upload/documents-upload.container.jsx index 0b0fe4615..b63fe8f0a 100644 --- a/client/src/components/documents-upload/documents-upload.container.jsx +++ b/client/src/components/documents-upload/documents-upload.container.jsx @@ -1,17 +1,9 @@ -import { useMutation } from "@apollo/react-hooks"; -import { notification } from "antd"; -import axios from "axios"; -import React, { useRef } from "react"; -import { useTranslation } from "react-i18next"; -import Resizer from "react-image-file-resizer"; +import React from "react"; import { connect } from "react-redux"; import { createStructuredSelector } from "reselect"; -import { INSERT_NEW_DOCUMENT } from "../../graphql/documents.queries"; -import { - selectBodyshop, - selectCurrentUser, -} from "../../redux/user/user.selectors"; +import { selectBodyshop, selectCurrentUser } from "../../redux/user/user.selectors"; import DocumentsUploadComponent from "./documents-upload.component"; +import { handleUpload } from "./documents-upload.utility"; const mapStateToProps = createStructuredSelector({ currentUser: selectCurrentUser, @@ -27,137 +19,18 @@ export function DocumentsUploadContainer({ callbackAfterUpload, onChange, }) { - const { t } = useTranslation(); - const [insertNewDocument] = useMutation(INSERT_NEW_DOCUMENT); - const UploadRef = useRef(null); - - const handleUpload = (ev) => { - const { onError, onSuccess, onProgress } = ev; - //If PDF, upload directly. - //If JPEG, resize and upload. - //TODO If this is just an invoice job? Where to put it? - let key = `${bodyshop.id}/${jobId}/${ev.file.name}`; - if (ev.file.type.includes("image")) { - Resizer.imageFileResizer( - ev.file, - 2500, - 2500, - "JPEG", - 75, - 0, - (uri) => { - let file = new File([uri], ev.file.name, {}); - file.uid = ev.file.uid; - uploadToS3(key, file.type, file, onError, onSuccess, onProgress); - }, - "blob" - ); - } else { - uploadToS3(key, ev.file.type, ev.file, onError, onSuccess, onProgress); - } - }; - - const uploadToS3 = ( - fileName, - fileType, - file, - onError, - onSuccess, - onProgress - ) => { - let timestamp = Math.floor(Date.now() / 1000); - let public_id = fileName; - let tags = `${bodyshop.textid},${ - tagsArray ? tagsArray.map((tag) => `${tag},`) : "" - }`; - let eager = "w_200,h_200,c_thumb"; - axios - .post("/media/sign", { - eager: eager, - public_id: public_id, - tags: tags, - timestamp: timestamp, - }) - .then((response) => { - var signature = response.data; - var options = { - headers: { "X-Requested-With": "XMLHttpRequest" }, - onUploadProgress: (e) => { - onProgress({ percent: (e.loaded / e.total) * 100 }); - }, - }; - const formData = new FormData(); - formData.append("file", file); - formData.append("eager", eager); - formData.append("api_key", process.env.REACT_APP_CLOUDINARY_API_KEY); - formData.append("public_id", public_id); - formData.append("tags", tags); - formData.append("timestamp", timestamp); - formData.append("signature", signature); - - axios - .post( - `${process.env.REACT_APP_CLOUDINARY_ENDPOINT}/upload`, - formData, - options - ) - .then((response) => { - console.log("response", response); - - insertNewDocument({ - variables: { - docInput: [ - { - jobid: jobId, - uploaded_by: currentUser.email, - key: fileName, - invoiceid: invoiceId, - type: fileType, - }, - ], - }, - }).then((r) => { - onSuccess({ - uid: r.data.insert_documents.returning[0].id, - name: r.data.insert_documents.returning[0].name, - status: "done", - key: r.data.insert_documents.returning[0].key, - }); - notification["success"]({ - message: t("documents.successes.insert"), - }); - if (callbackAfterUpload) { - callbackAfterUpload(); - } - if (onChange) { - //Used in a form. - onChange(UploadRef.current.state.fileList); - } - }); - }) - .catch((error) => { - onError(error); - notification["error"]({ - message: t("documents.errors.insert", { - message: JSON.stringify(error), - }), - }); - }); - }) - .catch((error) => { - console.log("error", error); - notification["error"]({ - message: t("documents.errors.getpresignurl", { - message: JSON.stringify(error), - }), - }); - }); - }; - return ( + handleUpload(ev, { + bodyshop: bodyshop, + uploaded_by: currentUser.email, + jobId: jobId, + invoiceId: invoiceId, + tagsArray: tagsArray, + callback: callbackAfterUpload, + }) + } /> ); } diff --git a/client/src/components/documents-upload/documents-upload.utility.js b/client/src/components/documents-upload/documents-upload.utility.js new file mode 100644 index 000000000..7700a0232 --- /dev/null +++ b/client/src/components/documents-upload/documents-upload.utility.js @@ -0,0 +1,165 @@ +import { notification } from "antd"; +import axios from "axios"; +import Resizer from "react-image-file-resizer"; +import { client } from "../../App/App.container"; +import { INSERT_NEW_DOCUMENT } from "../../graphql/documents.queries"; +import i18n from "i18next"; +import { logImEXEvent } from "../../firebase/firebase.utils"; + +//Context: currentUserEmail, bodyshop, jobid, invoiceid +export const handleUpload = (ev, context) => { + console.log("ev", ev); + + logImEXEvent("document_upload", { filetype: ev.file.type }); + + const { onError, onSuccess, onProgress } = ev; + const { bodyshop, jobId } = context; + //If PDF, upload directly. + //If JPEG, resize and upload. + //TODO If this is just an invoice job? Where to put it? + let key = `${bodyshop.id}/${jobId}/${ev.file.name}`; + if (ev.file.type.includes("image")) { + Resizer.imageFileResizer( + ev.file, + 2500, + 2500, + "JPEG", + 75, + 0, + (uri) => { + let file = new File([uri], ev.file.name, {}); + file.uid = ev.file.uid; + uploadToS3( + key, + file.type, + file, + onError, + onSuccess, + onProgress, + context + ); + }, + "blob" + ); + } else { + uploadToS3( + key, + ev.file.type, + ev.file, + onError, + onSuccess, + onProgress, + context + ); + } +}; + +export const uploadToS3 = ( + fileName, + fileType, + file, + onError, + onSuccess, + onProgress, + context +) => { + const { + bodyshop, + jobId, + invoiceId, + uploaded_by, + callback, + tagsArray, + } = context; + + let timestamp = Math.floor(Date.now() / 1000); + let public_id = fileName; + let tags = `${bodyshop.textid},${ + tagsArray ? tagsArray.map((tag) => `${tag},`) : "" + }`; + let eager = process.env.REACT_APP_CLOUDINARY_THUMB_TRANSFORMATIONS; + axios + .post("/media/sign", { + eager: eager, + public_id: public_id, + tags: tags, + timestamp: timestamp, + }) + .then((response) => { + var signature = response.data; + var options = { + headers: { "X-Requested-With": "XMLHttpRequest" }, + onUploadProgress: (e) => { + if (!!onProgress) onProgress({ percent: (e.loaded / e.total) * 100 }); + }, + }; + const formData = new FormData(); + formData.append("file", file); + formData.append("eager", eager); + formData.append("api_key", process.env.REACT_APP_CLOUDINARY_API_KEY); + formData.append("public_id", public_id); + formData.append("tags", tags); + formData.append("timestamp", timestamp); + formData.append("signature", signature); + + axios + .post( + `${process.env.REACT_APP_CLOUDINARY_ENDPOINT}/upload`, + formData, + options + ) + .then((response) => { + console.log("Upload Response", response); + client + .mutate({ + mutation: INSERT_NEW_DOCUMENT, + variables: { + docInput: [ + { + jobid: jobId, + uploaded_by: uploaded_by, + key: fileName, + invoiceid: invoiceId, + type: fileType, + }, + ], + }, + }) + .then((r) => { + if (!!onSuccess) + onSuccess({ + uid: r.data.insert_documents.returning[0].id, + name: r.data.insert_documents.returning[0].name, + status: "done", + key: r.data.insert_documents.returning[0].key, + }); + notification["success"]({ + message: i18n.t("documents.successes.insert"), + }); + if (callback) { + callback(); + } + // if (onChange) { + // //Used in a form. + // onChange(UploadRef.current.state.fileList); + // } + }); + }) + .catch((error) => { + if (!!onError) onError(error); + notification["error"]({ + message: i18n.t("documents.errors.insert", { + message: JSON.stringify(error), + }), + }); + }); + }) + .catch((error) => { + console.log("error", error); + notification["error"]({ + message: i18n.t("documents.errors.getpresignurl", { + message: JSON.stringify(error), + }), + }); + }); +}; diff --git a/client/src/components/email-overlay/email-overlay.component.jsx b/client/src/components/email-overlay/email-overlay.component.jsx index 7cf5f393a..b6961de1b 100644 --- a/client/src/components/email-overlay/email-overlay.component.jsx +++ b/client/src/components/email-overlay/email-overlay.component.jsx @@ -1,27 +1,36 @@ +import { UploadOutlined } from "@ant-design/icons"; import { Editor } from "@tinymce/tinymce-react"; -import { Input } from "antd"; +import { Button, Input, Upload, Select } from "antd"; import React from "react"; + export default function EmailOverlayComponent({ messageOptions, handleConfigChange, + handleToChange, handleHtmlChange, + handleUpload, + handleFileRemove, }) { return (
- - CC + CC: - Subject + Subject: @@ -44,6 +53,17 @@ export default function EmailOverlayComponent({ }} onEditorChange={handleHtmlChange} /> + + +
); } diff --git a/client/src/components/email-overlay/email-overlay.container.jsx b/client/src/components/email-overlay/email-overlay.container.jsx index 3048bcad4..46b82f493 100644 --- a/client/src/components/email-overlay/email-overlay.container.jsx +++ b/client/src/components/email-overlay/email-overlay.container.jsx @@ -1,18 +1,18 @@ -import { useApolloClient } from "@apollo/react-hooks"; import { Modal, notification } from "antd"; -import { gql } from "apollo-boost"; import axios from "axios"; import React, { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { connect } from "react-redux"; import { createStructuredSelector } from "reselect"; -import { QUERY_TEMPLATES_BY_NAME } from "../../graphql/templates.queries"; +import { logImEXEvent } from "../../firebase/firebase.utils"; import { toggleEmailOverlayVisible } from "../../redux/email/email.actions"; import { selectEmailConfig, selectEmailVisible, } from "../../redux/email/email.selectors.js"; import { selectBodyshop } from "../../redux/user/user.selectors"; +import RenderTemplate from "../../utils/RenderTemplate"; +import { EmailSettings } from "../../utils/TemplateConstants"; import LoadingSpinner from "../loading-spinner/loading-spinner.component"; import EmailOverlayComponent from "./email-overlay.component"; @@ -21,9 +21,11 @@ const mapStateToProps = createStructuredSelector({ emailConfig: selectEmailConfig, bodyshop: selectBodyshop, }); + const mapDispatchToProps = (dispatch) => ({ toggleEmailOverlayVisible: () => dispatch(toggleEmailOverlayVisible()), }); + export function EmailOverlayContainer({ emailConfig, modalVisible, @@ -32,71 +34,48 @@ export function EmailOverlayContainer({ }) { const { t } = useTranslation(); - const [messageOptions, setMessageOptions] = useState( - emailConfig.messageOptions - ); - const client = useApolloClient(); - - const renderEmail = () => { - client - .query({ - query: QUERY_TEMPLATES_BY_NAME, - variables: { name: emailConfig.template.name }, - fetchPolicy: "network-only", - }) - .then(({ data: templateRecords }) => { - let templateToUse; - if (templateRecords.templates.length === 1) { - console.log("Only 1 Template found."); - templateToUse = templateRecords.templates[0]; - } else if (templateRecords.templates.length === 2) { - console.log("2 Templates found.."); - templateToUse = templateRecords.templates.filter( - (t) => !!t.bodyshopid - ); - } else { - //No template found.Uh oh. - alert("Templating Error!"); - } - - client - .query({ - query: gql(templateToUse.query), - variables: { ...emailConfig.template.variables }, - fetchPolicy: "network-only", - }) - .then(({ data: contextData }) => { - handleRender(contextData, templateToUse.html); - }); - }); + const [loading, setLoading] = useState(false); + const [sending, setSending] = useState(false); + const defaultEmailFrom = { + from: { + name: bodyshop.shopname || EmailSettings.fromNameDefault, + address: EmailSettings.fromAddress, + }, + replyTo: bodyshop.email, }; + const [messageOptions, setMessageOptions] = useState({ + ...defaultEmailFrom, + html: "", + fileList: [], + }); - const handleRender = (contextData, html) => { - axios - .post("/render", { - view: html, - context: { ...contextData, bodyshop: bodyshop }, - }) - .then((r) => { - setMessageOptions({ ...messageOptions, html: r.data }); - }); - }; + const handleOk = async () => { + logImEXEvent("email_send_from_modal"); - const handleOk = () => { - //sendEmail(messageOptions); - axios - .post("/sendemail", messageOptions) - .then((response) => { - console.log(JSON.stringify(response)); - notification["success"]({ message: t("emails.successes.sent") }); - toggleEmailOverlayVisible(); - }) - .catch((error) => { - console.log(JSON.stringify(error)); - notification["error"]({ - message: t("emails.errors.notsent", { message: error.message }), - }); + const attachments = []; + + await asyncForEach(messageOptions.fileList, async (f) => { + const t = { + ContentType: f.type, + Filename: f.name, + Base64Content: (await toBase64(f)).split(",")[1], + }; + attachments.push(t); + }); + console.log("messageOptions", messageOptions); + + setSending(true); + try { + await axios.post("/sendemail", { ...messageOptions, attachments }); + notification["success"]({ message: t("emails.successes.sent") }); + toggleEmailOverlayVisible(); + } catch (error) { + console.log(JSON.stringify(error)); + notification["error"]({ + message: t("emails.errors.notsent", { message: error.message }), }); + } + setSending(false); }; const handleConfigChange = (event) => { @@ -106,9 +85,43 @@ export function EmailOverlayContainer({ const handleHtmlChange = (text) => { setMessageOptions({ ...messageOptions, html: text }); }; + const handleToChange = (recipients) => { + setMessageOptions({ ...messageOptions, to: recipients }); + }; + + const handleUpload = (file) => { + setMessageOptions({ + ...messageOptions, + fileList: [...messageOptions.fileList, file], + }); + return false; + }; + + const handleFileRemove = (file) => { + setMessageOptions((state) => { + const index = state.fileList.indexOf(file); + const newfileList = state.fileList.slice(); + newfileList.splice(index, 1); + return { + fileList: newfileList, + }; + }); + }; + const render = async () => { + logImEXEvent("email_render_template", { template: emailConfig.template }); + setLoading(true); + let html = await RenderTemplate(emailConfig.template, bodyshop); + setMessageOptions({ + ...emailConfig.messageOptions, + ...defaultEmailFrom, + html: html, + fileList: [], + }); + setLoading(false); + }; useEffect(() => { - if (modalVisible) renderEmail(); + if (modalVisible) render(); }, [modalVisible]); // eslint-disable-line react-hooks/exhaustive-deps return ( @@ -120,20 +133,23 @@ export function EmailOverlayContainer({ onCancel={() => { toggleEmailOverlayVisible(); }} + okButtonProps={{ loading: sending }} > - + @@ -143,3 +159,17 @@ export default connect( mapStateToProps, mapDispatchToProps )(EmailOverlayContainer); + +const toBase64 = (file) => + new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.readAsDataURL(file); + reader.onload = () => resolve(reader.result); + reader.onerror = (error) => reject(error); + }); + +const asyncForEach = async (array, callback) => { + for (let index = 0; index < array.length; index++) { + await callback(array[index], index, array); + } +}; diff --git a/client/src/components/employee-search-select/employee-search-select.component.jsx b/client/src/components/employee-search-select/employee-search-select.component.jsx index 58fdbdd22..562ef94e1 100644 --- a/client/src/components/employee-search-select/employee-search-select.component.jsx +++ b/client/src/components/employee-search-select/employee-search-select.component.jsx @@ -1,24 +1,20 @@ import { Select, Tag } from "antd"; -import React, { useEffect, useState } from "react"; +import React, { forwardRef, useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; -import CurrencyFormatter from "../../utils/CurrencyFormatter"; const { Option } = Select; //To be used as a form element only. -const EmployeeSearchSelect = ({ - value, - onChange, - options, - onSelect, - onBlur, -}) => { +const EmployeeSearchSelect = ( + { value, onChange, options, onSelect, onBlur }, + ref +) => { const [option, setOption] = useState(value); const { t } = useTranslation(); useEffect(() => { - if (onChange) { + if (value !== option && onChange) { onChange(option); } - }, [option, onChange]); + }, [value, option, onChange]); return ( ); }; -export default EmployeeSearchSelect; +export default forwardRef(EmployeeSearchSelect); diff --git a/client/src/components/error-boundary/error-boundary.component.jsx b/client/src/components/error-boundary/error-boundary.component.jsx index 7648ee07c..96211cc00 100644 --- a/client/src/components/error-boundary/error-boundary.component.jsx +++ b/client/src/components/error-boundary/error-boundary.component.jsx @@ -1,31 +1,75 @@ +import { Button, Col, Collapse, Result, Row, Space } from "antd"; import React from "react"; +import { withTranslation } from "react-i18next"; +import { logImEXEvent } from "../../firebase/firebase.utils"; class ErrorBoundary extends React.Component { constructor() { super(); this.state = { hasErrored: false, - error: null + error: null, + info: null, }; } static getDerivedStateFromError(error) { - //process the error - console.log("error", error); - return { hasErrored: true, error }; + console.log("ErrorBoundary -> getDerivedStateFromError -> error", error); + return { hasErrored: true, error: error }; } componentDidCatch(error, info) { - console.log("error", error); - console.log("info", info); + console.log("Exception Caught by Error Boundary.", error, info); + this.setState({ ...this.state, error, info }); } render() { + const { t } = this.props; + const { error, info } = this.state; if (this.state.hasErrored === true) { - return
Uh oh, something went wrong.
; + logImEXEvent("error_boundary_rendered", { error, info }); + + return ( +
+ + + + + } + /> + +
+ + +
+ {this.state.error.message} +
+
{this.state.error.stack}
+
+
+ + + + ); } else { return this.props.children; } } } -export default ErrorBoundary; +export default withTranslation()(ErrorBoundary); diff --git a/client/src/components/fcm-notification/fcm-notification.component.jsx b/client/src/components/fcm-notification/fcm-notification.component.jsx new file mode 100644 index 000000000..1d74d6c38 --- /dev/null +++ b/client/src/components/fcm-notification/fcm-notification.component.jsx @@ -0,0 +1,65 @@ +import React, { Component } from "react"; +import { withApollo } from "react-apollo"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { logImEXEvent, messaging } from "../../firebase/firebase.utils"; +import { UPDATE_FCM_TOKEN } from "../../graphql/user.queries"; +import { selectCurrentUser } from "../../redux/user/user.selectors"; + +const mapStateToProps = createStructuredSelector({ + currentUser: selectCurrentUser, +}); +const mapDispatchToProps = (dispatch) => ({ + //setUserLanguage: language => dispatch(setUserLanguage(language)) +}); + +class FcmNotificationComponent extends Component { + async componentDidMount() { + const { client, currentUser } = this.props; + if (!!!messaging) return; //Skip all of the notification functionality if the firebase SDK could not start. + + messaging + .requestPermission() + .then(async function () { + const token = await messaging.getToken(); + client.mutate({ + mutation: UPDATE_FCM_TOKEN, + variables: { authEmail: currentUser.email, token: { [token]: true } }, + }); + }) + .catch(function (err) { + console.log("Unable to get permission to notify.", err); + logImEXEvent("fcm_permission_denied", { message: err }); + }); + } + + render() { + return ; + } +} + +export default connect( + mapStateToProps, + mapDispatchToProps +)(withApollo(FcmNotificationComponent)); + +//Firebase Service Worker Register +if ("serviceWorker" in navigator) { + navigator.serviceWorker + .register("/firebase-messaging-sw.js") + .then(function (registration) { + console.log( + "[FCM] Registration successful, scope is:", + registration.scope + ); + navigator.serviceWorker.addEventListener("message", (event) => { + console.log("Handler for Navigator Service Worker.", event); + }); + }) + .catch(function (err) { + console.log( + "[FCM] Service worker registration failed, error:", + err + ); + }); +} diff --git a/client/src/components/form-date-picker/form-date-picker.component.jsx b/client/src/components/form-date-picker/form-date-picker.component.jsx new file mode 100644 index 000000000..479cd8bf6 --- /dev/null +++ b/client/src/components/form-date-picker/form-date-picker.component.jsx @@ -0,0 +1,35 @@ +import { DatePicker } from "antd"; +import moment from "moment"; +import React, { forwardRef } from "react"; +//To be used as a form element only. + +const dateFormat = "MM/DD/YYYY"; + +const FormDatePicker = ({ value, onChange, onBlur, ...restProps }, ref) => { + const handleChange = (newDate) => { + if (value !== newDate && onChange) { + onChange(newDate); + } + }; + + const handleKeyDown = (e) => { + if (e.key.toLowerCase() === "t") { + if (onChange) { + onChange(new moment()); + } + } + }; + + return ( +
+ +
+ ); +}; + +export default forwardRef(FormDatePicker); diff --git a/client/src/components/form-date-time-picker/form-date-time-picker.component.jsx b/client/src/components/form-date-time-picker/form-date-time-picker.component.jsx new file mode 100644 index 000000000..37faa4ad8 --- /dev/null +++ b/client/src/components/form-date-time-picker/form-date-time-picker.component.jsx @@ -0,0 +1,31 @@ +import React, { forwardRef } from "react"; +//import DatePicker from "react-datepicker"; +//import "react-datepicker/src/stylesheets/datepicker.scss"; +import FormDatePicker from "../form-date-picker/form-date-picker.component"; +import { TimePicker } from "antd"; +import moment from "moment"; +//To be used as a form element only. + +const DateTimePicker = ({ value, onChange, onBlur }, ref) => { + // const handleChange = (newDate) => { + // if (value !== newDate && onChange) { + // onChange(newDate); + // } + // }; + + return ( +
+ + + +
+ ); +}; + +export default forwardRef(DateTimePicker); diff --git a/client/src/components/form-fields-changed-alert/form-fields-changed-alert.component.jsx b/client/src/components/form-fields-changed-alert/form-fields-changed-alert.component.jsx new file mode 100644 index 000000000..f60d4cd82 --- /dev/null +++ b/client/src/components/form-fields-changed-alert/form-fields-changed-alert.component.jsx @@ -0,0 +1,52 @@ +import React from "react"; +import { Form } from "antd"; +import { useTranslation } from "react-i18next"; +import AlertComponent from "../alert/alert.component"; +import { Prompt, useLocation } from "react-router-dom"; + +export default function FormsFieldChanged({ form }) { + const { t } = useTranslation(); + + const handleReset = () => { + form.resetFields(); + }; + const loc = useLocation(); + + return ( + + {() => { + if (form.isFieldsTouched()) + return ( +
+ { + //console.log("location", location); + if (loc.pathname === location.pathname) return false; + return t("general.messages.unsavedchangespopup"); + }} + /> + + {t("general.messages.unsavedchanges")} + + {t("general.actions.reset")} + +
+ } + /> + + ); + return null; + }} +
+ ); +} diff --git a/client/src/components/form-input-number-calculator/form-input-number-calculator.component.jsx b/client/src/components/form-input-number-calculator/form-input-number-calculator.component.jsx new file mode 100644 index 000000000..b3f8c35e7 --- /dev/null +++ b/client/src/components/form-input-number-calculator/form-input-number-calculator.component.jsx @@ -0,0 +1,117 @@ +import { Input, Popover } from "antd"; +import React, { useEffect, useState, forwardRef } from "react"; + +const FormInputNUmberCalculator = ( + { value: formValue, onChange: formOnChange }, + ref +) => { + const [value, setValue] = useState(formValue); + const [total, setTotal] = useState(0); + const [history, setHistory] = useState([]); + + const handleChange = (e) => { + const key = e.target.value; + switch (key) { + case "/": + case "*": + case "+": + case "-": + return; + default: + setValue(key); + return; + } + }; + + const handleKeyDown = (e) => { + const { key } = e; + + let action; + switch (key) { + case "/": + case "*": + case "+": + case "-": + action = key; + break; + case "Enter": + action = "="; + break; + default: + return; + } + + const val = parseFloat(value); + setValue(null); + if (!isNaN(val)) { + setHistory([...history, val, action]); + } + }; + + useEffect(() => { + if (value !== formValue && formOnChange) formOnChange(value); + }, [formOnChange, formValue, value]); + + useEffect(() => { + if (history.length > 2) { + const subTotal = history.reduce((acc, val, idx) => { + if (idx === 0) { + return val; + } + switch (val) { + case "/": + case "*": + case "+": + case "-": + return acc; + + default: + //Weve got math on our hands. Find the last operator, and apply it accordingly. + switch (history[idx - 1]) { + case "/": + return acc / val; + case "*": + return acc * val; + case "+": + return acc + val; + case "-": + return acc - val; + default: + return acc; + } + } + }, 0); + setTotal(subTotal); + if (history[history.length - 1] === "=") setValue(subTotal); + } + }, [history]); + + const popContent = ( +
+ History + {history.map((h, idx) => ( +
+ {h} +
+ ))} +
{total}
+
+ ); + + return ( +
+ 0}> + setHistory([])} + /> + +
+ ); +}; + +export default forwardRef(FormInputNUmberCalculator); diff --git a/client/src/components/form-items-formatted/currency-form-item.component.jsx b/client/src/components/form-items-formatted/currency-form-item.component.jsx index 0c24be519..e0edbd355 100644 --- a/client/src/components/form-items-formatted/currency-form-item.component.jsx +++ b/client/src/components/form-items-formatted/currency-form-item.component.jsx @@ -4,8 +4,10 @@ function FormItemCurrency(props, ref) { return ( `$ ${value}`.replace(/\B(?=(\d{3})+(?!\d))/g, ",")} - // parser={value => value.replace(/\$\s?|(,*)/g, "")} + ref={ref} + style={{ width: "initial" }} + // formatter={(value) => `$ ${value}`.replace(/\B(?=(\d{3})+(?!\d))/g, ",")} + // parser={(value) => value.replace(/\$\s?|(,*)/g, "")} precision={2} /> ); diff --git a/client/src/components/form-items-formatted/email-form-item.component.jsx b/client/src/components/form-items-formatted/email-form-item.component.jsx index f3d211a1a..96e091923 100644 --- a/client/src/components/form-items-formatted/email-form-item.component.jsx +++ b/client/src/components/form-items-formatted/email-form-item.component.jsx @@ -1,13 +1,14 @@ -import { Input } from "antd"; import { MailFilled } from "@ant-design/icons"; +import { Input } from "antd"; import React, { forwardRef } from "react"; function FormItemEmail(props, ref) { return ( + props.defaultValue || props.value ? ( + ) : ( diff --git a/client/src/components/form-items-formatted/phone-form-item.component.jsx b/client/src/components/form-items-formatted/phone-form-item.component.jsx index 30638a00c..c25d79e93 100644 --- a/client/src/components/form-items-formatted/phone-form-item.component.jsx +++ b/client/src/components/form-items-formatted/phone-form-item.component.jsx @@ -1,14 +1,7 @@ import React, { forwardRef } from "react"; import NumberFormat from "react-number-format"; function FormItemPhone(props, ref) { - return ( - - ); + return ; } export default forwardRef(FormItemPhone); diff --git a/client/src/components/form-items-formatted/reset-form-item.component.jsx b/client/src/components/form-items-formatted/reset-form-item.component.jsx index 54ef8e357..377be7b0e 100644 --- a/client/src/components/form-items-formatted/reset-form-item.component.jsx +++ b/client/src/components/form-items-formatted/reset-form-item.component.jsx @@ -1,9 +1,9 @@ import { Button } from "antd"; -import React from "react"; +import React, { forwardRef } from "react"; import { useTranslation } from "react-i18next"; import AlertComponent from "../alert/alert.component"; -export default function ResetForm({ resetFields }) { +function ResetForm({ resetFields }) { const { t } = useTranslation(); return ( ); } + +export default forwardRef(ResetForm); diff --git a/client/src/components/form-list-move-arrows/form-list-move-arrows.component.jsx b/client/src/components/form-list-move-arrows/form-list-move-arrows.component.jsx new file mode 100644 index 000000000..49a40814e --- /dev/null +++ b/client/src/components/form-list-move-arrows/form-list-move-arrows.component.jsx @@ -0,0 +1,21 @@ +import React from "react"; +import { UpOutlined, DownOutlined } from "@ant-design/icons"; +export default function FormListMoveArrows({ move, index, total }) { + const upDisabled = index === 0; + const downDisabled = index === total - 1; + + const handleUp = () => { + move(index, index - 1); + }; + + const handleDown = () => { + move(index, index - 1); + }; + + return ( +
+ + +
+ ); +} diff --git a/client/src/components/global-search/global-search.component.jsx b/client/src/components/global-search/global-search.component.jsx new file mode 100644 index 000000000..95063d636 --- /dev/null +++ b/client/src/components/global-search/global-search.component.jsx @@ -0,0 +1,167 @@ +import { useLazyQuery } from "@apollo/react-hooks"; +import { AutoComplete, Input } from "antd"; +import React from "react"; +import { useTranslation } from "react-i18next"; +import { Link } from "react-router-dom"; +import { logImEXEvent } from "../../firebase/firebase.utils"; +import { GLOBAL_SEARCH_QUERY } from "../../graphql/search.queries"; +import CurrencyFormatter from "../../utils/CurrencyFormatter"; +import AlertComponent from "../alert/alert.component"; +export default function GlobalSearch() { + const { t } = useTranslation(); + + const [callSearch, { loading, error, data }] = useLazyQuery( + GLOBAL_SEARCH_QUERY + ); + + const handleSearch = (searchTerm) => { + logImEXEvent("global_search", { term: searchTerm }); + + if (searchTerm.length > 0) + callSearch({ variables: { search: searchTerm } }); + }; + + const renderTitle = (title) => { + return ( + + {title} + + more + + + ); + }; + + const options = data + ? [ + { + label: renderTitle(t("menus.header.search.jobs")), + options: data.search_jobs.map((job) => { + return { + value: job.ro_number, + label: ( + +
+ + + {job.ro_number + ? `${job.ro_number || ""} / ${job.est_number || ""}` + : `${job.est_number || ""}`} + + + + {`${ + job.ownr_fn || "" + } ${job.ownr_ln || ""} ${job.ownr_co_nm || ""}`} + {`${ + job.v_model_yr || "" + } ${job.v_make_desc || ""} ${ + job.v_model_desc || "" + }`} + {`${job.clm_no}`} + + {`${job.clm_total}`} + +
+ + ), + }; + }), + }, + { + label: renderTitle(t("menus.header.search.owners")), + options: data.search_owners.map((owner) => { + return { + value: `${owner.ownr_fn || ""} ${owner.ownr_ln || ""} ${ + owner.ownr_co_nm || "" + }`, + label: ( + +
+ {`${ + owner.ownr_fn || "" + } ${owner.ownr_ln || ""} ${owner.ownr_co_nm || ""}`} +
+ + ), + }; + }), + }, + { + label: renderTitle(t("menus.header.search.vehicles")), + options: data.search_vehicles.map((vehicle) => { + return { + value: `${vehicle.v_model_yr || ""} ${ + vehicle.v_make_desc || "" + } ${vehicle.v_model_desc || ""}`, + label: ( + +
+ {`${ + vehicle.v_model_yr || "" + } ${vehicle.v_make_desc || ""} ${ + vehicle.v_model_desc || "" + }`} +
+ + ), + }; + }), + }, + { + label: renderTitle(t("menus.header.search.payments")), + options: data.search_payments.map((payment) => { + return { + value: `${payment.job.ro_number} ${payment.payer} ${payment.amount}`, + label: ( + +
+ {`${payment.job.ro_number}`} + {`${payment.job.memo}`} + {`${payment.job.amount}`} + {`${payment.job.transactionid}`} +
+ + ), + }; + }), + }, + { + label: renderTitle(t("menus.header.search.invoices")), + options: data.search_invoices.map((invoice) => { + return { + value: `${invoice.invoice_number}`, + label: ( + +
+ {`${invoice.invoice_number}`} + {`${invoice.vendor.name}`} + {`${invoice.date}`} +
+ + ), + }; + }), + }, + ] + : []; + + if (error) return ; + + return ( +
+ + + +
+ ); +} diff --git a/client/src/components/header/header.component.jsx b/client/src/components/header/header.component.jsx index d7d158480..bc2f59490 100644 --- a/client/src/components/header/header.component.jsx +++ b/client/src/components/header/header.component.jsx @@ -1,113 +1,104 @@ import Icon, { + ClockCircleFilled, CarFilled, + DollarCircleFilled, FileAddFilled, FileFilled, GlobalOutlined, HomeFilled, TeamOutlined, - DollarCircleFilled, + UserOutlined, } from "@ant-design/icons"; -import { Avatar, Col, Menu, Row } from "antd"; +import { Avatar, Col, Layout, Menu, Row } from "antd"; import React from "react"; import { useTranslation } from "react-i18next"; -import { FaCalendarAlt, FaCarCrash } from "react-icons/fa"; -import { Link } from "react-router-dom"; -import UserImage from "../../assets/User.svg"; -import ManageSignInButton from "../manage-sign-in-button/manage-sign-in-button.component"; - +import { FaCalendarAlt, FaCarCrash, FaCreditCard } from "react-icons/fa"; import { connect } from "react-redux"; +import { Link } from "react-router-dom"; import { createStructuredSelector } from "reselect"; import { setModalContext } from "../../redux/modals/modals.actions"; +import { signOutStart } from "../../redux/user/user.actions"; +import { + selectBodyshop, + selectCurrentUser, +} from "../../redux/user/user.selectors"; +import "./header.styles.scss"; +import GlobalSearch from "../global-search/global-search.component"; +import { selectRecentItems } from "../../redux/application/application.selectors"; + const mapStateToProps = createStructuredSelector({ - //currentUser: selectCurrentUser + currentUser: selectCurrentUser, + bodyshop: selectBodyshop, + recentItems: selectRecentItems, }); + const mapDispatchToProps = (dispatch) => ({ setInvoiceEnterContext: (context) => dispatch(setModalContext({ context: context, modal: "invoiceEnter" })), setTimeTicketContext: (context) => dispatch(setModalContext({ context: context, modal: "timeTicket" })), + setPaymentContext: (context) => + dispatch(setModalContext({ context: context, modal: "payment" })), + signOutStart: () => dispatch(signOutStart()), }); +const logoSpan = { + xs: { + span: 0, + }, + sm: { span: 0 }, + md: { + span: 0, + }, + lg: { + span: 2, + }, +}; + +const menuSpan = { + md: { + span: 24, + //offset: 1, + }, + lg: { + span: 21, + offset: 1, + }, +}; + function Header({ - landingHeader, - selectedNavItem, - logo, + bodyshop, handleMenuClick, currentUser, signOutStart, setInvoiceEnterContext, setTimeTicketContext, + setPaymentContext, + recentItems, }) { const { t } = useTranslation(); - //TODO Add + const { Header } = Layout; return ( - - {logo ? ( -
- Shop Logo +
+ +
+ {bodyshop - ) : null} - - {landingHeader ? ( + - - - - - {currentUser.displayName || t("general.labels.unknown")} - - } - > - signOutStart()}> - {t("user.actions.signout")} - - - - {t("menus.currentuser.profile")} - - - - - {t("menus.currentuser.languageselector")} - - } - > - - {t("general.languages.english")} - - - {t("general.languages.french")} - - - {t("general.languages.spanish")} - - - - - ) : ( - @@ -130,9 +121,28 @@ function Header({ {t("menus.header.schedule")} + + + + {t("menus.header.productionlist")} + + + + + {t("menus.header.productionboard")} + + + + + {t("menus.header.scoreboard")} + + {t("menus.header.activejobs")} + + {t("menus.header.alljobs")} + {t("menus.header.availablejobs")} @@ -153,7 +163,6 @@ function Header({ - @@ -181,7 +190,6 @@ function Header({ - @@ -190,6 +198,19 @@ function Header({ } > + { + setPaymentContext({ + actions: {}, + context: {}, + }); + }} + > + + {t("menus.header.enterpayment")} + + { @@ -204,6 +225,11 @@ function Header({ {t("menus.header.invoices")} + + + {t("menus.header.timetickets")} + + { @@ -215,37 +241,91 @@ function Header({ > {t("menus.header.entertimeticket")} - + + + + {t("menus.header.accounting-receivables")} + + + + + {t("menus.header.accounting-payables")} + + + + + {t("menus.header.accounting-payments")} + + + + + + + {t("menus.header.allpayments")} + + + {t("menus.header.shop_config")} + + + {t("menus.header.shop_templates")} + + {t("menus.header.shop_vendors")} + + {t("menus.header.shop_csi")} + + + + + + }> + {recentItems.map((i, idx) => ( + + {i.label} + + ))} - - + {currentUser.photoURL ? ( + + ) : ( + } + /> + )} + {currentUser.displayName || t("general.labels.unknown")} } > - signOutStart()}> + signOutStart()}> {t("user.actions.signout")} + + + {t("menus.header.shiftclock")} + + {t("menus.currentuser.profile")} @@ -271,9 +351,9 @@ function Header({ - )} - - + + + ); } diff --git a/client/src/components/header/header.container.jsx b/client/src/components/header/header.container.jsx index 77a5feb4c..7cedc6b13 100644 --- a/client/src/components/header/header.container.jsx +++ b/client/src/components/header/header.container.jsx @@ -1,52 +1,31 @@ -import React from "react"; -import HeaderComponent from "./header.component"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; import i18next from "i18next"; -import { setUserLanguage, signOutStart } from "../../redux/user/user.actions"; -import { - selectCurrentUser, - selectBodyshop -} from "../../redux/user/user.selectors"; +import React from "react"; +import { connect } from "react-redux"; +import { setUserLanguage } from "../../redux/user/user.actions"; +import HeaderComponent from "./header.component"; +import { logImEXEvent } from "../../firebase/firebase.utils"; -const mapStateToProps = createStructuredSelector({ - currentUser: selectCurrentUser, - bodyshop: selectBodyshop +const mapDispatchToProps = (dispatch) => ({ + setUserLanguage: (language) => dispatch(setUserLanguage(language)), }); -const mapDispatchToProps = dispatch => ({ - signOutStart: () => dispatch(signOutStart()), - setUserLanguage: language => dispatch(setUserLanguage(language)) -}); - -export default connect( - mapStateToProps, - mapDispatchToProps -)(function HeaderContainer({ - landingHeader, - currentUser, - bodyshop, - signOutStart, - setUserLanguage -}) { - const handleMenuClick = e => { +export function HeaderContainer({ setUserLanguage }) { + const handleMenuClick = (e) => { if (e.item.props.actiontype === "lang-select") { i18next.changeLanguage(e.key, (err, t) => { - if (err) + if (err) { + logImEXEvent("language_change_error", { error: err }); + return console.log("Error encountered when changing languages.", err); + } + logImEXEvent("language_change", { language: e.key }); + setUserLanguage(e.key); }); } }; - return ( - - ); -}); + return ; +} + +export default connect(null, mapDispatchToProps)(HeaderContainer); diff --git a/client/src/components/header/header.styles.scss b/client/src/components/header/header.styles.scss new file mode 100644 index 000000000..101494fe2 --- /dev/null +++ b/client/src/components/header/header.styles.scss @@ -0,0 +1,9 @@ +.header-shop-logo { + background-size: cover; + max-width: 100%; + max-height: 3.5rem; +} +.header-main-menu { + width: 80vw; + float: left; +} diff --git a/client/src/components/indefinite-loading/indefinite-loading.component.jsx b/client/src/components/indefinite-loading/indefinite-loading.component.jsx new file mode 100644 index 000000000..37171a989 --- /dev/null +++ b/client/src/components/indefinite-loading/indefinite-loading.component.jsx @@ -0,0 +1,43 @@ +import { useNProgress } from "@tanem/react-nprogress"; +import React from "react"; + +export default function IndefiniteLoading({ loading }) { + const { animationDuration, isFinished, progress } = useNProgress({ + isAnimating: loading, + }); + + return ( +
+
+
+
+
+ ); +} diff --git a/client/src/components/invoice-add-line-button/invoice-add-line-button.component.jsx b/client/src/components/invoice-add-line-button/invoice-add-line-button.component.jsx deleted file mode 100644 index 18f4680c1..000000000 --- a/client/src/components/invoice-add-line-button/invoice-add-line-button.component.jsx +++ /dev/null @@ -1,36 +0,0 @@ -import React, { useState } from "react"; -import { Button, Popover, Input, InputNumber, Form } from "antd"; -import { SelectOutlined } from "@ant-design/icons"; -import { useTranslation } from "react-i18next"; - -export default function InvoiceAddLineButton({ jobLine, discount, disabled }) { - const [visibility, setVisibility] = useState(false); - const { t } = useTranslation(); - - const popContent = ( -
- - - - - - - - - - - - - DISC: {discount} - -
- ); - - return ( - - - - ); -} diff --git a/client/src/components/invoice-detail-edit/invoice-detail-edit.container.jsx b/client/src/components/invoice-detail-edit/invoice-detail-edit.container.jsx new file mode 100644 index 000000000..39434fbe6 --- /dev/null +++ b/client/src/components/invoice-detail-edit/invoice-detail-edit.container.jsx @@ -0,0 +1,118 @@ +import { useMutation, useQuery } from "@apollo/react-hooks"; +import { Form, Button } from "antd"; +import moment from "moment"; +import queryString from "query-string"; +import React, { useEffect, useState } from "react"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { useLocation } from "react-router-dom"; +import { createStructuredSelector } from "reselect"; +import { + QUERY_INVOICE_BY_PK, + UPDATE_INVOICE, +} from "../../graphql/invoices.queries"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +import AlertComponent from "../alert/alert.component"; +import InvoiceFormContainer from "../invoice-form/invoice-form.container"; +import LoadingSkeleton from "../loading-skeleton/loading-skeleton.component"; +import { UPDATE_INVOICE_LINE } from "../../graphql/invoice-lines.queries"; +import JobDocumentsGallery from "../jobs-documents-gallery/jobs-documents-gallery.container"; + +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, +}); + +export function InvoiceDetailEditContainer({ bodyshop }) { + const search = queryString.parse(useLocation().search); + const { t } = useTranslation(); + const [form] = Form.useForm(); + const [updateLoading, setUpdateLoading] = useState(false); + const [updateInvoice] = useMutation(UPDATE_INVOICE); + const [updateInvoiceLine] = useMutation(UPDATE_INVOICE_LINE); + + const { loading, error, data, refetch } = useQuery(QUERY_INVOICE_BY_PK, { + variables: { invoiceid: search.invoiceid }, + skip: !!!search.invoiceid, + }); + + const handleFinish = async (values) => { + setUpdateLoading(true); + const { invoicelines, upload, ...invoice } = values; + const updates = []; + updates.push( + updateInvoice({ + variables: { invoiceId: search.invoiceid, invoice: invoice }, + }) + ); + + invoicelines.forEach((il) => { + delete il.__typename; + updates.push( + updateInvoiceLine({ + variables: { invoicelineId: il.id, invoiceLine: il }, + }) + ); + }); + + await Promise.all(updates); + setUpdateLoading(false); + }; + + useEffect(() => { + if (search.invoiceid) { + form.resetFields(); + } + }, [form, search.invoiceid]); + + if (error) return ; + if (!!!search.invoiceid) + return
{t("invoices.labels.noneselected")}
; + return ( + +
{ + return { + ...i, + joblineid: !!i.joblineid ? i.joblineid : "noline", + applicable_taxes: { + federal: + (i.applicable_taxes && i.applicable_taxes.federal) || + false, + state: + (i.applicable_taxes && i.applicable_taxes.state) || + false, + local: + (i.applicable_taxes && i.applicable_taxes.local) || + false, + }, + }; + }), + date: data.invoices_by_pk + ? moment(data.invoices_by_pk.date) + : null, + } + : {} + } + > + + + + +
+ ); +} +export default connect(mapStateToProps, null)(InvoiceDetailEditContainer); diff --git a/client/src/components/invoice-enter-modal/invoice-enter-modal.component.jsx b/client/src/components/invoice-enter-modal/invoice-enter-modal.component.jsx deleted file mode 100644 index d8999845e..000000000 --- a/client/src/components/invoice-enter-modal/invoice-enter-modal.component.jsx +++ /dev/null @@ -1,131 +0,0 @@ -import { DatePicker, Form, Input, Switch } from "antd"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import CurrencyInput from "../form-items-formatted/currency-form-item.component"; -import JobSearchSelect from "../job-search-select/job-search-select.component"; -import VendorSearchSelect from "../vendor-search-select/vendor-search-select.component"; -import InvoiceEnterModalLinesComponent from "./invoice-enter-modal.lines.component"; -import DocumentsUploadContainer from "../documents-upload/documents-upload.container"; - -export default function InvoiceEnterModalComponent({ - form, - roAutoCompleteOptions, - vendorAutoCompleteOptions, - lineData, - responsibilityCenters, - loadLines, -}) { - const { t } = useTranslation(); - - const [discount, setDiscount] = useState(0); - - const handleVendorSelect = (props, opt) => { - setDiscount(opt.discount); - }; - - return ( -
-
- - { - if (form.getFieldValue("jobid") !== null) { - loadLines({ variables: { id: form.getFieldValue("jobid") } }); - } - }} - /> - - - - -
-
- - - - - - - - - - - - -
- - - - - - -
- ); -} diff --git a/client/src/components/invoice-enter-modal/invoice-enter-modal.container.jsx b/client/src/components/invoice-enter-modal/invoice-enter-modal.container.jsx index 54ca1008d..b90dc0eae 100644 --- a/client/src/components/invoice-enter-modal/invoice-enter-modal.container.jsx +++ b/client/src/components/invoice-enter-modal/invoice-enter-modal.container.jsx @@ -1,86 +1,115 @@ -import { useLazyQuery, useMutation, useQuery } from "@apollo/react-hooks"; -import { Form, Modal, notification, Button } from "antd"; -import React, { useState, useEffect } from "react"; +import { useMutation } from "@apollo/react-hooks"; +import { Button, Form, Modal, notification } from "antd"; +import React, { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { connect } from "react-redux"; import { createStructuredSelector } from "reselect"; import { INSERT_NEW_INVOICE } from "../../graphql/invoices.queries"; -import { GET_JOB_LINES_TO_ENTER_INVOICE } from "../../graphql/jobs-lines.queries"; -import { ACTIVE_JOBS_FOR_AUTOCOMPLETE } from "../../graphql/jobs.queries"; -import { SEARCH_VENDOR_AUTOCOMPLETE } from "../../graphql/vendors.queries"; import { toggleModalVisible } from "../../redux/modals/modals.actions"; import { selectInvoiceEnterModal } from "../../redux/modals/modals.selectors"; -import { selectBodyshop } from "../../redux/user/user.selectors"; -import InvoiceEnterModalComponent from "./invoice-enter-modal.component"; -import { setModalContext } from "../../redux/modals/modals.actions"; +import { + selectBodyshop, + selectCurrentUser, +} from "../../redux/user/user.selectors"; +import { handleUpload } from "../documents-upload/documents-upload.utility"; +import InvoiceFormContainer from "../invoice-form/invoice-form.container"; +import { UPDATE_JOB_LINE_STATUS } from "../../graphql/jobs-lines.queries"; const mapStateToProps = createStructuredSelector({ invoiceEnterModal: selectInvoiceEnterModal, bodyshop: selectBodyshop, + currentUser: selectCurrentUser, }); const mapDispatchToProps = (dispatch) => ({ toggleModalVisible: () => dispatch(toggleModalVisible("invoiceEnter")), - setInvoiceEnterContext: (context) => - dispatch(setModalContext({ context: context, modal: "invoiceEnter" })), }); function InvoiceEnterModalContainer({ invoiceEnterModal, toggleModalVisible, bodyshop, - setInvoiceEnterContext, + currentUser, }) { const [form] = Form.useForm(); const { t } = useTranslation(); const [enterAgain, setEnterAgain] = useState(false); const [insertInvoice] = useMutation(INSERT_NEW_INVOICE); - - const { data: RoAutoCompleteData } = useQuery(ACTIVE_JOBS_FOR_AUTOCOMPLETE, { - fetchPolicy: "network-only", - variables: { statuses: bodyshop.md_ro_statuses.open_statuses || ["Open"] }, - skip: !invoiceEnterModal.visible, - }); - - const { data: VendorAutoCompleteData } = useQuery( - SEARCH_VENDOR_AUTOCOMPLETE, - { - fetchPolicy: "network-only", - skip: !invoiceEnterModal.visible, - } - ); - - const [loadLines, { data: lineData }] = useLazyQuery( - GET_JOB_LINES_TO_ENTER_INVOICE, - { - fetchPolicy: "network-only", - } - ); + const [updateJobLines] = useMutation(UPDATE_JOB_LINE_STATUS); + const [loading, setLoading] = useState(false); const handleFinish = (values) => { + console.log("handleFinish -> values", values); + + setLoading(true); + const { upload, ...remainingValues } = values; insertInvoice({ variables: { invoice: [ - Object.assign({}, values, { - invoicelines: { data: values.invoicelines }, + Object.assign({}, remainingValues, { + invoicelines: { + data: remainingValues.invoicelines.map((i) => { + console.log( + "Initial insert value", + i.joblineid, + i.joblineid === "noline" + ); + return { + ...i, + joblineid: i.joblineid === "noline" ? null : i.joblineid, + }; + }), + }, }), ], }, }) .then((r) => { - notification["success"]({ - message: t("invoices.successes.created"), - }); - if (invoiceEnterModal.actions.refetch) - invoiceEnterModal.actions.refetch(); + const invoiceId = r.data.insert_invoices.returning[0].id; - if (enterAgain) { - form.resetFields(); - } else { - toggleModalVisible(); - } - setEnterAgain(false); + updateJobLines({ + variables: { + ids: remainingValues.invoicelines + .filter((il) => il.joblineid !== "noline") + .map((li) => li.joblineid), + status: bodyshop.md_order_statuses.default_received || "Received*", + }, + }).then((joblineresult) => { + ///////////////////////// + if (upload && upload.length > 0) { + //insert Each of the documents? + upload.forEach((u) => { + handleUpload( + { file: u.originFileObj }, + { + bodyshop: bodyshop, + uploaded_by: currentUser.email, + jobId: values.jobid, + invoiceId: invoiceId, + tagsArray: null, + callback: null, + } + ); + }); + } + /////////////////////////// + setLoading(false); + notification["success"]({ + message: t("invoices.successes.created"), + }); + if (invoiceEnterModal.actions.refetch) + invoiceEnterModal.actions.refetch(); + + if (enterAgain) { + form.resetFields(); + form.setFieldsValue({ invoicelines: [] }); + } else { + toggleModalVisible(); + } + setEnterAgain(false); + }); }) .catch((error) => { + setLoading(false); setEnterAgain(false); notification["error"]({ message: t("invoices.errors.creating", { @@ -100,11 +129,7 @@ function InvoiceEnterModalContainer({ return ( - {invoiceEnterModal.context && invoiceEnterModal.context.id ? null : ( - -
- ); - }} - - -
- {t("invoicelines.labels.entered")} - {amounts.enteredTotal || 0} - - - - {amounts.invoiceTotal - amounts.enteredTotal === 0 ? ( - {t("invoicelines.labels.reconciled")} - ) : ( - - {t("invoicelines.labels.unreconciled")}: - - {amounts.invoiceTotal - amounts.enteredTotal} - - - )} - - - - ); -} diff --git a/client/src/components/invoice-export-all-button/invoice-export-all-button.component.jsx b/client/src/components/invoice-export-all-button/invoice-export-all-button.component.jsx new file mode 100644 index 000000000..afcfe25c2 --- /dev/null +++ b/client/src/components/invoice-export-all-button/invoice-export-all-button.component.jsx @@ -0,0 +1,130 @@ +import { useMutation } from "@apollo/react-hooks"; +import { Button, notification } from "antd"; +import axios from "axios"; +import React, { useState } from "react"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { auth } from "../../firebase/firebase.utils"; +import { UPDATE_INVOICES } from "../../graphql/invoices.queries"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +import { logImEXEvent } from "../../firebase/firebase.utils"; + +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, +}); + +export function InvoiceExportAllButton({ + bodyshop, + invoiceIds, + disabled, + loadingCallback, + completedCallback, +}) { + const { t } = useTranslation(); + const [updateInvoice] = useMutation(UPDATE_INVOICES); + const [loading, setLoading] = useState(false); + + const handleQbxml = async () => { + logImEXEvent("accounting_payables_export_all"); + + setLoading(true); + if (!!loadingCallback) loadingCallback(true); + + let QbXmlResponse; + try { + QbXmlResponse = await axios.post( + "/accounting/qbxml/payables", + { invoices: invoiceIds }, + { + headers: { + Authorization: `Bearer ${await auth.currentUser.getIdToken(true)}`, + }, + } + ); + console.log("handle -> XML", QbXmlResponse); + } catch (error) { + console.log("Error getting QBXML from Server.", error); + notification["error"]({ + message: t("invoices.errors.exporting", { + error: "Unable to retrieve QBXML. " + JSON.stringify(error.message), + }), + }); + if (loadingCallback) loadingCallback(false); + setLoading(false); + return; + } + + let PartnerResponse; + + try { + PartnerResponse = await axios.post( + "http://localhost:1337/qb/", + QbXmlResponse.data + ); + } catch (error) { + console.log("Error connecting to quickbooks or partner.", error); + notification["error"]({ + message: t("invoices.errors.exporting-partner"), + }); + if (!!loadingCallback) loadingCallback(false); + setLoading(false); + return; + } + + console.log("handleQbxml -> PartnerResponse", PartnerResponse); + const failedTransactions = PartnerResponse.data.filter((r) => !r.success); + const successfulTransactions = PartnerResponse.data.filter( + (r) => r.success + ); + if (failedTransactions.length > 0) { + //Uh oh. At least one was no good. + failedTransactions.map((ft) => + notification["error"]({ + message: t("invoices.errors.exporting", { + error: ft.errorMessage || "", + }), + }) + ); + } + if (successfulTransactions.length > 0) { + const invoiceUpdateResponse = await updateInvoice({ + variables: { + invoiceIdList: successfulTransactions.map((st) => st.id), + invoice: { + exported: true, + exported_at: new Date(), + }, + }, + }); + if (!!!invoiceUpdateResponse.errors) { + notification["success"]({ + message: t("jobs.successes.exported"), + }); + } else { + notification["error"]({ + message: t("jobs.errors.exporting", { + error: JSON.stringify(invoiceUpdateResponse.error), + }), + }); + } + } + + //Set the list of selected invoices to be nothing. + if (!!completedCallback) completedCallback([]); + if (!!loadingCallback) loadingCallback(false); + setLoading(false); + }; + + return ( + + ); +} + +export default connect(mapStateToProps, null)(InvoiceExportAllButton); diff --git a/client/src/components/invoice-export-button/invoice-export-button.component.jsx b/client/src/components/invoice-export-button/invoice-export-button.component.jsx new file mode 100644 index 000000000..974d147f0 --- /dev/null +++ b/client/src/components/invoice-export-button/invoice-export-button.component.jsx @@ -0,0 +1,127 @@ +import { useMutation } from "@apollo/react-hooks"; +import { Button, notification } from "antd"; +import axios from "axios"; +import React, { useState } from "react"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { auth } from "../../firebase/firebase.utils"; +import { UPDATE_INVOICES } from "../../graphql/invoices.queries"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +import { logImEXEvent } from "../../firebase/firebase.utils"; + +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, +}); + +export function InvoiceExportButton({ + bodyshop, + invoiceId, + disabled, + loadingCallback, +}) { + const { t } = useTranslation(); + const [updateInvoice] = useMutation(UPDATE_INVOICES); + const [loading, setLoading] = useState(false); + + const handleQbxml = async () => { + logImEXEvent("accounting_export_payable"); + + setLoading(true); + if (!!loadingCallback) loadingCallback(true); + + let QbXmlResponse; + try { + QbXmlResponse = await axios.post( + "/accounting/qbxml/payables", + { invoices: [invoiceId] }, + { + headers: { + Authorization: `Bearer ${await auth.currentUser.getIdToken(true)}`, + }, + } + ); + console.log("handle -> XML", QbXmlResponse); + } catch (error) { + console.log("Error getting QBXML from Server.", error); + notification["error"]({ + message: t("invoices.errors.exporting", { + error: "Unable to retrieve QBXML. " + JSON.stringify(error.message), + }), + }); + if (loadingCallback) loadingCallback(false); + setLoading(false); + return; + } + + let PartnerResponse; + + try { + PartnerResponse = await axios.post( + "http://localhost:1337/qb/", + QbXmlResponse.data + ); + } catch (error) { + console.log("Error connecting to quickbooks or partner.", error); + notification["error"]({ + message: t("invoices.errors.exporting-partner"), + }); + if (!!loadingCallback) loadingCallback(false); + setLoading(false); + return; + } + + console.log("handleQbxml -> PartnerResponse", PartnerResponse); + const failedTransactions = PartnerResponse.data.filter((r) => !r.success); + const successfulTransactions = PartnerResponse.data.filter( + (r) => r.success + ); + if (failedTransactions.length > 0) { + //Uh oh. At least one was no good. + failedTransactions.map((ft) => + notification["error"]({ + message: t("invoices.errors.exporting", { + error: ft.errorMessage || "", + }), + }) + ); + } + if (successfulTransactions.length > 0) { + const invoiceUpdateResponse = await updateInvoice({ + variables: { + invoiceIdList: successfulTransactions.map((st) => st.id), + invoice: { + exported: true, + exported_at: new Date(), + }, + }, + }); + if (!!!invoiceUpdateResponse.errors) { + notification["success"]({ + message: t("jobs.successes.exported"), + }); + } else { + notification["error"]({ + message: t("jobs.errors.exporting", { + error: JSON.stringify(invoiceUpdateResponse.error), + }), + }); + } + } + + if (!!loadingCallback) loadingCallback(false); + setLoading(false); + }; + + return ( + + ); +} + +export default connect(mapStateToProps, null)(InvoiceExportButton); diff --git a/client/src/components/invoice-form/invoice-form.component.jsx b/client/src/components/invoice-form/invoice-form.component.jsx new file mode 100644 index 000000000..33747887b --- /dev/null +++ b/client/src/components/invoice-form/invoice-form.component.jsx @@ -0,0 +1,247 @@ +import { Button, Form, Input, Statistic, Switch, Upload } from "antd"; +import React, { useEffect, useState } from "react"; +import { useTranslation } from "react-i18next"; +import AlertComponent from "../alert/alert.component"; +import FormDatePicker from "../form-date-picker/form-date-picker.component"; +import CurrencyInput from "../form-items-formatted/currency-form-item.component"; +import JobSearchSelect from "../job-search-select/job-search-select.component"; +import VendorSearchSelect from "../vendor-search-select/vendor-search-select.component"; +import InvoiceFormLines from "./invoice-form.lines.component"; +import "./invoice-form.styles.scss"; +import { CalculateInvoiceTotal } from "./invoice-form.totals.utility"; + +export default function InvoiceFormComponent({ + form, + roAutoCompleteOptions, + vendorAutoCompleteOptions, + lineData, + responsibilityCenters, + loadLines, + invoiceEdit, +}) { + const { t } = useTranslation(); + + const [discount, setDiscount] = useState(0); + + const handleVendorSelect = (props, opt) => { + setDiscount(opt.discount); + }; + + //TODO: Test this further. Required to set discount when viewing an invoice. + useEffect(() => { + if (form.getFieldValue("vendorid") && vendorAutoCompleteOptions) { + const vendorId = form.getFieldValue("vendorid"); + const matchingVendors = vendorAutoCompleteOptions.filter( + (v) => v.id === vendorId + ); + if (matchingVendors.length === 1) { + setDiscount(matchingVendors[0].discount); + } + } + if (form.getFieldValue("jobid")) { + loadLines({ variables: { id: form.getFieldValue("jobid") } }); + } + }, [form, setDiscount, vendorAutoCompleteOptions, loadLines]); + + return ( +
+
+ + { + if (form.getFieldValue("jobid") !== null) { + loadLines({ variables: { id: form.getFieldValue("jobid") } }); + } + }} + /> + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + +
+ + + { + console.log("Upload event:", e); + if (Array.isArray(e)) { + return e; + } + return e && e.fileList; + }} + > + false} listType="picture"> + + + + + + {() => { + const values = form.getFieldsValue([ + "invoicelines", + "total", + "federal_tax_rate", + "state_tax_rate", + "local_tax_rate", + ]); + let totals; + if ( + !!values.total && + !!values.invoicelines && + values.invoicelines.length > 0 + ) + totals = CalculateInvoiceTotal(values); + if (!!totals) + return ( +
+
+ + + + + + + +
+ {form.getFieldValue("is_credit_memo") ? ( + + ) : null} +
+ ); + return null; + }} +
+
+ ); +} diff --git a/client/src/components/invoice-form/invoice-form.container.jsx b/client/src/components/invoice-form/invoice-form.container.jsx new file mode 100644 index 000000000..0743ed8d0 --- /dev/null +++ b/client/src/components/invoice-form/invoice-form.container.jsx @@ -0,0 +1,42 @@ +import { useLazyQuery, useQuery } from "@apollo/react-hooks"; +import React from "react"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { GET_JOB_LINES_TO_ENTER_INVOICE } from "../../graphql/jobs-lines.queries"; +import { ACTIVE_JOBS_FOR_AUTOCOMPLETE } from "../../graphql/jobs.queries"; +import { SEARCH_VENDOR_AUTOCOMPLETE } from "../../graphql/vendors.queries"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +import InvoiceFormComponent from "./invoice-form.component"; + +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, +}); + +export function InvoiceFormContainer({ bodyshop, form, invoiceEdit }) { + const { data: RoAutoCompleteData } = useQuery(ACTIVE_JOBS_FOR_AUTOCOMPLETE, { + variables: { statuses: bodyshop.md_ro_statuses.open_statuses || ["Open"] }, + }); + + const { data: VendorAutoCompleteData } = useQuery(SEARCH_VENDOR_AUTOCOMPLETE); + + const [loadLines, { data: lineData }] = useLazyQuery( + GET_JOB_LINES_TO_ENTER_INVOICE + ); + + return ( +
+ +
+ ); +} +export default connect(mapStateToProps, null)(InvoiceFormContainer); diff --git a/client/src/components/invoice-form/invoice-form.lines.component.jsx b/client/src/components/invoice-form/invoice-form.lines.component.jsx new file mode 100644 index 000000000..ba9e906d0 --- /dev/null +++ b/client/src/components/invoice-form/invoice-form.lines.component.jsx @@ -0,0 +1,219 @@ +import { DeleteFilled, WarningOutlined } from "@ant-design/icons"; +import { Button, Form, Input, InputNumber, Select, Switch } from "antd"; +import React from "react"; +import { useTranslation } from "react-i18next"; +import CurrencyInput from "../form-items-formatted/currency-form-item.component"; +import InvoiceLineSearchSelect from "../invoice-line-search-select/invoice-line-search-select.component"; + +export default function InvoiceEnterModalLinesComponent({ + lineData, + discount, + form, + responsibilityCenters, +}) { + const { t } = useTranslation(); + const { setFieldsValue, getFieldsValue } = form; + + return ( + + {(fields, { add, remove }) => { + return ( +
+ {fields.map((field, index) => ( + +
+ + { + setFieldsValue({ + invoicelines: getFieldsValue([ + "invoicelines", + ]).invoicelines.map((item, idx) => { + if (idx === index) { + return { + ...item, + line_desc: opt.line_desc, + quantity: opt.part_qty || 1, + actual_price: opt.cost, + cost_center: opt.part_type + ? responsibilityCenters.defaults.costs[ + opt.part_type + ] || null + : null, + }; + } + return item; + }), + }); + }} + /> + + + + + + + + + + { + setFieldsValue({ + invoicelines: getFieldsValue( + "invoicelines" + ).invoicelines.map((item, idx) => { + if (idx === index) { + return { + ...item, + actual_cost: !!item.actual_cost + ? item.actual_cost + : parseFloat(e.target.value) * (1 - discount), + }; + } + return item; + }), + }); + }} + /> + + + + + + {() => { + const line = getFieldsValue(["invoicelines"]) + .invoicelines[index]; + if (!!!line) return null; + const lineDiscount = ( + 1 - + Math.round( + (line.actual_cost / line.actual_price) * 100 + ) / + 100 + ).toPrecision(2); + + if (lineDiscount - discount === 0) return null; + return ; + }} + + + + + + + + + + + + + + { + remove(field.name); + }} + /> +
+
+ ))} + + + +
+ ); + }} +
+ ); +} diff --git a/client/src/components/invoice-form/invoice-form.styles.scss b/client/src/components/invoice-form/invoice-form.styles.scss new file mode 100644 index 000000000..c5c2c5055 --- /dev/null +++ b/client/src/components/invoice-form/invoice-form.styles.scss @@ -0,0 +1,40 @@ +.invoice-form-wrapper { + display: flex; + flex-direction: column; + justify-content: left; +} + +.invoice-form-totals { + display: flex; + justify-content: space-around; + align-items: flex-start; + flex-wrap: wrap; + & > * { + padding: 5px; + } +} + +.invoice-form-invoice-details { + display: flex; + align-items: flex-start; + flex-wrap: wrap; + & > * { + padding: 5px; + } +} + +.invoice-form-lines-wrapper { + border: 3px ridge rgba(28, 110, 164, 0.24); + border-radius: 4px; +} + +.invoice-form-line { + display: flex; + flex-wrap: wrap; + align-items: flex-start; + justify-content: space-around; + border-bottom: 2px dashed rgba(7, 7, 7, 0.4); + F & > * { + margin: 5px; + } +} diff --git a/client/src/components/invoice-form/invoice-form.totals.utility.js b/client/src/components/invoice-form/invoice-form.totals.utility.js new file mode 100644 index 000000000..02f64f2aa --- /dev/null +++ b/client/src/components/invoice-form/invoice-form.totals.utility.js @@ -0,0 +1,52 @@ +import Dinero from "dinero.js"; +import { logImEXEvent } from "../../firebase/firebase.utils"; + +export const CalculateInvoiceTotal = (invoice) => { + logImEXEvent("invoice_calculate_total"); + + const { + total, + + invoicelines, + federal_tax_rate, + local_tax_rate, + state_tax_rate, + } = invoice; + //TODO Determine why this recalculates so many times. + let subtotal = Dinero({ amount: 0 }); + let federalTax = Dinero({ amount: 0 }); + let stateTax = Dinero({ amount: 0 }); + let localTax = Dinero({ amount: 0 }); + if (!!!invoicelines) return null; + invoicelines.forEach((i) => { + if (!!i) { + const itemTotal = Dinero({ + amount: Math.round((i.actual_cost || 0) * 100) || 0, + }).multiply(i.quantity || 1); + subtotal = subtotal.add(itemTotal); + if (i.applicable_taxes.federal) { + federalTax = federalTax.add( + itemTotal.percentage(federal_tax_rate || 0) + ); + } + if (i.applicable_taxes.state) + stateTax = stateTax.add(itemTotal.percentage(state_tax_rate || 0)); + if (i.applicable_taxes.local) + localTax = localTax.add(itemTotal.percentage(local_tax_rate || 0)); + } + }); + + const invoiceTotal = Dinero({ amount: Math.round((total || 0) * 100) }); + const enteredTotal = subtotal.add(federalTax).add(stateTax).add(localTax); + const discrepancy = enteredTotal.subtract(invoiceTotal); + + return { + subtotal, + federalTax, + stateTax, + localTax, + enteredTotal, + invoiceTotal, + discrepancy, + }; +}; diff --git a/client/src/components/invoice-line-search-select/invoice-line-search-select.component.jsx b/client/src/components/invoice-line-search-select/invoice-line-search-select.component.jsx new file mode 100644 index 000000000..b30c47682 --- /dev/null +++ b/client/src/components/invoice-line-search-select/invoice-line-search-select.component.jsx @@ -0,0 +1,65 @@ +import { Select, Row, Col, Tag } from "antd"; +import React, { useEffect, useState, forwardRef } from "react"; +import { useTranslation } from "react-i18next"; +import CurrencyFormatter from "../../utils/CurrencyFormatter"; + +//To be used as a form element only. +const { Option } = Select; +const InvoiceLineSearchSelect = ( + { value, onChange, options, onBlur, onSelect }, + ref +) => { + const [option, setOption] = useState(value); + const { t } = useTranslation(); + + useEffect(() => { + if (value !== option && onChange) { + onChange(option); + } + }, [value, option, onChange]); + + return ( + + ); +}; +export default forwardRef(InvoiceLineSearchSelect); diff --git a/client/src/components/invoices-by-vendor-list/invoices-by-vendor-list.component.jsx b/client/src/components/invoices-by-vendor-list/invoices-by-vendor-list.component.jsx new file mode 100644 index 000000000..953a655c8 --- /dev/null +++ b/client/src/components/invoices-by-vendor-list/invoices-by-vendor-list.component.jsx @@ -0,0 +1,161 @@ +//DEPRECATED. + +// import React, { useState } from "react"; +// import { QUERY_INVOICES_BY_VENDOR_PAGINATED } from "../../graphql/invoices.queries"; +// import { useQuery } from "@apollo/react-hooks"; +// import queryString from "query-string"; +// import { useHistory, useLocation } from "react-router-dom"; +// import { Table, Input } from "antd"; +// import { useTranslation } from "react-i18next"; +// import { alphaSort } from "../../utils/sorters"; +// import AlertComponent from "../alert/alert.component"; +// import { DateFormatter } from "../../utils/DateFormatter"; +// import CurrencyFormatter from "../../utils/CurrencyFormatter"; + +// export default function InvoicesByVendorList() { +// const search = queryString.parse(useLocation().search); +// const history = useHistory(); +// const { page, sortcolumn, sortorder } = search; + +// const { loading, error, data } = useQuery( +// QUERY_INVOICES_BY_VENDOR_PAGINATED, +// { +// variables: { +// vendorId: search.vendorid, +// offset: page ? (page - 1) * 25 : 0, +// limit: 25, +// order: [ +// { +// [sortcolumn || "date"]: sortorder +// ? sortorder === "descend" +// ? "desc" +// : "asc" +// : "desc", +// }, +// ], +// }, +// skip: !!!search.vendorid, +// } +// ); + +// const { t } = useTranslation(); + +// const [state, setState] = useState({ +// sortedInfo: {}, +// search: "", +// }); + +// const handleTableChange = (pagination, filters, sorter) => { +// setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); +// search.page = pagination.current; +// search.sortcolumn = sorter.columnKey; +// search.sortorder = sorter.order; +// history.push({ search: queryString.stringify(search) }); +// }; + +// const handleOnRowClick = (record) => { +// if (record) { +// if (record.id) { +// search.invoiceid = record.id; +// history.push({ search: queryString.stringify(search) }); +// } +// } else { +// delete search.invoiceid; +// history.push({ search: queryString.stringify(search) }); +// } +// }; + +// const columns = [ +// { +// title: t("invoices.fields.invoice_number"), +// dataIndex: "invoice_number", +// key: "invoice_number", +// sorter: (a, b) => alphaSort(a.invoice_number, b.invoice_number), +// sortOrder: +// state.sortedInfo.columnKey === "invoice_number" && +// state.sortedInfo.order, +// }, +// { +// title: t("invoices.fields.date"), +// dataIndex: "date", +// key: "date", + +// sorter: (a, b) => a.date - b.date, +// sortOrder: +// state.sortedInfo.columnKey === "date" && state.sortedInfo.order, +// render: (text, record) => {record.date}, +// }, +// { +// title: t("invoices.fields.total"), +// dataIndex: "total", +// key: "total", + +// sorter: (a, b) => a.total - b.total, +// sortOrder: +// state.sortedInfo.columnKey === "total" && state.sortedInfo.order, +// render: (text, record) => ( +// {record.total} +// ), +// }, +// ]; + +// const handleSearch = (e) => { +// setState({ ...state, search: e.target.value }); +// }; + +// const dataSource = state.search +// ? data.invoices.filter( +// (i) => +// (i.invoice_number || "") +// .toLowerCase() +// .includes(state.search.toLowerCase()) || +// (i.amount || "").toString().includes(state.search) +// ) +// : (data && data.invoices) || []; + +// if (error) return ; + +// return ( +//
{ +// return ( +//
+// +//
+// ); +// }} +// dataSource={dataSource} +// size='small' +// scroll={{ x: true }} +// pagination={{ +// position: "top", +// pageSize: 25, +// current: parseInt(page || 1), +// total: data ? data.invoices_aggregate.aggregate.count : 0, +// }} +// columns={columns} +// rowKey='id' +// onChange={handleTableChange} +// rowSelection={{ +// onSelect: (record) => { +// handleOnRowClick(record); +// }, +// selectedRowKeys: [search.invoiceid], +// type: "radio", +// }} +// onRow={(record, rowIndex) => { +// return { +// onClick: (event) => { +// handleOnRowClick(record); +// }, // click row +// }; +// }} +// /> +// ); +// } diff --git a/client/src/components/invoices-list-table/invoices-list-table.component.jsx b/client/src/components/invoices-list-table/invoices-list-table.component.jsx index 6f3cdebb6..fe9bf37ad 100644 --- a/client/src/components/invoices-list-table/invoices-list-table.component.jsx +++ b/client/src/components/invoices-list-table/invoices-list-table.component.jsx @@ -1,23 +1,48 @@ -import { Button, Descriptions, Table } from "antd"; +import { SyncOutlined } from "@ant-design/icons"; +import { Button, Checkbox, Descriptions, Table, Input, Typography } from "antd"; import React, { useState } from "react"; import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; import { Link } from "react-router-dom"; +import { setModalContext } from "../../redux/modals/modals.actions"; import CurrencyFormatter from "../../utils/CurrencyFormatter"; import { DateFormatter } from "../../utils/DateFormatter"; import { alphaSort } from "../../utils/sorters"; +import queryString from "query-string"; +import { useLocation } from "react-router-dom"; -export default function InvoicesListTableComponent({ +const mapDispatchToProps = (dispatch) => ({ + setPartsOrderContext: (context) => + dispatch(setModalContext({ context: context, modal: "partsOrder" })), + setInvoiceEnterContext: (context) => + dispatch(setModalContext({ context: context, modal: "invoiceEnter" })), + setReconciliationContext: (context) => + dispatch(setModalContext({ context: context, modal: "reconciliation" })), +}); + +export function InvoicesListTableComponent({ + job, loading, - invoices, - selectedInvoice, + invoicesQuery, handleOnRowClick, + setPartsOrderContext, + setInvoiceEnterContext, + setReconciliationContext, }) { const { t } = useTranslation(); + const [ + selectedInvoiceLinesByInvoice, + setSelectedInvoiceLinesByInvoice, + ] = useState({}); const [state, setState] = useState({ sortedInfo: {}, }); + const search = queryString.parse(useLocation().search); + const selectedInvoice = search.invoiceid; + const invoices = invoicesQuery.data ? invoicesQuery.data.invoices : []; + const { refetch } = invoicesQuery; const columns = [ { title: t("invoices.fields.vendorname"), @@ -41,7 +66,6 @@ export default function InvoicesListTableComponent({ title: t("invoices.fields.date"), dataIndex: "date", key: "date", - sorter: (a, b) => a.date - b.date, sortOrder: state.sortedInfo.columnKey === "date" && state.sortedInfo.order, @@ -51,7 +75,6 @@ export default function InvoicesListTableComponent({ title: t("invoices.fields.total"), dataIndex: "total", key: "total", - sorter: (a, b) => a.total - b.total, sortOrder: state.sortedInfo.columnKey === "total" && state.sortedInfo.order, @@ -59,14 +82,28 @@ export default function InvoicesListTableComponent({ {record.total} ), }, + { + title: t("invoices.fields.is_credit_memo"), + dataIndex: "is_credit_memo", + key: "is_credit_memo", + sorter: (a, b) => a.is_credit_memo - b.is_credit_memo, + sortOrder: + state.sortedInfo.columnKey === "is_credit_memo" && + state.sortedInfo.order, + render: (text, record) => , + }, { title: t("general.labels.actions"), dataIndex: "actions", key: "actions", render: (text, record) => ( - - - +
+ + + +
), }, ]; @@ -109,6 +146,14 @@ export default function InvoicesListTableComponent({ {record.actual_cost} ), }, + { + title: t("invoicelines.fields.quantity"), + dataIndex: "quantity", + key: "quantity", + sorter: (a, b) => a.quantity - b.quantity, + sortOrder: + state.sortedInfo.columnKey === "quantity" && state.sortedInfo.order, + }, { title: t("invoicelines.fields.cost_center"), dataIndex: "cost_center", @@ -118,64 +163,220 @@ export default function InvoicesListTableComponent({ state.sortedInfo.columnKey === "cost_center" && state.sortedInfo.order, }, + { + title: t("invoicelines.fields.federal_tax_applicable"), + dataIndex: "applicable_taxes.federal", + key: "applicable_taxes.federal", + render: (text, record) => ( + + ), + }, + { + title: t("invoicelines.fields.state_tax_applicable"), + dataIndex: "applicable_taxes.state", + key: "applicable_taxes.state", + render: (text, record) => ( + + ), + }, + { + title: t("invoicelines.fields.local_tax_applicable"), + dataIndex: "applicable_taxes.local", + key: "applicable_taxes.local", + render: (text, record) => ( + + ), + }, ]; + const handleOnInvoiceRowclick = (selectedRows) => { + console.log("selectedRows", selectedRows); + console.log("record.id", record.id); + setSelectedInvoiceLinesByInvoice({ + ...selectedInvoiceLinesByInvoice, + [record.id]: selectedRows.map((r) => r.id), + }); + }; + + console.log( + "selectedInvoiceLinesByInvoice[record.id]", + selectedInvoiceLinesByInvoice[record.id] + ); + return (
- - Zhou Maomao - 1810000000 - Hangzhou, Zhejiang - empty - - No. 18, Wantang Road, Xihu District, Hangzhou, Zhejiang, China + {`${t("invoices.fields.invoice_number")} ${ + record.invoice_number + }`} + + + {`${record.federal_tax_rate}%` || ""} + + + {`${record.state_tax_rate}%` || ""} + + + {`${record.local_tax_rate}%` || ""} +
({ ...item }))} + columns={columns} rowKey="id" dataSource={record.invoicelines} + rowSelection={{ + onSelect: (record, selected, selectedRows) => { + handleOnInvoiceRowclick(selectedRows); + }, + onSelectAll: (selected, selectedRows, changeRows) => { + handleOnInvoiceRowclick(selectedRows); + }, + selectedRowKeys: selectedInvoiceLinesByInvoice[record.id], + type: "checkbox", + }} /> ); }; return ( -
({ ...item }))} - rowKey="id" - dataSource={invoices} - onChange={handleTableChange} - expandable={{ - expandedRowKeys: [selectedInvoice], - onExpand: (expanded, record) => { - handleOnRowClick(expanded ? record : null); - }, - }} - rowSelection={{ - onSelect: (record) => { - handleOnRowClick(record); - }, - selectedRowKeys: [selectedInvoice], - type: "radio", - }} - onRow={(record, rowIndex) => { - return { - onClick: (event) => { +
+ + {t("invoices.labels.invoices")} + +
( +
+ + {job ? ( +
+ + +
+ ) : null} + +
+ { + e.preventDefault(); + }} + /> +
+
+ )} + scroll={{ x: "50%", y: "40rem" }} + expandedRowRender={rowExpander} + pagination={{ position: "top", defaultPageSize: 25 }} + columns={columns} + rowKey="id" + dataSource={invoices} + onChange={handleTableChange} + expandable={{ + expandedRowKeys: [selectedInvoice], + onExpand: (expanded, record) => { + handleOnRowClick(expanded ? record : null); + }, + }} + rowSelection={{ + onSelect: (record) => { handleOnRowClick(record); - }, // click row - onDoubleClick: (event) => {}, // double click row - onContextMenu: (event) => {}, // right button click row - onMouseEnter: (event) => {}, // mouse enter row - onMouseLeave: (event) => {}, // mouse leave row - }; - }} - /> + }, + selectedRowKeys: [selectedInvoice], + type: "radio", + }} + onRow={(record, rowIndex) => { + return { + onClick: (event) => { + handleOnRowClick(record); + }, // click row + onDoubleClick: (event) => {}, // double click row + onContextMenu: (event) => {}, // right button click row + onMouseEnter: (event) => {}, // mouse enter row + onMouseLeave: (event) => {}, // mouse leave row + }; + }} + /> + ); } +export default connect(null, mapDispatchToProps)(InvoicesListTableComponent); diff --git a/client/src/components/invoices-vendors-list/invoices-vendors-list.component.jsx b/client/src/components/invoices-vendors-list/invoices-vendors-list.component.jsx new file mode 100644 index 000000000..930c362fa --- /dev/null +++ b/client/src/components/invoices-vendors-list/invoices-vendors-list.component.jsx @@ -0,0 +1,119 @@ +import React, { useState } from "react"; +import { QUERY_ALL_VENDORS } from "../../graphql/vendors.queries"; +import { useQuery } from "@apollo/react-hooks"; +import queryString from "query-string"; +import { useHistory, useLocation } from "react-router-dom"; +import { Table, Input } from "antd"; +import { useTranslation } from "react-i18next"; +import { alphaSort } from "../../utils/sorters"; +import AlertComponent from "../alert/alert.component"; + +export default function InvoicesVendorsList() { + const search = queryString.parse(useLocation().search); + const history = useHistory(); + + const { loading, error, data } = useQuery(QUERY_ALL_VENDORS); + + const { t } = useTranslation(); + + const [state, setState] = useState({ + sortedInfo: {}, + search: "", + }); + + const handleTableChange = (pagination, filters, sorter) => { + setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); + }; + + const columns = [ + { + title: t("vendors.fields.name"), + dataIndex: "name", + key: "name", + sorter: (a, b) => alphaSort(a.name, b.name), + sortOrder: + state.sortedInfo.columnKey === "name" && state.sortedInfo.order, + }, + { + title: t("vendors.fields.cost_center"), + dataIndex: "cost_center", + key: "cost_center", + sorter: (a, b) => alphaSort(a.cost_center, b.cost_center), + sortOrder: + state.sortedInfo.columnKey === "cost_center" && state.sortedInfo.order, + }, + { + title: t("vendors.fields.city"), + dataIndex: "city", + key: "city", + }, + ]; + + const handleOnRowClick = (record) => { + if (record) { + delete search.invoiceid; + if (record.id) { + search.vendorid = record.id; + history.push({ search: queryString.stringify(search) }); + } + } else { + delete search.vendorid; + history.push({ search: queryString.stringify(search) }); + } + }; + + const handleSearch = (e) => { + setState({ ...state, search: e.target.value }); + }; + + if (error) return ; + + const dataSource = state.search + ? data.vendors.filter( + (v) => + (v.name || "").toLowerCase().includes(state.search.toLowerCase()) || + (v.cost_center || "") + .toLowerCase() + .includes(state.search.toLowerCase()) || + (v.city || "").toLowerCase().includes(state.search.toLowerCase()) + ) + : (data && data.vendors) || []; + + return ( +
{ + return ( +
+ +
+ ); + }} + dataSource={dataSource} + size="small" + pagination={{ position: "top" }} + columns={columns} + rowKey="id" + onChange={handleTableChange} + rowSelection={{ + onSelect: (record) => { + handleOnRowClick(record); + }, + selectedRowKeys: [search.vendorid], + type: "radio", + }} + onRow={(record, rowIndex) => { + return { + onClick: (event) => { + handleOnRowClick(record); + }, // click row + }; + }} + /> + ); +} diff --git a/client/src/components/job-costing-modal/job-costing-modal.component.jsx b/client/src/components/job-costing-modal/job-costing-modal.component.jsx new file mode 100644 index 000000000..cd3f16930 --- /dev/null +++ b/client/src/components/job-costing-modal/job-costing-modal.component.jsx @@ -0,0 +1,158 @@ +import Dinero from "dinero.js"; +import React from "react"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +import JobCostingPartsTable from "../job-costing-parts-table/job-costing-parts-table.component"; +import JobCostingStatistics from "../job-costing-statistics/job-costing-statistics.component"; + +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, +}); +const mapDispatchToProps = (dispatch) => ({ + //setUserLanguage: language => dispatch(setUserLanguage(language)) +}); + +export function JobCostingModalComponent({ bodyshop, job }) { + const defaultProfits = bodyshop.md_responsibility_centers.defaults.profits; + // const defaultCosts = bodyshop.md_responsibility_centers.defaults.costs; + + const jobLineTotalsByProfitCenter = job.joblines.reduce( + (acc, val) => { + const laborProfitCenter = defaultProfits[val.mod_lbr_ty]; + if (!!!laborProfitCenter) + console.log( + "Unknown cost/profit center mapping for labor.", + val.mod_lbr_ty + ); + + const rateName = `rate_${(val.mod_lbr_ty || "").toLowerCase()}`; + const laborAmount = Dinero({ + amount: Math.round((job[rateName] || 0) * 100), + }).multiply(val.mod_lb_hrs || 0); + if (!!!acc.labor[laborProfitCenter]) + acc.labor[laborProfitCenter] = Dinero(); + acc.labor[laborProfitCenter] = acc.labor[laborProfitCenter].add( + laborAmount + ); + + const partsProfitCenter = defaultProfits[val.part_type]; + if (!!!partsProfitCenter) + console.log( + "Unknown cost/profit center mapping for parts.", + val.part_type + ); + const partsAmount = Dinero({ + amount: Math.round((val.act_price || 0) * 100), + }).multiply(val.part_qty || 1); + if (!!!acc.parts[partsProfitCenter]) + acc.parts[partsProfitCenter] = Dinero(); + acc.parts[partsProfitCenter] = acc.parts[partsProfitCenter].add( + partsAmount + ); + + return acc; + }, + { parts: {}, labor: {} } + ); + + const invoiceTotalsByProfitCenter = job.invoices.reduce( + (inv_acc, inv_val) => { + //At the invoice level. + inv_val.invoicelines.map((line_val) => { + //At the invoice line level. + //console.log("JobCostingPartsTable -> line_val", line_val); + if (!!!inv_acc[line_val.cost_center]) + inv_acc[line_val.cost_center] = Dinero(); + + inv_acc[line_val.cost_center] = inv_acc[line_val.cost_center].add( + Dinero({ + amount: Math.round((line_val.actual_cost || 0) * 100), + }) + .multiply(line_val.quantity) + .multiply(inv_val.is_credit_memo ? -1 : 1) + ); + return null; + }); + return inv_acc; + }, + {} + ); + + const summaryData = { + totalLaborSales: Dinero({ amount: 0 }), + totalPartsSales: Dinero({ amount: 0 }), + totalSales: Dinero({ amount: 0 }), + totalCost: Dinero({ amount: 0 }), + gpdollars: Dinero({ amount: 0 }), + gppercent: null, + gppercentFormatted: null, + }; + + const costCenterData = Object.keys(defaultProfits).map((key, idx) => { + const ccVal = defaultProfits[key]; + const sale_labor = + jobLineTotalsByProfitCenter.labor[ccVal] || Dinero({ amount: 0 }); + const sale_parts = + jobLineTotalsByProfitCenter.parts[ccVal] || Dinero({ amount: 0 }); + const cost = invoiceTotalsByProfitCenter[ccVal] || Dinero({ amount: 0 }); + const totalSales = sale_labor.add(sale_parts); + const gpdollars = totalSales.subtract(cost); + const gppercent = ( + (gpdollars.getAmount() / totalSales.getAmount()) * + 100 + ).toFixed(2); + + let gppercentFormatted; + if (isNaN(gppercent)) gppercentFormatted = "0%"; + else if (!isFinite(gppercent)) gppercentFormatted = "-∞"; + else { + gppercentFormatted = `${gppercent}%`; + } + //Push summary data to avoid extra loop. + summaryData.totalLaborSales = summaryData.totalLaborSales.add(sale_labor); + summaryData.totalPartsSales = summaryData.totalPartsSales.add(sale_parts); + summaryData.totalSales = summaryData.totalSales + .add(sale_labor) + .add(sale_parts); + summaryData.totalCost = summaryData.totalCost.add(cost); + + return { + id: idx, + cost_center: ccVal, + sale_labor: sale_labor && sale_labor.toFormat(), + sale_parts: sale_parts && sale_parts.toFormat(), + cost: cost && cost.toFormat(), + gpdollars: gpdollars.toFormat(), + gppercent: gppercentFormatted, + }; + }); + + //Final summary data massaging. + summaryData.gpdollars = summaryData.totalSales.subtract( + summaryData.totalCost + ); + summaryData.gppercent = ( + (summaryData.gpdollars.getAmount() / summaryData.totalSales.getAmount()) * + 100 + ).toFixed(2); + if (isNaN(summaryData.gppercent)) summaryData.gppercentFormatted = 0; + else if (!isFinite(summaryData.gppercent)) + summaryData.gppercentFormatted = "-∞"; + else { + summaryData.gppercentFormatted = summaryData.gppercent; + } + + console.log("JobCostingModalComponent -> summaryData", summaryData); + + return ( +
+ + +
+ ); +} +export default connect( + mapStateToProps, + mapDispatchToProps +)(JobCostingModalComponent); diff --git a/client/src/components/job-costing-modal/job-costing-modal.container.jsx b/client/src/components/job-costing-modal/job-costing-modal.container.jsx new file mode 100644 index 000000000..c7766cb6b --- /dev/null +++ b/client/src/components/job-costing-modal/job-costing-modal.container.jsx @@ -0,0 +1,58 @@ +import { useQuery } from "@apollo/react-hooks"; +import { Modal } from "antd"; +import React from "react"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { QUERY_JOB_COSTING_DETAILS } from "../../graphql/jobs.queries"; +import { toggleModalVisible } from "../../redux/modals/modals.actions"; +import { selectJobCosting } from "../../redux/modals/modals.selectors"; +import AlertComponent from "../alert/alert.component"; +import LoadingSpinner from "../loading-spinner/loading-spinner.component"; +import JobCostingModalComponent from "./job-costing-modal.component"; + +const mapStateToProps = createStructuredSelector({ + jobCostingModal: selectJobCosting, +}); + +const mapDispatchToProps = (dispatch) => ({ + toggleModalVisible: () => dispatch(toggleModalVisible("jobCosting")), +}); + +export function JobCostingModalContainer({ + jobCostingModal, + toggleModalVisible, +}) { + const { t } = useTranslation(); + + const { visible, context } = jobCostingModal; + const { jobId } = context; + + const { loading, error, data } = useQuery(QUERY_JOB_COSTING_DETAILS, { + variables: { id: jobId }, + skip: !jobId, + }); + + return ( + toggleModalVisible()} + width="90%" + destroyOnClose + forceRender + > + {error ? : null} + {loading ? ( + + ) : ( + + )} + + ); +} + +export default connect( + mapStateToProps, + mapDispatchToProps +)(JobCostingModalContainer); diff --git a/client/src/components/job-costing-parts-table/job-costing-parts-table.component.jsx b/client/src/components/job-costing-parts-table/job-costing-parts-table.component.jsx new file mode 100644 index 000000000..473a79eee --- /dev/null +++ b/client/src/components/job-costing-parts-table/job-costing-parts-table.component.jsx @@ -0,0 +1,81 @@ +import { Table } from "antd"; +import React, { useState } from "react"; +import { useTranslation } from "react-i18next"; +import { alphaSort } from "../../utils/sorters"; + +export default function JobCostingPartsTable({ job, data }) { + const [state, setState] = useState({ + sortedInfo: {}, + }); + + const handleTableChange = (pagination, filters, sorter) => { + setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); + }; + + const { t } = useTranslation(); + + const columns = [ + { + title: t("bodyshop.fields.responsibilitycenter"), + dataIndex: "cost_center", + key: "cost_center", + sorter: (a, b) => alphaSort(a.cost_center, b.cost_center), + sortOrder: + state.sortedInfo.columnKey === "cost_center" && state.sortedInfo.order, + }, + { + title: t("jobs.labels.sale_labor"), + dataIndex: "sale_labor", + key: "sale_labor", + sorter: (a, b) => alphaSort(a.sale_labor, b.sale_labor), + sortOrder: + state.sortedInfo.columnKey === "sale_labor" && state.sortedInfo.order, + }, + { + title: t("jobs.labels.sale_parts"), + dataIndex: "sale_parts", + key: "sale_parts", + sorter: (a, b) => alphaSort(a.sale_parts, b.sale_parts), + sortOrder: + state.sortedInfo.columnKey === "sale_parts" && state.sortedInfo.order, + }, + { + title: t("jobs.labels.cost"), + dataIndex: "cost", + key: "cost", + sorter: (a, b) => a.cost - b.cost, + sortOrder: + state.sortedInfo.columnKey === "cost" && state.sortedInfo.order, + }, + { + title: t("jobs.labels.gpdollars"), + dataIndex: "gpdollars", + key: "gpdollars", + sorter: (a, b) => a.gpdollars - b.gpdollars, + sortOrder: + state.sortedInfo.columnKey === "gpdollars" && state.sortedInfo.order, + }, + { + title: t("jobs.labels.gppercent"), + dataIndex: "gppercent", + key: "gppercent", + sorter: (a, b) => a.gppercent - b.gppercent, + sortOrder: + state.sortedInfo.columnKey === "gppercent" && state.sortedInfo.order, + }, + ]; + + return ( +
+
+ + ); +} diff --git a/client/src/components/job-costing-statistics/job-costing-statistics.component.jsx b/client/src/components/job-costing-statistics/job-costing-statistics.component.jsx new file mode 100644 index 000000000..fd7f2fffe --- /dev/null +++ b/client/src/components/job-costing-statistics/job-costing-statistics.component.jsx @@ -0,0 +1,39 @@ +import { Statistic } from "antd"; +import React from "react"; +import { useTranslation } from "react-i18next"; + +export default function JobCostingStatistics({ job, summaryData }) { + const { t } = useTranslation(); + + return ( +
+
+ + + + + + +
+
+ ); +} diff --git a/client/src/components/job-damage-visual/job-damage-visual.component.jsx b/client/src/components/job-damage-visual/job-damage-visual.component.jsx index 3af1910ab..558d4eefe 100644 --- a/client/src/components/job-damage-visual/job-damage-visual.component.jsx +++ b/client/src/components/job-damage-visual/job-damage-visual.component.jsx @@ -1,6 +1,7 @@ import React from "react"; export default ({ dmg1, dmg2 }) => ( ({ - setInvoiceEnterContext: context => - dispatch(setModalContext({ context: context, modal: "invoiceEnter" })), - setNoteUpsertContext: context => - dispatch(setModalContext({ context: context, modal: "noteUpsert" })) +const mapDispatchToProps = (dispatch) => ({ + setPrintCenterContext: (context) => + dispatch(setModalContext({ context: context, modal: "printCenter" })), }); -export function JobDetailCards({ - selectedJob, - setInvoiceEnterContext, - setNoteUpsertContext -}) { +const colBreakPoints = { + xs: { + span: 24, + }, + sm: { + span: 12, + }, +}; + +export function JobDetailCards({ setPrintCenterContext }) { + const selectedBreakpoint = Object.entries(Grid.useBreakpoint()) + .filter((screen) => !!screen[1]) + .slice(-1)[0]; + + const bpoints = { + xs: "100%", + sm: "100%", + md: "100%", + lg: "50%", + xl: "50%", + xxl: "45%", + }; + const drawerPercentage = selectedBreakpoint + ? bpoints[selectedBreakpoint[0]] + : "100%"; + + const searchParams = queryString.parse(useLocation().search); + const { selected } = searchParams; + const history = useHistory(); const { loading, error, data, refetch } = useQuery(QUERY_JOB_CARD_DETAILS, { fetchPolicy: "network-only", - variables: { id: selectedJob }, - skip: !selectedJob + variables: { id: selected }, + skip: !selected, }); - const scheduleModalState = useState(false); - const { t } = useTranslation(); - if (!selectedJob) { - return
{t("jobs.errors.nojobselected")}
; - } - if (loading) return ; - if (error) return ; + const { t } = useTranslation(); + const handleDrawerClose = () => { + delete searchParams.selected; + history.push({ + search: queryString.stringify({ + ...searchParams, + }), + }); + }; return ( -
- - - - {data.jobs_by_pk.status ? ( - {data.jobs_by_pk.status} - ) : null} - - } - title={ - loading ? ( - t("general.labels.loading") - ) : ( + + {loading ? : null} + {error ? : null} + {data ? ( + , + , + + {t("jobs.labels.inproduction")} + , + ]} + title={ {data.jobs_by_pk.ro_number ? `${t("jobs.fields.ro_number")} ${data.jobs_by_pk.ro_number}` @@ -80,125 +102,77 @@ export function JobDetailCards({ data.jobs_by_pk.est_number }`} - ) - } - extra={[ - , - - - , - , - , - - ]} - > - { - // loading ? ( - // - // ) : ( - // - // Lili Qu - // 421421 - // - // 2017-01-10 - // - // - // 2017-10-10 - // - // - // Gonghu Road, Xihu District, Hangzhou, Zhejiang, China - // - // - // ) - } - -
- - { - // } - - - - - - - - -
-
-
+ subTitle={data.jobs_by_pk.status} + extra={ + + + + + + + } + > + +
+ + + + + + + + + + + + + + + + + + + + + + + ) : null} + ); } export default connect(null, mapDispatchToProps)(JobDetailCards); diff --git a/client/src/components/job-detail-cards/job-detail-cards.customer.component.jsx b/client/src/components/job-detail-cards/job-detail-cards.customer.component.jsx deleted file mode 100644 index 76acbb7c3..000000000 --- a/client/src/components/job-detail-cards/job-detail-cards.customer.component.jsx +++ /dev/null @@ -1,58 +0,0 @@ -import React from "react"; -import { useTranslation } from "react-i18next"; -import { Link } from "react-router-dom"; -import PhoneFormatter from "../../utils/PhoneFormatter"; -import CardTemplate from "./job-detail-cards.template.component"; - -export default function JobDetailCardsCustomerComponent({ loading, data }) { - const { t } = useTranslation(); - - return ( - - {data ? ( - -
- {`${data.ownr_fn || - ""} ${data.ownr_ln || ""}`} -
-
- {t("jobs.fields.phoneshort")}: - {`${data.ownr_ph1 || - t("general.labels.na")}`} -
-
- {t("jobs.fields.ownr_ea")}: - {data.ownr_ea ? ( - - {`${data.ownr_ea || ""}`} - - ) : ( - t("general.labels.na") - )} -
-
{`${(data.owner && data.owner.preferred_contact) || ""}`}
-
- {data.vehicle ? ( - - {`${data.v_model_yr || ""} ${data.v_make_desc || - ""} ${data.v_model_desc || ""}`} - a - - ) : ( - - {`${data.v_model_yr || ""} ${data.v_make_desc || - ""} ${data.v_model_desc || ""}`} - b - - )} - e -
-
- ) : null} -
- ); -} diff --git a/client/src/components/job-detail-cards/job-detail-cards.dates.component.jsx b/client/src/components/job-detail-cards/job-detail-cards.dates.component.jsx index 5c0b7fff8..c5155d058 100644 --- a/client/src/components/job-detail-cards/job-detail-cards.dates.component.jsx +++ b/client/src/components/job-detail-cards/job-detail-cards.dates.component.jsx @@ -27,87 +27,86 @@ export default function JobDetailCardsDatesComponent({ loading, data }) { ) ? (
{t("jobs.errors.nodates")}
) : null} + {data.date_open ? ( + + + {data.date_open} + + ) : null} + + {data.date_estimated ? ( + + + {data.date_estimated} + + ) : null} + + {data.date_scheduled ? ( + + + {data.date_scheduled} + + ) : null} + + {data.scheduled_in ? ( + + + {data.scheduled_in} + + ) : null} {data.actual_in ? ( - {t("jobs.fields.actual_in")} + {data.actual_in} ) : null} {data.scheduled_completion ? ( - {t("jobs.fields.scheduled_completion")} + {data.scheduled_completion} ) : null} - {data.scheduled_in ? ( - - {t("jobs.fields.scheduled_in")} - {data.scheduled_in} - - ) : null} - {data.actual_completion ? ( - {t("jobs.fields.actual_completion")} + {data.actual_completion} ) : null} {data.scheduled_delivery ? ( - {t("jobs.fields.scheduled_delivery")} + {data.scheduled_delivery} ) : null} {data.actual_delivery ? ( - {t("jobs.fields.actual_delivery")} + {data.actual_delivery} ) : null} - {data.date_estimated ? ( - - {t("jobs.fields.date_estimated")} - {data.date_estimated} - - ) : null} - - {data.date_open ? ( - - {t("jobs.fields.date_open")} - {data.date_open} - - ) : null} - - {data.date_scheduled ? ( - - {t("jobs.fields.date_scheduled")} - {data.date_scheduled} - - ) : null} - {data.date_invoiced ? ( - {t("jobs.fields.date_invoiced")} + {data.date_invoiced} ) : null} {data.date_closed ? ( - {t("jobs.fields.date_closed")} + {data.date_closed} ) : null} {data.date_exported ? ( - {t("jobs.fields.date_exported")} + {data.date_exported} ) : null} diff --git a/client/src/components/job-detail-cards/job-detail-cards.documents.component.jsx b/client/src/components/job-detail-cards/job-detail-cards.documents.component.jsx index 5c3713097..3fd8ad8a4 100644 --- a/client/src/components/job-detail-cards/job-detail-cards.documents.component.jsx +++ b/client/src/components/job-detail-cards/job-detail-cards.documents.component.jsx @@ -1,7 +1,6 @@ import { Carousel } from "antd"; import React from "react"; import { useTranslation } from "react-i18next"; -import "./job-detail-cards.styles.scss"; import CardTemplate from "./job-detail-cards.template.component"; export default function JobDetailCardsDocumentsComponent({ loading, data }) { @@ -18,12 +17,15 @@ export default function JobDetailCardsDocumentsComponent({ loading, data }) { + extraLink={`/manage/jobs/${data.id}?tab=documents`}> {data.documents.length > 0 ? ( - {data.documents.map(item => ( - {item.name} + {data.documents.map((item) => ( + {item.name} ))} ) : ( diff --git a/client/src/components/job-detail-cards/job-detail-cards.insurance.component.jsx b/client/src/components/job-detail-cards/job-detail-cards.insurance.component.jsx index 5e29e3fdb..281b9369a 100644 --- a/client/src/components/job-detail-cards/job-detail-cards.insurance.component.jsx +++ b/client/src/components/job-detail-cards/job-detail-cards.insurance.component.jsx @@ -1,8 +1,7 @@ import React from "react"; import { useTranslation } from "react-i18next"; +import DataLabel from "../data-label/data-label.component"; import CardTemplate from "./job-detail-cards.template.component"; -import PhoneFormatter from "../../utils/PhoneFormatter"; - export default function JobDetailCardsInsuranceComponent({ loading, data }) { const { t } = useTranslation(); @@ -10,10 +9,15 @@ export default function JobDetailCardsInsuranceComponent({ loading, data }) { {data ? ( -
{data.ins_co_nm || t("general.labels.unknown")}
-
{data.clm_no || t("general.labels.unknown")}
- - - - -
- {t("jobs.labels.cards.estimator")} - {data.est_ea ? ( + + + {data.ins_ea ? (
{`${data.est_ct_fn || ""} ${data.est_ct_ln || ""}`}
) : (
{`${data.est_ct_fn || ""} ${data.est_ct_ln || ""}`}
)} - {data.est_ph1 ? ( - {data.est_ph1} - ) : null} -
+
) : null}
diff --git a/client/src/components/job-detail-cards/job-detail-cards.parts.component.jsx b/client/src/components/job-detail-cards/job-detail-cards.parts.component.jsx index de1aa7882..ace40e4ff 100644 --- a/client/src/components/job-detail-cards/job-detail-cards.parts.component.jsx +++ b/client/src/components/job-detail-cards/job-detail-cards.parts.component.jsx @@ -1,61 +1,13 @@ import React from "react"; import { useTranslation } from "react-i18next"; import CardTemplate from "./job-detail-cards.template.component"; -import { Pie } from "@nivo/pie"; export default function JobDetailCardsPartsComponent({ loading, data }) { const { t } = useTranslation(); - const commonProperties = { - width: 225, - height: 225, - margin: { top: 20, right: 30, bottom: 20, left: 30 }, - animate: true - }; - - const cdata = [ - { - id: "elixir", - label: "elixir", - value: 558, - color: "hsl(21, 70%, 50%)" - }, - { - id: "erlang", - label: "erlang", - value: 443, - color: "hsl(91, 70%, 50%)" - }, - { - id: "css", - label: "css", - value: 161, - color: "hsl(271, 70%, 50%)" - }, - { - id: "python", - label: "python", - value: 305, - color: "hsl(33, 70%, 50%)" - }, - { - id: "php", - label: "php", - value: 360, - color: "hsl(296, 70%, 50%)" - } - ]; - return (
- + Placeholder piechart.
); diff --git a/client/src/components/job-detail-cards/job-detail-cards.styles.scss b/client/src/components/job-detail-cards/job-detail-cards.styles.scss deleted file mode 100644 index 33f1d1eff..000000000 --- a/client/src/components/job-detail-cards/job-detail-cards.styles.scss +++ /dev/null @@ -1,31 +0,0 @@ -.job-cards { - display: flex; - flex-wrap: wrap; -} - -.job-card { - margin: 0.5em; -} - -@media screen and (min-width: 40em) { - .card { - max-width: calc(50% - 1em); - } -} - -@media screen and (min-width: 60em) { - .card { - max-width: calc(25% - 1em); - } -} - -.centered { - margin: 0 auto; - padding: 0 1em; -} - -@media screen and (min-width: 52em) { - .centered { - max-width: 52em; - } -} diff --git a/client/src/components/job-detail-cards/job-detail-cards.template.component.jsx b/client/src/components/job-detail-cards/job-detail-cards.template.component.jsx index 30a854346..a2e9e78aa 100644 --- a/client/src/components/job-detail-cards/job-detail-cards.template.component.jsx +++ b/client/src/components/job-detail-cards/job-detail-cards.template.component.jsx @@ -9,16 +9,14 @@ export default function JobDetailCardTemplate({ ...otherProps }) { let extra; - if (extraLink) extra = { extra: More }; + if (extraLink) extra = { extra: More }; return ( + {...extra}> {otherProps.children} ); diff --git a/client/src/components/job-detail-cards/job-detail-cards.totals.component.jsx b/client/src/components/job-detail-cards/job-detail-cards.totals.component.jsx index eb82564e7..8a6b6dd40 100644 --- a/client/src/components/job-detail-cards/job-detail-cards.totals.component.jsx +++ b/client/src/components/job-detail-cards/job-detail-cards.totals.component.jsx @@ -1,17 +1,44 @@ +import { Statistic } from "antd"; +import Dinero from "dinero.js"; import React from "react"; import { useTranslation } from "react-i18next"; import CardTemplate from "./job-detail-cards.template.component"; export default function JobDetailCardsTotalsComponent({ loading, data }) { const { t } = useTranslation(); + let totals; + + try { + totals = JSON.parse(data.job_totals); + } catch (error) { + console.log("Error in CardsTotal component", error); + } return ( - {data ? ( - - Totals stuff here. - - ) : null} + {totals ? ( +
+ + + +
+ ) : ( + t("jobs.errors.nofinancial") + )}
); } diff --git a/client/src/components/job-detail-lines/job-lines.component.jsx b/client/src/components/job-detail-lines/job-lines.component.jsx index e62b0d97d..e2cf141ed 100644 --- a/client/src/components/job-detail-lines/job-lines.component.jsx +++ b/client/src/components/job-detail-lines/job-lines.component.jsx @@ -1,17 +1,23 @@ -import { Button, Input, Table } from "antd"; +import { SyncOutlined, FilterFilled } from "@ant-design/icons"; +import { Button, Dropdown, Input, Menu, Table } from "antd"; import React, { useState } from "react"; import { useTranslation } from "react-i18next"; import { connect } from "react-redux"; import { Link } from "react-router-dom"; import { setModalContext } from "../../redux/modals/modals.actions"; +import { onlyUnique } from "../../utils/arrayHelper"; import CurrencyFormatter from "../../utils/CurrencyFormatter"; import { alphaSort } from "../../utils/sorters"; -import AllocationsAssignmentContainer from "../allocations-assignment/allocations-assignment.container"; -import AllocationsBulkAssignmentContainer from "../allocations-bulk-assignment/allocations-bulk-assignment.container"; -import AllocationsEmployeeLabelContainer from "../allocations-employee-label/allocations-employee-label.container"; +import JobLineLocationPopup from "../job-line-location-popup/job-line-location-popup.component"; +import JobLineNotePopup from "../job-line-note-popup/job-line-note-popup.component"; +// import AllocationsAssignmentContainer from "../allocations-assignment/allocations-assignment.container"; +// import AllocationsBulkAssignmentContainer from "../allocations-bulk-assignment/allocations-bulk-assignment.container"; +// import AllocationsEmployeeLabelContainer from "../allocations-employee-label/allocations-employee-label.container"; import PartsOrderModalContainer from "../parts-order-modal/parts-order-modal.container"; const mapDispatchToProps = (dispatch) => ({ + setJobLineEditContext: (context) => + dispatch(setModalContext({ context: context, modal: "jobLineEdit" })), setPartsOrderContext: (context) => dispatch(setModalContext({ context: context, modal: "partsOrder" })), }); @@ -29,62 +35,18 @@ export function JobLinesComponent({ }) { const [state, setState] = useState({ sortedInfo: {}, + filteredInfo: {}, }); const { t } = useTranslation(); const columns = [ { - title: t("joblines.fields.unq_seq"), - dataIndex: "unq_seq", - key: "unq_seq", - // onFilter: (value, record) => record.ro_number.includes(value), - // filteredValue: state.filteredInfo.text || null, - sorter: (a, b) => a.unq_seq - b.unq_seq, + title: "#", + dataIndex: "line_no", + key: "line_no", + sorter: (a, b) => a.line_no - b.line_no, sortOrder: - state.sortedInfo.columnKey === "unq_seq" && state.sortedInfo.order, - //ellipsis: true, - editable: true, - width: 75, - }, - { - title: t("joblines.fields.line_desc"), - dataIndex: "line_desc", - key: "line_desc", - sorter: (a, b) => alphaSort(a.line_desc, b.line_desc), - sortOrder: - state.sortedInfo.columnKey === "line_desc" && state.sortedInfo.order, - ellipsis: true, - editable: true, - }, - { - title: t("joblines.fields.oem_partno"), - dataIndex: "oem_partno", - key: "oem_partno", - sorter: (a, b) => - alphaSort( - a.oem_partno ? a.oem_partno : a.op_code_desc, - b.oem_partno ? b.oem_partno : b.op_code_desc - ), - sortOrder: - state.sortedInfo.columnKey === "oem_partno" && state.sortedInfo.order, - ellipsis: true, - editable: true, - - render: (text, record) => ( - - {record.oem_partno ? record.oem_partno : record.op_code_desc} - - ), - }, - { - title: t("joblines.fields.part_type"), - dataIndex: "part_type", - key: "part_type", - sorter: (a, b) => alphaSort(a.part_type, b.part_type), - sortOrder: - state.sortedInfo.columnKey === "part_type" && state.sortedInfo.order, - ellipsis: true, - editable: true, + state.sortedInfo.columnKey === "line_no" && state.sortedInfo.order, }, { title: t("joblines.fields.line_ind"), @@ -94,6 +56,72 @@ export function JobLinesComponent({ sortOrder: state.sortedInfo.columnKey === "line_ind" && state.sortedInfo.order, }, + { + title: t("joblines.fields.line_desc"), + dataIndex: "line_desc", + key: "line_desc", + sorter: (a, b) => alphaSort(a.line_desc, b.line_desc), + sortOrder: + state.sortedInfo.columnKey === "line_desc" && state.sortedInfo.order, + ellipsis: true, + }, + { + title: t("joblines.fields.oem_partno"), + dataIndex: "oem_partno", + key: "oem_partno", + sorter: (a, b) => alphaSort(a.oem_partno, b.oem_partno), + sortOrder: + state.sortedInfo.columnKey === "oem_partno" && state.sortedInfo.order, + ellipsis: true, + render: (text, record) => record.oem_partno, + }, + { + title: t("joblines.fields.op_code_desc"), + dataIndex: "op_code_desc", + key: "op_code_desc", + sorter: (a, b) => alphaSort(a.op_code_desc, b.op_code_desc), + sortOrder: + state.sortedInfo.columnKey === "op_code_desc" && state.sortedInfo.order, + ellipsis: true, + render: (text, record) => record.op_code_desc, + }, + { + title: t("joblines.fields.part_type"), + dataIndex: "part_type", + key: "part_type", + filteredValue: state.filteredInfo.part_type || null, + sorter: (a, b) => alphaSort(a.part_type, b.part_type), + sortOrder: + state.sortedInfo.columnKey === "part_type" && state.sortedInfo.order, + filters: [ + { + text: t("jobs.labels.partsfilter"), + value: ["PAN", "PAL", "PAA", "PAS", "PASL"], + }, + { + text: t("joblines.fields.part_types.PAN"), + value: ["PAN"], + }, + { + text: t("joblines.fields.part_types.PAL"), + value: ["PAL"], + }, + { + text: t("joblines.fields.part_types.PAA"), + value: ["PAA"], + }, + { + text: t("joblines.fields.part_types.PAS"), + value: ["PAS", "PASL"], + }, + ], + onFilter: (value, record) => value.includes(record.part_type), + render: (text, record) => + record.part_type + ? t(`joblines.fields.part_types.${record.part_type}`) + : null, + }, + { title: t("joblines.fields.act_price"), dataIndex: "act_price", @@ -102,7 +130,6 @@ export function JobLinesComponent({ sortOrder: state.sortedInfo.columnKey === "act_price" && state.sortedInfo.order, ellipsis: true, - render: (text, record) => ( {record.act_price} ), @@ -111,7 +138,6 @@ export function JobLinesComponent({ title: t("joblines.fields.part_qty"), dataIndex: "part_qty", key: "part_qty", - ellipsis: true, }, { title: t("joblines.fields.total"), @@ -119,23 +145,48 @@ export function JobLinesComponent({ key: "total", sorter: (a, b) => a.act_price * a.part_qty - b.act_price * b.part_qty, sortOrder: - state.sortedInfo.columnKey === "act_price" && state.sortedInfo.order, + state.sortedInfo.columnKey === "total" && state.sortedInfo.order, ellipsis: true, - render: (text, record) => ( {record.act_price * record.part_qty} ), }, + { + title: t("joblines.fields.mod_lbr_ty"), + dataIndex: "mod_lbr_ty", + key: "mod_lbr_ty", + + sorter: (a, b) => alphaSort(a.mod_lbr_ty, b.mod_lbr_ty), + sortOrder: + state.sortedInfo.columnKey === "mod_lbr_ty" && state.sortedInfo.order, + render: (text, record) => + record.mod_lbr_ty + ? t(`joblines.fields.lbr_types.${record.mod_lbr_ty}`) + : null, + }, { title: t("joblines.fields.mod_lb_hrs"), dataIndex: "mod_lb_hrs", key: "mod_lb_hrs", + sorter: (a, b) => a.mod_lb_hrs - b.mod_lb_hrs, sortOrder: state.sortedInfo.columnKey === "mod_lb_hrs" && state.sortedInfo.order, }, + { + title: t("joblines.fields.notes"), + dataIndex: "notes", + key: "notes", + render: (text, record) => , + }, + { + title: t("joblines.fields.location"), + dataIndex: "location", + key: "location", + render: (text, record) => , + }, { title: t("joblines.fields.status"), dataIndex: "status", @@ -143,49 +194,55 @@ export function JobLinesComponent({ sorter: (a, b) => alphaSort(a.status, b.status), sortOrder: state.sortedInfo.columnKey === "status" && state.sortedInfo.order, + filters: + (jobLines && + jobLines + .map((l) => l.status) + .filter(onlyUnique) + .map((s) => { + return { + text: s || "No Status*", + value: [s], + }; + })) || + [], + onFilter: (value, record) => value.includes(record.status), }, - { - title: t("allocations.fields.employee"), - dataIndex: "employee", - key: "employee", - - sorter: (a, b) => - alphaSort( - a.allocations[0] && - a.allocations[0].employee.first_name + - a.allocations[0].employee.last_name, - b.allocations[0] && - b.allocations[0].employee.first_name + - b.allocations[0].employee.last_name - ), - sortOrder: - state.sortedInfo.columnKey === "employee" && state.sortedInfo.order, - render: (text, record) => ( - - {record.allocations && record.allocations.length > 0 - ? record.allocations.map((item) => ( - - )) - : null} - - - ), - }, + // { + // title: t("allocations.fields.employee"), + // dataIndex: "employee", + // key: "employee", + // sorter: (a, b) => + // alphaSort( + // a.allocations[0] && + // a.allocations[0].employee.first_name + + // a.allocations[0].employee.last_name, + // b.allocations[0] && + // b.allocations[0].employee.first_name + + // b.allocations[0].employee.last_name + // ), + // sortOrder: + // state.sortedInfo.columnKey === "employee" && state.sortedInfo.order, + // render: (text, record) => ( + // + // {record.allocations && record.allocations.length > 0 + // ? record.allocations.map((item) => ( + // + // )) + // : null} + // + // ), + // }, { title: t("general.labels.actions"), dataIndex: "actions", key: "actions", render: (text, record) => ( - +
- + { + // + } +
), }, ]; const handleTableChange = (pagination, filters, sorter) => { + console.log("filters", filters); setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); }; + const handleMark = (e) => { + setSelectedLines([ + ...selectedLines, + ...jobLines.filter((item) => item.part_type === e.key), + ]); + }; + + const markMenu = ( + + {t("joblines.fields.part_types.PAA")} + {t("joblines.fields.part_types.PAN")} + {t("joblines.fields.part_types.PAL")} + {t("joblines.fields.part_types.PAS")} + + ); + console.log("state", state); return (
{ return ( -
- { - e.preventDefault(); - setSearchText(e.target.value); - }} - /> +
+ - + + + + + { + // + } +
+ { + e.preventDefault(); + setSearchText(e.target.value); + }} + /> +
); }} - loading={loading} - size="small" expandedRowRender={(record) => ( -
+
{t("parts_orders.labels.orderhistory")} {record.parts_order_lines.map((item) => (
- {`${item.parts_order.order_number || ""} from `} + + {item.parts_order.order_number || ""} + + - {item.parts_order.vendor.name || ""} @@ -266,19 +384,15 @@ export function JobLinesComponent({ ))}
)} - pagination={{ position: "top", defaultPageSize: 25 }} + rowClassName="table-small-margin" rowSelection={{ - // selectedRowKeys: selectedLines, + selectedRowKeys: selectedLines.map((item) => item.id), onSelectAll: (selected, selectedRows, changeRows) => { setSelectedLines(selectedRows); }, onSelect: (record, selected, selectedRows, nativeEvent) => setSelectedLines(selectedRows), }} - columns={columns.map((item) => ({ ...item }))} - rowKey="id" - dataSource={jobLines} - onChange={handleTableChange} />
); diff --git a/client/src/components/job-detail-lines/job-lines.container.jsx b/client/src/components/job-detail-lines/job-lines.container.jsx index 2988929cc..bc1f10d42 100644 --- a/client/src/components/job-detail-lines/job-lines.container.jsx +++ b/client/src/components/job-detail-lines/job-lines.container.jsx @@ -1,70 +1,59 @@ import { useQuery } from "@apollo/react-hooks"; import React, { useState } from "react"; - import { GET_JOB_LINES_BY_PK } from "../../graphql/jobs-lines.queries"; import AlertComponent from "../alert/alert.component"; import JobLinesComponent from "./job-lines.component"; -import { connect } from "react-redux"; -import { setModalContext } from "../../redux/modals/modals.actions"; -const mapDispatchToProps = dispatch => ({ - setJobLineEditContext: context => - dispatch(setModalContext({ context: context, modal: "jobLineEdit" })) -}); - -export function JobLinesContainer({ jobId, setJobLineEditContext }) { +function JobLinesContainer({ jobId }) { const { loading, error, data, refetch } = useQuery(GET_JOB_LINES_BY_PK, { variables: { id: jobId }, - fetchPolicy: "network-only" }); const [searchText, setSearchText] = useState(""); const [selectedLines, setSelectedLines] = useState([]); - if (error) return ; + if (error) return ; + + const jobLines = + data && data.joblines + ? searchText + ? data.joblines.filter( + (jl) => + (jl.unq_seq || "") + .toString() + .toLowerCase() + .includes(searchText.toLowerCase()) || + (jl.line_desc || "") + .toLowerCase() + .includes(searchText.toLowerCase()) || + (jl.part_type || "") + .toLowerCase() + .includes(searchText.toLowerCase()) || + (jl.oem_partno || "") + .toLowerCase() + .includes(searchText.toLowerCase()) || + (jl.op_code_desc || "") + .toLowerCase() + .includes(searchText.toLowerCase()) || + (jl.db_price || "") + .toString() + .includes(searchText.toLowerCase()) || + (jl.act_price || "").toString().includes(searchText.toLowerCase()) + ) + : data.joblines + : null; return ( - (jl.unq_seq || "") - .toString() - .toLowerCase() - .includes(searchText.toLowerCase()) || - (jl.line_desc || "") - .toLowerCase() - .includes(searchText.toLowerCase()) || - (jl.part_type || "") - .toLowerCase() - .includes(searchText.toLowerCase()) || - (jl.oem_partno || "") - .toLowerCase() - .includes(searchText.toLowerCase()) || - (jl.op_code_desc || "") - .toLowerCase() - .includes(searchText.toLowerCase()) || - (jl.db_price || "") - .toString() - .includes(searchText.toLowerCase()) || - (jl.act_price || "") - .toString() - .includes(searchText.toLowerCase()) - ) - : data.joblines - : null - } + jobLines={jobLines} setSearchText={setSearchText} selectedLines={selectedLines} setSelectedLines={setSelectedLines} jobId={jobId} - setJobLineEditContext={setJobLineEditContext} /> ); } -export default connect(null, mapDispatchToProps)(JobLinesContainer); +export default JobLinesContainer; diff --git a/client/src/components/job-employee-assignments/job-employee-assignments.component.jsx b/client/src/components/job-employee-assignments/job-employee-assignments.component.jsx new file mode 100644 index 000000000..f28801ff7 --- /dev/null +++ b/client/src/components/job-employee-assignments/job-employee-assignments.component.jsx @@ -0,0 +1,133 @@ +import React, { useState } from "react"; +import DataLabel from "../data-label/data-label.component"; +import { useTranslation } from "react-i18next"; +import { PlusCircleFilled, MinusOutlined } from "@ant-design/icons"; +import { Select, Button, Popover } from "antd"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, +}); +const mapDispatchToProps = (dispatch) => ({ + //setUserLanguage: language => dispatch(setUserLanguage(language)) +}); + +export function JobEmployeeAssignments({ + bodyshop, + body, + refinish, + prep, + handleAdd, + handleRemove, +}) { + const { t } = useTranslation(); + const [assignment, setAssignment] = useState({ + operation: null, + employeeid: null, + }); + const [visibility, setVisibility] = useState(false); + + const onChange = (e) => { + setAssignment({ ...assignment, employeeid: e }); + }; + + const popContent = ( +
+ + + +
+ ); + + return ( +
+ + + {body ? ( +
+ {`${body.first_name || ""} ${body.last_name || ""}`} + handleRemove("body")} + /> +
+ ) : ( + { + setAssignment({ operation: "body" }); + setVisibility(true); + }} + /> + )} +
+ + {prep ? ( +
+ {`${prep.first_name || ""} ${prep.last_name || ""}`} + handleRemove("prep")} + /> +
+ ) : ( + { + setAssignment({ operation: "prep" }); + setVisibility(true); + }} + /> + )} +
+ + {refinish ? ( +
+ {`${refinish.first_name || ""} ${ + refinish.last_name || "" + }`} + handleRemove("refinish")} + /> +
+ ) : ( + { + setAssignment({ operation: "refinish" }); + setVisibility(true); + }} + /> + )} +
+
+
+ ); +} +export default connect( + mapStateToProps, + mapDispatchToProps +)(JobEmployeeAssignments); diff --git a/client/src/components/job-employee-assignments/job-employee-assignments.container.jsx b/client/src/components/job-employee-assignments/job-employee-assignments.container.jsx new file mode 100644 index 000000000..a5922d59e --- /dev/null +++ b/client/src/components/job-employee-assignments/job-employee-assignments.container.jsx @@ -0,0 +1,77 @@ +import { useMutation } from "@apollo/react-hooks"; +import { notification } from "antd"; +import React from "react"; +import { useTranslation } from "react-i18next"; +import { UPDATE_JOB } from "../../graphql/jobs.queries"; +import JobEmployeeAssignmentsComponent from "./job-employee-assignments.component"; +import { logImEXEvent } from "../../firebase/firebase.utils"; + +export default function JobEmployeeAssignmentsContainer({ job }) { + const { t } = useTranslation(); + const [updateJob] = useMutation(UPDATE_JOB); + + const handleAdd = async (assignment) => { + const { operation, employeeid } = assignment; + logImEXEvent("job_assign_employee", { operation }); + + let empAssignment = determineFieldName(operation); + + const result = await updateJob({ + variables: { jobId: job.id, job: { [empAssignment]: employeeid } }, + refetchQueries: ["GET_JOB_BY_PK"], + awaitRefetchQueries: true, + }); + + if (!!result.errors) { + notification["error"]({ + message: t("jobs.errors.assigning", { + message: JSON.stringify(result.errors), + }), + }); + } + }; + const handleRemove = async (operation) => { + logImEXEvent("job_unassign_employee", { operation }); + + let empAssignment = determineFieldName(operation); + const result = await updateJob({ + variables: { jobId: job.id, job: { [empAssignment]: null } }, + refetchQueries: ["GET_JOB_BY_PK"], + awaitRefetchQueries: true, + }); + + if (!!result.errors) { + notification["error"]({ + message: t("jobs.errors.assigning", { + message: JSON.stringify(result.errors), + }), + }); + } + }; + + return ( +
+ +
+ ); +} + +const determineFieldName = (operation) => { + switch (operation) { + case "body": + return "employee_body"; + case "prep": + return "employee_prep"; + case "refinish": + return "employee_refinish"; + + default: + return null; + } +}; diff --git a/client/src/components/job-intake/components/job-intake-form/job-intake-form.component.jsx b/client/src/components/job-intake/components/job-intake-form/job-intake-form.component.jsx new file mode 100644 index 000000000..0f404c3b1 --- /dev/null +++ b/client/src/components/job-intake/components/job-intake-form/job-intake-form.component.jsx @@ -0,0 +1,122 @@ +import { useMutation } from "@apollo/react-hooks"; +import { Button, Form, notification, Switch } from "antd"; +import queryString from "query-string"; +import React, { useState } from "react"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { useHistory, useLocation, useParams } from "react-router-dom"; +import { createStructuredSelector } from "reselect"; +import { MARK_LATEST_APPOINTMENT_AS_ARRIVED } from "../../../../graphql/appointments.queries"; +import { UPDATE_JOB } from "../../../../graphql/jobs.queries"; +import { selectBodyshop } from "../../../../redux/user/user.selectors"; +import DateTimePicker from "../../../form-date-time-picker/form-date-time-picker.component"; +import ConfigFormComponents from "../../../config-form-components/config-form-components.component"; +import { logImEXEvent } from "../../../../firebase/firebase.utils"; + +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, +}); +const mapDispatchToProps = (dispatch) => ({ + //setUserLanguage: language => dispatch(setUserLanguage(language)) +}); + +export function JobIntakeForm({ formItems, bodyshop }) { + const { t } = useTranslation(); + const [intakeJob] = useMutation(UPDATE_JOB); + const [loading, setLoading] = useState(false); + const [markAptArrived] = useMutation(MARK_LATEST_APPOINTMENT_AS_ARRIVED); + const { jobId } = useParams(); + const history = useHistory(); + const search = queryString.parse(useLocation().search); + + const handleFinish = async (values) => { + console.log("values", values); + setLoading(true); + logImEXEvent("job_complete_intake"); + + const result = await intakeJob({ + variables: { + jobId: jobId, + job: { + inproduction: values.addToProduction || false, + status: bodyshop.md_ro_statuses.default_arrived || "Arrived*", + actual_in: new Date(), + scheduled_completion: values.scheduledCompletion, + intakechecklist: values, + scheduled_delivery: values.scheduledDelivery, + }, + }, + }); + if (!!search.appointmentId) { + const appUpdate = await markAptArrived({ + variables: { appointmentId: search.appointmentId }, + }); + + if (!!appUpdate.errors) { + notification["error"]({ + message: t("intake.errors.intake", { + error: JSON.stringify(result.errors), + }), + }); + } + } + + if (!!!result.errors) { + notification["success"]({ message: t("intake.successes.intake") }); + history.push(`/manage/jobs/${jobId}`); + } else { + notification["error"]({ + message: t("intake.errors.intake", { + error: JSON.stringify(result.errors), + }), + }); + } + console.log("handleFinish -> result", result); + setLoading(false); + }; + + const [form] = Form.useForm(); + + return ( +
+ {t("intake.labels.checklist")} + + + + + + + + + + + + + + + ); +} + +export default connect(mapStateToProps, mapDispatchToProps)(JobIntakeForm); diff --git a/client/src/components/job-intake/components/job-intake-template-item/job-intake-template-item.component.jsx b/client/src/components/job-intake/components/job-intake-template-item/job-intake-template-item.component.jsx new file mode 100644 index 000000000..d5069c7ec --- /dev/null +++ b/client/src/components/job-intake/components/job-intake-template-item/job-intake-template-item.component.jsx @@ -0,0 +1,10 @@ +import React from "react"; +import { PrinterFilled } from "@ant-design/icons"; +export default function JobIntakeTemplateItem({ templateKey, renderTemplate }) { + return ( +
+ {templateKey} + renderTemplate(templateKey)} /> +
+ ); +} diff --git a/client/src/components/job-intake/components/job-intake-template-list/job-intake-template-list.component.jsx b/client/src/components/job-intake/components/job-intake-template-list/job-intake-template-list.component.jsx new file mode 100644 index 000000000..722367e89 --- /dev/null +++ b/client/src/components/job-intake/components/job-intake-template-list/job-intake-template-list.component.jsx @@ -0,0 +1,64 @@ +import React from "react"; +import JobIntakeTemplateItem from "../job-intake-template-item/job-intake-template-item.component"; +import { useParams } from "react-router-dom"; +import RenderTemplate, { + displayTemplateInWindow, +} from "../../../../utils/RenderTemplate"; +import { Button } from "antd"; +import { selectBodyshop } from "../../../../redux/user/user.selectors"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { useTranslation } from "react-i18next"; +import { logImEXEvent } from "../../../../firebase/firebase.utils"; + +const mapStateToProps = createStructuredSelector({ + //currentUser: selectCurrentUser + bodyshop: selectBodyshop, +}); +const mapDispatchToProps = (dispatch) => ({ + //setUserLanguage: language => dispatch(setUserLanguage(language)) +}); + +export function JobIntakeTemplateList({ bodyshop, templates }) { + const { jobId } = useParams(); + const { t } = useTranslation(); + //TODO SHould this be using the generic one? + const renderTemplate = async (templateKey) => { + logImEXEvent("job_intake_template_render"); + + const html = await RenderTemplate( + { + name: templateKey, + variables: { id: jobId }, + }, + bodyshop + ); + displayTemplateInWindow(html); + }; + + const renderAllTemplates = () => { + logImEXEvent("job_intake_render_all_templates"); + + templates.forEach((template) => renderTemplate(template)); + }; + + return ( +
+ {t("intake.labels.printpack")} + + {templates.map((template) => ( + + ))} +
+ ); +} +export default connect( + mapStateToProps, + mapDispatchToProps +)(JobIntakeTemplateList); diff --git a/client/src/components/job-intake/job-intake.component.jsx b/client/src/components/job-intake/job-intake.component.jsx new file mode 100644 index 000000000..79108fffe --- /dev/null +++ b/client/src/components/job-intake/job-intake.component.jsx @@ -0,0 +1,18 @@ +import React from "react"; +import JobIntakeTemplateList from "./components/job-intake-template-list/job-intake-template-list.component"; +import JobIntakeForm from "./components/job-intake-form/job-intake-form.component"; +import { Row, Col } from "antd"; +export default function JobIntakeComponent({ intakeChecklistConfig }) { + const { form, templates } = intakeChecklistConfig; + + return ( + +
+ + + + + + + ); +} diff --git a/client/src/components/job-invoices-total/job-invoices-total.component.jsx b/client/src/components/job-invoices-total/job-invoices-total.component.jsx new file mode 100644 index 000000000..d50a4411c --- /dev/null +++ b/client/src/components/job-invoices-total/job-invoices-total.component.jsx @@ -0,0 +1,58 @@ +import { Statistic } from "antd"; +import Dinero from "dinero.js"; +import React from "react"; +import { useTranslation } from "react-i18next"; +import AlertComponent from "../alert/alert.component"; +import LoadingSkeleton from "../loading-skeleton/loading-skeleton.component"; +import "./job-invoices-total.styles.scss"; + +export default function JobInvoiceTotals({ loading, invoices, jobTotals }) { + const { t } = useTranslation(); + + if (loading) return ; + if (!!!jobTotals) + return ( + + ); + + const totals = JSON.parse(jobTotals); + + let invoiceTotals = Dinero({ amount: 0 }); + invoices.forEach((i) => + i.invoicelines.forEach((il) => { + invoiceTotals = invoiceTotals.add( + Dinero({ + amount: Math.round( + (il.actual_cost || 0) * (i.is_credit_memo ? -1 : 1) * 100 + ), + }).multiply(il.quantity) + ); + }) + ); + + const discrepancy = Dinero(totals.parts.parts.total).subtract(invoiceTotals); + + return ( +
+ + + + +
+ ); +} diff --git a/client/src/components/job-invoices-total/job-invoices-total.styles.scss b/client/src/components/job-invoices-total/job-invoices-total.styles.scss new file mode 100644 index 000000000..d777e83da --- /dev/null +++ b/client/src/components/job-invoices-total/job-invoices-total.styles.scss @@ -0,0 +1,7 @@ +.job-invoices-totals-container { + margin: 0rem 2rem; + display: flex; + flex-direction: column; + justify-content: space-evenly; + flex-wrap: wrap; +} diff --git a/client/src/components/job-line-location-popup/job-line-location-popup.component.jsx b/client/src/components/job-line-location-popup/job-line-location-popup.component.jsx new file mode 100644 index 000000000..e4ac65140 --- /dev/null +++ b/client/src/components/job-line-location-popup/job-line-location-popup.component.jsx @@ -0,0 +1,85 @@ +import { notification, Select } from "antd"; +import React, { useEffect, useState } from "react"; +import { useMutation } from "react-apollo"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { UPDATE_JOB_LINE } from "../../graphql/jobs-lines.queries"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +import LoadingSpinner from "../loading-spinner/loading-spinner.component"; + +const mapStateToProps = createStructuredSelector({ + //currentUser: selectCurrentUser + bodyshop: selectBodyshop, +}); +const mapDispatchToProps = (dispatch) => ({ + //setUserLanguage: language => dispatch(setUserLanguage(language)) +}); + +export function JobLineLocationPopup({ bodyshop, jobline }) { + const [editing, setEditing] = useState(false); + const [loading, setLoading] = useState(false); + const [location, setLocation] = useState(jobline.location); + const [updateJob] = useMutation(UPDATE_JOB_LINE); + const { t } = useTranslation(); + + useEffect(() => { + if (editing) setLocation(jobline.location); + }, [editing, jobline.location]); + + const handleChange = (e) => { + setLocation(e); + }; + + const handleSave = async (e) => { + setLoading(true); + const result = await updateJob({ + variables: { lineId: jobline.id, line: { location: location || "" } }, + }); + + if (!!!result.errors) { + notification["success"]({ message: t("joblines.successes.saved") }); + } else { + notification["error"]({ + message: t("joblines.errors.saving", { + error: JSON.stringify(result.errors), + }), + }); + } + setLoading(false); + setEditing(false); + }; + + if (editing) + return ( +
+ + + +
+ ); + return ( +
setEditing(true)} + > + {jobline.location} +
+ ); +} +export default connect( + mapStateToProps, + mapDispatchToProps +)(JobLineLocationPopup); diff --git a/client/src/components/job-line-note-popup/job-line-note-popup.component.jsx b/client/src/components/job-line-note-popup/job-line-note-popup.component.jsx new file mode 100644 index 000000000..9af48be12 --- /dev/null +++ b/client/src/components/job-line-note-popup/job-line-note-popup.component.jsx @@ -0,0 +1,65 @@ +import React, { useState, useEffect } from "react"; +import { Input, notification } from "antd"; +import LoadingSpinner from "../loading-spinner/loading-spinner.component"; +import { useMutation } from "react-apollo"; +import { UPDATE_JOB_LINE } from "../../graphql/jobs-lines.queries"; +import { useTranslation } from "react-i18next"; + +export default function JobLineNotePopup({ jobline }) { + const [editing, setEditing] = useState(false); + const [loading, setLoading] = useState(false); + const [note, setNote] = useState(jobline.note); + const [updateJob] = useMutation(UPDATE_JOB_LINE); + const { t } = useTranslation(); + + useEffect(() => { + if (editing) setNote(jobline.notes); + }, [editing, jobline.notes]); + + const handleChange = (e) => { + e.stopPropagation(); + setNote(e.currentTarget.value); + }; + + const handleSave = async (e) => { + e.stopPropagation(); + setLoading(true); + const result = await updateJob({ + variables: { lineId: jobline.id, line: { notes: note || "" } }, + }); + + if (!!!result.errors) { + notification["success"]({ message: t("joblines.successes.saved") }); + } else { + notification["error"]({ + message: t("joblines.errors.saving", { + error: JSON.stringify(result.errors), + }), + }); + } + setLoading(false); + setEditing(false); + }; + + if (editing) + return ( +
+ : null} + value={note} + onChange={handleChange} + onPressEnter={handleSave} + onBlur={handleSave} + /> +
+ ); + return ( +
setEditing(true)} + > + {jobline.notes} +
+ ); +} diff --git a/client/src/components/job-lines-upsert-modal/job-lines-upsert-modal.component.jsx b/client/src/components/job-lines-upsert-modal/job-lines-upsert-modal.component.jsx index 338d5d8bf..f73f18596 100644 --- a/client/src/components/job-lines-upsert-modal/job-lines-upsert-modal.component.jsx +++ b/client/src/components/job-lines-upsert-modal/job-lines-upsert-modal.component.jsx @@ -1,13 +1,15 @@ -import { Form, Input, Modal } from "antd"; +import { Form, Input, Modal, Select, InputNumber } from "antd"; import React, { useEffect } from "react"; import { useTranslation } from "react-i18next"; import InputCurrency from "../form-items-formatted/currency-form-item.component"; +import LayoutFormRow from "../layout-form-row/layout-form-row.component"; export default function JobLinesUpsertModalComponent({ visible, jobLine, handleCancel, - handleFinish + handleFinish, + loading, }) { const { t } = useTranslation(); const [form] = Form.useForm(); @@ -20,6 +22,7 @@ export default function JobLinesUpsertModalComponent({
@@ -30,43 +33,112 @@ export default function JobLinesUpsertModalComponent({ : t("joblines.labels.new") } visible={visible} + width="60%" okText={t("general.actions.save")} onOk={() => form.submit()} + okButtonProps={{ loading: loading }} onCancel={handleCancel} > - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ({ + validator(rule, value) { + if (!value || getFieldValue("part_type") !== "PAE") { + return Promise.resolve(); + } + return Promise.reject( + t("joblines.validations.zeropriceexistingpart") + ); + }, + }), + ]} + > + + + ); diff --git a/client/src/components/job-lines-upsert-modal/job-lines-upsert-modal.container.jsx b/client/src/components/job-lines-upsert-modal/job-lines-upsert-modal.container.jsx index e3e47a6b2..8db6c5182 100644 --- a/client/src/components/job-lines-upsert-modal/job-lines-upsert-modal.container.jsx +++ b/client/src/components/job-lines-upsert-modal/job-lines-upsert-modal.container.jsx @@ -1,73 +1,78 @@ import { notification } from "antd"; -import React from "react"; +import React, { useState } from "react"; import { useMutation } from "@apollo/react-hooks"; import { useTranslation } from "react-i18next"; import { connect } from "react-redux"; import { createStructuredSelector } from "reselect"; -import { INSERT_NEW_JOB_LINE, UPDATE_JOB_LINE } from "../../graphql/jobs-lines.queries"; +import { + INSERT_NEW_JOB_LINE, + UPDATE_JOB_LINE, +} from "../../graphql/jobs-lines.queries"; import { toggleModalVisible } from "../../redux/modals/modals.actions"; import { selectJobLineEditModal } from "../../redux/modals/modals.selectors"; import JobLinesUpdsertModal from "./job-lines-upsert-modal.component"; const mapStateToProps = createStructuredSelector({ - jobLineEditModal: selectJobLineEditModal + jobLineEditModal: selectJobLineEditModal, }); -const mapDispatchToProps = dispatch => ({ - toggleModalVisible: () => dispatch(toggleModalVisible("jobLineEdit")) +const mapDispatchToProps = (dispatch) => ({ + toggleModalVisible: () => dispatch(toggleModalVisible("jobLineEdit")), }); function JobLinesUpsertModalContainer({ jobLineEditModal, - toggleModalVisible + toggleModalVisible, }) { const { t } = useTranslation(); const [insertJobLine] = useMutation(INSERT_NEW_JOB_LINE); const [updateJobLine] = useMutation(UPDATE_JOB_LINE); - - const handleFinish = values => { + const [loading, setLoading] = useState(false); + const handleFinish = (values) => { + setLoading(true); if (!jobLineEditModal.context.id) { insertJobLine({ variables: { - lineInput: [{ jobid: jobLineEditModal.context.jobid, ...values }] - } + lineInput: [{ jobid: jobLineEditModal.context.jobid, ...values }], + }, }) - .then(r => { + .then((r) => { if (jobLineEditModal.actions.refetch) jobLineEditModal.actions.refetch(); toggleModalVisible(); notification["success"]({ - message: t("joblines.successes.created") + message: t("joblines.successes.created"), }); }) - .catch(error => { + .catch((error) => { notification["error"]({ message: t("joblines.errors.creating", { - message: error.message - }) + message: error.message, + }), }); }); } else { updateJobLine({ variables: { lineId: jobLineEditModal.context.id, - line: values - } + line: values, + }, }) - .then(r => { + .then((r) => { notification["success"]({ - message: t("joblines.successes.updated") + message: t("joblines.successes.updated"), }); }) - .catch(error => { + .catch((error) => { notification["success"]({ message: t("joblines.errors.updating", { - message: error.message - }) + message: error.message, + }), }); }); if (jobLineEditModal.actions.refetch) jobLineEditModal.actions.refetch(); toggleModalVisible(); } + setLoading(false); }; const handleCancel = () => { @@ -80,6 +85,7 @@ function JobLinesUpsertModalContainer({ jobLine={jobLineEditModal.context} handleFinish={handleFinish} handleCancel={handleCancel} + loading={loading} /> ); } diff --git a/client/src/components/job-reconciliation-invoices-table/job-reconciliation-invoices-table.component.jsx b/client/src/components/job-reconciliation-invoices-table/job-reconciliation-invoices-table.component.jsx new file mode 100644 index 000000000..21b4085de --- /dev/null +++ b/client/src/components/job-reconciliation-invoices-table/job-reconciliation-invoices-table.component.jsx @@ -0,0 +1,113 @@ +import { Checkbox, Statistic, Table } from "antd"; +import Dinero from "dinero.js"; +import React, { useState } from "react"; +import { useTranslation } from "react-i18next"; +import CurrencyFormatter from "../../utils/CurrencyFormatter"; +import { alphaSort } from "../../utils/sorters"; + +export default function JobReconciliationInvoiceTable({ + invoiceLineState, + invoiceLineData, +}) { + const { t } = useTranslation(); + + const [state, setState] = useState({ + sortedInfo: {}, + }); + + const [selectedLines, setSelectedLines] = invoiceLineState; + const [total, setTotal] = useState(Dinero({ amount: 0 }).toFormat()); + + const columns = [ + { + title: t("invoicelines.fields.line_desc"), + dataIndex: "line_desc", + key: "line_desc", + sorter: (a, b) => alphaSort(a.line_desc, b.line_desc), + sortOrder: + state.sortedInfo.columnKey === "line_desc" && state.sortedInfo.order, + }, + { + title: t("invoicelines.fields.retail"), + dataIndex: "actual_price", + key: "actual_price", + sorter: (a, b) => a.actual_price - b.actual_price, + sortOrder: + state.sortedInfo.columnKey === "actual_price" && state.sortedInfo.order, + render: (text, record) => ( + {record.actual_price} + ), + }, + { + title: t("invoicelines.fields.actual_cost"), + dataIndex: "actual_cost", + key: "actual_cost", + sorter: (a, b) => a.actual_cost - b.actual_cost, + sortOrder: + state.sortedInfo.columnKey === "actual_cost" && state.sortedInfo.order, + render: (text, record) => ( + {record.actual_cost} + ), + }, + { + title: t("invoicelines.fields.quantity"), + dataIndex: "quantity", + key: "quantity", + sorter: (a, b) => a.quantity - b.quantity, + sortOrder: + state.sortedInfo.columnKey === "quantity" && state.sortedInfo.order, + }, + { + title: t("invoices.fields.is_credit_memo"), + dataIndex: "is_credit_memo", + key: "is_credit_memo", + sorter: (a, b) => a.is_credit_memo - b.is_credit_memo, + sortOrder: + state.sortedInfo.columnKey === "is_credit_memo" && + state.sortedInfo.order, + render: (text, record) => , + }, + ]; + + const handleTableChange = (pagination, filters, sorter) => { + setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); + }; + const handleOnRowClick = (selectedRecordKeys, selectedRecords) => { + setSelectedLines(selectedRecordKeys); + calculateTotal(selectedRecords); + }; + + const calculateTotal = (selectedRecords) => { + let total = Dinero({ amount: 0 }); + selectedRecords.forEach( + (record) => + (total = total.add( + Dinero({ + amount: + record.actual_price * 100 * (record.is_credit_memo ? -1 : 1), + }).multiply(record.quantity) + )) + ); + + setTotal(total.toFormat()); + }; + + return ( +
+
} + pagination={{ position: "top", defaultPageSize: 25 }} + columns={columns} + rowKey='id' + dataSource={invoiceLineData} + onChange={handleTableChange} + rowSelection={{ + onChange: handleOnRowClick, + selectedRowKeys: selectedLines, + }} + /> + + + ); +} diff --git a/client/src/components/job-reconciliation-modal/job-reconciliation-modal.component.jsx b/client/src/components/job-reconciliation-modal/job-reconciliation-modal.component.jsx new file mode 100644 index 000000000..36cb1dd21 --- /dev/null +++ b/client/src/components/job-reconciliation-modal/job-reconciliation-modal.component.jsx @@ -0,0 +1,44 @@ +import { Col, Row } from "antd"; +import React, { useState } from "react"; +import JobReconciliationInvoicesTable from "../job-reconciliation-invoices-table/job-reconciliation-invoices-table.component"; +import JobReconciliationPartsTable from "../job-reconciliation-parts-table/job-reconciliation-parts-table.component"; + +export default function JobReconciliationModalComponent({ job, invoices }) { + const jobLineState = useState([]); + const invoiceLineState = useState([]); + + const invoiceLineData = + invoices + .map((i) => + i.invoicelines.map((il) => { + return { ...il, is_credit_memo: i.is_credit_memo }; + }) + ) + .flat() || []; + + console.log( + "JobReconciliationModalComponent -> invoiceLineData", + invoiceLineData + ); + + const jobLineData = job.joblines.filter((j) => j.part_type !== null); + + return ( +
+ +
+ + + + + + + + ); +} diff --git a/client/src/components/job-reconciliation-modal/job-reconciliation.modal.container.jsx b/client/src/components/job-reconciliation-modal/job-reconciliation.modal.container.jsx new file mode 100644 index 000000000..10227e72d --- /dev/null +++ b/client/src/components/job-reconciliation-modal/job-reconciliation.modal.container.jsx @@ -0,0 +1,51 @@ +import { Modal } from "antd"; +import React from "react"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { toggleModalVisible } from "../../redux/modals/modals.actions"; +import { selectReconciliation } from "../../redux/modals/modals.selectors"; +import { selectBodyshop, selectCurrentUser } from "../../redux/user/user.selectors"; +import JobReconciliationModalComponent from "./job-reconciliation-modal.component"; + +const mapStateToProps = createStructuredSelector({ + reconciliationModal: selectReconciliation, + bodyshop: selectBodyshop, + currentUser: selectCurrentUser, +}); +const mapDispatchToProps = (dispatch) => ({ + toggleModalVisible: () => dispatch(toggleModalVisible("reconciliation")), +}); + +function InvoiceEnterModalContainer({ + reconciliationModal, + toggleModalVisible, + bodyshop, + currentUser, +}) { + const { t } = useTranslation(); + const { context, visible } = reconciliationModal; + const { job, invoices } = context; + + const handleCancel = () => { + toggleModalVisible(); + }; + + return ( + + + + ); +} + +export default connect( + mapStateToProps, + mapDispatchToProps +)(InvoiceEnterModalContainer); diff --git a/client/src/components/job-reconciliation-parts-table/job-reconciliation-parts-table.component.jsx b/client/src/components/job-reconciliation-parts-table/job-reconciliation-parts-table.component.jsx new file mode 100644 index 000000000..a37862440 --- /dev/null +++ b/client/src/components/job-reconciliation-parts-table/job-reconciliation-parts-table.component.jsx @@ -0,0 +1,157 @@ +import { Statistic, Table } from "antd"; +import Dinero from "dinero.js"; +import React, { useState } from "react"; +import { useTranslation } from "react-i18next"; +import CurrencyFormatter from "../../utils/CurrencyFormatter"; +import { alphaSort } from "../../utils/sorters"; + +export default function JobReconcilitionPartsTable({ + jobLineState, + jobLineData, +}) { + const { t } = useTranslation(); + + const [state, setState] = useState({ + sortedInfo: {}, + }); + + const [selectedLines, setSelectedLines] = jobLineState; + const [total, setTotal] = useState(Dinero({ amount: 0 }).toFormat()); + + const columns = [ + // { + // title: t("joblines.fields.line_no"), + // dataIndex: "line_no", + // key: "line_no", + // sorter: (a, b) => a.line_no - b.line_no, + // sortOrder: + // state.sortedInfo.columnKey === "line_no" && state.sortedInfo.order, + // //ellipsis: true, + // editable: true, + // width: 75, + // }, + { + title: t("joblines.fields.line_desc"), + dataIndex: "line_desc", + key: "line_desc", + sorter: (a, b) => alphaSort(a.line_desc, b.line_desc), + sortOrder: + state.sortedInfo.columnKey === "line_desc" && state.sortedInfo.order, + }, + { + title: t("joblines.fields.oem_partno"), + dataIndex: "oem_partno", + key: "oem_partno", + sorter: (a, b) => + alphaSort( + a.oem_partno ? a.oem_partno : a.op_code_desc, + b.oem_partno ? b.oem_partno : b.op_code_desc + ), + sortOrder: + state.sortedInfo.columnKey === "oem_partno" && state.sortedInfo.order, + + render: (text, record) => ( + + {record.oem_partno ? record.oem_partno : record.op_code_desc} + + ), + }, + { + title: t("joblines.fields.part_type"), + dataIndex: "part_type", + key: "part_type", + sorter: (a, b) => alphaSort(a.part_type, b.part_type), + sortOrder: + state.sortedInfo.columnKey === "part_type" && state.sortedInfo.order, + }, + { + title: t("joblines.fields.act_price"), + dataIndex: "act_price", + key: "act_price", + sorter: (a, b) => a.act_price - b.act_price, + sortOrder: + state.sortedInfo.columnKey === "act_price" && state.sortedInfo.order, + + render: (text, record) => ( + {record.act_price} + ), + }, + { + title: t("joblines.fields.part_qty"), + dataIndex: "part_qty", + key: "part_qty", + }, + { + title: t("joblines.fields.total"), + dataIndex: "total", + key: "total", + sorter: (a, b) => a.act_price * a.part_qty - b.act_price * b.part_qty, + sortOrder: + state.sortedInfo.columnKey === "total" && state.sortedInfo.order, + + render: (text, record) => ( + + {record.act_price * record.part_qty} + + ), + }, + { + title: t("joblines.fields.mod_lb_hrs"), + dataIndex: "mod_lb_hrs", + key: "mod_lb_hrs", + sorter: (a, b) => a.mod_lb_hrs - b.mod_lb_hrs, + sortOrder: + state.sortedInfo.columnKey === "mod_lb_hrs" && state.sortedInfo.order, + }, + { + title: t("joblines.fields.status"), + dataIndex: "status", + key: "status", + sorter: (a, b) => alphaSort(a.status, b.status), + sortOrder: + state.sortedInfo.columnKey === "status" && state.sortedInfo.order, + }, + ]; + + const handleTableChange = (pagination, filters, sorter) => { + setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); + }; + const handleOnRowClick = (selectedRecordKeys, selectedRecords) => { + setSelectedLines(selectedRecordKeys); + calculateTotal(selectedRecords); + }; + + const calculateTotal = (selectedRecords) => { + let total = Dinero({ amount: 0 }); + selectedRecords.forEach( + (record) => + (total = total.add( + Dinero({ amount: record.act_price * 100 }).multiply(record.part_qty) + )) + ); + + setTotal(total.toFormat()); + }; + + return ( +
+
( +
+
+ )} + pagination={{ position: "top", defaultPageSize: 25 }} + columns={columns} + rowKey='id' + dataSource={jobLineData} + onChange={handleTableChange} + rowSelection={{ + onChange: handleOnRowClick, + selectedRowKeys: selectedLines, + }} + /> + + + ); +} diff --git a/client/src/components/job-scoreboard-add-button/job-scoreboard-add-button.component.jsx b/client/src/components/job-scoreboard-add-button/job-scoreboard-add-button.component.jsx new file mode 100644 index 000000000..c01cba278 --- /dev/null +++ b/client/src/components/job-scoreboard-add-button/job-scoreboard-add-button.component.jsx @@ -0,0 +1,125 @@ +import { useMutation } from "@apollo/react-hooks"; +import { Button, Card, Form, InputNumber, notification, Popover } from "antd"; +import moment from "moment"; +import React, { useState } from "react"; +import { useTranslation } from "react-i18next"; +import { logImEXEvent } from "../../firebase/firebase.utils"; +import { INSERT_SCOREBOARD_ENTRY } from "../../graphql/scoreboard.queries"; +import FormDatePicker from "../form-date-picker/form-date-picker.component"; + +export default function ScoreboardAddButton({ job, ...otherBtnProps }) { + const { t } = useTranslation(); + const [insertScoreboardEntry] = useMutation(INSERT_SCOREBOARD_ENTRY); + const [loading, setLoading] = useState(false); + const [form] = Form.useForm(); + const [visibility, setVisibility] = useState(false); + + const handleFinish = async (values) => { + logImEXEvent("job_close_add_to_scoreboard"); + + setLoading(true); + const result = await insertScoreboardEntry({ + variables: { sbInput: [{ jobid: job.id, ...values }] }, + }); + + if (!!result.errors) { + notification["error"]({ + message: t("scoreboard.errors.adding", { + message: JSON.stringify(result.errors), + }), + }); + } else { + notification["success"]({ + message: t("scoreboard.successes.added"), + }); + } + setLoading(false); + setVisibility(false); + }; + + const overlay = ( + +
+
+ + + + + + + + + + + + +
+
+ ); + + const handleClick = (e) => { + setLoading(true); + const v = job.joblines.reduce( + (acc, val) => { + if (val.mod_lbr_ty === "LAB") + acc = { ...acc, bodyhrs: acc.bodyhrs + val.mod_lb_hrs }; + if (val.mod_lbr_ty === "LAR") + acc = { ...acc, painthrs: acc.painthrs + val.mod_lb_hrs }; + return acc; + }, + { + bodyhrs: 0, + painthrs: 0, + } + ); + form.setFieldsValue({ + date: new moment(), + bodyhrs: Math.round(v.bodyhrs * 10) / 10, + painthrs: Math.round(v.painthrs * 10) / 10, + }); + setVisibility(true); + setLoading(false); + }; + + return ( + + + + ); +} diff --git a/client/src/components/job-search-select/job-search-select.component.jsx b/client/src/components/job-search-select/job-search-select.component.jsx index a3801f15e..2029c51f5 100644 --- a/client/src/components/job-search-select/job-search-select.component.jsx +++ b/client/src/components/job-search-select/job-search-select.component.jsx @@ -1,40 +1,48 @@ import { Select } from "antd"; -import React, { useEffect, useState } from "react"; +import React, { useEffect, useState, forwardRef } from "react"; const { Option } = Select; //To be used as a form element only. -const JobSearchSelect = ({ value, onChange, options, onBlur }) => { +const JobSearchSelect = ( + { value, onChange, options, onBlur, disabled, loading }, + ref +) => { const [option, setOption] = useState(value); useEffect(() => { - if (onChange) { + if (value !== option && onChange) { onChange(option); } - }, [option, onChange]); + }, [value, option, onChange]); return ( ); }; -export default JobSearchSelect; +export default forwardRef(JobSearchSelect); diff --git a/client/src/components/job-totals-table/job-totals-table.component.jsx b/client/src/components/job-totals-table/job-totals-table.component.jsx index 17e189d6f..37426d850 100644 --- a/client/src/components/job-totals-table/job-totals-table.component.jsx +++ b/client/src/components/job-totals-table/job-totals-table.component.jsx @@ -1,53 +1,220 @@ -import { Col, List, Row } from "antd"; -import React from "react"; -export default function JobsTotalsTableComponent({ totals }) { - //const { t } = useTranslation(); - if (!!!totals) return null; +import { Statistic } from "antd"; +import React, { useEffect, useState } from "react"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +import LoadingSkeleton from "../loading-skeleton/loading-skeleton.component"; +import "./job-totals-table.styles.scss"; +import { CalculateJob } from "./job-totals.utility"; + +const mapStateToProps = createStructuredSelector({ + //currentUser: selectCurrentUser + bodyshop: selectBodyshop, +}); + +export function JobsTotalsTableComponent({ bodyshop, job }) { + const { t } = useTranslation(); + const [totals, setTotals] = useState(null); + + useEffect(() => { + setTotals(CalculateJob(job, bodyshop.shoprates)); + }, [bodyshop, job]); + + if (!!!totals) { + return ; + } return ( - -
- Rates - - {`rate_laa - ${totals.rates.rate_laa.total} (${totals.rates.rate_laa.hours} @ ${totals.rates.rate_laa.rate})`} - {`LAB - ${totals.rates.rate_lab.total} (${totals.rates.rate_lab.hours} @ ${totals.rates.rate_lab.rate})`} - {`rate_lad - ${totals.rates.rate_lad.total} (${totals.rates.rate_lad.hours} @ ${totals.rates.rate_lad.rate})`} - {`rate_lae - ${totals.rates.rate_lae.total} (${totals.rates.rate_lae.hours} @ ${totals.rates.rate_lae.rate})`} - {`rate_laf - ${totals.rates.rate_laf.total} (${totals.rates.rate_laf.hours} @ ${totals.rates.rate_laf.rate})`} - {`rate_lag - ${totals.rates.rate_lag.total} (${totals.rates.rate_lag.hours} @ ${totals.rates.rate_lag.rate})`} - {`rate_lam - ${totals.rates.rate_lam.total} (${totals.rates.rate_lam.hours} @ ${totals.rates.rate_lam.rate})`} - {`rate_lar - ${totals.rates.rate_lar.total} (${totals.rates.rate_lar.hours} @ ${totals.rates.rate_lar.rate})`} - {`rate_las - ${totals.rates.rate_las.total} (${totals.rates.rate_las.hours} @ ${totals.rates.rate_las.rate})`} - {`rate_lau - ${totals.rates.rate_lau.total} (${totals.rates.rate_lau.hours} @ ${totals.rates.rate_lau.rate})`} - {`LA1 - ${totals.rates.rate_la1.total} (${totals.rates.rate_la1.hours} @ ${totals.rates.rate_la1.rate})`} - {`LA2 - ${totals.rates.rate_la2.total} (${totals.rates.rate_la2.hours} @ ${totals.rates.rate_la2.rate})`} - {`LA3 - ${totals.rates.rate_la3.total} (${totals.rates.rate_la3.hours} @ ${totals.rates.rate_la3.rate})`} - {`rate_la4 - ${totals.rates.rate_la4.total} (${totals.rates.rate_la4.hours} @ ${totals.rates.rate_la4.rate})`} - {`paint_mat - ${totals.rates.paint_mat.total} (${totals.rates.paint_mat.hours} @ ${totals.rates.paint_mat.rate})`} - {`shop_mat - ${totals.rates.shop_mat.total} (${totals.rates.shop_mat.hours} @ ${totals.rates.shop_mat.rate})`} - {`rate_atp - ${totals.rates.rate_atp.total} (${totals.rates.rate_atp.hours} @ ${totals.rates.rate_atp.rate})`} - - {`Subtotal: ${totals.rates.subtotal}`} - - - Parts & Sublet - - {`Parts - ${totals.parts.parts.total} (${totals.parts.parts.subtotal} +- ${totals.parts.parts.adjustments})`} - {`Sublet - ${totals.parts.sublets.total} (${totals.parts.sublets.subtotal} +- ${totals.parts.sublets.adjustments})`} - - - - - Totals - - {`Subtotal - ${totals.totals.subtotal}`} - {`GST - ${totals.totals.federal_tax}`} - {`PST - ${totals.totals.state_tax}`} - {`Local - ${totals.totals.local_tax}`} - {`Total Payable - ${totals.totals.total_repairs}`} - {`Net Repairs - ${totals.totals.net_repairs}`} - - - +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{t("jobs.labels.rates")}$
{t("jobs.fields.rate_laa")}{totals.rates.laa.total.toFormat()}{`(${totals.rates.laa.hours.toFixed(2)} @ ${ + totals.rates.laa.rate + })`}
{t("jobs.fields.rate_lab")}{totals.rates.lab.total.toFormat()}{`(${totals.rates.lab.hours.toFixed(2)} @ ${ + totals.rates.lab.rate + })`}
{t("jobs.fields.rate_lad")}{totals.rates.lad.total.toFormat()}{`(${totals.rates.lad.hours.toFixed(2)} @ ${ + totals.rates.lad.rate + })`}
{t("jobs.fields.rate_lae")}{totals.rates.lae.total.toFormat()}{`(${totals.rates.lae.hours.toFixed(2)} @ ${ + totals.rates.lae.rate + })`}
{t("jobs.fields.rate_laf")}{totals.rates.laf.total.toFormat()}{`(${totals.rates.laf.hours.toFixed(2)} @ ${ + totals.rates.laf.rate + })`}
{t("jobs.fields.rate_lag")}{totals.rates.lag.total.toFormat()}{`(${totals.rates.lag.hours.toFixed(2)} @ ${ + totals.rates.lag.rate + })`}
{t("jobs.fields.rate_lam")}{totals.rates.lam.total.toFormat()}{`(${totals.rates.lam.hours.toFixed(2)} @ ${ + totals.rates.lam.rate + })`}
{t("jobs.fields.rate_lar")}{totals.rates.lar.total.toFormat()}{`(${totals.rates.lar.hours.toFixed(2)} @ ${ + totals.rates.lar.rate + })`}
{t("jobs.fields.rate_las")}{totals.rates.las.total.toFormat()}{`(${totals.rates.las.hours.toFixed(2)} @ ${ + totals.rates.las.rate + })`}
{t("jobs.fields.rate_lau")}{totals.rates.lau.total.toFormat()}{`(${totals.rates.lau.hours.toFixed(2)} @ ${ + totals.rates.lau.rate + })`}
{t("jobs.fields.rate_la1")}{totals.rates.la1.total.toFormat()}{`(${totals.rates.la1.hours.toFixed(2)} @ ${ + totals.rates.la1.rate + })`}
{t("jobs.fields.rate_la2")}{totals.rates.la2.total.toFormat()}{`(${totals.rates.la2.hours.toFixed(2)} @ ${ + totals.rates.la2.rate + })`}
{t("jobs.fields.rate_la3")}{totals.rates.la3.total.toFormat()}{`(${totals.rates.la3.hours.toFixed(2)} @ ${ + totals.rates.la3.rate + })`}
{t("jobs.fields.rate_la4")}{totals.rates.la4.total.toFormat()}{`(${totals.rates.la4.hours.toFixed(2)} @ ${ + totals.rates.la4.rate + })`}
{t("jobs.fields.rate_atp")}{totals.rates.atp.total.toFormat()}{`(${totals.rates.atp.hours.toFixed(2)} @ ${ + totals.rates.atp.rate + })`}
{t("jobs.labels.mapa")}{totals.rates.mapa.total.toFormat()}{`(${totals.rates.mapa.hours.toFixed(2)} @ ${ + totals.rates.mapa.rate + })`}
{t("jobs.labels.mash")}{totals.rates.mash.total.toFormat()}{`(${totals.rates.mash.hours.toFixed(2)} @ ${ + totals.rates.mash.rate + })`}
{t("jobs.labels.rates_subtotal")}{totals.rates.subtotal.toFormat()}
+ + + + + + + + + + + + + +
{t("jobs.labels.partstotal")}{totals.parts.parts.total.toFormat()}{`(${totals.parts.parts.subtotal.toFormat()} ± ${totals.parts.parts.adjustments.toFormat()})`}
{t("jobs.labels.subletstotal")}{totals.parts.sublets.total.toFormat()}{`(${totals.parts.sublets.subtotal.toFormat()} ± ${totals.parts.sublets.adjustments.toFormat()})`}
+
+
{ + if (e.detail === 3) { + try { + console.log("Job", job); + } catch { + console.log("Unable to show job."); + } + } + }}> + + + + + + +
+ ); } +export default connect(mapStateToProps, null)(JobsTotalsTableComponent); diff --git a/client/src/components/job-totals-table/job-totals-table.styles.scss b/client/src/components/job-totals-table/job-totals-table.styles.scss new file mode 100644 index 000000000..633d5be07 --- /dev/null +++ b/client/src/components/job-totals-table/job-totals-table.styles.scss @@ -0,0 +1,24 @@ +.job-totals-container { + display: flex; + flex-flow: wrap; +} +.job-totals-tables { + flex: 1; + display: block; +} + +.job-totals-rates-table, +.job-totals-parts-table { + border: black; + width: 100%; +} + +.job-totals-stats { + margin: 1rem; + display: flex; + flex-direction: column; + align-content: center; + .ant-statistic { + margin: 0.5rem; + } +} diff --git a/client/src/components/job-totals-table/job-totals.utility.js b/client/src/components/job-totals-table/job-totals.utility.js index 3b31eb11c..7903abd0e 100644 --- a/client/src/components/job-totals-table/job-totals.utility.js +++ b/client/src/components/job-totals-table/job-totals.utility.js @@ -1,160 +1,168 @@ +import Dinero from "dinero.js"; +import { logImEXEvent } from "../../firebase/firebase.utils"; + export function CalculateJob(job, shoprates) { + logImEXEvent("job_calculate_total"); + let ret = { parts: CalculatePartsTotals(job.joblines), rates: CalculateRatesTotals(job, shoprates), custPayable: CalculateCustPayable(job), }; - ret.totals = CalculateTaxesTotals(job, ret); - + console.log("CalculateJob -> Final", ret); return ret; } function CalculateTaxesTotals(job, otherTotals) { - const subtotal = - otherTotals.parts.parts.subtotal + - otherTotals.parts.sublets.subtotal + - otherTotals.rates.subtotal + - (job.towing_payable || 0) + - (job.storage_payable || 0); //Levies should be included?? + const subtotal = otherTotals.parts.parts.subtotal + .add(otherTotals.parts.sublets.subtotal) + .add(otherTotals.rates.subtotal) + .add(Dinero({ amount: (job.towing_payable || 0) * 100 })) + .add(Dinero({ amount: (job.storage_payable || 0) * 100 })); + //TODO Levies should be included?? const statePartsTax = job.joblines.reduce((acc, val) => { if (!!!val.tax_part) return acc; if (!!job.parts_tax_rates[val.part_type]) { - return ( - acc + - val.act_price * - val.part_qty * - (job.parts_tax_rates[val.part_type].prt_tax_rt || 0) + return acc.add( + Dinero({ amount: Math.round(val.act_price * 100) }) + .multiply(val.part_qty) + .percentage( + (job.parts_tax_rates[val.part_type].prt_tax_rt || 0) * 100 + ) ); } else { return acc; } - }, 0); - - // console.log("otherTotals", otherTotals); - // console.log("job", job); - // console.log("parts pst", statePartsTax); - // console.log( - // "pst on labor", - // otherTotals.rates.rates_subtotal * (job.tax_lbr_rt || 0) - // ); - // console.log( - // "pst on mat", - // (otherTotals.rates.paint_mat.total + otherTotals.rates.shop_mat.total) * - // (job.tax_paint_mat_rt || 0) - // ); - + }, Dinero({ amount: 0 })); + console.log("job.federal_tax_rate ", job.federal_tax_rate); + console.log(subtotal.percentage((job.federal_tax_rate || 0) * 100)); let ret = { subtotal: subtotal, - federal_tax: subtotal * (job.federal_tax_rate || 0), + federal_tax: subtotal.percentage((job.federal_tax_rate || 0) * 100), statePartsTax, - state_tax: - statePartsTax + - otherTotals.rates.rates_subtotal * (job.tax_lbr_rt || 0) + - ((job.towing_payable || 0) * job.tax_tow_rt || 0) + - ((job.storage_payable || 0) * job.tax_str_rt || 0) + - (otherTotals.rates.paint_mat.total + otherTotals.rates.shop_mat.total) * - (job.tax_paint_mat_rt || 0), - local_tax: subtotal * (job.local_tax_rate || 0), + state_tax: statePartsTax + .add( + otherTotals.rates.rates_subtotal.percentage((job.tax_lbr_rt || 0) * 100) + ) + .add( + Dinero({ + amount: Math.round((job.towing_payable || 0) * 100), + }).percentage((job.tax_tow_rt || 0) * 100) + ) + .add( + Dinero({ + amount: Math.round((job.storage_payable || 0) * 100), + }).percentage((job.tax_str_rt || 0) * 100) + ) + .add( + otherTotals.rates.mapa.total + .add(otherTotals.rates.mash.total) + .percentage((job.tax_paint_mat_rt || 0) * 100) + ), + local_tax: subtotal.percentage((job.local_tax_rate || 0) * 100), }; - - ret.total_repairs = - ret.subtotal + ret.federal_tax + ret.state_tax + ret.local_tax; - ret.net_repairs = ret.total_repairs - otherTotals.custPayable.total; + ret.total_repairs = ret.subtotal + .add(ret.federal_tax) + .add(ret.state_tax) + .add(ret.local_tax); + ret.net_repairs = ret.total_repairs.subtract(otherTotals.custPayable.total); return ret; } +//Rates are multipled by 10 to reduce the errors of rounding. +//Adjusted for when adding to total by dividing by 10. function CalculateRatesTotals(ratesList, shoprates) { const jobLines = ratesList.joblines; let ret = { - rate_la1: { + la1: { hours: jobLines .filter((item) => item.mod_lbr_ty === "LA1") - .reduce((acc, value) => acc + value.mod_lb_hrs, 0), + .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), rate: ratesList.rate_la1 || 0, }, - rate_la2: { + la2: { hours: jobLines .filter((item) => item.mod_lbr_ty === "LA2") - .reduce((acc, value) => acc + value.mod_lb_hrs, 0), + .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), rate: ratesList.rate_la2 || 0, }, - rate_la3: { + la3: { rate: ratesList.rate_la3 || 0, hours: jobLines .filter((item) => item.mod_lbr_ty === "LA3") - .reduce((acc, value) => acc + value.mod_lb_hrs, 0), + .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), }, - rate_la4: { + la4: { rate: ratesList.rate_la4 || 0, hours: jobLines .filter((item) => item.mod_lbr_ty === "LA4") - .reduce((acc, value) => acc + value.mod_lb_hrs, 0), + .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), }, - rate_laa: { + laa: { rate: ratesList.rate_laa || 0, hours: jobLines .filter((item) => item.mod_lbr_ty === "LAA") - .reduce((acc, value) => acc + value.mod_lb_hrs, 0), + .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), }, - rate_lab: { + lab: { rate: ratesList.rate_lab || 0, hours: jobLines .filter((item) => item.mod_lbr_ty === "LAB") - .reduce((acc, value) => acc + value.mod_lb_hrs, 0), + .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), }, - rate_lad: { + lad: { rate: ratesList.rate_lad || 0, hours: jobLines .filter((item) => item.mod_lbr_ty === "LAD") - .reduce((acc, value) => acc + value.mod_lb_hrs, 0), + .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), }, - rate_lae: { + lae: { rate: ratesList.rate_lae || 0, hours: jobLines .filter((item) => item.mod_lbr_ty === "LAE") - .reduce((acc, value) => acc + value.mod_lb_hrs, 0), + .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), }, - rate_laf: { + laf: { rate: ratesList.rate_laf || 0, hours: jobLines .filter((item) => item.mod_lbr_ty === "LAF") - .reduce((acc, value) => acc + value.mod_lb_hrs, 0), + .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), }, - rate_lag: { + lag: { rate: ratesList.rate_lag || 0, hours: jobLines .filter((item) => item.mod_lbr_ty === "LAG") - .reduce((acc, value) => acc + value.mod_lb_hrs, 0), + .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), }, - rate_lam: { + lam: { rate: ratesList.rate_lam || 0, hours: jobLines .filter((item) => item.mod_lbr_ty === "LAM") - .reduce((acc, value) => acc + value.mod_lb_hrs, 0), + .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), }, - rate_lar: { + lar: { rate: ratesList.rate_lar || 0, hours: jobLines .filter((item) => item.mod_lbr_ty === "LAR") - .reduce((acc, value) => acc + value.mod_lb_hrs, 0), + .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), }, - rate_las: { + las: { rate: ratesList.rate_las || 0, hours: jobLines .filter((item) => item.mod_lbr_ty === "LAS") - .reduce((acc, value) => acc + value.mod_lb_hrs, 0), + .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), }, - rate_lau: { + lau: { rate: ratesList.rate_lau || 0, hours: jobLines .filter((item) => item.mod_lbr_ty === "LAU") - .reduce((acc, value) => acc + value.mod_lb_hrs, 0), + .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), }, - rate_atp: { + atp: { rate: shoprates.rate_atp || 0, hours: jobLines.filter((item) => item.line_desc.includes("ATS Amount")) @@ -171,38 +179,40 @@ function CalculateRatesTotals(ratesList, shoprates) { item.mod_lbr_ty !== "LAS" && item.mod_lbr_ty !== "LAA" ) - .reduce((acc, value) => acc + value.mod_lb_hrs, 0) + .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0) : 0, }, - paint_mat: { + mapa: { rate: ratesList.rate_mapa || 0, hours: jobLines .filter((item) => item.mod_lbr_ty === "LAR") - .reduce((acc, value) => acc + value.mod_lb_hrs, 0), + .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), }, - shop_mat: { + mash: { rate: ratesList.rate_mash || 0, hours: jobLines .filter((item) => item.mod_lbr_ty !== "LAR") - .reduce((acc, value) => acc + value.mod_lb_hrs, 0), + .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), }, }; - let subtotal = 0; - let rates_subtotal = 0; + let subtotal = Dinero({ amount: 0 }); + let rates_subtotal = Dinero({ amount: 0 }); for (const property in ret) { - ret[property].total = ret[property].hours * ret[property].rate; - subtotal = subtotal + ret[property].hours * ret[property].rate; + ret[property].total = Dinero({ amount: ret[property].rate * 100 }) + .multiply(ret[property].hours) + .divide(10); + subtotal = subtotal.add(ret[property].total); if ( - property !== "paint_mat" && - property !== "shop_mat" + property !== "mapa" && + property !== "mash" //&& property !== "rate_atp" ) - rates_subtotal = - rates_subtotal + ret[property].hours * ret[property].rate; + rates_subtotal = rates_subtotal.add(ret[property].total); } ret.subtotal = subtotal; ret.rates_subtotal = rates_subtotal; + return ret; } @@ -210,63 +220,104 @@ function CalculatePartsTotals(jobLines) { const ret = jobLines.reduce( (acc, value) => { switch (value.part_type) { - case "PAA": - case "PAC": - case "PAG": - case "PAL": - case "PAM": - case "PAN": - case "PAO": - case "PAP": - case "PAR": - return { - ...acc, - parts: { - ...acc.parts, - subtotal: acc.parts.subtotal + value.act_price * value.part_qty, - //TODO Add Adjustments in - }, - }; case "PAS": case "PASL": return { ...acc, sublets: { ...acc.sublets, - subtotal: acc.sublets.subtotal + value.act_price, + subtotal: acc.sublets.subtotal.add( + Dinero({ amount: Math.round(value.act_price * 100) }) + ), //TODO Add Adjustments in }, }; + // case "PAA": + // case "PAC": + // case "PAG": + // case "PAL": + // case "PAM": + // case "PAN": + // case "PAO": + // case "PAP": + // case "PAR": default: - return acc; + return { + ...acc, + parts: { + ...acc.parts, + list: { + ...acc.parts.list, + [value.part_type]: + acc.parts.list[value.part_type] && + acc.parts.list[value.part_type].total + ? { + total: acc.parts.list[value.part_type].total.add( + Dinero({ + amount: Math.round((value.act_price || 0) * 100), + }).multiply(value.part_qty || 1) + ), + } + : { + total: Dinero({ + amount: Math.round((value.act_price || 0) * 100), + }).multiply(value.part_qty || 1), + }, + }, + subtotal: acc.parts.subtotal.add( + Dinero({ amount: Math.round(value.act_price * 100) }).multiply( + value.part_qty + ) + ), + //TODO Add Adjustments in + }, + }; + // default: + // return acc; } }, { - parts: { subtotal: 0, adjustments: 0, total: 0 }, - sublets: { subtotal: 0, adjustments: 0, total: 0 }, + parts: { + list: {}, + subtotal: Dinero({ amount: 0 }), + adjustments: Dinero({ amount: 0 }), + total: Dinero({ amount: 0 }), + }, + sublets: { + subtotal: Dinero({ amount: 0 }), + adjustments: Dinero({ amount: 0 }), + total: Dinero({ amount: 0 }), + }, } ); return { - parts: { ...ret.parts, total: ret.parts.subtotal + ret.parts.adjustments }, + parts: { + ...ret.parts, + total: ret.parts.subtotal, //+ ret.parts.adjustments + }, sublets: { ...ret.sublets, - total: ret.sublets.subtotal + ret.sublets.adjustments, + total: ret.sublets.subtotal, // + ret.sublets.adjustments, }, }; } function CalculateCustPayable(job) { - return { - deductible: job.ded_amt || 0, - federal_tax: job.federal_tax_payable || 0, //TODO Should this be renamed to make it more clear this is customer GST? - other_customer_amount: job.other_amount_payable || 0, - dep_taxes: job.depreciation_taxes || 0, - total: - job.ded_amt || - 0 + job.federal_tax_payable || - 0 + job.other_amount_payable || - 0 + job.depreciation_taxes || - 0, + let ret = { + deductible: Dinero({ amount: (job.ded_amt || 0) * 100 }) || 0, + federal_tax: Dinero({ amount: (job.federal_tax_payable || 0) * 100 }), //TODO Should this be renamed to make it more clear this is customer GST? + other_customer_amount: Dinero({ + amount: (job.other_amount_payable || 0) * 100, + }), + dep_taxes: Dinero({ amount: job.depreciation_taxes || 0 }), }; + + ret.total = ret.deductible + .add(ret.federal_tax) + .add(ret.federal_tax) + .add(ret.other_customer_amount) + .add(ret.dep_taxes); + + return ret; } diff --git a/client/src/components/jobs-available-new/jobs-available-new.component.jsx b/client/src/components/jobs-available-new/jobs-available-new.component.jsx index 7a91e4555..574237241 100644 --- a/client/src/components/jobs-available-new/jobs-available-new.component.jsx +++ b/client/src/components/jobs-available-new/jobs-available-new.component.jsx @@ -1,5 +1,9 @@ -import { DeleteFilled, PlusCircleFilled, SyncOutlined } from "@ant-design/icons"; -import { Button, notification, Table } from "antd"; +import { + DeleteFilled, + PlusCircleFilled, + SyncOutlined, +} from "@ant-design/icons"; +import { Button, notification, Table, Input } from "antd"; import React, { useState } from "react"; import { useTranslation } from "react-i18next"; import CurrencyFormatter from "../../utils/CurrencyFormatter"; @@ -20,13 +24,13 @@ export default function JobsAvailableComponent({ selectedOwner, setSelectedOwner, loadEstData, - estData + estData, }) { const { t } = useTranslation(); - + const [searchText, setSearchText] = useState(""); const [state, setState] = useState({ sortedInfo: {}, - filteredInfo: { text: "" } + filteredInfo: { text: "" }, }); const handleTableChange = (pagination, filters, sorter) => { @@ -43,7 +47,7 @@ export default function JobsAvailableComponent({ // filteredValue: state.filteredInfo.text || null, sorter: (a, b) => alphaSort(a, b), sortOrder: - state.sortedInfo.columnKey === "cieca_id" && state.sortedInfo.order + state.sortedInfo.columnKey === "cieca_id" && state.sortedInfo.order, }, { title: t("jobs.fields.owner"), @@ -53,7 +57,7 @@ export default function JobsAvailableComponent({ sorter: (a, b) => alphaSort(a.ownr_ln, b.ownr_ln), //width: "25%", sortOrder: - state.sortedInfo.columnKey === "ownr_name" && state.sortedInfo.order + state.sortedInfo.columnKey === "ownr_name" && state.sortedInfo.order, }, { title: t("jobs.fields.vehicle"), @@ -61,7 +65,7 @@ export default function JobsAvailableComponent({ key: "vehicle_info", sorter: (a, b) => alphaSort(a.vehicle_info, b.vehicle_info), sortOrder: - state.sortedInfo.columnKey === "vehicle_info" && state.sortedInfo.order + state.sortedInfo.columnKey === "vehicle_info" && state.sortedInfo.order, //ellipsis: true }, { @@ -70,7 +74,7 @@ export default function JobsAvailableComponent({ key: "clm_no", sorter: (a, b) => alphaSort(a.clm_no, b.clm_no), sortOrder: - state.sortedInfo.columnKey === "clm_no" && state.sortedInfo.order + state.sortedInfo.columnKey === "clm_no" && state.sortedInfo.order, //width: "12%", //ellipsis: true }, @@ -83,7 +87,7 @@ export default function JobsAvailableComponent({ state.sortedInfo.columnKey === "clm_amt" && state.sortedInfo.order, render: (text, record) => ( {record.clm_amt} - ) + ), //width: "12%", //ellipsis: true }, @@ -93,7 +97,7 @@ export default function JobsAvailableComponent({ key: "uploaded_by", sorter: (a, b) => alphaSort(a.uploaded_by, b.uploaded_by), sortOrder: - state.sortedInfo.columnKey === "uploaded_by" && state.sortedInfo.order + state.sortedInfo.columnKey === "uploaded_by" && state.sortedInfo.order, //width: "12%", //ellipsis: true }, @@ -106,7 +110,7 @@ export default function JobsAvailableComponent({ state.sortedInfo.columnKey === "updated_at" && state.sortedInfo.order, render: (text, record) => ( {record.updated_at} - ) + ), //width: "12%", //ellipsis: true }, @@ -117,9 +121,9 @@ export default function JobsAvailableComponent({ - ) + ), //width: "12%", //ellipsis: true - } + }, ]; const owner = @@ -152,6 +156,21 @@ export default function JobsAvailableComponent({ ? estData.data.available_jobs_by_pk.est_data.owner.data : null; + const availableJobs = data + ? searchText + ? data.available_jobs.filter( + (j) => + (j.ownr_name || "") + .toLowerCase() + .includes(searchText.toLowerCase()) || + (j.vehicle_info || "") + .toLowerCase() + .includes(searchText.toLowerCase()) || + (j.clm_no || "").toLowerCase().includes(searchText.toLowerCase()) + ) + : data.available_jobs + : []; + return (
{ return ( -
+
{t("jobs.labels.availablenew")} +
+ { + setSearchText(e.currentTarget.value); + }} + /> +
); }} size="small" pagination={{ position: "top" }} - columns={columns.map(item => ({ ...item }))} + columns={columns} rowKey="id" - dataSource={data && data.available_jobs} + dataSource={availableJobs} onChange={handleTableChange} />
diff --git a/client/src/components/jobs-available-new/jobs-available-new.container.jsx b/client/src/components/jobs-available-new/jobs-available-new.container.jsx index 645013d71..8cb8ae400 100644 --- a/client/src/components/jobs-available-new/jobs-available-new.container.jsx +++ b/client/src/components/jobs-available-new/jobs-available-new.container.jsx @@ -15,6 +15,7 @@ import { selectBodyshop } from "../../redux/user/user.selectors"; import AlertComponent from "../alert/alert.component"; import LoadingSpinner from "../loading-spinner/loading-spinner.component"; import JobsAvailableComponent from "./jobs-available-new.component"; +import { logImEXEvent } from "../../firebase/firebase.utils"; const mapStateToProps = createStructuredSelector({ bodyshop: selectBodyshop, @@ -40,6 +41,8 @@ export function JobsAvailableContainer({ const [loadEstData, estData] = estDataLazyLoad; const onModalOk = () => { + logImEXEvent("job_import_new"); + setModalVisible(false); setInsertLoading(true); @@ -66,12 +69,11 @@ export function JobsAvailableContainer({ const newJob = { ...estData.data.available_jobs_by_pk.est_data, - clm_total: newTotals.totals.total_repairs, - owner_owing: newTotals.custPayable.total, - job_totals: newTotals, + clm_total: newTotals.totals.total_repairs.toFormat("0.00"), + owner_owing: newTotals.custPayable.total.toFormat("0.00"), + job_totals: JSON.stringify(newTotals), }; - console.log("newTotals", newTotals); insertNewJob({ variables: { job: selectedOwner @@ -88,7 +90,6 @@ export function JobsAvailableContainer({ notification["success"]({ message: t("jobs.successes.created"), onClick: () => { - console.log("r", r); history.push( `/manage/jobs/${r.data.insert_jobs.returning[0].id}` ); diff --git a/client/src/components/jobs-available-supplement/jobs-available-supplement.component.jsx b/client/src/components/jobs-available-supplement/jobs-available-supplement.component.jsx index 589cb40f1..eeeec7bb3 100644 --- a/client/src/components/jobs-available-supplement/jobs-available-supplement.component.jsx +++ b/client/src/components/jobs-available-supplement/jobs-available-supplement.component.jsx @@ -1,5 +1,9 @@ -import { DeleteFilled, PlusCircleFilled, SyncOutlined } from "@ant-design/icons"; -import { Button, notification, Table } from "antd"; +import { + DeleteFilled, + PlusCircleFilled, + SyncOutlined, +} from "@ant-design/icons"; +import { Button, notification, Table, Input } from "antd"; import React, { useState } from "react"; import { useTranslation } from "react-i18next"; import CurrencyFormatter from "../../utils/CurrencyFormatter"; @@ -12,7 +16,6 @@ export default function JobsAvailableSupplementComponent({ data, refetch, deleteJob, - updateJob, onModalOk, onModalCancel, modalVisible, @@ -22,13 +25,15 @@ export default function JobsAvailableSupplementComponent({ deleteAllNewJobs, loadEstData, estData, - importOptionsState + importOptionsState, + modalSearchState, }) { const { t } = useTranslation(); + const [searchText, setSearchText] = useState(""); const [state, setState] = useState({ sortedInfo: {}, - filteredInfo: { text: "" } + filteredInfo: { text: "" }, }); const handleTableChange = (pagination, filters, sorter) => { @@ -45,7 +50,7 @@ export default function JobsAvailableSupplementComponent({ // filteredValue: state.filteredInfo.text || null, sorter: (a, b) => alphaSort(a, b), sortOrder: - state.sortedInfo.columnKey === "cieca_id" && state.sortedInfo.order + state.sortedInfo.columnKey === "cieca_id" && state.sortedInfo.order, }, { title: t("jobs.fields.ro_number"), @@ -57,7 +62,7 @@ export default function JobsAvailableSupplementComponent({ sorter: (a, b) => alphaSort(a, b), sortOrder: state.sortedInfo.columnKey === "cieca_id" && state.sortedInfo.order, - render: (text, record) =>
{record.job && record.job.ro_number}
+ render: (text, record) =>
{record.job && record.job.ro_number}
, }, { title: t("jobs.fields.owner"), @@ -67,7 +72,7 @@ export default function JobsAvailableSupplementComponent({ sorter: (a, b) => alphaSort(a.ownr_ln, b.ownr_ln), //width: "25%", sortOrder: - state.sortedInfo.columnKey === "ownr_name" && state.sortedInfo.order + state.sortedInfo.columnKey === "ownr_name" && state.sortedInfo.order, }, { title: t("jobs.fields.vehicle"), @@ -75,7 +80,7 @@ export default function JobsAvailableSupplementComponent({ key: "vehicle_info", sorter: (a, b) => alphaSort(a.vehicle_info, b.vehicle_info), sortOrder: - state.sortedInfo.columnKey === "vehicle_info" && state.sortedInfo.order + state.sortedInfo.columnKey === "vehicle_info" && state.sortedInfo.order, //ellipsis: true }, { @@ -84,7 +89,7 @@ export default function JobsAvailableSupplementComponent({ key: "clm_no", sorter: (a, b) => alphaSort(a.clm_no, b.clm_no), sortOrder: - state.sortedInfo.columnKey === "clm_no" && state.sortedInfo.order + state.sortedInfo.columnKey === "clm_no" && state.sortedInfo.order, //width: "12%", //ellipsis: true }, @@ -97,7 +102,7 @@ export default function JobsAvailableSupplementComponent({ state.sortedInfo.columnKey === "clm_amt" && state.sortedInfo.order, render: (text, record) => ( {record.clm_amt} - ) + ), //width: "12%", //ellipsis: true }, @@ -107,7 +112,7 @@ export default function JobsAvailableSupplementComponent({ key: "uploaded_by", sorter: (a, b) => alphaSort(a.uploaded_by, b.uploaded_by), sortOrder: - state.sortedInfo.columnKey === "uploaded_by" && state.sortedInfo.order + state.sortedInfo.columnKey === "uploaded_by" && state.sortedInfo.order, //width: "12%", //ellipsis: true }, @@ -120,20 +125,20 @@ export default function JobsAvailableSupplementComponent({ state.sortedInfo.columnKey === "updated_at" && state.sortedInfo.order, render: (text, record) => ( {record.updated_at} - ) + ), //width: "12%", //ellipsis: true }, { title: t("general.labels.actions"), key: "actions", - render: (text, record) => ( + render: (text, record, index) => ( - ) - //width: "12%", - //ellipsis: true - } + ), + }, ]; + const handleDeleteAll = () => { + deleteAllNewJobs() + .then((r) => { + notification["success"]({ + message: t("jobs.successes.all_deleted", { + count: r.data.delete_available_jobs.affected_rows, + }), + }); + refetch(); + }) + .catch((r) => { + notification["error"]({ + message: t("jobs.errors.deleted") + " " + r.message, + }); + }); + }; + + const availableJobs = data + ? searchText + ? data.available_jobs.filter( + (j) => + (j.ownr_name || "") + .toLowerCase() + .includes(searchText.toLowerCase()) || + (j.vehicle_info || "") + .toLowerCase() + .includes(searchText.toLowerCase()) || + (j.clm_no || "").toLowerCase().includes(searchText.toLowerCase()) + ) + : data.available_jobs + : []; + return (
{ return ( -
+
{t("jobs.labels.availablesupplements")} - +
+ { + setSearchText(e.currentTarget.value); + }} + /> +
); }} size="small" pagination={{ position: "top" }} - columns={columns.map(item => ({ ...item }))} + columns={columns} rowKey="id" - dataSource={data && data.available_jobs} + dataSource={availableJobs} onChange={handleTableChange} />
diff --git a/client/src/components/jobs-available-supplement/jobs-available-supplement.container.jsx b/client/src/components/jobs-available-supplement/jobs-available-supplement.container.jsx index a341f920f..327b488ea 100644 --- a/client/src/components/jobs-available-supplement/jobs-available-supplement.container.jsx +++ b/client/src/components/jobs-available-supplement/jobs-available-supplement.container.jsx @@ -1,18 +1,24 @@ -import { useMutation, useQuery } from "@apollo/react-hooks"; +import { useApolloClient, useMutation, useQuery } from "@apollo/react-hooks"; import { notification } from "antd"; +import gql from "graphql-tag"; import React, { useState } from "react"; import { useTranslation } from "react-i18next"; import { connect } from "react-redux"; import { useHistory } from "react-router-dom"; import { createStructuredSelector } from "reselect"; import { CalculateJob } from "../../components/job-totals-table/job-totals.utility"; -import { DELETE_ALL_AVAILABLE_SUPPLEMENT_JOBS, QUERY_AVAILABLE_SUPPLEMENT_JOBS } from "../../graphql/available-jobs.queries"; +import { + DELETE_ALL_AVAILABLE_SUPPLEMENT_JOBS, + QUERY_AVAILABLE_SUPPLEMENT_JOBS, +} from "../../graphql/available-jobs.queries"; import { UPDATE_JOB } from "../../graphql/jobs.queries"; import { selectBodyshop } from "../../redux/user/user.selectors"; import AlertComponent from "../alert/alert.component"; import LoadingSpinner from "../loading-spinner/loading-spinner.component"; import JobsAvailableSupplementComponent from "./jobs-available-supplement.component"; +import { GetSupplementDelta } from "./jobs-available-supplement.estlines.util"; import HeaderFields from "./jobs-available-supplement.headerfields"; +import { logImEXEvent } from "../../firebase/firebase.utils"; const mapStateToProps = createStructuredSelector({ bodyshop: selectBodyshop, @@ -24,23 +30,25 @@ export function JobsAvailableSupplementContainer({ bodyshop, }) { const { loading, error, data, refetch } = useQuery( - QUERY_AVAILABLE_SUPPLEMENT_JOBS, - { - fetchPolicy: "network-only", - } + QUERY_AVAILABLE_SUPPLEMENT_JOBS ); const { t } = useTranslation(); const history = useHistory(); + const client = useApolloClient(); const [deleteAllNewJobs] = useMutation(DELETE_ALL_AVAILABLE_SUPPLEMENT_JOBS); const [modalVisible, setModalVisible] = useState(false); const [selectedJob, setSelectedJob] = useState(null); const [insertLoading, setInsertLoading] = useState(false); + const modalSearchState = useState(""); const [updateJob] = useMutation(UPDATE_JOB); const [loadEstData, estData] = estDataLazyLoad; const importOptionsState = useState({ overrideHeaders: false }); const importOptions = importOptionsState[0]; - const onModalOk = () => { + + const onModalOk = async () => { + logImEXEvent("job_import_supplement"); + setModalVisible(false); setInsertLoading(true); @@ -61,10 +69,8 @@ export function JobsAvailableSupplementContainer({ let supp = estData.data.available_jobs_by_pk.est_data; console.log("supp before", supp); - //TODO How to update the estimate lines. delete supp.owner; delete supp.vehicle; - if (importOptions.overrideHeaders) { HeaderFields.forEach((item) => delete supp[item]); } @@ -77,16 +83,26 @@ export function JobsAvailableSupplementContainer({ bodyshop.shoprates ); - console.log('newTotals', newTotals) + let suppDelta = await GetSupplementDelta( + client, + selectedJob, + estData.data.available_jobs_by_pk.est_data.joblines.data + ); + delete supp.joblines; + await client.mutate({ + mutation: gql` + ${suppDelta} + `, + }); updateJob({ variables: { jobId: selectedJob, job: { ...supp, - clm_total: newTotals.totals.total_repairs, - owner_owing: newTotals.custPayable.total, - job_totals: newTotals, + clm_total: newTotals.totals.total_repairs.toFormat("0.00"), + owner_owing: newTotals.custPayable.total.toFormat("0.00"), + job_totals: JSON.stringify(newTotals), }, }, }) @@ -120,15 +136,15 @@ export function JobsAvailableSupplementContainer({ const onModalCancel = () => { setModalVisible(false); + modalSearchState[1](""); setSelectedJob(null); }; - if (error) return ; + if (error) return ; return ( + message={t("jobs.labels.creating_new_job")}> ); diff --git a/client/src/components/jobs-available-supplement/jobs-available-supplement.estlines.util.js b/client/src/components/jobs-available-supplement/jobs-available-supplement.estlines.util.js new file mode 100644 index 000000000..fe46c3c65 --- /dev/null +++ b/client/src/components/jobs-available-supplement/jobs-available-supplement.estlines.util.js @@ -0,0 +1,93 @@ +import { GET_JOB_LINES_BY_PK } from "../../graphql/jobs-lines.queries"; +import gql from "graphql-tag"; +export const GetSupplementDelta = async (client, jobId, newLines) => { + console.log("-----Begin Supplement-----"); + console.log("Supplement delta for jobId", jobId); + console.log("New Lines", newLines); + + const { + data: { joblines: existingLines }, + } = await client.query({ + query: GET_JOB_LINES_BY_PK, + variables: { id: jobId }, + }); + + const linesToInsert = []; + const linesToUpdate = []; + + newLines.forEach((newLine) => { + const matchingIndex = existingLines.findIndex( + (eL) => eL.unq_seq === newLine.unq_seq + ); + if (matchingIndex >= 0) { + //Found a relevant matching line. Add it to lines to update. + linesToUpdate.push({ + id: existingLines[matchingIndex].id, + newData: newLine, + }); + + //Splice out item we found for performance. + existingLines.splice(matchingIndex, 1); + } else { + //Didn't find a match. Must be a new line. + linesToInsert.push(newLine); + } + }); + + //Wahtever is left in the existing lines, are lines that should be removed. + + const insertQueries = linesToInsert.reduce((acc, value, idx) => { + return acc + generateInsertQuery(value, idx, jobId); + }, ""); + + const updateQueries = linesToUpdate.reduce((acc, value, idx) => { + return acc + generateUpdateQuery(value, idx); + }, ""); + + const removeQueries = existingLines.reduce((acc, value, idx) => { + return acc + generateRemoveQuery(value, idx); + }, ""); + + return new Promise((resolve, reject) => { + resolve(gql` + mutation SUPPLEMENT_EST_LINES{ + ${insertQueries + updateQueries + removeQueries} + } + `); + }); +}; + +const generateInsertQuery = (lineToInsert, index, jobId) => { + lineToInsert.jobid = jobId; + return ` + insert_joblines${index}: insert_joblines(objects: ${JSON.stringify( + lineToInsert + ).replace(/"(\w+)"\s*:/g, "$1:")}) { + returning { + id + } + }`; +}; + +const generateUpdateQuery = (lineToUpdate, index) => { + return ` + update_joblines${index}: update_joblines(where: { id: { _eq: "${ + lineToUpdate.id + }" } }, _set: ${JSON.stringify(lineToUpdate.newData).replace( + /"(\w+)"\s*:/g, + "$1:" + )}) { + returning { + id + } + }`; +}; + +const generateRemoveQuery = (lineToRemove, index) => { + return ` + update_joblines_r${index}: update_joblines(where: {id: {_eq: "${lineToRemove.id}"}}, _set: {removed: true}) { + returning{ + id + } + }`; +}; diff --git a/client/src/components/jobs-close-allocation-button/jobs-close-allocation-button.component.jsx b/client/src/components/jobs-close-allocation-button/jobs-close-allocation-button.component.jsx new file mode 100644 index 000000000..d43fa84ef --- /dev/null +++ b/client/src/components/jobs-close-allocation-button/jobs-close-allocation-button.component.jsx @@ -0,0 +1,117 @@ +import { PlusCircleFilled, CloseCircleFilled } from "@ant-design/icons"; +import { Button, InputNumber, Select } from "antd"; +import Dinero from "dinero.js"; +import React, { useState, useEffect } from "react"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +import { useTranslation } from "react-i18next"; +import { logImEXEvent } from "../../firebase/firebase.utils"; + +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, +}); + +const { Option } = Select; + +export function JobsCloseLabmatAllocationButton({ + remainingAmount, + allocationKey, + allocation, + setAllocations, + bodyshop, + invoiced, +}) { + const [visible, setVisible] = useState(false); + const [state, setState] = useState({ center: "", amount: 0 }); + const { t } = useTranslation(); + + const handleAllocate = () => { + logImEXEvent("jobs_close_allocate_single"); + + const existingIndex = allocation.allocations.findIndex( + (e) => e.center === state.center + ); + + const newAllocations = allocation.allocations.slice(0); + if (existingIndex > -1) { + newAllocations[existingIndex] = { + center: state.center, + amount: newAllocations[existingIndex].amount.add( + Dinero({ amount: (state.amount || 0) * 100 }) + ), + }; + } else { + newAllocations.push({ + center: state.center, + amount: Dinero({ amount: (state.amount || 0) * 100 }), + }); + } + + setAllocations((labMatState) => { + return { + ...labMatState, + [allocationKey]: { + ...allocation, + allocations: newAllocations, + }, + }; + }); + + setState({ center: "", amount: 0 }); + }; + + const showAllocation = allocation.total.getAmount() > 0; + useEffect(() => { + if (remainingAmount === 0) setVisible(false); + }, [remainingAmount, setVisible]); + + if (!showAllocation) return null; + return ( +
+
+ + setState({ ...state, amount: val })} + max={remainingAmount / 100} + /> + +
+
+ {visible ? ( + setVisible(false)} + disabled={invoiced} + /> + ) : ( + setVisible(true)} + disabled={invoiced} + /> + )} +
+
+ ); +} +export default connect(mapStateToProps, null)(JobsCloseLabmatAllocationButton); diff --git a/client/src/components/jobs-close-allocation-tags/jobs-close-allocation-tags.component.jsx b/client/src/components/jobs-close-allocation-tags/jobs-close-allocation-tags.component.jsx new file mode 100644 index 000000000..e34fe66eb --- /dev/null +++ b/client/src/components/jobs-close-allocation-tags/jobs-close-allocation-tags.component.jsx @@ -0,0 +1,34 @@ +import React from "react"; +import { Tag } from "antd"; +export default function JobsCloseLabMatAllocationTags({ + allocationKey, + allocation, + setAllocations, + invoiced, +}) { + return ( +
+ {allocation.allocations.map((a, idx) => ( + { + setAllocations((state) => { + return { + ...state, + [allocationKey]: { + ...allocation, + allocations: allocation.allocations.filter( + (val, index) => index !== idx + ), + }, + }; + }); + }} + key={idx} + >{`${a.center} - ${a.amount.toFormat()}`} + ))} +
+ ); +} diff --git a/client/src/components/jobs-close-auto-allocate/jobs-close-auto-allocate.component.jsx b/client/src/components/jobs-close-auto-allocate/jobs-close-auto-allocate.component.jsx new file mode 100644 index 000000000..3a5430939 --- /dev/null +++ b/client/src/components/jobs-close-auto-allocate/jobs-close-auto-allocate.component.jsx @@ -0,0 +1,77 @@ +import React from "react"; +import { Button } from "antd"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { useTranslation } from "react-i18next"; +import { logImEXEvent } from "../../firebase/firebase.utils"; + +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, +}); + +export function JobsCloseAutoAllocate({ + bodyshop, + labmatAllocations, + setLabmatAllocations, + partsAllocations, + setPartsAllocations, + + disabled, +}) { + const { t } = useTranslation(); + const handleAllocate = () => { + logImEXEvent("jobs_close_allocate_auto"); + + const { defaults } = bodyshop.md_responsibility_centers; + + Object.keys(labmatAllocations).forEach((i) => { + const defaultProfitCenter = defaults.profits[i.toUpperCase()]; + + if (!!defaultProfitCenter && labmatAllocations[i].total.getAmount() > 0) { + setLabmatAllocations((st) => { + return { + ...st, + [i]: { + ...labmatAllocations[i], + allocations: [ + { + center: defaultProfitCenter, + amount: labmatAllocations[i].total, + }, + ], + }, + }; + }); + } + }); + + Object.keys(partsAllocations).forEach((i) => { + const defaultProfitCenter = defaults.profits[i.toUpperCase()]; + + if (!!defaultProfitCenter && partsAllocations[i].total.getAmount() > 0) { + setPartsAllocations((st) => { + return { + ...st, + [i]: { + ...partsAllocations[i], + allocations: [ + { + center: defaultProfitCenter, + amount: partsAllocations[i].total, + }, + ], + }, + }; + }); + } + }); + }; + + return ( + + ); +} +export default connect(mapStateToProps, null)(JobsCloseAutoAllocate); diff --git a/client/src/components/jobs-close-export-button/jobs-close-export-button.component.jsx b/client/src/components/jobs-close-export-button/jobs-close-export-button.component.jsx new file mode 100644 index 000000000..f5a4a74ad --- /dev/null +++ b/client/src/components/jobs-close-export-button/jobs-close-export-button.component.jsx @@ -0,0 +1,120 @@ +import { useMutation } from "@apollo/react-hooks"; +import { Button, notification } from "antd"; +import axios from "axios"; +import React, { useState } from "react"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { auth } from "../../firebase/firebase.utils"; +import { UPDATE_JOB } from "../../graphql/jobs.queries"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +import { logImEXEvent } from "../../firebase/firebase.utils"; + +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, +}); + +export function JobsCloseExportButton({ bodyshop, jobId, disabled }) { + const { t } = useTranslation(); + const [updateJob] = useMutation(UPDATE_JOB); + const [loading, setLoading] = useState(false); + const handleQbxml = async () => { + logImEXEvent("jobs_close_export"); + + setLoading(true); + let QbXmlResponse; + try { + QbXmlResponse = await axios.post( + "/accounting/qbxml/receivables", + { jobIds: [jobId] }, + { + headers: { + Authorization: `Bearer ${await auth.currentUser.getIdToken(true)}`, + }, + } + ); + console.log("handle -> XML", QbXmlResponse); + } catch (error) { + console.log("Error getting QBXML from Server.", error); + notification["error"]({ + message: t("jobs.errors.exporting", { + error: "Unable to retrieve QBXML. " + JSON.stringify(error.message), + }), + }); + setLoading(false); + return; + } + + let PartnerResponse; + try { + PartnerResponse = await axios.post( + "http://localhost:1337/qb/", + // "http://609feaeae986.ngrok.io/qb/", + QbXmlResponse.data, + { + headers: { + Authorization: `Bearer ${await auth.currentUser.getIdToken(true)}`, + }, + } + ); + } catch (error) { + console.log("Error connecting to quickbooks or partner.", error); + notification["error"]({ + message: t("jobs.errors.exporting-partner"), + }); + setLoading(false); + return; + } + + console.log("PartnerResponse", PartnerResponse); + + //Check to see if any of them failed. If they didn't don't execute the update. + const failedTransactions = PartnerResponse.data.filter((r) => !r.success); + if (failedTransactions.length > 0) { + //Uh oh. At least one was no good. + failedTransactions.map((ft) => + notification["error"]({ + message: t("jobs.errors.exporting", { + error: ft.errorMessage || "", + }), + }) + ); + } else { + const jobUpdateResponse = await updateJob({ + variables: { + jobId: jobId, + job: { + status: bodyshop.md_ro_statuses.default_exported || "Exported*", + date_exported: new Date(), + }, + }, + }); + + if (!!!jobUpdateResponse.errors) { + notification["success"]({ + message: t("jobs.successes.exported"), + }); + } else { + notification["error"]({ + message: t("jobs.errors.exporting", { + error: JSON.stringify(jobUpdateResponse.error), + }), + }); + } + } + + setLoading(false); + }; + + return ( + + ); +} + +export default connect(mapStateToProps, null)(JobsCloseExportButton); diff --git a/client/src/components/jobs-close-labmat-allocation/jobs-close-labmat-allocation.component.jsx b/client/src/components/jobs-close-labmat-allocation/jobs-close-labmat-allocation.component.jsx new file mode 100644 index 000000000..7879ebd9b --- /dev/null +++ b/client/src/components/jobs-close-labmat-allocation/jobs-close-labmat-allocation.component.jsx @@ -0,0 +1,94 @@ +import Dinero from "dinero.js"; +import React from "react"; +import { useTranslation } from "react-i18next"; +import AllocationButton from "../jobs-close-allocation-button/jobs-close-allocation-button.component"; +import AllocationTags from "../jobs-close-allocation-tags/jobs-close-allocation-tags.component"; + +export default function JobCloseLabMatAllocation({ + labmatAllocations, + setLabmatAllocations, + labMatTotalAllocation, + invoiced +}) { + const { t } = useTranslation(); + + return ( +
+
+ + + + + + + + + + + {Object.keys(labmatAllocations).map((alloc, idx) => { + if (!alloc.includes("subtotal")) + return ( + + + + + + + + ); + else return null; + })} + + + + + + + + +
{t("jobs.labels.laborallocations")}{t("jobs.labels.totals")}{t("jobs.labels.available")}{t("jobs.actions.allocate")}{t("jobs.labels.allocations")}
{t(`jobs.fields.${alloc}`)} + {labmatAllocations[alloc].total && + labmatAllocations[alloc].total.toFormat()} + + {labmatAllocations[alloc].total + .subtract( + Dinero({ + amount: labmatAllocations[alloc].allocations.reduce( + (acc, val) => { + return acc + val.amount.getAmount(); + }, + 0 + ), + }) + ) + .toFormat()} + + { + return acc + val.amount.getAmount(); + }, + 0 + ), + }) + ) + .getAmount()} + allocation={labmatAllocations[alloc]} + setAllocations={setLabmatAllocations} + /> + + +
{labmatAllocations.subtotal.toFormat()}{labMatTotalAllocation.toFormat()}
+
+ ); +} diff --git a/client/src/components/jobs-close-parts-allocation/jobs-close-parts-allocation.component.jsx b/client/src/components/jobs-close-parts-allocation/jobs-close-parts-allocation.component.jsx new file mode 100644 index 000000000..48bec6dbc --- /dev/null +++ b/client/src/components/jobs-close-parts-allocation/jobs-close-parts-allocation.component.jsx @@ -0,0 +1,101 @@ +import React from "react"; +import { useTranslation } from "react-i18next"; +import Dinero from "dinero.js"; +import AllocationButton from "../jobs-close-allocation-button/jobs-close-allocation-button.component"; +import AllocationTags from "../jobs-close-allocation-tags/jobs-close-allocation-tags.component"; + +export default function JobsClosePartsAllocation({ + partsAllocations, + setPartsAllocations, + partsAllocatedTotal, + invoiced, +}) { + const { t } = useTranslation(); + + return ( +
+ { + + + + + + + + + + + + {Object.keys(partsAllocations).map((alloc, idx) => { + return ( + + + + + + + + ); + })} + + + + + + + + +
{t("jobs.labels.laborallocations")}{t("jobs.labels.totals")}{t("jobs.labels.available")}{t("jobs.actions.allocate")}{t("jobs.labels.allocations")}
{t(`jobs.fields.${alloc.toLowerCase()}`)} + {partsAllocations[alloc].total && + partsAllocations[alloc].total.toFormat()} + + {partsAllocations[alloc].total + .subtract( + Dinero({ + amount: partsAllocations[alloc].allocations.reduce( + (acc, val) => { + return acc + val.amount.getAmount(); + }, + 0 + ), + }) + ) + .toFormat()} + + { + return acc + val.amount.getAmount(); + }, + 0 + ), + }) + ) + .getAmount()} + allocation={partsAllocations[alloc]} + setAllocations={setPartsAllocations} + /> + + +
+ {Dinero({ + amount: Object.keys(partsAllocations).reduce((acc, val) => { + return (acc = + acc + partsAllocations[val].total.getAmount()); + }, 0), + }).toFormat()} + {partsAllocatedTotal.toFormat()}
+ } +
+ ); +} diff --git a/client/src/components/jobs-close-save-button/jobs-close-save-button.component.jsx b/client/src/components/jobs-close-save-button/jobs-close-save-button.component.jsx new file mode 100644 index 000000000..d4a6889f7 --- /dev/null +++ b/client/src/components/jobs-close-save-button/jobs-close-save-button.component.jsx @@ -0,0 +1,71 @@ +import { useMutation } from "@apollo/react-hooks"; +import { Button, notification } from "antd"; +import React, { useState } from "react"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { UPDATE_JOB } from "../../graphql/jobs.queries"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +import { logImEXEvent } from "../../firebase/firebase.utils"; + +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, +}); + +export function JobsCloseSaveButton({ + bodyshop, + suspenseAmount, + jobId, + jobTotals, + labMatAllocations, + partsAllocations, + setInvoicedState, + disabled, +}) { + const [loading, setLoading] = useState(false); + const { t } = useTranslation(); + const [updateJob] = useMutation(UPDATE_JOB); + + const handleSave = async () => { + logImEXEvent("jobs_close_save"); + + setLoading(true); + + const result = await updateJob({ + variables: { + jobId: jobId, + job: { + date_invoiced: new Date(), + status: bodyshop.md_ro_statuses.default_invoiced || "Invoiced*", + invoice_allocation: { + labMatAllocations, + partsAllocations, + }, + }, + }, + }); + if (!!!result.errors) { + notification["success"]({ message: t("jobs.successes.invoiced") }); + setInvoicedState(true); + } else { + notification["error"]({ + message: t("jobs.errors.invoicing", { + error: JSON.stringify(result.errors), + }), + }); + } + setLoading(false); + }; + + return ( + + ); +} + +export default connect(mapStateToProps, null)(JobsCloseSaveButton); diff --git a/client/src/components/jobs-close-totals/jobs-close-totals.component.jsx b/client/src/components/jobs-close-totals/jobs-close-totals.component.jsx new file mode 100644 index 000000000..0c7f05f02 --- /dev/null +++ b/client/src/components/jobs-close-totals/jobs-close-totals.component.jsx @@ -0,0 +1,67 @@ +import { Descriptions, Statistic } from "antd"; +import React from "react"; +import { useTranslation } from "react-i18next"; +export default function JobsCloseTotals({ + jobTotals, + labMatTotal, + partsTotal, +}) { + const { t } = useTranslation(); + return ( +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ ); +} diff --git a/client/src/components/jobs-create-jobs-info/jobs-create-jobs-info.component.jsx b/client/src/components/jobs-create-jobs-info/jobs-create-jobs-info.component.jsx index 770e68c3e..e99038af2 100644 --- a/client/src/components/jobs-create-jobs-info/jobs-create-jobs-info.component.jsx +++ b/client/src/components/jobs-create-jobs-info/jobs-create-jobs-info.component.jsx @@ -1,129 +1,148 @@ -import { Collapse, Form, Input, InputNumber, Switch, DatePicker } from "antd"; +import { Collapse, Form, Input, InputNumber, Switch } from "antd"; import React from "react"; import { useTranslation } from "react-i18next"; +import FormDatePicker from '../form-date-picker/form-date-picker.component'; import FormItemEmail from "../form-items-formatted/email-form-item.component"; import FormItemPhone from "../form-items-formatted/phone-form-item.component"; +import LayoutFormRow from "../layout-form-row/layout-form-row.component"; export default function JobsCreateJobsInfo({ form }) { const { t } = useTranslation(); const { getFieldValue } = form; return (
- + - - - - - - - - - - - - - TODO: missing KOL field??? - - - - CAA # seems not correct based on field mapping Class seems not correct - based on field mapping - - - - - - - - - - - - - - - - - - - - - - Appraiser Info - - - - - - - - - - TODO: Field is pay date but title is inspection date. Likely - incorrect? - - - - - - - - - - - - - - - - - - - - - + key='insurance' + header={t("menus.jobsdetail.insurance")}> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Appraiser Info + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + TODO How to handle different taxes and marking them as exempt? { // @@ -132,157 +151,125 @@ export default function JobsCreateJobsInfo({ form }) { // })()} // } - - - - - - - - - - - - - - - - - - - - - - - - - - - - TODO This is equivalent of GST payable. - - - - TODO equivalent of other customer amount - - - - - - - - - - - - - Totals Table - - - - - - - - - - - - - - - - - - - - - - - - - - - - Note //TODO Remove ATP rate? - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + key='financial' + header={t("menus.jobsdetail.financials")}> + + + + + + + + + + + TODO This is equivalent of GST payable. + + + + + + + + + + + + + + + + Totals Table + + + + + + + + + + + + + + + + + + + + + + + + + + + + Note //TODO Remove ATP rate? + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/client/src/components/jobs-create-owner-info/jobs-create-owner-info.component.jsx b/client/src/components/jobs-create-owner-info/jobs-create-owner-info.component.jsx index b3de7c85a..d7e96772a 100644 --- a/client/src/components/jobs-create-owner-info/jobs-create-owner-info.component.jsx +++ b/client/src/components/jobs-create-owner-info/jobs-create-owner-info.component.jsx @@ -1,8 +1,13 @@ +import { Col, Row, Typography } from "antd"; import React from "react"; -import { Row, Col, Typography } from "antd"; +import { useTranslation } from "react-i18next"; import JobsCreateOwnerInfoNewComponent from "./jobs-create-owner-info.new.component"; import JobsCreateOwnerInfoSearchComponent from "./jobs-create-owner-info.search.component"; -import { useTranslation } from "react-i18next"; + +const colSpan = { + sm: { span: 24 }, + lg: { span: 12 }, +}; export default function JobsCreateOwnerInfoComponent({ loading, owners }) { const { t } = useTranslation(); @@ -11,15 +16,15 @@ export default function JobsCreateOwnerInfoComponent({ loading, owners }) { {t("jobs.labels.create.ownerinfo")} - - + + - + diff --git a/client/src/components/jobs-create-owner-info/jobs-create-owner-info.container.jsx b/client/src/components/jobs-create-owner-info/jobs-create-owner-info.container.jsx index b0b72d99f..27daef7d5 100644 --- a/client/src/components/jobs-create-owner-info/jobs-create-owner-info.container.jsx +++ b/client/src/components/jobs-create-owner-info/jobs-create-owner-info.container.jsx @@ -1,18 +1,18 @@ -import React, { useContext } from "react"; -import JobsCreateOwnerInfoComponent from "./jobs-create-owner-info.component"; -import JobCreateContext from "../../pages/jobs-create/jobs-create.context"; -import { QUERY_SEARCH_OWNER_BY_IDX } from "../../graphql/owners.queries"; import { useQuery } from "@apollo/react-hooks"; +import React, { useContext } from "react"; +import { QUERY_SEARCH_OWNER_BY_IDX } from "../../graphql/owners.queries"; +import JobCreateContext from "../../pages/jobs-create/jobs-create.context"; import AlertComponent from "../alert/alert.component"; +import JobsCreateOwnerInfoComponent from "./jobs-create-owner-info.component"; export default function JobsCreateOwnerContainer() { const [state] = useContext(JobCreateContext); const { loading, error, data } = useQuery(QUERY_SEARCH_OWNER_BY_IDX, { variables: { search: `%${state.owner.search}%` }, - skip: !state.owner.search + skip: !state.owner.search, }); - if (error) return ; + if (error) return ; return ( + }}> {t("jobs.labels.create.newowner")} - - - - - - - - - - - - - - - - - - - - - + + + + + + + + - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {() => { + return ( + + ); + }} + + + + + + + + + + + + +
); } diff --git a/client/src/components/jobs-create-owner-info/jobs-create-owner-info.search.component.jsx b/client/src/components/jobs-create-owner-info/jobs-create-owner-info.search.component.jsx index 4704fd933..64cecf58a 100644 --- a/client/src/components/jobs-create-owner-info/jobs-create-owner-info.search.component.jsx +++ b/client/src/components/jobs-create-owner-info/jobs-create-owner-info.search.component.jsx @@ -7,12 +7,12 @@ import { alphaSort } from "../../utils/sorters"; export default function JobsCreateOwnerInfoSearchComponent({ loading, - owners + owners, }) { const [state, setState] = useContext(JobCreateContext); const [tableState, setTableState] = useState({ sortedInfo: {}, - filteredInfo: { text: "" } + filteredInfo: { text: "" }, }); const { t } = useTranslation(); @@ -25,7 +25,7 @@ export default function JobsCreateOwnerInfoSearchComponent({ sorter: (a, b) => alphaSort(a.ownr_ln, b.ownr_ln), sortOrder: tableState.sortedInfo.columnKey === "ownr_ln" && - tableState.sortedInfo.order + tableState.sortedInfo.order, }, { title: t("owners.fields.ownr_fn"), @@ -34,7 +34,7 @@ export default function JobsCreateOwnerInfoSearchComponent({ sorter: (a, b) => alphaSort(a.ownr_fn, b.ownr_fn), sortOrder: tableState.sortedInfo.columnKey === "ownr_fn" && - tableState.sortedInfo.order + tableState.sortedInfo.order, }, { title: t("owners.fields.ownr_addr1"), @@ -43,7 +43,7 @@ export default function JobsCreateOwnerInfoSearchComponent({ sorter: (a, b) => alphaSort(a.ownr_addr1, b.ownr_addr1), sortOrder: tableState.sortedInfo.columnKey === "ownr_addr1" && - tableState.sortedInfo.order + tableState.sortedInfo.order, }, { title: t("owners.fields.ownr_city"), @@ -52,7 +52,7 @@ export default function JobsCreateOwnerInfoSearchComponent({ sorter: (a, b) => alphaSort(a.ownr_city, b.ownr_city), sortOrder: tableState.sortedInfo.columnKey === "ownr_city" && - tableState.sortedInfo.order + tableState.sortedInfo.order, }, { title: t("owners.fields.ownr_ea"), @@ -61,7 +61,7 @@ export default function JobsCreateOwnerInfoSearchComponent({ sorter: (a, b) => alphaSort(a.ownr_ea, b.ownr_ea), sortOrder: tableState.sortedInfo.columnKey === "ownr_ea" && - tableState.sortedInfo.order + tableState.sortedInfo.order, }, { title: t("owners.fields.ownr_ph1"), @@ -73,51 +73,54 @@ export default function JobsCreateOwnerInfoSearchComponent({ sorter: (a, b) => alphaSort(a.ownr_ph1, b.ownr_ph1), sortOrder: tableState.sortedInfo.columnKey === "ownr_ph1" && - tableState.sortedInfo.order - } + tableState.sortedInfo.order, + }, ]; const handleTableChange = (pagination, filters, sorter) => { setTableState({ ...tableState, filteredInfo: filters, sortedInfo: sorter }); }; - //TODO Implement searching & pagination return ( { return ( - { - setState({ - ...state, - owner: { ...state.owner, search: value } - }); - }} - enterButton - /> +
+ { + setState({ + ...state, + owner: { ...state.owner, search: value }, + }); + }} + enterButton + /> +
); }} - size="small" + size='small' + scroll={{ x: true }} pagination={{ position: "top" }} - columns={columns.map(item => ({ ...item }))} - rowKey="id" + columns={columns} + rowKey='id' dataSource={owners} onChange={handleTableChange} rowSelection={{ - onSelect: props => { + onSelect: (props) => { setState({ ...state, - owner: { ...state.owner, new: false, selectedid: props.id } + owner: { ...state.owner, new: false, selectedid: props.id }, }); }, type: "radio", - selectedRowKeys: [state.owner.selectedid] + selectedRowKeys: [state.owner.selectedid], }} onRow={(record, rowIndex) => { return { - onClick: event => { + onClick: (event) => { if (record) { if (record.id) { setState({ @@ -125,18 +128,18 @@ export default function JobsCreateOwnerInfoSearchComponent({ owner: { ...state.owner, new: false, - selectedid: record.id - } + selectedid: record.id, + }, }); - + return; } } setState({ ...state, - owner: { ...state.owner, selectedid: null } + owner: { ...state.owner, selectedid: null }, }); - } + }, }; }} /> diff --git a/client/src/components/jobs-create-vehicle-info/jobs-create-vehicle-info.component.jsx b/client/src/components/jobs-create-vehicle-info/jobs-create-vehicle-info.component.jsx index 39b3711a5..c964ffb7c 100644 --- a/client/src/components/jobs-create-vehicle-info/jobs-create-vehicle-info.component.jsx +++ b/client/src/components/jobs-create-vehicle-info/jobs-create-vehicle-info.component.jsx @@ -4,19 +4,24 @@ import { useTranslation } from "react-i18next"; import JobsCreateVehicleInfoNewComponent from "./jobs-create-vehicle-info.new.component"; import JobsCreateVehicleInfoSearchComponent from "./jobs-create-vehicle-info.search.component"; +const colSpan = { + sm: { span: 24 }, + lg: { span: 12 }, +}; + export default function JobsCreateVehicleInfoComponent({ loading, vehicles }) { const { t } = useTranslation(); return (
{t("jobs.labels.create.vehicleinfo")} - -
+ + - + diff --git a/client/src/components/jobs-create-vehicle-info/jobs-create-vehicle-info.container.jsx b/client/src/components/jobs-create-vehicle-info/jobs-create-vehicle-info.container.jsx index 6c899aabd..7cf36b082 100644 --- a/client/src/components/jobs-create-vehicle-info/jobs-create-vehicle-info.container.jsx +++ b/client/src/components/jobs-create-vehicle-info/jobs-create-vehicle-info.container.jsx @@ -9,9 +9,11 @@ export default function JobsCreateVehicleInfoContainer({ form }) { const [state] = useContext(JobCreateContext); const { loading, error, data } = useQuery(SEARCH_VEHICLE_BY_VIN, { variables: { vin: `%${state.vehicle.search}%` }, - skip: !state.vehicle.search + skip: !state.vehicle.search, }); + if (error) return ; + return ( {t("jobs.labels.create.newvehicle")} - - - - - - - - - - - - - - - - - - - - - - - - - - - - { - //TODO Add handling for paint code json - } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); } diff --git a/client/src/components/jobs-create-vehicle-info/jobs-create-vehicle-info.search.component.jsx b/client/src/components/jobs-create-vehicle-info/jobs-create-vehicle-info.search.component.jsx index 0a42d9707..fc770fe1a 100644 --- a/client/src/components/jobs-create-vehicle-info/jobs-create-vehicle-info.search.component.jsx +++ b/client/src/components/jobs-create-vehicle-info/jobs-create-vehicle-info.search.component.jsx @@ -7,12 +7,12 @@ import JobCreateContext from "../../pages/jobs-create/jobs-create.context"; export default function JobsCreateVehicleInfoSearchComponent({ loading, - vehicles + vehicles, }) { const [state, setState] = useContext(JobCreateContext); const [tableState, setTableState] = useState({ sortedInfo: {}, - filteredInfo: { text: "" } + filteredInfo: { text: "" }, }); const { t } = useTranslation(); @@ -28,7 +28,7 @@ export default function JobsCreateVehicleInfoSearchComponent({ tableState.sortedInfo.order, render: (text, record) => ( {record.v_vin} - ) + ), }, { title: t("vehicles.fields.description"), @@ -38,7 +38,7 @@ export default function JobsCreateVehicleInfoSearchComponent({ return ( {`${record.v_model_yr} ${record.v_make_desc} ${record.v_model_desc} ${record.v_color}`} ); - } + }, }, { title: t("vehicles.fields.plate_no"), @@ -46,56 +46,59 @@ export default function JobsCreateVehicleInfoSearchComponent({ key: "plate", render: (text, record) => { return {`${record.plate_st} | ${record.plate_no}`}; - } - } + }, + }, ]; const handleTableChange = (pagination, filters, sorter) => { setTableState({ ...tableState, filteredInfo: filters, sortedInfo: sorter }); }; - //TODO Implement searching & pagination return (
{ return ( - { - setState({ - ...state, - vehicle: { ...state.vehicle, search: value } - }); - }} - enterButton - /> +
+ { + setState({ + ...state, + vehicle: { ...state.vehicle, search: value }, + }); + }} + enterButton + /> +
); }} - size="small" + size='small' + scroll={{ x: true }} pagination={{ position: "top" }} - columns={columns.map(item => ({ ...item }))} - rowKey="id" + columns={columns} + rowKey='id' dataSource={vehicles} onChange={handleTableChange} rowSelection={{ - onSelect: props => { + onSelect: (props) => { setState({ ...state, vehicle: { ...state.vehicle, new: false, selectedid: props.id, - vehicleObj: props - } + vehicleObj: props, + }, }); }, type: "radio", - selectedRowKeys: [state.vehicle.selectedid] + selectedRowKeys: [state.vehicle.selectedid], }} onRow={(record, rowIndex) => { return { - onClick: event => { + onClick: (event) => { if (record) { if (record.id) { setState({ @@ -104,8 +107,8 @@ export default function JobsCreateVehicleInfoSearchComponent({ ...state.vehicle, new: false, selectedid: record.id, - vehicleObj: record - } + vehicleObj: record, + }, }); return; @@ -113,9 +116,9 @@ export default function JobsCreateVehicleInfoSearchComponent({ } setState({ ...state, - vehicle: { ...state.vehicle, selectedid: null, vehicleObj: null } + vehicle: { ...state.vehicle, selectedid: null, vehicleObj: null }, }); - } + }, }; }} /> diff --git a/client/src/components/jobs-detail-claims/jobs-detail-claims.component.jsx b/client/src/components/jobs-detail-claims/jobs-detail-claims.component.jsx index 0e5078cb3..edd972df7 100644 --- a/client/src/components/jobs-detail-claims/jobs-detail-claims.component.jsx +++ b/client/src/components/jobs-detail-claims/jobs-detail-claims.component.jsx @@ -1,48 +1,66 @@ -import { Form, Input, Switch } from "antd"; +import { Form, Input, InputNumber, Switch, Select } from "antd"; import React from "react"; import { useTranslation } from "react-i18next"; +import FormRow from "../layout-form-row/layout-form-row.component"; -export default function JobsDetailClaims({ job }) { +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +const mapStateToProps = createStructuredSelector({ + //currentUser: selectCurrentUser + bodyshop: selectBodyshop, +}); +const mapDispatchToProps = (dispatch) => ({ + //setUserLanguage: language => dispatch(setUserLanguage(language)) +}); + +export function JobsDetailClaims({ bodyshop, job }) { const { t } = useTranslation(); return (
- - - - - - - TODO How to handle different taxes and marking them as exempt? - { - // - // {getFieldDecorator("exempt", { - // initialValue: job.exempt - // })()} - // - } - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + - +
); } +export default connect(mapStateToProps, mapDispatchToProps)(JobsDetailClaims); diff --git a/client/src/components/jobs-detail-dates/jobs-detail-dates.component.jsx b/client/src/components/jobs-detail-dates/jobs-detail-dates.component.jsx index e2c033f05..6ebd69d3d 100644 --- a/client/src/components/jobs-detail-dates/jobs-detail-dates.component.jsx +++ b/client/src/components/jobs-detail-dates/jobs-detail-dates.component.jsx @@ -1,79 +1,78 @@ -import { DatePicker, Form } from "antd"; +import { Form } from "antd"; import React from "react"; import { useTranslation } from "react-i18next"; +import DateTimePicker from "../form-date-time-picker/form-date-time-picker.component"; +import FormRow from "../layout-form-row/layout-form-row.component"; +import FormDatePicker from "../form-date-picker/form-date-picker.component"; export default function JobsDetailDatesComponent({ job }) { const { t } = useTranslation(); - // initialValue: job.loss_date ? moment(job.loss_date) : null - // initialValue: job.date_estimated ? moment(job.date_estimated) : null - // initialValue: job.date_open ? moment(job.date_open) : null - // initialValue: job.date_scheduled ? moment(job.date_scheduled) : null - // initialValue: job.scheduled_in ? moment(job.scheduled_in) : null - // initialValue: job.actual_in ? moment(job.actual_in) : null - // initialValue: job.scheduled_completion ? moment(job.scheduled_completion) : null - // initialValue: job.actual_completion ? moment(job.actual_completion) : null - // initialValue: job.scheduled_delivery ? moment(job.scheduled_delivery) : null - // initialValue: job.actual_delivery ? moment(job.actual_delivery) : null - // initialValue: job.date_invoiced ? moment(job.date_invoiced) : null - // initialValue: job.date_closed ? moment(job.date_closed) : null - // initialValue: job.date_exported ? moment(job.date_exported) : null - return (
- - - - CAA # seems not correct based on field mapping Class seems not correct - based on field mapping - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
); } diff --git a/client/src/components/jobs-detail-financial/jobs-detail-financial.component.jsx b/client/src/components/jobs-detail-financial/jobs-detail-financial.component.jsx index 8b5a820cd..defe02ec8 100644 --- a/client/src/components/jobs-detail-financial/jobs-detail-financial.component.jsx +++ b/client/src/components/jobs-detail-financial/jobs-detail-financial.component.jsx @@ -1,139 +1,215 @@ -import { Divider, Form, Input, InputNumber, Row, Col } from "antd"; +import { Col, Divider, Form, Row, Select } from "antd"; import React from "react"; import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +import CurrencyFormatter from "../../utils/CurrencyFormatter"; +import { DateTimeFormatter } from "../../utils/DateFormatter"; +import CurrencyInput from "../form-items-formatted/currency-form-item.component"; import JobTotalsTable from "../job-totals-table/job-totals-table.component"; +import FormRow from "../layout-form-row/layout-form-row.component"; -export default function JobsDetailFinancials({ job }) { +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, +}); + +const stripeTestEnv = process.env.REACT_APP_STRIPE_PUBLIC_KEY; //.includes("test"); + +export function JobsDetailFinancials({ job, bodyshop }) { const { t } = useTranslation(); + const colSpan = { + sm: { span: 24 }, + lg: { span: 12 }, + }; + return ( - -
- - - - - - - - - - TODO This is equivalent of GST payable. - - - - TODO equivalent of other customer amount - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Note //TODO Remove ATP rate? - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
+ +
+ +
+ + + + + + + + + + + + + {job.payments.map((p, idx) => ( + + + + + + + + + + ))} + +
{t("payments.fields.created_at")}{t("payments.fields.payer")}{t("payments.fields.amount")}{t("payments.fields.memo")}{t("payments.fields.type")}{t("payments.fields.transactionid")}{t("payments.fields.stripeid")}
+ {p.created_at} + {p.payer} + {p.amount} + {p.memo}{p.type}{p.transactionid} + {p.stripeid ? ( + + {p.stripeid} + + ) : null} +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); } +export default connect(mapStateToProps, null)(JobsDetailFinancials); diff --git a/client/src/components/jobs-detail-header-actions/jobs-detail-header-actions.addtoproduction.util.jsx b/client/src/components/jobs-detail-header-actions/jobs-detail-header-actions.addtoproduction.util.jsx new file mode 100644 index 000000000..4d23ac53f --- /dev/null +++ b/client/src/components/jobs-detail-header-actions/jobs-detail-header-actions.addtoproduction.util.jsx @@ -0,0 +1,36 @@ +import { notification } from "antd"; +import i18n from "i18next"; +import { UPDATE_JOB } from "../../graphql/jobs.queries"; +import { logImEXEvent } from "../../firebase/firebase.utils"; + +export default function AddToProduction( + apolloClient, + jobId, + completionCallback +) { + logImEXEvent("job_add_to_production"); + + //get a list of all fields on the job + apolloClient + .mutate({ + mutation: UPDATE_JOB, + variables: { jobId: jobId, job: { inproduction: true } }, + }) + .then((res) => { + notification["success"]({ + message: i18n.t("jobs.successes.addedtoproduction"), + }); + if (completionCallback) completionCallback(); + }) + .catch((error) => { + notification["errors"]({ + message: i18n.t("jobs.errors.addingtoproduction", { + error: JSON.stringify(error), + }), + }); + }); + + //insert the new job. call the callback with the returned ID when done. + + return; +} diff --git a/client/src/components/jobs-detail-header-actions/jobs-detail-header-actions.component.jsx b/client/src/components/jobs-detail-header-actions/jobs-detail-header-actions.component.jsx index 164c96c3c..a05bb03db 100644 --- a/client/src/components/jobs-detail-header-actions/jobs-detail-header-actions.component.jsx +++ b/client/src/components/jobs-detail-header-actions/jobs-detail-header-actions.component.jsx @@ -1,44 +1,98 @@ -import React from "react"; -import { Menu, Dropdown, Button, Popconfirm } from "antd"; -import { useTranslation } from "react-i18next"; import { DownCircleFilled } from "@ant-design/icons"; -import { Link } from "react-router-dom"; -import DuplicateJob from "./jobs-detail-header-actions.duplicate"; import { useApolloClient } from "@apollo/react-hooks"; - +import { Button, Dropdown, Menu, Popconfirm } from "antd"; +import React from "react"; +import { useTranslation } from "react-i18next"; import { connect } from "react-redux"; +import { Link, useHistory } from "react-router-dom"; import { createStructuredSelector } from "reselect"; +import { setModalContext } from "../../redux/modals/modals.actions"; import { selectBodyshop } from "../../redux/user/user.selectors"; -import { useHistory } from "react-router-dom"; +import AddToProduction from "./jobs-detail-header-actions.addtoproduction.util"; +import JobsDetaiLheaderCsi from "./jobs-detail-header-actions.csi.component"; +import DuplicateJob from "./jobs-detail-header-actions.duplicate.util"; +import { logImEXEvent } from "../../firebase/firebase.utils"; + const mapStateToProps = createStructuredSelector({ - //currentUser: selectCurrentUser bodyshop: selectBodyshop, }); + const mapDispatchToProps = (dispatch) => ({ - //setUserLanguage: language => dispatch(setUserLanguage(language)) + setScheduleContext: (context) => + dispatch(setModalContext({ context: context, modal: "schedule" })), + setInvoiceEnterContext: (context) => + dispatch(setModalContext({ context: context, modal: "invoiceEnter" })), + setPaymentContext: (context) => + dispatch(setModalContext({ context: context, modal: "payment" })), + setJobCostingContext: (context) => + dispatch(setModalContext({ context: context, modal: "jobCosting" })), }); -export function JobsDetailHeaderActions({ job, bodyshop }) { +export function JobsDetailHeaderActions({ + job, + bodyshop, + refetch, + setScheduleContext, + setInvoiceEnterContext, + setPaymentContext, + setJobCostingContext, +}) { const { t } = useTranslation(); const client = useApolloClient(); const history = useHistory(); const statusmenu = ( - - + + { + logImEXEvent("job_header_schedule"); + + setScheduleContext({ + actions: { refetch: refetch }, + context: { + jobId: job.id, + job: job, + }, + }); + }}> + {t("jobs.actions.schedule")} + + + + {t("jobs.actions.intake")} + + + { + logImEXEvent("job_header_enter_payment"); + + setPaymentContext({ + actions: {}, + context: { jobId: job.id }, + }); + }}> + {t("menus.header.enterpayment")} + + + }}> {t("menus.jobsactions.newcccontract")} - + AddToProduction(client, job.id, refetch)}> + {t("jobs.actions.addtoproduction")} + + e.stopPropagation()} onConfirm={() => DuplicateJob( @@ -50,15 +104,55 @@ export function JobsDetailHeaderActions({ job, bodyshop }) { } ) } - getPopupContainer={(trigger) => trigger.parentNode} - > + getPopupContainer={(trigger) => trigger.parentNode}> {t("menus.jobsactions.duplicate")} + { + logImEXEvent("job_header_enter_invoice"); + + setInvoiceEnterContext({ + actions: { refetch: refetch }, + context: { + job: job, + }, + }); + }}> + {t("jobs.actions.postInvoices")} + + + + {t("menus.jobsactions.closejob")} + + + + { + logImEXEvent("job_header_job_costing"); + + setJobCostingContext({ + actions: { refetch: refetch }, + context: { + jobId: job.id, + }, + }); + }}> + {t("jobs.labels.jobcosting")} + ); return ( - + diff --git a/client/src/components/jobs-detail-header-actions/jobs-detail-header-actions.csi.component.jsx b/client/src/components/jobs-detail-header-actions/jobs-detail-header-actions.csi.component.jsx new file mode 100644 index 000000000..6cecc1ff2 --- /dev/null +++ b/client/src/components/jobs-detail-header-actions/jobs-detail-header-actions.csi.component.jsx @@ -0,0 +1,135 @@ +import { useMutation, useApolloClient } from "@apollo/react-hooks"; +import { Menu, notification } from "antd"; +import React from "react"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { + INSERT_CSI, + GET_CURRENT_QUESTIONSET_ID, +} from "../../graphql/csi.queries"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +import { setEmailOptions } from "../../redux/email/email.actions"; +import { TemplateList } from "../../utils/TemplateConstants"; +import { logImEXEvent } from "../../firebase/firebase.utils"; +import { DateTimeFormatter } from "../../utils/DateFormatter"; +import { Link } from "react-router-dom"; + +const mapStateToProps = createStructuredSelector({ + //currentUser: selectCurrentUser' + bodyshop: selectBodyshop, +}); +const mapDispatchToProps = (dispatch) => ({ + setEmailOptions: (e) => dispatch(setEmailOptions(e)), +}); + +export function JobsDetailHeaderCsi({ + setEmailOptions, + bodyshop, + job, + ...props +}) { + const { t } = useTranslation(); + const [insertCsi] = useMutation(INSERT_CSI); + const client = useApolloClient(); + + const handleCreateCsi = async (e) => { + logImEXEvent("job_create_csi"); + + const questionSetResult = await client.query({ + query: GET_CURRENT_QUESTIONSET_ID, + }); + + if (questionSetResult.data.csiquestions.length > 0) { + const result = await insertCsi({ + variables: { + csiInput: { + jobid: job.id, + bodyshopid: bodyshop.id, + questionset: questionSetResult.data.csiquestions[0].id, + relateddata: { + job: { + id: job.id, + ownr_fn: job.ownr_fn, + ro_number: job.ro_number, + v_model_yr: job.v_model_yr, + v_make_desc: job.v_make_desc, + v_model_desc: job.v_model_desc, + }, + bodyshop: { + city: bodyshop.city, + email: bodyshop.email, + state: bodyshop.state, + country: bodyshop.country, + address1: bodyshop.address1, + address2: bodyshop.address2, + shopname: bodyshop.shopname, + zip_post: bodyshop.zip_post, + logo_img_path: bodyshop.logo_img_path, + }, + }, + }, + }, + }); + + if (!!!result.errors) { + notification["success"]({ message: t("csi.successes.created") }); + } else { + notification["error"]({ + message: t("csi.errors.creating", { + message: JSON.stringify(result.errors), + }), + }); + return; + } + if (e.key === "email") + setEmailOptions({ + messageOptions: { + to: [job.ownr_ea], + replyTo: bodyshop.email, + }, + template: { + name: TemplateList.csi_invitation.key, + variables: { + id: result.data.insert_csi.returning[0].id, + }, + }, + }); + + if (e.key === "text") console.log("TODO Handling texting"); //TODO Implement texting. + } else { + notification["error"]({ + message: t("csi.errors.notconfigured"), + }); + } + }; + + return ( + + + {t("general.labels.email")} + + + {t("general.labels.text")} + + + {job.csiinvites.map((item, idx) => ( + + + {item.completedon} + + + ))} + + ); +} +export default connect( + mapStateToProps, + mapDispatchToProps +)(JobsDetailHeaderCsi); diff --git a/client/src/components/jobs-detail-header-actions/jobs-detail-header-actions.duplicate.js b/client/src/components/jobs-detail-header-actions/jobs-detail-header-actions.duplicate.util.js similarity index 92% rename from client/src/components/jobs-detail-header-actions/jobs-detail-header-actions.duplicate.js rename to client/src/components/jobs-detail-header-actions/jobs-detail-header-actions.duplicate.util.js index 43cf3b477..d405da441 100644 --- a/client/src/components/jobs-detail-header-actions/jobs-detail-header-actions.duplicate.js +++ b/client/src/components/jobs-detail-header-actions/jobs-detail-header-actions.duplicate.util.js @@ -2,6 +2,7 @@ import { QUERY_ALL_JOB_FIELDS, INSERT_NEW_JOB, } from "../../graphql/jobs.queries"; +import { logImEXEvent } from "../../firebase/firebase.utils"; export default function DuplicateJob( apolloClient, @@ -9,6 +10,8 @@ export default function DuplicateJob( config, completionCallback ) { + logImEXEvent("job_duplicate"); + const { defaultOpenStatus } = config; //get a list of all fields on the job apolloClient diff --git a/client/src/components/jobs-detail-header/jobs-detail-header.component.jsx b/client/src/components/jobs-detail-header/jobs-detail-header.component.jsx index 0678c2622..3904127fa 100644 --- a/client/src/components/jobs-detail-header/jobs-detail-header.component.jsx +++ b/client/src/components/jobs-detail-header/jobs-detail-header.component.jsx @@ -1,7 +1,5 @@ -import { DownCircleFilled } from "@ant-design/icons"; +import { DownCircleFilled, PrinterFilled } from "@ant-design/icons"; import { - Avatar, - Badge, Button, Checkbox, Descriptions, @@ -17,155 +15,164 @@ import Moment from "react-moment"; import { connect } from "react-redux"; import { Link } from "react-router-dom"; import { createStructuredSelector } from "reselect"; -import CarImage from "../../assets/car.svg"; +import { setModalContext } from "../../redux/modals/modals.actions"; import { selectBodyshop } from "../../redux/user/user.selectors"; import CurrencyFormatter from "../../utils/CurrencyFormatter"; -import BarcodePopup from "../barcode-popup/barcode-popup.component"; +import JobsDetailHeaderActions from "../jobs-detail-header-actions/jobs-detail-header-actions.component"; import OwnerTagPopoverComponent from "../owner-tag-popover/owner-tag-popover.component"; import VehicleTagPopoverComponent from "../vehicle-tag-popover/vehicle-tag-popover.component"; -import JobsDetailHeaderActions from "../jobs-detail-header-actions/jobs-detail-header-actions.component"; -import { setModalContext } from "../../redux/modals/modals.actions"; +import JobEmployeeAssignments from "../job-employee-assignments/job-employee-assignments.container"; +import "./jobs-detail-header.styles.scss"; + const mapStateToProps = createStructuredSelector({ bodyshop: selectBodyshop, }); + const mapDispatchToProps = (dispatch) => ({ - setScheduleContext: (context) => - dispatch(setModalContext({ context: context, modal: "schedule" })), + setPrintCenterContext: (context) => + dispatch(setModalContext({ context: context, modal: "printCenter" })), }); export function JobsDetailHeader({ job, mutationConvertJob, refetch, - + setPrintCenterContext, bodyshop, updateJobStatus, setScheduleContext, }) { const { t } = useTranslation(); - const tombstoneTitle = ( -
- - {job.ro_number - ? `${t("jobs.fields.ro_number")} ${job.ro_number}` - : `EST-${job.est_number}`} -
- ); - const statusmenu = ( { updateJobStatus(e.key); - }} - > + }}> {bodyshop.md_ro_statuses.statuses.map((item) => ( {item} ))} ); - const menuExtra = [ - - - , - + const menuExtra = ( +
+ + + + - , - , - , - , - ]; + }}> + {t("jobs.actions.convert")} + + + +
+ ); return ( - {job.status ? {job.status} : null} - - - - + title={ + job.ro_number + ? `${t("jobs.fields.ro_number")} ${job.ro_number}` + : `${t("jobs.fields.est_number")} ${job.est_number}` } - extra={menuExtra} - > - - + subTitle={job.status} + tags={[ + , + , + + {t("jobs.labels.inproduction")} + , + ]} + extra={menuExtra}> + + {job.clm_total} + key='custowing' + label={t("jobs.fields.customerowing")}> {job.owner_owing} + key='scp' + label={t("jobs.fields.specialcoveragepolicy")}> + key='sched_comp' + label={t("jobs.fields.scheduled_completion")}> {job.scheduled_completion ? ( - {job.scheduled_completion} + {job.scheduled_completion} ) : null} - + {job.cccontracts && job.cccontracts.map((item) => ( + to={`/manage/courtesycars/contracts/${item.id}`}>
{`${item.agreementnumber} - ${item.start} - ${item.scheduledreturn}`}
))}
+ + +
); diff --git a/client/src/components/jobs-detail-header/jobs-detail-header.styles.scss b/client/src/components/jobs-detail-header/jobs-detail-header.styles.scss new file mode 100644 index 000000000..a32de8846 --- /dev/null +++ b/client/src/components/jobs-detail-header/jobs-detail-header.styles.scss @@ -0,0 +1,8 @@ +.jobs-title-container { + display: block; +} + +.jobs-subtitle-tags { + display: flex; + flex-wrap: wrap; +} diff --git a/client/src/components/jobs-detail-insurance/jobs-detail-insurance.component.jsx b/client/src/components/jobs-detail-insurance/jobs-detail-insurance.component.jsx index 4fb2f4e14..6c2694a5a 100644 --- a/client/src/components/jobs-detail-insurance/jobs-detail-insurance.component.jsx +++ b/client/src/components/jobs-detail-insurance/jobs-detail-insurance.component.jsx @@ -1,117 +1,138 @@ -import { DatePicker, Divider, Form, Input } from "antd"; +import { Form, Input } from "antd"; import React from "react"; import { useTranslation } from "react-i18next"; +import FormDatePicker from "../form-date-picker/form-date-picker.component"; import FormItemEmail from "../form-items-formatted/email-form-item.component"; import FormItemPhone from "../form-items-formatted/phone-form-item.component"; +import Car from "../job-damage-visual/job-damage-visual.component"; +import FormRow from "../layout-form-row/layout-form-row.component"; export default function JobsDetailInsurance({ job, form }) { const { getFieldValue } = form; const { t } = useTranslation(); - //initialValue: job.loss_date ? moment(job.loss_date) : null return (
- - - - - - - - - - - - - TODO: missing KOL field??? - - - - DAMAGE {JSON.stringify(job.area_of_damage)} - CAA # seems not correct based on field mapping Class seems not correct - based on field mapping - - - - - - - - - - - - - - - - - - - - - - - Appraiser Info - - - - - - - - - - TODO: Field is pay date but title is inspection date. Likely incorrect? - - - - - - - - - - - - - - - - - - - - - - TODO: Adding servicing/selling dealer contact info? + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ {job.area_of_damage ? ( + + ) : ( + t("jobs.errors.nodamage") + )} +
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + TODO: Adding servicing/selling dealer contact info? +
); } diff --git a/client/src/components/jobs-detail-labor/jobs-detail-labor.component.jsx b/client/src/components/jobs-detail-labor/jobs-detail-labor.component.jsx index e7e6aea22..93ded43a6 100644 --- a/client/src/components/jobs-detail-labor/jobs-detail-labor.component.jsx +++ b/client/src/components/jobs-detail-labor/jobs-detail-labor.component.jsx @@ -3,19 +3,23 @@ import LaborAllocationsTableComponent from "../labor-allocations-table/labor-all import TimeTicketEnterButton from "../time-ticket-enter-button/time-ticket-enter-button.component"; import TimeTicketList from "../time-ticket-list/time-ticket-list.component"; import { useTranslation } from "react-i18next"; + export default function JobsDetailLaborContainer({ jobId, joblines, timetickets, refetch, loading, + techConsole, }) { const { t } = useTranslation(); return (
- - {t("timetickets.actions.enter")} - + {techConsole ? null : ( + + {t("timetickets.actions.enter")} + + )}
); diff --git a/client/src/components/jobs-detail-labor/jobs-detail-labor.container.jsx b/client/src/components/jobs-detail-labor/jobs-detail-labor.container.jsx index 51f631a26..22c4f16d7 100644 --- a/client/src/components/jobs-detail-labor/jobs-detail-labor.container.jsx +++ b/client/src/components/jobs-detail-labor/jobs-detail-labor.container.jsx @@ -4,7 +4,7 @@ import { GET_LINE_TICKET_BY_PK } from "../../graphql/jobs-lines.queries"; import AlertComponent from "../alert/alert.component"; import JobsDetailLaborComponent from "./jobs-detail-labor.component"; -export default function JobsDetailLaborContainer({ jobId }) { +export default function JobsDetailLaborContainer({ jobId, techConsole }) { const { loading, error, data, refetch } = useQuery(GET_LINE_TICKET_BY_PK, { variables: { id: jobId }, skip: !!!jobId, @@ -19,6 +19,7 @@ export default function JobsDetailLaborContainer({ jobId }) { timetickets={data ? data.timetickets : []} joblines={data ? data.joblines : []} refetch={refetch} + techConsole={techConsole} /> ); } diff --git a/client/src/components/jobs-detail-pli/jobs-detail-pli.component.jsx b/client/src/components/jobs-detail-pli/jobs-detail-pli.component.jsx index ae26ad764..469e625a7 100644 --- a/client/src/components/jobs-detail-pli/jobs-detail-pli.component.jsx +++ b/client/src/components/jobs-detail-pli/jobs-detail-pli.component.jsx @@ -1,48 +1,65 @@ -import { Button } from "antd"; +import { Col, Row } from "antd"; import React from "react"; -import { connect } from "react-redux"; -import { setModalContext } from "../../redux/modals/modals.actions"; import AlertComponent from "../alert/alert.component"; import InvoicesListTableComponent from "../invoices-list-table/invoices-list-table.component"; +import JobInvoicesTotalsComponent from "../job-invoices-total/job-invoices-total.component"; +import PartsOrderModal from "../parts-order-modal/parts-order-modal.container"; +import PartsOrderListTableComponent from "../parts-order-list-table/parts-order-list-table.component"; +const tableCol = { + xs: { + span: 24, + }, + md: { + span: 20, + }, +}; -const mapDispatchToProps = (dispatch) => ({ - setInvoiceEnterContext: (context) => - dispatch(setModalContext({ context: context, modal: "invoiceEnter" })), -}); +const totalsCol = { + xs: { + span: 24, + }, + md: { + span: 4, + }, +}; -export function JobsDetailPliComponent({ - setInvoiceEnterContext, +export default function JobsDetailPliComponent({ job, invoicesQuery, - handleOnRowClick, + handleInvoiceOnRowClick, + handlePartsOrderOnRowClick, selectedInvoice, }) { return (
- + {invoicesQuery.error ? ( ) : null} - + + + + + + + + +
); } - -export default connect(null, mapDispatchToProps)(JobsDetailPliComponent); diff --git a/client/src/components/jobs-detail-pli/jobs-detail-pli.container.jsx b/client/src/components/jobs-detail-pli/jobs-detail-pli.container.jsx index 9a36680a8..ef57ff939 100644 --- a/client/src/components/jobs-detail-pli/jobs-detail-pli.container.jsx +++ b/client/src/components/jobs-detail-pli/jobs-detail-pli.container.jsx @@ -1,9 +1,9 @@ -import React from "react"; import { useQuery } from "@apollo/react-hooks"; -import JobsDetailPliComponent from "./jobs-detail-pli.component"; -import { QUERY_INVOICES_BY_JOBID } from "../../graphql/invoices.queries"; -import { useHistory, useLocation } from "react-router-dom"; import queryString from "query-string"; +import React from "react"; +import { useHistory, useLocation } from "react-router-dom"; +import { QUERY_INVOICES_BY_JOBID } from "../../graphql/invoices.queries"; +import JobsDetailPliComponent from "./jobs-detail-pli.component"; export default function JobsDetailPliContainer({ job }) { const invoicesQuery = useQuery(QUERY_INVOICES_BY_JOBID, { @@ -13,7 +13,7 @@ export default function JobsDetailPliContainer({ job }) { const search = queryString.parse(useLocation().search); const history = useHistory(); - const handleOnRowClick = (record) => { + const handleInvoiceOnRowClick = (record) => { if (record) { if (record.id) { search.invoiceid = record.id; @@ -25,12 +25,24 @@ export default function JobsDetailPliContainer({ job }) { } }; + const handlePartsOrderOnRowClick = (record) => { + if (record) { + if (record.id) { + search.partsorderid = record.id; + history.push({ search: queryString.stringify(search) }); + } + } else { + delete search.partsorderid; + history.push({ search: queryString.stringify(search) }); + } + }; + return ( ); } diff --git a/client/src/components/jobs-documents-gallery/jobs-document-gallery.download.component.jsx b/client/src/components/jobs-documents-gallery/jobs-document-gallery.download.component.jsx index 30b64f26d..1229947a3 100644 --- a/client/src/components/jobs-documents-gallery/jobs-document-gallery.download.component.jsx +++ b/client/src/components/jobs-documents-gallery/jobs-document-gallery.download.component.jsx @@ -2,11 +2,14 @@ import { Button } from "antd"; import axios from "axios"; import React from "react"; import { useTranslation } from "react-i18next"; +import { logImEXEvent } from "../../firebase/firebase.utils"; export default function JobsDocumentsDownloadButton({ galleryImages }) { const { t } = useTranslation(); const imagesToDownload = galleryImages.filter((image) => image.isSelected); - const handleDelete = () => { + const handleDownload = () => { + logImEXEvent("jobs_documents_download"); + axios .post("/media/download", { ids: imagesToDownload.map((_) => _.key), @@ -17,7 +20,7 @@ export default function JobsDocumentsDownloadButton({ galleryImages }) { }; return ( - ); diff --git a/client/src/components/jobs-documents-gallery/jobs-documents-gallery.component.jsx b/client/src/components/jobs-documents-gallery/jobs-documents-gallery.component.jsx index 3ec6d4f6b..0dee000f3 100644 --- a/client/src/components/jobs-documents-gallery/jobs-documents-gallery.component.jsx +++ b/client/src/components/jobs-documents-gallery/jobs-documents-gallery.component.jsx @@ -4,7 +4,13 @@ import DocumentsUploadContainer from "../documents-upload/documents-upload.conta import JobsDocumentsDownloadButton from "./jobs-document-gallery.download.component"; import JobsDocumentsDeleteButton from "./jobs-documents-gallery.delete.component"; -function JobsDocumentsComponent({ data, jobId, refetch }) { +function JobsDocumentsComponent({ + data, + jobId, + refetch, + invoiceId, + invoicesCallback, +}) { const [galleryImages, setgalleryImages] = useState([]); useEffect(() => { @@ -12,7 +18,7 @@ function JobsDocumentsComponent({ data, jobId, refetch }) { data.reduce((acc, value) => { acc.push({ src: `${process.env.REACT_APP_CLOUDINARY_IMAGE_ENDPOINT}/${value.key}.jpg`, - thumbnail: `${process.env.REACT_APP_CLOUDINARY_IMAGE_ENDPOINT}/h_200,w_200,c_thumb/${value.key}.jpg`, + thumbnail: `${process.env.REACT_APP_CLOUDINARY_IMAGE_ENDPOINT}/${process.env.REACT_APP_CLOUDINARY_THUMB_TRANSFORMATIONS}/${value.key}.jpg`, tags: value.type.includes("pdf") ? [{ value: "PDF", title: "PDF" }] : [], @@ -28,17 +34,18 @@ function JobsDocumentsComponent({ data, jobId, refetch }) { }, [data, setgalleryImages]); return ( -
+
; if (error) return ; - return ; + return ( + + ); } diff --git a/client/src/components/jobs-documents-gallery/jobs-documents-gallery.delete.component.jsx b/client/src/components/jobs-documents-gallery/jobs-documents-gallery.delete.component.jsx index 863e06b8a..7142170f0 100644 --- a/client/src/components/jobs-documents-gallery/jobs-documents-gallery.delete.component.jsx +++ b/client/src/components/jobs-documents-gallery/jobs-documents-gallery.delete.component.jsx @@ -1,9 +1,10 @@ import { Button, notification } from "antd"; -import React from "react"; +import React, { useState } from "react"; import { useTranslation } from "react-i18next"; import axios from "axios"; import { useMutation } from "@apollo/react-hooks"; import { DELETE_DOCUMENT } from "../../graphql/documents.queries"; +import { logImEXEvent } from "../../firebase/firebase.utils"; export default function JobsDocumentsDeleteButton({ galleryImages, @@ -12,7 +13,10 @@ export default function JobsDocumentsDeleteButton({ const { t } = useTranslation(); const [deleteDocument] = useMutation(DELETE_DOCUMENT); const imagesToDelete = galleryImages.filter((image) => image.isSelected); + const [loading, setLoading] = useState(false); const handleDelete = () => { + logImEXEvent("job_documents_delete", { count: imagesToDelete.length }); + setLoading(true); imagesToDelete.forEach((image) => { let timestamp = Math.floor(Date.now() / 1000); let public_id = image.key; @@ -62,10 +66,15 @@ export default function JobsDocumentsDeleteButton({ }); }); }); + setLoading(false); }; return ( - ); diff --git a/client/src/components/jobs-export-all-button/jobs-export-all-button.component.jsx b/client/src/components/jobs-export-all-button/jobs-export-all-button.component.jsx new file mode 100644 index 000000000..f62acd956 --- /dev/null +++ b/client/src/components/jobs-export-all-button/jobs-export-all-button.component.jsx @@ -0,0 +1,132 @@ +import { useMutation } from "@apollo/react-hooks"; +import { Button, notification } from "antd"; +import axios from "axios"; +import React, { useState } from "react"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { auth, logImEXEvent } from "../../firebase/firebase.utils"; +import { UPDATE_JOBS } from "../../graphql/jobs.queries"; +import { selectBodyshop } from "../../redux/user/user.selectors"; + +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, +}); + +export function JobsExportAllButton({ + bodyshop, + jobIds, + disabled, + loadingCallback, + completedCallback, +}) { + const { t } = useTranslation(); + const [updateJob] = useMutation(UPDATE_JOBS); + const [loading, setLoading] = useState(false); + const handleQbxml = async () => { + logImEXEvent("jobs_export_all"); + + setLoading(true); + let QbXmlResponse; + try { + QbXmlResponse = await axios.post( + "/accounting/qbxml/receivables", + { jobIds: jobIds }, + { + headers: { + Authorization: `Bearer ${await auth.currentUser.getIdToken(true)}`, + }, + } + ); + console.log("handle -> XML", QbXmlResponse); + } catch (error) { + console.log("Error getting QBXML from Server.", error); + notification["error"]({ + message: t("jobs.errors.exporting", { + error: "Unable to retrieve QBXML. " + JSON.stringify(error.message), + }), + }); + setLoading(false); + return; + } + + let PartnerResponse; + try { + PartnerResponse = await axios.post( + "http://localhost:1337/qb/", + // "http://609feaeae986.ngrok.io/qb/", + QbXmlResponse.data, + { + headers: { + Authorization: `Bearer ${await auth.currentUser.getIdToken(true)}`, + }, + } + ); + } catch (error) { + console.log("Error connecting to quickbooks or partner.", error); + notification["error"]({ + message: t("jobs.errors.exporting-partner"), + }); + setLoading(false); + return; + } + + console.log("PartnerResponse", PartnerResponse); + + //Check to see if any of them failed. If they didn't don't execute the update. + const failedTransactions = PartnerResponse.data.filter((r) => !r.success); + const successfulTransactions = PartnerResponse.data.filter( + (r) => r.success + ); + if (failedTransactions.length > 0) { + //Uh oh. At least one was no good. + failedTransactions.map((ft) => + notification["error"]({ + message: t("jobs.errors.exporting", { + error: ft.errorMessage || "", + }), + }) + ); + } + if (successfulTransactions.length > 0) { + const jobUpdateResponse = await updateJob({ + variables: { + jobIds: successfulTransactions.map((st) => st.id), + job: { + status: bodyshop.md_ro_statuses.default_exported || "Exported*", + date_exported: new Date(), + }, + }, + }); + + if (!!!jobUpdateResponse.errors) { + notification["success"]({ + message: t("jobs.successes.exported"), + }); + } else { + notification["error"]({ + message: t("jobs.errors.exporting", { + error: JSON.stringify(jobUpdateResponse.error), + }), + }); + } + } + //Set the list of selected invoices to be nothing. + if (!!completedCallback) completedCallback([]); + if (!!loadingCallback) loadingCallback(false); + setLoading(false); + }; + + return ( + + ); +} + +export default connect(mapStateToProps, null)(JobsExportAllButton); diff --git a/client/src/components/jobs-find-modal/jobs-find-modal.component.jsx b/client/src/components/jobs-find-modal/jobs-find-modal.component.jsx index df454863e..3f01e7157 100644 --- a/client/src/components/jobs-find-modal/jobs-find-modal.component.jsx +++ b/client/src/components/jobs-find-modal/jobs-find-modal.component.jsx @@ -1,4 +1,5 @@ -import { Checkbox, Divider, Table } from "antd"; +import { SyncOutlined } from "@ant-design/icons"; +import { Checkbox, Divider, Input, Table, Button } from "antd"; import React from "react"; import { useTranslation } from "react-i18next"; import { Link } from "react-router-dom"; @@ -9,12 +10,14 @@ export default function JobsFindModalComponent({ setSelectedJob, jobsList, jobsListLoading, - importOptionsState + importOptionsState, + modalSearchState, + jobsListRefetch, }) { const { t } = useTranslation(); - + const [modalSearch, setModalSearch] = modalSearchState; const [importOptions, setImportOptions] = importOptionsState; - console.log("importOptions", importOptions); + const columns = [ { title: t("jobs.fields.ro_number"), @@ -27,7 +30,7 @@ export default function JobsFindModalComponent({ {record.ro_number ? record.ro_number : "EST-" + record.est_number} - ) + ), }, { title: t("jobs.fields.owner"), @@ -46,7 +49,7 @@ export default function JobsFindModalComponent({ // t("jobs.errors.noowner") {`${record.ownr_fn} ${record.ownr_ln}`} ); - } + }, }, { title: t("jobs.fields.ownr_ph1"), @@ -60,7 +63,7 @@ export default function JobsFindModalComponent({ ) : ( t("general.labels.unknown") ); - } + }, }, { title: t("jobs.fields.status"), @@ -70,7 +73,7 @@ export default function JobsFindModalComponent({ ellipsis: true, render: (text, record) => { return record.status || t("general.labels.na"); - } + }, }, { @@ -82,13 +85,14 @@ export default function JobsFindModalComponent({ render: (text, record) => { return record.vehicle ? ( - {`${record.v_model_yr || ""} ${record.v_make_desc || - ""} ${record.v_model_desc || ""}`} + {`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${ + record.v_model_desc || "" + }`} ) : ( t("jobs.errors.novehicle") ); - } + }, }, { title: t("vehicles.fields.plate_no"), @@ -102,7 +106,7 @@ export default function JobsFindModalComponent({ ) : ( t("general.labels.unknown") ); - } + }, }, { title: t("jobs.fields.clm_no"), @@ -116,11 +120,11 @@ export default function JobsFindModalComponent({ ) : ( t("general.labels.unknown") ); - } - } + }, + }, ]; - const handleOnRowClick = record => { + const handleOnRowClick = (record) => { if (record) { if (record.id) { setSelectedJob(record.id); @@ -133,35 +137,51 @@ export default function JobsFindModalComponent({ return (
t("jobs.labels.existing_jobs")} + title={() => ( +
+ {t("jobs.labels.existing_jobs")} + + { + setModalSearch(e.target.value); + }} + /> +
+ )} size='small' pagination={{ position: "bottom" }} - columns={columns.map(item => ({ ...item }))} + columns={columns.map((item) => ({ ...item }))} rowKey='id' loading={jobsListLoading} dataSource={jobsList} rowSelection={{ - onSelect: props => { + onSelect: (props) => { setSelectedJob(props.id); }, type: "radio", - selectedRowKeys: [selectedJob] + selectedRowKeys: [selectedJob], }} onRow={(record, rowIndex) => { return { - onClick: event => { + onClick: (event) => { handleOnRowClick(record); - } + }, }; }} /> + onChange={(e) => setImportOptions({ ...importOptions, - overrideHeaders: e.target.checked + overrideHeaders: e.target.checked, }) }> {t("jobs.labels.override_header")} diff --git a/client/src/components/jobs-find-modal/jobs-find-modal.container.jsx b/client/src/components/jobs-find-modal/jobs-find-modal.container.jsx index b05e3b653..40fa453be 100644 --- a/client/src/components/jobs-find-modal/jobs-find-modal.container.jsx +++ b/client/src/components/jobs-find-modal/jobs-find-modal.container.jsx @@ -1,16 +1,16 @@ +import { useQuery } from "@apollo/react-hooks"; import { Modal } from "antd"; import React from "react"; -import { useQuery } from "@apollo/react-hooks"; import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; import { QUERY_ALL_ACTIVE_JOBS } from "../../graphql/jobs.queries"; +import { selectBodyshop } from "../../redux/user/user.selectors"; import AlertComponent from "../alert/alert.component"; import LoadingSpinner from "../loading-spinner/loading-spinner.component"; import JobsFindModalComponent from "./jobs-find-modal.component"; -import { selectBodyshop } from "../../redux/user/user.selectors"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop + bodyshop: selectBodyshop, }); export default connect( @@ -23,21 +23,62 @@ export default connect( selectedJob, setSelectedJob, importOptionsState, + modalSearchState, ...modalProps }) { const { t } = useTranslation(); const jobsList = useQuery(QUERY_ALL_ACTIVE_JOBS, { - fetchPolicy: "network-only", variables: { - statuses: bodyshop.md_ro_statuses.open_statuses || ["Open"] - } + statuses: bodyshop.md_ro_statuses.open_statuses || ["Open"], + }, + skip: !modalProps.visible, }); + const modalSearch = modalSearchState[0]; + + const jobsData = + jobsList.data && jobsList.data.jobs + ? modalSearch + ? jobsList.data.jobs.filter( + (j) => + (j.ro_number || "") + .toLowerCase() + .includes(modalSearch.toLowerCase()) || + (j.est_number || "") + .toString() + .toLowerCase() + .includes(modalSearch.toLowerCase()) || + (j.ownr_fn || "") + .toLowerCase() + .includes(modalSearch.toLowerCase()) || + (j.ownr_ln || "") + .toLowerCase() + .includes(modalSearch.toLowerCase()) || + (j.status || "") + .toLowerCase() + .includes(modalSearch.toLowerCase()) || + (j.v_make_desc || "") + .toLowerCase() + .includes(modalSearch.toLowerCase()) || + (j.v_model_desc || "") + .toLowerCase() + .includes(modalSearch.toLowerCase()) || + (j.clm_no || "") + .toLowerCase() + .includes(modalSearch.toLowerCase()) || + (j.plate_no || "") + .toLowerCase() + .includes(modalSearch.toLowerCase()) + ) + : jobsList.data.jobs + : null; + return ( {loading ? : null} @@ -48,9 +89,9 @@ export default connect( setSelectedJob={setSelectedJob} importOptionsState={importOptionsState} jobsListLoading={jobsList.loading} - jobsList={ - jobsList.data && jobsList.data.jobs ? jobsList.data.jobs : null - } + jobsListRefetch={jobsList.refetch} + jobsList={jobsData} + modalSearchState={modalSearchState} /> ) : null} diff --git a/client/src/components/jobs-list-paginated/jobs-list-paginated.component.jsx b/client/src/components/jobs-list-paginated/jobs-list-paginated.component.jsx new file mode 100644 index 000000000..03885283d --- /dev/null +++ b/client/src/components/jobs-list-paginated/jobs-list-paginated.component.jsx @@ -0,0 +1,212 @@ +import { SyncOutlined } from "@ant-design/icons"; +import { Button, Input, Table } from "antd"; +import queryString from "query-string"; +import React, { useState } from "react"; +import { useTranslation } from "react-i18next"; +import { Link, useHistory, useLocation } from "react-router-dom"; +import CurrencyFormatter from "../../utils/CurrencyFormatter"; +import PhoneFormatter from "../../utils/PhoneFormatter"; +import { alphaSort } from "../../utils/sorters"; +import StartChatButton from "../chat-open-button/chat-open-button.component"; + +export default function JobsList({ refetch, loading, jobs, total }) { + const search = queryString.parse(useLocation().search); + const { page, sortcolumn, sortorder } = search; + const history = useHistory(); + const [state, setState] = useState({ + sortedInfo: {}, + filteredInfo: { text: "" }, + }); + + const { t } = useTranslation(); + const columns = [ + { + title: t("jobs.fields.ro_number"), + dataIndex: "ro_number", + key: "ro_number", + width: "8%", + sorter: (a, b) => alphaSort(a.ro_number, b.ro_number), + sortOrder: sortcolumn === "ro_number" && sortorder, + + render: (text, record) => ( + {record.ro_number} + ), + }, + { + title: t("jobs.fields.est_number"), + dataIndex: "est_number", + key: "est_number", + width: "8%", + sorter: (a, b) => a.est_number - b.est_number, + sortOrder: sortcolumn === "est_number" && sortorder, + + render: (text, record) => ( + {record.est_number} + ), + }, + { + title: t("jobs.fields.owner"), + dataIndex: "owner", + key: "owner", + ellipsis: true, + sorter: (a, b) => alphaSort(a.ownr_ln, b.ownr_ln), + width: "25%", + sortOrder: sortcolumn === "owner" && sortorder, + render: (text, record) => { + return record.owner ? ( + + {`${record.ownr_fn || ""} ${record.ownr_ln || ""}`} + + ) : ( + {`${record.ownr_fn || ""} ${record.ownr_ln || ""}`} + ); + }, + }, + { + title: t("jobs.fields.ownr_ph1"), + dataIndex: "ownr_ph1", + key: "ownr_ph1", + width: "12%", + ellipsis: true, + render: (text, record) => { + return record.ownr_ph1 ? ( + + {record.ownr_ph1} + + + ) : null; + }, + }, + { + title: t("jobs.fields.status"), + dataIndex: "status", + key: "status", + width: "10%", + ellipsis: true, + sorter: (a, b) => alphaSort(a.status, b.status), + sortOrder: sortcolumn === "status" && sortorder, + render: (text, record) => { + return record.status || t("general.labels.na"); + }, + }, + + { + title: t("jobs.fields.vehicle"), + dataIndex: "vehicle", + key: "vehicle", + width: "15%", + ellipsis: true, + render: (text, record) => { + return record.vehicleid ? ( + + {`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${ + record.v_model_desc || "" + }`} + + ) : ( + {`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${ + record.v_model_desc || "" + }`} + ); + }, + }, + { + title: t("vehicles.fields.plate_no"), + dataIndex: "plate_no", + key: "plate_no", + width: "8%", + ellipsis: true, + sorter: (a, b) => alphaSort(a.plate_no, b.plate_no), + sortOrder: sortcolumn === "plate_no" && sortorder, + render: (text, record) => { + return record.plate_no ? record.plate_no : ""; + }, + }, + { + title: t("jobs.fields.clm_no"), + dataIndex: "clm_no", + key: "clm_no", + width: "12%", + ellipsis: true, + sorter: (a, b) => alphaSort(a.clm_no, b.clm_no), + sortOrder: sortcolumn === "clm_no" && sortorder, + render: (text, record) => { + return record.clm_no ? ( + {record.clm_no} + ) : ( + t("general.labels.unknown") + ); + }, + }, + { + title: t("jobs.fields.clm_total"), + dataIndex: "clm_total", + key: "clm_total", + width: "10%", + sorter: (a, b) => a.clm_total - b.clm_total, + sortOrder: sortcolumn === "clm_total" && sortorder, + render: (text, record) => { + return record.clm_total ? ( + {record.clm_total} + ) : ( + t("general.labels.unknown") + ); + }, + }, + { + title: t("jobs.fields.owner_owing"), + dataIndex: "owner_owing", + key: "owner_owing", + width: "8%", + render: (text, record) => ( + {record.owner_owing} + ), + }, + ]; + + const handleTableChange = (pagination, filters, sorter) => { + setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); + search.page = pagination.current; + search.sortcolumn = sorter.columnKey; + search.sortorder = sorter.order; + history.push({ search: queryString.stringify(search) }); + }; + + return ( +
+
{ + return ( +
+ + { + search.search = value; + history.push({ search: queryString.stringify(search) }); + }} + enterButton + /> +
+ ); + }} + /> + + ); +} diff --git a/client/src/components/jobs-list/jobs-list.component.jsx b/client/src/components/jobs-list/jobs-list.component.jsx index 4c4d628f9..009db1917 100644 --- a/client/src/components/jobs-list/jobs-list.component.jsx +++ b/client/src/components/jobs-list/jobs-list.component.jsx @@ -1,24 +1,35 @@ -import { Button, Input, Table } from "antd"; import { SyncOutlined } from "@ant-design/icons"; +import { useQuery } from "@apollo/react-hooks"; +import { Button, Input, Table } from "antd"; +import queryString from "query-string"; import React, { useState } from "react"; import { useTranslation } from "react-i18next"; -import { Link, withRouter } from "react-router-dom"; +import { connect } from "react-redux"; +import { Link, useHistory, useLocation } from "react-router-dom"; +import { createStructuredSelector } from "reselect"; +import { QUERY_ALL_ACTIVE_JOBS } from "../../graphql/jobs.queries"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +import { onlyUnique } from "../../utils/arrayHelper"; import CurrencyFormatter from "../../utils/CurrencyFormatter"; import PhoneFormatter from "../../utils/PhoneFormatter"; import { alphaSort } from "../../utils/sorters"; +import AlertComponent from "../alert/alert.component"; import StartChatButton from "../chat-open-button/chat-open-button.component"; -import { useHistory } from "react-router-dom"; -import queryString from "query-string"; -export default withRouter(function JobsList({ - searchTextState, - refetch, - loading, - jobs, - searchParams, -}) { +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, +}); + +export function JobsList({ bodyshop }) { + const searchParams = queryString.parse(useLocation().search); const { selected } = searchParams; + const { loading, error, data, refetch } = useQuery(QUERY_ALL_ACTIVE_JOBS, { + variables: { + statuses: bodyshop.md_ro_statuses.open_statuses || ["Open", "Open*"], + }, + }); + const [state, setState] = useState({ sortedInfo: {}, filteredInfo: { text: "" }, @@ -26,43 +37,95 @@ export default withRouter(function JobsList({ const { t } = useTranslation(); const history = useHistory(); - const setSearchText = searchTextState[1]; + const [searchText, setSearchText] = useState(""); + + if (error) return ; + + const jobs = data + ? searchText === "" + ? data.jobs + : data.jobs.filter( + (j) => + (j.ro_number || "") + .toString() + .toLowerCase() + .includes(searchText.toLowerCase()) || + (j.ownr_fn || "") + .toLowerCase() + .includes(searchText.toLowerCase()) || + (j.ownr_ln || "") + .toLowerCase() + .includes(searchText.toLowerCase()) || + (j.clm_no || "").toLowerCase().includes(searchText.toLowerCase()) || + (j.plate_no || "") + .toLowerCase() + .includes(searchText.toLowerCase()) || + (j.v_model_desc || "") + .toLowerCase() + .includes(searchText.toLowerCase()) || + (j.v_make_desc || "") + .toLowerCase() + .includes(searchText.toLowerCase()) + ) + : []; + + const handleTableChange = (pagination, filters, sorter) => { + setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); + }; + + const handleOnRowClick = (record) => { + if (record) { + if (record.id) { + history.push({ + search: queryString.stringify({ + ...searchParams, + selected: record.id, + }), + }); + } + } + }; + const columns = [ { title: t("jobs.fields.ro_number"), dataIndex: "ro_number", key: "ro_number", - width: "8%", - sorter: (a, b) => - alphaSort( - a.ro_number ? a.ro_number : a.est_number, - b.ro_number ? b.ro_number : b.est_number - ), + sorter: (a, b) => alphaSort(a.ro_number, b.ro_number), sortOrder: state.sortedInfo.columnKey === "ro_number" && state.sortedInfo.order, render: (text, record) => ( - - {record.ro_number ? record.ro_number : record.est_number} - + {record.ro_number} ), }, + { + title: t("jobs.fields.est_number"), + dataIndex: "est_number", + key: "est_number", + sorter: (a, b) => a.est_number - b.est_number, + sortOrder: + state.sortedInfo.columnKey === "est_number" && state.sortedInfo.order, + + render: (text, record) => ( + {record.est_number} + ), + }, + { title: t("jobs.fields.owner"), dataIndex: "owner", key: "owner", - ellipsis: true, sorter: (a, b) => alphaSort(a.ownr_ln, b.ownr_ln), - width: "25%", sortOrder: state.sortedInfo.columnKey === "owner" && state.sortedInfo.order, render: (text, record) => { return record.owner ? ( - {`${record.ownr_fn} ${record.ownr_ln}`} + {`${record.ownr_fn || ""} ${record.ownr_ln || ""}`} ) : ( - {`${record.ownr_fn} ${record.ownr_ln}`} + {`${record.ownr_fn || ""} ${record.ownr_ln || ""}`} ); }, }, @@ -70,13 +133,12 @@ export default withRouter(function JobsList({ title: t("jobs.fields.ownr_ph1"), dataIndex: "ownr_ph1", key: "ownr_ph1", - width: "12%", ellipsis: true, render: (text, record) => { return record.ownr_ph1 ? ( {record.ownr_ph1} - + ) : null; }, @@ -85,11 +147,22 @@ export default withRouter(function JobsList({ title: t("jobs.fields.status"), dataIndex: "status", key: "status", - width: "10%", - ellipsis: true, sorter: (a, b) => alphaSort(a.status, b.status), sortOrder: state.sortedInfo.columnKey === "status" && state.sortedInfo.order, + filters: + (jobs && + jobs + .map((j) => j.status) + .filter(onlyUnique) + .map((s) => { + return { + text: s || "No Status*", + value: [s], + }; + })) || + [], + onFilter: (value, record) => value.includes(record.status), render: (text, record) => { return record.status || t("general.labels.na"); }, @@ -99,7 +172,6 @@ export default withRouter(function JobsList({ title: t("jobs.fields.vehicle"), dataIndex: "vehicle", key: "vehicle", - width: "15%", ellipsis: true, render: (text, record) => { return record.vehicleid ? ( @@ -119,8 +191,6 @@ export default withRouter(function JobsList({ title: t("vehicles.fields.plate_no"), dataIndex: "plate_no", key: "plate_no", - width: "8%", - ellipsis: true, sorter: (a, b) => alphaSort(a.plate_no, b.plate_no), sortOrder: state.sortedInfo.columnKey === "plate_no" && state.sortedInfo.order, @@ -132,7 +202,6 @@ export default withRouter(function JobsList({ title: t("jobs.fields.clm_no"), dataIndex: "clm_no", key: "clm_no", - width: "12%", ellipsis: true, sorter: (a, b) => alphaSort(a.clm_no, b.clm_no), sortOrder: @@ -149,7 +218,6 @@ export default withRouter(function JobsList({ title: t("jobs.fields.clm_total"), dataIndex: "clm_total", key: "clm_total", - width: "10%", sorter: (a, b) => a.clm_total - b.clm_total, sortOrder: state.sortedInfo.columnKey === "clm_total" && state.sortedInfo.order, @@ -165,76 +233,57 @@ export default withRouter(function JobsList({ title: t("jobs.fields.owner_owing"), dataIndex: "owner_owing", key: "owner_owing", - width: "8%", render: (text, record) => ( {record.owner_owing} ), }, ]; - const handleTableChange = (pagination, filters, sorter) => { - setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); - }; - - const handleOnRowClick = (record) => { - if (record) { - if (record.id) { - console.log("searchParams", searchParams); - history.push({ - search: queryString.stringify({ - ...searchParams, - selected: record.id, - }), - }); - } - } - }; - return ( -
-
{ - return ( -
- - { - setSearchText(e.target.value); - }} - enterButton - /> -
- ); - }} - size="small" - pagination={{ position: "top" }} - columns={columns.map((item) => ({ ...item }))} - rowKey="id" - dataSource={jobs} - rowSelection={{ - onSelect: (record) => { +
{ + return ( +
+ + { + setSearchText(e.target.value); + }} + value={searchText} + enterButton + /> +
+ ); + }} + rowSelection={{ + onSelect: (record) => { + handleOnRowClick(record); + }, + selectedRowKeys: [selected], + type: "radio", + }} + onChange={handleTableChange} + onRow={(record, rowIndex) => { + return { + onClick: (event) => { handleOnRowClick(record); }, - selectedRowKeys: [selected], - type: "radio", - }} - onChange={handleTableChange} - onRow={(record, rowIndex) => { - return { - onClick: (event) => { - handleOnRowClick(record); - }, // click row - onDoubleClick: (event) => {}, // double click row - onContextMenu: (event) => {}, // right button click row - onMouseEnter: (event) => {}, // mouse enter row - onMouseLeave: (event) => {}, // mouse leave row - }; - }} - /> - + }; + }} + /> ); -}); +} + +export default connect(mapStateToProps, null)(JobsList); diff --git a/client/src/components/jobs-notes/jobs-notes.container.jsx b/client/src/components/jobs-notes/jobs-notes.container.jsx index 2270e13f6..a3efaa482 100644 --- a/client/src/components/jobs-notes/jobs-notes.container.jsx +++ b/client/src/components/jobs-notes/jobs-notes.container.jsx @@ -1,31 +1,49 @@ -import React from "react"; -import JobNotesComponent from "./jobs.notes.component"; -import { useQuery, useMutation } from "@apollo/react-hooks"; -import AlertComponent from "../../components/alert/alert.component"; +import { useMutation, useQuery } from "@apollo/react-hooks"; +import { notification } from "antd"; +import React, { useState } from "react"; //import SpinComponent from "../../components/loading-spinner/loading-spinner.component"; -import { - QUERY_NOTES_BY_JOB_PK, - DELETE_NOTE -} from "../../graphql/notes.queries"; +import { useTranslation } from "react-i18next"; +import AlertComponent from "../../components/alert/alert.component"; +import { logImEXEvent } from "../../firebase/firebase.utils"; +import { DELETE_NOTE, QUERY_NOTES_BY_JOB_PK } from "../../graphql/notes.queries"; +import JobNotesComponent from "./jobs.notes.component"; + export default function JobNotesContainer({ jobId }) { const { loading, error, data, refetch } = useQuery(QUERY_NOTES_BY_JOB_PK, { variables: { id: jobId }, - fetchPolicy: "network-only" + fetchPolicy: "network-only", }); - const [deleteNote] = useMutation(DELETE_NOTE); + const { t } = useTranslation(); + const [deleteLoading, setDeleteLoading] = useState(false); + const handleNoteDelete = (id) => { + logImEXEvent("job_note_delete"); + setDeleteLoading(true); + deleteNote({ + variables: { + noteId: id, + }, + }).then((r) => { + refetch(); + notification["success"]({ + message: t("notes.successes.deleted"), + }); + }); + setDeleteLoading(false); + }; //if (loading) return ; - if (error) return ; + if (error) return ; return ( ); } diff --git a/client/src/components/jobs-notes/jobs.notes.component.jsx b/client/src/components/jobs-notes/jobs.notes.component.jsx index 493a6fbe0..6c9300742 100644 --- a/client/src/components/jobs-notes/jobs.notes.component.jsx +++ b/client/src/components/jobs-notes/jobs.notes.component.jsx @@ -4,7 +4,7 @@ import { EyeInvisibleFilled, WarningFilled } from "@ant-design/icons"; -import { Button, notification, Table } from "antd"; +import { Button, Table } from "antd"; import React from "react"; import { useTranslation } from "react-i18next"; import Moment from "react-moment"; @@ -12,18 +12,19 @@ import { connect } from "react-redux"; import { setModalContext } from "../../redux/modals/modals.actions"; import NoteUpsertModal from "../note-upsert-modal/note-upsert-modal.container"; -const mapDispatchToProps = dispatch => ({ - setNoteUpsertContext: context => - dispatch(setModalContext({ context: context, modal: "noteUpsert" })) +const mapDispatchToProps = (dispatch) => ({ + setNoteUpsertContext: (context) => + dispatch(setModalContext({ context: context, modal: "noteUpsert" })), }); export function JobNotesComponent({ loading, data, refetch, - deleteNote, + handleNoteDelete, jobId, - setNoteUpsertContext + setNoteUpsertContext, + deleteLoading, }) { const { t } = useTranslation(); @@ -40,13 +41,13 @@ export function JobNotesComponent({ ) : null} {record.private ? : null} - ) + ), }, { title: t("notes.fields.text"), dataIndex: "text", key: "text", - ellipsis: true + ellipsis: true, }, { @@ -60,13 +61,13 @@ export function JobNotesComponent({ {record.updated_at} - ) + ), }, { title: t("notes.fields.createdby"), dataIndex: "created_by", key: "created_by", - width: 200 + width: 200, }, { title: t("notes.actions.actions"), @@ -76,18 +77,8 @@ export function JobNotesComponent({ render: (text, record) => ( @@ -97,16 +88,16 @@ export function JobNotesComponent({ actions: { refetch: refetch }, context: { jobId: jobId, - existingNote: record - } + existingNote: record, + }, }); }} > - ) - } + ), + }, ]; return ( @@ -117,8 +108,8 @@ export function JobNotesComponent({ setNoteUpsertContext({ actions: { refetch: refetch }, context: { - jobId: jobId - } + jobId: jobId, + }, }); }} > @@ -127,7 +118,7 @@ export function JobNotesComponent({
({ ...item }))} + columns={columns.map((item) => ({ ...item }))} rowKey="id" dataSource={data} /> diff --git a/client/src/components/labor-allocations-table/labor-allocations-table.component.jsx b/client/src/components/labor-allocations-table/labor-allocations-table.component.jsx index 95946e919..8599e61a2 100644 --- a/client/src/components/labor-allocations-table/labor-allocations-table.component.jsx +++ b/client/src/components/labor-allocations-table/labor-allocations-table.component.jsx @@ -31,7 +31,7 @@ export function LaborAllocationsTable({ joblines, timetickets, bodyshop }) { - + {t("timetickets.fields.cost_center")}@@ -40,12 +40,23 @@ export function LaborAllocationsTable({ joblines, timetickets, bodyshop }) { {t("jobs.labels.hrs_claimed")} + + {t("jobs.labels.difference")} + {totals.map((t, idx) => ( - {t.cost_center} - {t.total} - {t.claimed} + {t.cost_center} + {t.total.toFixed(2)} + {t.claimed.toFixed(2)} + + 0 ? "green" : "red", + }}> + {(t.total - t.claimed).toFixed(2)} + + ))} diff --git a/client/src/components/labor-allocations-table/labor-allocations-table.utility.js b/client/src/components/labor-allocations-table/labor-allocations-table.utility.js index 5db9d60ae..8d36bcfdd 100644 --- a/client/src/components/labor-allocations-table/labor-allocations-table.utility.js +++ b/client/src/components/labor-allocations-table/labor-allocations-table.utility.js @@ -14,7 +14,7 @@ export const CalculateAllocationsTotals = ( const r = allCodes.reduce((acc, value) => { acc.push({ opcode: value, - cost_center: responsibilitycenters.defaults[value], + cost_center: responsibilitycenters.defaults.costs[value], total: joblines.reduce((acc2, val2) => { return val2.mod_lbr_ty === value ? acc2 + val2.mod_lb_hrs : acc2; }, 0), diff --git a/client/src/components/layout-form-row/layout-form-row.component.jsx b/client/src/components/layout-form-row/layout-form-row.component.jsx new file mode 100644 index 000000000..0bb53bb13 --- /dev/null +++ b/client/src/components/layout-form-row/layout-form-row.component.jsx @@ -0,0 +1,88 @@ +import React from "react"; +import { Row, Col, Typography } from "antd"; +import "./layout-form-row.styles.scss"; + +export default function LayoutFormRow({ header, children, grow = false }) { + if (!!!children.length) { + //We have only one element. It's going to get the whole thing. + return ( +
+ {header ? ( + {header} + ) : null} + {children} +
+ ); + } + const rowGutter = { gutter: [16, 16] }; + + const colSpan = (spanOverride) => { + return { + xs: { + span: 24, + }, + sm: { + span: !grow ? 12 : Math.max(12, 24 / children.length), + }, + md: { + span: !grow ? 8 : Math.max(8, 24 / children.length), + }, + lg: { + span: !grow ? 6 : Math.max(6, 24 / children.length), + }, + xl: { + span: !grow ? 4 : Math.max(4, 24 / children.length), + }, + }; + }; + + return ( +
+ {header ? {header} : null} + + {children.map((c, idx) => ( +
+ {c} + + ))} + + + ); +} + +// export default function LayoutFormRow({ header, children }) { +// if (!!!children.length) { +// //We have only one element. It's going to get the whole thing. +// return children; +// } +// const rowGutter = { gutter: [16, 16] }; + +// const colSpan = (maxspan) => { +// return { +// xs: { +// span: 24, +// }, +// md: { +// span: !!maxspan ? Math.min(12, maxspan) : 12, +// }, +// lg: { +// span: !!maxspan +// ? Math.min(Math.max(24 / children.length, 6), maxspan) +// : Math.max(24 / children.length, 6), +// }, +// }; +// }; + +// return ( +//
+// {header ? {header} : null} +// +// {children.map((c, idx) => ( +//
+// {c} +// +// ))} +// +// +// ); +// } diff --git a/client/src/components/layout-form-row/layout-form-row.styles.scss b/client/src/components/layout-form-row/layout-form-row.styles.scss new file mode 100644 index 000000000..faf24ccf1 --- /dev/null +++ b/client/src/components/layout-form-row/layout-form-row.styles.scss @@ -0,0 +1,20 @@ +//Override Antd Row margin to save space on forms. +.imex-form-row { + .ant-row { + margin-bottom: 0rem; + + .ant-form-item-label { + padding: 0rem; + } + + label { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + width: 100%; + display: inline-block; + padding: 0rem; + margin: 0rem; + } + } +} diff --git a/client/src/components/loading-skeleton/loading-skeleton.component.jsx b/client/src/components/loading-skeleton/loading-skeleton.component.jsx index b4c306d6b..6d9af741a 100644 --- a/client/src/components/loading-skeleton/loading-skeleton.component.jsx +++ b/client/src/components/loading-skeleton/loading-skeleton.component.jsx @@ -4,5 +4,9 @@ import "./loading-skeleton.styles.scss"; import { Skeleton } from "antd"; export default function LoadingSkeleton(props) { - return ; + return ( + + {props.children} + + ); } diff --git a/client/src/components/manage-sign-in-button/manage-sign-in-button.component.jsx b/client/src/components/manage-sign-in-button/manage-sign-in-button.component.jsx index 5b0e60a72..5fa6a359c 100644 --- a/client/src/components/manage-sign-in-button/manage-sign-in-button.component.jsx +++ b/client/src/components/manage-sign-in-button/manage-sign-in-button.component.jsx @@ -6,22 +6,20 @@ import { createStructuredSelector } from "reselect"; import { selectCurrentUser } from "../../redux/user/user.selectors"; const mapStateToProps = createStructuredSelector({ - currentUser: selectCurrentUser + currentUser: selectCurrentUser, }); -export default connect( - mapStateToProps, - null -)(function ManageSignInButton({ currentUser }) { +export function ManageSignInButton({ currentUser }) { return currentUser.authorized ? ( - + Manage ) : ( - + Sign In ); -}); +} +export default connect(mapStateToProps, null)(ManageSignInButton); diff --git a/client/src/components/note-upsert-modal/note-upsert-modal.component.jsx b/client/src/components/note-upsert-modal/note-upsert-modal.component.jsx index 1e7c6c8ce..564421cf8 100644 --- a/client/src/components/note-upsert-modal/note-upsert-modal.component.jsx +++ b/client/src/components/note-upsert-modal/note-upsert-modal.component.jsx @@ -1,8 +1,9 @@ import { Form, Input, Switch } from "antd"; import React from "react"; import { useTranslation } from "react-i18next"; +import NotesPresetButton from "../notes-preset-button/notes-preset-button.component"; -export default function NoteUpsertModalComponent() { +export default function NoteUpsertModalComponent({ form }) { const { t } = useTranslation(); return ( @@ -27,8 +28,8 @@ export default function NoteUpsertModalComponent() { rules={[ { required: true, - message: t("general.validation.required") - } + message: t("general.validation.required"), + }, ]} > + ); } diff --git a/client/src/components/note-upsert-modal/note-upsert-modal.container.jsx b/client/src/components/note-upsert-modal/note-upsert-modal.container.jsx index 4de2601c3..c7832b11e 100644 --- a/client/src/components/note-upsert-modal/note-upsert-modal.container.jsx +++ b/client/src/components/note-upsert-modal/note-upsert-modal.container.jsx @@ -9,19 +9,20 @@ import { toggleModalVisible } from "../../redux/modals/modals.actions"; import { selectNoteUpsert } from "../../redux/modals/modals.selectors"; import { selectCurrentUser } from "../../redux/user/user.selectors"; import NoteUpsertModalComponent from "./note-upsert-modal.component"; +import { logImEXEvent } from "../../firebase/firebase.utils"; const mapStateToProps = createStructuredSelector({ currentUser: selectCurrentUser, - noteUpsertModal: selectNoteUpsert + noteUpsertModal: selectNoteUpsert, }); -const mapDispatchToProps = dispatch => ({ - toggleModalVisible: () => dispatch(toggleModalVisible("noteUpsert")) +const mapDispatchToProps = (dispatch) => ({ + toggleModalVisible: () => dispatch(toggleModalVisible("noteUpsert")), }); export function NoteUpsertModalContainer({ currentUser, noteUpsertModal, - toggleModalVisible + toggleModalVisible, }) { const { t } = useTranslation(); const [insertNote] = useMutation(INSERT_NEW_NOTE); @@ -40,32 +41,37 @@ export function NoteUpsertModalContainer({ } }, [existingNote, form]); - const handleFinish = values => { + const handleFinish = (values) => { if (existingNote) { + logImEXEvent("job_note_update"); + updateNote({ variables: { noteId: existingNote.id, - note: values - } - }).then(r => { + note: values, + }, + }).then((r) => { notification["success"]({ - message: t("notes.successes.updated") + message: t("notes.successes.updated"), }); }); if (refetch) refetch(); toggleModalVisible(); } else { + logImEXEvent("job_note_insert"); + insertNote({ variables: { noteInput: [ - { ...values, jobid: jobId, created_by: currentUser.email } - ] - } - }).then(r => { + { ...values, jobid: jobId, created_by: currentUser.email }, + ], + }, + }).then((r) => { if (refetch) refetch(); + form.resetFields(); toggleModalVisible(); notification["success"]({ - message: t("notes.successes.create") + message: t("notes.successes.create"), }); }); } @@ -85,7 +91,7 @@ export function NoteUpsertModalContainer({ destroyOnClose >
- + ); diff --git a/client/src/components/notes-preset-button/notes-preset-button.component.jsx b/client/src/components/notes-preset-button/notes-preset-button.component.jsx new file mode 100644 index 000000000..87412ec8c --- /dev/null +++ b/client/src/components/notes-preset-button/notes-preset-button.component.jsx @@ -0,0 +1,49 @@ +import { DownOutlined } from "@ant-design/icons"; +import { Dropdown, Menu } from "antd"; +import React from "react"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { selectBodyshop } from "../../redux/user/user.selectors"; + +const mapStateToProps = createStructuredSelector({ + //currentUser: selectCurrentUser + bodyshop: selectBodyshop, +}); +const mapDispatchToProps = (dispatch) => ({ + //setUserLanguage: language => dispatch(setUserLanguage(language)) +}); + +export function NotesPresetButton({ bodyshop, form }) { + const { t } = useTranslation(); + + const handleSelect = (item) => { + form.setFieldsValue({ text: item.text }); + }; + + const menu = ( + + {bodyshop.md_notes_presets.map((i, idx) => ( + handleSelect(i)} onItemHover key={idx}> + {i.label} + + ))} + + ); + + return ( + + ); +} + +export default connect(mapStateToProps, mapDispatchToProps)(NotesPresetButton); diff --git a/client/src/components/owner-detail-form/owner-detail-form.component.jsx b/client/src/components/owner-detail-form/owner-detail-form.component.jsx index f7eff1b11..0988028ba 100644 --- a/client/src/components/owner-detail-form/owner-detail-form.component.jsx +++ b/client/src/components/owner-detail-form/owner-detail-form.component.jsx @@ -1,75 +1,124 @@ -import { Button, Col, Form, Input, Row, Switch } from "antd"; +import { Button, Form, Input, Switch } from "antd"; import React from "react"; import { useTranslation } from "react-i18next"; +import FormFieldsChanged from "../form-fields-changed-alert/form-fields-changed-alert.component"; import FormItemEmail from "../form-items-formatted/email-form-item.component"; import FormItemPhone from "../form-items-formatted/phone-form-item.component"; +import LayoutFormRow from "../layout-form-row/layout-form-row.component"; export default function OwnerDetailFormComponent({ form }) { const { t } = useTranslation(); const { getFieldValue } = form; return (
- - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); } diff --git a/client/src/components/owner-detail-form/owner-detail-form.container.jsx b/client/src/components/owner-detail-form/owner-detail-form.container.jsx index f938359bc..00d1df689 100644 --- a/client/src/components/owner-detail-form/owner-detail-form.container.jsx +++ b/client/src/components/owner-detail-form/owner-detail-form.container.jsx @@ -11,17 +11,27 @@ function OwnerDetailFormContainer({ owner, refetch }) { const [updateOwner] = useMutation(UPDATE_OWNER); - const handleFinish = values => { - updateOwner({ - variables: { ownerId: owner.id, owner: values } - }).then(r => { - notification["success"]({ - message: t("owners.successes.save") - }); - //TODO Better way to reset the field decorators? - if (refetch) refetch().then(); - // resetFields(); + const handleFinish = async (values) => { + const result = await updateOwner({ + variables: { ownerId: owner.id, owner: values }, }); + + if (!!result.errors) { + notification["error"]({ + message: t("owners.errors.saving", { + message: JSON.stringify(result.errors), + }), + }); + return; + } + + notification["success"]({ + message: t("owners.successes.save"), + }); + + if (refetch) await refetch(); + form.resetFields(); + form.resetFields(); }; return ( @@ -29,6 +39,7 @@ function OwnerDetailFormContainer({ owner, refetch }) { form={form} onFinish={handleFinish} autoComplete="off" + layout="vertical" initialValues={owner} > diff --git a/client/src/components/owner-detail-jobs/owner-detail-jobs.component.jsx b/client/src/components/owner-detail-jobs/owner-detail-jobs.component.jsx index a83b0d684..c32363d39 100644 --- a/client/src/components/owner-detail-jobs/owner-detail-jobs.component.jsx +++ b/client/src/components/owner-detail-jobs/owner-detail-jobs.component.jsx @@ -9,7 +9,7 @@ import CurrencyFormatter from "../../utils/CurrencyFormatter"; import OwnerDetailUpdateJobsComponent from "../owner-detail-update-jobs/owner-detail-update-jobs.component"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop + bodyshop: selectBodyshop, }); function OwnerDetailJobsComponent({ bodyshop, owner }) { @@ -25,7 +25,7 @@ function OwnerDetailJobsComponent({ bodyshop, owner }) { {record.ro_number ? record.ro_number : `EST ${record.est_number}`} - ) + ), }, { title: t("jobs.fields.vehicle"), @@ -35,17 +35,17 @@ function OwnerDetailJobsComponent({ bodyshop, owner }) { {`${record.v_model_yr} ${record.v_make_desc} ${record.v_model_desc}`} - ) + ), }, { title: t("jobs.fields.clm_no"), dataIndex: "clm_no", - key: "clm_no" + key: "clm_no", }, { title: t("jobs.fields.status"), dataIndex: "status", - key: "status" + key: "status", }, { @@ -54,8 +54,8 @@ function OwnerDetailJobsComponent({ bodyshop, owner }) { key: "clm_total", render: (text, record) => ( {record.clm_total} - ) - } + ), + }, ]; return ( @@ -70,20 +70,31 @@ function OwnerDetailJobsComponent({ bodyshop, owner }) { )} pagination={{ position: "bottom" }} - columns={columns.map(item => ({ ...item }))} - rowKey="id" + columns={columns} + scroll={{ x: true }} + rowKey='id' dataSource={owner.jobs} rowSelection={{ onSelect: (record, selected, selectedRows) => { - setSelectedJobs(selectedRows ? selectedRows.map(i => i.id) : []); + setSelectedJobs(selectedRows ? selectedRows.map((i) => i.id) : []); + }, + onSelectAll: (selected, selectedRows, changeRows) => { + setSelectedJobs( + selectedRows + ? selectedRows + .filter((i) => + bodyshop.md_ro_statuses.open_statuses.includes(i.status) + ) + .map((i) => i.id) + : [] + ); }, - selectedRowKeys: selectedJobs, - getCheckboxProps: record => ({ + getCheckboxProps: (record) => ({ disabled: bodyshop.md_ro_statuses.open_statuses ? !bodyshop.md_ro_statuses.open_statuses.includes(record.status) - : true - }) + : true, + }), }} /> ); diff --git a/client/src/components/owner-detail-update-jobs/owner-detail-update-jobs.component.jsx b/client/src/components/owner-detail-update-jobs/owner-detail-update-jobs.component.jsx index 4bb455d3b..d01e99b85 100644 --- a/client/src/components/owner-detail-update-jobs/owner-detail-update-jobs.component.jsx +++ b/client/src/components/owner-detail-update-jobs/owner-detail-update-jobs.component.jsx @@ -3,15 +3,18 @@ import { Button, notification } from "antd"; import { useTranslation } from "react-i18next"; import { useMutation } from "@apollo/react-hooks"; import { UPDATE_JOBS } from "../../graphql/jobs.queries"; +import { logImEXEvent } from "../../firebase/firebase.utils"; export default function OwnerDetailUpdateJobsComponent({ owner, selectedJobs, - disabled + disabled, }) { const { t } = useTranslation(); const [updateJobs] = useMutation(UPDATE_JOBS); - const handlecClick = e => { + const handlecClick = (e) => { + logImEXEvent("owner_update_jobs", { count: selectedJobs.length }); + updateJobs({ variables: { jobIds: selectedJobs, @@ -28,16 +31,16 @@ export default function OwnerDetailUpdateJobsComponent({ ownr_ph2: owner["ownr_ph2"], ownr_st: owner["ownr_st"], ownr_title: owner["ownr_title"], - ownr_zip: owner["ownr_zip"] - } - } + ownr_zip: owner["ownr_zip"], + }, + }, }) - .then(response => { + .then((response) => { notification["success"]({ message: t("jobs.successes.updated") }); }) - .catch(error => { + .catch((error) => { notification["error"]({ - message: t("jobs.errors.updating", { error: JSON.stringify(error) }) + message: t("jobs.errors.updating", { error: JSON.stringify(error) }), }); }); }; diff --git a/client/src/components/owner-tag-popover/owner-tag-popover.component.jsx b/client/src/components/owner-tag-popover/owner-tag-popover.component.jsx index 69ccc602f..f6784744f 100644 --- a/client/src/components/owner-tag-popover/owner-tag-popover.component.jsx +++ b/client/src/components/owner-tag-popover/owner-tag-popover.component.jsx @@ -13,19 +13,16 @@ export default function OwnerTagPopoverComponent({ job }) { title={t("owners.labels.fromclaim")} size='small' column={1}> - {`${job.ownr_fn || - ""} ${job.ownr_ln || ""} ${job.ownr_co_nm || - ""}`} + {`${ + job.ownr_fn || "" + } ${job.ownr_ln || ""} ${job.ownr_co_nm || ""}`} {job.ownr_ph1 || ""} - {`${job.ownr_addr1 || ""} ${job.ownr_addr2 || - ""} ${job.ownr_city || ""} ${job.ownr_st || - ""} ${job.ownr_zip || ""} ${job.ownr_ctry || - ""} ${job.ownr_city || ""}`} + {`${job.ownr_addr1 || ""} ${job.ownr_addr2 || ""} ${ + job.ownr_city || "" + } ${job.ownr_st || ""} ${job.ownr_zip || ""}`} {job.ownr_ea || ""} @@ -40,17 +37,20 @@ export default function OwnerTagPopoverComponent({ job }) { title={t("owners.labels.fromowner")} size='small' column={1}> - {`${job - .owner.ownr_fn || ""} ${job.owner.ownr_ln || ""} ${job.owner - .ownr_co_nm || ""}`} + {`${ + job.owner.ownr_fn || "" + } ${job.owner.ownr_ln || ""} ${ + job.owner.ownr_co_nm || "" + }`} {job.owner.ownr_ph1 || ""} - {`${job.owner.ownr_addr1 || ""} ${job.owner.ownr_addr2 || - ""} ${job.owner.ownr_city || ""} ${job.owner.ownr_st || - ""} ${job.owner.ownr_zip || ""} ${job.owner.ownr_ctry || - ""} ${job.owner.ownr_city || ""}`} + {`${job.owner.ownr_addr1 || ""} ${job.owner.ownr_addr2 || ""} ${ + job.owner.ownr_city || "" + } ${job.owner.ownr_st || ""} ${job.owner.ownr_zip || ""} ${ + job.owner.ownr_ctry || "" + } `} {job.owner.ownr_ea || ""} @@ -69,7 +69,7 @@ export default function OwnerTagPopoverComponent({ job }) { return ( - + {job.owner ? `${job.ownr_co_nm || ""}${job.ownr_fn || ""} ${job.ownr_ln || ""}` : t("jobs.errors.noowner")} diff --git a/client/src/components/owners-list/owners-list.component.jsx b/client/src/components/owners-list/owners-list.component.jsx index beb3c3c1a..23bfbbf98 100644 --- a/client/src/components/owners-list/owners-list.component.jsx +++ b/client/src/components/owners-list/owners-list.component.jsx @@ -1,14 +1,27 @@ -import { Input, Table } from "antd"; +import { SyncOutlined } from "@ant-design/icons"; +import { Button, Input, Table } from "antd"; +import queryString from "query-string"; import React, { useState } from "react"; import { useTranslation } from "react-i18next"; -import { Link } from "react-router-dom"; +import { Link, useHistory, useLocation } from "react-router-dom"; import PhoneFormatter from "../../utils/PhoneFormatter"; -import { alphaSort } from "../../utils/sorters"; -export default function OwnersListComponent({ loading, owners, refetch }) { +export default function OwnersListComponent({ + loading, + owners, + total, + refetch, +}) { + const search = queryString.parse(useLocation().search); + const { + page, + // sortcolumn, sortorder + } = search; + const history = useHistory(); + const [state, setState] = useState({ sortedInfo: {}, - filteredInfo: { text: "" } + filteredInfo: { text: "" }, }); const { t } = useTranslation(); @@ -18,33 +31,24 @@ export default function OwnersListComponent({ loading, owners, refetch }) { title: t("owners.fields.name"), dataIndex: "name", key: "name", - // onFilter: (value, record) => record.ro_number.includes(value), - // filteredValue: state.filteredInfo.text || null, - sorter: (a, b) => alphaSort(a.ownr_ln, b.ownr_ln), - sortOrder: - state.sortedInfo.columnKey === "name" && state.sortedInfo.order, - render: (text, record) => ( {`${record.ownr_fn} ${record.ownr_ln}`} - ) + ), }, { title: t("owners.fields.ownr_ph1"), dataIndex: "ownr_ph1", key: "ownr_ph1", - sorter: (a, b) => alphaSort(a.ownr_ph1, b.ownr_ph1), - sortOrder: - state.sortedInfo.columnKey === "ownr_ph1" && state.sortedInfo.order, render: (text, record) => { return {record.ownr_ph1}; - } + }, }, { title: t("owners.fields.ownr_ea"), dataIndex: "ownr_ea", - key: "ownr_ea" + key: "ownr_ea", }, { title: t("owners.fields.address"), @@ -52,36 +56,52 @@ export default function OwnersListComponent({ loading, owners, refetch }) { key: "address", render: (text, record) => { return ( -
{`${record.ownr_addr1 || ""} ${record.ownr_addr2 || - ""} ${record.ownr_city || ""} ${record.ownr_st || - ""} ${record.ownr_zip || ""}`}
+
{`${record.ownr_addr1 || ""} ${record.ownr_addr2 || ""} ${ + record.ownr_city || "" + } ${record.ownr_st || ""} ${record.ownr_zip || ""}`}
); - } - } + }, + }, ]; const handleTableChange = (pagination, filters, sorter) => { setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); + search.page = pagination.current; + search.sortcolumn = sorter.columnKey; + search.sortorder = sorter.order; + history.push({ search: queryString.stringify(search) }); }; -//TODO Implement searching & pagination return (
{ return ( - { - console.log(value); - }} - enterButton - /> +
+ + { + search.search = value; + history.push({ search: queryString.stringify(search) }); + }} + enterButton + /> +
); }} size="small" - pagination={{ position: "top" }} - columns={columns.map(item => ({ ...item }))} + pagination={{ + position: "top", + pageSize: 25, + current: parseInt(page || 1), + total: total, + }} + columns={columns} rowKey="id" + scroll={{ x: true }} dataSource={owners} onChange={handleTableChange} /> diff --git a/client/src/components/owners-list/owners-list.container.jsx b/client/src/components/owners-list/owners-list.container.jsx index 0e8ebcd46..4b57e535c 100644 --- a/client/src/components/owners-list/owners-list.container.jsx +++ b/client/src/components/owners-list/owners-list.container.jsx @@ -1,19 +1,40 @@ -import React from "react"; import { useQuery } from "@apollo/react-hooks"; -import { QUERY_ALL_OWNERS } from "../../graphql/owners.queries"; +import React from "react"; +import { QUERY_ALL_OWNERS_PAGINATED } from "../../graphql/owners.queries"; import AlertComponent from "../alert/alert.component"; import OwnersListComponent from "./owners-list.component"; +import queryString from "query-string"; +import { useLocation } from "react-router-dom"; export default function OwnersListContainer() { - const { loading, error, data, refetch } = useQuery(QUERY_ALL_OWNERS, { - fetchPolicy: "network-only" - }); + const searchParams = queryString.parse(useLocation().search); + const { page, sortcolumn, sortorder, search } = searchParams; + const { loading, error, data, refetch } = useQuery( + QUERY_ALL_OWNERS_PAGINATED, + { + variables: { + search: search || "", + offset: page ? (page - 1) * 25 : 0, + limit: 25, + order: [ + { + [sortcolumn || "created_at"]: sortorder + ? sortorder === "descend" + ? "desc" + : "asc" + : "desc", + }, + ], + }, + } + ); if (error) return ; return ( ); diff --git a/client/src/components/parts-order-line-backorder-button/parts-order-line-backorder-button.component.jsx b/client/src/components/parts-order-line-backorder-button/parts-order-line-backorder-button.component.jsx new file mode 100644 index 000000000..be4414e1d --- /dev/null +++ b/client/src/components/parts-order-line-backorder-button/parts-order-line-backorder-button.component.jsx @@ -0,0 +1,97 @@ +import { useMutation } from "@apollo/react-hooks"; +import { Button, notification, Popover } from "antd"; +import React, { useState } from "react"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { logImEXEvent } from "../../firebase/firebase.utils"; +import { MUTATION_BACKORDER_PART_LINE } from "../../graphql/parts-orders.queries"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +import FormDatePicker from "../form-date-picker/form-date-picker.component"; + +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, +}); + +export function PartsOrderLineBackorderButton({ + partsOrderStatus, + partsLineId, + jobLineId, + bodyshop, +}) { + const [visibility, setVisibility] = useState(false); + const [eta, setEta] = useState(null); + const [loading, setLoading] = useState(false); + const [backorderLine] = useMutation(MUTATION_BACKORDER_PART_LINE); + const { t } = useTranslation(); + + const isAlreadyBackordered = + bodyshop.md_order_statuses.default_bo === partsOrderStatus; + + const handleSave = async () => { + setLoading(true); + logImEXEvent("job_parts_backorder"); + + const partsOrder = { + status: isAlreadyBackordered + ? bodyshop.md_order_statuses.default_received || "Received*" + : bodyshop.md_order_statuses.default_bo || "Backordered*", + }; + if (!isAlreadyBackordered) { + partsOrder.backordered_on = new Date(); + partsOrder.backordered_eta = eta; + } + + const result = await backorderLine({ + variables: { + jobLineId, + partsLineId, + partsOrder: partsOrder, + status: partsOrder.status, + }, + }); + + if (!!result.errors) { + notification["error"]({ + message: t("parts_orders.errors.backordering", { + message: JSON.stringify(result.errors), + }), + }); + } + setEta(null); + setVisibility(false); + setLoading(false); + }; + + const handlePopover = (e) => { + if (isAlreadyBackordered) { + handleSave(); + //Receive the part. + } else { + //Show the date selector to back order the part. + setVisibility(true); + } + }; + + const popContent = ( +
+ setEta(e)} /> + + +
+ ); + + return ( + + + + ); +} + +export default connect(mapStateToProps, null)(PartsOrderLineBackorderButton); diff --git a/client/src/components/parts-order-list-table/parts-order-list-table.component.jsx b/client/src/components/parts-order-list-table/parts-order-list-table.component.jsx new file mode 100644 index 000000000..6ec341edc --- /dev/null +++ b/client/src/components/parts-order-list-table/parts-order-list-table.component.jsx @@ -0,0 +1,286 @@ +import { SyncOutlined } from "@ant-design/icons"; +import { Button, Input, Table, Typography } from "antd"; +import queryString from "query-string"; +import React, { useState } from "react"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { useLocation } from "react-router-dom"; +import { createStructuredSelector } from "reselect"; +import { logImEXEvent } from "../../firebase/firebase.utils"; +import { setModalContext } from "../../redux/modals/modals.actions"; +import CurrencyFormatter from "../../utils/CurrencyFormatter"; +import { DateFormatter } from "../../utils/DateFormatter"; +import { alphaSort } from "../../utils/sorters"; +import PartsOrderLineBackorderButton from "../parts-order-line-backorder-button/parts-order-line-backorder-button.component"; +import { selectBodyshop } from "../../redux/user/user.selectors"; + +const mapStateToProps = createStructuredSelector({ + //currentUser: selectCurrentUser + bodyshop: selectBodyshop, +}); + +const mapDispatchToProps = (dispatch) => ({ + setInvoiceEnterContext: (context) => + dispatch(setModalContext({ context: context, modal: "invoiceEnter" })), +}); + +export function PartsOrderListTableComponent({ + setInvoiceEnterContext, + bodyshop, + job, + loading, + invoicesQuery, + handleOnRowClick, +}) { + const responsibilityCenters = bodyshop.md_responsibility_centers; + + const { t } = useTranslation(); + const [state, setState] = useState({ + sortedInfo: {}, + }); + const search = queryString.parse(useLocation().search); + const selectedpartsorder = search.partsorderid; + + const parts_orders = invoicesQuery.data + ? invoicesQuery.data.parts_orders + : []; + const { refetch } = invoicesQuery; + const columns = [ + { + title: t("vendors.fields.name"), + dataIndex: "vendorname", + key: "vendorname", + sorter: (a, b) => alphaSort(a.vendor.name, b.vendor.name), + sortOrder: + state.sortedInfo.columnKey === "vendorname" && state.sortedInfo.order, + render: (text, record) => {record.vendor.name}, + }, + { + title: t("parts_orders.fields.order_number"), + dataIndex: "order_number", + key: "order_number", + sorter: (a, b) => alphaSort(a.invoice_number, b.invoice_number), + sortOrder: + state.sortedInfo.columnKey === "invoice_number" && + state.sortedInfo.order, + }, + { + title: t("parts_orders.fields.order_date"), + dataIndex: "order_date", + key: "order_date", + sorter: (a, b) => a.order_date - b.order_date, + sortOrder: + state.sortedInfo.columnKey === "order_date" && state.sortedInfo.order, + render: (text, record) => ( + {record.order_date} + ), + }, + { + title: t("parts_orders.fields.deliver_by"), + dataIndex: "deliver_by", + key: "deliver_by", + sorter: (a, b) => a.deliver_by - b.deliver_by, + sortOrder: + state.sortedInfo.columnKey === "deliver_by" && state.sortedInfo.order, + render: (text, record) => ( + {record.deliver_by} + ), + }, + { + title: t("general.labels.actions"), + dataIndex: "actions", + key: "actions", + render: (text, record) => ( + + ), + }, + ]; + + const handleTableChange = (pagination, filters, sorter) => { + setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); + }; + + const rowExpander = (record) => { + const columns = [ + { + title: t("parts_orders.fields.line_desc"), + dataIndex: "line_desc", + key: "line_desc", + sorter: (a, b) => alphaSort(a.line_desc, b.line_desc), + sortOrder: + state.sortedInfo.columnKey === "line_desc" && state.sortedInfo.order, + }, + { + title: t("parts_orders.fields.db_price"), + dataIndex: "db_price", + key: "db_price", + sorter: (a, b) => a.db_price - b.db_price, + sortOrder: + state.sortedInfo.columnKey === "db_price" && state.sortedInfo.order, + render: (text, record) => ( + {record.db_price} + ), + }, + { + title: t("parts_orders.fields.act_price"), + dataIndex: "act_price", + key: "act_price", + sorter: (a, b) => a.act_price - b.act_price, + sortOrder: + state.sortedInfo.columnKey === "act_price" && state.sortedInfo.order, + render: (text, record) => ( + {record.act_price} + ), + }, + + { + title: t("parts_orders.fields.oem_partno"), + dataIndex: "oem_partno", + key: "oem_partno", + sorter: (a, b) => alphaSort(a.oem_partno, b.oem_partno), + sortOrder: + state.sortedInfo.columnKey === "oem_partno" && state.sortedInfo.order, + }, + { + title: t("parts_orders.fields.line_remarks"), + dataIndex: "line_remarks", + key: "line_remarks", + }, + { + title: t("parts_orders.fields.status"), + dataIndex: "status", + key: "status", + }, + { + title: t("parts_orders.fields.backordered_on"), + dataIndex: "backordered_on", + key: "backordered_on", + render: (text, record) => {text}, + }, + { + title: t("parts_orders.fields.backordered_eta"), + dataIndex: "backordered_eta", + key: "backordered_eta", + render: (text, record) => {text}, + }, + { + title: t("general.labels.actions"), + dataIndex: "actions", + key: "actions", + render: (text, record) => ( +
+ +
+ ), + }, + ]; + + return ( +
+
+ + ); + }; + + return ( +
+ + {t("parts_orders.labels.parts_orders")} + +
( +
+ + +
+ { + e.preventDefault(); + }} + /> +
+
+ )} + scroll={{ x: "50%", y: "40rem" }} + expandedRowRender={rowExpander} + pagination={{ position: "top", defaultPageSize: 25 }} + columns={columns} + rowKey="id" + dataSource={parts_orders} + onChange={handleTableChange} + expandable={{ + expandedRowKeys: [selectedpartsorder], + onExpand: (expanded, record) => { + handleOnRowClick(expanded ? record : null); + }, + }} + rowSelection={{ + onSelect: (record) => { + handleOnRowClick(record); + }, + selectedRowKeys: [selectedpartsorder], + type: "radio", + }} + onRow={(record, rowIndex) => { + return { + onClick: (event) => { + handleOnRowClick(record); + }, // click row + onDoubleClick: (event) => {}, // double click row + onContextMenu: (event) => {}, // right button click row + onMouseEnter: (event) => {}, // mouse enter row + onMouseLeave: (event) => {}, // mouse leave row + }; + }} + /> + + ); +} +export default connect( + mapStateToProps, + mapDispatchToProps +)(PartsOrderListTableComponent); diff --git a/client/src/components/parts-order-modal/parts-order-modal.component.jsx b/client/src/components/parts-order-modal/parts-order-modal.component.jsx index c4f5a4874..965a66e07 100644 --- a/client/src/components/parts-order-modal/parts-order-modal.component.jsx +++ b/client/src/components/parts-order-modal/parts-order-modal.component.jsx @@ -1,12 +1,15 @@ import { DeleteFilled } from "@ant-design/icons"; -import { DatePicker, Form, Input, Radio } from "antd"; +import { Form, Input, InputNumber, Radio } from "antd"; import React from "react"; import { useTranslation } from "react-i18next"; -import VendorSearchSelect from "../vendor-search-select/vendor-search-select.component"; +import FormDatePicker from "../form-date-picker/form-date-picker.component"; import CurrencyInput from "../form-items-formatted/currency-form-item.component"; +import VendorSearchSelect from "../vendor-search-select/vendor-search-select.component"; + export default function PartsOrderModalComponent({ vendorList, - sendTypeState + sendTypeState, + isReturn, }) { const [sendType, setSendType] = sendTypeState; @@ -20,23 +23,23 @@ export default function PartsOrderModalComponent({ rules={[ { required: true, - message: t("general.validation.required") - } + message: t("general.validation.required"), + }, ]} > - + - + {t("parts_orders.labels.inthisorder")} @@ -54,8 +57,8 @@ export default function PartsOrderModalComponent({ rules={[ { required: true, - message: t("general.validation.required") - } + message: t("general.validation.required"), + }, ]} > @@ -81,6 +84,13 @@ export default function PartsOrderModalComponent({ > + + + { remove(field.name); @@ -95,7 +105,7 @@ export default function PartsOrderModalComponent({ setSendType(e.target.value)} + onChange={(e) => setSendType(e.target.value)} > {t("parts_orders.labels.email")} {t("parts_orders.labels.print")} diff --git a/client/src/components/parts-order-modal/parts-order-modal.container.jsx b/client/src/components/parts-order-modal/parts-order-modal.container.jsx index 9dc1d5020..90fed10d4 100644 --- a/client/src/components/parts-order-modal/parts-order-modal.container.jsx +++ b/client/src/components/parts-order-modal/parts-order-modal.container.jsx @@ -4,7 +4,7 @@ import React, { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { connect } from "react-redux"; import { createStructuredSelector } from "reselect"; -import { EmailSettings } from "../../emails/constants"; +import { INSERT_NEW_INVOICE } from "../../graphql/invoices.queries"; import { UPDATE_JOB_LINE_STATUS } from "../../graphql/jobs-lines.queries"; import { INSERT_NEW_PARTS_ORDERS } from "../../graphql/parts-orders.queries"; import { QUERY_ALL_VENDORS_FOR_ORDER } from "../../graphql/vendors.queries"; @@ -18,6 +18,12 @@ import { import AlertComponent from "../alert/alert.component"; import LoadingSpinner from "../loading-spinner/loading-spinner.component"; import PartsOrderModalComponent from "./parts-order-modal.component"; +import RenderTemplate, { + displayTemplateInWindow, +} from "../../utils/RenderTemplate"; +import moment from "moment"; +import { TemplateList } from "../../utils/TemplateConstants"; +import { logImEXEvent } from "../../firebase/firebase.utils"; const mapStateToProps = createStructuredSelector({ currentUser: selectCurrentUser, @@ -40,7 +46,15 @@ export function PartsOrderModalContainer({ const { t } = useTranslation(); const { visible, context, actions } = partsOrderModal; - const { jobId, linesToOrder } = context; + const { + jobId, + linesToOrder, + isReturn, + vendorId, + returnFromInvoice, + invoiceNumber, + } = context; + const { refetch } = actions; const [form] = Form.useForm(); @@ -52,9 +66,12 @@ export function PartsOrderModalContainer({ }); const [insertPartOrder] = useMutation(INSERT_NEW_PARTS_ORDERS); const [updateJobLines] = useMutation(UPDATE_JOB_LINE_STATUS); + const [insertInvoice] = useMutation(INSERT_NEW_INVOICE); - const handleFinish = (values) => { - insertPartOrder({ + const handleFinish = async (values) => { + logImEXEvent("parts_order_insert"); + + const insertResult = await insertPartOrder({ variables: { po: [ { @@ -65,73 +82,124 @@ export function PartsOrderModalContainer({ }, ], }, - }) - .then((r) => { - updateJobLines({ - variables: { - ids: values.parts_order_lines.data.map((item) => item.job_line_id), - status: bodyshop.md_order_statuses.default_ordered || "Ordered*", - }, - }) - .then((response) => { - notification["success"]({ - message: t("parts_orders.successes.created"), - }); - if (refetch) refetch(); - toggleModalVisible(); - - if (sendType === "e") { - //TODO Remove hardcoding - setEmailOptions({ - messageOptions: { - from: { - name: bodyshop.shopname || EmailSettings.fromNameDefault, - address: EmailSettings.fromAddress, - }, - to: - data.vendors.filter((item) => item.id === values.id)[0] || - null, - replyTo: bodyshop.email, - }, - template: { - name: "parts_order_confirmation", - variables: { - id: r.data.insert_parts_orders.returning[0].id, - }, - }, - }); - } - }) - .catch((error) => { - notification["error"]({ - message: t("parts_orders.errors.creating"), - description: error.message, - }); - }); - - //end no good - }) - .catch((error) => { - notification["error"]({ - message: t("parts_orders.errors.creating"), - description: error.message, - }); + }); + if (!!insertResult.error) { + notification["error"]({ + message: t("parts_orders.errors.creating"), + description: JSON.stringify(insertResult.error), }); + return; + } + + const jobLinesResult = await updateJobLines({ + variables: { + ids: values.parts_order_lines.data.map((item) => item.job_line_id), + status: isReturn + ? bodyshop.md_order_statuses.default_returned || "Returned*" + : bodyshop.md_order_statuses.default_ordered || "Ordered*", + }, + }); + if (!!jobLinesResult.errors) { + notification["error"]({ + message: t("parts_orders.errors.creating"), + description: JSON.stringify(jobLinesResult.errors), + }); + } + + notification["success"]({ + message: t("parts_orders.successes.created"), + }); + + if (values.vendorid === bodyshop.inhousevendorid) { + console.log("Inhouse Invoice needs to be psoted."); + logImEXEvent("parts_order_inhouse_invoice"); + + let invoiceToPost = { + vendorid: bodyshop.inhousevendorid, + jobid: jobId, + total: 0, + invoice_number: `${jobId}`, + federal_tax_rate: bodyshop.invoice_tax_rates.federal_tax_rate || 0, + state_tax_rate: bodyshop.invoice_tax_rates.state_tax_rate || 0, + local_tax_rate: bodyshop.invoice_tax_rates.local_tax_rate || 0, + invoicelines: { + data: values.parts_order_lines.data.map((p) => { + return { + joblineid: p.job_line_id, + actual_price: 0, + actual_cost: 0, + line_desc: p.line_desc, + quantity: p.quantity || 1, + cost_center: + bodyshop.md_responsibility_centers.defaults.PAO || "Other*", + }; + }), + }, + }; + + await insertInvoice({ + variables: { invoice: invoiceToPost }, + }); + } + + if (refetch) refetch(); + toggleModalVisible(); + + if (sendType === "e") { + setEmailOptions({ + messageOptions: { + to: [data.vendors.filter((item) => item.id === values.id)[0]] || null, + replyTo: bodyshop.email, + }, + template: { + name: isReturn + ? TemplateList.parts_return_confirmation.key + : TemplateList.parts_order_confirmation.key, + variables: { + id: insertResult.data.insert_parts_orders.returning[0].id, + }, + }, + }); + } else { + displayTemplateInWindow( + await RenderTemplate( + { + name: isReturn + ? TemplateList.parts_return_confirmation.key + : TemplateList.parts_order_confirmation.key, + variables: { + id: insertResult.data.insert_parts_orders.returning[0].id, + }, + }, + bodyshop + ) + ); + } }; - const initialValues = - linesToOrder && - linesToOrder.reduce((acc, value) => { - acc.push({ - line_desc: value.line_desc, - oem_partno: value.oem_partno, - db_price: value.db_price, - act_price: value.act_price, - job_line_id: value.id, - status: bodyshop.md_order_statuses.default_ordered || "Ordered*", - }); - return acc; - }, []); + const initialValues = { + jobid: jobId, + return: isReturn, + deliver_by: isReturn ? moment(new Date()) : null, + vendorid: vendorId, + returnfrominvoice: returnFromInvoice, + + parts_order_lines: { + data: linesToOrder + ? linesToOrder.reduce((acc, value) => { + acc.push({ + line_desc: value.line_desc, + oem_partno: value.oem_partno, + db_price: value.db_price, + act_price: value.act_price, + quantity: value.part_qty, + job_line_id: isReturn ? value.joblineid : value.id, + }); + return acc; + }, []) + : [], + }, + }; useEffect(() => { if (visible && !!linesToOrder) { @@ -142,6 +210,11 @@ export function PartsOrderModalContainer({ return ( toggleModalVisible()} width="90%" onOk={() => form.submit()} @@ -154,11 +227,12 @@ export function PartsOrderModalContainer({ form={form} autoComplete="no" onFinish={handleFinish} - initialValues={{ parts_order_lines: { data: initialValues } }} + initialValues={initialValues} > diff --git a/client/src/components/parts-status-pie/parts-status-pie.component.jsx b/client/src/components/parts-status-pie/parts-status-pie.component.jsx new file mode 100644 index 000000000..eba729f37 --- /dev/null +++ b/client/src/components/parts-status-pie/parts-status-pie.component.jsx @@ -0,0 +1,25 @@ +import React from "react"; + +export default function PartsStatusPie({ partsList }) { + //const [pieData, setPieData] = useState([]); + + const result = partsList + ? partsList.reduce((names, name) => { + const val = name || "?"; + const count = names[val] || 0; + names[val] = count + 1; + return names; + }, {}) + : {}; + + const pieData = Object.keys(result).map((i) => { + console.log("i", i); + return { + id: i, + label: i, + value: result[i], + }; + }); + + return
{JSON.stringify(pieData)}
; +} diff --git a/client/src/components/payment-export-button/payment-export-button.component.jsx b/client/src/components/payment-export-button/payment-export-button.component.jsx new file mode 100644 index 000000000..3a54cbad3 --- /dev/null +++ b/client/src/components/payment-export-button/payment-export-button.component.jsx @@ -0,0 +1,127 @@ +import { useMutation } from "@apollo/react-hooks"; +import { Button, notification } from "antd"; +import axios from "axios"; +import React, { useState } from "react"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { auth } from "../../firebase/firebase.utils"; +import { UPDATE_PAYMENTS } from "../../graphql/payments.queries"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +import { logImEXEvent } from "../../firebase/firebase.utils"; + +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, +}); + +export function PaymentExportButton({ + bodyshop, + paymentId, + disabled, + loadingCallback, +}) { + const { t } = useTranslation(); + const [updatePayment] = useMutation(UPDATE_PAYMENTS); + const [loading, setLoading] = useState(false); + + const handleQbxml = async () => { + logImEXEvent("accounting_payment_export"); + + setLoading(true); + if (!!loadingCallback) loadingCallback(true); + + let QbXmlResponse; + try { + QbXmlResponse = await axios.post( + "/accounting/qbxml/payments", + { payments: [paymentId] }, + { + headers: { + Authorization: `Bearer ${await auth.currentUser.getIdToken(true)}`, + }, + } + ); + console.log("handle -> XML", QbXmlResponse); + } catch (error) { + console.log("Error getting QBXML from Server.", error); + notification["error"]({ + message: t("payments.errors.exporting", { + error: "Unable to retrieve QBXML. " + JSON.stringify(error.message), + }), + }); + if (loadingCallback) loadingCallback(false); + setLoading(false); + return; + } + + let PartnerResponse; + + try { + PartnerResponse = await axios.post( + "http://localhost:1337/qb/", + //"http://609feaeae986.ngrok.io/qb/", + QbXmlResponse.data + ); + } catch (error) { + console.log("Error connecting to quickbooks or partner.", error); + notification["error"]({ + message: t("payments.errors.exporting-partner"), + }); + if (!!loadingCallback) loadingCallback(false); + setLoading(false); + return; + } + + console.log("handleQbxml -> PartnerResponse", PartnerResponse); + const failedTransactions = PartnerResponse.data.filter((r) => !r.success); + const successfulTransactions = PartnerResponse.data.filter( + (r) => r.success + ); + if (failedTransactions.length > 0) { + //Uh oh. At least one was no good. + failedTransactions.map((ft) => + notification["error"]({ + message: t("payments.errors.exporting", { + error: ft.errorMessage || "", + }), + }) + ); + } + if (successfulTransactions.length > 0) { + const paymentUpdateResponse = await updatePayment({ + variables: { + paymentIdList: successfulTransactions.map((st) => st.id), + payment: { + exportedat: new Date(), + }, + }, + }); + if (!!!paymentUpdateResponse.errors) { + notification["success"]({ + message: t("jobs.successes.exported"), + }); + } else { + notification["error"]({ + message: t("jobs.errors.exporting", { + error: JSON.stringify(paymentUpdateResponse.error), + }), + }); + } + } + + if (!!loadingCallback) loadingCallback(false); + setLoading(false); + }; + + return ( + + ); +} + +export default connect(mapStateToProps, null)(PaymentExportButton); diff --git a/client/src/components/payment-form/payment-form.component.jsx b/client/src/components/payment-form/payment-form.component.jsx new file mode 100644 index 000000000..15ac9d09a --- /dev/null +++ b/client/src/components/payment-form/payment-form.component.jsx @@ -0,0 +1,148 @@ +import { CardElement } from "@stripe/react-stripe-js"; +import { Checkbox, Form, Input, Radio, Select } from "antd"; +import React from "react"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +import Alert from "../alert/alert.component"; +import CurrencyInput from "../form-items-formatted/currency-form-item.component"; +import JobSearchSelect from "../job-search-select/job-search-select.component"; + +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, +}); + +export function PaymentFormComponent({ + form, + roAutoCompleteOptions, + stripeStateArr, + bodyshop, +}) { + const [stripeState, setStripeState] = stripeStateArr; + + const { t } = useTranslation(); + const handleStripeChange = (e) => { + console.log("e", e); + setStripeState({ error: e.error, cardComplete: e.complete }); + }; + + return ( +
+ + + + + + + + + + + + + + + + + + + + + + + + + + {t("general.labels.email")} + {t("general.labels.print")} + + + + {!!!bodyshop.stripe_acct_id ? ( +
{t("payments.labels.signup")}
+ ) : null} + + + {() => { + if (form.getFieldValue("useStripe")) + return ( + + ); + + return null; + }} + + {stripeState.error ? ( + + ) : null} +
+ ); +} +export default connect(mapStateToProps, null)(PaymentFormComponent); diff --git a/client/src/components/payment-form/payment-form.container.jsx b/client/src/components/payment-form/payment-form.container.jsx new file mode 100644 index 000000000..3f4e7c15e --- /dev/null +++ b/client/src/components/payment-form/payment-form.container.jsx @@ -0,0 +1,34 @@ +import { useQuery } from "@apollo/react-hooks"; +import React from "react"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { ACTIVE_JOBS_FOR_AUTOCOMPLETE } from "../../graphql/jobs.queries"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +import PaymentFormComponent from "./payment-form.component"; + +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, +}); + +export function PaymentFormContainer({ + bodyshop, + form, + stripeStateArr, + +}) { + const { data: RoAutoCompleteData } = useQuery(ACTIVE_JOBS_FOR_AUTOCOMPLETE, { + variables: { statuses: bodyshop.md_ro_statuses.open_statuses || ["Open*"] }, + }); + + return ( +
+ +
+ ); +} +export default connect(mapStateToProps, null)(PaymentFormContainer); diff --git a/client/src/components/payment-modal/payment-modal.container.jsx b/client/src/components/payment-modal/payment-modal.container.jsx new file mode 100644 index 000000000..88da1072c --- /dev/null +++ b/client/src/components/payment-modal/payment-modal.container.jsx @@ -0,0 +1,203 @@ +import { useElements, useStripe, CardElement } from "@stripe/react-stripe-js"; +import { Form, Modal, notification } from "antd"; +import React, { useState, useEffect } from "react"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { toggleModalVisible } from "../../redux/modals/modals.actions"; +import { selectPayment } from "../../redux/modals/modals.selectors"; +import { + selectBodyshop, + selectCurrentUser, +} from "../../redux/user/user.selectors"; +import PaymentForm from "../payment-form/payment-form.container"; +import axios from "axios"; +import { useMutation } from "@apollo/react-hooks"; +import { INSERT_NEW_PAYMENT } from "../../graphql/payments.queries"; +import { TemplateList } from "../../utils/TemplateConstants"; +import RenderTemplate, { + displayTemplateInWindow, +} from "../../utils/RenderTemplate"; +import { setEmailOptions } from "../../redux/email/email.actions"; +import { logImEXEvent } from "../../firebase/firebase.utils"; + +const mapStateToProps = createStructuredSelector({ + paymentModal: selectPayment, + bodyshop: selectBodyshop, + currentUser: selectCurrentUser, +}); + +const mapDispatchToProps = (dispatch) => ({ + setEmailOptions: (e) => dispatch(setEmailOptions(e)), + toggleModalVisible: () => dispatch(toggleModalVisible("payment")), +}); + +function InvoiceEnterModalContainer({ + paymentModal, + toggleModalVisible, + bodyshop, + currentUser, + setEmailOptions, +}) { + const [form] = Form.useForm(); + const [insertPayment] = useMutation(INSERT_NEW_PAYMENT); + const stripe = useStripe(); + const elements = useElements(); + const { t } = useTranslation(); + const { context, actions, visible } = paymentModal; + + const [loading, setLoading] = useState(false); + const stripeStateArr = useState({ + error: null, + cardComplete: false, + }); + const stripeState = stripeStateArr[0]; + + const cardValid = !!!stripeState.error && stripeState.cardComplete; + + const handleFinish = async (values) => { + const { useStripe, sendby, ...paymentObj } = values; + if (useStripe && !cardValid) return; + + if ((useStripe && !stripe) || !elements) { + // Stripe.js has not yet loaded. + // Make sure to disable form submission until Stripe.js has loaded. + return; + } + + setLoading(true); + + try { + let stripePayment; + if (useStripe && bodyshop.stripe_acct_id) { + logImEXEvent("payment_stripe_attempt"); + + const secretKey = await axios.post("/stripe/payment", { + amount: Math.round(values.amount * 100), + stripe_acct_id: bodyshop.stripe_acct_id, + }); + + stripePayment = await stripe.confirmCardPayment( + secretKey.data.clientSecret, + { + payment_method: { + card: elements.getElement(CardElement), + billing_details: { + name: "Jenny Rosen", + }, + }, + } + ); + console.log("handleFinish -> stripePayment", stripePayment); + + if (stripePayment.paymentIntent.status === "succeeded") { + notification["success"]({ message: t("payments.successes.stripe") }); + } else { + notification["error"]({ message: t("payments.errors.stripe") }); + throw new Error(); + } + } + logImEXEvent("payment_insert"); + + const newPayment = await insertPayment({ + variables: { + paymentInput: { + ...paymentObj, + stripeid: + stripePayment && + stripePayment.paymentIntent && + stripePayment.paymentIntent.id, + }, + }, + }); + + if (!!!newPayment.errors) { + notification["success"]({ message: t("payments.successes.payment") }); + } else { + notification["error"]({ message: t("payments.errors.payment") }); + } + + if (sendby === "email") { + setEmailOptions({ + messageOptions: { + // to: [appData.email], + replyTo: bodyshop.email, + }, + template: { + name: TemplateList.payment_receipt.key, + variables: { + id: newPayment.data.insert_payments.returning[0].id, + }, + }, + }); + } else { + displayTemplateInWindow( + await RenderTemplate( + { + name: TemplateList.payment_receipt.key, + variables: { + id: newPayment.data.insert_payments.returning[0].id, + }, + }, + bodyshop + ) + ); + } + + if (actions.refetch) actions.refetch(); + toggleModalVisible(); + } catch (error) { + console.log("error", error); + } finally { + setLoading(false); + } + }; + + const handleCancel = () => { + toggleModalVisible(); + }; + + useEffect(() => { + if (visible) form.resetFields(); + }, [visible, form]); + + return ( + form.submit()} + onCancel={handleCancel} + afterClose={() => form.resetFields()} + okButtonProps={{ + loading: loading, + }} + destroyOnClose> +
+ + +
+ ); +} + +export default connect( + mapStateToProps, + mapDispatchToProps +)(InvoiceEnterModalContainer); + +// const pr = stripe.paymentRequest({ +// country: "CA", +// currency: "CAD", +// total: { +// label: "Demo total", +// amount: 1099, +// }, +// requestPayerName: true, +// requestPayerEmail: true, +// }); +// console.log("handleFinish -> pr", pr); diff --git a/client/src/components/payments-export-all-button/payments-export-all-button.component.jsx b/client/src/components/payments-export-all-button/payments-export-all-button.component.jsx new file mode 100644 index 000000000..4b2a1e4f5 --- /dev/null +++ b/client/src/components/payments-export-all-button/payments-export-all-button.component.jsx @@ -0,0 +1,126 @@ +import { useMutation } from "@apollo/react-hooks"; +import { Button, notification } from "antd"; +import axios from "axios"; +import React, { useState } from "react"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { auth } from "../../firebase/firebase.utils"; +import { UPDATE_PAYMENTS } from "../../graphql/payments.queries"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, +}); + +export function PaymentsExportAllButton({ + bodyshop, + paymentIds, + disabled, + loadingCallback, + completedCallback, +}) { + const { t } = useTranslation(); + const [updatePayments] = useMutation(UPDATE_PAYMENTS); + const [loading, setLoading] = useState(false); + + const handleQbxml = async () => { + setLoading(true); + if (!!loadingCallback) loadingCallback(true); + + let QbXmlResponse; + try { + QbXmlResponse = await axios.post( + "/accounting/qbxml/payments", + { payments: paymentIds }, + { + headers: { + Authorization: `Bearer ${await auth.currentUser.getIdToken(true)}`, + }, + } + ); + console.log("handle -> XML", QbXmlResponse); + } catch (error) { + console.log("Error getting QBXML from Server.", error); + notification["error"]({ + message: t("payments.errors.exporting", { + error: "Unable to retrieve QBXML. " + JSON.stringify(error.message), + }), + }); + if (loadingCallback) loadingCallback(false); + setLoading(false); + return; + } + + let PartnerResponse; + + try { + PartnerResponse = await axios.post( + "http://localhost:1337/qb/", + QbXmlResponse.data + ); + } catch (error) { + console.log("Error connecting to quickbooks or partner.", error); + notification["error"]({ + message: t("payments.errors.exporting-partner"), + }); + if (!!loadingCallback) loadingCallback(false); + setLoading(false); + return; + } + + console.log("handleQbxml -> PartnerResponse", PartnerResponse); + const failedTransactions = PartnerResponse.data.filter((r) => !r.success); + const successfulTransactions = PartnerResponse.data.filter( + (r) => r.success + ); + if (failedTransactions.length > 0) { + //Uh oh. At least one was no good. + failedTransactions.map((ft) => + notification["error"]({ + message: t("payments.errors.exporting", { + error: ft.errorMessage || "", + }), + }) + ); + } + if (successfulTransactions.length > 0) { + const paymentUpdateResponse = await updatePayments({ + variables: { + paymentIdList: successfulTransactions.map((st) => st.id), + payment: { + //exported: true, + exportedat: new Date(), + }, + }, + }); + if (!!!paymentUpdateResponse.errors) { + notification["success"]({ + message: t("jobs.successes.exported"), + }); + } else { + notification["error"]({ + message: t("jobs.errors.exporting", { + error: JSON.stringify(paymentUpdateResponse.error), + }), + }); + } + } + + if (!!completedCallback) completedCallback([]); + if (!!loadingCallback) loadingCallback(false); + setLoading(false); + }; + + return ( + + ); +} + +export default connect(mapStateToProps, null)(PaymentsExportAllButton); diff --git a/client/src/components/payments-list-paginated/payment-list-paginated.component.jsx b/client/src/components/payments-list-paginated/payment-list-paginated.component.jsx new file mode 100644 index 000000000..1a8a62516 --- /dev/null +++ b/client/src/components/payments-list-paginated/payment-list-paginated.component.jsx @@ -0,0 +1,159 @@ +import { SyncOutlined } from "@ant-design/icons"; +import { Button, Input, Table } from "antd"; +import queryString from "query-string"; +import React, { useState } from "react"; +import { useTranslation } from "react-i18next"; +import { Link, useHistory, useLocation } from "react-router-dom"; +import CurrencyFormatter from "../../utils/CurrencyFormatter"; +import { DateTimeFormatter } from "../../utils/DateFormatter"; +import { alphaSort } from "../../utils/sorters"; + +export default function PaymentsListPaginated({ + refetch, + loading, + payments, + total, +}) { + const search = queryString.parse(useLocation().search); + const { page, sortcolumn, sortorder } = search; + const history = useHistory(); + const [state, setState] = useState({ + sortedInfo: {}, + filteredInfo: { text: "" }, + }); + + const { t } = useTranslation(); + const columns = [ + { + title: t("jobs.fields.ro_number"), + dataIndex: "ro_number", + key: "ro_number", + sorter: (a, b) => alphaSort(a.job.ro_number, b.job.ro_number), + sortOrder: sortcolumn === "ro_number" && sortorder, + render: (text, record) => ( + {record.job.ro_number} + ), + }, + { + title: t("jobs.fields.est_number"), + dataIndex: "est_number", + key: "est_number", + sorter: (a, b) => a.job.est_number - b.job.est_number, + sortOrder: sortcolumn === "est_number" && sortorder, + render: (text, record) => ( + + {record.job.est_number} + + ), + }, + { + title: t("jobs.fields.owner"), + dataIndex: "owner", + key: "owner", + ellipsis: true, + sorter: (a, b) => alphaSort(a.job.ownr_ln, b.job.ownr_ln), + sortOrder: sortcolumn === "owner" && sortorder, + render: (text, record) => { + return record.job.owner ? ( + + {`${record.job.ownr_fn || ""} ${record.job.ownr_ln || ""}`} + + ) : ( + {`${record.job.ownr_fn || ""} ${ + record.job.ownr_ln || "" + }`} + ); + }, + }, + { + title: t("payments.fields.amount"), + dataIndex: "amount", + key: "amount", + render: (text, record) => ( + {record.amount} + ), + }, + { + title: t("payments.fields.memo"), + dataIndex: "memo", + key: "memo", + }, + { + title: t("payments.fields.type"), + dataIndex: "type", + key: "type", + }, + { + title: t("payments.fields.transactionid"), + dataIndex: "transactionid", + key: "transactionid", + }, + { + title: t("payments.fields.stripeid"), + dataIndex: "stripeid", + key: "stripeid", + }, + { + title: t("payments.fields.created_at"), + dataIndex: "created_at", + key: "created_at", + render: (text, record) => ( + {record.created_at} + ), + }, + { + title: t("payments.fields.exportedat"), + dataIndex: "exportedat", + key: "exportedat", + render: (text, record) => ( + {record.exportedat} + ), + }, + ]; + + const handleTableChange = (pagination, filters, sorter) => { + setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); + search.page = pagination.current; + search.sortcolumn = sorter.columnKey; + search.sortorder = sorter.order; + history.push({ search: queryString.stringify(search) }); + }; + + return ( +
+
{ + return ( +
+ + { + search.search = value; + history.push({ search: queryString.stringify(search) }); + }} + enterButton + /> +
+ ); + }} + /> + + ); +} diff --git a/client/src/components/print-center-item/print-center-item.component.jsx b/client/src/components/print-center-item/print-center-item.component.jsx new file mode 100644 index 000000000..1748ccedc --- /dev/null +++ b/client/src/components/print-center-item/print-center-item.component.jsx @@ -0,0 +1,62 @@ +import { MailOutlined, PrinterOutlined } from "@ant-design/icons"; +import React from "react"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { setEmailOptions } from "../../redux/email/email.actions"; +import { selectPrintCenter } from "../../redux/modals/modals.selectors"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +import RenderTemplate, { + displayTemplateInWindow, +} from "../../utils/RenderTemplate"; +const mapStateToProps = createStructuredSelector({ + printCenterModal: selectPrintCenter, + bodyshop: selectBodyshop, +}); +const mapDispatchToProps = (dispatch) => ({ + setEmailOptions: (e) => dispatch(setEmailOptions(e)), +}); + +export function PrintCenterItemComponent({ + printCenterModal, + setEmailOptions, + item, + id, + bodyshop, + disabled, +}) { + const renderToNewWindow = async () => { + const html = await RenderTemplate( + { + name: item.key, + variables: { id: id }, + }, + bodyshop + ); + displayTemplateInWindow(html); + }; + + if (disabled) return
  • {item.title}
  • ; + return ( +
  • + {item.title} + + { + setEmailOptions({ + messageOptions: { + Subject: "//TODO FIX ME", + }, + template: { + name: item.key, + variables: { id: id }, + }, + }); + }} + /> +
  • + ); +} +export default connect( + mapStateToProps, + mapDispatchToProps +)(PrintCenterItemComponent); diff --git a/client/src/components/print-center-jobs/print-center-jobs.component.jsx b/client/src/components/print-center-jobs/print-center-jobs.component.jsx new file mode 100644 index 000000000..e2ff632be --- /dev/null +++ b/client/src/components/print-center-jobs/print-center-jobs.component.jsx @@ -0,0 +1,64 @@ +import { Collapse, Row, Col } from "antd"; +import React from "react"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { setEmailOptions } from "../../redux/email/email.actions"; +import { toggleModalVisible } from "../../redux/modals/modals.actions"; +import { selectPrintCenter } from "../../redux/modals/modals.selectors"; +import { + selectBodyshop, + selectCurrentUser, +} from "../../redux/user/user.selectors"; +import PrintCenterItem from "../print-center-item/print-center-item.component"; +import PrintCenterSpeedPrint from "../print-center-speed-print/print-center-speed-print.component"; +import JobsReports from "./print-center-jobs.list"; + +const mapStateToProps = createStructuredSelector({ + currentUser: selectCurrentUser, + bodyshop: selectBodyshop, + printCenterModal: selectPrintCenter, +}); + +const mapDispatchToProps = (dispatch) => ({ + setEmailOptions: (e) => dispatch(setEmailOptions(e)), + toggleModalVisible: () => dispatch(toggleModalVisible("printCenter")), +}); + +const colSpan = { md: { span: 24 }, lg: { span: 12 } }; + +export function PrintCenterJobsComponent({ bodyshop, printCenterModal }) { + const { id: jobId } = printCenterModal.context; + const JobsReportsList = JobsReports(null); + + return ( +
    + +
    + + + + + {JobsReportsList.map((section) => ( + +
      + {section.items.map((item) => ( + + ))} +
    +
    + ))} +
    + + + + ); +} +export default connect( + mapStateToProps, + mapDispatchToProps +)(PrintCenterJobsComponent); diff --git a/client/src/components/print-center-jobs/print-center-jobs.list.js b/client/src/components/print-center-jobs/print-center-jobs.list.js new file mode 100644 index 000000000..afbb0d0f4 --- /dev/null +++ b/client/src/components/print-center-jobs/print-center-jobs.list.js @@ -0,0 +1,60 @@ +import i18n from "i18next"; + +export default function JobsReports(job) { + return [ + { + title: i18n.t("printcenter.labels.repairorder"), + key: "printcenter.jobs.repairorder", + disabled: false, + items: [ + { + key: "appointment_reminder", + title: i18n.t("printcenter.jobs.appointment_reminder"), + disabled: false, + }, + { + key: "estimate_detail", + title: i18n.t("printcenter.jobs.estimate_detail"), + disabled: false, + }, + { + key: "job_totals", + title: i18n.t("printcenter.jobs.job_totals"), + disabled: false, + }, + { + key: "work_authorization", + title: i18n.t("printcenter.jobs.work_authorization"), + disabled: false, + }, + { + key: "fippa_work_authorization", + title: i18n.t("printcenter.jobs.fippa_work_authorization"), + disabled: false, + }, + { + key: "casl_work_authorization", + title: i18n.t("printcenter.jobs.casl_work_authorization"), + disabled: false, + }, + { + key: "coversheet", + title: i18n.t("printcenter.jobs.coversheet"), + disabled: false, + }, + ], + }, + { + title: i18n.t("printcenter.labels.misc"), + key: "printcenter.jobs.misc", + disabled: false, + items: [ + { + key: "iou", + title: i18n.t("printcenter.jobs.iou"), + disabled: true, + }, + ], + }, + ]; +} diff --git a/client/src/components/print-center-modal/print-center-modal.component.jsx b/client/src/components/print-center-modal/print-center-modal.component.jsx new file mode 100644 index 000000000..926a0f7fc --- /dev/null +++ b/client/src/components/print-center-modal/print-center-modal.component.jsx @@ -0,0 +1,23 @@ +import React from "react"; +import { useTranslation } from "react-i18next"; +import PrintCenterJobs from "../print-center-jobs/print-center-jobs.component"; + +export default function PrintCenterModalComponent({ context }) { + const { t } = useTranslation(); + const { type } = context; + + let ModalContent; + + switch (type) { + case "job": + ModalContent = PrintCenterJobs; + break; + default: + break; + } + return ( +
    + {ModalContent ? : t("printcenter.errors.nocontexttype")} +
    + ); +} diff --git a/client/src/components/print-center-modal/print-center-modal.container.jsx b/client/src/components/print-center-modal/print-center-modal.container.jsx new file mode 100644 index 000000000..0d53b1e65 --- /dev/null +++ b/client/src/components/print-center-modal/print-center-modal.container.jsx @@ -0,0 +1,55 @@ +import { Modal } from "antd"; +import React from "react"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { setEmailOptions } from "../../redux/email/email.actions"; +import { toggleModalVisible } from "../../redux/modals/modals.actions"; +import { selectPrintCenter } from "../../redux/modals/modals.selectors"; +import { + selectBodyshop, + selectCurrentUser, +} from "../../redux/user/user.selectors"; +import PrintCenterModalComponent from "./print-center-modal.component"; +import "./print-center-modal.styles.scss"; + +const mapStateToProps = createStructuredSelector({ + currentUser: selectCurrentUser, + bodyshop: selectBodyshop, + printCenterModal: selectPrintCenter, +}); + +const mapDispatchToProps = (dispatch) => ({ + setEmailOptions: (e) => dispatch(setEmailOptions(e)), + toggleModalVisible: () => dispatch(toggleModalVisible("printCenter")), +}); + +export function PrintCenterModalContainer({ + printCenterModal, + toggleModalVisible, + currentUser, + bodyshop, + setEmailOptions, +}) { + const { t } = useTranslation(); + + const { visible, context } = printCenterModal; + const { type, id } = context; + // const { refetch } = actions; + + return ( + toggleModalVisible()} + width='90%' + title={` ${t("printcenter.labels.title")} ${type} - ${id}`} + destroyOnClose> + + + ); +} + +export default connect( + mapStateToProps, + mapDispatchToProps +)(PrintCenterModalContainer); diff --git a/client/src/components/print-center-modal/print-center-modal.styles.scss b/client/src/components/print-center-modal/print-center-modal.styles.scss new file mode 100644 index 000000000..0303e1da3 --- /dev/null +++ b/client/src/components/print-center-modal/print-center-modal.styles.scss @@ -0,0 +1,3 @@ +.print-center-item > * { + padding: 0em 8px; +} diff --git a/client/src/components/print-center-speed-print/print-center-speed-print.component.jsx b/client/src/components/print-center-speed-print/print-center-speed-print.component.jsx new file mode 100644 index 000000000..57542ef25 --- /dev/null +++ b/client/src/components/print-center-speed-print/print-center-speed-print.component.jsx @@ -0,0 +1,82 @@ +import { Button, Typography, List } from "antd"; +import React from "react"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { logImEXEvent } from "../../firebase/firebase.utils"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +import RenderTemplate, { + displayTemplateInWindow, +} from "../../utils/RenderTemplate"; +import { TemplateList } from "../../utils/TemplateConstants"; + +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, //currentUser: selectCurrentUser +}); +const mapDispatchToProps = (dispatch) => ({ + //setUserLanguage: language => dispatch(setUserLanguage(language)) +}); + +export function PrintCenterSpeedPrint({ bodyshop, jobId }) { + const { speedprint } = bodyshop; + const { t } = useTranslation(); + const renderTemplate = async (templateKey) => { + logImEXEvent("speed_print_template_render"); + + const html = await RenderTemplate( + { + name: templateKey, + variables: { id: jobId }, + }, + bodyshop + ); + displayTemplateInWindow(html); + }; + + const renderAllTemplates = (templateKeys) => { + logImEXEvent("speed_print_render_all_templates"); + + templateKeys.forEach((templateKey) => renderTemplate(templateKey)); + }; + + return ( +
    + + {t("printcenter.labels.speedprint")} + + + ( + renderAllTemplates(sp.templates)}> + Print All + , + ]} + > + + + )} + /> +
    + ); +} + +const renderTemplateList = (templates) => ( + + {templates.map((template, idx) => { + if (idx === templates.length - 1) return TemplateList[template].title; + return `${TemplateList[template].title}, `; + })} + +); + +export default connect( + mapStateToProps, + mapDispatchToProps +)(PrintCenterSpeedPrint); diff --git a/client/src/components/production-board-kanban-card/production-board-card.styles.scss b/client/src/components/production-board-kanban-card/production-board-card.styles.scss new file mode 100644 index 000000000..ad85d8be4 --- /dev/null +++ b/client/src/components/production-board-kanban-card/production-board-card.styles.scss @@ -0,0 +1,3 @@ +.imex-kanban-card { + padding: 0px !important; +} diff --git a/client/src/components/production-board-kanban-card/production-board-kanban-card.component.jsx b/client/src/components/production-board-kanban-card/production-board-kanban-card.component.jsx new file mode 100644 index 000000000..6d1cc2258 --- /dev/null +++ b/client/src/components/production-board-kanban-card/production-board-kanban-card.component.jsx @@ -0,0 +1,74 @@ +import React from "react"; +import { Card, Row, Col } from "antd"; +import { DateTimeFormatter } from "../../utils/DateFormatter"; +import ProductionAlert from "../production-list-columns/production-list-columns.alert.component"; +import { EyeFilled } from "@ant-design/icons"; +import { Link } from "react-router-dom"; +import "./production-board-card.styles.scss"; + +export default function ProductionBoardCard(card) { + return ( + + + +
    {`${card.ownr_fn || ""} ${ + card.ownr_ln || "" + } ${card.ownr_co_nm || ""}`}
    + + + + +
    {card.clm_no || ""}
    + + +
    {card.ins_co_nm || ""}
    + + + + +
    +
    +
    {`B: ${card.labhrs.aggregate.sum.mod_lb_hrs || "?"}`}
    +
    {`R: ${card.labhrs.aggregate.sum.mod_lb_hrs || "?"}`}
    +
    +
    +
    {`B: ${ + card.employee_body_rel + ? `${card.employee_body_rel.first_name} ${card.employee_body_rel.last_name}` + : "" + }`}
    +
    {`P: ${ + card.employee_prep_rel + ? `${card.employee_prep_rel.first_name} ${card.employee_prep_rel.last_name}` + : "" + }`}
    +
    {`R: ${ + card.employee_refinish_rel + ? `${card.employee_refinish_rel.first_name} ${card.employee_refinish_rel.last_name}` + : "" + }`}
    +
    +
    + + + + + {card.scheduled_completion} + + +
    + + + + +
    + + ); +} diff --git a/client/src/components/production-board-kanban/production-board-kanban.component.jsx b/client/src/components/production-board-kanban/production-board-kanban.component.jsx new file mode 100644 index 000000000..bdfe2739e --- /dev/null +++ b/client/src/components/production-board-kanban/production-board-kanban.component.jsx @@ -0,0 +1,123 @@ +import { useApolloClient } from "@apollo/react-hooks"; +import Board, { moveCard } from "@lourenci/react-kanban"; +import "@lourenci/react-kanban/dist/styles.css"; +import { notification } from "antd"; +import React, { useEffect, useState } from "react"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { generate_UPDATE_JOB_KANBAN } from "../../graphql/jobs.queries"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +import ProductionBoardCard from "../production-board-kanban-card/production-board-kanban-card.component"; +import { createBoardData } from "./production-board-kanban.utils.js"; +import IndefiniteLoading from "../indefinite-loading/indefinite-loading.component"; +import { logImEXEvent } from "../../firebase/firebase.utils"; + +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, +}); + +export function ProductionBoardKanbanComponent({ data, bodyshop }) { + const [boardLanes, setBoardLanes] = useState({ + columns: [{ id: "Loading...", title: "Loading...", cards: [] }], + }); + + const [isMoving, setIsMoving] = useState(false); + + const { t } = useTranslation(); + useEffect(() => { + setBoardLanes( + createBoardData(bodyshop.md_ro_statuses.production_statuses, data) + ); + setIsMoving(false); + }, [ + data, + setBoardLanes, + setIsMoving, + bodyshop.md_ro_statuses.production_statuses, + ]); + + const client = useApolloClient(); + + const handleDragEnd = async (card, source, destination) => { + logImEXEvent("kanban_drag_end"); + + setIsMoving(true); + setBoardLanes(moveCard(boardLanes, source, destination)); + const sameColumnTransfer = source.fromColumnId === destination.toColumnId; + const sourceColumn = boardLanes.columns.find( + (x) => x.id === source.fromColumnId + ); + const destinationColumn = boardLanes.columns.find( + (x) => x.id === destination.toColumnId + ); + + const movedCardWillBeFirst = destination.toPosition === 0; + + const movedCardWillBeLast = + destinationColumn.cards.length - destination.toPosition < 1; + + const lastCardInDestinationColumn = + destinationColumn.cards[destinationColumn.cards.length - 1]; + + const oldChildCard = sourceColumn.cards[source.fromPosition + 1]; + + const newChildCard = movedCardWillBeLast + ? null + : destinationColumn.cards[ + sameColumnTransfer + ? source.fromPosition - destination.toPosition > 0 + ? destination.toPosition + : destination.toPosition + 1 + : destination.toPosition + ]; + + const oldChildCardNewParent = oldChildCard ? card.kanbanparent : null; + + let movedCardNewKanbanParent; + if (movedCardWillBeFirst) { + console.log("==> New Card is first."); + movedCardNewKanbanParent = "-1"; + } else if (movedCardWillBeLast) { + console.log("==> New Card is last."); + movedCardNewKanbanParent = lastCardInDestinationColumn.id; + } else if (!!newChildCard) { + console.log("==> New Card is somewhere in the middle"); + movedCardNewKanbanParent = newChildCard.kanbanparent; + } else { + throw new Error("==> !!!!!!Couldn't find a parent.!!!! <=="); + } + const newChildCardNewParent = newChildCard ? card.id : null; + const update = await client.mutate({ + mutation: generate_UPDATE_JOB_KANBAN( + oldChildCard ? oldChildCard.id : null, + oldChildCardNewParent, + card.id, + movedCardNewKanbanParent, + destination.toColumnId, + newChildCard ? newChildCard.id : null, + newChildCardNewParent + ), + }); + if (update.errors) { + notification["error"]({ + message: t("production.errors.boardupdate", { + message: JSON.stringify(update.errors), + }), + }); + } + }; + + return ( +
    + + +
    + ); +} +export default connect(mapStateToProps, null)(ProductionBoardKanbanComponent); diff --git a/client/src/components/production-board-kanban/production-board-kanban.container.jsx b/client/src/components/production-board-kanban/production-board-kanban.container.jsx new file mode 100644 index 000000000..55950c5bf --- /dev/null +++ b/client/src/components/production-board-kanban/production-board-kanban.container.jsx @@ -0,0 +1,27 @@ +import { useSubscription } from "@apollo/react-hooks"; +import React from "react"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { SUBSCRIPTION_JOBS_IN_PRODUCTION } from "../../graphql/jobs.queries"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +import ProductionBoardKanbanComponent from "./production-board-kanban.component"; + +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, +}); + +export function ProductionBoardKanbanContainer({ bodyshop }) { + const { loading, data } = useSubscription(SUBSCRIPTION_JOBS_IN_PRODUCTION, { + variables: { + statusList: bodyshop.md_ro_statuses.production_statuses || [], + }, + }); + + return ( + + ); +} +export default connect(mapStateToProps, null)(ProductionBoardKanbanContainer); diff --git a/client/src/components/production-board-kanban/production-board-kanban.utils.js b/client/src/components/production-board-kanban/production-board-kanban.utils.js new file mode 100644 index 000000000..5bdb020da --- /dev/null +++ b/client/src/components/production-board-kanban/production-board-kanban.utils.js @@ -0,0 +1,82 @@ +import _ from "lodash/"; + +const sortByParentId = (arr) => { + // return arr.reduce((accumulator, currentValue) => { + // //Find the parent item. + // let item = accumulator.find((x) => x.id === currentValue.kanbanparent); + // //Get index of praent item + // let index = accumulator.indexOf(item); + + // index = index !== -1 ? index + 1 : 0; + // accumulator.splice(index, 0, currentValue); + // return accumulator; + // }, []); + + var parentId = "-1"; + var sortedList = []; + var byParentsIdsList = _.groupBy(arr, "kanbanparent"); // Create a new array with objects indexed by parentId + //console.log("sortByParentId -> byParentsIdsList", byParentsIdsList); + + while (byParentsIdsList[parentId]) { + sortedList.push(byParentsIdsList[parentId][0]); + parentId = byParentsIdsList[parentId][0].id; + } + + if (byParentsIdsList["null"]) + byParentsIdsList["null"].map((i) => sortedList.push(i)); + + //Validate that the 2 arrays are of the same length and no children are missing. + if (arr.length !== sortedList.length) { + arr.map((origItem) => { + if (!!!sortedList.find((s) => s.id === origItem.id)) { + sortedList.push(origItem); + console.log("DATA CONSISTENCY ERROR: ", origItem.ro_number); + } + return 1; + }); + } + + return sortedList; +}; + +export const createBoardData = (AllStatuses, Jobs) => { + console.log("==========GENERATING BOARD DATA============="); + const boardLanes = { + columns: AllStatuses.map((s) => { + return { + id: s, + title: s, + cards: [], + }; + }), + }; + const DataGroupedByStatus = _.groupBy(Jobs, (d) => d.status); + + Object.keys(DataGroupedByStatus).map((statusGroupKey) => { + boardLanes.columns.find( + (l) => l.id === statusGroupKey + ).cards = sortByParentId(DataGroupedByStatus[statusGroupKey]); + return null; + }); + + return boardLanes; +}; + +// export const updateBoardOnMove = (board, card, source, destination) => { +// //Slice from source + +// const sourceCardList = board.columns.find((x) => x.id === source.fromColumnId) +// .cards; +// sourceCardList.slice(source.fromPosition, 0); + +// //Splice into destination. +// const destCardList = board.columns.find( +// (x) => x.id === destination.toColumnId +// ).cards; +// console.log("updateBoardOnMove -> destCardList", destCardList); + +// destCardList.splice(destination.toPosition, 0, card); +// console.log("updateBoardOnMove -> destCardList", destCardList); +// console.log("board", board); +// return board; +// }; diff --git a/client/src/components/production-list-columns/production-list-columns.add.component.jsx b/client/src/components/production-list-columns/production-list-columns.add.component.jsx new file mode 100644 index 000000000..5afeb8421 --- /dev/null +++ b/client/src/components/production-list-columns/production-list-columns.add.component.jsx @@ -0,0 +1,41 @@ +import React from "react"; +import { Button, Dropdown, Menu } from "antd"; +import dataSource from "./production-list-columns.data"; +import { useTranslation } from "react-i18next"; +export default function ProductionColumnsComponent({ columnState }) { + const [columns, setColumns] = columnState; + const { t } = useTranslation(); + + const handleAdd = (e) => { + setColumns([...columns, ...dataSource.filter((i) => i.key === e.key)]); + }; + + const columnKeys = columns.map((i) => i.key); + + const menu = ( + + {dataSource + .filter((i) => !columnKeys.includes(i.key)) + .map((item) => ( + {item.title} + ))} + + ); + return ( +
    + + + +
    + ); +} + +// c.key)} +// render={(item) => item.title} +// onChange={(nextTargetKeys, direction, moveKeys) => { +// setColumns(dataSource.filter((i) => nextTargetKeys.includes(i.key))); +// }} +// /> diff --git a/client/src/components/production-list-columns/production-list-columns.alert.component.jsx b/client/src/components/production-list-columns/production-list-columns.alert.component.jsx new file mode 100644 index 000000000..f8df5fa5e --- /dev/null +++ b/client/src/components/production-list-columns/production-list-columns.alert.component.jsx @@ -0,0 +1,60 @@ +import { ExclamationCircleFilled } from "@ant-design/icons"; +import { Dropdown, Menu } from "antd"; +import React from "react"; +import { useTranslation } from "react-i18next"; +import { useMutation } from "@apollo/react-hooks"; +import { UPDATE_JOB } from "../../graphql/jobs.queries"; +import { logImEXEvent } from "../../firebase/firebase.utils"; + +export default function ProductionListColumnAlert({ record }) { + const { t } = useTranslation(); + + const [updateAlert] = useMutation(UPDATE_JOB); + + const handleAlertToggle = (e) => { + logImEXEvent("production_toggle_alert"); + //e.stopPropagation(); + updateAlert({ + variables: { + jobId: record.id, + job: { + production_vars: { + ...record.production_vars, + alert: + !!record.production_vars && !!record.production_vars.alert + ? !record.production_vars.alert + : true, + }, + }, + }, + }).then(() => { + if (record.refetch) record.refetch(); + }); + }; + + return ( + + + {record.production_vars && record.production_vars.alert + ? t("production.labels.alertoff") + : t("production.labels.alerton")} + + + } + trigger={["contextMenu"]} + > +
    + {record.production_vars && record.production_vars.alert ? ( + + ) : null} +
    +
    + ); +} diff --git a/client/src/components/production-list-columns/production-list-columns.bodypriority.component.jsx b/client/src/components/production-list-columns/production-list-columns.bodypriority.component.jsx new file mode 100644 index 000000000..603c7e333 --- /dev/null +++ b/client/src/components/production-list-columns/production-list-columns.bodypriority.component.jsx @@ -0,0 +1,56 @@ +import { useMutation } from "@apollo/react-hooks"; +import { Dropdown, Menu } from "antd"; +import React from "react"; +import { useTranslation } from "react-i18next"; +import { UPDATE_JOB } from "../../graphql/jobs.queries"; +import { logImEXEvent } from "../../firebase/firebase.utils"; + +export default function ProductionListColumnBodyPriority({ record }) { + const { t } = useTranslation(); + + const [updateAlert] = useMutation(UPDATE_JOB); + + const handleSetBodyPriority = (e) => { + logImEXEvent("production_set_body_priority"); + e.stopPropagation(); + const { key } = e; + updateAlert({ + variables: { + jobId: record.id, + job: { + production_vars: { + ...record.production_vars, + bodypriority: key === "clearBodyPriority" ? null : key, + }, + }, + }, + }).then(() => { + if (record.refetch) record.refetch(); + }); + }; + + return ( + + + {t("production.actions.bodypriority-clear")} + + + {new Array(9).fill().map((value, index) => ( + {index + 1} + ))} + + + } + trigger={["contextMenu"]} + > +
    + {record.production_vars && record.production_vars.bodypriority} +
    +
    + ); +} diff --git a/client/src/components/production-list-columns/production-list-columns.data.js b/client/src/components/production-list-columns/production-list-columns.data.js new file mode 100644 index 000000000..370ca2797 --- /dev/null +++ b/client/src/components/production-list-columns/production-list-columns.data.js @@ -0,0 +1,218 @@ +import i18n from "i18next"; +import React from "react"; +import { Link } from "react-router-dom"; +import CurrencyFormatter from "../../utils/CurrencyFormatter"; +import { DateFormatter } from "../../utils/DateFormatter"; +import PhoneFormatter from "../../utils/PhoneFormatter"; +import { alphaSort } from "../../utils/sorters"; +import ProductionListColumnAlert from "./production-list-columns.alert.component"; +import ProductionListColumnBodyPriority from "./production-list-columns.bodypriority.component"; +import ProductionListColumnPaintPriority from "./production-list-columns.paintpriority.component"; +import ProductionListColumnStatus from "./production-list-columns.status.component"; +import ProductionListColumnNote from "./production-list-columns.productionnote.component"; + + +export default [ + { + title: i18n.t("jobs.actions.viewdetail"), + dataIndex: "viewdetail", + key: "viewdetail", + ellipsis: true, + render: (text, record) => ( + {i18n.t("general.labels.view")} + ), + }, + { + title: i18n.t("jobs.fields.ro_number"), + dataIndex: "ro_number", + key: "ro_number", + ellipsis: true, + sorter: (a, b) => alphaSort(a.ro_number, b.ro_number), + render: (text, record) => ( + {record.ro_number} + ), + }, + { + title: i18n.t("jobs.fields.owner"), + dataIndex: "ownr", + key: "ownr", + ellipsis: true, + render: (text, record) => ( + {`${record.ownr_fn || ""} ${record.ownr_ln || ""} ${ + record.ownr_co_nm || "" + }`} + ), + sorter: (a, b) => alphaSort(a.ownr_ln, b.ownr_ln), + }, + { + title: i18n.t("jobs.fields.vehicle"), + dataIndex: "vehicle", + key: "vehicle", + ellipsis: true, + render: (text, record) => ( + {`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${ + record.v_model_desc || "" + } ${record.v_color || ""} ${record.plate_no || ""}`} + ), + }, + { + title: i18n.t("jobs.fields.actual_in"), + dataIndex: "actual_in", + key: "actual_in", + ellipsis: true, + sorter: (a, b) => a.actual_in - b.actual_in, + render: (text, record) => ( + {record.actual_in || ""} + ), + }, + { + title: i18n.t("jobs.fields.scheduled_completion"), + dataIndex: "scheduled_completion", + key: "scheduled_completion", + ellipsis: true, + sorter: (a, b) => a.scheduled_completion - b.scheduled_completion, + render: (text, record) => ( + {record.scheduled_completion} + ), + }, + { + title: i18n.t("jobs.fields.scheduled_delivery"), + dataIndex: "scheduled_delivery", + key: "scheduled_delivery", + ellipsis: true, + sorter: (a, b) => a.scheduled_delivery - b.scheduled_delivery, + render: (text, record) => ( + {record.scheduled_delivery} + ), + }, + { + title: i18n.t("jobs.fields.ins_co_nm"), + dataIndex: "ins_co_nm", + key: "ins_co_nm", + ellipsis: true, + sorter: (a, b) => alphaSort(a.ins_co_nm, b.ins_co_nm), + }, + { + title: i18n.t("jobs.fields.clm_no"), + dataIndex: "clm_no", + key: "clm_no", + ellipsis: true, + sorter: (a, b) => alphaSort(a.clm_no, b.clm_no), + }, + { + title: i18n.t("jobs.fields.clm_total"), + dataIndex: "clm_total", + key: "clm_total", + ellipsis: true, + sorter: (a, b) => a.clm_total - b.clm_total, + render: (text, record) => ( + {record.clm_total} + ), + }, + { + title: i18n.t("jobs.fields.owner_owing"), + dataIndex: "owner_owing", + key: "owner_owing", + ellipsis: true, + sorter: (a, b) => a.owner_owing - b.owner_owing, + render: (text, record) => ( + {record.owner_owing} + ), + }, + { + title: i18n.t("jobs.fields.ownr_ph1"), + dataIndex: "ownr_ph1", + key: "ownr_ph1", + ellipsis: true, + render: (text, record) => ( + {record.ownr_ph1} + ), + }, + { + title: i18n.t("jobs.fields.specialcoveragepolicy"), + dataIndex: "special_coverage_policy", + key: "special_coverage_policy", + ellipsis: true, + }, + { + title: i18n.t("jobs.fields.csr"), + dataIndex: "csr", + key: "csr", + ellipsis: true, + sorter: (a, b) => alphaSort(a.csr, b.csr), + }, + { + title: i18n.t("jobs.fields.status"), + dataIndex: "status", + key: "status", + ellipsis: true, + sorter: (a, b) => alphaSort(a.status, b.status), + render: (text, record) => , + }, + { + title: i18n.t("production.labels.bodyhours"), + dataIndex: "labhrs", + key: "labhrs", + sorter: (a, b) => a.labhrs - b.labhrs, + }, + { + title: i18n.t("production.labels.refinishhours"), + dataIndex: "larhrs", + key: "larhrs", + sorter: (a, b) => a.larhrs - b.larhrs, + }, + { + title: i18n.t("production.labels.alert"), + dataIndex: "alert", + key: "alert", + + render: (text, record) => , + }, + { + title: i18n.t("production.labels.note"), + dataIndex: "note", + key: "note", + ellipsis: true, + render: (text, record) => , + }, + { + title: i18n.t("production.labels.cycletime"), + dataIndex: "ct", + key: "ct", + + render: (text, record) => { + let ct = 0; + if (!!record.actual_in) { + const totalHrs = record.larhrs + record.labhrs; + const Difference_In_Time = new Date() - new Date(record.actual_in); + const Difference_In_Days = Difference_In_Time / (1000 * 3600 * 24); + ct = (totalHrs / Difference_In_Days).toFixed(2); + } + return {ct || 0}; + }, + }, + { + title: i18n.t("production.labels.bodypriority"), + dataIndex: "bodypriority", + key: "bodypriority", + + sorter: (a, b) => + ((a.production_vars && a.production_vars.bodypriority) || 11) - + ((b.production_vars && b.production_vars.bodypriority) || 11), + render: (text, record) => ( + + ), + }, + { + title: i18n.t("production.labels.paintpriority"), + dataIndex: "paintpriority", + key: "paintpriority", + + sorter: (a, b) => + ((a.production_vars && a.production_vars.paintpriority) || 11) - + ((b.production_vars && b.production_vars.paintpriority) || 11), + render: (text, record) => ( + + ), + }, +]; diff --git a/client/src/components/production-list-columns/production-list-columns.paintpriority.component.jsx b/client/src/components/production-list-columns/production-list-columns.paintpriority.component.jsx new file mode 100644 index 000000000..1379ca6c4 --- /dev/null +++ b/client/src/components/production-list-columns/production-list-columns.paintpriority.component.jsx @@ -0,0 +1,54 @@ +import { useMutation } from "@apollo/react-hooks"; +import { Dropdown, Menu } from "antd"; +import React from "react"; +import { useTranslation } from "react-i18next"; +import { UPDATE_JOB } from "../../graphql/jobs.queries"; +import { logImEXEvent } from "../../firebase/firebase.utils"; + +export default function ProductionListColumnPaintPriority({ record }) { + const { t } = useTranslation(); + + const [updateAlert] = useMutation(UPDATE_JOB); + + const handleSetPaintPriority = (e) => { + logImEXEvent("production_set_paint_priority"); + e.stopPropagation(); + const { key } = e; + updateAlert({ + variables: { + jobId: record.id, + job: { + production_vars: { + ...record.production_vars, + paintpriority: key === "clearPaintPriority" ? null : key, + }, + }, + }, + }).then(() => { + if (record.refetch) record.refetch(); + }); + }; + + return ( + + + {t("production.actions.paintpriority-clear")} + + + {new Array(9).fill().map((value, index) => ( + {index + 1} + ))} + + + } + trigger={["contextMenu"]}> +
    + {record.production_vars && record.production_vars.paintpriority} +
    +
    + ); +} diff --git a/client/src/components/production-list-columns/production-list-columns.productionnote.component.jsx b/client/src/components/production-list-columns/production-list-columns.productionnote.component.jsx new file mode 100644 index 000000000..ac4b8e80c --- /dev/null +++ b/client/src/components/production-list-columns/production-list-columns.productionnote.component.jsx @@ -0,0 +1,77 @@ +import { useMutation } from "@apollo/react-hooks"; +import { Button, Input, Popover } from "antd"; +import React, { useState } from "react"; +import { useTranslation } from "react-i18next"; +import { UPDATE_JOB } from "../../graphql/jobs.queries"; +import { logImEXEvent } from "../../firebase/firebase.utils"; + +export default function ProductionListColumnProductionNote({ record }) { + const { t } = useTranslation(); + + const [note, setNote] = useState( + (record.production_vars && record.production_vars.note) || "" + ); + + const [visible, setVisible] = useState(false); + + const [updateAlert] = useMutation(UPDATE_JOB); + + const handleSaveNote = (e) => { + logImEXEvent("production_add_note"); + e.stopPropagation(); + setVisible(false); + updateAlert({ + variables: { + jobId: record.id, + job: { + production_vars: { + ...record.production_vars, + note: note, + }, + }, + }, + }).then(() => { + if (record.refetch) record.refetch(); + }); + }; + + const handleChange = (e) => { + e.stopPropagation(); + setNote(e.target.value); + }; + + const handleVisibleChange = (flag) => { + + setVisible(flag); + if (flag) + setNote((record.production_vars && record.production_vars.note) || ""); + }; + + return ( + + +
    + +
    + + } + trigger={["contextMenu"]}> +
    + {(record.production_vars && record.production_vars.note) || " "} +
    +
    + ); +} diff --git a/client/src/components/production-list-columns/production-list-columns.status.component.jsx b/client/src/components/production-list-columns/production-list-columns.status.component.jsx new file mode 100644 index 000000000..77df7622b --- /dev/null +++ b/client/src/components/production-list-columns/production-list-columns.status.component.jsx @@ -0,0 +1,49 @@ +import { useMutation } from "@apollo/react-hooks"; +import { Dropdown, Menu } from "antd"; +import React from "react"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { UPDATE_JOB } from "../../graphql/jobs.queries"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +import { logImEXEvent } from "../../firebase/firebase.utils"; + +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, +}); + +export function ProductionListColumnStatus({ record, bodyshop }) { + const [updateJob] = useMutation(UPDATE_JOB); + + const handleSetStatus = (e) => { + logImEXEvent("production_change_status"); + e.stopPropagation(); + const { key } = e; + updateJob({ + variables: { + jobId: record.id, + job: { + status: key, + }, + }, + }).then(() => { + if (record.refetch) record.refetch(); + }); + }; + + return ( + + {bodyshop.md_ro_statuses.statuses.map((item) => ( + {item} + ))} + + } + trigger={["contextMenu"]}> +
    {record.status}
    +
    + ); +} +export default connect(mapStateToProps, null)(ProductionListColumnStatus); diff --git a/client/src/components/production-list-detail/production-list-detail.component.jsx b/client/src/components/production-list-detail/production-list-detail.component.jsx new file mode 100644 index 000000000..147105d3e --- /dev/null +++ b/client/src/components/production-list-detail/production-list-detail.component.jsx @@ -0,0 +1,72 @@ +import React from "react"; +import { Descriptions, Drawer } from "antd"; +import { useTranslation } from "react-i18next"; +import CurrencyFormatter from "../../utils/CurrencyFormatter"; +import { DateFormatter } from "../../utils/DateFormatter"; +import PartsPieGraph from "../parts-status-pie/parts-status-pie.component"; +import Barcode from "react-barcode"; +import ProductionRemoveButton from "../production-remove-button/production-remove-button.component"; +import queryString from "query-string"; +import { useHistory, useLocation } from "react-router-dom"; + +export default function ProductionListDetail({ jobs }) { + const search = queryString.parse(useLocation().search); + const history = useHistory(); + const { selected } = search; + + const { t } = useTranslation(); + const theJob = jobs.find((j) => j.id === selected) || {}; + + const handleClose = () => { + delete search.selected; + history.push({ search: queryString.stringify(search) }); + }; + + return ( + +
    + + + + {theJob.ro_number || ""} + + + {`${theJob.ownr_fn || ""} ${theJob.ownr_ln || ""} ${ + theJob.ownr_co_nm || "" + }`} + + + {`${theJob.v_model_yr || ""} ${theJob.v_color || ""} ${ + theJob.v_make_desc || "" + } ${theJob.v_model_desc || ""}`} + + + {theJob.clm_total} + + + {theJob.actual_in} + + + {theJob.scheduled_completion} + + + + + + +
    +
    + ); +} diff --git a/client/src/components/production-list-save-config-button/production-list-save-config-button.component.jsx b/client/src/components/production-list-save-config-button/production-list-save-config-button.component.jsx new file mode 100644 index 000000000..c4794e044 --- /dev/null +++ b/client/src/components/production-list-save-config-button/production-list-save-config-button.component.jsx @@ -0,0 +1,57 @@ +import { useMutation } from "@apollo/react-hooks"; +import React from "react"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +import { Button } from "antd"; +import { useTranslation } from "react-i18next"; +import { UPDATE_SHOP } from "../../graphql/bodyshop.queries"; +import { logImEXEvent } from "../../firebase/firebase.utils"; + +const mapStateToProps = createStructuredSelector({ + //currentUser: selectCurrentUser + bodyshop: selectBodyshop, +}); +const mapDispatchToProps = (dispatch) => ({ + //setUserLanguage: language => dispatch(setUserLanguage(language)) +}); + +export function ProductionListSaveConfigButton({ + columns, + bodyshop, + tableState, +}) { + const [updateShop] = useMutation(UPDATE_SHOP); + const { t } = useTranslation(); + + const handleSaveConfig = () => { + logImEXEvent("production_save_config"); + + updateShop({ + variables: { + id: bodyshop.id, + shop: { + production_config: { + columnKeys: columns.map((i) => { + return { key: i.key, width: i.width }; + }), + tableState, + }, + }, + }, + }).then((response) => { + const shopDetails = response.data.update_bodyshops.returning[0]; + console.log("handleSaveConfig -> shopDetails", shopDetails); + }); + }; + + return ( + + ); +} +export default connect( + mapStateToProps, + mapDispatchToProps +)(ProductionListSaveConfigButton); diff --git a/client/src/components/production-list-table/production-list-table.component.jsx b/client/src/components/production-list-table/production-list-table.component.jsx new file mode 100644 index 000000000..ecd626ff8 --- /dev/null +++ b/client/src/components/production-list-table/production-list-table.component.jsx @@ -0,0 +1,186 @@ +import { SyncOutlined } from "@ant-design/icons"; +import { Button, Dropdown, Input, Menu, Table } from "antd"; +import React, { useState } from "react"; +import ReactDragListView from "react-drag-listview"; //TODO Is there a better way? This library is too big. +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +import ProductionListColumnsAdd from "../production-list-columns/production-list-columns.add.component"; +import ProductionListSaveConfigButton from "../production-list-save-config-button/production-list-save-config-button.component"; +import ResizeableTitle from "./production-list-table.resizeable.component"; +import "./production-list-table.styles.scss"; +import ProductionListDetail from "../production-list-detail/production-list-detail.component"; + +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, +}); + +const OneCalendarDay = 60 * 60 * 24 * 1000; + +export function ProductionListTable({ + columnState, + loading, + data, + bodyshop, + refetch, +}) { + const [columns, setColumns] = columnState; + const [searchText, setSearchText] = useState(""); + const [state, setState] = useState( + bodyshop.production_config.tableState || { + sortedInfo: {}, + filteredInfo: { text: "" }, + } + ); + const { t } = useTranslation(); + const Now = new Date(); + const handleTableChange = (pagination, filters, sorter) => { + setState({ + ...state, + filteredInfo: filters, + sortedInfo: { columnKey: sorter.columnKey, order: sorter.order }, + }); + }; + + const onDragEnd = (fromIndex, toIndex) => { + const columnsCopy = columns.slice(); + const item = columnsCopy.splice(fromIndex, 1)[0]; + columnsCopy.splice(toIndex, 0, item); + setColumns(columnsCopy); + }; + + const removeColumn = (e) => { + const { key } = e; + setColumns(columns.filter((i) => i.key !== key)); + }; + + const handleResize = (index) => (e, { size }) => { + const nextColumns = [...columns]; + nextColumns[index] = { + ...nextColumns[index], + width: size.width, + }; + setColumns(nextColumns); + }; + + const headerItem = (col) => ( + + + {t("production.actions.removecolumn")} + + + } + trigger={["contextMenu"]} + > + {col.title} + + ); + + const dataSource = + searchText === "" + ? data + : data.filter( + (j) => + (j.ro_number || "") + .toString() + .toLowerCase() + .includes(searchText.toLowerCase()) || + (j.ownr_fn || "") + .toLowerCase() + .includes(searchText.toLowerCase()) || + (j.ownr_ln || "") + .toLowerCase() + .includes(searchText.toLowerCase()) || + (j.status || "").toLowerCase().includes(searchText.toLowerCase()) || + (j.ins_co_nm || "") + .toLowerCase() + .includes(searchText.toLowerCase()) || + (j.clm_no || "").toLowerCase().includes(searchText.toLowerCase()) || + (j.v_model_desc || "") + .toLowerCase() + .includes(searchText.toLowerCase()) || + (j.v_make_desc || "") + .toLowerCase() + .includes(searchText.toLowerCase()) + ); + + const tableTitle = () => ( +
    + + + + setSearchText(e.target.value)} + placeholder={t("general.labels.search")} + value={searchText} + /> +
    + ); + + // const handleSelectRecord = (record) => { + // if (selected !== record.id) { + // setSelected(record.id); + // } else { + // setSelected(null); + // } + // }; + + if (!!!columns) return
    No columns found.
    ; + + return ( +
    + + +
    { + return { + ...c, + sortOrder: + state.sortedInfo.columnKey === c.key && state.sortedInfo.order, + title: headerItem(c), + onHeaderCell: (column) => ({ + width: column.width, + onResize: handleResize(index), + }), + }; + })} + rowKey="id" + loading={loading} + dataSource={dataSource} + onChange={handleTableChange} + rowClassName={(record, index) => { + const classes = []; //TODO What could be good usage here? + if (!!record.scheduled_completion) { + if (new Date(record.scheduled_completion) - Now < OneCalendarDay) + classes.push("production-completion-1"); + } + return classes.join(" "); + }} + /> + + + ); +} +export default connect(mapStateToProps, null)(ProductionListTable); diff --git a/client/src/components/production-list-table/production-list-table.container.jsx b/client/src/components/production-list-table/production-list-table.container.jsx new file mode 100644 index 000000000..4b03ace3f --- /dev/null +++ b/client/src/components/production-list-table/production-list-table.container.jsx @@ -0,0 +1,41 @@ +import { useSubscription } from "@apollo/react-hooks"; +import React, { useState } from "react"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { SUBSCRIPTION_JOBS_IN_PRODUCTION } from "../../graphql/jobs.queries"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +import ProductionListColumns from "../production-list-columns/production-list-columns.data"; +import ProductionListTable from "./production-list-table.component"; + +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, +}); + +export default connect(mapStateToProps, null)(ProductionListTableContainer); + +export function ProductionListTableContainer({ bodyshop }) { + const { loading, data } = useSubscription(SUBSCRIPTION_JOBS_IN_PRODUCTION, { + variables: { + statusList: bodyshop.md_ro_statuses.production_statuses || [], + }, + }); + + const columnState = useState( + (bodyshop.production_config && + bodyshop.production_config.columnKeys.map((k) => { + return { + ...ProductionListColumns.find((e) => e.key === k.key), + width: k.width, + }; + })) || + [] + ); + + return ( + + ); +} diff --git a/client/src/components/production-list-table/production-list-table.resizeable.component.jsx b/client/src/components/production-list-table/production-list-table.resizeable.component.jsx new file mode 100644 index 000000000..996a08418 --- /dev/null +++ b/client/src/components/production-list-table/production-list-table.resizeable.component.jsx @@ -0,0 +1,11 @@ +import React from "react"; +import { Resizable } from "react-resizable"; + +export default (props) => { + const { onResize, width, ...restProps } = props; + return ( + + - - - Automatic Job Selection. - - - - Manual Job Selection Scheduled Time - { - setAppData({ ...appData, start: e }); - }} - /> - { - setAppData({ ...appData, start: e }); - }} - /> - - - +
    + {t("appointments.fields.time")} + { + setAppData({ ...appData, start: e }); + }} + /> + +
    +
    + {appData.smartDates.map((d, idx) => ( + + ))} +
    + + {t("appointments.labels.history")} - { - //TODO Build out notifications. - } + - setFormData({ ...formData, notifyCustomer: e.target.checked }) + defaultChecked={appData.notifyCustomer} + onChange={(e) => + setAppData({ ...appData, notifyCustomer: e.target.checked }) } > {t("jobs.labels.appointmentconfirmation")} + setAppData({ ...appData, email: e.target.value })} + /> - +
    + +
    ); diff --git a/client/src/components/schedule-job-modal/schedule-job-modal.container.jsx b/client/src/components/schedule-job-modal/schedule-job-modal.container.jsx index 0b8c008f1..3e6d4c5a8 100644 --- a/client/src/components/schedule-job-modal/schedule-job-modal.container.jsx +++ b/client/src/components/schedule-job-modal/schedule-job-modal.container.jsx @@ -1,20 +1,23 @@ -import React, { useState } from "react"; +import React, { useState, useEffect } from "react"; import ScheduleJobModalComponent from "./schedule-job-modal.component"; import { useMutation, useQuery } from "@apollo/react-hooks"; import { INSERT_APPOINTMENT, + CANCEL_APPOINTMENT_BY_ID, QUERY_APPOINTMENTS_BY_JOBID, } from "../../graphql/appointments.queries"; import moment from "moment"; import { notification, Modal } from "antd"; import { useTranslation } from "react-i18next"; -import { UPDATE_JOB_STATUS } from "../../graphql/jobs.queries"; - +import { UPDATE_JOBS } from "../../graphql/jobs.queries"; +import { setEmailOptions } from "../../redux/email/email.actions"; import { connect } from "react-redux"; import { createStructuredSelector } from "reselect"; import { selectBodyshop } from "../../redux/user/user.selectors"; import { selectSchedule } from "../../redux/modals/modals.selectors"; import { toggleModalVisible } from "../../redux/modals/modals.actions"; +import { TemplateList } from "../../utils/TemplateConstants"; +import { logImEXEvent } from "../../firebase/firebase.utils"; const mapStateToProps = createStructuredSelector({ bodyshop: selectBodyshop, @@ -22,68 +25,128 @@ const mapStateToProps = createStructuredSelector({ }); const mapDispatchToProps = (dispatch) => ({ toggleModalVisible: () => dispatch(toggleModalVisible("schedule")), + setEmailOptions: (e) => dispatch(setEmailOptions(e)), }); export function ScheduleJobModalContainer({ scheduleModal, bodyshop, toggleModalVisible, + setEmailOptions, }) { const { visible, context, actions } = scheduleModal; - const { jobId } = context; + const { jobId, job, previousEvent } = context; const { refetch } = actions; - + const [loading, setLoading] = useState(false); const [appData, setAppData] = useState({ + notifyCustomer: !!(job && job.ownr_ea), + email: (job && job.ownr_ea) || "", start: null, + smartDates: [], }); + const [cancelAppointment] = useMutation(CANCEL_APPOINTMENT_BY_ID); const [insertAppointment] = useMutation(INSERT_APPOINTMENT); - const [updateJobStatus] = useMutation(UPDATE_JOB_STATUS, { - variables: { - jobId: jobId, - status: bodyshop.md_ro_statuses.default_scheduled, - }, - }); - const [formData, setFormData] = useState({ notifyCustomer: false }); + const [updateJobStatus] = useMutation(UPDATE_JOBS); + + useEffect(() => { + setAppData({ + notifyCustomer: !!(job && job.ownr_ea), + email: (job && job.ownr_ea) || "", + start: null, + smartDates: [], + }); + }, [job, setAppData]); + const { t } = useTranslation(); const existingAppointments = useQuery(QUERY_APPOINTMENTS_BY_JOBID, { variables: { jobid: jobId }, fetchPolicy: "network-only", - skip: !visible, + skip: !visible || !!!jobId, }); - //TODO Customize the amount of minutes it will add. - const handleOk = () => { - insertAppointment({ - variables: { - app: { - ...appData, - jobid: jobId, - bodyshopid: bodyshop.id, - end: moment(appData.start).add(60, "minutes"), - }, - }, - }) - .then((r) => { - updateJobStatus().then((r) => { - notification["success"]({ - message: t("appointments.successes.created"), - }); + const handleOk = async () => { + logImEXEvent("schedule_new_appointment"); - if (formData.notifyCustomer) { - //TODO Implement customer reminder on scheduling. - alert("Chosed to notify the customer somehow!"); - } - toggleModalVisible(); - if (refetch) refetch(); - }); - }) - .catch((error) => { + setLoading(true); + if (!!previousEvent) { + const cancelAppt = await cancelAppointment({ + variables: { appid: previousEvent }, + }); + notification["success"]({ + message: t("appointments.successes.canceled"), + }); + + if (!!cancelAppt.errors) { notification["error"]({ - message: t("appointments.errors.saving", { - message: error.message, + message: t("appointments.errors.canceling", { + message: JSON.stringify(cancelAppt.errors), }), }); + return; + } + } + + const appt = await insertAppointment({ + variables: { + app: { + //...appData, + jobid: jobId, + bodyshopid: bodyshop.id, + start: moment(appData.start), + end: moment(appData.start).add(bodyshop.appt_length || 60, "minutes"), + }, + }, + }); + + if (!!appt.errors) { + notification["error"]({ + message: t("appointments.errors.saving", { + message: JSON.stringify(appt.errors), + }), }); + return; + } + notification["success"]({ + message: t("appointments.successes.created"), + }); + if (jobId) { + const jobUpdate = await updateJobStatus({ + variables: { + jobIds: [jobId], + fields: { + status: bodyshop.md_ro_statuses.default_scheduled, + date_scheduled: new Date(), + scheduled_in: appData.start, + }, + }, + }); + + if (!!jobUpdate.errors) { + notification["error"]({ + message: t("appointments.errors.saving", { + message: JSON.stringify(jobUpdate.errors), + }), + }); + return; + } + } + setLoading(false); + toggleModalVisible(); + if (appData.notifyCustomer) { + setEmailOptions({ + messageOptions: { + to: [appData.email], + replyTo: bodyshop.email, + }, + template: { + name: TemplateList.appointment_confirmation.key, + variables: { + id: appt.data.insert_appointments.returning[0].id, + }, + }, + }); + } + if (refetch) refetch(); }; return ( @@ -94,14 +157,15 @@ export function ScheduleJobModalContainer({ width={"90%"} maskClosable={false} destroyOnClose - okButtonProps={{ disabled: appData.start ? false : true }} + okButtonProps={{ + disabled: appData.start ? false : true, + loading: loading, + }} > ); diff --git a/client/src/components/scoreboard-chart/scoreboard-chart.component.jsx b/client/src/components/scoreboard-chart/scoreboard-chart.component.jsx new file mode 100644 index 000000000..7a2c32e0e --- /dev/null +++ b/client/src/components/scoreboard-chart/scoreboard-chart.component.jsx @@ -0,0 +1,125 @@ +import moment from "moment"; +import React from "react"; +import { connect } from "react-redux"; +import { + Area, + Bar, + + + CartesianGrid, ComposedChart, + + + + + + + + Legend, Line, + + + + + + + + ResponsiveContainer, Tooltip, XAxis, + YAxis +} from "recharts"; +import { createStructuredSelector } from "reselect"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +import * as Utils from "../scoreboard-targets-table/scoreboard-targets-table.util"; + +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, +}); + +const mapDispatchToProps = (dispatch) => ({ + //setUserLanguage: language => dispatch(setUserLanguage(language)) +}); +export default connect(mapStateToProps, mapDispatchToProps)(ScoreboardChart); + +export function ScoreboardChart({ sbEntriesByDate, bodyshop }) { + const listOfBusDays = Utils.ListOfDaysInCurrentMonth(); + + const data = listOfBusDays.reduce((acc, val) => { + //Sum up the current day. + let dayhrs; + if (!!sbEntriesByDate[val]) { + dayhrs = sbEntriesByDate[val].reduce( + (dayAcc, dayVal) => { + return { + bodyhrs: dayAcc.bodyhrs + dayVal.bodyhrs, + painthrs: dayAcc.painthrs + dayVal.painthrs, + }; + }, + { bodyhrs: 0, painthrs: 0 } + ); + } else { + dayhrs = { + bodyhrs: 0, + painthrs: 0, + }; + } + + const theValue = { + date: moment(val).format("D dd"), + paintHrs: dayhrs.painthrs, + bodyHrs: dayhrs.bodyhrs, + accTargetHrs: Utils.AsOfDateTargetHours( + bodyshop.scoreboard_target.dailyBodyTarget + + bodyshop.scoreboard_target.dailyPaintTarget, + val + ), + accHrs: + acc.length > 0 + ? acc[acc.length - 1].accHrs + dayhrs.painthrs + dayhrs.bodyhrs + : dayhrs.painthrs + dayhrs.bodyhrs, + }; + + return [...acc, theValue]; + }, []); + + return ( +
    + + + + + + + + + + + + + +
    + ); +} diff --git a/client/src/components/scoreboard-day-stats/scoreboard-day-stats.component.jsx b/client/src/components/scoreboard-day-stats/scoreboard-day-stats.component.jsx new file mode 100644 index 000000000..7475e7fd9 --- /dev/null +++ b/client/src/components/scoreboard-day-stats/scoreboard-day-stats.component.jsx @@ -0,0 +1,43 @@ +import { Card, Statistic } from "antd"; +import moment from "moment"; +import React from "react"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, +}); +const mapDispatchToProps = (dispatch) => ({ + //setUserLanguage: language => dispatch(setUserLanguage(language)) +}); + +export function ScoreboardDayStats({ bodyshop, date, entries }) { + const { dailyPaintTarget, dailyBodyTarget } = bodyshop.scoreboard_target; + + //let totalHrs = 0; + const paintHrs = entries.reduce((acc, value) => { + // totalHrs = +value.painthrs; + return acc + value.painthrs; + }, 0); + + const bodyHrs = entries.reduce((acc, value) => { + //totalHrs = +value.bodyhrs; + return acc + value.bodyhrs; + }, 0); + + return ( +
    + + bodyHrs ? "red" : "green" }} + value={bodyHrs.toFixed(1)} + /> + paintHrs ? "red" : "green" }} + value={paintHrs.toFixed(1)} + /> + +
    + ); +} +export default connect(mapStateToProps, mapDispatchToProps)(ScoreboardDayStats); diff --git a/client/src/components/scoreboard-display/scoreboard-display.component.jsx b/client/src/components/scoreboard-display/scoreboard-display.component.jsx new file mode 100644 index 000000000..4a6f2fee4 --- /dev/null +++ b/client/src/components/scoreboard-display/scoreboard-display.component.jsx @@ -0,0 +1,32 @@ +import React from "react"; +import ScoreboardChart from "../scoreboard-chart/scoreboard-chart.component"; +import ScoreboardJobsList from "../scoreboard-jobs-list/scoreboard-jobs-list.component"; +import ScoreboardLastDays from "../scoreboard-last-days/scoreboard-last-days.component"; +import ScoreboardTargetsTable from "../scoreboard-targets-table/scoreboard-targets-table.component"; + +export default function ScoreboardDisplayComponent({ scoreboardSubscription }) { + const { data } = scoreboardSubscription; + + const scoreBoardlist = (data && data.scoreboard) || []; + console.log("ScoreboardDisplayComponent -> scoreBoardlist", scoreBoardlist); + + const sbEntriesByDate = {}; + + scoreBoardlist.forEach((i) => { + const entryDate = i.date; + if (!!!sbEntriesByDate[entryDate]) { + sbEntriesByDate[entryDate] = []; + } + sbEntriesByDate[entryDate].push(i); + }); + + console.log("ScoreboardDisplayComponent -> sbEntriesByDate", sbEntriesByDate); + return ( +
    + + + + +
    + ); +} diff --git a/client/src/components/scoreboard-jobs-list/scoreboard-jobs-list.component.jsx b/client/src/components/scoreboard-jobs-list/scoreboard-jobs-list.component.jsx new file mode 100644 index 000000000..496227219 --- /dev/null +++ b/client/src/components/scoreboard-jobs-list/scoreboard-jobs-list.component.jsx @@ -0,0 +1,76 @@ +import React from "react"; +import { Dropdown, Button, Table } from "antd"; +import { useTranslation } from "react-i18next"; +import { Link } from "react-router-dom"; +import ScoreboardRemoveButton from "../scoreboard-remove-button/scorebard-remove-button.component"; +import { DateFormatter } from "../../utils/DateFormatter"; + +export default function ScoreboardJobsList({ scoreBoardlist }) { + const { t } = useTranslation(); + + const columns = [ + { + title: t("jobs.fields.ro_number"), + dataIndex: "ro_number", + key: "ro_number", + render: (text, record) => ( + {record.job.ro_number} + ), + }, + { + title: t("jobs.fields.est_number"), + dataIndex: "est_number", + key: "est_number", + render: (text, record) => ( + + {record.job.est_number} + + ), + }, + { + title: t("scoreboard.fields.date"), + dataIndex: "date", + key: "date", + render: (text, record) => {record.date}, + }, + { + title: t("scoreboard.fields.painthrs"), + dataIndex: "painthrs", + key: "painthrs", + }, + { + title: t("scoreboard.fields.bodyhrs"), + dataIndex: "bodyhrs", + key: "bodyhrs", + }, + { + title: t("general.labels.actions"), + dataIndex: "actions", + key: "actions", + render: (text, record) => ( +
    + +
    + ), + }, + ]; + + const overlay = ( +
    +
    + + ); +}; diff --git a/client/src/components/production-list-table/production-list-table.styles.scss b/client/src/components/production-list-table/production-list-table.styles.scss new file mode 100644 index 000000000..f75fdce8d --- /dev/null +++ b/client/src/components/production-list-table/production-list-table.styles.scss @@ -0,0 +1,39 @@ +.production-alert { + animation: alertBlinker 1s linear infinite; + color: blue; +} +@keyframes alertBlinker { + 50% { + color: red; + opacity: 100; + //opacity: 0; + } +} + +.blue { + color: blue; +} + +.production-completion-1 { + animation: production-completion-1-blinker 5s linear infinite; +} +@keyframes production-completion-1-blinker { + 50% { + background: rgba(207, 12, 12, 0.555); + } +} + +.react-resizable { + position: relative; + background-clip: padding-box; +} + +.react-resizable-handle { + position: absolute; + width: 10px; + height: 100%; + bottom: 0; + right: -5px; + cursor: col-resize; + z-index: 1; +} diff --git a/client/src/components/production-remove-button/production-remove-button.component.jsx b/client/src/components/production-remove-button/production-remove-button.component.jsx new file mode 100644 index 000000000..53c3c86fb --- /dev/null +++ b/client/src/components/production-remove-button/production-remove-button.component.jsx @@ -0,0 +1,29 @@ +import React from "react"; +import { useMutation } from "@apollo/react-hooks"; +import { UPDATE_JOB } from "../../graphql/jobs.queries"; +import { Button, notification } from "antd"; +import { useTranslation } from "react-i18next"; +import { logImEXEvent } from "../../firebase/firebase.utils"; + +export default function ProductionRemoveButton({ jobId }) { + const [removeJobFromProduction] = useMutation(UPDATE_JOB); + const { t } = useTranslation(); + const handleRemoveFromProd = () => { + logImEXEvent("production_remove_job"); + + removeJobFromProduction({ + variables: { jobId: jobId, job: { inproduction: false } }, + }).catch((error) => { + notification["error"]({ + message: t("production.errors.removing", { + error: JSON.stringify(error), + }), + }); + }); + }; + return ( + + ); +} diff --git a/client/src/components/profile-my/profile-my.component.jsx b/client/src/components/profile-my/profile-my.component.jsx index 0e4557d68..00d3cfb6f 100644 --- a/client/src/components/profile-my/profile-my.component.jsx +++ b/client/src/components/profile-my/profile-my.component.jsx @@ -5,12 +5,13 @@ import { connect } from "react-redux"; import { createStructuredSelector } from "reselect"; import { updateUserDetails } from "../../redux/user/user.actions"; import { selectCurrentUser } from "../../redux/user/user.selectors"; +import { logImEXEvent } from "../../firebase/firebase.utils"; const mapStateToProps = createStructuredSelector({ - currentUser: selectCurrentUser + currentUser: selectCurrentUser, }); -const mapDispatchToProps = dispatch => ({ - updateUserDetails: userDetails => dispatch(updateUserDetails(userDetails)) +const mapDispatchToProps = (dispatch) => ({ + updateUserDetails: (userDetails) => dispatch(updateUserDetails(userDetails)), }); export default connect( mapStateToProps, @@ -18,10 +19,12 @@ export default connect( )(function ProfileMyComponent({ currentUser, updateUserDetails }) { const { t } = useTranslation(); - const handleFinish = values => { + const handleFinish = (values) => { + logImEXEvent("profile_update"); + updateUserDetails({ displayName: values.displayName, - photoURL: values.photoURL + photoURL: values.photoURL, }); }; @@ -30,25 +33,23 @@ export default connect(
    + initialValues={currentUser}> + name='displayName'> - + - diff --git a/client/src/components/profile-shops/profile-shops.container.jsx b/client/src/components/profile-shops/profile-shops.container.jsx index 06fe5cea5..be32193c0 100644 --- a/client/src/components/profile-shops/profile-shops.container.jsx +++ b/client/src/components/profile-shops/profile-shops.container.jsx @@ -2,28 +2,31 @@ import React from "react"; import { useQuery, useMutation } from "@apollo/react-hooks"; import { QUERY_ALL_ASSOCIATIONS, - UPDATE_ASSOCIATION + UPDATE_ASSOCIATION, } from "../../graphql/associations.queries"; import AlertComponent from "../alert/alert.component"; import ProfileShopsComponent from "./profile-shops.component"; +import { logImEXEvent } from "../../firebase/firebase.utils"; export default function ProfileShopsContainer() { const { loading, error, data, refetch } = useQuery(QUERY_ALL_ASSOCIATIONS); const [updateAssocation] = useMutation(UPDATE_ASSOCIATION); - const updateActiveShop = activeShopId => { - data.associations.forEach(record => { + const updateActiveShop = (activeShopId) => { + logImEXEvent("profile_change_active_shop"); + + data.associations.forEach((record) => { updateAssocation({ variables: { assocId: record.id, - assocActive: record.id === activeShopId ? true : false - } + assocActive: record.id === activeShopId ? true : false, + }, }); }); refetch(); }; - if (error) return ; + if (error) return ; return ( ({ + //setUserLanguage: language => dispatch(setUserLanguage(language)) +}); + +export function ScheduleBlockDay({ date, children, refetch, bodyshop }) { + const { t } = useTranslation(); + const [insertBlock] = useMutation(INSERT_APPOINTMENT); + + const handleMenu = async (e) => { + e.domEvent.stopPropagation(); + + + if (e.key === "block") { + + + const blockAppt = { + title: t("appointments.labels.blocked"), + block: true, + isintake: false, + bodyshopid: bodyshop.id, + start: moment(date).startOf("day"), + end: moment(date).endOf("day"), + }; + logImEXEvent("dashboard_change_layout"); + + + const result = await insertBlock({ + variables: { app: [blockAppt] }, + }); + + if (!!result.errors) { + notification["error"]({ + message: t("appointments.errors.blocking", { + message: JSON.stringify(result.errors), + }), + }); + } + + if (!!refetch) refetch(); + } + }; + + const menu = ( + + {t("appointments.actions.block")} + 2nd menu item + 3rd menu item + + ); + + return ( + + {children} + + ); +} +export default connect(mapStateToProps, mapDispatchToProps)(ScheduleBlockDay); diff --git a/client/src/components/schedule-calendar-wrapper/schedule-calendar-header.component.js b/client/src/components/schedule-calendar-wrapper/schedule-calendar-header.component.js new file mode 100644 index 000000000..4218c1885 --- /dev/null +++ b/client/src/components/schedule-calendar-wrapper/schedule-calendar-header.component.js @@ -0,0 +1,68 @@ +import React from "react"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { + selectScheduleLoad, + selectScheduleLoadCalculating, +} from "../../redux/application/application.selectors"; +import LoadingSkeleton from "../loading-skeleton/loading-skeleton.component"; +import { Progress } from "antd"; +import { MdCallReceived, MdCallMissedOutgoing } from "react-icons/md"; +import Icon from "@ant-design/icons"; +import ScheduleBlockDay from "../schedule-block-day/schedule-block-day.component"; + +const ShopTargetHrs = 100; + +const mapStateToProps = createStructuredSelector({ + //currentUser: selectCurrentUser + load: selectScheduleLoad, + calculating: selectScheduleLoadCalculating, +}); + +const mapDispatchToProps = (dispatch) => ({ + //setUserLanguage: language => dispatch(setUserLanguage(language)) +}); + +export function ScheduleCalendarHeaderComponent({ + label, + refetch, + date, + load, + calculating, + ...otherProps +}) { + const loadData = load[date.toISOString().substr(0, 10)]; + + const LoadComponent = loadData ? ( +
    + + +
    + + {(loadData.hoursIn || 0) && loadData.hoursIn.toFixed(2)} + + {(loadData.hoursOut || 0) && loadData.hoursOut.toFixed(2)} +
    +
    + ) : null; + + return ( + +
    + {label} + {calculating || JSON.stringify(load) === "{}" ? ( + + ) : ( + LoadComponent + )} +
    +
    + ); +} +export default connect( + mapStateToProps, + mapDispatchToProps +)(ScheduleCalendarHeaderComponent); diff --git a/client/src/components/schedule-calendar-wrapper/schedule-calendar-util.js b/client/src/components/schedule-calendar-wrapper/schedule-calendar-util.js new file mode 100644 index 000000000..e03b48ba0 --- /dev/null +++ b/client/src/components/schedule-calendar-wrapper/schedule-calendar-util.js @@ -0,0 +1,29 @@ +import moment from "moment"; + +export function getRange(dateParam, viewParam) { + let start, end; + let date = dateParam || new Date(); + let view = viewParam || "week"; + // if view is day: from moment(date).startOf('day') to moment(date).endOf('day'); + if (view === "day") { + start = moment(date).startOf("day"); + end = moment(date).endOf("day"); + } + // if view is week: from moment(date).startOf('isoWeek') to moment(date).endOf('isoWeek'); + else if (view === "week") { + start = moment(date).startOf("week"); + end = moment(date).endOf("week"); + } + //if view is month: from moment(date).startOf('month').subtract(7, 'days') to moment(date).endOf('month').add(7, 'days'); i do additional 7 days math because you can see adjacent weeks on month view (that is the way how i generate my recurrent events for the Big Calendar, but if you need only start-end of month - just remove that math); + else if (view === "month") { + start = moment(date).startOf("month").subtract(7, "days"); + end = moment(date).endOf("month").add(7, "days"); + } + // if view is agenda: from moment(date).startOf('day') to moment(date).endOf('day').add(1, 'month'); + else if (view === "agenda") { + start = moment(date).startOf("day"); + end = moment(date).endOf("day").add(1, "month"); + } + + return { start, end }; +} diff --git a/client/src/components/schedule-calendar-wrapper/schedule-calendar.styles.scss b/client/src/components/schedule-calendar-wrapper/schedule-calendar.styles.scss index 059edf709..34e78d4b6 100644 --- a/client/src/components/schedule-calendar-wrapper/schedule-calendar.styles.scss +++ b/client/src/components/schedule-calendar-wrapper/schedule-calendar.styles.scss @@ -1 +1,14 @@ -@import 'react-big-calendar/lib/sass/styles'; +@import "react-big-calendar/lib/sass/styles"; + +.rbc-time-view .rbc-row { + box-sizing: unset !important; + min-height: unset !important; +} + +.imex-event-arrived { + background-color: rgba(4, 141, 4, 0.4); +} + +.imex-event-block { + background-color: rgba(212, 2, 2, 0.6); +} diff --git a/client/src/components/schedule-calendar-wrapper/scheduler-calendar-wrapper.component.jsx b/client/src/components/schedule-calendar-wrapper/scheduler-calendar-wrapper.component.jsx index e54dfd7ab..156cb5ad2 100644 --- a/client/src/components/schedule-calendar-wrapper/scheduler-calendar-wrapper.component.jsx +++ b/client/src/components/schedule-calendar-wrapper/scheduler-calendar-wrapper.component.jsx @@ -1,34 +1,81 @@ import moment from "moment"; +import queryString from "query-string"; import React from "react"; import { Calendar, momentLocalizer } from "react-big-calendar"; -//import "react-big-calendar/lib/css/react-big-calendar.css"; -import "./schedule-calendar.styles.scss"; -import DateCellWrapper from "../schedule-datecellwrapper/schedule-datecellwrapper.component"; +import { connect } from "react-redux"; +import { useHistory, useLocation } from "react-router-dom"; +import { createStructuredSelector } from "reselect"; +import { selectBodyshop } from "../../redux/user/user.selectors"; import Event from "../schedule-event/schedule-event.container"; -const localizer = momentLocalizer(moment); +import HeaderComponent from "./schedule-calendar-header.component"; +import "./schedule-calendar.styles.scss"; -export default function ScheduleCalendarWrapperComponent({ +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, +}); +const localizer = momentLocalizer(moment); +export function ScheduleCalendarWrapperComponent({ + bodyshop, data, refetch, defaultView, + setDateRangeCallback, + date, ...otherProps }) { + const search = queryString.parse(useLocation().search); + const history = useHistory(); + + const handleEventPropStyles = (event, start, end, isSelected) => { + // if (!!!bodyshop.ssbuckets) { + // return {}; + // } + // const defaultEventColor = "#3174ad"; + // const jobHrs = result.jobs_by_pk.jobhrs.aggregate.sum.mod_lb_hrs; + // const JobBucket = bodyshop.ssbuckets.filter( + // (bucket) => + // bucket.gte <= jobHrs && (!!bucket.lt ? bucket.lt > jobHrs : true) + // )[0]; + + return { + className: `${event.arrived ? "imex-event-arrived" : ""} ${ + event.block ? "imex-event-block" : "" + }`, + }; + }; + + const selectedDate = new Date(date || moment(search.date) || Date.now()); + return ( { + search.date = date.toISOString().substr(0, 10); + history.push({ search: queryString.stringify(search) }); + }} + onRangeChange={(start, end) => { + if (setDateRangeCallback) setDateRangeCallback({ start, end }); + }} + onView={(view) => { + search.view = view; + history.push({ search: queryString.stringify(search) }); + }} step={30} + timeslots={1} showMultiDayTimes localizer={localizer} min={new Date("2020-01-01T06:00:00")} //TODO Read from business settings. max={new Date("2020-01-01T20:00:00")} + eventPropGetter={handleEventPropStyles} components={{ - event: e => { - return Event({ event: e.event, refetch: refetch }); - }, - dateCellWrapper: DateCellWrapper + event: (e) => Event({ event: e.event, refetch: refetch }), + header: HeaderComponent, }} {...otherProps} /> ); } + +export default connect(mapStateToProps, null)(ScheduleCalendarWrapperComponent); diff --git a/client/src/components/schedule-calendar/schedule-calendar.component.jsx b/client/src/components/schedule-calendar/schedule-calendar.component.jsx index a1678a711..85ecf8cdd 100644 --- a/client/src/components/schedule-calendar/schedule-calendar.component.jsx +++ b/client/src/components/schedule-calendar/schedule-calendar.component.jsx @@ -4,20 +4,18 @@ import React from "react"; import { useTranslation } from "react-i18next"; import { connect } from "react-redux"; import { setModalContext } from "../../redux/modals/modals.actions"; -//import "react-big-calendar/lib/css/react-big-calendar.css"; import ScheduleCalendarWrapperComponent from "../schedule-calendar-wrapper/scheduler-calendar-wrapper.component"; import ScheduleModal from "../schedule-job-modal/schedule-job-modal.container"; - -const mapDispatchToProps = dispatch => ({ - setScheduleContext: context => - dispatch(setModalContext({ context: context, modal: "schedule" })) +const mapDispatchToProps = (dispatch) => ({ + setScheduleContext: (context) => + dispatch(setModalContext({ context: context, modal: "schedule" })), }); export function ScheduleCalendarComponent({ data, refetch, - setScheduleContext + setScheduleContext, }) { const { t } = useTranslation(); @@ -36,8 +34,8 @@ export function ScheduleCalendarComponent({ setScheduleContext({ actions: { refetch: refetch }, context: { - jobId: null - } + jobId: null, + }, }); }} > @@ -46,11 +44,7 @@ export function ScheduleCalendarComponent({ - + ); } diff --git a/client/src/components/schedule-calendar/schedule-calendar.container.jsx b/client/src/components/schedule-calendar/schedule-calendar.container.jsx index 8184eb686..eff7a1bc8 100644 --- a/client/src/components/schedule-calendar/schedule-calendar.container.jsx +++ b/client/src/components/schedule-calendar/schedule-calendar.container.jsx @@ -1,18 +1,38 @@ import { useQuery } from "@apollo/react-hooks"; -import React from "react"; +import queryString from "query-string"; +import React, { useMemo } from "react"; +import { useLocation } from "react-router-dom"; import { QUERY_ALL_ACTIVE_APPOINTMENTS } from "../../graphql/appointments.queries"; import AlertComponent from "../alert/alert.component"; import LoadingSpinner from "../loading-spinner/loading-spinner.component"; +import { getRange } from "../schedule-calendar-wrapper/schedule-calendar-util"; import ScheduleCalendarComponent from "./schedule-calendar.component"; +import { calculateScheduleLoad } from "../../redux/application/application.actions"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +const mapStateToProps = createStructuredSelector({ + //currentUser: selectCurrentUser +}); +const mapDispatchToProps = (dispatch) => ({ + calculateScheduleLoad: (endDate) => dispatch(calculateScheduleLoad(endDate)), +}); -export default function ScheduleCalendarContainer() { +export function ScheduleCalendarContainer({ calculateScheduleLoad }) { + const search = queryString.parse(useLocation().search); + + const { date, view } = search; + const range = useMemo(() => getRange(date, view), [date, view]); const { loading, error, data, refetch } = useQuery( - QUERY_ALL_ACTIVE_APPOINTMENTS + QUERY_ALL_ACTIVE_APPOINTMENTS, + { + variables: { start: range.start.toDate(), end: range.end.toDate() }, + skip: !!!range.start || !!!range.end, + } ); if (loading) return ; if (error) return ; - let normalizedData = data.appointments.map(e => { + let normalizedData = data.appointments.map((e) => { //Required becuase Hasura returns a string instead of a date object. return Object.assign( {}, @@ -22,6 +42,8 @@ export default function ScheduleCalendarContainer() { ); }); + calculateScheduleLoad(range.end); + return ( ); } +export default connect( + mapStateToProps, + mapDispatchToProps +)(ScheduleCalendarContainer); diff --git a/client/src/components/schedule-datecellwrapper/schedule-datecellwrapper.component.jsx b/client/src/components/schedule-datecellwrapper/schedule-datecellwrapper.component.jsx deleted file mode 100644 index 69d9e2f5d..000000000 --- a/client/src/components/schedule-datecellwrapper/schedule-datecellwrapper.component.jsx +++ /dev/null @@ -1,18 +0,0 @@ -import React from "react"; - -export default function ScheduleDateCellWrapper(dateCellWrapperProps) { - // Show 'click me' text in arbitrary places by using the range prop - - const style = { - display: "flex", - flex: 1, - borderLeft: "1px solid #DDD", - backgroundColor: "#fff" - }; - return ( -
    - PLACEHOLDER:DATA - {dateCellWrapperProps.children} -
    - ); -} diff --git a/client/src/components/schedule-day-view/schedule-day-view.component.jsx b/client/src/components/schedule-day-view/schedule-day-view.component.jsx index dd657fcdf..7c8203029 100644 --- a/client/src/components/schedule-day-view/schedule-day-view.component.jsx +++ b/client/src/components/schedule-day-view/schedule-day-view.component.jsx @@ -1,20 +1,16 @@ import React from "react"; -import "react-big-calendar/lib/css/react-big-calendar.css"; import { useTranslation } from "react-i18next"; import ScheduleCalendarWrapperComponent from "../schedule-calendar-wrapper/scheduler-calendar-wrapper.component"; export default function ScheduleDayViewComponent({ data, day }) { const { t } = useTranslation(); if (data) - //TODO Remove addtional calendar elements from day view. return ( console.log("e", e)} + date={day} /> ); else return
    {t("appointments.labels.nodateselected")}
    ; diff --git a/client/src/components/schedule-day-view/schedule-day-view.container.jsx b/client/src/components/schedule-day-view/schedule-day-view.container.jsx index 2b0f7ee62..340adca80 100644 --- a/client/src/components/schedule-day-view/schedule-day-view.container.jsx +++ b/client/src/components/schedule-day-view/schedule-day-view.container.jsx @@ -4,22 +4,24 @@ import { useQuery } from "@apollo/react-hooks"; import { QUERY_APPOINTMENT_BY_DATE } from "../../graphql/appointments.queries"; import LoadingSkeleton from "../loading-skeleton/loading-skeleton.component"; import moment from "moment"; - +import { useTranslation } from "react-i18next"; export default function ScheduleDayViewContainer({ day }) { const { loading, error, data } = useQuery(QUERY_APPOINTMENT_BY_DATE, { variables: { start: moment(day).startOf("day"), - end: moment(day).endOf("day") + end: moment(day).endOf("day"), }, - skip: !day, - fetchPolicy: "network-only" + skip: !!!day, + fetchPolicy: "network-only", }); - + const { t } = useTranslation(); + if (!!!day) return
    {t("appointments.labels.nodateselected")}
    ; if (loading) return ; if (error) return
    {error.message}
    ; let normalizedData; + if (data) { - normalizedData = data.appointments.map(e => { + normalizedData = data.appointments.map((e) => { //Required becuase Hasura returns a string instead of a date object. return Object.assign( {}, @@ -31,6 +33,6 @@ export default function ScheduleDayViewContainer({ day }) { } return ( - + ); } diff --git a/client/src/components/schedule-event/schedule-event.component.jsx b/client/src/components/schedule-event/schedule-event.component.jsx index 54cf8bbbf..ac91bdc1e 100644 --- a/client/src/components/schedule-event/schedule-event.component.jsx +++ b/client/src/components/schedule-event/schedule-event.component.jsx @@ -1,11 +1,24 @@ +import { Button, Popover } from "antd"; import React from "react"; -import { Popover, Button } from "antd"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { Link } from "react-router-dom"; +import { setModalContext } from "../../redux/modals/modals.actions"; import CurrencyFormatter from "../../utils/CurrencyFormatter"; import PhoneFormatter from "../../utils/PhoneFormatter"; -import { Link } from "react-router-dom"; -import { useTranslation } from "react-i18next"; +import DataLabel from "../data-label/data-label.component"; -export default function ScheduleEventComponent({ event, handleCancel }) { +const mapDispatchToProps = (dispatch) => ({ + setScheduleContext: (context) => + dispatch(setModalContext({ context: context, modal: "schedule" })), +}); + +export function ScheduleEventComponent({ + event, + refetch, + handleCancel, + setScheduleContext, +}) { const { t } = useTranslation(); const popoverContent = (
    @@ -13,89 +26,105 @@ export default function ScheduleEventComponent({ event, handleCancel }) { {event.title} ) : (
    - {`${(event.job && event.job.ownr_fn) || ""} ${(event.job && - event.job.ownr_ln) || - ""}`} + {`${(event.job && event.job.ownr_fn) || ""} ${ + (event.job && event.job.ownr_ln) || "" + }`} - {`${(event.job && event.job.v_model_yr) || - ""} ${(event.job && event.job.v_make_desc) || - ""} ${(event.job && event.job.v_model_desc) || ""}`} + {`${(event.job && event.job.v_model_yr) || ""} ${ + (event.job && event.job.v_make_desc) || "" + } ${(event.job && event.job.v_model_desc) || ""}`}
    )} + {event.job ? (
    -
    {`${t("jobs.fields.ro_number")}: ${(event.job && - event.job.ro_number) || - ""}`}
    -
    - {t("jobs.fields.clm_total")}: + + {(event.job && event.job.ro_number) || ""} + + {(event.job && event.job.clm_total) || ""} -
    -
    {`${t("jobs.fields.clm_no")}: ${(event.job && - event.job.clm_no) || - ""}`}
    -
    - {t("jobs.fields.ownr_ea")}:{(event.job && event.job.ownr_ea) || ""} -
    -
    - {t("jobs.fields.ownr_ph1")}: + + + {(event.job && event.job.ins_co_nm) || ""} + + + {(event.job && event.job.clm_no) || ""} + + + {(event.job && event.job.ownr_ea) || ""} + + {(event.job && event.job.ownr_ph1) || ""} -
    +
    ) : null} - { - //TODO Add phone 1 MessagingActionTypes. - } - {event.job ? ( - - - - ) : null} - - - {event.isintake ? ( - + + ) : null} + - ) : null} + + {event.isintake ? ( + + + + ) : null} +
    + + ); + + const RegularEvent = event.isintake ? ( +
    + {`${(event.job && event.job.ownr_fn) || ""} ${ + (event.job && event.job.ownr_ln) || "" + }`} +
    + {`${(event.job && event.job.v_model_yr) || ""} ${ + (event.job && event.job.v_make_desc) || "" + } ${(event.job && event.job.v_model_desc) || ""}`} +
    +
    + ) : ( +
    + {`${event.title || ""}`}
    ); return ( - -
    - {event.isintake ? ( -
    - {`${(event.job && event.job.ownr_fn) || ""} ${(event.job && - event.job.ownr_ln) || - ""}`} - - {`${(event.job && event.job.v_model_yr) || - ""} ${(event.job && event.job.v_make_desc) || - ""} ${(event.job && event.job.v_model_desc) || ""}`} - -
    - ) : ( -
    - {`${event.title || ""}`} -
    - )} -
    + + {RegularEvent} ); } +export default connect(null, mapDispatchToProps)(ScheduleEventComponent); diff --git a/client/src/components/schedule-event/schedule-event.container.jsx b/client/src/components/schedule-event/schedule-event.container.jsx index 62aa31b38..3ee93e1bb 100644 --- a/client/src/components/schedule-event/schedule-event.container.jsx +++ b/client/src/components/schedule-event/schedule-event.container.jsx @@ -1,24 +1,61 @@ import React from "react"; import { useMutation } from "@apollo/react-hooks"; import { CANCEL_APPOINTMENT_BY_ID } from "../../graphql/appointments.queries"; +import { UPDATE_JOB } from "../../graphql/jobs.queries"; import ScheduleEventComponent from "./schedule-event.component"; import { notification } from "antd"; import { useTranslation } from "react-i18next"; +import { logImEXEvent } from "../../firebase/firebase.utils"; + export default function ScheduleEventContainer({ event, refetch }) { const { t } = useTranslation(); const [cancelAppointment] = useMutation(CANCEL_APPOINTMENT_BY_ID); - const handleCancel = id => { - cancelAppointment({ variables: { appid: event.id } }) - .then(r => { - notification["success"]({ - message: t("appointments.successes.canceled") - }); - if (refetch) refetch(); - }) - .catch(error => { - notification["error"]({ message: t("appointments.errors.canceling") }); + const [updateJob] = useMutation(UPDATE_JOB); + const handleCancel = async (id) => { + logImEXEvent("schedule_cancel_appt"); + + const cancelAppt = await cancelAppointment({ + variables: { appid: event.id }, + }); + notification["success"]({ + message: t("appointments.successes.canceled"), + }); + + if (!!cancelAppt.errors) { + notification["error"]({ + message: t("appointments.errors.canceling", { + message: JSON.stringify(cancelAppt.errors), + }), }); + return; + } + + const jobUpdate = await updateJob({ + variables: { + jobId: event.job.id, + job: { + date_scheduled: null, + scheduled_in: null, + }, + }, + }); + if (!!jobUpdate.errors) { + notification["error"]({ + message: t("jobs.errors.updating", { + message: JSON.stringify(jobUpdate.errors), + }), + }); + return; + } + + if (refetch) refetch(); }; - return ; + return ( + + ); } diff --git a/client/src/components/schedule-existing-appointments-list/schedule-existing-appointments-list.component.jsx b/client/src/components/schedule-existing-appointments-list/schedule-existing-appointments-list.component.jsx index 4435030d9..0d03b913d 100644 --- a/client/src/components/schedule-existing-appointments-list/schedule-existing-appointments-list.component.jsx +++ b/client/src/components/schedule-existing-appointments-list/schedule-existing-appointments-list.component.jsx @@ -6,7 +6,7 @@ import { useTranslation } from "react-i18next"; import { DateTimeFormatter } from "../../utils/DateFormatter"; export default function ScheduleExistingAppointmentsList({ - existingAppointments + existingAppointments, }) { const { t } = useTranslation(); if (existingAppointments.loading) return ; @@ -22,22 +22,26 @@ export default function ScheduleExistingAppointmentsList({
    {t("appointments.labels.priorappointments")} - {existingAppointments.data.appointments.map(item => { - return ( - - {item.canceled - ? t("appointments.labels.cancelledappointment") - : item.arrived - ? t("appointments.labels.arrivedon") - : t("appointments.labels.scheduledfor")} + {existingAppointments.data + ? existingAppointments.data.appointments.map((item) => { + return ( + + {item.canceled + ? t("appointments.labels.cancelledappointment") + : item.arrived + ? t("appointments.labels.arrivedon") + : t("appointments.labels.scheduledfor")} - {item.start} - - ); - })} + {item.start} + + ); + }) + : null}
    ); diff --git a/client/src/components/schedule-job-modal/schedule-job-modal.component.jsx b/client/src/components/schedule-job-modal/schedule-job-modal.component.jsx index 51c62a7af..0778319a8 100644 --- a/client/src/components/schedule-job-modal/schedule-job-modal.component.jsx +++ b/client/src/components/schedule-job-modal/schedule-job-modal.component.jsx @@ -1,62 +1,100 @@ -import { Checkbox, Col, DatePicker, Row, Tabs, TimePicker } from "antd"; -import React from "react"; +import { Button, Checkbox, Col, Row } from "antd"; +import axios from "axios"; +import React, { useState } from "react"; import { useTranslation } from "react-i18next"; +import { auth } from "../../firebase/firebase.utils"; +import { DateFormatter } from "../../utils/DateFormatter"; +import DateTimePicker from "../form-date-time-picker/form-date-time-picker.component"; +import EmailInput from "../form-items-formatted/email-form-item.component"; import ScheduleDayViewContainer from "../schedule-day-view/schedule-day-view.container"; import ScheduleExistingAppointmentsList from "../schedule-existing-appointments-list/schedule-existing-appointments-list.component"; +import moment from "moment"; export default function ScheduleJobModalComponent({ existingAppointments, appData, setAppData, - formData, - setFormData }) { const { t } = useTranslation(); + const [loading, setLoading] = useState(false); + const handleAuto = async () => { + setLoading(true); + try { + const response = await axios.post( + "/scheduling/job", + { jobId: "661dd1d5-bf06-426f-8bd2-bd9e41de8eb1" }, + { + headers: { + Authorization: `Bearer ${await auth.currentUser.getIdToken(true)}`, + }, + } + ); + console.log("response", response); + setAppData({ ...appData, smartDates: response.data }); + } catch (error) { + console.log("error", error, error.message); + } finally { + setLoading(false); + } + }; + //TODO Existing appointments list only refreshes sometimes after modal close. May have to do with the container class. return ( - +
    + + ); + + return ( + + + + ); +} diff --git a/client/src/components/scoreboard-last-days/scoreboard-last-days.component.jsx b/client/src/components/scoreboard-last-days/scoreboard-last-days.component.jsx new file mode 100644 index 000000000..678ba545e --- /dev/null +++ b/client/src/components/scoreboard-last-days/scoreboard-last-days.component.jsx @@ -0,0 +1,41 @@ +import React from "react"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +import moment from "moment"; +import ScoreboardDayStat from "../scoreboard-day-stats/scoreboard-day-stats.component"; +import { Row, Col } from "antd"; +import LoadingSkeleton from "../loading-skeleton/loading-skeleton.component"; + +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, +}); +const mapDispatchToProps = (dispatch) => ({ + //setUserLanguage: language => dispatch(setUserLanguage(language)) +}); + +export function ScoreboardLastDays({ bodyshop, sbEntriesByDate }) { + const { lastNumberWorkingDays } = bodyshop.scoreboard_target; + + const ArrayOfDate = []; + for (var i = lastNumberWorkingDays - 1; i >= 0; i--) { + ArrayOfDate.push( + moment().businessSubtract(i, "day").toISOString().substr(0, 10) + ); + } + + return ( + + {ArrayOfDate.map((a) => ( + + {!!sbEntriesByDate ? ( + + ) : ( + + )} + + ))} + + ); +} +export default connect(mapStateToProps, mapDispatchToProps)(ScoreboardLastDays); diff --git a/client/src/components/scoreboard-remove-button/scorebard-remove-button.component.jsx b/client/src/components/scoreboard-remove-button/scorebard-remove-button.component.jsx new file mode 100644 index 000000000..5e103bd16 --- /dev/null +++ b/client/src/components/scoreboard-remove-button/scorebard-remove-button.component.jsx @@ -0,0 +1,40 @@ +import React, { useState } from "react"; +import { useTranslation } from "react-i18next"; +import { Button, notification } from "antd"; +import { DeleteFilled } from "@ant-design/icons"; +import { useMutation } from "@apollo/react-hooks"; +import { DELETE_SCOREBOARD_ENTRY } from "../../graphql/scoreboard.queries"; +import { logImEXEvent } from "../../firebase/firebase.utils"; + +export default function ScoreboardRemoveButton({ scoreboardId }) { + const { t } = useTranslation(); + const [deleteScoreboardEntry] = useMutation(DELETE_SCOREBOARD_ENTRY); + const [loading, setLoading] = useState(false); + const handleDelete = async (e) => { + logImEXEvent("scoreboard_remove_job"); + + e.stopPropagation(); + setLoading(true); + const result = await deleteScoreboardEntry({ + variables: { sbId: scoreboardId }, + }); + + if (!!result.errors) { + notification["error"]({ + message: t("scoreboard.errors.removing", { + message: JSON.stringify(result.errors), + }), + }); + } else { + notification["success"]({ + message: t("scoreboard.successes.removed"), + }); + } + setLoading(false); + }; + return ( + + ); +} diff --git a/client/src/components/scoreboard-targets-table/scoreboard-targets-table.component.jsx b/client/src/components/scoreboard-targets-table/scoreboard-targets-table.component.jsx new file mode 100644 index 000000000..99ed3773e --- /dev/null +++ b/client/src/components/scoreboard-targets-table/scoreboard-targets-table.component.jsx @@ -0,0 +1,109 @@ +import { CalendarOutlined } from "@ant-design/icons"; +import { Col, Row, Statistic } from "antd"; +import React from "react"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +import * as Util from "./scoreboard-targets-table.util"; +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, +}); +const mapDispatchToProps = (dispatch) => ({ + //setUserLanguage: language => dispatch(setUserLanguage(language)) +}); + +const rowGutter = [16, 16]; +const statSpans = { xs: 24, sm: 6 }; + +export function ScoreboardTargetsTable({ bodyshop }) { + const { t } = useTranslation(); + + return ( +
    + +
    + } + /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); +} +export default connect( + mapStateToProps, + mapDispatchToProps +)(ScoreboardTargetsTable); diff --git a/client/src/components/scoreboard-targets-table/scoreboard-targets-table.util.js b/client/src/components/scoreboard-targets-table/scoreboard-targets-table.util.js new file mode 100644 index 000000000..47d40c759 --- /dev/null +++ b/client/src/components/scoreboard-targets-table/scoreboard-targets-table.util.js @@ -0,0 +1,49 @@ +import moment from "moment-business-days"; + +moment.updateLocale("ca", { + workingWeekdays: [1, 2, 3, 4, 5], +}); + +export const CalculateWorkingDaysThisMonth = () => { + return moment().endOf("month").businessDaysIntoMonth(); +}; + +export const CalculateWorkingDaysAsOfToday = () => { + return moment().businessDaysIntoMonth(); +}; + +export const WeeklyTargetHrs = (dailyTargetHrs, bodyshop) => { + return dailyTargetHrs * 5; +}; + +export const MonthlyTargetHrs = (dailyTargetHrs, bodyshop) => { + return dailyTargetHrs * CalculateWorkingDaysThisMonth(); +}; + +export const AsOfTodayTargetHrs = (dailyTargetHrs, bodyshop) => { + return dailyTargetHrs * CalculateWorkingDaysAsOfToday(); +}; + +export const AsOfDateTargetHours = (dailyTargetHours, date) => { + return ( + dailyTargetHours * moment().startOf("month").businessDiff(moment(date)) + ); +}; + +export const ListOfBusinessDaysInCurrentMonth = () => { + const momentListOfDays = moment().monthBusinessDays(); + + return momentListOfDays.map((i) => i.format("YYYY-MM-DD")); +}; + +export const ListOfDaysInCurrentMonth = () => { + const days = []; + const dateStart = moment().startOf("month"); + const dateEnd = moment().endOf("month"); + while (dateEnd.diff(dateStart, "days") > 0) { + days.push(dateStart.format("YYYY-MM-DD")); + dateStart.add(1, "days"); + } + days.push(dateEnd.format("YYYY-MM-DD")); + return days; +}; diff --git a/client/src/components/shop-employees/shop-employees-form.component.jsx b/client/src/components/shop-employees/shop-employees-form.component.jsx index 73541dddc..4e7d3c673 100644 --- a/client/src/components/shop-employees/shop-employees-form.component.jsx +++ b/client/src/components/shop-employees/shop-employees-form.component.jsx @@ -1,12 +1,24 @@ -import { Button, DatePicker, Form, Input, InputNumber, Switch } from "antd"; +import { Button, Form, Input, InputNumber, Select, Switch } from "antd"; import moment from "moment"; import React, { useEffect } from "react"; import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +import FormDatePicker from "../form-date-picker/form-date-picker.component"; -export default function ShopEmployeesFormComponent({ +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, +}); +const mapDispatchToProps = (dispatch) => ({ + //setUserLanguage: language => dispatch(setUserLanguage(language)) +}); + +export function ShopEmployeesFormComponent({ + bodyshop, form, selectedEmployee, - handleFinish + handleFinish, }) { const { t } = useTranslation(); useEffect(() => { @@ -27,7 +39,7 @@ export default function ShopEmployeesFormComponent({ : null, termination_date: selectedEmployee.termination_date ? moment(selectedEmployee.termination_date) - : null + : null, }} > - + - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + { + remove(field.name); + }} + /> + + + ))} + + + + + ); + }} + + + + {(fields, { add, remove }) => { + return ( +
    + {fields.map((field, index) => ( + +
    + + + + + + + { + remove(field.name); + }} + /> +
    +
    + ))} + + + +
    + ); + }} +
    + + + {(fields, { add, remove, move }) => { + return ( +
    + {fields.map((field, index) => ( + +
    + + + + + { + remove(field.name); + }} + /> + +
    +
    + ))} + + + +
    + ); + }} +
    +
    + + + + + + + +
    ); diff --git a/client/src/components/shop-info/shop-info.container.jsx b/client/src/components/shop-info/shop-info.container.jsx index 0bb14174f..8bd6ed8d4 100644 --- a/client/src/components/shop-info/shop-info.container.jsx +++ b/client/src/components/shop-info/shop-info.container.jsx @@ -1,4 +1,4 @@ -import React, { useEffect } from "react"; +import React, { useEffect, useState } from "react"; import ShopInfoComponent from "./shop-info.component"; import { Form, notification } from "antd"; import { useQuery, useMutation } from "@apollo/react-hooks"; @@ -6,45 +6,50 @@ import { QUERY_BODYSHOP, UPDATE_SHOP } from "../../graphql/bodyshop.queries"; import LoadingSpinner from "../loading-spinner/loading-spinner.component"; import AlertComponent from "../alert/alert.component"; import { useTranslation } from "react-i18next"; +import { logImEXEvent } from "../../firebase/firebase.utils"; + export default function ShopInfoContainer() { const [form] = Form.useForm(); const { t } = useTranslation(); + const [saveLoading, setSaveLoading] = useState(false); const [updateBodyshop] = useMutation(UPDATE_SHOP); const { loading, error, data, refetch } = useQuery(QUERY_BODYSHOP, { - fetchPolicy: "network-only" + fetchPolicy: "network-only", }); - const handleFinish = values => { - console.log("values", values); + const handleFinish = (values) => { + setSaveLoading(true); + logImEXEvent("shop_update"); updateBodyshop({ - variables: { id: data.bodyshops[0].id, shop: values } + variables: { id: data.bodyshops[0].id, shop: values }, }) - .then(r => { + .then((r) => { notification["success"]({ message: t("bodyshop.successes.save") }); - refetch().then(_ => form.resetFields()); + refetch().then((_) => form.resetFields()); }) - .catch(error => { - notification["error"]( - { message: t("bodyshop.errors.saving") }, - { message: error } - ); + .catch((error) => { + notification["error"]({ + message: t("bodyshop.errors.saving", { message: error }), + }); }); + setSaveLoading(false); }; useEffect(() => { if (data) form.resetFields(); }, [form, data]); - if (error) return ; + if (error) return ; if (loading) return ; return (
    - + initialValues={data ? data.bodyshops[0] : null}> + ); } diff --git a/client/src/components/shop-info/shop-info.intake.component.jsx b/client/src/components/shop-info/shop-info.intake.component.jsx new file mode 100644 index 000000000..477674a19 --- /dev/null +++ b/client/src/components/shop-info/shop-info.intake.component.jsx @@ -0,0 +1,144 @@ +import { DeleteFilled } from "@ant-design/icons"; +import { Button, Form, Input, Select, Switch } from "antd"; +import React from "react"; +import { useTranslation } from "react-i18next"; +import styled from "styled-components"; +import { TemplateList } from "../../utils/TemplateConstants"; +import ConfigFormTypes from "../config-form-components/config-form-types"; +import FormListMoveArrows from "../form-list-move-arrows/form-list-move-arrows.component"; + +const SelectorDiv = styled.div` + .ant-form-item .ant-select { + width: 200px; + } +`; +//TODO Fix up styles. +export default function ShopInfoIntakeChecklistComponent({ form }) { + const { t } = useTranslation(); + + return ( +
    + + {(fields, { add, remove, move }) => { + return ( +
    + {fields.map((field, index) => ( + +
    + + + + + + + + + + + + + + + + + { + remove(field.name); + }} + /> + +
    +
    + ))} + + + +
    + ); + }} +
    + + + + + + +
    + ); +} diff --git a/client/src/components/shop-info/shop-info.orderstatus.component.jsx b/client/src/components/shop-info/shop-info.orderstatus.component.jsx index 474876056..0e55aca8b 100644 --- a/client/src/components/shop-info/shop-info.orderstatus.component.jsx +++ b/client/src/components/shop-info/shop-info.orderstatus.component.jsx @@ -26,8 +26,7 @@ export default function ShopInfoOrderStatusComponent({ form }) { {fields.map((field, index) => ( + style={{ padding: 0, margin: 2 }}>
    + message: t("general.validation.required"), + }, + ]}> @@ -73,11 +70,10 @@ export default function ShopInfoOrderStatusComponent({ form }) { rules={[ { required: true, - message: t("general.validation.required") - } + message: t("general.validation.required"), + }, ]} - name={["md_order_statuses", "default_bo"]} - > + name={["md_order_statuses", "default_bo"]}> {options.map((item, idx) => ( {item} @@ -105,11 +100,10 @@ export default function ShopInfoOrderStatusComponent({ form }) { rules={[ { required: true, - message: t("general.validation.required") - } + message: t("general.validation.required"), + }, ]} - name={["md_order_statuses", "default_canceled"]} - > + name={["md_order_statuses", "default_canceled"]}> + {options.map((item, idx) => ( + {item} + ))} + + + - - { - remove(field.name); - }} - /> -
    -
    - ))} - - + {t("bodyshop.labels.responsibilitycenters.title")}= +
    + {t("bodyshop.labels.responsibilitycenters.costs")} + + {(fields, { add, remove }) => { + return ( +
    + {fields.map((field, index) => ( + + + + + + + + + + + + + + + + + + { + remove(field.name); + }} + /> + -
    - ); - }} -
    - - -
    - {t("bodyshop.labels.responsibilitycenters.profits")} - - {(fields, { add, remove }) => { - return ( -
    - {fields.map((field, index) => ( - -
    - - - - { - remove(field.name); - }} - /> -
    -
    - ))} - - + ))} + + + +
    + ); + }} +
    + +
    + {t("bodyshop.labels.responsibilitycenters.profits")} + + {(fields, { add, remove }) => { + return ( +
    + {fields.map((field, index) => ( + + + + + + + + + + + + + + + + + + { + remove(field.name); + }} + /> + -
    - ); - }} -
    - + ))} + + + +
    + ); + }} + + +
    + + Costs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Profits + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -
    - + - + - + - + - + - + + + - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + ); } diff --git a/client/src/components/shop-info/shop-info.rostatus.component.jsx b/client/src/components/shop-info/shop-info.rostatus.component.jsx index 59d07bb89..57c076294 100644 --- a/client/src/components/shop-info/shop-info.rostatus.component.jsx +++ b/client/src/components/shop-info/shop-info.rostatus.component.jsx @@ -43,8 +43,8 @@ export default function ShopInfoROStatusComponent({ form }) { rules={[ { required: true, - message: t("general.validation.required") - } + message: t("general.validation.required"), + }, ]}> @@ -80,8 +80,26 @@ export default function ShopInfoROStatusComponent({ form }) { { required: true, message: t("general.validation.required"), - type: "array" - } + type: "array", + }, + ]}> + + + @@ -111,8 +129,8 @@ export default function ShopInfoROStatusComponent({ form }) { rules={[ { required: true, - message: t("general.validation.required") - } + message: t("general.validation.required"), + }, ]} name={["md_ro_statuses", "default_arrived"]}> @@ -141,8 +159,8 @@ export default function ShopInfoROStatusComponent({ form }) { rules={[ { required: true, - message: t("general.validation.required") - } + message: t("general.validation.required"), + }, ]} name={["md_ro_statuses", "default_imported"]}> @@ -171,8 +189,8 @@ export default function ShopInfoROStatusComponent({ form }) { rules={[ { required: true, - message: t("general.validation.required") - } + message: t("general.validation.required"), + }, ]} name={["md_ro_statuses", "default_completed"]}> @@ -196,6 +214,21 @@ export default function ShopInfoROStatusComponent({ form }) { ))} + + + diff --git a/client/src/components/shop-info/shop-info.scheduling.component.jsx b/client/src/components/shop-info/shop-info.scheduling.component.jsx new file mode 100644 index 000000000..bc57ef454 --- /dev/null +++ b/client/src/components/shop-info/shop-info.scheduling.component.jsx @@ -0,0 +1,113 @@ +import { DeleteFilled } from "@ant-design/icons"; +import { Button, Col, Form, Input, InputNumber, Row } from "antd"; +import React from "react"; +import { useTranslation } from "react-i18next"; +//TODO Fix up styles. +export default function ShopInfoSchedulingComponent({ form }) { + const { t } = useTranslation(); + + return ( +
    + {t("bodyshop.labels.orderstatuses")} + +
    + + {(fields, { add, remove }) => { + return ( +
    + {fields.map((field, index) => ( + +
    + + + + + + + + + + + + + + + + + + + { + remove(field.name); + }} + /> +
    +
    + ))} + + + +
    + ); + }} +
    + + + + ); +} diff --git a/client/src/components/shop-info/shop-info.speedprint.component.jsx b/client/src/components/shop-info/shop-info.speedprint.component.jsx new file mode 100644 index 000000000..60be40a70 --- /dev/null +++ b/client/src/components/shop-info/shop-info.speedprint.component.jsx @@ -0,0 +1,105 @@ +import { DeleteFilled } from "@ant-design/icons"; +import { Button, Form, Input, Select } from "antd"; +import React from "react"; +import { useTranslation } from "react-i18next"; +import { TemplateList } from "../../utils/TemplateConstants"; +import FormListMoveArrows from "../form-list-move-arrows/form-list-move-arrows.component"; +//TODO Fix up styles. + +export default function ShopInfoSpeedPrint({ bodyshop, form }) { + const { t } = useTranslation(); + + return ( +
    + + {(fields, { add, remove, move }) => { + return ( +
    + {fields.map((field, index) => ( + +
    + + + + + + + + + + + + { + remove(field.name); + }} + /> + +
    +
    + ))} + + + +
    + ); + }} +
    +
    + ); +} diff --git a/client/src/components/shop-template-add/shop-template-add.component.jsx b/client/src/components/shop-template-add/shop-template-add.component.jsx new file mode 100644 index 000000000..4f4325667 --- /dev/null +++ b/client/src/components/shop-template-add/shop-template-add.component.jsx @@ -0,0 +1,81 @@ +import { DownOutlined } from "@ant-design/icons"; +import { useMutation } from "@apollo/react-hooks"; +import { Dropdown, Menu } from "antd"; +import queryString from "query-string"; +import React from "react"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { useHistory, useLocation } from "react-router-dom"; +import { createStructuredSelector } from "reselect"; +import { INSERT_TEMPLATE } from "../../graphql/templates.queries"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +import { TemplateList } from "../../utils/TemplateConstants"; +import { logImEXEvent } from "../../firebase/firebase.utils"; + +const mapStateToProps = createStructuredSelector({ + //currentUser: selectCurrentUser + bodyshop: selectBodyshop, +}); + +export default connect(mapStateToProps, null)(ShopTemplateAddComponent); + +export function ShopTemplateAddComponent({ + bodyshop, + shopTemplateList, + refetch, +}) { + const { t } = useTranslation(); + const search = queryString.parse(useLocation().search); + const history = useHistory(); + const [insertTemplate] = useMutation(INSERT_TEMPLATE); + + const shopTemplateKeys = shopTemplateList.map((template) => template.name); + const availableTemplateKeys = Object.keys(TemplateList).filter( + (tkey) => !shopTemplateKeys.includes(tkey) + ); + + const handleAdd = async (item) => { + logImEXEvent("shop_template_add"); + + const result = await insertTemplate({ + variables: { + template: { + name: item.key, + bodyshopid: bodyshop.id, + html: `
    Insert your custom template here.
    `, + query: `query JOBS { + jobs{ + id + ro_number + } + }`, + }, + }, + }); + + const returningId = result.data.insert_templates.returning[0].id; + search.customTemplateId = returningId; + history.push({ search: queryString.stringify(search) }); + if (!!refetch) refetch(); + }; + + const menu = ( + + {availableTemplateKeys.length > 0 ? ( + availableTemplateKeys.map((tkey) => ( + {TemplateList[tkey].title} + )) + ) : ( +
    {t("bodyshop.labels.notemplatesavailable")}
    + )} +
    + ); + + return ( + + + {t("bodyshop.actions.addtemplate")} + + + ); +} diff --git a/client/src/components/shop-template-delete/shop-template-delete.component.jsx b/client/src/components/shop-template-delete/shop-template-delete.component.jsx new file mode 100644 index 000000000..7c5f7606d --- /dev/null +++ b/client/src/components/shop-template-delete/shop-template-delete.component.jsx @@ -0,0 +1,47 @@ +import { useMutation } from "@apollo/react-hooks"; +import { Button, notification, Popconfirm } from "antd"; +import queryString from "query-string"; +import React from "react"; +import { useTranslation } from "react-i18next"; +import { useHistory, useLocation } from "react-router-dom"; +import { DELETE_TEMPLATE } from "../../graphql/templates.queries"; +import { logImEXEvent } from "../../firebase/firebase.utils"; + +export default function ShopTemplateDeleteComponent({ templateId, refetch }) { + const { t } = useTranslation(); + const search = queryString.parse(useLocation().search); + const history = useHistory(); + const [deleteTemplate] = useMutation(DELETE_TEMPLATE); + + const handleDelete = async () => { + logImEXEvent("shop_template_delete"); + + const result = await deleteTemplate({ + variables: { + templateId: templateId, + }, + }); + + if (!!result.errors) { + notification["error"]({ + message: t("bodyshop.errors.deletingtemplate", { + message: JSON.stringify(result.errors), + }), + }); + } else { + delete search.customTemplateId; + history.push({ search: queryString.stringify(search) }); + if (!!refetch) refetch(); + } + }; + + return ( + + + + ); +} diff --git a/client/src/components/shop-template-editor-save-button/shop-template-editor-save-button.component.jsx b/client/src/components/shop-template-editor-save-button/shop-template-editor-save-button.component.jsx new file mode 100644 index 000000000..15a28a4e1 --- /dev/null +++ b/client/src/components/shop-template-editor-save-button/shop-template-editor-save-button.component.jsx @@ -0,0 +1,37 @@ +import React from "react"; +import { Button, notification } from "antd"; +import { useMutation } from "@apollo/react-hooks"; +import { useTranslation } from "react-i18next"; +import { UPDATE_TEMPLATE } from "../../graphql/templates.queries"; +import { logImEXEvent } from "../../firebase/firebase.utils"; + +export default function ShopTemplateSaveButton({ templateId, html, gql }) { + const { t } = useTranslation(); + const [updateTemplate] = useMutation(UPDATE_TEMPLATE); + + const handleSave = async () => { + logImEXEvent("shop_template_update"); + + const result = await updateTemplate({ + variables: { + templateId: templateId, + template: { query: gql, html }, + }, + }); + if (!!!result.errors) { + notification["success"]({ message: t("templates.successes.updated") }); + } else { + notification["error"]({ + message: t("templates.errors.updating", { + error: JSON.stringify(result.errors), + }), + }); + } + }; + + return ( + + ); +} diff --git a/client/src/components/shop-template-editor/shop-template-editor.component.jsx b/client/src/components/shop-template-editor/shop-template-editor.component.jsx new file mode 100644 index 000000000..7a4be9a72 --- /dev/null +++ b/client/src/components/shop-template-editor/shop-template-editor.component.jsx @@ -0,0 +1,63 @@ +import { Editor } from "@tinymce/tinymce-react"; +import React, { useEffect } from "react"; +import ShopTemplateEditorSaveButton from "../shop-template-editor-save-button/shop-template-editor-save-button.component"; +import { Input } from "antd"; +export default function ShopTemplateEditorComponent({ + templateId, + html, + gql, + editorState, +}) { + const [editorContent, seteditorContent] = editorState; + + useEffect(() => { + seteditorContent((prevstate) => { + return { ...prevstate, html: html }; + }); + }, [html, seteditorContent]); + + useEffect(() => { + seteditorContent((prevstate) => { + return { ...prevstate, gql: gql }; + }); + }, [gql, seteditorContent]); + + return ( +
    + + + seteditorContent({ ...editorContent, html: text }) + } + /> + QUERY + + seteditorContent({ ...editorContent, gql: e.target.value }) + } + /> +
    + ); +} diff --git a/client/src/components/shop-template-editor/shop-template-editor.container.jsx b/client/src/components/shop-template-editor/shop-template-editor.container.jsx new file mode 100644 index 000000000..5aa97124b --- /dev/null +++ b/client/src/components/shop-template-editor/shop-template-editor.container.jsx @@ -0,0 +1,35 @@ +import { useQuery } from "@apollo/react-hooks"; +import queryString from "query-string"; +import React, { useState } from "react"; +import { useLocation } from "react-router-dom"; +import { QUERY_TEMPLATE_BY_PK } from "../../graphql/templates.queries"; +import AlertComponent from "../alert/alert.component"; +import LoadingSpinner from "../loading-spinner/loading-spinner.component"; +import ShopTemplateEditorComponent from "./shop-template-editor.component"; + +export default function ShopTemplateEditorContainer() { + const search = queryString.parse(useLocation().search); + const editorState = useState({ html: "", gql: "" }); + + const { loading, error, data } = useQuery(QUERY_TEMPLATE_BY_PK, { + variables: { + templateId: search.customTemplateId, + }, + skip: !!!search.customTemplateId, + }); + + if (!!!search.customTemplateId) return No selection.; + if (error) return ; + + return ( + + {data && data.templates_by_pk ? data.templates_by_pk.name : ""} + + + ); +} diff --git a/client/src/components/shop-templates-list/shop-templates-list.container.jsx b/client/src/components/shop-templates-list/shop-templates-list.container.jsx new file mode 100644 index 000000000..ccc604197 --- /dev/null +++ b/client/src/components/shop-templates-list/shop-templates-list.container.jsx @@ -0,0 +1,66 @@ +import { useQuery } from "@apollo/react-hooks"; +import { List, Button } from "antd"; +import React from "react"; +import { QUERY_CUSTOM_TEMPLATES } from "../../graphql/templates.queries"; +import AlertComponent from "../alert/alert.component"; +import Skeleton from "../loading-skeleton/loading-skeleton.component"; +import { useTranslation } from "react-i18next"; +import { useHistory, useLocation } from "react-router-dom"; +import queryString from "query-string"; +import { TemplateList } from "../../utils/TemplateConstants"; +import ShopTemplateAdd from "../shop-template-add/shop-template-add.component"; +import ShopTemplateDeleteComponent from "../shop-template-delete/shop-template-delete.component"; + +export default function ShopTemplatesListContainer() { + const { loading, error, data, refetch } = useQuery(QUERY_CUSTOM_TEMPLATES); + const { t } = useTranslation(); + const search = queryString.parse(useLocation().search); + const history = useHistory(); + if (error) return ; + + const handleEdit = (record) => { + if (record) { + if (record.id) { + search.customTemplateId = record.id; + history.push({ search: queryString.stringify(search) }); + } + } else { + delete search.customTemplateId; + history.push({ search: queryString.stringify(search) }); + } + }; + + return ( +
    +
    {t("bodyshop.labels.customtemplates")}
    + + ( + handleEdit(item)}> + {t("general.actions.edit")} + , + , + ]}> + + + + + )} + /> +
    + ); +} diff --git a/client/src/components/sign-in-form/sign-in-form.component.jsx b/client/src/components/sign-in-form/sign-in-form.component.jsx index fb3013270..ddecae224 100644 --- a/client/src/components/sign-in-form/sign-in-form.component.jsx +++ b/client/src/components/sign-in-form/sign-in-form.component.jsx @@ -1,17 +1,24 @@ import { LockOutlined, UserOutlined } from "@ant-design/icons"; -import { Button, Form, Input } from "antd"; +import { Button, Form, Input, Typography } from "antd"; +import queryString from "query-string"; import React from "react"; import { useApolloClient } from "react-apollo"; +import { useTranslation } from "react-i18next"; import { connect } from "react-redux"; -import { Redirect } from "react-router-dom"; +import { Link, Redirect, useLocation } from "react-router-dom"; import { createStructuredSelector } from "reselect"; -import Logo from "../../assets/logo240.png"; +import ImEXOnlineLogo from "../../assets/logo240.png"; import { UPSERT_USER } from "../../graphql/user.queries"; -import { emailSignInStart } from "../../redux/user/user.actions"; +import { + emailSignInStart, + sendPasswordReset +} from "../../redux/user/user.actions"; import { selectCurrentUser, - selectSignInError, + selectSignInError } from "../../redux/user/user.selectors"; +import AlertComponent from "../alert/alert.component"; +import "./sign-in-form.styles.scss"; const mapStateToProps = createStructuredSelector({ currentUser: selectCurrentUser, @@ -21,19 +28,25 @@ const mapStateToProps = createStructuredSelector({ const mapDispatchToProps = (dispatch) => ({ emailSignInStart: (email, password) => dispatch(emailSignInStart({ email, password })), + sendPasswordReset: (email) => dispatch(sendPasswordReset(email)), }); -export default connect( - mapStateToProps, - mapDispatchToProps -)(function SignInComponent({ emailSignInStart, currentUser, signInError }) { +export function SignInComponent({ + emailSignInStart, + currentUser, + signInError, + sendPasswordReset, +}) { + const { redirect } = queryString.parse(useLocation().search); const apolloClient = useApolloClient(); - + const { t } = useTranslation(); const handleFinish = (values) => { const { email, password } = values; emailSignInStart(email, password); }; + const [form] = Form.useForm(); + //TODO - may be able to run this only on new user creation. if (currentUser.authorized === true) { apolloClient .mutate({ @@ -49,38 +62,49 @@ export default connect( }); } + if (currentUser.authorized === true) + return ; + return ( -
    - {currentUser.authorized === true ? : null} - - Bodyshop.app - -
    +
    +
    + ImEX Online + {t("titles.app")} +
    + + name='email' + rules={[ + { required: true, message: t("general.validation.required") }, + ]}> } - placeholder="Username" + prefix={} + placeholder={t("general.labels.username")} /> + name='password' + rules={[ + { required: true, message: t("general.validation.required") }, + ]}> } - type="password" - placeholder="Password" + prefix={} + type='password' + placeholder={t("general.labels.password")} /> - - - {signInError ?
    {signInError.message}
    : null} + + +
    ); -}); +} + +export default connect(mapStateToProps, mapDispatchToProps)(SignInComponent); diff --git a/client/src/components/sign-in-form/sign-in-form.styles.scss b/client/src/components/sign-in-form/sign-in-form.styles.scss new file mode 100644 index 000000000..e24a3a038 --- /dev/null +++ b/client/src/components/sign-in-form/sign-in-form.styles.scss @@ -0,0 +1,28 @@ +.login-container { + display: flex; + align-items: center; + flex-direction: column; + padding: 2rem; + form { + width: 75vw; + max-width: 20rem; + } +} + +.login-logo-container { + display: flex; + align-items: center; + margin-bottom: 2rem; + h1 { + text-align: center; + margin: 1rem; + } +} + +//Required as it is position inside form. +.login-btn { + margin: 1.5rem 0rem; + position: relative; + left: 50%; + transform: translate(-50%, 0); +} diff --git a/client/src/components/tech-header/tech-header.component.jsx b/client/src/components/tech-header/tech-header.component.jsx new file mode 100644 index 000000000..e5fb02f9b --- /dev/null +++ b/client/src/components/tech-header/tech-header.component.jsx @@ -0,0 +1,31 @@ +import { Layout, Typography } from "antd"; +import React from "react"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { selectTechnician } from "../../redux/tech/tech.selectors"; +import { useTranslation } from "react-i18next"; +const { Header } = Layout; + +const mapStateToProps = createStructuredSelector({ + technician: selectTechnician, +}); +const mapDispatchToProps = (dispatch) => ({ + //setUserLanguage: language => dispatch(setUserLanguage(language)) +}); + +export function TechHeader({ technician }) { + const { t } = useTranslation(); + return ( +
    + + {!!technician + ? t("tech.labels.loggedin", { + name: `${technician.first_name} ${technician.last_name}`, + }) + : t("tech.labels.notloggedin")} + +
    + ); +} + +export default connect(mapStateToProps, mapDispatchToProps)(TechHeader); diff --git a/client/src/components/tech-job-clock-in-form/tech-job-clock-in-form.component.jsx b/client/src/components/tech-job-clock-in-form/tech-job-clock-in-form.component.jsx new file mode 100644 index 000000000..e8a8c0465 --- /dev/null +++ b/client/src/components/tech-job-clock-in-form/tech-job-clock-in-form.component.jsx @@ -0,0 +1,57 @@ +import { useQuery } from "@apollo/react-hooks"; +import { Form } from "antd"; +import React from "react"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { ACTIVE_JOBS_FOR_AUTOCOMPLETE } from "../../graphql/jobs.queries"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +import JobSearchSelect from "../job-search-select/job-search-select.component"; +import JobsDetailLaborContainer from "../jobs-detail-labor/jobs-detail-labor.container"; + +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, +}); + +export function TechClockInComponent({ form, bodyshop }) { + const { t } = useTranslation(); + const { loading, data } = useQuery(ACTIVE_JOBS_FOR_AUTOCOMPLETE, { + variables: { + statuses: bodyshop.md_ro_statuses.open_statuses || ["Open"], + }, + }); + + return ( +
    + + + + + + prevValues.jobid !== curValues.jobid + } + > + {() => { + if (!form.getFieldValue("jobid")) return null; + return ( + + ); + }} + +
    + ); +} +export default connect(mapStateToProps, null)(TechClockInComponent); diff --git a/client/src/components/tech-job-clock-in-form/tech-job-clock-in-form.container.jsx b/client/src/components/tech-job-clock-in-form/tech-job-clock-in-form.container.jsx new file mode 100644 index 000000000..f884766f7 --- /dev/null +++ b/client/src/components/tech-job-clock-in-form/tech-job-clock-in-form.container.jsx @@ -0,0 +1,79 @@ +import { Button, Card, Form, notification } from "antd"; +import axios from "axios"; +import React, { useState } from "react"; +import { useMutation } from "react-apollo"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { INSERT_NEW_TIME_TICKET } from "../../graphql/timetickets.queries"; +import { selectTechnician } from "../../redux/tech/tech.selectors"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +import TechClockInComponent from "./tech-job-clock-in-form.component"; + +const mapStateToProps = createStructuredSelector({ + technician: selectTechnician, + bodyshop: selectBodyshop, +}); + +export function TechClockInContainer({ technician, bodyshop }) { + const [form] = Form.useForm(); + const [loading, setLoading] = useState(false); + const [insertTimeTicket] = useMutation(INSERT_NEW_TIME_TICKET, { + refetchQueries: ["QUERY_ACTIVE_TIME_TICKETS"], + }); + const { t } = useTranslation(); + + const handleFinish = async (values) => { + setLoading(true); + const theTime = (await axios.post("/utils/time")).data; + const result = await insertTimeTicket({ + variables: { + timeTicketInput: [ + { + bodyshopid: bodyshop.id, + employeeid: technician.id, + date: theTime, + clockon: theTime, + jobid: values.jobid, + cost_center: technician.cost_center, + ciecacode: Object.keys( + bodyshop.md_responsibility_centers.defaults.costs + ).find((key) => { + return ( + bodyshop.md_responsibility_centers.defaults.costs[key] === + values.cost_center + ); + }), + }, + ], + }, + }); + + if (!!result.errors) { + notification["error"]({ + message: t("timetickets.errors.clockingin", { + message: JSON.stringify(result.errors), + }), + }); + } else { + notification["success"]({ + message: t("timetickets.successes.clockedin"), + }); + } + setLoading(false); + }; + + return ( +
    + +
    + + + +
    +
    + ); +} +export default connect(mapStateToProps, null)(TechClockInContainer); diff --git a/client/src/components/tech-job-clock-out-button/tech-job-clock-out-button.component.jsx b/client/src/components/tech-job-clock-out-button/tech-job-clock-out-button.component.jsx new file mode 100644 index 000000000..d6ed5e1b8 --- /dev/null +++ b/client/src/components/tech-job-clock-out-button/tech-job-clock-out-button.component.jsx @@ -0,0 +1,151 @@ +import { useMutation } from "@apollo/react-hooks"; +import { + Button, + Card, + Form, + InputNumber, + notification, + Popover, + Select, +} from "antd"; +import React, { useState } from "react"; +import { useTranslation } from "react-i18next"; +import { UPDATE_TIME_TICKET } from "../../graphql/timetickets.queries"; +import axios from "axios"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +import { selectTechnician } from "../../redux/tech/tech.selectors"; +import TechJobClockoutDelete from "../tech-job-clock-out-delete/tech-job-clock-out-delete.component"; +import { logImEXEvent } from "../../firebase/firebase.utils"; + +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, + technician: selectTechnician, +}); + +export function TechClockOffButton({ + bodyshop, + technician, + timeTicketId, + completedCallback, + isShiftTicket, + otherBtnProps, +}) { + const [loading, setLoading] = useState(false); + const [updateTimeticket] = useMutation(UPDATE_TIME_TICKET); + const [form] = Form.useForm(); + + const { t } = useTranslation(); + + const handleFinish = async (values) => { + logImEXEvent("tech_clock_out_job"); + + setLoading(true); + const result = await updateTimeticket({ + variables: { + timeticketId: timeTicketId, + timeticket: { + clockoff: (await axios.post("/utils/time")).data, + ...values, + }, + }, + }); + + if (!!result.errors) { + notification["error"]({ + message: t("timetickets.errors.clockingout", { + message: JSON.stringify(result.errors), + }), + }); + } else { + notification["success"]({ + message: t("timetickets.successes.clockedout"), + }); + } + setLoading(false); + if (completedCallback) completedCallback(); + }; + + const overlay = ( + +
    +
    + {!isShiftTicket ? ( +
    + + + + + + +
    + ) : null} + + + + + + + +
    +
    + ); + + return ( + + + + ); +} +export default connect(mapStateToProps, null)(TechClockOffButton); diff --git a/client/src/components/tech-job-clock-out-delete/tech-job-clock-out-delete.component.jsx b/client/src/components/tech-job-clock-out-delete/tech-job-clock-out-delete.component.jsx new file mode 100644 index 000000000..200f8060c --- /dev/null +++ b/client/src/components/tech-job-clock-out-delete/tech-job-clock-out-delete.component.jsx @@ -0,0 +1,46 @@ +import React from "react"; +import { Popconfirm, notification } from "antd"; +import { DeleteFilled } from "@ant-design/icons"; +import { DELETE_TIME_TICKET } from "../../graphql/timetickets.queries"; +import { useTranslation } from "react-i18next"; +import { useMutation } from "@apollo/react-hooks"; +import { logImEXEvent } from "../../firebase/firebase.utils"; + +export default function TechJobClockoutDelete({ + timeTicketId, + completedCallback, +}) { + const [deleteTimeTicket] = useMutation(DELETE_TIME_TICKET); + const { t } = useTranslation(); + const handleDelete = async () => { + logImEXEvent("tech_clock_delete"); + + const result = await deleteTimeTicket({ + variables: { id: timeTicketId }, + refetchQueries: ["QUERY_ACTIVE_TIME_TICKETS"], + }); + + if (!!result.errors) { + notification["error"]({ + message: t("timetickets.errors.deleting", { + message: JSON.stringify(result.errors), + }), + }); + } else { + notification["success"]({ + message: t("timetickets.successes.deleted"), + }); + } + if (completedCallback) completedCallback(); + }; + + return ( + + + + ); +} diff --git a/client/src/components/tech-job-clocked-in-list/tech-job-clocked-in-list.component.jsx b/client/src/components/tech-job-clocked-in-list/tech-job-clocked-in-list.component.jsx new file mode 100644 index 000000000..cebf320d4 --- /dev/null +++ b/client/src/components/tech-job-clocked-in-list/tech-job-clocked-in-list.component.jsx @@ -0,0 +1,93 @@ +import { Card, List, Typography } from "antd"; +import React from "react"; +import { useQuery } from "react-apollo"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { Link } from "react-router-dom"; +import { createStructuredSelector } from "reselect"; +import { QUERY_ACTIVE_TIME_TICKETS } from "../../graphql/timetickets.queries"; +import { selectTechnician } from "../../redux/tech/tech.selectors"; +import { DateTimeFormatter } from "../../utils/DateFormatter"; +import AlertComponent from "../alert/alert.component"; +import DataLabel from "../data-label/data-label.component"; +import LoadingSpinner from "../loading-spinner/loading-spinner.component"; +import TechClockOffButton from "../tech-job-clock-out-button/tech-job-clock-out-button.component"; + +const mapStateToProps = createStructuredSelector({ + technician: selectTechnician, +}); +const mapDispatchToProps = (dispatch) => ({ + //setUserLanguage: language => dispatch(setUserLanguage(language)) +}); + +export function TechClockedInList({ technician }) { + const { loading, error, data, refetch } = useQuery( + QUERY_ACTIVE_TIME_TICKETS, + { + variables: { + employeeId: technician.id, + }, + } + ); + + const { t } = useTranslation(); + + if (loading) return ; + if (error) return ; + + return ( +
    + {data.timetickets.length > 0 ? ( +
    + + {t("timetickets.labels.alreadyclockedon")} + + ( + + + {`${ticket.job.ro_number || ticket.job.est_number} ${ + ticket.job.ownr_fn || "" + } ${ticket.job.ownr_ln || ""} ${ + ticket.job.ownr_co_nm || "" + }`} + + } + actions={[ + , + ]} + > +
    + {` + ${ticket.job.v_model_yr || ""} ${ + ticket.job.v_make_desc || "" + } ${ticket.job.v_model_desc || ""}`} +
    + + {ticket.clockon} + +
    +
    + )} + >
    +
    + ) : null} +
    + ); +} +export default connect(mapStateToProps, mapDispatchToProps)(TechClockedInList); diff --git a/client/src/components/tech-login/tech-login.component.jsx b/client/src/components/tech-login/tech-login.component.jsx new file mode 100644 index 000000000..4d5854b4e --- /dev/null +++ b/client/src/components/tech-login/tech-login.component.jsx @@ -0,0 +1,75 @@ +import { Button, Form, Input } from "antd"; +import React from "react"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { techLoginStart } from "../../redux/tech/tech.actions"; +import { + selectLoginError, + selectLoginLoading, + selectTechnician, +} from "../../redux/tech/tech.selectors"; +import AlertComponent from "../alert/alert.component"; +import "./tech-login.styles.scss"; +import { Redirect } from "react-router-dom"; + +const mapStateToProps = createStructuredSelector({ + technician: selectTechnician, + loginError: selectLoginError, + loginLoading: selectLoginLoading, +}); + +const mapDispatchToProps = (dispatch) => ({ + techLoginStart: (user) => dispatch(techLoginStart(user)), +}); + +export function TechLogin({ + technician, + loginError, + loginLoading, + techLoginStart, +}) { + const { t } = useTranslation(); + + const handleFinish = (values) => { + techLoginStart(values); + }; + + return ( +
    + {technician ? : null} +
    + + + + + + + + + {loginError ? : null} +
    + ); +} +export default connect(mapStateToProps, mapDispatchToProps)(TechLogin); diff --git a/client/src/components/tech-login/tech-login.styles.scss b/client/src/components/tech-login/tech-login.styles.scss new file mode 100644 index 000000000..c7d1d5a57 --- /dev/null +++ b/client/src/components/tech-login/tech-login.styles.scss @@ -0,0 +1,16 @@ +.tech-login-container { + display: flex; + align-items: center; + flex-direction: column; + padding: 2rem; + form { + width: 75vw; + max-width: 30rem; + } + .login-btn { + margin: 1.5rem 0rem; + position: relative; + left: 50%; + transform: translate(-50%, 0); + } +} diff --git a/client/src/components/tech-lookup-jobs-drawer/tech-lookup-jobs-drawer.component.jsx b/client/src/components/tech-lookup-jobs-drawer/tech-lookup-jobs-drawer.component.jsx new file mode 100644 index 000000000..d4c761808 --- /dev/null +++ b/client/src/components/tech-lookup-jobs-drawer/tech-lookup-jobs-drawer.component.jsx @@ -0,0 +1,141 @@ +import { PrinterFilled } from "@ant-design/icons"; +import { useQuery } from "@apollo/react-hooks"; +import { Button, Col, Drawer, Grid, PageHeader, Row, Tag, Tabs } from "antd"; +import queryString from "query-string"; +import React from "react"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { Link, useHistory, useLocation } from "react-router-dom"; +import { QUERY_JOB_CARD_DETAILS } from "../../graphql/jobs.queries"; +import { setModalContext } from "../../redux/modals/modals.actions"; +import AlertComponent from "../alert/alert.component"; +import LoadingSpinner from "../loading-spinner/loading-spinner.component"; +import OwnerTagPopoverComponent from "../owner-tag-popover/owner-tag-popover.component"; +import VehicleTagPopoverComponent from "../vehicle-tag-popover/vehicle-tag-popover.component"; +import JobLinesContainer from "../job-detail-lines/job-lines.container"; +import JobsDocumentsGalleryContainer from "../jobs-documents-gallery/jobs-documents-gallery.container"; +import JobNotesContainer from "../jobs-notes/jobs-notes.container"; + +const mapDispatchToProps = (dispatch) => ({ + setPrintCenterContext: (context) => + dispatch(setModalContext({ context: context, modal: "printCenter" })), +}); + +const colBreakPoints = { + xs: { + span: 24, + }, + sm: { + span: 8, + }, +}; + +export function JobDetailCards({ setPrintCenterContext }) { + const selectedBreakpoint = Object.entries(Grid.useBreakpoint()) + .filter((screen) => !!screen[1]) + .slice(-1)[0]; + + const bpoints = { + xs: "100%", + sm: "100%", + md: "100%", + lg: "70%", + xl: "70%", + xxl: "70%", + }; + const drawerPercentage = selectedBreakpoint + ? bpoints[selectedBreakpoint[0]] + : "100%"; + + const searchParams = queryString.parse(useLocation().search); + const { selected } = searchParams; + const history = useHistory(); + const { loading, error, data, refetch } = useQuery(QUERY_JOB_CARD_DETAILS, { + fetchPolicy: "network-only", + variables: { id: selected }, + skip: !selected, + }); + + const { t } = useTranslation(); + const handleDrawerClose = () => { + delete searchParams.selected; + history.push({ + search: queryString.stringify({ + ...searchParams, + }), + }); + }; + + return ( + + {loading ? : null} + {error ? : null} + {data ? ( + , + , + + {t("jobs.labels.inproduction")} + , + ]} + title={ + + {data.jobs_by_pk.ro_number + ? `${t("jobs.fields.ro_number")} ${data.jobs_by_pk.ro_number}` + : `${t("jobs.fields.est_number")} ${ + data.jobs_by_pk.est_number + }`} + + } + subTitle={data.jobs_by_pk.status} + extra={ + + } + > + +
    What would be good to have here? + What would be good to have here? + What would be good to have here? + + + + + + + + + + + + + + ) : null} + + ); +} +export default connect(null, mapDispatchToProps)(JobDetailCards); diff --git a/client/src/components/tech-lookup-jobs-list/tech-lookup-jobs-list.component.jsx b/client/src/components/tech-lookup-jobs-list/tech-lookup-jobs-list.component.jsx new file mode 100644 index 000000000..94c6ed143 --- /dev/null +++ b/client/src/components/tech-lookup-jobs-list/tech-lookup-jobs-list.component.jsx @@ -0,0 +1,244 @@ +import { SyncOutlined } from "@ant-design/icons"; +import { useQuery } from "@apollo/react-hooks"; +import { Button, Input, Table } from "antd"; +import queryString from "query-string"; +import React, { useState } from "react"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { Link, useHistory, useLocation } from "react-router-dom"; +import { createStructuredSelector } from "reselect"; +import { QUERY_ALL_ACTIVE_JOBS } from "../../graphql/jobs.queries"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +import { onlyUnique } from "../../utils/arrayHelper"; +import { alphaSort } from "../../utils/sorters"; +import AlertComponent from "../alert/alert.component"; + +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, +}); + +export function TechLookupJobsList({ bodyshop }) { + const searchParams = queryString.parse(useLocation().search); + const { selected } = searchParams; + + const { loading, error, data, refetch } = useQuery(QUERY_ALL_ACTIVE_JOBS, { + variables: { + statuses: bodyshop.md_ro_statuses.open_statuses || ["Open", "Open*"], + }, + }); + + const [state, setState] = useState({ + sortedInfo: {}, + filteredInfo: { text: "" }, + }); + + const { t } = useTranslation(); + const history = useHistory(); + const [searchText, setSearchText] = useState(""); + + if (error) return ; + + const jobs = data + ? searchText === "" + ? data.jobs + : data.jobs.filter( + (j) => + (j.est_number || "") + .toString() + .toLowerCase() + .includes(searchText.toLowerCase()) || + (j.ro_number || "") + .toString() + .toLowerCase() + .includes(searchText.toLowerCase()) || + (j.ownr_fn || "") + .toLowerCase() + .includes(searchText.toLowerCase()) || + (j.ownr_ln || "") + .toLowerCase() + .includes(searchText.toLowerCase()) || + (j.ownr_co_nm || "") + .toLowerCase() + .includes(searchText.toLowerCase()) || + (j.clm_no || "").toLowerCase().includes(searchText.toLowerCase()) || + (j.plate_no || "") + .toLowerCase() + .includes(searchText.toLowerCase()) || + (j.v_model_desc || "") + .toLowerCase() + .includes(searchText.toLowerCase()) || + (j.v_make_desc || "") + .toLowerCase() + .includes(searchText.toLowerCase()) + ) + : []; + + const handleTableChange = (pagination, filters, sorter) => { + setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); + }; + + const handleOnRowClick = (record) => { + if (record) { + if (record.id) { + history.push({ + search: queryString.stringify({ + ...searchParams, + selected: record.id, + }), + }); + } + } + }; + + const columns = [ + { + title: t("jobs.fields.ro_number"), + dataIndex: "ro_number", + key: "ro_number", + sorter: (a, b) => alphaSort(a.ro_number, b.ro_number), + sortOrder: + state.sortedInfo.columnKey === "ro_number" && state.sortedInfo.order, + + render: (text, record) => ( + {record.ro_number} + ), + }, + { + title: t("jobs.fields.est_number"), + dataIndex: "est_number", + key: "est_number", + sorter: (a, b) => a.est_number - b.est_number, + sortOrder: + state.sortedInfo.columnKey === "est_number" && state.sortedInfo.order, + + render: (text, record) => ( + {record.est_number} + ), + }, + + { + title: t("jobs.fields.owner"), + dataIndex: "owner", + key: "owner", + sorter: (a, b) => alphaSort(a.ownr_ln, b.ownr_ln), + sortOrder: + state.sortedInfo.columnKey === "owner" && state.sortedInfo.order, + ellipsis: true, + render: (text, record) => ( + {`${record.ownr_fn || ""} ${record.ownr_ln || ""} ${ + record.ownr_co_nm || "" + }`} + ), + }, + { + title: t("jobs.fields.status"), + dataIndex: "status", + key: "status", + sorter: (a, b) => alphaSort(a.status, b.status), + sortOrder: + state.sortedInfo.columnKey === "status" && state.sortedInfo.order, + filters: + (jobs && + jobs + .map((j) => j.status) + .filter(onlyUnique) + .map((s) => { + return { + text: s || "No Status*", + value: [s], + }; + })) || + [], + onFilter: (value, record) => value.includes(record.status), + render: (text, record) => { + return record.status || t("general.labels.na"); + }, + }, + + { + title: t("jobs.fields.vehicle"), + dataIndex: "vehicle", + key: "vehicle", + ellipsis: true, + render: (text, record) => ( + {`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${ + record.v_model_desc || "" + }`} + ), + }, + { + title: t("vehicles.fields.plate_no"), + dataIndex: "plate_no", + key: "plate_no", + sorter: (a, b) => alphaSort(a.plate_no, b.plate_no), + sortOrder: + state.sortedInfo.columnKey === "plate_no" && state.sortedInfo.order, + render: (text, record) => { + return record.plate_no ? record.plate_no : ""; + }, + }, + { + title: t("jobs.fields.clm_no"), + dataIndex: "clm_no", + key: "clm_no", + ellipsis: true, + sorter: (a, b) => alphaSort(a.clm_no, b.clm_no), + sortOrder: + state.sortedInfo.columnKey === "clm_no" && state.sortedInfo.order, + render: (text, record) => { + return record.clm_no ? ( + {record.clm_no} + ) : ( + t("general.labels.unknown") + ); + }, + }, + ]; + + return ( +
    { + return ( +
    + + { + setSearchText(e.target.value); + }} + value={searchText} + enterButton + /> +
    + ); + }} + rowSelection={{ + onSelect: (record) => { + handleOnRowClick(record); + }, + selectedRowKeys: [selected], + type: "radio", + }} + onChange={handleTableChange} + onRow={(record, rowIndex) => { + return { + onClick: (event) => { + handleOnRowClick(record); + }, + }; + }} + /> + ); +} + +export default connect(mapStateToProps, null)(TechLookupJobsList); diff --git a/client/src/components/tech-sider/tech-sider.component.jsx b/client/src/components/tech-sider/tech-sider.component.jsx new file mode 100644 index 000000000..00816f035 --- /dev/null +++ b/client/src/components/tech-sider/tech-sider.component.jsx @@ -0,0 +1,71 @@ +import Icon, { SearchOutlined } from "@ant-design/icons"; +import { Layout, Menu } from "antd"; +import React, { useState } from "react"; +import { useTranslation } from "react-i18next"; +import { FaBusinessTime } from "react-icons/fa"; +import { FiLogIn, FiLogOut } from "react-icons/fi"; +import { MdTimer } from "react-icons/md"; +import { connect } from "react-redux"; +import { Link } from "react-router-dom"; +import { createStructuredSelector } from "reselect"; +import { techLogout } from "../../redux/tech/tech.actions"; +import { selectTechnician } from "../../redux/tech/tech.selectors"; + +const { Sider } = Layout; + +const mapStateToProps = createStructuredSelector({ + technician: selectTechnician, +}); +const mapDispatchToProps = (dispatch) => ({ + techLogout: () => dispatch(techLogout()), +}); + +export function TechSider({ technician, techLogout }) { + const [collapsed, setCollapsed] = useState(true); + const { t } = useTranslation(); + const onCollapse = (collapsed) => { + setCollapsed(collapsed); + }; + + return ( + + + }> + {t("menus.tech.login")} + + }> + {t("menus.tech.joblookup")} + + }> + {t("menus.tech.jobclockin")} + + }> + {t("menus.tech.shiftclockin")} + + }> + {t("menus.tech.productionlist")} + + }> + {t("menus.tech.productionboard")} + + techLogout()} + icon={}> + {t("menus.tech.logout")} + + + + ); +} +export default connect(mapStateToProps, mapDispatchToProps)(TechSider); diff --git a/client/src/components/ticket-tickets-dates-selector/time-tickets-dates-selector.component.jsx b/client/src/components/ticket-tickets-dates-selector/time-tickets-dates-selector.component.jsx new file mode 100644 index 000000000..65fe93ae9 --- /dev/null +++ b/client/src/components/ticket-tickets-dates-selector/time-tickets-dates-selector.component.jsx @@ -0,0 +1,45 @@ +import { DatePicker } from "antd"; +import moment from "moment"; +import queryString from "query-string"; +import React from "react"; +import { useHistory, useLocation } from "react-router-dom"; + +export default function TimeTicketsDatesSelector() { + const searchParams = queryString.parse(useLocation().search); + const { start, end } = searchParams; + const history = useHistory(); + + const handleChange = (dates) => { + if (dates) { + const [start, end] = dates; + + if (!!start && !!end) { + history.push({ + search: queryString.stringify({ + start: start.format("YYYY-MM-DD"), + end: end.format("YYYY-MM-DD"), + }), + }); + } + } else { + history.push({ + search: queryString.stringify({ + start: null, + end: null, + }), + }); + } + }; + + return ( +
    + +
    + ); +} diff --git a/client/src/components/time-ticket-enter-button/time-ticket-enter-button.component.jsx b/client/src/components/time-ticket-enter-button/time-ticket-enter-button.component.jsx index 5e589045a..281fb7dbf 100644 --- a/client/src/components/time-ticket-enter-button/time-ticket-enter-button.component.jsx +++ b/client/src/components/time-ticket-enter-button/time-ticket-enter-button.component.jsx @@ -12,17 +12,18 @@ export function TimeTicketEnterButton({ actions, context, setTimeTicketContext, + disabled, children, }) { return ( ); diff --git a/client/src/components/time-ticket-list/time-ticket-list.component.jsx b/client/src/components/time-ticket-list/time-ticket-list.component.jsx index 2ca0ad1d5..1f9706808 100644 --- a/client/src/components/time-ticket-list/time-ticket-list.component.jsx +++ b/client/src/components/time-ticket-list/time-ticket-list.component.jsx @@ -5,8 +5,16 @@ import { Link } from "react-router-dom"; import { alphaSort } from "../../utils/sorters"; import { DateFormatter } from "../../utils/DateFormatter"; import TimeTicketEnterButton from "../time-ticket-enter-button/time-ticket-enter-button.component"; +import { DateTimeFormatter } from "../../utils/DateFormatter"; +import moment from "moment"; +import { onlyUnique } from "../../utils/arrayHelper"; -export default function TimeTicketList({ loading, timetickets, refetch }) { +export default function TimeTicketList({ + loading, + timetickets, + refetch, + techConsole, +}) { const [state, setState] = useState({ sortedInfo: {}, filteredInfo: { text: "" }, @@ -32,8 +40,7 @@ export default function TimeTicketList({ loading, timetickets, refetch }) { sortOrder: state.sortedInfo.columnKey === "vin" && state.sortedInfo.order, render: (text, record) => ( {`${record.employee.first_name} ${record.employee.last_name}`} + to={`/manage/employees/${record.employee.id}`}>{`${record.employee.first_name} ${record.employee.last_name}`} ), }, { @@ -41,8 +48,23 @@ export default function TimeTicketList({ loading, timetickets, refetch }) { dataIndex: "cost_center", key: "cost_center", sorter: (a, b) => alphaSort(a.cost_center, b.cost_center), + render: (text, record) => + record.cost_center === "timetickets.labels.shift" + ? t(record.cost_center) + : record.cost_center, sortOrder: state.sortedInfo.columnKey === "status" && state.sortedInfo.order, + filters: + timetickets + .map((l) => l.cost_center) + .filter(onlyUnique) + .map((s) => { + return { + text: s, //|| "No Status*", + value: [s], + }; + }) || [], + onFilter: (value, record) => value.includes(record.cost_center), }, { title: t("timetickets.fields.productivehrs"), @@ -61,18 +83,64 @@ export default function TimeTicketList({ loading, timetickets, refetch }) { sortOrder: state.sortedInfo.columnKey === "actualhrs" && state.sortedInfo.order, }, + { + title: t("timetickets.fields.clockon"), + dataIndex: "clockon", + key: "clockon", + sorter: (a, b) => a.clockon - b.clockon, + sortOrder: + state.sortedInfo.columnKey === "clockon" && state.sortedInfo.order, + render: (text, record) => ( + {record.clockon} + ), + }, + { + title: t("timetickets.fields.clockoff"), + dataIndex: "clockoff", + key: "clockoff", + sorter: (a, b) => a.clockoff - b.clockoff, + sortOrder: + state.sortedInfo.columnKey === "clockoff" && state.sortedInfo.order, + render: (text, record) => ( + {record.clockoff} + ), + }, + { + title: t("timetickets.fields.clockhours"), + dataIndex: "clockoff", + key: "clockoff", + sorter: (a, b) => a.clockoff - b.clockoff, + sortOrder: + state.sortedInfo.columnKey === "clockoff" && state.sortedInfo.order, + render: (text, record) => { + if (record.clockoff && record.clockon) + return ( +
    + {moment(record.clockoff) + .diff(moment(record.clockon), "hours", true) + .toFixed(2)} +
    + ); + else { + return null; + } + }, + }, { title: t("general.labels.actions"), dataIndex: "actions", key: "actions", - render: (text, record) => ( - - {t("general.actions.edit")} - - ), + render: (text, record) => { + if (techConsole) return null; + return ( + + {t("general.actions.edit")} + + ); + }, }, ]; @@ -83,10 +151,10 @@ export default function TimeTicketList({ loading, timetickets, refetch }) { return (
    ({ ...item }))} - rowKey="id" + rowKey='id' dataSource={timetickets} onChange={handleTableChange} /> diff --git a/client/src/components/time-ticket-modal/time-ticket-modal.component.jsx b/client/src/components/time-ticket-modal/time-ticket-modal.component.jsx index 3af0d4e96..c4ba56d87 100644 --- a/client/src/components/time-ticket-modal/time-ticket-modal.component.jsx +++ b/client/src/components/time-ticket-modal/time-ticket-modal.component.jsx @@ -1,7 +1,8 @@ -import { DatePicker, Form, InputNumber, Input, Select } from "antd"; +import { Form, Input, InputNumber, Select } from "antd"; import React from "react"; import { useTranslation } from "react-i18next"; import EmployeeSearchSelect from "../employee-search-select/employee-search-select.component"; +import FormDatePicker from "../form-date-picker/form-date-picker.component"; import JobSearchSelect from "../job-search-select/job-search-select.component"; import LaborAllocationsTable from "../labor-allocations-table/labor-allocations-table.component"; @@ -64,7 +65,7 @@ export default function TimeTicketModalComponent({ }, ]} > - + - + - + {responsibilityCenters.costs.map((item) => ( - {item} + {item.name} ))} diff --git a/client/src/components/time-ticket-modal/time-ticket-modal.container.jsx b/client/src/components/time-ticket-modal/time-ticket-modal.container.jsx index c433838e7..a6c05aec5 100644 --- a/client/src/components/time-ticket-modal/time-ticket-modal.container.jsx +++ b/client/src/components/time-ticket-modal/time-ticket-modal.container.jsx @@ -59,7 +59,7 @@ export function TimeTicketModalContainer({ } else { insertTicket({ variables: { - timeTicketInput: [values], + timeTicketInput: [{ ...values, bodyshopid: bodyshop.id }], }, }) .then(handleMutationSuccess) @@ -73,7 +73,11 @@ export function TimeTicketModalContainer({ }); if (timeTicketModal.actions.refetch) timeTicketModal.actions.refetch(); if (enterAgain) { + //Capture the existing information and repopulate it. + + const prev = form.getFieldsValue(["jobid", "employeeid", "date"]); form.resetFields(); + form.setFieldsValue(prev); } else { toggleModalVisible(); } @@ -108,22 +112,21 @@ export function TimeTicketModalContainer({ ); form.setFieldsValue({ cost_center: emps.length > 0 ? emps[0].cost_center : "", - ciecacode: Object.keys( - bodyshop.md_responsibility_centers.defaults - ).find( - (key) => - bodyshop.md_responsibility_centers.defaults[key] === - emps[0].cost_center - ), + ciecacode: + Object.keys(bodyshop.md_responsibility_centers.defaults.costs).find( + (key) => + bodyshop.md_responsibility_centers.defaults.costs[key] === + emps[0].cost_center + ) || "LAB", }); } if (!!changedFields.cost_center && !!EmployeeAutoCompleteData) { form.setFieldsValue({ ciecacode: Object.keys( - bodyshop.md_responsibility_centers.defaults + bodyshop.md_responsibility_centers.defaults.costs ).find( (key) => - bodyshop.md_responsibility_centers.defaults[key] === + bodyshop.md_responsibility_centers.defaults.costs[key] === changedFields.cost_center ), }); @@ -172,6 +175,10 @@ export function TimeTicketModalContainer({ timeTicketModal.context.timeticket ? { ...timeTicketModal.context.timeticket, + jobid: + (timeTicketModal.context.timeticket.job && + timeTicketModal.context.timeticket.job.id) || + null, date: timeTicketModal.context.timeticket.date ? moment(timeTicketModal.context.date) : null, diff --git a/client/src/components/time-ticket-shift-active/time-ticket-shift-active.component.jsx b/client/src/components/time-ticket-shift-active/time-ticket-shift-active.component.jsx new file mode 100644 index 000000000..b24576518 --- /dev/null +++ b/client/src/components/time-ticket-shift-active/time-ticket-shift-active.component.jsx @@ -0,0 +1,50 @@ +import { Card, List, Typography } from "antd"; +import React from "react"; +import { useTranslation } from "react-i18next"; +import { DateTimeFormatter } from "../../utils/DateFormatter"; +import DataLabel from "../data-label/data-label.component"; +import TechClockOffButton from "../tech-job-clock-out-button/tech-job-clock-out-button.component"; + +export default function TimeTicketShiftActive({ timetickets, refetch }) { + const { t } = useTranslation(); + + return ( +
    + {timetickets.length > 0 ? ( +
    + + {t("timetickets.labels.shiftalreadyclockedon")} + + ( + + , + ]}> + + {ticket.clockon} + + + + )}> +
    + ) : null} +
    + ); +} diff --git a/client/src/components/time-ticket-shift-form/time-ticket-shift-form.component.jsx b/client/src/components/time-ticket-shift-form/time-ticket-shift-form.component.jsx new file mode 100644 index 000000000..6bd25a2ea --- /dev/null +++ b/client/src/components/time-ticket-shift-form/time-ticket-shift-form.component.jsx @@ -0,0 +1,53 @@ +import { Form, Select } from "antd"; +import React from "react"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { selectBodyshop } from "../../redux/user/user.selectors"; + +const mapStateToProps = createStructuredSelector({ + //currentUser: selectCurrentUser + bodyshop: selectBodyshop, +}); +const mapDispatchToProps = (dispatch) => ({ + //setUserLanguage: language => dispatch(setUserLanguage(language)) +}); + +export function TimeTicketShiftFormComponent({ bodyshop, form }) { + const { t } = useTranslation(); + return ( +
    + + + +
    + ); +} +export default connect( + mapStateToProps, + mapDispatchToProps +)(TimeTicketShiftFormComponent); diff --git a/client/src/components/time-ticket-shift-form/time-ticket-shift-form.container.jsx b/client/src/components/time-ticket-shift-form/time-ticket-shift-form.container.jsx new file mode 100644 index 000000000..b30c1d097 --- /dev/null +++ b/client/src/components/time-ticket-shift-form/time-ticket-shift-form.container.jsx @@ -0,0 +1,89 @@ +import { useMutation } from "@apollo/react-hooks"; +import { Button, Form, notification } from "antd"; +import React, { useState } from "react"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { INSERT_NEW_TIME_TICKET } from "../../graphql/timetickets.queries"; +import { selectTechnician } from "../../redux/tech/tech.selectors"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +import TimeTicektShiftComponent from "./time-ticket-shift-form.component"; +import axios from "axios"; +import moment from "moment"; +const mapStateToProps = createStructuredSelector({ + //currentUser: selectCurrentUser + bodyshop: selectBodyshop, + technician: selectTechnician, +}); +const mapDispatchToProps = (dispatch) => ({ + //setUserLanguage: language => dispatch(setUserLanguage(language)) +}); + +export function TimeTicektShiftContainer({ + bodyshop, + technician, + isTechConsole, +}) { + const [form] = Form.useForm(); + const [insertTimeTicket] = useMutation(INSERT_NEW_TIME_TICKET); + const { t } = useTranslation(); + const [loading, setLoading] = useState(false); + + const handleFinish = async (values) => { + setLoading(true); + console.log(values); + const theTime = moment((await axios.post("/utils/time")).data); + + const result = await insertTimeTicket({ + variables: { + timeTicketInput: [ + { + bodyshopid: bodyshop.id, + employeeid: isTechConsole + ? technician.id + : bodyshop.associations[0].user.employee.id, + cost_center: "timetickets.labels.shift", + clockon: theTime, + date: theTime, + memo: values.memo, + }, + ], + }, + awaitRefetchQueries: true, + refetchQueries: ["QUERY_ACTIVE_SHIFT_TIME_TICKETS"], + }); + + if (!!result.errors) { + notification["error"]({ + message: t("timetickets.errors.clockingin", { + message: JSON.stringify(result.errors), + }), + }); + } else { + notification["success"]({ + message: t("timetickets.successes.clockedin"), + }); + } + setLoading(false); + }; + + return ( +
    +
    + + + +
    + ); +} +export default connect( + mapStateToProps, + mapDispatchToProps +)(TimeTicektShiftContainer); diff --git a/client/src/components/time-ticket-shift/time-ticket-shift.container.jsx b/client/src/components/time-ticket-shift/time-ticket-shift.container.jsx new file mode 100644 index 000000000..5ff67d8d8 --- /dev/null +++ b/client/src/components/time-ticket-shift/time-ticket-shift.container.jsx @@ -0,0 +1,57 @@ +import React from "react"; +import { useQuery } from "react-apollo"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { QUERY_ACTIVE_SHIFT_TIME_TICKETS } from "../../graphql/timetickets.queries"; +import { selectTechnician } from "../../redux/tech/tech.selectors"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +import AlertComponent from "../alert/alert.component"; +import LoadingSpinner from "../loading-spinner/loading-spinner.component"; +import TimeTicketShiftActive from "../time-ticket-shift-active/time-ticket-shift-active.component"; +import TimeTicketShiftFormContainer from "../time-ticket-shift-form/time-ticket-shift-form.container"; + +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, + technician: selectTechnician, +}); +const mapDispatchToProps = (dispatch) => ({ + //setUserLanguage: language => dispatch(setUserLanguage(language)) +}); + +export function TimeTicketShiftContainer({ + bodyshop, + technician, + isTechConsole, +}) { + const { loading, error, data, refetch } = useQuery( + QUERY_ACTIVE_SHIFT_TIME_TICKETS, + { + variables: { + employeeId: isTechConsole + ? technician.id + : bodyshop.associations[0].user.employee.id, + }, + } + ); + + if (loading) return ; + if (error) return ; + + return ( +
    + {data.timetickets.length > 0 ? ( + + ) : ( + + )} +
    + ); +} + +export default connect( + mapStateToProps, + mapDispatchToProps +)(TimeTicketShiftContainer); diff --git a/client/src/components/time-tickets-summary-employees/time-tickets-summary-employees.component.jsx b/client/src/components/time-tickets-summary-employees/time-tickets-summary-employees.component.jsx new file mode 100644 index 000000000..f00b88d05 --- /dev/null +++ b/client/src/components/time-tickets-summary-employees/time-tickets-summary-employees.component.jsx @@ -0,0 +1,210 @@ +import React from "react"; +import { Statistic, Space, List, Button, Typography } from "antd"; +import LoadingSkeleton from "../loading-skeleton/loading-skeleton.component"; +import { useTranslation } from "react-i18next"; +import moment from "moment"; +import RenderTemplate, { + displayTemplateInWindow, +} from "../../utils/RenderTemplate"; +import { TemplateList } from "../../utils/TemplateConstants"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +import { onlyUnique } from "../../utils/arrayHelper"; + +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, +}); +const mapDispatchToProps = (dispatch) => ({ + //setUserLanguage: language => dispatch(setUserLanguage(language)) +}); + +export function TimeTicketsSummaryEmployees({ + bodyshop, + loading, + timetickets, + startDate, + endDate, +}) { + const { t } = useTranslation(); + + //Group everything by employee + //Then sum the individual time TimeTicketsSummary. + + //Calculate job based tickets. + const jobTicketsByEmployee = {}; + timetickets + .filter((i) => i.cost_center !== "timetickets.labels.shift") + .map((tt) => { + if (!!!jobTicketsByEmployee[tt.employeeid]) { + jobTicketsByEmployee[tt.employeeid] = []; + } + jobTicketsByEmployee[tt.employeeid].push(tt); + return null; + }); + const jobTickets = Object.keys(jobTicketsByEmployee).map(function (key) { + return { + employee: jobTicketsByEmployee[key][0].employee, + tickets: jobTicketsByEmployee[key], + }; + }); + + //Calculate shift based tickets. + const shiftTicketsByEmployee = {}; + timetickets + .filter((i) => i.cost_center === "timetickets.labels.shift") + .map((tt) => { + if (!!!shiftTicketsByEmployee[tt.employeeid]) { + shiftTicketsByEmployee[tt.employeeid] = []; + } + shiftTicketsByEmployee[tt.employeeid].push(tt); + return null; + }); + const shiftTickets = Object.keys(shiftTicketsByEmployee).map(function (key) { + return { + employee: shiftTicketsByEmployee[key][0].employee, + tickets: shiftTicketsByEmployee[key], + }; + }); + + const handlePrintEmployeeTicket = async (empId) => { + const html = await RenderTemplate( + { + name: TemplateList.time_tickets_by_employee.key, + variables: { id: empId, start: startDate, end: endDate }, + }, + bodyshop + ); + displayTemplateInWindow(html); + }; + + return ( +
    + + {t("timetickets.labels.jobhours")} + + } + itemLayout="horizontal" + //dataSource={jobTickets} + > + {jobTickets.map((item, idx) => { + const costCenters = item.tickets + .map((i) => i.cost_center) + .filter(onlyUnique); + + console.log("costCenters", costCenters); + + const actHrs = item.tickets.reduce( + (acc, val) => acc + val.actualhrs, + 0 + ); + + const prodHrs = item.tickets.reduce( + (acc, val) => acc + val.productivehrs, + 0 + ); + + const clockHrs = item.tickets.reduce((acc, val) => { + if (!!val.clockoff && !!val.clockon) + return ( + acc + + moment(val.clockoff).diff(moment(val.clockon), "hours", true) + ); + return acc; + }, 0); + + return ( + handlePrintEmployeeTicket(item.employee.id)} + > + {t("timetickets.actions.printemployee")} + , + ]} + > + + + + + + + + + + + ); + })} + + + {t("timetickets.labels.clockhours")} + + } + itemLayout="horizontal" + dataSource={shiftTickets} + renderItem={(item) => { + const clockHrs = item.tickets.reduce((acc, val) => { + if (!!val.clockoff && !!val.clockon) + return ( + acc + + moment(val.clockoff).diff(moment(val.clockon), "hours", true) + ); + return acc; + }, 0); + + return ( + handlePrintEmployeeTicket(item.employee.id)} + > + {t("timetickets.actions.printemployee")} + , + ]} + > + + + + + + ); + }} + /> +
    + ); +} +export default connect( + mapStateToProps, + mapDispatchToProps +)(TimeTicketsSummaryEmployees); diff --git a/client/src/components/time-tickets-summary/time-tickets-summary.component.jsx b/client/src/components/time-tickets-summary/time-tickets-summary.component.jsx new file mode 100644 index 000000000..766df4c39 --- /dev/null +++ b/client/src/components/time-tickets-summary/time-tickets-summary.component.jsx @@ -0,0 +1,20 @@ +import React from "react"; +import TimeTicketsSummaryEmployees from "../time-tickets-summary-employees/time-tickets-summary-employees.component"; + +export default function TimeTicketsSummary({ + loading, + timetickets, + startDate, + endDate, +}) { + return ( +
    + +
    + ); +} diff --git a/client/src/components/user-request-pw-reset/user-request-pw-reset.styles.scss b/client/src/components/user-request-pw-reset/user-request-pw-reset.styles.scss new file mode 100644 index 000000000..2425df8c1 --- /dev/null +++ b/client/src/components/user-request-pw-reset/user-request-pw-reset.styles.scss @@ -0,0 +1,29 @@ +.login-container { + display: flex; + align-items: center; + flex-direction: column; + padding: 2rem; + form { + width: 75vw; + max-width: 20rem; + } + } + + .login-logo-container { + display: flex; + align-items: center; + margin-bottom: 2rem; + h1 { + text-align: center; + margin: 1rem; + } + } + + //Required as it is position inside form. + .login-btn { + margin: 1.5rem 0rem; + position: relative; + left: 50%; + transform: translate(-50%, 0); + } + \ No newline at end of file diff --git a/client/src/components/user-request-pw-reset/user-request-reset-pw.component.jsx b/client/src/components/user-request-pw-reset/user-request-reset-pw.component.jsx new file mode 100644 index 000000000..3ad5b368e --- /dev/null +++ b/client/src/components/user-request-pw-reset/user-request-reset-pw.component.jsx @@ -0,0 +1,78 @@ +import { Button, Form, Input, Result, Typography } from "antd"; +import React from "react"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import ImEXOnlineLogo from "../../assets/logo240.png"; +import { sendPasswordReset } from "../../redux/user/user.actions"; +import { selectPasswordReset } from "../../redux/user/user.selectors"; +import AlertComponent from "../alert/alert.component"; +import "./user-request-pw-reset.styles.scss"; + +const mapStateToProps = createStructuredSelector({ + passwordReset: selectPasswordReset, +}); +const mapDispatchToProps = (dispatch) => ({ + sendPasswordReset: (email) => dispatch(sendPasswordReset(email)), +}); + +export function UserRequestResetPw({ passwordReset, sendPasswordReset }) { + const handleFinish = (values) => { + try { + sendPasswordReset(values.email); + } catch (error) { + console.log(error); + } + }; + + const { t } = useTranslation(); + if (passwordReset.success) + return ( + sendPasswordReset(passwordReset.email)} + > + {t("general.labels.sendagain")} + , + ]} + /> + ); + + return ( +
    +
    + ImEX Online + {t("titles.app")} +
    + {t("titles.resetpassword")} + +
    + + + + {passwordReset.error ? ( + + ) : null} + + +
    + ); +} +export default connect(mapStateToProps, mapDispatchToProps)(UserRequestResetPw); diff --git a/client/src/components/user-validate-pw-reset/user-validate-pw-reset.component.jsx b/client/src/components/user-validate-pw-reset/user-validate-pw-reset.component.jsx new file mode 100644 index 000000000..b67dd83a7 --- /dev/null +++ b/client/src/components/user-validate-pw-reset/user-validate-pw-reset.component.jsx @@ -0,0 +1,113 @@ +import { LockOutlined } from "@ant-design/icons"; +import { Button, Form, Input, Result, Typography } from "antd"; +import React from "react"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { Link } from "react-router-dom"; +import { createStructuredSelector } from "reselect"; +import ImEXOnlineLogo from "../../assets/logo240.png"; +import { validatePasswordResetStart } from "../../redux/user/user.actions"; +import { selectPasswordReset } from "../../redux/user/user.selectors"; +import AlertComponent from "../alert/alert.component"; +import "./user-validate-pw-reset.styles.scss"; + +const mapStateToProps = createStructuredSelector({ + passwordReset: selectPasswordReset, +}); +const mapDispatchToProps = (dispatch) => ({ + validatePasswordReset: (emailAndPin) => + dispatch(validatePasswordResetStart(emailAndPin)), +}); + +export function UserValidatePwReset({ + passwordReset, + validatePasswordReset, + oobCode, +}) { + const { t } = useTranslation(); + + const handleFinish = (values) => { + validatePasswordReset({ code: oobCode, password: values.password }); + }; + + if (passwordReset.success) + return ( + + + , + ]} + /> + ); + + return ( +
    +
    + ImEX Online + {t("titles.app")} +
    + + {t("titles.resetpasswordvalidate")} + + +
    + + } + type="password" + placeholder={t("general.labels.password")} + /> + + ({ + validator(rule, value) { + if (!value || getFieldValue("password") === value) { + return Promise.resolve(); + } + return Promise.reject(t("general.labels.passwordsdonotmatch")); + }, + }), + ]} + > + } + type="password" + placeholder={t("general.labels.password")} + /> + + {passwordReset.error ? ( + + ) : null} + + +
    + ); +} + +export default connect( + mapStateToProps, + mapDispatchToProps +)(UserValidatePwReset); diff --git a/client/src/components/user-validate-pw-reset/user-validate-pw-reset.styles.scss b/client/src/components/user-validate-pw-reset/user-validate-pw-reset.styles.scss new file mode 100644 index 000000000..60dd3a986 --- /dev/null +++ b/client/src/components/user-validate-pw-reset/user-validate-pw-reset.styles.scss @@ -0,0 +1,29 @@ +.reset-container { + display: flex; + align-items: center; + flex-direction: column; + padding: 2rem; + form { + width: 75vw; + max-width: 20rem; + } + } + + .reset-logo-container { + display: flex; + align-items: center; + margin-bottom: 2rem; + h1 { + text-align: center; + margin: 1rem; + } + } + + //Required as it is position inside form. + .reset-btn { + margin: 1.5rem 0rem; + position: relative; + left: 50%; + transform: translate(-50%, 0); + } + \ No newline at end of file diff --git a/client/src/components/vehicle-detail-form/vehicle-detail-form.component.jsx b/client/src/components/vehicle-detail-form/vehicle-detail-form.component.jsx index e6c8bf1a4..55a06d689 100644 --- a/client/src/components/vehicle-detail-form/vehicle-detail-form.component.jsx +++ b/client/src/components/vehicle-detail-form/vehicle-detail-form.component.jsx @@ -1,94 +1,170 @@ -import { Button, Col, DatePicker, Form, Input, Row } from "antd"; +import { Button, Form, Input, InputNumber } from "antd"; import React from "react"; import { useTranslation } from "react-i18next"; -export default function VehicleDetailFormComponent() { +import FormDatePicker from "../form-date-picker/form-date-picker.component"; +import FormFieldsChanged from "../form-fields-changed-alert/form-fields-changed-alert.component"; +import LayoutFormRow from "../layout-form-row/layout-form-row.component"; + +export default function VehicleDetailFormComponent({ form }) { const { t } = useTranslation(); return (
    - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { - //TODO Add handling for paint code json - } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { + //TODO Add handling for paint code json + } + + + + + + + + + + + + + + + + + + + + + + + + + ); } diff --git a/client/src/components/vehicle-detail-form/vehicle-detail-form.container.jsx b/client/src/components/vehicle-detail-form/vehicle-detail-form.container.jsx index 47ce6ffa2..7fbfb2eb5 100644 --- a/client/src/components/vehicle-detail-form/vehicle-detail-form.container.jsx +++ b/client/src/components/vehicle-detail-form/vehicle-detail-form.container.jsx @@ -11,16 +11,26 @@ function VehicleDetailFormContainer({ vehicle, refetch }) { const [updateVehicle] = useMutation(UPDATE_VEHICLE); const [form] = Form.useForm(); - const handleFinish = values => { - updateVehicle({ - variables: { vehId: vehicle.id, vehicle: values } - }).then(r => { - notification["success"]({ - message: t("vehicles.successes.save") - }); - //TODO Better way to reset the field decorators? - if (refetch) refetch(); + const handleFinish = async (values) => { + const result = await updateVehicle({ + variables: { vehId: vehicle.id, vehicle: values }, }); + + if (!!result.errors) { + notification["error"]({ + message: t("vehicles.errors.saving", { + message: JSON.stringify(result.errors), + }), + }); + } + + notification["success"]({ + message: t("vehicles.successes.save"), + }); + //TODO Better way to reset the field decorators? + if (refetch) await refetch(); + form.resetFields(); + form.resetFields(); }; return ( @@ -28,12 +38,13 @@ function VehicleDetailFormContainer({ vehicle, refetch }) { onFinish={handleFinish} form={form} autoComplete="off" + layout="vertical" initialValues={{ ...vehicle, - v_prod_dt: vehicle.v_prod_dt ? moment(vehicle.v_prod_dt) : null + v_prod_dt: vehicle.v_prod_dt ? moment(vehicle.v_prod_dt) : null, }} > - + ); } diff --git a/client/src/components/vehicle-detail-jobs/vehicle-detail-jobs.component.jsx b/client/src/components/vehicle-detail-jobs/vehicle-detail-jobs.component.jsx index 652d2cafd..d019df9af 100644 --- a/client/src/components/vehicle-detail-jobs/vehicle-detail-jobs.component.jsx +++ b/client/src/components/vehicle-detail-jobs/vehicle-detail-jobs.component.jsx @@ -1,15 +1,15 @@ -import React, { useState } from "react"; import { Table } from "antd"; +import React, { useState } from "react"; import { useTranslation } from "react-i18next"; -import { Link } from "react-router-dom"; -import CurrencyFormatter from "../../utils/CurrencyFormatter"; import { connect } from "react-redux"; +import { Link } from "react-router-dom"; import { createStructuredSelector } from "reselect"; import { selectBodyshop } from "../../redux/user/user.selectors"; +import CurrencyFormatter from "../../utils/CurrencyFormatter"; import VehicleDetailUpdateJobsComponent from "../vehicle-detail-update-jobs/vehicle-detail-update-jobs.component"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop + bodyshop: selectBodyshop, }); export function VehicleDetailJobsComponent({ vehicle, bodyshop }) { @@ -26,7 +26,7 @@ export function VehicleDetailJobsComponent({ vehicle, bodyshop }) { {record.ro_number ? record.ro_number : `EST ${record.est_number}`} - ) + ), }, { title: t("jobs.fields.owner"), @@ -36,17 +36,17 @@ export function VehicleDetailJobsComponent({ vehicle, bodyshop }) { {`${record.ownr_fn} ${record.ownr_ln}`} - ) + ), }, { title: t("jobs.fields.clm_no"), dataIndex: "clm_no", - key: "clm_no" + key: "clm_no", }, { title: t("jobs.fields.status"), dataIndex: "status", - key: "status" + key: "status", }, { @@ -55,8 +55,8 @@ export function VehicleDetailJobsComponent({ vehicle, bodyshop }) { key: "clm_total", render: (text, record) => ( {record.clm_total} - ) - } + ), + }, ]; return ( @@ -71,20 +71,31 @@ export function VehicleDetailJobsComponent({ vehicle, bodyshop }) { )} pagination={{ position: "bottom" }} - columns={columns.map(item => ({ ...item }))} - rowKey="id" + columns={columns} + rowKey='id' + scroll={{ x: true }} dataSource={vehicle.jobs} rowSelection={{ onSelect: (record, selected, selectedRows) => { - setSelectedJobs(selectedRows ? selectedRows.map(i => i.id) : []); + setSelectedJobs(selectedRows ? selectedRows.map((i) => i.id) : []); + }, + onSelectAll: (selected, selectedRows, changeRows) => { + setSelectedJobs( + selectedRows + ? selectedRows + .filter((i) => + bodyshop.md_ro_statuses.open_statuses.includes(i.status) + ) + .map((i) => i.id) + : [] + ); }, - selectedRowKeys: selectedJobs, - getCheckboxProps: record => ({ + getCheckboxProps: (record) => ({ disabled: bodyshop.md_ro_statuses.open_statuses ? !bodyshop.md_ro_statuses.open_statuses.includes(record.status) - : true - }) + : true, + }), }} /> ); diff --git a/client/src/components/vehicle-detail-update-jobs/vehicle-detail-update-jobs.component.jsx b/client/src/components/vehicle-detail-update-jobs/vehicle-detail-update-jobs.component.jsx index 44404ae28..33e76a913 100644 --- a/client/src/components/vehicle-detail-update-jobs/vehicle-detail-update-jobs.component.jsx +++ b/client/src/components/vehicle-detail-update-jobs/vehicle-detail-update-jobs.component.jsx @@ -3,15 +3,18 @@ import { Button, notification } from "antd"; import { useTranslation } from "react-i18next"; import { useMutation } from "@apollo/react-hooks"; import { UPDATE_JOBS } from "../../graphql/jobs.queries"; +import { logImEXEvent } from "../../firebase/firebase.utils"; export default function VehicleDetailUpdateJobsComponent({ vehicle, selectedJobs, - disabled + disabled, }) { const { t } = useTranslation(); const [updateJobs] = useMutation(UPDATE_JOBS); - const handlecClick = e => { + const handlecClick = (e) => { + logImEXEvent("vehicle_update_jobs"); + updateJobs({ variables: { jobIds: selectedJobs, @@ -22,16 +25,16 @@ export default function VehicleDetailUpdateJobsComponent({ v_model_yr: vehicle["v_model_yr"], v_model_desc: vehicle["v_model_desc"], v_make_desc: vehicle["v_make_desc"], - v_color: vehicle["v_color"] - } - } + v_color: vehicle["v_color"], + }, + }, }) - .then(response => { + .then((response) => { notification["success"]({ message: t("jobs.successes.updated") }); }) - .catch(error => { + .catch((error) => { notification["error"]({ - message: t("jobs.errors.updating", { error: JSON.stringify(error) }) + message: t("jobs.errors.updating", { error: JSON.stringify(error) }), }); }); }; diff --git a/client/src/components/vehicle-tag-popover/vehicle-tag-popover.component.jsx b/client/src/components/vehicle-tag-popover/vehicle-tag-popover.component.jsx index a16482022..7fe210bfd 100644 --- a/client/src/components/vehicle-tag-popover/vehicle-tag-popover.component.jsx +++ b/client/src/components/vehicle-tag-popover/vehicle-tag-popover.component.jsx @@ -11,22 +11,21 @@ export default function VehicleTagPopoverComponent({ job }) { - + size='small' + column={1}> + {`${job.v_model_yr || t("general.labels.na")} ${job.v_make_desc || t("general.labels.na")} ${job.v_model_desc || t("general.labels.na")}`} - + {`${job.plate_no || t("general.labels.na")}`} - + {`${job.plate_st || t("general.labels.na")}`} - + {`${job.v_vin || t("general.labels.na")}`} @@ -34,22 +33,21 @@ export default function VehicleTagPopoverComponent({ job }) { - + size='small' + column={1}> + {`${job.vehicle.v_model_yr || t("general.labels.na")} ${job.vehicle.v_make_desc || t("general.labels.na")} ${job.vehicle.v_model_desc || t("general.labels.na")}`} - + {`${job.vehicle.plate_no || t("general.labels.na")}`} - + {`${job.vehicle.plate_st || t("general.labels.na")}`} - + {`${job.vehicle.v_vin || t("general.labels.na")}`} @@ -62,23 +60,21 @@ export default function VehicleTagPopoverComponent({ job }) { ); return ( - - + + {job.vehicleid ? ( - {`${job.v_model_yr || t("general.labels.na")} - ${job.v_make_desc || t("general.labels.na")} - ${job.v_model_desc || t("general.labels.na")} | - ${job.plate_no || t("general.labels.na")} | - ${job.v_vin || t("general.labels.na")}`} + {`${job.v_model_yr || ""} + ${job.v_make_desc || ""} + ${job.v_model_desc || ""} | + ${job.plate_no || ""}`} ) : ( - {`${job.v_model_yr || t("general.labels.na")} - ${job.v_make_desc || t("general.labels.na")} - ${job.v_model_desc || t("general.labels.na")} | - ${job.plate_no || t("general.labels.na")} | - ${job.v_vin || t("general.labels.na")}`} + {`${job.v_model_yr || ""} + ${job.v_make_desc || ""} + ${job.v_model_desc || ""} | + ${job.plate_no || ""}`} )} diff --git a/client/src/components/vehicles-list/vehicles-list.component.jsx b/client/src/components/vehicles-list/vehicles-list.component.jsx index 49362c74d..0b4ee3162 100644 --- a/client/src/components/vehicles-list/vehicles-list.component.jsx +++ b/client/src/components/vehicles-list/vehicles-list.component.jsx @@ -1,13 +1,25 @@ -import { Input, Table } from "antd"; +import { SyncOutlined } from "@ant-design/icons"; +import { Button, Input, Table } from "antd"; +import queryString from "query-string"; import React, { useState } from "react"; import { useTranslation } from "react-i18next"; -import { Link } from "react-router-dom"; -import { alphaSort } from "../../utils/sorters"; +import { Link, useHistory, useLocation } from "react-router-dom"; +export default function VehiclesListComponent({ + loading, + vehicles, + total, + refetch, +}) { + const search = queryString.parse(useLocation().search); + const { + page, + //sortcolumn, sortorder + } = search; + const history = useHistory(); -export default function VehiclesListComponent({ loading, vehicles, refetch }) { const [state, setState] = useState({ sortedInfo: {}, - filteredInfo: { text: "" } + filteredInfo: { text: "" }, }); const { t } = useTranslation(); @@ -17,15 +29,9 @@ export default function VehiclesListComponent({ loading, vehicles, refetch }) { title: t("vehicles.fields.v_vin"), dataIndex: "v_vin", key: "v_vin", - // onFilter: (value, record) => record.ro_number.includes(value), - // filteredValue: state.filteredInfo.text || null, - sorter: (a, b) => alphaSort(a.v_vin, b.v_vin), - sortOrder: - state.sortedInfo.columnKey === "v_vin" && state.sortedInfo.order, - render: (text, record) => ( {record.v_vin} - ) + ), }, { title: t("vehicles.fields.description"), @@ -35,7 +41,7 @@ export default function VehiclesListComponent({ loading, vehicles, refetch }) { return ( {`${record.v_model_yr} ${record.v_make_desc} ${record.v_model_desc} ${record.v_color}`} ); - } + }, }, { title: t("vehicles.fields.plate_no"), @@ -43,32 +49,49 @@ export default function VehiclesListComponent({ loading, vehicles, refetch }) { key: "plate", render: (text, record) => { return {`${record.plate_st} | ${record.plate_no}`}; - } - } + }, + }, ]; const handleTableChange = (pagination, filters, sorter) => { setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); + search.page = pagination.current; + search.sortcolumn = sorter.columnKey; + search.sortorder = sorter.order; + history.push({ search: queryString.stringify(search) }); }; - //TODO Implement searching & pagination + return (
    { return ( - { - console.log(value); - }} - enterButton - /> +
    + + { + search.search = value; + history.push({ search: queryString.stringify(search) }); + }} + enterButton + /> +
    ); }} size="small" - pagination={{ position: "top" }} - columns={columns.map(item => ({ ...item }))} + pagination={{ + position: "top", + pageSize: 25, + current: parseInt(page || 1), + total: total, + }} + columns={columns} rowKey="id" + scroll={{ x: true }} dataSource={vehicles} onChange={handleTableChange} /> diff --git a/client/src/components/vehicles-list/vehicles-list.container.jsx b/client/src/components/vehicles-list/vehicles-list.container.jsx index 3226b1cb3..c6a0896e5 100644 --- a/client/src/components/vehicles-list/vehicles-list.container.jsx +++ b/client/src/components/vehicles-list/vehicles-list.container.jsx @@ -2,18 +2,40 @@ import React from "react"; import VehiclesListComponent from "./vehicles-list.component"; import { useQuery } from "@apollo/react-hooks"; import AlertComponent from "../alert/alert.component"; -import { QUERY_ALL_VEHICLES } from "../../graphql/vehicles.queries"; +import { QUERY_ALL_VEHICLES_PAGINATED } from "../../graphql/vehicles.queries"; +import queryString from "query-string"; +import { useLocation } from "react-router-dom"; export default function VehiclesListContainer() { - const { loading, error, data, refetch } = useQuery(QUERY_ALL_VEHICLES, { - fetchPolicy: "network-only" - }); + const searchParams = queryString.parse(useLocation().search); + const { page, sortcolumn, sortorder, search } = searchParams; + + const { loading, error, data, refetch } = useQuery( + QUERY_ALL_VEHICLES_PAGINATED, + { + variables: { + search: search || "", + offset: page ? (page - 1) * 25 : 0, + limit: 25, + order: [ + { + [sortcolumn || "created_at"]: sortorder + ? sortorder === "descend" + ? "desc" + : "asc" + : "desc", + }, + ], + }, + } + ); if (error) return ; return ( ); diff --git a/client/src/components/vendor-search-select/vendor-search-select.component.jsx b/client/src/components/vendor-search-select/vendor-search-select.component.jsx index ce2bda4ef..b254963aa 100644 --- a/client/src/components/vendor-search-select/vendor-search-select.component.jsx +++ b/client/src/components/vendor-search-select/vendor-search-select.component.jsx @@ -1,32 +1,37 @@ import { Select, Tag } from "antd"; -import React, { useEffect, useState } from "react"; +import React, { useEffect, useState, forwardRef } from "react"; const { Option } = Select; //To be used as a form element only. -const VendorSearchSelect = ({ value, onChange, options, onSelect }) => { +const VendorSearchSelect = ( + { value, onChange, options, onSelect, disabled }, + ref +) => { const [option, setOption] = useState(value); useEffect(() => { - if (onChange) { + if (value !== option && onChange) { onChange(option); } - }, [option, onChange]); + }, [value, option, onChange]); return ( ); }; -export default VendorSearchSelect; +export default forwardRef(VendorSearchSelect); diff --git a/client/src/components/vendors-form/vendors-form.component.jsx b/client/src/components/vendors-form/vendors-form.component.jsx index 0823b661a..b3c96cf56 100644 --- a/client/src/components/vendors-form/vendors-form.component.jsx +++ b/client/src/components/vendors-form/vendors-form.component.jsx @@ -151,7 +151,7 @@ export default function VendorsFormComponent({ > diff --git a/client/src/components/vendors-form/vendors-form.container.jsx b/client/src/components/vendors-form/vendors-form.container.jsx index bf3c198b4..8a11875ec 100644 --- a/client/src/components/vendors-form/vendors-form.container.jsx +++ b/client/src/components/vendors-form/vendors-form.container.jsx @@ -1,106 +1,106 @@ -import { Form, notification } from "antd"; -import React, { useEffect } from "react"; import { useMutation, useQuery } from "@apollo/react-hooks"; +import { Form, notification } from "antd"; +import queryString from "query-string"; +import React, { useEffect } from "react"; import { useTranslation } from "react-i18next"; import { connect } from "react-redux"; +import { useLocation } from "react-router-dom"; import { createStructuredSelector } from "reselect"; -import { - DELETE_VENDOR, - INSERT_NEW_VENDOR, - QUERY_VENDOR_BY_ID, - UPDATE_VENDOR -} from "../../graphql/vendors.queries"; +import { DELETE_VENDOR, INSERT_NEW_VENDOR, QUERY_VENDOR_BY_ID, UPDATE_VENDOR } from "../../graphql/vendors.queries"; import { selectBodyshop } from "../../redux/user/user.selectors"; import AlertComponent from "../alert/alert.component"; import LoadingSpinner from "../loading-spinner/loading-spinner.component"; import VendorsFormComponent from "./vendors-form.component"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop + bodyshop: selectBodyshop, }); -function VendorsFormContainer({ selectedVendor, refetch, bodyshop }) { +function VendorsFormContainer({ refetch, bodyshop }) { + const search = queryString.parse(useLocation().search); + const { selectedvendor } = search; + const [form] = Form.useForm(); const { t } = useTranslation(); const { loading, error, data } = useQuery(QUERY_VENDOR_BY_ID, { - variables: { id: (selectedVendor && selectedVendor.id) || null }, + variables: { id: selectedvendor }, fetchPolicy: "network-only", - skip: !selectedVendor + skip: !!!selectedvendor || selectedvendor === "new", }); + const [updateVendor] = useMutation(UPDATE_VENDOR); const [insertvendor] = useMutation(INSERT_NEW_VENDOR); const [deleteVendor] = useMutation(DELETE_VENDOR); const handleDelete = () => { - deleteVendor({ variables: { id: selectedVendor.id } }) - .then(r => { + deleteVendor({ variables: { id: selectedvendor } }) + .then((r) => { notification["success"]({ - message: t("vendors.successes.deleted") + message: t("vendors.successes.deleted"), }); //TODO Better way to reset the field decorators? - if (refetch) refetch().then(r => form.resetFields()); + if (refetch) refetch().then((r) => form.resetFields()); }) - .catch(error => { + .catch((error) => { notification["error"]({ - message: t("vendors.errors.deleting") + message: t("vendors.errors.deleting"), }); }); }; - const handleFinish = values => { - if (selectedVendor.id) { + const handleFinish = (values) => { + if (selectedvendor && selectedvendor !== "new") { //It's a vendor to update. updateVendor({ - variables: { id: selectedVendor.id, vendor: values } + variables: { id: selectedvendor, vendor: values }, }) - .then(r => { + .then((r) => { notification["success"]({ - message: t("vendors.successes.saved") + message: t("vendors.successes.saved"), }); //TODO Better way to reset the field decorators? - if (refetch) refetch().then(r => form.resetFields()); + if (refetch) refetch().form.resetFields(); }) - .catch(error => { + .catch((error) => { notification["error"]({ - message: t("vendors.errors.saving") + message: t("vendors.errors.saving"), }); console.log("error", error); }); } else { //It's a new vendor to insert. insertvendor({ - variables: { vendorInput: [{ ...values, bodyshopid: bodyshop.id }] } + variables: { vendorInput: [{ ...values, bodyshopid: bodyshop.id }] }, }) - .then(r => { + .then((r) => { notification["success"]({ - message: t("vendors.successes.saved") + message: t("vendors.successes.saved"), }); //TODO Better way to reset the field decorators? - if (refetch) refetch().then(r => form.resetFields()); + if (refetch) refetch(); + form.resetFields(); }) - .catch(error => { + .catch((error) => { notification["error"]({ - message: t("vendors.errors.saving") + message: t("vendors.errors.saving"), }); }); } }; useEffect(() => { - if (data) form.resetFields(); - }, [data, form]); + if (data || selectedvendor === "new") form.resetFields(); + }, [data, form, selectedvendor]); if (loading) return ; - if (error) return ; + if (error) return ; return (
    - {selectedVendor ? ( + autoComplete='new-password' + initialValues={data ? data.vendors_by_pk : null}> + {selectedvendor ? ( alphaSort(a.name, b.name), - sortOrder: state.sortedInfo.columnKey === "name" && state.sortedInfo.order + sortOrder: + state.sortedInfo.columnKey === "name" && state.sortedInfo.order, }, { title: t("vendors.fields.cost_center"), @@ -31,7 +36,7 @@ export default function VendorsListComponent({ key: "cost_center", sorter: (a, b) => alphaSort(a.cost_center, b.cost_center), sortOrder: - state.sortedInfo.columnKey === "cost_center" && state.sortedInfo.order + state.sortedInfo.columnKey === "cost_center" && state.sortedInfo.order, }, { title: t("vendors.fields.street1"), @@ -40,13 +45,13 @@ export default function VendorsListComponent({ width: "10%", sorter: (a, b) => alphaSort(a.street1, b.street1), sortOrder: - state.sortedInfo.columnKey === "street1" && state.sortedInfo.order + state.sortedInfo.columnKey === "street1" && state.sortedInfo.order, }, { title: t("vendors.fields.city"), dataIndex: "city", - key: "city" - } + key: "city", + }, ]; const handleTableChange = (pagination, filters, sorter) => { @@ -66,24 +71,22 @@ export default function VendorsListComponent({ ); }} - size="small" + size='small' pagination={{ position: "top" }} - columns={columns.map(item => ({ ...item }))} - rowKey="id" + columns={columns.map((item) => ({ ...item }))} + rowKey='id' onChange={handleTableChange} dataSource={vendors} rowSelection={{ - onSelect: record => { - setSelectedVendor(record); - }, + onSelect: handleOnRowClick, type: "radio", - selectedRowKeys: selectedVendor ? [selectedVendor.id] : null + selectedRowKeys: [selectedvendor], }} onRow={(record, rowIndex) => { return { - onClick: event => { + onClick: (event) => { handleOnRowClick(record); - } + }, }; }} /> diff --git a/client/src/components/vendors-list/vendors-list.container.jsx b/client/src/components/vendors-list/vendors-list.container.jsx index b15f5f196..a62017e7c 100644 --- a/client/src/components/vendors-list/vendors-list.container.jsx +++ b/client/src/components/vendors-list/vendors-list.container.jsx @@ -3,27 +3,32 @@ import { useQuery } from "@apollo/react-hooks"; import AlertComponent from "../../components/alert/alert.component"; import { QUERY_ALL_VENDORS } from "../../graphql/vendors.queries"; import VendorsListComponent from "./vendors-list.component"; +import queryString from "query-string"; +import { useHistory, useLocation } from "react-router-dom"; + +export default function VendorsListContainer() { + const { loading, error, data } = useQuery(QUERY_ALL_VENDORS); + const search = queryString.parse(useLocation().search); + const history = useHistory(); -export default function VendorsListContainer({ selectedVendorState }) { - const [selectedVendor, setSelectedVendor] = selectedVendorState; - const { loading, error, data } = useQuery(QUERY_ALL_VENDORS, { - fetchPolicy: "network-only" - }); const handleNewVendor = () => { - setSelectedVendor({}); + search.selectedvendor = "new"; + history.push({ search: queryString.stringify(search) }); }; - const handleOnRowClick = record => { + const handleOnRowClick = (record) => { if (record) { - setSelectedVendor(record); - } else setSelectedVendor(null); + search.selectedvendor = record.id; + history.push({ search: queryString.stringify(search) }); + } else { + delete search.selectedvendor; + history.push({ search: queryString.stringify(search) }); + } }; - if (error) return ; + if (error) return ; return ( -
    - - - -
    - - -
    - {`${bodyshop.shopname}`} -
    -
    {`${bodyshop.address1} ${bodyshop.address2} ${bodyshop.city} ${bodyshop.state} ${bodyshop.zip_post}`}
    -
    - {bodyshop.email} - {` | ${bodyshop.ph1}`} -
    -
    - ); -} diff --git a/client/src/emails/constants.js b/client/src/emails/constants.js deleted file mode 100644 index 75973f1e3..000000000 --- a/client/src/emails/constants.js +++ /dev/null @@ -1,4 +0,0 @@ -export const EmailSettings = { - fromNameDefault: "Bodyshop.app", - fromAddress: "noreply@bodyshop.app" -}; diff --git a/client/src/emails/templates/appointment-confirmation/appointment-confirmation.query.js b/client/src/emails/templates/appointment-confirmation/appointment-confirmation.query.js deleted file mode 100644 index 7137e3672..000000000 --- a/client/src/emails/templates/appointment-confirmation/appointment-confirmation.query.js +++ /dev/null @@ -1,18 +0,0 @@ -import { gql } from "apollo-boost"; -import { shopAttributes } from "../../components/fragments.queries"; - -export const EMAIL_APPOINTMENT_CONFIRMATION = gql` - query EMAIL_APPOINTMENT_CONFIRMATION($id: uuid!) { - appointments_by_pk(id: $id) { - start - title - job { - ownr_fn - ownr_ln - ownr_ea - } - } - ...shopData - } - ${shopAttributes} -`; diff --git a/client/src/emails/templates/appointment-confirmation/appointment-confirmation.template.jsx b/client/src/emails/templates/appointment-confirmation/appointment-confirmation.template.jsx deleted file mode 100644 index a329a56b3..000000000 --- a/client/src/emails/templates/appointment-confirmation/appointment-confirmation.template.jsx +++ /dev/null @@ -1,42 +0,0 @@ -import React from "react"; -import styled from "styled-components"; -import Header from "../../components/header/header.component"; -import { DateTimeFormatter } from "../../../utils/DateFormatter"; - -const D = styled.div` - table { - font-family: arial, sans-serif; - border-collapse: collapse; - width: 100%; - } - - td, - th { - border: 1px solid #dddddd; - text-align: left; - padding: 8px; - } - - tr:nth-child(even) { - background-color: #dddddd; - } -`; - -export const Subject = "Appointment Reminder"; - -export default function AppointmentConfirmationEmail({ data }) { - const appointment = data.appointments_by_pk; - console.log("appointment", appointment); - return ( - -
    - Appointment Reminder -

    Dear {`${appointment.job.ownr_fn} ${appointment.job.ownr_ln}`},

    -

    - You have an appointment at {data.bodyshops[0].shopname} on - {appointment.start}. -

    -

    Thank you from the team at {data.bodyshops[0].shopname}

    - - ); -} diff --git a/client/src/emails/templates/parts-order/parts-order.email.jsx b/client/src/emails/templates/parts-order/parts-order.email.jsx deleted file mode 100644 index 88f0b7d14..000000000 --- a/client/src/emails/templates/parts-order/parts-order.email.jsx +++ /dev/null @@ -1,53 +0,0 @@ -import React from "react"; -import styled from "styled-components"; -import Header from "../../components/header/header.component"; - -const D = styled.div` - table { - font-family: arial, sans-serif; - border-collapse: collapse; - width: 100%; - } - - td, - th { - border: 1px solid #dddddd; - text-align: left; - padding: 8px; - } - - tr:nth-child(even) { - background-color: #dddddd; - } -`; - -export default function PartsOrderEmail({ data }) { - const order = data.parts_orders_by_pk; - return ( - -
    - - - - - -
    {`Deliver By: ${order.deliver_by}`}{`Ordered By: ${order.user_email}`}
    - - - - - - - - {order.parts_order_lines.map(item => ( - - - - - - - ))} -
    Line DescriptionPart #PriceLine Remarks
    {item.line_desc}{item.oem_partno}{item.act_price}{item.line_remarks}
    - - ); -} diff --git a/client/src/emails/templates/parts-order/parts-order.query.js b/client/src/emails/templates/parts-order/parts-order.query.js deleted file mode 100644 index 97ec5eaff..000000000 --- a/client/src/emails/templates/parts-order/parts-order.query.js +++ /dev/null @@ -1,36 +0,0 @@ -import { gql } from "apollo-boost"; -import { shopAttributes } from "../../components/fragments.queries"; - -export const REPORT_QUERY_PARTS_ORDER_BY_PK = gql` - query REPORT_QUERY_PARTS_ORDER_BY_PK($id: uuid!) { - parts_orders_by_pk(id: $id) { - job { - id - vehicle { - id - v_model_desc - v_make_desc - v_model_yr - v_vin - } - ro_number - est_number - } - id - deliver_by - parts_order_lines { - id - db_price - act_price - line_desc - line_remarks - oem_partno - status - } - status - user_email - } - ...shopData - } - ${shopAttributes} -`; diff --git a/client/src/firebase/firebase.utils.js b/client/src/firebase/firebase.utils.js index 4b1cea785..6d7f4a3a4 100644 --- a/client/src/firebase/firebase.utils.js +++ b/client/src/firebase/firebase.utils.js @@ -3,6 +3,8 @@ import "firebase/firestore"; import "firebase/auth"; import "firebase/database"; import "firebase/analytics"; +import "firebase/messaging"; +import { store } from "../redux/store"; const config = JSON.parse(process.env.REACT_APP_FIREBASE_CONFIG); firebase.initializeApp(config); @@ -32,3 +34,83 @@ export const updateCurrentUser = (userDetails) => { }, reject); }); }; + +let messaging; +try { + messaging = firebase.messaging(); + // Project Settings => Cloud Messaging => Web Push certificates + messaging.usePublicVapidKey(process.env.REACT_APP_FIREBASE_PUBLIC_VAPID_KEY); + console.log("[FCM UTIL] FCM initialized successfully."); +} catch { + console.log("[FCM UTIL] Firebase Messaging is likely unsupported."); +} + +export { messaging }; + +export const logImEXEvent = (eventName, additionalParams, stateProp = null) => { + const state = stateProp || store.getState(); + const eventParams = { + shop: + (state.user && state.user.bodyshop && state.user.bodyshop.shopname) || + null, + user: + (state.user && state.user.currentUser && state.user.currentUser.email) || + null, + ...additionalParams, + }; + analytics.logEvent(eventName, eventParams); +}; + +if (messaging) { + messaging.onMessage(async (payload) => { + console.log("[FCM] UTILS Message received. ", payload); + navigator.serviceWorker.getRegistration().then((registration) => { + return registration.showNotification( + "[UTIL]" + payload.notification.title, + payload.notification + ); + }); + + // if (!payload.clientId) return; + + // // Get the client. + // const client = await clients.get(payload.clientId); + // // Exit early if we don't get the client. + // // Eg, if it closed. + // if (!client) return; + + // // Send a message to the client. + // console.log("Posting to client."); + // client.postMessage({ + // msg: "Hey I just got a fetch from you!", + // url: payload.request.url, + // }); + + // [START_EXCLUDE] + // Update the UI to include the received message. + //appendMessage(payload); + + // [END_EXCLUDE] + }); + + messaging.onTokenRefresh(() => { + messaging + .getToken() + .then((refreshedToken) => { + console.log("[FCM] Token refreshed."); + // Indicate that the new Instance ID token has not yet been sent to the + // app server. + // setTokenSentToServer(false); + // // Send Instance ID token to app server. + // sendTokenToServer(refreshedToken); + // // [START_EXCLUDE] + // // Display new Instance ID token and clear UI of all previous messages. + // resetUI(); + // [END_EXCLUDE] + }) + .catch((err) => { + console.log("[FCM] Unable to retrieve refreshed token ", err); + // showToken("Unable to retrieve refreshed token ", err); + }); + }); +} diff --git a/client/src/graphql/accounting.queries.js b/client/src/graphql/accounting.queries.js new file mode 100644 index 000000000..8e2c6c8ed --- /dev/null +++ b/client/src/graphql/accounting.queries.js @@ -0,0 +1,76 @@ +import gql from "graphql-tag"; + +export const QUERY_JOBS_FOR_EXPORT = gql` + query QUERY_JOBS_FOR_EXPORT($invoicedStatus: String!) { + jobs( + where: { + date_exported: { _is_null: true } + status: { _eq: $invoicedStatus } + } + ) { + id + ro_number + ownr_fn + ownr_ln + ownr_co_nm + date_invoiced + date_exported + status + v_model_desc + v_make_desc + v_model_yr + v_color + est_number + clm_total + clm_no + ins_co_nm + } + } +`; + +export const QUERY_INVOICES_FOR_EXPORT = gql` + query QUERY_INVOICES_FOR_EXPORT { + invoices(where: { exported: { _eq: false } }) { + id + exported + date + invoice_number + is_credit_memo + total + job { + id + ro_number + } + vendor { + name + id + } + } + } +`; + +export const QUERY_PAYMENTS_FOR_EXPORT = gql` + query QUERY_PAYMENTS_FOR_EXPORT { + payments( + where: { exportedat: { _is_null: true } } + order_by: { created_at: desc } + ) { + id + amount + job { + ro_number + est_number + id + ownr_fn + ownr_ln + ownr_co_nm + } + payer + memo + exportedat + stripeid + created_at + transactionid + } + } +`; diff --git a/client/src/graphql/allocations.queries.js b/client/src/graphql/allocations.queries.js index 5c4d8e169..4f4c790b6 100644 --- a/client/src/graphql/allocations.queries.js +++ b/client/src/graphql/allocations.queries.js @@ -1,4 +1,4 @@ -import { gql } from "apollo-boost"; +import gql from "graphql-tag"; export const INSERT_ALLOCATION = gql` mutation INSERT_ALLOCATION($alloc: [allocations_insert_input!]!) { diff --git a/client/src/graphql/appointments.queries.js b/client/src/graphql/appointments.queries.js index 8a3fe571a..5b6bf73b5 100644 --- a/client/src/graphql/appointments.queries.js +++ b/client/src/graphql/appointments.queries.js @@ -1,28 +1,38 @@ -import { gql } from "apollo-boost"; +import gql from "graphql-tag"; export const QUERY_ALL_ACTIVE_APPOINTMENTS = gql` - query QUERY_ALL_ACTIVE_APPOINTMENTS { - appointments(where: { canceled: { _eq: false } }) { + query QUERY_ALL_ACTIVE_APPOINTMENTS( + $start: timestamptz! + $end: timestamptz! + ) { + appointments( + where: { + canceled: { _eq: false } + end: { _lte: $end } + start: { _gte: $start } + } + ) { start id end + arrived title isintake + block job { ro_number ownr_ln + ownr_co_nm ownr_fn ownr_ph1 ownr_ea clm_total id clm_no - vehicle { - id - v_model_yr - v_make_desc - v_model_desc - } + ins_co_nm + v_model_yr + v_make_desc + v_model_desc } } } @@ -33,6 +43,12 @@ export const INSERT_APPOINTMENT = gql` insert_appointments(objects: $app) { returning { id + start + end + arrived + title + isintake + block } } } @@ -76,6 +92,7 @@ export const CANCEL_APPOINTMENT_BY_ID = gql` ) { returning { id + canceled } } } @@ -94,3 +111,68 @@ export const QUERY_APPOINTMENTS_BY_JOBID = gql` } } `; +export const QUERY_SCHEDULE_LOAD_DATA = gql` + query QUERY_SCHEDULE_LOAD_DATA($start: timestamptz!, $end: timestamptz!) { + productionview_aggregate { + aggregate { + sum { + larhrs + labhrs + } + } + } + compJobs: jobs( + where: { scheduled_completion: { _gte: $start, _lte: $end } } + ) { + id + scheduled_completion + labhrs: joblines_aggregate(where: { mod_lbr_ty: { _eq: "LAB" } }) { + aggregate { + sum { + mod_lb_hrs + } + } + } + larhrs: joblines_aggregate(where: { mod_lbr_ty: { _eq: "LAR" } }) { + aggregate { + sum { + mod_lb_hrs + } + } + } + } + arrJobs: jobs(where: { scheduled_in: { _gte: $start, _lte: $end } }) { + id + scheduled_in + labhrs: joblines_aggregate(where: { mod_lbr_ty: { _eq: "LAB" } }) { + aggregate { + sum { + mod_lb_hrs + } + } + } + larhrs: joblines_aggregate(where: { mod_lbr_ty: { _eq: "LAR" } }) { + aggregate { + sum { + mod_lb_hrs + } + } + } + } + } +`; + +export const MARK_LATEST_APPOINTMENT_AS_ARRIVED = gql` + mutation MARK_LATEST_APPOINTMENT_AS_ARRIVED($appointmentId: uuid!) { + update_appointments( + where: { id: { _eq: $appointmentId } } + _set: { arrived: true } + ) { + affected_rows + returning { + id + arrived + } + } + } +`; diff --git a/client/src/graphql/associations.queries.js b/client/src/graphql/associations.queries.js index b043e3c8a..bcec3887d 100644 --- a/client/src/graphql/associations.queries.js +++ b/client/src/graphql/associations.queries.js @@ -1,4 +1,4 @@ -import { gql } from "apollo-boost"; +import gql from "graphql-tag"; export const QUERY_ALL_ASSOCIATIONS = gql` query QUERY_ALL_ASSOCIATIONS { diff --git a/client/src/graphql/audit_trail.queries.js b/client/src/graphql/audit_trail.queries.js index 5ac744174..44db02c22 100644 --- a/client/src/graphql/audit_trail.queries.js +++ b/client/src/graphql/audit_trail.queries.js @@ -1,4 +1,4 @@ -import { gql } from "apollo-boost"; +import gql from "graphql-tag"; export const QUERY_AUDIT_TRAIL = gql` query QUERY_AUDIT_TRAIL($id: uuid!) { diff --git a/client/src/graphql/available-jobs.queries.js b/client/src/graphql/available-jobs.queries.js index a35c45bce..bbaaf7afc 100644 --- a/client/src/graphql/available-jobs.queries.js +++ b/client/src/graphql/available-jobs.queries.js @@ -1,4 +1,4 @@ -import { gql } from "apollo-boost"; +import gql from "graphql-tag"; export const QUERY_AVAILABLE_NEW_JOBS = gql` query QUERY_AVAILABLE_NEW_JOBS { diff --git a/client/src/graphql/bodyshop.queries.js b/client/src/graphql/bodyshop.queries.js index 6117c5f18..6e487752d 100644 --- a/client/src/graphql/bodyshop.queries.js +++ b/client/src/graphql/bodyshop.queries.js @@ -1,8 +1,18 @@ -import { gql } from "apollo-boost"; +import gql from "graphql-tag"; export const QUERY_BODYSHOP = gql` query QUERY_BODYSHOP { bodyshops(where: { associations: { active: { _eq: true } } }) { + associations { + user { + authid + email + dashboardlayout + employee { + id + } + } + } address1 address2 city @@ -26,6 +36,20 @@ export const QUERY_BODYSHOP = gql` messagingservicesid template_header textid + production_config + invoice_tax_rates + inhousevendorid + accountingconfig + appt_length + stripe_acct_id + ssbuckets + scoreboard_target + md_referral_sources + md_messaging_presets + intakechecklist + speedprint + md_parts_locations + md_notes_presets employees { id first_name @@ -49,7 +73,93 @@ export const UPDATE_SHOP = gql` mutation UPDATE_SHOP($id: uuid, $shop: bodyshops_set_input!) { update_bodyshops(where: { id: { _eq: $id } }, _set: $shop) { returning { + address1 + address2 + city + country + created_at + email + federal_tax_id id + insurance_vendor_id + logo_img_path + md_ro_statuses + md_order_statuses + shopname + state + state_tax_id + updated_at + zip_post + shoprates + region_config + md_responsibility_centers + messagingservicesid + template_header + textid + production_config + invoice_tax_rates + appt_length + stripe_acct_id + ssbuckets + scoreboard_target + md_referral_sources + md_messaging_presets + intakechecklist + speedprint + md_parts_locations + md_notes_presets + employees { + id + first_name + last_name + employee_number + cost_center + } + } + } + } +`; +export const QUERY_INTAKE_CHECKLIST = gql` + query QUERY_INTAKE_CHECKLIST($shopId: uuid!) { + bodyshops_by_pk(id: $shopId) { + id + intakechecklist + } + } +`; +export const QUERY_STRIPE_ID = gql` + query QUERY_STRIPE_ID { + bodyshops { + stripe_acct_id + } + } +`; + +export const QUERY_DASHBOARD_DETAILS = gql` + query QUERY_DASHBOARD_DETAILS { + jobs { + id + clm_total + scheduled_completion + date_invoiced + ins_co_nm + } + compJobs: jobs(where: { inproduction: { _eq: true } }) { + id + scheduled_completion + labhrs: joblines_aggregate(where: { mod_lbr_ty: { _eq: "LAB" } }) { + aggregate { + sum { + mod_lb_hrs + } + } + } + larhrs: joblines_aggregate(where: { mod_lbr_ty: { _eq: "LAR" } }) { + aggregate { + sum { + mod_lb_hrs + } + } } } } diff --git a/client/src/graphql/cccontracts.queries.js b/client/src/graphql/cccontracts.queries.js index b180359f3..bc0cc182d 100644 --- a/client/src/graphql/cccontracts.queries.js +++ b/client/src/graphql/cccontracts.queries.js @@ -1,4 +1,4 @@ -import { gql } from "apollo-boost"; +import gql from "graphql-tag"; export const INSERT_NEW_CONTRACT = gql` mutation INSERT_NEW_CONTRACT($contract: [cccontracts_insert_input!]!) { @@ -68,6 +68,17 @@ export const QUERY_CONTRACT_BY_PK = gql` driver_zip id jobid + dailyrate + actax + dailyfreekm + refuelcharge + excesskmrate + cleanupcharge + damagewaiver + federaltax + statetax + localtax + coverage job { id est_number @@ -77,7 +88,23 @@ export const QUERY_CONTRACT_BY_PK = gql` ownr_fn ownr_ln ownr_co_nm + clm_no scheduled_completion + ownerid + vehicleid + owner { + ownr_fn + ownr_ln + id + ownr_co_nm + } + vehicle { + id + v_make_desc + v_model_desc + v_model_yr + v_vin + } } kmend kmstart @@ -97,9 +124,20 @@ export const QUERY_CONTRACT_BY_PK = gql` } `; -export const QUERY_ACTIVE_CONTRACTS = gql` - query QUERY_ACTIVE_CONTRACTS { - cccontracts(where: { status: { _neq: "contracts.status.returned" } }) { +export const QUERY_ACTIVE_CONTRACTS_PAGINATED = gql` + query QUERY_ACTIVE_CONTRACTS_PAGINATED( + $offset: Int + $limit: Int + $order: [cccontracts_order_by!]! + $start: timestamptz + $end: timestamptz + ) { + cccontracts( + offset: $offset + limit: $limit + order_by: $order + where: { actualreturn: { _lte: $end }, start: { _gte: $start } } + ) { agreementnumber courtesycarid driver_fn @@ -116,6 +154,7 @@ export const QUERY_ACTIVE_CONTRACTS = gql` ownr_co_nm } scheduledreturn + actualreturn start status courtesycar { @@ -127,5 +166,10 @@ export const QUERY_ACTIVE_CONTRACTS = gql` plate } } + cccontracts_aggregate { + aggregate { + count(distinct: true) + } + } } `; diff --git a/client/src/graphql/conversations.queries.js b/client/src/graphql/conversations.queries.js index af7d0d138..ecdbc4e5e 100644 --- a/client/src/graphql/conversations.queries.js +++ b/client/src/graphql/conversations.queries.js @@ -1,10 +1,19 @@ -import { gql } from "apollo-boost"; +import gql from "graphql-tag"; export const CONVERSATION_LIST_SUBSCRIPTION = gql` subscription CONVERSATION_LIST_SUBSCRIPTION { conversations { phone_num id + job_conversations { + job { + id + ro_number + ownr_fn + ownr_ln + ownr_co_nm + } + } messages_aggregate( where: { read: { _eq: false }, isoutbound: { _eq: false } } ) { @@ -19,11 +28,13 @@ export const CONVERSATION_LIST_SUBSCRIPTION = gql` export const CONVERSATION_SUBSCRIPTION_BY_PK = gql` subscription CONVERSATION_SUBSCRIPTION_BY_PK($conversationId: uuid!) { conversations_by_pk(id: $conversationId) { - messages { + messages(order_by: { created_at: asc_nulls_first }) { id status text isoutbound + image + image_path } messages_aggregate( where: { read: { _eq: false }, isoutbound: { _eq: false } } @@ -32,6 +43,37 @@ export const CONVERSATION_SUBSCRIPTION_BY_PK = gql` count } } + id + phone_num + job_conversations { + jobid + conversationid + job { + id + ownr_fn + ownr_ln + ownr_co_nm + ro_number + } + } + } + } +`; + +export const CONVERSATION_ID_BY_PHONE = gql` + query CONVERSATION_ID_BY_PHONE($phone: String!) { + conversations(where: { phone_num: { _eq: $phone } }) { + id + } + } +`; + +export const CREATE_CONVERSATION = gql` + mutation CREATE_CONVERSATION($conversation: [conversations_insert_input!]!) { + insert_conversations(objects: $conversation) { + returning { + id + } } } `; diff --git a/client/src/graphql/courtesy-car.queries.js b/client/src/graphql/courtesy-car.queries.js index 2c6bb755d..a045348cb 100644 --- a/client/src/graphql/courtesy-car.queries.js +++ b/client/src/graphql/courtesy-car.queries.js @@ -1,4 +1,4 @@ -import { gql } from "apollo-boost"; +import gql from "graphql-tag"; export const INSERT_NEW_COURTESY_CAR = gql` mutation INSERT_NEW_COURTESY_CAR( @@ -55,6 +55,17 @@ export const QUERY_ALL_CC = gql` status vin year + cccontracts( + where: { status: { _eq: "contracts.status.out" } } + order_by: { contract_date: desc } + limit: 1 + ) { + id + job { + id + ro_number + } + } } } `; diff --git a/client/src/graphql/csi.queries.js b/client/src/graphql/csi.queries.js new file mode 100644 index 000000000..e6f838e10 --- /dev/null +++ b/client/src/graphql/csi.queries.js @@ -0,0 +1,81 @@ +import gql from "graphql-tag"; + +export const QUERY_SURVEY = gql` + query QUERY_SURVEY($surveyId: uuid!) { + csi_by_pk(id: $surveyId) { + relateddata + valid + validuntil + id + csiquestion { + id + config + } + } + } +`; +export const COMPLETE_SURVEY = gql` + mutation COMPLETE_SURVEY($surveyId: uuid!, $survey: csi_set_input) { + update_csi(where: { id: { _eq: $surveyId } }, _set: $survey) { + affected_rows + } + } +`; + +export const GET_CURRENT_QUESTIONSET_ID = gql` + query GET_CURRENT_QUESTIONSET_ID { + csiquestions(where: { current: { _eq: true } }) { + id + } + } +`; + +export const INSERT_CSI = gql` + mutation INSERT_CSI($csiInput: [csi_insert_input!]!) { + insert_csi(objects: $csiInput) { + returning { + id + } + } + } +`; + +export const QUERY_CSI_RESPONSE_PAGINATED = gql` + query QUERY_CSI_RESPONSE_PAGINATED( + $offset: Int + $limit: Int + $order: [csi_order_by!]! + ) { + csi(offset: $offset, limit: $limit, order_by: $order) { + id + completedon + job { + ownr_fn + ownr_ln + ro_number + est_number + id + } + } + csi_aggregate { + aggregate { + count(distinct: true) + } + } + } +`; +export const QUERY_CSI_RESPONSE_BY_PK = gql` + query QUERY_CSI_RESPONSE_BY_PK($id: uuid!) { + csi_by_pk(id: $id) { + relateddata + valid + validuntil + id + response + csiquestion { + id + config + } + } + } +`; diff --git a/client/src/graphql/documents.queries.js b/client/src/graphql/documents.queries.js index 3e416f26c..63aff7dc8 100644 --- a/client/src/graphql/documents.queries.js +++ b/client/src/graphql/documents.queries.js @@ -1,4 +1,4 @@ -import { gql } from "apollo-boost"; +import gql from "graphql-tag"; export const GET_DOCUMENTS_BY_JOB = gql` query GET_DOCUMENTS_BY_JOB($jobId: uuid!) { diff --git a/client/src/graphql/employees.queries.jsx b/client/src/graphql/employees.queries.jsx index 1fb7ed1d9..cd9aebbdc 100644 --- a/client/src/graphql/employees.queries.jsx +++ b/client/src/graphql/employees.queries.jsx @@ -1,4 +1,4 @@ -import { gql } from "apollo-boost"; +import gql from "graphql-tag"; export const QUERY_EMPLOYEES = gql` query QUERY_EMPLOYEES { @@ -13,6 +13,8 @@ export const QUERY_EMPLOYEES = gql` flat_rate cost_center base_rate + pin + user_email } } `; @@ -31,7 +33,18 @@ export const UPDATE_EMPLOYEE = gql` mutation UPDATE_EMPLOYEE($id: uuid!, $employee: employees_set_input) { update_employees(where: { id: { _eq: $id } }, _set: $employee) { returning { + last_name id + first_name + employee_number + active + termination_date + hire_date + flat_rate + cost_center + base_rate + pin + user_email } } } diff --git a/client/src/graphql/invoice-lines.queries.js b/client/src/graphql/invoice-lines.queries.js new file mode 100644 index 000000000..991d6e48f --- /dev/null +++ b/client/src/graphql/invoice-lines.queries.js @@ -0,0 +1,17 @@ +import gql from "graphql-tag"; + +export const UPDATE_INVOICE_LINE = gql` + mutation UPDATE_INVOICE_LINE( + $invoicelineId: uuid! + $invoiceLine: invoicelines_set_input! + ) { + update_invoicelines( + where: { id: { _eq: $invoicelineId } } + _set: $invoiceLine + ) { + returning { + id + } + } + } +`; diff --git a/client/src/graphql/invoices.queries.js b/client/src/graphql/invoices.queries.js index efb7d7bf6..c0fe506fa 100644 --- a/client/src/graphql/invoices.queries.js +++ b/client/src/graphql/invoices.queries.js @@ -1,4 +1,4 @@ -import { gql } from "apollo-boost"; +import gql from "graphql-tag"; export const INSERT_NEW_INVOICE = gql` mutation INSERT_NEW_INVOICE($invoice: [invoices_insert_input!]!) { @@ -11,13 +11,27 @@ export const INSERT_NEW_INVOICE = gql` `; export const QUERY_ALL_INVOICES_PAGINATED = gql` - query QUERY_ALL_INVOICES_PAGINATED($offset: Int, $limit: Int) { - invoices(offset: $offset, limit: $limit, order_by: { date: desc }) { + query QUERY_ALL_INVOICES_PAGINATED( + $search: String + $offset: Int + $limit: Int + $order: [invoices_order_by!]! + ) { + search_invoices( + args: { search: $search } + offset: $offset + limit: $limit + order_by: $order + ) { id vendor { id name } + federal_tax_rate + local_tax_rate + state_tax_rate + is_credit_memo total invoice_number date @@ -27,19 +41,57 @@ export const QUERY_ALL_INVOICES_PAGINATED = gql` } invoicelines { actual_price + quantity actual_cost cost_center id line_desc } } + search_invoices_aggregate(args: { search: $search }) { + aggregate { + count(distinct: true) + } + } } `; export const QUERY_INVOICES_BY_JOBID = gql` - query QUERY_INVOICES_BY_JOBID($jobid: uuid!) { + query QUERY_PARTS_INVOICES_BY_JOBID($jobid: uuid!) { + parts_orders( + where: { jobid: { _eq: $jobid } } + order_by: { order_date: desc } + ) { + id + vendor { + id + name + } + order_date + deliver_by + parts_order_lines { + id + act_price + db_price + line_desc + oem_partno + status + line_remarks + quantity + job_line_id + jobline { + id + part_type + } + backordered_eta + backordered_on + } + order_number + user_email + } invoices(where: { jobid: { _eq: $jobid } }, order_by: { date: desc }) { id + vendorid vendor { id name @@ -47,12 +99,67 @@ export const QUERY_INVOICES_BY_JOBID = gql` total invoice_number date + federal_tax_rate + state_tax_rate + local_tax_rate + is_credit_memo invoicelines { actual_price + quantity actual_cost cost_center id + joblineid line_desc + applicable_taxes + } + } + } +`; + +export const QUERY_INVOICES_BY_VENDOR = gql` + query QUERY_INVOICES_BY_VENDOR($vendorId: uuid!) { + invoices( + where: { vendorid: { _eq: $vendorId } } + order_by: { date: desc } + ) { + id + job { + id + ro_number + } + total + invoice_number + date + } + } +`; + +export const QUERY_INVOICES_BY_VENDOR_PAGINATED = gql` + query QUERY_INVOICES_BY_VENDOR_PAGINATED( + $vendorId: uuid! + $offset: Int + $limit: Int + $order: [invoices_order_by!]! + ) { + invoices( + where: { vendorid: { _eq: $vendorId } } + offset: $offset + limit: $limit + order_by: $order + ) { + id + job { + id + ro_number + } + total + invoice_number + date + } + invoices_aggregate(where: { vendorid: { _eq: $vendorId } }) { + aggregate { + count(distinct: true) } } } @@ -71,7 +178,9 @@ export const QUERY_INVOICE_BY_PK = gql` jobid total updated_at + vendorid vendor { + id name discount } @@ -81,6 +190,42 @@ export const QUERY_INVOICE_BY_PK = gql` actual_price actual_cost cost_center + quantity + joblineid + applicable_taxes + } + documents { + id + key + name + type + } + } + } +`; + +export const UPDATE_INVOICE = gql` + mutation UPDATE_INVOICE($invoiceId: uuid!, $invoice: invoices_set_input!) { + update_invoices(where: { id: { _eq: $invoiceId } }, _set: $invoice) { + returning { + id + exported + exported_at + } + } + } +`; + +export const UPDATE_INVOICES = gql` + mutation UPDATE_INVOICES( + $invoiceIdList: [uuid!]! + $invoice: invoices_set_input! + ) { + update_invoices(where: { id: { _in: $invoiceIdList } }, _set: $invoice) { + returning { + id + exported + exported_at } } } diff --git a/client/src/graphql/job-conversations.queries.js b/client/src/graphql/job-conversations.queries.js new file mode 100644 index 000000000..16c88dcd3 --- /dev/null +++ b/client/src/graphql/job-conversations.queries.js @@ -0,0 +1,30 @@ +import gql from "graphql-tag"; + +export const INSERT_CONVERSATION_TAG = gql` + mutation INSERT_CONVERSATION_TAG($conversationId: uuid!, $jobId: uuid!) { + insert_job_conversations( + objects: { conversationid: $conversationId, jobid: $jobId } + on_conflict: { constraint: job_conversations_pkey, update_columns: jobid } + ) { + returning { + jobid + conversationid + } + } + } +`; + +export const REMOVE_CONVERSATION_TAG = gql` + mutation REMOVE_CONVERSATION_TAG($conversationId: uuid!, $jobId: uuid!) { + delete_job_conversations( + where: { + _and: { + jobid: { _eq: $jobId } + conversationid: { _eq: $conversationId } + } + } + ) { + affected_rows + } + } +`; diff --git a/client/src/graphql/jobs-lines.queries.js b/client/src/graphql/jobs-lines.queries.js index e07ffe7e8..53360509d 100644 --- a/client/src/graphql/jobs-lines.queries.js +++ b/client/src/graphql/jobs-lines.queries.js @@ -1,9 +1,10 @@ -import { gql } from "apollo-boost"; +import gql from "graphql-tag"; export const GET_JOB_LINES_BY_PK = gql` query GET_JOB_LINES_BY_PK($id: uuid!) { - joblines(where: { jobid: { _eq: $id } }, order_by: { unq_seq: asc }) { + joblines(where: { jobid: { _eq: $id } }, order_by: { line_no: asc }) { id + line_no unq_seq line_ind line_desc @@ -19,6 +20,8 @@ export const GET_JOB_LINES_BY_PK = gql` lbr_amt op_code_desc status + notes + location parts_order_lines { id parts_order { @@ -32,15 +35,6 @@ export const GET_JOB_LINES_BY_PK = gql` } } } - allocations { - id - hours - employee { - id - first_name - last_name - } - } } } `; @@ -103,6 +97,15 @@ export const UPDATE_JOB_LINE = gql` update_joblines(where: { id: { _eq: $lineId } }, _set: $line) { returning { id + notes + mod_lbr_ty + part_qty + db_price + act_price + line_desc + oem_partno + notes + location } } } diff --git a/client/src/graphql/jobs.queries.js b/client/src/graphql/jobs.queries.js index df60a4830..2c932ac91 100644 --- a/client/src/graphql/jobs.queries.js +++ b/client/src/graphql/jobs.queries.js @@ -1,4 +1,4 @@ -import { gql } from "apollo-boost"; +import gql from "graphql-tag"; export const QUERY_ALL_ACTIVE_JOBS = gql` query QUERY_ALL_ACTIVE_JOBS($statuses: [String!]!) { @@ -51,32 +51,152 @@ export const QUERY_ALL_ACTIVE_JOBS = gql` `; export const SUBSCRIPTION_JOBS_IN_PRODUCTION = gql` - subscription SUBSCRIPTION_JOBS_IN_PRODUCTION { - job_status( - where: { isproductionstatus: { _eq: true } } - order_by: { order: asc } - ) { - name - order - isproductionstatus + subscription SUBSCRIPTION_JOBS_IN_PRODUCTION($statusList: [String!]!) { + jobs(where: { status: { _in: $statusList } }) { id - jobs { + status + ro_number + est_number + ownr_fn + ownr_ln + v_model_yr + v_model_desc + clm_no + v_make_desc + v_color + plate_no + actual_in + scheduled_completion + scheduled_delivery + ins_co_nm + clm_total + ownr_ph1 + special_coverage_policy + production_vars + kanbanparent + employee_body_rel { id - scheduled_completion - actual_in - est_number - ro_number - vehicle { - id - v_model_yr - v_model_desc - v_make_desc - v_vin + first_name + last_name + } + employee_refinish_rel { + id + first_name + last_name + } + employee_prep_rel { + id + first_name + last_name + } + partcount: joblines_aggregate { + nodes { + status } - owner { + } + + labhrs: joblines_aggregate(where: { mod_lbr_ty: { _eq: "LAB" } }) { + aggregate { + sum { + mod_lb_hrs + } + } + } + larhrs: joblines_aggregate(where: { mod_lbr_ty: { _eq: "LAR" } }) { + aggregate { + sum { + mod_lb_hrs + } + } + } + } + } +`; + +export const QUERY_JOB_COSTING_DETAILS = gql` + query QUERY_JOB_COSTING_DETAILS($id: uuid!) { + jobs_by_pk(id: $id) { + est_number + ro_number + clm_total + id + ded_amt + ded_status + depreciation_taxes + federal_tax_payable + other_amount_payable + towing_payable + storage_payable + adjustment_bottom_line + federal_tax_rate + state_tax_rate + local_tax_rate + tax_tow_rt + tax_str_rt + tax_paint_mat_rt + tax_sub_rt + tax_lbr_rt + tax_levies_rt + parts_tax_rates + job_totals + labor_rate_desc + rate_atp + rate_la1 + rate_la2 + rate_la3 + rate_la4 + rate_laa + rate_lab + rate_lad + rate_lae + rate_laf + rate_lag + rate_lam + rate_lar + rate_las + rate_lau + rate_ma2s + rate_ma2t + rate_ma3s + rate_mabl + rate_macs + rate_mahw + rate_mapa + rate_mash + rate_matd + actual_in + status + joblines { + id + unq_seq + line_ind + tax_part + line_desc + prt_dsmk_p + prt_dsmk_m + part_type + oem_partno + db_price + act_price + part_qty + mod_lbr_ty + db_hrs + mod_lb_hrs + lbr_op + lbr_amt + op_code_desc + } + invoices { + id + federal_tax_rate + local_tax_rate + state_tax_rate + is_credit_memo + invoicelines { + actual_cost + cost_center id - first_name - last_name + quantity } } } @@ -87,6 +207,21 @@ export const GET_JOB_BY_PK = gql` query GET_JOB_BY_PK($id: uuid!) { jobs_by_pk(id: $id) { updated_at + employee_body_rel { + id + first_name + last_name + } + employee_refinish_rel { + id + first_name + last_name + } + employee_prep_rel { + id + first_name + last_name + } csr loss_desc kmin @@ -100,6 +235,7 @@ export const GET_JOB_BY_PK = gql` est_number ro_number clm_total + inproduction vehicleid plate_no v_vin @@ -242,6 +378,15 @@ export const GET_JOB_BY_PK = gql` lbr_amt op_code_desc } + payments { + id + amount + payer + created_at + stripeid + transactionid + memo + } cccontracts { id status @@ -249,10 +394,10 @@ export const GET_JOB_BY_PK = gql` scheduledreturn agreementnumber } - appointments_aggregate { - aggregate { - count - } + cieca_ttl + csiinvites { + id + completedon } } } @@ -262,6 +407,8 @@ export const QUERY_JOB_CARD_DETAILS = gql` query QUERY_JOB_CARD_DETAILS($id: uuid!) { jobs_by_pk(id: $id) { ownr_fn + employee_body + employee_refinish ownr_ln ownr_ph1 ownr_ea @@ -277,6 +424,7 @@ export const QUERY_JOB_CARD_DETAILS = gql` v_color plate_no vehicle { + id v_model_yr v_make_desc v_model_desc @@ -300,11 +448,18 @@ export const QUERY_JOB_CARD_DETAILS = gql` est_ct_ln clm_no status + job_totals area_of_damage ro_number scheduled_completion scheduled_in scheduled_delivery + date_invoiced + date_open + date_exported + date_closed + date_scheduled + date_estimated notes { id text @@ -312,7 +467,6 @@ export const QUERY_JOB_CARD_DETAILS = gql` private created_at } - updated_at clm_total ded_amt @@ -325,7 +479,76 @@ export const QUERY_JOB_CARD_DETAILS = gql` } documents(limit: 3, order_by: { created_at: desc }) { id - thumb_url + key + } + } + } +`; + +export const QUERY_TECH_JOB_DETAILS = gql` + query QUERY_TECH_JOB_DETAILS($id: uuid!) { + jobs_by_pk(id: $id) { + ownr_fn + ownr_ln + v_model_yr + v_make_desc + v_model_desc + v_color + plate_no + actual_completion + actual_delivery + actual_in + est_number + id + ins_co_nm + clm_no + status + job_totals + area_of_damage + ro_number + scheduled_completion + scheduled_in + scheduled_delivery + date_invoiced + date_open + date_exported + date_closed + date_scheduled + date_estimated + employee_body + employee_refinish + employee_prep + joblines { + id + unq_seq + line_ind + tax_part + line_desc + prt_dsmk_p + prt_dsmk_m + part_type + oem_partno + db_price + act_price + part_qty + mod_lbr_ty + db_hrs + mod_lb_hrs + lbr_op + lbr_amt + op_code_desc + } + notes { + id + text + critical + private + created_at + } + updated_at + documents(order_by: { created_at: desc }) { + id + key } } } @@ -336,8 +559,8 @@ export const UPDATE_JOB = gql` update_jobs(where: { id: { _eq: $jobId } }, _set: $job) { returning { id - est_ph1 - est_ea + date_exported + status } } } @@ -402,6 +625,16 @@ export const ACTIVE_JOBS_FOR_AUTOCOMPLETE = gql` } `; +export const SEARCH_FOR_JOBS = gql` + query SEARCH_FOR_JOBS($search: String!) { + jobs(where: { ro_number: { _ilike: $search } }) { + id + ro_number + ownr_fn + ownr_ln + } + } +`; //TODO Ensure this is always up to date. export const QUERY_ALL_JOB_FIELDS = gql` query QUERY_ALL_JOB_FIELDS($id: uuid!) { @@ -648,6 +881,220 @@ export const QUERY_ALL_JOB_FIELDS = gql` tax_part unq_seq } + employee_body + employee_refinish + employee_prep } } `; + +export const QUERY_ALL_JOBS_PAGINATED = gql` + query QUERY_ALL_JOBS_PAGINATED( + $search: String + $offset: Int + $limit: Int + $order: [jobs_order_by!]! + ) { + search_jobs( + args: { search: $search } + offset: $offset + limit: $limit + order_by: $order + ) { + ownr_fn + ownr_ln + ownr_ph1 + ownr_ea + plate_no + plate_st + v_vin + v_model_yr + v_model_desc + v_make_desc + v_color + vehicleid + actual_completion + actual_delivery + actual_in + est_number + id + ins_co_nm + ins_ct_fn + ins_ct_ln + ins_ph1 + ins_ea + est_co_nm + est_ph1 + est_ea + est_ct_fn + est_ct_ln + clm_no + clm_total + owner_owing + ro_number + scheduled_completion + scheduled_in + scheduled_delivery + status + updated_at + ded_amt + vehicleid + } + search_jobs_aggregate(args: { search: $search }) { + aggregate { + count(distinct: true) + } + } + } +`; + +export const QUERY_JOB_CLOSE_DETAILS = gql` + query QUERY_JOB_CLOSE_DETAILS($id: uuid!) { + jobs_by_pk(id: $id) { + ro_number + clm_total + inproduction + plate_no + v_vin + v_model_yr + v_model_desc + v_make_desc + v_color + invoice_allocation + ins_co_id + policy_no + clm_no + ins_co_nm + regie_number + id + ded_amt + ded_status + depreciation_taxes + federal_tax_payable + other_amount_payable + towing_payable + storage_payable + adjustment_bottom_line + federal_tax_rate + state_tax_rate + local_tax_rate + tax_tow_rt + tax_str_rt + tax_paint_mat_rt + tax_sub_rt + tax_lbr_rt + tax_levies_rt + parts_tax_rates + job_totals + ownr_fn + ownr_ln + ownr_ea + ownr_addr1 + ownr_addr2 + ownr_city + ownr_st + ownr_zip + ownr_ctry + ownr_ph1 + rate_atp + rate_la1 + rate_la2 + rate_la3 + rate_la4 + rate_laa + rate_lab + rate_lad + rate_lae + rate_laf + rate_lag + rate_lam + rate_lar + rate_las + rate_lau + rate_ma2s + rate_ma2t + rate_ma3s + rate_mabl + rate_macs + rate_mahw + rate_mapa + rate_mash + rate_matd + status + owner_owing + date_exported + joblines { + id + tax_part + line_desc + prt_dsmk_p + prt_dsmk_m + part_type + oem_partno + db_price + act_price + part_qty + mod_lbr_ty + db_hrs + mod_lb_hrs + lbr_op + lbr_amt + op_code_desc + } + } + } +`; + +export const generate_UPDATE_JOB_KANBAN = ( + oldChildId, + oldChildNewParent, + movedId, + movedNewParent, + movedNewStatus, + newChildId, + newChildParent +) => { + // console.log("oldChildId", oldChildId, "oldChildNewParent", oldChildNewParent); + // console.log("Moved", movedId, movedNewParent, movedNewStatus); + // console.log("new", newChildId, newChildParent); + + const oldChildQuery = ` + updateOldChild: update_jobs(where: { id: { _eq: "${oldChildId}" } }, + _set: {kanbanparent: ${ + oldChildNewParent ? `"${oldChildNewParent}"` : null + }}) { + returning { + id + kanbanparent + } + }`; + + const movedQuery = ` + updateMovedChild: update_jobs(where: { id: { _eq: "${movedId}" } }, + _set: {kanbanparent: ${ + movedNewParent ? `"${movedNewParent}"` : null + } , status: "${movedNewStatus}"}) { + returning { + id + status + kanbanparent + } + }`; + + const newChildQuery = ` + updateNewChild: update_jobs(where: { id: { _eq: "${newChildId}" } }, + _set: {kanbanparent: ${newChildParent ? `"${newChildParent}"` : null}}) { + returning { + id + kanbanparent + } + }`; + + return gql` + mutation UPDATE_JOB_KANBAN { + ${oldChildId ? oldChildQuery : ""} + ${movedId ? movedQuery : ""} + ${newChildId ? newChildQuery : ""} + } + `; +}; diff --git a/client/src/graphql/messages.queries.js b/client/src/graphql/messages.queries.js new file mode 100644 index 000000000..69eb89ed6 --- /dev/null +++ b/client/src/graphql/messages.queries.js @@ -0,0 +1,14 @@ +import gql from "graphql-tag"; + +export const MARK_MESSAGES_AS_READ_BY_CONVERSATION = gql` + mutation MARK_MESSAGES_AS_READ_BY_CONVERSATION($conversationId: uuid) { + update_messages( + where: { conversationid: { _eq: $conversationId } } + _set: { read: true } + ) { + returning { + id + } + } + } +`; diff --git a/client/src/graphql/metadata.queries.js b/client/src/graphql/metadata.queries.js index 940210b5b..ccedd012f 100644 --- a/client/src/graphql/metadata.queries.js +++ b/client/src/graphql/metadata.queries.js @@ -1,4 +1,4 @@ -import { gql } from "apollo-boost"; +import gql from "graphql-tag"; export const GET_LANDING_NAV_ITEMS = gql` query nav_items { diff --git a/client/src/graphql/notes.queries.js b/client/src/graphql/notes.queries.js index 8c3935fad..a9d6c11c0 100644 --- a/client/src/graphql/notes.queries.js +++ b/client/src/graphql/notes.queries.js @@ -1,4 +1,4 @@ -import { gql } from "apollo-boost"; +import gql from "graphql-tag"; export const INSERT_NEW_NOTE = gql` mutation INSERT_NEW_NOTE($noteInput: [notes_insert_input!]!) { diff --git a/client/src/graphql/owners.queries.js b/client/src/graphql/owners.queries.js index 8534fa90d..f79a0bcf2 100644 --- a/client/src/graphql/owners.queries.js +++ b/client/src/graphql/owners.queries.js @@ -1,4 +1,4 @@ -import { gql } from "apollo-boost"; +import gql from "graphql-tag"; export const QUERY_SEARCH_OWNER_BY_IDX = gql` query QUERY_SEARCH_OWNER_BY_IDX($search: String!) { @@ -89,6 +89,46 @@ export const QUERY_ALL_OWNERS = gql` } `; +export const QUERY_ALL_OWNERS_PAGINATED = gql` + query QUERY_ALL_OWNERS_PAGINATED( + $search: String + $offset: Int + $limit: Int + $order: [owners_order_by!]! + ) { + search_owners( + args: { search: $search } + offset: $offset + limit: $limit + order_by: $order + ) { + id + allow_text_message + created_at + ownr_addr1 + ownr_addr2 + ownr_co_nm + ownr_city + ownr_ctry + ownr_ea + ownr_fn + ownr_ph1 + ownr_ln + ownr_ph2 + ownr_st + ownr_title + ownr_zip + preferred_contact + updated_at + } + search_owners_aggregate(args: { search: $search }) { + aggregate { + count(distinct: true) + } + } + } +`; + export const QUERY_OWNER_FOR_JOB_CREATION = gql` query QUERY_OWNER_FOR_JOB_CREATION($id: uuid!) { owners_by_pk(id: $id) { diff --git a/client/src/graphql/parts-orders.queries.js b/client/src/graphql/parts-orders.queries.js index b2124383c..389c7bc62 100644 --- a/client/src/graphql/parts-orders.queries.js +++ b/client/src/graphql/parts-orders.queries.js @@ -1,4 +1,4 @@ -import { gql } from "apollo-boost"; +import gql from "graphql-tag"; export const INSERT_NEW_PARTS_ORDERS = gql` mutation INSERT_NEW_PARTS_ORDERS($po: [parts_orders_insert_input!]!) { @@ -9,3 +9,33 @@ export const INSERT_NEW_PARTS_ORDERS = gql` } } `; + +export const MUTATION_BACKORDER_PART_LINE = gql` + mutation MUTATION_BACKORDER_PART_LINE( + $jobLineId: uuid! + $partsLineId: uuid! + $status: String! + $partsOrder: parts_order_lines_set_input + ) { + update_parts_order_lines( + where: { id: { _eq: $partsLineId } } + _set: $partsOrder + ) { + returning { + status + backordered_on + backordered_eta + id + } + } + update_joblines( + where: { id: { _eq: $jobLineId } } + _set: { status: $status } + ) { + returning { + status + id + } + } + } +`; diff --git a/client/src/graphql/payments.queries.js b/client/src/graphql/payments.queries.js new file mode 100644 index 000000000..f526ba847 --- /dev/null +++ b/client/src/graphql/payments.queries.js @@ -0,0 +1,76 @@ +import gql from "graphql-tag"; + +export const INSERT_NEW_PAYMENT = gql` + mutation INSERT_NEW_PAYMENT($paymentInput: [payments_insert_input!]!) { + insert_payments(objects: $paymentInput) { + returning { + id + } + } + } +`; + +export const QUERY_ALL_PAYMENTS_PAGINATED = gql` + query QUERY_ALL_PAYMENTS_PAGINATED( + $search: String + $offset: Int + $limit: Int + $order: [payments_order_by!]! + ) { + search_payments( + args: { search: $search } + offset: $offset + limit: $limit + order_by: $order + ) { + id + created_at + jobid + job { + id + ro_number + est_number + ownr_fn + ownr_ln + ownr_co_nm + } + transactionid + memo + type + amount + stripeid + exportedat + stripeid + } + search_payments_aggregate(args: { search: $search }) { + aggregate { + count(distinct: true) + } + } + } +`; + +export const UPDATE_PAYMENT = gql` + mutation UPDATE_PAYMENT($paymentId: uuid!, $payment: payments_set_input!) { + update_payments(where: { id: { _eq: $paymentId } }, _set: $payment) { + returning { + id + exported_at + } + } + } +`; + +export const UPDATE_PAYMENTS = gql` + mutation UPDATE_PAYMENTS( + $paymentIdList: [uuid!]! + $payment: payments_set_input! + ) { + update_payments(where: { id: { _in: $paymentIdList } }, _set: $payment) { + returning { + id + exportedat + } + } + } +`; diff --git a/client/src/graphql/scoreboard.queries.js b/client/src/graphql/scoreboard.queries.js new file mode 100644 index 000000000..e0cba5ad9 --- /dev/null +++ b/client/src/graphql/scoreboard.queries.js @@ -0,0 +1,37 @@ +import gql from "graphql-tag"; + +export const SUBSCRIPTION_SCOREBOARD = gql` + subscription SUBSCRIPTION_SCOREBOARD($start: date!, $end: date!) { + scoreboard(where: { _and: { date: { _gte: $start, _lte: $end } } }) { + id + painthrs + bodyhrs + date + job { + id + ro_number + est_number + } + } + } +`; + +export const DELETE_SCOREBOARD_ENTRY = gql` + mutation DELETE_SCOREBOARD_ENTRY($sbId: uuid!) { + delete_scoreboard_by_pk(id: $sbId) { + id + } + } +`; +export const INSERT_SCOREBOARD_ENTRY = gql` + mutation INSERT_SCOREBOARD_ENTRY($sbInput: [scoreboard_insert_input!]!) { + insert_scoreboard(objects: $sbInput) { + returning { + id + date + bodyhrs + painthrs + } + } + } +`; diff --git a/client/src/graphql/search.queries.js b/client/src/graphql/search.queries.js new file mode 100644 index 000000000..897a75235 --- /dev/null +++ b/client/src/graphql/search.queries.js @@ -0,0 +1,53 @@ +import gql from "graphql-tag"; + +export const GLOBAL_SEARCH_QUERY = gql` + query GLOBAL_SEARCH_QUERY($search: String) { + search_jobs(args: { search: $search }) { + id + ro_number + est_number + clm_total + clm_no + v_model_yr + v_model_desc + v_make_desc + v_color + plate_no + ownr_fn + ownr_ln + ownr_co_nm + } + search_owners(args: { search: $search }) { + id + ownr_fn + ownr_ln + ownr_co_nm + } + search_vehicles(args: { search: $search }) { + id + v_model_yr + v_model_desc + v_make_desc + v_color + } + search_payments(args: { search: $search }) { + id + amount + job { + ro_number + id + } + memo + transactionid + } + search_invoices(args: { search: $search }) { + id + date + invoice_number + vendor { + id + name + } + } + } +`; diff --git a/client/src/graphql/templates.queries.js b/client/src/graphql/templates.queries.js index c0f0be364..d00f59959 100644 --- a/client/src/graphql/templates.queries.js +++ b/client/src/graphql/templates.queries.js @@ -1,4 +1,4 @@ -import { gql } from "apollo-boost"; +import gql from "graphql-tag"; export const QUERY_TEMPLATES_BY_NAME = gql` query QUERY_TEMPLATES_BY_NAME($name: String!) { @@ -11,3 +11,53 @@ export const QUERY_TEMPLATES_BY_NAME = gql` } } `; + +export const QUERY_CUSTOM_TEMPLATES = gql` + query QUERY_CUSTOM_TEMPLATES { + templates(where: { bodyshopid: { _is_null: false } }) { + id + name + } + } +`; + +export const QUERY_TEMPLATE_BY_PK = gql` + query QUERY_TEMPLATE_BY_PK($templateId: uuid!) { + templates_by_pk(id: $templateId) { + id + name + query + html + } + } +`; +export const UPDATE_TEMPLATE = gql` + mutation UPDATE_TEMPLATE( + $templateId: uuid! + $template: templates_set_input! + ) { + update_templates(where: { id: { _eq: $templateId } }, _set: $template) { + returning { + id + } + } + } +`; + +export const INSERT_TEMPLATE = gql` + mutation INSERT_TEMPLATE($template: templates_insert_input!) { + insert_templates(objects: [$template]) { + returning { + id + } + } + } +`; + +export const DELETE_TEMPLATE = gql` + mutation DELETE_TEMPLATE($templateId: uuid!) { + delete_templates(where: { id: { _eq: $templateId } }) { + affected_rows + } + } +`; diff --git a/client/src/graphql/timetickets.queries.js b/client/src/graphql/timetickets.queries.js index eb43189a6..0d2474712 100644 --- a/client/src/graphql/timetickets.queries.js +++ b/client/src/graphql/timetickets.queries.js @@ -1,4 +1,4 @@ -import { gql } from "apollo-boost"; +import gql from "graphql-tag"; export const QUERY_TICKETS_BY_JOBID = gql` query QUERY_TICKETS_BY_JOBID($jobid: uuid!) { @@ -19,6 +19,39 @@ export const QUERY_TICKETS_BY_JOBID = gql` } `; +export const QUERY_TIME_TICKETS_IN_RANGE = gql` + query QUERY_TIME_TICKETS_IN_RANGE($start: date!, $end: date!) { + timetickets( + where: { date: { _gte: $start, _lte: $end } } + order_by: { date: desc_nulls_first } + ) { + actualhrs + ciecacode + clockoff + clockon + cost_center + created_at + date + id + rate + productivehrs + memo + job { + id + ro_number + } + employeeid + employee { + id + employee_number + first_name + cost_center + last_name + } + } + } +`; + export const INSERT_NEW_TIME_TICKET = gql` mutation INSERT_NEW_TIME_TICKET( $timeTicketInput: [timetickets_insert_input!]! @@ -26,6 +59,13 @@ export const INSERT_NEW_TIME_TICKET = gql` insert_timetickets(objects: $timeTicketInput) { returning { id + clockon + clockoff + employeeid + productivehrs + actualhrs + ciecacode + date } } } @@ -42,7 +82,85 @@ export const UPDATE_TIME_TICKET = gql` ) { returning { id + clockon + clockoff + employeeid + productivehrs + actualhrs + ciecacode + created_at + updated_at + jobid + date } } } `; + +export const QUERY_ACTIVE_TIME_TICKETS = gql` + query QUERY_ACTIVE_TIME_TICKETS($employeeId: uuid) { + timetickets( + where: { + _and: { + clockoff: { _is_null: true } + employeeid: { _eq: $employeeId } + clockon: { _is_null: false } + jobid: { _is_null: false } + } + } + ) { + id + clockon + memo + job { + id + est_number + ownr_fn + ownr_ln + ownr_co_nm + v_model_desc + v_make_desc + v_model_yr + ro_number + } + } + } +`; + +export const QUERY_ACTIVE_SHIFT_TIME_TICKETS = gql` + query QUERY_ACTIVE_SHIFT_TIME_TICKETS($employeeId: uuid) { + timetickets( + where: { + _and: { + clockoff: { _is_null: true } + employeeid: { _eq: $employeeId } + clockon: { _is_null: false } + jobid: { _is_null: true } + } + } + ) { + id + clockon + memo + job { + id + est_number + ownr_fn + ownr_ln + ownr_co_nm + v_model_desc + v_make_desc + v_model_yr + ro_number + } + } + } +`; + +export const DELETE_TIME_TICKET = gql` + mutation DELETE_TIME_TICKET($id: uuid!) { + delete_timetickets_by_pk(id: $id) { + id + } + } +`; diff --git a/client/src/graphql/user.queries.js b/client/src/graphql/user.queries.js index 8b697ec52..3b86be6a4 100644 --- a/client/src/graphql/user.queries.js +++ b/client/src/graphql/user.queries.js @@ -1,7 +1,7 @@ -import { gql } from "apollo-boost"; +import gql from "graphql-tag"; export const UPSERT_USER = gql` - mutation upsert_user($authEmail: String!, $authToken: String!) { + mutation UPSERT_USER($authEmail: String!, $authToken: String!) { insert_users( objects: [{ email: $authEmail, authid: $authToken }] on_conflict: { constraint: users_pkey, update_columns: [authid] } @@ -12,3 +12,29 @@ export const UPSERT_USER = gql` } } `; + +export const UPDATE_DASHBOARD_LAYOUT = gql` + mutation UPDATE_DASHBOARD_LAYOUT($email: String!, $layout: jsonb!) { + update_users_by_pk( + pk_columns: { email: $email } + _set: { dashboardlayout: $layout } + ) { + email + dashboardlayout + } + } +`; + +export const UPDATE_FCM_TOKEN = gql` + mutation UPDATE_FCM_TOKEN($authEmail: String!, $token: jsonb!) { + update_users( + where: { email: { _eq: $authEmail } } + _append: { fcmtokens: $token } + ) { + affected_rows + returning { + fcmtokens + } + } + } +`; diff --git a/client/src/graphql/vehicles.queries.js b/client/src/graphql/vehicles.queries.js index 571462b01..f6afd3e98 100644 --- a/client/src/graphql/vehicles.queries.js +++ b/client/src/graphql/vehicles.queries.js @@ -1,4 +1,4 @@ -import { gql } from "apollo-boost"; +import gql from "graphql-tag"; export const QUERY_VEHICLE_BY_ID = gql` query QUERY_VEHICLE_BY_ID($id: uuid!) { @@ -71,6 +71,38 @@ export const QUERY_ALL_VEHICLES = gql` } `; +export const QUERY_ALL_VEHICLES_PAGINATED = gql` + query QUERY_ALL_VEHICLES( + $search: String + $offset: Int + $limit: Int + $order: [vehicles_order_by!]! + ) { + search_vehicles( + args: { search: $search } + offset: $offset + limit: $limit + order_by: $order + ) { + id + plate_no + plate_st + v_vin + v_model_yr + v_model_desc + v_make_desc + v_color + v_bstyle + updated_at + } + search_vehicles_aggregate(args: { search: $search }) { + aggregate { + count(distinct: true) + } + } + } +`; + export const SEARCH_VEHICLE_BY_VIN = gql` query SEARCH_VEHICLE_BY_VIN($vin: String!) { vehicles(where: { v_vin: { _ilike: $vin } }) { diff --git a/client/src/graphql/vendors.queries.js b/client/src/graphql/vendors.queries.js index 94773f2cc..dac975c79 100644 --- a/client/src/graphql/vendors.queries.js +++ b/client/src/graphql/vendors.queries.js @@ -1,4 +1,4 @@ -import { gql } from "apollo-boost"; +import gql from "graphql-tag"; export const QUERY_VENDOR_BY_ID = gql` query QUERY_VENDOR_BY_ID($id: uuid!) { @@ -36,7 +36,7 @@ export const UPDATE_VENDOR = gql` export const QUERY_ALL_VENDORS = gql` query QUERY_ALL_VENDORS { - vendors { + vendors(order_by: { name: asc }) { name id street1 diff --git a/client/src/pages/accounting-payables/accounting-payables.container.jsx b/client/src/pages/accounting-payables/accounting-payables.container.jsx new file mode 100644 index 000000000..87d188e94 --- /dev/null +++ b/client/src/pages/accounting-payables/accounting-payables.container.jsx @@ -0,0 +1,48 @@ +import { useQuery } from "@apollo/react-hooks"; +import React, { useEffect } from "react"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import AccountingPayablesTable from "../../components/accounting-payables-table/accounting-payables-table.component"; +import AlertComponent from "../../components/alert/alert.component"; +import { QUERY_INVOICES_FOR_EXPORT } from "../../graphql/accounting.queries"; +import { setBreadcrumbs } from "../../redux/application/application.actions"; +import { selectBodyshop } from "../../redux/user/user.selectors"; + +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, +}); + +const mapDispatchToProps = (dispatch) => ({ + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), +}); +export function AccountingPayablesContainer({ bodyshop, setBreadcrumbs }) { + const { t } = useTranslation(); + + useEffect(() => { + document.title = t("titles.accounting-payables"); + setBreadcrumbs([ + { + link: "/manage/accounting/payables", + label: t("titles.bc.accounting-payables"), + }, + ]); + }, [t, setBreadcrumbs]); + + const { loading, error, data } = useQuery(QUERY_INVOICES_FOR_EXPORT); + + if (error) return ; + + return ( +
    + +
    + ); +} +export default connect( + mapStateToProps, + mapDispatchToProps +)(AccountingPayablesContainer); diff --git a/client/src/pages/accounting-payments/accounting-payments.container.jsx b/client/src/pages/accounting-payments/accounting-payments.container.jsx new file mode 100644 index 000000000..5a24ffce8 --- /dev/null +++ b/client/src/pages/accounting-payments/accounting-payments.container.jsx @@ -0,0 +1,48 @@ +import { useQuery } from "@apollo/react-hooks"; +import React, { useEffect } from "react"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import AccountingPaymentsTable from "../../components/accounting-payments-table/accounting-payments-table.component"; +import AlertComponent from "../../components/alert/alert.component"; +import { QUERY_PAYMENTS_FOR_EXPORT } from "../../graphql/accounting.queries"; +import { setBreadcrumbs } from "../../redux/application/application.actions"; +import { selectBodyshop } from "../../redux/user/user.selectors"; + +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, +}); + +const mapDispatchToProps = (dispatch) => ({ + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), +}); +export function AccountingPaymentsContainer({ bodyshop, setBreadcrumbs }) { + const { t } = useTranslation(); + + useEffect(() => { + document.title = t("titles.accounting-payments"); + setBreadcrumbs([ + { + link: "/manage/accounting/payments", + label: t("titles.bc.accounting-payments"), + }, + ]); + }, [t, setBreadcrumbs]); + + const { loading, error, data } = useQuery(QUERY_PAYMENTS_FOR_EXPORT); + + if (error) return ; + + return ( +
    + +
    + ); +} +export default connect( + mapStateToProps, + mapDispatchToProps +)(AccountingPaymentsContainer); diff --git a/client/src/pages/accounting-receivables/accounting-receivables.container.jsx b/client/src/pages/accounting-receivables/accounting-receivables.container.jsx new file mode 100644 index 000000000..e3e4bde14 --- /dev/null +++ b/client/src/pages/accounting-receivables/accounting-receivables.container.jsx @@ -0,0 +1,51 @@ +import { useQuery } from "@apollo/react-hooks"; +import React, { useEffect } from "react"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import AccountingReceivablesTable from "../../components/accounting-receivables-table/accounting-receivables-table.component"; +import AlertComponent from "../../components/alert/alert.component"; +import { QUERY_JOBS_FOR_EXPORT } from "../../graphql/accounting.queries"; +import { setBreadcrumbs } from "../../redux/application/application.actions"; +import { selectBodyshop } from "../../redux/user/user.selectors"; + +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, +}); + +const mapDispatchToProps = (dispatch) => ({ + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), +}); +export function AccountingReceivablesContainer({ bodyshop, setBreadcrumbs }) { + const { t } = useTranslation(); + + useEffect(() => { + document.title = t("titles.accounting-receivables"); + setBreadcrumbs([ + { + link: "/manage/accounting/receivables", + label: t("titles.bc.accounting-receivables"), + }, + ]); + }, [t, setBreadcrumbs]); + + const { loading, error, data } = useQuery(QUERY_JOBS_FOR_EXPORT, { + variables: { + invoicedStatus: bodyshop.md_ro_statuses.default_invoiced || "Invoiced*", + }, + }); + + if (error) return ; + return ( +
    + +
    + ); +} +export default connect( + mapStateToProps, + mapDispatchToProps +)(AccountingReceivablesContainer); diff --git a/client/src/pages/contract-create/contract-create.page.component.jsx b/client/src/pages/contract-create/contract-create.page.component.jsx index 9f136c19a..3e8a41e35 100644 --- a/client/src/pages/contract-create/contract-create.page.component.jsx +++ b/client/src/pages/contract-create/contract-create.page.component.jsx @@ -1,13 +1,14 @@ -import React from "react"; -import ContractFormComponent from "../../components/contract-form/contract-form.component"; import { Button } from "antd"; +import React from "react"; import { useTranslation } from "react-i18next"; -import ContractJobsContainer from "../../components/contract-jobs/contract-jobs.container"; import ContractCarsContainer from "../../components/contract-cars/contract-cars.container"; - +import ContractFormComponent from "../../components/contract-form/contract-form.component"; +import ContractJobsContainer from "../../components/contract-jobs/contract-jobs.container"; +import ContractLicenseDecodeButton from "../../components/contract-license-decode-button/contract-license-decode-button.component"; export default function ContractCreatePageComponent({ + form, selectedJobState, - selectedCarState + selectedCarState, }) { const { t } = useTranslation(); return ( @@ -15,7 +16,8 @@ export default function ContractCreatePageComponent({ - + +
    ); } diff --git a/client/src/pages/contract-create/contract-create.page.container.jsx b/client/src/pages/contract-create/contract-create.page.container.jsx index 20d439f9f..5acd686c7 100644 --- a/client/src/pages/contract-create/contract-create.page.container.jsx +++ b/client/src/pages/contract-create/contract-create.page.container.jsx @@ -29,8 +29,6 @@ export function ContractCreatePageContainer({ bodyshop, setBreadcrumbs }) { ); const [insertContract] = useMutation(INSERT_NEW_CONTRACT); - console.log("test"); - const handleFinish = (values) => { if (!!selectedCarState[0] && !!selectedJobState[0]) { insertContract({ @@ -81,8 +79,14 @@ export function ContractCreatePageContainer({ bodyshop, setBreadcrumbs }) { }, [t, setBreadcrumbs]); return ( - + diff --git a/client/src/pages/contract-detail/contract-detail.page.component.jsx b/client/src/pages/contract-detail/contract-detail.page.component.jsx index 6e9280a38..0e4665c00 100644 --- a/client/src/pages/contract-detail/contract-detail.page.component.jsx +++ b/client/src/pages/contract-detail/contract-detail.page.component.jsx @@ -6,10 +6,11 @@ import ContractCourtesyCarBlock from "../../components/contract-courtesy-car-blo import ContractFormComponent from "../../components/contract-form/contract-form.component"; import ContractJobBlock from "../../components/contract-job-block/contract-job-block.component"; import { setModalContext } from "../../redux/modals/modals.actions"; +import ContractConvertToRo from "../../components/contract-convert-to-ro/contract-convert-to-ro.component"; -const mapDispatchToProps = dispatch => ({ - setCourtesyCarReturnModalContext: context => - dispatch(setModalContext({ context: context, modal: "courtesyCarReturn" })) +const mapDispatchToProps = (dispatch) => ({ + setCourtesyCarReturnModalContext: (context) => + dispatch(setModalContext({ context: context, modal: "courtesyCarReturn" })), }); export function ContractDetailPage({ @@ -17,32 +18,37 @@ export function ContractDetailPage({ job, courtesyCar, setCourtesyCarReturnModalContext, - refetch + refetch, + form, }) { const { t } = useTranslation(); return (
    - {`Agreement ${(contract && - contract.agreementnumber) || - ""} - ${t((contract && contract.status) || "")}`} + {`Agreement ${ + (contract && contract.agreementnumber) || "" + } - ${t((contract && contract.status) || "")}`} + @@ -51,7 +57,7 @@ export function ContractDetailPage({ - +
    diff --git a/client/src/pages/contract-detail/contract-detail.page.container.jsx b/client/src/pages/contract-detail/contract-detail.page.container.jsx index 2f88551d8..9082cbe59 100644 --- a/client/src/pages/contract-detail/contract-detail.page.container.jsx +++ b/client/src/pages/contract-detail/contract-detail.page.container.jsx @@ -11,14 +11,20 @@ import { QUERY_CONTRACT_BY_PK, UPDATE_CONTRACT, } from "../../graphql/cccontracts.queries"; -import { setBreadcrumbs } from "../../redux/application/application.actions"; +import { + setBreadcrumbs, + addRecentItem, +} from "../../redux/application/application.actions"; import ContractDetailPageComponent from "./contract-detail.page.component"; +import { CreateRecentItem } from "../../utils/create-recent-item"; +import LoadingSpinner from "../../components/loading-spinner/loading-spinner.component"; const mapDispatchToProps = (dispatch) => ({ setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), + addRecentItem: (item) => dispatch(addRecentItem(item)), }); -export function ContractDetailPageContainer({ setBreadcrumbs }) { +export function ContractDetailPageContainer({ setBreadcrumbs, addRecentItem }) { const { t } = useTranslation(); const [updateContract] = useMutation(UPDATE_CONTRACT); const [form] = Form.useForm(); @@ -50,20 +56,34 @@ export function ContractDetailPageContainer({ setBreadcrumbs }) { }), }, ]); - }, [t, data, error, loading, setBreadcrumbs]); - const handleFinish = (values) => { - updateContract({ - variables: { cccontract: { ...values }, contractId: contractId }, - }) - .then((response) => { - notification["success"]({ message: t("contracts.successes.saved") }); - }) - .catch((error) => - notification["error"]({ - message: t("contracts.errors.saving", { error: error }), - }) + if (data) + addRecentItem( + CreateRecentItem( + contractId, + "contract", + data.cccontracts_by_pk.agreementnumber, + `/manage/courtesycars/contracts/${contractId}` + ) ); + }, [t, data, error, loading, setBreadcrumbs, addRecentItem, contractId]); + + const handleFinish = async (values) => { + const result = await updateContract({ + variables: { cccontract: { ...values }, contractId: contractId }, + }); + if (!!result.errors) { + notification["error"]({ + message: t("contracts.errors.saving", { + message: JSON.stringify(result.errors), + }), + }); + return; + } + notification["success"]({ message: t("contracts.successes.saved") }); + if (refetch) await refetch(); + form.resetFields(); + form.resetFields(); }; useEffect(() => { @@ -71,41 +91,41 @@ export function ContractDetailPageContainer({ setBreadcrumbs }) { }, [data, form]); if (error) return ; + if (loading) return ; + return (
    diff --git a/client/src/pages/contracts/contracts.page.component.jsx b/client/src/pages/contracts/contracts.page.component.jsx index a881401eb..8185728bb 100644 --- a/client/src/pages/contracts/contracts.page.component.jsx +++ b/client/src/pages/contracts/contracts.page.component.jsx @@ -1,10 +1,20 @@ import React from "react"; import ContractsList from "../../components/contracts-list/contracts-list.component"; -export default function ContractsPageComponent({ loading, data }) { +export default function ContractsPageComponent({ + loading, + data, + refetch, + total, +}) { return (
    - +
    ); } diff --git a/client/src/pages/contracts/contracts.page.container.jsx b/client/src/pages/contracts/contracts.page.container.jsx index 9de40784d..ee50d0d5f 100644 --- a/client/src/pages/contracts/contracts.page.container.jsx +++ b/client/src/pages/contracts/contracts.page.container.jsx @@ -3,15 +3,41 @@ import React, { useEffect } from "react"; import { useTranslation } from "react-i18next"; import { connect } from "react-redux"; import AlertComponent from "../../components/alert/alert.component"; -import { QUERY_ACTIVE_CONTRACTS } from "../../graphql/cccontracts.queries"; +import { QUERY_ACTIVE_CONTRACTS_PAGINATED } from "../../graphql/cccontracts.queries"; import { setBreadcrumbs } from "../../redux/application/application.actions"; import ContractsPageComponent from "./contracts.page.component"; +import queryString from "query-string"; +import { useLocation } from "react-router-dom"; +import moment from "moment"; const mapDispatchToProps = (dispatch) => ({ setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), }); export function ContractsPageContainer({ setBreadcrumbs }) { - const { loading, error, data } = useQuery(QUERY_ACTIVE_CONTRACTS); + const searchParams = queryString.parse(useLocation().search); + const { page, sortcolumn, sortorder, start, end } = searchParams; + + const { loading, error, data, refetch } = useQuery( + QUERY_ACTIVE_CONTRACTS_PAGINATED, + { + variables: { + //search: search || "", + start: start ? moment(start) : null, + end: end ? moment(end) : null, + offset: page ? (page - 1) * 25 : 0, + limit: 25, + order: [ + { + [sortcolumn || "start"]: sortorder + ? sortorder === "descend" + ? "desc" + : "asc" + : "desc", + }, + ], + }, + } + ); const { t } = useTranslation(); useEffect(() => { document.title = t("titles.contracts"); @@ -30,7 +56,9 @@ export function ContractsPageContainer({ setBreadcrumbs }) {
    ); diff --git a/client/src/pages/courtesy-car-create/courtesy-car-create.page.component.jsx b/client/src/pages/courtesy-car-create/courtesy-car-create.page.component.jsx index 4f5b8b75a..43aa539d3 100644 --- a/client/src/pages/courtesy-car-create/courtesy-car-create.page.component.jsx +++ b/client/src/pages/courtesy-car-create/courtesy-car-create.page.component.jsx @@ -1,6 +1,6 @@ import React from "react"; -import CourtesyCarFormComponent from "../../components/courtesy-car-form/courtesy-car-form.component" +import CourtesyCarFormComponent from "../../components/courtesy-car-form/courtesy-car-form.component"; -export default function CourtesyCarCreateComponent() { - return ; +export default function CourtesyCarCreateComponent({ form }) { + return ; } diff --git a/client/src/pages/courtesy-car-create/courtesy-car-create.page.container.jsx b/client/src/pages/courtesy-car-create/courtesy-car-create.page.container.jsx index a9bd1bdd7..552c22812 100644 --- a/client/src/pages/courtesy-car-create/courtesy-car-create.page.container.jsx +++ b/client/src/pages/courtesy-car-create/courtesy-car-create.page.container.jsx @@ -47,7 +47,7 @@ export function CourtesyCarCreateContainer({ bodyshop, setBreadcrumbs }) { }, [t, setBreadcrumbs]); return ( -
    + ); diff --git a/client/src/pages/courtesy-car-detail/courtesy-car-detail.page.component.jsx b/client/src/pages/courtesy-car-detail/courtesy-car-detail.page.component.jsx index 8a874d3aa..ea5c74b55 100644 --- a/client/src/pages/courtesy-car-detail/courtesy-car-detail.page.component.jsx +++ b/client/src/pages/courtesy-car-detail/courtesy-car-detail.page.component.jsx @@ -2,10 +2,10 @@ import React from "react"; import CourtesyCarCreateFormComponent from "../../components/courtesy-car-form/courtesy-car-form.component"; import CourtesyCarContractListComponent from "../../components/courtesy-car-contract-list/courtesy-car-contract-list.component"; -export default function CourtesyCarDetailPageComponent({ contracts }) { +export default function CourtesyCarDetailPageComponent({ contracts, form }) { return (
    - +
    ); diff --git a/client/src/pages/courtesy-car-detail/courtesy-car-detail.page.container.jsx b/client/src/pages/courtesy-car-detail/courtesy-car-detail.page.container.jsx index a595be0a6..10e62eee2 100644 --- a/client/src/pages/courtesy-car-detail/courtesy-car-detail.page.container.jsx +++ b/client/src/pages/courtesy-car-detail/courtesy-car-detail.page.container.jsx @@ -7,13 +7,21 @@ import { connect } from "react-redux"; import { useParams } from "react-router-dom"; import AlertComponent from "../../components/alert/alert.component"; import { QUERY_CC_BY_PK, UPDATE_CC } from "../../graphql/courtesy-car.queries"; -import { setBreadcrumbs } from "../../redux/application/application.actions"; +import { + addRecentItem, + setBreadcrumbs, +} from "../../redux/application/application.actions"; +import { CreateRecentItem } from "../../utils/create-recent-item"; import CourtesyCarDetailPageComponent from "./courtesy-car-detail.page.component"; const mapDispatchToProps = (dispatch) => ({ setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), + addRecentItem: (item) => dispatch(addRecentItem(item)), }); -export function CourtesyCarDetailPageContainer({ setBreadcrumbs }) { +export function CourtesyCarDetailPageContainer({ + setBreadcrumbs, + addRecentItem, +}) { const { t } = useTranslation(); const [insertCourtesyCar] = useMutation(UPDATE_CC); const [form] = Form.useForm(); @@ -42,7 +50,17 @@ export function CourtesyCarDetailPageContainer({ setBreadcrumbs }) { }), }, ]); - }, [t, data, error, loading, setBreadcrumbs]); + + if (data) + addRecentItem( + CreateRecentItem( + ccId, + "courtesycar", + data.courtesycars_by_pk.fleet_number || data.courtesycars_by_pk.vin, + `/manage/courtesycars/${ccId}` + ) + ); + }, [t, data, error, loading, setBreadcrumbs, ccId, addRecentItem]); const handleFinish = (values) => { insertCourtesyCar({ @@ -99,6 +117,7 @@ export function CourtesyCarDetailPageContainer({ setBreadcrumbs }) { > ); diff --git a/client/src/pages/courtesy-cars/courtesy-cars.page.component.jsx b/client/src/pages/courtesy-cars/courtesy-cars.page.component.jsx index 4d59ebc34..0dd68ffcb 100644 --- a/client/src/pages/courtesy-cars/courtesy-cars.page.component.jsx +++ b/client/src/pages/courtesy-cars/courtesy-cars.page.component.jsx @@ -1,6 +1,12 @@ import React from "react"; import CourtesyCarsListComponent from "../../components/courtesy-cars-list/courtesy-cars-list.component"; -export default function CourtesyCarsPageComponent({ loading, data }) { - return ; +export default function CourtesyCarsPageComponent({ loading, data, refetch }) { + return ( + + ); } diff --git a/client/src/pages/courtesy-cars/courtesy-cars.page.container.jsx b/client/src/pages/courtesy-cars/courtesy-cars.page.container.jsx index cc464629a..59af1e7d6 100644 --- a/client/src/pages/courtesy-cars/courtesy-cars.page.container.jsx +++ b/client/src/pages/courtesy-cars/courtesy-cars.page.container.jsx @@ -12,7 +12,7 @@ const mapDispatchToProps = (dispatch) => ({ }); export function CourtesyCarsPageContainer({ setBreadcrumbs }) { - const { loading, error, data } = useQuery(QUERY_ALL_CC); + const { loading, error, data, refetch } = useQuery(QUERY_ALL_CC); const { t } = useTranslation(); useEffect(() => { document.title = t("titles.courtesycars"); @@ -21,11 +21,12 @@ export function CourtesyCarsPageContainer({ setBreadcrumbs }) { { link: "/manage/courtesycars", label: t("titles.bc.courtesycars") }, ]); }, [setBreadcrumbs, t]); - if (error) return ; + if (error) return ; return ( ); } diff --git a/client/src/pages/csi/csi.container.page.jsx b/client/src/pages/csi/csi.container.page.jsx new file mode 100644 index 000000000..1cf3e77c8 --- /dev/null +++ b/client/src/pages/csi/csi.container.page.jsx @@ -0,0 +1,152 @@ +import { useQuery, useMutation } from "@apollo/react-hooks"; +import { Form, Layout, Typography, Button, Result } from "antd"; +import React, { useState } from "react"; +import { useTranslation } from "react-i18next"; +import { useParams } from "react-router-dom"; +import AlertComponent from "../../components/alert/alert.component"; +import ConfigFormComponents from "../../components/config-form-components/config-form-components.component"; +import LoadingSpinner from "../../components/loading-spinner/loading-spinner.component"; +import { QUERY_SURVEY, COMPLETE_SURVEY } from "../../graphql/csi.queries"; + +export default function CsiContainerPage() { + const { surveyId } = useParams(); + const [form] = Form.useForm(); + const [submitting, setSubmitting] = useState({ + loading: false, + submitted: false, + }); + + const { loading, error, data } = useQuery(QUERY_SURVEY, { + variables: { surveyId }, + }); + + const { t } = useTranslation(); + const [completeSurvey] = useMutation(COMPLETE_SURVEY); + if (loading) return ; + + if (error || !!!data.csi_by_pk) + return ( +
    + + {error ? ( +
    ERROR: {error.graphQLErrors.map((e) => e.message)}
    + ) : null} +
    +
    + ); + + const handleFinish = async (values) => { + setSubmitting({ ...submitting, loading: true }); + + const result = await completeSurvey({ + variables: { + surveyId, + survey: { + response: values, + valid: false, + completedon: new Date(), + }, + }, + }); + + if (!!!result.errors) { + setSubmitting({ ...submitting, loading: false, submitted: true }); + } else { + setSubmitting({ + ...submitting, + loading: false, + error: JSON.stringify(result.errors), + }); + } + }; + + const { + relateddata: { bodyshop, job }, + csiquestion: { config: csiquestions }, + } = data.csi_by_pk; + + return ( + +
    +
    + {bodyshop.logo_img_path ? ( + Logo + ) : null} +
    + {bodyshop.shopname || ""} +
    {`${bodyshop.address1 || ""}`}
    +
    {`${bodyshop.address2 || ""}`}
    +
    {`${bodyshop.city || ""} ${bodyshop.state || ""} ${ + bodyshop.zip_post || "" + }`}
    +
    +
    + {t("csi.labels.title")} + {`Hi ${job.ownr_fn || ""}!`} + + {`At ${ + bodyshop.shopname || "" + }, we value your feedback. We would love to + hear what you have to say. Please fill out the form below.`} + +
    + + {submitting.error ? ( + + ) : null} + + {submitting.submitted ? ( + + + + ) : ( + +
    + + + +
    + )} + + + {`Copyright ImEX.Online. Survey ID: ${surveyId}`} + +
    + ); +} diff --git a/client/src/pages/invoice-detail/invoice-detail.page.component.jsx b/client/src/pages/invoice-detail/invoice-detail.page.component.jsx deleted file mode 100644 index 6a3885aba..000000000 --- a/client/src/pages/invoice-detail/invoice-detail.page.component.jsx +++ /dev/null @@ -1,5 +0,0 @@ -import React from "react"; - -export default function InvoiceDetailPageComponent() { - return
    Invoice Detail Page Component
    ; -} diff --git a/client/src/pages/invoice-detail/invoice-detail.page.container.jsx b/client/src/pages/invoice-detail/invoice-detail.page.container.jsx deleted file mode 100644 index 966c4441e..000000000 --- a/client/src/pages/invoice-detail/invoice-detail.page.container.jsx +++ /dev/null @@ -1,27 +0,0 @@ -import React from "react"; -import { useParams } from "react-router-dom"; -import InvoiceDetailPageComponent from "./invoice-detail.page.component"; -import { useQuery } from "@apollo/react-hooks"; -import { QUERY_INVOICE_BY_PK } from "../../graphql/invoices.queries"; -import AlertComponent from "../../components/alert/alert.component"; -import LoadingSpinner from "../../components/loading-spinner/loading-spinner.component"; -import { Form } from "antd"; - -export default function InvoiceDetailPageContainer() { - const { invoiceId } = useParams(); - const [form] = Form.useForm(); - - const { loading, error, data } = useQuery(QUERY_INVOICE_BY_PK, { - variables: { invoiceid: invoiceId }, - skip: !!!invoiceId, - }); - - if (loading) return ; - if (error) return ; - - return ( -
    - - - ); -} diff --git a/client/src/pages/invoices/invoices.page.component.jsx b/client/src/pages/invoices/invoices.page.component.jsx index 2a0ebad5b..a3d57ec95 100644 --- a/client/src/pages/invoices/invoices.page.component.jsx +++ b/client/src/pages/invoices/invoices.page.component.jsx @@ -1,32 +1,46 @@ -import { Button, Descriptions, Table } from "antd"; +import { SyncOutlined } from "@ant-design/icons"; +import { Button, Checkbox, Input, Table, Typography } from "antd"; +import queryString from "query-string"; import React, { useState } from "react"; import { useTranslation } from "react-i18next"; -import { Link } from "react-router-dom"; +import { connect } from "react-redux"; +import { Link, useHistory, useLocation } from "react-router-dom"; +import { setModalContext } from "../../redux/modals/modals.actions"; import CurrencyFormatter from "../../utils/CurrencyFormatter"; import { DateFormatter } from "../../utils/DateFormatter"; import { alphaSort } from "../../utils/sorters"; -export default function InvoicesPageComponent({ +const mapDispatchToProps = (dispatch) => ({ + setPartsOrderContext: (context) => + dispatch(setModalContext({ context: context, modal: "partsOrder" })), + setInvoiceEnterContext: (context) => + dispatch(setModalContext({ context: context, modal: "invoiceEnter" })), +}); + +export function InvoicesListPage({ loading, - invoices, - selectedInvoice, - handleFetchMore, - handleOnRowClick, + data, + refetch, + total, + setPartsOrderContext, + setInvoiceEnterContext, }) { const { t } = useTranslation(); - const [state, setState] = useState({ sortedInfo: {}, }); + const history = useHistory(); + const search = queryString.parse(useLocation().search); + const { page } = search; const columns = [ { title: t("invoices.fields.vendorname"), dataIndex: "vendorname", key: "vendorname", - sorter: (a, b) => alphaSort(a.vendor.name, b.vendor.name), - sortOrder: - state.sortedInfo.columnKey === "vendorname" && state.sortedInfo.order, + // sorter: (a, b) => alphaSort(a.vendor.name, b.vendor.name), + // sortOrder: + // state.sortedInfo.columnKey === "vendorname" && state.sortedInfo.order, render: (text, record) => {record.vendor.name}, }, { @@ -42,7 +56,6 @@ export default function InvoicesPageComponent({ title: t("invoices.fields.date"), dataIndex: "date", key: "date", - sorter: (a, b) => a.date - b.date, sortOrder: state.sortedInfo.columnKey === "date" && state.sortedInfo.order, @@ -52,7 +65,6 @@ export default function InvoicesPageComponent({ title: t("invoices.fields.total"), dataIndex: "total", key: "total", - sorter: (a, b) => a.total - b.total, sortOrder: state.sortedInfo.columnKey === "total" && state.sortedInfo.order, @@ -60,129 +72,111 @@ export default function InvoicesPageComponent({ {record.total} ), }, + { + title: t("invoices.fields.is_credit_memo"), + dataIndex: "is_credit_memo", + key: "is_credit_memo", + sorter: (a, b) => a.is_credit_memo - b.is_credit_memo, + sortOrder: + state.sortedInfo.columnKey === "is_credit_memo" && + state.sortedInfo.order, + render: (text, record) => , + }, { title: t("general.labels.actions"), dataIndex: "actions", key: "actions", render: (text, record) => ( - - - +
    + + + + +
    ), }, ]; const handleTableChange = (pagination, filters, sorter) => { setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); - }; - - const rowExpander = (record) => { - const columns = [ - { - title: t("invoicelines.fields.line_desc"), - dataIndex: "line_desc", - key: "line_desc", - sorter: (a, b) => alphaSort(a.line_desc, b.line_desc), - sortOrder: - state.sortedInfo.columnKey === "line_desc" && state.sortedInfo.order, - }, - { - title: t("invoicelines.fields.retail"), - dataIndex: "actual_price", - key: "actual_price", - sorter: (a, b) => a.actual_price - b.actual_price, - sortOrder: - state.sortedInfo.columnKey === "actual_price" && - state.sortedInfo.order, - render: (text, record) => ( - {record.actual_price} - ), - }, - { - title: t("invoicelines.fields.actual_cost"), - dataIndex: "actual_cost", - key: "actual_cost", - sorter: (a, b) => a.actual_cost - b.actual_cost, - sortOrder: - state.sortedInfo.columnKey === "actual_cost" && - state.sortedInfo.order, - render: (text, record) => ( - {record.actual_cost} - ), - }, - { - title: t("invoicelines.fields.cost_center"), - dataIndex: "cost_center", - key: "cost_center", - sorter: (a, b) => alphaSort(a.cost_center, b.cost_center), - sortOrder: - state.sortedInfo.columnKey === "cost_center" && - state.sortedInfo.order, - }, - ]; - - return ( -
    - - Zhou Maomao - 1810000000 - Hangzhou, Zhejiang - empty - - No. 18, Wantang Road, Xihu District, Hangzhou, Zhejiang, China - - - ({ ...item }))} - rowKey="id" - dataSource={record.invoicelines} - /> - - ); + search.page = pagination.current; + search.sortcolumn = sorter.columnKey; + search.sortorder = sorter.order; + history.push({ search: queryString.stringify(search) }); }; return ( -
    { - handleOnRowClick(page * pageSize); - }, - }} - columns={columns.map((item) => ({ ...item }))} - rowKey="id" - dataSource={invoices} - onChange={handleTableChange} - expandable={{ - expandedRowKeys: [selectedInvoice], - onExpand: (expanded, record) => { - handleOnRowClick(expanded ? record : null); - }, - }} - rowSelection={{ - onSelect: (record) => { - handleOnRowClick(record); - }, - selectedRowKeys: [selectedInvoice], - type: "radio", - }} - onRow={(record, rowIndex) => { - return { - onClick: (event) => { - handleOnRowClick(record); - }, // click row - onDoubleClick: (event) => {}, // double click row - onContextMenu: (event) => {}, // right button click row - onMouseEnter: (event) => {}, // mouse enter row - onMouseLeave: (event) => {}, // mouse leave row - }; - }} - /> +
    + + {t("invoices.labels.invoices")} + +
    ( +
    + + +
    + { + search.search = value; + history.push({ search: queryString.stringify(search) }); + }} + /> +
    +
    + )} + scroll={{ x: "50%", y: "40rem" }} + pagination={{ + position: "top", + pageSize: 25, + current: parseInt(page || 1), + total: total, + }} + columns={columns} + rowKey="id" + dataSource={data} + onChange={handleTableChange} + /> + ); } +export default connect(null, mapDispatchToProps)(InvoicesListPage); diff --git a/client/src/pages/invoices/invoices.page.container.jsx b/client/src/pages/invoices/invoices.page.container.jsx index 78a2e4ee3..99376dc59 100644 --- a/client/src/pages/invoices/invoices.page.container.jsx +++ b/client/src/pages/invoices/invoices.page.container.jsx @@ -1,57 +1,63 @@ -import { useQuery } from "@apollo/react-hooks"; -import React from "react"; +import queryString from "query-string"; +import React, { useEffect } from "react"; +import { useQuery } from "react-apollo"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { useLocation } from "react-router-dom"; +import InvoiceDetailEditContainer from "../../components/invoice-detail-edit/invoice-detail-edit.container"; import { QUERY_ALL_INVOICES_PAGINATED } from "../../graphql/invoices.queries"; +import { setBreadcrumbs } from "../../redux/application/application.actions"; import InvoicesPageComponent from "./invoices.page.component"; import AlertComponent from "../../components/alert/alert.component"; -import queryString from "query-string"; -import { useHistory, useLocation } from "react-router-dom"; -export default function InvoicesPageContainer() { - const { loading, error, data, fetchMore } = useQuery( +const mapDispatchToProps = (dispatch) => ({ + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), +}); + +export function InvoicesPageContainer({ setBreadcrumbs }) { + const { t } = useTranslation(); + const searchParams = queryString.parse(useLocation().search); + const { page, sortcolumn, sortorder, search } = searchParams; + + useEffect(() => { + document.title = t("titles.invoices-list"); + setBreadcrumbs([ + { link: "/manage/invoices", label: t("titles.bc.invoices-list") }, + ]); + }, [t, setBreadcrumbs]); + + const { loading, error, data, refetch } = useQuery( QUERY_ALL_INVOICES_PAGINATED, { - variables: { offset: 0, limit: 1 }, + variables: { + search: search || "", + offset: page ? (page - 1) * 25 : 0, + limit: 25, + order: [ + { + [sortcolumn || "date"]: sortorder + ? sortorder === "descend" + ? "desc" + : "asc" + : "desc", + }, + ], + }, } ); - const search = queryString.parse(useLocation().search); - const history = useHistory(); - - const handleOnRowClick = (record) => { - if (record) { - if (record.id) { - search.invoiceid = record.id; - history.push({ search: queryString.stringify(search) }); - } - } else { - delete search.invoiceid; - history.push({ search: queryString.stringify(search) }); - } - }; - - const handleFetchMore = (offset) => { - fetchMore({ - variables: { - offset: offset, - }, - updateQuery: (prev, { fetchMoreResult }) => { - if (!fetchMoreResult) return prev; - return Object.assign({}, prev, { - invoices: [...prev.invoices, ...fetchMoreResult.invoices], - }); - }, - }); - }; if (error) return ; return (
    + +
    ); } +export default connect(null, mapDispatchToProps)(InvoicesPageContainer); diff --git a/client/src/pages/jobs-all/jobs-all.container.jsx b/client/src/pages/jobs-all/jobs-all.container.jsx new file mode 100644 index 000000000..7037fb3a7 --- /dev/null +++ b/client/src/pages/jobs-all/jobs-all.container.jsx @@ -0,0 +1,63 @@ +import { useQuery } from "@apollo/react-hooks"; +import queryString from "query-string"; +import React, { useEffect } from "react"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { useLocation } from "react-router-dom"; +import { createStructuredSelector } from "reselect"; +import AlertComponent from "../../components/alert/alert.component"; +import JobsListPaginated from "../../components/jobs-list-paginated/jobs-list-paginated.component"; +import { QUERY_ALL_JOBS_PAGINATED } from "../../graphql/jobs.queries"; +import { setBreadcrumbs } from "../../redux/application/application.actions"; +import { selectBodyshop } from "../../redux/user/user.selectors"; + +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, +}); + +const mapDispatchToProps = (dispatch) => ({ + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), +}); + +export function AllJobs({ bodyshop, setBreadcrumbs }) { + const searchParams = queryString.parse(useLocation().search); + const { page, sortcolumn, sortorder, search } = searchParams; + + const { loading, error, data, refetch } = useQuery(QUERY_ALL_JOBS_PAGINATED, { + variables: { + search: search || "", + offset: page ? (page - 1) * 25 : 0, + limit: 25, + order: [ + { + [sortcolumn || "est_number"]: sortorder + ? sortorder === "descend" + ? "desc" + : "asc" + : "desc", + }, + ], + }, + }); + const { t } = useTranslation(); + + useEffect(() => { + document.title = t("titles.jobs-all"); + setBreadcrumbs([{ link: "/manage/jobs", label: t("titles.bc.jobs-all") }]); + }, [t, setBreadcrumbs]); + + if (error) return ; + return ( +
    + +
    + ); +} + +export default connect(mapStateToProps, mapDispatchToProps)(AllJobs); diff --git a/client/src/pages/jobs-close/jobs-close.component.jsx b/client/src/pages/jobs-close/jobs-close.component.jsx new file mode 100644 index 000000000..5632986a9 --- /dev/null +++ b/client/src/pages/jobs-close/jobs-close.component.jsx @@ -0,0 +1,148 @@ +import React, { useState } from "react"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import JobsCloseLaborMaterialAllocation from "../../components/jobs-close-labmat-allocation/jobs-close-labmat-allocation.component"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +import JobsClosePartsAllocation from "../../components/jobs-close-parts-allocation/jobs-close-parts-allocation.component"; +import Dinero from "dinero.js"; +import JobsCloseTotals from "../../components/jobs-close-totals/jobs-close-totals.component"; +import JobsCloseAutoAllocate from "../../components/jobs-close-auto-allocate/jobs-close-auto-allocate.component"; +import JobsCloseSaveButton from "../../components/jobs-close-save-button/jobs-close-save-button.component"; +import JobsCloseExportButton from "../../components/jobs-close-export-button/jobs-close-export-button.component"; +import JobsScoreboardAdd from "../../components/job-scoreboard-add-button/job-scoreboard-add-button.component"; + +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, +}); + +export function JobsCloseComponent({ job, bodyshop, jobTotals }) { + const [invoiced, setInvoiced] = useState(!!job.invoice_allocation); + const [labmatAllocations, setLabmatAllocations] = useState( + !!job.invoice_allocation && !!job.invoice_allocation.labMatAllocations + ? Object.keys(job.invoice_allocation.labMatAllocations).reduce( + (acc, val) => { + if (val.includes("subtotal")) { + acc[val] = Dinero(job.invoice_allocation.labMatAllocations[val]); + } else { + acc[val] = { + ...job.invoice_allocation.labMatAllocations[val], + total: Dinero( + job.invoice_allocation.labMatAllocations[val].total + ), + allocations: job.invoice_allocation.labMatAllocations[ + val + ].allocations.map((item) => { + return { ...item, amount: Dinero(item.amount) }; + }), + }; + } + + return acc; + }, + {} + ) + : Object.keys(jobTotals.rates).reduce((acc, val) => { + acc[val] = jobTotals.rates[val]; + if (val.includes("subtotal")) return acc; + //Not a subtotal - therefore can be allocated. + acc[val].allocations = []; + return acc; + }, {}) + ); + + const [partsAllocations, setPartsAllocations] = useState( + !!job.invoice_allocation && !!job.invoice_allocation.partsAllocations + ? Object.keys(job.invoice_allocation.partsAllocations).reduce( + (acc, val) => { + acc[val] = { + ...job.invoice_allocation.partsAllocations[val], + total: Dinero(job.invoice_allocation.partsAllocations[val].total), + allocations: job.invoice_allocation.partsAllocations[ + val + ].allocations.map((item) => { + return { ...item, amount: Dinero(item.amount) }; + }), + }; + return acc; + }, + {} + ) + : { + ...Object.keys(jobTotals.parts.parts.list).reduce((acc, val) => { + acc[val] = { ...jobTotals.parts.parts.list[val], allocations: [] }; + + return acc; + }, {}), + pas: { + ...jobTotals.parts.sublets, + allocations: [], + }, + } + ); + + const labmatAllocatedTotalsArray = Object.keys(labmatAllocations) + .filter((i) => !i.includes("subtotal")) + .map((i) => labmatAllocations[i].allocations) + .flat(); + + const labmatAllocatedTotal = Dinero({ + amount: labmatAllocatedTotalsArray.reduce((acc, val) => { + return (acc = acc + val.amount.getAmount()); + }, 0), + }); + + const partsAllocatedTotalsArray = Object.keys(partsAllocations) + .map((i) => partsAllocations[i].allocations) + .flat(); + + const partsAllocatedTotal = Dinero({ + amount: partsAllocatedTotalsArray.reduce((acc, val) => { + return (acc = acc + val.amount.getAmount()); + }, 0), + }); + + return ( +
    + + + + + + + +
    + ); +} +export default connect(mapStateToProps, null)(JobsCloseComponent); diff --git a/client/src/pages/jobs-close/jobs-close.container.jsx b/client/src/pages/jobs-close/jobs-close.container.jsx new file mode 100644 index 000000000..d82297ec2 --- /dev/null +++ b/client/src/pages/jobs-close/jobs-close.container.jsx @@ -0,0 +1,65 @@ +import { useQuery } from "@apollo/react-hooks"; +import React, { useEffect } from "react"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { useParams } from "react-router-dom"; +import { createStructuredSelector } from "reselect"; +import AlertComponent from "../../components/alert/alert.component"; +import { CalculateJob } from "../../components/job-totals-table/job-totals.utility"; +import LoadingSpinner from "../../components/loading-spinner/loading-spinner.component"; +import { QUERY_JOB_CLOSE_DETAILS } from "../../graphql/jobs.queries"; +import { setBreadcrumbs } from "../../redux/application/application.actions"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +import JobsCloseComponent from "./jobs-close.component"; + +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, +}); + +const mapDispatchToProps = (dispatch) => ({ + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), +}); + +export function JobsCloseContainer({ setBreadcrumbs, bodyshop }) { + const { jobId } = useParams(); + const { loading, error, data } = useQuery(QUERY_JOB_CLOSE_DETAILS, { + variables: { id: jobId }, + }); + const { t } = useTranslation(); + useEffect(() => { + document.title = t("titles.jobs-close", { + number: data ? data.jobs_by_pk.ro_number : null, + }); + + setBreadcrumbs([ + { + link: `/manage/jobs/${jobId}/`, + label: t("titles.bc.jobs"), + }, + { + link: `/manage/jobs/${jobId}/`, + label: t("titles.bc.jobs-detail", { + number: data ? data.jobs_by_pk.ro_number : null, + }), + }, + { + link: `/manage/jobs/${jobId}/close`, + label: t("titles.bc.jobs-close"), + }, + ]); + }, [setBreadcrumbs, t, jobId, data]); + + if (loading) return ; + if (error) return ; + + const jobTotals = CalculateJob(data.jobs_by_pk, bodyshop.shoprates); + return ( +
    + +
    + ); +} +export default connect(mapStateToProps, mapDispatchToProps)(JobsCloseContainer); diff --git a/client/src/pages/jobs-create/jobs-create.component.jsx b/client/src/pages/jobs-create/jobs-create.component.jsx index 33b646fbc..f29d03808 100644 --- a/client/src/pages/jobs-create/jobs-create.component.jsx +++ b/client/src/pages/jobs-create/jobs-create.component.jsx @@ -19,18 +19,18 @@ export default function JobsCreateComponent({ form }) { title: t("jobs.labels.create.vehicleinfo"), content: , validation: !!state.vehicle.new || !!state.vehicle.selectedid, - error: t("vehicles.errors.selectexistingornew") + error: t("vehicles.errors.selectexistingornew"), }, { title: t("jobs.labels.create.ownerinfo"), content: , validation: !!state.owner.new || !!state.owner.selectedid, - error: t("owners.errors.selectexistingornew") + error: t("owners.errors.selectexistingornew"), }, { title: t("jobs.labels.create.jobinfo"), - content: - } + content: , + }, ]; const next = () => { @@ -43,19 +43,15 @@ export default function JobsCreateComponent({ form }) { const ProgressButtons = () => { return ( -
    - {pageIndex > 0 && ( - - )} +
    + {pageIndex > 0 && } {pageIndex < steps.length - 1 && ( @@ -85,7 +81,7 @@ export default function JobsCreateComponent({ form }) { status='success' title={t("jobs.successes.creatednoclick")} subTitle={t("jobs.successes.created_subtitle", { - est_number: state.newJobEstNum + est_number: state.newJobEstNum, })} extra={[ @@ -93,7 +89,7 @@ export default function JobsCreateComponent({ form }) { , - + , ]} />
    @@ -108,7 +104,7 @@ export default function JobsCreateComponent({ form }) { onClick={() => { form .validateFields() - .then(r => { + .then((r) => { if (steps[pageIndex].validation) { setErrorMessage(null); setPageIndex(idx); @@ -116,7 +112,7 @@ export default function JobsCreateComponent({ form }) { setErrorMessage(steps[pageIndex].error); } }) - .catch(error => console.log("error", error)); + .catch((error) => console.log("error", error)); }} /> ))} @@ -130,7 +126,12 @@ export default function JobsCreateComponent({ form }) { ) : null} {steps.map((item, idx) => ( -
    +
    {item.content}
    ))} diff --git a/client/src/pages/jobs-create/jobs-create.container.jsx b/client/src/pages/jobs-create/jobs-create.container.jsx index 7aa4a87b2..f988e513b 100644 --- a/client/src/pages/jobs-create/jobs-create.container.jsx +++ b/client/src/pages/jobs-create/jobs-create.container.jsx @@ -74,6 +74,7 @@ function JobsCreateContainer({ bodyshop, setBreadcrumbs }) { }; const handleFinish = (values) => { + console.log("handleFinish -> values", values); let job = Object.assign( {}, values, @@ -86,13 +87,14 @@ function JobsCreateContainer({ bodyshop, setBreadcrumbs }) { ownerid: state.owner.selectedid || null, }, { - status: bodyshop.md_ro_statuses.default_imported || "Open*", //Pull from redux store. + status: bodyshop.md_ro_statuses.default_imported || "Open*", shopid: bodyshop.id, } ); //TODO Logic to ensure the owner is actually fetched. + console.log("job", job); let ownerData; - if (!!job.owner) { + if (!!!job.ownerid) { ownerData = job.owner.data; ownerData.shopid = bodyshop.id; delete ownerData.allow_text_message; @@ -103,7 +105,7 @@ function JobsCreateContainer({ bodyshop, setBreadcrumbs }) { delete ownerData.id; delete ownerData.__typename; } - if (!!job.vehicle) { + if (!!!job.vehicleid) { delete job.vehicleid; job.vehicle.data.shopid = bodyshop.id; job.plate_no = job.vehicle.data.plate_no; @@ -114,8 +116,6 @@ function JobsCreateContainer({ bodyshop, setBreadcrumbs }) { job.v_make_desc = job.vehicle.data.v_make_desc; job.v_color = job.vehicle.data.v_color; } else { - //Vehicle selected. - job.vehicle.data.shopid = bodyshop.id; job.plate_no = state.vehicle.vehicleObj.plate_no; job.plate_st = state.vehicle.vehicleObj.plate_st; job.v_vin = state.vehicle.vehicleObj.v_vin; @@ -131,7 +131,11 @@ function JobsCreateContainer({ bodyshop, setBreadcrumbs }) { return ( -
    +
    diff --git a/client/src/pages/jobs-detail/jobs-detail.page.component.jsx b/client/src/pages/jobs-detail/jobs-detail.page.component.jsx index 7f71aae0f..227fb89d8 100644 --- a/client/src/pages/jobs-detail/jobs-detail.page.component.jsx +++ b/client/src/pages/jobs-detail/jobs-detail.page.component.jsx @@ -7,6 +7,7 @@ import Icon, { } from "@ant-design/icons"; import { Form, notification, Tabs } from "antd"; import moment from "moment"; +import queryString from "query-string"; import React, { lazy, Suspense } from "react"; import { useTranslation } from "react-i18next"; import { @@ -16,13 +17,13 @@ import { FaRegStickyNote, FaShieldAlt, } from "react-icons/fa"; -import { useHistory, useLocation } from "react-router-dom"; -import LoadingSpinner from "../../components/loading-spinner/loading-spinner.component"; -import queryString from "query-string"; import { connect } from "react-redux"; +import { useHistory, useLocation } from "react-router-dom"; import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; import { CalculateJob } from "../../components/job-totals-table/job-totals.utility"; +import LoadingSpinner from "../../components/loading-spinner/loading-spinner.component"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +import FormFieldsChanged from "../../components/form-fields-changed-alert/form-fields-changed-alert.component"; const JobsLinesContainer = lazy(() => import("../../components/job-detail-lines/job-lines.container") @@ -62,7 +63,6 @@ const JobLineUpsertModalContainer = lazy(() => "../../components/job-lines-upsert-modal/job-lines-upsert-modal.container" ) ); - const JobsDetailPliContainer = lazy(() => import("../../components/jobs-detail-pli/jobs-detail-pli.container") ); @@ -72,6 +72,11 @@ const JobsDetailAuditContainer = lazy(() => const JobsDetailLaborContainer = lazy(() => import("../../components/jobs-detail-labor/jobs-detail-labor.container") ); +const JobReconciliationModal = lazy(() => + import( + "../../components/job-reconciliation-modal/job-reconciliation.modal.container" + ) +); const mapStateToProps = createStructuredSelector({ bodyshop: selectBodyshop, @@ -92,34 +97,33 @@ export function JobsDetailPage({ const search = queryString.parse(useLocation().search); const formItemLayout = { - labelCol: { - xs: { span: 12 }, - sm: { span: 5 }, - }, - wrapperCol: { - xs: { span: 24 }, - sm: { span: 12 }, - }, + layout: "vertical", + // size: "small", }; - const handleFinish = (values) => { + const handleFinish = async (values) => { const newTotals = CalculateJob({ ...job, ...values }, bodyshop.shoprates); - mutationUpdateJob({ + + const result = await mutationUpdateJob({ variables: { jobId: job.id, job: { ...values, - clm_total: newTotals.totals.total_repairs, - owner_owing: newTotals.custPayable.total, - job_totals: newTotals, + clm_total: newTotals.totals.total_repairs.toFormat("0.00"), + owner_owing: newTotals.custPayable.total.toFormat("0.00"), + job_totals: JSON.stringify(newTotals), }, }, - }).then((r) => { + }); + + if (!!!result.errors) { notification["success"]({ message: t("jobs.successes.savetitle"), }); - refetch().then((r) => form.resetFields()); - }); + await refetch(); + form.resetFields(); + form.resetFields(); + } }; return ( @@ -127,11 +131,10 @@ export function JobsDetailPage({ fallback={} > + -
    console.log("a,b", a, b)} name="JobDetailForm" onFinish={handleFinish} {...formItemLayout} @@ -139,32 +142,10 @@ export function JobsDetailPage({ initialValues={{ ...job, loss_date: job.loss_date ? moment(job.loss_date) : null, - date_estimated: job.date_estimated - ? moment(job.date_estimated) - : null, - date_open: job.date_open ? moment(job.date_open) : null, - date_scheduled: job.date_scheduled - ? moment(job.date_scheduled) - : null, - scheduled_in: job.scheduled_in ? moment(job.scheduled_in) : null, - actual_in: job.actual_in ? moment(job.actual_in) : null, - scheduled_completion: job.scheduled_completion - ? moment(job.scheduled_completion) - : null, - actual_completion: job.actual_completion - ? moment(job.actual_completion) - : null, - scheduled_delivery: job.scheduled_delivery - ? moment(job.scheduled_delivery) - : null, - actual_delivery: job.actual_delivery - ? moment(job.actual_delivery) - : null, - date_invoiced: job.date_invoiced ? moment(job.date_invoiced) : null, - date_closed: job.date_closed ? moment(job.date_closed) : null, - date_exported: job.date_exported ? moment(job.date_exported) : null, }} > + + - } + ({ setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), + addRecentItem: (item) => dispatch(addRecentItem(item)), }); -function JobsDetailPageContainer({ match, setBreadcrumbs }) { +function JobsDetailPageContainer({ match, setBreadcrumbs, addRecentItem }) { const { jobId } = match.params; const { t } = useTranslation(); @@ -67,7 +72,19 @@ function JobsDetailPageContainer({ match, setBreadcrumbs }) { }), }, ]); - }, [loading, data, t, error, setBreadcrumbs, jobId]); + + if (data) + addRecentItem( + CreateRecentItem( + jobId, + "job", + `${data.jobs_by_pk.est_number || ""} | ${ + data.jobs_by_pk.ro_number || "" + }`, + `/manage/jobs/${jobId}` + ) + ); + }, [loading, data, t, error, setBreadcrumbs, jobId, addRecentItem]); if (loading) return ; if (error) return ; diff --git a/client/src/pages/jobs-intake/jobs-intake.page.container.jsx b/client/src/pages/jobs-intake/jobs-intake.page.container.jsx new file mode 100644 index 000000000..a83dcc39b --- /dev/null +++ b/client/src/pages/jobs-intake/jobs-intake.page.container.jsx @@ -0,0 +1,64 @@ +import { useQuery } from "@apollo/react-hooks"; +import React, { useEffect } from "react"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { useParams } from "react-router-dom"; +import { createStructuredSelector } from "reselect"; +import AlertComponent from "../../components/alert/alert.component"; +import JobIntakeComponent from "../../components/job-intake/job-intake.component"; +import LoadingSpinner from "../../components/loading-spinner/loading-spinner.component"; +import { QUERY_INTAKE_CHECKLIST } from "../../graphql/bodyshop.queries"; +import { setBreadcrumbs } from "../../redux/application/application.actions"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +const mapStateToProps = createStructuredSelector({ + //currentUser: selectCurrentUser + bodyshop: selectBodyshop, +}); +const mapDispatchToProps = (dispatch) => ({ + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), +}); + +export function JobsIntakeContainer({ bodyshop, setBreadcrumbs }) { + const { t } = useTranslation(); + + const { loading, error, data } = useQuery(QUERY_INTAKE_CHECKLIST, { + variables: { shopId: bodyshop.id }, + }); + const { jobId } = useParams(); + + useEffect(() => { + document.title = t("titles.jobs-intake"); + setBreadcrumbs([ + { link: "/manage/jobs", label: t("titles.bc.jobs") }, + { + link: `/manage/jobs/${jobId}`, + label: t("titles.bc.jobs-detail", { number: "TODO" }), + }, + { + link: `/manage/jobs/${jobId}/intake`, + label: t("titles.bc.jobs-intake"), + }, + ]); + }, [t, setBreadcrumbs, jobId]); + + if (loading) return ; + if (error) return ; + if (data && !!!data.bodyshops_by_pk.intakechecklist) + return ( + + ); + return ( +
    + +
    + ); +} + +export default connect( + mapStateToProps, + mapDispatchToProps +)(JobsIntakeContainer); diff --git a/client/src/pages/jobs/jobs.page.jsx b/client/src/pages/jobs/jobs.page.jsx index fdd2988fb..390b63b7c 100644 --- a/client/src/pages/jobs/jobs.page.jsx +++ b/client/src/pages/jobs/jobs.page.jsx @@ -1,88 +1,30 @@ -import { useQuery } from "@apollo/react-hooks"; -import queryString from "query-string"; -import React, { useEffect, useState } from "react"; +import React, { useEffect } from "react"; import { useTranslation } from "react-i18next"; import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import AlertComponent from "../../components/alert/alert.component"; -import EnterInvoiceModalContainer from "../../components/invoice-enter-modal/invoice-enter-modal.container"; import JobDetailCards from "../../components/job-detail-cards/job-detail-cards.component"; import JobsList from "../../components/jobs-list/jobs-list.component"; -import { QUERY_ALL_ACTIVE_JOBS } from "../../graphql/jobs.queries"; -import { selectBodyshop } from "../../redux/user/user.selectors"; - import { setBreadcrumbs } from "../../redux/application/application.actions"; -const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop, -}); - const mapDispatchToProps = (dispatch) => ({ setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), }); -export function JobsPage({ location, bodyshop, setBreadcrumbs }) { - const { loading, error, data, refetch } = useQuery(QUERY_ALL_ACTIVE_JOBS, { - variables: { - statuses: bodyshop.md_ro_statuses.open_statuses || ["Open"], - }, - }); +export function JobsPage({ setBreadcrumbs }) { const { t } = useTranslation(); useEffect(() => { document.title = t("titles.jobs"); - setBreadcrumbs([{ link: "/manage/jobs", label: t("titles.bc.jobs-active") }]); + setBreadcrumbs([ + { link: "/manage/jobs", label: t("titles.bc.jobs-active") }, + ]); }, [t, setBreadcrumbs]); - const search = queryString.parse(location.search); - const searchTextState = useState(""); - const searchText = searchTextState[0]; - if (error) return ; - return ( -
    - - - (j.ro_number || "") - .toString() - .toLowerCase() - .includes(searchText.toLowerCase()) || - (j.ownr_fn || "") - .toLowerCase() - .includes(searchText.toLowerCase()) || - (j.ownr_ln || "") - .toLowerCase() - .includes(searchText.toLowerCase()) || - (j.clm_no || "") - .toLowerCase() - .includes(searchText.toLowerCase()) || - (j.plate_no || "") - .toLowerCase() - .includes(searchText.toLowerCase()) || - (j.v_model_desc || "") - .toLowerCase() - .includes(searchText.toLowerCase()) || - (j.v_make_desc || "") - .toLowerCase() - .includes(searchText.toLowerCase()) - ) - : null - } - /> - +
    + +
    ); } -export default connect(mapStateToProps, mapDispatchToProps)(JobsPage); +export default connect(null, mapDispatchToProps)(JobsPage); diff --git a/client/src/pages/landing/landing.page.jsx b/client/src/pages/landing/landing.page.jsx index c565e4f58..a7c04163d 100644 --- a/client/src/pages/landing/landing.page.jsx +++ b/client/src/pages/landing/landing.page.jsx @@ -1,19 +1,13 @@ +import { Layout, Typography } from "antd"; import React from "react"; -import { Typography, Layout } from "antd"; - -import HeaderContainer from "../../components/header/header.container"; +import ManageSignInButton from "../../components/manage-sign-in-button/manage-sign-in-button.component"; export default function LandingPage() { - const { Header, Content } = Layout; return ( - -
    - -
    + + - - Welcome to bodyshop.app. - + ImEX.Online ); } diff --git a/client/src/pages/manage-root/manage-root.page.component.jsx b/client/src/pages/manage-root/manage-root.page.component.jsx index 9cecd0e9c..1d15268f2 100644 --- a/client/src/pages/manage-root/manage-root.page.component.jsx +++ b/client/src/pages/manage-root/manage-root.page.component.jsx @@ -1,43 +1,14 @@ import React from "react"; -import DashboardGridComponent from "../../components/dashboard-grid/dashboard-grid.component"; -import Test from "../../components/_test/test.component"; -import { analytics } from "../../firebase/firebase.utils"; - +//import DashboardGridComponent from "../../components/dashboard-grid/dashboard-grid.component"; +import { Redirect } from "react-router-dom"; export default function ManageRootPageComponent() { //const client = useApolloClient(); - return ( -
    - - - - { - // - // Send an Email in new Window - // - } -
    - ); + + return ; + + // return ( + //
    + // + //
    + // ); } diff --git a/client/src/pages/manage-root/manage-root.page.container.jsx b/client/src/pages/manage-root/manage-root.page.container.jsx index ffab7ffd0..2616da67b 100644 --- a/client/src/pages/manage-root/manage-root.page.container.jsx +++ b/client/src/pages/manage-root/manage-root.page.container.jsx @@ -1,11 +1,29 @@ import React, { useEffect } from "react"; -import ManageRootPageComponent from "./manage-root.page.component"; import { useTranslation } from "react-i18next"; -export default function ManageRootPageContainer() { +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { setBreadcrumbs } from "../../redux/application/application.actions"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +import ManageRootPageComponent from "./manage-root.page.component"; + +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, +}); + +const mapDispatchToProps = (dispatch) => ({ + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), +}); + +export function ManageRootPageContainer({ setBreadcrumbs, bodyshop }) { const { t } = useTranslation(); useEffect(() => { document.title = t("titles.manageroot"); - }, [t]); + setBreadcrumbs([]); + }, [t, setBreadcrumbs]); return ; } +export default connect( + mapStateToProps, + mapDispatchToProps +)(ManageRootPageContainer); diff --git a/client/src/pages/manage/manage.page.component.jsx b/client/src/pages/manage/manage.page.component.jsx index a9348e51f..9442f795b 100644 --- a/client/src/pages/manage/manage.page.component.jsx +++ b/client/src/pages/manage/manage.page.component.jsx @@ -1,14 +1,26 @@ +import { Elements } from "@stripe/react-stripe-js"; +import { loadStripe } from "@stripe/stripe-js"; import { BackTop, Layout } from "antd"; import React, { lazy, Suspense, useEffect } from "react"; import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; import { Route, Switch } from "react-router-dom"; +import { createStructuredSelector } from "reselect"; +import { client } from "../../App/App.container"; +import BreadCrumbs from "../../components/breadcrumbs/breadcrumbs.component"; +import ChatAffixContainer from "../../components/chat-affix/chat-affix.container"; +import ConflictComponent from "../../components/conflict/conflict.component"; import ErrorBoundary from "../../components/error-boundary/error-boundary.component"; -import FooterComponent from "../../components/footer/footer.component"; +import FcmNotification from "../../components/fcm-notification/fcm-notification.component"; +//import FooterComponent from "../../components/footer/footer.component"; //Component Imports import HeaderContainer from "../../components/header/header.container"; import LoadingSpinner from "../../components/loading-spinner/loading-spinner.component"; +import PrintCenterModalContainer from "../../components/print-center-modal/print-center-modal.container"; +import { QUERY_STRIPE_ID } from "../../graphql/bodyshop.queries"; +import { selectInstanceConflict } from "../../redux/user/user.selectors"; import "./manage.page.styles.scss"; -import BreadCrumbs from "../../components/breadcrumbs/breadcrumbs.component"; +import TestComponent from "../../components/_test/test.component"; const ManageRootPage = lazy(() => import("../manage-root/manage-root.page.container") @@ -21,9 +33,6 @@ const ProfilePage = lazy(() => import("../profile/profile.container.page")); const JobsAvailablePage = lazy(() => import("../jobs-available/jobs-available.page.container") ); -const ChatDockContainer = lazy(() => - import("../../components/chat-dock/chat-dock.container") -); const ScheduleContainer = lazy(() => import("../schedule/schedule.page.container") ); @@ -68,8 +77,9 @@ const ContractsList = lazy(() => const InvoicesListPage = lazy(() => import("../invoices/invoices.page.container") ); -const InvoiceDetailPage = lazy(() => - import("../invoice-detail/invoice-detail.page.container") + +const JobCostingModal = lazy(() => + import("../../components/job-costing-modal/job-costing-modal.container") ); const EnterInvoiceModalContainer = lazy(() => import("../../components/invoice-enter-modal/invoice-enter-modal.container") @@ -77,9 +87,63 @@ const EnterInvoiceModalContainer = lazy(() => const TimeTicketModalContainer = lazy(() => import("../../components/time-ticket-modal/time-ticket-modal.container") ); -const { Header, Content, Footer } = Layout; +const PaymentModalContainer = lazy(() => + import("../../components/payment-modal/payment-modal.container") +); +const ProductionListPage = lazy(() => + import("../production-list/production-list.container") +); +const ProductionBoardPage = lazy(() => + import("../production-board/production-board.container") +); +const ShopTemplates = lazy(() => + import("../shop-templates/shop-templates.container") +); +const JobIntake = lazy(() => + import("../jobs-intake/jobs-intake.page.container") +); +const AccountingReceivables = lazy(() => + import("../accounting-receivables/accounting-receivables.container") +); +const AccountingPayables = lazy(() => + import("../accounting-payables/accounting-payables.container") +); +const AccountingPayments = lazy(() => + import("../accounting-payments/accounting-payments.container") +); +const AllJobs = lazy(() => import("../jobs-all/jobs-all.container")); +const JobsClose = lazy(() => import("../jobs-close/jobs-close.container")); +const ShopCsiPageContainer = lazy(() => + import("../shop-csi/shop-csi.container.page") +); +const PaymentsAll = lazy(() => + import("../payments-all/payments-all.container.page") +); +const ShiftClock = lazy(() => import("../shift-clock/shift-clock.page")); +const Scoreboard = lazy(() => + import("../scoreboard/scoreboard.page.container") +); +const TimeTicketsAll = lazy(() => + import("../time-tickets/time-tickets.container") +); -export default function Manage({ match }) { +const { Content } = Layout; + +const stripePromise = new Promise((resolve, reject) => { + client.query({ query: QUERY_STRIPE_ID }).then((resp) => { + resolve( + loadStripe(process.env.REACT_APP_STRIPE_PUBLIC_KEY, { + stripeAccount: resp.data.bodyshops[0].stripe_acct_id || "", + }) + ); + }); +}); + +const mapStateToProps = createStructuredSelector({ + conflict: selectInstanceConflict, +}); + +export function Manage({ match, conflict }) { const { t } = useTranslation(); useEffect(() => { @@ -87,35 +151,59 @@ export default function Manage({ match }) { }, [t]); return ( - -
    - -
    - - - + + + + + + + {conflict ? ( + + ) : ( } > + + + + + + + + + + @@ -165,23 +253,26 @@ export default function Manage({ match }) { path={`${match.path}/vehicles`} component={VehiclesContainer} /> + + - - - + + + + + + + + + - - - -
    - -
    - - + )} +
    + + +
    ); } +export default connect(mapStateToProps, null)(Manage); diff --git a/client/src/pages/manage/manage.page.styles.scss b/client/src/pages/manage/manage.page.styles.scss index a4ce5b8b1..3d1c7a378 100644 --- a/client/src/pages/manage/manage.page.styles.scss +++ b/client/src/pages/manage/manage.page.styles.scss @@ -1 +1,11 @@ -.content-container { overflow-y : scroll; } \ No newline at end of file +.content-container { + overflow-y: auto; + margin: 1rem 1rem 0rem 1rem; + padding: 0.25rem 1rem 0rem 1rem; + border-radius: 4px; + background: #fff; +} + +.layout-container { + height: 100vh; +} diff --git a/client/src/pages/mobile-payment/mobile-payment.component.jsx b/client/src/pages/mobile-payment/mobile-payment.component.jsx new file mode 100644 index 000000000..b1738c489 --- /dev/null +++ b/client/src/pages/mobile-payment/mobile-payment.component.jsx @@ -0,0 +1,85 @@ +import { + PaymentRequestButtonElement, + useStripe +} from "@stripe/react-stripe-js"; +import React, { useEffect, useState } from "react"; + +export default function MobilePaymentComponent() { + const stripe = useStripe(); + + const [paymentRequest, setPaymentRequest] = useState(null); + useEffect(() => { + if (stripe) { + console.log("in useeff"); + const pr = stripe.paymentRequest({ + country: "CA", + displayItems: [{ label: "Deductible", amount: 1 }], + currency: "cad", + total: { + label: "Demo total", + amount: 1, + }, + requestPayerName: true, + requestPayerEmail: true, + }); + + console.log("pr", pr); + // Check the availability of the Payment Request API. + pr.canMakePayment().then((result) => { + console.log("result", result); + if (result) { + setPaymentRequest(pr); + } else { + // var details = { + // total: { label: "", amount: { currency: "CAD", value: "0.00" } }, + // }; + // new PaymentRequest( + // [{ supportedMethods: ["basic-card"] }], + // {} + // // details + // ).show(); + } + }); + } + }, [stripe]); + + if (paymentRequest) { + paymentRequest.on("paymentmethod", async (ev) => { + //Call server side to get the client secret + // Confirm the PaymentIntent without handling potential next actions (yet). + const { error: confirmError } = await stripe.confirmCardPayment( + "clientSecret", + { payment_method: ev.paymentMethod.id }, + { handleActions: false } + ); + + if (confirmError) { + // Report to the browser that the payment failed, prompting it to + // re-show the payment interface, or show an error message and close + // the payment interface. + ev.complete("fail"); + } else { + // Report to the browser that the confirmation was successful, prompting + // it to close the browser payment method collection interface. + ev.complete("success"); + // Let Stripe.js handle the rest of the payment flow. + const { error, paymentIntent } = await stripe.confirmCardPayment( + "clientSecret" + ); + if (error) { + // The payment failed -- ask your customer for a new payment method. + } else { + // The payment has succeeded. + console.log('paymentIntent', paymentIntent) + } + } + }); + return ( +
    + +
    + ); + } + + return
    ; +} diff --git a/client/src/pages/mobile-payment/mobile-payment.container.jsx b/client/src/pages/mobile-payment/mobile-payment.container.jsx new file mode 100644 index 000000000..18c36a1cb --- /dev/null +++ b/client/src/pages/mobile-payment/mobile-payment.container.jsx @@ -0,0 +1,23 @@ +import React from "react"; +import MobilePaymentComponent from "./mobile-payment.component"; +import { Elements } from "@stripe/react-stripe-js"; +import { loadStripe } from "@stripe/stripe-js"; + +const stripePromise = new Promise((resolve, reject) => { + resolve( + loadStripe(process.env.REACT_APP_STRIPE_PUBLIC_KEY, { + stripeAccount: "acct_1Fa7lFIEahEZW8b4", + }) + ); +}); + +export default function MobilePaymentContainer() { + return ( +
    + The mobile payment container. + + + +
    + ); +} diff --git a/client/src/pages/owners-detail/owners-detail.page.container.jsx b/client/src/pages/owners-detail/owners-detail.page.container.jsx index 042b7022f..6f5e50343 100644 --- a/client/src/pages/owners-detail/owners-detail.page.container.jsx +++ b/client/src/pages/owners-detail/owners-detail.page.container.jsx @@ -1,17 +1,27 @@ -import React, { useEffect } from "react"; -import OwnersDetailComponent from "./owners-detail.page.component"; -import { useTranslation } from "react-i18next"; import { useQuery } from "@apollo/react-hooks"; -import LoadingSpinner from "../../components/loading-spinner/loading-spinner.component"; -import AlertComponent from "../../components/alert/alert.component"; -import { QUERY_OWNER_BY_ID } from "../../graphql/owners.queries"; +import React, { useEffect } from "react"; +import { useTranslation } from "react-i18next"; import { connect } from "react-redux"; -import { setBreadcrumbs } from "../../redux/application/application.actions"; +import AlertComponent from "../../components/alert/alert.component"; +import LoadingSpinner from "../../components/loading-spinner/loading-spinner.component"; +import { QUERY_OWNER_BY_ID } from "../../graphql/owners.queries"; +import { + addRecentItem, + setBreadcrumbs, +} from "../../redux/application/application.actions"; +import { CreateRecentItem } from "../../utils/create-recent-item"; +import OwnersDetailComponent from "./owners-detail.page.component"; + const mapDispatchToProps = (dispatch) => ({ setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), + addRecentItem: (item) => dispatch(addRecentItem(item)), }); -export function OwnersDetailContainer({ match, setBreadcrumbs }) { +export function OwnersDetailContainer({ + match, + setBreadcrumbs, + addRecentItem, +}) { const { ownerId } = match.params; const { t } = useTranslation(); @@ -42,7 +52,19 @@ export function OwnersDetailContainer({ match, setBreadcrumbs }) { }), }, ]); - }, [setBreadcrumbs, t, data, ownerId]); + + if (data) + addRecentItem( + CreateRecentItem( + ownerId, + "owner", + `${data.owners_by_pk.ownr_fn || ""} ${ + data.owners_by_pk.ownr_ln || "" + } ${data.owners_by_pk.ownr_co_nm || ""}`, + `/manage/owners/${ownerId}` + ) + ); + }, [setBreadcrumbs, t, data, ownerId, addRecentItem]); if (loading) return ; if (error) return ; diff --git a/client/src/pages/payments-all/payments-all.container.page.jsx b/client/src/pages/payments-all/payments-all.container.page.jsx new file mode 100644 index 000000000..4caba08df --- /dev/null +++ b/client/src/pages/payments-all/payments-all.container.page.jsx @@ -0,0 +1,68 @@ +import { useQuery } from "@apollo/react-hooks"; +import queryString from "query-string"; +import React, { useEffect } from "react"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { useLocation } from "react-router-dom"; +import { createStructuredSelector } from "reselect"; +import AlertComponent from "../../components/alert/alert.component"; +import PaymentsListPaginated from "../../components/payments-list-paginated/payment-list-paginated.component"; +import { QUERY_ALL_PAYMENTS_PAGINATED } from "../../graphql/payments.queries"; +import { setBreadcrumbs } from "../../redux/application/application.actions"; +import { selectBodyshop } from "../../redux/user/user.selectors"; + +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, +}); + +const mapDispatchToProps = (dispatch) => ({ + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), +}); + +export function AllJobs({ bodyshop, setBreadcrumbs }) { + const searchParams = queryString.parse(useLocation().search); + const { page, sortcolumn, sortorder, search } = searchParams; + + const { loading, error, data, refetch } = useQuery( + QUERY_ALL_PAYMENTS_PAGINATED, + { + variables: { + search: search || "", + offset: page ? (page - 1) * 25 : 0, + limit: 25, + order: [ + { + [sortcolumn || "created_at"]: sortorder + ? sortorder === "descend" + ? "desc" + : "asc" + : "desc", + }, + ], + }, + } + ); + const { t } = useTranslation(); + + useEffect(() => { + document.title = t("titles.payments-all"); + setBreadcrumbs([ + { link: "/manage/payments", label: t("titles.bc.payments-all") }, + ]); + }, [t, setBreadcrumbs]); + + if (error) return ; + return ( +
    + +
    + ); +} + +export default connect(mapStateToProps, mapDispatchToProps)(AllJobs); diff --git a/client/src/pages/production-board/production-board.component.jsx b/client/src/pages/production-board/production-board.component.jsx new file mode 100644 index 000000000..9b69da414 --- /dev/null +++ b/client/src/pages/production-board/production-board.component.jsx @@ -0,0 +1,6 @@ +import React from "react"; +import ProductionBoardKanbanContainer from "../../components/production-board-kanban/production-board-kanban.container"; + +export default function ProductionBoardComponent() { + return ; +} diff --git a/client/src/pages/production-board/production-board.container.jsx b/client/src/pages/production-board/production-board.container.jsx new file mode 100644 index 000000000..7c336d7c7 --- /dev/null +++ b/client/src/pages/production-board/production-board.container.jsx @@ -0,0 +1,35 @@ +import React, { useEffect } from "react"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { setBreadcrumbs } from "../../redux/application/application.actions"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +import ProductionBoardComponent from "./production-board.component"; + +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, +}); + +const mapDispatchToProps = (dispatch) => ({ + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), +}); + +export function ProductionBoardContainer({ setBreadcrumbs, bodyshop }) { + const { t } = useTranslation(); + + useEffect(() => { + document.title = t("titles.productionboard"); + setBreadcrumbs([ + { + link: "/manage/production/board", + label: t("titles.bc.productionboard"), + }, + ]); + }, [t, setBreadcrumbs]); + + return ; +} +export default connect( + mapStateToProps, + mapDispatchToProps +)(ProductionBoardContainer); diff --git a/client/src/pages/production-list/production-list.component.jsx b/client/src/pages/production-list/production-list.component.jsx new file mode 100644 index 000000000..0049d759c --- /dev/null +++ b/client/src/pages/production-list/production-list.component.jsx @@ -0,0 +1,6 @@ +import React from "react"; +import ProductionListTable from "../../components/production-list-table/production-list-table.container"; + +export default function ProductionListComponent({ columnState }) { + return ; +} diff --git a/client/src/pages/production-list/production-list.container.jsx b/client/src/pages/production-list/production-list.container.jsx new file mode 100644 index 000000000..9633a05bc --- /dev/null +++ b/client/src/pages/production-list/production-list.container.jsx @@ -0,0 +1,36 @@ +import React, { useEffect } from "react"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { setBreadcrumbs } from "../../redux/application/application.actions"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +import ProductionListComponent from "./production-list.component"; + +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, +}); + +const mapDispatchToProps = (dispatch) => ({ + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), +}); + +export function ProductionListContainer({ setBreadcrumbs, bodyshop }) { + const { t } = useTranslation(); + + useEffect(() => { + document.title = t("titles.productionlist"); + setBreadcrumbs([ + { link: "/manage/production/list", label: t("titles.bc.productionlist") }, + ]); + }, [t, setBreadcrumbs]); + + return ( +
    + +
    + ); +} +export default connect( + mapStateToProps, + mapDispatchToProps +)(ProductionListContainer); diff --git a/client/src/pages/reset-password/reset-password.component.jsx b/client/src/pages/reset-password/reset-password.component.jsx new file mode 100644 index 000000000..5dec13d70 --- /dev/null +++ b/client/src/pages/reset-password/reset-password.component.jsx @@ -0,0 +1,15 @@ +import queryString from "query-string"; +import React from "react"; +import { useLocation } from "react-router-dom"; +import UserRequestResetPw from "../../components/user-request-pw-reset/user-request-reset-pw.component"; +import UserValidatePwReset from "../../components/user-validate-pw-reset/user-validate-pw-reset.component"; + +export default function ResetPassword() { + const searchParams = queryString.parse(useLocation().search); + const { mode, oobCode } = searchParams; + console.log("ResetPassword -> mode, oobCode", mode, oobCode); + + if (mode === "resetPassword") + return ; + return ; +} diff --git a/client/src/pages/scoreboard/scoreboard.page.component.jsx b/client/src/pages/scoreboard/scoreboard.page.component.jsx new file mode 100644 index 000000000..2483346fa --- /dev/null +++ b/client/src/pages/scoreboard/scoreboard.page.component.jsx @@ -0,0 +1,10 @@ +import React from "react"; +import ScoreboardDisplay from "../../components/scoreboard-display/scoreboard-display.component"; + +export default function ProductionBoardComponent({ scoreboardSubscription }) { + return ( +
    + +
    + ); +} diff --git a/client/src/pages/scoreboard/scoreboard.page.container.jsx b/client/src/pages/scoreboard/scoreboard.page.container.jsx new file mode 100644 index 000000000..3feffc67e --- /dev/null +++ b/client/src/pages/scoreboard/scoreboard.page.container.jsx @@ -0,0 +1,47 @@ +import React, { useEffect } from "react"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { setBreadcrumbs } from "../../redux/application/application.actions"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +import ScoreboardPageComponent from "./scoreboard.page.component"; +import { useSubscription } from "@apollo/react-hooks"; +import { SUBSCRIPTION_SCOREBOARD } from "../../graphql/scoreboard.queries"; +import moment from "moment"; + +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, +}); + +const mapDispatchToProps = (dispatch) => ({ + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), +}); + +export function ScoreboardContainer({ setBreadcrumbs }) { + const { t } = useTranslation(); + + const scoreboardSubscription = useSubscription(SUBSCRIPTION_SCOREBOARD, { + variables: { + start: moment().startOf("month"), + end: moment().endOf("month"), + }, + }); + + useEffect(() => { + document.title = t("titles.scoreboard"); + setBreadcrumbs([ + { + link: "/manage/scoreboard", + label: t("titles.bc.scoreboard"), + }, + ]); + }, [t, setBreadcrumbs]); + + return ( + + ); +} +export default connect( + mapStateToProps, + mapDispatchToProps +)(ScoreboardContainer); diff --git a/client/src/pages/shift-clock/shift-clock.page.jsx b/client/src/pages/shift-clock/shift-clock.page.jsx new file mode 100644 index 000000000..6458f9f28 --- /dev/null +++ b/client/src/pages/shift-clock/shift-clock.page.jsx @@ -0,0 +1,10 @@ +import React from "react"; +import TimeTicketShift from "../../components/time-ticket-shift/time-ticket-shift.container"; + +export default function ShiftClock() { + return ( +
    + +
    + ); +} diff --git a/client/src/pages/shop-csi/shop-csi.container.page.jsx b/client/src/pages/shop-csi/shop-csi.container.page.jsx new file mode 100644 index 000000000..437ceb6da --- /dev/null +++ b/client/src/pages/shop-csi/shop-csi.container.page.jsx @@ -0,0 +1,79 @@ +import { Row, Col } from "antd"; +import { useQuery } from "@apollo/react-hooks"; +import queryString from "query-string"; +import React, { useEffect } from "react"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { useLocation } from "react-router-dom"; +import { createStructuredSelector } from "reselect"; +import AlertComponent from "../../components/alert/alert.component"; +import CsiResponseFormContainer from "../../components/csi-response-form/csi-response-form.container"; +import CsiResponseListPaginated from "../../components/csi-response-list-paginated/csi-response-list-paginated.component"; +import { QUERY_CSI_RESPONSE_PAGINATED } from "../../graphql/csi.queries"; +import { setBreadcrumbs } from "../../redux/application/application.actions"; +import { selectBodyshop } from "../../redux/user/user.selectors"; + +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, +}); + +const mapDispatchToProps = (dispatch) => ({ + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), +}); + +export function ShopCsiContainer({ bodyshop, setBreadcrumbs }) { + const { t } = useTranslation(); + + const searchParams = queryString.parse(useLocation().search); + const { page, sortcolumn, sortorder } = searchParams; + + const { loading, error, data, refetch } = useQuery( + QUERY_CSI_RESPONSE_PAGINATED, + { + variables: { + //search: search || "", + offset: page ? (page - 1) * 25 : 0, + limit: 25, + order: [ + { + [sortcolumn || "completedon"]: sortorder + ? sortorder === "descend" + ? "desc_nulls_last" + : "asc" + : "desc_nulls_last", + }, + ], + }, + } + ); + + useEffect(() => { + document.title = t("titles.shop-csi"); + setBreadcrumbs([ + { + link: "/manage/shop", + label: t("titles.bc.shop", { shopname: bodyshop.shopname }), + }, + { link: "/manage/shop/csi", label: t("titles.bc.shop-csi") }, + ]); + }, [t, setBreadcrumbs, bodyshop.shopname]); + + if (error) return ; + + return ( + +
    + + + + + + + ); +} +export default connect(mapStateToProps, mapDispatchToProps)(ShopCsiContainer); diff --git a/client/src/pages/shop-templates/shop-templates.container.js b/client/src/pages/shop-templates/shop-templates.container.js new file mode 100644 index 000000000..42729239e --- /dev/null +++ b/client/src/pages/shop-templates/shop-templates.container.js @@ -0,0 +1,47 @@ +import React, { useEffect } from "react"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { setBreadcrumbs } from "../../redux/application/application.actions"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +import ShopTemplatesListContainer from "../../components/shop-templates-list/shop-templates-list.container"; +import ShopTemplateEditor from "../../components/shop-template-editor/shop-template-editor.container"; +import { Row, Col } from "antd"; +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, +}); +const mapDispatchToProps = (dispatch) => ({ + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), +}); + +export function ShopTemplatesContainer({ setBreadcrumbs, bodyshop }) { + const { t } = useTranslation(); + useEffect(() => { + document.title = t("titles.shop-templates"); + setBreadcrumbs([ + { + link: "/manage/shop", + label: t("titles.bc.shop", { shopname: bodyshop.shopname }), + }, + { link: "/manage/shop/templates", label: t("titles.bc.shop-templates") }, + ]); + }, [t, setBreadcrumbs, bodyshop.shopname]); + + return ( + + + + + +
    + +
    + + + ); +} + +export default connect( + mapStateToProps, + mapDispatchToProps +)(ShopTemplatesContainer); diff --git a/client/src/pages/shop-vendor/shop-vendor.page.component.jsx b/client/src/pages/shop-vendor/shop-vendor.page.component.jsx index 551332b15..00eaf3274 100644 --- a/client/src/pages/shop-vendor/shop-vendor.page.component.jsx +++ b/client/src/pages/shop-vendor/shop-vendor.page.component.jsx @@ -2,13 +2,11 @@ import React from "react"; import VendorsListContainer from "../../components/vendors-list/vendors-list.container"; import VendorsFormContainer from "../../components/vendors-form/vendors-form.container"; -export default function ShopVendorPageComponent({ selectedVendorState }) { - //TODO Figure out how to handle the refresh list when saving form - +export default function ShopVendorPageComponent() { return (
    - - + +
    ); } diff --git a/client/src/pages/shop-vendor/shop-vendor.page.container.jsx b/client/src/pages/shop-vendor/shop-vendor.page.container.jsx index abde71a2f..dcec6a3f2 100644 --- a/client/src/pages/shop-vendor/shop-vendor.page.container.jsx +++ b/client/src/pages/shop-vendor/shop-vendor.page.container.jsx @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from "react"; +import React, { useEffect } from "react"; import { useTranslation } from "react-i18next"; import ShopVendorPageComponent from "./shop-vendor.page.component"; @@ -7,12 +7,6 @@ export default function ShopVendorPageContainer() { useEffect(() => { document.title = t("titles.shop_vendors"); }, [t]); - const fetchState = useState(); - const selectedVendorState = useState(); - return ( - - ); + + return ; } diff --git a/client/src/pages/sign-in/sign-in.page.jsx b/client/src/pages/sign-in/sign-in.page.jsx index aa417570a..b8aa829eb 100644 --- a/client/src/pages/sign-in/sign-in.page.jsx +++ b/client/src/pages/sign-in/sign-in.page.jsx @@ -3,14 +3,7 @@ import SignIn from "../../components/sign-in-form/sign-in-form.component"; export default () => { return ( -
    +
    ); diff --git a/client/src/pages/tech-job-clock/tech-job-clock.component.jsx b/client/src/pages/tech-job-clock/tech-job-clock.component.jsx new file mode 100644 index 000000000..db792b98a --- /dev/null +++ b/client/src/pages/tech-job-clock/tech-job-clock.component.jsx @@ -0,0 +1,12 @@ +import React from "react"; +import TechClockInFormContainer from "../../components/tech-job-clock-in-form/tech-job-clock-in-form.container"; +import TechClockedInList from "../../components/tech-job-clocked-in-list/tech-job-clocked-in-list.component"; + +export default function TechClockComponent() { + return ( +
    + + +
    + ); +} diff --git a/client/src/pages/tech-lookup/tech-lookup.container.jsx b/client/src/pages/tech-lookup/tech-lookup.container.jsx new file mode 100644 index 000000000..730370cf1 --- /dev/null +++ b/client/src/pages/tech-lookup/tech-lookup.container.jsx @@ -0,0 +1,12 @@ +import React from "react"; +import TechLookupJobsDrawer from "../../components/tech-lookup-jobs-drawer/tech-lookup-jobs-drawer.component"; +import TechLookupJobsList from "../../components/tech-lookup-jobs-list/tech-lookup-jobs-list.component"; + +export default function TechLookupContainer() { + return ( +
    + + +
    + ); +} diff --git a/client/src/pages/tech-shift-clock/tech-shift-clock.component.jsx b/client/src/pages/tech-shift-clock/tech-shift-clock.component.jsx new file mode 100644 index 000000000..52e0e99c7 --- /dev/null +++ b/client/src/pages/tech-shift-clock/tech-shift-clock.component.jsx @@ -0,0 +1,10 @@ +import React from "react"; +import TimeTicketShift from "../../components/time-ticket-shift/time-ticket-shift.container"; + +export default function TechShiftClock() { + return ( +
    + +
    + ); +} diff --git a/client/src/pages/tech/tech.page.component.jsx b/client/src/pages/tech/tech.page.component.jsx new file mode 100644 index 000000000..95c5c8138 --- /dev/null +++ b/client/src/pages/tech/tech.page.component.jsx @@ -0,0 +1,109 @@ +import { BackTop, Layout } from "antd"; +import React, { lazy, Suspense, useEffect } from "react"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { Redirect, Route, Switch } from "react-router-dom"; +import { createStructuredSelector } from "reselect"; +import ErrorBoundary from "../../components/error-boundary/error-boundary.component"; +import FcmNotification from "../../components/fcm-notification/fcm-notification.component"; +import LoadingSpinner from "../../components/loading-spinner/loading-spinner.component"; +import TechHeader from "../../components/tech-header/tech-header.component"; +import TechSider from "../../components/tech-sider/tech-sider.component"; +import { selectTechnician } from "../../redux/tech/tech.selectors"; +import "./tech.page.styles.scss"; +const TimeTicketModalContainer = lazy(() => + import("../../components/time-ticket-modal/time-ticket-modal.container") +); +const PrintCenterModalContainer = lazy(() => + import("../../components/print-center-modal/print-center-modal.container") +); +const TechLogin = lazy(() => + import("../../components/tech-login/tech-login.component") +); +const TechLookup = lazy(() => import("../tech-lookup/tech-lookup.container")); +const ProductionListPage = lazy(() => + import("../production-list/production-list.container") +); +const ProductionBoardPage = lazy(() => + import("../production-board/production-board.container") +); +const TechJobClock = lazy(() => + import("../tech-job-clock/tech-job-clock.component") +); +const TechShiftClock = lazy(() => + import("../tech-shift-clock/tech-shift-clock.component") +); + +const { Content } = Layout; + +const mapStateToProps = createStructuredSelector({ + technician: selectTechnician, +}); +const mapDispatchToProps = (dispatch) => ({ + //setUserLanguage: language => dispatch(setUserLanguage(language)) +}); + +export function TechPage({ technician, match }) { + const { t } = useTranslation(); + + useEffect(() => { + document.title = t("titles.app"); + }, [t]); + + return ( + + + + {technician ? null : } + + + + + + }> + + + + + + + + + + + + + + + + + + ); +} +export default connect(mapStateToProps, mapDispatchToProps)(TechPage); diff --git a/client/src/pages/tech/tech.page.container.jsx b/client/src/pages/tech/tech.page.container.jsx new file mode 100644 index 000000000..d4446f05b --- /dev/null +++ b/client/src/pages/tech/tech.page.container.jsx @@ -0,0 +1,30 @@ +import { useQuery } from "@apollo/react-hooks"; +import React, { useEffect } from "react"; +import { connect } from "react-redux"; +import AlertComponent from "../../components/alert/alert.component"; +import { QUERY_BODYSHOP } from "../../graphql/bodyshop.queries"; +import { setBodyshop } from "../../redux/user/user.actions"; +import TechPage from "./tech.page.component"; +import LoadingSpinner from "../../components/loading-spinner/loading-spinner.component"; +import { useTranslation } from "react-i18next"; + +const mapDispatchToProps = (dispatch) => ({ + setBodyshop: (bs) => dispatch(setBodyshop(bs)), +}); + +export function TechPageContainer({ setBodyshop, match }) { + const { loading, error, data } = useQuery(QUERY_BODYSHOP, { + fetchPolicy: "network-only", + }); + const { t } = useTranslation(); + useEffect(() => { + if (data) setBodyshop(data.bodyshops[0]); + }, [data, setBodyshop]); + + if (loading) + return ; + if (error) return ; + return ; +} + +export default connect(null, mapDispatchToProps)(TechPageContainer); diff --git a/client/src/pages/tech/tech.page.styles.scss b/client/src/pages/tech/tech.page.styles.scss new file mode 100644 index 000000000..08a7e5817 --- /dev/null +++ b/client/src/pages/tech/tech.page.styles.scss @@ -0,0 +1,9 @@ +.tech-content-container { + overflow-y: auto; + padding: 1rem; + background: #fff; +} + +.tech-layout-container { + height: 100vh; +} diff --git a/client/src/pages/time-tickets/time-tickets.container.jsx b/client/src/pages/time-tickets/time-tickets.container.jsx new file mode 100644 index 000000000..8d5b68f53 --- /dev/null +++ b/client/src/pages/time-tickets/time-tickets.container.jsx @@ -0,0 +1,72 @@ +import { useQuery } from "@apollo/react-hooks"; +import moment from "moment"; +import queryString from "query-string"; +import React, { useEffect } from "react"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { useLocation } from "react-router-dom"; +import { createStructuredSelector } from "reselect"; +import TimeTicketsDatesSelector from "../../components/ticket-tickets-dates-selector/time-tickets-dates-selector.component"; +import TimeTicketList from "../../components/time-ticket-list/time-ticket-list.component"; +import TimeTicketsSummary from "../../components/time-tickets-summary/time-tickets-summary.component"; +import { QUERY_TIME_TICKETS_IN_RANGE } from "../../graphql/timetickets.queries"; +import { setBreadcrumbs } from "../../redux/application/application.actions"; +import AlertComponent from "../../components/alert/alert.component"; + +const mapStateToProps = createStructuredSelector({}); + +const mapDispatchToProps = (dispatch) => ({ + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), +}); + +export function TimeTicketsContainer({ bodyshop, setBreadcrumbs }) { + const { t } = useTranslation(); + useEffect(() => { + document.title = t("titles.timetickets"); + setBreadcrumbs([ + { + link: "/manage/timetickets", + label: t("titles.bc.timetickets"), + }, + ]); + }, [t, setBreadcrumbs]); + + const searchParams = queryString.parse(useLocation().search); + const { start, end } = searchParams; + + const startDate = start + ? moment(start) + : moment().startOf("week").subtract(7, "days"); + const endDate = end ? moment(end) : moment().endOf("week"); + + const { loading, error, data } = useQuery(QUERY_TIME_TICKETS_IN_RANGE, { + variables: { + start: startDate, + end: endDate, + }, + }); + + if (error) return ; + + return ( +
    + + + + +
    + ); +} + +export default connect( + mapStateToProps, + mapDispatchToProps +)(TimeTicketsContainer); diff --git a/client/src/pages/vehicles-detail/vehicles-detail.page.container.jsx b/client/src/pages/vehicles-detail/vehicles-detail.page.container.jsx index 07e2f6126..3cc16a419 100644 --- a/client/src/pages/vehicles-detail/vehicles-detail.page.container.jsx +++ b/client/src/pages/vehicles-detail/vehicles-detail.page.container.jsx @@ -5,16 +5,26 @@ import { QUERY_VEHICLE_BY_ID } from "../../graphql/vehicles.queries"; import LoadingSpinner from "../../components/loading-spinner/loading-spinner.component"; import AlertComponent from "../../components/alert/alert.component"; import { useTranslation } from "react-i18next"; -import { setBreadcrumbs } from "../../redux/application/application.actions"; +import { + setBreadcrumbs, + addRecentItem, +} from "../../redux/application/application.actions"; import { connect } from "react-redux"; +import { CreateRecentItem } from "../../utils/create-recent-item"; const mapDispatchToProps = (dispatch) => ({ setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), + addRecentItem: (item) => dispatch(addRecentItem(item)), }); -export function VehicleDetailContainer({ match, setBreadcrumbs }) { +export function VehicleDetailContainer({ + match, + setBreadcrumbs, + addRecentItem, +}) { const { vehId } = match.params; const { t } = useTranslation(); + const { loading, data, error, refetch } = useQuery(QUERY_VEHICLE_BY_ID, { variables: { id: vehId }, fetchPolicy: "network-only", @@ -39,7 +49,17 @@ export function VehicleDetailContainer({ match, setBreadcrumbs }) { }), }, ]); - }, [t, data, setBreadcrumbs, vehId]); + + if (data) + addRecentItem( + CreateRecentItem( + vehId, + "vehicle", + `${data.vehicles_by_pk.v_vin} | ${data.vehicles_by_pk.v_model_yr} ${data.vehicles_by_pk.v_make_desc} ${data.vehicles_by_pk.v_model_desc}`, + `/manage/vehicles/${vehId}` + ) + ); + }, [t, data, setBreadcrumbs, vehId, addRecentItem]); if (loading) return ; if (error) return ; diff --git a/client/src/redux/application/application.actions.js b/client/src/redux/application/application.actions.js index a3649f769..69ebf671b 100644 --- a/client/src/redux/application/application.actions.js +++ b/client/src/redux/application/application.actions.js @@ -13,3 +13,23 @@ export const setBreadcrumbs = (breadcrumbs) => ({ type: ApplicationActionTypes.SET_BREAD_CRUMBS, payload: breadcrumbs, }); + +export const calculateScheduleLoad = (rangeEnd) => ({ + type: ApplicationActionTypes.CALCULATE_SCHEDULE_LOAD, + payload: rangeEnd, +}); + +export const scheduleLoadSuccess = (load) => ({ + type: ApplicationActionTypes.CALCULATE_SCHEDULE_LOAD_SUCCESS, + payload: load, +}); + +export const scheduleLoadFailure = (error) => ({ + type: ApplicationActionTypes.CALCULATE_SCHEDULE_LOAD_FAILURE, + payload: error, +}); + +export const addRecentItem = (item) => ({ + type: ApplicationActionTypes.ADD_RECENT_ITEM, + payload: item, +}); diff --git a/client/src/redux/application/application.reducer.js b/client/src/redux/application/application.reducer.js index 9bb60326f..b55f4efdd 100644 --- a/client/src/redux/application/application.reducer.js +++ b/client/src/redux/application/application.reducer.js @@ -3,10 +3,49 @@ import ApplicationActionTypes from "./application.types"; const INITIAL_STATE = { loading: false, breadcrumbs: [], + recentItems: [], + scheduleLoad: { + load: {}, + calculating: false, + error: null, + }, }; const applicationReducer = (state = INITIAL_STATE, action) => { switch (action.type) { + case ApplicationActionTypes.ADD_RECENT_ITEM: + return { + ...state, + recentItems: updateRecentItemsArray(state, action.payload), + }; + case ApplicationActionTypes.SET_BREAD_CRUMBS: + return { + ...state, + breadcrumbs: action.payload, + }; + case ApplicationActionTypes.CALCULATE_SCHEDULE_LOAD: + return { + ...state, + scheduleLoad: { ...state.scheduleLoad, calculating: true, error: null }, + }; + case ApplicationActionTypes.CALCULATE_SCHEDULE_LOAD_SUCCESS: + return { + ...state, + scheduleLoad: { + ...state.scheduleLoad, + load: action.payload, + calculating: false, + }, + }; + case ApplicationActionTypes.CALCULATE_SCHEDULE_LOAD_FAILURE: + return { + ...state, + scheduleLoad: { + ...state.scheduleLoad, + calculating: false, + error: action.payload, + }, + }; case ApplicationActionTypes.START_LOADING: return { ...state, @@ -17,14 +56,25 @@ const applicationReducer = (state = INITIAL_STATE, action) => { ...state, loading: false, }; - case ApplicationActionTypes.SET_BREAD_CRUMBS: - return { - ...state, - breadcrumbs: action.payload, - }; + default: return state; } }; export default applicationReducer; + +const updateRecentItemsArray = (state, newItem) => { + //Check to see if the new item is in the list. + const matchingIndex = state.recentItems.findIndex((i) => i.id === newItem.id); + + if (matchingIndex >= 0) { + return [ + newItem, + ...state.recentItems.slice(0, matchingIndex), + ...state.recentItems.slice(matchingIndex + 1, 9), + ]; + } else { + return [newItem, ...state.recentItems.slice(0, 9)]; + } +}; diff --git a/client/src/redux/application/application.sagas.js b/client/src/redux/application/application.sagas.js new file mode 100644 index 000000000..2892bad68 --- /dev/null +++ b/client/src/redux/application/application.sagas.js @@ -0,0 +1,110 @@ +import { all, takeLatest, call, put } from "redux-saga/effects"; +import ApplicationActionTypes from "./application.types"; +import { client } from "../../App/App.container"; +import { QUERY_SCHEDULE_LOAD_DATA } from "../../graphql/appointments.queries"; +import { + scheduleLoadFailure, + scheduleLoadSuccess, +} from "./application.actions"; +import moment from "moment"; + +export function* onCalculateScheduleLoad() { + yield takeLatest( + ApplicationActionTypes.CALCULATE_SCHEDULE_LOAD, + calculateScheduleLoad + ); +} +export function* calculateScheduleLoad({ payload: end }) { + //REMINDER: Moment.js is not immutable. Today WILL change when adjusted. + const today = moment(new Date()).startOf("day"); + try { + const result = yield client.query({ + query: QUERY_SCHEDULE_LOAD_DATA, + variables: { + start: today, + end: end, + }, + }); + + let load = { + productionHoursTotal: + result.data.productionview_aggregate.aggregate.sum.larhrs + + result.data.productionview_aggregate.aggregate.sum.labhrs, + }; + + const { arrJobs, compJobs } = result.data; + + arrJobs.forEach((item) => { + const itemDate = moment(item.scheduled_in).toISOString().substr(0, 10); + if (!!load[itemDate]) { + load[itemDate].hoursIn = + (load[itemDate].hoursIn || 0) + + item.labhrs.aggregate.sum.mod_lb_hrs + + item.larhrs.aggregate.sum.mod_lb_hrs; + load[itemDate].jobsIn.push(item); + } else { + load[itemDate] = { + jobsIn: [], + jobsOut: [], + hoursIn: + item.labhrs.aggregate.sum.mod_lb_hrs + + item.larhrs.aggregate.sum.mod_lb_hrs, + }; + } + }); + + compJobs.forEach((item) => { + const itemDate = moment(item.scheduled_completion) + .toISOString() + .substr(0, 10); + if (!!load[itemDate]) { + load[itemDate].hoursOut = + (load[itemDate].hoursOut || 0) + + item.labhrs.aggregate.sum.mod_lb_hrs + + item.larhrs.aggregate.sum.mod_lb_hrs; + load[itemDate].jobsOut.push(item); + } else { + load[itemDate] = { + hoursOut: + item.labhrs.aggregate.sum.mod_lb_hrs + + item.larhrs.aggregate.sum.mod_lb_hrs, + }; + } + }); + + //Propagate the expected load to each day. + const range = Math.round(moment.duration(end.diff(today)).asDays()); + for (var day = 0; day < range; day++) { + const current = moment(today) + .add(day, "days") + .toISOString() + .substr(0, 10); + const prev = moment(today) + .add(day - 1, "days") + .toISOString() + .substr(0, 10); + if (!!!load[current]) { + load[current] = {}; + } + if (day === 0) { + //Starting on day 1. The load is current. + load[current].expectedLoad = load.productionHoursTotal; + } else { + load[current].expectedLoad = + load[prev].expectedLoad + + (load[current].hoursIn || 0) - + (load[current].hoursOut || 0); + } + } + + yield put(scheduleLoadSuccess(load)); + } catch (error) { + //console.log("Error in sendEmailFailure saga.", error.message); + console.log("error", error); + yield put(scheduleLoadFailure(error)); + } +} + +export function* applicationSagas() { + yield all([call(onCalculateScheduleLoad)]); +} diff --git a/client/src/redux/application/application.selectors.js b/client/src/redux/application/application.selectors.js index 2b931b789..9d38e1f1d 100644 --- a/client/src/redux/application/application.selectors.js +++ b/client/src/redux/application/application.selectors.js @@ -11,3 +11,18 @@ export const selectBreadcrumbs = createSelector( [selectApplication], (application) => application.breadcrumbs ); + +export const selectRecentItems = createSelector( + [selectApplication], + (application) => application.recentItems +); + +export const selectScheduleLoad = createSelector( + [selectApplication], + (application) => application.scheduleLoad.load +); + +export const selectScheduleLoadCalculating = createSelector( + [selectApplication], + (application) => application.scheduleLoad.calculating +); diff --git a/client/src/redux/application/application.types.js b/client/src/redux/application/application.types.js index 520db6749..0f46f9545 100644 --- a/client/src/redux/application/application.types.js +++ b/client/src/redux/application/application.types.js @@ -2,5 +2,9 @@ const ApplicationActionTypes = { START_LOADING: "START_LOADING", END_LOADING: "END_LOADING", SET_BREAD_CRUMBS: "SET_BREAD_CRUMBS", + CALCULATE_SCHEDULE_LOAD: "CALCULATE_SCHEDULE_LOAD", + CALCULATE_SCHEDULE_LOAD_SUCCESS: "CALCULATE_SCHEDULE_LOAD_SUCCESS", + CALCULATE_SCHEDULE_LOAD_FAILURE: "CALCULATE_SCHEDULE_LOAD_FAILURE", + ADD_RECENT_ITEM: "ADD_RECENT_ITEM", }; export default ApplicationActionTypes; diff --git a/client/src/redux/email/email.sagas.js b/client/src/redux/email/email.sagas.js index a7b562d48..a9b1a250a 100644 --- a/client/src/redux/email/email.sagas.js +++ b/client/src/redux/email/email.sagas.js @@ -1,51 +1,66 @@ -import { all, call, put, takeLatest } from "redux-saga/effects"; -import { sendEmailFailure, sendEmailSuccess } from "./email.actions"; -import EmailActionTypes from "./email.types"; -import axios from "axios"; +import { all } from "redux-saga/effects"; +// import { sendEmailFailure, sendEmailSuccess } from "./email.actions"; +// import { renderTemplate } from "../application/application.actions"; +// import EmailActionTypes from "./email.types"; +// import axios from "axios"; -export function* onSendEmail() { - yield takeLatest(EmailActionTypes.SEND_EMAIL, sendEmail); -} -export function* sendEmail(payload) { - try { - console.log("Sending thta email", payload); - axios.post("/sendemail", payload).then(response => { - console.log(JSON.stringify(response)); - put(sendEmailSuccess()); - }); - } catch (error) { - console.log("Error in sendEmail saga."); - yield put(sendEmailFailure(error.message)); - } -} +// export function* onSendEmail() { +// yield takeLatest(EmailActionTypes.SEND_EMAIL, sendEmail); +// } +// export function* sendEmail(payload) { +// try { +// console.log("Sending thta email", payload); +// axios.post("/sendemail", payload).then(response => { +// console.log(JSON.stringify(response)); +// put(sendEmailSuccess()); +// }); +// } catch (error) { +// console.log("Error in sendEmail saga."); +// yield put(sendEmailFailure(error.message)); +// } +// } -export function* onSendEmailSuccess() { - yield takeLatest(EmailActionTypes.SEND_EMAIL_SUCCESS, sendEmailSuccessSaga); -} -export function* sendEmailSuccessSaga() { - try { - console.log("Send email success."); - } catch (error) { - console.log("Error in sendEmailSuccess saga."); - yield put(sendEmailFailure(error.message)); - } -} +// export function* onSendEmailSuccess() { +// yield takeLatest(EmailActionTypes.SEND_EMAIL_SUCCESS, sendEmailSuccessSaga); +// } +// export function* sendEmailSuccessSaga() { +// try { +// console.log("Send email success."); +// } catch (error) { +// console.log("Error in sendEmailSuccess saga."); +// yield put(sendEmailFailure(error.message)); +// } +// } -export function* onSendEmailFailure() { - yield takeLatest(EmailActionTypes.SEND_EMAIL_FAILURE, sendEmailFailureSaga); -} -export function* sendEmailFailureSaga(error) { - try { - yield console.log(error); - } catch (error) { - console.log("Error in sendEmailFailure saga.", error.message); - } -} +// export function* onSendEmailFailure() { +// yield takeLatest(EmailActionTypes.SEND_EMAIL_FAILURE, sendEmailFailureSaga); +// } +// export function* sendEmailFailureSaga(error) { +// try { +// yield console.log(error); +// } catch (error) { +// console.log("Error in sendEmailFailure saga.", error.message); +// } +//} + +// export function* onSetEmailOptions() { +// yield takeLatest(EmailActionTypes.SET_EMAIL_OPTIONS, setEmailOptions); +// } +// export function* setEmailOptions({ payload: { template } }) { +// console.log("function*setEmailOptions -> template", template); + +// try { +// yield put(renderTemplate(template)); +// } catch (error) { +// console.log("Error in setEmailOptions saga.", error.message); +// } +// } export function* emailSagas() { yield all([ - call(onSendEmail), - call(onSendEmailFailure), - call(onSendEmailSuccess) + // call(onSendEmail), + // call(onSendEmailFailure), + // call(onSendEmailSuccess) + //call(onSetEmailOptions), ]); } diff --git a/client/src/redux/messaging/messaging.actions.js b/client/src/redux/messaging/messaging.actions.js index dfa0f7748..f53b5c468 100644 --- a/client/src/redux/messaging/messaging.actions.js +++ b/client/src/redux/messaging/messaging.actions.js @@ -1,36 +1,35 @@ import MessagingActionTypes from "./messaging.types"; export const toggleChatVisible = () => ({ - type: MessagingActionTypes.TOGGLE_CHAT_VISIBLE + type: MessagingActionTypes.TOGGLE_CHAT_VISIBLE, //payload: user }); -export const toggleConversationVisible = conversationId => ({ - type: MessagingActionTypes.TOGGLE_CONVERSATION_VISIBLE, - payload: conversationId -}); - -export const openConversation = phone => ({ - type: MessagingActionTypes.OPEN_CONVERSATION, - payload: phone -}); - -export const closeConversation = phone => ({ - type: MessagingActionTypes.CLOSE_CONVERSATION, - payload: phone -}); - -export const sendMessage = message => ({ +export const sendMessage = (message) => ({ type: MessagingActionTypes.SEND_MESSAGE, - payload: message + payload: message, }); -export const sendMessageSuccess = message => ({ +export const sendMessageSuccess = (message) => ({ type: MessagingActionTypes.SEND_MESSAGE_SUCCESS, - payload: message + payload: message, }); -export const sendMessageFailure = error => ({ +export const sendMessageFailure = (error) => ({ type: MessagingActionTypes.SEND_MESSAGE_FAILURE, - payload: error + payload: error, }); +export const setSelectedConversation = (conversationId) => ({ + type: MessagingActionTypes.SET_SELECTED_CONVERSATION, + payload: conversationId, +}); + +export const openChatByPhone = (phoneNumber) => ({ + type: MessagingActionTypes.OPEN_CHAT_BY_PHONE, + payload: phoneNumber, +}); + +export const setMessage = (message) => ({ + type: MessagingActionTypes.SET_MESSAGE, + payload: message, +}); \ No newline at end of file diff --git a/client/src/redux/messaging/messaging.reducer.js b/client/src/redux/messaging/messaging.reducer.js index 7fcfaa2b7..e43bad872 100644 --- a/client/src/redux/messaging/messaging.reducer.js +++ b/client/src/redux/messaging/messaging.reducer.js @@ -2,104 +2,44 @@ import MessagingActionTypes from "./messaging.types"; const INITIAL_STATE = { visible: false, - unread: 0, - conversations: [ - // { - // phone_num: "6049992002", - // id: "519ba10d-6467-4fa5-9c22-59ae891edeb6", - // open: false, - // isSending: false, - // sendingError: null - // }, - // { - // phone_num: "6049992991", - // id: "ab57deba-eeb9-40db-b5ae-23f3ce8d7c7b", - // open: false, - // isSending: false, - // sendingError: null - // } - ], + selectedConversationId: null, + isSending: false, error: null, + message: null, }; const messagingReducer = (state = INITIAL_STATE, action) => { switch (action.type) { + case MessagingActionTypes.SET_MESSAGE: + return { ...state, message: action.payload }; case MessagingActionTypes.TOGGLE_CHAT_VISIBLE: return { ...state, visible: !state.visible, }; - case MessagingActionTypes.SET_CHAT_VISIBLE: + case MessagingActionTypes.SET_SELECTED_CONVERSATION: return { ...state, visible: true, + selectedConversationId: action.payload, }; case MessagingActionTypes.SEND_MESSAGE: return { ...state, - conversations: state.conversations.map((c) => - c.id === action.payload.conversationid ? { ...c, isSending: true } : c - ), + error: null, + isSending: true, }; case MessagingActionTypes.SEND_MESSAGE_SUCCESS: return { ...state, - conversations: state.conversations.map((c) => - c.id === action.payload.conversationid - ? { ...c, isSending: false } - : c - ), + message: "", + isSending: false, }; case MessagingActionTypes.SEND_MESSAGE_FAILURE: return { ...state, - conversations: state.conversations.map((c) => - c.id === action.payload.conversationid - ? { ...c, isSending: false, sendingError: action.payload.error } - : c - ), + error: action.payload, }; - case MessagingActionTypes.OPEN_CONVERSATION: - if ( - state.conversations.find( - (c) => c.phone_num === action.payload.phone_num - ) - ) - return { - ...state, - conversations: state.conversations.map((c) => - c.phone_num === action.payload.phone_num ? { ...c, open: true } : c - ), - }; - else - return { - ...state, - conversations: [ - ...state.conversations, - { - phone_num: action.payload.phone_num, - id: action.payload.id, - open: true, - isSending: false, - sendingError: null, - }, - ], - }; - case MessagingActionTypes.CLOSE_CONVERSATION: - return { - ...state, - conversations: state.conversations.filter( - (c) => c.phone_num !== action.payload - ), - }; - case MessagingActionTypes.TOGGLE_CONVERSATION_VISIBLE: - return { - ...state, - conversations: state.conversations.map((c) => - c.id === action.payload ? { ...c, open: !c.open } : c - ), - }; - default: return state; } diff --git a/client/src/redux/messaging/messaging.sagas.js b/client/src/redux/messaging/messaging.sagas.js index f167b42f6..a63a9e065 100644 --- a/client/src/redux/messaging/messaging.sagas.js +++ b/client/src/redux/messaging/messaging.sagas.js @@ -1,19 +1,93 @@ -import { all, call, put, takeLatest } from "redux-saga/effects"; -import { sendMessageFailure, sendMessageSuccess } from "./messaging.actions"; -import MessagingActionTypes from "./messaging.types"; import axios from "axios"; -import { sendEmailFailure } from "../email/email.actions"; +import phone from "phone"; +import { all, call, put, select, takeLatest } from "redux-saga/effects"; +import { client } from "../../App/App.container"; +import { logImEXEvent } from "../../firebase/firebase.utils"; +import { + CONVERSATION_ID_BY_PHONE, + CREATE_CONVERSATION, +} from "../../graphql/conversations.queries"; +import { INSERT_CONVERSATION_TAG } from "../../graphql/job-conversations.queries"; +import { selectBodyshop } from "../user/user.selectors"; +import { + sendMessageFailure, + sendMessageSuccess, + setSelectedConversation, +} from "./messaging.actions"; +import MessagingActionTypes from "./messaging.types"; + +export function* onToggleChatVisible() { + yield takeLatest(MessagingActionTypes.TOGGLE_CHAT_VISIBLE, toggleChatLogging); +} +export function* toggleChatLogging() { + try { + yield logImEXEvent("messaging_toggle_popup"); + } catch (error) { + console.log("Error in sendMessage saga.", error); + } +} +export function* onOpenChatByPhone() { + yield takeLatest(MessagingActionTypes.OPEN_CHAT_BY_PHONE, openChatByPhone); +} +export function* openChatByPhone({ payload }) { + logImEXEvent("messaging_open_by_phone"); + const { phone_num, jobid } = payload; + const bodyshop = yield select(selectBodyshop); + try { + const { + data: { conversations }, + } = yield client.query({ + query: CONVERSATION_ID_BY_PHONE, + variables: { phone: phone(phone_num)[0] }, + }); + if (conversations.length === 0) { + const { + data: { + insert_conversations: { returning: newConversationsId }, + }, + } = yield client.mutate({ + mutation: CREATE_CONVERSATION, + variables: { + conversation: [ + { + phone_num: phone(phone_num)[0], + bodyshopid: bodyshop.id, + job_conversations: jobid ? { data: { jobid: jobid } } : null, + }, + ], + }, + }); + yield put(setSelectedConversation(newConversationsId[0].id)); + } else if (conversations.length === 1) { + //got the ID. Open it. + yield put(setSelectedConversation(conversations[0].id)); + yield client.mutate({ + mutation: INSERT_CONVERSATION_TAG, + variables: { + conversationId: conversations[0].id, + jobId: jobid, + }, + }); + } else { + console.log("ERROR: Multiple conversations found. "); //TODO Graceful handling of this situation + } + } catch (error) { + console.log("Error in sendMessage saga.", error); + } +} export function* onSendMessage() { yield takeLatest(MessagingActionTypes.SEND_MESSAGE, sendMessage); } export function* sendMessage({ payload }) { try { + yield logImEXEvent("messaging_send_message"); + const response = yield call(axios.post, "/sms/send", payload); if (response.status === 200) { yield put(sendMessageSuccess(payload)); } else { - yield put(sendEmailFailure(response.data)); + yield put(sendMessageFailure(response.data)); } } catch (error) { console.log("Error in sendMessage saga.", error); @@ -22,5 +96,9 @@ export function* sendMessage({ payload }) { } export function* messagingSagas() { - yield all([call(onSendMessage)]); + yield all([ + call(onSendMessage), + call(onOpenChatByPhone), + call(onToggleChatVisible), + ]); } diff --git a/client/src/redux/messaging/messaging.selectors.js b/client/src/redux/messaging/messaging.selectors.js index b47f6743c..c46c20d74 100644 --- a/client/src/redux/messaging/messaging.selectors.js +++ b/client/src/redux/messaging/messaging.selectors.js @@ -1,13 +1,28 @@ import { createSelector } from "reselect"; -const selectMessaging = state => state.messaging; +const selectMessaging = (state) => state.messaging; export const selectChatVisible = createSelector( [selectMessaging], - messaging => messaging.visible + (messaging) => messaging.visible ); -export const selectConversations = createSelector( +export const selectIsSending = createSelector( [selectMessaging], - messaging => messaging.conversations + (messaging) => messaging.isSending +); + +export const selectError = createSelector( + [selectMessaging], + (messaging) => messaging.error +); + +export const selectSelectedConversation = createSelector( + [selectMessaging], + (messaging) => messaging.selectedConversationId +); + +export const selectMessage = createSelector( + [selectMessaging], + (messaging) => messaging.message ); diff --git a/client/src/redux/messaging/messaging.types.js b/client/src/redux/messaging/messaging.types.js index 59a35590a..084ed08c7 100644 --- a/client/src/redux/messaging/messaging.types.js +++ b/client/src/redux/messaging/messaging.types.js @@ -1,11 +1,10 @@ const MessagingActionTypes = { TOGGLE_CHAT_VISIBLE: "TOGGLE_CHAT_VISIBLE", - SET_CHAT_VISIBLE: "SET_CHAT_VISIBLE", - OPEN_CONVERSATION: "OPEN_CONVERSATION", - CLOSE_CONVERSATION: "CLOSE_CONVERSATION", - TOGGLE_CONVERSATION_VISIBLE: "TOGGLE_CONVERSATION_VISIBLE", SEND_MESSAGE: "SEND_MESSAGE", SEND_MESSAGE_SUCCESS: "SEND_MESSAGE_SUCCESS", - SEND_MESSAGE_FAILURE: "SEND_MESSAGE_FAILURE" + SEND_MESSAGE_FAILURE: "SEND_MESSAGE_FAILURE", + SET_SELECTED_CONVERSATION: "SET_SELECTED_CONVERSATION", + OPEN_CHAT_BY_PHONE: "OPEN_CHAT_BY_PHONE", + SET_MESSAGE: "SET_MESSAGE", }; export default MessagingActionTypes; diff --git a/client/src/redux/modals/modals.reducer.js b/client/src/redux/modals/modals.reducer.js index 1520b4989..b1ae26315 100644 --- a/client/src/redux/modals/modals.reducer.js +++ b/client/src/redux/modals/modals.reducer.js @@ -16,11 +16,16 @@ const INITIAL_STATE = { schedule: { ...baseModal }, partsOrder: { ...baseModal }, timeTicket: { ...baseModal }, + printCenter: { ...baseModal }, + reconciliation: { ...baseModal }, + payment: { ...baseModal }, + jobCosting: { ...baseModal }, }; const modalsReducer = (state = INITIAL_STATE, action) => { switch (action.type) { case ModalsActionTypes.TOGGLE_MODAL_VISIBLE: + //logImEXEvent("redux_toggle_modal_visible", { modal: action.payload }); return { ...state, [action.payload]: { @@ -29,6 +34,8 @@ const modalsReducer = (state = INITIAL_STATE, action) => { }, }; case ModalsActionTypes.SET_MODAL_CONTEXT: + // logImEXEvent("redux_set_modal_context", { modal: action.payload.modal }); + return { ...state, [action.payload.modal]: { diff --git a/client/src/redux/modals/modals.selectors.js b/client/src/redux/modals/modals.selectors.js index 9f40c9f83..0697a8145 100644 --- a/client/src/redux/modals/modals.selectors.js +++ b/client/src/redux/modals/modals.selectors.js @@ -1,38 +1,57 @@ import { createSelector } from "reselect"; -const selectModals = state => state.modals; +const selectModals = (state) => state.modals; export const selectJobLineEditModal = createSelector( [selectModals], - modals => modals.jobLineEdit + (modals) => modals.jobLineEdit ); export const selectInvoiceEnterModal = createSelector( [selectModals], - modals => modals.invoiceEnter + (modals) => modals.invoiceEnter ); export const selectCourtesyCarReturn = createSelector( [selectModals], - modals => modals.courtesyCarReturn + (modals) => modals.courtesyCarReturn ); export const selectNoteUpsert = createSelector( [selectModals], - modals => modals.noteUpsert + (modals) => modals.noteUpsert ); export const selectSchedule = createSelector( [selectModals], - modals => modals.schedule + (modals) => modals.schedule ); export const selectPartsOrder = createSelector( [selectModals], - modals => modals.partsOrder + (modals) => modals.partsOrder ); export const selectTimeTicket = createSelector( [selectModals], - modals => modals.timeTicket -); \ No newline at end of file + (modals) => modals.timeTicket +); + +export const selectPrintCenter = createSelector( + [selectModals], + (modals) => modals.printCenter +); + +export const selectReconciliation = createSelector( + [selectModals], + (modals) => modals.reconciliation +); +export const selectPayment = createSelector( + [selectModals], + (modals) => modals.payment +); + +export const selectJobCosting = createSelector( + [selectModals], + (modals) => modals.jobCosting +); diff --git a/client/src/redux/root.reducer.js b/client/src/redux/root.reducer.js index 4d8b164e1..973ef8656 100644 --- a/client/src/redux/root.reducer.js +++ b/client/src/redux/root.reducer.js @@ -1,17 +1,20 @@ import { combineReducers } from "redux"; import { persistReducer } from "redux-persist"; import storage from "redux-persist/lib/storage"; +import { withReduxStateSync } from "redux-state-sync"; import userReducer from "./user/user.reducer"; import messagingReducer from "./messaging/messaging.reducer"; import emailReducer from "./email/email.reducer"; import modalsReducer from "./modals/modals.reducer"; import applicationReducer from "./application/application.reducer"; +import techReducer from "./tech/tech.reducer"; + const persistConfig = { key: "root", storage, - //whitelist: ["user"] - blacklist: ["user", "email", "messaging", "modals"] + whitelist: ["messaging", "tech", "application"], + blacklist: ["user", "email", "modals"], }; const rootReducer = combineReducers({ @@ -19,7 +22,8 @@ const rootReducer = combineReducers({ messaging: messagingReducer, email: emailReducer, modals: modalsReducer, - application: applicationReducer + application: applicationReducer, + tech: techReducer, }); -export default persistReducer(persistConfig, rootReducer); +export default withReduxStateSync(persistReducer(persistConfig, rootReducer)); diff --git a/client/src/redux/root.saga.js b/client/src/redux/root.saga.js index ce288b568..d18dd9d9c 100644 --- a/client/src/redux/root.saga.js +++ b/client/src/redux/root.saga.js @@ -4,7 +4,16 @@ import { userSagas } from "./user/user.sagas"; import { messagingSagas } from "./messaging/messaging.sagas"; import { emailSagas } from "./email/email.sagas"; import { modalsSagas } from "./modals/modals.sagas"; +import { applicationSagas } from "./application/application.sagas"; +import { techSagas } from "./tech/tech.sagas"; + export default function* rootSaga() { - yield all([call(userSagas), call(messagingSagas), call(emailSagas), - call(modalsSagas)]); + yield all([ + call(userSagas), + call(messagingSagas), + call(emailSagas), + call(modalsSagas), + call(applicationSagas), + call(techSagas), + ]); } diff --git a/client/src/redux/store.js b/client/src/redux/store.js index 0dfd35ffa..a5399c211 100644 --- a/client/src/redux/store.js +++ b/client/src/redux/store.js @@ -2,11 +2,24 @@ import { createStore, applyMiddleware, compose } from "redux"; import { persistStore } from "redux-persist"; import { createLogger } from "redux-logger"; import createSagaMiddleware from "redux-saga"; +import { + createStateSyncMiddleware, + initMessageListener, +} from "redux-state-sync"; + import rootReducer from "./root.reducer"; import rootSaga from "./root.saga"; const sagaMiddleWare = createSagaMiddleware(); -const middlewares = [sagaMiddleWare]; + +const reduxSyncConfig = { + whitelist: ["ADD_RECENT_ITEM", "SET_SHOP_DETAILS"], +}; + +const middlewares = [ + sagaMiddleWare, + createStateSyncMiddleware(reduxSyncConfig), +]; if (process.env.NODE_ENV === "development") { middlewares.push(createLogger({ collapsed: true, diff: true })); } @@ -25,6 +38,7 @@ const enhancer = composeEnhancers( export const store = createStore(rootReducer, enhancer); sagaMiddleWare.run(rootSaga); +initMessageListener(store); export const persistor = persistStore(store); diff --git a/client/src/redux/tech/tech.actions.js b/client/src/redux/tech/tech.actions.js new file mode 100644 index 000000000..03005ad47 --- /dev/null +++ b/client/src/redux/tech/tech.actions.js @@ -0,0 +1,20 @@ +import TechActionTypes from "./tech.types"; + +export const techLoginStart = ({ employeeid, pin }) => ({ + type: TechActionTypes.TECH_LOGIN_START, + payload: { employeeid, pin }, +}); + +export const techLoginSuccess = (tech) => ({ + type: TechActionTypes.TECH_LOGIN_SUCCESS, + payload: tech, +}); + +export const techLoginFailure = (error) => ({ + type: TechActionTypes.TECH_LOGIN_FAILURE, + payload: error, +}); + +export const techLogout = () => ({ + type: TechActionTypes.TECH_LOGOUT, +}); diff --git a/client/src/redux/tech/tech.reducer.js b/client/src/redux/tech/tech.reducer.js new file mode 100644 index 000000000..3a2429299 --- /dev/null +++ b/client/src/redux/tech/tech.reducer.js @@ -0,0 +1,44 @@ +import TechActionTypes from "./tech.types"; +const INITIAL_STATE = { + technician: null, + // technician: { + // employee_number: "101", + // first_name: "***HARDCODED", + // last_name: "IN REDUCER***", + // }, + loginLoading: false, + loginError: null, +}; + +const applicationReducer = (state = INITIAL_STATE, action) => { + switch (action.type) { + case TechActionTypes.TECH_LOGOUT: + return { + ...state, + technician: null, + }; + case TechActionTypes.TECH_LOGIN_START: + return { + ...state, + loginLoading: true, + }; + case TechActionTypes.TECH_LOGIN_SUCCESS: + return { + ...state, + technician: action.payload, + loginLoading: false, + loginError: false, + }; + case TechActionTypes.TECH_LOGIN_FAILURE: + return { + ...state, + loginError: action.payload, + loginLoading: false, + }; + + default: + return state; + } +}; + +export default applicationReducer; diff --git a/client/src/redux/tech/tech.sagas.js b/client/src/redux/tech/tech.sagas.js new file mode 100644 index 000000000..74f797e99 --- /dev/null +++ b/client/src/redux/tech/tech.sagas.js @@ -0,0 +1,36 @@ +import axios from "axios"; +import { all, call, put, select, takeLatest } from "redux-saga/effects"; +import { selectBodyshop } from "../user/user.selectors"; +import { techLoginFailure, techLoginSuccess } from "./tech.actions"; +import TechActionTypes from "./tech.types"; +import { logImEXEvent } from "../../firebase/firebase.utils"; + +export function* onSignInStart() { + yield takeLatest(TechActionTypes.TECH_LOGIN_START, signInStart); +} +export function* signInStart({ payload: { employeeid, pin } }) { + try { + logImEXEvent("redux_tech_sign_in"); + + const bodyshop = yield select(selectBodyshop); + const response = yield call(axios.post, "/tech/login", { + shopid: bodyshop.id, + employeeid: employeeid, + pin: pin, + }); + + const { valid, technician, error } = response.data; + + if (valid) { + yield put(techLoginSuccess(technician)); + } else { + yield put(techLoginFailure(error)); + } + } catch (error) { + yield put(techLoginFailure(error)); + } +} + +export function* techSagas() { + yield all([call(onSignInStart)]); +} diff --git a/client/src/redux/tech/tech.selectors.js b/client/src/redux/tech/tech.selectors.js new file mode 100644 index 000000000..ae1d6514b --- /dev/null +++ b/client/src/redux/tech/tech.selectors.js @@ -0,0 +1,16 @@ +import { createSelector } from "reselect"; + +const selectTechReducer = (state) => state.tech; + +export const selectTechnician = createSelector( + [selectTechReducer], + (application) => application.technician +); +export const selectLoginError = createSelector( + [selectTechReducer], + (application) => application.loginError +); +export const selectLoginLoading = createSelector( + [selectTechReducer], + (application) => application.loginLoading +); diff --git a/client/src/redux/tech/tech.types.js b/client/src/redux/tech/tech.types.js new file mode 100644 index 000000000..4a0404759 --- /dev/null +++ b/client/src/redux/tech/tech.types.js @@ -0,0 +1,7 @@ +const TechActionTypes = { + TECH_LOGIN_START: "TECH_LOGIN_START", + TECH_LOGIN_SUCCESS: "TECH_LOGIN_SUCCESS", + TECH_LOGIN_FAILURE: "TECH_LOGIN_FAILURE", + TECH_LOGOUT: "TECH_LOGOUT", +}; +export default TechActionTypes; diff --git a/client/src/redux/user/user.actions.js b/client/src/redux/user/user.actions.js index 2d6989122..ddd7c0f95 100644 --- a/client/src/redux/user/user.actions.js +++ b/client/src/redux/user/user.actions.js @@ -1,55 +1,100 @@ import UserActionTypes from "./user.types"; -export const signInSuccess = user => ({ +export const signInSuccess = (user) => ({ type: UserActionTypes.SIGN_IN_SUCCESS, - payload: user + payload: user, }); -export const signInFailure = errorMsg => ({ +export const signInFailure = (errorMsg) => ({ type: UserActionTypes.SIGN_IN_FAILURE, - payload: errorMsg + payload: errorMsg, }); -export const emailSignInStart = emailAndPassword => ({ +export const emailSignInStart = (emailAndPassword) => ({ type: UserActionTypes.EMAIL_SIGN_IN_START, - payload: emailAndPassword + payload: emailAndPassword, }); export const checkUserSession = () => ({ - type: UserActionTypes.CHECK_USER_SESSION + type: UserActionTypes.CHECK_USER_SESSION, }); export const signOutStart = () => ({ - type: UserActionTypes.SIGN_OUT_START + type: UserActionTypes.SIGN_OUT_START, }); export const signOutSuccess = () => ({ - type: UserActionTypes.SIGN_OUT_SUCCESS + type: UserActionTypes.SIGN_OUT_SUCCESS, }); -export const signOutFailure = error => ({ +export const signOutFailure = (error) => ({ type: UserActionTypes.SIGN_OUT_FAILURE, - payload: error + payload: error, }); export const unauthorizedUser = () => ({ - type: UserActionTypes.UNAUTHORIZED_USER + type: UserActionTypes.UNAUTHORIZED_USER, }); -export const setUserLanguage = language => ({ +export const setUserLanguage = (language) => ({ type: UserActionTypes.SET_USER_LANGUAGE, - payload: language + payload: language, }); -export const updateUserDetails = userDetails => ({ +export const updateUserDetails = (userDetails) => ({ type: UserActionTypes.UPDATE_USER_DETAILS, - payload: userDetails + payload: userDetails, }); -export const updateUserDetailsSuccess = userDetails => ({ +export const updateUserDetailsSuccess = (userDetails) => ({ type: UserActionTypes.UPDATE_USER_DETAILS_SUCCESS, - payload: userDetails + payload: userDetails, }); -export const setBodyshop = bodyshop => ({ +export const setBodyshop = (bodyshop) => ({ type: UserActionTypes.SET_SHOP_DETAILS, - payload: bodyshop + payload: bodyshop, +}); + +export const setInstanceId = (userInfo) => ({ + type: UserActionTypes.SET_INSTANCE_ID, + payload: userInfo, +}); + +export const checkInstanceId = (uid) => ({ + type: UserActionTypes.CHECK_INSTANCE_ID, + payload: uid, +}); + +export const setInstanceConflict = () => ({ + type: UserActionTypes.SET_INSTANCE_CONFLICT, +}); + +export const setLocalFingerprint = (fingerprint) => ({ + type: UserActionTypes.SET_LOCAL_FINGERPRINT, + payload: fingerprint, +}); + +export const sendPasswordReset = (email) => ({ + type: UserActionTypes.SEND_PASSWORD_RESET_EMAIL_START, + payload: email, +}); +export const sendPasswordResetFailure = (error) => ({ + type: UserActionTypes.SEND_PASSWORD_RESET_EMAIL_FAILURE, + payload: error, +}); +export const sendPasswordResetSuccess = () => ({ + type: UserActionTypes.SEND_PASSWORD_RESET_EMAIL_SUCCESS, +}); + +export const validatePasswordResetStart = (emailAndPin) => ({ + type: UserActionTypes.VALIDATE_PASSWORD_RESET_START, + payload: emailAndPin, +}); + +export const validatePasswordResetSuccess = () => ({ + type: UserActionTypes.VALIDATE_PASSWORD_RESET_SUCCESS, +}); + +export const validatePasswordResetFailure = (error) => ({ + type: UserActionTypes.VALIDATE_PASSWORD_RESET_FAILURE, + payload: error, }); diff --git a/client/src/redux/user/user.reducer.js b/client/src/redux/user/user.reducer.js index 880ff98d0..ac5c2421f 100644 --- a/client/src/redux/user/user.reducer.js +++ b/client/src/redux/user/user.reducer.js @@ -6,41 +6,73 @@ const INITIAL_STATE = { //language: "en-US" }, bodyshop: null, - error: null + fingerprint: null, + error: null, + conflict: false, + passwordreset: { + email: null, + error: null, + success: false, + }, }; const userReducer = (state = INITIAL_STATE, action) => { switch (action.type) { + case UserActionTypes.SET_LOCAL_FINGERPRINT: + return { ...state, fingerprint: action.payload }; + case UserActionTypes.SET_INSTANCE_ID: + return { ...state, conflict: false }; + case UserActionTypes.SET_INSTANCE_CONFLICT: + return { ...state, conflict: true }; + case UserActionTypes.VALIDATE_PASSWORD_RESET_START: + case UserActionTypes.SEND_PASSWORD_RESET_EMAIL_START: + return { + ...state, + passwordreset: { + email: action.payload, + error: null, + success: false, + }, + }; + case UserActionTypes.VALIDATE_PASSWORD_RESET_FAILURE: + case UserActionTypes.SEND_PASSWORD_RESET_EMAIL_FAILURE: + return { ...state, passwordreset: { error: action.payload } }; + case UserActionTypes.VALIDATE_PASSWORD_RESET_SUCCESS: + case UserActionTypes.SEND_PASSWORD_RESET_EMAIL_SUCCESS: + return { + ...state, + passwordreset: { ...state.passwordreset, success: true }, + }; case UserActionTypes.SIGN_IN_SUCCESS: return { ...state, currentUser: action.payload, - error: null + error: null, }; case UserActionTypes.SIGN_OUT_SUCCESS: return { ...state, currentUser: { authorized: false }, - error: null + error: null, }; case UserActionTypes.UNAUTHORIZED_USER: return { ...state, error: null, - currentUser: { authorized: false } + currentUser: { authorized: false }, }; case UserActionTypes.SET_USER_LANGUAGE: return { ...state, - language: action.payload + language: action.payload, }; case UserActionTypes.UPDATE_USER_DETAILS_SUCCESS: return { ...state, currentUser: { ...state.currentUser, - ...action.payload //Spread current user details in. - } + ...action.payload, //Spread current user details in. + }, }; case UserActionTypes.SET_SHOP_DETAILS: @@ -50,7 +82,7 @@ const userReducer = (state = INITIAL_STATE, action) => { case UserActionTypes.EMAIL_SIGN_UP_FAILURE: return { ...state, - error: action.payload + error: action.payload, }; default: return state; diff --git a/client/src/redux/user/user.sagas.js b/client/src/redux/user/user.sagas.js index 6d9e54612..52b48b8dc 100644 --- a/client/src/redux/user/user.sagas.js +++ b/client/src/redux/user/user.sagas.js @@ -1,67 +1,89 @@ -import { all, call, put, takeLatest } from "redux-saga/effects"; +import Fingerprint2 from "fingerprintjs2"; +import LogRocket from "logrocket"; +import { all, call, delay, put, select, takeLatest } from "redux-saga/effects"; import { auth, + firestore, getCurrentUser, - updateCurrentUser + logImEXEvent, + updateCurrentUser, } from "../../firebase/firebase.utils"; import { + checkInstanceId, + setInstanceConflict, + setInstanceId, + setLocalFingerprint, signInFailure, signInSuccess, signOutFailure, signOutSuccess, unauthorizedUser, - updateUserDetailsSuccess + updateUserDetailsSuccess, + sendPasswordResetFailure, + sendPasswordResetSuccess, + validatePasswordResetSuccess, + validatePasswordResetFailure, } from "./user.actions"; import UserActionTypes from "./user.types"; -export function* signInWithEmail({ payload: { email, password } }) { - try { - const { user } = yield auth.signInWithEmailAndPassword(email, password); - yield put( - signInSuccess({ - uid: user.uid, - email: user.email, - displayName: user.displayName, - photoURL: user.photoURL, - authorized: true - }) - ); - } catch (error) { - yield put(signInFailure(error)); - } -} -//This is the listener fo rthe call, and when it finds it, it triggers somethign else. export function* onEmailSignInStart() { yield takeLatest(UserActionTypes.EMAIL_SIGN_IN_START, signInWithEmail); } - -export function* isUserAuthenticated() { +export function* signInWithEmail({ payload: { email, password } }) { try { - const user = yield getCurrentUser(); - if (!user) { - yield put(unauthorizedUser()); - return; - } + logImEXEvent("redux_sign_in_attempt", { user: email }); + + const { user } = yield auth.signInWithEmailAndPassword(email, password); + yield put( signInSuccess({ uid: user.uid, email: user.email, displayName: user.displayName, photoURL: user.photoURL, - authorized: true + authorized: true, }) ); } catch (error) { yield put(signInFailure(error)); + logImEXEvent("redux_sign_in_failure", { user: email, error }); } } export function* onCheckUserSession() { yield takeLatest(UserActionTypes.CHECK_USER_SESSION, isUserAuthenticated); } +export function* isUserAuthenticated() { + try { + logImEXEvent("redux_auth_check"); + const user = yield getCurrentUser(); + if (!user) { + yield put(unauthorizedUser()); + return; + } + + LogRocket.identify(user.email); + yield put( + signInSuccess({ + uid: user.uid, + email: user.email, + displayName: user.displayName, + photoURL: user.photoURL, + authorized: true, + }) + ); + } catch (error) { + yield put(signInFailure(error)); + } +} +export function* onSignOutStart() { + yield takeLatest(UserActionTypes.SIGN_OUT_START, signOutStart); +} export function* signOutStart() { try { + logImEXEvent("redux_sign_out"); + yield auth.signOut(); yield put(signOutSuccess()); localStorage.removeItem("token"); @@ -70,10 +92,6 @@ export function* signOutStart() { } } -export function* onSignOutStart() { - yield takeLatest(UserActionTypes.SIGN_OUT_START, signOutStart); -} - export function* onUpdateUserDetails() { yield takeLatest(UserActionTypes.UPDATE_USER_DETAILS, updateUserDetails); } @@ -86,12 +104,111 @@ export function* updateUserDetails(userDetails) { //TODO error handling } } +export function* onSetInstanceId() { + yield takeLatest(UserActionTypes.SET_INSTANCE_ID, setInstanceIdSaga); +} +export function* setInstanceIdSaga({ payload: uid }) { + try { + const userInstanceRef = firestore.doc(`userInstance/${uid}`); + + const fingerprint = Fingerprint2.x64hash128( + (yield Fingerprint2.getPromise({})).map((c) => c.value).join(""), + 31 + ); + + yield userInstanceRef.set({ + timestamp: new Date(), + fingerprint, + }); + + yield put(setLocalFingerprint(fingerprint)); + yield delay(5 * 60 * 1000); + yield put(checkInstanceId(uid)); + } catch (error) { + console.log("error", error); + //yield put(signOutFailure(error.message)); + //TODO error handling + } +} + +export function* onCheckInstanceId() { + yield takeLatest(UserActionTypes.CHECK_INSTANCE_ID, checkInstanceIdSaga); +} +export function* checkInstanceIdSaga({ payload: uid }) { + try { + const userInstanceRef = firestore.doc(`userInstance/${uid}`); + + const snapshot = yield userInstanceRef.get(); + let fingerprint = yield select((state) => state.user.fingerprint); + + if (snapshot.data().fingerprint === fingerprint) { + yield delay(5 * 60 * 1000); + yield put(checkInstanceId(uid)); + } else { + console.log("ERROR: Fingerprints do not match. Conflict detected."); + logImEXEvent("instance_confict"); + yield put(setInstanceConflict()); + } + } catch (error) { + console.log("error", error); + //TODO error handling + } +} + +export function* onSignInSuccess() { + yield takeLatest(UserActionTypes.SIGN_IN_SUCCESS, signInSuccessSaga); +} + +export function* signInSuccessSaga({ payload }) { + LogRocket.identify(payload.email); + yield put(setInstanceId(payload.uid)); + yield logImEXEvent("redux_sign_in_success"); +} + +export function* onSendPasswordResetStart() { + yield takeLatest( + UserActionTypes.SEND_PASSWORD_RESET_EMAIL_START, + sendPasswordResetEmail + ); +} +export function* sendPasswordResetEmail({ payload }) { + try { + yield auth.sendPasswordResetEmail(payload, { + url: "https://imex.online/passwordreset", + }); + console.log("Good should send."); + yield put(sendPasswordResetSuccess()); + } catch (error) { + yield put(sendPasswordResetFailure(error.message)); + } +} + +export function* onValidatePasswordResetStart() { + yield takeLatest( + UserActionTypes.VALIDATE_PASSWORD_RESET_START, + validatePasswordResetStart + ); +} +export function* validatePasswordResetStart({ payload: { password, code } }) { + try { + yield auth.confirmPasswordReset(code, password); + yield put(validatePasswordResetSuccess()); + } catch (error) { + console.log("function*validatePasswordResetStart -> error", error); + yield put(validatePasswordResetFailure(error.message)); + } +} export function* userSagas() { yield all([ call(onEmailSignInStart), call(onCheckUserSession), call(onSignOutStart), - call(onUpdateUserDetails) + call(onUpdateUserDetails), + call(onSetInstanceId), + call(onCheckInstanceId), + call(onSignInSuccess), + call(onSendPasswordResetStart), + call(onValidatePasswordResetStart), ]); } diff --git a/client/src/redux/user/user.selectors.js b/client/src/redux/user/user.selectors.js index 4384f7ed6..6d4a0bc19 100644 --- a/client/src/redux/user/user.selectors.js +++ b/client/src/redux/user/user.selectors.js @@ -1,18 +1,28 @@ import { createSelector } from "reselect"; -const selectUser = state => state.user; +const selectUser = (state) => state.user; export const selectCurrentUser = createSelector( [selectUser], - user => user.currentUser + (user) => user.currentUser ); export const selectSignInError = createSelector( [selectUser], - user => user.error + (user) => user.error ); export const selectBodyshop = createSelector( [selectUser], - user => user.bodyshop + (user) => user.bodyshop +); + +export const selectInstanceConflict = createSelector( + [selectUser], + (user) => user.conflict +); + +export const selectPasswordReset = createSelector( + [selectUser], + (user) => user.passwordreset ); diff --git a/client/src/redux/user/user.types.js b/client/src/redux/user/user.types.js index febfe5eab..e394beb13 100644 --- a/client/src/redux/user/user.types.js +++ b/client/src/redux/user/user.types.js @@ -15,6 +15,16 @@ const UserActionTypes = { SET_USER_LANGUAGE: "SET_USER_LANGUAGE", UPDATE_USER_DETAILS: "UPDATE_USER_DETAILS", UPDATE_USER_DETAILS_SUCCESS: "UPDATE_USER_DETAILS_SUCCESS", - SET_SHOP_DETAILS: "SET_SHOP_DETAILS" + SET_SHOP_DETAILS: "SET_SHOP_DETAILS", + SET_INSTANCE_ID: "SET_INSTANCE_ID", + CHECK_INSTANCE_ID: "CHECK_INSTANCE_ID", + SET_INSTANCE_CONFLICT: "SET_INSTANCE_CONFLICT", + SET_LOCAL_FINGERPRINT: "SET_LOCAL_FINGERPRINT", + SEND_PASSWORD_RESET_EMAIL_START: "SEND_PASSWORD_RESET_EMAIL_START", + SEND_PASSWORD_RESET_EMAIL_FAILURE: "SEND_PASSWORD_RESET_EMAIL_FAILURE", + SEND_PASSWORD_RESET_EMAIL_SUCCESS: "SEND_PASSWORD_RESET_EMAIL_SUCCESS", + VALIDATE_PASSWORD_RESET_START: "VALIDATE_PASSWORD_RESET_START", + VALIDATE_PASSWORD_RESET_SUCCESS: "VALIDATE_PASSWORD_RESET_SUCCESS", + VALIDATE_PASSWORD_RESET_FAILURE: "VALIDATE_PASSWORD_RESET_FAILURE", }; export default UserActionTypes; diff --git a/client/src/serviceWorker.js b/client/src/serviceWorker.js index f8c7e50c2..372b6674d 100644 --- a/client/src/serviceWorker.js +++ b/client/src/serviceWorker.js @@ -11,9 +11,9 @@ // opt-in, read https://bit.ly/CRA-PWA const isLocalhost = Boolean( - window.location.hostname === 'localhost' || + window.location.hostname === "localhost" || // [::1] is the IPv6 localhost address. - window.location.hostname === '[::1]' || + window.location.hostname === "[::1]" || // 127.0.0.1/8 is considered localhost for IPv4. window.location.hostname.match( /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/ @@ -21,7 +21,7 @@ const isLocalhost = Boolean( ); export function register(config) { - if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) { + if (process.env.NODE_ENV === "production" && "serviceWorker" in navigator) { // The URL constructor is available in all browsers that support SW. const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href); if (publicUrl.origin !== window.location.origin) { @@ -31,7 +31,7 @@ export function register(config) { return; } - window.addEventListener('load', () => { + window.addEventListener("load", () => { const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`; if (isLocalhost) { @@ -42,8 +42,8 @@ export function register(config) { // service worker/PWA documentation. navigator.serviceWorker.ready.then(() => { console.log( - 'This web app is being served cache-first by a service ' + - 'worker. To learn more, visit https://bit.ly/CRA-PWA' + "This web app is being served cache-first by a service " + + "worker. To learn more, visit https://bit.ly/CRA-PWA" ); }); } else { @@ -57,21 +57,21 @@ export function register(config) { function registerValidSW(swUrl, config) { navigator.serviceWorker .register(swUrl) - .then(registration => { + .then((registration) => { registration.onupdatefound = () => { const installingWorker = registration.installing; if (installingWorker == null) { return; } installingWorker.onstatechange = () => { - if (installingWorker.state === 'installed') { + if (installingWorker.state === "installed") { if (navigator.serviceWorker.controller) { // At this point, the updated precached content has been fetched, // but the previous service worker will still serve the older // content until all client tabs are closed. console.log( - 'New content is available and will be used when all ' + - 'tabs for this page are closed. See https://bit.ly/CRA-PWA.' + "New content is available and will be used when all " + + "tabs for this page are closed. See https://bit.ly/CRA-PWA." ); // Execute callback @@ -82,7 +82,7 @@ function registerValidSW(swUrl, config) { // At this point, everything has been precached. // It's the perfect time to display a // "Content is cached for offline use." message. - console.log('Content is cached for offline use.'); + console.log("Content is cached for offline use."); // Execute callback if (config && config.onSuccess) { @@ -93,42 +93,46 @@ function registerValidSW(swUrl, config) { }; }; }) - .catch(error => { - console.error('Error during service worker registration:', error); + .catch((error) => { + console.error("Error during service worker registration:", error); }); } function checkValidServiceWorker(swUrl, config) { // Check if the service worker can be found. If it can't reload the page. + console.log("Seeing if service worker cna be found."); fetch(swUrl) - .then(response => { + .then((response) => { // Ensure service worker exists, and that we really are getting a JS file. - const contentType = response.headers.get('content-type'); + const contentType = response.headers.get("content-type"); if ( response.status === 404 || - (contentType != null && contentType.indexOf('javascript') === -1) + (contentType != null && contentType.indexOf("javascript") === -1) ) { // No service worker found. Probably a different app. Reload the page. - navigator.serviceWorker.ready.then(registration => { + console.log("No service worker found. Unregistering."); + navigator.serviceWorker.ready.then((registration) => { registration.unregister().then(() => { window.location.reload(); }); }); } else { // Service worker found. Proceed as normal. + console.log("Service worker found. Registering."); + registerValidSW(swUrl, config); } }) .catch(() => { console.log( - 'No internet connection found. App is running in offline mode.' + "No internet connection found. App is running in offline mode." ); }); } export function unregister() { - if ('serviceWorker' in navigator) { - navigator.serviceWorker.ready.then(registration => { + if ("serviceWorker" in navigator) { + navigator.serviceWorker.ready.then((registration) => { registration.unregister(); }); } diff --git a/client/src/translations/en_us/common.json b/client/src/translations/en_us/common.json index 36dfb718c..ff7ca65f0 100644 --- a/client/src/translations/en_us/common.json +++ b/client/src/translations/en_us/common.json @@ -19,22 +19,28 @@ }, "appointments": { "actions": { + "block": "Block Day", "cancel": "Cancel", "intake": "Intake", "new": "New Appointment", "reschedule": "Reschedule", + "smartscheduling": "SMART Scheduling", "viewjob": "View Job" }, "errors": { - "canceling": "Error canceling appointment.", + "blocking": "Error creating block {{message}}.", + "canceling": "Error canceling appointment. {{message}}", "saving": "Error scheduling appointment. {{message}}" }, "fields": { + "time": "Appointment Time", "title": "Title" }, "labels": { "arrivedon": "Arrived on: ", + "blocked": "Blocked", "cancelledappointment": "Canceled appointment for: ", + "history": "History", "nodateselected": "No date has been selected.", "priorappointments": "Previous Appointments", "scheduledfor": "Scheduled appointment for: " @@ -61,11 +67,15 @@ "created": "Time", "operation": "Operation", "useremail": "User", - "values": "" + "values": "Values" } }, "bodyshop": { "actions": { + "addbucket": "Add Bucket", + "addpartslocation": "Add Parts Location", + "addspeedprint": "Add Speed Print", + "addtemplate": "Add Template", "newstatus": "Add Status" }, "errors": { @@ -75,16 +85,37 @@ "fields": { "address1": "Address 1", "address2": "Address 2", + "appt_length": "Default Appointment Length", "city": "City", "country": "Country", + "dailybodytarget": "Scoreboard - Daily Body Target", + "dailypainttarget": "Scoreboard - Daily Paint Target", "email": "General Shop Email", "federal_tax_id": "Federal Tax ID (GST/HST)", "insurance_vendor_id": "Insurance Vendor ID", + "invoice_federal_tax_rate": "Invoices - Federal Tax Rate %", + "invoice_local_tax_rate": "Invoices - State Tax Rate %", + "invoice_state_tax_rate": "Invoices - State Tax Rate %", + "lastnumberworkingdays": "Scoreboard - Last Number of Working Days", "logo_img_path": "Shop Logo", + "md_referral_sources": "Referral Sources", + "messaginglabel": "Messaging Preset Label", + "messagingtext": "Messaging Preset Text", + "noteslabel": "Note Label", + "notestext": "Note Text", + "partslocation": "Parts Location", "responsibilitycenter": "Responsibility Center", + "responsibilitycenter_accountdesc": "Account Description", + "responsibilitycenter_accountitem": "Item", + "responsibilitycenter_accountname": "Account Name", + "responsibilitycenter_accountnumber": "Account Number", + "responsibilitycenter_rate": "Rate", "responsibilitycenters": { + "ap": "Accounts Payable", + "ar": "Accounts Receivable", "atp": "ATP", - "lab": "Labor", + "federal_tax": "Federal Tax", + "lab": "Body", "lad": "Diagnostic", "lae": "Electrical", "laf": "Frame", @@ -93,6 +124,9 @@ "lar": "Refinish", "las": "Structural", "lau": "Detail", + "local_tax": "Local Tax", + "mapa": "Paint Materials", + "mash": "Shop Materials", "paa": "Aftermarket", "pac": "Chrome", "pal": "LKQ", @@ -101,9 +135,23 @@ "pao": "Other", "pap": "OEM Partial", "par": "Recored", + "pas": "Sublet", + "state_tax": "State Tax", "tow": "Towing" }, "shopname": "Shop Name", + "speedprint": { + "id": "Id", + "label": "Label", + "templates": "Templates" + }, + "ssbuckets": { + "gte": "Greater Than/Equal to (hrs)", + "id": "ID", + "label": "Label", + "lt": "Less than (hrs)", + "target": "Target (count)" + }, "state": "State/Province", "state_tax_id": "State Tax ID (PST, QST)", "status": "Status Label", @@ -118,39 +166,62 @@ "default_invoiced": "Default Invoiced Status", "default_ordered": "Default Ordered Status", "default_received": "Default Received Status", + "default_returned": "Default Returned", "default_scheduled": "Default Scheduled Status", - "open_statuses": "Open Statuses" + "default_void": "Default Void", + "open_statuses": "Open Statuses", + "production_statuses": "Production Statuses" }, "zip_post": "Zip/Postal Code" }, "labels": { + "2tiername": "Name => RO", + "2tiersetup": "2 Tier Setup", + "2tiersource": "Source => RO", + "accountingtiers": "Number of Tiers to Use for Export", "alljobstatuses": "All Job Statuses", "allopenjobstatuses": "All Open Job Statuses", + "customtemplates": "Custom Templates", + "intake": "Job Intake", "jobstatuses": "Job Statuses", + "notemplatesavailable": "No templates available to add.", "orderstatuses": "Order Statuses", "responsibilitycenters": { "costs": "Cost Centers", "profits": "Profit Centers", "title": "Responsibility Centers" }, - "shopinfo": "Shop Information" + "scheduling": "SMART Scheduling", + "shopinfo": "Shop Information", + "speedprint": "Speed Print Configuration" }, "successes": { "save": "Bodyshop saved successfully. " } }, "contracts": { + "actions": { + "convertoro": "Convert to RO", + "decodelicense": "Decode License", + "senddltoform": "Insert Driver's License Information" + }, "errors": { "returning": "Error returning courtesy car. {{error}}", "saving": "Error saving contract. {{error}}", "selectjobandcar": "Please ensure both a car and job are selected." }, "fields": { + "actax": "A/C Tax", "actualreturn": "Actual Return Date", "agreementnumber": "Agreement Number", "cc_cardholder": "Cardholder Name", "cc_expiry": "Credit Card Expiry Date", "cc_num": "Credit Card Number", + "cleanupcharge": "Clean Up Charge", + "coverage": "Coverage", + "dailyfreekm": "Daily Free Mileage", + "dailyrate": "Daily Rate", + "damagewaiver": "Damage Waiver", "driver": "Driver", "driver_addr1": "Driver Address 1", "driver_addr2": "Driver Address 2", @@ -164,12 +235,26 @@ "driver_ph1": "Driver's Phone", "driver_state": "Driver's State ", "driver_zip": "Driver's Postal/ZIP Code", + "excesskmrate": "Excess Mileage", + "federaltax": "Federal Taxes", "kmend": "Mileage End", "kmstart": "Mileage Start", + "localtax": "Local Taxes", + "refuelcharge": "Refuel Charge (per liter/gallon)", "scheduledreturn": "Scheduled Return", "start": "Contract Start", + "statetax": "State Taxes", "status": "Status" }, + "labels": { + "convertform": { + "applycleanupcharge": "Apply cleanup charge?", + "refuelqty": "Refuel qty.?" + }, + "correctdataonform": "Please review the information above. If any of it is not correct, you can fix it later.", + "noteconvertedfrom": "R.O. created from converted Courtesy Car Contract {{agreementnumber}}.", + "waitingforscan": "Please scan driver's license barcode..." + }, "status": { "new": "New Contract", "out": "Out", @@ -181,6 +266,7 @@ }, "courtesycars": { "actions": { + "new": "New Courtesy Car", "return": "Return Car" }, "errors": { @@ -233,6 +319,40 @@ "saved": "Courtesy Car saved successfully." } }, + "csi": { + "errors": { + "creating": "Error creating survey {{message}}", + "notconfigured": "You do not have any current CSI Question Sets configured.", + "notfoundsubtitle": "We were unable to find a survey using the link you provided. Please ensure the URL is correct or reach out to your shop for more help.", + "notfoundtitle": "No survey found." + }, + "fields": { + "completedon": "Completed On" + }, + "labels": { + "noneselected": "No response selected.", + "title": "Customer Satisfaction Survey" + }, + "successes": { + "created": "CSI created successfully. ", + "submitted": "Your responses have been submitted successfully.", + "submittedsub": "Your input is highly appreciated." + } + }, + "dashboard": { + "actions": { + "addcomponent": "Add Component" + }, + "errors": { + "updatinglayout": "Error saving updated layout {{message}}" + }, + "titles": { + "monthlyrevenuegraph": "Monthly Revenue Graph", + "productiondollars": "Total dollars in production", + "productionhours": "Total hours in production", + "projectedmonthlysales": "Projected Monthly Sales" + } + }, "documents": { "actions": { "delete": "Delete Selected Documents", @@ -265,8 +385,8 @@ "new": "New Employee" }, "errors": { - "delete": "Error encountered while deleting employee.", - "save": "Error encountered saving employee.", + "delete": "Error encountered while deleting employee. {{message}}", + "save": "Error encountered saving employee. {{message}}", "validation": "Please check all fields.", "validationtitle": "Unable to save employee." }, @@ -291,26 +411,61 @@ }, "general": { "actions": { + "add": "Add", "cancel": "Cancel", + "close": "Close", "create": "Create", "delete": "Delete", + "deleteall": "Delete All", "edit": "Edit", - "reset": "Reset to original.", + "login": "Login", + "refresh": "Refresh", + "reset": "Reset your changes.", + "resetpassword": "Reset Password", "save": "Save", - "saveandnew": "Save and New" + "saveandnew": "Save and New", + "submit": "Submit", + "submitticket": "Submit a Support Ticket" + }, + "itemtypes": { + "contract": "CC Contract", + "courtesycar": "Courtesy Car", + "job": "Job", + "owner": "Owner", + "vehicle": "Vehicle" }, "labels": { "actions": "Actions", + "areyousure": "Are you sure?", "barcode": "Barcode", + "confirmpassword": "Confirm Password", + "email": "Email", + "errors": "Errors", + "exceptiontitle": "An error has occurred.", "in": "In", + "instanceconflictext": "Your $t(titles.app) account can only be used on one device at any given time. Refresh your session to take control.", + "instanceconflictitle": "Your account is being used elsewhere.", "loading": "Loading...", - "loadingapp": "Loading Bodyshop.app", + "loadingapp": "Loading $t(titles.app)", "loadingshop": "Loading shop data...", - "loggingin": "Logging you in...", + "loggingin": "Authorizing...", "na": "N/A", + "no": "No", "out": "Out", + "password": "Password", + "passwordresetsuccess": "A password reset link has been sent to you.", + "passwordresetsuccess_sub": "You should receive this email in the next few minutes. Please check your email including any junk or spam folders. ", + "passwordsdonotmatch": "The passwords you have entered do not match.", + "print": "Print", + "required": "Required", "search": "Search...", - "unknown": "Unknown" + "selectdate": "Select date...", + "sendagain": "Send Again", + "sendby": "Send By", + "text": "Text", + "unknown": "Unknown", + "username": "Username", + "yes": "Yes" }, "languages": { "english": "English", @@ -318,13 +473,32 @@ "spanish": "Spanish" }, "messages": { - "unsavedchanges": "You have unsaved changes." + "exception": "$t(titles.app) has encountered an error. Please try again. If the problem persists, please submit a support ticket or contact us.", + "unsavedchanges": "You have unsaved changes.", + "unsavedchangespopup": "You have unsaved changes. Are you sure you want to leave?" }, "validation": { "invalidemail": "Please enter a valid email.", "required": "This field is required. " } }, + "intake": { + "actions": { + "printall": "Print All Documents" + }, + "errors": { + "intake": "Error during job intake. {{error}}", + "nochecklist": "No checklist has been configured for your shop. " + }, + "labels": { + "addtoproduction": "Add Job to Production?", + "checklist": "Job Intake Checklist", + "printpack": "Job Intake Print Pack" + }, + "successes": { + "intake": "Job intake completed." + } + }, "invoicelines": { "actions": { "newline": "New Line" @@ -333,8 +507,13 @@ "actual": "Actual", "actual_cost": "Actual Cost", "cost_center": "Cost Center", - "line_desc": "Line Description", - "retail": "Retail" + "federal_tax_applicable": "Fed. Tax?", + "jobline": "Job Line", + "line_desc": "Invoice Line Description", + "local_tax_applicable": "Loc. Tax?", + "quantity": "Quantity", + "retail": "Retail", + "state_tax_applicable": "St. Tax?" }, "labels": { "entered": "Entered", @@ -346,26 +525,43 @@ "invoices": { "actions": { "edit": "Edit", - "receive": "Receive Part" + "receive": "Receive Part", + "return": "Return Items" }, "errors": { "creating": "Error adding invoice.", + "exporting": "Error exporting invoice(s). {{error}}", + "exporting-partner": "Unable to connect to ImEX Partner. Please ensure it is running and logged in.", "invalidro": "Not a valid RO.", "invalidvendor": "Not a valid vendor.", "validation": "Please ensure all fields are entered correctly. " }, "fields": { "date": "Invoice Date", + "federal_tax_rate": "Federal Tax Rate", "invoice_number": "Invoice Number", "is_credit_memo": "Credit Memo?", + "local_tax_rate": "Local Tax Rate", "ro_number": "RO Number", + "state_tax_rate": "State Tax Rate", "total": "Invoice Total", "vendor": "Vendor", "vendorname": "Vendor Name" }, "labels": { "actions": "Actions", - "new": "New Invoice" + "discrepancy": "Discrepancy", + "entered_total": "Total of Entered Lines", + "enteringcreditmemo": "You are entering a credit memo. Please ensure you are also entering positive values.", + "federal_tax": "Federal Tax", + "invoice_total": "Invoice Total Amount", + "invoices": "Invoices", + "local_tax": "Local Tax", + "new": "New Invoice", + "noneselected": "No invoice selected.", + "retailtotal": "Retail Total of Invoices (Ex. Taxes)", + "state_tax": "State Tax", + "subtotal": "Subtotal" }, "successes": { "created": "Invoice added successfully." @@ -382,14 +578,41 @@ "fields": { "act_price": "Actual Price", "db_price": "Database Price", - "line_desc": "Line Description", + "lbr_types": { + "LAA": "Aluminum", + "LAB": "Body", + "LAD": "Diagnostic", + "LAE": "Electrical", + "LAF": "Frame", + "LAG": "Glass", + "LAM": "Mechanical", + "LAR": "Refinish", + "LAS": "Structural" + }, + "line_desc": "Line Desc.", "line_ind": "S#", - "mod_lb_hrs": "Labor Hours", + "line_no": "Line #", + "location": "Location", + "mod_lb_hrs": "Hrs", "mod_lbr_ty": "Labor Type", + "notes": "Notes", "oem_partno": "OEM Part #", "op_code_desc": "Operation Code Description", - "part_qty": "Quantity", + "part_qty": "Qty.", "part_type": "Part Type", + "part_types": { + "CCC": "CC Cleaning", + "CCD": "CC Damage Waiver", + "CCDR": "CC Daily Rate", + "CCF": "CC Refuel", + "CCM": "CC Mileage", + "PAA": "Aftermarket", + "PAE": "Existing", + "PAL": "LKQ", + "PAN": "New/OEM", + "PAS": "Sublet", + "PASL": "Sublet" + }, "status": "Status", "total": "Total", "unq_seq": "Seq #" @@ -400,27 +623,47 @@ }, "successes": { "created": "Job line created successfully.", + "saved": "Job line saved.", "updated": "Job line updated successfully." + }, + "validations": { + "zeropriceexistingpart": "This line cannot have any price since it uses an existing part." } }, "jobs": { "actions": { "addDocuments": "Add Job Documents", "addNote": "Add Note", + "addtoproduction": "Add to Production", + "addtoscoreboard": "Add to Scoreboard", + "allocate": "Allocate", + "autoallocate": "Auto Allocate", "changestatus": "Change Status", "convert": "Convert", + "export": "Export", + "exportselected": "Export Selected", + "filterpartsonly": "Filter Parts Only", "gotojob": "Go to Job", + "intake": "Intake", "manualnew": "Create New Job Manually", + "mark": "Mark", "postInvoices": "Post Invoices", "printCenter": "Print Center", - "schedule": "Schedule" + "reconcile": "Reconcile", + "schedule": "Schedule", + "sendcsi": "Send CSI" }, "errors": { + "addingtoproduction": "Error adding to production. {{error}}", "creating": "Error encountered while creating job. {{error}}", "deleted": "Error deleting job.", + "exporting": "Error exporting job. {{error}}", + "exporting-partner": "Unable to connect to ImEX Partner. Please ensure it is running and logged in.", + "invoicing": "Error invoicing job. {{error}}", "noaccess": "This job does not exist or you do not have access to it.", "nodamage": "No damage points on estimate.", "nodates": "No dates specified for this job.", + "nofinancial": "No financial data has been calculated yet for this job. Please save it again.", "nojobselected": "No job is selected.", "noowner": "No owner associated.", "novehicle": "No vehicle associated.", @@ -434,6 +677,11 @@ "actual_delivery": "Actual Delivery", "actual_in": "Actual In", "adjustment_bottom_line": "Adjustments", + "ccc": "CC Cleaning", + "ccd": "CC Damage Waiver", + "ccdr": "CC Daily Rate", + "ccf": "CC Refuel", + "ccm": "CC Mileage", "cieca_id": "CIECA ID", "claim_total": "Claim Total", "clm_no": "Claim #", @@ -449,12 +697,15 @@ "ded_amt": "Deductible", "ded_status": "Deductible Status", "depreciation_taxes": "Depreciation/Taxes", + "employee_body": "Body", + "employee_prep": "Prep", + "employee_refinish": "Refinish", "est_addr1": "Appraiser Address", "est_co_nm": "Appraiser", "est_ct_fn": "Appraiser First Name", "est_ct_ln": "Appraiser Last Name", "est_ea": "Appraiser Email", - "est_number": "Estimate Number", + "est_number": "Estimate #", "est_ph1": "Appraiser Phone #", "federal_tax_payable": "Federal Tax Payable", "ins_addr1": "Insurance Co. Address", @@ -465,17 +716,47 @@ "ins_ct_ln": "File Handler Last Name", "ins_ea": "File Handler Email", "ins_ph1": "File Handler Phone #", + "intake": { + "label": "Label", + "name": "Name", + "required": "Required?", + "type": "Type" + }, "kmin": "Mileage In", "kmout": "Mileage Out", + "la1": "LA1", + "la2": "LA2", + "la3": "LA3", + "la4": "LA4", + "laa": "Aluminum ", + "lab": "Body", "labor_rate_desc": "Labor Rate Name", + "lad": "Diagnostic", + "lae": "Electrical", + "laf": "Frame", + "lag": "Glass", + "lam": "Mechanical", + "lar": "Refinish", + "las": "Structural", + "lau": "LAU", "loss_date": "Loss Date", "loss_desc": "Loss of Use", + "mapa": "Paint Materials", + "mash": "Shop Materials", "other_amount_payable": "Other Amount Payable", "owner": "Owner", "owner_owing": "Cust. Owes", "ownr_ea": "Email", "ownr_ph1": "Phone 1", - "pay_date": "Inspection Date", + "paa": "Aftermarket", + "pal": "LKQ", + "pam": "Remanufactured", + "pan": "OEM/New", + "pao": "Other", + "pap": "EOM Partial", + "par": "Re-cored", + "pas": "Sublet", + "pay_date": "Pay Date", "phoneshort": "PH", "policy_no": "Policy #", "ponumber": "PO Number", @@ -485,7 +766,7 @@ "rate_la3": "LA3 Rate", "rate_la4": "LA4 Rate", "rate_laa": "Aluminum Rate", - "rate_lab": "Labor Rate", + "rate_lab": "Body Rate", "rate_lad": "Diagnostic Rate", "rate_lae": "Electrical Rate", "rate_laf": "Frame Rate", @@ -523,13 +804,26 @@ "uploaded_by": "Uploaded By", "vehicle": "Vehicle" }, + "forms": { + "admindates": "Administrative Dates", + "appraiserinfo": "Appraiser Info", + "claiminfo": "Claim Information", + "dedinfo": "Deductible Info", + "estdates": "Estimate Dates", + "inscoinfo": "Insurance Company Information", + "laborrates": "Labor Rates", + "lossinfo": "Loss Information", + "repairdates": "Repair Dates", + "scheddates": "Schedule Dates" + }, "labels": { + "allocations": "Allocations", "appointmentconfirmation": "Send confirmation to customer?", "audit": "Audit Trail", + "available": "Available", "availablenew": "Available New Jobs", "availablesupplements": "Available Supplements", "cards": { - "appraiser": "Appraiser", "customer": "Customer Information", "damage": "Area of Damage", "dates": "Dates", @@ -542,6 +836,7 @@ "totals": "Totals", "vehicle": "Vehicle" }, + "cost": "Cost", "create": { "jobinfo": "Job Info", "newowner": "Create a new Owner instead. ", @@ -550,30 +845,62 @@ "vehicleinfo": "Vehicle Info" }, "creating_new_job": "Creating new job...", + "deductible": { + "no": "No", + "waived": "Waived", + "yes": "Yes" + }, + "difference": "Difference", "documents": "Documents", "duplicateconfirm": "Are you sure you want to duplicate this job? Some elements of this job will not be duplicated.", + "employeeassignments": "Employee Assignments", "existing_jobs": "Existing Jobs", + "federal_tax_amt": "Federal Taxes", + "gpdollars": "$ G.P.", + "gppercent": "% G.P.", "hrs_claimed": "Hours Claimed", "hrs_total": "Hours Total", + "inproduction": "In Production", "job": "Job Details", + "jobcosting": "Job Costing", "laborallocations": "Labor Allocations", "lines": "Estimate Lines", + "local_tax_amt": "Local Taxes", + "mapa": "Paint Materials", + "mash": "Shop Materials", + "net_repairs": "Net Repairs", "notes": "Notes", "override_header": "Override estimate header on import?", "parts": "Parts", + "partsfilter": "Parts Only", + "partssubletstotal": "Parts & Sublets Total", + "partstotal": "Parts Total", "rates": "Rates", - "ratetotals": { - "lab": "Body Total" - }, - "vehicle_info": "Vehicle" + "rates_subtotal": "Rates Subtotal", + "reconciliationheader": "Parts & Sublet Reconciliation", + "sale_labor": "Sales - Labor", + "sale_parts": "Sales - Parts", + "state_tax_amt": "State/Provincial Taxes", + "subletstotal": "Sublets Total", + "subtotal": "Subtotal", + "suspense": "Suspense", + "total_cost": "Total Cost", + "total_repairs": "Total Repairs", + "total_sales": "Total Sales", + "totals": "Totals", + "vehicle_info": "Vehicle", + "viewallocations": "View Allocations" }, "successes": { + "addedtoproduction": "Job added to production board.", "all_deleted": "{{count}} jobs deleted successfully.", "converted": "Job converted successfully.", "created": "Job created successfully. Click to view.", "created_subtitle": "Estimate Number {{est_number}} has been created.", "creatednoclick": "Job created successfully. ", "deleted": "Job deleted successfully.", + "exported": "Job exported successfully. ", + "invoiced": "Job closed and invoiced successfully.", "save": "Job saved successfully.", "savetitle": "Record saved successfully.", "supplemented": "Job supplemented successfully. ", @@ -587,7 +914,12 @@ }, "header": { "accounting": "Accounting", + "accounting-payables": "Payables", + "accounting-payments": "Payments", + "accounting-receivables": "Receivables", "activejobs": "Active Jobs", + "alljobs": "All Jobs", + "allpayments": "All Payments", "availablejobs": "Available Jobs", "courtesycars": "Courtesy Cars", "courtesycars-all": "All Courtesy Cars", @@ -595,18 +927,35 @@ "courtesycars-newcontract": "New Contract", "customers": "Customers", "enterinvoices": "Enter Invoices", + "enterpayment": "Enter Payments", "entertimeticket": "Enter Time Tickets", + "export": "Export", "home": "Home", "invoices": "Invoices", "jobs": "Jobs", "owners": "Owners", + "productionboard": "Production Board", + "productionlist": "Production - List", + "recent": "Recent Items", "schedule": "Schedule", + "scoreboard": "Scoreboard", + "search": { + "jobs": "Jobs", + "owners": "Owners", + "payments": "Payments", + "vehicles": "Vehicles" + }, + "shiftclock": "Shift Clock", "shop": "My Shop", "shop_config": "Configuration", + "shop_csi": "CSI", + "shop_templates": "Templates", "shop_vendors": "Vendors", + "timetickets": "Time Tickets", "vehicles": "Vehicles" }, "jobsactions": { + "closejob": "Close Job", "duplicate": "Duplicate this Job", "newcccontract": "Create Courtesy Car Contract" }, @@ -622,11 +971,26 @@ "profilesidebar": { "profile": "My Profile", "shops": "My Shops" + }, + "tech": { + "home": "Home", + "jobclockin": "Job Clock In", + "jobclockout": "Job Clock Out", + "joblookup": "Job Lookup", + "login": "Login", + "logout": "Logout", + "productionboard": "Production Board", + "productionlist": "Production List" } }, "messaging": { + "actions": { + "link": "Link to Job" + }, "labels": { "messaging": "Messaging", + "nojobs": "Not associated to any job.", + "presets": "Presets", "typeamessage": "Send a message..." } }, @@ -668,6 +1032,7 @@ "ownr_addr1": "Address", "ownr_addr2": "Address 2", "ownr_city": "City", + "ownr_co_nm": "Owner Co. Name", "ownr_ctry": "Country", "ownr_ea": "Email", "ownr_fn": "First Name", @@ -678,6 +1043,11 @@ "ownr_zip": "Zip/Postal Code", "preferred_contact": "Preferred Contact Method" }, + "forms": { + "address": "Address", + "contact": "Contact Information", + "name": "Owner Details" + }, "labels": { "create_new": "Create a new owner record.", "existing_owners": "Existing Owners", @@ -695,56 +1065,218 @@ } }, "parts_orders": { + "actions": { + "backordered": "Backordered", + "receive": "Receive", + "receiveinvoice": "Receive Invoice" + }, "errors": { + "backordering": "Error backordering part {{message}}.", "creating": "Error encountered when creating parts order. " }, "fields": { "act_price": "Price", + "backordered_eta": "B.O. ETA", + "backordered_on": "B.O. On", "db_price": "DB Price", "deliver_by": "Deliver By", "job_line_id": "Job Line Id", "line_desc": "Line Description", "line_remarks": "Remarks", - "lineremarks": "Line Remarks" + "lineremarks": "Line Remarks", + "oem_partno": "Part #", + "order_date": "Order Date", + "order_number": "Order Number", + "quantity": "Qty.", + "status": "Status" }, "labels": { "email": "Send by Email", "inthisorder": "Parts in this Order", + "newpartsorder": "New Parts Order", "orderhistory": "Order History", - "print": "Show Printed Form" + "parts_orders": "Parts Orders", + "print": "Show Printed Form", + "returnpartsorder": "Return Parts Order" }, "successes": { "created": "Parts order created successfully. " } }, + "payments": { + "fields": { + "amount": "Amount", + "created_at": "Created At", + "exportedat": "Exported At", + "memo": "Memo", + "payer": "Payer", + "stripeid": "Stripe ID", + "transactionid": "Transaction ID", + "type": "Type" + }, + "labels": { + "electronicpayment": "Use Electronic Payment Processing?", + "new": "New Payment", + "signup": "Please contact support to sign up for electronic payments.", + "title": "Payments" + }, + "successes": { + "payment": "Payment created successfully. ", + "stripe": "Credit card transaction charged successfully." + } + }, + "printcenter": { + "errors": { + "nocontexttype": "No context type set." + }, + "jobs": { + "appointment_reminder": "Appointment Reminder", + "casl_work_authorization": "CASL Work Authorization", + "coversheet": "Coversheet", + "estimate_detail": "Estimate Details", + "fippa_work_authorization": "FIPPA Work Authorization", + "job_totals": "Job Totals Only", + "work_authorization": "Work Authorization" + }, + "labels": { + "misc": "Miscellaneous Documents", + "repairorder": "Repair Order Related", + "speedprint": "Speed Print", + "title": "Print Center" + } + }, + "production": { + "actions": { + "addcolumns": "Add Columns", + "bodypriority-clear": "Clear Body Priority", + "bodypriority-set": "Set Body Priority", + "paintpriority-clear": "Clear Paint Priority", + "paintpriority-set": "Set Paint Priority", + "remove": "Remove from Production", + "removecolumn": "Remove Column", + "saveconfig": "Save Configuration" + }, + "errors": { + "boardupdate": "Error encountered updating job. {{message}}", + "removing": "Error removing from production board. {{error}}" + }, + "labels": { + "alert": "Alert", + "alertoff": "Remove alert from job", + "alerton": "Add alert to job", + "bodyhours": "B", + "bodypriority": "B/P", + "cycletime": "C/T", + "jobdetail": "Job Details", + "note": "Production Note", + "paintpriority": "P/P", + "refinishhours": "R" + } + }, "profile": { "errors": { "state": "Error reading page state. Please refresh." } }, + "scoreboard": { + "errors": { + "adding": "Error adding job to scoreboard. {{message}}", + "removing": "Error removing job from scoreboard. {{message}}" + }, + "fields": { + "bodyhrs": "Body Hours", + "date": "Date", + "painthrs": "Paint Hours" + }, + "labels": { + "asoftodaytarget": "As of Today", + "dailytarget": "Daily", + "monthlytarget": "Monthly", + "weeklytarget": "Weekly", + "workingdays": "Working Days / Month" + }, + "successes": { + "added": "Job added to scoreboard.", + "removed": "Job removed from scoreboard." + } + }, + "tech": { + "fields": { + "employeeid": "Employee ID", + "pin": "PIN" + }, + "labels": { + "loggedin": "Logged in as {{name}}", + "notloggedin": "Not logged in." + } + }, + "templates": { + "errors": { + "updating": "Error updating template {{error}}." + }, + "successes": { + "updated": "Template updated successfully." + } + }, "timetickets": { "actions": { - "enter": "Enter New Time Ticket" + "clockin": "Clock In", + "clockout": "Clock Out", + "enter": "Enter New Time Ticket", + "printemployee": "Print Time Tickets" + }, + "errors": { + "clockingin": "Error while clocking in. {{message}}", + "clockingout": "Error while clocking out. {{message}}", + "creating": "Error creating time ticket. {{message}}", + "deleting": "Error deleting time ticket. {{message}}" }, "fields": { "actualhrs": "Actual Hours", "ciecacode": "CIECA Code", + "clockhours": "Clock Hours", + "clockoff": "Clock Off", + "clockon": "Clocked In", "cost_center": "Cost Center", "date": "Ticket Date", + "efficiency": "Efficiency", "employee": "Employee", + "memo": "Memo", "productivehrs": "Productive Hours", "ro_number": "Job to Post Against" }, "labels": { + "alreadyclockedon": "You are already clocked in to the following job(s):", + "ambreak": "AM Break", + "amshift": "AM Shift", + "clockhours": "Shift Clock Hours Summary", + "clockintojob": "Clock In to Job", + "deleteconfirm": "Are you sure you want to delete this time ticket? This cannot be undone.", "edit": "Edit Time Ticket", "flat_rate": "Flat Rate", + "jobhours": "Job Related Time Tickets Summary", + "lunch": "Lunch", "new": "New Time Ticket", + "pmbreak": "PM Break", + "pmshift": "PM Shift", + "shift": "Shift", + "shiftalreadyclockedon": "Active Shift Time Tickets", "straight_time": "Straight Time" + }, + "successes": { + "clockedin": "Clocked in successfully.", + "clockedout": "Clocked out successfully.", + "created": "Time ticket entered successfully.", + "deleted": "Time ticket deleted successfully." } }, "titles": { - "app": "Bodyshop by ImEX Systems", + "accounting-payables": "Payables | $t(titles.app)", + "accounting-receivables": "Receivables | $t(titles.app)", + "app": "ImEX Online", "bc": { + "accounting-payables": "Payables", + "accounting-receivables": "Receivables", "availablejobs": "Available Jobs", "contracts": "Contracts", "contracts-create": "New Contract", @@ -752,13 +1284,25 @@ "courtesycars": "Courtesy Cars", "courtesycars-detail": "Courtesy Car {{number}}", "courtesycars-new": "New Courtesy Car", + "invoices-list": "Invoices", "jobs": "Jobs", "jobs-active": "Active Jobs", + "jobs-all": "All Jobs", + "jobs-close": "Close Job", "jobs-detail": "Job {{number}}", + "jobs-intake": "Intake", "jobs-new": "Create a New Job", "owner-detail": "{{name}}", "owners": "Owners", + "payments-all": "All Payments", + "productionboard": "Production Board", + "productionlist": "Production - List", "schedule": "Schedule", + "scoreboard": "Scoreboard", + "shop": "Manage my Shop ({{shopname}})", + "shop-csi": "CSI Responses", + "shop-templates": "Shop Templates", + "timetickets": "Time Tickets", "vehicle-details": "Vehicle: {{vehicle}}", "vehicles": "Vehicles" }, @@ -768,18 +1312,31 @@ "courtesycars": "Courtesy Cars | $t(titles.app)", "courtesycars-create": "New Courtesy Car | $t(titles.app)", "courtesycars-detail": "Courtesy Car {{id}} | $t(titles.app)", + "invoices-list": "Invoices | $t(titles.app)", "jobs": "Active Jobs | $t(titles.app)", + "jobs-all": "All Jobs | $t(titles.app)", + "jobs-close": "Close Job {{number}} | $t(titles.app)", "jobs-create": "Create a New Job | $t(titles.app)", + "jobs-intake": "Intake | $t(titles.app)", "jobsavailable": "Available Jobs | $t(titles.app)", "jobsdetail": "Job {{ro_number}} | $t(titles.app)", "jobsdocuments": "Job Documents {{ro_number}} | $t(titles.app)", "manageroot": "Home | $t(titles.app)", "owners": "All Owners | $t(titles.app)", "owners-detail": "{{name}} | $t(titles.app)", + "payments-all": "Payments | $t(titles.app)", + "productionboard": "Production - Board", + "productionlist": "Production - List View | $t(titles.app)", "profile": "My Profile | $t(titles.app)", + "resetpassword": "Reset Password", + "resetpasswordvalidate": "Enter New Password", "schedule": "Schedule | $t(titles.app)", + "scoreboard": "Scoreboard | $t(titles.app)", "shop": "My Shop | $t(titles.app)", + "shop-csi": "CSI Responses | $t(titles.app)", + "shop-templates": "Shop Templates | $t(titles.app)", "shop_vendors": "Vendors | $t(titles.app)", + "timetickets": "Time Tickets | $t(titles.app)", "vehicledetail": "Vehicle Details {{vehicle}} | $t(titles.app)", "vehicles": "All Vehicles | $t(titles.app)" }, @@ -823,6 +1380,11 @@ "v_type": "Type", "v_vin": "Vehicle Identification Number" }, + "forms": { + "detail": "Vehicle Details", + "misc": "Miscellaneous", + "registration": "Registration" + }, "labels": { "updatevehicle": "Update Vehicle Information" }, diff --git a/client/src/translations/es/common.json b/client/src/translations/es/common.json index 93516f850..db1f5a20b 100644 --- a/client/src/translations/es/common.json +++ b/client/src/translations/es/common.json @@ -19,22 +19,28 @@ }, "appointments": { "actions": { + "block": "", "cancel": "Cancelar", "intake": "Consumo", "new": "Nueva cita", "reschedule": "Reprogramar", + "smartscheduling": "", "viewjob": "Ver trabajo" }, "errors": { - "canceling": "Error al cancelar la cita.", + "blocking": "", + "canceling": "Error al cancelar la cita. {{message}}", "saving": "Error al programar la cita. {{message}}" }, "fields": { + "time": "", "title": "Título" }, "labels": { "arrivedon": "Llegado el:", + "blocked": "", "cancelledappointment": "Cita cancelada para:", + "history": "", "nodateselected": "No se ha seleccionado ninguna fecha.", "priorappointments": "Nombramientos previos", "scheduledfor": "Cita programada para:" @@ -66,6 +72,10 @@ }, "bodyshop": { "actions": { + "addbucket": "", + "addpartslocation": "", + "addspeedprint": "", + "addtemplate": "", "newstatus": "" }, "errors": { @@ -75,15 +85,36 @@ "fields": { "address1": "", "address2": "", + "appt_length": "", "city": "", "country": "", + "dailybodytarget": "", + "dailypainttarget": "", "email": "", "federal_tax_id": "", "insurance_vendor_id": "", + "invoice_federal_tax_rate": "", + "invoice_local_tax_rate": "", + "invoice_state_tax_rate": "", + "lastnumberworkingdays": "", "logo_img_path": "", + "md_referral_sources": "", + "messaginglabel": "", + "messagingtext": "", + "noteslabel": "", + "notestext": "", + "partslocation": "", "responsibilitycenter": "", + "responsibilitycenter_accountdesc": "", + "responsibilitycenter_accountitem": "", + "responsibilitycenter_accountname": "", + "responsibilitycenter_accountnumber": "", + "responsibilitycenter_rate": "", "responsibilitycenters": { + "ap": "", + "ar": "", "atp": "", + "federal_tax": "", "lab": "", "lad": "", "lae": "", @@ -93,6 +124,9 @@ "lar": "", "las": "", "lau": "", + "local_tax": "", + "mapa": "", + "mash": "", "paa": "", "pac": "", "pal": "", @@ -101,9 +135,23 @@ "pao": "", "pap": "", "par": "", + "pas": "", + "state_tax": "", "tow": "" }, "shopname": "", + "speedprint": { + "id": "", + "label": "", + "templates": "" + }, + "ssbuckets": { + "gte": "", + "id": "", + "label": "", + "lt": "", + "target": "" + }, "state": "", "state_tax_id": "", "status": "", @@ -118,39 +166,62 @@ "default_invoiced": "", "default_ordered": "", "default_received": "", + "default_returned": "", "default_scheduled": "", - "open_statuses": "" + "default_void": "", + "open_statuses": "", + "production_statuses": "" }, "zip_post": "" }, "labels": { + "2tiername": "", + "2tiersetup": "", + "2tiersource": "", + "accountingtiers": "", "alljobstatuses": "", "allopenjobstatuses": "", + "customtemplates": "", + "intake": "", "jobstatuses": "", + "notemplatesavailable": "", "orderstatuses": "", "responsibilitycenters": { "costs": "", "profits": "", "title": "" }, - "shopinfo": "" + "scheduling": "", + "shopinfo": "", + "speedprint": "" }, "successes": { "save": "" } }, "contracts": { + "actions": { + "convertoro": "", + "decodelicense": "", + "senddltoform": "" + }, "errors": { "returning": "", "saving": "", "selectjobandcar": "" }, "fields": { + "actax": "", "actualreturn": "", "agreementnumber": "", "cc_cardholder": "", "cc_expiry": "", "cc_num": "", + "cleanupcharge": "", + "coverage": "", + "dailyfreekm": "", + "dailyrate": "", + "damagewaiver": "", "driver": "", "driver_addr1": "", "driver_addr2": "", @@ -164,12 +235,26 @@ "driver_ph1": "", "driver_state": "", "driver_zip": "", + "excesskmrate": "", + "federaltax": "", "kmend": "", "kmstart": "", + "localtax": "", + "refuelcharge": "", "scheduledreturn": "", "start": " ", + "statetax": "", "status": "" }, + "labels": { + "convertform": { + "applycleanupcharge": "", + "refuelqty": "" + }, + "correctdataonform": "", + "noteconvertedfrom": "", + "waitingforscan": "" + }, "status": { "new": "", "out": "", @@ -181,6 +266,7 @@ }, "courtesycars": { "actions": { + "new": "", "return": "" }, "errors": { @@ -233,6 +319,40 @@ "saved": "" } }, + "csi": { + "errors": { + "creating": "", + "notconfigured": "", + "notfoundsubtitle": "", + "notfoundtitle": "" + }, + "fields": { + "completedon": "" + }, + "labels": { + "noneselected": "", + "title": "" + }, + "successes": { + "created": "", + "submitted": "", + "submittedsub": "" + } + }, + "dashboard": { + "actions": { + "addcomponent": "" + }, + "errors": { + "updatinglayout": "" + }, + "titles": { + "monthlyrevenuegraph": "", + "productiondollars": "", + "productionhours": "", + "projectedmonthlysales": "" + } + }, "documents": { "actions": { "delete": "", @@ -265,8 +385,8 @@ "new": "Nuevo empleado" }, "errors": { - "delete": "Se encontró un error al eliminar al empleado.", - "save": "Se encontró un error al salvar al empleado.", + "delete": "Se encontró un error al eliminar al empleado. {{message}}", + "save": "Se encontró un error al salvar al empleado. {{message}}", "validation": "Por favor verifique todos los campos.", "validationtitle": "No se puede salvar al empleado." }, @@ -291,26 +411,61 @@ }, "general": { "actions": { + "add": "", "cancel": "", + "close": "", "create": "", "delete": "Borrar", + "deleteall": "", "edit": "Editar", - "reset": "Restablecer a original.", + "login": "", + "refresh": "", + "reset": " Restablecer a original.", + "resetpassword": "", "save": "Salvar", - "saveandnew": "" + "saveandnew": "", + "submit": "", + "submitticket": "" + }, + "itemtypes": { + "contract": "", + "courtesycar": "", + "job": "", + "owner": "", + "vehicle": "" }, "labels": { "actions": "Comportamiento", + "areyousure": "", "barcode": "código de barras", + "confirmpassword": "", + "email": "", + "errors": "", + "exceptiontitle": "", "in": "en", + "instanceconflictext": "", + "instanceconflictitle": "", "loading": "Cargando...", - "loadingapp": "Cargando Bodyshop.app", + "loadingapp": "Cargando $t(titles.app)", "loadingshop": "Cargando datos de la tienda ...", "loggingin": "Iniciando sesión ...", "na": "N / A", + "no": "", "out": "Afuera", + "password": "", + "passwordresetsuccess": "", + "passwordresetsuccess_sub": "", + "passwordsdonotmatch": "", + "print": "", + "required": "", "search": "Buscar...", - "unknown": "Desconocido" + "selectdate": "", + "sendagain": "", + "sendby": "", + "text": "", + "unknown": "Desconocido", + "username": "", + "yes": "" }, "languages": { "english": "Inglés", @@ -318,13 +473,32 @@ "spanish": "español" }, "messages": { - "unsavedchanges": "Usted tiene cambios no guardados." + "exception": "", + "unsavedchanges": "Usted tiene cambios no guardados.", + "unsavedchangespopup": "" }, "validation": { "invalidemail": "Por favor introduzca una dirección de correo electrónico válida.", "required": "Este campo es requerido." } }, + "intake": { + "actions": { + "printall": "" + }, + "errors": { + "intake": "", + "nochecklist": "" + }, + "labels": { + "addtoproduction": "", + "checklist": "", + "printpack": "" + }, + "successes": { + "intake": "" + } + }, "invoicelines": { "actions": { "newline": "" @@ -333,8 +507,13 @@ "actual": "", "actual_cost": "", "cost_center": "", + "federal_tax_applicable": "", + "jobline": "", "line_desc": "", - "retail": "" + "local_tax_applicable": "", + "quantity": "", + "retail": "", + "state_tax_applicable": "" }, "labels": { "entered": "", @@ -346,26 +525,43 @@ "invoices": { "actions": { "edit": "", - "receive": "" + "receive": "", + "return": "" }, "errors": { "creating": "", + "exporting": "", + "exporting-partner": "", "invalidro": "", "invalidvendor": "", "validation": "" }, "fields": { "date": "", + "federal_tax_rate": "", "invoice_number": "", "is_credit_memo": "", + "local_tax_rate": "", "ro_number": "", + "state_tax_rate": "", "total": "", "vendor": "", "vendorname": "" }, "labels": { "actions": "", - "new": "" + "discrepancy": "", + "entered_total": "", + "enteringcreditmemo": "", + "federal_tax": "", + "invoice_total": "", + "invoices": "", + "local_tax": "", + "new": "", + "noneselected": "", + "retailtotal": "", + "state_tax": "", + "subtotal": "" }, "successes": { "created": "" @@ -382,14 +578,41 @@ "fields": { "act_price": "Precio actual", "db_price": "Precio de base de datos", + "lbr_types": { + "LAA": "", + "LAB": "", + "LAD": "", + "LAE": "", + "LAF": "", + "LAG": "", + "LAM": "", + "LAR": "", + "LAS": "" + }, "line_desc": "Descripción de línea", "line_ind": "S#", + "line_no": "", + "location": "", "mod_lb_hrs": "Horas laborales", "mod_lbr_ty": "Tipo de trabajo", + "notes": "", "oem_partno": "OEM parte #", "op_code_desc": "", "part_qty": "", "part_type": "Tipo de parte", + "part_types": { + "CCC": "", + "CCD": "", + "CCDR": "", + "CCF": "", + "CCM": "", + "PAA": "", + "PAE": "", + "PAL": "", + "PAN": "", + "PAS": "", + "PASL": "" + }, "status": "Estado", "total": "", "unq_seq": "Seq #" @@ -400,27 +623,47 @@ }, "successes": { "created": "", + "saved": "", "updated": "" + }, + "validations": { + "zeropriceexistingpart": "" } }, "jobs": { "actions": { "addDocuments": "Agregar documentos de trabajo", "addNote": "Añadir la nota", + "addtoproduction": "", + "addtoscoreboard": "", + "allocate": "", + "autoallocate": "", "changestatus": "Cambiar Estado", "convert": "Convertir", + "export": "", + "exportselected": "", + "filterpartsonly": "", "gotojob": "", + "intake": "", "manualnew": "", + "mark": "", "postInvoices": "Contabilizar facturas", "printCenter": "Centro de impresión", - "schedule": "Programar" + "reconcile": "", + "schedule": "Programar", + "sendcsi": "" }, "errors": { + "addingtoproduction": "", "creating": "", "deleted": "Error al eliminar el trabajo.", + "exporting": "", + "exporting-partner": "", + "invoicing": "", "noaccess": "Este trabajo no existe o no tiene acceso a él.", "nodamage": "", "nodates": "No hay fechas especificadas para este trabajo.", + "nofinancial": "", "nojobselected": "No hay trabajo seleccionado.", "noowner": "Ningún propietario asociado.", "novehicle": "No hay vehículo asociado.", @@ -434,6 +677,11 @@ "actual_delivery": "Entrega real", "actual_in": "Real en", "adjustment_bottom_line": "Ajustes", + "ccc": "", + "ccd": "", + "ccdr": "", + "ccf": "", + "ccm": "", "cieca_id": "CIECA ID", "claim_total": "Reclamar total", "clm_no": "Reclamación #", @@ -449,6 +697,9 @@ "ded_amt": "Deducible", "ded_status": "Estado deducible", "depreciation_taxes": "Depreciación / Impuestos", + "employee_body": "", + "employee_prep": "", + "employee_refinish": "", "est_addr1": "Dirección del tasador", "est_co_nm": "Tasador", "est_ct_fn": "Nombre del tasador", @@ -465,17 +716,47 @@ "ins_ct_ln": "Apellido del manejador de archivos", "ins_ea": "Correo electrónico del controlador de archivos", "ins_ph1": "File Handler Phone #", + "intake": { + "label": "", + "name": "", + "required": "", + "type": "" + }, "kmin": "Kilometraje en", "kmout": "Kilometraje", + "la1": "", + "la2": "", + "la3": "", + "la4": "", + "laa": "", + "lab": "", "labor_rate_desc": "Nombre de la tasa laboral", + "lad": "", + "lae": "", + "laf": "", + "lag": "", + "lam": "", + "lar": "", + "las": "", + "lau": "", "loss_date": "Fecha de pérdida", "loss_desc": "Perdida de uso", + "mapa": "", + "mash": "", "other_amount_payable": "Otra cantidad a pagar", "owner": "Propietario", "owner_owing": "Cust. Debe", "ownr_ea": "Email", "ownr_ph1": "Teléfono 1", - "pay_date": "Fecha de inspección", + "paa": "", + "pal": "", + "pam": "", + "pan": "", + "pao": "", + "pap": "", + "par": "", + "pas": "", + "pay_date": "Fecha de Pay", "phoneshort": "PH", "policy_no": "Política #", "ponumber": "numero postal", @@ -523,13 +804,26 @@ "uploaded_by": "Subido por", "vehicle": "Vehículo" }, + "forms": { + "admindates": "", + "appraiserinfo": "", + "claiminfo": "", + "dedinfo": "", + "estdates": "", + "inscoinfo": "", + "laborrates": "", + "lossinfo": "", + "repairdates": "", + "scheddates": "" + }, "labels": { + "allocations": "", "appointmentconfirmation": "¿Enviar confirmación al cliente?", "audit": "", + "available": "", "availablenew": "", "availablesupplements": "", "cards": { - "appraiser": "Tasador", "customer": "Información al cliente", "damage": "Área de Daño", "dates": "fechas", @@ -542,6 +836,7 @@ "totals": "Totales", "vehicle": "Vehículo" }, + "cost": "", "create": { "jobinfo": "", "newowner": "", @@ -550,30 +845,62 @@ "vehicleinfo": "" }, "creating_new_job": "Creando nuevo trabajo ...", + "deductible": { + "no": "", + "waived": "", + "yes": "" + }, + "difference": "", "documents": "documentos", "duplicateconfirm": "", + "employeeassignments": "", "existing_jobs": "Empleos existentes", + "federal_tax_amt": "", + "gpdollars": "", + "gppercent": "", "hrs_claimed": "", "hrs_total": "", + "inproduction": "", "job": "", + "jobcosting": "", "laborallocations": "", "lines": "Líneas estimadas", + "local_tax_amt": "", + "mapa": "", + "mash": "", + "net_repairs": "", "notes": "Notas", "override_header": "¿Anular encabezado estimado al importar?", "parts": "Partes", + "partsfilter": "", + "partssubletstotal": "", + "partstotal": "", "rates": "Tarifas", - "ratetotals": { - "lab": "" - }, - "vehicle_info": "Vehículo" + "rates_subtotal": "", + "reconciliationheader": "", + "sale_labor": "", + "sale_parts": "", + "state_tax_amt": "", + "subletstotal": "", + "subtotal": "", + "suspense": "", + "total_cost": "", + "total_repairs": "", + "total_sales": "", + "totals": "", + "vehicle_info": "Vehículo", + "viewallocations": "" }, "successes": { + "addedtoproduction": "", "all_deleted": "{{count}} trabajos eliminados con éxito.", "converted": "Trabajo convertido con éxito.", "created": "Trabajo creado con éxito. Click para ver.", "created_subtitle": "", "creatednoclick": "", "deleted": "Trabajo eliminado con éxito.", + "exported": "", + "invoiced": "", "save": "Trabajo guardado con éxito.", "savetitle": "Registro guardado con éxito.", "supplemented": "Trabajo complementado con éxito.", @@ -587,7 +914,12 @@ }, "header": { "accounting": "", + "accounting-payables": "", + "accounting-payments": "", + "accounting-receivables": "", "activejobs": "Empleos activos", + "alljobs": "", + "allpayments": "", "availablejobs": "Trabajos disponibles", "courtesycars": "", "courtesycars-all": "", @@ -595,18 +927,35 @@ "courtesycars-newcontract": "", "customers": "Clientes", "enterinvoices": "", + "enterpayment": "", "entertimeticket": "", + "export": "", "home": "Casa", "invoices": "", "jobs": "Trabajos", "owners": "propietarios", + "productionboard": "", + "productionlist": "", + "recent": "", "schedule": "Programar", + "scoreboard": "", + "search": { + "jobs": "", + "owners": "", + "payments": "", + "vehicles": "" + }, + "shiftclock": "", "shop": "Mi tienda", "shop_config": "Configuración", + "shop_csi": "", + "shop_templates": "", "shop_vendors": "Vendedores", + "timetickets": "", "vehicles": "Vehículos" }, "jobsactions": { + "closejob": "", "duplicate": "", "newcccontract": "" }, @@ -622,11 +971,26 @@ "profilesidebar": { "profile": "Mi perfil", "shops": "Mis tiendas" + }, + "tech": { + "home": "", + "jobclockin": "", + "jobclockout": "", + "joblookup": "", + "login": "", + "logout": "", + "productionboard": "", + "productionlist": "" } }, "messaging": { + "actions": { + "link": "" + }, "labels": { "messaging": "Mensajería", + "nojobs": "", + "presets": "", "typeamessage": "Enviar un mensaje..." } }, @@ -668,6 +1032,7 @@ "ownr_addr1": "Dirección", "ownr_addr2": "Dirección 2", "ownr_city": "ciudad", + "ownr_co_nm": "", "ownr_ctry": "País", "ownr_ea": "Email", "ownr_fn": "Nombre de pila", @@ -678,6 +1043,11 @@ "ownr_zip": "código postal", "preferred_contact": "Método de Contacto Preferido" }, + "forms": { + "address": "", + "contact": "", + "name": "" + }, "labels": { "create_new": "Crea un nuevo registro de propietario.", "existing_owners": "Propietarios existentes", @@ -695,56 +1065,218 @@ } }, "parts_orders": { + "actions": { + "backordered": "", + "receive": "", + "receiveinvoice": "" + }, "errors": { + "backordering": "", "creating": "Se encontró un error al crear el pedido de piezas." }, "fields": { "act_price": "", + "backordered_eta": "", + "backordered_on": "", "db_price": "", "deliver_by": "Entregado por", "job_line_id": "", "line_desc": "", "line_remarks": "", - "lineremarks": "Comentarios de línea" + "lineremarks": "Comentarios de línea", + "oem_partno": "", + "order_date": "", + "order_number": "", + "quantity": "", + "status": "" }, "labels": { "email": "Enviar por correo electrónico", "inthisorder": "Partes en este pedido", + "newpartsorder": "", "orderhistory": "Historial de pedidos", - "print": "Mostrar formulario impreso" + "parts_orders": "", + "print": "Mostrar formulario impreso", + "returnpartsorder": "" }, "successes": { "created": "Pedido de piezas creado con éxito." } }, + "payments": { + "fields": { + "amount": "", + "created_at": "", + "exportedat": "", + "memo": "", + "payer": "", + "stripeid": "", + "transactionid": "", + "type": "" + }, + "labels": { + "electronicpayment": "", + "new": "", + "signup": "", + "title": "" + }, + "successes": { + "payment": "", + "stripe": "" + } + }, + "printcenter": { + "errors": { + "nocontexttype": "" + }, + "jobs": { + "appointment_reminder": "", + "casl_work_authorization": "", + "coversheet": "", + "estimate_detail": "", + "fippa_work_authorization": "", + "job_totals": "", + "work_authorization": "" + }, + "labels": { + "misc": "", + "repairorder": "", + "speedprint": "", + "title": "" + } + }, + "production": { + "actions": { + "addcolumns": "", + "bodypriority-clear": "", + "bodypriority-set": "", + "paintpriority-clear": "", + "paintpriority-set": "", + "remove": "", + "removecolumn": "", + "saveconfig": "" + }, + "errors": { + "boardupdate": "", + "removing": "" + }, + "labels": { + "alert": "", + "alertoff": "", + "alerton": "", + "bodyhours": "", + "bodypriority": "", + "cycletime": "", + "jobdetail": "", + "note": "", + "paintpriority": "", + "refinishhours": "" + } + }, "profile": { "errors": { "state": "Error al leer el estado de la página. Porfavor refresca." } }, + "scoreboard": { + "errors": { + "adding": "", + "removing": "" + }, + "fields": { + "bodyhrs": "", + "date": "", + "painthrs": "" + }, + "labels": { + "asoftodaytarget": "", + "dailytarget": "", + "monthlytarget": "", + "weeklytarget": "", + "workingdays": "" + }, + "successes": { + "added": "", + "removed": "" + } + }, + "tech": { + "fields": { + "employeeid": "", + "pin": "" + }, + "labels": { + "loggedin": "", + "notloggedin": "" + } + }, + "templates": { + "errors": { + "updating": "" + }, + "successes": { + "updated": "" + } + }, "timetickets": { "actions": { - "enter": "" + "clockin": "", + "clockout": "", + "enter": "", + "printemployee": "" + }, + "errors": { + "clockingin": "", + "clockingout": "", + "creating": "", + "deleting": "" }, "fields": { "actualhrs": "", "ciecacode": "", + "clockhours": "", + "clockoff": "", + "clockon": "", "cost_center": "", "date": "", + "efficiency": "", "employee": "", + "memo": "", "productivehrs": "", "ro_number": "" }, "labels": { + "alreadyclockedon": "", + "ambreak": "", + "amshift": "", + "clockhours": "", + "clockintojob": "", + "deleteconfirm": "", "edit": "", "flat_rate": "", + "jobhours": "", + "lunch": "", "new": "", + "pmbreak": "", + "pmshift": "", + "shift": "", + "shiftalreadyclockedon": "", "straight_time": "" + }, + "successes": { + "clockedin": "", + "clockedout": "", + "created": "", + "deleted": "" } }, "titles": { - "app": "Carrocería de ImEX Systems", + "accounting-payables": "", + "accounting-receivables": "", + "app": "ImEX Online", "bc": { + "accounting-payables": "", + "accounting-receivables": "", "availablejobs": "", "contracts": "", "contracts-create": "", @@ -752,13 +1284,25 @@ "courtesycars": "", "courtesycars-detail": "", "courtesycars-new": "", + "invoices-list": "", "jobs": "", "jobs-active": "", + "jobs-all": "", + "jobs-close": "", "jobs-detail": "", + "jobs-intake": "", "jobs-new": "", "owner-detail": "", "owners": "", + "payments-all": "", + "productionboard": "", + "productionlist": "", "schedule": "", + "scoreboard": "", + "shop": "", + "shop-csi": "", + "shop-templates": "", + "timetickets": "", "vehicle-details": "", "vehicles": "" }, @@ -768,18 +1312,31 @@ "courtesycars": "", "courtesycars-create": "", "courtesycars-detail": "", + "invoices-list": "", "jobs": "Todos los trabajos | $t(titles.app)", + "jobs-all": "", + "jobs-close": "", "jobs-create": "", + "jobs-intake": "", "jobsavailable": "Empleos disponibles | $t(titles.app)", "jobsdetail": "Trabajo {{ro_number}} | $t(titles.app)", "jobsdocuments": "Documentos de trabajo {{ro_number}} | $ t (títulos.app)", "manageroot": "Casa | $t(titles.app)", "owners": "Todos los propietarios | $t(titles.app)", "owners-detail": "", + "payments-all": "", + "productionboard": "", + "productionlist": "", "profile": "Mi perfil | $t(titles.app)", + "resetpassword": "", + "resetpasswordvalidate": "", "schedule": "Horario | $t(titles.app)", + "scoreboard": "", "shop": "Mi tienda | $t(titles.app)", + "shop-csi": "", + "shop-templates": "", "shop_vendors": "Vendedores | $t(titles.app)", + "timetickets": "", "vehicledetail": "Detalles del vehículo {{vehicle}} | $t(titles.app)", "vehicles": "Todos los vehiculos | $t(titles.app)" }, @@ -823,6 +1380,11 @@ "v_type": "Tipo", "v_vin": "Número de identificación del vehículo" }, + "forms": { + "detail": "", + "misc": "", + "registration": "" + }, "labels": { "updatevehicle": "" }, diff --git a/client/src/translations/fr/common.json b/client/src/translations/fr/common.json index 83bd483ae..86acc5d3e 100644 --- a/client/src/translations/fr/common.json +++ b/client/src/translations/fr/common.json @@ -19,22 +19,28 @@ }, "appointments": { "actions": { + "block": "", "cancel": "annuler", "intake": "Admission", "new": "Nouveau rendez-vous", "reschedule": "Replanifier", + "smartscheduling": "", "viewjob": "Voir le travail" }, "errors": { - "canceling": "Erreur lors de l'annulation du rendez-vous.", + "blocking": "", + "canceling": "Erreur lors de l'annulation du rendez-vous. {{message}}", "saving": "Erreur lors de la planification du rendez-vous. {{message}}" }, "fields": { + "time": "", "title": "Titre" }, "labels": { "arrivedon": "Arrivé le:", + "blocked": "", "cancelledappointment": "Rendez-vous annulé pour:", + "history": "", "nodateselected": "Aucune date n'a été sélectionnée.", "priorappointments": "Rendez-vous précédents", "scheduledfor": "Rendez-vous prévu pour:" @@ -66,6 +72,10 @@ }, "bodyshop": { "actions": { + "addbucket": "", + "addpartslocation": "", + "addspeedprint": "", + "addtemplate": "", "newstatus": "" }, "errors": { @@ -75,15 +85,36 @@ "fields": { "address1": "", "address2": "", + "appt_length": "", "city": "", "country": "", + "dailybodytarget": "", + "dailypainttarget": "", "email": "", "federal_tax_id": "", "insurance_vendor_id": "", + "invoice_federal_tax_rate": "", + "invoice_local_tax_rate": "", + "invoice_state_tax_rate": "", + "lastnumberworkingdays": "", "logo_img_path": "", + "md_referral_sources": "", + "messaginglabel": "", + "messagingtext": "", + "noteslabel": "", + "notestext": "", + "partslocation": "", "responsibilitycenter": "", + "responsibilitycenter_accountdesc": "", + "responsibilitycenter_accountitem": "", + "responsibilitycenter_accountname": "", + "responsibilitycenter_accountnumber": "", + "responsibilitycenter_rate": "", "responsibilitycenters": { + "ap": "", + "ar": "", "atp": "", + "federal_tax": "", "lab": "", "lad": "", "lae": "", @@ -93,6 +124,9 @@ "lar": "", "las": "", "lau": "", + "local_tax": "", + "mapa": "", + "mash": "", "paa": "", "pac": "", "pal": "", @@ -101,9 +135,23 @@ "pao": "", "pap": "", "par": "", + "pas": "", + "state_tax": "", "tow": "" }, "shopname": "", + "speedprint": { + "id": "", + "label": "", + "templates": "" + }, + "ssbuckets": { + "gte": "", + "id": "", + "label": "", + "lt": "", + "target": "" + }, "state": "", "state_tax_id": "", "status": "", @@ -118,39 +166,62 @@ "default_invoiced": "", "default_ordered": "", "default_received": "", + "default_returned": "", "default_scheduled": "", - "open_statuses": "" + "default_void": "", + "open_statuses": "", + "production_statuses": "" }, "zip_post": "" }, "labels": { + "2tiername": "", + "2tiersetup": "", + "2tiersource": "", + "accountingtiers": "", "alljobstatuses": "", "allopenjobstatuses": "", + "customtemplates": "", + "intake": "", "jobstatuses": "", + "notemplatesavailable": "", "orderstatuses": "", "responsibilitycenters": { "costs": "", "profits": "", "title": "" }, - "shopinfo": "" + "scheduling": "", + "shopinfo": "", + "speedprint": "" }, "successes": { "save": "" } }, "contracts": { + "actions": { + "convertoro": "", + "decodelicense": "", + "senddltoform": "" + }, "errors": { "returning": "", "saving": "", "selectjobandcar": "" }, "fields": { + "actax": "", "actualreturn": "", "agreementnumber": "", "cc_cardholder": "", "cc_expiry": "", "cc_num": "", + "cleanupcharge": "", + "coverage": "", + "dailyfreekm": "", + "dailyrate": "", + "damagewaiver": "", "driver": "", "driver_addr1": "", "driver_addr2": "", @@ -164,12 +235,26 @@ "driver_ph1": "", "driver_state": "", "driver_zip": "", + "excesskmrate": "", + "federaltax": "", "kmend": "", "kmstart": "", + "localtax": "", + "refuelcharge": "", "scheduledreturn": "", "start": "", + "statetax": "", "status": "" }, + "labels": { + "convertform": { + "applycleanupcharge": "", + "refuelqty": "" + }, + "correctdataonform": "", + "noteconvertedfrom": "", + "waitingforscan": "" + }, "status": { "new": "", "out": "", @@ -181,6 +266,7 @@ }, "courtesycars": { "actions": { + "new": "", "return": "" }, "errors": { @@ -233,6 +319,40 @@ "saved": "" } }, + "csi": { + "errors": { + "creating": "", + "notconfigured": "", + "notfoundsubtitle": "", + "notfoundtitle": "" + }, + "fields": { + "completedon": "" + }, + "labels": { + "noneselected": "", + "title": "" + }, + "successes": { + "created": "", + "submitted": "", + "submittedsub": "" + } + }, + "dashboard": { + "actions": { + "addcomponent": "" + }, + "errors": { + "updatinglayout": "" + }, + "titles": { + "monthlyrevenuegraph": "", + "productiondollars": "", + "productionhours": "", + "projectedmonthlysales": "" + } + }, "documents": { "actions": { "delete": "", @@ -265,8 +385,8 @@ "new": "Nouvel employé" }, "errors": { - "delete": "Erreur rencontrée lors de la suppression de l'employé.", - "save": "Une erreur s'est produite lors de l'enregistrement de l'employé.", + "delete": "Erreur rencontrée lors de la suppression de l'employé. {{message}}", + "save": "Une erreur s'est produite lors de l'enregistrement de l'employé. {{message}}", "validation": "Veuillez cocher tous les champs.", "validationtitle": "Impossible d'enregistrer l'employé." }, @@ -291,26 +411,61 @@ }, "general": { "actions": { + "add": "", "cancel": "", + "close": "", "create": "", "delete": "Effacer", + "deleteall": "", "edit": "modifier", - "reset": "Rétablir l'original.", + "login": "", + "refresh": "", + "reset": " Rétablir l'original.", + "resetpassword": "", "save": "sauvegarder", - "saveandnew": "" + "saveandnew": "", + "submit": "", + "submitticket": "" + }, + "itemtypes": { + "contract": "", + "courtesycar": "", + "job": "", + "owner": "", + "vehicle": "" }, "labels": { "actions": "actes", + "areyousure": "", "barcode": "code à barre", + "confirmpassword": "", + "email": "", + "errors": "", + "exceptiontitle": "", "in": "dans", + "instanceconflictext": "", + "instanceconflictitle": "", "loading": "Chargement...", - "loadingapp": "Chargement de Bodyshop.app", + "loadingapp": "Chargement de $t(titles.app)", "loadingshop": "Chargement des données de la boutique ...", "loggingin": "Vous connecter ...", "na": "N / A", + "no": "", "out": "En dehors", + "password": "", + "passwordresetsuccess": "", + "passwordresetsuccess_sub": "", + "passwordsdonotmatch": "", + "print": "", + "required": "", "search": "Chercher...", - "unknown": "Inconnu" + "selectdate": "", + "sendagain": "", + "sendby": "", + "text": "", + "unknown": "Inconnu", + "username": "", + "yes": "" }, "languages": { "english": "Anglais", @@ -318,13 +473,32 @@ "spanish": "Espanol" }, "messages": { - "unsavedchanges": "Vous avez des changements non enregistrés." + "exception": "", + "unsavedchanges": "Vous avez des changements non enregistrés.", + "unsavedchangespopup": "" }, "validation": { "invalidemail": "S'il vous plaît entrer un email valide.", "required": "Ce champ est requis." } }, + "intake": { + "actions": { + "printall": "" + }, + "errors": { + "intake": "", + "nochecklist": "" + }, + "labels": { + "addtoproduction": "", + "checklist": "", + "printpack": "" + }, + "successes": { + "intake": "" + } + }, "invoicelines": { "actions": { "newline": "" @@ -333,8 +507,13 @@ "actual": "", "actual_cost": "", "cost_center": "", + "federal_tax_applicable": "", + "jobline": "", "line_desc": "", - "retail": "" + "local_tax_applicable": "", + "quantity": "", + "retail": "", + "state_tax_applicable": "" }, "labels": { "entered": "", @@ -346,26 +525,43 @@ "invoices": { "actions": { "edit": "", - "receive": "" + "receive": "", + "return": "" }, "errors": { "creating": "", + "exporting": "", + "exporting-partner": "", "invalidro": "", "invalidvendor": "", "validation": "" }, "fields": { "date": "", + "federal_tax_rate": "", "invoice_number": "", "is_credit_memo": "", + "local_tax_rate": "", "ro_number": "", + "state_tax_rate": "", "total": "", "vendor": "", "vendorname": "" }, "labels": { "actions": "", - "new": "" + "discrepancy": "", + "entered_total": "", + "enteringcreditmemo": "", + "federal_tax": "", + "invoice_total": "", + "invoices": "", + "local_tax": "", + "new": "", + "noneselected": "", + "retailtotal": "", + "state_tax": "", + "subtotal": "" }, "successes": { "created": "" @@ -382,14 +578,41 @@ "fields": { "act_price": "Prix actuel", "db_price": "Prix de la base de données", + "lbr_types": { + "LAA": "", + "LAB": "", + "LAD": "", + "LAE": "", + "LAF": "", + "LAG": "", + "LAM": "", + "LAR": "", + "LAS": "" + }, "line_desc": "Description de la ligne", "line_ind": "S#", + "line_no": "", + "location": "", "mod_lb_hrs": "Heures de travail", "mod_lbr_ty": "Type de travail", + "notes": "", "oem_partno": "Pièce OEM #", "op_code_desc": "", "part_qty": "", "part_type": "Type de pièce", + "part_types": { + "CCC": "", + "CCD": "", + "CCDR": "", + "CCF": "", + "CCM": "", + "PAA": "", + "PAE": "", + "PAL": "", + "PAN": "", + "PAS": "", + "PASL": "" + }, "status": "Statut", "total": "", "unq_seq": "Seq #" @@ -400,27 +623,47 @@ }, "successes": { "created": "", + "saved": "", "updated": "" + }, + "validations": { + "zeropriceexistingpart": "" } }, "jobs": { "actions": { "addDocuments": "Ajouter des documents de travail", "addNote": "Ajouter une note", + "addtoproduction": "", + "addtoscoreboard": "", + "allocate": "", + "autoallocate": "", "changestatus": "Changer le statut", "convert": "Convertir", + "export": "", + "exportselected": "", + "filterpartsonly": "", "gotojob": "", + "intake": "", "manualnew": "", + "mark": "", "postInvoices": "Poster des factures", "printCenter": "Centre d'impression", - "schedule": "Programme" + "reconcile": "", + "schedule": "Programme", + "sendcsi": "" }, "errors": { + "addingtoproduction": "", "creating": "", "deleted": "Erreur lors de la suppression du travail.", + "exporting": "", + "exporting-partner": "", + "invoicing": "", "noaccess": "Ce travail n'existe pas ou vous n'y avez pas accès.", "nodamage": "", "nodates": "Aucune date spécifiée pour ce travail.", + "nofinancial": "", "nojobselected": "Aucun travail n'est sélectionné.", "noowner": "Aucun propriétaire associé.", "novehicle": "Aucun véhicule associé.", @@ -434,6 +677,11 @@ "actual_delivery": "Livraison réelle", "actual_in": "En réel", "adjustment_bottom_line": "Ajustements", + "ccc": "", + "ccd": "", + "ccdr": "", + "ccf": "", + "ccm": "", "cieca_id": "CIECA ID", "claim_total": "Total réclamation", "clm_no": "Prétendre #", @@ -449,6 +697,9 @@ "ded_amt": "Déductible", "ded_status": "Statut de franchise", "depreciation_taxes": "Amortissement / taxes", + "employee_body": "", + "employee_prep": "", + "employee_refinish": "", "est_addr1": "Adresse de l'évaluateur", "est_co_nm": "Expert", "est_ct_fn": "Prénom de l'évaluateur", @@ -465,17 +716,47 @@ "ins_ct_ln": "Nom du gestionnaire de fichiers", "ins_ea": "Courriel du gestionnaire de fichiers", "ins_ph1": "Numéro de téléphone du gestionnaire de fichiers", + "intake": { + "label": "", + "name": "", + "required": "", + "type": "" + }, "kmin": "Kilométrage en", "kmout": "Kilométrage hors", + "la1": "", + "la2": "", + "la3": "", + "la4": "", + "laa": "", + "lab": "", "labor_rate_desc": "Nom du taux de main-d'œuvre", + "lad": "", + "lae": "", + "laf": "", + "lag": "", + "lam": "", + "lar": "", + "las": "", + "lau": "", "loss_date": "Date de perte", "loss_desc": "Perte d'usage", + "mapa": "", + "mash": "", "other_amount_payable": "Autre montant à payer", "owner": "Propriétaire", "owner_owing": "Cust. Owes", "ownr_ea": "Email", "ownr_ph1": "Téléphone 1", - "pay_date": "Date d'inspection", + "paa": "", + "pal": "", + "pam": "", + "pan": "", + "pao": "", + "pap": "", + "par": "", + "pas": "", + "pay_date": "Date d'Pay", "phoneshort": "PH", "policy_no": "Politique #", "ponumber": "Numéro de bon de commande", @@ -523,13 +804,26 @@ "uploaded_by": "Telechargé par", "vehicle": "Véhicule" }, + "forms": { + "admindates": "", + "appraiserinfo": "", + "claiminfo": "", + "dedinfo": "", + "estdates": "", + "inscoinfo": "", + "laborrates": "", + "lossinfo": "", + "repairdates": "", + "scheddates": "" + }, "labels": { + "allocations": "", "appointmentconfirmation": "Envoyer une confirmation au client?", "audit": "", + "available": "", "availablenew": "", "availablesupplements": "", "cards": { - "appraiser": "Expert", "customer": "Informations client", "damage": "Zone de dommages", "dates": "Rendez-vous", @@ -542,6 +836,7 @@ "totals": "Totaux", "vehicle": "Véhicule" }, + "cost": "", "create": { "jobinfo": "", "newowner": "", @@ -550,30 +845,62 @@ "vehicleinfo": "" }, "creating_new_job": "Création d'un nouvel emploi ...", + "deductible": { + "no": "", + "waived": "", + "yes": "" + }, + "difference": "", "documents": "Les documents", "duplicateconfirm": "", + "employeeassignments": "", "existing_jobs": "Emplois existants", + "federal_tax_amt": "", + "gpdollars": "", + "gppercent": "", "hrs_claimed": "", "hrs_total": "", + "inproduction": "", "job": "", + "jobcosting": "", "laborallocations": "", "lines": "Estimer les lignes", + "local_tax_amt": "", + "mapa": "", + "mash": "", + "net_repairs": "", "notes": "Remarques", "override_header": "Remplacer l'en-tête d'estimation à l'importation?", "parts": "les pièces", + "partsfilter": "", + "partssubletstotal": "", + "partstotal": "", "rates": "Les taux", - "ratetotals": { - "lab": "" - }, - "vehicle_info": "Véhicule" + "rates_subtotal": "", + "reconciliationheader": "", + "sale_labor": "", + "sale_parts": "", + "state_tax_amt": "", + "subletstotal": "", + "subtotal": "", + "suspense": "", + "total_cost": "", + "total_repairs": "", + "total_sales": "", + "totals": "", + "vehicle_info": "Véhicule", + "viewallocations": "" }, "successes": { + "addedtoproduction": "", "all_deleted": "{{count}} travaux supprimés avec succès.", "converted": "Travail converti avec succès.", "created": "Le travail a été créé avec succès. Clique pour voir.", "created_subtitle": "", "creatednoclick": "", "deleted": "Le travail a bien été supprimé.", + "exported": "", + "invoiced": "", "save": "Le travail a été enregistré avec succès.", "savetitle": "Enregistrement enregistré avec succès.", "supplemented": "Travail complété avec succès.", @@ -587,7 +914,12 @@ }, "header": { "accounting": "", + "accounting-payables": "", + "accounting-payments": "", + "accounting-receivables": "", "activejobs": "Emplois actifs", + "alljobs": "", + "allpayments": "", "availablejobs": "Emplois disponibles", "courtesycars": "", "courtesycars-all": "", @@ -595,18 +927,35 @@ "courtesycars-newcontract": "", "customers": "Les clients", "enterinvoices": "", + "enterpayment": "", "entertimeticket": "", + "export": "", "home": "Accueil", "invoices": "", "jobs": "Emplois", "owners": "Propriétaires", + "productionboard": "", + "productionlist": "", + "recent": "", "schedule": "Programme", + "scoreboard": "", + "search": { + "jobs": "", + "owners": "", + "payments": "", + "vehicles": "" + }, + "shiftclock": "", "shop": "Mon magasin", "shop_config": "Configuration", + "shop_csi": "", + "shop_templates": "", "shop_vendors": "Vendeurs", + "timetickets": "", "vehicles": "Véhicules" }, "jobsactions": { + "closejob": "", "duplicate": "", "newcccontract": "" }, @@ -622,11 +971,26 @@ "profilesidebar": { "profile": "Mon profil", "shops": "Mes boutiques" + }, + "tech": { + "home": "", + "jobclockin": "", + "jobclockout": "", + "joblookup": "", + "login": "", + "logout": "", + "productionboard": "", + "productionlist": "" } }, "messaging": { + "actions": { + "link": "" + }, "labels": { "messaging": "Messagerie", + "nojobs": "", + "presets": "", "typeamessage": "Envoyer un message..." } }, @@ -668,6 +1032,7 @@ "ownr_addr1": "Adresse", "ownr_addr2": "Adresse 2 ", "ownr_city": "Ville", + "ownr_co_nm": "", "ownr_ctry": "Pays", "ownr_ea": "Email", "ownr_fn": "Prénom", @@ -678,6 +1043,11 @@ "ownr_zip": "Zip / code postal", "preferred_contact": "Méthode de contact préférée" }, + "forms": { + "address": "", + "contact": "", + "name": "" + }, "labels": { "create_new": "Créez un nouvel enregistrement de propriétaire.", "existing_owners": "Propriétaires existants", @@ -695,56 +1065,218 @@ } }, "parts_orders": { + "actions": { + "backordered": "", + "receive": "", + "receiveinvoice": "" + }, "errors": { + "backordering": "", "creating": "Erreur rencontrée lors de la création de la commande de pièces." }, "fields": { "act_price": "", + "backordered_eta": "", + "backordered_on": "", "db_price": "", "deliver_by": "Livrer par", "job_line_id": "", "line_desc": "", "line_remarks": "", - "lineremarks": "Remarques sur la ligne" + "lineremarks": "Remarques sur la ligne", + "oem_partno": "", + "order_date": "", + "order_number": "", + "quantity": "", + "status": "" }, "labels": { "email": "Envoyé par email", "inthisorder": "Pièces dans cette commande", + "newpartsorder": "", "orderhistory": "Historique des commandes", - "print": "Afficher le formulaire imprimé" + "parts_orders": "", + "print": "Afficher le formulaire imprimé", + "returnpartsorder": "" }, "successes": { "created": "Commande de pièces créée avec succès." } }, + "payments": { + "fields": { + "amount": "", + "created_at": "", + "exportedat": "", + "memo": "", + "payer": "", + "stripeid": "", + "transactionid": "", + "type": "" + }, + "labels": { + "electronicpayment": "", + "new": "", + "signup": "", + "title": "" + }, + "successes": { + "payment": "", + "stripe": "" + } + }, + "printcenter": { + "errors": { + "nocontexttype": "" + }, + "jobs": { + "appointment_reminder": "", + "casl_work_authorization": "", + "coversheet": "", + "estimate_detail": "", + "fippa_work_authorization": "", + "job_totals": "", + "work_authorization": "" + }, + "labels": { + "misc": "", + "repairorder": "", + "speedprint": "", + "title": "" + } + }, + "production": { + "actions": { + "addcolumns": "", + "bodypriority-clear": "", + "bodypriority-set": "", + "paintpriority-clear": "", + "paintpriority-set": "", + "remove": "", + "removecolumn": "", + "saveconfig": "" + }, + "errors": { + "boardupdate": "", + "removing": "" + }, + "labels": { + "alert": "", + "alertoff": "", + "alerton": "", + "bodyhours": "", + "bodypriority": "", + "cycletime": "", + "jobdetail": "", + "note": "", + "paintpriority": "", + "refinishhours": "" + } + }, "profile": { "errors": { "state": "Erreur lors de la lecture de l'état de la page. Rafraichissez, s'il vous plait." } }, + "scoreboard": { + "errors": { + "adding": "", + "removing": "" + }, + "fields": { + "bodyhrs": "", + "date": "", + "painthrs": "" + }, + "labels": { + "asoftodaytarget": "", + "dailytarget": "", + "monthlytarget": "", + "weeklytarget": "", + "workingdays": "" + }, + "successes": { + "added": "", + "removed": "" + } + }, + "tech": { + "fields": { + "employeeid": "", + "pin": "" + }, + "labels": { + "loggedin": "", + "notloggedin": "" + } + }, + "templates": { + "errors": { + "updating": "" + }, + "successes": { + "updated": "" + } + }, "timetickets": { "actions": { - "enter": "" + "clockin": "", + "clockout": "", + "enter": "", + "printemployee": "" + }, + "errors": { + "clockingin": "", + "clockingout": "", + "creating": "", + "deleting": "" }, "fields": { "actualhrs": "", "ciecacode": "", + "clockhours": "", + "clockoff": "", + "clockon": "", "cost_center": "", "date": "", + "efficiency": "", "employee": "", + "memo": "", "productivehrs": "", "ro_number": "" }, "labels": { + "alreadyclockedon": "", + "ambreak": "", + "amshift": "", + "clockhours": "", + "clockintojob": "", + "deleteconfirm": "", "edit": "", "flat_rate": "", + "jobhours": "", + "lunch": "", "new": "", + "pmbreak": "", + "pmshift": "", + "shift": "", + "shiftalreadyclockedon": "", "straight_time": "" + }, + "successes": { + "clockedin": "", + "clockedout": "", + "created": "", + "deleted": "" } }, "titles": { - "app": "Carrosserie par ImEX Systems", + "accounting-payables": "", + "accounting-receivables": "", + "app": "ImEX Online", "bc": { + "accounting-payables": "", + "accounting-receivables": "", "availablejobs": "", "contracts": "", "contracts-create": "", @@ -752,13 +1284,25 @@ "courtesycars": "", "courtesycars-detail": "", "courtesycars-new": "", + "invoices-list": "", "jobs": "", "jobs-active": "", + "jobs-all": "", + "jobs-close": "", "jobs-detail": "", + "jobs-intake": "", "jobs-new": "", "owner-detail": "", "owners": "", + "payments-all": "", + "productionboard": "", + "productionlist": "", "schedule": "", + "scoreboard": "", + "shop": "", + "shop-csi": "", + "shop-templates": "", + "timetickets": "", "vehicle-details": "", "vehicles": "" }, @@ -768,18 +1312,31 @@ "courtesycars": "", "courtesycars-create": "", "courtesycars-detail": "", + "invoices-list": "", "jobs": "Tous les emplois | $t(titles.app)", + "jobs-all": "", + "jobs-close": "", "jobs-create": "", + "jobs-intake": "", "jobsavailable": "Emplois disponibles | $t(titles.app)", "jobsdetail": "Travail {{ro_number}} | $t(titles.app)", "jobsdocuments": "Documents de travail {{ro_number}} | $ t (titres.app)", "manageroot": "Accueil | $t(titles.app)", "owners": "Tous les propriétaires | $t(titles.app)", "owners-detail": "", + "payments-all": "", + "productionboard": "", + "productionlist": "", "profile": "Mon profil | $t(titles.app)", + "resetpassword": "", + "resetpasswordvalidate": "", "schedule": "Horaire | $t(titles.app)", + "scoreboard": "", "shop": "Mon magasin | $t(titles.app)", + "shop-csi": "", + "shop-templates": "", "shop_vendors": "Vendeurs | $t(titles.app)", + "timetickets": "", "vehicledetail": "Détails du véhicule {{vehicle} | $t(titles.app)", "vehicles": "Tous les véhicules | $t(titles.app)" }, @@ -823,6 +1380,11 @@ "v_type": "Type", "v_vin": "Plaque d'immatriculation" }, + "forms": { + "detail": "", + "misc": "", + "registration": "" + }, "labels": { "updatevehicle": "" }, diff --git a/client/src/translations/i18n.js b/client/src/translations/i18n.js index 7415220f1..61863eb77 100644 --- a/client/src/translations/i18n.js +++ b/client/src/translations/i18n.js @@ -20,7 +20,7 @@ i18n //lng: "en", detection: {}, fallbackLng: "en-US", - debug: true, + debug: process.env.NODE_ENV === "production" ? false : true, //keySeparator: false, // we do not use keys in form messages.welcome diff --git a/client/src/utils/DateFormatter.jsx b/client/src/utils/DateFormatter.jsx index 07a41d7b4..1989c53ea 100644 --- a/client/src/utils/DateFormatter.jsx +++ b/client/src/utils/DateFormatter.jsx @@ -2,9 +2,13 @@ import React from "react"; import Moment from "react-moment"; export function DateFormatter(props) { - return {props.children || null}; + return props.children ? ( + {props.children} + ) : null; } export function DateTimeFormatter(props) { - return {props.children || ""}; + return props.children ? ( + {props.children} + ) : null; } diff --git a/client/src/utils/PhoneFormatter.jsx b/client/src/utils/PhoneFormatter.jsx index b0ee5bc4b..7a620dce8 100644 --- a/client/src/utils/PhoneFormatter.jsx +++ b/client/src/utils/PhoneFormatter.jsx @@ -6,7 +6,7 @@ export default function PhoneNumberFormatter(props) { ); diff --git a/client/src/utils/RenderTemplate.js b/client/src/utils/RenderTemplate.js new file mode 100644 index 000000000..1b959e4a8 --- /dev/null +++ b/client/src/utils/RenderTemplate.js @@ -0,0 +1,57 @@ +import gql from "graphql-tag"; +import { QUERY_TEMPLATES_BY_NAME } from "../graphql/templates.queries"; +import axios from "axios"; +import { client } from "../App/App.container"; + +export default async function RenderTemplate(templateObject, bodyshop) { + const { data: templateRecords } = await client.query({ + query: QUERY_TEMPLATES_BY_NAME, + variables: { name: templateObject.name }, + fetchPolicy: "network-only", + }); + + let templateToUse; + + if (templateRecords.templates.length === 1) { + console.log("[ITE] Using OOTB template."); + templateToUse = templateRecords.templates[0]; + } else if (templateRecords.templates.length === 2) { + console.log("[ITE] Found custom template."); + templateToUse = templateRecords.templates.filter((t) => !!t.bodyshopid)[0]; + console.log("templateToUse", templateToUse); + } else { + //No template found.Uh oh. + alert("Error: Template key does not exist."); + throw new Error("Template key does not exist."); + } + + const { data: contextData } = await client.query({ + query: gql(templateToUse.query), + variables: { ...templateObject.variables }, + fetchPolicy: "network-only", + }); + + const { data } = await axios.post("/render", { + view: templateToUse.html, + context: { ...contextData, bodyshop: bodyshop }, + }); + return new Promise((resolve, reject) => { + resolve(data); + }); +} + +export const displayTemplateInWindow = (html) => { + try { + var newWin = window.open("", "_blank", "toolbar=0,location=0,menubar=0"); + newWin.document.write(html); + + setTimeout(function () { + newWin.document.close(); + newWin.focus(); + newWin.print(); + newWin.close(); + }, 500); + } catch (error) { + console.log("Unable to write to new window.", error); + } +}; diff --git a/client/src/utils/TemplateConstants.js b/client/src/utils/TemplateConstants.js new file mode 100644 index 000000000..023ef4ba9 --- /dev/null +++ b/client/src/utils/TemplateConstants.js @@ -0,0 +1,68 @@ +export const EmailSettings = { + fromNameDefault: "ImEX Online", + fromAddress: "noreply@imex.online", +}; + +export const TemplateList = { + appointment_reminder: { + title: "Appointment Reminder", + description: "Sent to a customer as a reminder of an upcoming appointment.", + drivingId: "appointment", + key: "appointment_reminder", + }, + appointment_confirmation: { + title: "Appointment Confirmation", + description: + "Sent to a customer as a Confirmation of an upcoming appointment.", + drivingId: "appointment", + key: "appointment_confirmation", + }, + parts_order_confirmation: { + title: "Parts Order Confirmation", + description: "Parts order template including part details", + drivingId: "partsorder", + key: "parts_order_confirmation", + }, + estimate_detail: { + title: "Estimate Detail Lines", + description: "Est Detail", + drivingId: "job", + key: "estimate_detail", + }, + cover_sheet_landscape: { + title: "Cover Sheet - Landscape", + description: "Cover sheet landscape", + drivingId: "job", + key: "cover_sheet_landscape", + }, + cover_sheet_portrait: { + title: "Cover Sheet - portrait", + description: "Cover sheet portrait", + drivingId: "job", + key: "cover_sheet_portrait", + }, + parts_return_confirmation: { + title: "Parts Return Confirmation", + description: "Parts Return template including part details", + drivingId: "partsorder", + key: "parts_return_confirmation", + }, + csi_invitation: { + title: "Customer Survey Invitation", + description: "Customer Survey Invitation", + drivingId: "csi", + key: "csi_invitation", + }, + payment_receipt: { + title: "Payment Receipt", + description: "Receipt of payment for customer", + drivingId: "payment", + key: "payment_receipt", + }, + time_tickets_by_employee: { + title: "Time Tickets by Employee", + description: "Time tickets for employee with date range", + drivingId: "employee", + key: "time_tickets_by_employee", + }, +}; diff --git a/client/src/utils/aamva.js b/client/src/utils/aamva.js new file mode 100644 index 000000000..9c6d75d4b --- /dev/null +++ b/client/src/utils/aamva.js @@ -0,0 +1,558 @@ +(function (global) { + var parse = function (data) { + data = data.replace(/\n/, ""); + // replace spaces with regular space + data = data.replace(/\s/g, " "); + + if (/^@/.test(data) === true) { + return pdf417(data); + } else if (/^%/.test(data) === true) { + return stripe(data); + } else { + console.log("couldnt identify format"); + } + }; + + var parseDate = function (date) { + var start = parseInt(date[0] + date[1]); + if (start < 13) { + return ( + date[4] + + date[5] + + date[6] + + date[7] + + date[0] + + date[1] + + date[2] + + date[3] + ); + } + return date; + }; + + var stripe = function (data) { + data = data.replace(/\n/, ""); + // replace spaces with regular space + data = data.replace(/\s/g, " "); + var track = data.match(/(.*?\?)(.*?\?)(.*?\?)/); + var res1 = track[1].match( + /(%)([A-Z]{2})([^^]{0,13})\^?([^^]{0,35})\^?([^^]{0,60})\^?\s*?\?/ + ); + var res2 = track[2].match( + /(;)(\d{6})(\d{0,13})(=)(\d{4})(\d{8})(\d{0,5})=?\?/ + ); + var res3 = track[3].match( + /(#|%|\+)(\d|!|")(\d|\s|.)([0-9A-Z ]{11})([0-9A-Z ]{2})([0-9A-Z ]{10})([0-9A-Z ]{4})([12MF ]{1})([0-9A-Z ]{3})([0-9A-Z ]{3})([0-9A-Z ]{3})([0-9A-Z ]{3})(.*?)\?/ + ); + var state = res1[2]; + return { + state: state, + city: res1[3], + name: (function () { + var res = res1[4].match(/([^$]{0,35})\$?([^$]{0,35})?\$?([^$]{0,35})?/); + if (!res) return; + return { + last: res[1], + first: res[2], + middle: res[3], + }; + })(), + address: res1[5], + iso_iin: res2[2], + dl: res2[3], + expiration_date: parseDate(res2[5]), + birthday: (function () { + var dob = res2[6].match(/(\d{4})(\d{2})(\d{2})/); + if (!dob) return; + + if (dob[2] === "99") { + /* FL decided to reverse 2012 aamva spec, 99 means here + that dob month === to expiration month, it should be + opposite + */ + var exp_dt = res2[5].match(/(\d{2})(\d{2})/); + dob[2] = exp_dt[2]; + } + //dob[2]--; what was this for? + return dob[1] + dob[2] + dob[3]; + })(), + dl_overflow: res2[7], + cds_version: res3[1], + jurisdiction_version: res3[2], + postal_code: res3[4], + klass: res3[5], + class: res3[5], + restrictions: res3[6], + endorsments: res3[7], + sex: (function () { + switch (res3[8]) { + case "1": + case "M": + return "MALE"; + + case "2": + case "F": + return "FEMALE"; + + default: + return res3[8] + ": MISSING/INVALID"; + } + })(), + height: res3[9], + weight: res3[10], + hair_color: res3[11], + eye_color: res3[12], + misc: res3[13], + id: (function () { + var id; + switch (state) { + case "FL": + var res = res2[3].match(/(\d{2})(.*)/); + if (!res) return; + id = String.fromCharCode(Number(res[1]) + 64) + res[2] + res2[7]; + break; + default: + id = res2[3]; + break; + } + return id; + })(), + }; + }; + + var pdf417 = function (data) { + data = data.replace(/\n/, ""); + // replace spaces with regular space + data = data.replace(/\s/g, " "); + + // get version of aamva (before 2000 or after) + var version = data.match(/[A-Z ]{5}\d{6}(\d{2})/); + + var parseRegex; + + /* version 01 year 2000 */ + switch (Number(version[1])) { + case 1: { + parseRegex = new RegExp( + "(DAQ.*?)?" + // Drivers license number + "(DAA.*?)?" + // Driver License Name + "(DAG.*?)?" + // Driver Mailing Street Address + "(DAI.*?)?" + // Driver Mailing City + "(DAJ.*?)?" + // Driver Mailing Jurisdiction Code + "(DAK.*?)?" + // Driver Mailing Postal Code + "(DAQ.*?)?" + // Driver License/ID Number + "(DAR.*?)?" + // Driver License Classification Code + "(DAS.*?)?" + // Driver License Restriction Code + "(DAT.*?)?" + // Driver License Endorsements Code + "(DBA.*?)?" + // Driver License Expiration Date + "(DBB.*?)?" + // Date of Birth + "(DBC.*?)?" + // Driver Sex + "(DBD.*?)?" + // Driver License or ID Document Issue Date + /* optional + '(DAU.*?)?' + // Height (FT/IN) + '(DAW.*?)?' + // Weight (LBS) + '(DAY.*?)?' + // Eye Color + '(DAZ.*?)?' + // Hair Color + '(DBK.*?)?' + // Social Security Number + '(PAA.*?)?' + // Driver Permit Classification Code + '(PAB.*?)?' + // Driver Permit Expiration Date + '(PAC.*?)?' + // Permit Identifier + '(PAD.*?)?' + // Driver Permit Issue Date + '(PAE.*?)?' + // Driver Permit Restriction Code + '(PAF.*?)?' + // Driver Permit Endorsement Code + '(DAB.*?)?' + // Driver Last Name + '(DAC.*?)?' + // Driver First Name + '(DAD.*?)?' + // Driver Middle Name or Initial + '(DAE.*?)?' + // Driver Name Suffix + '(DAF.*?)?' + // Driver Name Prefix + '(DAH.*?)?' + // Driver Mailing Street Address 2 + '(DAL.*?)?' + // Driver Residence Street Address 1 + '(DAM.*?)?' + // Driver Residence Street Address 2 + '(DAN.*?)?' + // Driver Residence City + '(DAO.*?)?' + // Driver Residence Jurisdiction Code + '(DAP.*?)?' + // Driver Residence Postal Code + '(DAV.*?)?' + // Height (CM) + '(DAX.*?)?' + // Weight (KG) + '(DBE.*?)?' + // Issue Timestamp + '(DBF.*?)?' + // Number of Duplicates + '(DBG.*?)?' + // Medical Indicator/Codes + '(DBH.*?)?' + // Organ Donor + '(DBI.*?)?' + // Non-Resident Indicator + '(DBJ.*?)?' + // Unique Customer Identifier + '(DBL.*?)?' + // Driver "AKA" Date Of Birth + '(DBM.*?)?' + // Driver "AKA" Social Security Number + '(DBN.*?)?' + // Driver "AKA" Name + '(DBO.*?)?' + // Driver "AKA" Last Name + '(DBP.*?)?' + // Driver "AKA" First Name + '(DBQ.*?)?' + // Driver "AKA" Middle Name + '(DBR.*?)?' + // Driver "AKA" Suffix + '(DBS.*?)?' // Driver "AKA" Prefix + */ + "$" + ); + break; + } + /* version 02 year 2003 */ + case 2: { + parseRegex = new RegExp( + "(DCA.*?)?" + // Jurisdiction-specific vehicle class + "(DCB.*?)?" + // Jurisdiction-specific restriction codes + "(DCD.*?)?" + // Jurisdiction-specific endorsement codes + "(DBA.*?)?" + // Document Expiration Date + "(DCS.*?)?" + // Customer Family Name + "(DCT.*?)?" + // Customer Given Names + "(DCU.*?)?" + // Name Suffix + "(DBD.*?)?" + // Document Issue Date + "(DBB.*?)?" + // Date of Birth + "(DBC.*?)?" + // Physical Description – Sex + "(DAY.*?)?" + // Physical Description – Eye Color + "(DAU.*?)?" + // Physical Description – Height + "(DCE.*?)?" + // Physical Description – Weight Range + "(DAG.*?)?" + // Address – Street 1 + "(DAI.*?)?" + // Address – City + "(DAJ.*?)?" + // Address – Jurisdiction Code + "(DAK.*?)?" + // Address – Postal Code + "(DAQ.*?)?" + // Customer ID Number + "(DCF.*?)?" + // Document Discriminator + "(DCG.*?)?" + // Country Identification + "(DCH.*?)?" + // Federal Commercial Vehicle Codes + /* optional elements + '(DAH.*?)?' + // Address – Street 2 + '(DAZ.*?)?' + // Hair color + '(DCI.*?)?' + // Place of birth + '(DCJ.*?)?' + // Audit information + '(DCK.*?)?' + // Inventory control number + '(DBN.*?)?' + // Alias / AKA Family Name + '(DCL.*?)?' + // Race / ethnicity + + '(DCM.*?)?' + // Standard vehicle classification + '(DCN.*?)?' + // Standard endorsement code + '(DCO.*?)?' + // Standard restriction code + '(DCP.*?)?' + // Jurisdiction- specific vehicle classification description + '(DCQ.*?)?' + // Jurisdiction- specific endorsement code description + '(DCR.*?)?' // Jurisdiction- specific restriction code description + */ + "$" + ); + break; + } + /* version 03 year 2005 */ + case 3: { + parseRegex = new RegExp( + "(DCA.*?)?" + // Jurisdiction-specific vehicle class + "(DCB.*?)?" + // Jurisdiction-specific restriction codes + "(DCD.*?)?" + // Jurisdiction-specific endorsement codes + "(DBA.*?)?" + // Document Expiration Date + "(DCS.*?)?" + // Customer Family Name + "(DCT.*?)?" + // Customer Given Names + "(DBD.*?)?" + // Document Issue Date + "(DBB.*?)?" + // Date of Birth + "(DBC.*?)?" + // Physical Description – Sex + "(DAY.*?)?" + // Physical Description – Eye Color + "(DAU.*?)?" + // Physical Description – Height + "(DAG.*?)?" + // Address – Street 1 + "(DAI.*?)?" + // Address – City + "(DAJ.*?)?" + // Address – Jurisdiction Code + "(DAK.*?)?" + // Address – Postal Code + "(DAQ.*?)?" + // Customer ID Number + "(DCF.*?)?" + // Document Discriminator + "(DCG.*?)?" + // Country Identification + "(DCH.*?)?" + // Federal Commercial Vehicle Codes + /* optional elements + + '(DAH.*?)?' + // Address – Street 2 + '(DAZ.*?)?' + // Hair color + '(DCI.*?)?' + // Place of birth + '(DCJ.*?)?' + // Audit information + '(DCK.*?)?' + // Inventory control number + '(DBN.*?)?' + // Alias / AKA Family Name + '(DBG.*?)?' + // Alias / AKA Given Name + '(DBS.*?)?' + // Alias / AKA Suffix Name + '(DCU.*?)?' + // Name Suffix + '(DCE.*?)?' + // Physical Description – Weight Range + '(DCL.*?)?' + // Race / ethnicity + '(DCM.*?)?' + // Standard vehicle classification + '(DCN.*?)?' + // Standard endorsement code + '(DCO.*?)?' + // Standard restriction code + '(DCP.*?)?' + // Jurisdiction- specific vehicle classification description + '(DCQ.*?)?' + // Jurisdiction- specific endorsement code description + '(DCR.*?)?' // Jurisdiction- specific restriction code description + */ + "$" + ); + break; + } + case 6: { + parseRegex = new RegExp( + "(DAQ.*?)?" + + "(DCS.*?)?" + + "(DDE.*?)?" + + "(DAC.*?)?" + + "(DDF.*?)?" + + "(DAD.*?)?" + + "(DDG.*?)?" + + "(DCA.*?)?" + + "(DCB.*?)?" + + "(DCD.*?)?" + + "(DBD.*?)?" + + "(DBB.*?)?" + + "(DBA.*?)?" + + "(DBC.*?)?" + + "(DAU.*?)?" + + "(DAY.*?)?" + + "(DAG.*?)?" + + "(DAI.*?)?" + + "(DAJ.*?)?" + + "(DAK.*?)?" + + "(DCF.*?)?" + + /* optional */ + "$" + ); + break; + } + /* version 07 year 2012 */ + case 7: { + parseRegex = new RegExp( + "(DCA.*?)?" + // Jurisdiction-specific vehicle class + "(DCB.*?)?" + // Jurisdiction-specific restriction codes + "(DCD.*?)?" + // Jurisdiction-specific endorsement codes + "(DBA.*?)?" + // Document Expiration Date + "(DCS.*?)?" + // Customer Family Name + "(DAC.*?)?" + // Customer First Name + "(DAD.*?)?" + // Customer Middle Name(s) + "(DBD.*?)?" + // Document Issue Date + "(DBB.*?)?" + // Date of Birth + "(DBC.*?)?" + // Physical Description – Sex + "(DAY.*?)?" + // Physical Description – Eye Color + "(DAU.*?)?" + // Physical Description – Height + "(DAG.*?)?" + // Address – Street 1 + "(DAI.*?)?" + // Address – City + "(DAJ.*?)?" + // Address – Jurisdiction Code + "(DAK.*?)?" + // Address – Postal Code + "(DAQ.*?)?" + // Customer ID Number + "(DCF.*?)?" + // Document Discriminator + "(DCG.*?)?" + // Country Identification + "(DDE.*?)?" + // Family name truncation + "(DDF.*?)?" + // First name truncation + "(DDG.*?)?" + // Middle name truncation + /* optional elements + '(DAH.*?)?' + // Address – Street 2 + '(DAZ.*?)?' + // Hair color + '(DCI.*?)?' + // Place of birth + '(DCJ.*?)?' + // Audit information + '(DCK.*?)?' + // Inventory control number + '(DBN.*?)?' + // Alias / AKA Family Name + '(DBG.*?)?' + // Alias / AKA Given Name + '(DBS.*?)?' + // Alias / AKA Suffix Name + '(DCU.*?)?' + // Name Suffix + '(DCE.*?)?' + // Physical Description – Weight Range + '(DCL.*?)?' + // Race / ethnicity + '(DCM.*?)?' + // Standard vehicle classification + '(DCN.*?)?' + // Standard endorsement code + '(DCO.*?)?' + // Standard restriction code + '(DCP.*?)?' + // Jurisdiction- specific vehicle classification description + '(DCQ.*?)?' + // Jurisdiction- specific endorsement code description + '(DCR.*?)?' + // Jurisdiction- specific restriction code description + '(DDA.*?)?' + // Compliance Type + '(DDB.*?)?' + // Card Revision Date + '(DDC.*?)?' + // HAZMAT Endorsement Expiration Date + '(DDD.*?)?' + // Limited Duration Document Indicator + '(DAW.*?)?' + // Weight (pounds) + '(DAX.*?)?' + // Weight (kilograms) + '(DDH.*?)?' + // Under 18 Until + '(DDI.*?)?' + // Under 19 Until + '(DDJ.*?)?' + // Under 21 Until + '(DDK.*?)?' + // Organ Donor Indicator + '(DDL.*?)?' // Veteran Indicator + */ + "$" + ); + break; + } + case 8: + case 9: { + var prefixes = [ + "DCA", // jurisdiction vehicle class + "DCB", // jurisdiction restriction codes + "DCD", // jurisdiction endorsement codes + "DBA", // doc. expiration date + "DCS", // customer family name + "DAC", // first name + "DAD", // middle names (comma seperated) + "DBD", // doc. issue date + "DBB", // date of birth (MMDDCCYY for U.S., CCYYMMDD for Canada) + "DBC", // gender (1-name, 2-female, 9-not specified) + "DAY", // eye color (ansi d-20 codes) + "DAU", // height + "DAG", // street 1 + "DAI", // city + "DAJ", // state + "DAK", // zip + "DAQ", // customer id number + "DCF", // doc. distriminator + "DCG", // country identification (USA/CAN) + "DDE", // last name truncated (T-trucated, N-not, U-unknown) + "DDF", // first name truncated (T-trucated, N-not, U-unknown) + "DDG", // middle name truncated (T-trucated, N-not, U-unknown) + // optionals + "DAH", // street address line 2 + "DAZ", // hair color + "DCI", // place of birth + "DCJ", // audit info + "DCK", // inventory control number + "DBN", // alias last name + "DBG", // alias first name + "DBS", // aliast suffix name + "DCU", // name suffix . (JR, SR, 1ST, 2ND...) + "DCE", // weight range + "DCL", // race / ethnicity (AAMVA D20 code) + "DCM", // vehicle classification + "DCN", // standard endorsement code + "DCO", // standard restriction code + "DCP", // vehicle classification description + "DCQ", // endorsement code description + "DCR", // restriction code description + "DDA", // compliance type + "DDB", // card revision date + "DDC", // hazmat endorsement exp. date + "DDD", // limited duration doc. indicator + "DAW", // weight lbs + "DAX", // weight kg + "DDH", // under 18 until, date turns 18 (MMDDCCYY for U.S., CCYYMMDD for Canada) + "DDI", // under 19 until, date turns 19 (MMDDCCYY for U.S., CCYYMMDD for Canada) + "DDJ", // under 21 until, date turns 21 (MMDDCCYY for U.S., CCYYMMDD for Canada) + "DDK", // organ donor (1-yes) + "DDL", // veteran indicator (1-yes) + ]; + var regExStr = ""; + var prefixIdxs = []; + for (var i = 0; i < prefixes.length; i++) { + var idx = data.indexOf(prefixes[i]); + if (idx !== -1) { + prefixIdxs.push({ + prefix: prefixes[i], + index: idx, + }); + } + } + // if prefixes are not in order as found in the string, the regex will not perform as expected + prefixIdxs.sort((a, b) => (a.index > b.index ? 1 : -1)); + prefixIdxs.forEach((obj) => (regExStr += `(${obj.prefix}.*?)?`)); + regExStr += "$"; + + parseRegex = new RegExp(regExStr); + break; + } + default: { + console.log("unable to get version", version); + // probably not a right parse... + } + } + + var parsedData = {}; + var res = data.match(parseRegex); + + for (i = 1; i < res.length; i++) { + if (res[i] !== undefined) { + parsedData[String(res[i]).substring(0, 3)] = res[i].substring(3).trim(); + } + } + + var name; + switch (Number(version[1])) { + case 1: { + // version one joining all of the names in one string + name = parsedData.DAA.split(","); + parsedData.DCS = name[0]; + parsedData.DAC = name[1]; + parsedData.DAD = name[2]; + + // drivers license class + parsedData.DCA = parsedData.DAR; + + // date on 01 is CCYYMMDD while on 07 MMDDCCYY + parsedData.DBB = + parsedData.DBB.substring(4, 6) + // month + parsedData.DBB.substring(6, 8) + // day + parsedData.DBB.substring(0, 4); // year + break; + } + case 3: { + // version 3 putting middle and first names in the same field + name = parsedData.DCT.split(","); + parsedData.DAC = name[0]; // first name + parsedData.DAD = name[1]; // middle name + break; + } + default: { + console.log("no version matched"); + break; + } + } + + var rawData = { + state: parsedData.DAJ, + city: parsedData.DAI, + name: (function () { + return { + last: parsedData.DCS, + first: parsedData.DAC, + middle: parsedData.DAD, + }; + })(), + address: parsedData.DAG, + iso_iin: undefined, + dl: parsedData.DAQ, + expiration_date: parseDate(parsedData.DBA), + birthday: (function () { + if (!parsedData.DBB) return; + var match = parsedData.DBB.match(/(\d{2})(\d{2})(\d{4})/); + if (!match) return; + return match[3] + match[1] + match[2]; + })(), + dl_overflow: undefined, + cds_version: undefined, + jurisdiction_version: undefined, + postal_code: parsedData.DAK + ? parsedData.DAK.match(/\d{-}\d+/) + ? parsedData.DAK + : parsedData.DAK.substring(0, 5) + : undefined, + klass: parsedData.DCA, + class: parsedData.DCA, + restrictions: undefined, + endorsments: undefined, + sex: (function () { + switch (Number(parsedData.DBC)) { + case 1: + return "MALE"; + + case 2: + return "FEMALE"; + + default: + if (parsedData.DBC[0] === "M") { + return "MALE"; + } else if (parsedData.DBC[0] === "F") { + return "FEMALE"; + } + return "MISSING/INVALID"; + } + })(), + height: undefined, + weight: undefined, + hair_color: undefined, + eye_color: undefined, + misc: undefined, + id: (function () { + if (!parsedData.DAQ) return; + return parsedData.DAQ.replace(/[^A-ZA-Z0-9]/g, ""); + })(), + }; + + return rawData; + }; + + global.parse = parse; + global.stripe = stripe; + global.pdf417 = pdf417; +})(this); diff --git a/client/src/utils/arrayHelper.js b/client/src/utils/arrayHelper.js new file mode 100644 index 000000000..47108210a --- /dev/null +++ b/client/src/utils/arrayHelper.js @@ -0,0 +1,3 @@ +export function onlyUnique(value, index, self, key) { + return self.indexOf(value) === index; +} diff --git a/client/src/utils/create-recent-item.js b/client/src/utils/create-recent-item.js new file mode 100644 index 000000000..5f2374004 --- /dev/null +++ b/client/src/utils/create-recent-item.js @@ -0,0 +1,9 @@ +import i18n from "i18next"; + +export function CreateRecentItem(id, type, labelid, url) { + return { + id, + label: `${i18n.t(`general.itemtypes.${type}`)}: ${labelid}`, + url, + }; +} diff --git a/client/src/utils/private-route.js b/client/src/utils/private-route.js index 0a55f1184..ec4c9b0c7 100644 --- a/client/src/utils/private-route.js +++ b/client/src/utils/private-route.js @@ -1,6 +1,8 @@ import React from "react"; -import { Route, Redirect } from "react-router-dom"; +import { Route, Redirect, useLocation } from "react-router-dom"; export default ({ component: Component, isAuthorized, ...rest }) => { + const location = useLocation(); + return ( { isAuthorized === true ? ( ) : ( - + ) } /> diff --git a/client/templates/appointment_confirmation/appointment_confirmation.query.gql b/client/templates/appointment_confirmation/appointment_confirmation.query.gql new file mode 100644 index 000000000..6e1c4f5a9 --- /dev/null +++ b/client/templates/appointment_confirmation/appointment_confirmation.query.gql @@ -0,0 +1,11 @@ +query EMAIL_APPOINTMENT_CONFIRMATION($id: uuid!) { + appointments_by_pk(id: $id) { + start + title + job { + ownr_fn + ownr_ln + ownr_ea + } + } +} diff --git a/client/templates/appointment_confirmation/appointment_confirmation.template.html b/client/templates/appointment_confirmation/appointment_confirmation.template.html new file mode 100644 index 000000000..5aa9669c7 --- /dev/null +++ b/client/templates/appointment_confirmation/appointment_confirmation.template.html @@ -0,0 +1,9 @@ +
    +

    Hello {{appointments_by_pk.job.ownr_fn}},

    +

    + This is a confirmation that you have an appointment at + {{appointments_by_pk.start}} to bring your car in for repair. Please email + us at {{bodyshop.email}} if you can't make it.  +

    +
    + \ No newline at end of file diff --git a/client/templates/appointment_reminder/appointment_reminder.query.gql b/client/templates/appointment_reminder/appointment_reminder.query.gql new file mode 100644 index 000000000..6e1c4f5a9 --- /dev/null +++ b/client/templates/appointment_reminder/appointment_reminder.query.gql @@ -0,0 +1,11 @@ +query EMAIL_APPOINTMENT_CONFIRMATION($id: uuid!) { + appointments_by_pk(id: $id) { + start + title + job { + ownr_fn + ownr_ln + ownr_ea + } + } +} diff --git a/client/templates/appointment_reminder/appointment_reminder.template.html b/client/templates/appointment_reminder/appointment_reminder.template.html new file mode 100644 index 000000000..705bb3e20 --- /dev/null +++ b/client/templates/appointment_reminder/appointment_reminder.template.html @@ -0,0 +1,8 @@ +
    +

    Hello {{appointments_by_pk.job.ownr_fn}},

    +

    + This is a reminder that you have an appointment at + {{appointments_by_pk.start}} to bring your car in for repair. Please email + us at {{bodyshop.email}} if you can't make it.  +

    +
    diff --git a/client/templates/csi_invitation/csi_invitation.query.gql b/client/templates/csi_invitation/csi_invitation.query.gql new file mode 100644 index 000000000..0dacda99a --- /dev/null +++ b/client/templates/csi_invitation/csi_invitation.query.gql @@ -0,0 +1,6 @@ +query ($id: uuid!){ + csi_by_pk(id: $id){ + id + relateddata + } +} \ No newline at end of file diff --git a/client/templates/csi_invitation/csi_invitation.template.html b/client/templates/csi_invitation/csi_invitation.template.html new file mode 100644 index 000000000..ba8b22f31 --- /dev/null +++ b/client/templates/csi_invitation/csi_invitation.template.html @@ -0,0 +1,45 @@ +
    Hi {{csi_by_pk.relateddata.job.ownr_fn}}, 
    +
     
    +
    + Thank you for getting your car repaired at + {{csi_by_pk.relateddata.bodyshop.shopname}}. We invite you to complete a + survey about your experience.  +
    +
     
    +
    + + + + + +
    + + + + + + +
    + Complete Survey → +
    +
    +
     
    diff --git a/client/templates/estimate_detail/estimate_detail.query.gql b/client/templates/estimate_detail/estimate_detail.query.gql new file mode 100644 index 000000000..f0a2d7657 --- /dev/null +++ b/client/templates/estimate_detail/estimate_detail.query.gql @@ -0,0 +1,32 @@ +query TEMPLATE_ESTIMATE_DETAIL($id: uuid!) { + jobs_by_pk(id: $id) { + csr + ded_amt + ded_status + id + ownr_co_nm + ownr_ln + ownr_fn + plate_no + plate_st + ro_number + regie_number + tlos_ind + v_color + v_make_desc + v_model_desc + v_model_yr + v_vin + clm_no + joblines(order_by: { line_no: asc }) { + id + mod_lbr_ty + mod_lb_hrs + part_qty + oem_partno + op_code_desc + line_desc + line_no + } + } +} diff --git a/client/templates/estimate_detail/estimate_detail.template.html b/client/templates/estimate_detail/estimate_detail.template.html new file mode 100644 index 000000000..e30a11457 --- /dev/null +++ b/client/templates/estimate_detail/estimate_detail.template.html @@ -0,0 +1,87 @@ +
    +

    + Job Detail Summary +

    + + + + + + + + +
    + Owner: {{jobs_by_pk.ownr_fn}} {{jobs_by_pk.ownr_ln}} + {{jobs_by_pk.ownr_co_nm}} + + Vehicle: {{jobs_by_pk.v_model_yr}} + {{jobs_by_pk.v_color}}{{jobs_by_pk.v_make_desc}} + {{jobs_by_pk.v_model_desc}} + +

    + Claim Number: {{jobs_by_pk.clm_no}}
    Regie Number:</strong > {{jobs_by_pk.regie_number}} + +

    +

    + Deductible: {{jobs_by_pk.ded_amt}} + {{jobs_by_pk.ded_status}} +

    +
    +

    Job Lines

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    + Line No. + + Line Desc. + + OEM Part # + + Qty. + + Labor Type + + Hours +
    + {{#each jobs_by_pk.joblines}} +
    + {{this.line_no}} + + {{this.line_desc}} + + {{this.oem_partno}} + + {{this.part_qty}} + + {{this.mod_lbr_ty}} + + {{this.mod_lb_hrs}} +
    {{/each}}
    +
    diff --git a/client/templates/parts_order_confirmation/parts_order_confirmation.query.gql b/client/templates/parts_order_confirmation/parts_order_confirmation.query.gql new file mode 100644 index 000000000..6558056b0 --- /dev/null +++ b/client/templates/parts_order_confirmation/parts_order_confirmation.query.gql @@ -0,0 +1,29 @@ +query REPORT_QUERY_PARTS_ORDER_BY_PK($id: uuid!) { + parts_orders_by_pk(id: $id) { + job { + id + vehicle { + id + v_model_desc + v_make_desc + v_model_yr + v_vin + } + ro_number + est_number + } + id + deliver_by + parts_order_lines { + id + db_price + act_price + line_desc + line_remarks + oem_partno + status + } + status + user_email + } +} diff --git a/client/templates/parts_order_confirmation/parts_order_confirmation.template.html b/client/templates/parts_order_confirmation/parts_order_confirmation.template.html new file mode 100644 index 000000000..c17866942 --- /dev/null +++ b/client/templates/parts_order_confirmation/parts_order_confirmation.template.html @@ -0,0 +1,122 @@ +
    +

    + Deliver By: {{parts_orders_by_pk.deliver_by}} +

    + + + + + + + + + + + + + + + + + + + + + +
    + Line Description + + Part # + + Price + + Line Remarks +
    + {{#each parts_orders_by_pk.parts_order_lines}} +
    + {{this.line_desc}} + + {{this.oem_partno}} + + ${{this.act_price}} + + {{this.line_remarks}} +
    {{/each}}
    +

    Order Placed by {{parts_orders_by_pk.user_email}}.

    +
    diff --git a/client/templates/payment_receipt/payment_receipt.query.gql b/client/templates/payment_receipt/payment_receipt.query.gql new file mode 100644 index 000000000..6cdf0f71e --- /dev/null +++ b/client/templates/payment_receipt/payment_receipt.query.gql @@ -0,0 +1,26 @@ +query REPORT_PAYMENT_RECEIPT($id: uuid!) { + payments_by_pk(id: $id) { + job { + id + vehicle { + id + v_model_desc + v_make_desc + v_model_yr + v_vin + } + ro_number + est_number + clm_no + clm_total + ded_amt + } + id + amount + memo + transactionid + stripeid + payer + type + } +} diff --git a/client/templates/payment_receipt/payment_receipt.template.html b/client/templates/payment_receipt/payment_receipt.template.html new file mode 100644 index 000000000..381dc9a3c --- /dev/null +++ b/client/templates/payment_receipt/payment_receipt.template.html @@ -0,0 +1,10 @@ +
    +

    RECEIPT OF PAYMENT

    +

    Amount: {{payments_by_pk.amount}}

    +

    Memo: {{payments_by_pk.memo}}

    +

    RO Number: {{payments_by_pk.job.ro_number}} / {{payments_by_pk.job.est_number}}

    +

    Payer: {{payments_by_pk.payer}}

    +

    StripeID: {{payments_by_pk.stripeid}}

    +

    Amount: {{payments_by_pk.amount}}

    +

     

    +
    \ No newline at end of file diff --git a/client/templates/time_tickets_by_employee/time_tickets_by_employee.graphql b/client/templates/time_tickets_by_employee/time_tickets_by_employee.graphql new file mode 100644 index 000000000..9776e3fa3 --- /dev/null +++ b/client/templates/time_tickets_by_employee/time_tickets_by_employee.graphql @@ -0,0 +1,25 @@ +query REPORT_TIME_TICKETS_IN_RANGE($id: uuid!, $start: date!, $end: date!) { + employees_by_pk(id: $id) { + id + first_name + last_name + employee_number + timetickets(where: { date: { _gte: $start, _lte: $end } }) { + actualhrs + ciecacode + clockoff + clockon + cost_center + created_at + date + id + rate + productivehrs + memo + job { + id + ro_number + } + } + } +} diff --git a/client/templates/time_tickets_by_employee/time_tickets_by_employee.html b/client/templates/time_tickets_by_employee/time_tickets_by_employee.html new file mode 100644 index 000000000..f032ae5e1 --- /dev/null +++ b/client/templates/time_tickets_by_employee/time_tickets_by_employee.html @@ -0,0 +1,55 @@ +
    +

    Employee Time Tickets

    + + + + + + + + +
    Employee: {{employees_by_pk.first_name}} {{employees_by_pk.last_name}}  +

     

    +
    +

    Time Tickets

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    DateCost CenterActual HrsProductive HrsShift Clock OnShift Clock OffShift Time
    {{#each employees_by_pk.timetickets}}      
    {{this.date}}{{this.cost_center}}{{this.actualhrs}}{{this.productivehrs}}{{moment this.clockon format="MM/DD/YYYY @ hh:mm:ss"}}{{moment this.clockoff format="MM/DD/YYYY @ hh:mm:ss"}}{{moment this.clockoff diff=this.clockon }}
    {{/each}}      
    +
    \ No newline at end of file diff --git a/client/yarn.lock b/client/yarn.lock index c73622d05..8b42282f6 100644 --- a/client/yarn.lock +++ b/client/yarn.lock @@ -9,112 +9,117 @@ dependencies: tinycolor2 "^1.4.1" -"@ant-design/icons-svg@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@ant-design/icons-svg/-/icons-svg-4.0.0.tgz#6683db0df97c0c6900bb28a280faf391522ec734" - integrity sha512-Nai+cd3XUrv/z50gSk1FI08j6rENZ1e93rhKeLTBGwa5WrmHvhn2vowa5+voZW2qkXJn1btS6tdvTEDB90M0Pw== +"@ant-design/css-animation@^1.7.2": + version "1.7.2" + resolved "https://registry.yarnpkg.com/@ant-design/css-animation/-/css-animation-1.7.2.tgz#4ee5d2ec0fb7cc0a78b44e1c82628bd4621ac7e3" + integrity sha512-bvVOe7A+r7lws58B7r+fgnQDK90cV45AXuvGx6i5CCSX1W/M3AJnHsNggDANBxEtWdNdFWcDd5LorB+RdSIlBw== -"@ant-design/icons@^4.0.0": - version "4.0.3" - resolved "https://registry.yarnpkg.com/@ant-design/icons/-/icons-4.0.3.tgz#ba2fd8160cb1a51ba31979319355a47c5d7b5376" - integrity sha512-vWzmt1QsWpnmOfT/wtAIeKTheN61Mo8KtaLm0yosd6vVUEVdc5E/pmcrd8lIp2CmuRT7qCU6e9x/RMffv0hOJg== +"@ant-design/icons-svg@^4.0.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@ant-design/icons-svg/-/icons-svg-4.1.0.tgz#480b025f4b20ef7fe8f47d4a4846e4fee84ea06c" + integrity sha512-Fi03PfuUqRs76aI3UWYpP864lkrfPo0hluwGqh7NJdLhvH4iRDc3jbJqZIvRDLHKbXrvAfPPV3+zjUccfFvWOQ== + +"@ant-design/icons@^4.2.1": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@ant-design/icons/-/icons-4.2.1.tgz#6f3ea5d98ab782072e4e9cbb70f25e4403ae1a6b" + integrity sha512-245ZI40MOr5GGws+sNSiJIRRoEf/J2xvPSMgwRYf3bv8mVGQZ6XTQI/OMeV16KtiSZ3D+mBKXVYSBz2fhigOXQ== dependencies: "@ant-design/colors" "^3.1.0" "@ant-design/icons-svg" "^4.0.0" + "@babel/runtime" "^7.10.1" classnames "^2.2.6" insert-css "^2.0.0" - rc-util "^4.9.0" + rc-util "^5.0.1" -"@ant-design/react-slick@~0.25.5": - version "0.25.5" - resolved "https://registry.yarnpkg.com/@ant-design/react-slick/-/react-slick-0.25.5.tgz#18f40abaa22c15dc26da9c473d24da38d4d8f334" - integrity sha512-fusHR9LkarCARvYTN6cG3yz2/Ogf+HTaJ2XEihIjsjgm6uE1aSXycRFEVDpOFP1Aib51Z2Iz3tgg/gL+WbK8rQ== +"@ant-design/react-slick@~0.26.1": + version "0.26.3" + resolved "https://registry.yarnpkg.com/@ant-design/react-slick/-/react-slick-0.26.3.tgz#5ebdd0cc327ed1a92c0c69e4599efa00834a6ca8" + integrity sha512-FhaFfS+oea0P5WvhaM7BC2/P9r4F0yMoewBpDqVkOq+JxEiKRHJ7iBYJsenv2WEymnWeO3eCuMrz/Eez7pHpGg== dependencies: + "@babel/runtime" "^7.10.4" classnames "^2.2.5" json2mq "^0.2.0" lodash "^4.17.15" resize-observer-polyfill "^1.5.0" -"@apollo/react-common@^3.1.3": - version "3.1.3" - resolved "https://registry.yarnpkg.com/@apollo/react-common/-/react-common-3.1.3.tgz#ddc34f6403f55d47c0da147fd4756dfd7c73dac5" - integrity sha512-Q7ZjDOeqjJf/AOGxUMdGxKF+JVClRXrYBGVq+SuVFqANRpd68MxtVV2OjCWavsFAN0eqYnRqRUrl7vtUCiJqeg== +"@apollo/react-common@^3.1.4": + version "3.1.4" + resolved "https://registry.yarnpkg.com/@apollo/react-common/-/react-common-3.1.4.tgz#ec13c985be23ea8e799c9ea18e696eccc97be345" + integrity sha512-X5Kyro73bthWSCBJUC5XYQqMnG0dLWuDZmVkzog9dynovhfiVCV4kPSdgSIkqnb++cwCzOVuQ4rDKVwo2XRzQA== dependencies: ts-invariant "^0.4.4" tslib "^1.10.0" -"@apollo/react-components@^3.1.3": - version "3.1.3" - resolved "https://registry.yarnpkg.com/@apollo/react-components/-/react-components-3.1.3.tgz#8f6726847cd9b0eb4b22586b1a038d29aa8b1da4" - integrity sha512-H0l2JKDQMz+LkM93QK7j3ThbNXkWQCduN3s3eKxFN3Rdg7rXsrikJWvx2wQ868jmqy0VhwJbS1vYdRLdh114uQ== +"@apollo/react-components@^3.1.5": + version "3.1.5" + resolved "https://registry.yarnpkg.com/@apollo/react-components/-/react-components-3.1.5.tgz#040d2f35ce4947747efe16f76d59dcbd797ffdaf" + integrity sha512-c82VyUuE9VBnJB7bnX+3dmwpIPMhyjMwyoSLyQWPHxz8jK4ak30XszJtqFf4eC4hwvvLYa+Ou6X73Q8V8e2/jg== dependencies: - "@apollo/react-common" "^3.1.3" - "@apollo/react-hooks" "^3.1.3" + "@apollo/react-common" "^3.1.4" + "@apollo/react-hooks" "^3.1.5" prop-types "^15.7.2" ts-invariant "^0.4.4" tslib "^1.10.0" -"@apollo/react-hoc@^3.1.3": - version "3.1.3" - resolved "https://registry.yarnpkg.com/@apollo/react-hoc/-/react-hoc-3.1.3.tgz#5742ee74f57611058f5ea1f966c38fc6429dda7b" - integrity sha512-oCPma0uBVPTcYTR5sOvtMbpaWll4xDBvYfKr6YkDorUcQVeNzFu1LK1kmQjJP64bKsaziKYji5ibFaeCnVptmA== +"@apollo/react-hoc@^3.1.5": + version "3.1.5" + resolved "https://registry.yarnpkg.com/@apollo/react-hoc/-/react-hoc-3.1.5.tgz#6552d2fb4aafc59fdc8f4e353358b98b89cfab6f" + integrity sha512-jlZ2pvEnRevLa54H563BU0/xrYSgWQ72GksarxUzCHQW85nmn9wQln0kLBX7Ua7SBt9WgiuYQXQVechaaCulfQ== dependencies: - "@apollo/react-common" "^3.1.3" - "@apollo/react-components" "^3.1.3" + "@apollo/react-common" "^3.1.4" + "@apollo/react-components" "^3.1.5" hoist-non-react-statics "^3.3.0" ts-invariant "^0.4.4" tslib "^1.10.0" -"@apollo/react-hooks@^3.1.3": - version "3.1.3" - resolved "https://registry.yarnpkg.com/@apollo/react-hooks/-/react-hooks-3.1.3.tgz#ad42c7af78e81fee0f30e53242640410d5bd0293" - integrity sha512-reIRO9xKdfi+B4gT/o/hnXuopUnm7WED/ru8VQydPw+C/KG/05Ssg1ZdxFKHa3oxwiTUIDnevtccIH35POanbA== +"@apollo/react-hooks@^3.1.5": + version "3.1.5" + resolved "https://registry.yarnpkg.com/@apollo/react-hooks/-/react-hooks-3.1.5.tgz#7e710be52461255ae7fc0b3b9c2ece64299c10e6" + integrity sha512-y0CJ393DLxIIkksRup4nt+vSjxalbZBXnnXxYbviq/woj+zKa431zy0yT4LqyRKpFy9ahMIwxBnBwfwIoupqLQ== dependencies: - "@apollo/react-common" "^3.1.3" + "@apollo/react-common" "^3.1.4" "@wry/equality" "^0.1.9" ts-invariant "^0.4.4" tslib "^1.10.0" -"@apollo/react-ssr@^3.1.3": - version "3.1.3" - resolved "https://registry.yarnpkg.com/@apollo/react-ssr/-/react-ssr-3.1.3.tgz#0791280d5b735f42f87dbfe849564e78843045bc" - integrity sha512-fUTmEYHxSTX1GA43B8vICxXXplpcEBnDwn0IgdAc3eG0p2YK97ZrJDRFCJ5vD7fyDZsrYhMf+rAI3sd+H2SS+A== +"@apollo/react-ssr@^3.1.5": + version "3.1.5" + resolved "https://registry.yarnpkg.com/@apollo/react-ssr/-/react-ssr-3.1.5.tgz#53703cd493afcde567acc6d5512cab03dafce6de" + integrity sha512-wuLPkKlctNn3u8EU8rlECyktpOUCeekFfb0KhIKknpGY6Lza2Qu0bThx7D9MIbVEzhKadNNrzLcpk0Y8/5UuWg== dependencies: - "@apollo/react-common" "^3.1.3" - "@apollo/react-hooks" "^3.1.3" + "@apollo/react-common" "^3.1.4" + "@apollo/react-hooks" "^3.1.5" tslib "^1.10.0" -"@apollo/react-testing@^3.1.3": - version "3.1.3" - resolved "https://registry.yarnpkg.com/@apollo/react-testing/-/react-testing-3.1.3.tgz#d8dd318f58fb6a404976bfa3f8a79e976a5c6562" - integrity sha512-58R7gROl4TZMHm5kS76Nof9FfZhD703AU3SmJTA2f7naiMqC9Qd8pZ4oNCBafcab0SYN//UtWvLcluK5O7V/9g== +"@apollo/react-testing@^3.1.4": + version "3.1.4" + resolved "https://registry.yarnpkg.com/@apollo/react-testing/-/react-testing-3.1.4.tgz#f2e1b9b65a0bd773facf54db4fdb5995d162a72a" + integrity sha512-1eKjN36UfIAnBVmfLbl12vQ/eCjTqYdaU95chGIQzT2uHd5BnasJu0z+MwXBrEs57A9WY9mFvLZxdjzQJXaacA== dependencies: - "@apollo/react-common" "^3.1.3" + "@apollo/react-common" "^3.1.4" fast-json-stable-stringify "^2.0.0" tslib "^1.10.0" -"@babel/code-frame@7.8.3", "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.8.3": +"@babel/code-frame@7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g== dependencies: "@babel/highlight" "^7.8.3" -"@babel/compat-data@^7.8.6": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.8.6.tgz#7eeaa0dfa17e50c7d9c0832515eee09b56f04e35" - integrity sha512-CurCIKPTkS25Mb8mz267vU95vy+TyUpnctEX2lV33xWNmHAfjruztgiPBbXZRh3xZZy1CYvGx6XfxyTVS+sk7Q== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" + integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== dependencies: - browserslist "^4.8.5" - invariant "^2.2.4" - semver "^5.5.0" + "@babel/highlight" "^7.10.4" -"@babel/compat-data@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.9.0.tgz#04815556fc90b0c174abd2c0c1bb966faa036a6c" - integrity sha512-zeFQrr+284Ekvd9e7KAX954LkapWiOmQtsfHirhxqfdlX6MEC32iRE+pqUGlYIBchdevaCwvzxWGSy/YBNI85g== +"@babel/compat-data@^7.10.4", "@babel/compat-data@^7.9.0": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.10.4.tgz#706a6484ee6f910b719b696a9194f8da7d7ac241" + integrity sha512-t+rjExOrSVvjQQXNp5zAIYDp00KjdvGl/TpDX5REPr0S9IAIPQMTilcfG6q8c0QFmj9lSTVySV2VTsyggvtNIw== dependencies: - browserslist "^4.9.1" + browserslist "^4.12.0" invariant "^2.2.4" semver "^5.5.0" @@ -141,341 +146,268 @@ source-map "^0.5.0" "@babel/core@^7.1.0", "@babel/core@^7.4.5": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.8.6.tgz#27d7df9258a45c2e686b6f18b6c659e563aa4636" - integrity sha512-Sheg7yEJD51YHAvLEV/7Uvw95AeWqYPL3Vk3zGujJKIhJ+8oLw2ALaf3hbucILhKsgSoADOvtKRJuNVdcJkOrg== + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.10.4.tgz#780e8b83e496152f8dd7df63892b2e052bf1d51d" + integrity sha512-3A0tS0HWpy4XujGc7QtOIHTeNwUgWaZc/WuS5YQrfhU67jnVmsD6OGPc1AKHH0LJHQICGncy3+YUjIhVlfDdcA== dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.8.6" - "@babel/helpers" "^7.8.4" - "@babel/parser" "^7.8.6" - "@babel/template" "^7.8.6" - "@babel/traverse" "^7.8.6" - "@babel/types" "^7.8.6" + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.10.4" + "@babel/helper-module-transforms" "^7.10.4" + "@babel/helpers" "^7.10.4" + "@babel/parser" "^7.10.4" + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.1" - json5 "^2.1.0" + json5 "^2.1.2" lodash "^4.17.13" resolve "^1.3.2" semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.4.0", "@babel/generator@^7.8.6": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.8.6.tgz#57adf96d370c9a63c241cd719f9111468578537a" - integrity sha512-4bpOR5ZBz+wWcMeVtcf7FbjcFzCp+817z2/gHNncIRcM9MmKzUhtWCYAq27RAfUrAFwb+OCG1s9WEaVxfi6cjg== +"@babel/generator@^7.10.4", "@babel/generator@^7.4.0", "@babel/generator@^7.9.0": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.10.4.tgz#e49eeed9fe114b62fa5b181856a43a5e32f5f243" + integrity sha512-toLIHUIAgcQygFZRAQcsLQV3CBuX6yOIru1kJk/qqqvcRmZrYe6WavZTSG+bB8MxhnL9YPf+pKQfuiP161q7ng== dependencies: - "@babel/types" "^7.8.6" + "@babel/types" "^7.10.4" jsesc "^2.5.1" lodash "^4.17.13" source-map "^0.5.0" -"@babel/generator@^7.9.0": - version "7.9.3" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.3.tgz#7c8b2956c6f68b3ab732bd16305916fbba521d94" - integrity sha512-RpxM252EYsz9qLUIq6F7YJyK1sv0wWDBFuztfDGWaQKzHjqDHysxSiRUpA/X9jmfqo+WzkAVKFaUily5h+gDCQ== +"@babel/helper-annotate-as-pure@^7.0.0", "@babel/helper-annotate-as-pure@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz#5bf0d495a3f757ac3bda48b5bf3b3ba309c72ba3" + integrity sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA== dependencies: - "@babel/types" "^7.9.0" - jsesc "^2.5.1" - lodash "^4.17.13" - source-map "^0.5.0" + "@babel/types" "^7.10.4" -"@babel/helper-annotate-as-pure@^7.0.0", "@babel/helper-annotate-as-pure@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz#60bc0bc657f63a0924ff9a4b4a0b24a13cf4deee" - integrity sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz#bb0b75f31bf98cbf9ff143c1ae578b87274ae1a3" + integrity sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg== dependencies: - "@babel/types" "^7.8.3" + "@babel/helper-explode-assignable-expression" "^7.10.4" + "@babel/types" "^7.10.4" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz#c84097a427a061ac56a1c30ebf54b7b22d241503" - integrity sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw== +"@babel/helper-builder-react-jsx-experimental@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.10.4.tgz#d0ffb875184d749c63ffe1f4f65be15143ec322d" + integrity sha512-LyacH/kgQPgLAuaWrvvq1+E7f5bLyT8jXCh7nM67sRsy2cpIGfgWJ+FCnAKQXfY+F0tXUaN6FqLkp4JiCzdK8Q== dependencies: - "@babel/helper-explode-assignable-expression" "^7.8.3" - "@babel/types" "^7.8.3" + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-module-imports" "^7.10.4" + "@babel/types" "^7.10.4" -"@babel/helper-builder-react-jsx-experimental@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.9.0.tgz#066d80262ade488f9c1b1823ce5db88a4cedaa43" - integrity sha512-3xJEiyuYU4Q/Ar9BsHisgdxZsRlsShMe90URZ0e6przL26CCs8NJbDoxH94kKT17PcxlMhsCAwZd90evCo26VQ== +"@babel/helper-builder-react-jsx@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.10.4.tgz#8095cddbff858e6fa9c326daee54a2f2732c1d5d" + integrity sha512-5nPcIZ7+KKDxT1427oBivl9V9YTal7qk0diccnh7RrcgrT/pGFOjgGw1dgryyx1GvHEpXVfoDF6Ak3rTiWh8Rg== dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" - "@babel/helper-module-imports" "^7.8.3" - "@babel/types" "^7.9.0" + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/types" "^7.10.4" -"@babel/helper-builder-react-jsx@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.8.3.tgz#dee98d7d79cc1f003d80b76fe01c7f8945665ff6" - integrity sha512-JT8mfnpTkKNCboTqZsQTdGo3l3Ik3l7QIt9hh0O9DYiwVel37VoJpILKM4YFbP2euF32nkQSb+F9cUk9b7DDXQ== +"@babel/helper-compilation-targets@^7.10.4", "@babel/helper-compilation-targets@^7.8.7": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz#804ae8e3f04376607cc791b9d47d540276332bd2" + integrity sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ== dependencies: - "@babel/types" "^7.8.3" - esutils "^2.0.0" - -"@babel/helper-builder-react-jsx@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.9.0.tgz#16bf391990b57732700a3278d4d9a81231ea8d32" - integrity sha512-weiIo4gaoGgnhff54GQ3P5wsUQmnSwpkvU0r6ZHq6TzoSzKy4JxHEgnxNytaKbov2a9z/CVNyzliuCOUPEX3Jw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" - "@babel/types" "^7.9.0" - -"@babel/helper-call-delegate@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.8.3.tgz#de82619898aa605d409c42be6ffb8d7204579692" - integrity sha512-6Q05px0Eb+N4/GTyKPPvnkig7Lylw+QzihMpws9iiZQv7ZImf84ZsZpQH7QoWN4n4tm81SnSzPgHw2qtO0Zf3A== - dependencies: - "@babel/helper-hoist-variables" "^7.8.3" - "@babel/traverse" "^7.8.3" - "@babel/types" "^7.8.3" - -"@babel/helper-compilation-targets@^7.8.6": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.6.tgz#015b85db69e3a34240d5c2b761fc53eb9695f09c" - integrity sha512-UrJdk27hKVJSnibFcUWYLkCL0ZywTUoot8yii1lsHJcvwrypagmYKjHLMWivQPm4s6GdyygCL8fiH5EYLxhQwQ== - dependencies: - "@babel/compat-data" "^7.8.6" - browserslist "^4.8.5" + "@babel/compat-data" "^7.10.4" + browserslist "^4.12.0" invariant "^2.2.4" levenary "^1.1.1" semver "^5.5.0" -"@babel/helper-compilation-targets@^7.8.7": - version "7.8.7" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.7.tgz#dac1eea159c0e4bd46e309b5a1b04a66b53c1dde" - integrity sha512-4mWm8DCK2LugIS+p1yArqvG1Pf162upsIsjE7cNBjez+NjliQpVhj20obE520nao0o14DaTnFJv+Fw5a0JpoUw== +"@babel/helper-create-class-features-plugin@^7.10.4", "@babel/helper-create-class-features-plugin@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.4.tgz#2d4015d0136bd314103a70d84a7183e4b344a355" + integrity sha512-9raUiOsXPxzzLjCXeosApJItoMnX3uyT4QdM2UldffuGApNrF8e938MwNpDCK9CPoyxrEoCgT+hObJc3mZa6lQ== dependencies: - "@babel/compat-data" "^7.8.6" - browserslist "^4.9.1" - invariant "^2.2.4" - levenary "^1.1.1" - semver "^5.5.0" + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-member-expression-to-functions" "^7.10.4" + "@babel/helper-optimise-call-expression" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-replace-supers" "^7.10.4" + "@babel/helper-split-export-declaration" "^7.10.4" -"@babel/helper-create-class-features-plugin@^7.8.3": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.6.tgz#243a5b46e2f8f0f674dc1387631eb6b28b851de0" - integrity sha512-klTBDdsr+VFFqaDHm5rR69OpEQtO2Qv8ECxHS1mNhJJvaHArR6a1xTf5K/eZW7eZpJbhCx3NW1Yt/sKsLXLblg== +"@babel/helper-create-regexp-features-plugin@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz#fdd60d88524659a0b6959c0579925e425714f3b8" + integrity sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g== dependencies: - "@babel/helper-function-name" "^7.8.3" - "@babel/helper-member-expression-to-functions" "^7.8.3" - "@babel/helper-optimise-call-expression" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-replace-supers" "^7.8.6" - "@babel/helper-split-export-declaration" "^7.8.3" - -"@babel/helper-create-regexp-features-plugin@^7.8.3": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.6.tgz#7fa040c97fb8aebe1247a5c645330c32d083066b" - integrity sha512-bPyujWfsHhV/ztUkwGHz/RPV1T1TDEsSZDsN42JPehndA+p1KKTh3npvTadux0ZhCrytx9tvjpWNowKby3tM6A== - dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" - "@babel/helper-regex" "^7.8.3" - regexpu-core "^4.6.0" - -"@babel/helper-create-regexp-features-plugin@^7.8.8": - version "7.8.8" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.8.tgz#5d84180b588f560b7864efaeea89243e58312087" - integrity sha512-LYVPdwkrQEiX9+1R29Ld/wTrmQu1SSKYnuOk3g0CkcZMA1p0gsNxJFj/3gBdaJ7Cg0Fnek5z0DsMULePP7Lrqg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" - "@babel/helper-regex" "^7.8.3" + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-regex" "^7.10.4" regexpu-core "^4.7.0" -"@babel/helper-define-map@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz#a0655cad5451c3760b726eba875f1cd8faa02c15" - integrity sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g== +"@babel/helper-define-map@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.10.4.tgz#f037ad794264f729eda1889f4ee210b870999092" + integrity sha512-nIij0oKErfCnLUCWaCaHW0Bmtl2RO9cN7+u2QT8yqTywgALKlyUVOvHDElh+b5DwVC6YB1FOYFOTWcN/+41EDA== dependencies: - "@babel/helper-function-name" "^7.8.3" - "@babel/types" "^7.8.3" + "@babel/helper-function-name" "^7.10.4" + "@babel/types" "^7.10.4" lodash "^4.17.13" -"@babel/helper-explode-assignable-expression@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz#a728dc5b4e89e30fc2dfc7d04fa28a930653f982" - integrity sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw== +"@babel/helper-explode-assignable-expression@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.4.tgz#40a1cd917bff1288f699a94a75b37a1a2dbd8c7c" + integrity sha512-4K71RyRQNPRrR85sr5QY4X3VwG4wtVoXZB9+L3r1Gp38DhELyHCtovqydRi7c1Ovb17eRGiQ/FD5s8JdU0Uy5A== dependencies: - "@babel/traverse" "^7.8.3" - "@babel/types" "^7.8.3" + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" -"@babel/helper-function-name@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz#eeeb665a01b1f11068e9fb86ad56a1cb1a824cca" - integrity sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA== +"@babel/helper-function-name@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz#d2d3b20c59ad8c47112fa7d2a94bc09d5ef82f1a" + integrity sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ== dependencies: - "@babel/helper-get-function-arity" "^7.8.3" - "@babel/template" "^7.8.3" - "@babel/types" "^7.8.3" + "@babel/helper-get-function-arity" "^7.10.4" + "@babel/template" "^7.10.4" + "@babel/types" "^7.10.4" -"@babel/helper-get-function-arity@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz#b894b947bd004381ce63ea1db9f08547e920abd5" - integrity sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA== +"@babel/helper-get-function-arity@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz#98c1cbea0e2332f33f9a4661b8ce1505b2c19ba2" + integrity sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A== dependencies: - "@babel/types" "^7.8.3" + "@babel/types" "^7.10.4" -"@babel/helper-hoist-variables@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz#1dbe9b6b55d78c9b4183fc8cdc6e30ceb83b7134" - integrity sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg== +"@babel/helper-hoist-variables@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz#d49b001d1d5a68ca5e6604dda01a6297f7c9381e" + integrity sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA== dependencies: - "@babel/types" "^7.8.3" + "@babel/types" "^7.10.4" -"@babel/helper-member-expression-to-functions@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz#659b710498ea6c1d9907e0c73f206eee7dadc24c" - integrity sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA== +"@babel/helper-member-expression-to-functions@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.4.tgz#7cd04b57dfcf82fce9aeae7d4e4452fa31b8c7c4" + integrity sha512-m5j85pK/KZhuSdM/8cHUABQTAslV47OjfIB9Cc7P+PvlAoBzdb79BGNfw8RhT5Mq3p+xGd0ZfAKixbrUZx0C7A== dependencies: - "@babel/types" "^7.8.3" + "@babel/types" "^7.10.4" -"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz#7fe39589b39c016331b6b8c3f441e8f0b1419498" - integrity sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg== +"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz#4c5c54be04bd31670a7382797d75b9fa2e5b5620" + integrity sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw== dependencies: - "@babel/types" "^7.8.3" + "@babel/types" "^7.10.4" -"@babel/helper-module-transforms@^7.8.3": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.8.6.tgz#6a13b5eecadc35692047073a64e42977b97654a4" - integrity sha512-RDnGJSR5EFBJjG3deY0NiL0K9TO8SXxS9n/MPsbPK/s9LbQymuLNtlzvDiNS7IpecuL45cMeLVkA+HfmlrnkRg== +"@babel/helper-module-transforms@^7.10.4", "@babel/helper-module-transforms@^7.9.0": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.10.4.tgz#ca1f01fdb84e48c24d7506bb818c961f1da8805d" + integrity sha512-Er2FQX0oa3nV7eM1o0tNCTx7izmQtwAQsIiaLRWtavAAEcskb0XJ5OjJbVrYXWOTr8om921Scabn4/tzlx7j1Q== dependencies: - "@babel/helper-module-imports" "^7.8.3" - "@babel/helper-replace-supers" "^7.8.6" - "@babel/helper-simple-access" "^7.8.3" - "@babel/helper-split-export-declaration" "^7.8.3" - "@babel/template" "^7.8.6" - "@babel/types" "^7.8.6" + "@babel/helper-module-imports" "^7.10.4" + "@babel/helper-replace-supers" "^7.10.4" + "@babel/helper-simple-access" "^7.10.4" + "@babel/helper-split-export-declaration" "^7.10.4" + "@babel/template" "^7.10.4" + "@babel/types" "^7.10.4" lodash "^4.17.13" -"@babel/helper-module-transforms@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz#43b34dfe15961918707d247327431388e9fe96e5" - integrity sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA== +"@babel/helper-optimise-call-expression@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz#50dc96413d594f995a77905905b05893cd779673" + integrity sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg== dependencies: - "@babel/helper-module-imports" "^7.8.3" - "@babel/helper-replace-supers" "^7.8.6" - "@babel/helper-simple-access" "^7.8.3" - "@babel/helper-split-export-declaration" "^7.8.3" - "@babel/template" "^7.8.6" - "@babel/types" "^7.9.0" - lodash "^4.17.13" + "@babel/types" "^7.10.4" -"@babel/helper-optimise-call-expression@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz#7ed071813d09c75298ef4f208956006b6111ecb9" - integrity sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ== - dependencies: - "@babel/types" "^7.8.3" +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" + integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz#9ea293be19babc0f52ff8ca88b34c3611b208670" - integrity sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ== - -"@babel/helper-regex@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.8.3.tgz#139772607d51b93f23effe72105b319d2a4c6965" - integrity sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ== +"@babel/helper-regex@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.10.4.tgz#59b373daaf3458e5747dece71bbaf45f9676af6d" + integrity sha512-inWpnHGgtg5NOF0eyHlC0/74/VkdRITY9dtTpB2PrxKKn+AkVMRiZz/Adrx+Ssg+MLDesi2zohBW6MVq6b4pOQ== dependencies: lodash "^4.17.13" -"@babel/helper-remap-async-to-generator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz#273c600d8b9bf5006142c1e35887d555c12edd86" - integrity sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA== +"@babel/helper-remap-async-to-generator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.4.tgz#fce8bea4e9690bbe923056ded21e54b4e8b68ed5" + integrity sha512-86Lsr6NNw3qTNl+TBcF1oRZMaVzJtbWTyTko+CQL/tvNvcGYEFKbLXDPxtW0HKk3McNOk4KzY55itGWCAGK5tg== dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" - "@babel/helper-wrap-function" "^7.8.3" - "@babel/template" "^7.8.3" - "@babel/traverse" "^7.8.3" - "@babel/types" "^7.8.3" + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-wrap-function" "^7.10.4" + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" -"@babel/helper-replace-supers@^7.8.3", "@babel/helper-replace-supers@^7.8.6": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz#5ada744fd5ad73203bf1d67459a27dcba67effc8" - integrity sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA== +"@babel/helper-replace-supers@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz#d585cd9388ea06e6031e4cd44b6713cbead9e6cf" + integrity sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A== dependencies: - "@babel/helper-member-expression-to-functions" "^7.8.3" - "@babel/helper-optimise-call-expression" "^7.8.3" - "@babel/traverse" "^7.8.6" - "@babel/types" "^7.8.6" + "@babel/helper-member-expression-to-functions" "^7.10.4" + "@babel/helper-optimise-call-expression" "^7.10.4" + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" -"@babel/helper-simple-access@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz#7f8109928b4dab4654076986af575231deb639ae" - integrity sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw== +"@babel/helper-simple-access@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz#0f5ccda2945277a2a7a2d3a821e15395edcf3461" + integrity sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw== dependencies: - "@babel/template" "^7.8.3" - "@babel/types" "^7.8.3" + "@babel/template" "^7.10.4" + "@babel/types" "^7.10.4" -"@babel/helper-split-export-declaration@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz#31a9f30070f91368a7182cf05f831781065fc7a9" - integrity sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA== +"@babel/helper-split-export-declaration@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz#2c70576eaa3b5609b24cb99db2888cc3fc4251d1" + integrity sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg== dependencies: - "@babel/types" "^7.8.3" + "@babel/types" "^7.10.4" -"@babel/helper-validator-identifier@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz#ad53562a7fc29b3b9a91bbf7d10397fd146346ed" - integrity sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw== +"@babel/helper-validator-identifier@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" + integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== -"@babel/helper-wrap-function@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz#9dbdb2bb55ef14aaa01fe8c99b629bd5352d8610" - integrity sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ== +"@babel/helper-wrap-function@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz#8a6f701eab0ff39f765b5a1cfef409990e624b87" + integrity sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug== dependencies: - "@babel/helper-function-name" "^7.8.3" - "@babel/template" "^7.8.3" - "@babel/traverse" "^7.8.3" - "@babel/types" "^7.8.3" + "@babel/helper-function-name" "^7.10.4" + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" -"@babel/helpers@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.8.4.tgz#754eb3ee727c165e0a240d6c207de7c455f36f73" - integrity sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w== +"@babel/helpers@^7.10.4", "@babel/helpers@^7.9.0": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.10.4.tgz#2abeb0d721aff7c0a97376b9e1f6f65d7a475044" + integrity sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA== dependencies: - "@babel/template" "^7.8.3" - "@babel/traverse" "^7.8.4" - "@babel/types" "^7.8.3" + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" -"@babel/helpers@^7.9.0": - version "7.9.2" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.9.2.tgz#b42a81a811f1e7313b88cba8adc66b3d9ae6c09f" - integrity sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA== - dependencies: - "@babel/template" "^7.8.3" - "@babel/traverse" "^7.9.0" - "@babel/types" "^7.9.0" - -"@babel/highlight@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.8.3.tgz#28f173d04223eaaa59bc1d439a3836e6d1265797" - integrity sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg== +"@babel/highlight@^7.10.4", "@babel/highlight@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" + integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== dependencies: + "@babel/helper-validator-identifier" "^7.10.4" chalk "^2.0.0" - esutils "^2.0.2" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.4.3", "@babel/parser@^7.8.6": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.8.6.tgz#ba5c9910cddb77685a008e3c587af8d27b67962c" - integrity sha512-trGNYSfwq5s0SgM1BMEB8hX3NDmO7EP2wsDGDexiaKMB92BaRpS+qZfpkMqUBhcsOTBwNy9B/jieo4ad/t/z2g== +"@babel/parser@^7.1.0", "@babel/parser@^7.10.4", "@babel/parser@^7.4.3", "@babel/parser@^7.7.0", "@babel/parser@^7.9.0": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.10.4.tgz#9eedf27e1998d87739fb5028a5120557c06a1a64" + integrity sha512-8jHII4hf+YVDsskTF6WuMB3X4Eh+PsUkC2ljq22so5rHvH+T8BzyL94VOdyFLNR8tBSVXOTbNHOKpR4TfRxVtA== -"@babel/parser@^7.7.0", "@babel/parser@^7.9.0": - version "7.9.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.3.tgz#043a5fc2ad8b7ea9facddc4e802a1f0f25da7255" - integrity sha512-E6SpIDJZ0cZAKoCNk+qSDd0ChfTnpiJN9FfNf3RZ20dzwA2vL2oq5IX1XTVT+4vDmRlta2nGk5HGMMskJAR+4A== - -"@babel/plugin-proposal-async-generator-functions@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz#bad329c670b382589721b27540c7d288601c6e6f" - integrity sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw== +"@babel/plugin-proposal-async-generator-functions@^7.10.4", "@babel/plugin-proposal-async-generator-functions@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.4.tgz#4b65abb3d9bacc6c657aaa413e56696f9f170fc6" + integrity sha512-MJbxGSmejEFVOANAezdO39SObkURO5o/8b6fSH6D1pi9RZQt+ldppKPXfqgUWpSQ9asM6xaSaSJIaeWMDRP0Zg== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-remap-async-to-generator" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-remap-async-to-generator" "^7.10.4" "@babel/plugin-syntax-async-generators" "^7.8.0" "@babel/plugin-proposal-class-properties@7.8.3": @@ -486,6 +418,14 @@ "@babel/helper-create-class-features-plugin" "^7.8.3" "@babel/helper-plugin-utils" "^7.8.3" +"@babel/plugin-proposal-class-properties@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz#a33bf632da390a59c7a8c570045d1115cd778807" + integrity sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-proposal-decorators@7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.8.3.tgz#2156860ab65c5abf068c3f67042184041066543e" @@ -495,23 +435,23 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-decorators" "^7.8.3" -"@babel/plugin-proposal-dynamic-import@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz#38c4fe555744826e97e2ae930b0fb4cc07e66054" - integrity sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w== +"@babel/plugin-proposal-dynamic-import@^7.10.4", "@babel/plugin-proposal-dynamic-import@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz#ba57a26cb98b37741e9d5bca1b8b0ddf8291f17e" + integrity sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-dynamic-import" "^7.8.0" -"@babel/plugin-proposal-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz#da5216b238a98b58a1e05d6852104b10f9a70d6b" - integrity sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q== +"@babel/plugin-proposal-json-strings@^7.10.4", "@babel/plugin-proposal-json-strings@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz#593e59c63528160233bd321b1aebe0820c2341db" + integrity sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-json-strings" "^7.8.0" -"@babel/plugin-proposal-nullish-coalescing-operator@7.8.3", "@babel/plugin-proposal-nullish-coalescing-operator@^7.8.3": +"@babel/plugin-proposal-nullish-coalescing-operator@7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz#e4572253fdeed65cddeecfdab3f928afeb2fd5d2" integrity sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw== @@ -519,7 +459,15 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" -"@babel/plugin-proposal-numeric-separator@7.8.3", "@babel/plugin-proposal-numeric-separator@^7.8.3": +"@babel/plugin-proposal-nullish-coalescing-operator@^7.10.4", "@babel/plugin-proposal-nullish-coalescing-operator@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz#02a7e961fc32e6d5b2db0649e01bf80ddee7e04a" + integrity sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + +"@babel/plugin-proposal-numeric-separator@7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.8.3.tgz#5d6769409699ec9b3b68684cd8116cedff93bad8" integrity sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ== @@ -527,31 +475,32 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-numeric-separator" "^7.8.3" -"@babel/plugin-proposal-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.8.3.tgz#eb5ae366118ddca67bed583b53d7554cad9951bb" - integrity sha512-8qvuPwU/xxUCt78HocNlv0mXXo0wdh9VT1R04WU8HGOfaOob26pF+9P5/lYjN/q7DHOX1bvX60hnhOvuQUJdbA== +"@babel/plugin-proposal-numeric-separator@^7.10.4", "@babel/plugin-proposal-numeric-separator@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz#ce1590ff0a65ad12970a609d78855e9a4c1aef06" + integrity sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.0.tgz#a28993699fc13df165995362693962ba6b061d6f" - integrity sha512-UgqBv6bjq4fDb8uku9f+wcm1J7YxJ5nT7WO/jBr0cl0PLKb7t1O6RNR1kZbjgx2LQtsDI9hwoQVmn0yhXeQyow== +"@babel/plugin-proposal-object-rest-spread@^7.10.4", "@babel/plugin-proposal-object-rest-spread@^7.9.0": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.10.4.tgz#50129ac216b9a6a55b3853fdd923e74bf553a4c0" + integrity sha512-6vh4SqRuLLarjgeOf4EaROJAHjvu9Gl+/346PbDH9yWbJyfnJ/ah3jmYKYtswEyCoWZiidvVHjHshd4WgjB9BA== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-transform-parameters" "^7.10.4" -"@babel/plugin-proposal-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz#9dee96ab1650eed88646ae9734ca167ac4a9c5c9" - integrity sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw== +"@babel/plugin-proposal-optional-catch-binding@^7.10.4", "@babel/plugin-proposal-optional-catch-binding@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz#31c938309d24a78a49d68fdabffaa863758554dd" + integrity sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" -"@babel/plugin-proposal-optional-chaining@7.9.0", "@babel/plugin-proposal-optional-chaining@^7.9.0": +"@babel/plugin-proposal-optional-chaining@7.9.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz#31db16b154c39d6b8a645292472b98394c292a58" integrity sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w== @@ -559,29 +508,29 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-optional-chaining" "^7.8.0" -"@babel/plugin-proposal-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.8.3.tgz#ae10b3214cb25f7adb1f3bc87ba42ca10b7e2543" - integrity sha512-QIoIR9abkVn+seDE3OjA08jWcs3eZ9+wJCKSRgo3WdEU2csFYgdScb+8qHB3+WXsGJD55u+5hWCISI7ejXS+kg== +"@babel/plugin-proposal-optional-chaining@^7.10.4", "@babel/plugin-proposal-optional-chaining@^7.9.0": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.10.4.tgz#750f1255e930a1f82d8cdde45031f81a0d0adff7" + integrity sha512-ZIhQIEeavTgouyMSdZRap4VPPHqJJ3NEs2cuHs5p0erH+iz6khB0qfgU8g7UuJkG88+fBMy23ZiU+nuHvekJeQ== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-optional-chaining" "^7.8.0" -"@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.8.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.8.tgz#ee3a95e90cdc04fe8cd92ec3279fa017d68a0d1d" - integrity sha512-EVhjVsMpbhLw9ZfHWSx2iy13Q8Z/eg8e8ccVWt23sWQK5l1UdkoLJPN5w69UA4uITGBnEZD2JOe4QOHycYKv8A== +"@babel/plugin-proposal-private-methods@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz#b160d972b8fdba5c7d111a145fc8c421fc2a6909" + integrity sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.8.8" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-create-class-features-plugin" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-proposal-unicode-property-regex@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.3.tgz#b646c3adea5f98800c9ab45105ac34d06cd4a47f" - integrity sha512-1/1/rEZv2XGweRwwSkLpY+s60za9OZ1hJs4YDqFHCw0kYWYwL5IFljVY1MYBL+weT1l9pokDO2uhSTLVxzoHkQ== +"@babel/plugin-proposal-unicode-property-regex@^7.10.4", "@babel/plugin-proposal-unicode-property-regex@^7.4.4", "@babel/plugin-proposal-unicode-property-regex@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz#4483cda53041ce3413b7fe2f00022665ddfaa75d" + integrity sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-create-regexp-features-plugin" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-async-generators@^7.8.0": version "7.8.4" @@ -590,12 +539,19 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-decorators@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.8.3.tgz#8d2c15a9f1af624b0025f961682a9d53d3001bda" - integrity sha512-8Hg4dNNT9/LcA1zQlfwuKR8BUc/if7Q7NkTam9sGTcJphLwpf2g4S42uhspQrIrR+dpzE0dtTqBVFoHl8GtnnQ== +"@babel/plugin-syntax-class-properties@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz#6644e6a0baa55a61f9e3231f6c9eeb6ee46c124c" + integrity sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-decorators@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.10.4.tgz#6853085b2c429f9d322d02f5a635018cdeb2360c" + integrity sha512-2NaoC6fAk2VMdhY1eerkfHV+lVYC1u8b+jmRJISqANCJlTxYy19HGdIkkQtix2UtkcPuPu+IlDgrVseZnU03bw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-dynamic-import@^7.8.0": version "7.8.3" @@ -605,11 +561,11 @@ "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-flow@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.8.3.tgz#f2c883bd61a6316f2c89380ae5122f923ba4527f" - integrity sha512-innAx3bUbA0KSYj2E2MNFSn9hiCeowOFLxlsuhXzw8hMQnzkDomUr9QCD7E9VF60NmnG1sNTuuv6Qf4f8INYsg== + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.10.4.tgz#53351dd7ae01995e567d04ce42af1a6e0ba846a6" + integrity sha512-yxQsX1dJixF4qEEdzVbst3SZQ58Nrooz8NV9Z9GL4byTE25BvJgl5lf0RECUf0fh28rZBb/RYTWn/eeKwCMrZQ== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-json-strings@^7.8.0": version "7.8.3" @@ -618,12 +574,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.3.tgz#521b06c83c40480f1e58b4fd33b92eceb1d6ea94" - integrity sha512-WxdW9xyLgBdefoo0Ynn3MRSkhe5tFVxxKNVdnZSh318WrG2e2jH+E9wd/++JsqcLJZPfz87njQJ8j2Upjm0M0A== +"@babel/plugin-syntax-jsx@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.4.tgz#39abaae3cbf710c4373d8429484e6ba21340166c" + integrity sha512-KCg9mio9jwiARCB7WAcQ7Y1q+qicILjoK8LP/VkPkEKaf5dkaZZK1EcTe91a3JJlZ3qy6L5s9X52boEYi8DM9g== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0": version "7.8.3" @@ -632,12 +588,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-numeric-separator@^7.8.0", "@babel/plugin-syntax-numeric-separator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz#0e3fb63e09bea1b11e96467271c8308007e7c41f" - integrity sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw== +"@babel/plugin-syntax-numeric-separator@^7.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.0", "@babel/plugin-syntax-numeric-separator@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.8.0": version "7.8.3" @@ -660,115 +616,101 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-top-level-await@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz#3acdece695e6b13aaf57fc291d1a800950c71391" - integrity sha512-kwj1j9lL/6Wd0hROD3b/OZZ7MSrZLqqn9RAZ5+cYYsflQ9HZBIKCUkr3+uL1MEJ1NePiUbf98jjiMQSv0NMR9g== +"@babel/plugin-syntax-top-level-await@^7.10.4", "@babel/plugin-syntax-top-level-await@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz#4bbeb8917b54fcf768364e0a81f560e33a3ef57d" + integrity sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-typescript@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.8.3.tgz#c1f659dda97711a569cef75275f7e15dcaa6cabc" - integrity sha512-GO1MQ/SGGGoiEXY0e0bSpHimJvxqB7lktLLIq2pv8xG7WZ8IMEle74jIe1FhprHBWjwjZtXHkycDLZXIWM5Wfg== +"@babel/plugin-syntax-typescript@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.10.4.tgz#2f55e770d3501e83af217d782cb7517d7bb34d25" + integrity sha512-oSAEz1YkBCAKr5Yiq8/BNtvSAPwkp/IyUnwZogd8p+F0RuYQQrLeRUzIQhueQTTBy/F+a40uS7OFKxnkRvmvFQ== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-arrow-functions@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz#82776c2ed0cd9e1a49956daeb896024c9473b8b6" - integrity sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg== +"@babel/plugin-transform-arrow-functions@^7.10.4", "@babel/plugin-transform-arrow-functions@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz#e22960d77e697c74f41c501d44d73dbf8a6a64cd" + integrity sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-async-to-generator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz#4308fad0d9409d71eafb9b1a6ee35f9d64b64086" - integrity sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ== +"@babel/plugin-transform-async-to-generator@^7.10.4", "@babel/plugin-transform-async-to-generator@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz#41a5017e49eb6f3cda9392a51eef29405b245a37" + integrity sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ== dependencies: - "@babel/helper-module-imports" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-remap-async-to-generator" "^7.8.3" + "@babel/helper-module-imports" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-remap-async-to-generator" "^7.10.4" -"@babel/plugin-transform-block-scoped-functions@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz#437eec5b799b5852072084b3ae5ef66e8349e8a3" - integrity sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg== +"@babel/plugin-transform-block-scoped-functions@^7.10.4", "@babel/plugin-transform-block-scoped-functions@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz#1afa595744f75e43a91af73b0d998ecfe4ebc2e8" + integrity sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-block-scoping@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz#97d35dab66857a437c166358b91d09050c868f3a" - integrity sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w== +"@babel/plugin-transform-block-scoping@^7.10.4", "@babel/plugin-transform-block-scoping@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.10.4.tgz#a670d1364bb5019a621b9ea2001482876d734787" + integrity sha512-J3b5CluMg3hPUii2onJDRiaVbPtKFPLEaV5dOPY5OeAbDi1iU/UbbFFTgwb7WnanaDy7bjU35kc26W3eM5Qa0A== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" lodash "^4.17.13" -"@babel/plugin-transform-classes@^7.8.6": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.8.6.tgz#77534447a477cbe5995ae4aee3e39fbc8090c46d" - integrity sha512-k9r8qRay/R6v5aWZkrEclEhKO6mc1CCQr2dLsVHBmOQiMpN6I2bpjX3vgnldUWeEI1GHVNByULVxZ4BdP4Hmdg== +"@babel/plugin-transform-classes@^7.10.4", "@babel/plugin-transform-classes@^7.9.0": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz#405136af2b3e218bc4a1926228bc917ab1a0adc7" + integrity sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA== dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" - "@babel/helper-define-map" "^7.8.3" - "@babel/helper-function-name" "^7.8.3" - "@babel/helper-optimise-call-expression" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-replace-supers" "^7.8.6" - "@babel/helper-split-export-declaration" "^7.8.3" + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-define-map" "^7.10.4" + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-optimise-call-expression" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-replace-supers" "^7.10.4" + "@babel/helper-split-export-declaration" "^7.10.4" globals "^11.1.0" -"@babel/plugin-transform-classes@^7.9.0": - version "7.9.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.2.tgz#8603fc3cc449e31fdbdbc257f67717536a11af8d" - integrity sha512-TC2p3bPzsfvSsqBZo0kJnuelnoK9O3welkUpqSqBQuBF6R5MN2rysopri8kNvtlGIb2jmUO7i15IooAZJjZuMQ== +"@babel/plugin-transform-computed-properties@^7.10.4", "@babel/plugin-transform-computed-properties@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz#9ded83a816e82ded28d52d4b4ecbdd810cdfc0eb" + integrity sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw== dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" - "@babel/helper-define-map" "^7.8.3" - "@babel/helper-function-name" "^7.8.3" - "@babel/helper-optimise-call-expression" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-replace-supers" "^7.8.6" - "@babel/helper-split-export-declaration" "^7.8.3" - globals "^11.1.0" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-computed-properties@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz#96d0d28b7f7ce4eb5b120bb2e0e943343c86f81b" - integrity sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA== +"@babel/plugin-transform-destructuring@^7.10.4", "@babel/plugin-transform-destructuring@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz#70ddd2b3d1bea83d01509e9bb25ddb3a74fc85e5" + integrity sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-destructuring@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.3.tgz#20ddfbd9e4676906b1056ee60af88590cc7aaa0b" - integrity sha512-H4X646nCkiEcHZUZaRkhE2XVsoz0J/1x3VVujnn96pSoGCtKPA99ZZA+va+gK+92Zycd6OBKCD8tDb/731bhgQ== +"@babel/plugin-transform-dotall-regex@^7.10.4", "@babel/plugin-transform-dotall-regex@^7.4.4", "@babel/plugin-transform-dotall-regex@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz#469c2062105c1eb6a040eaf4fac4b488078395ee" + integrity sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-create-regexp-features-plugin" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-dotall-regex@^7.4.4", "@babel/plugin-transform-dotall-regex@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz#c3c6ec5ee6125c6993c5cbca20dc8621a9ea7a6e" - integrity sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw== +"@babel/plugin-transform-duplicate-keys@^7.10.4", "@babel/plugin-transform-duplicate-keys@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz#697e50c9fee14380fe843d1f306b295617431e47" + integrity sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-duplicate-keys@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz#8d12df309aa537f272899c565ea1768e286e21f1" - integrity sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ== +"@babel/plugin-transform-exponentiation-operator@^7.10.4", "@babel/plugin-transform-exponentiation-operator@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz#5ae338c57f8cf4001bdb35607ae66b92d665af2e" + integrity sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-exponentiation-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz#581a6d7f56970e06bf51560cd64f5e947b70d7b7" - integrity sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ== - dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-transform-flow-strip-types@7.9.0": version "7.9.0" @@ -778,257 +720,186 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-flow" "^7.8.3" -"@babel/plugin-transform-for-of@^7.8.6": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.8.6.tgz#a051bd1b402c61af97a27ff51b468321c7c2a085" - integrity sha512-M0pw4/1/KI5WAxPsdcUL/w2LJ7o89YHN3yLkzNjg7Yl15GlVGgzHyCU+FMeAxevHGsLVmUqbirlUIKTafPmzdw== +"@babel/plugin-transform-for-of@^7.10.4", "@babel/plugin-transform-for-of@^7.9.0": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz#c08892e8819d3a5db29031b115af511dbbfebae9" + integrity sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-for-of@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.9.0.tgz#0f260e27d3e29cd1bb3128da5e76c761aa6c108e" - integrity sha512-lTAnWOpMwOXpyDx06N+ywmF3jNbafZEqZ96CGYabxHrxNX8l5ny7dt4bK/rGwAh9utyP2b2Hv7PlZh1AAS54FQ== +"@babel/plugin-transform-function-name@^7.10.4", "@babel/plugin-transform-function-name@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz#6a467880e0fc9638514ba369111811ddbe2644b7" + integrity sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-function-name@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz#279373cb27322aaad67c2683e776dfc47196ed8b" - integrity sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ== +"@babel/plugin-transform-literals@^7.10.4", "@babel/plugin-transform-literals@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz#9f42ba0841100a135f22712d0e391c462f571f3c" + integrity sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ== dependencies: - "@babel/helper-function-name" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-literals@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz#aef239823d91994ec7b68e55193525d76dbd5dc1" - integrity sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A== +"@babel/plugin-transform-member-expression-literals@^7.10.4", "@babel/plugin-transform-member-expression-literals@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz#b1ec44fcf195afcb8db2c62cd8e551c881baf8b7" + integrity sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-member-expression-literals@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz#963fed4b620ac7cbf6029c755424029fa3a40410" - integrity sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA== +"@babel/plugin-transform-modules-amd@^7.10.4", "@babel/plugin-transform-modules-amd@^7.9.0": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.4.tgz#cb407c68b862e4c1d13a2fc738c7ec5ed75fc520" + integrity sha512-3Fw+H3WLUrTlzi3zMiZWp3AR4xadAEMv6XRCYnd5jAlLM61Rn+CRJaZMaNvIpcJpQ3vs1kyifYvEVPFfoSkKOA== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-module-transforms" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-amd@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.8.3.tgz#65606d44616b50225e76f5578f33c568a0b876a5" - integrity sha512-MadJiU3rLKclzT5kBH4yxdry96odTUwuqrZM+GllFI/VhxfPz+k9MshJM+MwhfkCdxxclSbSBbUGciBngR+kEQ== +"@babel/plugin-transform-modules-commonjs@^7.10.4", "@babel/plugin-transform-modules-commonjs@^7.9.0": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz#66667c3eeda1ebf7896d41f1f16b17105a2fbca0" + integrity sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w== dependencies: - "@babel/helper-module-transforms" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - babel-plugin-dynamic-import-node "^2.3.0" + "@babel/helper-module-transforms" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-simple-access" "^7.10.4" + babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-amd@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.0.tgz#19755ee721912cf5bb04c07d50280af3484efef4" - integrity sha512-vZgDDF003B14O8zJy0XXLnPH4sg+9X5hFBBGN1V+B2rgrB+J2xIypSN6Rk9imB2hSTHQi5OHLrFWsZab1GMk+Q== +"@babel/plugin-transform-modules-systemjs@^7.10.4", "@babel/plugin-transform-modules-systemjs@^7.9.0": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.4.tgz#8f576afd943ac2f789b35ded0a6312f929c633f9" + integrity sha512-Tb28LlfxrTiOTGtZFsvkjpyjCl9IoaRI52AEU/VIwOwvDQWtbNJsAqTXzh+5R7i74e/OZHH2c2w2fsOqAfnQYQ== dependencies: - "@babel/helper-module-transforms" "^7.9.0" - "@babel/helper-plugin-utils" "^7.8.3" - babel-plugin-dynamic-import-node "^2.3.0" + "@babel/helper-hoist-variables" "^7.10.4" + "@babel/helper-module-transforms" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-commonjs@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.8.3.tgz#df251706ec331bd058a34bdd72613915f82928a5" - integrity sha512-JpdMEfA15HZ/1gNuB9XEDlZM1h/gF/YOH7zaZzQu2xCFRfwc01NXBMHHSTT6hRjlXJJs5x/bfODM3LiCk94Sxg== +"@babel/plugin-transform-modules-umd@^7.10.4", "@babel/plugin-transform-modules-umd@^7.9.0": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz#9a8481fe81b824654b3a0b65da3df89f3d21839e" + integrity sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA== dependencies: - "@babel/helper-module-transforms" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-simple-access" "^7.8.3" - babel-plugin-dynamic-import-node "^2.3.0" + "@babel/helper-module-transforms" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-modules-commonjs@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.0.tgz#e3e72f4cbc9b4a260e30be0ea59bdf5a39748940" - integrity sha512-qzlCrLnKqio4SlgJ6FMMLBe4bySNis8DFn1VkGmOcxG9gqEyPIOzeQrA//u0HAKrWpJlpZbZMPB1n/OPa4+n8g== +"@babel/plugin-transform-named-capturing-groups-regex@^7.10.4", "@babel/plugin-transform-named-capturing-groups-regex@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz#78b4d978810b6f3bcf03f9e318f2fc0ed41aecb6" + integrity sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA== dependencies: - "@babel/helper-module-transforms" "^7.9.0" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-simple-access" "^7.8.3" - babel-plugin-dynamic-import-node "^2.3.0" + "@babel/helper-create-regexp-features-plugin" "^7.10.4" -"@babel/plugin-transform-modules-systemjs@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.8.3.tgz#d8bbf222c1dbe3661f440f2f00c16e9bb7d0d420" - integrity sha512-8cESMCJjmArMYqa9AO5YuMEkE4ds28tMpZcGZB/jl3n0ZzlsxOAi3mC+SKypTfT8gjMupCnd3YiXCkMjj2jfOg== +"@babel/plugin-transform-new-target@^7.10.4", "@babel/plugin-transform-new-target@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz#9097d753cb7b024cb7381a3b2e52e9513a9c6888" + integrity sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw== dependencies: - "@babel/helper-hoist-variables" "^7.8.3" - "@babel/helper-module-transforms" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - babel-plugin-dynamic-import-node "^2.3.0" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-modules-systemjs@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.0.tgz#e9fd46a296fc91e009b64e07ddaa86d6f0edeb90" - integrity sha512-FsiAv/nao/ud2ZWy4wFacoLOm5uxl0ExSQ7ErvP7jpoihLR6Cq90ilOFyX9UXct3rbtKsAiZ9kFt5XGfPe/5SQ== +"@babel/plugin-transform-object-super@^7.10.4", "@babel/plugin-transform-object-super@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz#d7146c4d139433e7a6526f888c667e314a093894" + integrity sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ== dependencies: - "@babel/helper-hoist-variables" "^7.8.3" - "@babel/helper-module-transforms" "^7.9.0" - "@babel/helper-plugin-utils" "^7.8.3" - babel-plugin-dynamic-import-node "^2.3.0" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-replace-supers" "^7.10.4" -"@babel/plugin-transform-modules-umd@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.8.3.tgz#592d578ce06c52f5b98b02f913d653ffe972661a" - integrity sha512-evhTyWhbwbI3/U6dZAnx/ePoV7H6OUG+OjiJFHmhr9FPn0VShjwC2kdxqIuQ/+1P50TMrneGzMeyMTFOjKSnAw== +"@babel/plugin-transform-parameters@^7.10.4", "@babel/plugin-transform-parameters@^7.8.7": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.4.tgz#7b4d137c87ea7adc2a0f3ebf53266871daa6fced" + integrity sha512-RurVtZ/D5nYfEg0iVERXYKEgDFeesHrHfx8RT05Sq57ucj2eOYAP6eu5fynL4Adju4I/mP/I6SO0DqNWAXjfLQ== dependencies: - "@babel/helper-module-transforms" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-get-function-arity" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-modules-umd@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.9.0.tgz#e909acae276fec280f9b821a5f38e1f08b480697" - integrity sha512-uTWkXkIVtg/JGRSIABdBoMsoIeoHQHPTL0Y2E7xf5Oj7sLqwVsNXOkNk0VJc7vF0IMBsPeikHxFjGe+qmwPtTQ== +"@babel/plugin-transform-property-literals@^7.10.4", "@babel/plugin-transform-property-literals@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz#f6fe54b6590352298785b83edd815d214c42e3c0" + integrity sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g== dependencies: - "@babel/helper-module-transforms" "^7.9.0" - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-named-capturing-groups-regex@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz#a2a72bffa202ac0e2d0506afd0939c5ecbc48c6c" - integrity sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.8.3" - -"@babel/plugin-transform-new-target@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz#60cc2ae66d85c95ab540eb34babb6434d4c70c43" - integrity sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-object-super@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz#ebb6a1e7a86ffa96858bd6ac0102d65944261725" - integrity sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-replace-supers" "^7.8.3" - -"@babel/plugin-transform-parameters@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.8.4.tgz#1d5155de0b65db0ccf9971165745d3bb990d77d3" - integrity sha512-IsS3oTxeTsZlE5KqzTbcC2sV0P9pXdec53SU+Yxv7o/6dvGM5AkTotQKhoSffhNgZ/dftsSiOoxy7evCYJXzVA== - dependencies: - "@babel/helper-call-delegate" "^7.8.3" - "@babel/helper-get-function-arity" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-parameters@^7.8.7": - version "7.9.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.3.tgz#3028d0cc20ddc733166c6e9c8534559cee09f54a" - integrity sha512-fzrQFQhp7mIhOzmOtPiKffvCYQSK10NR8t6BBz2yPbeUHb9OLW8RZGtgDRBn8z2hGcwvKDL3vC7ojPTLNxmqEg== - dependencies: - "@babel/helper-get-function-arity" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-property-literals@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz#33194300d8539c1ed28c62ad5087ba3807b98263" - integrity sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-transform-react-constant-elements@^7.0.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.8.3.tgz#784c25294bddaad2323eb4ff0c9f4a3f6c87d6bc" - integrity sha512-glrzN2U+egwRfkNFtL34xIBYTxbbUF2qJTP8HD3qETBBqzAWSeNB821X0GjU06+dNpq/UyCIjI72FmGE5NNkQQ== + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.10.4.tgz#0f485260bf1c29012bb973e7e404749eaac12c9e" + integrity sha512-cYmQBW1pXrqBte1raMkAulXmi7rjg3VI6ZLg9QIic8Hq7BtYXaWuZSxsr2siOMI6SWwpxjWfnwhTUrd7JlAV7g== dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-react-display-name@7.8.3", "@babel/plugin-transform-react-display-name@^7.8.3": +"@babel/plugin-transform-react-display-name@7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.8.3.tgz#70ded987c91609f78353dd76d2fb2a0bb991e8e5" integrity sha512-3Jy/PCw8Fe6uBKtEgz3M82ljt+lTg+xJaM4og+eyu83qLT87ZUSckn0wy7r31jflURWLO83TW6Ylf7lyXj3m5A== dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-react-jsx-development@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.9.0.tgz#3c2a130727caf00c2a293f0aed24520825dbf754" - integrity sha512-tK8hWKrQncVvrhvtOiPpKrQjfNX3DtkNLSX4ObuGcpS9p0QrGetKmlySIGR07y48Zft8WVgPakqd/bk46JrMSw== +"@babel/plugin-transform-react-display-name@^7.10.4", "@babel/plugin-transform-react-display-name@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.10.4.tgz#b5795f4e3e3140419c3611b7a2a3832b9aef328d" + integrity sha512-Zd4X54Mu9SBfPGnEcaGcOrVAYOtjT2on8QZkLKEq1S/tHexG39d9XXGZv19VfRrDjPJzFmPfTAqOQS1pfFOujw== dependencies: - "@babel/helper-builder-react-jsx-experimental" "^7.9.0" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-jsx" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-react-jsx-self@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.8.3.tgz#c4f178b2aa588ecfa8d077ea80d4194ee77ed702" - integrity sha512-01OT7s5oa0XTLf2I8XGsL8+KqV9lx3EZV+jxn/L2LQ97CGKila2YMroTkCEIE0HV/FF7CMSRsIAybopdN9NTdg== +"@babel/plugin-transform-react-jsx-development@^7.10.4", "@babel/plugin-transform-react-jsx-development@^7.9.0": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.10.4.tgz#6ec90f244394604623880e15ebc3c34c356258ba" + integrity sha512-RM3ZAd1sU1iQ7rI2dhrZRZGv0aqzNQMbkIUCS1txYpi9wHQ2ZHNjo5TwX+UD6pvFW4AbWqLVYvKy5qJSAyRGjQ== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-jsx" "^7.8.3" + "@babel/helper-builder-react-jsx-experimental" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-jsx" "^7.10.4" -"@babel/plugin-transform-react-jsx-self@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.9.0.tgz#f4f26a325820205239bb915bad8e06fcadabb49b" - integrity sha512-K2ObbWPKT7KUTAoyjCsFilOkEgMvFG+y0FqOl6Lezd0/13kMkkjHskVsZvblRPj1PHA44PrToaZANrryppzTvQ== +"@babel/plugin-transform-react-jsx-self@^7.10.4", "@babel/plugin-transform-react-jsx-self@^7.9.0": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.10.4.tgz#cd301a5fed8988c182ed0b9d55e9bd6db0bd9369" + integrity sha512-yOvxY2pDiVJi0axdTWHSMi5T0DILN+H+SaeJeACHKjQLezEzhLx9nEF9xgpBLPtkZsks9cnb5P9iBEi21En3gg== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-jsx" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-jsx" "^7.10.4" -"@babel/plugin-transform-react-jsx-source@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.8.3.tgz#951e75a8af47f9f120db731be095d2b2c34920e0" - integrity sha512-PLMgdMGuVDtRS/SzjNEQYUT8f4z1xb2BAT54vM1X5efkVuYBf5WyGUMbpmARcfq3NaglIwz08UVQK4HHHbC6ag== +"@babel/plugin-transform-react-jsx-source@^7.10.4", "@babel/plugin-transform-react-jsx-source@^7.9.0": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.10.4.tgz#86baf0fcccfe58084e06446a80858e1deae8f291" + integrity sha512-FTK3eQFrPv2aveerUSazFmGygqIdTtvskG50SnGnbEUnRPcGx2ylBhdFIzoVS1ty44hEgcPoCAyw5r3VDEq+Ug== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-jsx" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-jsx" "^7.10.4" -"@babel/plugin-transform-react-jsx-source@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.9.0.tgz#89ef93025240dd5d17d3122294a093e5e0183de0" - integrity sha512-K6m3LlSnTSfRkM6FcRk8saNEeaeyG5k7AVkBU2bZK3+1zdkSED3qNdsWrUgQBeTVD2Tp3VMmerxVO2yM5iITmw== +"@babel/plugin-transform-react-jsx@^7.10.4", "@babel/plugin-transform-react-jsx@^7.9.1": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.10.4.tgz#673c9f913948764a4421683b2bef2936968fddf2" + integrity sha512-L+MfRhWjX0eI7Js093MM6MacKU4M6dnCRa/QPDwYMxjljzSCzzlzKzj9Pk4P3OtrPcxr2N3znR419nr3Xw+65A== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-jsx" "^7.8.3" + "@babel/helper-builder-react-jsx" "^7.10.4" + "@babel/helper-builder-react-jsx-experimental" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-jsx" "^7.10.4" -"@babel/plugin-transform-react-jsx@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.8.3.tgz#4220349c0390fdefa505365f68c103562ab2fc4a" - integrity sha512-r0h+mUiyL595ikykci+fbwm9YzmuOrUBi0b+FDIKmi3fPQyFokWVEMJnRWHJPPQEjyFJyna9WZC6Viv6UHSv1g== +"@babel/plugin-transform-react-pure-annotations@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.10.4.tgz#3eefbb73db94afbc075f097523e445354a1c6501" + integrity sha512-+njZkqcOuS8RaPakrnR9KvxjoG1ASJWpoIv/doyWngId88JoFlPlISenGXjrVacZUIALGUr6eodRs1vmPnF23A== dependencies: - "@babel/helper-builder-react-jsx" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-jsx" "^7.8.3" + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-react-jsx@^7.9.1": - version "7.9.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.9.1.tgz#d03af29396a6dc51bfa24eefd8005a9fd381152a" - integrity sha512-+xIZ6fPoix7h57CNO/ZeYADchg1tFyX9NDsnmNFFua8e1JNPln156mzS+8AQe1On2X2GLlANHJWHIXbMCqWDkQ== - dependencies: - "@babel/helper-builder-react-jsx" "^7.9.0" - "@babel/helper-builder-react-jsx-experimental" "^7.9.0" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-jsx" "^7.8.3" - -"@babel/plugin-transform-regenerator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.3.tgz#b31031e8059c07495bf23614c97f3d9698bc6ec8" - integrity sha512-qt/kcur/FxrQrzFR432FGZznkVAjiyFtCOANjkAKwCbt465L6ZCiUQh2oMYGU3Wo8LRFJxNDFwWn106S5wVUNA== - dependencies: - regenerator-transform "^0.14.0" - -"@babel/plugin-transform-regenerator@^7.8.7": - version "7.8.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.7.tgz#5e46a0dca2bee1ad8285eb0527e6abc9c37672f8" - integrity sha512-TIg+gAl4Z0a3WmD3mbYSk+J9ZUH6n/Yc57rtKRnlA/7rcCvpekHXe0CMZHP1gYp7/KLe9GHTuIba0vXmls6drA== +"@babel/plugin-transform-regenerator@^7.10.4", "@babel/plugin-transform-regenerator@^7.8.7": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz#2015e59d839074e76838de2159db421966fd8b63" + integrity sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw== dependencies: regenerator-transform "^0.14.2" -"@babel/plugin-transform-reserved-words@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz#9a0635ac4e665d29b162837dd3cc50745dfdf1f5" - integrity sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A== +"@babel/plugin-transform-reserved-words@^7.10.4", "@babel/plugin-transform-reserved-words@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz#8f2682bcdcef9ed327e1b0861585d7013f8a54dd" + integrity sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-transform-runtime@7.9.0": version "7.9.0" @@ -1040,59 +911,66 @@ resolve "^1.8.1" semver "^5.5.1" -"@babel/plugin-transform-shorthand-properties@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz#28545216e023a832d4d3a1185ed492bcfeac08c8" - integrity sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w== +"@babel/plugin-transform-shorthand-properties@^7.10.4", "@babel/plugin-transform-shorthand-properties@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz#9fd25ec5cdd555bb7f473e5e6ee1c971eede4dd6" + integrity sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz#9c8ffe8170fdfb88b114ecb920b82fb6e95fe5e8" - integrity sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g== +"@babel/plugin-transform-spread@^7.10.4", "@babel/plugin-transform-spread@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.10.4.tgz#4e2c85ea0d6abaee1b24dcfbbae426fe8d674cff" + integrity sha512-1e/51G/Ni+7uH5gktbWv+eCED9pP8ZpRhZB3jOaI3mmzfvJTWHkuyYTv0Z5PYtyM+Tr2Ccr9kUdQxn60fI5WuQ== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-sticky-regex@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz#be7a1290f81dae767475452199e1f76d6175b100" - integrity sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw== +"@babel/plugin-transform-sticky-regex@^7.10.4", "@babel/plugin-transform-sticky-regex@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz#8f3889ee8657581130a29d9cc91d7c73b7c4a28d" + integrity sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-regex" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-regex" "^7.10.4" -"@babel/plugin-transform-template-literals@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz#7bfa4732b455ea6a43130adc0ba767ec0e402a80" - integrity sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ== +"@babel/plugin-transform-template-literals@^7.10.4", "@babel/plugin-transform-template-literals@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.4.tgz#e6375407b30fcb7fcfdbba3bb98ef3e9d36df7bc" + integrity sha512-4NErciJkAYe+xI5cqfS8pV/0ntlY5N5Ske/4ImxAVX7mk9Rxt2bwDTGv1Msc2BRJvWQcmYEC+yoMLdX22aE4VQ== dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-typeof-symbol@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz#ede4062315ce0aaf8a657a920858f1a2f35fc412" - integrity sha512-2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg== +"@babel/plugin-transform-typeof-symbol@^7.10.4", "@babel/plugin-transform-typeof-symbol@^7.8.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz#9509f1a7eec31c4edbffe137c16cc33ff0bc5bfc" + integrity sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-transform-typescript@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.9.0.tgz#8b52649c81cb7dee117f760952ab46675a258836" - integrity sha512-GRffJyCu16H3tEhbt9Q4buVFFBqrgS8FzTuhqSxlXNgmqD8aw2xmwtRwrvWXXlw7gHs664uqacsJymHJ9SUE/Q== + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.10.4.tgz#8b01cb8d77f795422277cc3fcf45af72bc68ba78" + integrity sha512-3WpXIKDJl/MHoAN0fNkSr7iHdUMHZoppXjf2HJ9/ed5Xht5wNIsXllJXdityKOxeA3Z8heYRb1D3p2H5rfCdPw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-typescript" "^7.8.3" + "@babel/helper-create-class-features-plugin" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-typescript" "^7.10.4" -"@babel/plugin-transform-unicode-regex@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz#0cef36e3ba73e5c57273effb182f46b91a1ecaad" - integrity sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw== +"@babel/plugin-transform-unicode-escapes@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz#feae523391c7651ddac115dae0a9d06857892007" + integrity sha512-y5XJ9waMti2J+e7ij20e+aH+fho7Wb7W8rNuu72aKRwCHFqQdhkdU2lo3uZ9tQuboEJcUFayXdARhcxLQ3+6Fg== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-unicode-regex@^7.10.4", "@babel/plugin-transform-unicode-regex@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz#e56d71f9282fac6db09c82742055576d5e6d80a8" + integrity sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/preset-env@7.9.0": version "7.9.0" @@ -1161,63 +1039,70 @@ semver "^5.5.0" "@babel/preset-env@^7.4.5": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.8.6.tgz#2a0773b08589ecba4995fc71b1965e4f531af40b" - integrity sha512-M5u8llV9DIVXBFB/ArIpqJuvXpO+ymxcJ6e8ZAmzeK3sQeBNOD1y+rHvHCGG4TlEmsNpIrdecsHGHT8ZCoOSJg== + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.10.4.tgz#fbf57f9a803afd97f4f32e4f798bb62e4b2bef5f" + integrity sha512-tcmuQ6vupfMZPrLrc38d0sF2OjLT3/bZ0dry5HchNCQbrokoQi4reXqclvkkAT5b+gWc23meVWpve5P/7+w/zw== dependencies: - "@babel/compat-data" "^7.8.6" - "@babel/helper-compilation-targets" "^7.8.6" - "@babel/helper-module-imports" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-proposal-async-generator-functions" "^7.8.3" - "@babel/plugin-proposal-dynamic-import" "^7.8.3" - "@babel/plugin-proposal-json-strings" "^7.8.3" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-proposal-object-rest-spread" "^7.8.3" - "@babel/plugin-proposal-optional-catch-binding" "^7.8.3" - "@babel/plugin-proposal-optional-chaining" "^7.8.3" - "@babel/plugin-proposal-unicode-property-regex" "^7.8.3" + "@babel/compat-data" "^7.10.4" + "@babel/helper-compilation-targets" "^7.10.4" + "@babel/helper-module-imports" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-proposal-async-generator-functions" "^7.10.4" + "@babel/plugin-proposal-class-properties" "^7.10.4" + "@babel/plugin-proposal-dynamic-import" "^7.10.4" + "@babel/plugin-proposal-json-strings" "^7.10.4" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.10.4" + "@babel/plugin-proposal-numeric-separator" "^7.10.4" + "@babel/plugin-proposal-object-rest-spread" "^7.10.4" + "@babel/plugin-proposal-optional-catch-binding" "^7.10.4" + "@babel/plugin-proposal-optional-chaining" "^7.10.4" + "@babel/plugin-proposal-private-methods" "^7.10.4" + "@babel/plugin-proposal-unicode-property-regex" "^7.10.4" "@babel/plugin-syntax-async-generators" "^7.8.0" + "@babel/plugin-syntax-class-properties" "^7.10.4" "@babel/plugin-syntax-dynamic-import" "^7.8.0" "@babel/plugin-syntax-json-strings" "^7.8.0" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" "@babel/plugin-syntax-object-rest-spread" "^7.8.0" "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" "@babel/plugin-syntax-optional-chaining" "^7.8.0" - "@babel/plugin-syntax-top-level-await" "^7.8.3" - "@babel/plugin-transform-arrow-functions" "^7.8.3" - "@babel/plugin-transform-async-to-generator" "^7.8.3" - "@babel/plugin-transform-block-scoped-functions" "^7.8.3" - "@babel/plugin-transform-block-scoping" "^7.8.3" - "@babel/plugin-transform-classes" "^7.8.6" - "@babel/plugin-transform-computed-properties" "^7.8.3" - "@babel/plugin-transform-destructuring" "^7.8.3" - "@babel/plugin-transform-dotall-regex" "^7.8.3" - "@babel/plugin-transform-duplicate-keys" "^7.8.3" - "@babel/plugin-transform-exponentiation-operator" "^7.8.3" - "@babel/plugin-transform-for-of" "^7.8.6" - "@babel/plugin-transform-function-name" "^7.8.3" - "@babel/plugin-transform-literals" "^7.8.3" - "@babel/plugin-transform-member-expression-literals" "^7.8.3" - "@babel/plugin-transform-modules-amd" "^7.8.3" - "@babel/plugin-transform-modules-commonjs" "^7.8.3" - "@babel/plugin-transform-modules-systemjs" "^7.8.3" - "@babel/plugin-transform-modules-umd" "^7.8.3" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.8.3" - "@babel/plugin-transform-new-target" "^7.8.3" - "@babel/plugin-transform-object-super" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.8.4" - "@babel/plugin-transform-property-literals" "^7.8.3" - "@babel/plugin-transform-regenerator" "^7.8.3" - "@babel/plugin-transform-reserved-words" "^7.8.3" - "@babel/plugin-transform-shorthand-properties" "^7.8.3" - "@babel/plugin-transform-spread" "^7.8.3" - "@babel/plugin-transform-sticky-regex" "^7.8.3" - "@babel/plugin-transform-template-literals" "^7.8.3" - "@babel/plugin-transform-typeof-symbol" "^7.8.4" - "@babel/plugin-transform-unicode-regex" "^7.8.3" - "@babel/types" "^7.8.6" - browserslist "^4.8.5" + "@babel/plugin-syntax-top-level-await" "^7.10.4" + "@babel/plugin-transform-arrow-functions" "^7.10.4" + "@babel/plugin-transform-async-to-generator" "^7.10.4" + "@babel/plugin-transform-block-scoped-functions" "^7.10.4" + "@babel/plugin-transform-block-scoping" "^7.10.4" + "@babel/plugin-transform-classes" "^7.10.4" + "@babel/plugin-transform-computed-properties" "^7.10.4" + "@babel/plugin-transform-destructuring" "^7.10.4" + "@babel/plugin-transform-dotall-regex" "^7.10.4" + "@babel/plugin-transform-duplicate-keys" "^7.10.4" + "@babel/plugin-transform-exponentiation-operator" "^7.10.4" + "@babel/plugin-transform-for-of" "^7.10.4" + "@babel/plugin-transform-function-name" "^7.10.4" + "@babel/plugin-transform-literals" "^7.10.4" + "@babel/plugin-transform-member-expression-literals" "^7.10.4" + "@babel/plugin-transform-modules-amd" "^7.10.4" + "@babel/plugin-transform-modules-commonjs" "^7.10.4" + "@babel/plugin-transform-modules-systemjs" "^7.10.4" + "@babel/plugin-transform-modules-umd" "^7.10.4" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.10.4" + "@babel/plugin-transform-new-target" "^7.10.4" + "@babel/plugin-transform-object-super" "^7.10.4" + "@babel/plugin-transform-parameters" "^7.10.4" + "@babel/plugin-transform-property-literals" "^7.10.4" + "@babel/plugin-transform-regenerator" "^7.10.4" + "@babel/plugin-transform-reserved-words" "^7.10.4" + "@babel/plugin-transform-shorthand-properties" "^7.10.4" + "@babel/plugin-transform-spread" "^7.10.4" + "@babel/plugin-transform-sticky-regex" "^7.10.4" + "@babel/plugin-transform-template-literals" "^7.10.4" + "@babel/plugin-transform-typeof-symbol" "^7.10.4" + "@babel/plugin-transform-unicode-escapes" "^7.10.4" + "@babel/plugin-transform-unicode-regex" "^7.10.4" + "@babel/preset-modules" "^0.1.3" + "@babel/types" "^7.10.4" + browserslist "^4.12.0" core-js-compat "^3.6.2" invariant "^2.2.2" levenary "^1.1.1" @@ -1247,15 +1132,17 @@ "@babel/plugin-transform-react-jsx-source" "^7.9.0" "@babel/preset-react@^7.0.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.8.3.tgz#23dc63f1b5b0751283e04252e78cf1d6589273d2" - integrity sha512-9hx0CwZg92jGb7iHYQVgi0tOEHP/kM60CtWJQnmbATSPIQQ2xYzfoCI3EdqAhFBeeJwYMdWQuDUHMsuDbH9hyQ== + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.10.4.tgz#92e8a66d816f9911d11d4cc935be67adfc82dbcf" + integrity sha512-BrHp4TgOIy4M19JAfO1LhycVXOPWdDbTRep7eVyatf174Hff+6Uk53sDyajqZPu8W1qXRBiYOfIamek6jA7YVw== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-transform-react-display-name" "^7.8.3" - "@babel/plugin-transform-react-jsx" "^7.8.3" - "@babel/plugin-transform-react-jsx-self" "^7.8.3" - "@babel/plugin-transform-react-jsx-source" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-transform-react-display-name" "^7.10.4" + "@babel/plugin-transform-react-jsx" "^7.10.4" + "@babel/plugin-transform-react-jsx-development" "^7.10.4" + "@babel/plugin-transform-react-jsx-self" "^7.10.4" + "@babel/plugin-transform-react-jsx-source" "^7.10.4" + "@babel/plugin-transform-react-pure-annotations" "^7.10.4" "@babel/preset-typescript@7.9.0": version "7.9.0" @@ -1266,9 +1153,9 @@ "@babel/plugin-transform-typescript" "^7.9.0" "@babel/runtime-corejs3@^7.8.3": - version "7.9.2" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.9.2.tgz#26fe4aa77e9f1ecef9b776559bbb8e84d34284b7" - integrity sha512-HHxmgxbIzOfFlZ+tdeRKtaxWOMUoCG5Mu3wKeUmOxjYrwb3AAHgnmtCUbPPK11/raIWLIBK250t8E2BPO0p7jA== + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.10.4.tgz#f29fc1990307c4c57b10dbd6ce667b27159d9e0d" + integrity sha512-BFlgP2SoLO9HJX9WBwN67gHWMBhDX/eDz64Jajd6mR/UAUzqrNMm99d4qHnVaKscAElZoFiPv+JpR/Siud5lXw== dependencies: core-js-pure "^3.0.0" regenerator-runtime "^0.13.4" @@ -1280,74 +1167,43 @@ dependencies: regenerator-runtime "^0.13.4" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.1.5", "@babel/runtime@^7.2.0", "@babel/runtime@^7.3.1", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.0", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.8.4.tgz#d79f5a2040f7caa24d53e563aad49cbc05581308" - integrity sha512-neAp3zt80trRVBI1x0azq6c57aNBqYZH8KhMm3TaB7wEI5Q4A2SHfBHE8w9gOhI/lrqxtEbXZgQIrHP+wvSGwQ== - dependencies: - regenerator-runtime "^0.13.2" - -"@babel/runtime@^7.8.4": - version "7.9.2" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.2.tgz#d90df0583a3a252f09aaa619665367bae518db06" - integrity sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q== +"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.1.5", "@babel/runtime@^7.10.1", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.4", "@babel/runtime@^7.3.1", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.10.4.tgz#a6724f1a6b8d2f6ea5236dbfe58c7d7ea9c5eb99" + integrity sha512-UpTN5yUJr9b4EX2CnGNWIvER7Ab83ibv0pcvvHc4UOdrBI5jb8bj+32cCwPX6xu0mt2daFNjYhoi+X7beH0RSw== dependencies: regenerator-runtime "^0.13.4" -"@babel/template@^7.4.0", "@babel/template@^7.8.3", "@babel/template@^7.8.6": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.6.tgz#86b22af15f828dfb086474f964dcc3e39c43ce2b" - integrity sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg== +"@babel/template@^7.10.4", "@babel/template@^7.4.0", "@babel/template@^7.8.6": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278" + integrity sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA== dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/parser" "^7.8.6" - "@babel/types" "^7.8.6" + "@babel/code-frame" "^7.10.4" + "@babel/parser" "^7.10.4" + "@babel/types" "^7.10.4" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.4.5", "@babel/traverse@^7.8.3", "@babel/traverse@^7.8.4", "@babel/traverse@^7.8.6": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.8.6.tgz#acfe0c64e1cd991b3e32eae813a6eb564954b5ff" - integrity sha512-2B8l0db/DPi8iinITKuo7cbPznLCEk0kCxDoB9/N6gGNg/gxOXiR/IcymAFPiBwk5w6TtQ27w4wpElgp9btR9A== +"@babel/traverse@^7.1.0", "@babel/traverse@^7.10.4", "@babel/traverse@^7.4.3", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.0", "@babel/traverse@^7.9.0": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.10.4.tgz#e642e5395a3b09cc95c8e74a27432b484b697818" + integrity sha512-aSy7p5THgSYm4YyxNGz6jZpXf+Ok40QF3aA2LyIONkDHpAcJzDUqlCKXv6peqYUs2gmic849C/t2HKw2a2K20Q== dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.8.6" - "@babel/helper-function-name" "^7.8.3" - "@babel/helper-split-export-declaration" "^7.8.3" - "@babel/parser" "^7.8.6" - "@babel/types" "^7.8.6" + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.10.4" + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-split-export-declaration" "^7.10.4" + "@babel/parser" "^7.10.4" + "@babel/types" "^7.10.4" debug "^4.1.0" globals "^11.1.0" lodash "^4.17.13" -"@babel/traverse@^7.7.0", "@babel/traverse@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.9.0.tgz#d3882c2830e513f4fe4cec9fe76ea1cc78747892" - integrity sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w== +"@babel/types@^7.0.0", "@babel/types@^7.10.4", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.7.0", "@babel/types@^7.9.0": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.10.4.tgz#369517188352e18219981efd156bfdb199fff1ee" + integrity sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg== dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.9.0" - "@babel/helper-function-name" "^7.8.3" - "@babel/helper-split-export-declaration" "^7.8.3" - "@babel/parser" "^7.9.0" - "@babel/types" "^7.9.0" - debug "^4.1.0" - globals "^11.1.0" - lodash "^4.17.13" - -"@babel/types@^7.0.0", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.8.3", "@babel/types@^7.8.6": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.8.6.tgz#629ecc33c2557fcde7126e58053127afdb3e6d01" - integrity sha512-wqz7pgWMIrht3gquyEFPVXeXCti72Rm8ep9b5tQKz9Yg9LzJA3HxosF1SB3Kc81KD1A3XBkkVYtJvCKS2Z/QrA== - dependencies: - esutils "^2.0.2" - lodash "^4.17.13" - to-fast-properties "^2.0.0" - -"@babel/types@^7.7.0", "@babel/types@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.0.tgz#00b064c3df83ad32b2dbf5ff07312b15c7f1efb5" - integrity sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng== - dependencies: - "@babel/helper-validator-identifier" "^7.9.0" + "@babel/helper-validator-identifier" "^7.10.4" lodash "^4.17.13" to-fast-properties "^2.0.0" @@ -1369,10 +1225,10 @@ resolved "https://registry.yarnpkg.com/@csstools/normalize.css/-/normalize.css-10.1.0.tgz#f0950bba18819512d42f7197e56c518aa491cf18" integrity sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg== -"@emotion/is-prop-valid@^0.8.3": - version "0.8.7" - resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.8.7.tgz#803449993f436f9a6c67752251ea3fc492a1044c" - integrity sha512-OPkKzUeiid0vEKjZqnGcy2mzxjIlCffin+L2C02pdz/bVlt5zZZE2VzO0D3XOPnH0NEeF21QNKSXiZphjr4xiQ== +"@emotion/is-prop-valid@^0.8.8": + version "0.8.8" + resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz#db28b1c4368a259b60a97311d6a952d4fd01ac1a" + integrity sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA== dependencies: "@emotion/memoize" "0.7.4" @@ -1391,233 +1247,240 @@ resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed" integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== -"@firebase/analytics-types@0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@firebase/analytics-types/-/analytics-types-0.3.0.tgz#33c3f695313b561d48d18d663a20f20362d3ee7c" - integrity sha512-0AJ6xn53Qn0D/YOVHHvlWFfnzzRSdd98Lr8Oqe1PJ2HPIN+o7qf03YmOG7fLpR1uplcWd+7vGKmxUrN3jKUBwg== +"@firebase/analytics-types@0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@firebase/analytics-types/-/analytics-types-0.3.1.tgz#3c5f5d71129c88295e17e914e34b391ffda1723c" + integrity sha512-63vVJ5NIBh/JF8l9LuPrQYSzFimk7zYHySQB4Dk9rVdJ8kV/vGQoVTvRu1UW05sEc2Ug5PqtEChtTHU+9hvPcA== -"@firebase/analytics@0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@firebase/analytics/-/analytics-0.3.0.tgz#943e73e792ba3f282df4d47aff5a1603b93b37a5" - integrity sha512-EEHuK+OcWH6UxufRLVU3lAJ4rmm7aVHmcgkhE9ZQJQy5c+w7QTLvVpGqtrpqD+cYyIBJkFBKJB8NziVyqKwQHw== +"@firebase/analytics@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@firebase/analytics/-/analytics-0.3.9.tgz#5755ac0f15ccf1fc6c811c99c4ca778985cdc237" + integrity sha512-l4dNskm8uQ+UqO6Lw+fuyO1enZBXUV6xNMxeVABEnVrp3wOP90KKb/ZwYgleAxF1It52lorcTtkA1YFpv3iEIQ== dependencies: - "@firebase/analytics-types" "0.3.0" - "@firebase/component" "0.1.8" - "@firebase/installations" "0.4.6" - "@firebase/logger" "0.2.0" - "@firebase/util" "0.2.43" - tslib "1.11.1" + "@firebase/analytics-types" "0.3.1" + "@firebase/component" "0.1.16" + "@firebase/installations" "0.4.14" + "@firebase/logger" "0.2.6" + "@firebase/util" "0.2.50" + tslib "^1.11.1" -"@firebase/app-types@0.6.0": - version "0.6.0" - resolved "https://registry.yarnpkg.com/@firebase/app-types/-/app-types-0.6.0.tgz#8dcc3e793c6983e9d54f7eb623a7618c05f2d94c" - integrity sha512-ld6rzjXk/SUauHiQZJkeuSJpxIZ5wdnWuF5fWBFQNPaxsaJ9kyYg9GqEvwZ1z2e6JP5cU9gwRBlfW1WkGtGDYA== +"@firebase/app-types@0.6.1": + version "0.6.1" + resolved "https://registry.yarnpkg.com/@firebase/app-types/-/app-types-0.6.1.tgz#dcbd23030a71c0c74fc95d4a3f75ba81653850e9" + integrity sha512-L/ZnJRAq7F++utfuoTKX4CLBG5YR7tFO3PLzG1/oXXKEezJ0kRL3CMRoueBEmTCzVb/6SIs2Qlaw++uDgi5Xyg== -"@firebase/app@0.6.0": - version "0.6.0" - resolved "https://registry.yarnpkg.com/@firebase/app/-/app-0.6.0.tgz#62f1720a8764333d32a11b14f1c46d82f536cf4e" - integrity sha512-utFL07aO64ZVs9g79cv1KHomtLdKkkAeKN5e8G9NlXXuO6dZXhcHLbOmKY1AfwrkAvUzPEKkFFY3dytOIt+nlg== +"@firebase/app@0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@firebase/app/-/app-0.6.8.tgz#e7ccf31cc1d01f16744d6d27c5f9ba8b64338f12" + integrity sha512-Tm7Pi6Dtpx4FFKcpm0jcrZ/qI9oREBxmP3pWlw1jgDW4syRJHmN9/5DYvfFk6FAhj3FrY8E/6F+ngWJfqONotQ== dependencies: - "@firebase/app-types" "0.6.0" - "@firebase/component" "0.1.8" - "@firebase/logger" "0.2.0" - "@firebase/util" "0.2.43" + "@firebase/app-types" "0.6.1" + "@firebase/component" "0.1.16" + "@firebase/logger" "0.2.6" + "@firebase/util" "0.2.50" dom-storage "2.1.0" - tslib "1.11.1" + tslib "^1.11.1" xmlhttprequest "1.8.0" -"@firebase/auth-interop-types@0.1.4": - version "0.1.4" - resolved "https://registry.yarnpkg.com/@firebase/auth-interop-types/-/auth-interop-types-0.1.4.tgz#e81589f58508630a5bffa604d7c949a0d01ea97b" - integrity sha512-CLKNS84KGAv5lRnHTQZFWoR11Ti7gIPFirDDXWek/fSU+TdYdnxJFR5XSD4OuGyzUYQ3Dq7aVj5teiRdyBl9hA== +"@firebase/auth-interop-types@0.1.5": + version "0.1.5" + resolved "https://registry.yarnpkg.com/@firebase/auth-interop-types/-/auth-interop-types-0.1.5.tgz#9fc9bd7c879f16b8d1bb08373a0f48c3a8b74557" + integrity sha512-88h74TMQ6wXChPA6h9Q3E1Jg6TkTHep2+k63OWg3s0ozyGVMeY+TTOti7PFPzq5RhszQPQOoCi59es4MaRvgCw== -"@firebase/auth-types@0.10.0": - version "0.10.0" - resolved "https://registry.yarnpkg.com/@firebase/auth-types/-/auth-types-0.10.0.tgz#9403633e723336055fad4bbf5e4c9fe3c55f8d3f" - integrity sha512-VuW7c+RAk3AYPU0Hxmun3RzXn7fbJDdjQbxvvpRMnQ9zrhk8mH42cY466M0n4e/UGQ+0smlx5BqZII8aYQ5XPg== +"@firebase/auth-types@0.10.1": + version "0.10.1" + resolved "https://registry.yarnpkg.com/@firebase/auth-types/-/auth-types-0.10.1.tgz#7815e71c9c6f072034415524b29ca8f1d1770660" + integrity sha512-/+gBHb1O9x/YlG7inXfxff/6X3BPZt4zgBv4kql6HEmdzNQCodIRlEYnI+/da+lN+dha7PjaFH7C7ewMmfV7rw== -"@firebase/auth@0.14.1": - version "0.14.1" - resolved "https://registry.yarnpkg.com/@firebase/auth/-/auth-0.14.1.tgz#0cb3226025c27bf2e01a738f3841ab6bde80572e" - integrity sha512-LE+QED10cjp28jJ7wwIY58HQBXoJioEWiQy7iQS8Fo2UxHGY5BvGjwnxX4yyszQPbcZZRLDSlBIUaYfog+rdEA== +"@firebase/auth@0.14.8": + version "0.14.8" + resolved "https://registry.yarnpkg.com/@firebase/auth/-/auth-0.14.8.tgz#2547eda48c97041e48802058526d021aee6e3b7b" + integrity sha512-LufoWcFpYAoCUkFDKSELH69xI8NdOjNTUFKvWfADZN7ysr4dpPdDs2ZYnH67FqcMb0tX+Jdx6vWrF6VZ37AAJQ== dependencies: - "@firebase/auth-types" "0.10.0" + "@firebase/auth-types" "0.10.1" -"@firebase/component@0.1.8": - version "0.1.8" - resolved "https://registry.yarnpkg.com/@firebase/component/-/component-0.1.8.tgz#3a5753493ba65c85c9c09e2707be44d73e0a456c" - integrity sha512-kzuCF+NVympQk3gcsHldOmDRVPVndECi6O9Wvd47HTEQYO9HsZWfOM1fHUvvHAijSzNi16p4NSM7UziuBQBL4w== +"@firebase/component@0.1.16": + version "0.1.16" + resolved "https://registry.yarnpkg.com/@firebase/component/-/component-0.1.16.tgz#7a0dbdfff1485d45b8485db87a982f053e68761a" + integrity sha512-FvffvFN0LWgv1H/FIyruTECOL69Dhy+JfwoTq+mV39V8Mz9lNpo41etonL5AOr7KmXxYJVbNwkx0L9Ei88i7JA== dependencies: - "@firebase/util" "0.2.43" - tslib "1.11.1" + "@firebase/util" "0.2.50" + tslib "^1.11.1" -"@firebase/database-types@0.4.14": - version "0.4.14" - resolved "https://registry.yarnpkg.com/@firebase/database-types/-/database-types-0.4.14.tgz#181e10c1d1ae64fd0a080f6e0369cec115c51d70" - integrity sha512-+D41HWac0HcvwMi+0dezEdSOZHpVjPKPNmpQiW2GDuS5kk27/v1jxc9v7F4ALLtpxbVcn16UZl5PqEkcS9H2Xg== +"@firebase/database-types@0.5.1": + version "0.5.1" + resolved "https://registry.yarnpkg.com/@firebase/database-types/-/database-types-0.5.1.tgz#fab2f3fb48eec374a9f435ed21e138635cb9b71c" + integrity sha512-onQxom1ZBYBJ648w/VNRzUewovEDAH7lvnrrpCd69ukkyrMk6rGEO/PQ9BcNEbhlNtukpsqRS0oNOFlHs0FaSA== dependencies: - "@firebase/app-types" "0.6.0" + "@firebase/app-types" "0.6.1" -"@firebase/database@0.5.24": - version "0.5.24" - resolved "https://registry.yarnpkg.com/@firebase/database/-/database-0.5.24.tgz#548b2030def35a7b6f4d71a4b2d1a67499d1eef3" - integrity sha512-9whAQzU8cxDUKGBWCT/aHVmqfyzCP2RkGhbZi2oHpMrmvht7cuBtXtUbDD5R8WomniCOUP8rtQfmCFI7V9ehYw== +"@firebase/database@0.6.7": + version "0.6.7" + resolved "https://registry.yarnpkg.com/@firebase/database/-/database-0.6.7.tgz#93394cb449f9f9f250bcc097a5cc9d2d3b9e1f1b" + integrity sha512-vm0ch2zNSoHfXWnDG6WVjf0p/BdXOMBL1lAfkGu3DYH/Rkl4p97x57w0WNOURNfL4GY2LIqScSYKCidV7jqTog== dependencies: - "@firebase/auth-interop-types" "0.1.4" - "@firebase/component" "0.1.8" - "@firebase/database-types" "0.4.14" - "@firebase/logger" "0.2.0" - "@firebase/util" "0.2.43" + "@firebase/auth-interop-types" "0.1.5" + "@firebase/component" "0.1.16" + "@firebase/database-types" "0.5.1" + "@firebase/logger" "0.2.6" + "@firebase/util" "0.2.50" faye-websocket "0.11.3" - tslib "1.11.1" + tslib "^1.11.1" -"@firebase/firestore-types@1.10.1": - version "1.10.1" - resolved "https://registry.yarnpkg.com/@firebase/firestore-types/-/firestore-types-1.10.1.tgz#bf018f9c495f470592de745389474dc1c2960d3f" - integrity sha512-vyKdm+AYUFT8XeUX62IOqaqPFCs/mAMoSEsqIz9HnSVsqCw/IocNjtjSa+3M80kRw4V8fI7JI+Xz6Wg5VJXLqA== +"@firebase/firestore-types@1.12.0": + version "1.12.0" + resolved "https://registry.yarnpkg.com/@firebase/firestore-types/-/firestore-types-1.12.0.tgz#511e572e946b07f5a603c90e078f0cd714923fac" + integrity sha512-OqNxVb63wPZdUc7YnpacAW1WNIMSKERSewCRi+unCQ0YI0KNfrDSypyGCyel+S3GdOtKMk9KnvDknaGbnaFX4g== -"@firebase/firestore@1.13.0": - version "1.13.0" - resolved "https://registry.yarnpkg.com/@firebase/firestore/-/firestore-1.13.0.tgz#2638f25b2a3d19cb891a6b334a0dc14aefef5a34" - integrity sha512-GctO+sxLqOnY8SkBN5Z5p1nUYRX+yWSc9Kcx9nIPbUZ0WqBM5BaSlBHZHTFtjmJxS+0j/Y8Mu7c6qm6q5rVnjA== +"@firebase/firestore@1.16.0": + version "1.16.0" + resolved "https://registry.yarnpkg.com/@firebase/firestore/-/firestore-1.16.0.tgz#39e698d1e6d5c406d822537e29b7f350525247a8" + integrity sha512-RsgGIP9e6HW5soEHIuo0CGVFpeTKe0hqjrgOLk92W0mjL6irzBlqmd5HcGMY4F5QiZryc2vMT1/3LvRhkUyf8g== dependencies: - "@firebase/component" "0.1.8" - "@firebase/firestore-types" "1.10.1" - "@firebase/logger" "0.2.0" - "@firebase/util" "0.2.43" - "@firebase/webchannel-wrapper" "0.2.38" + "@firebase/component" "0.1.16" + "@firebase/firestore-types" "1.12.0" + "@firebase/logger" "0.2.6" + "@firebase/util" "0.2.50" + "@firebase/webchannel-wrapper" "0.2.41" + "@grpc/grpc-js" "^1.0.0" "@grpc/proto-loader" "^0.5.0" - grpc "1.24.2" - tslib "1.11.1" + tslib "^1.11.1" -"@firebase/functions-types@0.3.16": - version "0.3.16" - resolved "https://registry.yarnpkg.com/@firebase/functions-types/-/functions-types-0.3.16.tgz#be0362d7f61648fdf36a7d95de239eddee88f931" - integrity sha512-kHhBvSYiY2prY4vNQCALYs1+OruTdylvGemHG6G6Bs/rj3qw7ui3WysBsDU/rInJitHIcsZ35qrtanoJeQUIXQ== +"@firebase/functions-types@0.3.17": + version "0.3.17" + resolved "https://registry.yarnpkg.com/@firebase/functions-types/-/functions-types-0.3.17.tgz#348bf5528b238eeeeeae1d52e8ca547b21d33a94" + integrity sha512-DGR4i3VI55KnYk4IxrIw7+VG7Q3gA65azHnZxo98Il8IvYLr2UTBlSh72dTLlDf25NW51HqvJgYJDKvSaAeyHQ== -"@firebase/functions@0.4.38": - version "0.4.38" - resolved "https://registry.yarnpkg.com/@firebase/functions/-/functions-0.4.38.tgz#f49e3f4a4a3c67e527c472f05b2e517ea057e7fc" - integrity sha512-t5QkJg251FmIEEi2mh3Xrf7Q3yonSLRaUW/vhgze7A3Xy3uTIUT3BVNWuKaRmg1n0PgKQaBHCjlDoLJAdSpujg== +"@firebase/functions@0.4.48": + version "0.4.48" + resolved "https://registry.yarnpkg.com/@firebase/functions/-/functions-0.4.48.tgz#aee8efeacbfdd74834db0c1b44297f59c5bdddaf" + integrity sha512-BwI/JzO/f/nquKG1IS3VqmwMaKEhvM58/08vTnp46krHBsOYqsdD9T2amz+HXGT9fe2HhDsUhgFE8D00S0vqbg== dependencies: - "@firebase/component" "0.1.8" - "@firebase/functions-types" "0.3.16" - "@firebase/messaging-types" "0.4.4" + "@firebase/component" "0.1.16" + "@firebase/functions-types" "0.3.17" + "@firebase/messaging-types" "0.4.5" isomorphic-fetch "2.2.1" - tslib "1.11.1" + tslib "^1.11.1" -"@firebase/installations-types@0.3.3": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@firebase/installations-types/-/installations-types-0.3.3.tgz#f2e49e73afaeb7b352250365d0d90dff0b792592" - integrity sha512-XvWhPPAGeZlc+CfCA8jTt2pv19Jovi/nUV73u30QbjBbk5xci9bp5I29aBZukHsR6YNBjFCLSkLPbno4m/bLUg== +"@firebase/installations-types@0.3.4": + version "0.3.4" + resolved "https://registry.yarnpkg.com/@firebase/installations-types/-/installations-types-0.3.4.tgz#589a941d713f4f64bf9f4feb7f463505bab1afa2" + integrity sha512-RfePJFovmdIXb6rYwtngyxuEcWnOrzdZd9m7xAW0gRxDIjBT20n3BOhjpmgRWXo/DAxRmS7bRjWAyTHY9cqN7Q== -"@firebase/installations@0.4.6": - version "0.4.6" - resolved "https://registry.yarnpkg.com/@firebase/installations/-/installations-0.4.6.tgz#e288e18b39dda3e8b3b35c3be6185a7b187924e5" - integrity sha512-ey8cE2ldRO4pYqg0lCWQ+XFLETHZWha3Hw1CnYJjLivk4FMM8u/es3Oa257wwtYXAUfr0UsPDfHFgYME9E9EhA== +"@firebase/installations@0.4.14": + version "0.4.14" + resolved "https://registry.yarnpkg.com/@firebase/installations/-/installations-0.4.14.tgz#e0c240869bed834d1b5cc696bec0020e8fcb5f7b" + integrity sha512-hQPsaU7wdTq3CFMtFQwZy6LgdXZAkXoUToV4O+ekPbjM65QzaGVogJVU8O2H6ADXoq37SarcUXKe86pcUWdFLA== dependencies: - "@firebase/component" "0.1.8" - "@firebase/installations-types" "0.3.3" - "@firebase/util" "0.2.43" + "@firebase/component" "0.1.16" + "@firebase/installations-types" "0.3.4" + "@firebase/util" "0.2.50" idb "3.0.2" - tslib "1.11.1" + tslib "^1.11.1" -"@firebase/logger@0.2.0": - version "0.2.0" - resolved "https://registry.yarnpkg.com/@firebase/logger/-/logger-0.2.0.tgz#d40149b8a33bca3dfbfb5b4a63e06b3ffa193157" - integrity sha512-qOMnAh1JY9NkYUEy3iFviiFq0dCvk6qN2DsRy2Y7eAhHR6RqwA47l1kI+0MIXmSzlJ9akXjWAXxV5ijzr68Big== +"@firebase/logger@0.2.6": + version "0.2.6" + resolved "https://registry.yarnpkg.com/@firebase/logger/-/logger-0.2.6.tgz#3aa2ca4fe10327cabf7808bd3994e88db26d7989" + integrity sha512-KIxcUvW/cRGWlzK9Vd2KB864HlUnCfdTH0taHE0sXW5Xl7+W68suaeau1oKNEqmc3l45azkd4NzXTCWZRZdXrw== -"@firebase/messaging-types@0.4.4": - version "0.4.4" - resolved "https://registry.yarnpkg.com/@firebase/messaging-types/-/messaging-types-0.4.4.tgz#bef66157bdd3ddaafd6d48f1c5ee973fdc385f84" - integrity sha512-JGtkr+1A1Dw7+yCqQigqBfGKtq0gTCruFScBD4MVjqZHiqGIYpnQisWnpGbkzPR6aOt6iQxgwxUhHG1ulUQGeg== +"@firebase/messaging-types@0.4.5": + version "0.4.5" + resolved "https://registry.yarnpkg.com/@firebase/messaging-types/-/messaging-types-0.4.5.tgz#452572d3c5b7fa83659fdb1884450477229f5dc4" + integrity sha512-sux4fgqr/0KyIxqzHlatI04Ajs5rc3WM+WmtCpxrKP1E5Bke8xu/0M+2oy4lK/sQ7nov9z15n3iltAHCgTRU3Q== -"@firebase/messaging@0.6.10": - version "0.6.10" - resolved "https://registry.yarnpkg.com/@firebase/messaging/-/messaging-0.6.10.tgz#0f2713a85732ce23ec7968e2f0ac784a259330e4" - integrity sha512-WYnKEffG6m0EMHzib8KCWVUGno1cuBC13RrOfGWOCv/whdy9QCIZgMxH/NsY3BrYst8FnjuXEU16fi5AEf4qbg== +"@firebase/messaging@0.6.20": + version "0.6.20" + resolved "https://registry.yarnpkg.com/@firebase/messaging/-/messaging-0.6.20.tgz#c6139dad753185706196972629e9235cdda8c2d6" + integrity sha512-1MqyljXnbFBeHYhL6QInVM9aO5MW820yhNmOIVxk58wNXq4tOQLzqnKuvlgZ+ttgqlDzrIYiVf3EOHh5DptttQ== dependencies: - "@firebase/component" "0.1.8" - "@firebase/installations" "0.4.6" - "@firebase/messaging-types" "0.4.4" - "@firebase/util" "0.2.43" + "@firebase/component" "0.1.16" + "@firebase/installations" "0.4.14" + "@firebase/messaging-types" "0.4.5" + "@firebase/util" "0.2.50" idb "3.0.2" - tslib "1.11.1" + tslib "^1.11.1" -"@firebase/performance-types@0.0.12": - version "0.0.12" - resolved "https://registry.yarnpkg.com/@firebase/performance-types/-/performance-types-0.0.12.tgz#15fa79e296b502e21054a66c9e7ded59398fd8a7" - integrity sha512-eIDF7CHetOE5sc+hCaUebEn/2Aiaju7UkgZDTl7lNQHz5fK9wJ/11HaE8WdnDr//ngS3lQAGC2RB4lAZeEWraA== +"@firebase/performance-types@0.0.13": + version "0.0.13" + resolved "https://registry.yarnpkg.com/@firebase/performance-types/-/performance-types-0.0.13.tgz#58ce5453f57e34b18186f74ef11550dfc558ede6" + integrity sha512-6fZfIGjQpwo9S5OzMpPyqgYAUZcFzZxHFqOyNtorDIgNXq33nlldTL/vtaUZA8iT9TT5cJlCrF/jthKU7X21EA== -"@firebase/performance@0.2.36": - version "0.2.36" - resolved "https://registry.yarnpkg.com/@firebase/performance/-/performance-0.2.36.tgz#341bad35e786a377a38c4b4165088ebd4f07d025" - integrity sha512-nMx3gT+ZD86MV5n460XFA1o75YYMGcs2MXrJa462rfUQtqOrtOOvdUvVtmE6cLrHsL4Y83B+VBWKHzACIPghPw== +"@firebase/performance@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@firebase/performance/-/performance-0.3.9.tgz#01e27616aca8486c7602e4f51c325c2e7caae6e8" + integrity sha512-Fj22DZXRhhKv1OSUzDxX7AqpJUcDld6tzXK1yxOC8e3v1DFPQMQdM9FoG1m1b/Vrqa6pCCqnqG6gh6VPnEcAzQ== dependencies: - "@firebase/component" "0.1.8" - "@firebase/installations" "0.4.6" - "@firebase/logger" "0.2.0" - "@firebase/performance-types" "0.0.12" - "@firebase/util" "0.2.43" - tslib "1.11.1" + "@firebase/component" "0.1.16" + "@firebase/installations" "0.4.14" + "@firebase/logger" "0.2.6" + "@firebase/performance-types" "0.0.13" + "@firebase/util" "0.2.50" + tslib "^1.11.1" -"@firebase/polyfill@0.3.33": - version "0.3.33" - resolved "https://registry.yarnpkg.com/@firebase/polyfill/-/polyfill-0.3.33.tgz#93974c68ca092a9210f02b803f5e285e86b547ee" - integrity sha512-Arp9JViyD2i0K01NCCY0WZK5p16kQB/wddf44+Qboh+u3eIrFbVk0OO2IknjrkzIW392u73Ts7TkVxLPGPJF9g== +"@firebase/polyfill@0.3.36": + version "0.3.36" + resolved "https://registry.yarnpkg.com/@firebase/polyfill/-/polyfill-0.3.36.tgz#c057cce6748170f36966b555749472b25efdb145" + integrity sha512-zMM9oSJgY6cT2jx3Ce9LYqb0eIpDE52meIzd/oe/y70F+v9u1LDqk5kUF5mf16zovGBWMNFmgzlsh6Wj0OsFtg== dependencies: - core-js "3.6.4" + core-js "3.6.5" promise-polyfill "8.1.3" whatwg-fetch "2.0.4" -"@firebase/remote-config-types@0.1.8": - version "0.1.8" - resolved "https://registry.yarnpkg.com/@firebase/remote-config-types/-/remote-config-types-0.1.8.tgz#0c8d8a839621230053ba55704b5d1145bfe54daa" - integrity sha512-K12IBHO7OD4gCW0FEqZL9zMqVAfS4+joC4YIn3bHezZfu3RL+Bw1wCb0cAD7RfDPcQxWJjxOHpce4YhuqSxPFA== +"@firebase/remote-config-types@0.1.9": + version "0.1.9" + resolved "https://registry.yarnpkg.com/@firebase/remote-config-types/-/remote-config-types-0.1.9.tgz#fe6bbe4d08f3b6e92fce30e4b7a9f4d6a96d6965" + integrity sha512-G96qnF3RYGbZsTRut7NBX0sxyczxt1uyCgXQuH/eAfUCngxjEGcZQnBdy6mvSdqdJh5mC31rWPO4v9/s7HwtzA== -"@firebase/remote-config@0.1.17": - version "0.1.17" - resolved "https://registry.yarnpkg.com/@firebase/remote-config/-/remote-config-0.1.17.tgz#ac4a8c9def48d404bdfe72cdf47199360cd44d01" - integrity sha512-jIRHXih0krVTNGYMewFVIaX8WPE1iS06fV4oMMHCCSSforGodv535uVZZ41Il29Q+22zOcyJvahoc990V0cFoA== +"@firebase/remote-config@0.1.25": + version "0.1.25" + resolved "https://registry.yarnpkg.com/@firebase/remote-config/-/remote-config-0.1.25.tgz#93c5bda311d6c1302697d6148bdb33bb8dcb9e15" + integrity sha512-8YWefBhy77HMbWXWdbenalx+IDY/XkS+iURQ9qRYvSIFYx6RL04DzlakZNOY9CQAcxTA+cTSt4NNlhjopBjf2Q== dependencies: - "@firebase/component" "0.1.8" - "@firebase/installations" "0.4.6" - "@firebase/logger" "0.2.0" - "@firebase/remote-config-types" "0.1.8" - "@firebase/util" "0.2.43" - tslib "1.11.1" + "@firebase/component" "0.1.16" + "@firebase/installations" "0.4.14" + "@firebase/logger" "0.2.6" + "@firebase/remote-config-types" "0.1.9" + "@firebase/util" "0.2.50" + tslib "^1.11.1" -"@firebase/storage-types@0.3.11": - version "0.3.11" - resolved "https://registry.yarnpkg.com/@firebase/storage-types/-/storage-types-0.3.11.tgz#98f6ced5460502ab12778ce71d4dc9bf0ab7f2ee" - integrity sha512-EMOo5aeiJIa8eQ/VqjIa/DYlDcEJX1V84FOxmLfNWZIlmCSvcqx9E9mcNlOnoUB4iePqQjTMQRtKlIBvvEVhVg== +"@firebase/storage-types@0.3.12": + version "0.3.12" + resolved "https://registry.yarnpkg.com/@firebase/storage-types/-/storage-types-0.3.12.tgz#79540761fb3ad8d674c98712633284d81b268e0f" + integrity sha512-DDV6Fs6aYoGw3w/zZZTkqiipxihnsvHf6znbeZYjIIHit3tr1uLJdGPDPiCTfZcTGPpg2ux6ZmvNDvVgJdHALw== -"@firebase/storage@0.3.30": - version "0.3.30" - resolved "https://registry.yarnpkg.com/@firebase/storage/-/storage-0.3.30.tgz#195f6bd9b526710b7446e430b71dfb82cf8b35cc" - integrity sha512-wapt4+NiEqTiLKPpsy+XbdLTN99pkqjf46Z7zqeS+vh+61cJsUT8M7YBfBb0ZN+dY6gnI5QNzviiKpykhJQbVA== +"@firebase/storage@0.3.38": + version "0.3.38" + resolved "https://registry.yarnpkg.com/@firebase/storage/-/storage-0.3.38.tgz#ebe3423fc53b4966bb2324b12feddd79b9210a0c" + integrity sha512-gWVQr5xqrU3cfhhwbAE+9iJ0XMvzbxWMvteKurn5cRNaGbmSob/O/ISOAvsQgPnk+K9zPMd2OwyzaTOl9PEMrw== dependencies: - "@firebase/component" "0.1.8" - "@firebase/storage-types" "0.3.11" - "@firebase/util" "0.2.43" - tslib "1.11.1" + "@firebase/component" "0.1.16" + "@firebase/storage-types" "0.3.12" + "@firebase/util" "0.2.50" + tslib "^1.11.1" -"@firebase/util@0.2.43": - version "0.2.43" - resolved "https://registry.yarnpkg.com/@firebase/util/-/util-0.2.43.tgz#551728e1f6deb3a3709c2e9dc60dbb7c1a423fd4" - integrity sha512-4gGlvcoOJ48xO6PH59UOHLjvImdYXANF/1d0ao60fbiJDIKxJqMksXw3UF2zsUrRkyCOqIDLeiVuF18vffXP+g== +"@firebase/util@0.2.50": + version "0.2.50" + resolved "https://registry.yarnpkg.com/@firebase/util/-/util-0.2.50.tgz#77666b845dcb49bc217650aa296a7a8986c06b44" + integrity sha512-vFE6+Jfc25u0ViSpFxxq0q5s+XmuJ/y7CL3ud79RQe+WLFFg+j0eH1t23k0yNSG9vZNM7h3uHRIXbV97sYLAyw== dependencies: - tslib "1.11.1" + tslib "^1.11.1" -"@firebase/webchannel-wrapper@0.2.38": - version "0.2.38" - resolved "https://registry.yarnpkg.com/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.2.38.tgz#1f0602cd73f7402ffc4d6116c811dfbb652caa73" - integrity sha512-mp1XmAJsuqaSWm5WQYo7R0zfZWe9EmwMCxsxkKr+ubLOumyNy4NG5aV45hEpFTosQv4myXpiCiS4GFE9mNqLZQ== +"@firebase/webchannel-wrapper@0.2.41": + version "0.2.41" + resolved "https://registry.yarnpkg.com/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.2.41.tgz#4e470c25a99fa0b1f629f1c5ef180a318d399fd0" + integrity sha512-XcdMT5PSZHiuf7LJIhzKIe+RyYa25S3LHRRvLnZc6iFjwXkrSDJ8J/HWO6VT8d2ZTbawp3VcLEjRF/VN8glCrA== + +"@grpc/grpc-js@^1.0.0": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.1.2.tgz#3125484c19fd1c9e3f4dc7a880f9fa1b872b46c8" + integrity sha512-k2u86Bkm/3xrjUaSWeIyzXScBt/cC8uE7BznR0cpueQi11R33W6qfJdMrkrsmSHirp5likR55JSXUrcWG6ybHA== + dependencies: + semver "^6.2.0" "@grpc/proto-loader@^0.5.0": - version "0.5.3" - resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.5.3.tgz#a233070720bf7560c4d70e29e7950c72549a132c" - integrity sha512-8qvUtGg77G2ZT2HqdqYoM/OY97gQd/0crSG34xNmZ4ZOsv3aQT/FQV9QfZPazTGna6MIoyUd+u6AxsoZjJ/VMQ== + version "0.5.5" + resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.5.5.tgz#6725e7a1827bdf8e92e29fbf4e9ef0203c0906a9" + integrity sha512-WwN9jVNdHRQoOBo9FDH7qU+mgfjPc8GygPYms3M+y3fbQLfnCe/Kv/E01t7JRgnrsOHH8euvSbed3mIalXhwqQ== dependencies: lodash.camelcase "^4.3.0" protobufjs "^6.8.6" @@ -1802,6 +1665,13 @@ "@types/istanbul-reports" "^1.1.1" "@types/yargs" "^13.0.0" +"@lourenci/react-kanban@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@lourenci/react-kanban/-/react-kanban-2.0.0.tgz#1acc8d83f5d9eaa2e2fa0c227229dd687cd3983c" + integrity sha512-ieNi7d/01wgT9t8kN7Z/RBubyZq9VvKXyU/5sj+UlrY8h4GPRNrN11jLV/ykg55lhyXGKgXDk3ObYurOfrmu3w== + dependencies: + react-beautiful-dnd "^13.0.0" + "@mrmlnc/readdir-enhanced@^2.2.1": version "2.2.1" resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" @@ -1810,69 +1680,6 @@ call-me-maybe "^1.0.1" glob-to-regexp "^0.3.0" -"@nivo/colors@0.61.0": - version "0.61.0" - resolved "https://registry.yarnpkg.com/@nivo/colors/-/colors-0.61.0.tgz#5af2a6d8b1d22c786950cc9fb07c216a80a541ff" - integrity sha512-yeb5YsQDoN7D5DbBIhHTnVn0bX+4ObNVGyJAepSn64zNPiskO3/o1FnQw70aIkN4O7BDXb/vVPrftq6wSwQtvQ== - dependencies: - d3-color "^1.2.3" - d3-scale "^3.0.0" - d3-scale-chromatic "^1.3.3" - lodash.get "^4.4.2" - lodash.isplainobject "^4.0.6" - react-motion "^0.5.2" - -"@nivo/core@0.61.0": - version "0.61.0" - resolved "https://registry.yarnpkg.com/@nivo/core/-/core-0.61.0.tgz#66581a0e2dc4f8f802bd0f1515f1f2269b0595e0" - integrity sha512-7DGsTW12vfUvMIr9jl28KZaJMJqMMhEJi1lW1R2TPMTg+qSG01v6tqMtcEwUp4bdAdr3n57ytLWSgqKWXkwjvw== - dependencies: - "@nivo/tooltip" "0.61.0" - d3-color "^1.2.3" - d3-format "^1.3.2" - d3-hierarchy "^1.1.8" - d3-interpolate "^1.3.2" - d3-scale "^3.0.0" - d3-scale-chromatic "^1.3.3" - d3-shape "^1.3.5" - d3-time-format "^2.1.3" - lodash "^4.17.11" - react-measure "^2.2.4" - react-motion "^0.5.2" - recompose "^0.30.0" - -"@nivo/legends@0.61.1": - version "0.61.1" - resolved "https://registry.yarnpkg.com/@nivo/legends/-/legends-0.61.1.tgz#54ac123b25449e7663067b3e019c7d3a9429a6f9" - integrity sha512-bKVXffFwTKGySZRUf6sdVzWUb5jjGffuvRczs0giQCu8OUgeJIi0IOOyYhHtww+rTVGIKAi0xPGQTQnF4kpufA== - dependencies: - "@nivo/core" "0.61.0" - lodash "^4.17.11" - recompose "^0.30.0" - -"@nivo/pie@^0.61.1": - version "0.61.1" - resolved "https://registry.yarnpkg.com/@nivo/pie/-/pie-0.61.1.tgz#c29e683f0e910147282186be4c4693bee545f594" - integrity sha512-3xmYrB/rccJ6f5AtckhIm51Bj7IVYomeCJsM1vK07wzOS+ZpvJRODokzXSNvp7NkMl3jrqCcGriLhSg3mf9+yA== - dependencies: - "@nivo/colors" "0.61.0" - "@nivo/core" "0.61.0" - "@nivo/legends" "0.61.1" - "@nivo/tooltip" "0.61.0" - d3-shape "^1.3.5" - lodash "^4.17.11" - react-motion "^0.5.2" - recompose "^0.30.0" - -"@nivo/tooltip@0.61.0": - version "0.61.0" - resolved "https://registry.yarnpkg.com/@nivo/tooltip/-/tooltip-0.61.0.tgz#bf8b06a18f41fc9072e3f2d9591ebbb9b45c2a54" - integrity sha512-CqEJ4v1jSikZ3fmuSJVb1UYF8fuCo/c7JFB+LsNH9X01IERSufO3tSNBTzJ3JugCminQpbo6/R7oBhNwZFqSxw== - dependencies: - "@nivo/core" "0.61.0" - react-measure "^2.2.4" - react-motion "^0.5.2" - "@nodelib/fs.stat@^1.1.2": version "1.1.3" resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" @@ -1976,9 +1783,24 @@ integrity sha512-afmTuJrylUU/0OtqzaRkbyYFFNgCF73Bvel/sw90pvGrWIZ+vyoIJqA6eMSoA6+nb443kTmulmBtC9NerXboNg== "@restart/hooks@^0.3.12": - version "0.3.21" - resolved "https://registry.yarnpkg.com/@restart/hooks/-/hooks-0.3.21.tgz#5264d12019ffb844dc1fc44d55517ded7b580ee2" - integrity sha512-Wcu3CFJV+iiqPEIoPVx3/CYnZBRgPeRABo6bLJByRH9ptJXyObn7WYPG7Rv0cg3+55bqcBbG0xEfovzwE2PNXg== + version "0.3.25" + resolved "https://registry.yarnpkg.com/@restart/hooks/-/hooks-0.3.25.tgz#11004139ad1c70d2f5965a8939dcb5aeb96aa652" + integrity sha512-m2v3N5pxTsIiSH74/sb1yW8D9RxkJidGW+5Mfwn/lHb2QzhZNlaU1su7abSyT9EGf0xS/0waLjrf7/XxQHUk7w== + dependencies: + lodash "^4.17.15" + lodash-es "^4.17.15" + +"@stripe/react-stripe-js@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@stripe/react-stripe-js/-/react-stripe-js-1.1.2.tgz#a7f5ef5b4d7dc7fa723501b706644414cfe6dcba" + integrity sha512-07hu8RJXwWKGbvdvd1yt1cYvGtDB8jFX+q10f7FQuItUt9rlSo0am3WIx845iMHANiYgxyRb1PS201Yle9xxPQ== + dependencies: + prop-types "^15.7.2" + +"@stripe/stripe-js@^1.8.0": + version "1.8.0" + resolved "https://registry.yarnpkg.com/@stripe/stripe-js/-/stripe-js-1.8.0.tgz#100f102d757cd024f94635dba231993554c8cfba" + integrity sha512-VsIohJw70LIdB4b621RN6pTyw49ZMy+QjB81fl+Psu5X5ppiq/c+rG0F+XKHSVpp4JZRNDkQnsOGeuHow0aluA== "@svgr/babel-plugin-add-jsx-attribute@^4.2.0": version "4.2.0" @@ -2083,17 +1905,27 @@ "@svgr/plugin-svgo" "^4.3.1" loader-utils "^1.2.3" -"@tinymce/tinymce-react@^3.5.0": - version "3.5.0" - resolved "https://registry.yarnpkg.com/@tinymce/tinymce-react/-/tinymce-react-3.5.0.tgz#5017be56aeab1077f09d3f74a386883e5524a33f" - integrity sha512-sZPerYmSWQcdk7F9KEvCC3/kPNZ9Bb+dk8rS0RoYyYql/gqgNpLpycC+CC/KhgT0wDaYuRoCcdV1DVZGam+oOg== +"@tanem/react-nprogress@^3.0.34": + version "3.0.34" + resolved "https://registry.yarnpkg.com/@tanem/react-nprogress/-/react-nprogress-3.0.34.tgz#e51da691e2f843e466afc6b9258b48d983411861" + integrity sha512-lWgcsFDX5iCa6JM4E5OTN84FJ2NdUTal5vrECxOMI16fs/n4Mq0YuErfYeFn2X2Ij+3AgVwXefs6fHkdUVyJIg== + dependencies: + "@babel/runtime" "^7.10.4" + hoist-non-react-statics "^3.3.2" + prop-types "^15.7.2" + react-use "^15.3.2" + +"@tinymce/tinymce-react@^3.6.0": + version "3.6.0" + resolved "https://registry.yarnpkg.com/@tinymce/tinymce-react/-/tinymce-react-3.6.0.tgz#6e33e89b7bb0240c4ffa892a8e1924688f479b4b" + integrity sha512-XSyAx9Md9+Ghl3UK0YtBQxaS2dCepqtOKTjYmBS4xTAzSu1UABd44WT84B8CUCd/bdT0fv1Pd51dSbpgJ8713w== dependencies: prop-types "^15.6.2" "@types/babel__core@^7.1.0": - version "7.1.6" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.6.tgz#16ff42a5ae203c9af1c6e190ed1f30f83207b610" - integrity sha512-tTnhWszAqvXnhW7m5jQU9PomXSiKXk2sFxpahXvI20SZKu9ylPi8WtIxueZ6ehDWikPT0jeFujMj3X4ZHuf3Tg== + version "7.1.9" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.9.tgz#77e59d438522a6fb898fa43dc3455c6e72f3963d" + integrity sha512-sY2RsIJ5rpER1u3/aQ8OFSI7qGIy8o1NEEbgb2UaJcvOtXOMpd39ko723NBpjQFg9SIX7TXtjejZVGeIMLhoOw== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" @@ -2117,20 +1949,12 @@ "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.0.9" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.9.tgz#be82fab304b141c3eee81a4ce3b034d0eba1590a" - integrity sha512-jEFQ8L1tuvPjOI8lnpaf73oCJe+aoxL6ygqSy6c8LcW98zaC+4mzWuQIRCEvKeCOu+lbqdXcg4Uqmm1S8AP1tw== + version "7.0.13" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.13.tgz#1874914be974a492e1b4cb00585cabb274e8ba18" + integrity sha512-i+zS7t6/s9cdQvbqKDARrcbrPvtJGlbYsMkazo03nTAK3RX9FNrLllXys22uiTGJapPOTZTQ35nHh4ISph4SLQ== dependencies: "@babel/types" "^7.3.0" -"@types/bytebuffer@^5.0.40": - version "5.0.40" - resolved "https://registry.yarnpkg.com/@types/bytebuffer/-/bytebuffer-5.0.40.tgz#d6faac40dcfb09cd856cdc4c01d3690ba536d3ee" - integrity sha512-h48dyzZrPMz25K6Q4+NCwWaxwXany2FhQg/ErOcdZS1ZpsaDnDMZg8JYLMTGz7uvXKrcKGJUZJlZObyfgdaN9g== - dependencies: - "@types/long" "*" - "@types/node" "*" - "@types/color-name@^1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" @@ -2141,24 +1965,18 @@ resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== -"@types/events@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" - integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== - "@types/glob@^7.1.1": - version "7.1.1" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" - integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w== + version "7.1.3" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183" + integrity sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w== dependencies: - "@types/events" "*" "@types/minimatch" "*" "@types/node" "*" "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#42995b446db9a48a11a07ec083499a860e9138ff" - integrity sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg== + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762" + integrity sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw== "@types/istanbul-lib-report@*": version "3.0.0" @@ -2168,19 +1986,24 @@ "@types/istanbul-lib-coverage" "*" "@types/istanbul-reports@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz#7a8cbf6a406f36c8add871625b278eaf0b0d255a" - integrity sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA== + version "1.1.2" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz#e875cc689e47bce549ec81f3df5e6f6f11cfaeb2" + integrity sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw== dependencies: "@types/istanbul-lib-coverage" "*" "@types/istanbul-lib-report" "*" -"@types/json-schema@^7.0.3": - version "7.0.4" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.4.tgz#38fd73ddfd9b55abb1e1b2ed578cb55bd7b7d339" - integrity sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA== +"@types/js-cookie@2.2.6": + version "2.2.6" + resolved "https://registry.yarnpkg.com/@types/js-cookie/-/js-cookie-2.2.6.tgz#f1a1cb35aff47bc5cfb05cb0c441ca91e914c26f" + integrity sha512-+oY0FDTO2GYKEV0YPvSshGq9t7YozVkgvXLty7zogQNuCxBhT9/3INX9Q7H1aRZ4SUDRXAKlJuA4EA5nTt7SNw== -"@types/long@*", "@types/long@^4.0.0": +"@types/json-schema@^7.0.3", "@types/json-schema@^7.0.4": + version "7.0.5" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.5.tgz#dcce4430e64b443ba8945f0290fb564ad5bac6dd" + integrity sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ== + +"@types/long@^4.0.1": version "4.0.1" resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.1.tgz#459c65fa1867dafe6a8f322c4c51695663cc55e9" integrity sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w== @@ -2191,14 +2014,14 @@ integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== "@types/node@*", "@types/node@>=6": - version "13.7.6" - resolved "https://registry.yarnpkg.com/@types/node/-/node-13.7.6.tgz#cb734a7c191472ae6a2b3a502b4dfffcea974113" - integrity sha512-eyK7MWD0R1HqVTp+PtwRgFeIsemzuj4gBFSQxfPHY5iMjS7474e5wq+VFgTcdpyHeNxyKSaetYAjdMLJlKoWqA== + version "14.0.23" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.23.tgz#676fa0883450ed9da0bb24156213636290892806" + integrity sha512-Z4U8yDAl5TFkmYsZdFPdjeMa57NOvnaf1tljHzhouaPEp7LCj2JKkejpI1ODviIAQuW4CcQmxkQ77rnLsOOoKw== -"@types/node@^10.1.0": - version "10.17.16" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.16.tgz#ee96ddac1a38d98d2c8a71c7df0cdad5758e8993" - integrity sha512-A4283YSA1OmnIivcpy/4nN86YlnKRiQp8PYwI2KdPCONEBN093QTb0gCtERtkLyVNGKKIGazTZ2nAmVzQU51zA== +"@types/node@^13.7.0": + version "13.13.14" + resolved "https://registry.yarnpkg.com/@types/node/-/node-13.13.14.tgz#20cd7d2a98f0c3b08d379f4ea9e6b315d2019529" + integrity sha512-Az3QsOt1U/K1pbCQ0TXGELTuTkPLOiFIQf3ILzbOyo0FqgV9SxRnxbxM5QlAveERZMHpZY+7u3Jz2tKyl+yg6g== "@types/parse-json@^4.0.0": version "4.0.0" @@ -2211,14 +2034,14 @@ integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw== "@types/q@^1.5.1": - version "1.5.2" - resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8" - integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw== + version "1.5.4" + resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.4.tgz#15925414e0ad2cd765bfef58842f7e26a7accb24" + integrity sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug== "@types/react@^16.9.11": - version "16.9.23" - resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.23.tgz#1a66c6d468ba11a8943ad958a8cb3e737568271c" - integrity sha512-SsGVT4E7L2wLN3tPYLiF20hmZTPGuzaayVunfgXzUn1x4uHVsKH6QDJQ/TdpHqwsTLd4CwrmQ2vOgxN7gE24gw== + version "16.9.43" + resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.43.tgz#c287f23f6189666ee3bebc2eb8d0f84bcb6cdb6b" + integrity sha512-PxshAFcnJqIWYpJbLPriClH53Z2WlJcVZE+NP2etUtWQs2s7yIMj3/LDKZT/5CHJ/F62iyjVCDu2H3jHEXIxSg== dependencies: "@types/prop-types" "*" csstype "^2.2.0" @@ -2234,9 +2057,9 @@ integrity sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw== "@types/yargs@^13.0.0": - version "13.0.8" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.8.tgz#a38c22def2f1c2068f8971acb3ea734eb3c64a99" - integrity sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA== + version "13.0.9" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.9.tgz#44028e974343c7afcf3960f1a2b1099c39a7b5e1" + integrity sha512-xrvhZ4DZewMDhoH1utLtOAwYQy60eYFoXeje30TzM3VOvQlBwQaEpKFq5m34k1wOw2AKIi2pwtiAjdmhvlBUzg== dependencies: "@types/yargs-parser" "*" @@ -2246,46 +2069,46 @@ integrity sha512-te5lMAWii1uEJ4FwLjzdlbw3+n0FZNOvFXHxQDKeT0dilh7HOzdMzV2TrJVUzq8ep7J4Na8OUYPRLSQkJHAlrg== "@typescript-eslint/eslint-plugin@^2.10.0": - version "2.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.21.0.tgz#a34de84a0791cae0357c4dda805c5b4e8203b6c6" - integrity sha512-b5jjjDMxzcjh/Sbjuo7WyhrQmVJg0WipTHQgXh5Xwx10uYm6nPWqN1WGOsaNq4HR3Zh4wUx4IRQdDkCHwyewyw== + version "2.34.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz#6f8ce8a46c7dea4a6f1d171d2bb8fbae6dac2be9" + integrity sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ== dependencies: - "@typescript-eslint/experimental-utils" "2.21.0" - eslint-utils "^1.4.3" + "@typescript-eslint/experimental-utils" "2.34.0" functional-red-black-tree "^1.0.1" regexpp "^3.0.0" tsutils "^3.17.1" -"@typescript-eslint/experimental-utils@2.21.0": - version "2.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.21.0.tgz#71de390a3ec00b280b69138d80733406e6e86bfa" - integrity sha512-olKw9JP/XUkav4lq0I7S1mhGgONJF9rHNhKFn9wJlpfRVjNo3PPjSvybxEldvCXnvD+WAshSzqH5cEjPp9CsBA== +"@typescript-eslint/experimental-utils@2.34.0": + version "2.34.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz#d3524b644cdb40eebceca67f8cf3e4cc9c8f980f" + integrity sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA== dependencies: "@types/json-schema" "^7.0.3" - "@typescript-eslint/typescript-estree" "2.21.0" + "@typescript-eslint/typescript-estree" "2.34.0" eslint-scope "^5.0.0" + eslint-utils "^2.0.0" "@typescript-eslint/parser@^2.10.0": - version "2.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.21.0.tgz#4f200995517c3d5fc5ef51b17527bc948992e438" - integrity sha512-VrmbdrrrvvI6cPPOG7uOgGUFXNYTiSbnRq8ZMyuGa4+qmXJXVLEEz78hKuqupvkpwJQNk1Ucz1TenrRP90gmBg== + version "2.34.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.34.0.tgz#50252630ca319685420e9a39ca05fe185a256bc8" + integrity sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA== dependencies: "@types/eslint-visitor-keys" "^1.0.0" - "@typescript-eslint/experimental-utils" "2.21.0" - "@typescript-eslint/typescript-estree" "2.21.0" + "@typescript-eslint/experimental-utils" "2.34.0" + "@typescript-eslint/typescript-estree" "2.34.0" eslint-visitor-keys "^1.1.0" -"@typescript-eslint/typescript-estree@2.21.0": - version "2.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.21.0.tgz#7e4be29f2e338195a2e8c818949ed0ff727cc943" - integrity sha512-NC/nogZNb9IK2MEFQqyDBAciOT8Lp8O3KgAfvHx2Skx6WBo+KmDqlU3R9KxHONaijfTIKtojRe3SZQyMjr3wBw== +"@typescript-eslint/typescript-estree@2.34.0": + version "2.34.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz#14aeb6353b39ef0732cc7f1b8285294937cf37d5" + integrity sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg== dependencies: debug "^4.1.1" eslint-visitor-keys "^1.1.0" glob "^7.1.6" is-glob "^4.0.1" lodash "^4.17.15" - semver "^6.3.0" + semver "^7.3.2" tsutils "^3.17.1" "@webassemblyjs/ast@1.8.5": @@ -2443,12 +2266,17 @@ tslib "^1.9.3" "@wry/equality@^0.1.2", "@wry/equality@^0.1.9": - version "0.1.9" - resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.1.9.tgz#b13e18b7a8053c6858aa6c85b54911fb31e3a909" - integrity sha512-mB6ceGjpMGz1ZTza8HYnrPGos2mC6So4NhS1PtZ8s4Qt0K7fBiIGhpSxUbQmhwcSWE3no+bYxmI2OL6KuXYmoQ== + version "0.1.11" + resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.1.11.tgz#35cb156e4a96695aa81a9ecc4d03787bc17f1790" + integrity sha512-mwEVBDUVODlsQQ5dfuLUS5/Tf7jqUKyhKYHmVi4fPB6bDMOfWvUPJmKgS1Z7Za/sOI3vzWt4+O7yCiL/70MogA== dependencies: tslib "^1.9.3" +"@xobotyi/scrollbar-width@1.9.5": + version "1.9.5" + resolved "https://registry.yarnpkg.com/@xobotyi/scrollbar-width/-/scrollbar-width-1.9.5.tgz#80224a6919272f405b87913ca13b92929bdf3c4d" + integrity sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ== + "@xtuc/ieee754@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" @@ -2459,11 +2287,6 @@ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== -aamva@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/aamva/-/aamva-1.2.0.tgz#2b96e123cefa74705217e47fe39d051536215d79" - integrity sha512-0Ay2i8CMsGrYk/xtg7Um1lEjFDypZ9tcSvxMvvkGAbtxiJ3v0tn/7fIDqaMsSy4ANHkekQKGzm6L21mS8zrc1g== - abab@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.3.tgz#623e2075e02eb2d3f2475e49f99c91846467907a" @@ -2490,7 +2313,7 @@ acorn-globals@^4.1.0, acorn-globals@^4.3.0: acorn "^6.0.1" acorn-walk "^6.0.1" -acorn-jsx@^5.1.0: +acorn-jsx@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe" integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ== @@ -2501,26 +2324,19 @@ acorn-walk@^6.0.1: integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA== acorn@^5.5.3: - version "5.7.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" - integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== + version "5.7.4" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e" + integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg== acorn@^6.0.1, acorn@^6.0.4, acorn@^6.2.1: - version "6.4.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.0.tgz#b659d2ffbafa24baf5db1cdbb2c94a983ecd2784" - integrity sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw== + version "6.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" + integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== -acorn@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c" - integrity sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ== - -add-dom-event-listener@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/add-dom-event-listener/-/add-dom-event-listener-1.1.0.tgz#6a92db3a0dd0abc254e095c0f1dc14acbbaae310" - integrity sha512-WCxx1ixHT0GQU9hb0KI/mhgRQhnU+U3GvwY6ZvVjYq8rsihIGoaIOUbY0yMPBxLH5MDtr0kz3fisWGNcbWW7Jw== - dependencies: - object-assign "4.x" +acorn@^7.1.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.3.1.tgz#85010754db53c3fbaf3b9ea3e083aa5c5d147ffd" + integrity sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA== address@1.1.2, address@^1.0.1: version "1.1.2" @@ -2547,20 +2363,19 @@ aggregate-error@^3.0.0: indent-string "^4.0.0" airbnb-prop-types@^2.15.0: - version "2.15.0" - resolved "https://registry.yarnpkg.com/airbnb-prop-types/-/airbnb-prop-types-2.15.0.tgz#5287820043af1eb469f5b0af0d6f70da6c52aaef" - integrity sha512-jUh2/hfKsRjNFC4XONQrxo/n/3GG4Tn6Hl0WlFQN5PY9OMC9loSCoAYKnZsWaP8wEfd5xcrPloK0Zg6iS1xwVA== + version "2.16.0" + resolved "https://registry.yarnpkg.com/airbnb-prop-types/-/airbnb-prop-types-2.16.0.tgz#b96274cefa1abb14f623f804173ee97c13971dc2" + integrity sha512-7WHOFolP/6cS96PhKNrslCLMYAI8yB1Pp6u6XmxozQOiZbsI5ycglZr5cHhBFfuRcQQjzCMith5ZPZdYiJCxUg== dependencies: - array.prototype.find "^2.1.0" - function.prototype.name "^1.1.1" - has "^1.0.3" - is-regex "^1.0.4" - object-is "^1.0.1" + array.prototype.find "^2.1.1" + function.prototype.name "^1.1.2" + is-regex "^1.1.0" + object-is "^1.1.2" object.assign "^4.1.0" - object.entries "^1.1.0" + object.entries "^1.1.2" prop-types "^15.7.2" prop-types-exact "^1.2.0" - react-is "^16.9.0" + react-is "^16.13.1" ajv-errors@^1.0.0: version "1.0.1" @@ -2568,14 +2383,14 @@ ajv-errors@^1.0.0: integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== ajv-keywords@^3.1.0, ajv-keywords@^3.4.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da" - integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ== + version "3.5.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.1.tgz#b83ca89c5d42d69031f424cad49aada0236c6957" + integrity sha512-KWcq3xN8fDjSB+IMoh2VaXVhRI0BBGxoYp3rx7Pkb6z0cFjYR9Q9l4yZqqals0/zsioCmocC5H6UvsGD4MoIBA== -ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.0, ajv@^6.5.5: - version "6.12.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.0.tgz#06d60b96d87b8454a5adaba86e7854da629db4b7" - integrity sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw== +ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.2, ajv@^6.5.5: + version "6.12.3" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.3.tgz#18c5af38a111ddeb4f2697bd78d68abc1cabd706" + integrity sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA== dependencies: fast-deep-equal "^3.1.1" fast-json-stable-stringify "^2.0.0" @@ -2603,11 +2418,11 @@ ansi-escapes@^3.0.0: integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== ansi-escapes@^4.2.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.0.tgz#a4ce2b33d6b214b7950d8595c212f12ac9cc569d" - integrity sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg== + version "4.3.1" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" + integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== dependencies: - type-fest "^0.8.1" + type-fest "^0.11.0" ansi-html@0.0.7: version "0.0.7" @@ -2654,55 +2469,54 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: "@types/color-name" "^1.1.1" color-convert "^2.0.1" -antd@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/antd/-/antd-4.1.0.tgz#1e0b07a19d4887e09d47bdd50a3b483bb2c372c4" - integrity sha512-xj/GhuSlvWouZ6L3/qdZ6I9b4IWaDeNaGVlm5D18cNY0pNZTK2zh5ov130KDb6YERtAnA5BLU+5U+cvfbvJUcw== +antd@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/antd/-/antd-4.4.2.tgz#0b55c0ecf1eec3ffc03c4351e787add3be2de664" + integrity sha512-uf/YPNsl8IQOqNQjO3tzinMvKHTgcVwJ2VCwMtNh8gCf4t9ptHccF5q0lDkg7K4K28aaB/EumuC0kooi359dNQ== dependencies: - "@ant-design/icons" "^4.0.0" - "@ant-design/react-slick" "~0.25.5" + "@ant-design/css-animation" "^1.7.2" + "@ant-design/icons" "^4.2.1" + "@ant-design/react-slick" "~0.26.1" + "@babel/runtime" "^7.10.4" array-tree-filter "^2.1.0" - classnames "~2.2.6" + classnames "^2.2.6" copy-to-clipboard "^3.2.0" - css-animation "^1.5.0" lodash "^4.17.13" - moment "^2.24.0" - omit.js "^1.0.2" - prop-types "^15.7.2" + moment "^2.25.3" + omit.js "^2.0.2" raf "^3.4.1" - rc-animate "~2.10.2" - rc-cascader "~1.0.0" - rc-checkbox "~2.1.6" - rc-collapse "~1.11.3" - rc-dialog "~7.6.0" - rc-drawer "~3.1.1" - rc-dropdown "~3.0.0" - rc-field-form "~1.1.0" - rc-input-number "~4.5.4" - rc-mentions "~1.0.0" - rc-menu "~8.0.1" - rc-notification "~4.0.0" - rc-pagination "~2.2.0" - rc-picker "~1.4.0" - rc-progress "~2.5.0" - rc-rate "~2.5.1" - rc-resize-observer "^0.2.0" - rc-select "~10.1.0" - rc-slider "~9.2.3" - rc-steps "~3.5.0" - rc-switch "~1.9.0" - rc-table "~7.3.0" - rc-tabs "~10.1.1" - rc-tooltip "~4.0.2" - rc-tree "~3.1.0" - rc-tree-select "~3.1.0" - rc-trigger "~4.0.0" - rc-upload "~3.0.0" - rc-util "^4.20.0" - rc-virtual-list "^1.1.0" - resize-observer-polyfill "^1.5.1" - scroll-into-view-if-needed "^2.2.20" - warning "~4.0.3" + rc-animate "~3.1.0" + rc-cascader "~1.3.0" + rc-checkbox "~2.3.0" + rc-collapse "~2.0.0" + rc-dialog "~8.1.0" + rc-drawer "~4.1.0" + rc-dropdown "~3.1.2" + rc-field-form "~1.5.0" + rc-input-number "~5.1.0" + rc-mentions "~1.4.0" + rc-menu "~8.5.0" + rc-notification "~4.4.0" + rc-pagination "~2.4.1" + rc-picker "~1.10.6" + rc-progress "~3.0.0" + rc-rate "~2.8.2" + rc-resize-observer "^0.2.3" + rc-select "^11.0.10" + rc-slider "~9.3.0" + rc-steps "~4.0.1" + rc-switch "~3.2.0" + rc-table "~7.8.0" + rc-tabs "~11.5.0" + rc-textarea "~0.3.0" + rc-tooltip "~4.2.0" + rc-tree "~3.6.0" + rc-tree-select "~4.0.2" + rc-trigger "~4.3.0" + rc-upload "~3.2.0" + rc-util "^5.0.1" + scroll-into-view-if-needed "^2.2.25" + warning "^4.0.3" anymatch@^2.0.0: version "2.0.0" @@ -2728,14 +2542,14 @@ aphrodite@^0.5.0: asap "^2.0.3" inline-style-prefixer "^2.0.0" -apollo-boost@^0.4.4: - version "0.4.7" - resolved "https://registry.yarnpkg.com/apollo-boost/-/apollo-boost-0.4.7.tgz#b0680ab0893e3f8b1ab1058dcfa2b00cb6440d79" - integrity sha512-jfc3aqO0vpCV+W662EOG5gq4AH94yIsvSgAUuDvS3o/Z+8Joqn4zGC9CgLCDHusK30mFgtsEgwEe0pZoedohsQ== +apollo-boost@^0.4.9: + version "0.4.9" + resolved "https://registry.yarnpkg.com/apollo-boost/-/apollo-boost-0.4.9.tgz#ab3ba539c2ca944e6fd156583a1b1954b17a6791" + integrity sha512-05y5BKcDaa8w47f8d81UVwKqrAjn8uKLv6QM9fNdldoNzQ+rnOHgFlnrySUZRz9QIT3vPftQkEz2UEASp1Mi5g== dependencies: - apollo-cache "^1.3.4" - apollo-cache-inmemory "^1.6.5" - apollo-client "^2.6.7" + apollo-cache "^1.3.5" + apollo-cache-inmemory "^1.6.6" + apollo-client "^2.6.10" apollo-link "^1.0.6" apollo-link-error "^1.0.3" apollo-link-http "^1.3.1" @@ -2743,72 +2557,72 @@ apollo-boost@^0.4.4: ts-invariant "^0.4.0" tslib "^1.10.0" -apollo-cache-inmemory@^1.6.5: - version "1.6.5" - resolved "https://registry.yarnpkg.com/apollo-cache-inmemory/-/apollo-cache-inmemory-1.6.5.tgz#2ccaa3827686f6ed7fb634203dbf2b8d7015856a" - integrity sha512-koB76JUDJaycfejHmrXBbWIN9pRKM0Z9CJGQcBzIOtmte1JhEBSuzsOUu7NQgiXKYI4iGoMREcnaWffsosZynA== +apollo-cache-inmemory@^1.6.6: + version "1.6.6" + resolved "https://registry.yarnpkg.com/apollo-cache-inmemory/-/apollo-cache-inmemory-1.6.6.tgz#56d1f2a463a6b9db32e9fa990af16d2a008206fd" + integrity sha512-L8pToTW/+Xru2FFAhkZ1OA9q4V4nuvfoPecBM34DecAugUZEBhI2Hmpgnzq2hTKZ60LAMrlqiASm0aqAY6F8/A== dependencies: - apollo-cache "^1.3.4" - apollo-utilities "^1.3.3" + apollo-cache "^1.3.5" + apollo-utilities "^1.3.4" optimism "^0.10.0" ts-invariant "^0.4.0" tslib "^1.10.0" -apollo-cache@1.3.4, apollo-cache@^1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/apollo-cache/-/apollo-cache-1.3.4.tgz#0c9f63c793e1cd6e34c450f7668e77aff58c9a42" - integrity sha512-7X5aGbqaOWYG+SSkCzJNHTz2ZKDcyRwtmvW4mGVLRqdQs+HxfXS4dUS2CcwrAj449se6tZ6NLUMnjko4KMt3KA== +apollo-cache@1.3.5, apollo-cache@^1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/apollo-cache/-/apollo-cache-1.3.5.tgz#9dbebfc8dbe8fe7f97ba568a224bca2c5d81f461" + integrity sha512-1XoDy8kJnyWY/i/+gLTEbYLnoiVtS8y7ikBr/IfmML4Qb+CM7dEEbIUOjnY716WqmZ/UpXIxTfJsY7rMcqiCXA== dependencies: - apollo-utilities "^1.3.3" + apollo-utilities "^1.3.4" tslib "^1.10.0" -apollo-client@^2.6.7: - version "2.6.8" - resolved "https://registry.yarnpkg.com/apollo-client/-/apollo-client-2.6.8.tgz#01cebc18692abf90c6b3806414e081696b0fa537" - integrity sha512-0zvJtAcONiozpa5z5zgou83iEKkBaXhhSSXJebFHRXs100SecDojyUWKjwTtBPn9HbM6o5xrvC5mo9VQ5fgAjw== +apollo-client@^2.6.10: + version "2.6.10" + resolved "https://registry.yarnpkg.com/apollo-client/-/apollo-client-2.6.10.tgz#86637047b51d940c8eaa771a4ce1b02df16bea6a" + integrity sha512-jiPlMTN6/5CjZpJOkGeUV0mb4zxx33uXWdj/xQCfAMkuNAC3HN7CvYDyMHHEzmcQ5GV12LszWoQ/VlxET24CtA== dependencies: "@types/zen-observable" "^0.8.0" - apollo-cache "1.3.4" + apollo-cache "1.3.5" apollo-link "^1.0.0" - apollo-utilities "1.3.3" + apollo-utilities "1.3.4" symbol-observable "^1.0.2" ts-invariant "^0.4.0" tslib "^1.10.0" zen-observable "^0.8.0" -apollo-link-context@^1.0.19: - version "1.0.19" - resolved "https://registry.yarnpkg.com/apollo-link-context/-/apollo-link-context-1.0.19.tgz#3c9ba5bf75ed5428567ce057b8837ef874a58987" - integrity sha512-TUi5TyufU84hEiGkpt+5gdH5HkB3Gx46npNfoxR4of3DKBCMuItGERt36RCaryGcU/C3u2zsICU3tJ+Z9LjFoQ== +apollo-link-context@^1.0.20: + version "1.0.20" + resolved "https://registry.yarnpkg.com/apollo-link-context/-/apollo-link-context-1.0.20.tgz#1939ac5dc65d6dff0c855ee53521150053c24676" + integrity sha512-MLLPYvhzNb8AglNsk2NcL9AvhO/Vc9hn2ZZuegbhRHGet3oGr0YH9s30NS9+ieoM0sGT11p7oZ6oAILM/kiRBA== dependencies: - apollo-link "^1.2.13" + apollo-link "^1.2.14" tslib "^1.9.3" -apollo-link-error@^1.0.3, apollo-link-error@^1.1.12: - version "1.1.12" - resolved "https://registry.yarnpkg.com/apollo-link-error/-/apollo-link-error-1.1.12.tgz#e24487bb3c30af0654047611cda87038afbacbf9" - integrity sha512-psNmHyuy3valGikt/XHJfe0pKJnRX19tLLs6P6EHRxg+6q6JMXNVLYPaQBkL0FkwdTCB0cbFJAGRYCBviG8TDA== +apollo-link-error@^1.0.3, apollo-link-error@^1.1.13: + version "1.1.13" + resolved "https://registry.yarnpkg.com/apollo-link-error/-/apollo-link-error-1.1.13.tgz#c1a1bb876ffe380802c8df0506a32c33aad284cd" + integrity sha512-jAZOOahJU6bwSqb2ZyskEK1XdgUY9nkmeclCrW7Gddh1uasHVqmoYc4CKdb0/H0Y1J9lvaXKle2Wsw/Zx1AyUg== dependencies: - apollo-link "^1.2.13" - apollo-link-http-common "^0.2.15" + apollo-link "^1.2.14" + apollo-link-http-common "^0.2.16" tslib "^1.9.3" -apollo-link-http-common@^0.2.15: - version "0.2.15" - resolved "https://registry.yarnpkg.com/apollo-link-http-common/-/apollo-link-http-common-0.2.15.tgz#304e67705122bf69a9abaded4351b10bc5efd6d9" - integrity sha512-+Heey4S2IPsPyTf8Ag3PugUupASJMW894iVps6hXbvwtg1aHSNMXUYO5VG7iRHkPzqpuzT4HMBanCTXPjtGzxg== +apollo-link-http-common@^0.2.16: + version "0.2.16" + resolved "https://registry.yarnpkg.com/apollo-link-http-common/-/apollo-link-http-common-0.2.16.tgz#756749dafc732792c8ca0923f9a40564b7c59ecc" + integrity sha512-2tIhOIrnaF4UbQHf7kjeQA/EmSorB7+HyJIIrUjJOKBgnXwuexi8aMecRlqTIDWcyVXCeqLhUnztMa6bOH/jTg== dependencies: - apollo-link "^1.2.13" + apollo-link "^1.2.14" ts-invariant "^0.4.0" tslib "^1.9.3" apollo-link-http@^1.3.1: - version "1.5.16" - resolved "https://registry.yarnpkg.com/apollo-link-http/-/apollo-link-http-1.5.16.tgz#44fe760bcc2803b8a7f57fc9269173afb00f3814" - integrity sha512-IA3xA/OcrOzINRZEECI6IdhRp/Twom5X5L9jMehfzEo2AXdeRwAMlH5LuvTZHgKD8V1MBnXdM6YXawXkTDSmJw== + version "1.5.17" + resolved "https://registry.yarnpkg.com/apollo-link-http/-/apollo-link-http-1.5.17.tgz#499e9f1711bf694497f02c51af12d82de5d8d8ba" + integrity sha512-uWcqAotbwDEU/9+Dm9e1/clO7hTB2kQ/94JYcGouBVLjoKmTeJTUPQKcJGpPwUjZcSqgYicbFqQSoJIW0yrFvg== dependencies: - apollo-link "^1.2.13" - apollo-link-http-common "^0.2.15" + apollo-link "^1.2.14" + apollo-link-http-common "^0.2.16" tslib "^1.9.3" apollo-link-logger@^1.2.3: @@ -2816,37 +2630,37 @@ apollo-link-logger@^1.2.3: resolved "https://registry.yarnpkg.com/apollo-link-logger/-/apollo-link-logger-1.2.3.tgz#1f3e6f7849ce7a7e3aa822141fe062cfa278b1e1" integrity sha512-GaVwdHyXmawfvBlHfZkFkBHH3+YH7wibzSCc4/YpIbPVtbtZqi0Qop18w++jgpw385W083DMOdYe2eJsKkZdag== -apollo-link-retry@^2.2.15: - version "2.2.15" - resolved "https://registry.yarnpkg.com/apollo-link-retry/-/apollo-link-retry-2.2.15.tgz#4cc3202fcb6251fed6f6b57ade99b4b1ad05c619" - integrity sha512-ltwXGxm+2NXzskrk+GTofj66LQtcc9OGCjIxAPbjlvtHanpKJn8CviWq8dIsMiYGS9T9rGG/kPPx/VdJfcFb6w== +apollo-link-retry@^2.2.16: + version "2.2.16" + resolved "https://registry.yarnpkg.com/apollo-link-retry/-/apollo-link-retry-2.2.16.tgz#745ff51e60a7a68b34c8d382832856c43a9c306c" + integrity sha512-7F9+meFAz4dw5gtgtLsRFqJW6QzNOhTzt5R5Hsy+yFhkTW9LddgYO7gxN9n7RN/7Ouosh3TcpUkdHs2laC+0sA== dependencies: "@types/zen-observable" "0.8.0" - apollo-link "^1.2.13" + apollo-link "^1.2.14" tslib "^1.9.3" -apollo-link-ws@^1.0.19: - version "1.0.19" - resolved "https://registry.yarnpkg.com/apollo-link-ws/-/apollo-link-ws-1.0.19.tgz#dfa871d4df883a8777c9556c872fc892e103daa5" - integrity sha512-mRXmeUkc55ixOdYRtfq5rq3o9sboKghKABKroDVhJnkdS56zthBEWMAD+phajujOUbqByxjok0te8ABqByBdeQ== +apollo-link-ws@^1.0.20: + version "1.0.20" + resolved "https://registry.yarnpkg.com/apollo-link-ws/-/apollo-link-ws-1.0.20.tgz#dfad44121f8445c6d7b7f8101a1b24813ba008ed" + integrity sha512-mjSFPlQxmoLArpHBeUb2Xj+2HDYeTaJqFGOqQ+I8NVJxgL9lJe84PDWcPah/yMLv3rB7QgBDSuZ0xoRFBPlySw== dependencies: - apollo-link "^1.2.13" + apollo-link "^1.2.14" tslib "^1.9.3" -apollo-link@^1.0.0, apollo-link@^1.0.6, apollo-link@^1.2.13: - version "1.2.13" - resolved "https://registry.yarnpkg.com/apollo-link/-/apollo-link-1.2.13.tgz#dff00fbf19dfcd90fddbc14b6a3f9a771acac6c4" - integrity sha512-+iBMcYeevMm1JpYgwDEIDt/y0BB7VWyvlm/7x+TIPNLHCTCMgcEgDuW5kH86iQZWo0I7mNwQiTOz+/3ShPFmBw== +apollo-link@^1.0.0, apollo-link@^1.0.6, apollo-link@^1.2.14: + version "1.2.14" + resolved "https://registry.yarnpkg.com/apollo-link/-/apollo-link-1.2.14.tgz#3feda4b47f9ebba7f4160bef8b977ba725b684d9" + integrity sha512-p67CMEFP7kOG1JZ0ZkYZwRDa369w5PIjtMjvrQd/HnIV8FRsHRqLqK+oAZQnFa1DDdZtOtHTi+aMIW6EatC2jg== dependencies: apollo-utilities "^1.3.0" ts-invariant "^0.4.0" tslib "^1.9.3" - zen-observable-ts "^0.8.20" + zen-observable-ts "^0.8.21" -apollo-utilities@1.3.3, apollo-utilities@^1.3.0, apollo-utilities@^1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/apollo-utilities/-/apollo-utilities-1.3.3.tgz#f1854715a7be80cd810bc3ac95df085815c0787c" - integrity sha512-F14aX2R/fKNYMvhuP2t9GD9fggID7zp5I96MF5QeKYWDWTrkRdHRp4+SVfXUVN+cXOaB/IebfvRtzPf25CM0zw== +apollo-utilities@1.3.4, apollo-utilities@^1.3.0, apollo-utilities@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/apollo-utilities/-/apollo-utilities-1.3.4.tgz#6129e438e8be201b6c55b0f13ce49d2c7175c9cf" + integrity sha512-pk2hiWrCXMAy2fRPwEyhvka+mqwzeP60Jr1tRYi5xru+3ko94HI9o6lK0CT33/w4RDlxWchmdhDCrvdr+pHCig== dependencies: "@wry/equality" "^0.1.2" fast-json-stable-stringify "^2.0.0" @@ -2957,7 +2771,7 @@ array-unique@^0.3.2: resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= -array.prototype.find@^2.1.0: +array.prototype.find@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/array.prototype.find/-/array.prototype.find-2.1.1.tgz#3baca26108ca7affb08db06bf0be6cb3115a969c" integrity sha512-mi+MYNJYLTx2eNYy+Yh6raoQacCsNeeMUaspFPh9Y141lFSsWxxB8V9mM2ye+eqiRs917J6/pJ4M9ZPzenWckA== @@ -2978,19 +2792,11 @@ arrify@^1.0.1: resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= -asap@^2.0.3, asap@~2.0.3, asap@~2.0.6: +asap@^2.0.3, asap@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= -ascli@~1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ascli/-/ascli-1.0.1.tgz#bcfa5974a62f18e81cabaeb49732ab4a88f906bc" - integrity sha1-vPpZdKYvGOgcq660lzKrSoj5Brw= - dependencies: - colour "~0.7.1" - optjs "~3.2.2" - asn1.js@^4.0.0: version "4.10.1" resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" @@ -3058,9 +2864,14 @@ async-limiter@~1.0.0: integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== async-validator@^3.0.3: - version "3.2.4" - resolved "https://registry.yarnpkg.com/async-validator/-/async-validator-3.2.4.tgz#4e773a1d0d741016b455b7995b469a47cce0dbe0" - integrity sha512-mTgzMJixkrh+5t2gbYoua8MLy11GHkQqFE6tbhY5Aqc4jEDGsR4BWP+sVQiYDHtzTMB8WIwI/ypObTVPcTZInw== + version "3.3.0" + resolved "https://registry.yarnpkg.com/async-validator/-/async-validator-3.3.0.tgz#1d92193bbe60d6d6c8b246692c7005e9ed14a8ee" + integrity sha512-cAHGD9EL8aCqWXjnb44q94MWiDFzUo1tMhvLb2WzcpWqGiKugsjWG9cvl+jPgkPca7asNbsBU3fa0cwkI/P+Xg== + +async@0.9.x: + version "0.9.2" + resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" + integrity sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0= async@^2.6.2: version "2.6.3" @@ -3080,17 +2891,22 @@ atob@^2.1.2: integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== autoprefixer@^9.6.1: - version "9.7.4" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.7.4.tgz#f8bf3e06707d047f0641d87aee8cfb174b2a5378" - integrity sha512-g0Ya30YrMBAEZk60lp+qfX5YQllG+S5W3GYCFvyHTvhOki0AEQJLPEcIuGRsqVwLi8FvXPVtwTGhfr38hVpm0g== + version "9.8.5" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.5.tgz#2c225de229ddafe1d1424c02791d0c3e10ccccaa" + integrity sha512-C2p5KkumJlsTHoNv9w31NrBRgXhf6eCMteJuHZi2xhkgC+5Vm40MEtCKPhc0qdgAOhox0YPy1SQHTAky05UoKg== dependencies: - browserslist "^4.8.3" - caniuse-lite "^1.0.30001020" - chalk "^2.4.2" + browserslist "^4.12.0" + caniuse-lite "^1.0.30001097" + colorette "^1.2.0" normalize-range "^0.1.2" num2fraction "^1.2.2" - postcss "^7.0.26" - postcss-value-parser "^4.0.2" + postcss "^7.0.32" + postcss-value-parser "^4.1.0" + +autosize@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/autosize/-/autosize-4.0.2.tgz#073cfd07c8bf45da4b9fd153437f5bafbba1e4c9" + integrity sha512-jnSyH2d+qdfPGpWlcuhGiHmqBJ6g3X+8T+iRwFrHPLVcdoGJE/x6Qicm6aDHfTsbgZKxyV8UU/YB2p4cjKDRRA== aws-sign2@~0.7.0: version "0.7.0" @@ -3098,9 +2914,9 @@ aws-sign2@~0.7.0: integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= aws4@^1.8.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.1.tgz#7e33d8f7d449b3f673cd72deb9abdc552dbe528e" - integrity sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug== + version "1.10.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.10.0.tgz#a17b3a8ea811060e74d47d306122400ad4497ae2" + integrity sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA== axios@^0.19.2: version "0.19.2" @@ -3110,9 +2926,9 @@ axios@^0.19.2: follow-redirects "1.5.10" axobject-query@^2.0.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.1.2.tgz#2bdffc0371e643e5f03ba99065d5179b9ca79799" - integrity sha512-ICt34ZmrVt8UQnvPl6TVyDTkmhXmAyAT4Jh5ugfGUX4MOrZ+U/ZY6/sdylRw3qGNr9Ub5AJsaHeDMzNLehRdOQ== + version "2.2.0" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" + integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== babel-code-frame@^6.22.0: version "6.26.0" @@ -3166,10 +2982,10 @@ babel-loader@8.1.0: pify "^4.0.1" schema-utils "^2.6.5" -babel-plugin-dynamic-import-node@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz#f00f507bdaa3c3e3ff6e7e5e98d90a7acab96f7f" - integrity sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ== +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== dependencies: object.assign "^4.1.0" @@ -3266,7 +3082,7 @@ babel-preset-react-app@^9.1.2: babel-plugin-macros "2.8.0" babel-plugin-transform-react-remove-prop-types "0.4.24" -babel-runtime@6.x, babel-runtime@^6.23.0, babel-runtime@^6.26.0: +babel-runtime@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= @@ -3284,6 +3100,11 @@ backo2@^1.0.2: resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" integrity sha1-MasayLEpNjRj41s+u2n038+6eUc= +balanced-match@^0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" + integrity sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg= + balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" @@ -3319,6 +3140,11 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" +big-integer@^1.6.16: + version "1.6.48" + resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.48.tgz#8fd88bd1632cba4a1c8c3e3d7159f08bb95b4b9e" + integrity sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w== + big.js@^5.2.2: version "5.2.2" resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" @@ -3330,9 +3156,9 @@ binary-extensions@^1.0.0: integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== binary-extensions@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c" - integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow== + version "2.1.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9" + integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ== bindings@^1.5.0: version "1.5.0" @@ -3353,10 +3179,15 @@ bluebird@^3.5.5: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: - version "4.11.8" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" - integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.4.0: + version "4.11.9" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828" + integrity sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw== + +bn.js@^5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.2.tgz#c9686902d3c9a27729f43ab10f9d79c2004da7b0" + integrity sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA== body-parser@1.19.0: version "1.19.0" @@ -3391,7 +3222,7 @@ boolbase@^1.0.0, boolbase@~1.0.0: resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= -bowser@^1.0.0: +bowser@^1.0.0, bowser@^1.7.3: version "1.9.4" resolved "https://registry.yarnpkg.com/bowser/-/bowser-1.9.4.tgz#890c58a2813a9d3243704334fa81b96a5c150c9a" integrity sha512-9IdMmj2KjigRq6oWhmwv1W36pDuA4STQZ8q6YO9um+x07xgYNCD3Oou+WP/3L1HNz7iqythGet3/p4wvc8AAwQ== @@ -3427,15 +3258,28 @@ braces@~3.0.2: dependencies: fill-range "^7.0.1" +broadcast-channel@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/broadcast-channel/-/broadcast-channel-3.1.0.tgz#b4a6970fc72c4d68fc859321a6af850e66cb2dfa" + integrity sha512-zrjTunJRva1aFW9UlLtoMnB05tu8hbb7qbv3PxXXGnxp3t9VA/KcTIwcC0+u7oLBdlXSnv0yy7pB+UemLjANyQ== + dependencies: + "@babel/runtime" "^7.7.2" + detect-node "^2.0.4" + js-sha3 "0.8.0" + microseconds "0.2.0" + nano-time "1.0.0" + rimraf "3.0.2" + unload "2.2.0" + brorand@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= -browser-process-hrtime@^0.1.2: - version "0.1.3" - resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz#616f00faef1df7ec1b5bf9cfe2bdc3170f26c7b4" - integrity sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw== +browser-process-hrtime@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" + integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== browser-resolve@^1.11.3: version "1.11.3" @@ -3475,7 +3319,7 @@ browserify-des@^1.0.0: inherits "^2.0.1" safe-buffer "^5.1.2" -browserify-rsa@^4.0.0: +browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= @@ -3484,17 +3328,19 @@ browserify-rsa@^4.0.0: randombytes "^2.0.1" browserify-sign@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" - integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg= + version "4.2.0" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.0.tgz#545d0b1b07e6b2c99211082bf1b12cce7a0b0e11" + integrity sha512-hEZC1KEeYuoHRqhGhTy6gWrpJA3ZDjFWv0DE61643ZnOXAKJb3u7yWcrU0mMc9SwAqK1n7myPGndkp0dFG7NFA== dependencies: - bn.js "^4.1.1" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.2" - elliptic "^6.0.0" - inherits "^2.0.1" - parse-asn1 "^5.0.0" + bn.js "^5.1.1" + browserify-rsa "^4.0.1" + create-hash "^1.2.0" + create-hmac "^1.1.7" + elliptic "^6.5.2" + inherits "^2.0.4" + parse-asn1 "^5.1.5" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" browserify-zlib@^0.2.0: version "0.2.0" @@ -3513,24 +3359,15 @@ browserslist@4.10.0: node-releases "^1.1.52" pkg-up "^3.1.0" -browserslist@^4.0.0, browserslist@^4.6.2, browserslist@^4.6.4, browserslist@^4.8.3, browserslist@^4.8.5: - version "4.9.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.9.0.tgz#ff85c390889e0f754d7bd8ad13412575cdcf5dc7" - integrity sha512-seffIXhwgB84+OCeT/aMjpZnsAsYDiMSC+CEs3UkF8iU64BZGYcu+TZYs/IBpo4nRi0vJywUJWYdbTsOhFTweg== +browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.6.2, browserslist@^4.6.4, browserslist@^4.8.5, browserslist@^4.9.1: + version "4.13.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.13.0.tgz#42556cba011e1b0a2775b611cba6a8eca18e940d" + integrity sha512-MINatJ5ZNrLnQ6blGvePd/QOz9Xtu+Ne+x29iQSCHfkU5BugKVJwZKn/iiL8UbpIpa3JhviKjz+XxMo0m2caFQ== dependencies: - caniuse-lite "^1.0.30001030" - electron-to-chromium "^1.3.361" - node-releases "^1.1.50" - -browserslist@^4.9.1: - version "4.11.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.11.0.tgz#aef4357b10a8abda00f97aac7cd587b2082ba1ad" - integrity sha512-WqEC7Yr5wUH5sg6ruR++v2SGOQYpyUdYYd4tZoAq1F7y+QXoLoYGXVbxhtaIqWmAJjtNTRjVD3HuJc1OXTel2A== - dependencies: - caniuse-lite "^1.0.30001035" - electron-to-chromium "^1.3.380" - node-releases "^1.1.52" - pkg-up "^3.1.0" + caniuse-lite "^1.0.30001093" + electron-to-chromium "^1.3.488" + escalade "^3.0.1" + node-releases "^1.1.58" bser@2.1.1: version "2.1.1" @@ -3573,13 +3410,6 @@ builtin-status-codes@^3.0.0: resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= -bytebuffer@~5: - version "5.0.1" - resolved "https://registry.yarnpkg.com/bytebuffer/-/bytebuffer-5.0.1.tgz#582eea4b1a873b6d020a48d58df85f0bba6cfddd" - integrity sha1-WC7qSxqHO20CCkjVjfhfC7ps/d0= - dependencies: - long "~3" - bytes@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" @@ -3591,9 +3421,9 @@ bytes@3.1.0: integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== cacache@^12.0.2: - version "12.0.3" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.3.tgz#be99abba4e1bf5df461cd5a2c1071fc432573390" - integrity sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw== + version "12.0.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" + integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ== dependencies: bluebird "^3.5.5" chownr "^1.1.1" @@ -3705,16 +3535,11 @@ camelcase@5.3.1, camelcase@^5.0.0, camelcase@^5.3.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -camelcase@^2.0.0, camelcase@^2.0.1: +camelcase@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= -camelcase@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" - integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo= - camelize@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.0.tgz#164a5483e630fa4321e5af07020e531831b2609b" @@ -3730,15 +3555,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001020, caniuse-lite@^1.0.30001030: - version "1.0.30001030" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001030.tgz#78076c4c6d67d3e41d6eb9399853fb27fe6e44ee" - integrity sha512-QGK0W4Ft/Ac+zTjEiRJfwDNATvS3fodDczBXrH42784kcfqcDKpEPfN08N0HQjrAp8He/Jw8QiSS9QRn7XAbUw== - -caniuse-lite@^1.0.30001035: - version "1.0.30001036" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001036.tgz#930ea5272010d8bf190d859159d757c0b398caf0" - integrity sha512-jU8CIFIj2oR7r4W+5AKcsvWNVIb6Q6OZE3UsrXrZBHFtreT4YgTeOJtTucp+zSedEpTi3L5wASSP0LYIE3if6w== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001035, caniuse-lite@^1.0.30001093, caniuse-lite@^1.0.30001097: + version "1.0.30001099" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001099.tgz#540118fcc6842d1fde62f4ee5521d1ec6afdb40e" + integrity sha512-sdS9A+sQTk7wKoeuZBN/YMAHVztUfVnjDi4/UV3sDE8xoh7YR12hKW+pIdB3oqKGwr9XaFL2ovfzt9w8eUI5CA== capture-exit@^2.0.0: version "2.0.0" @@ -3785,10 +3605,13 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -change-emitter@^0.1.2: - version "0.1.6" - resolved "https://registry.yarnpkg.com/change-emitter/-/change-emitter-0.1.6.tgz#e8b2fe3d7f1ab7d69a32199aff91ea6931409515" - integrity sha1-6LL+PX8at9aaMhma/5HqaTFAlRU= +chalk@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" + integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" chardet@^0.7.0: version "0.7.0" @@ -3807,7 +3630,7 @@ cheerio@^1.0.0-rc.3: lodash "^4.15.0" parse5 "^3.0.1" -chokidar@^2.0.2, chokidar@^2.1.8: +chokidar@^2.1.8: version "2.1.8" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== @@ -3826,10 +3649,10 @@ chokidar@^2.0.2, chokidar@^2.1.8: optionalDependencies: fsevents "^1.2.7" -chokidar@^3.3.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.1.tgz#c84e5b3d18d9a4d77558fef466b1bf16bbeb3450" - integrity sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg== +chokidar@^3.3.0, chokidar@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.0.tgz#b30611423ce376357c765b9b8f904b9fba3c0be8" + integrity sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ== dependencies: anymatch "~3.1.1" braces "~3.0.2" @@ -3837,7 +3660,7 @@ chokidar@^3.3.0: is-binary-path "~2.1.0" is-glob "~4.0.1" normalize-path "~3.0.0" - readdirp "~3.3.0" + readdirp "~3.4.0" optionalDependencies: fsevents "~2.1.2" @@ -3876,7 +3699,7 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" -classnames@2.x, classnames@^2.2.0, classnames@^2.2.1, classnames@^2.2.3, classnames@^2.2.5, classnames@^2.2.6, classnames@~2.2.6: +classnames@2.x, "classnames@>= 2.0", classnames@^2.2.0, classnames@^2.2.1, classnames@^2.2.3, classnames@^2.2.5, classnames@^2.2.6: version "2.2.6" resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q== @@ -3901,18 +3724,14 @@ cli-cursor@^3.1.0: restore-cursor "^3.1.0" cli-width@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" - integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" + integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== -cliui@^3.0.3, cliui@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" - integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0= - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - wrap-ansi "^2.0.0" +cli-width@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" + integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== cliui@^4.0.0: version "4.1.0" @@ -3961,10 +3780,10 @@ clone-deep@^4.0.1: kind-of "^6.0.2" shallow-clone "^3.0.0" -clsx@^1.0.4: - version "1.1.0" - resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.1.0.tgz#62937c6adfea771247c34b54d320fb99624f5702" - integrity sha512-3avwM37fSK5oP6M5rQ9CNe99lwxhXDOeSWVPAOYF6OazUTgZCMb0yWlJpmdD74REy1gkEaFiub2ULv4fq9GUhA== +clsx@^1.0.1, clsx@^1.0.4: + version "1.1.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.1.1.tgz#98b3134f9abbdf23b2663491ace13c5c03a73188" + integrity sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA== co@^4.6.0: version "4.6.0" @@ -4033,10 +3852,10 @@ color@^3.0.0: color-convert "^1.9.1" color-string "^1.5.2" -colour@~0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/colour/-/colour-0.7.1.tgz#9cb169917ec5d12c0736d3e8685746df1cadf778" - integrity sha1-nLFpkX7F0SwHNtPoaFdG3xyt93g= +colorette@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b" + integrity sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw== combined-stream@^1.0.6, combined-stream@~1.0.6: version "1.0.8" @@ -4065,23 +3884,11 @@ commondir@^1.0.1: resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= -component-classes@^1.2.5, component-classes@^1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/component-classes/-/component-classes-1.2.6.tgz#c642394c3618a4d8b0b8919efccbbd930e5cd691" - integrity sha1-xkI5TDYYpNiwuJGe/Mu9kw5c1pE= - dependencies: - component-indexof "0.0.3" - component-emitter@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== -component-indexof@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/component-indexof/-/component-indexof-0.0.3.tgz#11d091312239eb8f32c8f25ae9cb002ffe8d3c24" - integrity sha1-EdCRMSI5648yyPJa6csAL/6NPCQ= - compose-function@3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/compose-function/-/compose-function-3.0.3.tgz#9ed675f13cc54501d30950a486ff6a7ba3ab185f" @@ -4109,10 +3916,10 @@ compression@^1.7.4: safe-buffer "5.1.2" vary "~1.1.2" -compute-scroll-into-view@^1.0.13: - version "1.0.13" - resolved "https://registry.yarnpkg.com/compute-scroll-into-view/-/compute-scroll-into-view-1.0.13.tgz#be1b1663b0e3f56cd5f7713082549f562a3477e2" - integrity sha512-o+w9w7A98aAFi/GjK8cxSV+CdASuPa2rR5UWs3+yHkJzWqaKoBEufFNWYaXInCSmUfDCVhesG+v9MTWqOjsxFg== +compute-scroll-into-view@^1.0.14: + version "1.0.14" + resolved "https://registry.yarnpkg.com/compute-scroll-into-view/-/compute-scroll-into-view-1.0.14.tgz#80e3ebb25d6aa89f42e533956cb4b16a04cfe759" + integrity sha512-mKDjINe3tc6hGelUMNDzuhorIUZ7kS7BwyY0r2wQd2HOH2tRuJykiC06iSEX8y1TuhNzvz4GcJnK16mM2J1NMQ== concat-map@0.0.1: version "0.0.1" @@ -4218,29 +4025,24 @@ copy-to-clipboard@^3.2.0: toggle-selection "^1.0.6" core-js-compat@^3.6.2: - version "3.6.4" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.4.tgz#938476569ebb6cda80d339bcf199fae4f16fff17" - integrity sha512-zAa3IZPvsJ0slViBQ2z+vgyyTuhd3MFn1rBQjZSKVEgB0UMYhUkCj9jJUVPgGTGqWvsBVmfnruXgTcNyTlEiSA== + version "3.6.5" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.5.tgz#2a51d9a4e25dfd6e690251aa81f99e3c05481f1c" + integrity sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng== dependencies: - browserslist "^4.8.3" + browserslist "^4.8.5" semver "7.0.0" core-js-pure@^3.0.0: - version "3.6.4" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.6.4.tgz#4bf1ba866e25814f149d4e9aaa08c36173506e3a" - integrity sha512-epIhRLkXdgv32xIUFaaAry2wdxZYBi6bgM7cB136dzzXXa+dFyRLTZeLUJxnd8ShrmyVXBub63n2NHo2JAt8Cw== + version "3.6.5" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.6.5.tgz#c79e75f5e38dbc85a662d91eea52b8256d53b813" + integrity sha512-lacdXOimsiD0QyNf9BC/mxivNJ/ybBGJXQFKzRekp1WTHoVUWsUHEn+2T8GJAzzIhyOuXA+gOxCVN3l+5PLPUA== -core-js@3.6.4, core-js@^3.5.0: - version "3.6.4" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.4.tgz#440a83536b458114b9cb2ac1580ba377dc470647" - integrity sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw== +core-js@3.6.5, core-js@^3.5.0: + version "3.6.5" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.5.tgz#7395dc273af37fb2e50e9bd3d9fe841285231d1a" + integrity sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA== -core-js@^1.0.0: - version "1.2.7" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" - integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY= - -core-js@^2.4.0: +core-js@^2.4.0, core-js@^2.6.10: version "2.6.11" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== @@ -4279,7 +4081,7 @@ create-ecdh@^4.0.0: bn.js "^4.1.0" elliptic "^6.0.0" -create-hash@^1.1.0, create-hash@^1.1.2: +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== @@ -4290,7 +4092,7 @@ create-hash@^1.1.0, create-hash@^1.1.2: ripemd160 "^2.0.1" sha.js "^2.4.0" -create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: +create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== @@ -4347,14 +4149,6 @@ crypto-browserify@^3.11.0: randombytes "^2.0.0" randomfill "^1.0.3" -css-animation@1.x, css-animation@^1.3.2, css-animation@^1.5.0: - version "1.6.1" - resolved "https://registry.yarnpkg.com/css-animation/-/css-animation-1.6.1.tgz#162064a3b0d51f958b7ff37b3d6d4de18e17039e" - integrity sha512-/48+/BaEaHRY6kNQ2OIPzKf9A6g8WjZYjhiNDNuIVbsm5tXCGIAsHDjB4Xu1C4vXJtUWZo26O68OQkDpNBaPog== - dependencies: - babel-runtime "6.x" - component-classes "^1.2.5" - css-blank-pseudo@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz#dfdefd3254bf8a82027993674ccf35483bfcb3c5" @@ -4362,6 +4156,13 @@ css-blank-pseudo@^0.1.4: dependencies: postcss "^7.0.5" +css-box-model@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/css-box-model/-/css-box-model-1.2.1.tgz#59951d3b81fd6b2074a62d49444415b0d2b4d7c1" + integrity sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw== + dependencies: + tiny-invariant "^1.0.6" + css-color-keywords@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05" @@ -4388,6 +4189,14 @@ css-has-pseudo@^0.10.0: postcss "^7.0.6" postcss-selector-parser "^5.0.0-rc.4" +css-in-js-utils@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/css-in-js-utils/-/css-in-js-utils-2.0.1.tgz#3b472b398787291b47cfe3e44fecfdd9e914ba99" + integrity sha512-PJF0SpJT+WdbVVt0AOYp9C8GnuruRlL/UFW7932nLWmFLQTaWEzTBQEx7/hn4BuV+WON75iAViSUJLiU3PKbpA== + dependencies: + hyphenate-style-name "^1.0.2" + isobject "^3.0.1" + css-loader@3.4.2: version "3.4.2" resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.4.2.tgz#d3fdb3358b43f233b78501c5ed7b1c6da6133202" @@ -4455,15 +4264,23 @@ css-tree@1.0.0-alpha.37: mdn-data "2.0.4" source-map "^0.6.1" +css-tree@1.0.0-alpha.39, css-tree@^1.0.0-alpha.28: + version "1.0.0-alpha.39" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.39.tgz#2bff3ffe1bb3f776cf7eefd91ee5cba77a149eeb" + integrity sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA== + dependencies: + mdn-data "2.0.6" + source-map "^0.6.1" + css-what@2.1: version "2.1.3" resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== css-what@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.2.1.tgz#f4a8f12421064621b456755e34a03a2c22df5da1" - integrity sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw== + version "3.3.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.3.0.tgz#10fec696a9ece2e591ac772d759aacabac38cd39" + integrity sha512-pv9JPyatiPaQ6pf4OvD/dbfm0o5LviWmwxNWzblYf/1u9QZd0ihV+PMwy5jdQWQ3349kZmKEx9WXuSka2dM4cg== css@^2.0.0: version "2.2.4" @@ -4559,11 +4376,11 @@ cssnano@^4.1.10: postcss "^7.0.0" csso@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/csso/-/csso-4.0.2.tgz#e5f81ab3a56b8eefb7f0092ce7279329f454de3d" - integrity sha512-kS7/oeNVXkHWxby5tHVxlhjizRCSv8QdU7hB2FpdAibDU8FjTAolhNjKNTiLzXtUrKT6HwClE81yXwEk1309wg== + version "4.0.3" + resolved "https://registry.yarnpkg.com/csso/-/csso-4.0.3.tgz#0d9985dc852c7cc2b2cacfbbe1079014d1a8e903" + integrity sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ== dependencies: - css-tree "1.0.0-alpha.37" + css-tree "1.0.0-alpha.39" cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0", cssom@^0.3.4: version "0.3.8" @@ -4577,10 +4394,10 @@ cssstyle@^1.0.0, cssstyle@^1.1.1: dependencies: cssom "0.3.x" -csstype@^2.2.0, csstype@^2.6.7: - version "2.6.9" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.9.tgz#05141d0cd557a56b8891394c1911c40c8a98d098" - integrity sha512-xz39Sb4+OaTsULgUERcCk+TJj8ylkL4aSVDQiX/ksxbELSqwkgt4d4RD7fovIdgJGSuNYqwZEiVjYY5l0ask+Q== +csstype@^2.2.0, csstype@^2.5.5, csstype@^2.6.7: + version "2.6.11" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.11.tgz#452f4d024149ecf260a852b025e36562a253ffc5" + integrity sha512-l8YyEC9NBkSm783PFTvh0FmJy7s5pFKrDp49ZL7zBGX3fWkO+N4EEyan1qqp8cwPLDcD0OSdyY6hAMoxp34JFw== currently-unhandled@^0.4.1: version "0.4.1" @@ -4594,27 +4411,27 @@ cyclist@^1.0.1: resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= -"d3-array@1.2.0 - 2": - version "2.4.0" - resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-2.4.0.tgz#87f8b9ad11088769c82b5ea846bcb1cc9393f242" - integrity sha512-KQ41bAF2BMakf/HdKT865ALd4cgND6VcIztVQZUTt0+BH3RWy6ZYnHghVXf6NFjt2ritLr8H1T8LreAAlfiNcw== +d3-array@^1.2.0: + version "1.2.4" + resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-1.2.4.tgz#635ce4d5eea759f6f605863dbcfc30edc737f71f" + integrity sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw== -d3-color@1, d3-color@^1.2.3: - version "1.4.0" - resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-1.4.0.tgz#89c45a995ed773b13314f06460df26d60ba0ecaf" - integrity sha512-TzNPeJy2+iEepfiL92LAAB7fvnp/dV2YwANPVHdDWmYMm23qIJBYww3qT8I8C1wXrmrg4UWs7BKc2tKIgyjzHg== +d3-collection@1: + version "1.0.7" + resolved "https://registry.yarnpkg.com/d3-collection/-/d3-collection-1.0.7.tgz#349bd2aa9977db071091c13144d5e4f16b5b310e" + integrity sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A== -d3-format@1, d3-format@^1.3.2: - version "1.4.3" - resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-1.4.3.tgz#4e8eb4dff3fdcb891a8489ec6e698601c41b96f1" - integrity sha512-mm/nE2Y9HgGyjP+rKIekeITVgBtX97o1nrvHCWX8F/yBYyevUTvu9vb5pUnKwrcSw7o7GuwMOWjS9gFDs4O+uQ== +d3-color@1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-1.4.1.tgz#c52002bf8846ada4424d55d97982fef26eb3bc8a" + integrity sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q== -d3-hierarchy@^1.1.8: - version "1.1.9" - resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz#2f6bee24caaea43f8dc37545fa01628559647a83" - integrity sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ== +d3-format@1: + version "1.4.4" + resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-1.4.4.tgz#356925f28d0fd7c7983bfad593726fce46844030" + integrity sha512-TWks25e7t8/cqctxCmxpUuzZN11QxIA7YrMbram94zMQ0PXjE4LVIMe/f6a4+xxL8HQ3OsAFULOINQi1pE62Aw== -d3-interpolate@1, d3-interpolate@^1.2.0, d3-interpolate@^1.3.2: +d3-interpolate@1, d3-interpolate@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-1.4.0.tgz#526e79e2d80daa383f9e0c1c1c7dcc0f0583e987" integrity sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA== @@ -4626,33 +4443,26 @@ d3-path@1: resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-1.0.9.tgz#48c050bb1fe8c262493a8caf5524e3e9591701cf" integrity sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg== -d3-scale-chromatic@^1.3.3: - version "1.5.0" - resolved "https://registry.yarnpkg.com/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz#54e333fc78212f439b14641fb55801dd81135a98" - integrity sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg== +d3-scale@^2.1.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-2.2.2.tgz#4e880e0b2745acaaddd3ede26a9e908a9e17b81f" + integrity sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw== dependencies: - d3-color "1" - d3-interpolate "1" - -d3-scale@^3.0.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-3.2.1.tgz#da1684adce7261b4bc7a76fe193d887f0e909e69" - integrity sha512-huz5byJO/6MPpz6Q8d4lg7GgSpTjIZW/l+1MQkzKfu2u8P6hjaXaStOpmyrD6ymKoW87d2QVFCKvSjLwjzx/rA== - dependencies: - d3-array "1.2.0 - 2" + d3-array "^1.2.0" + d3-collection "1" d3-format "1" - d3-interpolate "^1.2.0" + d3-interpolate "1" d3-time "1" d3-time-format "2" -d3-shape@^1.3.5: +d3-shape@^1.2.0: version "1.3.7" resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-1.3.7.tgz#df63801be07bc986bc54f63789b4fe502992b5d7" integrity sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw== dependencies: d3-path "1" -d3-time-format@2, d3-time-format@^2.1.3: +d3-time-format@2: version "2.2.3" resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-2.2.3.tgz#0c9a12ee28342b2037e5ea1cf0b9eb4dd75f29cb" integrity sha512-RAHNnD8+XvC4Zc4d2A56Uw0yJoM7bsvOlJR33bclxq399Rak/b9bhvu/InjxdWhPtkgU53JJcleJTGkNRnN6IA== @@ -4712,7 +4522,7 @@ debug@=3.1.0: dependencies: ms "2.0.0" -debug@^3.0.0, debug@^3.1.1, debug@^3.2.5, debug@^3.2.6: +debug@^3.1.1, debug@^3.2.5: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== @@ -4726,11 +4536,16 @@ debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: dependencies: ms "^2.1.1" -decamelize@^1.1.1, decamelize@^1.1.2, decamelize@^1.2.0: +decamelize@^1.1.2, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= +decimal.js-light@^2.4.1: + version "2.5.0" + resolved "https://registry.yarnpkg.com/decimal.js-light/-/decimal.js-light-2.5.0.tgz#ca7faf504c799326df94b0ab920424fdfc125348" + integrity sha512-b3VJCbd2hwUpeRGG3Toob+CRo8W22xplipNhP3tN7TSVB/cyMX71P1vM2Xjc9H74uV6dS2hDDmo/rHq8L87Upg== + decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" @@ -4753,11 +4568,6 @@ deep-equal@^1.0.1: object-keys "^1.1.1" regexp.prototype.flags "^1.2.0" -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" @@ -4841,11 +4651,6 @@ destroy@~1.0.4: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= -detect-libc@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= - detect-newline@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" @@ -4878,6 +4683,11 @@ diffie-hellman@^5.0.0: miller-rabin "^4.0.0" randombytes "^2.0.0" +dinero.js@^1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/dinero.js/-/dinero.js-1.8.1.tgz#775a647629b4195af9d02f46e9b7fa1fd81e906d" + integrity sha512-AQ09MDKonkGUrhBZZFx4tPTVcVJuHJ0VEA73LvcBoBB2eQSi1DbapeXj4wnUUpx1hVnPdyev1xPNnNMGy/Au0g== + dir-glob@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034" @@ -4934,9 +4744,9 @@ doctrine@^3.0.0: esutils "^2.0.2" dom-align@^1.7.0: - version "1.11.1" - resolved "https://registry.yarnpkg.com/dom-align/-/dom-align-1.11.1.tgz#7592be99a660a36cdedc1d6eeb22b8109d758cae" - integrity sha512-hN42DmUgtweBx0iBjDLO4WtKOMcK8yBmPx/fgdsgQadLuzPu/8co3oLdK5yMmeM/vnUd3yDyV6qV8/NzxBexQg== + version "1.12.0" + resolved "https://registry.yarnpkg.com/dom-align/-/dom-align-1.12.0.tgz#56fb7156df0b91099830364d2d48f88963f5a29c" + integrity sha512-YkoezQuhp3SLFGdOlr5xkqZ640iXrnHAwVYcDg8ZKRUtO7mSzSC2BA5V0VuyAwPSJA4CLIc6EDDJh4bEsD2+zA== dom-converter@^0.2: version "0.2.0" @@ -4952,12 +4762,12 @@ dom-helpers@^3.4.0: dependencies: "@babel/runtime" "^7.1.2" -dom-helpers@^5.1.0: - version "5.1.3" - resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.1.3.tgz#7233248eb3a2d1f74aafca31e52c5299cc8ce821" - integrity sha512-nZD1OtwfWGRBWlpANxacBEZrEuLa16o1nh7YopFWeoF68Zt8GGEmzHu6Xv4F3XaFIC+YXtTLrzgqKxFgLEe4jw== +dom-helpers@^5.0.0, dom-helpers@^5.1.0: + version "5.1.4" + resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.1.4.tgz#4609680ab5c79a45f2531441f1949b79d6587f4b" + integrity sha512-TjMyeVUvNEnOnhzs6uAn9Ya47GmMo3qq7m+Lr/3ON0Rs5kHvb8I+SQYjLUSYn7qhEm0QjW0yrBkvz9yOrwwz1A== dependencies: - "@babel/runtime" "^7.6.3" + "@babel/runtime" "^7.8.7" csstype "^2.6.7" dom-serializer@0: @@ -5080,24 +4890,21 @@ ee-first@1.1.1: integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= ejs@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.0.2.tgz#745b01cdcfe38c1c6a2da3bbb2d9957060a31226" - integrity sha512-IncmUpn1yN84hy2shb0POJ80FWrfGNY0cxO9f4v+/sG7qcBvAtVWUA1IdzY/8EYUmOVhoKJVdJjNd3AZcnxOjA== + version "3.1.3" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.3.tgz#514d967a8894084d18d3d47bd169a1c0560f093d" + integrity sha512-wmtrUGyfSC23GC/B1SMv2ogAUgbQEtDmTIhfqielrG5ExIM9TP4UoYdi90jLF1aTcsWCJNEO0UrgKzP0y3nTSg== + dependencies: + jake "^10.6.1" -electron-to-chromium@^1.3.361: - version "1.3.363" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.363.tgz#08756873e49446a92e0cee6c3cd9eb3c52043826" - integrity sha512-4w19wPBkeunBjOA53lNFT36IdOD3Tk1OoIDtTX+VToJUUDX42QfuhtsNKXv25wmSnoBOExM3kTbj7/WDNBwHuQ== +electron-to-chromium@^1.3.378, electron-to-chromium@^1.3.488: + version "1.3.496" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.496.tgz#3f43d32930481d82ad3663d79658e7c59a58af0b" + integrity sha512-TXY4mwoyowwi4Lsrq9vcTUYBThyc1b2hXaTZI13p8/FRhY2CTaq5lK+DVjhYkKiTLsKt569Xes+0J5JsVXFurQ== -electron-to-chromium@^1.3.378, electron-to-chromium@^1.3.380: - version "1.3.380" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.380.tgz#1e1f07091b42b54bccd0ad6d3a14f2b73b60dc9d" - integrity sha512-2jhQxJKcjcSpVOQm0NAfuLq8o+130blrcawoumdXT6411xG/xIAOyZodO/y7WTaYlz/NHe3sCCAe/cJLnDsqTw== - -elliptic@^6.0.0: - version "6.5.2" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz#05c5678d7173c049d8ca433552224a495d0e3762" - integrity sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw== +elliptic@^6.0.0, elliptic@^6.5.2: + version "6.5.3" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.3.tgz#cb59eb2efdaf73a0bd78ccd7015a62ad6e0f93d6" + integrity sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw== dependencies: bn.js "^4.4.0" brorand "^1.0.1" @@ -5133,11 +4940,11 @@ encodeurl@~1.0.2: integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= encoding@^0.1.11: - version "0.1.12" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" - integrity sha1-U4tm8+5izRq1HsMjgp0flIDHS+s= + version "0.1.13" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== dependencies: - iconv-lite "~0.4.13" + iconv-lite "^0.6.2" end-of-stream@^1.0.0, end-of-stream@^1.1.0: version "1.4.4" @@ -5147,9 +4954,9 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0: once "^1.4.0" enhanced-resolve@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz#2937e2b8066cd0fe7ce0990a98f0d71a35189f66" - integrity sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA== + version "4.2.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.2.0.tgz#5d43bda4a0fd447cb0ebbe71bef8deff8805ad0d" + integrity sha512-S7eiFb/erugyd1rLb6mQ3Vuq+EXHv5cpCkNqqIkYkBgN2QdFnyCZzFBleqwGEx4lgNGYij81BWnCrFNK7vxvjQ== dependencies: graceful-fs "^4.1.2" memory-fs "^0.5.0" @@ -5161,9 +4968,9 @@ entities@^1.1.1, entities@~1.1.1: integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== entities@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.0.tgz#68d6084cab1b079767540d80e56a39b423e4abf4" - integrity sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw== + version "2.0.3" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.3.tgz#5c487e5742ab93c15abb5da22759b8590ec03b7f" + integrity sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ== enzyme-adapter-react-16@^1.15.2: version "1.15.2" @@ -5242,22 +5049,29 @@ error-ex@^1.2.0, error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.2, es-abstract@^1.17.4: - version "1.17.4" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.4.tgz#e3aedf19706b20e7c2594c35fc0d57605a79e184" - integrity sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ== +error-stack-parser@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.0.6.tgz#5a99a707bd7a4c58a797902d48d82803ede6aad8" + integrity sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ== + dependencies: + stackframe "^1.1.1" + +es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.2, es-abstract@^1.17.4, es-abstract@^1.17.5: + version "1.17.6" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.6.tgz#9142071707857b2cacc7b89ecb670316c3e2d52a" + integrity sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw== dependencies: es-to-primitive "^1.2.1" function-bind "^1.1.1" has "^1.0.3" has-symbols "^1.0.1" - is-callable "^1.1.5" - is-regex "^1.0.5" + is-callable "^1.2.0" + is-regex "^1.1.0" object-inspect "^1.7.0" object-keys "^1.1.1" object.assign "^4.1.0" - string.prototype.trimleft "^2.1.1" - string.prototype.trimright "^2.1.1" + string.prototype.trimend "^1.0.1" + string.prototype.trimstart "^1.0.1" es-to-primitive@^1.2.1: version "1.2.1" @@ -5294,6 +5108,11 @@ es6-symbol@^3.1.1, es6-symbol@~3.1.3: d "^1.0.1" ext "^1.1.2" +escalade@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.0.1.tgz#52568a77443f6927cd0ab9c73129137533c965ed" + integrity sha512-DR6NO3h9niOT+MZs7bjxlj2a1k+POu5RN8CLTPX2+i78bRi9eLe7+0zXgUHMnGXWybYcL61E9hGhPKqedy8tQA== + escape-html@^1.0.3, escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" @@ -5310,9 +5129,9 @@ escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= escodegen@^1.11.0, escodegen@^1.9.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.1.tgz#ba01d0c8278b5e95a9a45350142026659027a457" - integrity sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ== + version "1.14.3" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" + integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== dependencies: esprima "^4.0.1" estraverse "^4.2.0" @@ -5329,9 +5148,9 @@ eslint-config-react-app@^5.2.1: confusing-browser-globals "^1.0.9" eslint-import-resolver-node@^0.3.2: - version "0.3.3" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz#dbaa52b6b2816b50bc6711af75422de808e98404" - integrity sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg== + version "0.3.4" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz#85ffa81942c25012d8231096ddf679c03042c717" + integrity sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA== dependencies: debug "^2.6.9" resolve "^1.13.1" @@ -5348,9 +5167,9 @@ eslint-loader@3.0.3: schema-utils "^2.6.1" eslint-module-utils@^2.4.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.5.2.tgz#7878f7504824e1b857dd2505b59a8e5eda26a708" - integrity sha512-LGScZ/JSlqGKiT8OC+cYRxseMjyqt6QO54nl281CK93unD89ijSeRV6An8Ci/2nvWVKe8K/Tqdm75RQoIOCr+Q== + version "2.6.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6" + integrity sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA== dependencies: debug "^2.6.9" pkg-dir "^2.0.0" @@ -5427,9 +5246,9 @@ eslint-scope@^4.0.3: estraverse "^4.1.1" eslint-scope@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9" - integrity sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw== + version "5.1.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.0.tgz#d0f971dfe59c69e0cada684b23d49dbf82600ce5" + integrity sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w== dependencies: esrecurse "^4.1.0" estraverse "^4.1.1" @@ -5441,10 +5260,17 @@ eslint-utils@^1.4.3: dependencies: eslint-visitor-keys "^1.1.0" +eslint-utils@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== + dependencies: + eslint-visitor-keys "^1.1.0" + eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" - integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== + version "1.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== eslint@^6.6.0: version "6.8.0" @@ -5490,12 +5316,12 @@ eslint@^6.6.0: v8-compile-cache "^2.0.3" espree@^6.1.2: - version "6.1.2" - resolved "https://registry.yarnpkg.com/espree/-/espree-6.1.2.tgz#6c272650932b4f91c3714e5e7b5f5e2ecf47262d" - integrity sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA== + version "6.2.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a" + integrity sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw== dependencies: - acorn "^7.1.0" - acorn-jsx "^5.1.0" + acorn "^7.1.1" + acorn-jsx "^5.2.0" eslint-visitor-keys "^1.1.0" esprima@^4.0.0, esprima@^4.0.1: @@ -5504,11 +5330,11 @@ esprima@^4.0.0, esprima@^4.0.1: integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esquery@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.1.0.tgz#c5c0b66f383e7656404f86b31334d72524eddb48" - integrity sha512-MxYW9xKmROWF672KqjO75sszsA8Mxhw06YFeS5VHlB98KDHbOSurm3ArsjO60Eaf3QmGMCP1yn+0JQkNLo/97Q== + version "1.3.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" + integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== dependencies: - estraverse "^4.0.0" + estraverse "^5.1.0" esrecurse@^4.1.0: version "4.2.1" @@ -5517,12 +5343,17 @@ esrecurse@^4.1.0: dependencies: estraverse "^4.1.0" -estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: +estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== -esutils@^2.0.0, esutils@^2.0.2: +estraverse@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.1.0.tgz#374309d39fd935ae500e7b92e8a6b4c720e59642" + integrity sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw== + +esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== @@ -5538,9 +5369,9 @@ eventemitter3@^3.1.0: integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q== eventemitter3@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.0.tgz#d65176163887ee59f386d64c82610b696a4a74eb" - integrity sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg== + version "4.0.4" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.4.tgz#b5463ace635a083d018bdc7c917b4c5f10a85384" + integrity sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ== events@^3.0.0: version "3.1.0" @@ -5711,10 +5542,10 @@ extsprintf@^1.2.0: resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= -fast-deep-equal@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4" - integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA== +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-glob@^2.0.2: version "2.2.7" @@ -5738,6 +5569,16 @@ fast-levenshtein@~2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= +fast-shallow-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fast-shallow-equal/-/fast-shallow-equal-1.0.0.tgz#d4dcaf6472440dcefa6f88b98e3251e27f25628b" + integrity sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw== + +fastest-stable-stringify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/fastest-stable-stringify/-/fastest-stable-stringify-1.0.1.tgz#9122d406d4c9d98bea644a6b6853d5874b87b028" + integrity sha1-kSLUBtTJ2YvqZEpraFPVh0uHsCg= + faye-websocket@0.11.3, faye-websocket@~0.11.1: version "0.11.3" resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.3.tgz#5c0e9a8968e8912c286639fde977a8b209f2508e" @@ -5759,23 +5600,10 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" -fbjs@^0.8.1: - version "0.8.17" - resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd" - integrity sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90= - dependencies: - core-js "^1.0.0" - isomorphic-fetch "^2.1.1" - loose-envify "^1.0.0" - object-assign "^4.1.0" - promise "^7.1.1" - setimmediate "^1.0.5" - ua-parser-js "^0.7.18" - figgy-pudding@^3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" - integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w== + version "3.5.2" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" + integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== figures@^3.0.0: version "3.2.0" @@ -5804,6 +5632,13 @@ file-uri-to-path@1.0.0: resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== +filelist@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.1.tgz#f10d1a3ae86c1694808e8f20906f43d4c9132dbb" + integrity sha512-8zSK6Nu0DQIC08mUC46sWGXi+q3GGpKydAG36k+JDba6VRpkevvOWUW5a/PhShij4+vHT9M+ghgG7eM+a9JDUQ== + dependencies: + minimatch "^3.0.4" + filesize@6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.0.1.tgz#f850b509909c7c86f7e450ea19006c31c2ed3d2f" @@ -5858,9 +5693,9 @@ find-cache-dir@^2.1.0: pkg-dir "^3.0.0" find-cache-dir@^3.2.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.0.tgz#4d74ed1fe9ef1731467ca24378e8f8f5c8b6ed11" - integrity sha512-PtXtQb7IrD8O+h6Cq1dbpJH5NzD8+9keN1zZ0YlpDzl1PwXEJEBj6u1Xa92t1Hwluoozd9TNKul5Hi2iqpsWwg== + version "3.3.1" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880" + integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ== dependencies: commondir "^1.0.1" make-dir "^3.0.2" @@ -5896,25 +5731,30 @@ find-up@^3.0.0: dependencies: locate-path "^3.0.0" -firebase@^7.13.1: - version "7.13.1" - resolved "https://registry.yarnpkg.com/firebase/-/firebase-7.13.1.tgz#f9c05ef60341cf8f7796ad7b8f3181b31be6dcf5" - integrity sha512-v4Z7Wioy/7LMC8RJn1jNlOaUqLK7bUEva+Uf+qrbtFd7hM2rWLW+0IqHZBwPrQ5tI604uHj7IlhqAZEjm38AMw== +fingerprintjs2@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fingerprintjs2/-/fingerprintjs2-2.1.0.tgz#21dc3fee27d3b199056ef8eb873debccd8e06323" + integrity sha512-H1k/ESTD2rJ3liupyqWBPjZC+LKfCGixQzz/NDN4dkgbmG1bVFyMOh7luKSkVDoyfhgvRm62pviNMPI+eJTZcQ== + +firebase@^7.16.0: + version "7.16.0" + resolved "https://registry.yarnpkg.com/firebase/-/firebase-7.16.0.tgz#2d891b19add296239d47e64a7927e599d359bdf4" + integrity sha512-fYimLYkY0SS/jv4+ZnSp5u2+QdtwsTtLwPUfmWiKQnjqas1M5mqhQr3QB7vPQuSANhC3UJZZ5KPxLbFomMJLcA== dependencies: - "@firebase/analytics" "0.3.0" - "@firebase/app" "0.6.0" - "@firebase/app-types" "0.6.0" - "@firebase/auth" "0.14.1" - "@firebase/database" "0.5.24" - "@firebase/firestore" "1.13.0" - "@firebase/functions" "0.4.38" - "@firebase/installations" "0.4.6" - "@firebase/messaging" "0.6.10" - "@firebase/performance" "0.2.36" - "@firebase/polyfill" "0.3.33" - "@firebase/remote-config" "0.1.17" - "@firebase/storage" "0.3.30" - "@firebase/util" "0.2.43" + "@firebase/analytics" "0.3.9" + "@firebase/app" "0.6.8" + "@firebase/app-types" "0.6.1" + "@firebase/auth" "0.14.8" + "@firebase/database" "0.6.7" + "@firebase/firestore" "1.16.0" + "@firebase/functions" "0.4.48" + "@firebase/installations" "0.4.14" + "@firebase/messaging" "0.6.20" + "@firebase/performance" "0.3.9" + "@firebase/polyfill" "0.3.36" + "@firebase/remote-config" "0.1.25" + "@firebase/storage" "0.3.38" + "@firebase/util" "0.2.50" flat-cache@^2.0.1: version "2.0.1" @@ -5926,9 +5766,9 @@ flat-cache@^2.0.1: write "1.0.3" flatted@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08" - integrity sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg== + version "2.0.2" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" + integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== flatten@^1.0.2: version "1.0.3" @@ -5951,11 +5791,9 @@ follow-redirects@1.5.10: debug "=3.1.0" follow-redirects@^1.0.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.10.0.tgz#01f5263aee921c6a54fb91667f08f4155ce169eb" - integrity sha512-4eyLK6s6lH32nOvLLwlIOnr9zrL8Sm+OvW4pVTJNoXeGzYIkHVf+pADQi+OJ0E67hiuSLezPVPyBcIZO50TmmQ== - dependencies: - debug "^3.0.0" + version "1.12.1" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.12.1.tgz#de54a6205311b93d60398ebc01cf7015682312b6" + integrity sha512-tmRv0AVuR7ZyouUHLeNSiO6pqulF7dYa3s19c6t+wz9LD69/uSzdMxJ2S91nTI9U3rt/IldxpzMOFejp6f0hjg== for-in@^0.1.3: version "0.1.8" @@ -6054,13 +5892,6 @@ fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" -fs-minipass@^1.2.5: - version "1.2.7" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" - integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== - dependencies: - minipass "^2.6.0" - fs-minipass@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" @@ -6083,19 +5914,24 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@2.1.2, fsevents@~2.1.2: +fsevents@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805" integrity sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA== fsevents@^1.2.7: - version "1.2.11" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.11.tgz#67bf57f4758f02ede88fb2a1712fef4d15358be3" - integrity sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw== + version "1.2.13" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" + integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== dependencies: bindings "^1.5.0" nan "^2.12.1" +fsevents@~2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" + integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== + fstream@^1.0.0, fstream@^1.0.12: version "1.0.12" resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045" @@ -6111,7 +5947,7 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== -function.prototype.name@^1.1.1, function.prototype.name@^1.1.2: +function.prototype.name@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.2.tgz#5cdf79d7c05db401591dfde83e3b70c5123e9a45" integrity sha512-C8A+LlHBJjB2AdcRPorc5JvJ5VUoWlXdEHLOJdCI7kjHEtGTpHQUiqMvCIKUwIsGwZX2jZJy761AXsn356bJQg== @@ -6166,11 +6002,6 @@ get-caller-file@^2.0.1: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-node-dimensions@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/get-node-dimensions/-/get-node-dimensions-1.2.1.tgz#fb7b4bb57060fb4247dd51c9d690dfbec56b0823" - integrity sha512-2MSPMu7S1iOTL+BOa6K1S62hB2zUAYNF/lV0gSVlOaacd087lc6nR1H1r0e3B1CerTo+RceOmi1iJW+vp21xcQ== - get-own-enumerable-property-symbols@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" @@ -6209,9 +6040,9 @@ glob-parent@^3.1.0: path-dirname "^1.0.0" glob-parent@^5.0.0, glob-parent@~5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2" - integrity sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw== + version "5.1.1" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" + integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== dependencies: is-glob "^4.0.1" @@ -6220,7 +6051,7 @@ glob-to-regexp@^0.3.0: resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= -glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@~7.1.1: +glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@~7.1.1: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== @@ -6254,9 +6085,9 @@ globals@^11.1.0: integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^12.1.0: - version "12.3.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-12.3.0.tgz#1e564ee5c4dded2ab098b0f88f24702a3c56be13" - integrity sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw== + version "12.4.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" + integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== dependencies: type-fest "^0.8.1" @@ -6285,53 +6116,34 @@ globby@^6.1.0: pinkie-promise "^2.0.0" globule@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/globule/-/globule-1.3.1.tgz#90a25338f22b7fbeb527cee63c629aea754d33b9" - integrity sha512-OVyWOHgw29yosRHCHo7NncwR1hW5ew0W/UrvtwvjefVJeQ26q4/8r8FmPsSF1hJ93IgWkyv16pCTz6WblMzm/g== + version "1.3.2" + resolved "https://registry.yarnpkg.com/globule/-/globule-1.3.2.tgz#d8bdd9e9e4eef8f96e245999a5dee7eb5d8529c4" + integrity sha512-7IDTQTIu2xzXkT+6mlluidnWo+BypnbSoEVVQCGfzqnl5Ik8d3e1d4wycb8Rj9tWW+Z39uPWsdlquqiqPCd/pA== dependencies: glob "~7.1.1" - lodash "~4.17.12" + lodash "~4.17.10" minimatch "~3.0.2" graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2: - version "4.2.3" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" - integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== + version "4.2.4" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" + integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== graphql-tag@^2.4.2: - version "2.10.3" - resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.10.3.tgz#ea1baba5eb8fc6339e4c4cf049dabe522b0edf03" - integrity sha512-4FOv3ZKfA4WdOKJeHdz6B3F/vxBLSgmBcGeAFPf4n1F64ltJUvOOerNj0rsJxONQGdhUMynQIvd6LzB+1J5oKA== + version "2.10.4" + resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.10.4.tgz#2f301a98219be8b178a6453bb7e33b79b66d8f83" + integrity sha512-O7vG5BT3w6Sotc26ybcvLKNTdfr4GfsIVMD+LdYqXCeJIYPRyp8BIsDOUtxw7S1PYvRw5vH3278J2EDezR6mfA== -graphql@^14.6.0: - version "14.6.0" - resolved "https://registry.yarnpkg.com/graphql/-/graphql-14.6.0.tgz#57822297111e874ea12f5cd4419616930cd83e49" - integrity sha512-VKzfvHEKybTKjQVpTFrA5yUq2S9ihcZvfJAtsDBBCuV6wauPu1xl/f9ehgVf0FcEJJs4vz6ysb/ZMkGigQZseg== - dependencies: - iterall "^1.2.2" +graphql@^15.3.0: + version "15.3.0" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.3.0.tgz#3ad2b0caab0d110e3be4a5a9b2aa281e362b5278" + integrity sha512-GTCJtzJmkFLWRfFJuoo9RWWa/FfamUHgiFosxi/X1Ani4AVWbeyBenZTNX6dM+7WSbbFfTo/25eh0LLkwHMw2w== growly@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= -grpc@1.24.2: - version "1.24.2" - resolved "https://registry.yarnpkg.com/grpc/-/grpc-1.24.2.tgz#76d047bfa7b05b607cbbe3abb99065dcefe0c099" - integrity sha512-EG3WH6AWMVvAiV15d+lr+K77HJ/KV/3FvMpjKjulXHbTwgDZkhkcWbwhxFAoTdxTkQvy0WFcO3Nog50QBbHZWw== - dependencies: - "@types/bytebuffer" "^5.0.40" - lodash.camelcase "^4.3.0" - lodash.clone "^4.5.0" - nan "^2.13.2" - node-pre-gyp "^0.14.0" - protobufjs "^5.0.3" - -gud@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/gud/-/gud-1.0.0.tgz#a489581b17e6a70beca9abe3ae57de7a499852c0" - integrity sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw== - gzip-size@5.1.1, gzip-size@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274" @@ -6340,15 +6152,10 @@ gzip-size@5.1.1, gzip-size@^5.1.1: duplexer "^0.1.1" pify "^4.0.1" -hammerjs@^2.0.8: - version "2.0.8" - resolved "https://registry.yarnpkg.com/hammerjs/-/hammerjs-2.0.8.tgz#04ef77862cff2bb79d30f7692095930222bf60f1" - integrity sha1-BO93hiz/K7edMPdpIJWTAiK/YPE= - handle-thing@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.0.tgz#0e039695ff50c93fc288557d696f3c1dc6776754" - integrity sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ== + version "2.0.1" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" + integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== har-schema@^2.0.0: version "2.0.0" @@ -6434,12 +6241,13 @@ has@^1.0.0, has@^1.0.3: function-bind "^1.1.1" hash-base@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" - integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg= + version "3.1.0" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" hash.js@^1.0.0, hash.js@^1.0.3: version "1.1.7" @@ -6480,12 +6288,12 @@ hmac-drbg@^1.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -hoist-non-react-statics@^2.3.1: +hoist-non-react-statics@^2.1.1: version "2.5.5" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz#c5903cf409c0dfd908f388e619d86b9c1174cb47" integrity sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw== -hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.0: +hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== @@ -6493,9 +6301,9 @@ hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.1.0, hoist-non-react- react-is "^16.7.0" hosted-git-info@^2.1.4: - version "2.8.7" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.7.tgz#4d2e0d5248e1cfabc984b0f6a6d75fe36e679511" - integrity sha512-ChkjQtKJ3GI6SsI4O5jwr8q8EPrWCnxuc4Tbx+vRI5x6mDOpjKKltNo1lRlszw3xwgTOSns1ZRBiMmmwpcvLxg== + version "2.8.8" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" + integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== hpack.js@^2.1.6: version "2.1.6" @@ -6537,19 +6345,19 @@ html-encoding-sniffer@^1.0.2: whatwg-encoding "^1.0.1" html-entities@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" - integrity sha1-DfKTUfByEWNRXfueVUPl9u7VFi8= + version "1.3.1" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.3.1.tgz#fb9a1a4b5b14c5daba82d3e34c6ae4fe701a0e44" + integrity sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA== html-escaper@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.0.tgz#71e87f931de3fe09e56661ab9a29aadec707b491" - integrity sha512-a4u9BeERWGu/S8JiWEAQcdrg9v4QArtP9keViQjGMdff20fBdd8waotXaNmODqBe6uZ3Nafi7K/ho4gCQHV3Ig== + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== html-minifier-terser@^5.0.1: - version "5.0.4" - resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-5.0.4.tgz#e8cc02748acb983bd7912ea9660bd31c0702ec32" - integrity sha512-fHwmKQ+GzhlqdxEtwrqLT7MSuheiA+rif5/dZgbz3GjoMXJzcRzy1L9NXoiiyxrnap+q5guSiv8Tz5lrh9g42g== + version "5.1.1" + resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz#922e96f1f3bb60832c2634b79884096389b1f054" + integrity sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg== dependencies: camel-case "^4.1.1" clean-css "^4.2.3" @@ -6627,10 +6435,10 @@ http-errors@~1.7.2: statuses ">= 1.5.0 < 2" toidentifier "1.0.0" -"http-parser-js@>=0.4.0 <0.4.11": - version "0.4.10" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.10.tgz#92c9c1374c35085f75db359ec56cc257cbb93fa4" - integrity sha1-ksnBN0w1CF912zWexWzCV8u5P6Q= +http-parser-js@>=0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.2.tgz#da2e31d237b393aae72ace43882dd7e270a8ff77" + integrity sha512-opCO9ASqg5Wy2FNo7A0sxy71yGbbkJJXLdgMK04Tcypw9jr2MgWbyubb0+WdmDmGnFflO7fRbqbaihh/ENDlRQ== http-proxy-middleware@0.19.1: version "0.19.1" @@ -6643,9 +6451,9 @@ http-proxy-middleware@0.19.1: micromatch "^3.1.10" http-proxy@^1.17.0: - version "1.18.0" - resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.0.tgz#dbe55f63e75a347db7f3d99974f2692a314a6a3a" - integrity sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ== + version "1.18.1" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== dependencies: eventemitter3 "^4.0.0" follow-redirects "^1.0.0" @@ -6665,32 +6473,39 @@ https-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= -hyphenate-style-name@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.3.tgz#097bb7fa0b8f1a9cf0bd5c734cf95899981a9b48" - integrity sha512-EcuixamT82oplpoJ2XU4pDtKGWQ7b00CD9f1ug9IaQ3p1bkHMiKCZ9ut9QDI6qsa6cpUuB+A/I+zLtdNK4n2DQ== +hyphenate-style-name@^1.0.1, hyphenate-style-name@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz#691879af8e220aea5750e8827db4ef62a54e361d" + integrity sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ== -i18next-browser-languagedetector@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/i18next-browser-languagedetector/-/i18next-browser-languagedetector-4.1.1.tgz#89656cd9b78bb92dc0c7e86c0d9606f3f15fabfa" - integrity sha512-akv0zurR/2KU7s1qaWkirY9FEEOT1TNsQaezEg8+1BLLQre7vylqb7tYoUgYqP/0/BEzXJgnoQnj+sh5xYFMhg== +i18next-browser-languagedetector@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/i18next-browser-languagedetector/-/i18next-browser-languagedetector-5.0.0.tgz#9e946ed2ea5514a636913fe020a32455e82946e3" + integrity sha512-ekeKbRvTOsSOABSEPHFqyb6Q37JagZXjkISgQKHP84t/VZRW/B3FMVz+tBNQDVdZLsEaOe8fuJpeZsw2TvWeVQ== dependencies: "@babel/runtime" "^7.5.5" -i18next@^19.3.4: - version "19.3.4" - resolved "https://registry.yarnpkg.com/i18next/-/i18next-19.3.4.tgz#512de50ee6075df825c646e1ce646a104f0938c9" - integrity sha512-ef7AxxutzdhBsBNugE9jgqsbwesG1muJOtZ9ZrPARPs/jXegViTp4+8JCeMp8BAyTIo1Zn0giqc8+2UpqFjU0w== +i18next@^19.6.0: + version "19.6.0" + resolved "https://registry.yarnpkg.com/i18next/-/i18next-19.6.0.tgz#3881b8e476e494dcdadcc8983e594080417fd82e" + integrity sha512-t+pA7iN2WtwS1UQc4PFKHDIO4HYZIl2Wo8UC8gqt70Q1qY50FflAF5vV4IbQEqy4DuK3I9wv3BL1PMvkk238WA== dependencies: - "@babel/runtime" "^7.3.1" + "@babel/runtime" "^7.10.1" -iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4, iconv-lite@~0.4.13: +iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" +iconv-lite@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.2.tgz#ce13d1875b0c3a674bd6a04b7f76b01b1b6ded01" + integrity sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + icss-utils@^4.0.0, icss-utils@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467" @@ -6720,13 +6535,6 @@ iferr@^0.1.5: resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= -ignore-walk@^3.0.1: - version "3.0.3" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37" - integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw== - dependencies: - minimatch "^3.0.4" - ignore@^3.3.5: version "3.3.10" resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" @@ -6742,6 +6550,13 @@ immer@1.10.0: resolved "https://registry.yarnpkg.com/immer/-/immer-1.10.0.tgz#bad67605ba9c810275d91e1c2a47d4582e98286d" integrity sha512-O3sR1/opvCDGLEVcvrGTMtLac8GJ5IwZC4puPrLuRj3l7ICKvkmA0vGuU9OW8mV9WIBRnaxp5GJh9IEAaNOoYg== +immutability-helper@^2.8.1: + version "2.9.1" + resolved "https://registry.yarnpkg.com/immutability-helper/-/immutability-helper-2.9.1.tgz#71c423ba387e67b6c6ceba0650572f2a2a6727df" + integrity sha512-r/RmRG8xO06s/k+PIaif2r5rGc3j4Yhc01jSBfwPCXDLYZwp/yxralI37Df1mwmuzcCsen/E/ITKcTEvc1PQmQ== + dependencies: + invariant "^2.2.0" + import-cwd@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9" @@ -6786,9 +6601,9 @@ imurmurhash@^0.1.4: integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= in-publish@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51" - integrity sha1-4g/146KvwmkDILbcVSaCqcf631E= + version "2.0.1" + resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.1.tgz#948b1a535c8030561cea522f73f78f4be357e00c" + integrity sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ== indent-string@^2.1.0: version "2.1.0" @@ -6820,7 +6635,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -6835,7 +6650,7 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= -ini@^1.3.5, ini@~1.3.0: +ini@^1.3.5: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== @@ -6848,7 +6663,15 @@ inline-style-prefixer@^2.0.0: bowser "^1.0.0" hyphenate-style-name "^1.0.1" -inquirer@7.0.4, inquirer@^7.0.0: +inline-style-prefixer@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/inline-style-prefixer/-/inline-style-prefixer-4.0.2.tgz#d390957d26f281255fe101da863158ac6eb60911" + integrity sha512-N8nVhwfYga9MiV9jWlwfdj1UDIaZlBFu4cJSJkIr7tZX7sHpHhGR5su1qdpW+7KPL8ISTvCIkcaFi/JdBknvPg== + dependencies: + bowser "^1.7.3" + css-in-js-utils "^2.0.0" + +inquirer@7.0.4: version "7.0.4" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.4.tgz#99af5bde47153abca23f5c7fc30db247f39da703" integrity sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ== @@ -6867,6 +6690,25 @@ inquirer@7.0.4, inquirer@^7.0.0: strip-ansi "^5.1.0" through "^2.3.6" +inquirer@^7.0.0: + version "7.3.2" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.2.tgz#25245d2e32dc9f33dbe26eeaada231daa66e9c7c" + integrity sha512-DF4osh1FM6l0RJc5YWYhSDB6TawiBRlbV9Cox8MWlidU218Tb7fm3lQTULyUJDfJ0tjbzl0W4q651mrCCEM55w== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.16" + mute-stream "0.0.8" + run-async "^2.4.0" + rxjs "^6.6.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + insert-css@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/insert-css/-/insert-css-2.0.0.tgz#eb5d1097b7542f4c79ea3060d3aee07d053880f4" @@ -6889,18 +6731,13 @@ internal-slot@^1.0.2: has "^1.0.3" side-channel "^1.0.2" -invariant@^2.2.2, invariant@^2.2.4: +invariant@^2.2.0, invariant@^2.2.2, invariant@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== dependencies: loose-envify "^1.0.0" -invert-kv@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" - integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= - invert-kv@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" @@ -6984,10 +6821,10 @@ is-buffer@^1.0.2, is-buffer@^1.1.5: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== -is-callable@^1.1.4, is-callable@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" - integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q== +is-callable@^1.1.4, is-callable@^1.1.5, is-callable@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.0.tgz#83336560b54a38e35e3a2df7afd0454d691468bb" + integrity sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw== is-ci@^2.0.0: version "2.0.0" @@ -7171,17 +7008,12 @@ is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" -is-promise@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" - integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= - -is-regex@^1.0.4, is-regex@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" - integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== +is-regex@^1.0.4, is-regex@^1.0.5, is-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.0.tgz#ece38e389e490df0dc21caea2bd596f987f767ff" + integrity sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw== dependencies: - has "^1.0.3" + has-symbols "^1.0.1" is-regexp@^1.0.0: version "1.0.0" @@ -7248,9 +7080,11 @@ is-wsl@^1.1.0: integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= is-wsl@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.1.1.tgz#4a1c152d429df3d441669498e2486d3596ebaf1d" - integrity sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog== + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" isarray@0.0.1: version "0.0.1" @@ -7279,7 +7113,7 @@ isobject@^3.0.0, isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= -isomorphic-fetch@2.2.1, isomorphic-fetch@^2.1.1: +isomorphic-fetch@2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" integrity sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk= @@ -7337,11 +7171,21 @@ istanbul-reports@^2.2.6: dependencies: html-escaper "^2.0.0" -iterall@^1.2.1, iterall@^1.2.2: +iterall@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.3.0.tgz#afcb08492e2915cbd8a0884eb93a8c94d0d72fea" integrity sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg== +jake@^10.6.1: + version "10.8.2" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.2.tgz#ebc9de8558160a66d82d0eadc6a2e58fbc500a7b" + integrity sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A== + dependencies: + async "0.9.x" + chalk "^2.4.2" + filelist "^1.0.1" + minimatch "^3.0.4" + jest-changed-files@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-24.9.0.tgz#08d8c15eb79a7fa3fc98269bc14b451ee82f8039" @@ -7542,9 +7386,9 @@ jest-mock@^24.0.0, jest-mock@^24.9.0: "@jest/types" "^24.9.0" jest-pnp-resolver@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz#ecdae604c077a7fbc70defb6d517c3c1c898923a" - integrity sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ== + version "1.2.2" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" + integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== jest-regex-util@^24.3.0, jest-regex-util@^24.9.0: version "24.9.0" @@ -7714,9 +7558,9 @@ jest-worker@^24.6.0, jest-worker@^24.9.0: supports-color "^6.1.0" jest-worker@^25.1.0: - version "25.1.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.1.0.tgz#75d038bad6fdf58eba0d2ec1835856c497e3907a" - integrity sha512-ZHhHtlxOWSxCoNOKHGbiLzXnl42ga9CxDr27H36Qn+15pQZd3R/F24jrmjDelw9j/iHUIWMWs08/u2QN50HHOg== + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.5.0.tgz#2611d071b79cea0f43ee57a3d118593ac1547db1" + integrity sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw== dependencies: merge-stream "^2.0.0" supports-color "^7.0.0" @@ -7730,9 +7574,19 @@ jest@24.9.0: jest-cli "^24.9.0" js-base64@^2.1.8: - version "2.5.2" - resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.5.2.tgz#313b6274dda718f714d00b3330bbae6e38e90209" - integrity sha512-Vg8czh0Q7sFBSUMWWArX/miJeBWYBPpdU/3M/DKSaekLMqrqVPaedp+5mZhie/r0lgrcaYBfwXatEew6gwgiQQ== + version "2.6.3" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.6.3.tgz#7afdb9b57aa7717e15d370b66e8f36a9cb835dc3" + integrity sha512-fiUvdfCaAXoQTHdKMgTvg6IkecXDcVz6V5rlftUTclF9IKBjMizvSdQaCl/z/6TApDeby5NL+axYou3i0mu1Pg== + +js-cookie@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-2.2.1.tgz#69e106dc5d5806894562902aa5baec3744e9b2b8" + integrity sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ== + +js-sha3@0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" + integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" @@ -7745,9 +7599,9 @@ js-tokens@^3.0.2: integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= js-yaml@^3.13.1: - version "3.13.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" - integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== + version "3.14.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" + integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A== dependencies: argparse "^1.0.7" esprima "^4.0.0" @@ -7887,17 +7741,10 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" -json5@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.1.tgz#81b6cb04e9ba496f1c7005d07b4368a2638f90b6" - integrity sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ== - dependencies: - minimist "^1.2.0" - json5@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.2.tgz#43ef1f0af9835dd624751a6b7fa48874fb2d608e" - integrity sha512-MoUOQ4WdiN3yxhm7NEVJSJrieAo5hNSLQ5sj05OTRHPL9HOBy8u4Bu88jsC1jvqAdN+E1bJmsUcZH+1HQxliqQ== + version "2.1.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" + integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== dependencies: minimist "^1.2.5" @@ -7924,13 +7771,18 @@ jsprim@^1.2.2: verror "1.10.0" jsx-ast-utils@^2.2.1, jsx-ast-utils@^2.2.3: - version "2.2.3" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.2.3.tgz#8a9364e402448a3ce7f14d357738310d9248054f" - integrity sha512-EdIHFMm+1BPynpKOpdPqiOsvnIrInRGJD7bzPZdPkjitQEqpdpUuFpq4T0npZFKTiB3RhWFdGN+oqOJIdhDhQA== + version "2.4.1" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz#1114a4c1209481db06c690c2b4f488cc665f657e" + integrity sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w== dependencies: - array-includes "^3.0.3" + array-includes "^3.1.1" object.assign "^4.1.0" +just-curry-it@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/just-curry-it/-/just-curry-it-3.1.0.tgz#ab59daed308a58b847ada166edd0a2d40766fbc5" + integrity sha512-mjzgSOFzlrurlURaHVjnQodyPNvrHrf1TbQP2XU9NSqBtHQPuHZ+Eb6TAJP7ASeJN9h9K0KXoRTs8u6ouHBKvg== + killable@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" @@ -7990,13 +7842,6 @@ lazy-cache@^1.0.3: resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" integrity sha1-odePw6UEdMuAhF07O24dpJpEbo4= -lcid@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" - integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= - dependencies: - invert-kv "^1.0.0" - lcid@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" @@ -8066,12 +7911,12 @@ load-json-file@^4.0.0: strip-bom "^3.0.0" loader-fs-cache@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/loader-fs-cache/-/loader-fs-cache-1.0.2.tgz#54cedf6b727e1779fd8f01205f05f6e88706f086" - integrity sha512-70IzT/0/L+M20jUlEqZhZyArTU6VKLRTYRDAYN26g4jfzpJqjipLL3/hgYpySqI9PwsVRHHFja0LfEmsx9X2Cw== + version "1.0.3" + resolved "https://registry.yarnpkg.com/loader-fs-cache/-/loader-fs-cache-1.0.3.tgz#f08657646d607078be2f0a032f8bd69dd6f277d9" + integrity sha512-ldcgZpjNJj71n+2Mf6yetz+c9bM4xpKtNds4LbqXzU/PTdeAX0g3ytnU1AJMEcTk2Lex4Smpe3Q/eCTsvUBxbA== dependencies: find-cache-dir "^0.1.1" - mkdirp "0.5.1" + mkdirp "^0.5.1" loader-runner@^2.4.0: version "2.4.0" @@ -8119,7 +7964,7 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" -lodash-es@^4.17.11: +lodash-es@^4.17.11, lodash-es@^4.17.15: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.15.tgz#21bd96839354412f23d7a10340e5eac6ee455d78" integrity sha512-rlrc3yU3+JNOpZ9zj5pQtxnx2THmvRykwL4Xlxoa8I9lHBlVbbyPhgyPMioxVZ4NqyxaVVtaJnzsyOidQIhyyQ== @@ -8134,10 +7979,10 @@ lodash.camelcase@^4.3.0: resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= -lodash.clone@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.clone/-/lodash.clone-4.5.0.tgz#195870450f5a13192478df4bc3d23d2dea1907b6" - integrity sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y= +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= lodash.escape@^4.0.1: version "4.0.1" @@ -8149,21 +7994,11 @@ lodash.flattendeep@^4.4.0: resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" integrity sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI= -lodash.get@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" - integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= - lodash.isequal@^4.0.0, lodash.isequal@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= -lodash.isplainobject@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" - integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= - lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" @@ -8189,32 +8024,37 @@ lodash.templatesettings@^4.0.0: dependencies: lodash._reinterpolate "^3.0.0" +lodash.throttle@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" + integrity sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ= + lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -"lodash@>=3.5 <5", lodash@^4.0.0, lodash@^4.15.0, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.5, lodash@~4.17.12: - version "4.17.15" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" - integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== +"lodash@>=3.5 <5", lodash@^4.0.0, lodash@^4.15.0, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.16, lodash@^4.17.5, lodash@~4.17.10, lodash@~4.17.4: + version "4.17.19" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" + integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== loglevel@^1.6.6: - version "1.6.7" - resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.7.tgz#b3e034233188c68b889f5b862415306f565e2c56" - integrity sha512-cY2eLFrQSAfVPhCgH1s7JI73tMbg9YC3v3+ZHVW67sBS7UxWzNEk/ZBbSfLykBWHp33dqqtOv82gjhKEi81T/A== + version "1.6.8" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.8.tgz#8a25fb75d092230ecd4457270d80b54e28011171" + integrity sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA== + +logrocket@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/logrocket/-/logrocket-1.0.9.tgz#0b4cab2535e0dcdf3c802eb604b109662a403d38" + integrity sha512-dsZh4zPRtZlPqmI3n4Sgkh5DeWo+rRh4NZhRm6BH9F3Jfv1WFDutISr1a5bQJb9rITvBbRgw3zTVeWjU71qyBg== long@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== -long@~3: - version "3.2.0" - resolved "https://registry.yarnpkg.com/long/-/long-3.2.0.tgz#d821b7138ca1cb581c172990ef14db200b5c474b" - integrity sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s= - -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.0, loose-envify@^1.3.1, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== @@ -8260,9 +8100,9 @@ make-dir@^2.0.0, make-dir@^2.1.0: semver "^5.6.0" make-dir@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.0.2.tgz#04a1acbf22221e1d6ef43559f43e05a90dbb4392" - integrity sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w== + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== dependencies: semver "^6.0.0" @@ -8302,6 +8142,11 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" +math-expression-evaluator@^1.2.14: + version "1.2.22" + resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.22.tgz#c14dcb3d8b4d150e5dcea9c68c8dad80309b0d5e" + integrity sha512-L0j0tFVZBQQLeEjmWOvDLoRciIY8gQGWahvkztXUal8jH8R5Rlqo9GCvgqvXcy9LQhEWdQCVvzqAbxgYNt4blQ== + md5.js@^1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" @@ -8316,6 +8161,11 @@ mdn-data@2.0.4: resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== +mdn-data@2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.6.tgz#852dc60fcaa5daa2e8cf6c9189c440ed3e042978" + integrity sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA== + media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" @@ -8387,9 +8237,9 @@ merge-stream@^2.0.0: integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== merge2@^1.2.3: - version "1.3.0" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.3.0.tgz#5b366ee83b2f1582c48f87e47cf1a9352103ca81" - integrity sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw== + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== methods@~1.1.2: version "1.1.2" @@ -8420,6 +8270,11 @@ micromatch@^3.1.10, micromatch@^3.1.4: snapdragon "^0.8.1" to-regex "^3.0.2" +microseconds@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/microseconds/-/microseconds-0.2.0.tgz#233b25f50c62a65d861f978a4a4f8ec18797dc39" + integrity sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA== + miller-rabin@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" @@ -8428,17 +8283,17 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -mime-db@1.43.0, "mime-db@>= 1.43.0 < 2": - version "1.43.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58" - integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ== +mime-db@1.44.0, "mime-db@>= 1.43.0 < 2": + version "1.44.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" + integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24: - version "2.1.26" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06" - integrity sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ== + version "2.1.27" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" + integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== dependencies: - mime-db "1.43.0" + mime-db "1.44.0" mime@1.6.0: version "1.6.0" @@ -8446,23 +8301,22 @@ mime@1.6.0: integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== mime@^2.4.4: - version "2.4.4" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5" - integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA== + version "2.4.6" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.6.tgz#e5b407c90db442f2beb5b162373d07b69affa4d1" + integrity sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA== mimic-fn@^2.0.0, mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -mini-create-react-context@^0.3.0: - version "0.3.2" - resolved "https://registry.yarnpkg.com/mini-create-react-context/-/mini-create-react-context-0.3.2.tgz#79fc598f283dd623da8e088b05db8cddab250189" - integrity sha512-2v+OeetEyliMt5VHMXsBhABoJ0/M4RCe7fatd/fBy6SMiKazUSEt3gxxypfnk2SHMkdBYvorHRoQxuGoiwbzAw== +mini-create-react-context@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/mini-create-react-context/-/mini-create-react-context-0.4.0.tgz#df60501c83151db69e28eac0ef08b4002efab040" + integrity sha512-b0TytUgFSbgFJGzJqXPKCFCBWigAjpjo+Fl7Vf7ZbKRDptszpppKxXH6DRXEABZ/gcEQczeb0iZ7JvL8e8jjCA== dependencies: - "@babel/runtime" "^7.4.0" - gud "^1.0.0" - tiny-warning "^1.0.2" + "@babel/runtime" "^7.5.5" + tiny-warning "^1.0.3" mini-css-extract-plugin@0.9.0: version "0.9.0" @@ -8474,14 +8328,12 @@ mini-css-extract-plugin@0.9.0: schema-utils "^1.0.0" webpack-sources "^1.1.0" -mini-store@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/mini-store/-/mini-store-2.0.0.tgz#0843c048d6942ce55e3e78b1b67fc063022b5488" - integrity sha512-EG0CuwpQmX+XL4QVS0kxNwHW5ftSbhygu1qxQH0pipugjnPkbvkalCdQbEihMwtQY6d3MTN+MS0q+aurs+RfLQ== +mini-store@^3.0.1: + version "3.0.5" + resolved "https://registry.yarnpkg.com/mini-store/-/mini-store-3.0.5.tgz#1b3808ee5e8173ecdcbf43b029137e9a72bb9fb8" + integrity sha512-A7f0+d7TEvjJNY2K+splh2OG3AhmoPoiF3VntlAcJuBzryMumOF9LAVzg8mRJPPbCkz7mlWQg9MCMQPR2auftA== dependencies: - hoist-non-react-statics "^2.3.1" - prop-types "^15.6.0" - react-lifecycles-compat "^3.0.4" + hoist-non-react-statics "^3.3.2" shallowequal "^1.0.2" minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: @@ -8501,17 +8353,7 @@ minimatch@3.0.4, minimatch@^3.0.4, minimatch@~3.0.2: dependencies: brace-expansion "^1.1.7" -minimist@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= - -minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" - integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= - -minimist@^1.2.5: +minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== @@ -8531,34 +8373,19 @@ minipass-flush@^1.0.5: minipass "^3.0.0" minipass-pipeline@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.2.tgz#3dcb6bb4a546e32969c7ad710f2c79a86abba93a" - integrity sha512-3JS5A2DKhD2g0Gg8x3yamO0pj7YeKGwVlDS90pF++kxptwx/F+B//roxf9SqYil5tQo65bijy+dAuAFZmYOouA== + version "1.2.3" + resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.3.tgz#55f7839307d74859d6e8ada9c3ebe72cec216a34" + integrity sha512-cFOknTvng5vqnwOpDsZTWhNll6Jf8o2x+/diplafmxpuIymAjzoOolZG0VvQf3V2HgqzJNhnuKHYp2BqDgz8IQ== dependencies: minipass "^3.0.0" -minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" - integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== - dependencies: - safe-buffer "^5.1.2" - yallist "^3.0.0" - minipass@^3.0.0, minipass@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.1.tgz#7607ce778472a185ad6d89082aa2070f79cedcd5" - integrity sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w== + version "3.1.3" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd" + integrity sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg== dependencies: yallist "^4.0.0" -minizlib@^1.2.1: - version "1.3.3" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" - integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== - dependencies: - minipass "^2.9.0" - mississippi@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" @@ -8591,24 +8418,22 @@ mixin-object@^2.0.1: for-in "^0.1.3" is-extendable "^0.1.1" -mkdirp@0.5.1, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= - dependencies: - minimist "0.0.8" - -mkdirp@^0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.3.tgz#5a514b7179259287952881e94410ec5465659f8c" - integrity sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg== +"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@~0.5.1: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== dependencies: minimist "^1.2.5" -moment@^2.24.0: - version "2.24.0" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b" - integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg== +moment-business-days@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/moment-business-days/-/moment-business-days-1.2.0.tgz#6172f9f38dbf443c2f859baabeabbd2935f63d65" + integrity sha512-QJlceLfMSxy/jZSOgJYCKeKw+qGYHj8W0jMa/fYruyoJ85+bJuLRiYv5DIaflyuRipmYRfD4kDlSwVYteLN+Jw== + +moment@^2.24.0, moment@^2.25.3: + version "2.27.0" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.27.0.tgz#8bff4e3e26a236220dfe3e36de756b6ebaa0105d" + integrity sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ== moo@^0.5.0: version "0.5.1" @@ -8661,9 +8486,30 @@ mute-stream@0.0.8: integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== nan@^2.12.1, nan@^2.13.2: - version "2.14.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" - integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== + version "2.14.1" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01" + integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw== + +nano-css@^5.2.1: + version "5.3.0" + resolved "https://registry.yarnpkg.com/nano-css/-/nano-css-5.3.0.tgz#9d3cd29788d48b6a07f52aa4aec7cf4da427b6b5" + integrity sha512-uM/9NGK9/E9/sTpbIZ/bQ9xOLOIHZwrrb/CRlbDHBU/GFS7Gshl24v/WJhwsVViWkpOXUmiZ66XO7fSB4Wd92Q== + dependencies: + css-tree "^1.0.0-alpha.28" + csstype "^2.5.5" + fastest-stable-stringify "^1.0.1" + inline-style-prefixer "^4.0.0" + rtl-css-js "^1.9.0" + sourcemap-codec "^1.4.1" + stacktrace-js "^2.0.0" + stylis "3.5.0" + +nano-time@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/nano-time/-/nano-time-1.0.0.tgz#b0554f69ad89e22d0907f7a12b0993a5d96137ef" + integrity sha1-sFVPaa2J4i0JB/ehKwmTpdlhN+8= + dependencies: + big-integer "^1.6.16" nanomatch@^1.2.9: version "1.2.13" @@ -8688,9 +8534,9 @@ natural-compare@^1.4.0: integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= nearley@^2.7.10: - version "2.19.1" - resolved "https://registry.yarnpkg.com/nearley/-/nearley-2.19.1.tgz#4af4006e16645ff800e9f993c3af039857d9dbdc" - integrity sha512-xq47GIUGXxU9vQg7g/y1o1xuKnkO7ev4nRWqftmQrLkfnE/FjRqDaGOUakM8XHPn/6pW3bGjU2wgoJyId90rqg== + version "2.19.4" + resolved "https://registry.yarnpkg.com/nearley/-/nearley-2.19.4.tgz#7518cbdd7d0e8e08b5f82841b9edb0126239c8b1" + integrity sha512-oqj3m4oqwKsN77pETa9IPvxHHHLW68KrDc2KYoWMUOhDlrNUo7finubwffQMBRnwNCOXc4kRxCZO0Rvx4L6Zrw== dependencies: commander "^2.19.0" moo "^0.5.0" @@ -8698,24 +8544,15 @@ nearley@^2.7.10: randexp "0.4.6" semver "^5.4.1" -needle@^2.2.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.3.2.tgz#3342dea100b7160960a450dc8c22160ac712a528" - integrity sha512-DUzITvPVDUy6vczKKYTnWc/pBZ0EnjMJnQ3y+Jo5zfKFimJs7S3HFCxCRZYB9FUZcrzUQr3WsmvZgddMEIZv6w== - dependencies: - debug "^3.2.6" - iconv-lite "^0.4.4" - sax "^1.2.4" - negotiator@0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== neo-async@^2.5.0, neo-async@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" - integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== next-tick@~1.0.0: version "1.0.0" @@ -8816,40 +8653,15 @@ node-notifier@^5.4.2: shellwords "^0.1.1" which "^1.3.0" -node-pre-gyp@^0.14.0: - version "0.14.0" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz#9a0596533b877289bcad4e143982ca3d904ddc83" - integrity sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA== - dependencies: - detect-libc "^1.0.2" - mkdirp "^0.5.1" - needle "^2.2.1" - nopt "^4.0.1" - npm-packlist "^1.1.6" - npmlog "^4.0.2" - rc "^1.2.7" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^4.4.2" +node-releases@^1.1.52, node-releases@^1.1.58: + version "1.1.59" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.59.tgz#4d648330641cec704bff10f8e4fe28e453ab8e8e" + integrity sha512-H3JrdUczbdiwxN5FuJPyCHnGHIFqQ0wWxo+9j1kAXAzqNMAHlo+4I/sYYxpyK0irQ73HgdiyzD32oqQDcU2Osw== -node-releases@^1.1.50: - version "1.1.50" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.50.tgz#803c40d2c45db172d0410e4efec83aa8c6ad0592" - integrity sha512-lgAmPv9eYZ0bGwUYAKlr8MG6K4CvWliWqnkcT2P8mMAgVrH3lqfBPorFlxiG1pHQnqmavJZ9vbMXUTNyMLbrgQ== - dependencies: - semver "^6.3.0" - -node-releases@^1.1.52: - version "1.1.52" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.52.tgz#bcffee3e0a758e92e44ecfaecd0a47554b0bcba9" - integrity sha512-snSiT1UypkgGt2wxPqS6ImEUICbNCMb31yaxWrOLXjhlt2z2/IBpaOxzONExqSm4y5oLnAqjjRWu+wsDzK5yNQ== - dependencies: - semver "^6.3.0" - -node-sass@^4.13.1: - version "4.13.1" - resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.13.1.tgz#9db5689696bb2eec2c32b98bfea4c7a2e992d0a3" - integrity sha512-TTWFx+ZhyDx1Biiez2nB0L3YrCZ/8oHagaDalbuBSlqXgUPsdkUSzJsVxeDO9LtPB49+Fh3WQl3slABo6AotNw== +node-sass@^4.14.1: + version "4.14.1" + resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.14.1.tgz#99c87ec2efb7047ed638fb4c9db7f3a42e2217b5" + integrity sha512-sjCuOlvGyCJS40R8BscF5vhVlQjNN069NtQ1gSxyK1u9iqvn6tf7O1R4GNowVZfiZUCRt5MmMs1xd+4V/7Yr0g== dependencies: async-foreach "^0.1.3" chalk "^1.1.1" @@ -8865,7 +8677,7 @@ node-sass@^4.13.1: node-gyp "^3.8.0" npmlog "^4.0.0" request "^2.88.0" - sass-graph "^2.2.4" + sass-graph "2.2.5" stdout-stream "^1.4.0" "true-case-path" "^1.0.2" @@ -8876,14 +8688,6 @@ node-sass@^4.13.1: dependencies: abbrev "1" -nopt@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" - integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= - dependencies: - abbrev "1" - osenv "^0.1.4" - normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" @@ -8926,27 +8730,6 @@ normalize-url@^3.0.0: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== -npm-bundled@^1.0.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.1.tgz#1edd570865a94cdb1bc8220775e29466c9fb234b" - integrity sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA== - dependencies: - npm-normalize-package-bin "^1.0.1" - -npm-normalize-package-bin@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" - integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== - -npm-packlist@^1.1.6: - version "1.4.8" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e" - integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A== - dependencies: - ignore-walk "^3.0.1" - npm-bundled "^1.0.1" - npm-normalize-package-bin "^1.0.1" - npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" @@ -8954,7 +8737,7 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" -"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.2: +"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== @@ -8991,7 +8774,7 @@ oauth-sign@~0.9.0: resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== -object-assign@4.x, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: +object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= @@ -9011,14 +8794,17 @@ object-hash@^2.0.1: integrity sha512-JPKn0GMu+Fa3zt3Bmr66JhokJU5BaNBIh4ZeTlaCBzrBsOeXzwcKKAK1tbLiPKgvwmPXsDvvLHoWh5Bm7ofIYg== object-inspect@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" - integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== + version "1.8.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0" + integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA== -object-is@^1.0.1, object-is@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.0.2.tgz#6b80eb84fe451498f65007982f035a5b445edec4" - integrity sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ== +object-is@^1.0.1, object-is@^1.0.2, object-is@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.2.tgz#c5d2e87ff9e119f78b7a088441519e2eec1573b6" + integrity sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" @@ -9047,14 +8833,13 @@ object.assign@^4.1.0: has-symbols "^1.0.0" object-keys "^1.0.11" -object.entries@^1.1.0, object.entries@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.1.tgz#ee1cf04153de02bb093fec33683900f57ce5399b" - integrity sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ== +object.entries@^1.1.0, object.entries@^1.1.1, object.entries@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.2.tgz#bc73f00acb6b6bb16c203434b10f9a7e797d3add" + integrity sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA== dependencies: define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - function-bind "^1.1.1" + es-abstract "^1.17.5" has "^1.0.3" object.fromentries@^2.0.2: @@ -9097,12 +8882,10 @@ obuf@^1.0.0, obuf@^1.1.2: resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== -omit.js@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/omit.js/-/omit.js-1.0.2.tgz#91a14f0eba84066dfa015bf30e474c47f30bc858" - integrity sha512-/QPc6G2NS+8d4L/cQhbk6Yit1WTB6Us2g84A7A/1+w9d/eRGHyEqC5kkQtHVoHZ5NFWGG7tUGgrhVZwgZanKrQ== - dependencies: - babel-runtime "^6.23.0" +omit.js@^2.0.0, omit.js@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/omit.js/-/omit.js-2.0.2.tgz#dd9b8436fab947a5f3ff214cb2538631e313ec2f" + integrity sha512-hJmu9D+bNB40YpL9jYebQl4lsTW6yEHRTroJzNLqQJYHm7c+NQnJGfZmIWh8S3q3KoaxV1aLhV6B3+0N0/kyJg== on-finished@~2.3.0: version "2.3.0" @@ -9130,18 +8913,10 @@ onetime@^5.1.0: dependencies: mimic-fn "^2.1.0" -open@^7.0.2: - version "7.0.2" - resolved "https://registry.yarnpkg.com/open/-/open-7.0.2.tgz#fb3681f11f157f2361d2392307548ca1792960e8" - integrity sha512-70E/pFTPr7nZ9nLDPNTcj3IVqnNvKuP4VsBmoKV9YGTnChe0mlS3C4qM7qKarhZ8rGaHKLfo+vBTHXDp6ZSyLQ== - dependencies: - is-docker "^2.0.0" - is-wsl "^2.1.1" - -open@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/open/-/open-7.0.3.tgz#db551a1af9c7ab4c7af664139930826138531c48" - integrity sha512-sP2ru2v0P290WFfv49Ap8MF6PkzGNnGlAwHweB4WR4mr5d2d0woiCluUeJ218w7/+PmoBy9JmYgD5A4mLcWOFA== +open@^7.0.2, open@^7.0.3: + version "7.0.4" + resolved "https://registry.yarnpkg.com/open/-/open-7.0.4.tgz#c28a9d315e5c98340bf979fdcb2e58664aa10d83" + integrity sha512-brSA+/yq+b08Hsr4c8fsEW2CRzk1BmfN3SAK/5VCHQ9bdoZJ4qa/+AfR0xHjlbbZUyPkUHs1b8x1RqdyZdkVqQ== dependencies: is-docker "^2.0.0" is-wsl "^2.1.1" @@ -9180,11 +8955,6 @@ optionator@^0.8.1, optionator@^0.8.3: type-check "~0.3.2" word-wrap "~1.2.3" -optjs@~3.2.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/optjs/-/optjs-3.2.2.tgz#69a6ce89c442a44403141ad2f9b370bd5bb6f4ee" - integrity sha1-aabOicRCpEQDFBrS+bNwvVu29O4= - original@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" @@ -9202,13 +8972,6 @@ os-homedir@^1.0.0: resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= -os-locale@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" - integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk= - dependencies: - lcid "^1.0.0" - os-locale@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" @@ -9223,7 +8986,7 @@ os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= -osenv@0, osenv@^0.1.4: +osenv@0: version "0.1.5" resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== @@ -9261,9 +9024,9 @@ p-limit@^1.1.0: p-try "^1.0.0" p-limit@^2.0.0, p-limit@^2.2.0, p-limit@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.2.tgz#61279b67721f5287aa1c13a9a7fbbc48c9291b1e" - integrity sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ== + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== dependencies: p-try "^2.0.0" @@ -9351,7 +9114,7 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -parse-asn1@^5.0.0: +parse-asn1@^5.0.0, parse-asn1@^5.1.5: version "5.1.5" resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.5.tgz#003271343da58dc94cace494faef3d2147ecea0e" integrity sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ== @@ -9516,9 +9279,9 @@ path-type@^4.0.0: integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== pbkdf2@^3.0.3: - version "3.0.17" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" - integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA== + version "3.1.1" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.1.tgz#cb8724b0fada984596856d1a6ebafd3584654b94" + integrity sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg== dependencies: create-hash "^1.1.2" create-hmac "^1.1.4" @@ -9526,20 +9289,20 @@ pbkdf2@^3.0.3: safe-buffer "^5.0.1" sha.js "^2.4.8" -performance-now@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" - integrity sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU= - performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= -picomatch@^2.0.4, picomatch@^2.0.7: - version "2.2.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.1.tgz#21bac888b6ed8601f831ce7816e335bc779f0a4a" - integrity sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA== +phone@^2.4.13: + version "2.4.13" + resolved "https://registry.yarnpkg.com/phone/-/phone-2.4.13.tgz#ca765ed62811ca28ae4759b5c0016dea717b3e6f" + integrity sha512-C7WWHU9NiMj/cdMcJ/dSrjfSxzdoE5o36JluKkgRtyUthr2EgpzV3bOkSL5/w5NB/OBA2+zOb+gek6i7+mcR0A== + +picomatch@^2.0.4, picomatch@^2.2.1: + version "2.2.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" + integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== pify@^2.0.0: version "2.3.0" @@ -9628,9 +9391,9 @@ popper.js@^1.15.0: integrity sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ== portfinder@^1.0.25: - version "1.0.25" - resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.25.tgz#254fd337ffba869f4b9d37edc298059cb4d35eca" - integrity sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg== + version "1.0.26" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.26.tgz#475658d56ca30bed72ac7f1378ed350bd1b64e70" + integrity sha512-Xi7mKxJHHMI3rIUrnm/jjUgwhbYMkp/XKEcZX3aG4BrumLpq3nmoQMX+ClYnDZnZ/New7IatC1no5RX0zo1vXQ== dependencies: async "^2.6.2" debug "^3.1.1" @@ -9973,9 +9736,9 @@ postcss-modules-local-by-default@^3.0.2: postcss-value-parser "^4.0.0" postcss-modules-scope@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.1.1.tgz#33d4fc946602eb5e9355c4165d68a10727689dba" - integrity sha512-OXRUPecnHCg8b9xWvldG/jUpRIGPNRka0r4D4j0ESUU2/5IOnpsjfPPmDprM3Ih8CgZ8FXjWqaniK5v4rWt3oQ== + version "2.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz#385cae013cc7743f5a7d7602d1073a89eaae62ee" + integrity sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ== dependencies: postcss "^7.0.6" postcss-selector-parser "^6.0.0" @@ -10270,10 +10033,10 @@ postcss-value-parser@^3.0.0: resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== -postcss-value-parser@^4.0.0, postcss-value-parser@^4.0.2: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz#651ff4593aa9eda8d5d0d66593a2417aeaeb325d" - integrity sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg== +postcss-value-parser@^4.0.0, postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" + integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1: version "2.0.1" @@ -10293,10 +10056,10 @@ postcss@7.0.21: source-map "^0.6.1" supports-color "^6.1.0" -postcss@^7, postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.23, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.5, postcss@^7.0.6: - version "7.0.27" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.27.tgz#cc67cdc6b0daa375105b7c424a85567345fc54d9" - integrity sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ== +postcss@^7, postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.23, postcss@^7.0.27, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6: + version "7.0.32" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.32.tgz#4310d6ee347053da3433db2be492883d62cec59d" + integrity sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw== dependencies: chalk "^2.4.2" source-map "^0.6.1" @@ -10335,11 +10098,6 @@ pretty-format@^24.9.0: ansi-styles "^3.2.0" react-is "^16.8.4" -private@^0.1.6, private@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" - integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== - process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" @@ -10365,24 +10123,17 @@ promise-polyfill@8.1.3: resolved "https://registry.yarnpkg.com/promise-polyfill/-/promise-polyfill-8.1.3.tgz#8c99b3cf53f3a91c68226ffde7bde81d7f904116" integrity sha512-MG5r82wBzh7pSKDRa9y+vllNHz3e3d4CNj1PQE4BQYxLme0gKYYBm9YENq+UkEikyZ0XbiGWxYlVw3Rl9O/U8g== -promise@^7.1.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" - integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== - dependencies: - asap "~2.0.3" - promise@^8.0.3: - version "8.0.3" - resolved "https://registry.yarnpkg.com/promise/-/promise-8.0.3.tgz#f592e099c6cddc000d538ee7283bb190452b0bf6" - integrity sha512-HeRDUL1RJiLhyA0/grn+PTShlBAcLuh/1BJGtrvjwbvRDCTLLMEz9rOGCV+R3vHY4MixIuoMEd9Yq/XvsTPcjw== + version "8.1.0" + resolved "https://registry.yarnpkg.com/promise/-/promise-8.1.0.tgz#697c25c3dfe7435dd79fcd58c38a135888eaf05e" + integrity sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q== dependencies: asap "~2.0.6" prompts@^2.0.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.3.1.tgz#b63a9ce2809f106fa9ae1277c275b167af46ea05" - integrity sha512-qIP2lQyCwYbdzcqHIUi2HAxiWixhoM9OdLCWf8txXsapC/X9YdsCoeyRIXE/GP+Q0J37Q7+XN/MFqbUa7IzXNA== + version "2.3.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.3.2.tgz#480572d89ecf39566d2bd3fe2c9fccb7c4c0b068" + integrity sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA== dependencies: kleur "^3.0.3" sisteransi "^1.0.4" @@ -10396,7 +10147,7 @@ prop-types-exact@^1.2.0: object.assign "^4.1.0" reflect.ownkeys "^0.2.0" -prop-types@15.x, prop-types@^15.0.0, prop-types@^15.5.10, prop-types@^15.5.6, prop-types@^15.5.7, prop-types@^15.5.8, prop-types@^15.5.9, prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2: +prop-types@15.x, prop-types@^15.0.0, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2: version "15.7.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== @@ -10405,20 +10156,10 @@ prop-types@15.x, prop-types@^15.0.0, prop-types@^15.5.10, prop-types@^15.5.6, pr object-assign "^4.1.1" react-is "^16.8.1" -protobufjs@^5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-5.0.3.tgz#e4dfe9fb67c90b2630d15868249bcc4961467a17" - integrity sha512-55Kcx1MhPZX0zTbVosMQEO5R6/rikNXd9b6RQK4KSPcrSIIwoXTtebIczUrXlwaSrbz4x8XUVThGPob1n8I4QA== - dependencies: - ascli "~1" - bytebuffer "~5" - glob "^7.0.5" - yargs "^3.10.0" - protobufjs@^6.8.6: - version "6.8.8" - resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.8.8.tgz#c8b4f1282fd7a90e6f5b109ed11c84af82908e7c" - integrity sha512-AAmHtD5pXgZfi7GMpllpO3q1Xw1OYldr+dMUlAnffGTAhqkg72WdmSY71uKBF/JuyiKs8psYbtKrhi0ASCD8qw== + version "6.10.0" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.10.0.tgz#b0698a2a91fc597e2dc625dcf3539ece9675c8fd" + integrity sha512-Hdz1+CXkrlmGDKkP6DczxysdnUyUuhM1mjeaydnBxOcjxQPbJldLZ8eGE1gX0UTsgv+0QkFfn6dioo5yt9XORw== dependencies: "@protobufjs/aspromise" "^1.1.2" "@protobufjs/base64" "^1.1.2" @@ -10430,8 +10171,8 @@ protobufjs@^6.8.6: "@protobufjs/path" "^1.1.2" "@protobufjs/pool" "^1.1.0" "@protobufjs/utf8" "^1.1.0" - "@types/long" "^4.0.0" - "@types/node" "^10.1.0" + "@types/long" "^4.0.1" + "@types/node" "^13.7.0" long "^4.0.0" proxy-addr@~2.0.5: @@ -10453,9 +10194,9 @@ pseudomap@^1.0.2: integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= psl@^1.1.28: - version "1.7.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.7.0.tgz#f1c4c47a8ef97167dea5d6bbf4816d736e884a3c" - integrity sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ== + version "1.8.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== public-encrypt@^4.0.0: version "4.0.3" @@ -10532,10 +10273,10 @@ query-string@^4.1.0: object-assign "^4.1.0" strict-uri-encode "^1.0.0" -query-string@^6.11.1: - version "6.11.1" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.11.1.tgz#ab021f275d463ce1b61e88f0ce6988b3e8fe7c2c" - integrity sha512-1ZvJOUl8ifkkBxu2ByVM/8GijMIPx+cef7u3yroO3Ogm4DOdZcF5dcrWTIlSHe3Pg/mtlt6/eFjObDfJureZZA== +query-string@^6.13.1: + version "6.13.1" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.13.1.tgz#d913ccfce3b4b3a713989fe6d39466d92e71ccad" + integrity sha512-RfoButmcK+yCta1+FuU8REvisx1oEzhMKwhLUNcepQTPGcNMp1sIqjnfCtfnvGSQZQEhaBHvccujtWoUV3TTbA== dependencies: decode-uri-component "^0.2.0" split-on-first "^1.0.0" @@ -10556,7 +10297,12 @@ querystringify@^2.1.1: resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.1.tgz#60e5a5fd64a7f8bfa4d2ab2ed6fdf4c85bad154e" integrity sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA== -raf@^3.1.0, raf@^3.4.0, raf@^3.4.1: +raf-schd@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/raf-schd/-/raf-schd-4.0.2.tgz#bd44c708188f2e84c810bf55fcea9231bcaed8a0" + integrity sha512-VhlMZmGy6A6hrkJWHLNTGl5gtgMUm+xfGza6wbwnE914yeQ5Ybm18vgM734RZhMgfw4tacUrWseGZlpUrrakEQ== + +raf@^3.4.0, raf@^3.4.1: version "3.4.1" resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA== @@ -10576,7 +10322,7 @@ randexp@0.4.6: discontinuous-range "1.0.0" ret "~0.1.10" -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== @@ -10606,376 +10352,335 @@ raw-body@2.4.0: iconv-lite "0.4.24" unpipe "1.0.0" -rc-align@^3.0.0-rc.0: - version "3.0.0-rc.1" - resolved "https://registry.yarnpkg.com/rc-align/-/rc-align-3.0.0-rc.1.tgz#32d1fac860d12bb85e9b8cafbbdef79f3f537674" - integrity sha512-GbofumhCUb7SxP410j/fbtR2M9Zml+eoZSdaliZh6R3NhfEj5zP4jcO3HG3S9C9KIcXQQtd/cwVHkb9Y0KU7Hg== +rc-align@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/rc-align/-/rc-align-4.0.1.tgz#0566de141a82d9a1923b7672c70bdb19dcde6e23" + integrity sha512-RQ5Fhxl0LW+zsxbY8dxAcpXdaHkHH2jzRSSpvBTS7G9LMK3T+WRcn4ovjg/eqAESM6TdTx0hfqWF2S1pO75jxQ== dependencies: + "@babel/runtime" "^7.10.1" classnames "2.x" dom-align "^1.7.0" - rc-util "^4.12.0" + rc-util "^5.0.1" resize-observer-polyfill "^1.5.1" -rc-animate@2.x, rc-animate@^2.10.0, rc-animate@^2.10.1, rc-animate@^2.10.2, rc-animate@^2.9.2, rc-animate@~2.10.2: - version "2.10.3" - resolved "https://registry.yarnpkg.com/rc-animate/-/rc-animate-2.10.3.tgz#163d5e29281a4ff82d53ee7918eeeac856b756f9" - integrity sha512-A9qQ5Y8BLlM7EhuCO3fWb/dChndlbWtY/P5QvPqBU7h4r5Q2QsvsbpTGgdYZATRDZbTRnJXXfVk9UtlyS7MBLg== +rc-animate@3.x, rc-animate@^3.0.0, rc-animate@^3.1.0, rc-animate@~3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/rc-animate/-/rc-animate-3.1.0.tgz#051b689c2c7194e4c8ae016d32a0e5f9de6c8baa" + integrity sha512-8FsM+3B1H+0AyTyGggY6JyVldHTs1CyYT8CfTmG/nGHHXlecvSLeICJhcKgRLjUiQlctNnRtB1rwz79cvBVmrw== dependencies: - babel-runtime "6.x" + "@ant-design/css-animation" "^1.7.2" classnames "^2.2.6" - css-animation "^1.3.2" - prop-types "15.x" raf "^3.4.0" - rc-util "^4.15.3" - react-lifecycles-compat "^3.0.4" + rc-util "^5.0.1" -rc-cascader@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/rc-cascader/-/rc-cascader-1.0.1.tgz#770de1e1fa7bd559aabd4d59e525819b8bc809b7" - integrity sha512-3mk33+YKJBP1XSrTYbdVLuCC73rUDq5STNALhvua5i8vyIgIxtb5fSl96JdWWq1Oj8tIBoHnCgoEoOYnIXkthQ== +rc-cascader@~1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/rc-cascader/-/rc-cascader-1.3.0.tgz#67925c7ac4b732fe06cabb3a9c91631c96d04ccf" + integrity sha512-wayuMo/dSZixvdpiRFZB4Q6A3omKRXQcJ3CxN02+PNiTEcRnK2KDqKUzrx7GwgMsyH5tz90lUZ91lLaEPNFv0A== dependencies: array-tree-filter "^2.1.0" rc-trigger "^4.0.0" - rc-util "^4.0.4" + rc-util "^5.0.1" warning "^4.0.1" -rc-checkbox@~2.1.6: - version "2.1.8" - resolved "https://registry.yarnpkg.com/rc-checkbox/-/rc-checkbox-2.1.8.tgz#eedd9ef9c2f3af5b3b8e5cde5254aa89ad1a880a" - integrity sha512-6qOgh0/by0nVNASx6LZnhRTy17Etcgav+IrI7kL9V9kcDZ/g7K14JFlqrtJ3NjDq/Kyn+BPI1st1XvbkhfaJeg== +rc-checkbox@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/rc-checkbox/-/rc-checkbox-2.3.0.tgz#b840f5ed08cd9cc24f3c485e7da13cb44a5228fe" + integrity sha512-rRv4W084iOO1BSllPoF4dA59DWBrbUQQbKYmjTuNh6nxihXmp9ymMo52rgs58MOzBdwAszbjYgb/MSwum0jIpA== dependencies: - babel-runtime "^6.23.0" - classnames "2.x" - prop-types "15.x" - react-lifecycles-compat "^3.0.4" + "@babel/runtime" "^7.10.1" + classnames "^2.2.1" -rc-collapse@~1.11.3: - version "1.11.8" - resolved "https://registry.yarnpkg.com/rc-collapse/-/rc-collapse-1.11.8.tgz#66a40089d469519e9424009ab1c927e214041d80" - integrity sha512-8EhfPyScTYljkbRuIoHniSwZagD5UPpZ3CToYgoNYWC85L2qCbPYF7+OaC713FOrIkp6NbfNqXsITNxmDAmxog== +rc-collapse@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/rc-collapse/-/rc-collapse-2.0.0.tgz#08c5942f82005b4342ced02d983581e4c41cd324" + integrity sha512-R5+Ge1uzwK9G1wZPRPhqQsed4FXTDmU0BKzsqfNBtZdk/wd+yey8ZutmJmSozYc5hQwjPkCvJHV7gOIRZKIlJg== dependencies: + "@ant-design/css-animation" "^1.7.2" classnames "2.x" - css-animation "1.x" - prop-types "^15.5.6" - rc-animate "2.x" + rc-animate "3.x" react-is "^16.7.0" - react-lifecycles-compat "^3.0.4" shallowequal "^1.1.0" -rc-dialog@~7.6.0: - version "7.6.1" - resolved "https://registry.yarnpkg.com/rc-dialog/-/rc-dialog-7.6.1.tgz#11545ccc0b945934fa76079726e0d853e52d705f" - integrity sha512-KUKf+2eZ4YL+lnXMG3hR4ZtIhC9glfH27NtTVz3gcoDIPAf3uUvaXVRNoDCiSi+OGKLyIb/b6EoidFh6nQC5Wg== +rc-dialog@~8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/rc-dialog/-/rc-dialog-8.1.0.tgz#393910963bb05ac19d6d136620bd09622f1d677a" + integrity sha512-vMVAtyxpnokh/okFcDQVLO6ymIXfoTKYKtqJ/hMtf+0WcvRn4VgVDBvGyEk5zd94k0RgwEze9o2kGw8SyjivZg== dependencies: - babel-runtime "6.x" - rc-animate "2.x" - rc-util "^4.16.1" + rc-animate "3.x" + rc-util "^5.0.1" -rc-drawer@~3.1.1: - version "3.1.3" - resolved "https://registry.yarnpkg.com/rc-drawer/-/rc-drawer-3.1.3.tgz#cbcb04d4c07f0b66f2ece11d847f4a1bd80ea0b7" - integrity sha512-2z+RdxmzXyZde/1OhVMfDR1e/GBswFeWSZ7FS3Fdd0qhgVdpV1wSzILzzxRaT481ItB5hOV+e8pZT07vdJE8kg== +rc-drawer@~4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/rc-drawer/-/rc-drawer-4.1.0.tgz#d7bf0bc030300b62d282bc04e053b9acad6b08b4" + integrity sha512-kjeQFngPjdzAFahNIV0EvEBoIKMOnvUsAxpkSPELoD/1DuR4nLafom5ryma+TIxGwkFJ92W6yjsMi1U9aiOTeQ== dependencies: + "@babel/runtime" "^7.10.1" classnames "^2.2.6" - rc-util "^4.16.1" - react-lifecycles-compat "^3.0.4" + rc-util "^5.0.1" -rc-dropdown@~3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rc-dropdown/-/rc-dropdown-3.0.2.tgz#e486b67f5e8e8b9e326426d5a80254621453d66a" - integrity sha512-T3XP4qL6xmkxn8z52YF2SEPoMHPpBiLf0Kty3mjNdRSyKnlu+0F+3bhDHf6gO1msmqrjURaz8sMNAFDcoFHHnw== +rc-dropdown@^3.1.0, rc-dropdown@~3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/rc-dropdown/-/rc-dropdown-3.1.2.tgz#5199bd532ac8519813a347d194ab4b0cee702333" + integrity sha512-s2W5jqvjTid5DxotGO5FlTBaQWeB+Bu7McQgjB8Ot3Wbl72AIKwLf11+lgbV4mA2vWC1H8DKyn6SW9TKLTi0xg== dependencies: - babel-runtime "^6.26.0" + "@babel/runtime" "^7.10.1" classnames "^2.2.6" rc-trigger "^4.0.0" -rc-field-form@~1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/rc-field-form/-/rc-field-form-1.1.1.tgz#73f6a2d414005453bb70240abf39247a35b6ae18" - integrity sha512-nS/4BZ+Ikzk5/AYRZn3iGsJKJMBa/IQbe4bxYd/u1u5GMs630tHnKimxRJ5U/emdC1ZbVG3YahlSRin+1hKikA== +rc-field-form@~1.5.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/rc-field-form/-/rc-field-form-1.5.1.tgz#a2f7cbb65a9421e2211abbc8288602701c73efca" + integrity sha512-h/v/5/iYf4DEZvYfxvmkCS6N2PNm2LW2Ha6oDBglWDNA0TcOFCeIWSq8q+r/Pyq/EHA55iGye4ezhKLzOUgvJg== dependencies: "@babel/runtime" "^7.8.4" async-validator "^3.0.3" - rc-util "^4.17.0" - warning "^4.0.3" + rc-util "^5.0.0" -rc-hammerjs@~0.6.0: - version "0.6.9" - resolved "https://registry.yarnpkg.com/rc-hammerjs/-/rc-hammerjs-0.6.9.tgz#9a4ddbda1b2ec8f9b9596091a6a989842a243907" - integrity sha512-4llgWO3RgLyVbEqUdGsDfzUDqklRlQW5VEhE3x35IvhV+w//VPRG34SBavK3D2mD/UaLKaohgU41V4agiftC8g== +rc-input-number@~5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/rc-input-number/-/rc-input-number-5.1.0.tgz#64da7d8c24ad0c5603d32faba22fd25733d6f96a" + integrity sha512-jh27NecKJaqooeK54JLGICgOmITwQ6fh4EW+pEgoD/T1JPFtkBer24q/U62dFEIFP8Jy7oWhxjYMe7LrGTYkHQ== dependencies: - babel-runtime "6.x" - hammerjs "^2.0.8" - prop-types "^15.5.9" - -rc-input-number@~4.5.4: - version "4.5.6" - resolved "https://registry.yarnpkg.com/rc-input-number/-/rc-input-number-4.5.6.tgz#0d52762b0ac39432256e2c6c5c836102f9797c46" - integrity sha512-AXbL4gtQ1mSQnu6v/JtMv3UbGRCzLvQznmf0a7U/SAtZ8+dCEAqD4JpJhkjv73Wog53eRYhw4l7ApdXflc9ymg== - dependencies: - babel-runtime "6.x" classnames "^2.2.0" - prop-types "^15.5.7" - rc-util "^4.5.1" - rmc-feedback "^2.0.0" + rc-util "^5.0.1" -rc-mentions@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/rc-mentions/-/rc-mentions-1.0.1.tgz#4a82b5011ccd3f0008f69f3b2e29ab8c0d91b17f" - integrity sha512-EgXFYsNHk44ifwDcbtd3zX7rJc3lHplfVEVEf8oxZeeyyIzFD0GLs0Z0LWHNs6Gm4wTAHvcR0j4Pd5M7fLtBoA== +rc-mentions@~1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/rc-mentions/-/rc-mentions-1.4.0.tgz#6b7a2770ec02a5c0265d459a3385a23913efcc61" + integrity sha512-DIcjQZNerCZ50tnDnL6P9mpNmlGc9VFrSjXh55RzkAZOTelf061T7ZbYv0bYeSdohvAwYNr4gt3/Pe79AUsjLw== dependencies: + "@babel/runtime" "^7.10.1" classnames "^2.2.6" rc-menu "^8.0.1" - rc-trigger "^4.0.0" - rc-util "^4.6.0" + rc-textarea "^0.3.0" + rc-trigger "^4.3.0" + rc-util "^5.0.1" -rc-menu@^8.0.1, rc-menu@~8.0.1: - version "8.0.2" - resolved "https://registry.yarnpkg.com/rc-menu/-/rc-menu-8.0.2.tgz#ce8dacad615c4cadb47c018be3a0791248b04d14" - integrity sha512-0zae6+LVQf+XTBepSMwwn2Wu+CvRf0eAVh62xl0UcjFBvyA0uGz+dAE0SVR6oUA0q9X+/G14CV1ItZFdwaP6/g== +rc-menu@^8.0.1, rc-menu@^8.2.1, rc-menu@~8.5.0: + version "8.5.0" + resolved "https://registry.yarnpkg.com/rc-menu/-/rc-menu-8.5.0.tgz#bf1fff9855d5554bf95b84698ca3ff4724c9b0c6" + integrity sha512-zEf3gKcdEKrI2/GpotOyIuVqrqEEJLLb+bLBTud+5b6Y70xwUH8IZvK6kXdHdqEnJGEZmq5NIy8Ufcr+HOYGxQ== dependencies: + "@babel/runtime" "^7.10.1" classnames "2.x" - mini-store "^2.0.0" - rc-animate "^2.10.1" - rc-trigger "^4.0.0" - rc-util "^4.13.0" + mini-store "^3.0.1" + omit.js "^2.0.0" + rc-animate "^3.1.0" + rc-trigger "^4.2.0" + rc-util "^5.0.1" resize-observer-polyfill "^1.5.0" - scroll-into-view-if-needed "^2.2.20" shallowequal "^1.1.0" -rc-notification@~4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/rc-notification/-/rc-notification-4.0.0.tgz#ffe59783d6738003972dde8b9658f1acd469cd2c" - integrity sha512-In9FimkJY+JSIq3/eopPfBpQQr2Zugq5i9Aw9vdiNCGCsAsSO9bGq2dPsn8bamOydNrhc3djljGfmxUUMbcZnA== +rc-notification@~4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/rc-notification/-/rc-notification-4.4.0.tgz#192d082cd6e2995705f43c6929162631c71e3db1" + integrity sha512-IDeNAFGVeOsy1tv4zNVqMAXB9tianR80ewQbtObaAQfjwAjWfONdqdyjFkEU6nc6UQhSUYA5OcTGb7kwwbnh0g== dependencies: + "@babel/runtime" "^7.10.1" classnames "2.x" - rc-animate "2.x" - rc-util "^4.0.4" + rc-animate "3.x" + rc-util "^5.0.1" -rc-pagination@~2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/rc-pagination/-/rc-pagination-2.2.0.tgz#8daaab1b6ad664da2ddea842f86687b692eb775d" - integrity sha512-fXempMD/kvHu8tsiW70uPjn1pI4mdD62xFG9drcBh17gj5CbCjazrjpWS615RSauk3b2BBgIcAJzREAMvlAkFQ== +rc-pagination@~2.4.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/rc-pagination/-/rc-pagination-2.4.2.tgz#519aa52f254a1ab90829109f6930bd3b766419f5" + integrity sha512-fgLOU4x2LuUuBTLsY27rEgkWOQ5riJ3LCkB0/Jt1lfQvwMyw55bU6OtfjmIkyT/PRKQLcpCmLXSdV+mAsvFdYg== dependencies: + "@babel/runtime" "^7.10.1" classnames "^2.2.1" -rc-picker@~1.4.0: - version "1.4.2" - resolved "https://registry.yarnpkg.com/rc-picker/-/rc-picker-1.4.2.tgz#b7955b7690d913177948ba0fc0640cc307d18874" - integrity sha512-e1XDwpAjvK34I/R/DmcaFgIg/lQBO+J266Pe0+ItbrEivDFmfVKcd1anaIGB4T2Mu9vOyjp+vT+i9ohb9uMEOg== +rc-picker@~1.10.6: + version "1.10.7" + resolved "https://registry.yarnpkg.com/rc-picker/-/rc-picker-1.10.7.tgz#972430ffd9fa5ba72458751301028a10eea07228" + integrity sha512-UgMAi//vxYf437fCG4fRlHwcS365wjLju/G0UgRJalrbnDMxUhgZ5XLi9pGY0M9ZWQeCDe9eywr409dITXQXFA== dependencies: + "@babel/runtime" "^7.10.1" classnames "^2.2.1" moment "^2.24.0" rc-trigger "^4.0.0" - rc-util "^4.17.0" + rc-util "^5.0.1" shallowequal "^1.1.0" -rc-progress@~2.5.0: - version "2.5.2" - resolved "https://registry.yarnpkg.com/rc-progress/-/rc-progress-2.5.2.tgz#ab01ba4e5d2fa36fc9f6f058b10b720e7315560c" - integrity sha512-ajI+MJkbBz9zYDuE9GQsY5gsyqPF7HFioZEDZ9Fmc+ebNZoiSeSJsTJImPFCg0dW/5WiRGUy2F69SX1aPtSJgA== +rc-progress@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/rc-progress/-/rc-progress-3.0.0.tgz#cea324ce8fc31421cd815d94a4649a8a29f8f8db" + integrity sha512-dQv1KU3o6Vay604FMYMF4S0x4GNXAgXf1tbQ1QoxeIeQt4d5fUeB7Ri82YPu+G+aRvH/AtxYAlEcnxyVZ1/4Hw== dependencies: - babel-runtime "6.x" - prop-types "^15.5.8" + classnames "^2.2.6" -rc-rate@~2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/rc-rate/-/rc-rate-2.5.1.tgz#55fc5fd23ea9dcc72250b9a889803479f4842961" - integrity sha512-3iJkNJT8xlHklPCdeZtUZmJmRVUbr6AHRlfSsztfYTXVlHrv2TcPn3XkHsH+12j812WVB7gvilS2j3+ffjUHXg== +rc-rate@~2.8.2: + version "2.8.2" + resolved "https://registry.yarnpkg.com/rc-rate/-/rc-rate-2.8.2.tgz#d82d237d74fd4aef3e0581d2700b646cdd1cd8a2" + integrity sha512-f9T/D+ZwWQrWHkpidpQbnXpnVMGMC4eSRAkwuu88a8Qv1C/9LNc4AErazoh8tpnZBFqq19F3j0Glv+sDgkfEig== dependencies: + "@babel/runtime" "^7.10.1" classnames "^2.2.5" - prop-types "^15.5.8" - rc-util "^4.3.0" - react-lifecycles-compat "^3.0.4" + rc-util "^5.0.1" -rc-resize-observer@^0.1.2: - version "0.1.3" - resolved "https://registry.yarnpkg.com/rc-resize-observer/-/rc-resize-observer-0.1.3.tgz#097191f9c3ab186ed907b553ba6ef565df11c249" - integrity sha512-uzOQEwx83xdQSFOkOAM7x7GHIQKYnrDV4dWxtCxyG1BS1pkfJ4EvDeMfsvAJHSYkQXVBu+sgRHGbRtLG3qiuUg== +rc-resize-observer@^0.2.0, rc-resize-observer@^0.2.1, rc-resize-observer@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/rc-resize-observer/-/rc-resize-observer-0.2.3.tgz#8268284d1766d163240b1682661ae7b59bc4523d" + integrity sha512-dEPCGX15eRRnu+TNBIGyEghpzE24fTDW8pHdJPJS/kCR3lafFqBLqKzBgZW6pMUuM70/ZDyFQ0Kynx9kWsXRNw== dependencies: + "@babel/runtime" "^7.10.1" classnames "^2.2.1" - rc-util "^4.13.0" + rc-util "^5.0.0" resize-observer-polyfill "^1.5.1" -rc-resize-observer@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/rc-resize-observer/-/rc-resize-observer-0.2.1.tgz#4610acb8a0f2a84b5e8d45664964ac32b5d3df72" - integrity sha512-GENTRkL3lq05ilrjTxPpHUPrKTC9D7XqUGesSXgi/GyO4j/jKIjLPn7zuZOcJ5QmN5QGRe24IaVWPZHQPE6vLw== - dependencies: - classnames "^2.2.1" - rc-util "^4.14.0" - resize-observer-polyfill "^1.5.1" - -rc-select@^10.1.0, rc-select@~10.1.0: - version "10.1.7" - resolved "https://registry.yarnpkg.com/rc-select/-/rc-select-10.1.7.tgz#56b867bec059d904adf36576b7cb592386b19a57" - integrity sha512-ayFG4YtjJTrH5hv9ezqeyaUzDtzp/PcAberf/V6S5ocf6J4kdsIDjVDhTcJME1VTTtBA8XCJLhl/YriQFPY0Tw== +rc-select@^11.0.10, rc-select@^11.0.4: + version "11.0.10" + resolved "https://registry.yarnpkg.com/rc-select/-/rc-select-11.0.10.tgz#c3977233e5b83801ba63a4727a946c8808b9eeaa" + integrity sha512-6id8KhwapDrYcum1CS/ENwgS2nwoiikNr182Rux4F99SuQAKOVhHyAIuV1GoLlftLemV35Pl+WOS2LUDHLi8hA== dependencies: + "@babel/runtime" "^7.10.1" classnames "2.x" - rc-animate "^2.10.0" - rc-trigger "^4.0.0" - rc-util "^4.20.0" - rc-virtual-list "^1.1.0" + rc-animate "^3.0.0" + rc-trigger "^4.3.0" + rc-util "^5.0.1" + rc-virtual-list "^1.1.2" warning "^4.0.3" -rc-slider@~9.2.3: - version "9.2.4" - resolved "https://registry.yarnpkg.com/rc-slider/-/rc-slider-9.2.4.tgz#92e2b58c53def9921ae0fc2822727ab5785b9ed0" - integrity sha512-wSr7vz+WtzzGqsGU2rTQ4mmLz9fkuIDMPYMYm8ygYFvxQ2Rh4uRhOWHYI0R8krNK5k1bGycckYxmQqUIvLAh3w== +rc-slider@~9.3.0: + version "9.3.1" + resolved "https://registry.yarnpkg.com/rc-slider/-/rc-slider-9.3.1.tgz#444012f3b4847d592b167a9cee6a1a46779a6ef4" + integrity sha512-c52PWPyrfJWh28K6dixAm0906L3/4MUIxqrNQA4TLnC/Z+cBNycWJUZoJerpwSOE1HdM3XDwixCsmtFc/7aWlQ== dependencies: - babel-runtime "6.x" + "@babel/runtime" "^7.10.1" classnames "^2.2.5" rc-tooltip "^4.0.0" - rc-util "^4.0.4" + rc-util "^5.0.0" shallowequal "^1.1.0" - warning "^4.0.3" -rc-steps@~3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/rc-steps/-/rc-steps-3.5.0.tgz#36b2a7f1f49907b0d90363884b18623caf9fb600" - integrity sha512-2Vkkrpa7PZbg7qPsqTNzVDov4u78cmxofjjnIHiGB9+9rqKS8oTLPzbW2uiWDr3Lk+yGwh8rbpGO1E6VAgBCOg== +rc-steps@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/rc-steps/-/rc-steps-4.0.1.tgz#a0e52f951b4e370d0cd2df29ae87eb744431d0d1" + integrity sha512-6MuqunJDIZexZj7v5EcHiOF6Q7Xg53+mcxELiIROhvXatssfLxDESpRZJ3zLquecxRjq5epYt92X8xBJ653itg== dependencies: - babel-runtime "^6.23.0" + "@babel/runtime" "^7.10.2" classnames "^2.2.3" - lodash "^4.17.5" - prop-types "^15.5.7" + rc-util "^5.0.1" -rc-switch@~1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/rc-switch/-/rc-switch-1.9.0.tgz#ab2b878f2713c681358a453391976c9b95b290f7" - integrity sha512-Isas+egaK6qSk64jaEw4GgPStY4umYDbT7ZY93bZF1Af+b/JEsKsJdNOU2qG3WI0Z6tXo2DDq0kJCv8Yhu0zww== +rc-switch@~3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/rc-switch/-/rc-switch-3.2.0.tgz#aa36bb417409ff4cc7d542ec4381cb5d87cfedc1" + integrity sha512-WQZnRrWZ+KGh4Cd98FpP1ZgvMmebctoHzKAO2n1Xsry1FQBSGgIw4rQJRxET31VS/dR1LIKb5md/k0UzcXXc0g== dependencies: + "@babel/runtime" "^7.10.1" classnames "^2.2.1" - prop-types "^15.5.6" - react-lifecycles-compat "^3.0.4" + rc-util "^5.0.1" -rc-table@~7.3.0: - version "7.3.10" - resolved "https://registry.yarnpkg.com/rc-table/-/rc-table-7.3.10.tgz#4d8d6d6f21b9e7fd68249c56f3ecc54dec793b22" - integrity sha512-pvjvgyPJTDCtpNqjoVSvfhfKX/cHcVKRMSdNKTN/uv2chsMxZ5287cyx/0vIsyh45Vz0h3b8AgwpZTqWzsKaBg== +rc-table@~7.8.0: + version "7.8.4" + resolved "https://registry.yarnpkg.com/rc-table/-/rc-table-7.8.4.tgz#493e6e8ccd9f078a073f0f7cf46bbb02c55f74d7" + integrity sha512-+8JPFD4oGy/4/VdXsPE/12oEkopiZoIi4cS6DJGzjf2CjhrM7KevUOjrs0MhFlXZp/Pnb8qSKoVdVHN1JYtL7Q== dependencies: + "@babel/runtime" "^7.10.1" classnames "^2.2.5" - component-classes "^1.2.6" - lodash "^4.17.5" - mini-store "^2.0.0" - prop-types "^15.5.8" raf "^3.4.1" - rc-resize-observer "^0.1.2" - rc-util "^4.20.1" - react-lifecycles-compat "^3.0.2" + rc-resize-observer "^0.2.0" + rc-util "^5.0.0" shallowequal "^1.1.0" -rc-tabs@~10.1.1: - version "10.1.1" - resolved "https://registry.yarnpkg.com/rc-tabs/-/rc-tabs-10.1.1.tgz#847d8c2038842a3cb5f2e74935d0e38b85fce61e" - integrity sha512-dOFeaYil3d6zV3ZtGZWfRf7zwyqUQ48cl67/Y/03SsBWEdYgfZzlgjfHqmUT+V7L7CvhQ5lIQyYpj4EthkgKCg== +rc-tabs@~11.5.0: + version "11.5.4" + resolved "https://registry.yarnpkg.com/rc-tabs/-/rc-tabs-11.5.4.tgz#1fc3469605fc28d47fb64c582ec83f97113dbd5a" + integrity sha512-J7duEePQbF9G1VESfEDH05GYIa/5uS/tmMoTy4IXfohql/b/2mjR3YzKahxi0x/wQJovgBRrdfNQA5Ph99lwIw== dependencies: + "@babel/runtime" "^7.10.1" classnames "2.x" - lodash "^4.17.5" - rc-hammerjs "~0.6.0" - resize-observer-polyfill "^1.5.1" - warning "^4.0.3" + raf "^3.4.1" + rc-dropdown "^3.1.0" + rc-menu "^8.2.1" + rc-resize-observer "^0.2.1" + rc-trigger "^4.2.1" + rc-util "^5.0.0" -rc-tooltip@^4.0.0, rc-tooltip@~4.0.2: - version "4.0.3" - resolved "https://registry.yarnpkg.com/rc-tooltip/-/rc-tooltip-4.0.3.tgz#728b760863643ec2e85827a2e7fb28d961b3b759" - integrity sha512-HNyBh9/fPdds0DXja8JQX0XTIHmZapB3lLzbdn74aNSxXG1KUkt+GK4X1aOTRY5X9mqm4uUKdeFrn7j273H8gw== +rc-textarea@^0.3.0, rc-textarea@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/rc-textarea/-/rc-textarea-0.3.0.tgz#9860ef797e00717d8227d1ef4ee7895dd9358ddf" + integrity sha512-vrTPkPT6wrO7EI8ouLFZZLXA1pFVrVRCnkmyyf0yRComFbcH1ogmFEGu85CjVT96rQqAiQFOe0QV3nKopZOJow== dependencies: - rc-trigger "^4.0.0" + "@babel/runtime" "^7.10.1" + classnames "^2.2.1" + omit.js "^2.0.0" + rc-resize-observer "^0.2.3" -rc-tree-select@~3.1.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/rc-tree-select/-/rc-tree-select-3.1.2.tgz#d71d505071df80be01abd0dfcafd4c2cbd9cde24" - integrity sha512-6i+uCD7FnO7GEuAtE73GW23WntseFvfjhm8nHQR8rbb3pdvpUs/mz0ESgjVavdr4fvjXozI/g0PkjcRa5bgtLg== +rc-tooltip@^4.0.0, rc-tooltip@~4.2.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/rc-tooltip/-/rc-tooltip-4.2.1.tgz#c1a2d5017ee03a771a9301c0dfdb46dfdf8fef94" + integrity sha512-oykuaGsHg7RFvPUaxUpxo7ScEqtH61C66x4JUmjlFlSS8gSx2L8JFtfwM1D68SLBxUqGqJObtxj4TED75gQTiA== dependencies: - classnames "2.x" - rc-select "^10.1.0" - rc-tree "^3.1.0" - rc-util "^4.17.0" + rc-trigger "^4.2.1" -rc-tree@^3.1.0, rc-tree@~3.1.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/rc-tree/-/rc-tree-3.1.2.tgz#14aae3167a6189ff401082d8a17adb8d8df00843" - integrity sha512-iK5q8Fmr8iR1Q/qq6flJd2SeCZc/D7aZryFY2yoqEAE01cO3NmY3RIN20IXF0rET/7SuFRW7pq+ClU1VLLdPOQ== - dependencies: - classnames "2.x" - prop-types "^15.5.8" - rc-animate "^2.9.2" - rc-util "^4.11.0" - rc-virtual-list "^1.1.0" - react-lifecycles-compat "^3.0.4" - -rc-trigger@^4.0.0, rc-trigger@~4.0.0: +rc-tree-select@~4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/rc-trigger/-/rc-trigger-4.0.2.tgz#42fe7bdb6a5b34035e20fa9ebfad69ec948b56be" - integrity sha512-to5S1NhK10rWHIgQpoQdwIhuDc2Ok4R4/dh5NLrDt6C+gqkohsdBCYiPk97Z+NwGhRU8N+dbf251bivX8DkzQg== + resolved "https://registry.yarnpkg.com/rc-tree-select/-/rc-tree-select-4.0.2.tgz#78d0f071145f05b434743dad53ee4c8ebdd0c613" + integrity sha512-SqV0LgCdeW/YNbsG102eflwGTrg3+OrT2DbJ9MGLqF+luxLbekcOAZzOhcgmsUtI+PademEzcIt3UWhSsjqf1A== dependencies: - classnames "^2.2.6" - prop-types "15.x" - raf "^3.4.1" - rc-align "^3.0.0-rc.0" - rc-animate "^2.10.2" - rc-util "^4.20.0" + "@babel/runtime" "^7.10.1" + classnames "2.x" + rc-select "^11.0.4" + rc-tree "^3.6.0" + rc-util "^5.0.1" -rc-upload@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/rc-upload/-/rc-upload-3.0.0.tgz#1365a77405b2df82749e55bcc475ee0de9424370" - integrity sha512-GTmLJ2Habrgon26xwtF8nx1FBxu8KUjRC6QW/7a+NVZ6qXIo+s7HnjqwseuG42kz6xGCoSLNpHgIoHW55EwpxA== +rc-tree@^3.6.0, rc-tree@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/rc-tree/-/rc-tree-3.6.0.tgz#5b32b70c6323d6bd533c65930294fe652db58e5b" + integrity sha512-2Hy/F+zWuqF5vFlSqpcVXh9Ik2Dl6/tQcRks5EnK8UwXUOgav4+LVORCtdqy4KX7J94vz7d4xfiyWBye/gO1Xg== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "2.x" + rc-animate "^3.1.0" + rc-util "^5.0.0" + rc-virtual-list "^1.1.0" + +rc-trigger@^4.0.0, rc-trigger@^4.2.0, rc-trigger@^4.2.1, rc-trigger@^4.3.0, rc-trigger@~4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/rc-trigger/-/rc-trigger-4.3.0.tgz#94ea1851d123359716d1dc3030083c015a92ecfb" + integrity sha512-jnGNzosXmDdivMBjPCYe/AfOXTpJU2/xQ9XukgoXDQEoZq/9lcI1r7eUIfq70WlWpLxlUEqQktiV3hwyy6Nw9g== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.6" + raf "^3.4.1" + rc-align "^4.0.0" + rc-animate "^3.0.0" + rc-util "^5.0.1" + +rc-upload@~3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/rc-upload/-/rc-upload-3.2.0.tgz#251fc3c9105902e808600a414f368f285d63bfba" + integrity sha512-/vyOGVxl5QVM3ZE7s+GqYPbCLC/Q/vJq0sjdwnvJw01KvAR5kVOC4jbHEaU56dMss7PFGDfNzc8zO5bWYLDzVQ== dependencies: - babel-runtime "6.x" classnames "^2.2.5" -rc-util@^4.0.4, rc-util@^4.11.0, rc-util@^4.12.0, rc-util@^4.13.0, rc-util@^4.15.3, rc-util@^4.16.1, rc-util@^4.17.0, rc-util@^4.20.0, rc-util@^4.20.1, rc-util@^4.3.0, rc-util@^4.5.1, rc-util@^4.6.0, rc-util@^4.8.0, rc-util@^4.9.0: - version "4.20.1" - resolved "https://registry.yarnpkg.com/rc-util/-/rc-util-4.20.1.tgz#a5976eabfc3198ed9b8e79ffb8c53c231db36e77" - integrity sha512-EGlDg9KPN0POzmAR2hk9ZyFc3DmJIrXwlC8NoDxJguX2LTINnVqwadLIVauLfYgYISMiFYFrSHiFW+cqUhZ5dA== +rc-util@^5.0.0, rc-util@^5.0.1: + version "5.0.5" + resolved "https://registry.yarnpkg.com/rc-util/-/rc-util-5.0.5.tgz#d29d626edc931fbf8b45b4aa48fb9e44ce2300bd" + integrity sha512-zLIdNm6qz+hQbB5T1fmzHFFgPuRl3uB2eS2iLR/mewUWvgC3l7NzRYRVlHoCEEFVUkKEEsHuJXG1J52FInl5lA== dependencies: - add-dom-event-listener "^1.1.0" - babel-runtime "6.x" - prop-types "^15.5.10" react-is "^16.12.0" - react-lifecycles-compat "^3.0.4" shallowequal "^1.1.0" -rc-util@^4.14.0: - version "4.20.3" - resolved "https://registry.yarnpkg.com/rc-util/-/rc-util-4.20.3.tgz#c4d4ee6171cf685dc75572752a764310325888d3" - integrity sha512-NBBc9Ad5yGAVTp4jV+pD7tXQGqHxGM2onPSZFyVoJ5fuvRF+ZgzSjZ6RXLPE0pVVISRJ07h+APgLJPBcAeZQlg== - dependencies: - add-dom-event-listener "^1.1.0" - prop-types "^15.5.10" - react-is "^16.12.0" - react-lifecycles-compat "^3.0.4" - shallowequal "^1.1.0" - -rc-virtual-list@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/rc-virtual-list/-/rc-virtual-list-1.1.1.tgz#824a2c210729ca738e041b8da9e3347cc6650e40" - integrity sha512-1l2DFqvGMnCm6N5+zKaRnF294r3GKGvejdLIivdqbgMKwX+c1H+SftymdSKY92i6mDe7F0xg/JS6Q6Anu5/1pw== +rc-virtual-list@^1.1.0, rc-virtual-list@^1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/rc-virtual-list/-/rc-virtual-list-1.1.5.tgz#6edf7222830c7dd732f62698c8468b7f08ac8dec" + integrity sha512-roZ6HE5MNKaiop+Ic7jZS7xlMnXBLp0XBElsMbE4eEL3GnnnJAet2iXoT5wjKcKMXEVyVCD0L4yQozmH7+Kgxg== dependencies: classnames "^2.2.6" - rc-util "^4.8.0" + raf "^3.4.1" + rc-util "^5.0.0" -rc@^1.2.7: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== +react-apollo@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/react-apollo/-/react-apollo-3.1.5.tgz#36692d393c47e7ccc37f0a885c7cc5a8b4961c91" + integrity sha512-xOxMqxORps+WHrUYbjVHPliviomefOpu5Sh35oO3osuOyPTxvrljdfTLGCggMhcXBsDljtS5Oy4g+ijWg3D4JQ== dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -react-apollo@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/react-apollo/-/react-apollo-3.1.3.tgz#5d8540b401bba36173b63e6c5e75fa561960c63e" - integrity sha512-orCZNoAkgveaK5b75y7fw1MSqSHOU/Wuu9rRFOGmRQBSQVZjvV4DI+hj604rHmuN9+WDABxb5W48wTa0F/xNZQ== - dependencies: - "@apollo/react-common" "^3.1.3" - "@apollo/react-components" "^3.1.3" - "@apollo/react-hoc" "^3.1.3" - "@apollo/react-hooks" "^3.1.3" - "@apollo/react-ssr" "^3.1.3" + "@apollo/react-common" "^3.1.4" + "@apollo/react-components" "^3.1.5" + "@apollo/react-hoc" "^3.1.5" + "@apollo/react-hooks" "^3.1.5" + "@apollo/react-ssr" "^3.1.5" react-app-polyfill@^1.0.6: version "1.0.6" @@ -10997,10 +10702,23 @@ react-barcode@^1.4.0: jsbarcode "^3.8.0" prop-types "^15.6.2" -react-big-calendar@^0.24.1: - version "0.24.1" - resolved "https://registry.yarnpkg.com/react-big-calendar/-/react-big-calendar-0.24.1.tgz#96cde4c9cadfd63c80035f051e544094a235cf30" - integrity sha512-Jq6t7vGxCbcUHOUsjCZ5H90uuIoZ6eqaGgSO6uhj26nXLybXdNI09SU5dddsb2VhV57UUTPnoTS5lFUQjGBqpg== +react-beautiful-dnd@^13.0.0: + version "13.0.0" + resolved "https://registry.yarnpkg.com/react-beautiful-dnd/-/react-beautiful-dnd-13.0.0.tgz#f70cc8ff82b84bc718f8af157c9f95757a6c3b40" + integrity sha512-87It8sN0ineoC3nBW0SbQuTFXM6bUqM62uJGY4BtTf0yzPl8/3+bHMWkgIe0Z6m8e+gJgjWxefGRVfpE3VcdEg== + dependencies: + "@babel/runtime" "^7.8.4" + css-box-model "^1.2.0" + memoize-one "^5.1.1" + raf-schd "^4.0.2" + react-redux "^7.1.1" + redux "^4.0.4" + use-memo-one "^1.1.1" + +react-big-calendar@^0.26.0: + version "0.26.0" + resolved "https://registry.yarnpkg.com/react-big-calendar/-/react-big-calendar-0.26.0.tgz#a8b4d7262e5d7890c10c53ba23db8631a02ef788" + integrity sha512-TSyP+B+ZJhaj+em2brQzRCYip4Slx+7SM2Vf9SfmnMO1eWZr9DahEyy4LL+TOoF50BZXyzU5EaPqaxbuZ23xqw== dependencies: "@babel/runtime" "^7.1.5" clsx "^1.0.4" @@ -11010,10 +10728,17 @@ react-big-calendar@^0.24.1: lodash "^4.17.11" lodash-es "^4.17.11" memoize-one "^5.1.1" - prop-types "^15.6.2" + prop-types "^15.7.2" react-overlays "^2.0.0-0" uncontrollable "^7.0.0" +react-click-outside@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/react-click-outside/-/react-click-outside-3.0.1.tgz#6e77e84d2f17afaaac26dbad743cbbf909f5e24c" + integrity sha512-d0KWFvBt+esoZUF15rL2UBB7jkeAqLU8L/Ny35oLK6fW6mIbOv/ChD+ExF4sR9PD26kVx+9hNfD0FTIqRZEyRQ== + dependencies: + hoist-non-react-statics "^2.1.1" + react-dev-utils@^10.2.1: version "10.2.1" resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-10.2.1.tgz#f6de325ae25fa4d546d09df4bb1befdc6dd19c19" @@ -11044,7 +10769,7 @@ react-dev-utils@^10.2.1: strip-ansi "6.0.0" text-table "0.2.0" -react-dom@^16.13.1: +"react-dom@>= 16.3", react-dom@^16.13.1: version "16.13.1" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.13.1.tgz#c1bd37331a0486c078ee54c4740720993b2e0e7f" integrity sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag== @@ -11054,10 +10779,17 @@ react-dom@^16.13.1: prop-types "^15.6.2" scheduler "^0.19.1" +react-drag-listview@^0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/react-drag-listview/-/react-drag-listview-0.1.7.tgz#ab9384a08c4bfc2863d950d326f24e62ad2ffdda" + integrity sha512-mnnAj0liaHcONEi7CtiGnLJl6EHy5huHiAfZmhjl3Z0cg9XrQnF5eFK0WqHkX1G80ys9D6rtxr4M75lrnbQs1A== + dependencies: + prop-types "^15.5.8" + react-draggable@^4.0.0, react-draggable@^4.0.3: - version "4.2.0" - resolved "https://registry.yarnpkg.com/react-draggable/-/react-draggable-4.2.0.tgz#40cc5209082ca7d613104bf6daf31372cc0e1114" - integrity sha512-5wFq//gEoeTYprnd4ze8GrFc+Rbnx+9RkOMR3vk4EbWxj02U6L6T3yrlKeiw4X5CtjD2ma2+b3WujghcXNRzkw== + version "4.4.3" + resolved "https://registry.yarnpkg.com/react-draggable/-/react-draggable-4.4.3.tgz#0727f2cae5813e36b0e4962bf11b2f9ef2b406f3" + integrity sha512-jV4TE59MBuWm7gb6Ns3Q1mxX8Azffb7oTtDtBgFkxRvhDp38YAARmRplrj0+XGkhOJB5XziArX+4HUUABtyZ0w== dependencies: classnames "^2.2.5" prop-types "^15.6.0" @@ -11067,10 +10799,10 @@ react-error-overlay@^6.0.7: resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.7.tgz#1dcfb459ab671d53f660a991513cb2f0a0553108" integrity sha512-TAv1KJFh3RhqxNvhzxj6LeT5NWklP6rDr2a0jaTfsZ5wSZWHOGeqQyejUp3xxLfPt2UpyJEcVQB/zyPcmonNFA== -react-ga@^2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/react-ga/-/react-ga-2.7.0.tgz#24328f157f31e8cffbf4de74a3396536679d8d7c" - integrity sha512-AjC7UOZMvygrWTc2hKxTDvlMXEtbmA0IgJjmkhgmQQ3RkXrWR11xEagLGFGaNyaPnmg24oaIiaNPnEoftUhfXA== +react-ga@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/react-ga/-/react-ga-3.1.2.tgz#e13f211c51a2e5c401ea69cf094b9501fe3c51ce" + integrity sha512-OJrMqaHEHbodm+XsnjA6ISBEHTwvpFrxco65mctzl/v3CASMSLSyUkFqz9yYrPDKGBUfNQzKCjuMJwctjlWBbw== react-grid-gallery@^0.5.5: version "0.5.5" @@ -11091,25 +10823,25 @@ react-grid-layout@^0.18.3: react-draggable "^4.0.0" react-resizable "^1.9.0" -react-i18next@^11.3.4: - version "11.3.4" - resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-11.3.4.tgz#355df5fe5133e5e30302d166f529678100ffc968" - integrity sha512-IRZMD7PAM3C+fJNzRbyLNi1ZD0kc3Z3obBspJjEl+9H+ME41PhVor3BpdIqv/Rm7lUoGhMjmpu42J45ooJ61KA== +react-i18next@^11.7.0: + version "11.7.0" + resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-11.7.0.tgz#f27c4c237a274e007a48ac1210db83e33719908b" + integrity sha512-8tvVkpuxQlubcszZON+jmoCgiA9gCZ74OAYli9KChPhETtq8pJsANBTe9KRLRLmX3ubumgvidURWr0VvKz1tww== dependencies: "@babel/runtime" "^7.3.1" html-parse-stringify2 "2.0.1" -react-icons@^3.9.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-3.9.0.tgz#89a00f20a0e02e6bfd899977eaf46eb4624239d5" - integrity sha512-gKbYKR+4QsD3PmIHLAM9TDDpnaTsr3XZeK1NTAb6WQQ+gxEdJ0xuCgLq0pxXdS7Utg2AIpcVhM1ut/jlDhcyNg== +react-icons@^3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-3.10.0.tgz#6c217a2dde2e8fa8d293210023914b123f317297" + integrity sha512-WsQ5n1JToG9VixWilSo1bHv842Cj5aZqTGiS3Ud47myF6aK7S/IUY2+dHcBdmkQcCFRuHsJ9OMUI0kTDfjyZXQ== dependencies: camelcase "^5.0.0" -react-image-file-resizer@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/react-image-file-resizer/-/react-image-file-resizer-0.2.1.tgz#ee081bd41798ff960eea1a56b1a86ba317fecf11" - integrity sha512-uvhNj2NKMUraVKIrsmPNZgWn34b7fjEcuWAyMXUrVb06gedNtOalOBxVwXYocd4KnZRFv2/ilmAE4KEzIkj4aA== +react-image-file-resizer@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/react-image-file-resizer/-/react-image-file-resizer-0.3.1.tgz#4ea645f7702a2d9b475e67b4b82d735207ccba0b" + integrity sha512-hP6qXLyOFhPwaz+tkufsDiaHgnl5NlBVl208xlW6nlQBylzkmMCwtNCOZYgEie0sUSUYKVaTrQsbfhXxV20fbQ== react-images@^0.5.16: version "0.5.19" @@ -11121,45 +10853,21 @@ react-images@^0.5.16: react-scrolllock "^2.0.1" react-transition-group "2" -react-is@^16.12.0, react-is@^16.7.0, react-is@^16.8.1: +react-is@^16.12.0, react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4, react-is@^16.8.6, react-is@^16.9.0: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== -react-is@^16.6.0, react-is@^16.8.4, react-is@^16.8.6, react-is@^16.9.0: - version "16.13.0" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.0.tgz#0f37c3613c34fe6b37cd7f763a0d6293ab15c527" - integrity sha512-GFMtL0vHkiBv9HluwNZTggSn/sCyEt9n02aM0dSAjGGyqyNlAyftYm4phPxdvCigG15JreC5biwxCgTAJZ7yAA== - -react-lifecycles-compat@^3.0.2, react-lifecycles-compat@^3.0.4: +react-lifecycles-compat@^3.0.0, react-lifecycles-compat@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== -react-measure@^2.2.4: - version "2.3.0" - resolved "https://registry.yarnpkg.com/react-measure/-/react-measure-2.3.0.tgz#75835d39abec9ae13517f35a819c160997a7a44e" - integrity sha512-dwAvmiOeblj5Dvpnk8Jm7Q8B4THF/f1l1HtKVi0XDecsG6LXwGvzV5R1H32kq3TW6RW64OAf5aoQxpIgLa4z8A== - dependencies: - "@babel/runtime" "^7.2.0" - get-node-dimensions "^1.2.1" - prop-types "^15.6.2" - resize-observer-polyfill "^1.5.0" - react-moment@^0.9.7: version "0.9.7" resolved "https://registry.yarnpkg.com/react-moment/-/react-moment-0.9.7.tgz#ca570466595b1aa4f7619e62da18b3bb2de8b6f3" integrity sha512-ifzUrUGF6KRsUN2pRG5k56kO0mJBr8kRkWb0wNvtFIsBIxOuPxhUpL1YlXwpbQCbHq23hUu6A0VEk64HsFxk9g== -react-motion@^0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/react-motion/-/react-motion-0.5.2.tgz#0dd3a69e411316567927917c6626551ba0607316" - integrity sha512-9q3YAvHoUiWlP3cK0v+w1N5Z23HXMj4IF4YuvjvWegWqNPfLXsOBE/V7UvQGpXxHFKRQQcNcVQE31g9SB/6qgQ== - dependencies: - performance-now "^0.2.0" - prop-types "^15.5.8" - raf "^3.1.0" - react-number-format@^4.4.1: version "4.4.1" resolved "https://registry.yarnpkg.com/react-number-format/-/react-number-format-4.4.1.tgz#d5614dd25edfc21ed48b97356213440081437a94" @@ -11180,12 +10888,36 @@ react-overlays@^2.0.0-0: uncontrollable "^7.0.0" warning "^4.0.3" +react-popopo@^2.1.9: + version "2.1.9" + resolved "https://registry.yarnpkg.com/react-popopo/-/react-popopo-2.1.9.tgz#d93f70a8fb68227907d00c0cea4d8f5d321053ea" + integrity sha512-zXOpcLSpaLZmBxhdtenJzQPLjY81XknVS/tXH4Kv5BBrnYIUPHvVdGmS7+o9s7DjCzzdK7AdVwtG+FVSO0cZ8g== + dependencies: + classnames ">= 2.0" + prop-types "^15.7.2" + react ">= 16.3" + react-dom ">= 16.3" + styled-components ">= 4.0" + react-prop-toggle@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/react-prop-toggle/-/react-prop-toggle-1.0.2.tgz#8b0b7e74653606b1427cfcf6c4eaa9198330568e" integrity sha512-JmerjAXs7qJ959+d0Ygt7Cb2+4fG+n3I2VXO6JO0AcAY1vkRN/JpZKAN67CMXY889xEJcfylmMPhzvf6nWO68Q== -react-redux@^7.2.0: +react-redux@^5.0.7: + version "5.1.2" + resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-5.1.2.tgz#b19cf9e21d694422727bf798e934a916c4080f57" + integrity sha512-Ns1G0XXc8hDyH/OcBHOxNgQx9ayH3SPxBnFCOidGKSle8pKihysQw2rG/PmciUQRoclhVBO8HMhiRmGXnDja9Q== + dependencies: + "@babel/runtime" "^7.1.2" + hoist-non-react-statics "^3.3.0" + invariant "^2.2.4" + loose-envify "^1.1.0" + prop-types "^15.6.1" + react-is "^16.6.0" + react-lifecycles-compat "^3.0.0" + +react-redux@^7.1.1, react-redux@^7.2.0: version "7.2.0" resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.2.0.tgz#f970f62192b3981642fec46fd0db18a074fe879d" integrity sha512-EvCAZYGfOLqwV7gh849xy9/pt55rJXPwmYvI4lilPM5rUT/1NxuuN59ipdBksRVSvz0KInbPnp4IfoXJXCqiDA== @@ -11196,7 +10928,7 @@ react-redux@^7.2.0: prop-types "^15.7.2" react-is "^16.9.0" -react-resizable@^1.9.0: +react-resizable@^1.10.1, react-resizable@^1.9.0: version "1.10.1" resolved "https://registry.yarnpkg.com/react-resizable/-/react-resizable-1.10.1.tgz#f0c2cf1d83b3470b87676ce6d6b02bbe3f4d8cd4" integrity sha512-Jd/bKOKx6+19NwC4/aMLRu/J9/krfxlDnElP41Oc+oLiUWs/zwV1S9yBfBZRnqAwQb6vQ/HRSk3bsSWGSgVbpw== @@ -11204,29 +10936,39 @@ react-resizable@^1.9.0: prop-types "15.x" react-draggable "^4.0.3" -react-router-dom@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.1.2.tgz#06701b834352f44d37fbb6311f870f84c76b9c18" - integrity sha512-7BPHAaIwWpZS074UKaw1FjVdZBSVWEk8IuDXdB+OkLb8vd/WRQIpA4ag9WQk61aEfQs47wHyjWUoUGGZxpQXew== +react-resize-detector@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/react-resize-detector/-/react-resize-detector-2.3.0.tgz#57bad1ae26a28a62a2ddb678ba6ffdf8fa2b599c" + integrity sha512-oCAddEWWeFWYH5FAcHdBYcZjAw9fMzRUK9sWSx6WvSSOPVRxcHd5zTIGy/mOus+AhN/u6T4TMiWxvq79PywnJQ== + dependencies: + lodash.debounce "^4.0.8" + lodash.throttle "^4.1.1" + prop-types "^15.6.0" + resize-observer-polyfill "^1.5.0" + +react-router-dom@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.2.0.tgz#9e65a4d0c45e13289e66c7b17c7e175d0ea15662" + integrity sha512-gxAmfylo2QUjcwxI63RhQ5G85Qqt4voZpUXSEqCwykV0baaOTQDR1f0PmY8AELqIyVc0NEZUj0Gov5lNGcXgsA== dependencies: "@babel/runtime" "^7.1.2" history "^4.9.0" loose-envify "^1.3.1" prop-types "^15.6.2" - react-router "5.1.2" + react-router "5.2.0" tiny-invariant "^1.0.2" tiny-warning "^1.0.0" -react-router@5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.1.2.tgz#6ea51d789cb36a6be1ba5f7c0d48dd9e817d3418" - integrity sha512-yjEuMFy1ONK246B+rsa0cUam5OeAQ8pyclRDgpxuSCrAlJ1qN9uZ5IgyKC7gQg0w8OM50NXHEegPh/ks9YuR2A== +react-router@5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.2.0.tgz#424e75641ca8747fbf76e5ecca69781aa37ea293" + integrity sha512-smz1DUuFHRKdcJC0jobGo8cVbhO3x50tCL4icacOlcwDOEQPq4TMqwx3sY1TP+DvtTgz4nm3thuo7A+BK2U0Dw== dependencies: "@babel/runtime" "^7.1.2" history "^4.9.0" hoist-non-react-statics "^3.1.0" loose-envify "^1.3.1" - mini-create-react-context "^0.3.0" + mini-create-react-context "^0.4.0" path-to-regexp "^1.7.0" prop-types "^15.6.2" react-is "^16.6.0" @@ -11301,17 +11043,27 @@ react-scrolllock@^2.0.1: exenv "^1.2.2" react-prop-toggle "^1.0.2" +react-smooth@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/react-smooth/-/react-smooth-1.0.5.tgz#94ae161d7951cdd893ccb7099d031d342cb762ad" + integrity sha512-eW057HT0lFgCKh8ilr0y2JaH2YbNcuEdFpxyg7Gf/qDKk9hqGMyXryZJ8iMGJEuKH0+wxS0ccSsBBB3W8yCn8w== + dependencies: + lodash "~4.17.4" + prop-types "^15.6.0" + raf "^3.4.0" + react-transition-group "^2.5.0" + react-test-renderer@^16.0.0-0: - version "16.13.0" - resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.13.0.tgz#39ba3bf72cedc8210c3f81983f0bb061b14a3014" - integrity sha512-NQ2S9gdMUa7rgPGpKGyMcwl1d6D9MCF0lftdI3kts6kkiX+qvpC955jNjAZXlIDTjnN9jwFI8A8XhRh/9v0spA== + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.13.1.tgz#de25ea358d9012606de51e012d9742e7f0deabc1" + integrity sha512-Sn2VRyOK2YJJldOqoh8Tn/lWQ+ZiKhyZTPtaO0Q6yNj+QDbmRkVFap6pZPy3YQk8DScRDfyqm/KxKYP9gCMRiQ== dependencies: object-assign "^4.1.1" prop-types "^15.6.2" react-is "^16.8.6" - scheduler "^0.19.0" + scheduler "^0.19.1" -react-transition-group@2: +react-transition-group@2, react-transition-group@^2.5.0: version "2.9.0" resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.9.0.tgz#df9cdb025796211151a436c69a8f3b97b5b07c8d" integrity sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg== @@ -11321,7 +11073,63 @@ react-transition-group@2: prop-types "^15.6.2" react-lifecycles-compat "^3.0.4" -react@^16.13.1: +react-trello@^2.2.7: + version "2.2.7" + resolved "https://registry.yarnpkg.com/react-trello/-/react-trello-2.2.7.tgz#14ff573d85ac68328befe99db5409b74dbf07eb7" + integrity sha512-bFU7cOqQTn8PszZVuKDZOq5wVv+moQ7gygMzmQI9ao+v5yBQ+LvSDerkbYMCOZQ16tLugJHJd35fIgPQUc1HmQ== + dependencies: + autosize "^4.0.2" + classnames "^2.2.6" + immutability-helper "^2.8.1" + lodash "^4.17.11" + prop-types "^15.7.2" + react-click-outside "3.0.1" + react-popopo "^2.1.9" + react-redux "^5.0.7" + redux "^4.0.0" + redux-actions "^2.6.1" + redux-logger "^3.0.6" + trello-smooth-dnd "1.0.0" + uuid "^3.3.2" + +react-universal-interface@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/react-universal-interface/-/react-universal-interface-0.6.2.tgz#5e8d438a01729a4dbbcbeeceb0b86be146fe2b3b" + integrity sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw== + +react-use@^15.3.2: + version "15.3.2" + resolved "https://registry.yarnpkg.com/react-use/-/react-use-15.3.2.tgz#73b2a0e071f47e7e907eb0024e4e7681ac2aab33" + integrity sha512-DAbc+pVedZC4P5rLBKdIvTTB03+4T/pR6jZ2pKQPgqfq4UC1Oymmbehon5z8XXSUgZs0tgIvbBzVEdiWMS9k+g== + dependencies: + "@types/js-cookie" "2.2.6" + "@xobotyi/scrollbar-width" "1.9.5" + copy-to-clipboard "^3.2.0" + fast-deep-equal "^3.1.3" + fast-shallow-equal "^1.0.0" + js-cookie "^2.2.1" + nano-css "^5.2.1" + react-universal-interface "^0.6.2" + resize-observer-polyfill "^1.5.1" + screenfull "^5.0.0" + set-harmonic-interval "^1.0.1" + throttle-debounce "^2.1.0" + ts-easing "^0.2.0" + tslib "^2.0.0" + +react-virtualized@^9.21.2: + version "9.21.2" + resolved "https://registry.yarnpkg.com/react-virtualized/-/react-virtualized-9.21.2.tgz#02e6df65c1e020c8dbf574ec4ce971652afca84e" + integrity sha512-oX7I7KYiUM7lVXQzmhtF4Xg/4UA5duSA+/ZcAvdWlTLFCoFYq1SbauJT5gZK9cZS/wdYR6TPGpX/dqzvTqQeBA== + dependencies: + babel-runtime "^6.26.0" + clsx "^1.0.1" + dom-helpers "^5.0.0" + loose-envify "^1.3.0" + prop-types "^15.6.0" + react-lifecycles-compat "^3.0.4" + +"react@>= 16.3", react@^16.13.1: version "16.13.1" resolved "https://registry.yarnpkg.com/react/-/react-16.13.1.tgz#2e818822f1a9743122c063d6410d85c1e3afe48e" integrity sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w== @@ -11394,7 +11202,7 @@ read-pkg@^3.0.0: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.0.6, readable-stream@^3.1.1: +readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -11412,12 +11220,12 @@ readdirp@^2.2.1: micromatch "^3.1.10" readable-stream "^2.0.2" -readdirp@~3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.3.0.tgz#984458d13a1e42e2e9f5841b129e162f369aff17" - integrity sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ== +readdirp@~3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.4.0.tgz#9fdccdf9e9155805449221ac645e8303ab5b9ada" + integrity sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ== dependencies: - picomatch "^2.0.7" + picomatch "^2.2.1" realpath-native@^1.1.0: version "1.1.0" @@ -11426,17 +11234,29 @@ realpath-native@^1.1.0: dependencies: util.promisify "^1.0.0" -recompose@^0.30.0: - version "0.30.0" - resolved "https://registry.yarnpkg.com/recompose/-/recompose-0.30.0.tgz#82773641b3927e8c7d24a0d87d65aeeba18aabd0" - integrity sha512-ZTrzzUDa9AqUIhRk4KmVFihH0rapdCSMFXjhHbNrjAWxBuUD/guYlyysMnuHjlZC/KRiOKRtB4jf96yYSkKE8w== +recharts-scale@^0.4.2: + version "0.4.3" + resolved "https://registry.yarnpkg.com/recharts-scale/-/recharts-scale-0.4.3.tgz#040b4f638ed687a530357292ecac880578384b59" + integrity sha512-t8p5sccG9Blm7c1JQK/ak9O8o95WGhNXD7TXg/BW5bYbVlr6eCeRBNpgyigD4p6pSSMehC5nSvBUPj6F68rbFA== dependencies: - "@babel/runtime" "^7.0.0" - change-emitter "^0.1.2" - fbjs "^0.8.1" - hoist-non-react-statics "^2.3.1" - react-lifecycles-compat "^3.0.2" - symbol-observable "^1.0.4" + decimal.js-light "^2.4.1" + +recharts@^1.8.5: + version "1.8.5" + resolved "https://registry.yarnpkg.com/recharts/-/recharts-1.8.5.tgz#ca94a3395550946334a802e35004ceb2583fdb12" + integrity sha512-tM9mprJbXVEBxjM7zHsIy6Cc41oO/pVYqyAsOHLxlJrbNBuLs0PHB3iys2M+RqCF0//k8nJtZF6X6swSkWY3tg== + dependencies: + classnames "^2.2.5" + core-js "^2.6.10" + d3-interpolate "^1.3.0" + d3-scale "^2.1.0" + d3-shape "^1.2.0" + lodash "^4.17.5" + prop-types "^15.6.0" + react-resize-detector "^2.3.0" + react-smooth "^1.0.5" + recharts-scale "^0.4.2" + reduce-css-calc "^1.3.0" recursive-readdir@2.2.2: version "2.2.2" @@ -11453,6 +11273,38 @@ redent@^1.0.0: indent-string "^2.1.0" strip-indent "^1.0.1" +reduce-css-calc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716" + integrity sha1-dHyRTgSWFKTJz7umKYca0dKSdxY= + dependencies: + balanced-match "^0.4.2" + math-expression-evaluator "^1.2.14" + reduce-function-call "^1.0.1" + +reduce-function-call@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/reduce-function-call/-/reduce-function-call-1.0.3.tgz#60350f7fb252c0a67eb10fd4694d16909971300f" + integrity sha512-Hl/tuV2VDgWgCSEeWMLwxLZqX7OK59eU1guxXsRKTAyeYimivsKdtcV4fu3r710tpG5GmDKDhQ0HSZLExnNmyQ== + dependencies: + balanced-match "^1.0.0" + +reduce-reducers@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/reduce-reducers/-/reduce-reducers-0.4.3.tgz#8e052618801cd8fc2714b4915adaa8937eb6d66c" + integrity sha512-+CNMnI8QhgVMtAt54uQs3kUxC3Sybpa7Y63HR14uGLgI9/QR5ggHvpxwhGGe3wmx5V91YwqQIblN9k5lspAmGw== + +redux-actions@^2.6.1: + version "2.6.5" + resolved "https://registry.yarnpkg.com/redux-actions/-/redux-actions-2.6.5.tgz#bdca548768ee99832a63910c276def85e821a27e" + integrity sha512-pFhEcWFTYNk7DhQgxMGnbsB1H2glqhQJRQrtPb96kD3hWiZRzXHwwmFPswg6V2MjraXRXWNmuP9P84tvdLAJmw== + dependencies: + invariant "^2.2.4" + just-curry-it "^3.1.0" + loose-envify "^1.4.0" + reduce-reducers "^0.4.3" + to-camel-case "^1.0.0" + redux-logger@^3.0.6: version "3.0.6" resolved "https://registry.yarnpkg.com/redux-logger/-/redux-logger-3.0.6.tgz#f7555966f3098f3c88604c449cf0baf5778274bf" @@ -11472,7 +11324,14 @@ redux-saga@^1.1.3: dependencies: "@redux-saga/core" "^1.1.3" -redux@^4.0.4, redux@^4.0.5: +redux-state-sync@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/redux-state-sync/-/redux-state-sync-3.1.1.tgz#cd5d53edb48688cbad38aba52983cdb88ef6ff46" + integrity sha512-cYz2+DCXMKD+Tz0jxHY8fOby3X+7l5QmSMoeNLW+RoZnixZgqKKqAfaTKjw18UG6gsN8Wd4PSwCdeyuqxPrgSA== + dependencies: + broadcast-channel "^3.1.0" + +redux@^4.0.0, redux@^4.0.4, redux@^4.0.5: version "4.0.5" resolved "https://registry.yarnpkg.com/redux/-/redux-4.0.5.tgz#4db5de5816e17891de8a80c424232d06f051d93f" integrity sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w== @@ -11485,13 +11344,6 @@ reflect.ownkeys@^0.2.0: resolved "https://registry.yarnpkg.com/reflect.ownkeys/-/reflect.ownkeys-0.2.0.tgz#749aceec7f3fdf8b63f927a04809e90c5c0b3460" integrity sha1-dJrO7H8/34tj+SegSAnpDFwLNGA= -regenerate-unicode-properties@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz#ef51e0f0ea4ad424b77bf7cb41f3e015c70a3f0e" - integrity sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA== - dependencies: - regenerate "^1.4.0" - regenerate-unicode-properties@^8.2.0: version "8.2.0" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" @@ -11500,39 +11352,26 @@ regenerate-unicode-properties@^8.2.0: regenerate "^1.4.0" regenerate@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" - integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== + version "1.4.1" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.1.tgz#cad92ad8e6b591773485fbe05a485caf4f457e6f" + integrity sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A== regenerator-runtime@^0.11.0: version "0.11.1" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== -regenerator-runtime@^0.13.2, regenerator-runtime@^0.13.4: +regenerator-runtime@^0.13.3, regenerator-runtime@^0.13.4: version "0.13.5" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697" integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA== -regenerator-runtime@^0.13.3: - version "0.13.3" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz#7cf6a77d8f5c6f60eb73c5fc1955b2ceb01e6bf5" - integrity sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw== - -regenerator-transform@^0.14.0: - version "0.14.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.1.tgz#3b2fce4e1ab7732c08f665dfdb314749c7ddd2fb" - integrity sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ== - dependencies: - private "^0.1.6" - regenerator-transform@^0.14.2: - version "0.14.4" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.4.tgz#5266857896518d1616a78a0479337a30ea974cc7" - integrity sha512-EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw== + version "0.14.5" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" + integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw== dependencies: "@babel/runtime" "^7.8.4" - private "^0.1.8" regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" @@ -11561,21 +11400,9 @@ regexpp@^2.0.1: integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== regexpp@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.0.0.tgz#dd63982ee3300e67b41c1956f850aa680d9d330e" - integrity sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g== - -regexpu-core@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.6.0.tgz#2037c18b327cfce8a6fea2a4ec441f2432afb8b6" - integrity sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg== - dependencies: - regenerate "^1.4.0" - regenerate-unicode-properties "^8.1.0" - regjsgen "^0.5.0" - regjsparser "^0.6.0" - unicode-match-property-ecmascript "^1.0.4" - unicode-match-property-value-ecmascript "^1.1.0" + version "3.1.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" + integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== regexpu-core@^4.7.0: version "4.7.0" @@ -11589,17 +11416,10 @@ regexpu-core@^4.7.0: unicode-match-property-ecmascript "^1.0.4" unicode-match-property-value-ecmascript "^1.2.0" -regjsgen@^0.5.0, regjsgen@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.1.tgz#48f0bf1a5ea205196929c0d9798b42d1ed98443c" - integrity sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg== - -regjsparser@^0.6.0: - version "0.6.3" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.3.tgz#74192c5805d35e9f5ebe3c1fb5b40d40a8a38460" - integrity sha512-8uZvYbnfAtEm9Ab8NTb3hdLwL4g/LQzEYP7Xs27T96abJCCE2d6r3cPZPQEsLKy0vRSGVNG+/zVGtLr86HQduA== - dependencies: - jsesc "~0.5.0" +regjsgen@^0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" + integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== regjsparser@^0.6.4: version "0.6.4" @@ -11774,9 +11594,9 @@ resolve@1.15.0: path-parse "^1.0.6" resolve@^1.10.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.15.1, resolve@^1.3.2, resolve@^1.8.1: - version "1.15.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8" - integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w== + version "1.17.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" + integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== dependencies: path-parse "^1.0.6" @@ -11821,7 +11641,7 @@ rgba-regex@^1.0.0: resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= -rimraf@2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.3, rimraf@^2.7.1: +rimraf@2, rimraf@^2.5.4, rimraf@^2.6.3, rimraf@^2.7.1: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== @@ -11835,6 +11655,13 @@ rimraf@2.6.3, rimraf@~2.6.2: dependencies: glob "^7.1.3" +rimraf@3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" @@ -11843,14 +11670,6 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" -rmc-feedback@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/rmc-feedback/-/rmc-feedback-2.0.0.tgz#cbc6cb3ae63c7a635eef0e25e4fbaf5ac366eeaa" - integrity sha512-5PWOGOW7VXks/l3JzlOU9NIxRpuaSS8d9zA3UULUCuTKnpwBHNvv1jSJzxgbbCQeYzROWUpgKI4za3X4C/mKmQ== - dependencies: - babel-runtime "6.x" - classnames "^2.2.5" - rst-selector-parser@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz#81b230ea2fcc6066c89e3472de794285d9b03d91" @@ -11864,12 +11683,17 @@ rsvp@^4.8.4: resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== -run-async@^2.2.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.0.tgz#e59054a5b86876cfae07f431d18cbaddc594f1e8" - integrity sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg== +rtl-css-js@^1.9.0: + version "1.14.0" + resolved "https://registry.yarnpkg.com/rtl-css-js/-/rtl-css-js-1.14.0.tgz#daa4f192a92509e292a0519f4b255e6e3c076b7d" + integrity sha512-Dl5xDTeN3e7scU1cWX8c9b6/Nqz3u/HgR4gePc1kWXYiQWVQbKCEyK6+Hxve9LbcJ5EieHy1J9nJCN3grTtGwg== dependencies: - is-promise "^2.1.0" + "@babel/runtime" "^7.1.2" + +run-async@^2.2.0, run-async@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== run-queue@^1.0.0, run-queue@^1.0.3: version "1.0.3" @@ -11878,10 +11702,10 @@ run-queue@^1.0.0, run-queue@^1.0.3: dependencies: aproba "^1.1.1" -rxjs@^6.5.3: - version "6.5.4" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.4.tgz#e0777fe0d184cec7872df147f303572d414e211c" - integrity sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q== +rxjs@^6.5.3, rxjs@^6.6.0: + version "6.6.0" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.0.tgz#af2901eedf02e3a83ffa7f886240ff9018bbec84" + integrity sha512-3HMA8z/Oz61DUHe+SdOiQyzIf4tOx5oQHmMir7IZEu6TMqCLHT4LRcmNaUS0NwOz8VLvmmBduMsoaUvMaIiqzg== dependencies: tslib "^1.9.0" @@ -11890,10 +11714,10 @@ safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" - integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== +safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== safe-regex@^1.1.0: version "1.1.0" @@ -11902,7 +11726,7 @@ safe-regex@^1.1.0: dependencies: ret "~0.1.10" -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -11927,15 +11751,15 @@ sanitize.css@^10.0.0: resolved "https://registry.yarnpkg.com/sanitize.css/-/sanitize.css-10.0.0.tgz#b5cb2547e96d8629a60947544665243b1dc3657a" integrity sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg== -sass-graph@^2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49" - integrity sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k= +sass-graph@2.2.5: + version "2.2.5" + resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.5.tgz#a981c87446b8319d96dce0671e487879bd24c2e8" + integrity sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag== dependencies: glob "^7.0.0" lodash "^4.0.0" scss-tokenizer "^0.2.3" - yargs "^7.0.0" + yargs "^13.3.2" sass-loader@8.0.2: version "8.0.2" @@ -11960,14 +11784,6 @@ saxes@^3.1.9: dependencies: xmlchars "^2.1.1" -scheduler@^0.19.0: - version "0.19.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.0.tgz#a715d56302de403df742f4a9be11975b32f5698d" - integrity sha512-xowbVaTPe9r7y7RUejcK73/j8tt2jfiyTednOvHbA8JoClvMYCp+r8QegLwK/n8zWQAtZb1fFnER4XLBZXrCxA== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - scheduler@^0.19.1: version "0.19.1" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.1.tgz#4f3e2ed2c1a7d65681f4c854fa8c5a1ccb40f196" @@ -11985,28 +11801,26 @@ schema-utils@^1.0.0: ajv-errors "^1.0.0" ajv-keywords "^3.1.0" -schema-utils@^2.5.0, schema-utils@^2.6.0, schema-utils@^2.6.1, schema-utils@^2.6.4: - version "2.6.4" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.6.4.tgz#a27efbf6e4e78689d91872ee3ccfa57d7bdd0f53" - integrity sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ== +schema-utils@^2.5.0, schema-utils@^2.6.0, schema-utils@^2.6.1, schema-utils@^2.6.4, schema-utils@^2.6.5: + version "2.7.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.0.tgz#17151f76d8eae67fbbf77960c33c676ad9f4efc7" + integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== dependencies: - ajv "^6.10.2" + "@types/json-schema" "^7.0.4" + ajv "^6.12.2" ajv-keywords "^3.4.1" -schema-utils@^2.6.5: - version "2.6.5" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.6.5.tgz#c758f0a7e624263073d396e29cd40aa101152d8a" - integrity sha512-5KXuwKziQrTVHh8j/Uxz+QUbxkaLW9X/86NBlx/gnKgtsZA2GIVMUn17qWhRFwF8jdYb3Dig5hRO/W5mZqy6SQ== - dependencies: - ajv "^6.12.0" - ajv-keywords "^3.4.1" +screenfull@^5.0.0: + version "5.0.2" + resolved "https://registry.yarnpkg.com/screenfull/-/screenfull-5.0.2.tgz#b9acdcf1ec676a948674df5cd0ff66b902b0bed7" + integrity sha512-cCF2b+L/mnEiORLN5xSAz6H3t18i2oHh9BA8+CQlAh5DRw2+NFAGQJOSYbcGw8B2k04g/lVvFcfZ83b3ysH5UQ== -scroll-into-view-if-needed@^2.2.20: - version "2.2.24" - resolved "https://registry.yarnpkg.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.24.tgz#12bca532990769bd509115a49edcfa755e92a0ea" - integrity sha512-vsC6SzyIZUyJG8o4nbUDCiIwsPdH6W/FVmjT2avR2hp/yzS53JjGmg/bKD20TkoNajbu5dAQN4xR7yes4qhwtQ== +scroll-into-view-if-needed@^2.2.25: + version "2.2.25" + resolved "https://registry.yarnpkg.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.25.tgz#117b7bc7c61bc7a2b7872a0984bc73a19bc6e961" + integrity sha512-C8RKJPq9lK7eubwGpLbUkw3lklcG3Ndjmea2PyauzrA0i4DPlzAmVMGxaZrBFqCrVLfvJmP80IyHnv4jxvg1OQ== dependencies: - compute-scroll-into-view "^1.0.13" + compute-scroll-into-view "^1.0.14" scss-tokenizer@^0.2.3: version "0.2.3" @@ -12028,7 +11842,7 @@ selfsigned@^1.10.7: dependencies: node-forge "0.9.0" -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.0, semver@^5.7.1: +"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.0, semver@^5.7.1: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -12043,6 +11857,11 @@ semver@7.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== +semver@^7.3.2: + version "7.3.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" + integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== + semver@~5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" @@ -12072,6 +11891,13 @@ serialize-javascript@^2.1.2: resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.2.tgz#ecec53b0e0317bdc95ef76ab7074b7384785fa61" integrity sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ== +serialize-javascript@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-3.1.0.tgz#8bf3a9170712664ef2561b44b691eafe399214ea" + integrity sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg== + dependencies: + randombytes "^2.1.0" + serve-index@^1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" @@ -12100,6 +11926,11 @@ set-blocking@^2.0.0, set-blocking@~2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= +set-harmonic-interval@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/set-harmonic-interval/-/set-harmonic-interval-1.0.1.tgz#e1773705539cdfb80ce1c3d99e7f298bb3995249" + integrity sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g== + set-value@^2.0.0, set-value@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" @@ -12110,7 +11941,7 @@ set-value@^2.0.0, set-value@^2.0.1: is-plain-object "^2.0.3" split-string "^3.0.1" -setimmediate@^1.0.4, setimmediate@^1.0.5: +setimmediate@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= @@ -12198,9 +12029,9 @@ side-channel@^1.0.2: object-inspect "^1.7.0" signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= + version "3.0.3" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== simple-swizzle@^0.2.2: version "0.2.2" @@ -12210,9 +12041,9 @@ simple-swizzle@^0.2.2: is-arrayish "^0.3.1" sisteransi@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.4.tgz#386713f1ef688c7c0304dc4c0632898941cad2e3" - integrity sha512-/ekMoM4NJ59ivGSfKapeG+FWtrmWvA1p6FBZwXrqojw90vJu8lBmrTxCMuBCydKtkaUe2zt4PlxeTKpjwMbyig== + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== slash@^1.0.0: version "1.0.0" @@ -12330,9 +12161,9 @@ source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: urix "^0.1.0" source-map-support@^0.5.6, source-map-support@~0.5.12: - version "0.5.16" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" - integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== + version "0.5.19" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" + integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" @@ -12342,6 +12173,11 @@ source-map-url@^0.4.0: resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= +source-map@0.5.6: + version "0.5.6" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" + integrity sha1-dc449SvwczxafwwRjYEzSiu19BI= + source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" @@ -12364,23 +12200,28 @@ source-map@^0.7.3: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== +sourcemap-codec@^1.4.1: + version "1.4.8" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" + integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== + spdx-correct@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" - integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== + version "3.1.1" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" + integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== dependencies: spdx-expression-parse "^3.0.0" spdx-license-ids "^3.0.0" spdx-exceptions@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" - integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== + version "2.3.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== spdx-expression-parse@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" - integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== dependencies: spdx-exceptions "^2.1.0" spdx-license-ids "^3.0.0" @@ -12403,9 +12244,9 @@ spdy-transport@^3.0.0: wbuf "^1.7.3" spdy@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.1.tgz#6f12ed1c5db7ea4f24ebb8b89ba58c87c08257f2" - integrity sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA== + version "4.0.2" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" + integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== dependencies: debug "^4.1.0" handle-thing "^2.0.0" @@ -12465,11 +12306,40 @@ stable@^0.1.8: resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== +stack-generator@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/stack-generator/-/stack-generator-2.0.5.tgz#fb00e5b4ee97de603e0773ea78ce944d81596c36" + integrity sha512-/t1ebrbHkrLrDuNMdeAcsvynWgoH/i4o8EGGfX7dEYDoTXOYVAkEpFdtshlvabzc6JlJ8Kf9YdFEoz7JkzGN9Q== + dependencies: + stackframe "^1.1.1" + stack-utils@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8" integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA== +stackframe@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.2.0.tgz#52429492d63c62eb989804c11552e3d22e779303" + integrity sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA== + +stacktrace-gps@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/stacktrace-gps/-/stacktrace-gps-3.0.4.tgz#7688dc2fc09ffb3a13165ebe0dbcaf41bcf0c69a" + integrity sha512-qIr8x41yZVSldqdqe6jciXEaSCKw1U8XTXpjDuy0ki/apyTn/r3w9hDAAQOhZdxvsC93H+WwwEu5cq5VemzYeg== + dependencies: + source-map "0.5.6" + stackframe "^1.1.1" + +stacktrace-js@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/stacktrace-js/-/stacktrace-js-2.0.2.tgz#4ca93ea9f494752d55709a081d400fdaebee897b" + integrity sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg== + dependencies: + error-stack-parser "^2.0.6" + stack-generator "^2.0.5" + stacktrace-gps "^3.0.4" + static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" @@ -12558,7 +12428,7 @@ string-length@^3.1.0: astral-regex "^1.0.0" strip-ansi "^5.2.0" -string-width@^1.0.1, string-width@^1.0.2: +string-width@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= @@ -12614,21 +12484,21 @@ string.prototype.trim@^1.2.1: es-abstract "^1.17.0-next.1" function-bind "^1.1.1" -string.prototype.trimleft@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz#9bdb8ac6abd6d602b17a4ed321870d2f8dcefc74" - integrity sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag== +string.prototype.trimend@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" + integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g== dependencies: define-properties "^1.1.3" - function-bind "^1.1.1" + es-abstract "^1.17.5" -string.prototype.trimright@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz#440314b15996c866ce8a0341894d45186200c5d9" - integrity sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g== +string.prototype.trimstart@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" + integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw== dependencies: define-properties "^1.1.3" - function-bind "^1.1.1" + es-abstract "^1.17.5" string_decoder@^1.0.0, string_decoder@^1.1.1: version "1.3.0" @@ -12714,14 +12584,9 @@ strip-indent@^1.0.1: get-stdin "^4.0.1" strip-json-comments@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" - integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== - -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== style-loader@0.23.1: version "0.23.1" @@ -12731,14 +12596,14 @@ style-loader@0.23.1: loader-utils "^1.1.0" schema-utils "^1.0.0" -styled-components@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-5.0.1.tgz#57782a6471031abefb2db5820a1876ae853bc619" - integrity sha512-E0xKTRIjTs4DyvC1MHu/EcCXIj6+ENCP8hP01koyoADF++WdBUOrSGwU1scJRw7/YaYOhDvvoad6VlMG+0j53A== +"styled-components@>= 4.0", styled-components@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-5.1.1.tgz#96dfb02a8025794960863b9e8e365e3b6be5518d" + integrity sha512-1ps8ZAYu2Husx+Vz8D+MvXwEwvMwFv+hqqUwhNlDN5ybg6A+3xyW1ECrAgywhvXapNfXiz79jJyU0x22z0FFTg== dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/traverse" "^7.4.5" - "@emotion/is-prop-valid" "^0.8.3" + "@emotion/is-prop-valid" "^0.8.8" "@emotion/stylis" "^0.8.4" "@emotion/unitless" "^0.7.4" babel-plugin-styled-components ">= 1" @@ -12756,10 +12621,15 @@ stylehacks@^4.0.0: postcss "^7.0.0" postcss-selector-parser "^3.0.0" -subscriptions-transport-ws@^0.9.16: - version "0.9.16" - resolved "https://registry.yarnpkg.com/subscriptions-transport-ws/-/subscriptions-transport-ws-0.9.16.tgz#90a422f0771d9c32069294c08608af2d47f596ec" - integrity sha512-pQdoU7nC+EpStXnCfh/+ho0zE0Z+ma+i7xvj7bkXKb1dvYHSZxgRPaU6spRP+Bjzow67c/rRDoix5RT0uU9omw== +stylis@3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-3.5.0.tgz#016fa239663d77f868fef5b67cf201c4b7c701e1" + integrity sha512-pP7yXN6dwMzAR29Q0mBrabPCe0/mNO1MSr93bhay+hcZondvMMTpeGyd8nbhYJdyperNT2DRxONQuUGcJr5iPw== + +subscriptions-transport-ws@^0.9.17: + version "0.9.17" + resolved "https://registry.yarnpkg.com/subscriptions-transport-ws/-/subscriptions-transport-ws-0.9.17.tgz#e30e40f0caae0d2781903c01a8cb51b6e2682098" + integrity sha512-hNHi2N80PBz4T0V0QhnnsMGvG3XDFDS9mS6BhZ3R12T6EBywC8d/uJscsga0cVO4DKtXCkCRrWm2sOYrbOdhEA== dependencies: backo2 "^1.0.2" eventemitter3 "^3.1.0" @@ -12794,9 +12664,9 @@ supports-color@^7.0.0, supports-color@^7.1.0: has-flag "^4.0.0" svg-parser@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.3.tgz#a38f2e4e5442986f7ecb554c11f1411cfcf8c2b9" - integrity sha512-fnCWiifNhK8i2Z7b9R5tbNahpxrRdAaQbnoxKlT2KrSCj9Kq/yBSgulCRgBJRhy1dPnSY5slg5ehPUnzpEcHlg== + version "2.0.4" + resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" + integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== svgo@^1.0.0, svgo@^1.2.2: version "1.3.2" @@ -12851,19 +12721,6 @@ tar@^2.0.0: fstream "^1.0.12" inherits "2" -tar@^4.4.2: - version "4.4.13" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" - integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== - dependencies: - chownr "^1.1.1" - fs-minipass "^1.2.5" - minipass "^2.8.6" - minizlib "^1.2.1" - mkdirp "^0.5.0" - safe-buffer "^5.1.2" - yallist "^3.0.3" - temp@^0.9.1: version "0.9.1" resolved "https://registry.yarnpkg.com/temp/-/temp-0.9.1.tgz#2d666114fafa26966cd4065996d7ceedd4dd4697" @@ -12887,24 +12744,24 @@ terser-webpack-plugin@2.3.5: webpack-sources "^1.4.3" terser-webpack-plugin@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz#5ecaf2dbdc5fb99745fd06791f46fc9ddb1c9a7c" - integrity sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA== + version "1.4.4" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.4.tgz#2c63544347324baafa9a56baaddf1634c8abfc2f" + integrity sha512-U4mACBHIegmfoEe5fdongHESNJWqsGU+W0S/9+BmYGVQDw1+c2Ow05TpMhxjPK1sRb7cuYq1BPl1e5YHJMTCqA== dependencies: cacache "^12.0.2" find-cache-dir "^2.1.0" is-wsl "^1.1.0" schema-utils "^1.0.0" - serialize-javascript "^2.1.2" + serialize-javascript "^3.1.0" source-map "^0.6.1" terser "^4.1.2" webpack-sources "^1.4.0" worker-farm "^1.7.0" terser@^4.1.2, terser@^4.4.3, terser@^4.6.3: - version "4.6.4" - resolved "https://registry.yarnpkg.com/terser/-/terser-4.6.4.tgz#40a0b37afbe5b57e494536815efa68326840fc00" - integrity sha512-5fqgBPLgVHZ/fVvqRhhUp9YUiGXhFJ9ZkrZWD9vQtFBR4QIGTnbsb+/kKqSqfgp3WnBwGWAFnedGTtmX1YTn0w== + version "4.8.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17" + integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw== dependencies: commander "^2.20.0" source-map "~0.6.1" @@ -12930,6 +12787,11 @@ throat@^4.0.0: resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" integrity sha1-iQN8vJLFarGJJua6TLsgDhVnKmo= +throttle-debounce@^2.1.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/throttle-debounce/-/throttle-debounce-2.2.1.tgz#fbd933ae6793448816f7d5b3cae259d464c98137" + integrity sha512-i9hAVld1f+woAiyNGqWelpDD5W1tpMroL3NofTz9xzwq6acWBlO2dC8k5EFSZepU6oOINtV5Q3aSPoRg7o4+fA== + through2@^2.0.0: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" @@ -12960,12 +12822,12 @@ timsort@^0.3.0: resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= -tiny-invariant@^1.0.2: +tiny-invariant@^1.0.2, tiny-invariant@^1.0.6: version "1.1.0" resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.1.0.tgz#634c5f8efdc27714b7f386c35e6760991d230875" integrity sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw== -tiny-warning@^1.0.0, tiny-warning@^1.0.2: +tiny-warning@^1.0.0, tiny-warning@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== @@ -12992,11 +12854,23 @@ to-arraybuffer@^1.0.0: resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= +to-camel-case@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/to-camel-case/-/to-camel-case-1.0.0.tgz#1a56054b2f9d696298ce66a60897322b6f423e46" + integrity sha1-GlYFSy+daWKYzmamCJcyK29CPkY= + dependencies: + to-space-case "^1.0.0" + to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= +to-no-case@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/to-no-case/-/to-no-case-1.0.2.tgz#c722907164ef6b178132c8e69930212d1b4aa16a" + integrity sha1-xyKQcWTvaxeBMsjmmTAhLRtKoWo= + to-object-path@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" @@ -13029,6 +12903,13 @@ to-regex@^3.0.1, to-regex@^3.0.2: regex-not "^1.0.2" safe-regex "^1.1.0" +to-space-case@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/to-space-case/-/to-space-case-1.0.0.tgz#b052daafb1b2b29dc770cea0163e5ec0ebc9fc17" + integrity sha1-sFLar7Gysp3HcM6gFj5ewOvJ/Bc= + dependencies: + to-no-case "^1.0.0" + toggle-selection@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32" @@ -13054,6 +12935,11 @@ tr46@^1.0.1: dependencies: punycode "^2.1.0" +trello-smooth-dnd@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/trello-smooth-dnd/-/trello-smooth-dnd-1.0.0.tgz#0003d5b35a1651a16a165b7bfb6b41d0a7c52a17" + integrity sha512-KgYEwmxX08Dl4OmioEv24LSnlNp9jNv8lwTQlUMbMm6B+VuwyQuuuoyu4wlsRweiMCCC6sZXpCCGkmAni/vCaQ== + trim-newlines@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" @@ -13066,6 +12952,11 @@ trim-newlines@^1.0.0: dependencies: glob "^7.1.2" +ts-easing@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/ts-easing/-/ts-easing-0.2.0.tgz#c8a8a35025105566588d87dbda05dd7fbfa5a4ec" + integrity sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ== + ts-invariant@^0.4.0, ts-invariant@^0.4.4: version "0.4.4" resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.4.4.tgz#97a523518688f93aafad01b0e80eb803eb2abd86" @@ -13073,15 +12964,25 @@ ts-invariant@^0.4.0, ts-invariant@^0.4.4: dependencies: tslib "^1.9.3" -ts-pnp@1.1.6, ts-pnp@^1.1.6: +ts-pnp@1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.1.6.tgz#389a24396d425a0d3162e96d2b4638900fdc289a" integrity sha512-CrG5GqAAzMT7144Cl+UIFP7mz/iIhiy+xQ6GGcnjTezhALT02uPMRw7tgDSESgB5MsfKt55+GPWw4ir1kVtMIQ== -tslib@1.11.1, tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: - version "1.11.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35" - integrity sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA== +ts-pnp@^1.1.6: + version "1.2.0" + resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92" + integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw== + +tslib@^1.10.0, tslib@^1.11.1, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: + version "1.13.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" + integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== + +tslib@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.0.tgz#18d13fc2dce04051e20f074cc8387fd8089ce4f3" + integrity sha512-lTqkx847PI7xEDYJntxZH89L2/aXInsyF2luSafe/+0fHOMjlBNXdH6th7f70qxLDhul7KZK0zC8V5ZIyHl0/g== tsutils@^3.17.1: version "3.17.1" @@ -13114,6 +13015,11 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" +type-fest@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" + integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== + type-fest@^0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" @@ -13161,11 +13067,6 @@ typescript-tuple@^2.2.1: dependencies: typescript-compare "^0.0.2" -ua-parser-js@^0.7.18: - version "0.7.21" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.21.tgz#853cf9ce93f642f67174273cc34565ae6f308777" - integrity sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ== - uncontrollable@^7.0.0: version "7.1.1" resolved "https://registry.yarnpkg.com/uncontrollable/-/uncontrollable-7.1.1.tgz#f67fed3ef93637126571809746323a9db815d556" @@ -13189,20 +13090,15 @@ unicode-match-property-ecmascript@^1.0.4: unicode-canonical-property-names-ecmascript "^1.0.4" unicode-property-aliases-ecmascript "^1.0.4" -unicode-match-property-value-ecmascript@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz#5b4b426e08d13a80365e0d657ac7a6c1ec46a277" - integrity sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g== - unicode-match-property-value-ecmascript@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531" integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ== unicode-property-aliases-ecmascript@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz#a9cc6cc7ce63a0a3023fc99e341b94431d405a57" - integrity sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw== + version "1.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4" + integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg== union-value@^1.0.0: version "1.0.1" @@ -13243,6 +13139,14 @@ universalify@^0.1.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== +unload@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/unload/-/unload-2.2.0.tgz#ccc88fdcad345faa06a92039ec0f80b488880ef7" + integrity sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA== + dependencies: + "@babel/runtime" "^7.6.2" + detect-node "^2.0.4" + unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" @@ -13303,6 +13207,11 @@ url@^0.11.0: punycode "1.3.2" querystring "0.2.0" +use-memo-one@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/use-memo-one/-/use-memo-one-1.1.1.tgz#39e6f08fe27e422a7d7b234b5f9056af313bd22c" + integrity sha512-oFfsyun+bP7RX8X2AskHNTxu+R3QdE/RC5IefMbqptmACAA/gfol1KDD5KRzPsGMa62sWxGZw+Ui43u6x4ddoQ== + use@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" @@ -13361,9 +13270,9 @@ uuid@^3.0.1, uuid@^3.3.2: integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== v8-compile-cache@^2.0.3: - version "2.1.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e" - integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g== + version "2.1.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz#54bc3cdd43317bca91e35dcaf305b1a7237de745" + integrity sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ== validate-npm-package-license@^3.0.1: version "3.0.4" @@ -13408,11 +13317,11 @@ void-elements@^2.0.1: integrity sha1-wGavtYK7HLQSjWDqkjkulNXp2+w= w3c-hr-time@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045" - integrity sha1-gqwr/2PZUOqeMYmlimViX+3xkEU= + version "1.0.2" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" + integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== dependencies: - browser-process-hrtime "^0.1.2" + browser-process-hrtime "^1.0.0" w3c-xmlserializer@^1.1.2: version "1.1.2" @@ -13430,21 +13339,30 @@ walker@^1.0.7, walker@~1.0.5: dependencies: makeerror "1.0.x" -warning@^4.0.1, warning@^4.0.3, warning@~4.0.3: +warning@^4.0.1, warning@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== dependencies: loose-envify "^1.0.0" -watchpack@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" - integrity sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA== +watchpack-chokidar2@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz#9948a1866cbbd6cb824dea13a7ed691f6c8ddff0" + integrity sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA== + dependencies: + chokidar "^2.1.8" + +watchpack@^1.6.0: + version "1.7.2" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.2.tgz#c02e4d4d49913c3e7e122c3325365af9d331e9aa" + integrity sha512-ymVbbQP40MFTp+cNMvpyBpBtygHnPzPkHqoIwRRj/0B8KhqQwV8LaKjtbaxF2lK4vl8zN9wCxS46IFCU5K4W0g== dependencies: - chokidar "^2.0.2" graceful-fs "^4.1.2" neo-async "^2.5.0" + optionalDependencies: + chokidar "^3.4.0" + watchpack-chokidar2 "^2.0.0" wbuf@^1.1.0, wbuf@^1.7.3: version "1.7.3" @@ -13564,18 +13482,18 @@ webpack@4.42.0: webpack-sources "^1.4.1" websocket-driver@>=0.5.1: - version "0.7.3" - resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.3.tgz#a2d4e0d4f4f116f1e6297eba58b05d430100e9f9" - integrity sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg== + version "0.7.4" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" + integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== dependencies: - http-parser-js ">=0.4.0 <0.4.11" + http-parser-js ">=0.5.1" safe-buffer ">=5.1.0" websocket-extensions ">=0.1.1" websocket-extensions@>=0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" - integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg== + version "0.1.4" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3, whatwg-encoding@^1.0.5: version "1.0.5" @@ -13590,9 +13508,9 @@ whatwg-fetch@2.0.4: integrity sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng== whatwg-fetch@>=0.10.0, whatwg-fetch@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb" - integrity sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q== + version "3.2.0" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.2.0.tgz#8e134f701f0a4ab5fda82626f113e2b647fd16dc" + integrity sha512-SdGPoQMMnzVYThUbSrEvqTlkvC1Ux27NehaJ/GUHBfNrh5Mjg+1/uRyFMwVnxO2MrikMWvWAqUGgQOfVU4hT7w== whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0, whatwg-mimetype@^2.3.0: version "2.3.0" @@ -13617,11 +13535,6 @@ whatwg-url@^7.0.0: tr46 "^1.0.1" webidl-conversions "^4.0.2" -which-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" - integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8= - which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" @@ -13648,11 +13561,6 @@ wide-align@^1.1.0: dependencies: string-width "^1.0.2 || 2" -window-size@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876" - integrity sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY= - word-wrap@~1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" @@ -13895,11 +13803,6 @@ xtend@^4.0.0, xtend@~4.0.1: resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== -y18n@^3.2.0, y18n@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" - integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= - "y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" @@ -13910,7 +13813,7 @@ yallist@^2.1.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= -yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: +yallist@^3.0.2: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== @@ -13921,11 +13824,9 @@ yallist@^4.0.0: integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== yaml@^1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.7.2.tgz#f26aabf738590ab61efaca502358e48dc9f348b2" - integrity sha512-qXROVp90sb83XtAoqE8bP9RwAkTTZbugRUTm5YeFCBfNRPEp2YzTeqWiz7m5OORHzEvrA/qcGS8hp/E+MMROYw== - dependencies: - "@babel/runtime" "^7.6.3" + version "1.10.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" + integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg== yargs-parser@^11.1.1: version "11.1.1" @@ -13935,29 +13836,22 @@ yargs-parser@^11.1.1: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^13.1.1: - version "13.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" - integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== +yargs-parser@^13.1.2: + version "13.1.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" + integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== dependencies: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^18.1.1: - version "18.1.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.2.tgz#2f482bea2136dbde0861683abea7756d30b504f1" - integrity sha512-hlIPNR3IzC1YuL1c2UwwDKpXlNFBqD1Fswwh1khz5+d8Cq/8yc/Mn0i+rQXduu8hcrFKvO7Eryk+09NecTQAAQ== +yargs-parser@^18.1.2: + version "18.1.3" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" + integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== dependencies: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" - integrity sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo= - dependencies: - camelcase "^3.0.0" - yargs@12.0.5: version "12.0.5" resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" @@ -13976,10 +13870,10 @@ yargs@12.0.5: y18n "^3.2.1 || ^4.0.0" yargs-parser "^11.1.1" -yargs@^13.3.0: - version "13.3.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.0.tgz#4c657a55e07e5f2cf947f8a366567c04a0dedc83" - integrity sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA== +yargs@^13.3.0, yargs@^13.3.2: + version "13.3.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" + integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== dependencies: cliui "^5.0.0" find-up "^3.0.0" @@ -13990,12 +13884,12 @@ yargs@^13.3.0: string-width "^3.0.0" which-module "^2.0.0" y18n "^4.0.0" - yargs-parser "^13.1.1" + yargs-parser "^13.1.2" yargs@^15.3.1: - version "15.3.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.3.1.tgz#9505b472763963e54afe60148ad27a330818e98b" - integrity sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA== + version "15.4.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" + integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== dependencies: cliui "^6.0.0" decamelize "^1.2.0" @@ -14007,44 +13901,12 @@ yargs@^15.3.1: string-width "^4.2.0" which-module "^2.0.0" y18n "^4.0.0" - yargs-parser "^18.1.1" + yargs-parser "^18.1.2" -yargs@^3.10.0: - version "3.32.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.32.0.tgz#03088e9ebf9e756b69751611d2a5ef591482c995" - integrity sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU= - dependencies: - camelcase "^2.0.1" - cliui "^3.0.3" - decamelize "^1.1.1" - os-locale "^1.4.0" - string-width "^1.0.1" - window-size "^0.1.4" - y18n "^3.2.0" - -yargs@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" - integrity sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg= - dependencies: - camelcase "^3.0.0" - cliui "^3.2.0" - decamelize "^1.1.1" - get-caller-file "^1.0.1" - os-locale "^1.4.0" - read-pkg-up "^1.0.1" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^1.0.2" - which-module "^1.0.0" - y18n "^3.2.1" - yargs-parser "^5.0.0" - -zen-observable-ts@^0.8.20: - version "0.8.20" - resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-0.8.20.tgz#44091e335d3fcbc97f6497e63e7f57d5b516b163" - integrity sha512-2rkjiPALhOtRaDX6pWyNqK1fnP5KkJJybYebopNSn6wDG1lxBoFs2+nwwXKoA6glHIrtwrfBBy6da0stkKtTAA== +zen-observable-ts@^0.8.21: + version "0.8.21" + resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-0.8.21.tgz#85d0031fbbde1eba3cd07d3ba90da241215f421d" + integrity sha512-Yj3yXweRc8LdRMrCC8nIc4kkjWecPAUVh0TI0OUrWXx6aX790vLcDlWca6I4vsyCGH3LpWxq0dJRcMOFoVqmeg== dependencies: tslib "^1.9.3" zen-observable "^0.8.0" diff --git a/ecosystem.config.js b/ecosystem.config.js new file mode 100644 index 000000000..a15cfbb49 --- /dev/null +++ b/ecosystem.config.js @@ -0,0 +1,19 @@ +module.exports = { + apps: [ + { + name: "ImEX Online API", + script: "./server.js", + watch: true, + watch_delay: 1000, + ignore_watch: ["node_modules", "client/img"], + watch_options: { + followSymlinks: false, + }, + env: { + NODE_ENV: "production", + }, + instances: "max", + exec_mode: "cluster", + }, + ], +}; diff --git a/firebase/functions/index.js b/firebase/functions/index.js index 3583ca696..779dc1893 100644 --- a/firebase/functions/index.js +++ b/firebase/functions/index.js @@ -2,33 +2,32 @@ const functions = require("firebase-functions"); const admin = require("firebase-admin"); admin.initializeApp(functions.config().firebase); -//TODO Move this to an environment parameter. -const GRAPHQL_ENDPOINT = functions.config().auth.graphql_endpoint; -const HASURA_SECRET_ADMIN_KEY = functions.config().auth.hasura_secret_admin_key; -const UPSERT_USER = ` -mutation upsert_user($authEmail: String!, $authToken: String!) { - insert_users( - objects: [ - { -email:$authEmail, - authid:$authToken - } - ], - on_conflict: { - constraint: users_pkey, - update_columns: [authid] - } - ) { - returning { -authid - } - } -} -`; +// //TODO Move this to an environment parameter. +// const GRAPHQL_ENDPOINT = functions.config().auth.graphql_endpoint; +// const HASURA_SECRET_ADMIN_KEY = functions.config().auth.hasura_secret_admin_key; +// const UPSERT_USER = ` +// mutation upsert_user($authEmail: String!, $authToken: String!) { +// insert_users( +// objects: [ +// { +// email:$authEmail, +// authid:$authToken +// } +// ], +// on_conflict: { +// constraint: users_pkey, +// update_columns: [authid] +// } +// ) { +// returning { +// authid +// } +// } +// } +// `; // On sign up. -exports.processSignUp = functions.auth.user().onCreate(user => { - console.log(user); +exports.processSignUp = functions.auth.user().onCreate((user) => { // Check if user meets role criteria: // Your custom logic here: to decide what roles and other `x-hasura-*` should the user get let customClaims; @@ -37,16 +36,16 @@ exports.processSignUp = functions.auth.user().onCreate(user => { "https://hasura.io/jwt/claims": { "x-hasura-default-role": "admin", "x-hasura-allowed-roles": ["user", "admin"], - "x-hasura-user-id": user.uid - } + "x-hasura-user-id": user.uid, + }, }; } else { customClaims = { "https://hasura.io/jwt/claims": { "x-hasura-default-role": "user", "x-hasura-allowed-roles": ["user"], - "x-hasura-user-id": user.uid - } + "x-hasura-user-id": user.uid, + }, }; } @@ -65,17 +64,15 @@ exports.processSignUp = functions.auth.user().onCreate(user => { // }); // Set custom user claims on this newly created user. - return admin - .auth() - .setCustomUserClaims(user.uid, customClaims) - .then(() => { - // Update real-time database to notify client to force refresh. - const metadataRef = admin.database().ref("metadata/" + user.uid); - // Set the refresh time to the current UTC timestamp. - // This will be captured on the client to force a token refresh. - return metadataRef.set({ refreshTime: new Date().getTime() }); - }) - .catch(error => { - console.log(error); - }); + return admin.auth().setCustomUserClaims(user.uid, customClaims); + // .then(() => { + // // Update real-time database to notify client to force refresh. + // const metadataRef = admin.database().ref("metadata/" + user.uid); + // // Set the refresh time to the current UTC timestamp. + // // This will be captured on the client to force a token refresh. + // return metadataRef.set({ refreshTime: new Date().getTime() }); + // }) + // .catch(error => { + // console.log(error); + // }); }); diff --git a/hasura/migrations/1587502167707_alter_table_public_bodyshops_add_column_production_config/down.yaml b/hasura/migrations/1587502167707_alter_table_public_bodyshops_add_column_production_config/down.yaml new file mode 100644 index 000000000..70dfbcb5b --- /dev/null +++ b/hasura/migrations/1587502167707_alter_table_public_bodyshops_add_column_production_config/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."bodyshops" DROP COLUMN "production_config"; + type: run_sql diff --git a/hasura/migrations/1587502167707_alter_table_public_bodyshops_add_column_production_config/up.yaml b/hasura/migrations/1587502167707_alter_table_public_bodyshops_add_column_production_config/up.yaml new file mode 100644 index 000000000..8a29feb94 --- /dev/null +++ b/hasura/migrations/1587502167707_alter_table_public_bodyshops_add_column_production_config/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."bodyshops" ADD COLUMN "production_config" jsonb NULL; + type: run_sql diff --git a/hasura/migrations/1587502177435_update_permission_user_public_table_bodyshops/down.yaml b/hasura/migrations/1587502177435_update_permission_user_public_table_bodyshops/down.yaml new file mode 100644 index 000000000..f107f80d5 --- /dev/null +++ b/hasura/migrations/1587502177435_update_permission_user_public_table_bodyshops/down.yaml @@ -0,0 +1,46 @@ +- args: + role: user + table: + name: bodyshops + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - address1 + - address2 + - city + - country + - created_at + - email + - federal_tax_id + - id + - insurance_vendor_id + - logo_img_path + - md_order_statuses + - md_responsibility_centers + - md_ro_statuses + - messagingservicesid + - region_config + - shopname + - shoprates + - state + - state_tax_id + - template_header + - textid + - updated_at + - zip_post + computed_fields: [] + filter: + associations: + bodyshop: + associations: + user: + authid: + _eq: X-Hasura-User-Id + role: user + table: + name: bodyshops + schema: public + type: create_select_permission diff --git a/hasura/migrations/1587502177435_update_permission_user_public_table_bodyshops/up.yaml b/hasura/migrations/1587502177435_update_permission_user_public_table_bodyshops/up.yaml new file mode 100644 index 000000000..aac8c63cf --- /dev/null +++ b/hasura/migrations/1587502177435_update_permission_user_public_table_bodyshops/up.yaml @@ -0,0 +1,47 @@ +- args: + role: user + table: + name: bodyshops + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - address1 + - address2 + - city + - country + - created_at + - email + - federal_tax_id + - id + - insurance_vendor_id + - logo_img_path + - md_order_statuses + - md_responsibility_centers + - md_ro_statuses + - messagingservicesid + - production_config + - region_config + - shopname + - shoprates + - state + - state_tax_id + - template_header + - textid + - updated_at + - zip_post + computed_fields: [] + filter: + associations: + bodyshop: + associations: + user: + authid: + _eq: X-Hasura-User-Id + role: user + table: + name: bodyshops + schema: public + type: create_select_permission diff --git a/hasura/migrations/1587502183855_update_permission_user_public_table_bodyshops/down.yaml b/hasura/migrations/1587502183855_update_permission_user_public_table_bodyshops/down.yaml new file mode 100644 index 000000000..5ae0c6dad --- /dev/null +++ b/hasura/migrations/1587502183855_update_permission_user_public_table_bodyshops/down.yaml @@ -0,0 +1,44 @@ +- args: + role: user + table: + name: bodyshops + schema: public + type: drop_update_permission +- args: + permission: + columns: + - address1 + - address2 + - city + - country + - created_at + - email + - federal_tax_id + - id + - insurance_vendor_id + - logo_img_path + - md_order_statuses + - md_responsibility_centers + - md_ro_statuses + - shopname + - shoprates + - state + - state_tax_id + - updated_at + - zip_post + filter: + associations: + bodyshop: + associations: + user: + authid: + _eq: X-Hasura-User-Id + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: bodyshops + schema: public + type: create_update_permission diff --git a/hasura/migrations/1587502183855_update_permission_user_public_table_bodyshops/up.yaml b/hasura/migrations/1587502183855_update_permission_user_public_table_bodyshops/up.yaml new file mode 100644 index 000000000..f7578cf44 --- /dev/null +++ b/hasura/migrations/1587502183855_update_permission_user_public_table_bodyshops/up.yaml @@ -0,0 +1,45 @@ +- args: + role: user + table: + name: bodyshops + schema: public + type: drop_update_permission +- args: + permission: + columns: + - address1 + - address2 + - city + - country + - created_at + - email + - federal_tax_id + - id + - insurance_vendor_id + - logo_img_path + - md_order_statuses + - md_responsibility_centers + - md_ro_statuses + - production_config + - shopname + - shoprates + - state + - state_tax_id + - updated_at + - zip_post + filter: + associations: + bodyshop: + associations: + user: + authid: + _eq: X-Hasura-User-Id + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: bodyshops + schema: public + type: create_update_permission diff --git a/hasura/migrations/1587508371415_alter_table_public_jobs_add_column_production_vars/down.yaml b/hasura/migrations/1587508371415_alter_table_public_jobs_add_column_production_vars/down.yaml new file mode 100644 index 000000000..4131f707b --- /dev/null +++ b/hasura/migrations/1587508371415_alter_table_public_jobs_add_column_production_vars/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."jobs" DROP COLUMN "production_vars"; + type: run_sql diff --git a/hasura/migrations/1587508371415_alter_table_public_jobs_add_column_production_vars/up.yaml b/hasura/migrations/1587508371415_alter_table_public_jobs_add_column_production_vars/up.yaml new file mode 100644 index 000000000..78f05a5a0 --- /dev/null +++ b/hasura/migrations/1587508371415_alter_table_public_jobs_add_column_production_vars/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."jobs" ADD COLUMN "production_vars" jsonb NULL; + type: run_sql diff --git a/hasura/migrations/1587508379993_update_permission_user_public_table_jobs/down.yaml b/hasura/migrations/1587508379993_update_permission_user_public_table_jobs/down.yaml new file mode 100644 index 000000000..785d7b5d3 --- /dev/null +++ b/hasura/migrations/1587508379993_update_permission_user_public_table_jobs/down.yaml @@ -0,0 +1,254 @@ +- args: + role: user + table: + name: jobs + schema: public + type: drop_insert_permission +- args: + permission: + check: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - actual_completion + - actual_delivery + - actual_in + - adj_g_disc + - adj_strdis + - adj_towdis + - adjustment_bottom_line + - agt_addr1 + - agt_addr2 + - agt_city + - agt_co_id + - agt_co_nm + - agt_ct_fn + - agt_ct_ln + - agt_ct_ph + - agt_ct_phx + - agt_ctry + - agt_ea + - agt_fax + - agt_faxx + - agt_lic_no + - agt_ph1 + - agt_ph1x + - agt_ph2 + - agt_ph2x + - agt_st + - agt_zip + - area_of_damage + - asgn_date + - asgn_no + - asgn_type + - cat_no + - cieca_stl + - cieca_ttl + - ciecaid + - clm_addr1 + - clm_addr2 + - clm_city + - clm_ct_fn + - clm_ct_ln + - clm_ct_ph + - clm_ct_phx + - clm_ctry + - clm_ea + - clm_fax + - clm_faxx + - clm_no + - clm_ofc_id + - clm_ofc_nm + - clm_ph1 + - clm_ph1x + - clm_ph2 + - clm_ph2x + - clm_st + - clm_title + - clm_total + - clm_zip + - converted + - created_at + - csr + - cust_pr + - date_closed + - date_estimated + - date_exported + - date_invoiced + - date_open + - date_scheduled + - ded_amt + - ded_status + - depreciation_taxes + - est_addr1 + - est_addr2 + - est_city + - est_co_nm + - est_ct_fn + - est_ct_ln + - est_ctry + - est_ea + - est_number + - est_ph1 + - est_st + - est_zip + - federal_tax_payable + - federal_tax_rate + - g_bett_amt + - id + - inproduction + - ins_addr1 + - ins_addr2 + - ins_city + - ins_co_id + - ins_co_nm + - ins_ct_fn + - ins_ct_ln + - ins_ct_ph + - ins_ct_phx + - ins_ctry + - ins_ea + - ins_fax + - ins_faxx + - ins_memo + - ins_ph1 + - ins_ph1x + - ins_ph2 + - ins_ph2x + - ins_st + - ins_title + - ins_zip + - insd_addr1 + - insd_addr2 + - insd_city + - insd_co_nm + - insd_ctry + - insd_ea + - insd_fax + - insd_faxx + - insd_fn + - insd_ln + - insd_ph1 + - insd_ph1x + - insd_ph2 + - insd_ph2x + - insd_st + - insd_title + - insd_zip + - invoice_date + - job_totals + - kmin + - kmout + - labor_rate_desc + - labor_rate_id + - local_tax_rate + - loss_cat + - loss_date + - loss_desc + - loss_type + - other_amount_payable + - owner_owing + - ownerid + - ownr_addr1 + - ownr_addr2 + - ownr_city + - ownr_co_nm + - ownr_ctry + - ownr_ea + - ownr_fax + - ownr_faxx + - ownr_fn + - ownr_ln + - ownr_ph1 + - ownr_ph1x + - ownr_ph2 + - ownr_ph2x + - ownr_st + - ownr_title + - ownr_zip + - parts_tax_rates + - pay_amt + - pay_chknm + - pay_date + - pay_type + - payee_nms + - plate_no + - plate_st + - po_number + - policy_no + - rate_atp + - rate_la1 + - rate_la2 + - rate_la3 + - rate_la4 + - rate_laa + - rate_lab + - rate_lad + - rate_lae + - rate_laf + - rate_lag + - rate_lam + - rate_lar + - rate_las + - rate_lau + - rate_ma2s + - rate_ma2t + - rate_ma3s + - rate_mabl + - rate_macs + - rate_mahw + - rate_mapa + - rate_mash + - rate_matd + - referral_source + - regie_number + - ro_number + - scheduled_completion + - scheduled_delivery + - scheduled_in + - selling_dealer + - selling_dealer_contact + - servicing_dealer + - servicing_dealer_contact + - shopid + - special_coverage_policy + - state_tax_rate + - status + - statusid + - storage_payable + - tax_lbr_rt + - tax_levies_rt + - tax_paint_mat_rt + - tax_predis + - tax_prethr + - tax_pstthr + - tax_str_rt + - tax_sub_rt + - tax_thramt + - tax_tow_rt + - theft_ind + - tlos_ind + - towing_payable + - unit_number + - updated_at + - v_color + - v_make_desc + - v_model_desc + - v_model_yr + - v_vin + - vehicleid + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: jobs + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1587508379993_update_permission_user_public_table_jobs/up.yaml b/hasura/migrations/1587508379993_update_permission_user_public_table_jobs/up.yaml new file mode 100644 index 000000000..f38c14033 --- /dev/null +++ b/hasura/migrations/1587508379993_update_permission_user_public_table_jobs/up.yaml @@ -0,0 +1,255 @@ +- args: + role: user + table: + name: jobs + schema: public + type: drop_insert_permission +- args: + permission: + check: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - actual_completion + - actual_delivery + - actual_in + - adj_g_disc + - adj_strdis + - adj_towdis + - adjustment_bottom_line + - agt_addr1 + - agt_addr2 + - agt_city + - agt_co_id + - agt_co_nm + - agt_ct_fn + - agt_ct_ln + - agt_ct_ph + - agt_ct_phx + - agt_ctry + - agt_ea + - agt_fax + - agt_faxx + - agt_lic_no + - agt_ph1 + - agt_ph1x + - agt_ph2 + - agt_ph2x + - agt_st + - agt_zip + - area_of_damage + - asgn_date + - asgn_no + - asgn_type + - cat_no + - cieca_stl + - cieca_ttl + - ciecaid + - clm_addr1 + - clm_addr2 + - clm_city + - clm_ct_fn + - clm_ct_ln + - clm_ct_ph + - clm_ct_phx + - clm_ctry + - clm_ea + - clm_fax + - clm_faxx + - clm_no + - clm_ofc_id + - clm_ofc_nm + - clm_ph1 + - clm_ph1x + - clm_ph2 + - clm_ph2x + - clm_st + - clm_title + - clm_total + - clm_zip + - converted + - created_at + - csr + - cust_pr + - date_closed + - date_estimated + - date_exported + - date_invoiced + - date_open + - date_scheduled + - ded_amt + - ded_status + - depreciation_taxes + - est_addr1 + - est_addr2 + - est_city + - est_co_nm + - est_ct_fn + - est_ct_ln + - est_ctry + - est_ea + - est_number + - est_ph1 + - est_st + - est_zip + - federal_tax_payable + - federal_tax_rate + - g_bett_amt + - id + - inproduction + - ins_addr1 + - ins_addr2 + - ins_city + - ins_co_id + - ins_co_nm + - ins_ct_fn + - ins_ct_ln + - ins_ct_ph + - ins_ct_phx + - ins_ctry + - ins_ea + - ins_fax + - ins_faxx + - ins_memo + - ins_ph1 + - ins_ph1x + - ins_ph2 + - ins_ph2x + - ins_st + - ins_title + - ins_zip + - insd_addr1 + - insd_addr2 + - insd_city + - insd_co_nm + - insd_ctry + - insd_ea + - insd_fax + - insd_faxx + - insd_fn + - insd_ln + - insd_ph1 + - insd_ph1x + - insd_ph2 + - insd_ph2x + - insd_st + - insd_title + - insd_zip + - invoice_date + - job_totals + - kmin + - kmout + - labor_rate_desc + - labor_rate_id + - local_tax_rate + - loss_cat + - loss_date + - loss_desc + - loss_type + - other_amount_payable + - owner_owing + - ownerid + - ownr_addr1 + - ownr_addr2 + - ownr_city + - ownr_co_nm + - ownr_ctry + - ownr_ea + - ownr_fax + - ownr_faxx + - ownr_fn + - ownr_ln + - ownr_ph1 + - ownr_ph1x + - ownr_ph2 + - ownr_ph2x + - ownr_st + - ownr_title + - ownr_zip + - parts_tax_rates + - pay_amt + - pay_chknm + - pay_date + - pay_type + - payee_nms + - plate_no + - plate_st + - po_number + - policy_no + - production_vars + - rate_atp + - rate_la1 + - rate_la2 + - rate_la3 + - rate_la4 + - rate_laa + - rate_lab + - rate_lad + - rate_lae + - rate_laf + - rate_lag + - rate_lam + - rate_lar + - rate_las + - rate_lau + - rate_ma2s + - rate_ma2t + - rate_ma3s + - rate_mabl + - rate_macs + - rate_mahw + - rate_mapa + - rate_mash + - rate_matd + - referral_source + - regie_number + - ro_number + - scheduled_completion + - scheduled_delivery + - scheduled_in + - selling_dealer + - selling_dealer_contact + - servicing_dealer + - servicing_dealer_contact + - shopid + - special_coverage_policy + - state_tax_rate + - status + - statusid + - storage_payable + - tax_lbr_rt + - tax_levies_rt + - tax_paint_mat_rt + - tax_predis + - tax_prethr + - tax_pstthr + - tax_str_rt + - tax_sub_rt + - tax_thramt + - tax_tow_rt + - theft_ind + - tlos_ind + - towing_payable + - unit_number + - updated_at + - v_color + - v_make_desc + - v_model_desc + - v_model_yr + - v_vin + - vehicleid + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: jobs + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1587508390066_update_permission_user_public_table_jobs/down.yaml b/hasura/migrations/1587508390066_update_permission_user_public_table_jobs/down.yaml new file mode 100644 index 000000000..4364ff937 --- /dev/null +++ b/hasura/migrations/1587508390066_update_permission_user_public_table_jobs/down.yaml @@ -0,0 +1,252 @@ +- args: + role: user + table: + name: jobs + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - actual_completion + - actual_delivery + - actual_in + - adj_g_disc + - adj_strdis + - adj_towdis + - adjustment_bottom_line + - agt_addr1 + - agt_addr2 + - agt_city + - agt_co_id + - agt_co_nm + - agt_ct_fn + - agt_ct_ln + - agt_ct_ph + - agt_ct_phx + - agt_ctry + - agt_ea + - agt_fax + - agt_faxx + - agt_lic_no + - agt_ph1 + - agt_ph1x + - agt_ph2 + - agt_ph2x + - agt_st + - agt_zip + - area_of_damage + - asgn_date + - asgn_no + - asgn_type + - cat_no + - cieca_stl + - cieca_ttl + - ciecaid + - clm_addr1 + - clm_addr2 + - clm_city + - clm_ct_fn + - clm_ct_ln + - clm_ct_ph + - clm_ct_phx + - clm_ctry + - clm_ea + - clm_fax + - clm_faxx + - clm_no + - clm_ofc_id + - clm_ofc_nm + - clm_ph1 + - clm_ph1x + - clm_ph2 + - clm_ph2x + - clm_st + - clm_title + - clm_total + - clm_zip + - converted + - created_at + - csr + - cust_pr + - date_closed + - date_estimated + - date_exported + - date_invoiced + - date_open + - date_scheduled + - ded_amt + - ded_status + - depreciation_taxes + - est_addr1 + - est_addr2 + - est_city + - est_co_nm + - est_ct_fn + - est_ct_ln + - est_ctry + - est_ea + - est_number + - est_ph1 + - est_st + - est_zip + - federal_tax_payable + - federal_tax_rate + - g_bett_amt + - id + - inproduction + - ins_addr1 + - ins_addr2 + - ins_city + - ins_co_id + - ins_co_nm + - ins_ct_fn + - ins_ct_ln + - ins_ct_ph + - ins_ct_phx + - ins_ctry + - ins_ea + - ins_fax + - ins_faxx + - ins_memo + - ins_ph1 + - ins_ph1x + - ins_ph2 + - ins_ph2x + - ins_st + - ins_title + - ins_zip + - insd_addr1 + - insd_addr2 + - insd_city + - insd_co_nm + - insd_ctry + - insd_ea + - insd_fax + - insd_faxx + - insd_fn + - insd_ln + - insd_ph1 + - insd_ph1x + - insd_ph2 + - insd_ph2x + - insd_st + - insd_title + - insd_zip + - invoice_date + - job_totals + - kmin + - kmout + - labor_rate_desc + - labor_rate_id + - local_tax_rate + - loss_cat + - loss_date + - loss_desc + - loss_type + - other_amount_payable + - owner_owing + - ownerid + - ownr_addr1 + - ownr_addr2 + - ownr_city + - ownr_co_nm + - ownr_ctry + - ownr_ea + - ownr_fax + - ownr_faxx + - ownr_fn + - ownr_ln + - ownr_ph1 + - ownr_ph1x + - ownr_ph2 + - ownr_ph2x + - ownr_st + - ownr_title + - ownr_zip + - parts_tax_rates + - pay_amt + - pay_chknm + - pay_date + - pay_type + - payee_nms + - plate_no + - plate_st + - po_number + - policy_no + - rate_atp + - rate_la1 + - rate_la2 + - rate_la3 + - rate_la4 + - rate_laa + - rate_lab + - rate_lad + - rate_lae + - rate_laf + - rate_lag + - rate_lam + - rate_lar + - rate_las + - rate_lau + - rate_ma2s + - rate_ma2t + - rate_ma3s + - rate_mabl + - rate_macs + - rate_mahw + - rate_mapa + - rate_mash + - rate_matd + - referral_source + - regie_number + - ro_number + - scheduled_completion + - scheduled_delivery + - scheduled_in + - selling_dealer + - selling_dealer_contact + - servicing_dealer + - servicing_dealer_contact + - shopid + - special_coverage_policy + - state_tax_rate + - status + - statusid + - storage_payable + - tax_lbr_rt + - tax_levies_rt + - tax_paint_mat_rt + - tax_predis + - tax_prethr + - tax_pstthr + - tax_str_rt + - tax_sub_rt + - tax_thramt + - tax_tow_rt + - theft_ind + - tlos_ind + - towing_payable + - unit_number + - updated_at + - v_color + - v_make_desc + - v_model_desc + - v_model_yr + - v_vin + - vehicleid + computed_fields: [] + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: jobs + schema: public + type: create_select_permission diff --git a/hasura/migrations/1587508390066_update_permission_user_public_table_jobs/up.yaml b/hasura/migrations/1587508390066_update_permission_user_public_table_jobs/up.yaml new file mode 100644 index 000000000..c5748c7d9 --- /dev/null +++ b/hasura/migrations/1587508390066_update_permission_user_public_table_jobs/up.yaml @@ -0,0 +1,253 @@ +- args: + role: user + table: + name: jobs + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - actual_completion + - actual_delivery + - actual_in + - adj_g_disc + - adj_strdis + - adj_towdis + - adjustment_bottom_line + - agt_addr1 + - agt_addr2 + - agt_city + - agt_co_id + - agt_co_nm + - agt_ct_fn + - agt_ct_ln + - agt_ct_ph + - agt_ct_phx + - agt_ctry + - agt_ea + - agt_fax + - agt_faxx + - agt_lic_no + - agt_ph1 + - agt_ph1x + - agt_ph2 + - agt_ph2x + - agt_st + - agt_zip + - area_of_damage + - asgn_date + - asgn_no + - asgn_type + - cat_no + - cieca_stl + - cieca_ttl + - ciecaid + - clm_addr1 + - clm_addr2 + - clm_city + - clm_ct_fn + - clm_ct_ln + - clm_ct_ph + - clm_ct_phx + - clm_ctry + - clm_ea + - clm_fax + - clm_faxx + - clm_no + - clm_ofc_id + - clm_ofc_nm + - clm_ph1 + - clm_ph1x + - clm_ph2 + - clm_ph2x + - clm_st + - clm_title + - clm_total + - clm_zip + - converted + - created_at + - csr + - cust_pr + - date_closed + - date_estimated + - date_exported + - date_invoiced + - date_open + - date_scheduled + - ded_amt + - ded_status + - depreciation_taxes + - est_addr1 + - est_addr2 + - est_city + - est_co_nm + - est_ct_fn + - est_ct_ln + - est_ctry + - est_ea + - est_number + - est_ph1 + - est_st + - est_zip + - federal_tax_payable + - federal_tax_rate + - g_bett_amt + - id + - inproduction + - ins_addr1 + - ins_addr2 + - ins_city + - ins_co_id + - ins_co_nm + - ins_ct_fn + - ins_ct_ln + - ins_ct_ph + - ins_ct_phx + - ins_ctry + - ins_ea + - ins_fax + - ins_faxx + - ins_memo + - ins_ph1 + - ins_ph1x + - ins_ph2 + - ins_ph2x + - ins_st + - ins_title + - ins_zip + - insd_addr1 + - insd_addr2 + - insd_city + - insd_co_nm + - insd_ctry + - insd_ea + - insd_fax + - insd_faxx + - insd_fn + - insd_ln + - insd_ph1 + - insd_ph1x + - insd_ph2 + - insd_ph2x + - insd_st + - insd_title + - insd_zip + - invoice_date + - job_totals + - kmin + - kmout + - labor_rate_desc + - labor_rate_id + - local_tax_rate + - loss_cat + - loss_date + - loss_desc + - loss_type + - other_amount_payable + - owner_owing + - ownerid + - ownr_addr1 + - ownr_addr2 + - ownr_city + - ownr_co_nm + - ownr_ctry + - ownr_ea + - ownr_fax + - ownr_faxx + - ownr_fn + - ownr_ln + - ownr_ph1 + - ownr_ph1x + - ownr_ph2 + - ownr_ph2x + - ownr_st + - ownr_title + - ownr_zip + - parts_tax_rates + - pay_amt + - pay_chknm + - pay_date + - pay_type + - payee_nms + - plate_no + - plate_st + - po_number + - policy_no + - production_vars + - rate_atp + - rate_la1 + - rate_la2 + - rate_la3 + - rate_la4 + - rate_laa + - rate_lab + - rate_lad + - rate_lae + - rate_laf + - rate_lag + - rate_lam + - rate_lar + - rate_las + - rate_lau + - rate_ma2s + - rate_ma2t + - rate_ma3s + - rate_mabl + - rate_macs + - rate_mahw + - rate_mapa + - rate_mash + - rate_matd + - referral_source + - regie_number + - ro_number + - scheduled_completion + - scheduled_delivery + - scheduled_in + - selling_dealer + - selling_dealer_contact + - servicing_dealer + - servicing_dealer_contact + - shopid + - special_coverage_policy + - state_tax_rate + - status + - statusid + - storage_payable + - tax_lbr_rt + - tax_levies_rt + - tax_paint_mat_rt + - tax_predis + - tax_prethr + - tax_pstthr + - tax_str_rt + - tax_sub_rt + - tax_thramt + - tax_tow_rt + - theft_ind + - tlos_ind + - towing_payable + - unit_number + - updated_at + - v_color + - v_make_desc + - v_model_desc + - v_model_yr + - v_vin + - vehicleid + computed_fields: [] + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: jobs + schema: public + type: create_select_permission diff --git a/hasura/migrations/1587508396891_update_permission_user_public_table_jobs/down.yaml b/hasura/migrations/1587508396891_update_permission_user_public_table_jobs/down.yaml new file mode 100644 index 000000000..06e843cbc --- /dev/null +++ b/hasura/migrations/1587508396891_update_permission_user_public_table_jobs/down.yaml @@ -0,0 +1,254 @@ +- args: + role: user + table: + name: jobs + schema: public + type: drop_update_permission +- args: + permission: + columns: + - actual_completion + - actual_delivery + - actual_in + - adj_g_disc + - adj_strdis + - adj_towdis + - adjustment_bottom_line + - agt_addr1 + - agt_addr2 + - agt_city + - agt_co_id + - agt_co_nm + - agt_ct_fn + - agt_ct_ln + - agt_ct_ph + - agt_ct_phx + - agt_ctry + - agt_ea + - agt_fax + - agt_faxx + - agt_lic_no + - agt_ph1 + - agt_ph1x + - agt_ph2 + - agt_ph2x + - agt_st + - agt_zip + - area_of_damage + - asgn_date + - asgn_no + - asgn_type + - cat_no + - cieca_stl + - cieca_ttl + - ciecaid + - clm_addr1 + - clm_addr2 + - clm_city + - clm_ct_fn + - clm_ct_ln + - clm_ct_ph + - clm_ct_phx + - clm_ctry + - clm_ea + - clm_fax + - clm_faxx + - clm_no + - clm_ofc_id + - clm_ofc_nm + - clm_ph1 + - clm_ph1x + - clm_ph2 + - clm_ph2x + - clm_st + - clm_title + - clm_total + - clm_zip + - converted + - created_at + - csr + - cust_pr + - date_closed + - date_estimated + - date_exported + - date_invoiced + - date_open + - date_scheduled + - ded_amt + - ded_status + - depreciation_taxes + - est_addr1 + - est_addr2 + - est_city + - est_co_nm + - est_ct_fn + - est_ct_ln + - est_ctry + - est_ea + - est_number + - est_ph1 + - est_st + - est_zip + - federal_tax_payable + - federal_tax_rate + - g_bett_amt + - id + - inproduction + - ins_addr1 + - ins_addr2 + - ins_city + - ins_co_id + - ins_co_nm + - ins_ct_fn + - ins_ct_ln + - ins_ct_ph + - ins_ct_phx + - ins_ctry + - ins_ea + - ins_fax + - ins_faxx + - ins_memo + - ins_ph1 + - ins_ph1x + - ins_ph2 + - ins_ph2x + - ins_st + - ins_title + - ins_zip + - insd_addr1 + - insd_addr2 + - insd_city + - insd_co_nm + - insd_ctry + - insd_ea + - insd_fax + - insd_faxx + - insd_fn + - insd_ln + - insd_ph1 + - insd_ph1x + - insd_ph2 + - insd_ph2x + - insd_st + - insd_title + - insd_zip + - invoice_date + - job_totals + - kmin + - kmout + - labor_rate_desc + - labor_rate_id + - local_tax_rate + - loss_cat + - loss_date + - loss_desc + - loss_type + - other_amount_payable + - owner_owing + - ownerid + - ownr_addr1 + - ownr_addr2 + - ownr_city + - ownr_co_nm + - ownr_ctry + - ownr_ea + - ownr_fax + - ownr_faxx + - ownr_fn + - ownr_ln + - ownr_ph1 + - ownr_ph1x + - ownr_ph2 + - ownr_ph2x + - ownr_st + - ownr_title + - ownr_zip + - parts_tax_rates + - pay_amt + - pay_chknm + - pay_date + - pay_type + - payee_nms + - plate_no + - plate_st + - po_number + - policy_no + - rate_atp + - rate_la1 + - rate_la2 + - rate_la3 + - rate_la4 + - rate_laa + - rate_lab + - rate_lad + - rate_lae + - rate_laf + - rate_lag + - rate_lam + - rate_lar + - rate_las + - rate_lau + - rate_ma2s + - rate_ma2t + - rate_ma3s + - rate_mabl + - rate_macs + - rate_mahw + - rate_mapa + - rate_mash + - rate_matd + - referral_source + - regie_number + - ro_number + - scheduled_completion + - scheduled_delivery + - scheduled_in + - selling_dealer + - selling_dealer_contact + - servicing_dealer + - servicing_dealer_contact + - shopid + - special_coverage_policy + - state_tax_rate + - status + - statusid + - storage_payable + - tax_lbr_rt + - tax_levies_rt + - tax_paint_mat_rt + - tax_predis + - tax_prethr + - tax_pstthr + - tax_str_rt + - tax_sub_rt + - tax_thramt + - tax_tow_rt + - theft_ind + - tlos_ind + - towing_payable + - unit_number + - updated_at + - v_color + - v_make_desc + - v_model_desc + - v_model_yr + - v_vin + - vehicleid + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: jobs + schema: public + type: create_update_permission diff --git a/hasura/migrations/1587508396891_update_permission_user_public_table_jobs/up.yaml b/hasura/migrations/1587508396891_update_permission_user_public_table_jobs/up.yaml new file mode 100644 index 000000000..b7b713a69 --- /dev/null +++ b/hasura/migrations/1587508396891_update_permission_user_public_table_jobs/up.yaml @@ -0,0 +1,255 @@ +- args: + role: user + table: + name: jobs + schema: public + type: drop_update_permission +- args: + permission: + columns: + - actual_completion + - actual_delivery + - actual_in + - adj_g_disc + - adj_strdis + - adj_towdis + - adjustment_bottom_line + - agt_addr1 + - agt_addr2 + - agt_city + - agt_co_id + - agt_co_nm + - agt_ct_fn + - agt_ct_ln + - agt_ct_ph + - agt_ct_phx + - agt_ctry + - agt_ea + - agt_fax + - agt_faxx + - agt_lic_no + - agt_ph1 + - agt_ph1x + - agt_ph2 + - agt_ph2x + - agt_st + - agt_zip + - area_of_damage + - asgn_date + - asgn_no + - asgn_type + - cat_no + - cieca_stl + - cieca_ttl + - ciecaid + - clm_addr1 + - clm_addr2 + - clm_city + - clm_ct_fn + - clm_ct_ln + - clm_ct_ph + - clm_ct_phx + - clm_ctry + - clm_ea + - clm_fax + - clm_faxx + - clm_no + - clm_ofc_id + - clm_ofc_nm + - clm_ph1 + - clm_ph1x + - clm_ph2 + - clm_ph2x + - clm_st + - clm_title + - clm_total + - clm_zip + - converted + - created_at + - csr + - cust_pr + - date_closed + - date_estimated + - date_exported + - date_invoiced + - date_open + - date_scheduled + - ded_amt + - ded_status + - depreciation_taxes + - est_addr1 + - est_addr2 + - est_city + - est_co_nm + - est_ct_fn + - est_ct_ln + - est_ctry + - est_ea + - est_number + - est_ph1 + - est_st + - est_zip + - federal_tax_payable + - federal_tax_rate + - g_bett_amt + - id + - inproduction + - ins_addr1 + - ins_addr2 + - ins_city + - ins_co_id + - ins_co_nm + - ins_ct_fn + - ins_ct_ln + - ins_ct_ph + - ins_ct_phx + - ins_ctry + - ins_ea + - ins_fax + - ins_faxx + - ins_memo + - ins_ph1 + - ins_ph1x + - ins_ph2 + - ins_ph2x + - ins_st + - ins_title + - ins_zip + - insd_addr1 + - insd_addr2 + - insd_city + - insd_co_nm + - insd_ctry + - insd_ea + - insd_fax + - insd_faxx + - insd_fn + - insd_ln + - insd_ph1 + - insd_ph1x + - insd_ph2 + - insd_ph2x + - insd_st + - insd_title + - insd_zip + - invoice_date + - job_totals + - kmin + - kmout + - labor_rate_desc + - labor_rate_id + - local_tax_rate + - loss_cat + - loss_date + - loss_desc + - loss_type + - other_amount_payable + - owner_owing + - ownerid + - ownr_addr1 + - ownr_addr2 + - ownr_city + - ownr_co_nm + - ownr_ctry + - ownr_ea + - ownr_fax + - ownr_faxx + - ownr_fn + - ownr_ln + - ownr_ph1 + - ownr_ph1x + - ownr_ph2 + - ownr_ph2x + - ownr_st + - ownr_title + - ownr_zip + - parts_tax_rates + - pay_amt + - pay_chknm + - pay_date + - pay_type + - payee_nms + - plate_no + - plate_st + - po_number + - policy_no + - production_vars + - rate_atp + - rate_la1 + - rate_la2 + - rate_la3 + - rate_la4 + - rate_laa + - rate_lab + - rate_lad + - rate_lae + - rate_laf + - rate_lag + - rate_lam + - rate_lar + - rate_las + - rate_lau + - rate_ma2s + - rate_ma2t + - rate_ma3s + - rate_mabl + - rate_macs + - rate_mahw + - rate_mapa + - rate_mash + - rate_matd + - referral_source + - regie_number + - ro_number + - scheduled_completion + - scheduled_delivery + - scheduled_in + - selling_dealer + - selling_dealer_contact + - servicing_dealer + - servicing_dealer_contact + - shopid + - special_coverage_policy + - state_tax_rate + - status + - statusid + - storage_payable + - tax_lbr_rt + - tax_levies_rt + - tax_paint_mat_rt + - tax_predis + - tax_prethr + - tax_pstthr + - tax_str_rt + - tax_sub_rt + - tax_thramt + - tax_tow_rt + - theft_ind + - tlos_ind + - towing_payable + - unit_number + - updated_at + - v_color + - v_make_desc + - v_model_desc + - v_model_yr + - v_vin + - vehicleid + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: jobs + schema: public + type: create_update_permission diff --git a/hasura/migrations/1587574775829_run_sql_migration/down.yaml b/hasura/migrations/1587574775829_run_sql_migration/down.yaml new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/hasura/migrations/1587574775829_run_sql_migration/down.yaml @@ -0,0 +1 @@ +[] diff --git a/hasura/migrations/1587574775829_run_sql_migration/up.yaml b/hasura/migrations/1587574775829_run_sql_migration/up.yaml new file mode 100644 index 000000000..2619b9b6c --- /dev/null +++ b/hasura/migrations/1587574775829_run_sql_migration/up.yaml @@ -0,0 +1,23 @@ +- args: + cascade: true + read_only: false + sql: "create view productionview as \r\nselect j.id ,\r\n + \ j.status ,\r\n j.ro_number ,\r\n j.est_number + \ ,\r\n j.ownr_fn ,\r\n j.ownr_ln ,\r\n + \ j.v_model_yr ,\r\n j.v_model_desc ,\r\n j.clm_no + \ ,\r\n j.v_make_desc ,\r\n j.v_color + \ ,\r\n j.plate_no ,\r\n j.actual_in + \ ,\r\n j.scheduled_completion ,\r\n j.scheduled_delivery + \ ,\r\n j.ins_co_nm ,\r\n j.clm_total ,\r\n + \ j.ownr_ph1 ,\r\n j.special_coverage_policy ,\r\n j.production_vars + \ ,\r\n lab.labhrs, lar.larhrs\r\n from public.jobs j\r\n left + join \r\n (select l.jobid, sum(l.mod_lb_hrs ) labhrs from public.joblines + l where mod_lbr_ty = 'LAB' group by l.jobid ) lab on lab.jobid = j.id \r\n + \ left join (select l2.jobid, sum(l2.mod_lb_hrs ) larhrs from public.joblines + l2 where mod_lbr_ty = 'LAR' group by l2.jobid ) lar on lar.jobid = j.id\r\n + \ where j.inproduction =true;" + type: run_sql +- args: + name: productionview + schema: public + type: add_existing_table_or_view diff --git a/hasura/migrations/1587574953110_create_relationship_bodyshop_public_table_productionview/down.yaml b/hasura/migrations/1587574953110_create_relationship_bodyshop_public_table_productionview/down.yaml new file mode 100644 index 000000000..c8bccabac --- /dev/null +++ b/hasura/migrations/1587574953110_create_relationship_bodyshop_public_table_productionview/down.yaml @@ -0,0 +1,6 @@ +- args: + relationship: bodyshop + table: + name: productionview + schema: public + type: drop_relationship diff --git a/hasura/migrations/1587574953110_create_relationship_bodyshop_public_table_productionview/up.yaml b/hasura/migrations/1587574953110_create_relationship_bodyshop_public_table_productionview/up.yaml new file mode 100644 index 000000000..f8844bb39 --- /dev/null +++ b/hasura/migrations/1587574953110_create_relationship_bodyshop_public_table_productionview/up.yaml @@ -0,0 +1,13 @@ +- args: + name: bodyshop + table: + name: productionview + schema: public + using: + manual_configuration: + column_mapping: + id: id + remote_table: + name: jobs + schema: public + type: create_object_relationship diff --git a/hasura/migrations/1587575091197_run_sql_migration/down.yaml b/hasura/migrations/1587575091197_run_sql_migration/down.yaml new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/hasura/migrations/1587575091197_run_sql_migration/down.yaml @@ -0,0 +1 @@ +[] diff --git a/hasura/migrations/1587575091197_run_sql_migration/up.yaml b/hasura/migrations/1587575091197_run_sql_migration/up.yaml new file mode 100644 index 000000000..a537dc96a --- /dev/null +++ b/hasura/migrations/1587575091197_run_sql_migration/up.yaml @@ -0,0 +1,16 @@ +- args: + cascade: true + read_only: false + sql: "CREATE OR REPLACE VIEW \"public\".\"productionview\" AS \n SELECT j.id,\n + \ j.status,\n j.ro_number,\n j.est_number,\n j.ownr_fn,\n j.ownr_ln,\n + \ j.v_model_yr,\n j.v_model_desc,\n j.clm_no,\n j.v_make_desc,\n + \ j.v_color,\n j.plate_no,\n j.actual_in,\n j.scheduled_completion,\n + \ j.scheduled_delivery,\n j.ins_co_nm,\n j.clm_total,\n j.ownr_ph1,\n + \ j.special_coverage_policy,\n j.production_vars,\n lab.labhrs,\n lar.larhrs,\n + \ j.shopid\n FROM ((jobs j\n LEFT JOIN ( SELECT l.jobid,\n sum(l.mod_lb_hrs) + AS labhrs\n FROM joblines l\n WHERE (l.mod_lbr_ty = 'LAB'::text)\n + \ GROUP BY l.jobid) lab ON ((lab.jobid = j.id)))\n LEFT JOIN ( SELECT + l2.jobid,\n sum(l2.mod_lb_hrs) AS larhrs\n FROM joblines + l2\n WHERE (l2.mod_lbr_ty = 'LAR'::text)\n GROUP BY l2.jobid) + lar ON ((lar.jobid = j.id)))\n WHERE (j.inproduction = true);" + type: run_sql diff --git a/hasura/migrations/1587575103804_drop_relationship_bodyshop_public_table_productionview/down.yaml b/hasura/migrations/1587575103804_drop_relationship_bodyshop_public_table_productionview/down.yaml new file mode 100644 index 000000000..cceca611c --- /dev/null +++ b/hasura/migrations/1587575103804_drop_relationship_bodyshop_public_table_productionview/down.yaml @@ -0,0 +1,8 @@ +- args: + name: bodyshop + table: + name: productionview + schema: public + using: + foreign_key_constraint_on: id + type: create_object_relationship diff --git a/hasura/migrations/1587575103804_drop_relationship_bodyshop_public_table_productionview/up.yaml b/hasura/migrations/1587575103804_drop_relationship_bodyshop_public_table_productionview/up.yaml new file mode 100644 index 000000000..c8bccabac --- /dev/null +++ b/hasura/migrations/1587575103804_drop_relationship_bodyshop_public_table_productionview/up.yaml @@ -0,0 +1,6 @@ +- args: + relationship: bodyshop + table: + name: productionview + schema: public + type: drop_relationship diff --git a/hasura/migrations/1587575121219_create_relationship_bodyshop_public_table_productionview/down.yaml b/hasura/migrations/1587575121219_create_relationship_bodyshop_public_table_productionview/down.yaml new file mode 100644 index 000000000..c8bccabac --- /dev/null +++ b/hasura/migrations/1587575121219_create_relationship_bodyshop_public_table_productionview/down.yaml @@ -0,0 +1,6 @@ +- args: + relationship: bodyshop + table: + name: productionview + schema: public + type: drop_relationship diff --git a/hasura/migrations/1587575121219_create_relationship_bodyshop_public_table_productionview/up.yaml b/hasura/migrations/1587575121219_create_relationship_bodyshop_public_table_productionview/up.yaml new file mode 100644 index 000000000..b91854674 --- /dev/null +++ b/hasura/migrations/1587575121219_create_relationship_bodyshop_public_table_productionview/up.yaml @@ -0,0 +1,13 @@ +- args: + name: bodyshop + table: + name: productionview + schema: public + using: + manual_configuration: + column_mapping: + shopid: id + remote_table: + name: bodyshops + schema: public + type: create_object_relationship diff --git a/hasura/migrations/1587575154011_update_permission_user_public_table_productionview/down.yaml b/hasura/migrations/1587575154011_update_permission_user_public_table_productionview/down.yaml new file mode 100644 index 000000000..d2ca2e22f --- /dev/null +++ b/hasura/migrations/1587575154011_update_permission_user_public_table_productionview/down.yaml @@ -0,0 +1,6 @@ +- args: + role: user + table: + name: productionview + schema: public + type: drop_select_permission diff --git a/hasura/migrations/1587575154011_update_permission_user_public_table_productionview/up.yaml b/hasura/migrations/1587575154011_update_permission_user_public_table_productionview/up.yaml new file mode 100644 index 000000000..197dd8d08 --- /dev/null +++ b/hasura/migrations/1587575154011_update_permission_user_public_table_productionview/up.yaml @@ -0,0 +1,43 @@ +- args: + permission: + allow_aggregations: false + columns: + - id + - status + - ro_number + - est_number + - ownr_fn + - ownr_ln + - v_model_yr + - v_model_desc + - clm_no + - v_make_desc + - v_color + - plate_no + - actual_in + - scheduled_completion + - scheduled_delivery + - ins_co_nm + - clm_total + - ownr_ph1 + - special_coverage_policy + - production_vars + - labhrs + - larhrs + - shopid + computed_fields: [] + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + limit: null + role: user + table: + name: productionview + schema: public + type: create_select_permission diff --git a/hasura/migrations/1587662612682_alter_table_public_joblines_add_column_removed/down.yaml b/hasura/migrations/1587662612682_alter_table_public_joblines_add_column_removed/down.yaml new file mode 100644 index 000000000..c7e3cffdb --- /dev/null +++ b/hasura/migrations/1587662612682_alter_table_public_joblines_add_column_removed/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."joblines" DROP COLUMN "removed"; + type: run_sql diff --git a/hasura/migrations/1587662612682_alter_table_public_joblines_add_column_removed/up.yaml b/hasura/migrations/1587662612682_alter_table_public_joblines_add_column_removed/up.yaml new file mode 100644 index 000000000..708dec3bc --- /dev/null +++ b/hasura/migrations/1587662612682_alter_table_public_joblines_add_column_removed/up.yaml @@ -0,0 +1,6 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."joblines" ADD COLUMN "removed" boolean NOT NULL DEFAULT + false; + type: run_sql diff --git a/hasura/migrations/1587662623164_update_permission_user_public_table_joblines/down.yaml b/hasura/migrations/1587662623164_update_permission_user_public_table_joblines/down.yaml new file mode 100644 index 000000000..df8b59464 --- /dev/null +++ b/hasura/migrations/1587662623164_update_permission_user_public_table_joblines/down.yaml @@ -0,0 +1,76 @@ +- args: + role: user + table: + name: joblines + schema: public + type: drop_insert_permission +- args: + permission: + check: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - id + - created_at + - updated_at + - jobid + - unq_seq + - line_ind + - line_desc + - part_type + - oem_partno + - est_seq + - db_ref + - line_ref + - tax_part + - db_price + - act_price + - part_qty + - alt_partno + - mod_lbr_ty + - db_hrs + - mod_lb_hrs + - lbr_op + - lbr_amt + - glass_flag + - price_inc + - alt_part_i + - price_j + - cert_part + - alt_co_id + - alt_overrd + - alt_partm + - prt_dsmk_p + - prt_dsmk_m + - lbr_inc + - lbr_hrs_j + - lbr_typ_j + - lbr_op_j + - paint_stg + - paint_tone + - lbr_tax + - misc_amt + - misc_sublt + - misc_tax + - bett_type + - bett_pctg + - bett_amt + - bett_tax + - op_code_desc + - status + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: joblines + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1587662623164_update_permission_user_public_table_joblines/up.yaml b/hasura/migrations/1587662623164_update_permission_user_public_table_joblines/up.yaml new file mode 100644 index 000000000..b538e5cd6 --- /dev/null +++ b/hasura/migrations/1587662623164_update_permission_user_public_table_joblines/up.yaml @@ -0,0 +1,77 @@ +- args: + role: user + table: + name: joblines + schema: public + type: drop_insert_permission +- args: + permission: + check: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - act_price + - alt_co_id + - alt_overrd + - alt_part_i + - alt_partm + - alt_partno + - bett_amt + - bett_pctg + - bett_tax + - bett_type + - cert_part + - created_at + - db_hrs + - db_price + - db_ref + - est_seq + - glass_flag + - id + - jobid + - lbr_amt + - lbr_hrs_j + - lbr_inc + - lbr_op + - lbr_op_j + - lbr_tax + - lbr_typ_j + - line_desc + - line_ind + - line_ref + - misc_amt + - misc_sublt + - misc_tax + - mod_lb_hrs + - mod_lbr_ty + - oem_partno + - op_code_desc + - paint_stg + - paint_tone + - part_qty + - part_type + - price_inc + - price_j + - prt_dsmk_m + - prt_dsmk_p + - removed + - status + - tax_part + - unq_seq + - updated_at + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: joblines + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1587662633919_update_permission_user_public_table_joblines/down.yaml b/hasura/migrations/1587662633919_update_permission_user_public_table_joblines/down.yaml new file mode 100644 index 000000000..317c3b0d8 --- /dev/null +++ b/hasura/migrations/1587662633919_update_permission_user_public_table_joblines/down.yaml @@ -0,0 +1,74 @@ +- args: + role: user + table: + name: joblines + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: true + columns: + - alt_overrd + - alt_part_i + - bett_tax + - cert_part + - glass_flag + - lbr_hrs_j + - lbr_inc + - lbr_op_j + - lbr_tax + - lbr_typ_j + - misc_sublt + - misc_tax + - price_inc + - price_j + - tax_part + - est_seq + - paint_stg + - paint_tone + - part_qty + - unq_seq + - act_price + - bett_amt + - bett_pctg + - db_hrs + - db_price + - lbr_amt + - line_ref + - misc_amt + - mod_lb_hrs + - prt_dsmk_m + - prt_dsmk_p + - alt_co_id + - alt_partm + - alt_partno + - bett_type + - db_ref + - lbr_op + - line_desc + - line_ind + - mod_lbr_ty + - oem_partno + - op_code_desc + - part_type + - status + - created_at + - updated_at + - id + - jobid + computed_fields: [] + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: joblines + schema: public + type: create_select_permission diff --git a/hasura/migrations/1587662633919_update_permission_user_public_table_joblines/up.yaml b/hasura/migrations/1587662633919_update_permission_user_public_table_joblines/up.yaml new file mode 100644 index 000000000..38bb4c509 --- /dev/null +++ b/hasura/migrations/1587662633919_update_permission_user_public_table_joblines/up.yaml @@ -0,0 +1,75 @@ +- args: + role: user + table: + name: joblines + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: true + columns: + - act_price + - alt_co_id + - alt_overrd + - alt_part_i + - alt_partm + - alt_partno + - bett_amt + - bett_pctg + - bett_tax + - bett_type + - cert_part + - created_at + - db_hrs + - db_price + - db_ref + - est_seq + - glass_flag + - id + - jobid + - lbr_amt + - lbr_hrs_j + - lbr_inc + - lbr_op + - lbr_op_j + - lbr_tax + - lbr_typ_j + - line_desc + - line_ind + - line_ref + - misc_amt + - misc_sublt + - misc_tax + - mod_lb_hrs + - mod_lbr_ty + - oem_partno + - op_code_desc + - paint_stg + - paint_tone + - part_qty + - part_type + - price_inc + - price_j + - prt_dsmk_m + - prt_dsmk_p + - removed + - status + - tax_part + - unq_seq + - updated_at + computed_fields: [] + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: joblines + schema: public + type: create_select_permission diff --git a/hasura/migrations/1587662641941_update_permission_user_public_table_joblines/down.yaml b/hasura/migrations/1587662641941_update_permission_user_public_table_joblines/down.yaml new file mode 100644 index 000000000..a04baffe3 --- /dev/null +++ b/hasura/migrations/1587662641941_update_permission_user_public_table_joblines/down.yaml @@ -0,0 +1,76 @@ +- args: + role: user + table: + name: joblines + schema: public + type: drop_update_permission +- args: + permission: + columns: + - alt_overrd + - alt_part_i + - bett_tax + - cert_part + - glass_flag + - lbr_hrs_j + - lbr_inc + - lbr_op_j + - lbr_tax + - lbr_typ_j + - misc_sublt + - misc_tax + - price_inc + - price_j + - tax_part + - est_seq + - paint_stg + - paint_tone + - part_qty + - unq_seq + - act_price + - bett_amt + - bett_pctg + - db_hrs + - db_price + - lbr_amt + - line_ref + - misc_amt + - mod_lb_hrs + - prt_dsmk_m + - prt_dsmk_p + - alt_co_id + - alt_partm + - alt_partno + - bett_type + - db_ref + - lbr_op + - line_desc + - line_ind + - mod_lbr_ty + - oem_partno + - op_code_desc + - part_type + - status + - created_at + - updated_at + - id + - jobid + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: joblines + schema: public + type: create_update_permission diff --git a/hasura/migrations/1587662641941_update_permission_user_public_table_joblines/up.yaml b/hasura/migrations/1587662641941_update_permission_user_public_table_joblines/up.yaml new file mode 100644 index 000000000..179d1c4d2 --- /dev/null +++ b/hasura/migrations/1587662641941_update_permission_user_public_table_joblines/up.yaml @@ -0,0 +1,77 @@ +- args: + role: user + table: + name: joblines + schema: public + type: drop_update_permission +- args: + permission: + columns: + - act_price + - alt_co_id + - alt_overrd + - alt_part_i + - alt_partm + - alt_partno + - bett_amt + - bett_pctg + - bett_tax + - bett_type + - cert_part + - created_at + - db_hrs + - db_price + - db_ref + - est_seq + - glass_flag + - id + - jobid + - lbr_amt + - lbr_hrs_j + - lbr_inc + - lbr_op + - lbr_op_j + - lbr_tax + - lbr_typ_j + - line_desc + - line_ind + - line_ref + - misc_amt + - misc_sublt + - misc_tax + - mod_lb_hrs + - mod_lbr_ty + - oem_partno + - op_code_desc + - paint_stg + - paint_tone + - part_qty + - part_type + - price_inc + - price_j + - prt_dsmk_m + - prt_dsmk_p + - removed + - status + - tax_part + - unq_seq + - updated_at + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: joblines + schema: public + type: create_update_permission diff --git a/hasura/migrations/1587663736545_alter_table_public_joblines_add_column_line_no/down.yaml b/hasura/migrations/1587663736545_alter_table_public_joblines_add_column_line_no/down.yaml new file mode 100644 index 000000000..d5935b182 --- /dev/null +++ b/hasura/migrations/1587663736545_alter_table_public_joblines_add_column_line_no/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."joblines" DROP COLUMN "line_no"; + type: run_sql diff --git a/hasura/migrations/1587663736545_alter_table_public_joblines_add_column_line_no/up.yaml b/hasura/migrations/1587663736545_alter_table_public_joblines_add_column_line_no/up.yaml new file mode 100644 index 000000000..c1ab9a269 --- /dev/null +++ b/hasura/migrations/1587663736545_alter_table_public_joblines_add_column_line_no/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."joblines" ADD COLUMN "line_no" integer NULL; + type: run_sql diff --git a/hasura/migrations/1587663746281_update_permission_user_public_table_joblines/down.yaml b/hasura/migrations/1587663746281_update_permission_user_public_table_joblines/down.yaml new file mode 100644 index 000000000..b538e5cd6 --- /dev/null +++ b/hasura/migrations/1587663746281_update_permission_user_public_table_joblines/down.yaml @@ -0,0 +1,77 @@ +- args: + role: user + table: + name: joblines + schema: public + type: drop_insert_permission +- args: + permission: + check: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - act_price + - alt_co_id + - alt_overrd + - alt_part_i + - alt_partm + - alt_partno + - bett_amt + - bett_pctg + - bett_tax + - bett_type + - cert_part + - created_at + - db_hrs + - db_price + - db_ref + - est_seq + - glass_flag + - id + - jobid + - lbr_amt + - lbr_hrs_j + - lbr_inc + - lbr_op + - lbr_op_j + - lbr_tax + - lbr_typ_j + - line_desc + - line_ind + - line_ref + - misc_amt + - misc_sublt + - misc_tax + - mod_lb_hrs + - mod_lbr_ty + - oem_partno + - op_code_desc + - paint_stg + - paint_tone + - part_qty + - part_type + - price_inc + - price_j + - prt_dsmk_m + - prt_dsmk_p + - removed + - status + - tax_part + - unq_seq + - updated_at + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: joblines + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1587663746281_update_permission_user_public_table_joblines/up.yaml b/hasura/migrations/1587663746281_update_permission_user_public_table_joblines/up.yaml new file mode 100644 index 000000000..7e1e53880 --- /dev/null +++ b/hasura/migrations/1587663746281_update_permission_user_public_table_joblines/up.yaml @@ -0,0 +1,78 @@ +- args: + role: user + table: + name: joblines + schema: public + type: drop_insert_permission +- args: + permission: + check: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - act_price + - alt_co_id + - alt_overrd + - alt_part_i + - alt_partm + - alt_partno + - bett_amt + - bett_pctg + - bett_tax + - bett_type + - cert_part + - created_at + - db_hrs + - db_price + - db_ref + - est_seq + - glass_flag + - id + - jobid + - lbr_amt + - lbr_hrs_j + - lbr_inc + - lbr_op + - lbr_op_j + - lbr_tax + - lbr_typ_j + - line_desc + - line_ind + - line_no + - line_ref + - misc_amt + - misc_sublt + - misc_tax + - mod_lb_hrs + - mod_lbr_ty + - oem_partno + - op_code_desc + - paint_stg + - paint_tone + - part_qty + - part_type + - price_inc + - price_j + - prt_dsmk_m + - prt_dsmk_p + - removed + - status + - tax_part + - unq_seq + - updated_at + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: joblines + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1587663753304_update_permission_user_public_table_joblines/down.yaml b/hasura/migrations/1587663753304_update_permission_user_public_table_joblines/down.yaml new file mode 100644 index 000000000..38bb4c509 --- /dev/null +++ b/hasura/migrations/1587663753304_update_permission_user_public_table_joblines/down.yaml @@ -0,0 +1,75 @@ +- args: + role: user + table: + name: joblines + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: true + columns: + - act_price + - alt_co_id + - alt_overrd + - alt_part_i + - alt_partm + - alt_partno + - bett_amt + - bett_pctg + - bett_tax + - bett_type + - cert_part + - created_at + - db_hrs + - db_price + - db_ref + - est_seq + - glass_flag + - id + - jobid + - lbr_amt + - lbr_hrs_j + - lbr_inc + - lbr_op + - lbr_op_j + - lbr_tax + - lbr_typ_j + - line_desc + - line_ind + - line_ref + - misc_amt + - misc_sublt + - misc_tax + - mod_lb_hrs + - mod_lbr_ty + - oem_partno + - op_code_desc + - paint_stg + - paint_tone + - part_qty + - part_type + - price_inc + - price_j + - prt_dsmk_m + - prt_dsmk_p + - removed + - status + - tax_part + - unq_seq + - updated_at + computed_fields: [] + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: joblines + schema: public + type: create_select_permission diff --git a/hasura/migrations/1587663753304_update_permission_user_public_table_joblines/up.yaml b/hasura/migrations/1587663753304_update_permission_user_public_table_joblines/up.yaml new file mode 100644 index 000000000..ce9b320bc --- /dev/null +++ b/hasura/migrations/1587663753304_update_permission_user_public_table_joblines/up.yaml @@ -0,0 +1,76 @@ +- args: + role: user + table: + name: joblines + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: true + columns: + - act_price + - alt_co_id + - alt_overrd + - alt_part_i + - alt_partm + - alt_partno + - bett_amt + - bett_pctg + - bett_tax + - bett_type + - cert_part + - created_at + - db_hrs + - db_price + - db_ref + - est_seq + - glass_flag + - id + - jobid + - lbr_amt + - lbr_hrs_j + - lbr_inc + - lbr_op + - lbr_op_j + - lbr_tax + - lbr_typ_j + - line_desc + - line_ind + - line_no + - line_ref + - misc_amt + - misc_sublt + - misc_tax + - mod_lb_hrs + - mod_lbr_ty + - oem_partno + - op_code_desc + - paint_stg + - paint_tone + - part_qty + - part_type + - price_inc + - price_j + - prt_dsmk_m + - prt_dsmk_p + - removed + - status + - tax_part + - unq_seq + - updated_at + computed_fields: [] + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: joblines + schema: public + type: create_select_permission diff --git a/hasura/migrations/1587663758715_update_permission_user_public_table_joblines/down.yaml b/hasura/migrations/1587663758715_update_permission_user_public_table_joblines/down.yaml new file mode 100644 index 000000000..179d1c4d2 --- /dev/null +++ b/hasura/migrations/1587663758715_update_permission_user_public_table_joblines/down.yaml @@ -0,0 +1,77 @@ +- args: + role: user + table: + name: joblines + schema: public + type: drop_update_permission +- args: + permission: + columns: + - act_price + - alt_co_id + - alt_overrd + - alt_part_i + - alt_partm + - alt_partno + - bett_amt + - bett_pctg + - bett_tax + - bett_type + - cert_part + - created_at + - db_hrs + - db_price + - db_ref + - est_seq + - glass_flag + - id + - jobid + - lbr_amt + - lbr_hrs_j + - lbr_inc + - lbr_op + - lbr_op_j + - lbr_tax + - lbr_typ_j + - line_desc + - line_ind + - line_ref + - misc_amt + - misc_sublt + - misc_tax + - mod_lb_hrs + - mod_lbr_ty + - oem_partno + - op_code_desc + - paint_stg + - paint_tone + - part_qty + - part_type + - price_inc + - price_j + - prt_dsmk_m + - prt_dsmk_p + - removed + - status + - tax_part + - unq_seq + - updated_at + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: joblines + schema: public + type: create_update_permission diff --git a/hasura/migrations/1587663758715_update_permission_user_public_table_joblines/up.yaml b/hasura/migrations/1587663758715_update_permission_user_public_table_joblines/up.yaml new file mode 100644 index 000000000..9320e3bbc --- /dev/null +++ b/hasura/migrations/1587663758715_update_permission_user_public_table_joblines/up.yaml @@ -0,0 +1,78 @@ +- args: + role: user + table: + name: joblines + schema: public + type: drop_update_permission +- args: + permission: + columns: + - act_price + - alt_co_id + - alt_overrd + - alt_part_i + - alt_partm + - alt_partno + - bett_amt + - bett_pctg + - bett_tax + - bett_type + - cert_part + - created_at + - db_hrs + - db_price + - db_ref + - est_seq + - glass_flag + - id + - jobid + - lbr_amt + - lbr_hrs_j + - lbr_inc + - lbr_op + - lbr_op_j + - lbr_tax + - lbr_typ_j + - line_desc + - line_ind + - line_no + - line_ref + - misc_amt + - misc_sublt + - misc_tax + - mod_lb_hrs + - mod_lbr_ty + - oem_partno + - op_code_desc + - paint_stg + - paint_tone + - part_qty + - part_type + - price_inc + - price_j + - prt_dsmk_m + - prt_dsmk_p + - removed + - status + - tax_part + - unq_seq + - updated_at + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: joblines + schema: public + type: create_update_permission diff --git a/hasura/migrations/1588004408193_run_sql_migration/down.yaml b/hasura/migrations/1588004408193_run_sql_migration/down.yaml new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/hasura/migrations/1588004408193_run_sql_migration/down.yaml @@ -0,0 +1 @@ +[] diff --git a/hasura/migrations/1588004408193_run_sql_migration/up.yaml b/hasura/migrations/1588004408193_run_sql_migration/up.yaml new file mode 100644 index 000000000..553260f5b --- /dev/null +++ b/hasura/migrations/1588004408193_run_sql_migration/up.yaml @@ -0,0 +1,18 @@ +- args: + cascade: true + read_only: false + sql: |- + CREATE OR REPLACE FUNCTION public.search_owner(search text) + RETURNS SETOF owners + LANGUAGE sql + STABLE + AS $function$ + SELECT * + FROM owners + WHERE + search <% (ownr_fn || ' ' || ownr_ln || ' ' || ownr_co_nm) + ORDER BY + similarity(search, (ownr_fn || ' ' || ownr_ln || ' ' || ownr_co_nm)) DESC + LIMIT 5; + $function$; + type: run_sql diff --git a/hasura/migrations/1588004740163_run_sql_migration/down.yaml b/hasura/migrations/1588004740163_run_sql_migration/down.yaml new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/hasura/migrations/1588004740163_run_sql_migration/down.yaml @@ -0,0 +1 @@ +[] diff --git a/hasura/migrations/1588004740163_run_sql_migration/up.yaml b/hasura/migrations/1588004740163_run_sql_migration/up.yaml new file mode 100644 index 000000000..ae81ed8f6 --- /dev/null +++ b/hasura/migrations/1588004740163_run_sql_migration/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: true + read_only: false + sql: drop index idx_owner_name; + type: run_sql diff --git a/hasura/migrations/1588004759773_run_sql_migration/down.yaml b/hasura/migrations/1588004759773_run_sql_migration/down.yaml new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/hasura/migrations/1588004759773_run_sql_migration/down.yaml @@ -0,0 +1 @@ +[] diff --git a/hasura/migrations/1588004759773_run_sql_migration/up.yaml b/hasura/migrations/1588004759773_run_sql_migration/up.yaml new file mode 100644 index 000000000..9c1b123b5 --- /dev/null +++ b/hasura/migrations/1588004759773_run_sql_migration/up.yaml @@ -0,0 +1,7 @@ +- args: + cascade: true + read_only: false + sql: |- + CREATE INDEX idx_owner_name ON owners USING GIN ((ownr_fn || ' ' || ownr_ln || ' ' || ownr_co_nm) + gin_trgm_ops); + type: run_sql diff --git a/hasura/migrations/1588021481109_run_sql_migration/down.yaml b/hasura/migrations/1588021481109_run_sql_migration/down.yaml new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/hasura/migrations/1588021481109_run_sql_migration/down.yaml @@ -0,0 +1 @@ +[] diff --git a/hasura/migrations/1588021481109_run_sql_migration/up.yaml b/hasura/migrations/1588021481109_run_sql_migration/up.yaml new file mode 100644 index 000000000..b34cb0c10 --- /dev/null +++ b/hasura/migrations/1588021481109_run_sql_migration/up.yaml @@ -0,0 +1,18 @@ +- args: + cascade: true + read_only: false + sql: "CREATE OR REPLACE VIEW \"public\".\"productionview\" AS \n SELECT j.id,\n + \ j.status,\n j.ro_number,\n j.est_number,\n j.ownr_fn,\n j.ownr_ln,\n + \ j.v_model_yr,\n j.v_model_desc,\n j.clm_no,\n j.v_make_desc,\n + \ j.v_color,\n j.plate_no,\n j.actual_in,\n j.scheduled_completion,\n + \ j.scheduled_delivery,\n j.ins_co_nm,\n j.clm_total,\n j.ownr_ph1,\n + \ j.special_coverage_policy,\n j.production_vars,\n lab.labhrs,\n lar.larhrs,\n + \ j.shopid,\n parts.*\n FROM ((jobs j\n LEFT JOIN ( SELECT l.jobid,\n + \ sum(l.mod_lb_hrs) AS labhrs\n FROM joblines l\n WHERE + (l.mod_lbr_ty = 'LAB'::text)\n GROUP BY l.jobid) lab ON ((lab.jobid + = j.id)))\n LEFT JOIN ( SELECT l2.jobid,\n sum(l2.mod_lb_hrs) + AS larhrs\n FROM joblines l2\n WHERE (l2.mod_lbr_ty = 'LAR'::text)\n + \ GROUP BY l2.jobid) lar ON ((lar.jobid = j.id)))\n left join ( select + \ l3.jobid, json_agg(l3.status) partcount from joblines l3 group by l3.jobid, + l3.status ) parts on parts.jobid = j.id\n WHERE (j.inproduction = true);" + type: run_sql diff --git a/hasura/migrations/1588021714218_update_permission_user_public_table_productionview/down.yaml b/hasura/migrations/1588021714218_update_permission_user_public_table_productionview/down.yaml new file mode 100644 index 000000000..b828c15b8 --- /dev/null +++ b/hasura/migrations/1588021714218_update_permission_user_public_table_productionview/down.yaml @@ -0,0 +1,48 @@ +- args: + role: user + table: + name: productionview + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - id + - status + - ro_number + - est_number + - ownr_fn + - ownr_ln + - v_model_yr + - v_model_desc + - clm_no + - v_make_desc + - v_color + - plate_no + - actual_in + - scheduled_completion + - scheduled_delivery + - ins_co_nm + - clm_total + - ownr_ph1 + - special_coverage_policy + - production_vars + - labhrs + - larhrs + - shopid + computed_fields: [] + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: productionview + schema: public + type: create_select_permission diff --git a/hasura/migrations/1588021714218_update_permission_user_public_table_productionview/up.yaml b/hasura/migrations/1588021714218_update_permission_user_public_table_productionview/up.yaml new file mode 100644 index 000000000..2e6370f32 --- /dev/null +++ b/hasura/migrations/1588021714218_update_permission_user_public_table_productionview/up.yaml @@ -0,0 +1,50 @@ +- args: + role: user + table: + name: productionview + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - actual_in + - clm_no + - clm_total + - est_number + - id + - ins_co_nm + - jobid + - labhrs + - larhrs + - ownr_fn + - ownr_ln + - ownr_ph1 + - partcount + - plate_no + - production_vars + - ro_number + - scheduled_completion + - scheduled_delivery + - shopid + - special_coverage_policy + - status + - v_color + - v_make_desc + - v_model_desc + - v_model_yr + computed_fields: [] + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: productionview + schema: public + type: create_select_permission diff --git a/hasura/migrations/1588023147082_update_permission_user_public_table_productionview/down.yaml b/hasura/migrations/1588023147082_update_permission_user_public_table_productionview/down.yaml new file mode 100644 index 000000000..2e6370f32 --- /dev/null +++ b/hasura/migrations/1588023147082_update_permission_user_public_table_productionview/down.yaml @@ -0,0 +1,50 @@ +- args: + role: user + table: + name: productionview + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - actual_in + - clm_no + - clm_total + - est_number + - id + - ins_co_nm + - jobid + - labhrs + - larhrs + - ownr_fn + - ownr_ln + - ownr_ph1 + - partcount + - plate_no + - production_vars + - ro_number + - scheduled_completion + - scheduled_delivery + - shopid + - special_coverage_policy + - status + - v_color + - v_make_desc + - v_model_desc + - v_model_yr + computed_fields: [] + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: productionview + schema: public + type: create_select_permission diff --git a/hasura/migrations/1588023147082_update_permission_user_public_table_productionview/up.yaml b/hasura/migrations/1588023147082_update_permission_user_public_table_productionview/up.yaml new file mode 100644 index 000000000..dbf40fea5 --- /dev/null +++ b/hasura/migrations/1588023147082_update_permission_user_public_table_productionview/up.yaml @@ -0,0 +1,49 @@ +- args: + role: user + table: + name: productionview + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - actual_in + - clm_no + - clm_total + - est_number + - id + - ins_co_nm + - jobid + - labhrs + - larhrs + - ownr_fn + - ownr_ln + - ownr_ph1 + - plate_no + - production_vars + - ro_number + - scheduled_completion + - scheduled_delivery + - shopid + - special_coverage_policy + - status + - v_color + - v_make_desc + - v_model_desc + - v_model_yr + computed_fields: [] + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: productionview + schema: public + type: create_select_permission diff --git a/hasura/migrations/1588023310053_drop_view_public_productionview/down.yaml b/hasura/migrations/1588023310053_drop_view_public_productionview/down.yaml new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/hasura/migrations/1588023310053_drop_view_public_productionview/down.yaml @@ -0,0 +1 @@ +[] diff --git a/hasura/migrations/1588023310053_drop_view_public_productionview/up.yaml b/hasura/migrations/1588023310053_drop_view_public_productionview/up.yaml new file mode 100644 index 000000000..6e88a06bd --- /dev/null +++ b/hasura/migrations/1588023310053_drop_view_public_productionview/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: DROP VIEW "public"."productionview"; + type: run_sql diff --git a/hasura/migrations/1588023324274_run_sql_migration/down.yaml b/hasura/migrations/1588023324274_run_sql_migration/down.yaml new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/hasura/migrations/1588023324274_run_sql_migration/down.yaml @@ -0,0 +1 @@ +[] diff --git a/hasura/migrations/1588023324274_run_sql_migration/up.yaml b/hasura/migrations/1588023324274_run_sql_migration/up.yaml new file mode 100644 index 000000000..087db6700 --- /dev/null +++ b/hasura/migrations/1588023324274_run_sql_migration/up.yaml @@ -0,0 +1,22 @@ +- args: + cascade: true + read_only: false + sql: "CREATE OR REPLACE VIEW \"public\".\"productionview\" AS \n SELECT j.id,\n + \ j.status,\n j.ro_number,\n j.est_number,\n j.ownr_fn,\n j.ownr_ln,\n + \ j.v_model_yr,\n j.v_model_desc,\n j.clm_no,\n j.v_make_desc,\n + \ j.v_color,\n j.plate_no,\n j.actual_in,\n j.scheduled_completion,\n + \ j.scheduled_delivery,\n j.ins_co_nm,\n j.clm_total,\n j.ownr_ph1,\n + \ j.special_coverage_policy,\n j.production_vars,\n lab.labhrs,\n lar.larhrs,\n + \ j.shopid,\n parts.partcount\n FROM ((jobs j\n LEFT JOIN ( SELECT + l.jobid,\n sum(l.mod_lb_hrs) AS labhrs\n FROM joblines + l\n WHERE (l.mod_lbr_ty = 'LAB'::text)\n GROUP BY l.jobid) + lab ON ((lab.jobid = j.id)))\n LEFT JOIN ( SELECT l2.jobid,\n sum(l2.mod_lb_hrs) + AS larhrs\n FROM joblines l2\n WHERE (l2.mod_lbr_ty = 'LAR'::text)\n + \ GROUP BY l2.jobid) lar ON ((lar.jobid = j.id)))\n left join ( select + \ l3.jobid, json_agg(l3.status) partcount from joblines l3 group by l3.jobid + ) parts on parts.jobid = j.id\n WHERE (j.inproduction = true);" + type: run_sql +- args: + name: productionview + schema: public + type: add_existing_table_or_view diff --git a/hasura/migrations/1588023349497_create_relationship_bodyshop_public_table_productionview/down.yaml b/hasura/migrations/1588023349497_create_relationship_bodyshop_public_table_productionview/down.yaml new file mode 100644 index 000000000..c8bccabac --- /dev/null +++ b/hasura/migrations/1588023349497_create_relationship_bodyshop_public_table_productionview/down.yaml @@ -0,0 +1,6 @@ +- args: + relationship: bodyshop + table: + name: productionview + schema: public + type: drop_relationship diff --git a/hasura/migrations/1588023349497_create_relationship_bodyshop_public_table_productionview/up.yaml b/hasura/migrations/1588023349497_create_relationship_bodyshop_public_table_productionview/up.yaml new file mode 100644 index 000000000..b91854674 --- /dev/null +++ b/hasura/migrations/1588023349497_create_relationship_bodyshop_public_table_productionview/up.yaml @@ -0,0 +1,13 @@ +- args: + name: bodyshop + table: + name: productionview + schema: public + using: + manual_configuration: + column_mapping: + shopid: id + remote_table: + name: bodyshops + schema: public + type: create_object_relationship diff --git a/hasura/migrations/1588023375186_update_permission_user_public_table_productionview/down.yaml b/hasura/migrations/1588023375186_update_permission_user_public_table_productionview/down.yaml new file mode 100644 index 000000000..d2ca2e22f --- /dev/null +++ b/hasura/migrations/1588023375186_update_permission_user_public_table_productionview/down.yaml @@ -0,0 +1,6 @@ +- args: + role: user + table: + name: productionview + schema: public + type: drop_select_permission diff --git a/hasura/migrations/1588023375186_update_permission_user_public_table_productionview/up.yaml b/hasura/migrations/1588023375186_update_permission_user_public_table_productionview/up.yaml new file mode 100644 index 000000000..4b1ca46d8 --- /dev/null +++ b/hasura/migrations/1588023375186_update_permission_user_public_table_productionview/up.yaml @@ -0,0 +1,44 @@ +- args: + permission: + allow_aggregations: false + columns: + - id + - status + - ro_number + - est_number + - ownr_fn + - ownr_ln + - v_model_yr + - v_model_desc + - clm_no + - v_make_desc + - v_color + - plate_no + - actual_in + - scheduled_completion + - scheduled_delivery + - ins_co_nm + - clm_total + - ownr_ph1 + - special_coverage_policy + - production_vars + - labhrs + - larhrs + - shopid + - partcount + computed_fields: [] + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + limit: null + role: user + table: + name: productionview + schema: public + type: create_select_permission diff --git a/hasura/migrations/1588355454260_alter_table_public_users_add_column_fcmtokens/down.yaml b/hasura/migrations/1588355454260_alter_table_public_users_add_column_fcmtokens/down.yaml new file mode 100644 index 000000000..fa89d7f1a --- /dev/null +++ b/hasura/migrations/1588355454260_alter_table_public_users_add_column_fcmtokens/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."users" DROP COLUMN "fcmtokens"; + type: run_sql diff --git a/hasura/migrations/1588355454260_alter_table_public_users_add_column_fcmtokens/up.yaml b/hasura/migrations/1588355454260_alter_table_public_users_add_column_fcmtokens/up.yaml new file mode 100644 index 000000000..309f7df2e --- /dev/null +++ b/hasura/migrations/1588355454260_alter_table_public_users_add_column_fcmtokens/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."users" ADD COLUMN "fcmtokens" jsonb NULL; + type: run_sql diff --git a/hasura/migrations/1588355462630_update_permission_user_public_table_users/down.yaml b/hasura/migrations/1588355462630_update_permission_user_public_table_users/down.yaml new file mode 100644 index 000000000..4e6739f81 --- /dev/null +++ b/hasura/migrations/1588355462630_update_permission_user_public_table_users/down.yaml @@ -0,0 +1,21 @@ +- args: + role: user + table: + name: users + schema: public + type: drop_insert_permission +- args: + permission: + check: {} + columns: + - authid + - email + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: users + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1588355462630_update_permission_user_public_table_users/up.yaml b/hasura/migrations/1588355462630_update_permission_user_public_table_users/up.yaml new file mode 100644 index 000000000..beebfb46a --- /dev/null +++ b/hasura/migrations/1588355462630_update_permission_user_public_table_users/up.yaml @@ -0,0 +1,22 @@ +- args: + role: user + table: + name: users + schema: public + type: drop_insert_permission +- args: + permission: + check: {} + columns: + - authid + - email + - fcmtokens + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: users + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1588355471991_update_permission_user_public_table_users/down.yaml b/hasura/migrations/1588355471991_update_permission_user_public_table_users/down.yaml new file mode 100644 index 000000000..bf559d77f --- /dev/null +++ b/hasura/migrations/1588355471991_update_permission_user_public_table_users/down.yaml @@ -0,0 +1,23 @@ +- args: + role: user + table: + name: users + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - email + - authid + - created_at + - updated_at + computed_fields: [] + filter: + authid: + _eq: X-Hasura-User-Id + role: user + table: + name: users + schema: public + type: create_select_permission diff --git a/hasura/migrations/1588355471991_update_permission_user_public_table_users/up.yaml b/hasura/migrations/1588355471991_update_permission_user_public_table_users/up.yaml new file mode 100644 index 000000000..044bd7a4b --- /dev/null +++ b/hasura/migrations/1588355471991_update_permission_user_public_table_users/up.yaml @@ -0,0 +1,22 @@ +- args: + role: user + table: + name: users + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - authid + - email + - fcmtokens + computed_fields: [] + filter: + authid: + _eq: X-Hasura-User-Id + role: user + table: + name: users + schema: public + type: create_select_permission diff --git a/hasura/migrations/1588355478259_update_permission_user_public_table_users/down.yaml b/hasura/migrations/1588355478259_update_permission_user_public_table_users/down.yaml new file mode 100644 index 000000000..044bd7a4b --- /dev/null +++ b/hasura/migrations/1588355478259_update_permission_user_public_table_users/down.yaml @@ -0,0 +1,22 @@ +- args: + role: user + table: + name: users + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - authid + - email + - fcmtokens + computed_fields: [] + filter: + authid: + _eq: X-Hasura-User-Id + role: user + table: + name: users + schema: public + type: create_select_permission diff --git a/hasura/migrations/1588355478259_update_permission_user_public_table_users/up.yaml b/hasura/migrations/1588355478259_update_permission_user_public_table_users/up.yaml new file mode 100644 index 000000000..14839d69a --- /dev/null +++ b/hasura/migrations/1588355478259_update_permission_user_public_table_users/up.yaml @@ -0,0 +1,24 @@ +- args: + role: user + table: + name: users + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - authid + - created_at + - email + - fcmtokens + - updated_at + computed_fields: [] + filter: + authid: + _eq: X-Hasura-User-Id + role: user + table: + name: users + schema: public + type: create_select_permission diff --git a/hasura/migrations/1588355488534_update_permission_user_public_table_users/down.yaml b/hasura/migrations/1588355488534_update_permission_user_public_table_users/down.yaml new file mode 100644 index 000000000..88023a450 --- /dev/null +++ b/hasura/migrations/1588355488534_update_permission_user_public_table_users/down.yaml @@ -0,0 +1,25 @@ +- args: + role: user + table: + name: users + schema: public + type: drop_update_permission +- args: + permission: + columns: + - authid + - email + - created_at + - updated_at + filter: + authid: + _eq: X-Hasura-User-Id + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: users + schema: public + type: create_update_permission diff --git a/hasura/migrations/1588355488534_update_permission_user_public_table_users/up.yaml b/hasura/migrations/1588355488534_update_permission_user_public_table_users/up.yaml new file mode 100644 index 000000000..d4d268e13 --- /dev/null +++ b/hasura/migrations/1588355488534_update_permission_user_public_table_users/up.yaml @@ -0,0 +1,24 @@ +- args: + role: user + table: + name: users + schema: public + type: drop_update_permission +- args: + permission: + columns: + - authid + - email + - fcmtokens + filter: + authid: + _eq: X-Hasura-User-Id + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: users + schema: public + type: create_update_permission diff --git a/hasura/migrations/1588358447309_alter_table_public_users_alter_column_fcmtokens/down.yaml b/hasura/migrations/1588358447309_alter_table_public_users_alter_column_fcmtokens/down.yaml new file mode 100644 index 000000000..74651d839 --- /dev/null +++ b/hasura/migrations/1588358447309_alter_table_public_users_alter_column_fcmtokens/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE ONLY "public"."users" ALTER COLUMN "fcmtokens" DROP DEFAULT; + type: run_sql diff --git a/hasura/migrations/1588358447309_alter_table_public_users_alter_column_fcmtokens/up.yaml b/hasura/migrations/1588358447309_alter_table_public_users_alter_column_fcmtokens/up.yaml new file mode 100644 index 000000000..118c31118 --- /dev/null +++ b/hasura/migrations/1588358447309_alter_table_public_users_alter_column_fcmtokens/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE ONLY "public"."users" ALTER COLUMN "fcmtokens" SET DEFAULT '{}'::jsonb; + type: run_sql diff --git a/hasura/migrations/1588704131761_alter_table_public_invoices_add_column_federal_tax_rate/down.yaml b/hasura/migrations/1588704131761_alter_table_public_invoices_add_column_federal_tax_rate/down.yaml new file mode 100644 index 000000000..24e6ffc88 --- /dev/null +++ b/hasura/migrations/1588704131761_alter_table_public_invoices_add_column_federal_tax_rate/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."invoices" DROP COLUMN "federal_tax_rate"; + type: run_sql diff --git a/hasura/migrations/1588704131761_alter_table_public_invoices_add_column_federal_tax_rate/up.yaml b/hasura/migrations/1588704131761_alter_table_public_invoices_add_column_federal_tax_rate/up.yaml new file mode 100644 index 000000000..4c06cca2d --- /dev/null +++ b/hasura/migrations/1588704131761_alter_table_public_invoices_add_column_federal_tax_rate/up.yaml @@ -0,0 +1,6 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."invoices" ADD COLUMN "federal_tax_rate" numeric NOT + NULL DEFAULT 0; + type: run_sql diff --git a/hasura/migrations/1588704142534_alter_table_public_invoices_add_column_state_tax_rate/down.yaml b/hasura/migrations/1588704142534_alter_table_public_invoices_add_column_state_tax_rate/down.yaml new file mode 100644 index 000000000..19059eaab --- /dev/null +++ b/hasura/migrations/1588704142534_alter_table_public_invoices_add_column_state_tax_rate/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."invoices" DROP COLUMN "state_tax_rate"; + type: run_sql diff --git a/hasura/migrations/1588704142534_alter_table_public_invoices_add_column_state_tax_rate/up.yaml b/hasura/migrations/1588704142534_alter_table_public_invoices_add_column_state_tax_rate/up.yaml new file mode 100644 index 000000000..b5ed8aadc --- /dev/null +++ b/hasura/migrations/1588704142534_alter_table_public_invoices_add_column_state_tax_rate/up.yaml @@ -0,0 +1,6 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."invoices" ADD COLUMN "state_tax_rate" numeric NOT NULL + DEFAULT 0; + type: run_sql diff --git a/hasura/migrations/1588704154625_alter_table_public_invoices_add_column_local_tax_rate/down.yaml b/hasura/migrations/1588704154625_alter_table_public_invoices_add_column_local_tax_rate/down.yaml new file mode 100644 index 000000000..295172295 --- /dev/null +++ b/hasura/migrations/1588704154625_alter_table_public_invoices_add_column_local_tax_rate/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."invoices" DROP COLUMN "local_tax_rate"; + type: run_sql diff --git a/hasura/migrations/1588704154625_alter_table_public_invoices_add_column_local_tax_rate/up.yaml b/hasura/migrations/1588704154625_alter_table_public_invoices_add_column_local_tax_rate/up.yaml new file mode 100644 index 000000000..c7fb4cfba --- /dev/null +++ b/hasura/migrations/1588704154625_alter_table_public_invoices_add_column_local_tax_rate/up.yaml @@ -0,0 +1,6 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."invoices" ADD COLUMN "local_tax_rate" numeric NOT NULL + DEFAULT 0; + type: run_sql diff --git a/hasura/migrations/1588704166538_update_permission_user_public_table_invoices/down.yaml b/hasura/migrations/1588704166538_update_permission_user_public_table_invoices/down.yaml new file mode 100644 index 000000000..0ec004109 --- /dev/null +++ b/hasura/migrations/1588704166538_update_permission_user_public_table_invoices/down.yaml @@ -0,0 +1,40 @@ +- args: + role: user + table: + name: invoices + schema: public + type: drop_insert_permission +- args: + permission: + check: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - id + - created_at + - updated_at + - vendorid + - jobid + - date + - due_date + - exported + - exported_at + - is_credit_memo + - total + - invoice_number + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: invoices + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1588704166538_update_permission_user_public_table_invoices/up.yaml b/hasura/migrations/1588704166538_update_permission_user_public_table_invoices/up.yaml new file mode 100644 index 000000000..687709b1e --- /dev/null +++ b/hasura/migrations/1588704166538_update_permission_user_public_table_invoices/up.yaml @@ -0,0 +1,43 @@ +- args: + role: user + table: + name: invoices + schema: public + type: drop_insert_permission +- args: + permission: + check: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - created_at + - date + - due_date + - exported + - exported_at + - federal_tax_rate + - id + - invoice_number + - is_credit_memo + - jobid + - local_tax_rate + - state_tax_rate + - total + - updated_at + - vendorid + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: invoices + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1588704173695_update_permission_user_public_table_invoices/down.yaml b/hasura/migrations/1588704173695_update_permission_user_public_table_invoices/down.yaml new file mode 100644 index 000000000..d52d9cdc5 --- /dev/null +++ b/hasura/migrations/1588704173695_update_permission_user_public_table_invoices/down.yaml @@ -0,0 +1,38 @@ +- args: + role: user + table: + name: invoices + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - exported + - is_credit_memo + - date + - due_date + - total + - invoice_number + - created_at + - exported_at + - updated_at + - id + - jobid + - vendorid + computed_fields: [] + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: invoices + schema: public + type: create_select_permission diff --git a/hasura/migrations/1588704173695_update_permission_user_public_table_invoices/up.yaml b/hasura/migrations/1588704173695_update_permission_user_public_table_invoices/up.yaml new file mode 100644 index 000000000..d4f9086a3 --- /dev/null +++ b/hasura/migrations/1588704173695_update_permission_user_public_table_invoices/up.yaml @@ -0,0 +1,41 @@ +- args: + role: user + table: + name: invoices + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - created_at + - date + - due_date + - exported + - exported_at + - federal_tax_rate + - id + - invoice_number + - is_credit_memo + - jobid + - local_tax_rate + - state_tax_rate + - total + - updated_at + - vendorid + computed_fields: [] + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: invoices + schema: public + type: create_select_permission diff --git a/hasura/migrations/1588704180439_update_permission_user_public_table_invoices/down.yaml b/hasura/migrations/1588704180439_update_permission_user_public_table_invoices/down.yaml new file mode 100644 index 000000000..4d4938a0a --- /dev/null +++ b/hasura/migrations/1588704180439_update_permission_user_public_table_invoices/down.yaml @@ -0,0 +1,40 @@ +- args: + role: user + table: + name: invoices + schema: public + type: drop_update_permission +- args: + permission: + columns: + - exported + - is_credit_memo + - date + - due_date + - total + - invoice_number + - created_at + - exported_at + - updated_at + - id + - jobid + - vendorid + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: invoices + schema: public + type: create_update_permission diff --git a/hasura/migrations/1588704180439_update_permission_user_public_table_invoices/up.yaml b/hasura/migrations/1588704180439_update_permission_user_public_table_invoices/up.yaml new file mode 100644 index 000000000..c1638595a --- /dev/null +++ b/hasura/migrations/1588704180439_update_permission_user_public_table_invoices/up.yaml @@ -0,0 +1,43 @@ +- args: + role: user + table: + name: invoices + schema: public + type: drop_update_permission +- args: + permission: + columns: + - created_at + - date + - due_date + - exported + - exported_at + - federal_tax_rate + - id + - invoice_number + - is_credit_memo + - jobid + - local_tax_rate + - state_tax_rate + - total + - updated_at + - vendorid + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: invoices + schema: public + type: create_update_permission diff --git a/hasura/migrations/1588704900361_alter_table_public_bodyshops_add_column_invoice_tax_rates/down.yaml b/hasura/migrations/1588704900361_alter_table_public_bodyshops_add_column_invoice_tax_rates/down.yaml new file mode 100644 index 000000000..f0754b343 --- /dev/null +++ b/hasura/migrations/1588704900361_alter_table_public_bodyshops_add_column_invoice_tax_rates/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."bodyshops" DROP COLUMN "invoice_tax_rates"; + type: run_sql diff --git a/hasura/migrations/1588704900361_alter_table_public_bodyshops_add_column_invoice_tax_rates/up.yaml b/hasura/migrations/1588704900361_alter_table_public_bodyshops_add_column_invoice_tax_rates/up.yaml new file mode 100644 index 000000000..5592d4d25 --- /dev/null +++ b/hasura/migrations/1588704900361_alter_table_public_bodyshops_add_column_invoice_tax_rates/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."bodyshops" ADD COLUMN "invoice_tax_rates" jsonb NULL; + type: run_sql diff --git a/hasura/migrations/1588704928185_update_permission_user_public_table_bodyshops/down.yaml b/hasura/migrations/1588704928185_update_permission_user_public_table_bodyshops/down.yaml new file mode 100644 index 000000000..aac8c63cf --- /dev/null +++ b/hasura/migrations/1588704928185_update_permission_user_public_table_bodyshops/down.yaml @@ -0,0 +1,47 @@ +- args: + role: user + table: + name: bodyshops + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - address1 + - address2 + - city + - country + - created_at + - email + - federal_tax_id + - id + - insurance_vendor_id + - logo_img_path + - md_order_statuses + - md_responsibility_centers + - md_ro_statuses + - messagingservicesid + - production_config + - region_config + - shopname + - shoprates + - state + - state_tax_id + - template_header + - textid + - updated_at + - zip_post + computed_fields: [] + filter: + associations: + bodyshop: + associations: + user: + authid: + _eq: X-Hasura-User-Id + role: user + table: + name: bodyshops + schema: public + type: create_select_permission diff --git a/hasura/migrations/1588704928185_update_permission_user_public_table_bodyshops/up.yaml b/hasura/migrations/1588704928185_update_permission_user_public_table_bodyshops/up.yaml new file mode 100644 index 000000000..e047a4088 --- /dev/null +++ b/hasura/migrations/1588704928185_update_permission_user_public_table_bodyshops/up.yaml @@ -0,0 +1,48 @@ +- args: + role: user + table: + name: bodyshops + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - address1 + - address2 + - city + - country + - created_at + - email + - federal_tax_id + - id + - insurance_vendor_id + - invoice_tax_rates + - logo_img_path + - md_order_statuses + - md_responsibility_centers + - md_ro_statuses + - messagingservicesid + - production_config + - region_config + - shopname + - shoprates + - state + - state_tax_id + - template_header + - textid + - updated_at + - zip_post + computed_fields: [] + filter: + associations: + bodyshop: + associations: + user: + authid: + _eq: X-Hasura-User-Id + role: user + table: + name: bodyshops + schema: public + type: create_select_permission diff --git a/hasura/migrations/1588704935620_update_permission_user_public_table_bodyshops/down.yaml b/hasura/migrations/1588704935620_update_permission_user_public_table_bodyshops/down.yaml new file mode 100644 index 000000000..f7578cf44 --- /dev/null +++ b/hasura/migrations/1588704935620_update_permission_user_public_table_bodyshops/down.yaml @@ -0,0 +1,45 @@ +- args: + role: user + table: + name: bodyshops + schema: public + type: drop_update_permission +- args: + permission: + columns: + - address1 + - address2 + - city + - country + - created_at + - email + - federal_tax_id + - id + - insurance_vendor_id + - logo_img_path + - md_order_statuses + - md_responsibility_centers + - md_ro_statuses + - production_config + - shopname + - shoprates + - state + - state_tax_id + - updated_at + - zip_post + filter: + associations: + bodyshop: + associations: + user: + authid: + _eq: X-Hasura-User-Id + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: bodyshops + schema: public + type: create_update_permission diff --git a/hasura/migrations/1588704935620_update_permission_user_public_table_bodyshops/up.yaml b/hasura/migrations/1588704935620_update_permission_user_public_table_bodyshops/up.yaml new file mode 100644 index 000000000..345dd574c --- /dev/null +++ b/hasura/migrations/1588704935620_update_permission_user_public_table_bodyshops/up.yaml @@ -0,0 +1,46 @@ +- args: + role: user + table: + name: bodyshops + schema: public + type: drop_update_permission +- args: + permission: + columns: + - address1 + - address2 + - city + - country + - created_at + - email + - federal_tax_id + - id + - insurance_vendor_id + - invoice_tax_rates + - logo_img_path + - md_order_statuses + - md_responsibility_centers + - md_ro_statuses + - production_config + - shopname + - shoprates + - state + - state_tax_id + - updated_at + - zip_post + filter: + associations: + bodyshop: + associations: + user: + authid: + _eq: X-Hasura-User-Id + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: bodyshops + schema: public + type: create_update_permission diff --git a/hasura/migrations/1588705546595_alter_table_public_invoicelines_add_column_applicable_taxes/down.yaml b/hasura/migrations/1588705546595_alter_table_public_invoicelines_add_column_applicable_taxes/down.yaml new file mode 100644 index 000000000..ec63d6d9f --- /dev/null +++ b/hasura/migrations/1588705546595_alter_table_public_invoicelines_add_column_applicable_taxes/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."invoicelines" DROP COLUMN "applicable_taxes"; + type: run_sql diff --git a/hasura/migrations/1588705546595_alter_table_public_invoicelines_add_column_applicable_taxes/up.yaml b/hasura/migrations/1588705546595_alter_table_public_invoicelines_add_column_applicable_taxes/up.yaml new file mode 100644 index 000000000..8facd11e3 --- /dev/null +++ b/hasura/migrations/1588705546595_alter_table_public_invoicelines_add_column_applicable_taxes/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."invoicelines" ADD COLUMN "applicable_taxes" jsonb NULL; + type: run_sql diff --git a/hasura/migrations/1588705553835_update_permission_user_public_table_invoicelines/down.yaml b/hasura/migrations/1588705553835_update_permission_user_public_table_invoicelines/down.yaml new file mode 100644 index 000000000..8e91e50c6 --- /dev/null +++ b/hasura/migrations/1588705553835_update_permission_user_public_table_invoicelines/down.yaml @@ -0,0 +1,38 @@ +- args: + role: user + table: + name: invoicelines + schema: public + type: drop_insert_permission +- args: + permission: + check: + invoice: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - id + - created_at + - updated_at + - invoiceid + - line_desc + - actual_price + - actual_cost + - cost_center + - joblineid + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: invoicelines + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1588705553835_update_permission_user_public_table_invoicelines/up.yaml b/hasura/migrations/1588705553835_update_permission_user_public_table_invoicelines/up.yaml new file mode 100644 index 000000000..c168c6100 --- /dev/null +++ b/hasura/migrations/1588705553835_update_permission_user_public_table_invoicelines/up.yaml @@ -0,0 +1,39 @@ +- args: + role: user + table: + name: invoicelines + schema: public + type: drop_insert_permission +- args: + permission: + check: + invoice: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - actual_cost + - actual_price + - applicable_taxes + - cost_center + - created_at + - id + - invoiceid + - joblineid + - line_desc + - updated_at + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: invoicelines + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1588705558916_update_permission_user_public_table_invoicelines/down.yaml b/hasura/migrations/1588705558916_update_permission_user_public_table_invoicelines/down.yaml new file mode 100644 index 000000000..871106bbf --- /dev/null +++ b/hasura/migrations/1588705558916_update_permission_user_public_table_invoicelines/down.yaml @@ -0,0 +1,36 @@ +- args: + role: user + table: + name: invoicelines + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - actual_cost + - actual_price + - cost_center + - line_desc + - created_at + - updated_at + - joblineid + - id + - invoiceid + computed_fields: [] + filter: + invoice: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: invoicelines + schema: public + type: create_select_permission diff --git a/hasura/migrations/1588705558916_update_permission_user_public_table_invoicelines/up.yaml b/hasura/migrations/1588705558916_update_permission_user_public_table_invoicelines/up.yaml new file mode 100644 index 000000000..1415d9617 --- /dev/null +++ b/hasura/migrations/1588705558916_update_permission_user_public_table_invoicelines/up.yaml @@ -0,0 +1,37 @@ +- args: + role: user + table: + name: invoicelines + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - actual_cost + - actual_price + - applicable_taxes + - cost_center + - created_at + - id + - invoiceid + - joblineid + - line_desc + - updated_at + computed_fields: [] + filter: + invoice: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: invoicelines + schema: public + type: create_select_permission diff --git a/hasura/migrations/1588705564365_update_permission_user_public_table_invoicelines/down.yaml b/hasura/migrations/1588705564365_update_permission_user_public_table_invoicelines/down.yaml new file mode 100644 index 000000000..07a761b5d --- /dev/null +++ b/hasura/migrations/1588705564365_update_permission_user_public_table_invoicelines/down.yaml @@ -0,0 +1,38 @@ +- args: + role: user + table: + name: invoicelines + schema: public + type: drop_update_permission +- args: + permission: + columns: + - actual_cost + - actual_price + - cost_center + - line_desc + - created_at + - updated_at + - joblineid + - id + - invoiceid + filter: + invoice: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: invoicelines + schema: public + type: create_update_permission diff --git a/hasura/migrations/1588705564365_update_permission_user_public_table_invoicelines/up.yaml b/hasura/migrations/1588705564365_update_permission_user_public_table_invoicelines/up.yaml new file mode 100644 index 000000000..5dca3857f --- /dev/null +++ b/hasura/migrations/1588705564365_update_permission_user_public_table_invoicelines/up.yaml @@ -0,0 +1,39 @@ +- args: + role: user + table: + name: invoicelines + schema: public + type: drop_update_permission +- args: + permission: + columns: + - actual_cost + - actual_price + - applicable_taxes + - cost_center + - created_at + - id + - invoiceid + - joblineid + - line_desc + - updated_at + filter: + invoice: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: invoicelines + schema: public + type: create_update_permission diff --git a/hasura/migrations/1588713434755_alter_table_public_invoicelines_add_column_quantity/down.yaml b/hasura/migrations/1588713434755_alter_table_public_invoicelines_add_column_quantity/down.yaml new file mode 100644 index 000000000..4db9dac2f --- /dev/null +++ b/hasura/migrations/1588713434755_alter_table_public_invoicelines_add_column_quantity/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."invoicelines" DROP COLUMN "quantity"; + type: run_sql diff --git a/hasura/migrations/1588713434755_alter_table_public_invoicelines_add_column_quantity/up.yaml b/hasura/migrations/1588713434755_alter_table_public_invoicelines_add_column_quantity/up.yaml new file mode 100644 index 000000000..925355596 --- /dev/null +++ b/hasura/migrations/1588713434755_alter_table_public_invoicelines_add_column_quantity/up.yaml @@ -0,0 +1,6 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."invoicelines" ADD COLUMN "quantity" integer NOT NULL + DEFAULT 1; + type: run_sql diff --git a/hasura/migrations/1588713453362_update_permission_user_public_table_invoicelines/down.yaml b/hasura/migrations/1588713453362_update_permission_user_public_table_invoicelines/down.yaml new file mode 100644 index 000000000..c168c6100 --- /dev/null +++ b/hasura/migrations/1588713453362_update_permission_user_public_table_invoicelines/down.yaml @@ -0,0 +1,39 @@ +- args: + role: user + table: + name: invoicelines + schema: public + type: drop_insert_permission +- args: + permission: + check: + invoice: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - actual_cost + - actual_price + - applicable_taxes + - cost_center + - created_at + - id + - invoiceid + - joblineid + - line_desc + - updated_at + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: invoicelines + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1588713453362_update_permission_user_public_table_invoicelines/up.yaml b/hasura/migrations/1588713453362_update_permission_user_public_table_invoicelines/up.yaml new file mode 100644 index 000000000..cfdd74ff3 --- /dev/null +++ b/hasura/migrations/1588713453362_update_permission_user_public_table_invoicelines/up.yaml @@ -0,0 +1,40 @@ +- args: + role: user + table: + name: invoicelines + schema: public + type: drop_insert_permission +- args: + permission: + check: + invoice: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - actual_cost + - actual_price + - applicable_taxes + - cost_center + - created_at + - id + - invoiceid + - joblineid + - line_desc + - quantity + - updated_at + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: invoicelines + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1588713460636_update_permission_user_public_table_invoicelines/down.yaml b/hasura/migrations/1588713460636_update_permission_user_public_table_invoicelines/down.yaml new file mode 100644 index 000000000..1415d9617 --- /dev/null +++ b/hasura/migrations/1588713460636_update_permission_user_public_table_invoicelines/down.yaml @@ -0,0 +1,37 @@ +- args: + role: user + table: + name: invoicelines + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - actual_cost + - actual_price + - applicable_taxes + - cost_center + - created_at + - id + - invoiceid + - joblineid + - line_desc + - updated_at + computed_fields: [] + filter: + invoice: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: invoicelines + schema: public + type: create_select_permission diff --git a/hasura/migrations/1588713460636_update_permission_user_public_table_invoicelines/up.yaml b/hasura/migrations/1588713460636_update_permission_user_public_table_invoicelines/up.yaml new file mode 100644 index 000000000..f54972998 --- /dev/null +++ b/hasura/migrations/1588713460636_update_permission_user_public_table_invoicelines/up.yaml @@ -0,0 +1,38 @@ +- args: + role: user + table: + name: invoicelines + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - actual_cost + - actual_price + - applicable_taxes + - cost_center + - created_at + - id + - invoiceid + - joblineid + - line_desc + - quantity + - updated_at + computed_fields: [] + filter: + invoice: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: invoicelines + schema: public + type: create_select_permission diff --git a/hasura/migrations/1588713469291_update_permission_user_public_table_invoicelines/down.yaml b/hasura/migrations/1588713469291_update_permission_user_public_table_invoicelines/down.yaml new file mode 100644 index 000000000..5dca3857f --- /dev/null +++ b/hasura/migrations/1588713469291_update_permission_user_public_table_invoicelines/down.yaml @@ -0,0 +1,39 @@ +- args: + role: user + table: + name: invoicelines + schema: public + type: drop_update_permission +- args: + permission: + columns: + - actual_cost + - actual_price + - applicable_taxes + - cost_center + - created_at + - id + - invoiceid + - joblineid + - line_desc + - updated_at + filter: + invoice: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: invoicelines + schema: public + type: create_update_permission diff --git a/hasura/migrations/1588713469291_update_permission_user_public_table_invoicelines/up.yaml b/hasura/migrations/1588713469291_update_permission_user_public_table_invoicelines/up.yaml new file mode 100644 index 000000000..af16d5b8b --- /dev/null +++ b/hasura/migrations/1588713469291_update_permission_user_public_table_invoicelines/up.yaml @@ -0,0 +1,40 @@ +- args: + role: user + table: + name: invoicelines + schema: public + type: drop_update_permission +- args: + permission: + columns: + - actual_cost + - actual_price + - applicable_taxes + - cost_center + - created_at + - id + - invoiceid + - joblineid + - line_desc + - quantity + - updated_at + filter: + invoice: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: invoicelines + schema: public + type: create_update_permission diff --git a/hasura/migrations/1588869001045_run_sql_migration/down.yaml b/hasura/migrations/1588869001045_run_sql_migration/down.yaml new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/hasura/migrations/1588869001045_run_sql_migration/down.yaml @@ -0,0 +1 @@ +[] diff --git a/hasura/migrations/1588869001045_run_sql_migration/up.yaml b/hasura/migrations/1588869001045_run_sql_migration/up.yaml new file mode 100644 index 000000000..0203370b6 --- /dev/null +++ b/hasura/migrations/1588869001045_run_sql_migration/up.yaml @@ -0,0 +1,19 @@ +- args: + cascade: true + read_only: false + sql: "CREATE OR REPLACE VIEW \"public\".\"productionview\" AS \n SELECT j.id,\n + \ j.status,\n j.ro_number,\n j.est_number,\n j.ownr_fn,\n j.ownr_ln,\n + \ j.v_model_yr,\n j.v_model_desc,\n j.clm_no,\n j.v_make_desc,\n + \ j.v_color,\n j.plate_no,\n j.actual_in,\n j.scheduled_completion,\n + \ j.scheduled_delivery,\n j.ins_co_nm,\n j.clm_total,\n j.ownr_ph1,\n + \ j.special_coverage_policy,\n j.production_vars,\n lab.labhrs,\n lar.larhrs,\n + \ j.shopid,\n parts.partcount\n FROM (((jobs j\n LEFT JOIN ( SELECT + l.jobid,\n sum(l.mod_lb_hrs) AS labhrs\n FROM joblines + l\n WHERE (l.mod_lbr_ty = 'LAB'::text)\n GROUP BY l.jobid) + lab ON ((lab.jobid = j.id)))\n LEFT JOIN ( SELECT l2.jobid,\n sum(l2.mod_lb_hrs) + AS larhrs\n FROM joblines l2\n WHERE (l2.mod_lbr_ty = 'LAR'::text)\n + \ GROUP BY l2.jobid) lar ON ((lar.jobid = j.id)))\n LEFT JOIN ( + SELECT l3.jobid,\n json_agg(l3.status) AS partcount\n FROM + joblines l3\n where l3.part_type IS NOT NULL\n GROUP BY l3.jobid) + parts ON ((parts.jobid = j.id)))\n WHERE (j.inproduction = true);" + type: run_sql diff --git a/hasura/migrations/1588963534664_update_permission_user_public_table_productionview/down.yaml b/hasura/migrations/1588963534664_update_permission_user_public_table_productionview/down.yaml new file mode 100644 index 000000000..149d9a760 --- /dev/null +++ b/hasura/migrations/1588963534664_update_permission_user_public_table_productionview/down.yaml @@ -0,0 +1,49 @@ +- args: + role: user + table: + name: productionview + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - id + - status + - ro_number + - est_number + - ownr_fn + - ownr_ln + - v_model_yr + - v_model_desc + - clm_no + - v_make_desc + - v_color + - plate_no + - actual_in + - scheduled_completion + - scheduled_delivery + - ins_co_nm + - clm_total + - ownr_ph1 + - special_coverage_policy + - production_vars + - labhrs + - larhrs + - shopid + - partcount + computed_fields: [] + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: productionview + schema: public + type: create_select_permission diff --git a/hasura/migrations/1588963534664_update_permission_user_public_table_productionview/up.yaml b/hasura/migrations/1588963534664_update_permission_user_public_table_productionview/up.yaml new file mode 100644 index 000000000..846706108 --- /dev/null +++ b/hasura/migrations/1588963534664_update_permission_user_public_table_productionview/up.yaml @@ -0,0 +1,49 @@ +- args: + role: user + table: + name: productionview + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: true + columns: + - id + - status + - ro_number + - est_number + - ownr_fn + - ownr_ln + - v_model_yr + - v_model_desc + - clm_no + - v_make_desc + - v_color + - plate_no + - actual_in + - scheduled_completion + - scheduled_delivery + - ins_co_nm + - clm_total + - ownr_ph1 + - special_coverage_policy + - production_vars + - labhrs + - larhrs + - shopid + - partcount + computed_fields: [] + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: productionview + schema: public + type: create_select_permission diff --git a/hasura/migrations/1589220968554_alter_table_public_bodyshops_add_column_inhousevendorid/down.yaml b/hasura/migrations/1589220968554_alter_table_public_bodyshops_add_column_inhousevendorid/down.yaml new file mode 100644 index 000000000..7206ea7d4 --- /dev/null +++ b/hasura/migrations/1589220968554_alter_table_public_bodyshops_add_column_inhousevendorid/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."bodyshops" DROP COLUMN "inhousevendorid"; + type: run_sql diff --git a/hasura/migrations/1589220968554_alter_table_public_bodyshops_add_column_inhousevendorid/up.yaml b/hasura/migrations/1589220968554_alter_table_public_bodyshops_add_column_inhousevendorid/up.yaml new file mode 100644 index 000000000..4069e563e --- /dev/null +++ b/hasura/migrations/1589220968554_alter_table_public_bodyshops_add_column_inhousevendorid/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."bodyshops" ADD COLUMN "inhousevendorid" uuid NULL; + type: run_sql diff --git a/hasura/migrations/1589220979739_update_permission_user_public_table_bodyshops/down.yaml b/hasura/migrations/1589220979739_update_permission_user_public_table_bodyshops/down.yaml new file mode 100644 index 000000000..e047a4088 --- /dev/null +++ b/hasura/migrations/1589220979739_update_permission_user_public_table_bodyshops/down.yaml @@ -0,0 +1,48 @@ +- args: + role: user + table: + name: bodyshops + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - address1 + - address2 + - city + - country + - created_at + - email + - federal_tax_id + - id + - insurance_vendor_id + - invoice_tax_rates + - logo_img_path + - md_order_statuses + - md_responsibility_centers + - md_ro_statuses + - messagingservicesid + - production_config + - region_config + - shopname + - shoprates + - state + - state_tax_id + - template_header + - textid + - updated_at + - zip_post + computed_fields: [] + filter: + associations: + bodyshop: + associations: + user: + authid: + _eq: X-Hasura-User-Id + role: user + table: + name: bodyshops + schema: public + type: create_select_permission diff --git a/hasura/migrations/1589220979739_update_permission_user_public_table_bodyshops/up.yaml b/hasura/migrations/1589220979739_update_permission_user_public_table_bodyshops/up.yaml new file mode 100644 index 000000000..5cdd042d5 --- /dev/null +++ b/hasura/migrations/1589220979739_update_permission_user_public_table_bodyshops/up.yaml @@ -0,0 +1,49 @@ +- args: + role: user + table: + name: bodyshops + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - address1 + - address2 + - city + - country + - created_at + - email + - federal_tax_id + - id + - inhousevendorid + - insurance_vendor_id + - invoice_tax_rates + - logo_img_path + - md_order_statuses + - md_responsibility_centers + - md_ro_statuses + - messagingservicesid + - production_config + - region_config + - shopname + - shoprates + - state + - state_tax_id + - template_header + - textid + - updated_at + - zip_post + computed_fields: [] + filter: + associations: + bodyshop: + associations: + user: + authid: + _eq: X-Hasura-User-Id + role: user + table: + name: bodyshops + schema: public + type: create_select_permission diff --git a/hasura/migrations/1589220986849_update_permission_user_public_table_bodyshops/down.yaml b/hasura/migrations/1589220986849_update_permission_user_public_table_bodyshops/down.yaml new file mode 100644 index 000000000..345dd574c --- /dev/null +++ b/hasura/migrations/1589220986849_update_permission_user_public_table_bodyshops/down.yaml @@ -0,0 +1,46 @@ +- args: + role: user + table: + name: bodyshops + schema: public + type: drop_update_permission +- args: + permission: + columns: + - address1 + - address2 + - city + - country + - created_at + - email + - federal_tax_id + - id + - insurance_vendor_id + - invoice_tax_rates + - logo_img_path + - md_order_statuses + - md_responsibility_centers + - md_ro_statuses + - production_config + - shopname + - shoprates + - state + - state_tax_id + - updated_at + - zip_post + filter: + associations: + bodyshop: + associations: + user: + authid: + _eq: X-Hasura-User-Id + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: bodyshops + schema: public + type: create_update_permission diff --git a/hasura/migrations/1589220986849_update_permission_user_public_table_bodyshops/up.yaml b/hasura/migrations/1589220986849_update_permission_user_public_table_bodyshops/up.yaml new file mode 100644 index 000000000..529715952 --- /dev/null +++ b/hasura/migrations/1589220986849_update_permission_user_public_table_bodyshops/up.yaml @@ -0,0 +1,47 @@ +- args: + role: user + table: + name: bodyshops + schema: public + type: drop_update_permission +- args: + permission: + columns: + - address1 + - address2 + - city + - country + - created_at + - email + - federal_tax_id + - id + - inhousevendorid + - insurance_vendor_id + - invoice_tax_rates + - logo_img_path + - md_order_statuses + - md_responsibility_centers + - md_ro_statuses + - production_config + - shopname + - shoprates + - state + - state_tax_id + - updated_at + - zip_post + filter: + associations: + bodyshop: + associations: + user: + authid: + _eq: X-Hasura-User-Id + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: bodyshops + schema: public + type: create_update_permission diff --git a/hasura/migrations/1589225896113_alter_table_public_parts_order_lines_add_column_quantity/down.yaml b/hasura/migrations/1589225896113_alter_table_public_parts_order_lines_add_column_quantity/down.yaml new file mode 100644 index 000000000..ca30c5c80 --- /dev/null +++ b/hasura/migrations/1589225896113_alter_table_public_parts_order_lines_add_column_quantity/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."parts_order_lines" DROP COLUMN "quantity"; + type: run_sql diff --git a/hasura/migrations/1589225896113_alter_table_public_parts_order_lines_add_column_quantity/up.yaml b/hasura/migrations/1589225896113_alter_table_public_parts_order_lines_add_column_quantity/up.yaml new file mode 100644 index 000000000..abe92d82f --- /dev/null +++ b/hasura/migrations/1589225896113_alter_table_public_parts_order_lines_add_column_quantity/up.yaml @@ -0,0 +1,6 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."parts_order_lines" ADD COLUMN "quantity" numeric NOT + NULL DEFAULT 1; + type: run_sql diff --git a/hasura/migrations/1589225907303_update_permission_user_public_table_parts_order_lines/down.yaml b/hasura/migrations/1589225907303_update_permission_user_public_table_parts_order_lines/down.yaml new file mode 100644 index 000000000..484182ba8 --- /dev/null +++ b/hasura/migrations/1589225907303_update_permission_user_public_table_parts_order_lines/down.yaml @@ -0,0 +1,40 @@ +- args: + role: user + table: + name: parts_order_lines + schema: public + type: drop_insert_permission +- args: + permission: + check: + parts_order: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - id + - created_at + - updated_at + - orderid + - job_line_id + - line_desc + - oem_partno + - db_price + - act_price + - status + - line_remarks + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: parts_order_lines + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1589225907303_update_permission_user_public_table_parts_order_lines/up.yaml b/hasura/migrations/1589225907303_update_permission_user_public_table_parts_order_lines/up.yaml new file mode 100644 index 000000000..dfdecc4bb --- /dev/null +++ b/hasura/migrations/1589225907303_update_permission_user_public_table_parts_order_lines/up.yaml @@ -0,0 +1,41 @@ +- args: + role: user + table: + name: parts_order_lines + schema: public + type: drop_insert_permission +- args: + permission: + check: + parts_order: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - act_price + - created_at + - db_price + - id + - job_line_id + - line_desc + - line_remarks + - oem_partno + - orderid + - quantity + - status + - updated_at + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: parts_order_lines + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1589225914182_update_permission_user_public_table_parts_order_lines/down.yaml b/hasura/migrations/1589225914182_update_permission_user_public_table_parts_order_lines/down.yaml new file mode 100644 index 000000000..f147077ae --- /dev/null +++ b/hasura/migrations/1589225914182_update_permission_user_public_table_parts_order_lines/down.yaml @@ -0,0 +1,38 @@ +- args: + role: user + table: + name: parts_order_lines + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - act_price + - db_price + - line_desc + - line_remarks + - oem_partno + - status + - created_at + - updated_at + - id + - job_line_id + - orderid + computed_fields: [] + filter: + parts_order: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: parts_order_lines + schema: public + type: create_select_permission diff --git a/hasura/migrations/1589225914182_update_permission_user_public_table_parts_order_lines/up.yaml b/hasura/migrations/1589225914182_update_permission_user_public_table_parts_order_lines/up.yaml new file mode 100644 index 000000000..e057ea23a --- /dev/null +++ b/hasura/migrations/1589225914182_update_permission_user_public_table_parts_order_lines/up.yaml @@ -0,0 +1,39 @@ +- args: + role: user + table: + name: parts_order_lines + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - act_price + - created_at + - db_price + - id + - job_line_id + - line_desc + - line_remarks + - oem_partno + - orderid + - quantity + - status + - updated_at + computed_fields: [] + filter: + parts_order: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: parts_order_lines + schema: public + type: create_select_permission diff --git a/hasura/migrations/1589225921325_update_permission_user_public_table_parts_order_lines/down.yaml b/hasura/migrations/1589225921325_update_permission_user_public_table_parts_order_lines/down.yaml new file mode 100644 index 000000000..84f9e1e6d --- /dev/null +++ b/hasura/migrations/1589225921325_update_permission_user_public_table_parts_order_lines/down.yaml @@ -0,0 +1,40 @@ +- args: + role: user + table: + name: parts_order_lines + schema: public + type: drop_update_permission +- args: + permission: + columns: + - act_price + - db_price + - line_desc + - line_remarks + - oem_partno + - status + - created_at + - updated_at + - id + - job_line_id + - orderid + filter: + parts_order: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: parts_order_lines + schema: public + type: create_update_permission diff --git a/hasura/migrations/1589225921325_update_permission_user_public_table_parts_order_lines/up.yaml b/hasura/migrations/1589225921325_update_permission_user_public_table_parts_order_lines/up.yaml new file mode 100644 index 000000000..6588e2ab3 --- /dev/null +++ b/hasura/migrations/1589225921325_update_permission_user_public_table_parts_order_lines/up.yaml @@ -0,0 +1,41 @@ +- args: + role: user + table: + name: parts_order_lines + schema: public + type: drop_update_permission +- args: + permission: + columns: + - act_price + - created_at + - db_price + - id + - job_line_id + - line_desc + - line_remarks + - oem_partno + - orderid + - quantity + - status + - updated_at + filter: + parts_order: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: parts_order_lines + schema: public + type: create_update_permission diff --git a/hasura/migrations/1589302634242_update_permission_user_public_table_templates/down.yaml b/hasura/migrations/1589302634242_update_permission_user_public_table_templates/down.yaml new file mode 100644 index 000000000..f82fe23ab --- /dev/null +++ b/hasura/migrations/1589302634242_update_permission_user_public_table_templates/down.yaml @@ -0,0 +1,6 @@ +- args: + role: user + table: + name: templates + schema: public + type: drop_insert_permission diff --git a/hasura/migrations/1589302634242_update_permission_user_public_table_templates/up.yaml b/hasura/migrations/1589302634242_update_permission_user_public_table_templates/up.yaml new file mode 100644 index 000000000..a02ba11ce --- /dev/null +++ b/hasura/migrations/1589302634242_update_permission_user_public_table_templates/up.yaml @@ -0,0 +1,29 @@ +- args: + permission: + allow_upsert: true + check: + _or: + - bodyshopid: + _is_null: true + - bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - bodyshopid + - html + - name + - query + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: templates + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1589303851671_update_permission_user_public_table_templates/down.yaml b/hasura/migrations/1589303851671_update_permission_user_public_table_templates/down.yaml new file mode 100644 index 000000000..6bffc1e0e --- /dev/null +++ b/hasura/migrations/1589303851671_update_permission_user_public_table_templates/down.yaml @@ -0,0 +1,6 @@ +- args: + role: user + table: + name: templates + schema: public + type: drop_delete_permission diff --git a/hasura/migrations/1589303851671_update_permission_user_public_table_templates/up.yaml b/hasura/migrations/1589303851671_update_permission_user_public_table_templates/up.yaml new file mode 100644 index 000000000..ea9c5ad70 --- /dev/null +++ b/hasura/migrations/1589303851671_update_permission_user_public_table_templates/up.yaml @@ -0,0 +1,19 @@ +- args: + permission: + filter: + _or: + - bodyshopid: + _is_null: false + - bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: templates + schema: public + type: create_delete_permission diff --git a/hasura/migrations/1589307600089_alter_table_public_bodyshops_add_column_intakechecklist/down.yaml b/hasura/migrations/1589307600089_alter_table_public_bodyshops_add_column_intakechecklist/down.yaml new file mode 100644 index 000000000..5f6a8a89d --- /dev/null +++ b/hasura/migrations/1589307600089_alter_table_public_bodyshops_add_column_intakechecklist/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."bodyshops" DROP COLUMN "intakechecklist"; + type: run_sql diff --git a/hasura/migrations/1589307600089_alter_table_public_bodyshops_add_column_intakechecklist/up.yaml b/hasura/migrations/1589307600089_alter_table_public_bodyshops_add_column_intakechecklist/up.yaml new file mode 100644 index 000000000..324c622c8 --- /dev/null +++ b/hasura/migrations/1589307600089_alter_table_public_bodyshops_add_column_intakechecklist/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."bodyshops" ADD COLUMN "intakechecklist" jsonb NULL; + type: run_sql diff --git a/hasura/migrations/1589307611118_update_permission_user_public_table_bodyshops/down.yaml b/hasura/migrations/1589307611118_update_permission_user_public_table_bodyshops/down.yaml new file mode 100644 index 000000000..5cdd042d5 --- /dev/null +++ b/hasura/migrations/1589307611118_update_permission_user_public_table_bodyshops/down.yaml @@ -0,0 +1,49 @@ +- args: + role: user + table: + name: bodyshops + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - address1 + - address2 + - city + - country + - created_at + - email + - federal_tax_id + - id + - inhousevendorid + - insurance_vendor_id + - invoice_tax_rates + - logo_img_path + - md_order_statuses + - md_responsibility_centers + - md_ro_statuses + - messagingservicesid + - production_config + - region_config + - shopname + - shoprates + - state + - state_tax_id + - template_header + - textid + - updated_at + - zip_post + computed_fields: [] + filter: + associations: + bodyshop: + associations: + user: + authid: + _eq: X-Hasura-User-Id + role: user + table: + name: bodyshops + schema: public + type: create_select_permission diff --git a/hasura/migrations/1589307611118_update_permission_user_public_table_bodyshops/up.yaml b/hasura/migrations/1589307611118_update_permission_user_public_table_bodyshops/up.yaml new file mode 100644 index 000000000..24fcc62ed --- /dev/null +++ b/hasura/migrations/1589307611118_update_permission_user_public_table_bodyshops/up.yaml @@ -0,0 +1,50 @@ +- args: + role: user + table: + name: bodyshops + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - address1 + - address2 + - city + - country + - created_at + - email + - federal_tax_id + - id + - inhousevendorid + - insurance_vendor_id + - intakechecklist + - invoice_tax_rates + - logo_img_path + - md_order_statuses + - md_responsibility_centers + - md_ro_statuses + - messagingservicesid + - production_config + - region_config + - shopname + - shoprates + - state + - state_tax_id + - template_header + - textid + - updated_at + - zip_post + computed_fields: [] + filter: + associations: + bodyshop: + associations: + user: + authid: + _eq: X-Hasura-User-Id + role: user + table: + name: bodyshops + schema: public + type: create_select_permission diff --git a/hasura/migrations/1589307625647_update_permission_user_public_table_bodyshops/down.yaml b/hasura/migrations/1589307625647_update_permission_user_public_table_bodyshops/down.yaml new file mode 100644 index 000000000..529715952 --- /dev/null +++ b/hasura/migrations/1589307625647_update_permission_user_public_table_bodyshops/down.yaml @@ -0,0 +1,47 @@ +- args: + role: user + table: + name: bodyshops + schema: public + type: drop_update_permission +- args: + permission: + columns: + - address1 + - address2 + - city + - country + - created_at + - email + - federal_tax_id + - id + - inhousevendorid + - insurance_vendor_id + - invoice_tax_rates + - logo_img_path + - md_order_statuses + - md_responsibility_centers + - md_ro_statuses + - production_config + - shopname + - shoprates + - state + - state_tax_id + - updated_at + - zip_post + filter: + associations: + bodyshop: + associations: + user: + authid: + _eq: X-Hasura-User-Id + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: bodyshops + schema: public + type: create_update_permission diff --git a/hasura/migrations/1589307625647_update_permission_user_public_table_bodyshops/up.yaml b/hasura/migrations/1589307625647_update_permission_user_public_table_bodyshops/up.yaml new file mode 100644 index 000000000..477056eb1 --- /dev/null +++ b/hasura/migrations/1589307625647_update_permission_user_public_table_bodyshops/up.yaml @@ -0,0 +1,48 @@ +- args: + role: user + table: + name: bodyshops + schema: public + type: drop_update_permission +- args: + permission: + columns: + - address1 + - address2 + - city + - country + - created_at + - email + - federal_tax_id + - id + - inhousevendorid + - insurance_vendor_id + - intakechecklist + - invoice_tax_rates + - logo_img_path + - md_order_statuses + - md_responsibility_centers + - md_ro_statuses + - production_config + - shopname + - shoprates + - state + - state_tax_id + - updated_at + - zip_post + filter: + associations: + bodyshop: + associations: + user: + authid: + _eq: X-Hasura-User-Id + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: bodyshops + schema: public + type: create_update_permission diff --git a/hasura/migrations/1589354344575_alter_table_public_jobs_add_column_intakechecklist/down.yaml b/hasura/migrations/1589354344575_alter_table_public_jobs_add_column_intakechecklist/down.yaml new file mode 100644 index 000000000..425276ebd --- /dev/null +++ b/hasura/migrations/1589354344575_alter_table_public_jobs_add_column_intakechecklist/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."jobs" DROP COLUMN "intakechecklist"; + type: run_sql diff --git a/hasura/migrations/1589354344575_alter_table_public_jobs_add_column_intakechecklist/up.yaml b/hasura/migrations/1589354344575_alter_table_public_jobs_add_column_intakechecklist/up.yaml new file mode 100644 index 000000000..518e79a63 --- /dev/null +++ b/hasura/migrations/1589354344575_alter_table_public_jobs_add_column_intakechecklist/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."jobs" ADD COLUMN "intakechecklist" jsonb NULL; + type: run_sql diff --git a/hasura/migrations/1589354360622_update_permission_user_public_table_jobs/down.yaml b/hasura/migrations/1589354360622_update_permission_user_public_table_jobs/down.yaml new file mode 100644 index 000000000..f38c14033 --- /dev/null +++ b/hasura/migrations/1589354360622_update_permission_user_public_table_jobs/down.yaml @@ -0,0 +1,255 @@ +- args: + role: user + table: + name: jobs + schema: public + type: drop_insert_permission +- args: + permission: + check: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - actual_completion + - actual_delivery + - actual_in + - adj_g_disc + - adj_strdis + - adj_towdis + - adjustment_bottom_line + - agt_addr1 + - agt_addr2 + - agt_city + - agt_co_id + - agt_co_nm + - agt_ct_fn + - agt_ct_ln + - agt_ct_ph + - agt_ct_phx + - agt_ctry + - agt_ea + - agt_fax + - agt_faxx + - agt_lic_no + - agt_ph1 + - agt_ph1x + - agt_ph2 + - agt_ph2x + - agt_st + - agt_zip + - area_of_damage + - asgn_date + - asgn_no + - asgn_type + - cat_no + - cieca_stl + - cieca_ttl + - ciecaid + - clm_addr1 + - clm_addr2 + - clm_city + - clm_ct_fn + - clm_ct_ln + - clm_ct_ph + - clm_ct_phx + - clm_ctry + - clm_ea + - clm_fax + - clm_faxx + - clm_no + - clm_ofc_id + - clm_ofc_nm + - clm_ph1 + - clm_ph1x + - clm_ph2 + - clm_ph2x + - clm_st + - clm_title + - clm_total + - clm_zip + - converted + - created_at + - csr + - cust_pr + - date_closed + - date_estimated + - date_exported + - date_invoiced + - date_open + - date_scheduled + - ded_amt + - ded_status + - depreciation_taxes + - est_addr1 + - est_addr2 + - est_city + - est_co_nm + - est_ct_fn + - est_ct_ln + - est_ctry + - est_ea + - est_number + - est_ph1 + - est_st + - est_zip + - federal_tax_payable + - federal_tax_rate + - g_bett_amt + - id + - inproduction + - ins_addr1 + - ins_addr2 + - ins_city + - ins_co_id + - ins_co_nm + - ins_ct_fn + - ins_ct_ln + - ins_ct_ph + - ins_ct_phx + - ins_ctry + - ins_ea + - ins_fax + - ins_faxx + - ins_memo + - ins_ph1 + - ins_ph1x + - ins_ph2 + - ins_ph2x + - ins_st + - ins_title + - ins_zip + - insd_addr1 + - insd_addr2 + - insd_city + - insd_co_nm + - insd_ctry + - insd_ea + - insd_fax + - insd_faxx + - insd_fn + - insd_ln + - insd_ph1 + - insd_ph1x + - insd_ph2 + - insd_ph2x + - insd_st + - insd_title + - insd_zip + - invoice_date + - job_totals + - kmin + - kmout + - labor_rate_desc + - labor_rate_id + - local_tax_rate + - loss_cat + - loss_date + - loss_desc + - loss_type + - other_amount_payable + - owner_owing + - ownerid + - ownr_addr1 + - ownr_addr2 + - ownr_city + - ownr_co_nm + - ownr_ctry + - ownr_ea + - ownr_fax + - ownr_faxx + - ownr_fn + - ownr_ln + - ownr_ph1 + - ownr_ph1x + - ownr_ph2 + - ownr_ph2x + - ownr_st + - ownr_title + - ownr_zip + - parts_tax_rates + - pay_amt + - pay_chknm + - pay_date + - pay_type + - payee_nms + - plate_no + - plate_st + - po_number + - policy_no + - production_vars + - rate_atp + - rate_la1 + - rate_la2 + - rate_la3 + - rate_la4 + - rate_laa + - rate_lab + - rate_lad + - rate_lae + - rate_laf + - rate_lag + - rate_lam + - rate_lar + - rate_las + - rate_lau + - rate_ma2s + - rate_ma2t + - rate_ma3s + - rate_mabl + - rate_macs + - rate_mahw + - rate_mapa + - rate_mash + - rate_matd + - referral_source + - regie_number + - ro_number + - scheduled_completion + - scheduled_delivery + - scheduled_in + - selling_dealer + - selling_dealer_contact + - servicing_dealer + - servicing_dealer_contact + - shopid + - special_coverage_policy + - state_tax_rate + - status + - statusid + - storage_payable + - tax_lbr_rt + - tax_levies_rt + - tax_paint_mat_rt + - tax_predis + - tax_prethr + - tax_pstthr + - tax_str_rt + - tax_sub_rt + - tax_thramt + - tax_tow_rt + - theft_ind + - tlos_ind + - towing_payable + - unit_number + - updated_at + - v_color + - v_make_desc + - v_model_desc + - v_model_yr + - v_vin + - vehicleid + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: jobs + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1589354360622_update_permission_user_public_table_jobs/up.yaml b/hasura/migrations/1589354360622_update_permission_user_public_table_jobs/up.yaml new file mode 100644 index 000000000..962088486 --- /dev/null +++ b/hasura/migrations/1589354360622_update_permission_user_public_table_jobs/up.yaml @@ -0,0 +1,256 @@ +- args: + role: user + table: + name: jobs + schema: public + type: drop_insert_permission +- args: + permission: + check: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - actual_completion + - actual_delivery + - actual_in + - adj_g_disc + - adj_strdis + - adj_towdis + - adjustment_bottom_line + - agt_addr1 + - agt_addr2 + - agt_city + - agt_co_id + - agt_co_nm + - agt_ct_fn + - agt_ct_ln + - agt_ct_ph + - agt_ct_phx + - agt_ctry + - agt_ea + - agt_fax + - agt_faxx + - agt_lic_no + - agt_ph1 + - agt_ph1x + - agt_ph2 + - agt_ph2x + - agt_st + - agt_zip + - area_of_damage + - asgn_date + - asgn_no + - asgn_type + - cat_no + - cieca_stl + - cieca_ttl + - ciecaid + - clm_addr1 + - clm_addr2 + - clm_city + - clm_ct_fn + - clm_ct_ln + - clm_ct_ph + - clm_ct_phx + - clm_ctry + - clm_ea + - clm_fax + - clm_faxx + - clm_no + - clm_ofc_id + - clm_ofc_nm + - clm_ph1 + - clm_ph1x + - clm_ph2 + - clm_ph2x + - clm_st + - clm_title + - clm_total + - clm_zip + - converted + - created_at + - csr + - cust_pr + - date_closed + - date_estimated + - date_exported + - date_invoiced + - date_open + - date_scheduled + - ded_amt + - ded_status + - depreciation_taxes + - est_addr1 + - est_addr2 + - est_city + - est_co_nm + - est_ct_fn + - est_ct_ln + - est_ctry + - est_ea + - est_number + - est_ph1 + - est_st + - est_zip + - federal_tax_payable + - federal_tax_rate + - g_bett_amt + - id + - inproduction + - ins_addr1 + - ins_addr2 + - ins_city + - ins_co_id + - ins_co_nm + - ins_ct_fn + - ins_ct_ln + - ins_ct_ph + - ins_ct_phx + - ins_ctry + - ins_ea + - ins_fax + - ins_faxx + - ins_memo + - ins_ph1 + - ins_ph1x + - ins_ph2 + - ins_ph2x + - ins_st + - ins_title + - ins_zip + - insd_addr1 + - insd_addr2 + - insd_city + - insd_co_nm + - insd_ctry + - insd_ea + - insd_fax + - insd_faxx + - insd_fn + - insd_ln + - insd_ph1 + - insd_ph1x + - insd_ph2 + - insd_ph2x + - insd_st + - insd_title + - insd_zip + - intakechecklist + - invoice_date + - job_totals + - kmin + - kmout + - labor_rate_desc + - labor_rate_id + - local_tax_rate + - loss_cat + - loss_date + - loss_desc + - loss_type + - other_amount_payable + - owner_owing + - ownerid + - ownr_addr1 + - ownr_addr2 + - ownr_city + - ownr_co_nm + - ownr_ctry + - ownr_ea + - ownr_fax + - ownr_faxx + - ownr_fn + - ownr_ln + - ownr_ph1 + - ownr_ph1x + - ownr_ph2 + - ownr_ph2x + - ownr_st + - ownr_title + - ownr_zip + - parts_tax_rates + - pay_amt + - pay_chknm + - pay_date + - pay_type + - payee_nms + - plate_no + - plate_st + - po_number + - policy_no + - production_vars + - rate_atp + - rate_la1 + - rate_la2 + - rate_la3 + - rate_la4 + - rate_laa + - rate_lab + - rate_lad + - rate_lae + - rate_laf + - rate_lag + - rate_lam + - rate_lar + - rate_las + - rate_lau + - rate_ma2s + - rate_ma2t + - rate_ma3s + - rate_mabl + - rate_macs + - rate_mahw + - rate_mapa + - rate_mash + - rate_matd + - referral_source + - regie_number + - ro_number + - scheduled_completion + - scheduled_delivery + - scheduled_in + - selling_dealer + - selling_dealer_contact + - servicing_dealer + - servicing_dealer_contact + - shopid + - special_coverage_policy + - state_tax_rate + - status + - statusid + - storage_payable + - tax_lbr_rt + - tax_levies_rt + - tax_paint_mat_rt + - tax_predis + - tax_prethr + - tax_pstthr + - tax_str_rt + - tax_sub_rt + - tax_thramt + - tax_tow_rt + - theft_ind + - tlos_ind + - towing_payable + - unit_number + - updated_at + - v_color + - v_make_desc + - v_model_desc + - v_model_yr + - v_vin + - vehicleid + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: jobs + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1589354371131_update_permission_user_public_table_jobs/down.yaml b/hasura/migrations/1589354371131_update_permission_user_public_table_jobs/down.yaml new file mode 100644 index 000000000..c5748c7d9 --- /dev/null +++ b/hasura/migrations/1589354371131_update_permission_user_public_table_jobs/down.yaml @@ -0,0 +1,253 @@ +- args: + role: user + table: + name: jobs + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - actual_completion + - actual_delivery + - actual_in + - adj_g_disc + - adj_strdis + - adj_towdis + - adjustment_bottom_line + - agt_addr1 + - agt_addr2 + - agt_city + - agt_co_id + - agt_co_nm + - agt_ct_fn + - agt_ct_ln + - agt_ct_ph + - agt_ct_phx + - agt_ctry + - agt_ea + - agt_fax + - agt_faxx + - agt_lic_no + - agt_ph1 + - agt_ph1x + - agt_ph2 + - agt_ph2x + - agt_st + - agt_zip + - area_of_damage + - asgn_date + - asgn_no + - asgn_type + - cat_no + - cieca_stl + - cieca_ttl + - ciecaid + - clm_addr1 + - clm_addr2 + - clm_city + - clm_ct_fn + - clm_ct_ln + - clm_ct_ph + - clm_ct_phx + - clm_ctry + - clm_ea + - clm_fax + - clm_faxx + - clm_no + - clm_ofc_id + - clm_ofc_nm + - clm_ph1 + - clm_ph1x + - clm_ph2 + - clm_ph2x + - clm_st + - clm_title + - clm_total + - clm_zip + - converted + - created_at + - csr + - cust_pr + - date_closed + - date_estimated + - date_exported + - date_invoiced + - date_open + - date_scheduled + - ded_amt + - ded_status + - depreciation_taxes + - est_addr1 + - est_addr2 + - est_city + - est_co_nm + - est_ct_fn + - est_ct_ln + - est_ctry + - est_ea + - est_number + - est_ph1 + - est_st + - est_zip + - federal_tax_payable + - federal_tax_rate + - g_bett_amt + - id + - inproduction + - ins_addr1 + - ins_addr2 + - ins_city + - ins_co_id + - ins_co_nm + - ins_ct_fn + - ins_ct_ln + - ins_ct_ph + - ins_ct_phx + - ins_ctry + - ins_ea + - ins_fax + - ins_faxx + - ins_memo + - ins_ph1 + - ins_ph1x + - ins_ph2 + - ins_ph2x + - ins_st + - ins_title + - ins_zip + - insd_addr1 + - insd_addr2 + - insd_city + - insd_co_nm + - insd_ctry + - insd_ea + - insd_fax + - insd_faxx + - insd_fn + - insd_ln + - insd_ph1 + - insd_ph1x + - insd_ph2 + - insd_ph2x + - insd_st + - insd_title + - insd_zip + - invoice_date + - job_totals + - kmin + - kmout + - labor_rate_desc + - labor_rate_id + - local_tax_rate + - loss_cat + - loss_date + - loss_desc + - loss_type + - other_amount_payable + - owner_owing + - ownerid + - ownr_addr1 + - ownr_addr2 + - ownr_city + - ownr_co_nm + - ownr_ctry + - ownr_ea + - ownr_fax + - ownr_faxx + - ownr_fn + - ownr_ln + - ownr_ph1 + - ownr_ph1x + - ownr_ph2 + - ownr_ph2x + - ownr_st + - ownr_title + - ownr_zip + - parts_tax_rates + - pay_amt + - pay_chknm + - pay_date + - pay_type + - payee_nms + - plate_no + - plate_st + - po_number + - policy_no + - production_vars + - rate_atp + - rate_la1 + - rate_la2 + - rate_la3 + - rate_la4 + - rate_laa + - rate_lab + - rate_lad + - rate_lae + - rate_laf + - rate_lag + - rate_lam + - rate_lar + - rate_las + - rate_lau + - rate_ma2s + - rate_ma2t + - rate_ma3s + - rate_mabl + - rate_macs + - rate_mahw + - rate_mapa + - rate_mash + - rate_matd + - referral_source + - regie_number + - ro_number + - scheduled_completion + - scheduled_delivery + - scheduled_in + - selling_dealer + - selling_dealer_contact + - servicing_dealer + - servicing_dealer_contact + - shopid + - special_coverage_policy + - state_tax_rate + - status + - statusid + - storage_payable + - tax_lbr_rt + - tax_levies_rt + - tax_paint_mat_rt + - tax_predis + - tax_prethr + - tax_pstthr + - tax_str_rt + - tax_sub_rt + - tax_thramt + - tax_tow_rt + - theft_ind + - tlos_ind + - towing_payable + - unit_number + - updated_at + - v_color + - v_make_desc + - v_model_desc + - v_model_yr + - v_vin + - vehicleid + computed_fields: [] + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: jobs + schema: public + type: create_select_permission diff --git a/hasura/migrations/1589354371131_update_permission_user_public_table_jobs/up.yaml b/hasura/migrations/1589354371131_update_permission_user_public_table_jobs/up.yaml new file mode 100644 index 000000000..5d889adc3 --- /dev/null +++ b/hasura/migrations/1589354371131_update_permission_user_public_table_jobs/up.yaml @@ -0,0 +1,254 @@ +- args: + role: user + table: + name: jobs + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - actual_completion + - actual_delivery + - actual_in + - adj_g_disc + - adj_strdis + - adj_towdis + - adjustment_bottom_line + - agt_addr1 + - agt_addr2 + - agt_city + - agt_co_id + - agt_co_nm + - agt_ct_fn + - agt_ct_ln + - agt_ct_ph + - agt_ct_phx + - agt_ctry + - agt_ea + - agt_fax + - agt_faxx + - agt_lic_no + - agt_ph1 + - agt_ph1x + - agt_ph2 + - agt_ph2x + - agt_st + - agt_zip + - area_of_damage + - asgn_date + - asgn_no + - asgn_type + - cat_no + - cieca_stl + - cieca_ttl + - ciecaid + - clm_addr1 + - clm_addr2 + - clm_city + - clm_ct_fn + - clm_ct_ln + - clm_ct_ph + - clm_ct_phx + - clm_ctry + - clm_ea + - clm_fax + - clm_faxx + - clm_no + - clm_ofc_id + - clm_ofc_nm + - clm_ph1 + - clm_ph1x + - clm_ph2 + - clm_ph2x + - clm_st + - clm_title + - clm_total + - clm_zip + - converted + - created_at + - csr + - cust_pr + - date_closed + - date_estimated + - date_exported + - date_invoiced + - date_open + - date_scheduled + - ded_amt + - ded_status + - depreciation_taxes + - est_addr1 + - est_addr2 + - est_city + - est_co_nm + - est_ct_fn + - est_ct_ln + - est_ctry + - est_ea + - est_number + - est_ph1 + - est_st + - est_zip + - federal_tax_payable + - federal_tax_rate + - g_bett_amt + - id + - inproduction + - ins_addr1 + - ins_addr2 + - ins_city + - ins_co_id + - ins_co_nm + - ins_ct_fn + - ins_ct_ln + - ins_ct_ph + - ins_ct_phx + - ins_ctry + - ins_ea + - ins_fax + - ins_faxx + - ins_memo + - ins_ph1 + - ins_ph1x + - ins_ph2 + - ins_ph2x + - ins_st + - ins_title + - ins_zip + - insd_addr1 + - insd_addr2 + - insd_city + - insd_co_nm + - insd_ctry + - insd_ea + - insd_fax + - insd_faxx + - insd_fn + - insd_ln + - insd_ph1 + - insd_ph1x + - insd_ph2 + - insd_ph2x + - insd_st + - insd_title + - insd_zip + - intakechecklist + - invoice_date + - job_totals + - kmin + - kmout + - labor_rate_desc + - labor_rate_id + - local_tax_rate + - loss_cat + - loss_date + - loss_desc + - loss_type + - other_amount_payable + - owner_owing + - ownerid + - ownr_addr1 + - ownr_addr2 + - ownr_city + - ownr_co_nm + - ownr_ctry + - ownr_ea + - ownr_fax + - ownr_faxx + - ownr_fn + - ownr_ln + - ownr_ph1 + - ownr_ph1x + - ownr_ph2 + - ownr_ph2x + - ownr_st + - ownr_title + - ownr_zip + - parts_tax_rates + - pay_amt + - pay_chknm + - pay_date + - pay_type + - payee_nms + - plate_no + - plate_st + - po_number + - policy_no + - production_vars + - rate_atp + - rate_la1 + - rate_la2 + - rate_la3 + - rate_la4 + - rate_laa + - rate_lab + - rate_lad + - rate_lae + - rate_laf + - rate_lag + - rate_lam + - rate_lar + - rate_las + - rate_lau + - rate_ma2s + - rate_ma2t + - rate_ma3s + - rate_mabl + - rate_macs + - rate_mahw + - rate_mapa + - rate_mash + - rate_matd + - referral_source + - regie_number + - ro_number + - scheduled_completion + - scheduled_delivery + - scheduled_in + - selling_dealer + - selling_dealer_contact + - servicing_dealer + - servicing_dealer_contact + - shopid + - special_coverage_policy + - state_tax_rate + - status + - statusid + - storage_payable + - tax_lbr_rt + - tax_levies_rt + - tax_paint_mat_rt + - tax_predis + - tax_prethr + - tax_pstthr + - tax_str_rt + - tax_sub_rt + - tax_thramt + - tax_tow_rt + - theft_ind + - tlos_ind + - towing_payable + - unit_number + - updated_at + - v_color + - v_make_desc + - v_model_desc + - v_model_yr + - v_vin + - vehicleid + computed_fields: [] + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: jobs + schema: public + type: create_select_permission diff --git a/hasura/migrations/1589354381499_update_permission_user_public_table_jobs/down.yaml b/hasura/migrations/1589354381499_update_permission_user_public_table_jobs/down.yaml new file mode 100644 index 000000000..b7b713a69 --- /dev/null +++ b/hasura/migrations/1589354381499_update_permission_user_public_table_jobs/down.yaml @@ -0,0 +1,255 @@ +- args: + role: user + table: + name: jobs + schema: public + type: drop_update_permission +- args: + permission: + columns: + - actual_completion + - actual_delivery + - actual_in + - adj_g_disc + - adj_strdis + - adj_towdis + - adjustment_bottom_line + - agt_addr1 + - agt_addr2 + - agt_city + - agt_co_id + - agt_co_nm + - agt_ct_fn + - agt_ct_ln + - agt_ct_ph + - agt_ct_phx + - agt_ctry + - agt_ea + - agt_fax + - agt_faxx + - agt_lic_no + - agt_ph1 + - agt_ph1x + - agt_ph2 + - agt_ph2x + - agt_st + - agt_zip + - area_of_damage + - asgn_date + - asgn_no + - asgn_type + - cat_no + - cieca_stl + - cieca_ttl + - ciecaid + - clm_addr1 + - clm_addr2 + - clm_city + - clm_ct_fn + - clm_ct_ln + - clm_ct_ph + - clm_ct_phx + - clm_ctry + - clm_ea + - clm_fax + - clm_faxx + - clm_no + - clm_ofc_id + - clm_ofc_nm + - clm_ph1 + - clm_ph1x + - clm_ph2 + - clm_ph2x + - clm_st + - clm_title + - clm_total + - clm_zip + - converted + - created_at + - csr + - cust_pr + - date_closed + - date_estimated + - date_exported + - date_invoiced + - date_open + - date_scheduled + - ded_amt + - ded_status + - depreciation_taxes + - est_addr1 + - est_addr2 + - est_city + - est_co_nm + - est_ct_fn + - est_ct_ln + - est_ctry + - est_ea + - est_number + - est_ph1 + - est_st + - est_zip + - federal_tax_payable + - federal_tax_rate + - g_bett_amt + - id + - inproduction + - ins_addr1 + - ins_addr2 + - ins_city + - ins_co_id + - ins_co_nm + - ins_ct_fn + - ins_ct_ln + - ins_ct_ph + - ins_ct_phx + - ins_ctry + - ins_ea + - ins_fax + - ins_faxx + - ins_memo + - ins_ph1 + - ins_ph1x + - ins_ph2 + - ins_ph2x + - ins_st + - ins_title + - ins_zip + - insd_addr1 + - insd_addr2 + - insd_city + - insd_co_nm + - insd_ctry + - insd_ea + - insd_fax + - insd_faxx + - insd_fn + - insd_ln + - insd_ph1 + - insd_ph1x + - insd_ph2 + - insd_ph2x + - insd_st + - insd_title + - insd_zip + - invoice_date + - job_totals + - kmin + - kmout + - labor_rate_desc + - labor_rate_id + - local_tax_rate + - loss_cat + - loss_date + - loss_desc + - loss_type + - other_amount_payable + - owner_owing + - ownerid + - ownr_addr1 + - ownr_addr2 + - ownr_city + - ownr_co_nm + - ownr_ctry + - ownr_ea + - ownr_fax + - ownr_faxx + - ownr_fn + - ownr_ln + - ownr_ph1 + - ownr_ph1x + - ownr_ph2 + - ownr_ph2x + - ownr_st + - ownr_title + - ownr_zip + - parts_tax_rates + - pay_amt + - pay_chknm + - pay_date + - pay_type + - payee_nms + - plate_no + - plate_st + - po_number + - policy_no + - production_vars + - rate_atp + - rate_la1 + - rate_la2 + - rate_la3 + - rate_la4 + - rate_laa + - rate_lab + - rate_lad + - rate_lae + - rate_laf + - rate_lag + - rate_lam + - rate_lar + - rate_las + - rate_lau + - rate_ma2s + - rate_ma2t + - rate_ma3s + - rate_mabl + - rate_macs + - rate_mahw + - rate_mapa + - rate_mash + - rate_matd + - referral_source + - regie_number + - ro_number + - scheduled_completion + - scheduled_delivery + - scheduled_in + - selling_dealer + - selling_dealer_contact + - servicing_dealer + - servicing_dealer_contact + - shopid + - special_coverage_policy + - state_tax_rate + - status + - statusid + - storage_payable + - tax_lbr_rt + - tax_levies_rt + - tax_paint_mat_rt + - tax_predis + - tax_prethr + - tax_pstthr + - tax_str_rt + - tax_sub_rt + - tax_thramt + - tax_tow_rt + - theft_ind + - tlos_ind + - towing_payable + - unit_number + - updated_at + - v_color + - v_make_desc + - v_model_desc + - v_model_yr + - v_vin + - vehicleid + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: jobs + schema: public + type: create_update_permission diff --git a/hasura/migrations/1589354381499_update_permission_user_public_table_jobs/up.yaml b/hasura/migrations/1589354381499_update_permission_user_public_table_jobs/up.yaml new file mode 100644 index 000000000..2cc028154 --- /dev/null +++ b/hasura/migrations/1589354381499_update_permission_user_public_table_jobs/up.yaml @@ -0,0 +1,256 @@ +- args: + role: user + table: + name: jobs + schema: public + type: drop_update_permission +- args: + permission: + columns: + - actual_completion + - actual_delivery + - actual_in + - adj_g_disc + - adj_strdis + - adj_towdis + - adjustment_bottom_line + - agt_addr1 + - agt_addr2 + - agt_city + - agt_co_id + - agt_co_nm + - agt_ct_fn + - agt_ct_ln + - agt_ct_ph + - agt_ct_phx + - agt_ctry + - agt_ea + - agt_fax + - agt_faxx + - agt_lic_no + - agt_ph1 + - agt_ph1x + - agt_ph2 + - agt_ph2x + - agt_st + - agt_zip + - area_of_damage + - asgn_date + - asgn_no + - asgn_type + - cat_no + - cieca_stl + - cieca_ttl + - ciecaid + - clm_addr1 + - clm_addr2 + - clm_city + - clm_ct_fn + - clm_ct_ln + - clm_ct_ph + - clm_ct_phx + - clm_ctry + - clm_ea + - clm_fax + - clm_faxx + - clm_no + - clm_ofc_id + - clm_ofc_nm + - clm_ph1 + - clm_ph1x + - clm_ph2 + - clm_ph2x + - clm_st + - clm_title + - clm_total + - clm_zip + - converted + - created_at + - csr + - cust_pr + - date_closed + - date_estimated + - date_exported + - date_invoiced + - date_open + - date_scheduled + - ded_amt + - ded_status + - depreciation_taxes + - est_addr1 + - est_addr2 + - est_city + - est_co_nm + - est_ct_fn + - est_ct_ln + - est_ctry + - est_ea + - est_number + - est_ph1 + - est_st + - est_zip + - federal_tax_payable + - federal_tax_rate + - g_bett_amt + - id + - inproduction + - ins_addr1 + - ins_addr2 + - ins_city + - ins_co_id + - ins_co_nm + - ins_ct_fn + - ins_ct_ln + - ins_ct_ph + - ins_ct_phx + - ins_ctry + - ins_ea + - ins_fax + - ins_faxx + - ins_memo + - ins_ph1 + - ins_ph1x + - ins_ph2 + - ins_ph2x + - ins_st + - ins_title + - ins_zip + - insd_addr1 + - insd_addr2 + - insd_city + - insd_co_nm + - insd_ctry + - insd_ea + - insd_fax + - insd_faxx + - insd_fn + - insd_ln + - insd_ph1 + - insd_ph1x + - insd_ph2 + - insd_ph2x + - insd_st + - insd_title + - insd_zip + - intakechecklist + - invoice_date + - job_totals + - kmin + - kmout + - labor_rate_desc + - labor_rate_id + - local_tax_rate + - loss_cat + - loss_date + - loss_desc + - loss_type + - other_amount_payable + - owner_owing + - ownerid + - ownr_addr1 + - ownr_addr2 + - ownr_city + - ownr_co_nm + - ownr_ctry + - ownr_ea + - ownr_fax + - ownr_faxx + - ownr_fn + - ownr_ln + - ownr_ph1 + - ownr_ph1x + - ownr_ph2 + - ownr_ph2x + - ownr_st + - ownr_title + - ownr_zip + - parts_tax_rates + - pay_amt + - pay_chknm + - pay_date + - pay_type + - payee_nms + - plate_no + - plate_st + - po_number + - policy_no + - production_vars + - rate_atp + - rate_la1 + - rate_la2 + - rate_la3 + - rate_la4 + - rate_laa + - rate_lab + - rate_lad + - rate_lae + - rate_laf + - rate_lag + - rate_lam + - rate_lar + - rate_las + - rate_lau + - rate_ma2s + - rate_ma2t + - rate_ma3s + - rate_mabl + - rate_macs + - rate_mahw + - rate_mapa + - rate_mash + - rate_matd + - referral_source + - regie_number + - ro_number + - scheduled_completion + - scheduled_delivery + - scheduled_in + - selling_dealer + - selling_dealer_contact + - servicing_dealer + - servicing_dealer_contact + - shopid + - special_coverage_policy + - state_tax_rate + - status + - statusid + - storage_payable + - tax_lbr_rt + - tax_levies_rt + - tax_paint_mat_rt + - tax_predis + - tax_prethr + - tax_pstthr + - tax_str_rt + - tax_sub_rt + - tax_thramt + - tax_tow_rt + - theft_ind + - tlos_ind + - towing_payable + - unit_number + - updated_at + - v_color + - v_make_desc + - v_model_desc + - v_model_yr + - v_vin + - vehicleid + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: jobs + schema: public + type: create_update_permission diff --git a/hasura/migrations/1589481044730_alter_table_public_parts_orders_add_column_return/down.yaml b/hasura/migrations/1589481044730_alter_table_public_parts_orders_add_column_return/down.yaml new file mode 100644 index 000000000..3198ebcbb --- /dev/null +++ b/hasura/migrations/1589481044730_alter_table_public_parts_orders_add_column_return/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."parts_orders" DROP COLUMN "return"; + type: run_sql diff --git a/hasura/migrations/1589481044730_alter_table_public_parts_orders_add_column_return/up.yaml b/hasura/migrations/1589481044730_alter_table_public_parts_orders_add_column_return/up.yaml new file mode 100644 index 000000000..5653ccd3b --- /dev/null +++ b/hasura/migrations/1589481044730_alter_table_public_parts_orders_add_column_return/up.yaml @@ -0,0 +1,6 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."parts_orders" ADD COLUMN "return" boolean NOT NULL + DEFAULT false; + type: run_sql diff --git a/hasura/migrations/1589481062644_update_permission_user_public_table_parts_orders/down.yaml b/hasura/migrations/1589481062644_update_permission_user_public_table_parts_orders/down.yaml new file mode 100644 index 000000000..8e537f4d3 --- /dev/null +++ b/hasura/migrations/1589481062644_update_permission_user_public_table_parts_orders/down.yaml @@ -0,0 +1,38 @@ +- args: + role: user + table: + name: parts_orders + schema: public + type: drop_insert_permission +- args: + permission: + check: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - deliver_by + - order_date + - order_number + - status + - user_email + - created_at + - updated_at + - id + - jobid + - vendorid + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: parts_orders + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1589481062644_update_permission_user_public_table_parts_orders/up.yaml b/hasura/migrations/1589481062644_update_permission_user_public_table_parts_orders/up.yaml new file mode 100644 index 000000000..28ec7048c --- /dev/null +++ b/hasura/migrations/1589481062644_update_permission_user_public_table_parts_orders/up.yaml @@ -0,0 +1,39 @@ +- args: + role: user + table: + name: parts_orders + schema: public + type: drop_insert_permission +- args: + permission: + check: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - created_at + - deliver_by + - id + - jobid + - order_date + - order_number + - return + - status + - updated_at + - user_email + - vendorid + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: parts_orders + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1589481097225_update_permission_user_public_table_parts_orders/down.yaml b/hasura/migrations/1589481097225_update_permission_user_public_table_parts_orders/down.yaml new file mode 100644 index 000000000..9165bf42c --- /dev/null +++ b/hasura/migrations/1589481097225_update_permission_user_public_table_parts_orders/down.yaml @@ -0,0 +1,36 @@ +- args: + role: user + table: + name: parts_orders + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - deliver_by + - order_date + - order_number + - status + - user_email + - created_at + - updated_at + - id + - jobid + - vendorid + computed_fields: [] + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: parts_orders + schema: public + type: create_select_permission diff --git a/hasura/migrations/1589481097225_update_permission_user_public_table_parts_orders/up.yaml b/hasura/migrations/1589481097225_update_permission_user_public_table_parts_orders/up.yaml new file mode 100644 index 000000000..92571d4b8 --- /dev/null +++ b/hasura/migrations/1589481097225_update_permission_user_public_table_parts_orders/up.yaml @@ -0,0 +1,37 @@ +- args: + role: user + table: + name: parts_orders + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - created_at + - deliver_by + - id + - jobid + - order_date + - order_number + - return + - status + - updated_at + - user_email + - vendorid + computed_fields: [] + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: parts_orders + schema: public + type: create_select_permission diff --git a/hasura/migrations/1589491932788_alter_table_public_parts_orders_add_column_returnfrominvoice/down.yaml b/hasura/migrations/1589491932788_alter_table_public_parts_orders_add_column_returnfrominvoice/down.yaml new file mode 100644 index 000000000..5335afc04 --- /dev/null +++ b/hasura/migrations/1589491932788_alter_table_public_parts_orders_add_column_returnfrominvoice/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."parts_orders" DROP COLUMN "returnfrominvoice"; + type: run_sql diff --git a/hasura/migrations/1589491932788_alter_table_public_parts_orders_add_column_returnfrominvoice/up.yaml b/hasura/migrations/1589491932788_alter_table_public_parts_orders_add_column_returnfrominvoice/up.yaml new file mode 100644 index 000000000..4aecfe94f --- /dev/null +++ b/hasura/migrations/1589491932788_alter_table_public_parts_orders_add_column_returnfrominvoice/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."parts_orders" ADD COLUMN "returnfrominvoice" uuid NULL; + type: run_sql diff --git a/hasura/migrations/1589491953447_set_fk_public_parts_orders_returnfrominvoice/down.yaml b/hasura/migrations/1589491953447_set_fk_public_parts_orders_returnfrominvoice/down.yaml new file mode 100644 index 000000000..e3b0136a4 --- /dev/null +++ b/hasura/migrations/1589491953447_set_fk_public_parts_orders_returnfrominvoice/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: alter table "public"."parts_orders" drop constraint "parts_orders_returnfrominvoice_fkey"; + type: run_sql diff --git a/hasura/migrations/1589491953447_set_fk_public_parts_orders_returnfrominvoice/up.yaml b/hasura/migrations/1589491953447_set_fk_public_parts_orders_returnfrominvoice/up.yaml new file mode 100644 index 000000000..6cbd7ae88 --- /dev/null +++ b/hasura/migrations/1589491953447_set_fk_public_parts_orders_returnfrominvoice/up.yaml @@ -0,0 +1,10 @@ +- args: + cascade: false + read_only: false + sql: |- + alter table "public"."parts_orders" + add constraint "parts_orders_returnfrominvoice_fkey" + foreign key ("returnfrominvoice") + references "public"."invoices" + ("id") on update restrict on delete restrict; + type: run_sql diff --git a/hasura/migrations/1589491967880_track_all_relationships/down.yaml b/hasura/migrations/1589491967880_track_all_relationships/down.yaml new file mode 100644 index 000000000..b39ac7746 --- /dev/null +++ b/hasura/migrations/1589491967880_track_all_relationships/down.yaml @@ -0,0 +1,12 @@ +- args: + relationship: parts_orders + table: + name: invoices + schema: public + type: drop_relationship +- args: + relationship: invoice + table: + name: parts_orders + schema: public + type: drop_relationship diff --git a/hasura/migrations/1589491967880_track_all_relationships/up.yaml b/hasura/migrations/1589491967880_track_all_relationships/up.yaml new file mode 100644 index 000000000..e4de73926 --- /dev/null +++ b/hasura/migrations/1589491967880_track_all_relationships/up.yaml @@ -0,0 +1,20 @@ +- args: + name: parts_orders + table: + name: invoices + schema: public + using: + foreign_key_constraint_on: + column: returnfrominvoice + table: + name: parts_orders + schema: public + type: create_array_relationship +- args: + name: invoice + table: + name: parts_orders + schema: public + using: + foreign_key_constraint_on: returnfrominvoice + type: create_object_relationship diff --git a/hasura/migrations/1589491993267_update_permission_user_public_table_parts_orders/down.yaml b/hasura/migrations/1589491993267_update_permission_user_public_table_parts_orders/down.yaml new file mode 100644 index 000000000..28ec7048c --- /dev/null +++ b/hasura/migrations/1589491993267_update_permission_user_public_table_parts_orders/down.yaml @@ -0,0 +1,39 @@ +- args: + role: user + table: + name: parts_orders + schema: public + type: drop_insert_permission +- args: + permission: + check: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - created_at + - deliver_by + - id + - jobid + - order_date + - order_number + - return + - status + - updated_at + - user_email + - vendorid + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: parts_orders + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1589491993267_update_permission_user_public_table_parts_orders/up.yaml b/hasura/migrations/1589491993267_update_permission_user_public_table_parts_orders/up.yaml new file mode 100644 index 000000000..c63d56109 --- /dev/null +++ b/hasura/migrations/1589491993267_update_permission_user_public_table_parts_orders/up.yaml @@ -0,0 +1,40 @@ +- args: + role: user + table: + name: parts_orders + schema: public + type: drop_insert_permission +- args: + permission: + check: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - created_at + - deliver_by + - id + - jobid + - order_date + - order_number + - return + - returnfrominvoice + - status + - updated_at + - user_email + - vendorid + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: parts_orders + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1589492000096_update_permission_user_public_table_parts_orders/down.yaml b/hasura/migrations/1589492000096_update_permission_user_public_table_parts_orders/down.yaml new file mode 100644 index 000000000..92571d4b8 --- /dev/null +++ b/hasura/migrations/1589492000096_update_permission_user_public_table_parts_orders/down.yaml @@ -0,0 +1,37 @@ +- args: + role: user + table: + name: parts_orders + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - created_at + - deliver_by + - id + - jobid + - order_date + - order_number + - return + - status + - updated_at + - user_email + - vendorid + computed_fields: [] + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: parts_orders + schema: public + type: create_select_permission diff --git a/hasura/migrations/1589492000096_update_permission_user_public_table_parts_orders/up.yaml b/hasura/migrations/1589492000096_update_permission_user_public_table_parts_orders/up.yaml new file mode 100644 index 000000000..b62aca044 --- /dev/null +++ b/hasura/migrations/1589492000096_update_permission_user_public_table_parts_orders/up.yaml @@ -0,0 +1,38 @@ +- args: + role: user + table: + name: parts_orders + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - created_at + - deliver_by + - id + - jobid + - order_date + - order_number + - return + - returnfrominvoice + - status + - updated_at + - user_email + - vendorid + computed_fields: [] + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: parts_orders + schema: public + type: create_select_permission diff --git a/hasura/migrations/1589492006320_update_permission_user_public_table_parts_orders/down.yaml b/hasura/migrations/1589492006320_update_permission_user_public_table_parts_orders/down.yaml new file mode 100644 index 000000000..13b4f14d5 --- /dev/null +++ b/hasura/migrations/1589492006320_update_permission_user_public_table_parts_orders/down.yaml @@ -0,0 +1,38 @@ +- args: + role: user + table: + name: parts_orders + schema: public + type: drop_update_permission +- args: + permission: + columns: + - deliver_by + - order_date + - order_number + - status + - user_email + - created_at + - updated_at + - id + - jobid + - vendorid + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: parts_orders + schema: public + type: create_update_permission diff --git a/hasura/migrations/1589492006320_update_permission_user_public_table_parts_orders/up.yaml b/hasura/migrations/1589492006320_update_permission_user_public_table_parts_orders/up.yaml new file mode 100644 index 000000000..e5f4bae5f --- /dev/null +++ b/hasura/migrations/1589492006320_update_permission_user_public_table_parts_orders/up.yaml @@ -0,0 +1,39 @@ +- args: + role: user + table: + name: parts_orders + schema: public + type: drop_update_permission +- args: + permission: + columns: + - created_at + - deliver_by + - id + - jobid + - order_date + - order_number + - returnfrominvoice + - status + - updated_at + - user_email + - vendorid + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: parts_orders + schema: public + type: create_update_permission diff --git a/hasura/migrations/1589499599269_update_permission_user_public_table_jobs/down.yaml b/hasura/migrations/1589499599269_update_permission_user_public_table_jobs/down.yaml new file mode 100644 index 000000000..5d889adc3 --- /dev/null +++ b/hasura/migrations/1589499599269_update_permission_user_public_table_jobs/down.yaml @@ -0,0 +1,254 @@ +- args: + role: user + table: + name: jobs + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - actual_completion + - actual_delivery + - actual_in + - adj_g_disc + - adj_strdis + - adj_towdis + - adjustment_bottom_line + - agt_addr1 + - agt_addr2 + - agt_city + - agt_co_id + - agt_co_nm + - agt_ct_fn + - agt_ct_ln + - agt_ct_ph + - agt_ct_phx + - agt_ctry + - agt_ea + - agt_fax + - agt_faxx + - agt_lic_no + - agt_ph1 + - agt_ph1x + - agt_ph2 + - agt_ph2x + - agt_st + - agt_zip + - area_of_damage + - asgn_date + - asgn_no + - asgn_type + - cat_no + - cieca_stl + - cieca_ttl + - ciecaid + - clm_addr1 + - clm_addr2 + - clm_city + - clm_ct_fn + - clm_ct_ln + - clm_ct_ph + - clm_ct_phx + - clm_ctry + - clm_ea + - clm_fax + - clm_faxx + - clm_no + - clm_ofc_id + - clm_ofc_nm + - clm_ph1 + - clm_ph1x + - clm_ph2 + - clm_ph2x + - clm_st + - clm_title + - clm_total + - clm_zip + - converted + - created_at + - csr + - cust_pr + - date_closed + - date_estimated + - date_exported + - date_invoiced + - date_open + - date_scheduled + - ded_amt + - ded_status + - depreciation_taxes + - est_addr1 + - est_addr2 + - est_city + - est_co_nm + - est_ct_fn + - est_ct_ln + - est_ctry + - est_ea + - est_number + - est_ph1 + - est_st + - est_zip + - federal_tax_payable + - federal_tax_rate + - g_bett_amt + - id + - inproduction + - ins_addr1 + - ins_addr2 + - ins_city + - ins_co_id + - ins_co_nm + - ins_ct_fn + - ins_ct_ln + - ins_ct_ph + - ins_ct_phx + - ins_ctry + - ins_ea + - ins_fax + - ins_faxx + - ins_memo + - ins_ph1 + - ins_ph1x + - ins_ph2 + - ins_ph2x + - ins_st + - ins_title + - ins_zip + - insd_addr1 + - insd_addr2 + - insd_city + - insd_co_nm + - insd_ctry + - insd_ea + - insd_fax + - insd_faxx + - insd_fn + - insd_ln + - insd_ph1 + - insd_ph1x + - insd_ph2 + - insd_ph2x + - insd_st + - insd_title + - insd_zip + - intakechecklist + - invoice_date + - job_totals + - kmin + - kmout + - labor_rate_desc + - labor_rate_id + - local_tax_rate + - loss_cat + - loss_date + - loss_desc + - loss_type + - other_amount_payable + - owner_owing + - ownerid + - ownr_addr1 + - ownr_addr2 + - ownr_city + - ownr_co_nm + - ownr_ctry + - ownr_ea + - ownr_fax + - ownr_faxx + - ownr_fn + - ownr_ln + - ownr_ph1 + - ownr_ph1x + - ownr_ph2 + - ownr_ph2x + - ownr_st + - ownr_title + - ownr_zip + - parts_tax_rates + - pay_amt + - pay_chknm + - pay_date + - pay_type + - payee_nms + - plate_no + - plate_st + - po_number + - policy_no + - production_vars + - rate_atp + - rate_la1 + - rate_la2 + - rate_la3 + - rate_la4 + - rate_laa + - rate_lab + - rate_lad + - rate_lae + - rate_laf + - rate_lag + - rate_lam + - rate_lar + - rate_las + - rate_lau + - rate_ma2s + - rate_ma2t + - rate_ma3s + - rate_mabl + - rate_macs + - rate_mahw + - rate_mapa + - rate_mash + - rate_matd + - referral_source + - regie_number + - ro_number + - scheduled_completion + - scheduled_delivery + - scheduled_in + - selling_dealer + - selling_dealer_contact + - servicing_dealer + - servicing_dealer_contact + - shopid + - special_coverage_policy + - state_tax_rate + - status + - statusid + - storage_payable + - tax_lbr_rt + - tax_levies_rt + - tax_paint_mat_rt + - tax_predis + - tax_prethr + - tax_pstthr + - tax_str_rt + - tax_sub_rt + - tax_thramt + - tax_tow_rt + - theft_ind + - tlos_ind + - towing_payable + - unit_number + - updated_at + - v_color + - v_make_desc + - v_model_desc + - v_model_yr + - v_vin + - vehicleid + computed_fields: [] + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: jobs + schema: public + type: create_select_permission diff --git a/hasura/migrations/1589499599269_update_permission_user_public_table_jobs/up.yaml b/hasura/migrations/1589499599269_update_permission_user_public_table_jobs/up.yaml new file mode 100644 index 000000000..aa79c3907 --- /dev/null +++ b/hasura/migrations/1589499599269_update_permission_user_public_table_jobs/up.yaml @@ -0,0 +1,254 @@ +- args: + role: user + table: + name: jobs + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: true + columns: + - actual_completion + - actual_delivery + - actual_in + - adj_g_disc + - adj_strdis + - adj_towdis + - adjustment_bottom_line + - agt_addr1 + - agt_addr2 + - agt_city + - agt_co_id + - agt_co_nm + - agt_ct_fn + - agt_ct_ln + - agt_ct_ph + - agt_ct_phx + - agt_ctry + - agt_ea + - agt_fax + - agt_faxx + - agt_lic_no + - agt_ph1 + - agt_ph1x + - agt_ph2 + - agt_ph2x + - agt_st + - agt_zip + - area_of_damage + - asgn_date + - asgn_no + - asgn_type + - cat_no + - cieca_stl + - cieca_ttl + - ciecaid + - clm_addr1 + - clm_addr2 + - clm_city + - clm_ct_fn + - clm_ct_ln + - clm_ct_ph + - clm_ct_phx + - clm_ctry + - clm_ea + - clm_fax + - clm_faxx + - clm_no + - clm_ofc_id + - clm_ofc_nm + - clm_ph1 + - clm_ph1x + - clm_ph2 + - clm_ph2x + - clm_st + - clm_title + - clm_total + - clm_zip + - converted + - created_at + - csr + - cust_pr + - date_closed + - date_estimated + - date_exported + - date_invoiced + - date_open + - date_scheduled + - ded_amt + - ded_status + - depreciation_taxes + - est_addr1 + - est_addr2 + - est_city + - est_co_nm + - est_ct_fn + - est_ct_ln + - est_ctry + - est_ea + - est_number + - est_ph1 + - est_st + - est_zip + - federal_tax_payable + - federal_tax_rate + - g_bett_amt + - id + - inproduction + - ins_addr1 + - ins_addr2 + - ins_city + - ins_co_id + - ins_co_nm + - ins_ct_fn + - ins_ct_ln + - ins_ct_ph + - ins_ct_phx + - ins_ctry + - ins_ea + - ins_fax + - ins_faxx + - ins_memo + - ins_ph1 + - ins_ph1x + - ins_ph2 + - ins_ph2x + - ins_st + - ins_title + - ins_zip + - insd_addr1 + - insd_addr2 + - insd_city + - insd_co_nm + - insd_ctry + - insd_ea + - insd_fax + - insd_faxx + - insd_fn + - insd_ln + - insd_ph1 + - insd_ph1x + - insd_ph2 + - insd_ph2x + - insd_st + - insd_title + - insd_zip + - intakechecklist + - invoice_date + - job_totals + - kmin + - kmout + - labor_rate_desc + - labor_rate_id + - local_tax_rate + - loss_cat + - loss_date + - loss_desc + - loss_type + - other_amount_payable + - owner_owing + - ownerid + - ownr_addr1 + - ownr_addr2 + - ownr_city + - ownr_co_nm + - ownr_ctry + - ownr_ea + - ownr_fax + - ownr_faxx + - ownr_fn + - ownr_ln + - ownr_ph1 + - ownr_ph1x + - ownr_ph2 + - ownr_ph2x + - ownr_st + - ownr_title + - ownr_zip + - parts_tax_rates + - pay_amt + - pay_chknm + - pay_date + - pay_type + - payee_nms + - plate_no + - plate_st + - po_number + - policy_no + - production_vars + - rate_atp + - rate_la1 + - rate_la2 + - rate_la3 + - rate_la4 + - rate_laa + - rate_lab + - rate_lad + - rate_lae + - rate_laf + - rate_lag + - rate_lam + - rate_lar + - rate_las + - rate_lau + - rate_ma2s + - rate_ma2t + - rate_ma3s + - rate_mabl + - rate_macs + - rate_mahw + - rate_mapa + - rate_mash + - rate_matd + - referral_source + - regie_number + - ro_number + - scheduled_completion + - scheduled_delivery + - scheduled_in + - selling_dealer + - selling_dealer_contact + - servicing_dealer + - servicing_dealer_contact + - shopid + - special_coverage_policy + - state_tax_rate + - status + - statusid + - storage_payable + - tax_lbr_rt + - tax_levies_rt + - tax_paint_mat_rt + - tax_predis + - tax_prethr + - tax_pstthr + - tax_str_rt + - tax_sub_rt + - tax_thramt + - tax_tow_rt + - theft_ind + - tlos_ind + - towing_payable + - unit_number + - updated_at + - v_color + - v_make_desc + - v_model_desc + - v_model_yr + - v_vin + - vehicleid + computed_fields: [] + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: jobs + schema: public + type: create_select_permission diff --git a/hasura/migrations/1590010104868_alter_table_public_jobs_add_column_invoice_allocation/down.yaml b/hasura/migrations/1590010104868_alter_table_public_jobs_add_column_invoice_allocation/down.yaml new file mode 100644 index 000000000..16b75535c --- /dev/null +++ b/hasura/migrations/1590010104868_alter_table_public_jobs_add_column_invoice_allocation/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."jobs" DROP COLUMN "invoice_allocation"; + type: run_sql diff --git a/hasura/migrations/1590010104868_alter_table_public_jobs_add_column_invoice_allocation/up.yaml b/hasura/migrations/1590010104868_alter_table_public_jobs_add_column_invoice_allocation/up.yaml new file mode 100644 index 000000000..c15c2c403 --- /dev/null +++ b/hasura/migrations/1590010104868_alter_table_public_jobs_add_column_invoice_allocation/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."jobs" ADD COLUMN "invoice_allocation" jsonb NULL; + type: run_sql diff --git a/hasura/migrations/1590010117414_update_permission_user_public_table_jobs/down.yaml b/hasura/migrations/1590010117414_update_permission_user_public_table_jobs/down.yaml new file mode 100644 index 000000000..962088486 --- /dev/null +++ b/hasura/migrations/1590010117414_update_permission_user_public_table_jobs/down.yaml @@ -0,0 +1,256 @@ +- args: + role: user + table: + name: jobs + schema: public + type: drop_insert_permission +- args: + permission: + check: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - actual_completion + - actual_delivery + - actual_in + - adj_g_disc + - adj_strdis + - adj_towdis + - adjustment_bottom_line + - agt_addr1 + - agt_addr2 + - agt_city + - agt_co_id + - agt_co_nm + - agt_ct_fn + - agt_ct_ln + - agt_ct_ph + - agt_ct_phx + - agt_ctry + - agt_ea + - agt_fax + - agt_faxx + - agt_lic_no + - agt_ph1 + - agt_ph1x + - agt_ph2 + - agt_ph2x + - agt_st + - agt_zip + - area_of_damage + - asgn_date + - asgn_no + - asgn_type + - cat_no + - cieca_stl + - cieca_ttl + - ciecaid + - clm_addr1 + - clm_addr2 + - clm_city + - clm_ct_fn + - clm_ct_ln + - clm_ct_ph + - clm_ct_phx + - clm_ctry + - clm_ea + - clm_fax + - clm_faxx + - clm_no + - clm_ofc_id + - clm_ofc_nm + - clm_ph1 + - clm_ph1x + - clm_ph2 + - clm_ph2x + - clm_st + - clm_title + - clm_total + - clm_zip + - converted + - created_at + - csr + - cust_pr + - date_closed + - date_estimated + - date_exported + - date_invoiced + - date_open + - date_scheduled + - ded_amt + - ded_status + - depreciation_taxes + - est_addr1 + - est_addr2 + - est_city + - est_co_nm + - est_ct_fn + - est_ct_ln + - est_ctry + - est_ea + - est_number + - est_ph1 + - est_st + - est_zip + - federal_tax_payable + - federal_tax_rate + - g_bett_amt + - id + - inproduction + - ins_addr1 + - ins_addr2 + - ins_city + - ins_co_id + - ins_co_nm + - ins_ct_fn + - ins_ct_ln + - ins_ct_ph + - ins_ct_phx + - ins_ctry + - ins_ea + - ins_fax + - ins_faxx + - ins_memo + - ins_ph1 + - ins_ph1x + - ins_ph2 + - ins_ph2x + - ins_st + - ins_title + - ins_zip + - insd_addr1 + - insd_addr2 + - insd_city + - insd_co_nm + - insd_ctry + - insd_ea + - insd_fax + - insd_faxx + - insd_fn + - insd_ln + - insd_ph1 + - insd_ph1x + - insd_ph2 + - insd_ph2x + - insd_st + - insd_title + - insd_zip + - intakechecklist + - invoice_date + - job_totals + - kmin + - kmout + - labor_rate_desc + - labor_rate_id + - local_tax_rate + - loss_cat + - loss_date + - loss_desc + - loss_type + - other_amount_payable + - owner_owing + - ownerid + - ownr_addr1 + - ownr_addr2 + - ownr_city + - ownr_co_nm + - ownr_ctry + - ownr_ea + - ownr_fax + - ownr_faxx + - ownr_fn + - ownr_ln + - ownr_ph1 + - ownr_ph1x + - ownr_ph2 + - ownr_ph2x + - ownr_st + - ownr_title + - ownr_zip + - parts_tax_rates + - pay_amt + - pay_chknm + - pay_date + - pay_type + - payee_nms + - plate_no + - plate_st + - po_number + - policy_no + - production_vars + - rate_atp + - rate_la1 + - rate_la2 + - rate_la3 + - rate_la4 + - rate_laa + - rate_lab + - rate_lad + - rate_lae + - rate_laf + - rate_lag + - rate_lam + - rate_lar + - rate_las + - rate_lau + - rate_ma2s + - rate_ma2t + - rate_ma3s + - rate_mabl + - rate_macs + - rate_mahw + - rate_mapa + - rate_mash + - rate_matd + - referral_source + - regie_number + - ro_number + - scheduled_completion + - scheduled_delivery + - scheduled_in + - selling_dealer + - selling_dealer_contact + - servicing_dealer + - servicing_dealer_contact + - shopid + - special_coverage_policy + - state_tax_rate + - status + - statusid + - storage_payable + - tax_lbr_rt + - tax_levies_rt + - tax_paint_mat_rt + - tax_predis + - tax_prethr + - tax_pstthr + - tax_str_rt + - tax_sub_rt + - tax_thramt + - tax_tow_rt + - theft_ind + - tlos_ind + - towing_payable + - unit_number + - updated_at + - v_color + - v_make_desc + - v_model_desc + - v_model_yr + - v_vin + - vehicleid + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: jobs + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1590010117414_update_permission_user_public_table_jobs/up.yaml b/hasura/migrations/1590010117414_update_permission_user_public_table_jobs/up.yaml new file mode 100644 index 000000000..0a78e16c2 --- /dev/null +++ b/hasura/migrations/1590010117414_update_permission_user_public_table_jobs/up.yaml @@ -0,0 +1,257 @@ +- args: + role: user + table: + name: jobs + schema: public + type: drop_insert_permission +- args: + permission: + check: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - actual_completion + - actual_delivery + - actual_in + - adj_g_disc + - adj_strdis + - adj_towdis + - adjustment_bottom_line + - agt_addr1 + - agt_addr2 + - agt_city + - agt_co_id + - agt_co_nm + - agt_ct_fn + - agt_ct_ln + - agt_ct_ph + - agt_ct_phx + - agt_ctry + - agt_ea + - agt_fax + - agt_faxx + - agt_lic_no + - agt_ph1 + - agt_ph1x + - agt_ph2 + - agt_ph2x + - agt_st + - agt_zip + - area_of_damage + - asgn_date + - asgn_no + - asgn_type + - cat_no + - cieca_stl + - cieca_ttl + - ciecaid + - clm_addr1 + - clm_addr2 + - clm_city + - clm_ct_fn + - clm_ct_ln + - clm_ct_ph + - clm_ct_phx + - clm_ctry + - clm_ea + - clm_fax + - clm_faxx + - clm_no + - clm_ofc_id + - clm_ofc_nm + - clm_ph1 + - clm_ph1x + - clm_ph2 + - clm_ph2x + - clm_st + - clm_title + - clm_total + - clm_zip + - converted + - created_at + - csr + - cust_pr + - date_closed + - date_estimated + - date_exported + - date_invoiced + - date_open + - date_scheduled + - ded_amt + - ded_status + - depreciation_taxes + - est_addr1 + - est_addr2 + - est_city + - est_co_nm + - est_ct_fn + - est_ct_ln + - est_ctry + - est_ea + - est_number + - est_ph1 + - est_st + - est_zip + - federal_tax_payable + - federal_tax_rate + - g_bett_amt + - id + - inproduction + - ins_addr1 + - ins_addr2 + - ins_city + - ins_co_id + - ins_co_nm + - ins_ct_fn + - ins_ct_ln + - ins_ct_ph + - ins_ct_phx + - ins_ctry + - ins_ea + - ins_fax + - ins_faxx + - ins_memo + - ins_ph1 + - ins_ph1x + - ins_ph2 + - ins_ph2x + - ins_st + - ins_title + - ins_zip + - insd_addr1 + - insd_addr2 + - insd_city + - insd_co_nm + - insd_ctry + - insd_ea + - insd_fax + - insd_faxx + - insd_fn + - insd_ln + - insd_ph1 + - insd_ph1x + - insd_ph2 + - insd_ph2x + - insd_st + - insd_title + - insd_zip + - intakechecklist + - invoice_allocation + - invoice_date + - job_totals + - kmin + - kmout + - labor_rate_desc + - labor_rate_id + - local_tax_rate + - loss_cat + - loss_date + - loss_desc + - loss_type + - other_amount_payable + - owner_owing + - ownerid + - ownr_addr1 + - ownr_addr2 + - ownr_city + - ownr_co_nm + - ownr_ctry + - ownr_ea + - ownr_fax + - ownr_faxx + - ownr_fn + - ownr_ln + - ownr_ph1 + - ownr_ph1x + - ownr_ph2 + - ownr_ph2x + - ownr_st + - ownr_title + - ownr_zip + - parts_tax_rates + - pay_amt + - pay_chknm + - pay_date + - pay_type + - payee_nms + - plate_no + - plate_st + - po_number + - policy_no + - production_vars + - rate_atp + - rate_la1 + - rate_la2 + - rate_la3 + - rate_la4 + - rate_laa + - rate_lab + - rate_lad + - rate_lae + - rate_laf + - rate_lag + - rate_lam + - rate_lar + - rate_las + - rate_lau + - rate_ma2s + - rate_ma2t + - rate_ma3s + - rate_mabl + - rate_macs + - rate_mahw + - rate_mapa + - rate_mash + - rate_matd + - referral_source + - regie_number + - ro_number + - scheduled_completion + - scheduled_delivery + - scheduled_in + - selling_dealer + - selling_dealer_contact + - servicing_dealer + - servicing_dealer_contact + - shopid + - special_coverage_policy + - state_tax_rate + - status + - statusid + - storage_payable + - tax_lbr_rt + - tax_levies_rt + - tax_paint_mat_rt + - tax_predis + - tax_prethr + - tax_pstthr + - tax_str_rt + - tax_sub_rt + - tax_thramt + - tax_tow_rt + - theft_ind + - tlos_ind + - towing_payable + - unit_number + - updated_at + - v_color + - v_make_desc + - v_model_desc + - v_model_yr + - v_vin + - vehicleid + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: jobs + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1590010125521_update_permission_user_public_table_jobs/down.yaml b/hasura/migrations/1590010125521_update_permission_user_public_table_jobs/down.yaml new file mode 100644 index 000000000..aa79c3907 --- /dev/null +++ b/hasura/migrations/1590010125521_update_permission_user_public_table_jobs/down.yaml @@ -0,0 +1,254 @@ +- args: + role: user + table: + name: jobs + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: true + columns: + - actual_completion + - actual_delivery + - actual_in + - adj_g_disc + - adj_strdis + - adj_towdis + - adjustment_bottom_line + - agt_addr1 + - agt_addr2 + - agt_city + - agt_co_id + - agt_co_nm + - agt_ct_fn + - agt_ct_ln + - agt_ct_ph + - agt_ct_phx + - agt_ctry + - agt_ea + - agt_fax + - agt_faxx + - agt_lic_no + - agt_ph1 + - agt_ph1x + - agt_ph2 + - agt_ph2x + - agt_st + - agt_zip + - area_of_damage + - asgn_date + - asgn_no + - asgn_type + - cat_no + - cieca_stl + - cieca_ttl + - ciecaid + - clm_addr1 + - clm_addr2 + - clm_city + - clm_ct_fn + - clm_ct_ln + - clm_ct_ph + - clm_ct_phx + - clm_ctry + - clm_ea + - clm_fax + - clm_faxx + - clm_no + - clm_ofc_id + - clm_ofc_nm + - clm_ph1 + - clm_ph1x + - clm_ph2 + - clm_ph2x + - clm_st + - clm_title + - clm_total + - clm_zip + - converted + - created_at + - csr + - cust_pr + - date_closed + - date_estimated + - date_exported + - date_invoiced + - date_open + - date_scheduled + - ded_amt + - ded_status + - depreciation_taxes + - est_addr1 + - est_addr2 + - est_city + - est_co_nm + - est_ct_fn + - est_ct_ln + - est_ctry + - est_ea + - est_number + - est_ph1 + - est_st + - est_zip + - federal_tax_payable + - federal_tax_rate + - g_bett_amt + - id + - inproduction + - ins_addr1 + - ins_addr2 + - ins_city + - ins_co_id + - ins_co_nm + - ins_ct_fn + - ins_ct_ln + - ins_ct_ph + - ins_ct_phx + - ins_ctry + - ins_ea + - ins_fax + - ins_faxx + - ins_memo + - ins_ph1 + - ins_ph1x + - ins_ph2 + - ins_ph2x + - ins_st + - ins_title + - ins_zip + - insd_addr1 + - insd_addr2 + - insd_city + - insd_co_nm + - insd_ctry + - insd_ea + - insd_fax + - insd_faxx + - insd_fn + - insd_ln + - insd_ph1 + - insd_ph1x + - insd_ph2 + - insd_ph2x + - insd_st + - insd_title + - insd_zip + - intakechecklist + - invoice_date + - job_totals + - kmin + - kmout + - labor_rate_desc + - labor_rate_id + - local_tax_rate + - loss_cat + - loss_date + - loss_desc + - loss_type + - other_amount_payable + - owner_owing + - ownerid + - ownr_addr1 + - ownr_addr2 + - ownr_city + - ownr_co_nm + - ownr_ctry + - ownr_ea + - ownr_fax + - ownr_faxx + - ownr_fn + - ownr_ln + - ownr_ph1 + - ownr_ph1x + - ownr_ph2 + - ownr_ph2x + - ownr_st + - ownr_title + - ownr_zip + - parts_tax_rates + - pay_amt + - pay_chknm + - pay_date + - pay_type + - payee_nms + - plate_no + - plate_st + - po_number + - policy_no + - production_vars + - rate_atp + - rate_la1 + - rate_la2 + - rate_la3 + - rate_la4 + - rate_laa + - rate_lab + - rate_lad + - rate_lae + - rate_laf + - rate_lag + - rate_lam + - rate_lar + - rate_las + - rate_lau + - rate_ma2s + - rate_ma2t + - rate_ma3s + - rate_mabl + - rate_macs + - rate_mahw + - rate_mapa + - rate_mash + - rate_matd + - referral_source + - regie_number + - ro_number + - scheduled_completion + - scheduled_delivery + - scheduled_in + - selling_dealer + - selling_dealer_contact + - servicing_dealer + - servicing_dealer_contact + - shopid + - special_coverage_policy + - state_tax_rate + - status + - statusid + - storage_payable + - tax_lbr_rt + - tax_levies_rt + - tax_paint_mat_rt + - tax_predis + - tax_prethr + - tax_pstthr + - tax_str_rt + - tax_sub_rt + - tax_thramt + - tax_tow_rt + - theft_ind + - tlos_ind + - towing_payable + - unit_number + - updated_at + - v_color + - v_make_desc + - v_model_desc + - v_model_yr + - v_vin + - vehicleid + computed_fields: [] + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: jobs + schema: public + type: create_select_permission diff --git a/hasura/migrations/1590010125521_update_permission_user_public_table_jobs/up.yaml b/hasura/migrations/1590010125521_update_permission_user_public_table_jobs/up.yaml new file mode 100644 index 000000000..4e4e0f870 --- /dev/null +++ b/hasura/migrations/1590010125521_update_permission_user_public_table_jobs/up.yaml @@ -0,0 +1,255 @@ +- args: + role: user + table: + name: jobs + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: true + columns: + - actual_completion + - actual_delivery + - actual_in + - adj_g_disc + - adj_strdis + - adj_towdis + - adjustment_bottom_line + - agt_addr1 + - agt_addr2 + - agt_city + - agt_co_id + - agt_co_nm + - agt_ct_fn + - agt_ct_ln + - agt_ct_ph + - agt_ct_phx + - agt_ctry + - agt_ea + - agt_fax + - agt_faxx + - agt_lic_no + - agt_ph1 + - agt_ph1x + - agt_ph2 + - agt_ph2x + - agt_st + - agt_zip + - area_of_damage + - asgn_date + - asgn_no + - asgn_type + - cat_no + - cieca_stl + - cieca_ttl + - ciecaid + - clm_addr1 + - clm_addr2 + - clm_city + - clm_ct_fn + - clm_ct_ln + - clm_ct_ph + - clm_ct_phx + - clm_ctry + - clm_ea + - clm_fax + - clm_faxx + - clm_no + - clm_ofc_id + - clm_ofc_nm + - clm_ph1 + - clm_ph1x + - clm_ph2 + - clm_ph2x + - clm_st + - clm_title + - clm_total + - clm_zip + - converted + - created_at + - csr + - cust_pr + - date_closed + - date_estimated + - date_exported + - date_invoiced + - date_open + - date_scheduled + - ded_amt + - ded_status + - depreciation_taxes + - est_addr1 + - est_addr2 + - est_city + - est_co_nm + - est_ct_fn + - est_ct_ln + - est_ctry + - est_ea + - est_number + - est_ph1 + - est_st + - est_zip + - federal_tax_payable + - federal_tax_rate + - g_bett_amt + - id + - inproduction + - ins_addr1 + - ins_addr2 + - ins_city + - ins_co_id + - ins_co_nm + - ins_ct_fn + - ins_ct_ln + - ins_ct_ph + - ins_ct_phx + - ins_ctry + - ins_ea + - ins_fax + - ins_faxx + - ins_memo + - ins_ph1 + - ins_ph1x + - ins_ph2 + - ins_ph2x + - ins_st + - ins_title + - ins_zip + - insd_addr1 + - insd_addr2 + - insd_city + - insd_co_nm + - insd_ctry + - insd_ea + - insd_fax + - insd_faxx + - insd_fn + - insd_ln + - insd_ph1 + - insd_ph1x + - insd_ph2 + - insd_ph2x + - insd_st + - insd_title + - insd_zip + - intakechecklist + - invoice_allocation + - invoice_date + - job_totals + - kmin + - kmout + - labor_rate_desc + - labor_rate_id + - local_tax_rate + - loss_cat + - loss_date + - loss_desc + - loss_type + - other_amount_payable + - owner_owing + - ownerid + - ownr_addr1 + - ownr_addr2 + - ownr_city + - ownr_co_nm + - ownr_ctry + - ownr_ea + - ownr_fax + - ownr_faxx + - ownr_fn + - ownr_ln + - ownr_ph1 + - ownr_ph1x + - ownr_ph2 + - ownr_ph2x + - ownr_st + - ownr_title + - ownr_zip + - parts_tax_rates + - pay_amt + - pay_chknm + - pay_date + - pay_type + - payee_nms + - plate_no + - plate_st + - po_number + - policy_no + - production_vars + - rate_atp + - rate_la1 + - rate_la2 + - rate_la3 + - rate_la4 + - rate_laa + - rate_lab + - rate_lad + - rate_lae + - rate_laf + - rate_lag + - rate_lam + - rate_lar + - rate_las + - rate_lau + - rate_ma2s + - rate_ma2t + - rate_ma3s + - rate_mabl + - rate_macs + - rate_mahw + - rate_mapa + - rate_mash + - rate_matd + - referral_source + - regie_number + - ro_number + - scheduled_completion + - scheduled_delivery + - scheduled_in + - selling_dealer + - selling_dealer_contact + - servicing_dealer + - servicing_dealer_contact + - shopid + - special_coverage_policy + - state_tax_rate + - status + - statusid + - storage_payable + - tax_lbr_rt + - tax_levies_rt + - tax_paint_mat_rt + - tax_predis + - tax_prethr + - tax_pstthr + - tax_str_rt + - tax_sub_rt + - tax_thramt + - tax_tow_rt + - theft_ind + - tlos_ind + - towing_payable + - unit_number + - updated_at + - v_color + - v_make_desc + - v_model_desc + - v_model_yr + - v_vin + - vehicleid + computed_fields: [] + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: jobs + schema: public + type: create_select_permission diff --git a/hasura/migrations/1590010134425_update_permission_user_public_table_jobs/down.yaml b/hasura/migrations/1590010134425_update_permission_user_public_table_jobs/down.yaml new file mode 100644 index 000000000..2cc028154 --- /dev/null +++ b/hasura/migrations/1590010134425_update_permission_user_public_table_jobs/down.yaml @@ -0,0 +1,256 @@ +- args: + role: user + table: + name: jobs + schema: public + type: drop_update_permission +- args: + permission: + columns: + - actual_completion + - actual_delivery + - actual_in + - adj_g_disc + - adj_strdis + - adj_towdis + - adjustment_bottom_line + - agt_addr1 + - agt_addr2 + - agt_city + - agt_co_id + - agt_co_nm + - agt_ct_fn + - agt_ct_ln + - agt_ct_ph + - agt_ct_phx + - agt_ctry + - agt_ea + - agt_fax + - agt_faxx + - agt_lic_no + - agt_ph1 + - agt_ph1x + - agt_ph2 + - agt_ph2x + - agt_st + - agt_zip + - area_of_damage + - asgn_date + - asgn_no + - asgn_type + - cat_no + - cieca_stl + - cieca_ttl + - ciecaid + - clm_addr1 + - clm_addr2 + - clm_city + - clm_ct_fn + - clm_ct_ln + - clm_ct_ph + - clm_ct_phx + - clm_ctry + - clm_ea + - clm_fax + - clm_faxx + - clm_no + - clm_ofc_id + - clm_ofc_nm + - clm_ph1 + - clm_ph1x + - clm_ph2 + - clm_ph2x + - clm_st + - clm_title + - clm_total + - clm_zip + - converted + - created_at + - csr + - cust_pr + - date_closed + - date_estimated + - date_exported + - date_invoiced + - date_open + - date_scheduled + - ded_amt + - ded_status + - depreciation_taxes + - est_addr1 + - est_addr2 + - est_city + - est_co_nm + - est_ct_fn + - est_ct_ln + - est_ctry + - est_ea + - est_number + - est_ph1 + - est_st + - est_zip + - federal_tax_payable + - federal_tax_rate + - g_bett_amt + - id + - inproduction + - ins_addr1 + - ins_addr2 + - ins_city + - ins_co_id + - ins_co_nm + - ins_ct_fn + - ins_ct_ln + - ins_ct_ph + - ins_ct_phx + - ins_ctry + - ins_ea + - ins_fax + - ins_faxx + - ins_memo + - ins_ph1 + - ins_ph1x + - ins_ph2 + - ins_ph2x + - ins_st + - ins_title + - ins_zip + - insd_addr1 + - insd_addr2 + - insd_city + - insd_co_nm + - insd_ctry + - insd_ea + - insd_fax + - insd_faxx + - insd_fn + - insd_ln + - insd_ph1 + - insd_ph1x + - insd_ph2 + - insd_ph2x + - insd_st + - insd_title + - insd_zip + - intakechecklist + - invoice_date + - job_totals + - kmin + - kmout + - labor_rate_desc + - labor_rate_id + - local_tax_rate + - loss_cat + - loss_date + - loss_desc + - loss_type + - other_amount_payable + - owner_owing + - ownerid + - ownr_addr1 + - ownr_addr2 + - ownr_city + - ownr_co_nm + - ownr_ctry + - ownr_ea + - ownr_fax + - ownr_faxx + - ownr_fn + - ownr_ln + - ownr_ph1 + - ownr_ph1x + - ownr_ph2 + - ownr_ph2x + - ownr_st + - ownr_title + - ownr_zip + - parts_tax_rates + - pay_amt + - pay_chknm + - pay_date + - pay_type + - payee_nms + - plate_no + - plate_st + - po_number + - policy_no + - production_vars + - rate_atp + - rate_la1 + - rate_la2 + - rate_la3 + - rate_la4 + - rate_laa + - rate_lab + - rate_lad + - rate_lae + - rate_laf + - rate_lag + - rate_lam + - rate_lar + - rate_las + - rate_lau + - rate_ma2s + - rate_ma2t + - rate_ma3s + - rate_mabl + - rate_macs + - rate_mahw + - rate_mapa + - rate_mash + - rate_matd + - referral_source + - regie_number + - ro_number + - scheduled_completion + - scheduled_delivery + - scheduled_in + - selling_dealer + - selling_dealer_contact + - servicing_dealer + - servicing_dealer_contact + - shopid + - special_coverage_policy + - state_tax_rate + - status + - statusid + - storage_payable + - tax_lbr_rt + - tax_levies_rt + - tax_paint_mat_rt + - tax_predis + - tax_prethr + - tax_pstthr + - tax_str_rt + - tax_sub_rt + - tax_thramt + - tax_tow_rt + - theft_ind + - tlos_ind + - towing_payable + - unit_number + - updated_at + - v_color + - v_make_desc + - v_model_desc + - v_model_yr + - v_vin + - vehicleid + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: jobs + schema: public + type: create_update_permission diff --git a/hasura/migrations/1590010134425_update_permission_user_public_table_jobs/up.yaml b/hasura/migrations/1590010134425_update_permission_user_public_table_jobs/up.yaml new file mode 100644 index 000000000..b15051c7a --- /dev/null +++ b/hasura/migrations/1590010134425_update_permission_user_public_table_jobs/up.yaml @@ -0,0 +1,257 @@ +- args: + role: user + table: + name: jobs + schema: public + type: drop_update_permission +- args: + permission: + columns: + - actual_completion + - actual_delivery + - actual_in + - adj_g_disc + - adj_strdis + - adj_towdis + - adjustment_bottom_line + - agt_addr1 + - agt_addr2 + - agt_city + - agt_co_id + - agt_co_nm + - agt_ct_fn + - agt_ct_ln + - agt_ct_ph + - agt_ct_phx + - agt_ctry + - agt_ea + - agt_fax + - agt_faxx + - agt_lic_no + - agt_ph1 + - agt_ph1x + - agt_ph2 + - agt_ph2x + - agt_st + - agt_zip + - area_of_damage + - asgn_date + - asgn_no + - asgn_type + - cat_no + - cieca_stl + - cieca_ttl + - ciecaid + - clm_addr1 + - clm_addr2 + - clm_city + - clm_ct_fn + - clm_ct_ln + - clm_ct_ph + - clm_ct_phx + - clm_ctry + - clm_ea + - clm_fax + - clm_faxx + - clm_no + - clm_ofc_id + - clm_ofc_nm + - clm_ph1 + - clm_ph1x + - clm_ph2 + - clm_ph2x + - clm_st + - clm_title + - clm_total + - clm_zip + - converted + - created_at + - csr + - cust_pr + - date_closed + - date_estimated + - date_exported + - date_invoiced + - date_open + - date_scheduled + - ded_amt + - ded_status + - depreciation_taxes + - est_addr1 + - est_addr2 + - est_city + - est_co_nm + - est_ct_fn + - est_ct_ln + - est_ctry + - est_ea + - est_number + - est_ph1 + - est_st + - est_zip + - federal_tax_payable + - federal_tax_rate + - g_bett_amt + - id + - inproduction + - ins_addr1 + - ins_addr2 + - ins_city + - ins_co_id + - ins_co_nm + - ins_ct_fn + - ins_ct_ln + - ins_ct_ph + - ins_ct_phx + - ins_ctry + - ins_ea + - ins_fax + - ins_faxx + - ins_memo + - ins_ph1 + - ins_ph1x + - ins_ph2 + - ins_ph2x + - ins_st + - ins_title + - ins_zip + - insd_addr1 + - insd_addr2 + - insd_city + - insd_co_nm + - insd_ctry + - insd_ea + - insd_fax + - insd_faxx + - insd_fn + - insd_ln + - insd_ph1 + - insd_ph1x + - insd_ph2 + - insd_ph2x + - insd_st + - insd_title + - insd_zip + - intakechecklist + - invoice_allocation + - invoice_date + - job_totals + - kmin + - kmout + - labor_rate_desc + - labor_rate_id + - local_tax_rate + - loss_cat + - loss_date + - loss_desc + - loss_type + - other_amount_payable + - owner_owing + - ownerid + - ownr_addr1 + - ownr_addr2 + - ownr_city + - ownr_co_nm + - ownr_ctry + - ownr_ea + - ownr_fax + - ownr_faxx + - ownr_fn + - ownr_ln + - ownr_ph1 + - ownr_ph1x + - ownr_ph2 + - ownr_ph2x + - ownr_st + - ownr_title + - ownr_zip + - parts_tax_rates + - pay_amt + - pay_chknm + - pay_date + - pay_type + - payee_nms + - plate_no + - plate_st + - po_number + - policy_no + - production_vars + - rate_atp + - rate_la1 + - rate_la2 + - rate_la3 + - rate_la4 + - rate_laa + - rate_lab + - rate_lad + - rate_lae + - rate_laf + - rate_lag + - rate_lam + - rate_lar + - rate_las + - rate_lau + - rate_ma2s + - rate_ma2t + - rate_ma3s + - rate_mabl + - rate_macs + - rate_mahw + - rate_mapa + - rate_mash + - rate_matd + - referral_source + - regie_number + - ro_number + - scheduled_completion + - scheduled_delivery + - scheduled_in + - selling_dealer + - selling_dealer_contact + - servicing_dealer + - servicing_dealer_contact + - shopid + - special_coverage_policy + - state_tax_rate + - status + - statusid + - storage_payable + - tax_lbr_rt + - tax_levies_rt + - tax_paint_mat_rt + - tax_predis + - tax_prethr + - tax_pstthr + - tax_str_rt + - tax_sub_rt + - tax_thramt + - tax_tow_rt + - theft_ind + - tlos_ind + - towing_payable + - unit_number + - updated_at + - v_color + - v_make_desc + - v_model_desc + - v_model_yr + - v_vin + - vehicleid + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: jobs + schema: public + type: create_update_permission diff --git a/hasura/migrations/1590169457641_create_table_public_csiinvites/down.yaml b/hasura/migrations/1590169457641_create_table_public_csiinvites/down.yaml new file mode 100644 index 000000000..1bc1a8a07 --- /dev/null +++ b/hasura/migrations/1590169457641_create_table_public_csiinvites/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: DROP TABLE "public"."csiinvites"; + type: run_sql diff --git a/hasura/migrations/1590169457641_create_table_public_csiinvites/up.yaml b/hasura/migrations/1590169457641_create_table_public_csiinvites/up.yaml new file mode 100644 index 000000000..336e8372a --- /dev/null +++ b/hasura/migrations/1590169457641_create_table_public_csiinvites/up.yaml @@ -0,0 +1,27 @@ +- args: + cascade: false + read_only: false + sql: CREATE EXTENSION IF NOT EXISTS pgcrypto; + type: run_sql +- args: + cascade: false + read_only: false + sql: "CREATE TABLE \"public\".\"csiinvites\"(\"id\" uuid NOT NULL DEFAULT gen_random_uuid(), + \"created_at\" timestamptz NOT NULL DEFAULT now(), \"updated_at\" timestamptz + NOT NULL DEFAULT now(), \"jobid\" uuid NOT NULL, \"valid\" boolean NOT NULL + DEFAULT true, \"relateddata\" jsonb, \"bodyshopid\" uuid NOT NULL, \"validuntil\" + date, PRIMARY KEY (\"id\") , FOREIGN KEY (\"jobid\") REFERENCES \"public\".\"jobs\"(\"id\") + ON UPDATE restrict ON DELETE restrict, FOREIGN KEY (\"bodyshopid\") REFERENCES + \"public\".\"bodyshops\"(\"id\") ON UPDATE restrict ON DELETE restrict);\nCREATE + OR REPLACE FUNCTION \"public\".\"set_current_timestamp_updated_at\"()\nRETURNS + TRIGGER AS $$\nDECLARE\n _new record;\nBEGIN\n _new := NEW;\n _new.\"updated_at\" + = NOW();\n RETURN _new;\nEND;\n$$ LANGUAGE plpgsql;\nCREATE TRIGGER \"set_public_csiinvites_updated_at\"\nBEFORE + UPDATE ON \"public\".\"csiinvites\"\nFOR EACH ROW\nEXECUTE PROCEDURE \"public\".\"set_current_timestamp_updated_at\"();\nCOMMENT + ON TRIGGER \"set_public_csiinvites_updated_at\" ON \"public\".\"csiinvites\" + \nIS 'trigger to set value of column \"updated_at\" to current timestamp on + row update';" + type: run_sql +- args: + name: csiinvites + schema: public + type: add_existing_table_or_view diff --git a/hasura/migrations/1590169486927_track_all_relationships/down.yaml b/hasura/migrations/1590169486927_track_all_relationships/down.yaml new file mode 100644 index 000000000..97efcee36 --- /dev/null +++ b/hasura/migrations/1590169486927_track_all_relationships/down.yaml @@ -0,0 +1,24 @@ +- args: + relationship: csiinvites + table: + name: bodyshops + schema: public + type: drop_relationship +- args: + relationship: bodyshop + table: + name: csiinvites + schema: public + type: drop_relationship +- args: + relationship: job + table: + name: csiinvites + schema: public + type: drop_relationship +- args: + relationship: csiinvites + table: + name: jobs + schema: public + type: drop_relationship diff --git a/hasura/migrations/1590169486927_track_all_relationships/up.yaml b/hasura/migrations/1590169486927_track_all_relationships/up.yaml new file mode 100644 index 000000000..4273ffc16 --- /dev/null +++ b/hasura/migrations/1590169486927_track_all_relationships/up.yaml @@ -0,0 +1,40 @@ +- args: + name: csiinvites + table: + name: bodyshops + schema: public + using: + foreign_key_constraint_on: + column: bodyshopid + table: + name: csiinvites + schema: public + type: create_array_relationship +- args: + name: bodyshop + table: + name: csiinvites + schema: public + using: + foreign_key_constraint_on: bodyshopid + type: create_object_relationship +- args: + name: job + table: + name: csiinvites + schema: public + using: + foreign_key_constraint_on: jobid + type: create_object_relationship +- args: + name: csiinvites + table: + name: jobs + schema: public + using: + foreign_key_constraint_on: + column: jobid + table: + name: csiinvites + schema: public + type: create_array_relationship diff --git a/hasura/migrations/1590169552540_update_permission_user_public_table_csiinvites/down.yaml b/hasura/migrations/1590169552540_update_permission_user_public_table_csiinvites/down.yaml new file mode 100644 index 000000000..a36e524a6 --- /dev/null +++ b/hasura/migrations/1590169552540_update_permission_user_public_table_csiinvites/down.yaml @@ -0,0 +1,6 @@ +- args: + role: user + table: + name: csiinvites + schema: public + type: drop_insert_permission diff --git a/hasura/migrations/1590169552540_update_permission_user_public_table_csiinvites/up.yaml b/hasura/migrations/1590169552540_update_permission_user_public_table_csiinvites/up.yaml new file mode 100644 index 000000000..713d020e1 --- /dev/null +++ b/hasura/migrations/1590169552540_update_permission_user_public_table_csiinvites/up.yaml @@ -0,0 +1,30 @@ +- args: + permission: + allow_upsert: true + check: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - id + - created_at + - updated_at + - jobid + - valid + - relateddata + - bodyshopid + - validuntil + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: csiinvites + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1590169569261_update_permission_user_public_table_csiinvites/down.yaml b/hasura/migrations/1590169569261_update_permission_user_public_table_csiinvites/down.yaml new file mode 100644 index 000000000..80d0cc5a0 --- /dev/null +++ b/hasura/migrations/1590169569261_update_permission_user_public_table_csiinvites/down.yaml @@ -0,0 +1,6 @@ +- args: + role: user + table: + name: csiinvites + schema: public + type: drop_select_permission diff --git a/hasura/migrations/1590169569261_update_permission_user_public_table_csiinvites/up.yaml b/hasura/migrations/1590169569261_update_permission_user_public_table_csiinvites/up.yaml new file mode 100644 index 000000000..7d4ad8c62 --- /dev/null +++ b/hasura/migrations/1590169569261_update_permission_user_public_table_csiinvites/up.yaml @@ -0,0 +1,28 @@ +- args: + permission: + allow_aggregations: false + columns: + - valid + - validuntil + - relateddata + - created_at + - updated_at + - bodyshopid + - id + - jobid + computed_fields: [] + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + limit: null + role: user + table: + name: csiinvites + schema: public + type: create_select_permission diff --git a/hasura/migrations/1590169577215_update_permission_user_public_table_csiinvites/down.yaml b/hasura/migrations/1590169577215_update_permission_user_public_table_csiinvites/down.yaml new file mode 100644 index 000000000..dbdaaf979 --- /dev/null +++ b/hasura/migrations/1590169577215_update_permission_user_public_table_csiinvites/down.yaml @@ -0,0 +1,6 @@ +- args: + role: user + table: + name: csiinvites + schema: public + type: drop_update_permission diff --git a/hasura/migrations/1590169577215_update_permission_user_public_table_csiinvites/up.yaml b/hasura/migrations/1590169577215_update_permission_user_public_table_csiinvites/up.yaml new file mode 100644 index 000000000..b64e64027 --- /dev/null +++ b/hasura/migrations/1590169577215_update_permission_user_public_table_csiinvites/up.yaml @@ -0,0 +1,29 @@ +- args: + permission: + columns: + - valid + - validuntil + - relateddata + - created_at + - updated_at + - bodyshopid + - id + - jobid + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: csiinvites + schema: public + type: create_update_permission diff --git a/hasura/migrations/1590169605126_update_permission_anonymous_public_table_csiinvites/down.yaml b/hasura/migrations/1590169605126_update_permission_anonymous_public_table_csiinvites/down.yaml new file mode 100644 index 000000000..242aad1e8 --- /dev/null +++ b/hasura/migrations/1590169605126_update_permission_anonymous_public_table_csiinvites/down.yaml @@ -0,0 +1,6 @@ +- args: + role: anonymous + table: + name: csiinvites + schema: public + type: drop_select_permission diff --git a/hasura/migrations/1590169605126_update_permission_anonymous_public_table_csiinvites/up.yaml b/hasura/migrations/1590169605126_update_permission_anonymous_public_table_csiinvites/up.yaml new file mode 100644 index 000000000..e7d622616 --- /dev/null +++ b/hasura/migrations/1590169605126_update_permission_anonymous_public_table_csiinvites/up.yaml @@ -0,0 +1,16 @@ +- args: + permission: + allow_aggregations: false + columns: + - id + - relateddata + - valid + - validuntil + computed_fields: [] + filter: {} + limit: 1 + role: anonymous + table: + name: csiinvites + schema: public + type: create_select_permission diff --git a/hasura/migrations/1590169665926_rename_table_public_csiinvites/down.yaml b/hasura/migrations/1590169665926_rename_table_public_csiinvites/down.yaml new file mode 100644 index 000000000..c6240a91c --- /dev/null +++ b/hasura/migrations/1590169665926_rename_table_public_csiinvites/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: alter table "public"."csi" rename to "csiinvites"; + type: run_sql diff --git a/hasura/migrations/1590169665926_rename_table_public_csiinvites/up.yaml b/hasura/migrations/1590169665926_rename_table_public_csiinvites/up.yaml new file mode 100644 index 000000000..82cfb93ab --- /dev/null +++ b/hasura/migrations/1590169665926_rename_table_public_csiinvites/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: alter table "public"."csiinvites" rename to "csi"; + type: run_sql diff --git a/hasura/migrations/1590169695935_alter_table_public_csi_add_column_response/down.yaml b/hasura/migrations/1590169695935_alter_table_public_csi_add_column_response/down.yaml new file mode 100644 index 000000000..da698f126 --- /dev/null +++ b/hasura/migrations/1590169695935_alter_table_public_csi_add_column_response/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."csi" DROP COLUMN "response"; + type: run_sql diff --git a/hasura/migrations/1590169695935_alter_table_public_csi_add_column_response/up.yaml b/hasura/migrations/1590169695935_alter_table_public_csi_add_column_response/up.yaml new file mode 100644 index 000000000..d2d83d131 --- /dev/null +++ b/hasura/migrations/1590169695935_alter_table_public_csi_add_column_response/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."csi" ADD COLUMN "response" jsonb NULL; + type: run_sql diff --git a/hasura/migrations/1590169707794_update_permission_user_public_table_csi/down.yaml b/hasura/migrations/1590169707794_update_permission_user_public_table_csi/down.yaml new file mode 100644 index 000000000..ae2d88377 --- /dev/null +++ b/hasura/migrations/1590169707794_update_permission_user_public_table_csi/down.yaml @@ -0,0 +1,35 @@ +- args: + role: user + table: + name: csi + schema: public + type: drop_insert_permission +- args: + permission: + check: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - id + - created_at + - updated_at + - jobid + - valid + - relateddata + - bodyshopid + - validuntil + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: csi + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1590169707794_update_permission_user_public_table_csi/up.yaml b/hasura/migrations/1590169707794_update_permission_user_public_table_csi/up.yaml new file mode 100644 index 000000000..ddd5a4897 --- /dev/null +++ b/hasura/migrations/1590169707794_update_permission_user_public_table_csi/up.yaml @@ -0,0 +1,36 @@ +- args: + role: user + table: + name: csi + schema: public + type: drop_insert_permission +- args: + permission: + check: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - bodyshopid + - created_at + - id + - jobid + - relateddata + - response + - updated_at + - valid + - validuntil + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: csi + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1590169716647_update_permission_user_public_table_csi/down.yaml b/hasura/migrations/1590169716647_update_permission_user_public_table_csi/down.yaml new file mode 100644 index 000000000..a608394fd --- /dev/null +++ b/hasura/migrations/1590169716647_update_permission_user_public_table_csi/down.yaml @@ -0,0 +1,33 @@ +- args: + role: user + table: + name: csi + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - valid + - validuntil + - relateddata + - created_at + - updated_at + - bodyshopid + - id + - jobid + computed_fields: [] + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: csi + schema: public + type: create_select_permission diff --git a/hasura/migrations/1590169716647_update_permission_user_public_table_csi/up.yaml b/hasura/migrations/1590169716647_update_permission_user_public_table_csi/up.yaml new file mode 100644 index 000000000..ee974fbb7 --- /dev/null +++ b/hasura/migrations/1590169716647_update_permission_user_public_table_csi/up.yaml @@ -0,0 +1,34 @@ +- args: + role: user + table: + name: csi + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - bodyshopid + - created_at + - id + - jobid + - relateddata + - response + - updated_at + - valid + - validuntil + computed_fields: [] + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: csi + schema: public + type: create_select_permission diff --git a/hasura/migrations/1590169723269_update_permission_user_public_table_csi/down.yaml b/hasura/migrations/1590169723269_update_permission_user_public_table_csi/down.yaml new file mode 100644 index 000000000..ddd5a4897 --- /dev/null +++ b/hasura/migrations/1590169723269_update_permission_user_public_table_csi/down.yaml @@ -0,0 +1,36 @@ +- args: + role: user + table: + name: csi + schema: public + type: drop_insert_permission +- args: + permission: + check: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - bodyshopid + - created_at + - id + - jobid + - relateddata + - response + - updated_at + - valid + - validuntil + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: csi + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1590169723269_update_permission_user_public_table_csi/up.yaml b/hasura/migrations/1590169723269_update_permission_user_public_table_csi/up.yaml new file mode 100644 index 000000000..78940bde7 --- /dev/null +++ b/hasura/migrations/1590169723269_update_permission_user_public_table_csi/up.yaml @@ -0,0 +1,35 @@ +- args: + role: user + table: + name: csi + schema: public + type: drop_insert_permission +- args: + permission: + check: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - bodyshopid + - created_at + - id + - jobid + - relateddata + - updated_at + - valid + - validuntil + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: csi + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1590169758310_update_permission_anonymous_public_table_csi/down.yaml b/hasura/migrations/1590169758310_update_permission_anonymous_public_table_csi/down.yaml new file mode 100644 index 000000000..b6dceb83a --- /dev/null +++ b/hasura/migrations/1590169758310_update_permission_anonymous_public_table_csi/down.yaml @@ -0,0 +1,22 @@ +- args: + role: anonymous + table: + name: csi + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - id + - relateddata + - valid + - validuntil + computed_fields: [] + filter: {} + limit: 1 + role: anonymous + table: + name: csi + schema: public + type: create_select_permission diff --git a/hasura/migrations/1590169758310_update_permission_anonymous_public_table_csi/up.yaml b/hasura/migrations/1590169758310_update_permission_anonymous_public_table_csi/up.yaml new file mode 100644 index 000000000..00cf0cd18 --- /dev/null +++ b/hasura/migrations/1590169758310_update_permission_anonymous_public_table_csi/up.yaml @@ -0,0 +1,24 @@ +- args: + role: anonymous + table: + name: csi + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - id + - relateddata + - valid + - validuntil + computed_fields: [] + filter: + valid: + _eq: true + limit: 1 + role: anonymous + table: + name: csi + schema: public + type: create_select_permission diff --git a/hasura/migrations/1590169798330_update_permission_anonymous_public_table_csi/down.yaml b/hasura/migrations/1590169798330_update_permission_anonymous_public_table_csi/down.yaml new file mode 100644 index 000000000..01176a258 --- /dev/null +++ b/hasura/migrations/1590169798330_update_permission_anonymous_public_table_csi/down.yaml @@ -0,0 +1,6 @@ +- args: + role: anonymous + table: + name: csi + schema: public + type: drop_update_permission diff --git a/hasura/migrations/1590169798330_update_permission_anonymous_public_table_csi/up.yaml b/hasura/migrations/1590169798330_update_permission_anonymous_public_table_csi/up.yaml new file mode 100644 index 000000000..48005bc50 --- /dev/null +++ b/hasura/migrations/1590169798330_update_permission_anonymous_public_table_csi/up.yaml @@ -0,0 +1,17 @@ +- args: + permission: + columns: + - response + - updated_at + filter: + valid: + _eq: true + localPresets: + - key: "" + value: "" + set: {} + role: anonymous + table: + name: csi + schema: public + type: create_update_permission diff --git a/hasura/migrations/1590169811190_update_permission_anonymous_public_table_csi/down.yaml b/hasura/migrations/1590169811190_update_permission_anonymous_public_table_csi/down.yaml new file mode 100644 index 000000000..e452fbfbd --- /dev/null +++ b/hasura/migrations/1590169811190_update_permission_anonymous_public_table_csi/down.yaml @@ -0,0 +1,23 @@ +- args: + role: anonymous + table: + name: csi + schema: public + type: drop_update_permission +- args: + permission: + columns: + - response + - updated_at + filter: + valid: + _eq: true + localPresets: + - key: "" + value: "" + set: {} + role: anonymous + table: + name: csi + schema: public + type: create_update_permission diff --git a/hasura/migrations/1590169811190_update_permission_anonymous_public_table_csi/up.yaml b/hasura/migrations/1590169811190_update_permission_anonymous_public_table_csi/up.yaml new file mode 100644 index 000000000..bae48de62 --- /dev/null +++ b/hasura/migrations/1590169811190_update_permission_anonymous_public_table_csi/up.yaml @@ -0,0 +1,22 @@ +- args: + role: anonymous + table: + name: csi + schema: public + type: drop_update_permission +- args: + permission: + columns: + - response + filter: + valid: + _eq: true + localPresets: + - key: "" + value: "" + set: {} + role: anonymous + table: + name: csi + schema: public + type: create_update_permission diff --git a/hasura/migrations/1590172385133_create_table_public_csiquestion/down.yaml b/hasura/migrations/1590172385133_create_table_public_csiquestion/down.yaml new file mode 100644 index 000000000..8c94fd534 --- /dev/null +++ b/hasura/migrations/1590172385133_create_table_public_csiquestion/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: DROP TABLE "public"."csiquestion"; + type: run_sql diff --git a/hasura/migrations/1590172385133_create_table_public_csiquestion/up.yaml b/hasura/migrations/1590172385133_create_table_public_csiquestion/up.yaml new file mode 100644 index 000000000..cb34a6c6d --- /dev/null +++ b/hasura/migrations/1590172385133_create_table_public_csiquestion/up.yaml @@ -0,0 +1,25 @@ +- args: + cascade: false + read_only: false + sql: CREATE EXTENSION IF NOT EXISTS pgcrypto; + type: run_sql +- args: + cascade: false + read_only: false + sql: "CREATE TABLE \"public\".\"csiquestion\"(\"id\" uuid NOT NULL DEFAULT gen_random_uuid(), + \"created_at\" timestamptz NOT NULL DEFAULT now(), \"updated_at\" timestamptz + NOT NULL DEFAULT now(), \"bodyshopid\" uuid NOT NULL, \"current\" boolean NOT + NULL DEFAULT true, \"config\" jsonb, PRIMARY KEY (\"id\") , FOREIGN KEY (\"bodyshopid\") + REFERENCES \"public\".\"bodyshops\"(\"id\") ON UPDATE restrict ON DELETE restrict);\nCREATE + OR REPLACE FUNCTION \"public\".\"set_current_timestamp_updated_at\"()\nRETURNS + TRIGGER AS $$\nDECLARE\n _new record;\nBEGIN\n _new := NEW;\n _new.\"updated_at\" + = NOW();\n RETURN _new;\nEND;\n$$ LANGUAGE plpgsql;\nCREATE TRIGGER \"set_public_csiquestion_updated_at\"\nBEFORE + UPDATE ON \"public\".\"csiquestion\"\nFOR EACH ROW\nEXECUTE PROCEDURE \"public\".\"set_current_timestamp_updated_at\"();\nCOMMENT + ON TRIGGER \"set_public_csiquestion_updated_at\" ON \"public\".\"csiquestion\" + \nIS 'trigger to set value of column \"updated_at\" to current timestamp on + row update';" + type: run_sql +- args: + name: csiquestion + schema: public + type: add_existing_table_or_view diff --git a/hasura/migrations/1590172409241_alter_table_public_csi_add_column_questionset/down.yaml b/hasura/migrations/1590172409241_alter_table_public_csi_add_column_questionset/down.yaml new file mode 100644 index 000000000..a9b42b626 --- /dev/null +++ b/hasura/migrations/1590172409241_alter_table_public_csi_add_column_questionset/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."csi" DROP COLUMN "questionset"; + type: run_sql diff --git a/hasura/migrations/1590172409241_alter_table_public_csi_add_column_questionset/up.yaml b/hasura/migrations/1590172409241_alter_table_public_csi_add_column_questionset/up.yaml new file mode 100644 index 000000000..620690374 --- /dev/null +++ b/hasura/migrations/1590172409241_alter_table_public_csi_add_column_questionset/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."csi" ADD COLUMN "questionset" uuid NULL; + type: run_sql diff --git a/hasura/migrations/1590172429767_rename_table_public_csiquestion/down.yaml b/hasura/migrations/1590172429767_rename_table_public_csiquestion/down.yaml new file mode 100644 index 000000000..6112e4cdb --- /dev/null +++ b/hasura/migrations/1590172429767_rename_table_public_csiquestion/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: alter table "public"."csiquestions" rename to "csiquestion"; + type: run_sql diff --git a/hasura/migrations/1590172429767_rename_table_public_csiquestion/up.yaml b/hasura/migrations/1590172429767_rename_table_public_csiquestion/up.yaml new file mode 100644 index 000000000..fe2b8144e --- /dev/null +++ b/hasura/migrations/1590172429767_rename_table_public_csiquestion/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: alter table "public"."csiquestion" rename to "csiquestions"; + type: run_sql diff --git a/hasura/migrations/1590172446694_set_fk_public_csi_questionset/down.yaml b/hasura/migrations/1590172446694_set_fk_public_csi_questionset/down.yaml new file mode 100644 index 000000000..df44ccc4b --- /dev/null +++ b/hasura/migrations/1590172446694_set_fk_public_csi_questionset/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: alter table "public"."csi" drop constraint "csi_questionset_fkey"; + type: run_sql diff --git a/hasura/migrations/1590172446694_set_fk_public_csi_questionset/up.yaml b/hasura/migrations/1590172446694_set_fk_public_csi_questionset/up.yaml new file mode 100644 index 000000000..c50b62508 --- /dev/null +++ b/hasura/migrations/1590172446694_set_fk_public_csi_questionset/up.yaml @@ -0,0 +1,10 @@ +- args: + cascade: false + read_only: false + sql: |- + alter table "public"."csi" + add constraint "csi_questionset_fkey" + foreign key ("questionset") + references "public"."csiquestions" + ("id") on update restrict on delete restrict; + type: run_sql diff --git a/hasura/migrations/1590172453385_track_all_relationships/down.yaml b/hasura/migrations/1590172453385_track_all_relationships/down.yaml new file mode 100644 index 000000000..cf2f4100a --- /dev/null +++ b/hasura/migrations/1590172453385_track_all_relationships/down.yaml @@ -0,0 +1,24 @@ +- args: + relationship: csiquestions + table: + name: bodyshops + schema: public + type: drop_relationship +- args: + relationship: csiquestion + table: + name: csi + schema: public + type: drop_relationship +- args: + relationship: bodyshop + table: + name: csiquestions + schema: public + type: drop_relationship +- args: + relationship: csis + table: + name: csiquestions + schema: public + type: drop_relationship diff --git a/hasura/migrations/1590172453385_track_all_relationships/up.yaml b/hasura/migrations/1590172453385_track_all_relationships/up.yaml new file mode 100644 index 000000000..3a3ec4cee --- /dev/null +++ b/hasura/migrations/1590172453385_track_all_relationships/up.yaml @@ -0,0 +1,40 @@ +- args: + name: csiquestions + table: + name: bodyshops + schema: public + using: + foreign_key_constraint_on: + column: bodyshopid + table: + name: csiquestions + schema: public + type: create_array_relationship +- args: + name: csiquestion + table: + name: csi + schema: public + using: + foreign_key_constraint_on: questionset + type: create_object_relationship +- args: + name: bodyshop + table: + name: csiquestions + schema: public + using: + foreign_key_constraint_on: bodyshopid + type: create_object_relationship +- args: + name: csis + table: + name: csiquestions + schema: public + using: + foreign_key_constraint_on: + column: questionset + table: + name: csi + schema: public + type: create_array_relationship diff --git a/hasura/migrations/1590172555010_update_permission_anonymous_public_table_csiquestions/down.yaml b/hasura/migrations/1590172555010_update_permission_anonymous_public_table_csiquestions/down.yaml new file mode 100644 index 000000000..7f0a4b721 --- /dev/null +++ b/hasura/migrations/1590172555010_update_permission_anonymous_public_table_csiquestions/down.yaml @@ -0,0 +1,6 @@ +- args: + role: anonymous + table: + name: csiquestions + schema: public + type: drop_select_permission diff --git a/hasura/migrations/1590172555010_update_permission_anonymous_public_table_csiquestions/up.yaml b/hasura/migrations/1590172555010_update_permission_anonymous_public_table_csiquestions/up.yaml new file mode 100644 index 000000000..1140601b0 --- /dev/null +++ b/hasura/migrations/1590172555010_update_permission_anonymous_public_table_csiquestions/up.yaml @@ -0,0 +1,14 @@ +- args: + permission: + allow_aggregations: false + columns: + - config + - id + computed_fields: [] + filter: {} + limit: 1 + role: anonymous + table: + name: csiquestions + schema: public + type: create_select_permission diff --git a/hasura/migrations/1590172596611_update_permission_user_public_table_csiquestions/down.yaml b/hasura/migrations/1590172596611_update_permission_user_public_table_csiquestions/down.yaml new file mode 100644 index 000000000..6f9a069f8 --- /dev/null +++ b/hasura/migrations/1590172596611_update_permission_user_public_table_csiquestions/down.yaml @@ -0,0 +1,6 @@ +- args: + role: user + table: + name: csiquestions + schema: public + type: drop_insert_permission diff --git a/hasura/migrations/1590172596611_update_permission_user_public_table_csiquestions/up.yaml b/hasura/migrations/1590172596611_update_permission_user_public_table_csiquestions/up.yaml new file mode 100644 index 000000000..4ea47f1f5 --- /dev/null +++ b/hasura/migrations/1590172596611_update_permission_user_public_table_csiquestions/up.yaml @@ -0,0 +1,28 @@ +- args: + permission: + allow_upsert: true + check: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - current + - config + - created_at + - updated_at + - bodyshopid + - id + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: csiquestions + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1590172610009_update_permission_user_public_table_csiquestions/down.yaml b/hasura/migrations/1590172610009_update_permission_user_public_table_csiquestions/down.yaml new file mode 100644 index 000000000..a4e6f5707 --- /dev/null +++ b/hasura/migrations/1590172610009_update_permission_user_public_table_csiquestions/down.yaml @@ -0,0 +1,6 @@ +- args: + role: user + table: + name: csiquestions + schema: public + type: drop_select_permission diff --git a/hasura/migrations/1590172610009_update_permission_user_public_table_csiquestions/up.yaml b/hasura/migrations/1590172610009_update_permission_user_public_table_csiquestions/up.yaml new file mode 100644 index 000000000..1a4308a33 --- /dev/null +++ b/hasura/migrations/1590172610009_update_permission_user_public_table_csiquestions/up.yaml @@ -0,0 +1,26 @@ +- args: + permission: + allow_aggregations: false + columns: + - current + - config + - created_at + - updated_at + - bodyshopid + - id + computed_fields: [] + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + limit: null + role: user + table: + name: csiquestions + schema: public + type: create_select_permission diff --git a/hasura/migrations/1590172617955_update_permission_user_public_table_csiquestions/down.yaml b/hasura/migrations/1590172617955_update_permission_user_public_table_csiquestions/down.yaml new file mode 100644 index 000000000..c3d5fdecf --- /dev/null +++ b/hasura/migrations/1590172617955_update_permission_user_public_table_csiquestions/down.yaml @@ -0,0 +1,6 @@ +- args: + role: user + table: + name: csiquestions + schema: public + type: drop_update_permission diff --git a/hasura/migrations/1590172617955_update_permission_user_public_table_csiquestions/up.yaml b/hasura/migrations/1590172617955_update_permission_user_public_table_csiquestions/up.yaml new file mode 100644 index 000000000..a5f959d90 --- /dev/null +++ b/hasura/migrations/1590172617955_update_permission_user_public_table_csiquestions/up.yaml @@ -0,0 +1,22 @@ +- args: + permission: + columns: + - current + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: csiquestions + schema: public + type: create_update_permission diff --git a/hasura/migrations/1590184694200_alter_table_public_csi_add_column_completed/down.yaml b/hasura/migrations/1590184694200_alter_table_public_csi_add_column_completed/down.yaml new file mode 100644 index 000000000..ba51b40ae --- /dev/null +++ b/hasura/migrations/1590184694200_alter_table_public_csi_add_column_completed/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."csi" DROP COLUMN "completed"; + type: run_sql diff --git a/hasura/migrations/1590184694200_alter_table_public_csi_add_column_completed/up.yaml b/hasura/migrations/1590184694200_alter_table_public_csi_add_column_completed/up.yaml new file mode 100644 index 000000000..98289ecd3 --- /dev/null +++ b/hasura/migrations/1590184694200_alter_table_public_csi_add_column_completed/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."csi" ADD COLUMN "completed" timestamptz NULL; + type: run_sql diff --git a/hasura/migrations/1590184702149_alter_table_public_csi_alter_column_completed/down.yaml b/hasura/migrations/1590184702149_alter_table_public_csi_alter_column_completed/down.yaml new file mode 100644 index 000000000..6b99c635c --- /dev/null +++ b/hasura/migrations/1590184702149_alter_table_public_csi_alter_column_completed/down.yaml @@ -0,0 +1,11 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."csi" ALTER COLUMN "completed" TYPE timestamp with time + zone; + type: run_sql +- args: + cascade: false + read_only: false + sql: alter table "public"."csi" rename column "completedon" to "completed"; + type: run_sql diff --git a/hasura/migrations/1590184702149_alter_table_public_csi_alter_column_completed/up.yaml b/hasura/migrations/1590184702149_alter_table_public_csi_alter_column_completed/up.yaml new file mode 100644 index 000000000..b9953727f --- /dev/null +++ b/hasura/migrations/1590184702149_alter_table_public_csi_alter_column_completed/up.yaml @@ -0,0 +1,10 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."csi" ALTER COLUMN "completed" TYPE timestamptz; + type: run_sql +- args: + cascade: false + read_only: false + sql: alter table "public"."csi" rename column "completed" to "completedon"; + type: run_sql diff --git a/hasura/migrations/1590184719915_update_permission_user_public_table_csi/down.yaml b/hasura/migrations/1590184719915_update_permission_user_public_table_csi/down.yaml new file mode 100644 index 000000000..ee974fbb7 --- /dev/null +++ b/hasura/migrations/1590184719915_update_permission_user_public_table_csi/down.yaml @@ -0,0 +1,34 @@ +- args: + role: user + table: + name: csi + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - bodyshopid + - created_at + - id + - jobid + - relateddata + - response + - updated_at + - valid + - validuntil + computed_fields: [] + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: csi + schema: public + type: create_select_permission diff --git a/hasura/migrations/1590184719915_update_permission_user_public_table_csi/up.yaml b/hasura/migrations/1590184719915_update_permission_user_public_table_csi/up.yaml new file mode 100644 index 000000000..a45ce22ba --- /dev/null +++ b/hasura/migrations/1590184719915_update_permission_user_public_table_csi/up.yaml @@ -0,0 +1,36 @@ +- args: + role: user + table: + name: csi + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - bodyshopid + - completedon + - created_at + - id + - jobid + - questionset + - relateddata + - response + - updated_at + - valid + - validuntil + computed_fields: [] + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: csi + schema: public + type: create_select_permission diff --git a/hasura/migrations/1590184732654_update_permission_anonymous_public_table_csi/down.yaml b/hasura/migrations/1590184732654_update_permission_anonymous_public_table_csi/down.yaml new file mode 100644 index 000000000..bae48de62 --- /dev/null +++ b/hasura/migrations/1590184732654_update_permission_anonymous_public_table_csi/down.yaml @@ -0,0 +1,22 @@ +- args: + role: anonymous + table: + name: csi + schema: public + type: drop_update_permission +- args: + permission: + columns: + - response + filter: + valid: + _eq: true + localPresets: + - key: "" + value: "" + set: {} + role: anonymous + table: + name: csi + schema: public + type: create_update_permission diff --git a/hasura/migrations/1590184732654_update_permission_anonymous_public_table_csi/up.yaml b/hasura/migrations/1590184732654_update_permission_anonymous_public_table_csi/up.yaml new file mode 100644 index 000000000..f12bda76e --- /dev/null +++ b/hasura/migrations/1590184732654_update_permission_anonymous_public_table_csi/up.yaml @@ -0,0 +1,24 @@ +- args: + role: anonymous + table: + name: csi + schema: public + type: drop_update_permission +- args: + permission: + columns: + - completedon + - response + - valid + filter: + valid: + _eq: true + localPresets: + - key: "" + value: "" + set: {} + role: anonymous + table: + name: csi + schema: public + type: create_update_permission diff --git a/hasura/migrations/1590698750370_alter_table_public_owners_add_column_accountingid/down.yaml b/hasura/migrations/1590698750370_alter_table_public_owners_add_column_accountingid/down.yaml new file mode 100644 index 000000000..92c2567cf --- /dev/null +++ b/hasura/migrations/1590698750370_alter_table_public_owners_add_column_accountingid/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."owners" DROP COLUMN "accountingid"; + type: run_sql diff --git a/hasura/migrations/1590698750370_alter_table_public_owners_add_column_accountingid/up.yaml b/hasura/migrations/1590698750370_alter_table_public_owners_add_column_accountingid/up.yaml new file mode 100644 index 000000000..7d129d044 --- /dev/null +++ b/hasura/migrations/1590698750370_alter_table_public_owners_add_column_accountingid/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."owners" ADD COLUMN "accountingid" text NULL; + type: run_sql diff --git a/hasura/migrations/1590698778968_update_permission_user_public_table_owners/down.yaml b/hasura/migrations/1590698778968_update_permission_user_public_table_owners/down.yaml new file mode 100644 index 000000000..21addc58a --- /dev/null +++ b/hasura/migrations/1590698778968_update_permission_user_public_table_owners/down.yaml @@ -0,0 +1,46 @@ +- args: + role: user + table: + name: owners + schema: public + type: drop_insert_permission +- args: + permission: + check: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - id + - created_at + - updated_at + - ownr_fn + - ownr_ln + - ownr_addr1 + - ownr_addr2 + - ownr_city + - ownr_st + - ownr_zip + - ownr_ctry + - ownr_ea + - ownr_ph1 + - preferred_contact + - allow_text_message + - shopid + - ownr_ph2 + - ownr_co_nm + - ownr_title + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: owners + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1590698778968_update_permission_user_public_table_owners/up.yaml b/hasura/migrations/1590698778968_update_permission_user_public_table_owners/up.yaml new file mode 100644 index 000000000..60a6a7f0a --- /dev/null +++ b/hasura/migrations/1590698778968_update_permission_user_public_table_owners/up.yaml @@ -0,0 +1,47 @@ +- args: + role: user + table: + name: owners + schema: public + type: drop_insert_permission +- args: + permission: + check: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - accountingid + - allow_text_message + - created_at + - id + - ownr_addr1 + - ownr_addr2 + - ownr_city + - ownr_co_nm + - ownr_ctry + - ownr_ea + - ownr_fn + - ownr_ln + - ownr_ph1 + - ownr_ph2 + - ownr_st + - ownr_title + - ownr_zip + - preferred_contact + - shopid + - updated_at + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: owners + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1590698784975_update_permission_user_public_table_owners/down.yaml b/hasura/migrations/1590698784975_update_permission_user_public_table_owners/down.yaml new file mode 100644 index 000000000..85ab7c994 --- /dev/null +++ b/hasura/migrations/1590698784975_update_permission_user_public_table_owners/down.yaml @@ -0,0 +1,44 @@ +- args: + role: user + table: + name: owners + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - allow_text_message + - ownr_addr1 + - ownr_addr2 + - ownr_city + - ownr_co_nm + - ownr_ctry + - ownr_ea + - ownr_fn + - ownr_ln + - ownr_ph1 + - ownr_ph2 + - ownr_st + - ownr_title + - ownr_zip + - preferred_contact + - created_at + - updated_at + - id + - shopid + computed_fields: [] + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: owners + schema: public + type: create_select_permission diff --git a/hasura/migrations/1590698784975_update_permission_user_public_table_owners/up.yaml b/hasura/migrations/1590698784975_update_permission_user_public_table_owners/up.yaml new file mode 100644 index 000000000..fea901502 --- /dev/null +++ b/hasura/migrations/1590698784975_update_permission_user_public_table_owners/up.yaml @@ -0,0 +1,45 @@ +- args: + role: user + table: + name: owners + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - accountingid + - allow_text_message + - created_at + - id + - ownr_addr1 + - ownr_addr2 + - ownr_city + - ownr_co_nm + - ownr_ctry + - ownr_ea + - ownr_fn + - ownr_ln + - ownr_ph1 + - ownr_ph2 + - ownr_st + - ownr_title + - ownr_zip + - preferred_contact + - shopid + - updated_at + computed_fields: [] + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: owners + schema: public + type: create_select_permission diff --git a/hasura/migrations/1590698791753_update_permission_user_public_table_owners/down.yaml b/hasura/migrations/1590698791753_update_permission_user_public_table_owners/down.yaml new file mode 100644 index 000000000..9609517ec --- /dev/null +++ b/hasura/migrations/1590698791753_update_permission_user_public_table_owners/down.yaml @@ -0,0 +1,46 @@ +- args: + role: user + table: + name: owners + schema: public + type: drop_update_permission +- args: + permission: + columns: + - allow_text_message + - ownr_addr1 + - ownr_addr2 + - ownr_city + - ownr_co_nm + - ownr_ctry + - ownr_ea + - ownr_fn + - ownr_ln + - ownr_ph1 + - ownr_ph2 + - ownr_st + - ownr_title + - ownr_zip + - preferred_contact + - created_at + - updated_at + - id + - shopid + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: owners + schema: public + type: create_update_permission diff --git a/hasura/migrations/1590698791753_update_permission_user_public_table_owners/up.yaml b/hasura/migrations/1590698791753_update_permission_user_public_table_owners/up.yaml new file mode 100644 index 000000000..ed9944e65 --- /dev/null +++ b/hasura/migrations/1590698791753_update_permission_user_public_table_owners/up.yaml @@ -0,0 +1,47 @@ +- args: + role: user + table: + name: owners + schema: public + type: drop_update_permission +- args: + permission: + columns: + - accountingid + - allow_text_message + - created_at + - id + - ownr_addr1 + - ownr_addr2 + - ownr_city + - ownr_co_nm + - ownr_ctry + - ownr_ea + - ownr_fn + - ownr_ln + - ownr_ph1 + - ownr_ph2 + - ownr_st + - ownr_title + - ownr_zip + - preferred_contact + - shopid + - updated_at + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: owners + schema: public + type: create_update_permission diff --git a/hasura/migrations/1590765528126_run_sql_migration/down.yaml b/hasura/migrations/1590765528126_run_sql_migration/down.yaml new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/hasura/migrations/1590765528126_run_sql_migration/down.yaml @@ -0,0 +1 @@ +[] diff --git a/hasura/migrations/1590765528126_run_sql_migration/up.yaml b/hasura/migrations/1590765528126_run_sql_migration/up.yaml new file mode 100644 index 000000000..8929a2bce --- /dev/null +++ b/hasura/migrations/1590765528126_run_sql_migration/up.yaml @@ -0,0 +1,8 @@ +- args: + cascade: true + read_only: false + sql: "CREATE INDEX idx_job_search ON jobs USING GIN ((ownr_fn || ' ' || ownr_ln + || ' ' || ownr_co_nm\r\n|| ' ' || ro_number \r\n|| ' ' || est_number \r\n|| + ' ' || clm_no \r\n|| ' ' || ownr_ph1 \r\n|| ' ' || ownr_ea \r\n|| ' ' || plate_no + )\r\n gin_trgm_ops);" + type: run_sql diff --git a/hasura/migrations/1590765808875_run_sql_migration/down.yaml b/hasura/migrations/1590765808875_run_sql_migration/down.yaml new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/hasura/migrations/1590765808875_run_sql_migration/down.yaml @@ -0,0 +1 @@ +[] diff --git a/hasura/migrations/1590765808875_run_sql_migration/up.yaml b/hasura/migrations/1590765808875_run_sql_migration/up.yaml new file mode 100644 index 000000000..10e83981e --- /dev/null +++ b/hasura/migrations/1590765808875_run_sql_migration/up.yaml @@ -0,0 +1,12 @@ +- args: + cascade: true + read_only: false + sql: "CREATE\r\nOR REPLACE FUNCTION public.search_jobs(search text) RETURNS SETOF + jobs LANGUAGE sql STABLE AS $function$\r\nSELECT\r\n *\r\nFROM\r\n jobs\r\nWHERE\r\n + \ search <% (ownr_fn || ' ' || ownr_ln || ' ' || ownr_co_nm\r\n|| ' ' || ro_number + \r\n|| ' ' || est_number \r\n|| ' ' || clm_no \r\n|| ' ' || ownr_ph1 \r\n|| + ' ' || ownr_ea \r\n|| ' ' || plate_no)\r\nORDER BY\r\n similarity(\r\n search,\r\n + \ (ownr_fn || ' ' || ownr_ln || ' ' || ownr_co_nm\r\n|| ' ' || ro_number + \r\n|| ' ' || est_number \r\n|| ' ' || clm_no \r\n|| ' ' || ownr_ph1 \r\n|| + ' ' || ownr_ea \r\n|| ' ' || plate_no)\r\n ) DESC\r\n$function$;" + type: run_sql diff --git a/hasura/migrations/1590766570195_run_sql_migration/down.yaml b/hasura/migrations/1590766570195_run_sql_migration/down.yaml new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/hasura/migrations/1590766570195_run_sql_migration/down.yaml @@ -0,0 +1 @@ +[] diff --git a/hasura/migrations/1590766570195_run_sql_migration/up.yaml b/hasura/migrations/1590766570195_run_sql_migration/up.yaml new file mode 100644 index 000000000..d4bc49864 --- /dev/null +++ b/hasura/migrations/1590766570195_run_sql_migration/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: true + read_only: false + sql: drop index idx_job_search; + type: run_sql diff --git a/hasura/migrations/1590766913775_run_sql_migration/down.yaml b/hasura/migrations/1590766913775_run_sql_migration/down.yaml new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/hasura/migrations/1590766913775_run_sql_migration/down.yaml @@ -0,0 +1 @@ +[] diff --git a/hasura/migrations/1590766913775_run_sql_migration/up.yaml b/hasura/migrations/1590766913775_run_sql_migration/up.yaml new file mode 100644 index 000000000..cb3cc4253 --- /dev/null +++ b/hasura/migrations/1590766913775_run_sql_migration/up.yaml @@ -0,0 +1,12 @@ +- args: + cascade: true + read_only: false + sql: "CREATE INDEX idx_jobs_ownrfn ON jobs\r\nUSING GIN (ownr_fn gin_trgm_ops);\r\n\r\nCREATE + INDEX idx_jobs_ownrln ON jobs\r\nUSING GIN (ownr_ln gin_trgm_ops);\r\n\r\nCREATE + INDEX idx_jobs_estnumber ON jobs\r\nUSING GIN (cast (est_number as text) gin_trgm_ops);\r\n\r\nCREATE + INDEX idx_jobs_ronumber ON jobs\r\nUSING GIN (ro_number gin_trgm_ops);\r\n\r\nCREATE + INDEX idx_jobs_clmno ON jobs\r\nUSING GIN (clm_no gin_trgm_ops);\r\n\r\nCREATE + INDEX idx_jobs_plateno ON jobs\r\nUSING GIN (plate_no gin_trgm_ops);\r\n\r\nCREATE + INDEX idx_jobs_vmakedesc ON jobs\r\nUSING GIN (v_make_desc gin_trgm_ops);\r\n\r\nCREATE + INDEX idx_jobs_vmodeldesc ON jobs\r\nUSING GIN (v_model_desc gin_trgm_ops);" + type: run_sql diff --git a/hasura/migrations/1590767016519_run_sql_migration/down.yaml b/hasura/migrations/1590767016519_run_sql_migration/down.yaml new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/hasura/migrations/1590767016519_run_sql_migration/down.yaml @@ -0,0 +1 @@ +[] diff --git a/hasura/migrations/1590767016519_run_sql_migration/up.yaml b/hasura/migrations/1590767016519_run_sql_migration/up.yaml new file mode 100644 index 000000000..d51c130c6 --- /dev/null +++ b/hasura/migrations/1590767016519_run_sql_migration/up.yaml @@ -0,0 +1,10 @@ +- args: + cascade: true + read_only: false + sql: "CREATE OR REPLACE FUNCTION public.search_jobs(search text)\r\n RETURNS SETOF + jobs\r\n LANGUAGE sql\r\n STABLE\r\nAS $function$\r\nSELECT\r\n *\r\nFROM\r\n + \ jobs\r\nWHERE\r\n search <% (ownr_fn) OR\r\n search <% (ownr_ln) OR\r\n + \ search <% (cast(est_number as text)) OR\r\n search <% (ro_number) OR\r\n + \ search <% (clm_no) OR\r\n search <% (plate_no) OR\r\n search <% (v_make_desc) + OR\r\n search <% (v_model_desc) \r\n\r\n$function$;" + type: run_sql diff --git a/hasura/migrations/1590768879487_run_sql_migration/down.yaml b/hasura/migrations/1590768879487_run_sql_migration/down.yaml new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/hasura/migrations/1590768879487_run_sql_migration/down.yaml @@ -0,0 +1 @@ +[] diff --git a/hasura/migrations/1590768879487_run_sql_migration/up.yaml b/hasura/migrations/1590768879487_run_sql_migration/up.yaml new file mode 100644 index 000000000..b65680f48 --- /dev/null +++ b/hasura/migrations/1590768879487_run_sql_migration/up.yaml @@ -0,0 +1,11 @@ +- args: + cascade: true + read_only: false + sql: "CREATE OR REPLACE FUNCTION public.search_jobs(search text)\r\n RETURNS SETOF + jobs\r\n LANGUAGE plpgsql\r\n STABLE\r\nAS $function$\r\n\r\nBEGIN\r\n if search + = '' then\r\n return query select * from jobs j ;\r\n else \r\n return + query SELECT\r\n *\r\nFROM\r\n jobs\r\nWHERE\r\n search <% (ownr_fn) OR\r\n + \ search <% (ownr_ln) OR\r\n search <% (cast(est_number as text)) OR\r\n search + <% (ro_number) OR\r\n search <% (clm_no) OR\r\n search <% (plate_no) OR\r\n + \ search <% (v_make_desc) OR\r\n search <% (v_model_desc) ;\r\n end if;\r\n\r\n\tEND\r\n\r\n\r\n$function$;" + type: run_sql diff --git a/hasura/migrations/1590769637626_run_sql_migration/down.yaml b/hasura/migrations/1590769637626_run_sql_migration/down.yaml new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/hasura/migrations/1590769637626_run_sql_migration/down.yaml @@ -0,0 +1 @@ +[] diff --git a/hasura/migrations/1590769637626_run_sql_migration/up.yaml b/hasura/migrations/1590769637626_run_sql_migration/up.yaml new file mode 100644 index 000000000..a5db35a75 --- /dev/null +++ b/hasura/migrations/1590769637626_run_sql_migration/up.yaml @@ -0,0 +1,7 @@ +- args: + cascade: true + read_only: false + sql: "CREATE INDEX idx_owners_ownrfn ON owners\r\nUSING GIN (ownr_fn gin_trgm_ops);\r\n\r\nCREATE + INDEX idx_owners_ownrln ON owners\r\nUSING GIN (ownr_ln gin_trgm_ops);\r\n\r\nCREATE + INDEX idx_owners_estnumber ON owners\r\nUSING GIN (ownr_co_nm gin_trgm_ops);" + type: run_sql diff --git a/hasura/migrations/1590769674755_run_sql_migration/down.yaml b/hasura/migrations/1590769674755_run_sql_migration/down.yaml new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/hasura/migrations/1590769674755_run_sql_migration/down.yaml @@ -0,0 +1 @@ +[] diff --git a/hasura/migrations/1590769674755_run_sql_migration/up.yaml b/hasura/migrations/1590769674755_run_sql_migration/up.yaml new file mode 100644 index 000000000..044fe69ee --- /dev/null +++ b/hasura/migrations/1590769674755_run_sql_migration/up.yaml @@ -0,0 +1,9 @@ +- args: + cascade: true + read_only: false + sql: "CREATE OR REPLACE FUNCTION public.search_owner(search text)\r\n RETURNS + SETOF owners\r\n LANGUAGE plpgsql\r\n STABLE\r\nAS $function$\r\n\r\nBEGIN\r\n + \ if search = '' then\r\n return query select * from owners ;\r\n else \r\n + \ return query SELECT\r\n *\r\nFROM\r\n owners\r\nWHERE\r\n search <% (ownr_fn) + OR\r\n search <% (ownr_ln) OR\r\n search <% (ownr_co_nm) ;\r\n end if;\r\n\r\n\tEND\r\n$function$;" + type: run_sql diff --git a/hasura/migrations/1590772155750_update_permission_user_public_table_csi/down.yaml b/hasura/migrations/1590772155750_update_permission_user_public_table_csi/down.yaml new file mode 100644 index 000000000..78940bde7 --- /dev/null +++ b/hasura/migrations/1590772155750_update_permission_user_public_table_csi/down.yaml @@ -0,0 +1,35 @@ +- args: + role: user + table: + name: csi + schema: public + type: drop_insert_permission +- args: + permission: + check: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - bodyshopid + - created_at + - id + - jobid + - relateddata + - updated_at + - valid + - validuntil + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: csi + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1590772155750_update_permission_user_public_table_csi/up.yaml b/hasura/migrations/1590772155750_update_permission_user_public_table_csi/up.yaml new file mode 100644 index 000000000..a19f5219a --- /dev/null +++ b/hasura/migrations/1590772155750_update_permission_user_public_table_csi/up.yaml @@ -0,0 +1,36 @@ +- args: + role: user + table: + name: csi + schema: public + type: drop_insert_permission +- args: + permission: + check: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - bodyshopid + - created_at + - id + - jobid + - questionset + - relateddata + - updated_at + - valid + - validuntil + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: csi + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1590772289591_update_permission_user_public_table_csi/down.yaml b/hasura/migrations/1590772289591_update_permission_user_public_table_csi/down.yaml new file mode 100644 index 000000000..bc9bab34b --- /dev/null +++ b/hasura/migrations/1590772289591_update_permission_user_public_table_csi/down.yaml @@ -0,0 +1,35 @@ +- args: + role: user + table: + name: csi + schema: public + type: drop_update_permission +- args: + permission: + columns: + - valid + - validuntil + - relateddata + - created_at + - updated_at + - bodyshopid + - id + - jobid + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: csi + schema: public + type: create_update_permission diff --git a/hasura/migrations/1590772289591_update_permission_user_public_table_csi/up.yaml b/hasura/migrations/1590772289591_update_permission_user_public_table_csi/up.yaml new file mode 100644 index 000000000..7820d79cc --- /dev/null +++ b/hasura/migrations/1590772289591_update_permission_user_public_table_csi/up.yaml @@ -0,0 +1,36 @@ +- args: + role: user + table: + name: csi + schema: public + type: drop_update_permission +- args: + permission: + columns: + - bodyshopid + - completedon + - created_at + - id + - jobid + - relateddata + - updated_at + - valid + - validuntil + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: csi + schema: public + type: create_update_permission diff --git a/hasura/migrations/1590789133099_alter_table_public_bodyshops_add_column_accountingconfig/down.yaml b/hasura/migrations/1590789133099_alter_table_public_bodyshops_add_column_accountingconfig/down.yaml new file mode 100644 index 000000000..988d9aa47 --- /dev/null +++ b/hasura/migrations/1590789133099_alter_table_public_bodyshops_add_column_accountingconfig/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."bodyshops" DROP COLUMN "accountingconfig"; + type: run_sql diff --git a/hasura/migrations/1590789133099_alter_table_public_bodyshops_add_column_accountingconfig/up.yaml b/hasura/migrations/1590789133099_alter_table_public_bodyshops_add_column_accountingconfig/up.yaml new file mode 100644 index 000000000..52ad50ed2 --- /dev/null +++ b/hasura/migrations/1590789133099_alter_table_public_bodyshops_add_column_accountingconfig/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."bodyshops" ADD COLUMN "accountingconfig" jsonb NULL; + type: run_sql diff --git a/hasura/migrations/1590789150309_update_permission_user_public_table_bodyshops/down.yaml b/hasura/migrations/1590789150309_update_permission_user_public_table_bodyshops/down.yaml new file mode 100644 index 000000000..24fcc62ed --- /dev/null +++ b/hasura/migrations/1590789150309_update_permission_user_public_table_bodyshops/down.yaml @@ -0,0 +1,50 @@ +- args: + role: user + table: + name: bodyshops + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - address1 + - address2 + - city + - country + - created_at + - email + - federal_tax_id + - id + - inhousevendorid + - insurance_vendor_id + - intakechecklist + - invoice_tax_rates + - logo_img_path + - md_order_statuses + - md_responsibility_centers + - md_ro_statuses + - messagingservicesid + - production_config + - region_config + - shopname + - shoprates + - state + - state_tax_id + - template_header + - textid + - updated_at + - zip_post + computed_fields: [] + filter: + associations: + bodyshop: + associations: + user: + authid: + _eq: X-Hasura-User-Id + role: user + table: + name: bodyshops + schema: public + type: create_select_permission diff --git a/hasura/migrations/1590789150309_update_permission_user_public_table_bodyshops/up.yaml b/hasura/migrations/1590789150309_update_permission_user_public_table_bodyshops/up.yaml new file mode 100644 index 000000000..c7c8f849d --- /dev/null +++ b/hasura/migrations/1590789150309_update_permission_user_public_table_bodyshops/up.yaml @@ -0,0 +1,51 @@ +- args: + role: user + table: + name: bodyshops + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - accountingconfig + - address1 + - address2 + - city + - country + - created_at + - email + - federal_tax_id + - id + - inhousevendorid + - insurance_vendor_id + - intakechecklist + - invoice_tax_rates + - logo_img_path + - md_order_statuses + - md_responsibility_centers + - md_ro_statuses + - messagingservicesid + - production_config + - region_config + - shopname + - shoprates + - state + - state_tax_id + - template_header + - textid + - updated_at + - zip_post + computed_fields: [] + filter: + associations: + bodyshop: + associations: + user: + authid: + _eq: X-Hasura-User-Id + role: user + table: + name: bodyshops + schema: public + type: create_select_permission diff --git a/hasura/migrations/1590789163123_update_permission_user_public_table_bodyshops/down.yaml b/hasura/migrations/1590789163123_update_permission_user_public_table_bodyshops/down.yaml new file mode 100644 index 000000000..477056eb1 --- /dev/null +++ b/hasura/migrations/1590789163123_update_permission_user_public_table_bodyshops/down.yaml @@ -0,0 +1,48 @@ +- args: + role: user + table: + name: bodyshops + schema: public + type: drop_update_permission +- args: + permission: + columns: + - address1 + - address2 + - city + - country + - created_at + - email + - federal_tax_id + - id + - inhousevendorid + - insurance_vendor_id + - intakechecklist + - invoice_tax_rates + - logo_img_path + - md_order_statuses + - md_responsibility_centers + - md_ro_statuses + - production_config + - shopname + - shoprates + - state + - state_tax_id + - updated_at + - zip_post + filter: + associations: + bodyshop: + associations: + user: + authid: + _eq: X-Hasura-User-Id + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: bodyshops + schema: public + type: create_update_permission diff --git a/hasura/migrations/1590789163123_update_permission_user_public_table_bodyshops/up.yaml b/hasura/migrations/1590789163123_update_permission_user_public_table_bodyshops/up.yaml new file mode 100644 index 000000000..86c1ba881 --- /dev/null +++ b/hasura/migrations/1590789163123_update_permission_user_public_table_bodyshops/up.yaml @@ -0,0 +1,49 @@ +- args: + role: user + table: + name: bodyshops + schema: public + type: drop_update_permission +- args: + permission: + columns: + - accountingconfig + - address1 + - address2 + - city + - country + - created_at + - email + - federal_tax_id + - id + - inhousevendorid + - insurance_vendor_id + - intakechecklist + - invoice_tax_rates + - logo_img_path + - md_order_statuses + - md_responsibility_centers + - md_ro_statuses + - production_config + - shopname + - shoprates + - state + - state_tax_id + - updated_at + - zip_post + filter: + associations: + bodyshop: + associations: + user: + authid: + _eq: X-Hasura-User-Id + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: bodyshops + schema: public + type: create_update_permission diff --git a/hasura/migrations/1590790802468_run_sql_migration/down.yaml b/hasura/migrations/1590790802468_run_sql_migration/down.yaml new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/hasura/migrations/1590790802468_run_sql_migration/down.yaml @@ -0,0 +1 @@ +[] diff --git a/hasura/migrations/1590790802468_run_sql_migration/up.yaml b/hasura/migrations/1590790802468_run_sql_migration/up.yaml new file mode 100644 index 000000000..44e444fed --- /dev/null +++ b/hasura/migrations/1590790802468_run_sql_migration/up.yaml @@ -0,0 +1,7 @@ +- args: + cascade: true + read_only: false + sql: |- + alter table owners + drop column accountingid; + type: run_sql diff --git a/hasura/migrations/1590790827681_alter_table_public_owners_add_column_accountingid/down.yaml b/hasura/migrations/1590790827681_alter_table_public_owners_add_column_accountingid/down.yaml new file mode 100644 index 000000000..92c2567cf --- /dev/null +++ b/hasura/migrations/1590790827681_alter_table_public_owners_add_column_accountingid/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."owners" DROP COLUMN "accountingid"; + type: run_sql diff --git a/hasura/migrations/1590790827681_alter_table_public_owners_add_column_accountingid/up.yaml b/hasura/migrations/1590790827681_alter_table_public_owners_add_column_accountingid/up.yaml new file mode 100644 index 000000000..4e7f1d760 --- /dev/null +++ b/hasura/migrations/1590790827681_alter_table_public_owners_add_column_accountingid/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."owners" ADD COLUMN "accountingid" bigserial NOT NULL; + type: run_sql diff --git a/hasura/migrations/1590790851669_update_permission_user_public_table_owners/down.yaml b/hasura/migrations/1590790851669_update_permission_user_public_table_owners/down.yaml new file mode 100644 index 000000000..915b657e4 --- /dev/null +++ b/hasura/migrations/1590790851669_update_permission_user_public_table_owners/down.yaml @@ -0,0 +1,6 @@ +- args: + role: user + table: + name: owners + schema: public + type: drop_insert_permission diff --git a/hasura/migrations/1590790851669_update_permission_user_public_table_owners/up.yaml b/hasura/migrations/1590790851669_update_permission_user_public_table_owners/up.yaml new file mode 100644 index 000000000..ced04216b --- /dev/null +++ b/hasura/migrations/1590790851669_update_permission_user_public_table_owners/up.yaml @@ -0,0 +1,42 @@ +- args: + permission: + allow_upsert: true + check: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - id + - created_at + - updated_at + - ownr_fn + - ownr_ln + - ownr_addr1 + - ownr_addr2 + - ownr_city + - ownr_st + - ownr_zip + - ownr_ctry + - ownr_ea + - ownr_ph1 + - preferred_contact + - allow_text_message + - shopid + - ownr_ph2 + - ownr_co_nm + - ownr_title + - accountingid + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: owners + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1590790859209_update_permission_user_public_table_owners/down.yaml b/hasura/migrations/1590790859209_update_permission_user_public_table_owners/down.yaml new file mode 100644 index 000000000..9f10ffd44 --- /dev/null +++ b/hasura/migrations/1590790859209_update_permission_user_public_table_owners/down.yaml @@ -0,0 +1,6 @@ +- args: + role: user + table: + name: owners + schema: public + type: drop_select_permission diff --git a/hasura/migrations/1590790859209_update_permission_user_public_table_owners/up.yaml b/hasura/migrations/1590790859209_update_permission_user_public_table_owners/up.yaml new file mode 100644 index 000000000..7a2479c36 --- /dev/null +++ b/hasura/migrations/1590790859209_update_permission_user_public_table_owners/up.yaml @@ -0,0 +1,40 @@ +- args: + permission: + allow_aggregations: false + columns: + - allow_text_message + - accountingid + - ownr_addr1 + - ownr_addr2 + - ownr_city + - ownr_co_nm + - ownr_ctry + - ownr_ea + - ownr_fn + - ownr_ln + - ownr_ph1 + - ownr_ph2 + - ownr_st + - ownr_title + - ownr_zip + - preferred_contact + - created_at + - updated_at + - id + - shopid + computed_fields: [] + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + limit: null + role: user + table: + name: owners + schema: public + type: create_select_permission diff --git a/hasura/migrations/1590790873577_update_permission_user_public_table_owners/down.yaml b/hasura/migrations/1590790873577_update_permission_user_public_table_owners/down.yaml new file mode 100644 index 000000000..b94959d43 --- /dev/null +++ b/hasura/migrations/1590790873577_update_permission_user_public_table_owners/down.yaml @@ -0,0 +1,6 @@ +- args: + role: user + table: + name: owners + schema: public + type: drop_update_permission diff --git a/hasura/migrations/1590790873577_update_permission_user_public_table_owners/up.yaml b/hasura/migrations/1590790873577_update_permission_user_public_table_owners/up.yaml new file mode 100644 index 000000000..cb8f05bec --- /dev/null +++ b/hasura/migrations/1590790873577_update_permission_user_public_table_owners/up.yaml @@ -0,0 +1,41 @@ +- args: + permission: + columns: + - allow_text_message + - accountingid + - ownr_addr1 + - ownr_addr2 + - ownr_city + - ownr_co_nm + - ownr_ctry + - ownr_ea + - ownr_fn + - ownr_ln + - ownr_ph1 + - ownr_ph2 + - ownr_st + - ownr_title + - ownr_zip + - preferred_contact + - created_at + - updated_at + - id + - shopid + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: owners + schema: public + type: create_update_permission diff --git a/hasura/migrations/1591214568316_alter_table_public_bodyshops_add_column_appt_length/down.yaml b/hasura/migrations/1591214568316_alter_table_public_bodyshops_add_column_appt_length/down.yaml new file mode 100644 index 000000000..4f0ee9f3c --- /dev/null +++ b/hasura/migrations/1591214568316_alter_table_public_bodyshops_add_column_appt_length/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."bodyshops" DROP COLUMN "appt_length"; + type: run_sql diff --git a/hasura/migrations/1591214568316_alter_table_public_bodyshops_add_column_appt_length/up.yaml b/hasura/migrations/1591214568316_alter_table_public_bodyshops_add_column_appt_length/up.yaml new file mode 100644 index 000000000..4becf570d --- /dev/null +++ b/hasura/migrations/1591214568316_alter_table_public_bodyshops_add_column_appt_length/up.yaml @@ -0,0 +1,6 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."bodyshops" ADD COLUMN "appt_length" integer NOT NULL + DEFAULT 60; + type: run_sql diff --git a/hasura/migrations/1591214578485_update_permission_user_public_table_bodyshops/down.yaml b/hasura/migrations/1591214578485_update_permission_user_public_table_bodyshops/down.yaml new file mode 100644 index 000000000..c7c8f849d --- /dev/null +++ b/hasura/migrations/1591214578485_update_permission_user_public_table_bodyshops/down.yaml @@ -0,0 +1,51 @@ +- args: + role: user + table: + name: bodyshops + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - accountingconfig + - address1 + - address2 + - city + - country + - created_at + - email + - federal_tax_id + - id + - inhousevendorid + - insurance_vendor_id + - intakechecklist + - invoice_tax_rates + - logo_img_path + - md_order_statuses + - md_responsibility_centers + - md_ro_statuses + - messagingservicesid + - production_config + - region_config + - shopname + - shoprates + - state + - state_tax_id + - template_header + - textid + - updated_at + - zip_post + computed_fields: [] + filter: + associations: + bodyshop: + associations: + user: + authid: + _eq: X-Hasura-User-Id + role: user + table: + name: bodyshops + schema: public + type: create_select_permission diff --git a/hasura/migrations/1591214578485_update_permission_user_public_table_bodyshops/up.yaml b/hasura/migrations/1591214578485_update_permission_user_public_table_bodyshops/up.yaml new file mode 100644 index 000000000..26ce89aa9 --- /dev/null +++ b/hasura/migrations/1591214578485_update_permission_user_public_table_bodyshops/up.yaml @@ -0,0 +1,52 @@ +- args: + role: user + table: + name: bodyshops + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - accountingconfig + - address1 + - address2 + - appt_length + - city + - country + - created_at + - email + - federal_tax_id + - id + - inhousevendorid + - insurance_vendor_id + - intakechecklist + - invoice_tax_rates + - logo_img_path + - md_order_statuses + - md_responsibility_centers + - md_ro_statuses + - messagingservicesid + - production_config + - region_config + - shopname + - shoprates + - state + - state_tax_id + - template_header + - textid + - updated_at + - zip_post + computed_fields: [] + filter: + associations: + bodyshop: + associations: + user: + authid: + _eq: X-Hasura-User-Id + role: user + table: + name: bodyshops + schema: public + type: create_select_permission diff --git a/hasura/migrations/1591214587491_update_permission_user_public_table_bodyshops/down.yaml b/hasura/migrations/1591214587491_update_permission_user_public_table_bodyshops/down.yaml new file mode 100644 index 000000000..86c1ba881 --- /dev/null +++ b/hasura/migrations/1591214587491_update_permission_user_public_table_bodyshops/down.yaml @@ -0,0 +1,49 @@ +- args: + role: user + table: + name: bodyshops + schema: public + type: drop_update_permission +- args: + permission: + columns: + - accountingconfig + - address1 + - address2 + - city + - country + - created_at + - email + - federal_tax_id + - id + - inhousevendorid + - insurance_vendor_id + - intakechecklist + - invoice_tax_rates + - logo_img_path + - md_order_statuses + - md_responsibility_centers + - md_ro_statuses + - production_config + - shopname + - shoprates + - state + - state_tax_id + - updated_at + - zip_post + filter: + associations: + bodyshop: + associations: + user: + authid: + _eq: X-Hasura-User-Id + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: bodyshops + schema: public + type: create_update_permission diff --git a/hasura/migrations/1591214587491_update_permission_user_public_table_bodyshops/up.yaml b/hasura/migrations/1591214587491_update_permission_user_public_table_bodyshops/up.yaml new file mode 100644 index 000000000..9c3945d54 --- /dev/null +++ b/hasura/migrations/1591214587491_update_permission_user_public_table_bodyshops/up.yaml @@ -0,0 +1,50 @@ +- args: + role: user + table: + name: bodyshops + schema: public + type: drop_update_permission +- args: + permission: + columns: + - accountingconfig + - address1 + - address2 + - appt_length + - city + - country + - created_at + - email + - federal_tax_id + - id + - inhousevendorid + - insurance_vendor_id + - intakechecklist + - invoice_tax_rates + - logo_img_path + - md_order_statuses + - md_responsibility_centers + - md_ro_statuses + - production_config + - shopname + - shoprates + - state + - state_tax_id + - updated_at + - zip_post + filter: + associations: + bodyshop: + associations: + user: + authid: + _eq: X-Hasura-User-Id + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: bodyshops + schema: public + type: create_update_permission diff --git a/hasura/migrations/1591292925100_update_permission_user_public_table_csi/down.yaml b/hasura/migrations/1591292925100_update_permission_user_public_table_csi/down.yaml new file mode 100644 index 000000000..a45ce22ba --- /dev/null +++ b/hasura/migrations/1591292925100_update_permission_user_public_table_csi/down.yaml @@ -0,0 +1,36 @@ +- args: + role: user + table: + name: csi + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - bodyshopid + - completedon + - created_at + - id + - jobid + - questionset + - relateddata + - response + - updated_at + - valid + - validuntil + computed_fields: [] + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: csi + schema: public + type: create_select_permission diff --git a/hasura/migrations/1591292925100_update_permission_user_public_table_csi/up.yaml b/hasura/migrations/1591292925100_update_permission_user_public_table_csi/up.yaml new file mode 100644 index 000000000..a94a371de --- /dev/null +++ b/hasura/migrations/1591292925100_update_permission_user_public_table_csi/up.yaml @@ -0,0 +1,36 @@ +- args: + role: user + table: + name: csi + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: true + columns: + - bodyshopid + - completedon + - created_at + - id + - jobid + - questionset + - relateddata + - response + - updated_at + - valid + - validuntil + computed_fields: [] + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: csi + schema: public + type: create_select_permission diff --git a/hasura/migrations/1591303854947_create_table_public_payments/down.yaml b/hasura/migrations/1591303854947_create_table_public_payments/down.yaml new file mode 100644 index 000000000..b7ad7a0d6 --- /dev/null +++ b/hasura/migrations/1591303854947_create_table_public_payments/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: DROP TABLE "public"."payments"; + type: run_sql diff --git a/hasura/migrations/1591303854947_create_table_public_payments/up.yaml b/hasura/migrations/1591303854947_create_table_public_payments/up.yaml new file mode 100644 index 000000000..cc211749f --- /dev/null +++ b/hasura/migrations/1591303854947_create_table_public_payments/up.yaml @@ -0,0 +1,23 @@ +- args: + cascade: false + read_only: false + sql: CREATE EXTENSION IF NOT EXISTS pgcrypto; + type: run_sql +- args: + cascade: false + read_only: false + sql: "CREATE TABLE \"public\".\"payments\"(\"id\" uuid NOT NULL DEFAULT gen_random_uuid(), + \"created_at\" timestamptz NOT NULL DEFAULT now(), \"updated_at\" timestamptz + NOT NULL DEFAULT now(), \"jobid\" uuid NOT NULL, \"amount\" integer NOT NULL, + PRIMARY KEY (\"id\") , FOREIGN KEY (\"jobid\") REFERENCES \"public\".\"jobs\"(\"id\") + ON UPDATE restrict ON DELETE restrict);\nCREATE OR REPLACE FUNCTION \"public\".\"set_current_timestamp_updated_at\"()\nRETURNS + TRIGGER AS $$\nDECLARE\n _new record;\nBEGIN\n _new := NEW;\n _new.\"updated_at\" + = NOW();\n RETURN _new;\nEND;\n$$ LANGUAGE plpgsql;\nCREATE TRIGGER \"set_public_payments_updated_at\"\nBEFORE + UPDATE ON \"public\".\"payments\"\nFOR EACH ROW\nEXECUTE PROCEDURE \"public\".\"set_current_timestamp_updated_at\"();\nCOMMENT + ON TRIGGER \"set_public_payments_updated_at\" ON \"public\".\"payments\" \nIS + 'trigger to set value of column \"updated_at\" to current timestamp on row update';" + type: run_sql +- args: + name: payments + schema: public + type: add_existing_table_or_view diff --git a/hasura/migrations/1591303886596_track_all_relationships/down.yaml b/hasura/migrations/1591303886596_track_all_relationships/down.yaml new file mode 100644 index 000000000..4be842dba --- /dev/null +++ b/hasura/migrations/1591303886596_track_all_relationships/down.yaml @@ -0,0 +1,12 @@ +- args: + relationship: payments + table: + name: jobs + schema: public + type: drop_relationship +- args: + relationship: job + table: + name: payments + schema: public + type: drop_relationship diff --git a/hasura/migrations/1591303886596_track_all_relationships/up.yaml b/hasura/migrations/1591303886596_track_all_relationships/up.yaml new file mode 100644 index 000000000..dc94463eb --- /dev/null +++ b/hasura/migrations/1591303886596_track_all_relationships/up.yaml @@ -0,0 +1,20 @@ +- args: + name: payments + table: + name: jobs + schema: public + using: + foreign_key_constraint_on: + column: jobid + table: + name: payments + schema: public + type: create_array_relationship +- args: + name: job + table: + name: payments + schema: public + using: + foreign_key_constraint_on: jobid + type: create_object_relationship diff --git a/hasura/migrations/1591303935525_update_permission_user_public_table_payments/down.yaml b/hasura/migrations/1591303935525_update_permission_user_public_table_payments/down.yaml new file mode 100644 index 000000000..9830eb5ca --- /dev/null +++ b/hasura/migrations/1591303935525_update_permission_user_public_table_payments/down.yaml @@ -0,0 +1,6 @@ +- args: + role: user + table: + name: payments + schema: public + type: drop_insert_permission diff --git a/hasura/migrations/1591303935525_update_permission_user_public_table_payments/up.yaml b/hasura/migrations/1591303935525_update_permission_user_public_table_payments/up.yaml new file mode 100644 index 000000000..9d5cc8103 --- /dev/null +++ b/hasura/migrations/1591303935525_update_permission_user_public_table_payments/up.yaml @@ -0,0 +1,28 @@ +- args: + permission: + allow_upsert: true + check: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - id + - created_at + - updated_at + - jobid + - amount + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: payments + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1591303943431_update_permission_user_public_table_payments/down.yaml b/hasura/migrations/1591303943431_update_permission_user_public_table_payments/down.yaml new file mode 100644 index 000000000..5c9a79d99 --- /dev/null +++ b/hasura/migrations/1591303943431_update_permission_user_public_table_payments/down.yaml @@ -0,0 +1,6 @@ +- args: + role: user + table: + name: payments + schema: public + type: drop_select_permission diff --git a/hasura/migrations/1591303943431_update_permission_user_public_table_payments/up.yaml b/hasura/migrations/1591303943431_update_permission_user_public_table_payments/up.yaml new file mode 100644 index 000000000..7f855df65 --- /dev/null +++ b/hasura/migrations/1591303943431_update_permission_user_public_table_payments/up.yaml @@ -0,0 +1,26 @@ +- args: + permission: + allow_aggregations: false + columns: + - amount + - created_at + - updated_at + - id + - jobid + computed_fields: [] + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + limit: null + role: user + table: + name: payments + schema: public + type: create_select_permission diff --git a/hasura/migrations/1591303949732_update_permission_user_public_table_payments/down.yaml b/hasura/migrations/1591303949732_update_permission_user_public_table_payments/down.yaml new file mode 100644 index 000000000..631fe8779 --- /dev/null +++ b/hasura/migrations/1591303949732_update_permission_user_public_table_payments/down.yaml @@ -0,0 +1,6 @@ +- args: + role: user + table: + name: payments + schema: public + type: drop_update_permission diff --git a/hasura/migrations/1591303949732_update_permission_user_public_table_payments/up.yaml b/hasura/migrations/1591303949732_update_permission_user_public_table_payments/up.yaml new file mode 100644 index 000000000..714a8d9dd --- /dev/null +++ b/hasura/migrations/1591303949732_update_permission_user_public_table_payments/up.yaml @@ -0,0 +1,27 @@ +- args: + permission: + columns: + - amount + - created_at + - updated_at + - id + - jobid + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: payments + schema: public + type: create_update_permission diff --git a/hasura/migrations/1591303955052_update_permission_user_public_table_payments/down.yaml b/hasura/migrations/1591303955052_update_permission_user_public_table_payments/down.yaml new file mode 100644 index 000000000..7e121fe18 --- /dev/null +++ b/hasura/migrations/1591303955052_update_permission_user_public_table_payments/down.yaml @@ -0,0 +1,6 @@ +- args: + role: user + table: + name: payments + schema: public + type: drop_delete_permission diff --git a/hasura/migrations/1591303955052_update_permission_user_public_table_payments/up.yaml b/hasura/migrations/1591303955052_update_permission_user_public_table_payments/up.yaml new file mode 100644 index 000000000..26cab072d --- /dev/null +++ b/hasura/migrations/1591303955052_update_permission_user_public_table_payments/up.yaml @@ -0,0 +1,17 @@ +- args: + permission: + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: payments + schema: public + type: create_delete_permission diff --git a/hasura/migrations/1591310798527_alter_table_public_bodyshops_add_column_stripe_acct_id/down.yaml b/hasura/migrations/1591310798527_alter_table_public_bodyshops_add_column_stripe_acct_id/down.yaml new file mode 100644 index 000000000..214dc8bcb --- /dev/null +++ b/hasura/migrations/1591310798527_alter_table_public_bodyshops_add_column_stripe_acct_id/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."bodyshops" DROP COLUMN "stripe_acct_id"; + type: run_sql diff --git a/hasura/migrations/1591310798527_alter_table_public_bodyshops_add_column_stripe_acct_id/up.yaml b/hasura/migrations/1591310798527_alter_table_public_bodyshops_add_column_stripe_acct_id/up.yaml new file mode 100644 index 000000000..0d281d82f --- /dev/null +++ b/hasura/migrations/1591310798527_alter_table_public_bodyshops_add_column_stripe_acct_id/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."bodyshops" ADD COLUMN "stripe_acct_id" text NULL; + type: run_sql diff --git a/hasura/migrations/1591310807506_update_permission_user_public_table_bodyshops/down.yaml b/hasura/migrations/1591310807506_update_permission_user_public_table_bodyshops/down.yaml new file mode 100644 index 000000000..26ce89aa9 --- /dev/null +++ b/hasura/migrations/1591310807506_update_permission_user_public_table_bodyshops/down.yaml @@ -0,0 +1,52 @@ +- args: + role: user + table: + name: bodyshops + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - accountingconfig + - address1 + - address2 + - appt_length + - city + - country + - created_at + - email + - federal_tax_id + - id + - inhousevendorid + - insurance_vendor_id + - intakechecklist + - invoice_tax_rates + - logo_img_path + - md_order_statuses + - md_responsibility_centers + - md_ro_statuses + - messagingservicesid + - production_config + - region_config + - shopname + - shoprates + - state + - state_tax_id + - template_header + - textid + - updated_at + - zip_post + computed_fields: [] + filter: + associations: + bodyshop: + associations: + user: + authid: + _eq: X-Hasura-User-Id + role: user + table: + name: bodyshops + schema: public + type: create_select_permission diff --git a/hasura/migrations/1591310807506_update_permission_user_public_table_bodyshops/up.yaml b/hasura/migrations/1591310807506_update_permission_user_public_table_bodyshops/up.yaml new file mode 100644 index 000000000..a412d8d21 --- /dev/null +++ b/hasura/migrations/1591310807506_update_permission_user_public_table_bodyshops/up.yaml @@ -0,0 +1,53 @@ +- args: + role: user + table: + name: bodyshops + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - accountingconfig + - address1 + - address2 + - appt_length + - city + - country + - created_at + - email + - federal_tax_id + - id + - inhousevendorid + - insurance_vendor_id + - intakechecklist + - invoice_tax_rates + - logo_img_path + - md_order_statuses + - md_responsibility_centers + - md_ro_statuses + - messagingservicesid + - production_config + - region_config + - shopname + - shoprates + - state + - state_tax_id + - stripe_acct_id + - template_header + - textid + - updated_at + - zip_post + computed_fields: [] + filter: + associations: + bodyshop: + associations: + user: + authid: + _eq: X-Hasura-User-Id + role: user + table: + name: bodyshops + schema: public + type: create_select_permission diff --git a/hasura/migrations/1592257483098_alter_table_public_payments_add_column_transactionid/down.yaml b/hasura/migrations/1592257483098_alter_table_public_payments_add_column_transactionid/down.yaml new file mode 100644 index 000000000..fb9f70b70 --- /dev/null +++ b/hasura/migrations/1592257483098_alter_table_public_payments_add_column_transactionid/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."payments" DROP COLUMN "transactionid"; + type: run_sql diff --git a/hasura/migrations/1592257483098_alter_table_public_payments_add_column_transactionid/up.yaml b/hasura/migrations/1592257483098_alter_table_public_payments_add_column_transactionid/up.yaml new file mode 100644 index 000000000..19e4bcce8 --- /dev/null +++ b/hasura/migrations/1592257483098_alter_table_public_payments_add_column_transactionid/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."payments" ADD COLUMN "transactionid" text NULL; + type: run_sql diff --git a/hasura/migrations/1592257505571_alter_table_public_payments_add_column_memo/down.yaml b/hasura/migrations/1592257505571_alter_table_public_payments_add_column_memo/down.yaml new file mode 100644 index 000000000..b883fea83 --- /dev/null +++ b/hasura/migrations/1592257505571_alter_table_public_payments_add_column_memo/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."payments" DROP COLUMN "memo"; + type: run_sql diff --git a/hasura/migrations/1592257505571_alter_table_public_payments_add_column_memo/up.yaml b/hasura/migrations/1592257505571_alter_table_public_payments_add_column_memo/up.yaml new file mode 100644 index 000000000..ff6623a6a --- /dev/null +++ b/hasura/migrations/1592257505571_alter_table_public_payments_add_column_memo/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."payments" ADD COLUMN "memo" text NULL; + type: run_sql diff --git a/hasura/migrations/1592260834130_alter_table_public_payments_alter_column_amount/down.yaml b/hasura/migrations/1592260834130_alter_table_public_payments_alter_column_amount/down.yaml new file mode 100644 index 000000000..5d140c183 --- /dev/null +++ b/hasura/migrations/1592260834130_alter_table_public_payments_alter_column_amount/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."payments" ALTER COLUMN "amount" TYPE integer; + type: run_sql diff --git a/hasura/migrations/1592260834130_alter_table_public_payments_alter_column_amount/up.yaml b/hasura/migrations/1592260834130_alter_table_public_payments_alter_column_amount/up.yaml new file mode 100644 index 000000000..26f68af02 --- /dev/null +++ b/hasura/migrations/1592260834130_alter_table_public_payments_alter_column_amount/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."payments" ALTER COLUMN "amount" TYPE numeric; + type: run_sql diff --git a/hasura/migrations/1592260861278_alter_table_public_payments_add_column_stripeid/down.yaml b/hasura/migrations/1592260861278_alter_table_public_payments_add_column_stripeid/down.yaml new file mode 100644 index 000000000..6ef7d17b6 --- /dev/null +++ b/hasura/migrations/1592260861278_alter_table_public_payments_add_column_stripeid/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."payments" DROP COLUMN "stripeid"; + type: run_sql diff --git a/hasura/migrations/1592260861278_alter_table_public_payments_add_column_stripeid/up.yaml b/hasura/migrations/1592260861278_alter_table_public_payments_add_column_stripeid/up.yaml new file mode 100644 index 000000000..072fbd092 --- /dev/null +++ b/hasura/migrations/1592260861278_alter_table_public_payments_add_column_stripeid/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."payments" ADD COLUMN "stripeid" text NULL; + type: run_sql diff --git a/hasura/migrations/1592261038745_update_permission_user_public_table_payments/down.yaml b/hasura/migrations/1592261038745_update_permission_user_public_table_payments/down.yaml new file mode 100644 index 000000000..f68eb0c4b --- /dev/null +++ b/hasura/migrations/1592261038745_update_permission_user_public_table_payments/down.yaml @@ -0,0 +1,33 @@ +- args: + role: user + table: + name: payments + schema: public + type: drop_insert_permission +- args: + permission: + check: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - id + - created_at + - updated_at + - jobid + - amount + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: payments + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1592261038745_update_permission_user_public_table_payments/up.yaml b/hasura/migrations/1592261038745_update_permission_user_public_table_payments/up.yaml new file mode 100644 index 000000000..5d9f8f5a0 --- /dev/null +++ b/hasura/migrations/1592261038745_update_permission_user_public_table_payments/up.yaml @@ -0,0 +1,36 @@ +- args: + role: user + table: + name: payments + schema: public + type: drop_insert_permission +- args: + permission: + check: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - id + - created_at + - updated_at + - jobid + - amount + - transactionid + - memo + - stripeid + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: payments + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1592261045012_update_permission_user_public_table_payments/down.yaml b/hasura/migrations/1592261045012_update_permission_user_public_table_payments/down.yaml new file mode 100644 index 000000000..b5c96d94f --- /dev/null +++ b/hasura/migrations/1592261045012_update_permission_user_public_table_payments/down.yaml @@ -0,0 +1,31 @@ +- args: + role: user + table: + name: payments + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - amount + - created_at + - updated_at + - id + - jobid + computed_fields: [] + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: payments + schema: public + type: create_select_permission diff --git a/hasura/migrations/1592261045012_update_permission_user_public_table_payments/up.yaml b/hasura/migrations/1592261045012_update_permission_user_public_table_payments/up.yaml new file mode 100644 index 000000000..87b993f56 --- /dev/null +++ b/hasura/migrations/1592261045012_update_permission_user_public_table_payments/up.yaml @@ -0,0 +1,34 @@ +- args: + role: user + table: + name: payments + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - amount + - memo + - stripeid + - transactionid + - created_at + - updated_at + - id + - jobid + computed_fields: [] + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: payments + schema: public + type: create_select_permission diff --git a/hasura/migrations/1592261051274_update_permission_user_public_table_payments/down.yaml b/hasura/migrations/1592261051274_update_permission_user_public_table_payments/down.yaml new file mode 100644 index 000000000..daf932de4 --- /dev/null +++ b/hasura/migrations/1592261051274_update_permission_user_public_table_payments/down.yaml @@ -0,0 +1,33 @@ +- args: + role: user + table: + name: payments + schema: public + type: drop_update_permission +- args: + permission: + columns: + - amount + - created_at + - updated_at + - id + - jobid + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: payments + schema: public + type: create_update_permission diff --git a/hasura/migrations/1592261051274_update_permission_user_public_table_payments/up.yaml b/hasura/migrations/1592261051274_update_permission_user_public_table_payments/up.yaml new file mode 100644 index 000000000..8bad2eabf --- /dev/null +++ b/hasura/migrations/1592261051274_update_permission_user_public_table_payments/up.yaml @@ -0,0 +1,36 @@ +- args: + role: user + table: + name: payments + schema: public + type: drop_update_permission +- args: + permission: + columns: + - amount + - memo + - stripeid + - transactionid + - created_at + - updated_at + - id + - jobid + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: payments + schema: public + type: create_update_permission diff --git a/hasura/migrations/1592324594982_alter_table_public_payments_add_column_payer/down.yaml b/hasura/migrations/1592324594982_alter_table_public_payments_add_column_payer/down.yaml new file mode 100644 index 000000000..8ead0dc0d --- /dev/null +++ b/hasura/migrations/1592324594982_alter_table_public_payments_add_column_payer/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."payments" DROP COLUMN "payer"; + type: run_sql diff --git a/hasura/migrations/1592324594982_alter_table_public_payments_add_column_payer/up.yaml b/hasura/migrations/1592324594982_alter_table_public_payments_add_column_payer/up.yaml new file mode 100644 index 000000000..968dd3294 --- /dev/null +++ b/hasura/migrations/1592324594982_alter_table_public_payments_add_column_payer/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."payments" ADD COLUMN "payer" text NULL; + type: run_sql diff --git a/hasura/migrations/1592324603137_update_permission_user_public_table_payments/down.yaml b/hasura/migrations/1592324603137_update_permission_user_public_table_payments/down.yaml new file mode 100644 index 000000000..5d9f8f5a0 --- /dev/null +++ b/hasura/migrations/1592324603137_update_permission_user_public_table_payments/down.yaml @@ -0,0 +1,36 @@ +- args: + role: user + table: + name: payments + schema: public + type: drop_insert_permission +- args: + permission: + check: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - id + - created_at + - updated_at + - jobid + - amount + - transactionid + - memo + - stripeid + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: payments + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1592324603137_update_permission_user_public_table_payments/up.yaml b/hasura/migrations/1592324603137_update_permission_user_public_table_payments/up.yaml new file mode 100644 index 000000000..248a04f37 --- /dev/null +++ b/hasura/migrations/1592324603137_update_permission_user_public_table_payments/up.yaml @@ -0,0 +1,37 @@ +- args: + role: user + table: + name: payments + schema: public + type: drop_insert_permission +- args: + permission: + check: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - amount + - created_at + - id + - jobid + - memo + - payer + - stripeid + - transactionid + - updated_at + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: payments + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1592324618856_update_permission_user_public_table_payments/down.yaml b/hasura/migrations/1592324618856_update_permission_user_public_table_payments/down.yaml new file mode 100644 index 000000000..87b993f56 --- /dev/null +++ b/hasura/migrations/1592324618856_update_permission_user_public_table_payments/down.yaml @@ -0,0 +1,34 @@ +- args: + role: user + table: + name: payments + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - amount + - memo + - stripeid + - transactionid + - created_at + - updated_at + - id + - jobid + computed_fields: [] + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: payments + schema: public + type: create_select_permission diff --git a/hasura/migrations/1592324618856_update_permission_user_public_table_payments/up.yaml b/hasura/migrations/1592324618856_update_permission_user_public_table_payments/up.yaml new file mode 100644 index 000000000..d7f198395 --- /dev/null +++ b/hasura/migrations/1592324618856_update_permission_user_public_table_payments/up.yaml @@ -0,0 +1,35 @@ +- args: + role: user + table: + name: payments + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - amount + - created_at + - id + - jobid + - memo + - payer + - stripeid + - transactionid + - updated_at + computed_fields: [] + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: payments + schema: public + type: create_select_permission diff --git a/hasura/migrations/1592324625348_update_permission_user_public_table_payments/down.yaml b/hasura/migrations/1592324625348_update_permission_user_public_table_payments/down.yaml new file mode 100644 index 000000000..8bad2eabf --- /dev/null +++ b/hasura/migrations/1592324625348_update_permission_user_public_table_payments/down.yaml @@ -0,0 +1,36 @@ +- args: + role: user + table: + name: payments + schema: public + type: drop_update_permission +- args: + permission: + columns: + - amount + - memo + - stripeid + - transactionid + - created_at + - updated_at + - id + - jobid + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: payments + schema: public + type: create_update_permission diff --git a/hasura/migrations/1592324625348_update_permission_user_public_table_payments/up.yaml b/hasura/migrations/1592324625348_update_permission_user_public_table_payments/up.yaml new file mode 100644 index 000000000..332aef813 --- /dev/null +++ b/hasura/migrations/1592324625348_update_permission_user_public_table_payments/up.yaml @@ -0,0 +1,37 @@ +- args: + role: user + table: + name: payments + schema: public + type: drop_update_permission +- args: + permission: + columns: + - amount + - created_at + - id + - jobid + - memo + - payer + - stripeid + - transactionid + - updated_at + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: payments + schema: public + type: create_update_permission diff --git a/hasura/migrations/1592324679227_run_sql_migration/down.yaml b/hasura/migrations/1592324679227_run_sql_migration/down.yaml new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/hasura/migrations/1592324679227_run_sql_migration/down.yaml @@ -0,0 +1 @@ +[] diff --git a/hasura/migrations/1592324679227_run_sql_migration/up.yaml b/hasura/migrations/1592324679227_run_sql_migration/up.yaml new file mode 100644 index 000000000..6215879b1 --- /dev/null +++ b/hasura/migrations/1592324679227_run_sql_migration/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: true + read_only: false + sql: CREATE INDEX idx_payments_payer ON payments USING GIN (payer gin_trgm_ops); + type: run_sql diff --git a/hasura/migrations/1592325045380_run_sql_migration/down.yaml b/hasura/migrations/1592325045380_run_sql_migration/down.yaml new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/hasura/migrations/1592325045380_run_sql_migration/down.yaml @@ -0,0 +1 @@ +[] diff --git a/hasura/migrations/1592325045380_run_sql_migration/up.yaml b/hasura/migrations/1592325045380_run_sql_migration/up.yaml new file mode 100644 index 000000000..35ecb17d1 --- /dev/null +++ b/hasura/migrations/1592325045380_run_sql_migration/up.yaml @@ -0,0 +1,12 @@ +- args: + cascade: true + read_only: false + sql: "CREATE OR REPLACE FUNCTION public.search_payments(search text)\n RETURNS + SETOF payments\n LANGUAGE plpgsql\n STABLE\nAS $function$\n\nBEGIN\n if search + = '' then\n return query select * from payments ;\n else \n return query + SELECT\n *\nFROM\n payments\nWHERE\n search <% (payer) ;\n end if;\n\n\tEND\n$function$;" + type: run_sql +- args: + name: search_payments + schema: public + type: track_function diff --git a/hasura/migrations/1592325133932_update_permission_user_public_table_payments/down.yaml b/hasura/migrations/1592325133932_update_permission_user_public_table_payments/down.yaml new file mode 100644 index 000000000..d7f198395 --- /dev/null +++ b/hasura/migrations/1592325133932_update_permission_user_public_table_payments/down.yaml @@ -0,0 +1,35 @@ +- args: + role: user + table: + name: payments + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - amount + - created_at + - id + - jobid + - memo + - payer + - stripeid + - transactionid + - updated_at + computed_fields: [] + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: payments + schema: public + type: create_select_permission diff --git a/hasura/migrations/1592325133932_update_permission_user_public_table_payments/up.yaml b/hasura/migrations/1592325133932_update_permission_user_public_table_payments/up.yaml new file mode 100644 index 000000000..7485e333c --- /dev/null +++ b/hasura/migrations/1592325133932_update_permission_user_public_table_payments/up.yaml @@ -0,0 +1,35 @@ +- args: + role: user + table: + name: payments + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: true + columns: + - amount + - created_at + - id + - jobid + - memo + - payer + - stripeid + - transactionid + - updated_at + computed_fields: [] + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: payments + schema: public + type: create_select_permission diff --git a/hasura/migrations/1592325262313_run_sql_migration/down.yaml b/hasura/migrations/1592325262313_run_sql_migration/down.yaml new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/hasura/migrations/1592325262313_run_sql_migration/down.yaml @@ -0,0 +1 @@ +[] diff --git a/hasura/migrations/1592325262313_run_sql_migration/up.yaml b/hasura/migrations/1592325262313_run_sql_migration/up.yaml new file mode 100644 index 000000000..5d464f7e1 --- /dev/null +++ b/hasura/migrations/1592325262313_run_sql_migration/up.yaml @@ -0,0 +1,7 @@ +- args: + cascade: true + read_only: false + sql: |- + CREATE INDEX idx_payments_memo ON payments USING GIN (memo gin_trgm_ops); + CREATE INDEX idx_payments_txnid ON payments USING GIN (transactionid gin_trgm_ops); + type: run_sql diff --git a/hasura/migrations/1592325288329_run_sql_migration/down.yaml b/hasura/migrations/1592325288329_run_sql_migration/down.yaml new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/hasura/migrations/1592325288329_run_sql_migration/down.yaml @@ -0,0 +1 @@ +[] diff --git a/hasura/migrations/1592325288329_run_sql_migration/up.yaml b/hasura/migrations/1592325288329_run_sql_migration/up.yaml new file mode 100644 index 000000000..4439c7f6f --- /dev/null +++ b/hasura/migrations/1592325288329_run_sql_migration/up.yaml @@ -0,0 +1,9 @@ +- args: + cascade: true + read_only: false + sql: "CREATE OR REPLACE FUNCTION public.search_payments(search text)\n RETURNS + SETOF payments\n LANGUAGE plpgsql\n STABLE\nAS $function$\n\nBEGIN\n if search + = '' then\n return query select * from payments ;\n else \n return query + SELECT\n *\nFROM\n payments\nWHERE\n search <% (payer) OR\n search <% (transactionid) + OR\n search <% (memo);\n end if;\n\n\tEND\n$function$;" + type: run_sql diff --git a/hasura/migrations/1592325952533_alter_table_public_payments_add_column_exportedat/down.yaml b/hasura/migrations/1592325952533_alter_table_public_payments_add_column_exportedat/down.yaml new file mode 100644 index 000000000..101187382 --- /dev/null +++ b/hasura/migrations/1592325952533_alter_table_public_payments_add_column_exportedat/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."payments" DROP COLUMN "exportedat"; + type: run_sql diff --git a/hasura/migrations/1592325952533_alter_table_public_payments_add_column_exportedat/up.yaml b/hasura/migrations/1592325952533_alter_table_public_payments_add_column_exportedat/up.yaml new file mode 100644 index 000000000..8d48bae0a --- /dev/null +++ b/hasura/migrations/1592325952533_alter_table_public_payments_add_column_exportedat/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."payments" ADD COLUMN "exportedat" timestamptz NULL; + type: run_sql diff --git a/hasura/migrations/1592325964121_update_permission_user_public_table_payments/down.yaml b/hasura/migrations/1592325964121_update_permission_user_public_table_payments/down.yaml new file mode 100644 index 000000000..248a04f37 --- /dev/null +++ b/hasura/migrations/1592325964121_update_permission_user_public_table_payments/down.yaml @@ -0,0 +1,37 @@ +- args: + role: user + table: + name: payments + schema: public + type: drop_insert_permission +- args: + permission: + check: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - amount + - created_at + - id + - jobid + - memo + - payer + - stripeid + - transactionid + - updated_at + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: payments + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1592325964121_update_permission_user_public_table_payments/up.yaml b/hasura/migrations/1592325964121_update_permission_user_public_table_payments/up.yaml new file mode 100644 index 000000000..101107d75 --- /dev/null +++ b/hasura/migrations/1592325964121_update_permission_user_public_table_payments/up.yaml @@ -0,0 +1,38 @@ +- args: + role: user + table: + name: payments + schema: public + type: drop_insert_permission +- args: + permission: + check: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - amount + - created_at + - exportedat + - id + - jobid + - memo + - payer + - stripeid + - transactionid + - updated_at + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: payments + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1592325969484_update_permission_user_public_table_payments/down.yaml b/hasura/migrations/1592325969484_update_permission_user_public_table_payments/down.yaml new file mode 100644 index 000000000..7485e333c --- /dev/null +++ b/hasura/migrations/1592325969484_update_permission_user_public_table_payments/down.yaml @@ -0,0 +1,35 @@ +- args: + role: user + table: + name: payments + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: true + columns: + - amount + - created_at + - id + - jobid + - memo + - payer + - stripeid + - transactionid + - updated_at + computed_fields: [] + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: payments + schema: public + type: create_select_permission diff --git a/hasura/migrations/1592325969484_update_permission_user_public_table_payments/up.yaml b/hasura/migrations/1592325969484_update_permission_user_public_table_payments/up.yaml new file mode 100644 index 000000000..bc5c01b3a --- /dev/null +++ b/hasura/migrations/1592325969484_update_permission_user_public_table_payments/up.yaml @@ -0,0 +1,36 @@ +- args: + role: user + table: + name: payments + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: true + columns: + - amount + - created_at + - exportedat + - id + - jobid + - memo + - payer + - stripeid + - transactionid + - updated_at + computed_fields: [] + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: payments + schema: public + type: create_select_permission diff --git a/hasura/migrations/1592325975305_update_permission_user_public_table_payments/down.yaml b/hasura/migrations/1592325975305_update_permission_user_public_table_payments/down.yaml new file mode 100644 index 000000000..332aef813 --- /dev/null +++ b/hasura/migrations/1592325975305_update_permission_user_public_table_payments/down.yaml @@ -0,0 +1,37 @@ +- args: + role: user + table: + name: payments + schema: public + type: drop_update_permission +- args: + permission: + columns: + - amount + - created_at + - id + - jobid + - memo + - payer + - stripeid + - transactionid + - updated_at + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: payments + schema: public + type: create_update_permission diff --git a/hasura/migrations/1592325975305_update_permission_user_public_table_payments/up.yaml b/hasura/migrations/1592325975305_update_permission_user_public_table_payments/up.yaml new file mode 100644 index 000000000..ca990d8e4 --- /dev/null +++ b/hasura/migrations/1592325975305_update_permission_user_public_table_payments/up.yaml @@ -0,0 +1,38 @@ +- args: + role: user + table: + name: payments + schema: public + type: drop_update_permission +- args: + permission: + columns: + - amount + - created_at + - exportedat + - id + - jobid + - memo + - payer + - stripeid + - transactionid + - updated_at + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: payments + schema: public + type: create_update_permission diff --git a/hasura/migrations/1592338644254_alter_table_public_jobs_add_column_kanbanparent/down.yaml b/hasura/migrations/1592338644254_alter_table_public_jobs_add_column_kanbanparent/down.yaml new file mode 100644 index 000000000..9fe29b9ce --- /dev/null +++ b/hasura/migrations/1592338644254_alter_table_public_jobs_add_column_kanbanparent/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."jobs" DROP COLUMN "kanbanparent"; + type: run_sql diff --git a/hasura/migrations/1592338644254_alter_table_public_jobs_add_column_kanbanparent/up.yaml b/hasura/migrations/1592338644254_alter_table_public_jobs_add_column_kanbanparent/up.yaml new file mode 100644 index 000000000..c95d912b2 --- /dev/null +++ b/hasura/migrations/1592338644254_alter_table_public_jobs_add_column_kanbanparent/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."jobs" ADD COLUMN "kanbanparent" uuid NULL; + type: run_sql diff --git a/hasura/migrations/1592338664495_update_permission_user_public_table_jobs/down.yaml b/hasura/migrations/1592338664495_update_permission_user_public_table_jobs/down.yaml new file mode 100644 index 000000000..0a78e16c2 --- /dev/null +++ b/hasura/migrations/1592338664495_update_permission_user_public_table_jobs/down.yaml @@ -0,0 +1,257 @@ +- args: + role: user + table: + name: jobs + schema: public + type: drop_insert_permission +- args: + permission: + check: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - actual_completion + - actual_delivery + - actual_in + - adj_g_disc + - adj_strdis + - adj_towdis + - adjustment_bottom_line + - agt_addr1 + - agt_addr2 + - agt_city + - agt_co_id + - agt_co_nm + - agt_ct_fn + - agt_ct_ln + - agt_ct_ph + - agt_ct_phx + - agt_ctry + - agt_ea + - agt_fax + - agt_faxx + - agt_lic_no + - agt_ph1 + - agt_ph1x + - agt_ph2 + - agt_ph2x + - agt_st + - agt_zip + - area_of_damage + - asgn_date + - asgn_no + - asgn_type + - cat_no + - cieca_stl + - cieca_ttl + - ciecaid + - clm_addr1 + - clm_addr2 + - clm_city + - clm_ct_fn + - clm_ct_ln + - clm_ct_ph + - clm_ct_phx + - clm_ctry + - clm_ea + - clm_fax + - clm_faxx + - clm_no + - clm_ofc_id + - clm_ofc_nm + - clm_ph1 + - clm_ph1x + - clm_ph2 + - clm_ph2x + - clm_st + - clm_title + - clm_total + - clm_zip + - converted + - created_at + - csr + - cust_pr + - date_closed + - date_estimated + - date_exported + - date_invoiced + - date_open + - date_scheduled + - ded_amt + - ded_status + - depreciation_taxes + - est_addr1 + - est_addr2 + - est_city + - est_co_nm + - est_ct_fn + - est_ct_ln + - est_ctry + - est_ea + - est_number + - est_ph1 + - est_st + - est_zip + - federal_tax_payable + - federal_tax_rate + - g_bett_amt + - id + - inproduction + - ins_addr1 + - ins_addr2 + - ins_city + - ins_co_id + - ins_co_nm + - ins_ct_fn + - ins_ct_ln + - ins_ct_ph + - ins_ct_phx + - ins_ctry + - ins_ea + - ins_fax + - ins_faxx + - ins_memo + - ins_ph1 + - ins_ph1x + - ins_ph2 + - ins_ph2x + - ins_st + - ins_title + - ins_zip + - insd_addr1 + - insd_addr2 + - insd_city + - insd_co_nm + - insd_ctry + - insd_ea + - insd_fax + - insd_faxx + - insd_fn + - insd_ln + - insd_ph1 + - insd_ph1x + - insd_ph2 + - insd_ph2x + - insd_st + - insd_title + - insd_zip + - intakechecklist + - invoice_allocation + - invoice_date + - job_totals + - kmin + - kmout + - labor_rate_desc + - labor_rate_id + - local_tax_rate + - loss_cat + - loss_date + - loss_desc + - loss_type + - other_amount_payable + - owner_owing + - ownerid + - ownr_addr1 + - ownr_addr2 + - ownr_city + - ownr_co_nm + - ownr_ctry + - ownr_ea + - ownr_fax + - ownr_faxx + - ownr_fn + - ownr_ln + - ownr_ph1 + - ownr_ph1x + - ownr_ph2 + - ownr_ph2x + - ownr_st + - ownr_title + - ownr_zip + - parts_tax_rates + - pay_amt + - pay_chknm + - pay_date + - pay_type + - payee_nms + - plate_no + - plate_st + - po_number + - policy_no + - production_vars + - rate_atp + - rate_la1 + - rate_la2 + - rate_la3 + - rate_la4 + - rate_laa + - rate_lab + - rate_lad + - rate_lae + - rate_laf + - rate_lag + - rate_lam + - rate_lar + - rate_las + - rate_lau + - rate_ma2s + - rate_ma2t + - rate_ma3s + - rate_mabl + - rate_macs + - rate_mahw + - rate_mapa + - rate_mash + - rate_matd + - referral_source + - regie_number + - ro_number + - scheduled_completion + - scheduled_delivery + - scheduled_in + - selling_dealer + - selling_dealer_contact + - servicing_dealer + - servicing_dealer_contact + - shopid + - special_coverage_policy + - state_tax_rate + - status + - statusid + - storage_payable + - tax_lbr_rt + - tax_levies_rt + - tax_paint_mat_rt + - tax_predis + - tax_prethr + - tax_pstthr + - tax_str_rt + - tax_sub_rt + - tax_thramt + - tax_tow_rt + - theft_ind + - tlos_ind + - towing_payable + - unit_number + - updated_at + - v_color + - v_make_desc + - v_model_desc + - v_model_yr + - v_vin + - vehicleid + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: jobs + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1592338664495_update_permission_user_public_table_jobs/up.yaml b/hasura/migrations/1592338664495_update_permission_user_public_table_jobs/up.yaml new file mode 100644 index 000000000..1ca9f0a39 --- /dev/null +++ b/hasura/migrations/1592338664495_update_permission_user_public_table_jobs/up.yaml @@ -0,0 +1,258 @@ +- args: + role: user + table: + name: jobs + schema: public + type: drop_insert_permission +- args: + permission: + check: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - actual_completion + - actual_delivery + - actual_in + - adj_g_disc + - adj_strdis + - adj_towdis + - adjustment_bottom_line + - agt_addr1 + - agt_addr2 + - agt_city + - agt_co_id + - agt_co_nm + - agt_ct_fn + - agt_ct_ln + - agt_ct_ph + - agt_ct_phx + - agt_ctry + - agt_ea + - agt_fax + - agt_faxx + - agt_lic_no + - agt_ph1 + - agt_ph1x + - agt_ph2 + - agt_ph2x + - agt_st + - agt_zip + - area_of_damage + - asgn_date + - asgn_no + - asgn_type + - cat_no + - cieca_stl + - cieca_ttl + - ciecaid + - clm_addr1 + - clm_addr2 + - clm_city + - clm_ct_fn + - clm_ct_ln + - clm_ct_ph + - clm_ct_phx + - clm_ctry + - clm_ea + - clm_fax + - clm_faxx + - clm_no + - clm_ofc_id + - clm_ofc_nm + - clm_ph1 + - clm_ph1x + - clm_ph2 + - clm_ph2x + - clm_st + - clm_title + - clm_total + - clm_zip + - converted + - created_at + - csr + - cust_pr + - date_closed + - date_estimated + - date_exported + - date_invoiced + - date_open + - date_scheduled + - ded_amt + - ded_status + - depreciation_taxes + - est_addr1 + - est_addr2 + - est_city + - est_co_nm + - est_ct_fn + - est_ct_ln + - est_ctry + - est_ea + - est_number + - est_ph1 + - est_st + - est_zip + - federal_tax_payable + - federal_tax_rate + - g_bett_amt + - id + - inproduction + - ins_addr1 + - ins_addr2 + - ins_city + - ins_co_id + - ins_co_nm + - ins_ct_fn + - ins_ct_ln + - ins_ct_ph + - ins_ct_phx + - ins_ctry + - ins_ea + - ins_fax + - ins_faxx + - ins_memo + - ins_ph1 + - ins_ph1x + - ins_ph2 + - ins_ph2x + - ins_st + - ins_title + - ins_zip + - insd_addr1 + - insd_addr2 + - insd_city + - insd_co_nm + - insd_ctry + - insd_ea + - insd_fax + - insd_faxx + - insd_fn + - insd_ln + - insd_ph1 + - insd_ph1x + - insd_ph2 + - insd_ph2x + - insd_st + - insd_title + - insd_zip + - intakechecklist + - invoice_allocation + - invoice_date + - job_totals + - kanbanparent + - kmin + - kmout + - labor_rate_desc + - labor_rate_id + - local_tax_rate + - loss_cat + - loss_date + - loss_desc + - loss_type + - other_amount_payable + - owner_owing + - ownerid + - ownr_addr1 + - ownr_addr2 + - ownr_city + - ownr_co_nm + - ownr_ctry + - ownr_ea + - ownr_fax + - ownr_faxx + - ownr_fn + - ownr_ln + - ownr_ph1 + - ownr_ph1x + - ownr_ph2 + - ownr_ph2x + - ownr_st + - ownr_title + - ownr_zip + - parts_tax_rates + - pay_amt + - pay_chknm + - pay_date + - pay_type + - payee_nms + - plate_no + - plate_st + - po_number + - policy_no + - production_vars + - rate_atp + - rate_la1 + - rate_la2 + - rate_la3 + - rate_la4 + - rate_laa + - rate_lab + - rate_lad + - rate_lae + - rate_laf + - rate_lag + - rate_lam + - rate_lar + - rate_las + - rate_lau + - rate_ma2s + - rate_ma2t + - rate_ma3s + - rate_mabl + - rate_macs + - rate_mahw + - rate_mapa + - rate_mash + - rate_matd + - referral_source + - regie_number + - ro_number + - scheduled_completion + - scheduled_delivery + - scheduled_in + - selling_dealer + - selling_dealer_contact + - servicing_dealer + - servicing_dealer_contact + - shopid + - special_coverage_policy + - state_tax_rate + - status + - statusid + - storage_payable + - tax_lbr_rt + - tax_levies_rt + - tax_paint_mat_rt + - tax_predis + - tax_prethr + - tax_pstthr + - tax_str_rt + - tax_sub_rt + - tax_thramt + - tax_tow_rt + - theft_ind + - tlos_ind + - towing_payable + - unit_number + - updated_at + - v_color + - v_make_desc + - v_model_desc + - v_model_yr + - v_vin + - vehicleid + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: jobs + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1592338672542_update_permission_user_public_table_jobs/down.yaml b/hasura/migrations/1592338672542_update_permission_user_public_table_jobs/down.yaml new file mode 100644 index 000000000..4e4e0f870 --- /dev/null +++ b/hasura/migrations/1592338672542_update_permission_user_public_table_jobs/down.yaml @@ -0,0 +1,255 @@ +- args: + role: user + table: + name: jobs + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: true + columns: + - actual_completion + - actual_delivery + - actual_in + - adj_g_disc + - adj_strdis + - adj_towdis + - adjustment_bottom_line + - agt_addr1 + - agt_addr2 + - agt_city + - agt_co_id + - agt_co_nm + - agt_ct_fn + - agt_ct_ln + - agt_ct_ph + - agt_ct_phx + - agt_ctry + - agt_ea + - agt_fax + - agt_faxx + - agt_lic_no + - agt_ph1 + - agt_ph1x + - agt_ph2 + - agt_ph2x + - agt_st + - agt_zip + - area_of_damage + - asgn_date + - asgn_no + - asgn_type + - cat_no + - cieca_stl + - cieca_ttl + - ciecaid + - clm_addr1 + - clm_addr2 + - clm_city + - clm_ct_fn + - clm_ct_ln + - clm_ct_ph + - clm_ct_phx + - clm_ctry + - clm_ea + - clm_fax + - clm_faxx + - clm_no + - clm_ofc_id + - clm_ofc_nm + - clm_ph1 + - clm_ph1x + - clm_ph2 + - clm_ph2x + - clm_st + - clm_title + - clm_total + - clm_zip + - converted + - created_at + - csr + - cust_pr + - date_closed + - date_estimated + - date_exported + - date_invoiced + - date_open + - date_scheduled + - ded_amt + - ded_status + - depreciation_taxes + - est_addr1 + - est_addr2 + - est_city + - est_co_nm + - est_ct_fn + - est_ct_ln + - est_ctry + - est_ea + - est_number + - est_ph1 + - est_st + - est_zip + - federal_tax_payable + - federal_tax_rate + - g_bett_amt + - id + - inproduction + - ins_addr1 + - ins_addr2 + - ins_city + - ins_co_id + - ins_co_nm + - ins_ct_fn + - ins_ct_ln + - ins_ct_ph + - ins_ct_phx + - ins_ctry + - ins_ea + - ins_fax + - ins_faxx + - ins_memo + - ins_ph1 + - ins_ph1x + - ins_ph2 + - ins_ph2x + - ins_st + - ins_title + - ins_zip + - insd_addr1 + - insd_addr2 + - insd_city + - insd_co_nm + - insd_ctry + - insd_ea + - insd_fax + - insd_faxx + - insd_fn + - insd_ln + - insd_ph1 + - insd_ph1x + - insd_ph2 + - insd_ph2x + - insd_st + - insd_title + - insd_zip + - intakechecklist + - invoice_allocation + - invoice_date + - job_totals + - kmin + - kmout + - labor_rate_desc + - labor_rate_id + - local_tax_rate + - loss_cat + - loss_date + - loss_desc + - loss_type + - other_amount_payable + - owner_owing + - ownerid + - ownr_addr1 + - ownr_addr2 + - ownr_city + - ownr_co_nm + - ownr_ctry + - ownr_ea + - ownr_fax + - ownr_faxx + - ownr_fn + - ownr_ln + - ownr_ph1 + - ownr_ph1x + - ownr_ph2 + - ownr_ph2x + - ownr_st + - ownr_title + - ownr_zip + - parts_tax_rates + - pay_amt + - pay_chknm + - pay_date + - pay_type + - payee_nms + - plate_no + - plate_st + - po_number + - policy_no + - production_vars + - rate_atp + - rate_la1 + - rate_la2 + - rate_la3 + - rate_la4 + - rate_laa + - rate_lab + - rate_lad + - rate_lae + - rate_laf + - rate_lag + - rate_lam + - rate_lar + - rate_las + - rate_lau + - rate_ma2s + - rate_ma2t + - rate_ma3s + - rate_mabl + - rate_macs + - rate_mahw + - rate_mapa + - rate_mash + - rate_matd + - referral_source + - regie_number + - ro_number + - scheduled_completion + - scheduled_delivery + - scheduled_in + - selling_dealer + - selling_dealer_contact + - servicing_dealer + - servicing_dealer_contact + - shopid + - special_coverage_policy + - state_tax_rate + - status + - statusid + - storage_payable + - tax_lbr_rt + - tax_levies_rt + - tax_paint_mat_rt + - tax_predis + - tax_prethr + - tax_pstthr + - tax_str_rt + - tax_sub_rt + - tax_thramt + - tax_tow_rt + - theft_ind + - tlos_ind + - towing_payable + - unit_number + - updated_at + - v_color + - v_make_desc + - v_model_desc + - v_model_yr + - v_vin + - vehicleid + computed_fields: [] + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: jobs + schema: public + type: create_select_permission diff --git a/hasura/migrations/1592338672542_update_permission_user_public_table_jobs/up.yaml b/hasura/migrations/1592338672542_update_permission_user_public_table_jobs/up.yaml new file mode 100644 index 000000000..26e7035b1 --- /dev/null +++ b/hasura/migrations/1592338672542_update_permission_user_public_table_jobs/up.yaml @@ -0,0 +1,256 @@ +- args: + role: user + table: + name: jobs + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: true + columns: + - actual_completion + - actual_delivery + - actual_in + - adj_g_disc + - adj_strdis + - adj_towdis + - adjustment_bottom_line + - agt_addr1 + - agt_addr2 + - agt_city + - agt_co_id + - agt_co_nm + - agt_ct_fn + - agt_ct_ln + - agt_ct_ph + - agt_ct_phx + - agt_ctry + - agt_ea + - agt_fax + - agt_faxx + - agt_lic_no + - agt_ph1 + - agt_ph1x + - agt_ph2 + - agt_ph2x + - agt_st + - agt_zip + - area_of_damage + - asgn_date + - asgn_no + - asgn_type + - cat_no + - cieca_stl + - cieca_ttl + - ciecaid + - clm_addr1 + - clm_addr2 + - clm_city + - clm_ct_fn + - clm_ct_ln + - clm_ct_ph + - clm_ct_phx + - clm_ctry + - clm_ea + - clm_fax + - clm_faxx + - clm_no + - clm_ofc_id + - clm_ofc_nm + - clm_ph1 + - clm_ph1x + - clm_ph2 + - clm_ph2x + - clm_st + - clm_title + - clm_total + - clm_zip + - converted + - created_at + - csr + - cust_pr + - date_closed + - date_estimated + - date_exported + - date_invoiced + - date_open + - date_scheduled + - ded_amt + - ded_status + - depreciation_taxes + - est_addr1 + - est_addr2 + - est_city + - est_co_nm + - est_ct_fn + - est_ct_ln + - est_ctry + - est_ea + - est_number + - est_ph1 + - est_st + - est_zip + - federal_tax_payable + - federal_tax_rate + - g_bett_amt + - id + - inproduction + - ins_addr1 + - ins_addr2 + - ins_city + - ins_co_id + - ins_co_nm + - ins_ct_fn + - ins_ct_ln + - ins_ct_ph + - ins_ct_phx + - ins_ctry + - ins_ea + - ins_fax + - ins_faxx + - ins_memo + - ins_ph1 + - ins_ph1x + - ins_ph2 + - ins_ph2x + - ins_st + - ins_title + - ins_zip + - insd_addr1 + - insd_addr2 + - insd_city + - insd_co_nm + - insd_ctry + - insd_ea + - insd_fax + - insd_faxx + - insd_fn + - insd_ln + - insd_ph1 + - insd_ph1x + - insd_ph2 + - insd_ph2x + - insd_st + - insd_title + - insd_zip + - intakechecklist + - invoice_allocation + - invoice_date + - job_totals + - kanbanparent + - kmin + - kmout + - labor_rate_desc + - labor_rate_id + - local_tax_rate + - loss_cat + - loss_date + - loss_desc + - loss_type + - other_amount_payable + - owner_owing + - ownerid + - ownr_addr1 + - ownr_addr2 + - ownr_city + - ownr_co_nm + - ownr_ctry + - ownr_ea + - ownr_fax + - ownr_faxx + - ownr_fn + - ownr_ln + - ownr_ph1 + - ownr_ph1x + - ownr_ph2 + - ownr_ph2x + - ownr_st + - ownr_title + - ownr_zip + - parts_tax_rates + - pay_amt + - pay_chknm + - pay_date + - pay_type + - payee_nms + - plate_no + - plate_st + - po_number + - policy_no + - production_vars + - rate_atp + - rate_la1 + - rate_la2 + - rate_la3 + - rate_la4 + - rate_laa + - rate_lab + - rate_lad + - rate_lae + - rate_laf + - rate_lag + - rate_lam + - rate_lar + - rate_las + - rate_lau + - rate_ma2s + - rate_ma2t + - rate_ma3s + - rate_mabl + - rate_macs + - rate_mahw + - rate_mapa + - rate_mash + - rate_matd + - referral_source + - regie_number + - ro_number + - scheduled_completion + - scheduled_delivery + - scheduled_in + - selling_dealer + - selling_dealer_contact + - servicing_dealer + - servicing_dealer_contact + - shopid + - special_coverage_policy + - state_tax_rate + - status + - statusid + - storage_payable + - tax_lbr_rt + - tax_levies_rt + - tax_paint_mat_rt + - tax_predis + - tax_prethr + - tax_pstthr + - tax_str_rt + - tax_sub_rt + - tax_thramt + - tax_tow_rt + - theft_ind + - tlos_ind + - towing_payable + - unit_number + - updated_at + - v_color + - v_make_desc + - v_model_desc + - v_model_yr + - v_vin + - vehicleid + computed_fields: [] + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: jobs + schema: public + type: create_select_permission diff --git a/hasura/migrations/1592338681306_update_permission_user_public_table_jobs/down.yaml b/hasura/migrations/1592338681306_update_permission_user_public_table_jobs/down.yaml new file mode 100644 index 000000000..b15051c7a --- /dev/null +++ b/hasura/migrations/1592338681306_update_permission_user_public_table_jobs/down.yaml @@ -0,0 +1,257 @@ +- args: + role: user + table: + name: jobs + schema: public + type: drop_update_permission +- args: + permission: + columns: + - actual_completion + - actual_delivery + - actual_in + - adj_g_disc + - adj_strdis + - adj_towdis + - adjustment_bottom_line + - agt_addr1 + - agt_addr2 + - agt_city + - agt_co_id + - agt_co_nm + - agt_ct_fn + - agt_ct_ln + - agt_ct_ph + - agt_ct_phx + - agt_ctry + - agt_ea + - agt_fax + - agt_faxx + - agt_lic_no + - agt_ph1 + - agt_ph1x + - agt_ph2 + - agt_ph2x + - agt_st + - agt_zip + - area_of_damage + - asgn_date + - asgn_no + - asgn_type + - cat_no + - cieca_stl + - cieca_ttl + - ciecaid + - clm_addr1 + - clm_addr2 + - clm_city + - clm_ct_fn + - clm_ct_ln + - clm_ct_ph + - clm_ct_phx + - clm_ctry + - clm_ea + - clm_fax + - clm_faxx + - clm_no + - clm_ofc_id + - clm_ofc_nm + - clm_ph1 + - clm_ph1x + - clm_ph2 + - clm_ph2x + - clm_st + - clm_title + - clm_total + - clm_zip + - converted + - created_at + - csr + - cust_pr + - date_closed + - date_estimated + - date_exported + - date_invoiced + - date_open + - date_scheduled + - ded_amt + - ded_status + - depreciation_taxes + - est_addr1 + - est_addr2 + - est_city + - est_co_nm + - est_ct_fn + - est_ct_ln + - est_ctry + - est_ea + - est_number + - est_ph1 + - est_st + - est_zip + - federal_tax_payable + - federal_tax_rate + - g_bett_amt + - id + - inproduction + - ins_addr1 + - ins_addr2 + - ins_city + - ins_co_id + - ins_co_nm + - ins_ct_fn + - ins_ct_ln + - ins_ct_ph + - ins_ct_phx + - ins_ctry + - ins_ea + - ins_fax + - ins_faxx + - ins_memo + - ins_ph1 + - ins_ph1x + - ins_ph2 + - ins_ph2x + - ins_st + - ins_title + - ins_zip + - insd_addr1 + - insd_addr2 + - insd_city + - insd_co_nm + - insd_ctry + - insd_ea + - insd_fax + - insd_faxx + - insd_fn + - insd_ln + - insd_ph1 + - insd_ph1x + - insd_ph2 + - insd_ph2x + - insd_st + - insd_title + - insd_zip + - intakechecklist + - invoice_allocation + - invoice_date + - job_totals + - kmin + - kmout + - labor_rate_desc + - labor_rate_id + - local_tax_rate + - loss_cat + - loss_date + - loss_desc + - loss_type + - other_amount_payable + - owner_owing + - ownerid + - ownr_addr1 + - ownr_addr2 + - ownr_city + - ownr_co_nm + - ownr_ctry + - ownr_ea + - ownr_fax + - ownr_faxx + - ownr_fn + - ownr_ln + - ownr_ph1 + - ownr_ph1x + - ownr_ph2 + - ownr_ph2x + - ownr_st + - ownr_title + - ownr_zip + - parts_tax_rates + - pay_amt + - pay_chknm + - pay_date + - pay_type + - payee_nms + - plate_no + - plate_st + - po_number + - policy_no + - production_vars + - rate_atp + - rate_la1 + - rate_la2 + - rate_la3 + - rate_la4 + - rate_laa + - rate_lab + - rate_lad + - rate_lae + - rate_laf + - rate_lag + - rate_lam + - rate_lar + - rate_las + - rate_lau + - rate_ma2s + - rate_ma2t + - rate_ma3s + - rate_mabl + - rate_macs + - rate_mahw + - rate_mapa + - rate_mash + - rate_matd + - referral_source + - regie_number + - ro_number + - scheduled_completion + - scheduled_delivery + - scheduled_in + - selling_dealer + - selling_dealer_contact + - servicing_dealer + - servicing_dealer_contact + - shopid + - special_coverage_policy + - state_tax_rate + - status + - statusid + - storage_payable + - tax_lbr_rt + - tax_levies_rt + - tax_paint_mat_rt + - tax_predis + - tax_prethr + - tax_pstthr + - tax_str_rt + - tax_sub_rt + - tax_thramt + - tax_tow_rt + - theft_ind + - tlos_ind + - towing_payable + - unit_number + - updated_at + - v_color + - v_make_desc + - v_model_desc + - v_model_yr + - v_vin + - vehicleid + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: jobs + schema: public + type: create_update_permission diff --git a/hasura/migrations/1592338681306_update_permission_user_public_table_jobs/up.yaml b/hasura/migrations/1592338681306_update_permission_user_public_table_jobs/up.yaml new file mode 100644 index 000000000..dbe7e0f0b --- /dev/null +++ b/hasura/migrations/1592338681306_update_permission_user_public_table_jobs/up.yaml @@ -0,0 +1,258 @@ +- args: + role: user + table: + name: jobs + schema: public + type: drop_update_permission +- args: + permission: + columns: + - actual_completion + - actual_delivery + - actual_in + - adj_g_disc + - adj_strdis + - adj_towdis + - adjustment_bottom_line + - agt_addr1 + - agt_addr2 + - agt_city + - agt_co_id + - agt_co_nm + - agt_ct_fn + - agt_ct_ln + - agt_ct_ph + - agt_ct_phx + - agt_ctry + - agt_ea + - agt_fax + - agt_faxx + - agt_lic_no + - agt_ph1 + - agt_ph1x + - agt_ph2 + - agt_ph2x + - agt_st + - agt_zip + - area_of_damage + - asgn_date + - asgn_no + - asgn_type + - cat_no + - cieca_stl + - cieca_ttl + - ciecaid + - clm_addr1 + - clm_addr2 + - clm_city + - clm_ct_fn + - clm_ct_ln + - clm_ct_ph + - clm_ct_phx + - clm_ctry + - clm_ea + - clm_fax + - clm_faxx + - clm_no + - clm_ofc_id + - clm_ofc_nm + - clm_ph1 + - clm_ph1x + - clm_ph2 + - clm_ph2x + - clm_st + - clm_title + - clm_total + - clm_zip + - converted + - created_at + - csr + - cust_pr + - date_closed + - date_estimated + - date_exported + - date_invoiced + - date_open + - date_scheduled + - ded_amt + - ded_status + - depreciation_taxes + - est_addr1 + - est_addr2 + - est_city + - est_co_nm + - est_ct_fn + - est_ct_ln + - est_ctry + - est_ea + - est_number + - est_ph1 + - est_st + - est_zip + - federal_tax_payable + - federal_tax_rate + - g_bett_amt + - id + - inproduction + - ins_addr1 + - ins_addr2 + - ins_city + - ins_co_id + - ins_co_nm + - ins_ct_fn + - ins_ct_ln + - ins_ct_ph + - ins_ct_phx + - ins_ctry + - ins_ea + - ins_fax + - ins_faxx + - ins_memo + - ins_ph1 + - ins_ph1x + - ins_ph2 + - ins_ph2x + - ins_st + - ins_title + - ins_zip + - insd_addr1 + - insd_addr2 + - insd_city + - insd_co_nm + - insd_ctry + - insd_ea + - insd_fax + - insd_faxx + - insd_fn + - insd_ln + - insd_ph1 + - insd_ph1x + - insd_ph2 + - insd_ph2x + - insd_st + - insd_title + - insd_zip + - intakechecklist + - invoice_allocation + - invoice_date + - job_totals + - kanbanparent + - kmin + - kmout + - labor_rate_desc + - labor_rate_id + - local_tax_rate + - loss_cat + - loss_date + - loss_desc + - loss_type + - other_amount_payable + - owner_owing + - ownerid + - ownr_addr1 + - ownr_addr2 + - ownr_city + - ownr_co_nm + - ownr_ctry + - ownr_ea + - ownr_fax + - ownr_faxx + - ownr_fn + - ownr_ln + - ownr_ph1 + - ownr_ph1x + - ownr_ph2 + - ownr_ph2x + - ownr_st + - ownr_title + - ownr_zip + - parts_tax_rates + - pay_amt + - pay_chknm + - pay_date + - pay_type + - payee_nms + - plate_no + - plate_st + - po_number + - policy_no + - production_vars + - rate_atp + - rate_la1 + - rate_la2 + - rate_la3 + - rate_la4 + - rate_laa + - rate_lab + - rate_lad + - rate_lae + - rate_laf + - rate_lag + - rate_lam + - rate_lar + - rate_las + - rate_lau + - rate_ma2s + - rate_ma2t + - rate_ma3s + - rate_mabl + - rate_macs + - rate_mahw + - rate_mapa + - rate_mash + - rate_matd + - referral_source + - regie_number + - ro_number + - scheduled_completion + - scheduled_delivery + - scheduled_in + - selling_dealer + - selling_dealer_contact + - servicing_dealer + - servicing_dealer_contact + - shopid + - special_coverage_policy + - state_tax_rate + - status + - statusid + - storage_payable + - tax_lbr_rt + - tax_levies_rt + - tax_paint_mat_rt + - tax_predis + - tax_prethr + - tax_pstthr + - tax_str_rt + - tax_sub_rt + - tax_thramt + - tax_tow_rt + - theft_ind + - tlos_ind + - towing_payable + - unit_number + - updated_at + - v_color + - v_make_desc + - v_model_desc + - v_model_yr + - v_vin + - vehicleid + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: jobs + schema: public + type: create_update_permission diff --git a/hasura/migrations/1592338828686_run_sql_migration/down.yaml b/hasura/migrations/1592338828686_run_sql_migration/down.yaml new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/hasura/migrations/1592338828686_run_sql_migration/down.yaml @@ -0,0 +1 @@ +[] diff --git a/hasura/migrations/1592338828686_run_sql_migration/up.yaml b/hasura/migrations/1592338828686_run_sql_migration/up.yaml new file mode 100644 index 000000000..fff1fe20c --- /dev/null +++ b/hasura/migrations/1592338828686_run_sql_migration/up.yaml @@ -0,0 +1,20 @@ +- args: + cascade: true + read_only: false + sql: "CREATE OR REPLACE VIEW \"public\".\"productionview\" AS \n SELECT j.id,\n + \ j.status,\n j.ro_number,\n j.est_number,\n j.ownr_fn,\n j.ownr_ln,\n + \ j.v_model_yr,\n j.v_model_desc,\n j.clm_no,\n j.v_make_desc,\n + \ j.v_color,\n j.plate_no,\n j.actual_in,\n j.scheduled_completion,\n + \ j.scheduled_delivery,\n j.ins_co_nm,\n j.clm_total,\n j.ownr_ph1,\n + \ j.special_coverage_policy,\n j.production_vars,\n lab.labhrs,\n lar.larhrs,\n + \ j.shopid,\n\n parts.partcount, j.kanbanparent\n FROM (((jobs j\n + \ LEFT JOIN ( SELECT l.jobid,\n sum(l.mod_lb_hrs) AS labhrs\n + \ FROM joblines l\n WHERE (l.mod_lbr_ty = 'LAB'::text)\n GROUP + BY l.jobid) lab ON ((lab.jobid = j.id)))\n LEFT JOIN ( SELECT l2.jobid,\n + \ sum(l2.mod_lb_hrs) AS larhrs\n FROM joblines l2\n WHERE + (l2.mod_lbr_ty = 'LAR'::text)\n GROUP BY l2.jobid) lar ON ((lar.jobid + = j.id)))\n LEFT JOIN ( SELECT l3.jobid,\n json_agg(l3.status) + AS partcount\n FROM joblines l3\n WHERE (l3.part_type IS + NOT NULL)\n GROUP BY l3.jobid) parts ON ((parts.jobid = j.id)))\n WHERE + (j.inproduction = true);" + type: run_sql diff --git a/hasura/migrations/1592338856120_update_permission_user_public_table_productionview/down.yaml b/hasura/migrations/1592338856120_update_permission_user_public_table_productionview/down.yaml new file mode 100644 index 000000000..846706108 --- /dev/null +++ b/hasura/migrations/1592338856120_update_permission_user_public_table_productionview/down.yaml @@ -0,0 +1,49 @@ +- args: + role: user + table: + name: productionview + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: true + columns: + - id + - status + - ro_number + - est_number + - ownr_fn + - ownr_ln + - v_model_yr + - v_model_desc + - clm_no + - v_make_desc + - v_color + - plate_no + - actual_in + - scheduled_completion + - scheduled_delivery + - ins_co_nm + - clm_total + - ownr_ph1 + - special_coverage_policy + - production_vars + - labhrs + - larhrs + - shopid + - partcount + computed_fields: [] + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: productionview + schema: public + type: create_select_permission diff --git a/hasura/migrations/1592338856120_update_permission_user_public_table_productionview/up.yaml b/hasura/migrations/1592338856120_update_permission_user_public_table_productionview/up.yaml new file mode 100644 index 000000000..d79153df4 --- /dev/null +++ b/hasura/migrations/1592338856120_update_permission_user_public_table_productionview/up.yaml @@ -0,0 +1,50 @@ +- args: + role: user + table: + name: productionview + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: true + columns: + - actual_in + - clm_no + - clm_total + - est_number + - id + - ins_co_nm + - kanbanparent + - labhrs + - larhrs + - ownr_fn + - ownr_ln + - ownr_ph1 + - partcount + - plate_no + - production_vars + - ro_number + - scheduled_completion + - scheduled_delivery + - shopid + - special_coverage_policy + - status + - v_color + - v_make_desc + - v_model_desc + - v_model_yr + computed_fields: [] + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: productionview + schema: public + type: create_select_permission diff --git a/hasura/migrations/1592417299712_drop_view_public_productionview/down.yaml b/hasura/migrations/1592417299712_drop_view_public_productionview/down.yaml new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/hasura/migrations/1592417299712_drop_view_public_productionview/down.yaml @@ -0,0 +1 @@ +[] diff --git a/hasura/migrations/1592417299712_drop_view_public_productionview/up.yaml b/hasura/migrations/1592417299712_drop_view_public_productionview/up.yaml new file mode 100644 index 000000000..6e88a06bd --- /dev/null +++ b/hasura/migrations/1592417299712_drop_view_public_productionview/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: DROP VIEW "public"."productionview"; + type: run_sql diff --git a/hasura/migrations/1592417338944_alter_table_public_jobs_alter_column_kanbanparent/down.yaml b/hasura/migrations/1592417338944_alter_table_public_jobs_alter_column_kanbanparent/down.yaml new file mode 100644 index 000000000..951a77c81 --- /dev/null +++ b/hasura/migrations/1592417338944_alter_table_public_jobs_alter_column_kanbanparent/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."jobs" ALTER COLUMN "kanbanparent" TYPE uuid; + type: run_sql diff --git a/hasura/migrations/1592417338944_alter_table_public_jobs_alter_column_kanbanparent/up.yaml b/hasura/migrations/1592417338944_alter_table_public_jobs_alter_column_kanbanparent/up.yaml new file mode 100644 index 000000000..952ad7cef --- /dev/null +++ b/hasura/migrations/1592417338944_alter_table_public_jobs_alter_column_kanbanparent/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."jobs" ALTER COLUMN "kanbanparent" TYPE text; + type: run_sql diff --git a/hasura/migrations/1592417343599_run_sql_migration/down.yaml b/hasura/migrations/1592417343599_run_sql_migration/down.yaml new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/hasura/migrations/1592417343599_run_sql_migration/down.yaml @@ -0,0 +1 @@ +[] diff --git a/hasura/migrations/1592417343599_run_sql_migration/up.yaml b/hasura/migrations/1592417343599_run_sql_migration/up.yaml new file mode 100644 index 000000000..122c7f6fe --- /dev/null +++ b/hasura/migrations/1592417343599_run_sql_migration/up.yaml @@ -0,0 +1,24 @@ +- args: + cascade: true + read_only: false + sql: "CREATE OR REPLACE VIEW \"public\".\"productionview\" AS \n SELECT j.id,\n + \ j.status,\n j.ro_number,\n j.est_number,\n j.ownr_fn,\n j.ownr_ln,\n + \ j.v_model_yr,\n j.v_model_desc,\n j.clm_no,\n j.v_make_desc,\n + \ j.v_color,\n j.plate_no,\n j.actual_in,\n j.scheduled_completion,\n + \ j.scheduled_delivery,\n j.ins_co_nm,\n j.clm_total,\n j.ownr_ph1,\n + \ j.special_coverage_policy,\n j.production_vars,\n lab.labhrs,\n lar.larhrs,\n + \ j.shopid,\n parts.partcount,\n j.kanbanparent\n FROM (((jobs j\n + \ LEFT JOIN ( SELECT l.jobid,\n sum(l.mod_lb_hrs) AS labhrs\n + \ FROM joblines l\n WHERE (l.mod_lbr_ty = 'LAB'::text)\n GROUP + BY l.jobid) lab ON ((lab.jobid = j.id)))\n LEFT JOIN ( SELECT l2.jobid,\n + \ sum(l2.mod_lb_hrs) AS larhrs\n FROM joblines l2\n WHERE + (l2.mod_lbr_ty = 'LAR'::text)\n GROUP BY l2.jobid) lar ON ((lar.jobid + = j.id)))\n LEFT JOIN ( SELECT l3.jobid,\n json_agg(l3.status) + AS partcount\n FROM joblines l3\n WHERE (l3.part_type IS + NOT NULL)\n GROUP BY l3.jobid) parts ON ((parts.jobid = j.id)))\n WHERE + (j.inproduction = true);" + type: run_sql +- args: + name: productionview + schema: public + type: add_existing_table_or_view diff --git a/hasura/migrations/1592417407401_create_relationship_bodyshop_public_table_productionview/down.yaml b/hasura/migrations/1592417407401_create_relationship_bodyshop_public_table_productionview/down.yaml new file mode 100644 index 000000000..c8bccabac --- /dev/null +++ b/hasura/migrations/1592417407401_create_relationship_bodyshop_public_table_productionview/down.yaml @@ -0,0 +1,6 @@ +- args: + relationship: bodyshop + table: + name: productionview + schema: public + type: drop_relationship diff --git a/hasura/migrations/1592417407401_create_relationship_bodyshop_public_table_productionview/up.yaml b/hasura/migrations/1592417407401_create_relationship_bodyshop_public_table_productionview/up.yaml new file mode 100644 index 000000000..b91854674 --- /dev/null +++ b/hasura/migrations/1592417407401_create_relationship_bodyshop_public_table_productionview/up.yaml @@ -0,0 +1,13 @@ +- args: + name: bodyshop + table: + name: productionview + schema: public + using: + manual_configuration: + column_mapping: + shopid: id + remote_table: + name: bodyshops + schema: public + type: create_object_relationship diff --git a/hasura/migrations/1592417440460_update_permission_user_public_table_productionview/down.yaml b/hasura/migrations/1592417440460_update_permission_user_public_table_productionview/down.yaml new file mode 100644 index 000000000..d2ca2e22f --- /dev/null +++ b/hasura/migrations/1592417440460_update_permission_user_public_table_productionview/down.yaml @@ -0,0 +1,6 @@ +- args: + role: user + table: + name: productionview + schema: public + type: drop_select_permission diff --git a/hasura/migrations/1592417440460_update_permission_user_public_table_productionview/up.yaml b/hasura/migrations/1592417440460_update_permission_user_public_table_productionview/up.yaml new file mode 100644 index 000000000..ad659002c --- /dev/null +++ b/hasura/migrations/1592417440460_update_permission_user_public_table_productionview/up.yaml @@ -0,0 +1,45 @@ +- args: + permission: + allow_aggregations: true + columns: + - id + - status + - ro_number + - est_number + - ownr_fn + - ownr_ln + - v_model_yr + - v_model_desc + - clm_no + - v_make_desc + - v_color + - plate_no + - actual_in + - scheduled_completion + - scheduled_delivery + - ins_co_nm + - clm_total + - ownr_ph1 + - special_coverage_policy + - production_vars + - labhrs + - larhrs + - shopid + - partcount + - kanbanparent + computed_fields: [] + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + limit: null + role: user + table: + name: productionview + schema: public + type: create_select_permission diff --git a/hasura/migrations/1592854595888_alter_table_public_bodyshops_add_column_ssbuckets/down.yaml b/hasura/migrations/1592854595888_alter_table_public_bodyshops_add_column_ssbuckets/down.yaml new file mode 100644 index 000000000..28d9bc4e7 --- /dev/null +++ b/hasura/migrations/1592854595888_alter_table_public_bodyshops_add_column_ssbuckets/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."bodyshops" DROP COLUMN "ssbuckets"; + type: run_sql diff --git a/hasura/migrations/1592854595888_alter_table_public_bodyshops_add_column_ssbuckets/up.yaml b/hasura/migrations/1592854595888_alter_table_public_bodyshops_add_column_ssbuckets/up.yaml new file mode 100644 index 000000000..d2bfbe5b2 --- /dev/null +++ b/hasura/migrations/1592854595888_alter_table_public_bodyshops_add_column_ssbuckets/up.yaml @@ -0,0 +1,6 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."bodyshops" ADD COLUMN "ssbuckets" jsonb NULL DEFAULT + jsonb_build_array(); + type: run_sql diff --git a/hasura/migrations/1592854609057_update_permission_user_public_table_bodyshops/down.yaml b/hasura/migrations/1592854609057_update_permission_user_public_table_bodyshops/down.yaml new file mode 100644 index 000000000..a412d8d21 --- /dev/null +++ b/hasura/migrations/1592854609057_update_permission_user_public_table_bodyshops/down.yaml @@ -0,0 +1,53 @@ +- args: + role: user + table: + name: bodyshops + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - accountingconfig + - address1 + - address2 + - appt_length + - city + - country + - created_at + - email + - federal_tax_id + - id + - inhousevendorid + - insurance_vendor_id + - intakechecklist + - invoice_tax_rates + - logo_img_path + - md_order_statuses + - md_responsibility_centers + - md_ro_statuses + - messagingservicesid + - production_config + - region_config + - shopname + - shoprates + - state + - state_tax_id + - stripe_acct_id + - template_header + - textid + - updated_at + - zip_post + computed_fields: [] + filter: + associations: + bodyshop: + associations: + user: + authid: + _eq: X-Hasura-User-Id + role: user + table: + name: bodyshops + schema: public + type: create_select_permission diff --git a/hasura/migrations/1592854609057_update_permission_user_public_table_bodyshops/up.yaml b/hasura/migrations/1592854609057_update_permission_user_public_table_bodyshops/up.yaml new file mode 100644 index 000000000..9b9cc2a17 --- /dev/null +++ b/hasura/migrations/1592854609057_update_permission_user_public_table_bodyshops/up.yaml @@ -0,0 +1,54 @@ +- args: + role: user + table: + name: bodyshops + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - accountingconfig + - address1 + - address2 + - appt_length + - city + - country + - created_at + - email + - federal_tax_id + - id + - inhousevendorid + - insurance_vendor_id + - intakechecklist + - invoice_tax_rates + - logo_img_path + - md_order_statuses + - md_responsibility_centers + - md_ro_statuses + - messagingservicesid + - production_config + - region_config + - shopname + - shoprates + - ssbuckets + - state + - state_tax_id + - stripe_acct_id + - template_header + - textid + - updated_at + - zip_post + computed_fields: [] + filter: + associations: + bodyshop: + associations: + user: + authid: + _eq: X-Hasura-User-Id + role: user + table: + name: bodyshops + schema: public + type: create_select_permission diff --git a/hasura/migrations/1593023670525_update_permission_user_public_table_bodyshops/down.yaml b/hasura/migrations/1593023670525_update_permission_user_public_table_bodyshops/down.yaml new file mode 100644 index 000000000..02ec31b86 --- /dev/null +++ b/hasura/migrations/1593023670525_update_permission_user_public_table_bodyshops/down.yaml @@ -0,0 +1,47 @@ +- args: + role: user + table: + name: bodyshops + schema: public + type: drop_update_permission +- args: + permission: + columns: + - accountingconfig + - address1 + - address2 + - appt_length + - city + - country + - created_at + - email + - federal_tax_id + - id + - inhousevendorid + - insurance_vendor_id + - intakechecklist + - invoice_tax_rates + - logo_img_path + - md_order_statuses + - md_responsibility_centers + - md_ro_statuses + - production_config + - shopname + - shoprates + - state + - state_tax_id + - updated_at + - zip_post + filter: + associations: + bodyshop: + associations: + user: + authid: + _eq: X-Hasura-User-Id + set: {} + role: user + table: + name: bodyshops + schema: public + type: create_update_permission diff --git a/hasura/migrations/1593023670525_update_permission_user_public_table_bodyshops/up.yaml b/hasura/migrations/1593023670525_update_permission_user_public_table_bodyshops/up.yaml new file mode 100644 index 000000000..96048ac73 --- /dev/null +++ b/hasura/migrations/1593023670525_update_permission_user_public_table_bodyshops/up.yaml @@ -0,0 +1,48 @@ +- args: + role: user + table: + name: bodyshops + schema: public + type: drop_update_permission +- args: + permission: + columns: + - accountingconfig + - address1 + - address2 + - appt_length + - city + - country + - created_at + - email + - federal_tax_id + - id + - inhousevendorid + - insurance_vendor_id + - intakechecklist + - invoice_tax_rates + - logo_img_path + - md_order_statuses + - md_responsibility_centers + - md_ro_statuses + - production_config + - shopname + - shoprates + - ssbuckets + - state + - state_tax_id + - updated_at + - zip_post + filter: + associations: + bodyshop: + associations: + user: + authid: + _eq: X-Hasura-User-Id + set: {} + role: user + table: + name: bodyshops + schema: public + type: create_update_permission diff --git a/hasura/migrations/1593106950595_alter_table_public_appointments_add_column_block/down.yaml b/hasura/migrations/1593106950595_alter_table_public_appointments_add_column_block/down.yaml new file mode 100644 index 000000000..73f6fb5e0 --- /dev/null +++ b/hasura/migrations/1593106950595_alter_table_public_appointments_add_column_block/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."appointments" DROP COLUMN "block"; + type: run_sql diff --git a/hasura/migrations/1593106950595_alter_table_public_appointments_add_column_block/up.yaml b/hasura/migrations/1593106950595_alter_table_public_appointments_add_column_block/up.yaml new file mode 100644 index 000000000..3daeb9e4c --- /dev/null +++ b/hasura/migrations/1593106950595_alter_table_public_appointments_add_column_block/up.yaml @@ -0,0 +1,6 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."appointments" ADD COLUMN "block" boolean NOT NULL DEFAULT + false; + type: run_sql diff --git a/hasura/migrations/1593106965112_update_permission_user_public_table_appointments/down.yaml b/hasura/migrations/1593106965112_update_permission_user_public_table_appointments/down.yaml new file mode 100644 index 000000000..7a8708e39 --- /dev/null +++ b/hasura/migrations/1593106965112_update_permission_user_public_table_appointments/down.yaml @@ -0,0 +1,35 @@ +- args: + role: user + table: + name: appointments + schema: public + type: drop_insert_permission +- args: + permission: + check: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - id + - created_at + - updated_at + - jobid + - start + - end + - canceled + - arrived + - isintake + - bodyshopid + - title + set: {} + role: user + table: + name: appointments + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1593106965112_update_permission_user_public_table_appointments/up.yaml b/hasura/migrations/1593106965112_update_permission_user_public_table_appointments/up.yaml new file mode 100644 index 000000000..395eb2282 --- /dev/null +++ b/hasura/migrations/1593106965112_update_permission_user_public_table_appointments/up.yaml @@ -0,0 +1,36 @@ +- args: + role: user + table: + name: appointments + schema: public + type: drop_insert_permission +- args: + permission: + check: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - arrived + - block + - bodyshopid + - canceled + - created_at + - end + - id + - isintake + - jobid + - start + - title + - updated_at + set: {} + role: user + table: + name: appointments + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1593106971803_update_permission_user_public_table_appointments/down.yaml b/hasura/migrations/1593106971803_update_permission_user_public_table_appointments/down.yaml new file mode 100644 index 000000000..1c74631cf --- /dev/null +++ b/hasura/migrations/1593106971803_update_permission_user_public_table_appointments/down.yaml @@ -0,0 +1,36 @@ +- args: + role: user + table: + name: appointments + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: true + columns: + - arrived + - canceled + - isintake + - title + - created_at + - end + - start + - updated_at + - bodyshopid + - id + - jobid + computed_fields: [] + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: appointments + schema: public + type: create_select_permission diff --git a/hasura/migrations/1593106971803_update_permission_user_public_table_appointments/up.yaml b/hasura/migrations/1593106971803_update_permission_user_public_table_appointments/up.yaml new file mode 100644 index 000000000..493ba4dcc --- /dev/null +++ b/hasura/migrations/1593106971803_update_permission_user_public_table_appointments/up.yaml @@ -0,0 +1,37 @@ +- args: + role: user + table: + name: appointments + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: true + columns: + - arrived + - block + - bodyshopid + - canceled + - created_at + - end + - id + - isintake + - jobid + - start + - title + - updated_at + computed_fields: [] + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: appointments + schema: public + type: create_select_permission diff --git a/hasura/migrations/1593106978517_update_permission_user_public_table_appointments/down.yaml b/hasura/migrations/1593106978517_update_permission_user_public_table_appointments/down.yaml new file mode 100644 index 000000000..4738d5505 --- /dev/null +++ b/hasura/migrations/1593106978517_update_permission_user_public_table_appointments/down.yaml @@ -0,0 +1,35 @@ +- args: + role: user + table: + name: appointments + schema: public + type: drop_update_permission +- args: + permission: + columns: + - arrived + - canceled + - isintake + - title + - created_at + - end + - start + - updated_at + - bodyshopid + - id + - jobid + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + set: {} + role: user + table: + name: appointments + schema: public + type: create_update_permission diff --git a/hasura/migrations/1593106978517_update_permission_user_public_table_appointments/up.yaml b/hasura/migrations/1593106978517_update_permission_user_public_table_appointments/up.yaml new file mode 100644 index 000000000..ceb8763aa --- /dev/null +++ b/hasura/migrations/1593106978517_update_permission_user_public_table_appointments/up.yaml @@ -0,0 +1,36 @@ +- args: + role: user + table: + name: appointments + schema: public + type: drop_update_permission +- args: + permission: + columns: + - arrived + - block + - bodyshopid + - canceled + - created_at + - end + - id + - isintake + - jobid + - start + - title + - updated_at + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + set: {} + role: user + table: + name: appointments + schema: public + type: create_update_permission diff --git a/hasura/migrations/1593188899179_create_table_public_scoreboard/down.yaml b/hasura/migrations/1593188899179_create_table_public_scoreboard/down.yaml new file mode 100644 index 000000000..1f687f33a --- /dev/null +++ b/hasura/migrations/1593188899179_create_table_public_scoreboard/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: DROP TABLE "public"."scoreboard"; + type: run_sql diff --git a/hasura/migrations/1593188899179_create_table_public_scoreboard/up.yaml b/hasura/migrations/1593188899179_create_table_public_scoreboard/up.yaml new file mode 100644 index 000000000..632fd67db --- /dev/null +++ b/hasura/migrations/1593188899179_create_table_public_scoreboard/up.yaml @@ -0,0 +1,18 @@ +- args: + cascade: false + read_only: false + sql: CREATE EXTENSION IF NOT EXISTS pgcrypto; + type: run_sql +- args: + cascade: false + read_only: false + sql: CREATE TABLE "public"."scoreboard"("id" uuid NOT NULL DEFAULT gen_random_uuid(), + "jobid" uuid NOT NULL, "painthrs" numeric NOT NULL DEFAULT 0, "bodyhrs" numeric + NOT NULL DEFAULT 0, "date" date NOT NULL DEFAULT now(), PRIMARY KEY ("id") , + FOREIGN KEY ("jobid") REFERENCES "public"."jobs"("id") ON UPDATE cascade ON + DELETE cascade); + type: run_sql +- args: + name: scoreboard + schema: public + type: add_existing_table_or_view diff --git a/hasura/migrations/1593188907600_track_all_relationships/down.yaml b/hasura/migrations/1593188907600_track_all_relationships/down.yaml new file mode 100644 index 000000000..96d2abf1a --- /dev/null +++ b/hasura/migrations/1593188907600_track_all_relationships/down.yaml @@ -0,0 +1,12 @@ +- args: + relationship: scoreboards + table: + name: jobs + schema: public + type: drop_relationship +- args: + relationship: job + table: + name: scoreboard + schema: public + type: drop_relationship diff --git a/hasura/migrations/1593188907600_track_all_relationships/up.yaml b/hasura/migrations/1593188907600_track_all_relationships/up.yaml new file mode 100644 index 000000000..c52da5195 --- /dev/null +++ b/hasura/migrations/1593188907600_track_all_relationships/up.yaml @@ -0,0 +1,20 @@ +- args: + name: scoreboards + table: + name: jobs + schema: public + using: + foreign_key_constraint_on: + column: jobid + table: + name: scoreboard + schema: public + type: create_array_relationship +- args: + name: job + table: + name: scoreboard + schema: public + using: + foreign_key_constraint_on: jobid + type: create_object_relationship diff --git a/hasura/migrations/1593189016662_update_permission_user_public_table_scoreboard/down.yaml b/hasura/migrations/1593189016662_update_permission_user_public_table_scoreboard/down.yaml new file mode 100644 index 000000000..82df32845 --- /dev/null +++ b/hasura/migrations/1593189016662_update_permission_user_public_table_scoreboard/down.yaml @@ -0,0 +1,6 @@ +- args: + role: user + table: + name: scoreboard + schema: public + type: drop_insert_permission diff --git a/hasura/migrations/1593189016662_update_permission_user_public_table_scoreboard/up.yaml b/hasura/migrations/1593189016662_update_permission_user_public_table_scoreboard/up.yaml new file mode 100644 index 000000000..2c510729e --- /dev/null +++ b/hasura/migrations/1593189016662_update_permission_user_public_table_scoreboard/up.yaml @@ -0,0 +1,26 @@ +- args: + permission: + allow_upsert: true + backend_only: false + check: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - id + - jobid + - painthrs + - bodyhrs + - date + set: {} + role: user + table: + name: scoreboard + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1593189027209_update_permission_user_public_table_scoreboard/down.yaml b/hasura/migrations/1593189027209_update_permission_user_public_table_scoreboard/down.yaml new file mode 100644 index 000000000..c8cb9c8be --- /dev/null +++ b/hasura/migrations/1593189027209_update_permission_user_public_table_scoreboard/down.yaml @@ -0,0 +1,6 @@ +- args: + role: user + table: + name: scoreboard + schema: public + type: drop_select_permission diff --git a/hasura/migrations/1593189027209_update_permission_user_public_table_scoreboard/up.yaml b/hasura/migrations/1593189027209_update_permission_user_public_table_scoreboard/up.yaml new file mode 100644 index 000000000..2a83db4ed --- /dev/null +++ b/hasura/migrations/1593189027209_update_permission_user_public_table_scoreboard/up.yaml @@ -0,0 +1,27 @@ +- args: + permission: + allow_aggregations: true + backend_only: false + columns: + - date + - bodyhrs + - painthrs + - id + - jobid + computed_fields: [] + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + limit: null + role: user + table: + name: scoreboard + schema: public + type: create_select_permission diff --git a/hasura/migrations/1593189034065_update_permission_user_public_table_scoreboard/down.yaml b/hasura/migrations/1593189034065_update_permission_user_public_table_scoreboard/down.yaml new file mode 100644 index 000000000..db151710e --- /dev/null +++ b/hasura/migrations/1593189034065_update_permission_user_public_table_scoreboard/down.yaml @@ -0,0 +1,6 @@ +- args: + role: user + table: + name: scoreboard + schema: public + type: drop_update_permission diff --git a/hasura/migrations/1593189034065_update_permission_user_public_table_scoreboard/up.yaml b/hasura/migrations/1593189034065_update_permission_user_public_table_scoreboard/up.yaml new file mode 100644 index 000000000..6228c75ad --- /dev/null +++ b/hasura/migrations/1593189034065_update_permission_user_public_table_scoreboard/up.yaml @@ -0,0 +1,25 @@ +- args: + permission: + backend_only: false + columns: + - date + - bodyhrs + - painthrs + - id + - jobid + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + set: {} + role: user + table: + name: scoreboard + schema: public + type: create_update_permission diff --git a/hasura/migrations/1593189042050_update_permission_user_public_table_scoreboard/down.yaml b/hasura/migrations/1593189042050_update_permission_user_public_table_scoreboard/down.yaml new file mode 100644 index 000000000..ed7f1ec9a --- /dev/null +++ b/hasura/migrations/1593189042050_update_permission_user_public_table_scoreboard/down.yaml @@ -0,0 +1,6 @@ +- args: + role: user + table: + name: scoreboard + schema: public + type: drop_delete_permission diff --git a/hasura/migrations/1593189042050_update_permission_user_public_table_scoreboard/up.yaml b/hasura/migrations/1593189042050_update_permission_user_public_table_scoreboard/up.yaml new file mode 100644 index 000000000..7a0786450 --- /dev/null +++ b/hasura/migrations/1593189042050_update_permission_user_public_table_scoreboard/up.yaml @@ -0,0 +1,18 @@ +- args: + permission: + backend_only: false + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: scoreboard + schema: public + type: create_delete_permission diff --git a/hasura/migrations/1593189072315_alter_table_public_bodyshops_add_column_scoreboard_target/down.yaml b/hasura/migrations/1593189072315_alter_table_public_bodyshops_add_column_scoreboard_target/down.yaml new file mode 100644 index 000000000..35cb79218 --- /dev/null +++ b/hasura/migrations/1593189072315_alter_table_public_bodyshops_add_column_scoreboard_target/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."bodyshops" DROP COLUMN "scoreboard_target"; + type: run_sql diff --git a/hasura/migrations/1593189072315_alter_table_public_bodyshops_add_column_scoreboard_target/up.yaml b/hasura/migrations/1593189072315_alter_table_public_bodyshops_add_column_scoreboard_target/up.yaml new file mode 100644 index 000000000..e448b94ad --- /dev/null +++ b/hasura/migrations/1593189072315_alter_table_public_bodyshops_add_column_scoreboard_target/up.yaml @@ -0,0 +1,6 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."bodyshops" ADD COLUMN "scoreboard_target" jsonb NULL + DEFAULT jsonb_build_object(); + type: run_sql diff --git a/hasura/migrations/1593189083426_update_permission_user_public_table_bodyshops/down.yaml b/hasura/migrations/1593189083426_update_permission_user_public_table_bodyshops/down.yaml new file mode 100644 index 000000000..9b9cc2a17 --- /dev/null +++ b/hasura/migrations/1593189083426_update_permission_user_public_table_bodyshops/down.yaml @@ -0,0 +1,54 @@ +- args: + role: user + table: + name: bodyshops + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - accountingconfig + - address1 + - address2 + - appt_length + - city + - country + - created_at + - email + - federal_tax_id + - id + - inhousevendorid + - insurance_vendor_id + - intakechecklist + - invoice_tax_rates + - logo_img_path + - md_order_statuses + - md_responsibility_centers + - md_ro_statuses + - messagingservicesid + - production_config + - region_config + - shopname + - shoprates + - ssbuckets + - state + - state_tax_id + - stripe_acct_id + - template_header + - textid + - updated_at + - zip_post + computed_fields: [] + filter: + associations: + bodyshop: + associations: + user: + authid: + _eq: X-Hasura-User-Id + role: user + table: + name: bodyshops + schema: public + type: create_select_permission diff --git a/hasura/migrations/1593189083426_update_permission_user_public_table_bodyshops/up.yaml b/hasura/migrations/1593189083426_update_permission_user_public_table_bodyshops/up.yaml new file mode 100644 index 000000000..2ec6f434e --- /dev/null +++ b/hasura/migrations/1593189083426_update_permission_user_public_table_bodyshops/up.yaml @@ -0,0 +1,55 @@ +- args: + role: user + table: + name: bodyshops + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - accountingconfig + - address1 + - address2 + - appt_length + - city + - country + - created_at + - email + - federal_tax_id + - id + - inhousevendorid + - insurance_vendor_id + - intakechecklist + - invoice_tax_rates + - logo_img_path + - md_order_statuses + - md_responsibility_centers + - md_ro_statuses + - messagingservicesid + - production_config + - region_config + - scoreboard_target + - shopname + - shoprates + - ssbuckets + - state + - state_tax_id + - stripe_acct_id + - template_header + - textid + - updated_at + - zip_post + computed_fields: [] + filter: + associations: + bodyshop: + associations: + user: + authid: + _eq: X-Hasura-User-Id + role: user + table: + name: bodyshops + schema: public + type: create_select_permission diff --git a/hasura/migrations/1593189089211_update_permission_user_public_table_bodyshops/down.yaml b/hasura/migrations/1593189089211_update_permission_user_public_table_bodyshops/down.yaml new file mode 100644 index 000000000..96048ac73 --- /dev/null +++ b/hasura/migrations/1593189089211_update_permission_user_public_table_bodyshops/down.yaml @@ -0,0 +1,48 @@ +- args: + role: user + table: + name: bodyshops + schema: public + type: drop_update_permission +- args: + permission: + columns: + - accountingconfig + - address1 + - address2 + - appt_length + - city + - country + - created_at + - email + - federal_tax_id + - id + - inhousevendorid + - insurance_vendor_id + - intakechecklist + - invoice_tax_rates + - logo_img_path + - md_order_statuses + - md_responsibility_centers + - md_ro_statuses + - production_config + - shopname + - shoprates + - ssbuckets + - state + - state_tax_id + - updated_at + - zip_post + filter: + associations: + bodyshop: + associations: + user: + authid: + _eq: X-Hasura-User-Id + set: {} + role: user + table: + name: bodyshops + schema: public + type: create_update_permission diff --git a/hasura/migrations/1593189089211_update_permission_user_public_table_bodyshops/up.yaml b/hasura/migrations/1593189089211_update_permission_user_public_table_bodyshops/up.yaml new file mode 100644 index 000000000..1466f0a71 --- /dev/null +++ b/hasura/migrations/1593189089211_update_permission_user_public_table_bodyshops/up.yaml @@ -0,0 +1,49 @@ +- args: + role: user + table: + name: bodyshops + schema: public + type: drop_update_permission +- args: + permission: + columns: + - accountingconfig + - address1 + - address2 + - appt_length + - city + - country + - created_at + - email + - federal_tax_id + - id + - inhousevendorid + - insurance_vendor_id + - intakechecklist + - invoice_tax_rates + - logo_img_path + - md_order_statuses + - md_responsibility_centers + - md_ro_statuses + - production_config + - scoreboard_target + - shopname + - shoprates + - ssbuckets + - state + - state_tax_id + - updated_at + - zip_post + filter: + associations: + bodyshop: + associations: + user: + authid: + _eq: X-Hasura-User-Id + set: {} + role: user + table: + name: bodyshops + schema: public + type: create_update_permission diff --git a/hasura/migrations/1593465273548_alter_table_public_employees_add_column_pin/down.yaml b/hasura/migrations/1593465273548_alter_table_public_employees_add_column_pin/down.yaml new file mode 100644 index 000000000..76357445a --- /dev/null +++ b/hasura/migrations/1593465273548_alter_table_public_employees_add_column_pin/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."employees" DROP COLUMN "pin"; + type: run_sql diff --git a/hasura/migrations/1593465273548_alter_table_public_employees_add_column_pin/up.yaml b/hasura/migrations/1593465273548_alter_table_public_employees_add_column_pin/up.yaml new file mode 100644 index 000000000..17bc8f222 --- /dev/null +++ b/hasura/migrations/1593465273548_alter_table_public_employees_add_column_pin/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."employees" ADD COLUMN "pin" text NULL; + type: run_sql diff --git a/hasura/migrations/1593465285886_update_permission_user_public_table_employees/down.yaml b/hasura/migrations/1593465285886_update_permission_user_public_table_employees/down.yaml new file mode 100644 index 000000000..23e873812 --- /dev/null +++ b/hasura/migrations/1593465285886_update_permission_user_public_table_employees/down.yaml @@ -0,0 +1,37 @@ +- args: + role: user + table: + name: employees + schema: public + type: drop_insert_permission +- args: + permission: + check: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - id + - created_at + - updated_at + - first_name + - last_name + - employee_number + - shopid + - active + - hire_date + - termination_date + - base_rate + - cost_center + - flat_rate + set: {} + role: user + table: + name: employees + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1593465285886_update_permission_user_public_table_employees/up.yaml b/hasura/migrations/1593465285886_update_permission_user_public_table_employees/up.yaml new file mode 100644 index 000000000..87a93588c --- /dev/null +++ b/hasura/migrations/1593465285886_update_permission_user_public_table_employees/up.yaml @@ -0,0 +1,38 @@ +- args: + role: user + table: + name: employees + schema: public + type: drop_insert_permission +- args: + permission: + check: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - active + - base_rate + - cost_center + - created_at + - employee_number + - first_name + - flat_rate + - hire_date + - id + - last_name + - pin + - shopid + - termination_date + - updated_at + set: {} + role: user + table: + name: employees + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1593465298025_update_permission_user_public_table_employees/down.yaml b/hasura/migrations/1593465298025_update_permission_user_public_table_employees/down.yaml new file mode 100644 index 000000000..5e0722baa --- /dev/null +++ b/hasura/migrations/1593465298025_update_permission_user_public_table_employees/down.yaml @@ -0,0 +1,37 @@ +- args: + role: user + table: + name: employees + schema: public + type: drop_update_permission +- args: + permission: + columns: + - active + - flat_rate + - hire_date + - termination_date + - base_rate + - cost_center + - employee_number + - first_name + - last_name + - created_at + - updated_at + - id + - shopid + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + set: {} + role: user + table: + name: employees + schema: public + type: create_update_permission diff --git a/hasura/migrations/1593465298025_update_permission_user_public_table_employees/up.yaml b/hasura/migrations/1593465298025_update_permission_user_public_table_employees/up.yaml new file mode 100644 index 000000000..cd16e8032 --- /dev/null +++ b/hasura/migrations/1593465298025_update_permission_user_public_table_employees/up.yaml @@ -0,0 +1,38 @@ +- args: + role: user + table: + name: employees + schema: public + type: drop_update_permission +- args: + permission: + columns: + - active + - base_rate + - cost_center + - created_at + - employee_number + - first_name + - flat_rate + - hire_date + - id + - last_name + - pin + - shopid + - termination_date + - updated_at + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + set: {} + role: user + table: + name: employees + schema: public + type: create_update_permission diff --git a/hasura/migrations/1593465305783_update_permission_user_public_table_employees/down.yaml b/hasura/migrations/1593465305783_update_permission_user_public_table_employees/down.yaml new file mode 100644 index 000000000..56719d451 --- /dev/null +++ b/hasura/migrations/1593465305783_update_permission_user_public_table_employees/down.yaml @@ -0,0 +1,38 @@ +- args: + role: user + table: + name: employees + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - active + - flat_rate + - hire_date + - termination_date + - base_rate + - cost_center + - employee_number + - first_name + - last_name + - created_at + - updated_at + - id + - shopid + computed_fields: [] + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: employees + schema: public + type: create_select_permission diff --git a/hasura/migrations/1593465305783_update_permission_user_public_table_employees/up.yaml b/hasura/migrations/1593465305783_update_permission_user_public_table_employees/up.yaml new file mode 100644 index 000000000..3c4900c14 --- /dev/null +++ b/hasura/migrations/1593465305783_update_permission_user_public_table_employees/up.yaml @@ -0,0 +1,39 @@ +- args: + role: user + table: + name: employees + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - active + - base_rate + - cost_center + - created_at + - employee_number + - first_name + - flat_rate + - hire_date + - id + - last_name + - pin + - shopid + - termination_date + - updated_at + computed_fields: [] + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: employees + schema: public + type: create_select_permission diff --git a/hasura/migrations/1593558171467_alter_table_public_payments_add_column_type/down.yaml b/hasura/migrations/1593558171467_alter_table_public_payments_add_column_type/down.yaml new file mode 100644 index 000000000..690192386 --- /dev/null +++ b/hasura/migrations/1593558171467_alter_table_public_payments_add_column_type/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."payments" DROP COLUMN "type"; + type: run_sql diff --git a/hasura/migrations/1593558171467_alter_table_public_payments_add_column_type/up.yaml b/hasura/migrations/1593558171467_alter_table_public_payments_add_column_type/up.yaml new file mode 100644 index 000000000..061b0765f --- /dev/null +++ b/hasura/migrations/1593558171467_alter_table_public_payments_add_column_type/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."payments" ADD COLUMN "type" text NULL; + type: run_sql diff --git a/hasura/migrations/1593558184193_update_permission_user_public_table_payments/down.yaml b/hasura/migrations/1593558184193_update_permission_user_public_table_payments/down.yaml new file mode 100644 index 000000000..c717f4391 --- /dev/null +++ b/hasura/migrations/1593558184193_update_permission_user_public_table_payments/down.yaml @@ -0,0 +1,35 @@ +- args: + role: user + table: + name: payments + schema: public + type: drop_insert_permission +- args: + permission: + check: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - amount + - created_at + - exportedat + - id + - jobid + - memo + - payer + - stripeid + - transactionid + - updated_at + set: {} + role: user + table: + name: payments + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1593558184193_update_permission_user_public_table_payments/up.yaml b/hasura/migrations/1593558184193_update_permission_user_public_table_payments/up.yaml new file mode 100644 index 000000000..d048afd30 --- /dev/null +++ b/hasura/migrations/1593558184193_update_permission_user_public_table_payments/up.yaml @@ -0,0 +1,36 @@ +- args: + role: user + table: + name: payments + schema: public + type: drop_insert_permission +- args: + permission: + check: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - amount + - created_at + - exportedat + - id + - jobid + - memo + - payer + - stripeid + - transactionid + - type + - updated_at + set: {} + role: user + table: + name: payments + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1593558194216_update_permission_user_public_table_payments/down.yaml b/hasura/migrations/1593558194216_update_permission_user_public_table_payments/down.yaml new file mode 100644 index 000000000..7e84bd349 --- /dev/null +++ b/hasura/migrations/1593558194216_update_permission_user_public_table_payments/down.yaml @@ -0,0 +1,35 @@ +- args: + role: user + table: + name: payments + schema: public + type: drop_update_permission +- args: + permission: + columns: + - amount + - created_at + - exportedat + - id + - jobid + - memo + - payer + - stripeid + - transactionid + - updated_at + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + set: {} + role: user + table: + name: payments + schema: public + type: create_update_permission diff --git a/hasura/migrations/1593558194216_update_permission_user_public_table_payments/up.yaml b/hasura/migrations/1593558194216_update_permission_user_public_table_payments/up.yaml new file mode 100644 index 000000000..ffba0de91 --- /dev/null +++ b/hasura/migrations/1593558194216_update_permission_user_public_table_payments/up.yaml @@ -0,0 +1,36 @@ +- args: + role: user + table: + name: payments + schema: public + type: drop_update_permission +- args: + permission: + columns: + - amount + - created_at + - exportedat + - id + - jobid + - memo + - payer + - stripeid + - transactionid + - type + - updated_at + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + set: {} + role: user + table: + name: payments + schema: public + type: create_update_permission diff --git a/hasura/migrations/1593808978924_alter_table_public_timetickets_alter_column_ciecacode/down.yaml b/hasura/migrations/1593808978924_alter_table_public_timetickets_alter_column_ciecacode/down.yaml new file mode 100644 index 000000000..322274d86 --- /dev/null +++ b/hasura/migrations/1593808978924_alter_table_public_timetickets_alter_column_ciecacode/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."timetickets" ALTER COLUMN "ciecacode" SET NOT NULL; + type: run_sql diff --git a/hasura/migrations/1593808978924_alter_table_public_timetickets_alter_column_ciecacode/up.yaml b/hasura/migrations/1593808978924_alter_table_public_timetickets_alter_column_ciecacode/up.yaml new file mode 100644 index 000000000..3e153375e --- /dev/null +++ b/hasura/migrations/1593808978924_alter_table_public_timetickets_alter_column_ciecacode/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."timetickets" ALTER COLUMN "ciecacode" DROP NOT NULL; + type: run_sql diff --git a/hasura/migrations/1593808998661_alter_table_public_timetickets_alter_column_jobid/down.yaml b/hasura/migrations/1593808998661_alter_table_public_timetickets_alter_column_jobid/down.yaml new file mode 100644 index 000000000..78ed45603 --- /dev/null +++ b/hasura/migrations/1593808998661_alter_table_public_timetickets_alter_column_jobid/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."timetickets" ALTER COLUMN "jobid" SET NOT NULL; + type: run_sql diff --git a/hasura/migrations/1593808998661_alter_table_public_timetickets_alter_column_jobid/up.yaml b/hasura/migrations/1593808998661_alter_table_public_timetickets_alter_column_jobid/up.yaml new file mode 100644 index 000000000..be9cca82a --- /dev/null +++ b/hasura/migrations/1593808998661_alter_table_public_timetickets_alter_column_jobid/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."timetickets" ALTER COLUMN "jobid" DROP NOT NULL; + type: run_sql diff --git a/hasura/migrations/1594659447638_alter_table_public_bodyshops_add_column_md_referral_sources/down.yaml b/hasura/migrations/1594659447638_alter_table_public_bodyshops_add_column_md_referral_sources/down.yaml new file mode 100644 index 000000000..f79d49113 --- /dev/null +++ b/hasura/migrations/1594659447638_alter_table_public_bodyshops_add_column_md_referral_sources/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."bodyshops" DROP COLUMN "md_referral_sources"; + type: run_sql diff --git a/hasura/migrations/1594659447638_alter_table_public_bodyshops_add_column_md_referral_sources/up.yaml b/hasura/migrations/1594659447638_alter_table_public_bodyshops_add_column_md_referral_sources/up.yaml new file mode 100644 index 000000000..fb4e12981 --- /dev/null +++ b/hasura/migrations/1594659447638_alter_table_public_bodyshops_add_column_md_referral_sources/up.yaml @@ -0,0 +1,6 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."bodyshops" ADD COLUMN "md_referral_sources" jsonb NOT + NULL DEFAULT jsonb_build_array(); + type: run_sql diff --git a/hasura/migrations/1594659481096_update_permission_user_public_table_bodyshops/down.yaml b/hasura/migrations/1594659481096_update_permission_user_public_table_bodyshops/down.yaml new file mode 100644 index 000000000..2ec6f434e --- /dev/null +++ b/hasura/migrations/1594659481096_update_permission_user_public_table_bodyshops/down.yaml @@ -0,0 +1,55 @@ +- args: + role: user + table: + name: bodyshops + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - accountingconfig + - address1 + - address2 + - appt_length + - city + - country + - created_at + - email + - federal_tax_id + - id + - inhousevendorid + - insurance_vendor_id + - intakechecklist + - invoice_tax_rates + - logo_img_path + - md_order_statuses + - md_responsibility_centers + - md_ro_statuses + - messagingservicesid + - production_config + - region_config + - scoreboard_target + - shopname + - shoprates + - ssbuckets + - state + - state_tax_id + - stripe_acct_id + - template_header + - textid + - updated_at + - zip_post + computed_fields: [] + filter: + associations: + bodyshop: + associations: + user: + authid: + _eq: X-Hasura-User-Id + role: user + table: + name: bodyshops + schema: public + type: create_select_permission diff --git a/hasura/migrations/1594659481096_update_permission_user_public_table_bodyshops/up.yaml b/hasura/migrations/1594659481096_update_permission_user_public_table_bodyshops/up.yaml new file mode 100644 index 000000000..a356f7c0d --- /dev/null +++ b/hasura/migrations/1594659481096_update_permission_user_public_table_bodyshops/up.yaml @@ -0,0 +1,56 @@ +- args: + role: user + table: + name: bodyshops + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - accountingconfig + - address1 + - address2 + - appt_length + - city + - country + - created_at + - email + - federal_tax_id + - id + - inhousevendorid + - insurance_vendor_id + - intakechecklist + - invoice_tax_rates + - logo_img_path + - md_order_statuses + - md_referral_sources + - md_responsibility_centers + - md_ro_statuses + - messagingservicesid + - production_config + - region_config + - scoreboard_target + - shopname + - shoprates + - ssbuckets + - state + - state_tax_id + - stripe_acct_id + - template_header + - textid + - updated_at + - zip_post + computed_fields: [] + filter: + associations: + bodyshop: + associations: + user: + authid: + _eq: X-Hasura-User-Id + role: user + table: + name: bodyshops + schema: public + type: create_select_permission diff --git a/hasura/migrations/1594659492762_update_permission_user_public_table_bodyshops/down.yaml b/hasura/migrations/1594659492762_update_permission_user_public_table_bodyshops/down.yaml new file mode 100644 index 000000000..1466f0a71 --- /dev/null +++ b/hasura/migrations/1594659492762_update_permission_user_public_table_bodyshops/down.yaml @@ -0,0 +1,49 @@ +- args: + role: user + table: + name: bodyshops + schema: public + type: drop_update_permission +- args: + permission: + columns: + - accountingconfig + - address1 + - address2 + - appt_length + - city + - country + - created_at + - email + - federal_tax_id + - id + - inhousevendorid + - insurance_vendor_id + - intakechecklist + - invoice_tax_rates + - logo_img_path + - md_order_statuses + - md_responsibility_centers + - md_ro_statuses + - production_config + - scoreboard_target + - shopname + - shoprates + - ssbuckets + - state + - state_tax_id + - updated_at + - zip_post + filter: + associations: + bodyshop: + associations: + user: + authid: + _eq: X-Hasura-User-Id + set: {} + role: user + table: + name: bodyshops + schema: public + type: create_update_permission diff --git a/hasura/migrations/1594659492762_update_permission_user_public_table_bodyshops/up.yaml b/hasura/migrations/1594659492762_update_permission_user_public_table_bodyshops/up.yaml new file mode 100644 index 000000000..e3ade79e8 --- /dev/null +++ b/hasura/migrations/1594659492762_update_permission_user_public_table_bodyshops/up.yaml @@ -0,0 +1,50 @@ +- args: + role: user + table: + name: bodyshops + schema: public + type: drop_update_permission +- args: + permission: + columns: + - accountingconfig + - address1 + - address2 + - appt_length + - city + - country + - created_at + - email + - federal_tax_id + - id + - inhousevendorid + - insurance_vendor_id + - intakechecklist + - invoice_tax_rates + - logo_img_path + - md_order_statuses + - md_referral_sources + - md_responsibility_centers + - md_ro_statuses + - production_config + - scoreboard_target + - shopname + - shoprates + - ssbuckets + - state + - state_tax_id + - updated_at + - zip_post + filter: + associations: + bodyshop: + associations: + user: + authid: + _eq: X-Hasura-User-Id + set: {} + role: user + table: + name: bodyshops + schema: public + type: create_update_permission diff --git a/hasura/migrations/1594680139254_run_sql_migration/down.yaml b/hasura/migrations/1594680139254_run_sql_migration/down.yaml new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/hasura/migrations/1594680139254_run_sql_migration/down.yaml @@ -0,0 +1 @@ +[] diff --git a/hasura/migrations/1594680139254_run_sql_migration/up.yaml b/hasura/migrations/1594680139254_run_sql_migration/up.yaml new file mode 100644 index 000000000..6c88b4996 --- /dev/null +++ b/hasura/migrations/1594680139254_run_sql_migration/up.yaml @@ -0,0 +1,7 @@ +- args: + cascade: true + read_only: false + sql: |- + CREATE INDEX idx_vehicles_vin ON vehicles USING GIN (v_vin gin_trgm_ops); + CREATE INDEX idx_vehicles_plateno ON vehicles USING GIN (plate_no gin_trgm_ops); + type: run_sql diff --git a/hasura/migrations/1594680221027_run_sql_migration/down.yaml b/hasura/migrations/1594680221027_run_sql_migration/down.yaml new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/hasura/migrations/1594680221027_run_sql_migration/down.yaml @@ -0,0 +1 @@ +[] diff --git a/hasura/migrations/1594680221027_run_sql_migration/up.yaml b/hasura/migrations/1594680221027_run_sql_migration/up.yaml new file mode 100644 index 000000000..0750cc6cf --- /dev/null +++ b/hasura/migrations/1594680221027_run_sql_migration/up.yaml @@ -0,0 +1,13 @@ +- args: + cascade: true + read_only: false + sql: "CREATE OR REPLACE FUNCTION public.search_vehicles(search text)\n RETURNS + SETOF vehicles\n LANGUAGE plpgsql\n STABLE\nAS $function$\n\nBEGIN\n if search + = '' then\n return query select * from vehicles ;\n else \n return query + SELECT\n *\nFROM\n vehicles\nWHERE\n search <% (v_vin) OR\n search <% (plate_no);\n + \ end if;\n\n\tEND\n$function$;" + type: run_sql +- args: + name: search_vehicles + schema: public + type: track_function diff --git a/hasura/migrations/1594680369038_update_permission_user_public_table_vehicles/down.yaml b/hasura/migrations/1594680369038_update_permission_user_public_table_vehicles/down.yaml new file mode 100644 index 000000000..bec9ebae2 --- /dev/null +++ b/hasura/migrations/1594680369038_update_permission_user_public_table_vehicles/down.yaml @@ -0,0 +1,50 @@ +- args: + role: user + table: + name: vehicles + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - v_paint_codes + - db_v_code + - plate_no + - plate_st + - trim_color + - v_bstyle + - v_color + - v_cond + - v_engine + - v_makecode + - v_make_desc + - v_mldgcode + - v_model_desc + - v_model_yr + - v_options + - v_prod_dt + - v_stage + - v_tone + - v_trimcode + - v_type + - v_vin + - created_at + - updated_at + - id + - shopid + computed_fields: [] + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: vehicles + schema: public + type: create_select_permission diff --git a/hasura/migrations/1594680369038_update_permission_user_public_table_vehicles/up.yaml b/hasura/migrations/1594680369038_update_permission_user_public_table_vehicles/up.yaml new file mode 100644 index 000000000..47038ddc5 --- /dev/null +++ b/hasura/migrations/1594680369038_update_permission_user_public_table_vehicles/up.yaml @@ -0,0 +1,50 @@ +- args: + role: user + table: + name: vehicles + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: true + columns: + - v_paint_codes + - db_v_code + - plate_no + - plate_st + - trim_color + - v_bstyle + - v_color + - v_cond + - v_engine + - v_makecode + - v_make_desc + - v_mldgcode + - v_model_desc + - v_model_yr + - v_options + - v_prod_dt + - v_stage + - v_tone + - v_trimcode + - v_type + - v_vin + - created_at + - updated_at + - id + - shopid + computed_fields: [] + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: vehicles + schema: public + type: create_select_permission diff --git a/hasura/migrations/1594681018728_run_sql_migration/down.yaml b/hasura/migrations/1594681018728_run_sql_migration/down.yaml new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/hasura/migrations/1594681018728_run_sql_migration/down.yaml @@ -0,0 +1 @@ +[] diff --git a/hasura/migrations/1594681018728_run_sql_migration/up.yaml b/hasura/migrations/1594681018728_run_sql_migration/up.yaml new file mode 100644 index 000000000..091b48e2a --- /dev/null +++ b/hasura/migrations/1594681018728_run_sql_migration/up.yaml @@ -0,0 +1,19 @@ +- args: + cascade: true + read_only: false + sql: "CREATE INDEX idx_owners_ownr_fn ON owners USING GIN (ownr_fn gin_trgm_ops);\nCREATE + INDEX idx_owners_ownr_ln ON owners USING GIN (ownr_ln gin_trgm_ops);\nCREATE + INDEX idx_owners_ownr_co_nm ON owners USING GIN (ownr_co_nm gin_trgm_ops);\nCREATE + INDEX idx_owners_ownr_ph1 ON owners USING GIN (ownr_ph1 gin_trgm_ops);\nCREATE + INDEX idx_owners_ownr_addr1 ON owners USING GIN (ownr_addr1 gin_trgm_ops);\n\n\nCREATE + OR REPLACE FUNCTION public.search_owners(search text)\n RETURNS SETOF owners\n + LANGUAGE plpgsql\n STABLE\nAS $function$\n\nBEGIN\n if search = '' then\n return + query select * from owners ;\n else \n return query SELECT\n *\nFROM\n + \ owners\nWHERE\n search <% (ownr_fn) OR\n search <% (ownr_ln) OR\n search + <% (ownr_co_nm) OR\n search <% (ownr_ph1) OR\n search <% (ownr_addr1);\n end + if;\n\n\tEND\n$function$;" + type: run_sql +- args: + name: search_owners + schema: public + type: track_function diff --git a/hasura/migrations/1594681091201_update_permission_user_public_table_owners/down.yaml b/hasura/migrations/1594681091201_update_permission_user_public_table_owners/down.yaml new file mode 100644 index 000000000..7c2e787be --- /dev/null +++ b/hasura/migrations/1594681091201_update_permission_user_public_table_owners/down.yaml @@ -0,0 +1,45 @@ +- args: + role: user + table: + name: owners + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - allow_text_message + - accountingid + - ownr_addr1 + - ownr_addr2 + - ownr_city + - ownr_co_nm + - ownr_ctry + - ownr_ea + - ownr_fn + - ownr_ln + - ownr_ph1 + - ownr_ph2 + - ownr_st + - ownr_title + - ownr_zip + - preferred_contact + - created_at + - updated_at + - id + - shopid + computed_fields: [] + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: owners + schema: public + type: create_select_permission diff --git a/hasura/migrations/1594681091201_update_permission_user_public_table_owners/up.yaml b/hasura/migrations/1594681091201_update_permission_user_public_table_owners/up.yaml new file mode 100644 index 000000000..42fd04f2f --- /dev/null +++ b/hasura/migrations/1594681091201_update_permission_user_public_table_owners/up.yaml @@ -0,0 +1,45 @@ +- args: + role: user + table: + name: owners + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: true + columns: + - allow_text_message + - accountingid + - ownr_addr1 + - ownr_addr2 + - ownr_city + - ownr_co_nm + - ownr_ctry + - ownr_ea + - ownr_fn + - ownr_ln + - ownr_ph1 + - ownr_ph2 + - ownr_st + - ownr_title + - ownr_zip + - preferred_contact + - created_at + - updated_at + - id + - shopid + computed_fields: [] + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: owners + schema: public + type: create_select_permission diff --git a/hasura/migrations/1594741283350_update_permission_user_public_table_payments/down.yaml b/hasura/migrations/1594741283350_update_permission_user_public_table_payments/down.yaml new file mode 100644 index 000000000..bc5c01b3a --- /dev/null +++ b/hasura/migrations/1594741283350_update_permission_user_public_table_payments/down.yaml @@ -0,0 +1,36 @@ +- args: + role: user + table: + name: payments + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: true + columns: + - amount + - created_at + - exportedat + - id + - jobid + - memo + - payer + - stripeid + - transactionid + - updated_at + computed_fields: [] + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: payments + schema: public + type: create_select_permission diff --git a/hasura/migrations/1594741283350_update_permission_user_public_table_payments/up.yaml b/hasura/migrations/1594741283350_update_permission_user_public_table_payments/up.yaml new file mode 100644 index 000000000..d3263f3f0 --- /dev/null +++ b/hasura/migrations/1594741283350_update_permission_user_public_table_payments/up.yaml @@ -0,0 +1,37 @@ +- args: + role: user + table: + name: payments + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: true + columns: + - amount + - created_at + - exportedat + - id + - jobid + - memo + - payer + - stripeid + - transactionid + - type + - updated_at + computed_fields: [] + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: payments + schema: public + type: create_select_permission diff --git a/hasura/migrations/1594749366397_alter_table_public_users_add_column_dashboardlayout/down.yaml b/hasura/migrations/1594749366397_alter_table_public_users_add_column_dashboardlayout/down.yaml new file mode 100644 index 000000000..12f0337eb --- /dev/null +++ b/hasura/migrations/1594749366397_alter_table_public_users_add_column_dashboardlayout/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."users" DROP COLUMN "dashboardlayout"; + type: run_sql diff --git a/hasura/migrations/1594749366397_alter_table_public_users_add_column_dashboardlayout/up.yaml b/hasura/migrations/1594749366397_alter_table_public_users_add_column_dashboardlayout/up.yaml new file mode 100644 index 000000000..ae0348fbf --- /dev/null +++ b/hasura/migrations/1594749366397_alter_table_public_users_add_column_dashboardlayout/up.yaml @@ -0,0 +1,6 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."users" ADD COLUMN "dashboardlayout" jsonb NOT NULL + DEFAULT jsonb_build_array(); + type: run_sql diff --git a/hasura/migrations/1594749387526_update_permission_user_public_table_users/down.yaml b/hasura/migrations/1594749387526_update_permission_user_public_table_users/down.yaml new file mode 100644 index 000000000..14839d69a --- /dev/null +++ b/hasura/migrations/1594749387526_update_permission_user_public_table_users/down.yaml @@ -0,0 +1,24 @@ +- args: + role: user + table: + name: users + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - authid + - created_at + - email + - fcmtokens + - updated_at + computed_fields: [] + filter: + authid: + _eq: X-Hasura-User-Id + role: user + table: + name: users + schema: public + type: create_select_permission diff --git a/hasura/migrations/1594749387526_update_permission_user_public_table_users/up.yaml b/hasura/migrations/1594749387526_update_permission_user_public_table_users/up.yaml new file mode 100644 index 000000000..3822a6184 --- /dev/null +++ b/hasura/migrations/1594749387526_update_permission_user_public_table_users/up.yaml @@ -0,0 +1,25 @@ +- args: + role: user + table: + name: users + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - authid + - created_at + - dashboardlayout + - email + - fcmtokens + - updated_at + computed_fields: [] + filter: + authid: + _eq: X-Hasura-User-Id + role: user + table: + name: users + schema: public + type: create_select_permission diff --git a/hasura/migrations/1594749395552_update_permission_user_public_table_users/down.yaml b/hasura/migrations/1594749395552_update_permission_user_public_table_users/down.yaml new file mode 100644 index 000000000..9c06f74fb --- /dev/null +++ b/hasura/migrations/1594749395552_update_permission_user_public_table_users/down.yaml @@ -0,0 +1,21 @@ +- args: + role: user + table: + name: users + schema: public + type: drop_update_permission +- args: + permission: + columns: + - authid + - email + - fcmtokens + filter: + authid: + _eq: X-Hasura-User-Id + set: {} + role: user + table: + name: users + schema: public + type: create_update_permission diff --git a/hasura/migrations/1594749395552_update_permission_user_public_table_users/up.yaml b/hasura/migrations/1594749395552_update_permission_user_public_table_users/up.yaml new file mode 100644 index 000000000..f50ab23e2 --- /dev/null +++ b/hasura/migrations/1594749395552_update_permission_user_public_table_users/up.yaml @@ -0,0 +1,22 @@ +- args: + role: user + table: + name: users + schema: public + type: drop_update_permission +- args: + permission: + columns: + - authid + - dashboardlayout + - email + - fcmtokens + filter: + authid: + _eq: X-Hasura-User-Id + set: {} + role: user + table: + name: users + schema: public + type: create_update_permission diff --git a/hasura/migrations/1594836040740_update_permission_user_public_table_invoices/down.yaml b/hasura/migrations/1594836040740_update_permission_user_public_table_invoices/down.yaml new file mode 100644 index 000000000..d4f9086a3 --- /dev/null +++ b/hasura/migrations/1594836040740_update_permission_user_public_table_invoices/down.yaml @@ -0,0 +1,41 @@ +- args: + role: user + table: + name: invoices + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - created_at + - date + - due_date + - exported + - exported_at + - federal_tax_rate + - id + - invoice_number + - is_credit_memo + - jobid + - local_tax_rate + - state_tax_rate + - total + - updated_at + - vendorid + computed_fields: [] + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: invoices + schema: public + type: create_select_permission diff --git a/hasura/migrations/1594836040740_update_permission_user_public_table_invoices/up.yaml b/hasura/migrations/1594836040740_update_permission_user_public_table_invoices/up.yaml new file mode 100644 index 000000000..5e57c7e8f --- /dev/null +++ b/hasura/migrations/1594836040740_update_permission_user_public_table_invoices/up.yaml @@ -0,0 +1,41 @@ +- args: + role: user + table: + name: invoices + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: true + columns: + - created_at + - date + - due_date + - exported + - exported_at + - federal_tax_rate + - id + - invoice_number + - is_credit_memo + - jobid + - local_tax_rate + - state_tax_rate + - total + - updated_at + - vendorid + computed_fields: [] + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: invoices + schema: public + type: create_select_permission diff --git a/hasura/migrations/1594851818607_alter_table_public_employees_add_column_user_email/down.yaml b/hasura/migrations/1594851818607_alter_table_public_employees_add_column_user_email/down.yaml new file mode 100644 index 000000000..1dc83f416 --- /dev/null +++ b/hasura/migrations/1594851818607_alter_table_public_employees_add_column_user_email/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."employees" DROP COLUMN "user_email"; + type: run_sql diff --git a/hasura/migrations/1594851818607_alter_table_public_employees_add_column_user_email/up.yaml b/hasura/migrations/1594851818607_alter_table_public_employees_add_column_user_email/up.yaml new file mode 100644 index 000000000..6726affb4 --- /dev/null +++ b/hasura/migrations/1594851818607_alter_table_public_employees_add_column_user_email/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."employees" ADD COLUMN "user_email" text NULL UNIQUE; + type: run_sql diff --git a/hasura/migrations/1594851844985_set_fk_public_employees_user_email/down.yaml b/hasura/migrations/1594851844985_set_fk_public_employees_user_email/down.yaml new file mode 100644 index 000000000..48005327a --- /dev/null +++ b/hasura/migrations/1594851844985_set_fk_public_employees_user_email/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: alter table "public"."employees" drop constraint "employees_user_email_fkey"; + type: run_sql diff --git a/hasura/migrations/1594851844985_set_fk_public_employees_user_email/up.yaml b/hasura/migrations/1594851844985_set_fk_public_employees_user_email/up.yaml new file mode 100644 index 000000000..576e41aee --- /dev/null +++ b/hasura/migrations/1594851844985_set_fk_public_employees_user_email/up.yaml @@ -0,0 +1,10 @@ +- args: + cascade: false + read_only: false + sql: |- + alter table "public"."employees" + add constraint "employees_user_email_fkey" + foreign key ("user_email") + references "public"."users" + ("email") on update restrict on delete restrict; + type: run_sql diff --git a/hasura/migrations/1594851857360_set_fk_public_employees_user_email/down.yaml b/hasura/migrations/1594851857360_set_fk_public_employees_user_email/down.yaml new file mode 100644 index 000000000..c6cbe2afe --- /dev/null +++ b/hasura/migrations/1594851857360_set_fk_public_employees_user_email/down.yaml @@ -0,0 +1,12 @@ +- args: + cascade: false + read_only: false + sql: |- + alter table "public"."employees" drop constraint "employees_user_email_fkey", + add constraint "employees_user_email_fkey" + foreign key ("shopid") + references "public"."bodyshops" + ("id") + on update cascade + on delete cascade; + type: run_sql diff --git a/hasura/migrations/1594851857360_set_fk_public_employees_user_email/up.yaml b/hasura/migrations/1594851857360_set_fk_public_employees_user_email/up.yaml new file mode 100644 index 000000000..1eb438597 --- /dev/null +++ b/hasura/migrations/1594851857360_set_fk_public_employees_user_email/up.yaml @@ -0,0 +1,10 @@ +- args: + cascade: false + read_only: false + sql: |- + alter table "public"."employees" drop constraint "employees_user_email_fkey", + add constraint "employees_user_email_fkey" + foreign key ("user_email") + references "public"."users" + ("email") on update set null on delete set null; + type: run_sql diff --git a/hasura/migrations/1594851876967_add_relationship_employee_table_public_undefined/down.yaml b/hasura/migrations/1594851876967_add_relationship_employee_table_public_undefined/down.yaml new file mode 100644 index 000000000..20b527075 --- /dev/null +++ b/hasura/migrations/1594851876967_add_relationship_employee_table_public_undefined/down.yaml @@ -0,0 +1,6 @@ +- args: + relationship: employee + table: + name: users + schema: public + type: drop_relationship diff --git a/hasura/migrations/1594851876967_add_relationship_employee_table_public_undefined/up.yaml b/hasura/migrations/1594851876967_add_relationship_employee_table_public_undefined/up.yaml new file mode 100644 index 000000000..8bfb787a2 --- /dev/null +++ b/hasura/migrations/1594851876967_add_relationship_employee_table_public_undefined/up.yaml @@ -0,0 +1,13 @@ +- args: + name: employee + table: + name: users + schema: public + using: + manual_configuration: + column_mapping: + email: user_email + remote_table: + name: employees + schema: public + type: create_object_relationship diff --git a/hasura/migrations/1594851879473_add_relationship_user_table_public_undefined/down.yaml b/hasura/migrations/1594851879473_add_relationship_user_table_public_undefined/down.yaml new file mode 100644 index 000000000..494b1abba --- /dev/null +++ b/hasura/migrations/1594851879473_add_relationship_user_table_public_undefined/down.yaml @@ -0,0 +1,6 @@ +- args: + relationship: user + table: + name: employees + schema: public + type: drop_relationship diff --git a/hasura/migrations/1594851879473_add_relationship_user_table_public_undefined/up.yaml b/hasura/migrations/1594851879473_add_relationship_user_table_public_undefined/up.yaml new file mode 100644 index 000000000..fb48d7ff9 --- /dev/null +++ b/hasura/migrations/1594851879473_add_relationship_user_table_public_undefined/up.yaml @@ -0,0 +1,8 @@ +- args: + name: user + table: + name: employees + schema: public + using: + foreign_key_constraint_on: user_email + type: create_object_relationship diff --git a/hasura/migrations/1594852259471_update_permission_user_public_table_employees/down.yaml b/hasura/migrations/1594852259471_update_permission_user_public_table_employees/down.yaml new file mode 100644 index 000000000..87a93588c --- /dev/null +++ b/hasura/migrations/1594852259471_update_permission_user_public_table_employees/down.yaml @@ -0,0 +1,38 @@ +- args: + role: user + table: + name: employees + schema: public + type: drop_insert_permission +- args: + permission: + check: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - active + - base_rate + - cost_center + - created_at + - employee_number + - first_name + - flat_rate + - hire_date + - id + - last_name + - pin + - shopid + - termination_date + - updated_at + set: {} + role: user + table: + name: employees + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1594852259471_update_permission_user_public_table_employees/up.yaml b/hasura/migrations/1594852259471_update_permission_user_public_table_employees/up.yaml new file mode 100644 index 000000000..71581edc3 --- /dev/null +++ b/hasura/migrations/1594852259471_update_permission_user_public_table_employees/up.yaml @@ -0,0 +1,39 @@ +- args: + role: user + table: + name: employees + schema: public + type: drop_insert_permission +- args: + permission: + check: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - active + - base_rate + - cost_center + - created_at + - employee_number + - first_name + - flat_rate + - hire_date + - id + - last_name + - pin + - shopid + - termination_date + - updated_at + - user_email + set: {} + role: user + table: + name: employees + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1594852265828_update_permission_user_public_table_employees/down.yaml b/hasura/migrations/1594852265828_update_permission_user_public_table_employees/down.yaml new file mode 100644 index 000000000..3c4900c14 --- /dev/null +++ b/hasura/migrations/1594852265828_update_permission_user_public_table_employees/down.yaml @@ -0,0 +1,39 @@ +- args: + role: user + table: + name: employees + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - active + - base_rate + - cost_center + - created_at + - employee_number + - first_name + - flat_rate + - hire_date + - id + - last_name + - pin + - shopid + - termination_date + - updated_at + computed_fields: [] + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: employees + schema: public + type: create_select_permission diff --git a/hasura/migrations/1594852265828_update_permission_user_public_table_employees/up.yaml b/hasura/migrations/1594852265828_update_permission_user_public_table_employees/up.yaml new file mode 100644 index 000000000..8655d5eaf --- /dev/null +++ b/hasura/migrations/1594852265828_update_permission_user_public_table_employees/up.yaml @@ -0,0 +1,40 @@ +- args: + role: user + table: + name: employees + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - active + - base_rate + - cost_center + - created_at + - employee_number + - first_name + - flat_rate + - hire_date + - id + - last_name + - pin + - shopid + - termination_date + - updated_at + - user_email + computed_fields: [] + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: employees + schema: public + type: create_select_permission diff --git a/hasura/migrations/1594852271012_update_permission_user_public_table_employees/down.yaml b/hasura/migrations/1594852271012_update_permission_user_public_table_employees/down.yaml new file mode 100644 index 000000000..cd16e8032 --- /dev/null +++ b/hasura/migrations/1594852271012_update_permission_user_public_table_employees/down.yaml @@ -0,0 +1,38 @@ +- args: + role: user + table: + name: employees + schema: public + type: drop_update_permission +- args: + permission: + columns: + - active + - base_rate + - cost_center + - created_at + - employee_number + - first_name + - flat_rate + - hire_date + - id + - last_name + - pin + - shopid + - termination_date + - updated_at + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + set: {} + role: user + table: + name: employees + schema: public + type: create_update_permission diff --git a/hasura/migrations/1594852271012_update_permission_user_public_table_employees/up.yaml b/hasura/migrations/1594852271012_update_permission_user_public_table_employees/up.yaml new file mode 100644 index 000000000..e0859b31d --- /dev/null +++ b/hasura/migrations/1594852271012_update_permission_user_public_table_employees/up.yaml @@ -0,0 +1,39 @@ +- args: + role: user + table: + name: employees + schema: public + type: drop_update_permission +- args: + permission: + columns: + - active + - base_rate + - cost_center + - created_at + - employee_number + - first_name + - flat_rate + - hire_date + - id + - last_name + - pin + - shopid + - termination_date + - updated_at + - user_email + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + set: {} + role: user + table: + name: employees + schema: public + type: create_update_permission diff --git a/hasura/migrations/1594915350729_update_permission_user_public_table_timetickets/down.yaml b/hasura/migrations/1594915350729_update_permission_user_public_table_timetickets/down.yaml new file mode 100644 index 000000000..bc6e43c69 --- /dev/null +++ b/hasura/migrations/1594915350729_update_permission_user_public_table_timetickets/down.yaml @@ -0,0 +1,38 @@ +- args: + role: user + table: + name: timetickets + schema: public + type: drop_insert_permission +- args: + permission: + check: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - id + - created_at + - updated_at + - date + - cost_center + - employeeid + - jobid + - rate + - productivehrs + - actualhrs + - clockon + - clockoff + - ciecacode + set: {} + role: user + table: + name: timetickets + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1594915350729_update_permission_user_public_table_timetickets/up.yaml b/hasura/migrations/1594915350729_update_permission_user_public_table_timetickets/up.yaml new file mode 100644 index 000000000..240ecfad3 --- /dev/null +++ b/hasura/migrations/1594915350729_update_permission_user_public_table_timetickets/up.yaml @@ -0,0 +1,29 @@ +- args: + role: user + table: + name: timetickets + schema: public + type: drop_insert_permission +- args: + permission: + check: {} + columns: + - id + - created_at + - updated_at + - date + - cost_center + - employeeid + - jobid + - rate + - productivehrs + - actualhrs + - clockon + - clockoff + - ciecacode + set: {} + role: user + table: + name: timetickets + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1594915426388_alter_table_public_timetickets_add_column_bodyshopid/down.yaml b/hasura/migrations/1594915426388_alter_table_public_timetickets_add_column_bodyshopid/down.yaml new file mode 100644 index 000000000..96c564400 --- /dev/null +++ b/hasura/migrations/1594915426388_alter_table_public_timetickets_add_column_bodyshopid/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."timetickets" DROP COLUMN "bodyshopid"; + type: run_sql diff --git a/hasura/migrations/1594915426388_alter_table_public_timetickets_add_column_bodyshopid/up.yaml b/hasura/migrations/1594915426388_alter_table_public_timetickets_add_column_bodyshopid/up.yaml new file mode 100644 index 000000000..ee1d6c0ee --- /dev/null +++ b/hasura/migrations/1594915426388_alter_table_public_timetickets_add_column_bodyshopid/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."timetickets" ADD COLUMN "bodyshopid" uuid NOT NULL; + type: run_sql diff --git a/hasura/migrations/1594915475076_set_fk_public_timetickets_bodyshopid/down.yaml b/hasura/migrations/1594915475076_set_fk_public_timetickets_bodyshopid/down.yaml new file mode 100644 index 000000000..0d7986c4a --- /dev/null +++ b/hasura/migrations/1594915475076_set_fk_public_timetickets_bodyshopid/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: alter table "public"."timetickets" drop constraint "timetickets_bodyshopid_fkey"; + type: run_sql diff --git a/hasura/migrations/1594915475076_set_fk_public_timetickets_bodyshopid/up.yaml b/hasura/migrations/1594915475076_set_fk_public_timetickets_bodyshopid/up.yaml new file mode 100644 index 000000000..6c8c4e6af --- /dev/null +++ b/hasura/migrations/1594915475076_set_fk_public_timetickets_bodyshopid/up.yaml @@ -0,0 +1,10 @@ +- args: + cascade: false + read_only: false + sql: |- + alter table "public"."timetickets" + add constraint "timetickets_bodyshopid_fkey" + foreign key ("bodyshopid") + references "public"."bodyshops" + ("id") on update restrict on delete restrict; + type: run_sql diff --git a/hasura/migrations/1594915490297_track_all_relationships/down.yaml b/hasura/migrations/1594915490297_track_all_relationships/down.yaml new file mode 100644 index 000000000..497f44e49 --- /dev/null +++ b/hasura/migrations/1594915490297_track_all_relationships/down.yaml @@ -0,0 +1,12 @@ +- args: + relationship: timetickets + table: + name: bodyshops + schema: public + type: drop_relationship +- args: + relationship: bodyshop + table: + name: timetickets + schema: public + type: drop_relationship diff --git a/hasura/migrations/1594915490297_track_all_relationships/up.yaml b/hasura/migrations/1594915490297_track_all_relationships/up.yaml new file mode 100644 index 000000000..5f3da62f5 --- /dev/null +++ b/hasura/migrations/1594915490297_track_all_relationships/up.yaml @@ -0,0 +1,20 @@ +- args: + name: timetickets + table: + name: bodyshops + schema: public + using: + foreign_key_constraint_on: + column: bodyshopid + table: + name: timetickets + schema: public + type: create_array_relationship +- args: + name: bodyshop + table: + name: timetickets + schema: public + using: + foreign_key_constraint_on: bodyshopid + type: create_object_relationship diff --git a/hasura/migrations/1594915535846_update_permission_user_public_table_timetickets/down.yaml b/hasura/migrations/1594915535846_update_permission_user_public_table_timetickets/down.yaml new file mode 100644 index 000000000..240ecfad3 --- /dev/null +++ b/hasura/migrations/1594915535846_update_permission_user_public_table_timetickets/down.yaml @@ -0,0 +1,29 @@ +- args: + role: user + table: + name: timetickets + schema: public + type: drop_insert_permission +- args: + permission: + check: {} + columns: + - id + - created_at + - updated_at + - date + - cost_center + - employeeid + - jobid + - rate + - productivehrs + - actualhrs + - clockon + - clockoff + - ciecacode + set: {} + role: user + table: + name: timetickets + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1594915535846_update_permission_user_public_table_timetickets/up.yaml b/hasura/migrations/1594915535846_update_permission_user_public_table_timetickets/up.yaml new file mode 100644 index 000000000..4602bb169 --- /dev/null +++ b/hasura/migrations/1594915535846_update_permission_user_public_table_timetickets/up.yaml @@ -0,0 +1,37 @@ +- args: + role: user + table: + name: timetickets + schema: public + type: drop_insert_permission +- args: + permission: + check: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - id + - created_at + - updated_at + - date + - cost_center + - employeeid + - jobid + - rate + - productivehrs + - actualhrs + - clockon + - clockoff + - ciecacode + set: {} + role: user + table: + name: timetickets + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1594915560544_update_permission_user_public_table_timetickets/down.yaml b/hasura/migrations/1594915560544_update_permission_user_public_table_timetickets/down.yaml new file mode 100644 index 000000000..2385c1c75 --- /dev/null +++ b/hasura/migrations/1594915560544_update_permission_user_public_table_timetickets/down.yaml @@ -0,0 +1,39 @@ +- args: + role: user + table: + name: timetickets + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - date + - actualhrs + - productivehrs + - rate + - ciecacode + - cost_center + - clockoff + - clockon + - created_at + - updated_at + - employeeid + - id + - jobid + computed_fields: [] + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: timetickets + schema: public + type: create_select_permission diff --git a/hasura/migrations/1594915560544_update_permission_user_public_table_timetickets/up.yaml b/hasura/migrations/1594915560544_update_permission_user_public_table_timetickets/up.yaml new file mode 100644 index 000000000..578083106 --- /dev/null +++ b/hasura/migrations/1594915560544_update_permission_user_public_table_timetickets/up.yaml @@ -0,0 +1,39 @@ +- args: + role: user + table: + name: timetickets + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - actualhrs + - bodyshopid + - ciecacode + - clockoff + - clockon + - cost_center + - created_at + - date + - employeeid + - id + - jobid + - productivehrs + - rate + - updated_at + computed_fields: [] + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: timetickets + schema: public + type: create_select_permission diff --git a/hasura/migrations/1594915572129_update_permission_user_public_table_timetickets/down.yaml b/hasura/migrations/1594915572129_update_permission_user_public_table_timetickets/down.yaml new file mode 100644 index 000000000..4602bb169 --- /dev/null +++ b/hasura/migrations/1594915572129_update_permission_user_public_table_timetickets/down.yaml @@ -0,0 +1,37 @@ +- args: + role: user + table: + name: timetickets + schema: public + type: drop_insert_permission +- args: + permission: + check: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - id + - created_at + - updated_at + - date + - cost_center + - employeeid + - jobid + - rate + - productivehrs + - actualhrs + - clockon + - clockoff + - ciecacode + set: {} + role: user + table: + name: timetickets + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1594915572129_update_permission_user_public_table_timetickets/up.yaml b/hasura/migrations/1594915572129_update_permission_user_public_table_timetickets/up.yaml new file mode 100644 index 000000000..c1deea7fc --- /dev/null +++ b/hasura/migrations/1594915572129_update_permission_user_public_table_timetickets/up.yaml @@ -0,0 +1,38 @@ +- args: + role: user + table: + name: timetickets + schema: public + type: drop_insert_permission +- args: + permission: + check: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - actualhrs + - bodyshopid + - ciecacode + - clockoff + - clockon + - cost_center + - created_at + - date + - employeeid + - id + - jobid + - productivehrs + - rate + - updated_at + set: {} + role: user + table: + name: timetickets + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1594915585321_update_permission_user_public_table_timetickets/down.yaml b/hasura/migrations/1594915585321_update_permission_user_public_table_timetickets/down.yaml new file mode 100644 index 000000000..87f016c2f --- /dev/null +++ b/hasura/migrations/1594915585321_update_permission_user_public_table_timetickets/down.yaml @@ -0,0 +1,38 @@ +- args: + role: user + table: + name: timetickets + schema: public + type: drop_update_permission +- args: + permission: + columns: + - date + - actualhrs + - productivehrs + - rate + - ciecacode + - cost_center + - clockoff + - clockon + - created_at + - updated_at + - employeeid + - id + - jobid + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + set: {} + role: user + table: + name: timetickets + schema: public + type: create_update_permission diff --git a/hasura/migrations/1594915585321_update_permission_user_public_table_timetickets/up.yaml b/hasura/migrations/1594915585321_update_permission_user_public_table_timetickets/up.yaml new file mode 100644 index 000000000..607a87ce6 --- /dev/null +++ b/hasura/migrations/1594915585321_update_permission_user_public_table_timetickets/up.yaml @@ -0,0 +1,38 @@ +- args: + role: user + table: + name: timetickets + schema: public + type: drop_update_permission +- args: + permission: + columns: + - actualhrs + - bodyshopid + - ciecacode + - clockoff + - clockon + - cost_center + - created_at + - date + - employeeid + - id + - jobid + - productivehrs + - rate + - updated_at + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + set: {} + role: user + table: + name: timetickets + schema: public + type: create_update_permission diff --git a/hasura/migrations/1594915594328_update_permission_user_public_table_timetickets/down.yaml b/hasura/migrations/1594915594328_update_permission_user_public_table_timetickets/down.yaml new file mode 100644 index 000000000..d6cac164e --- /dev/null +++ b/hasura/migrations/1594915594328_update_permission_user_public_table_timetickets/down.yaml @@ -0,0 +1,23 @@ +- args: + role: user + table: + name: timetickets + schema: public + type: drop_delete_permission +- args: + permission: + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: timetickets + schema: public + type: create_delete_permission diff --git a/hasura/migrations/1594915594328_update_permission_user_public_table_timetickets/up.yaml b/hasura/migrations/1594915594328_update_permission_user_public_table_timetickets/up.yaml new file mode 100644 index 000000000..c2f88054f --- /dev/null +++ b/hasura/migrations/1594915594328_update_permission_user_public_table_timetickets/up.yaml @@ -0,0 +1,22 @@ +- args: + role: user + table: + name: timetickets + schema: public + type: drop_delete_permission +- args: + permission: + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: timetickets + schema: public + type: create_delete_permission diff --git a/hasura/migrations/1594918801030_alter_table_public_timetickets_add_column_memo/down.yaml b/hasura/migrations/1594918801030_alter_table_public_timetickets_add_column_memo/down.yaml new file mode 100644 index 000000000..e2f8bd8a1 --- /dev/null +++ b/hasura/migrations/1594918801030_alter_table_public_timetickets_add_column_memo/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."timetickets" DROP COLUMN "memo"; + type: run_sql diff --git a/hasura/migrations/1594918801030_alter_table_public_timetickets_add_column_memo/up.yaml b/hasura/migrations/1594918801030_alter_table_public_timetickets_add_column_memo/up.yaml new file mode 100644 index 000000000..9fe67874e --- /dev/null +++ b/hasura/migrations/1594918801030_alter_table_public_timetickets_add_column_memo/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."timetickets" ADD COLUMN "memo" text NULL; + type: run_sql diff --git a/hasura/migrations/1594918812708_update_permission_user_public_table_timetickets/down.yaml b/hasura/migrations/1594918812708_update_permission_user_public_table_timetickets/down.yaml new file mode 100644 index 000000000..c1deea7fc --- /dev/null +++ b/hasura/migrations/1594918812708_update_permission_user_public_table_timetickets/down.yaml @@ -0,0 +1,38 @@ +- args: + role: user + table: + name: timetickets + schema: public + type: drop_insert_permission +- args: + permission: + check: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - actualhrs + - bodyshopid + - ciecacode + - clockoff + - clockon + - cost_center + - created_at + - date + - employeeid + - id + - jobid + - productivehrs + - rate + - updated_at + set: {} + role: user + table: + name: timetickets + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1594918812708_update_permission_user_public_table_timetickets/up.yaml b/hasura/migrations/1594918812708_update_permission_user_public_table_timetickets/up.yaml new file mode 100644 index 000000000..2738367b3 --- /dev/null +++ b/hasura/migrations/1594918812708_update_permission_user_public_table_timetickets/up.yaml @@ -0,0 +1,39 @@ +- args: + role: user + table: + name: timetickets + schema: public + type: drop_insert_permission +- args: + permission: + check: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - actualhrs + - bodyshopid + - ciecacode + - clockoff + - clockon + - cost_center + - created_at + - date + - employeeid + - id + - jobid + - memo + - productivehrs + - rate + - updated_at + set: {} + role: user + table: + name: timetickets + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1594918823530_update_permission_user_public_table_timetickets/down.yaml b/hasura/migrations/1594918823530_update_permission_user_public_table_timetickets/down.yaml new file mode 100644 index 000000000..578083106 --- /dev/null +++ b/hasura/migrations/1594918823530_update_permission_user_public_table_timetickets/down.yaml @@ -0,0 +1,39 @@ +- args: + role: user + table: + name: timetickets + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - actualhrs + - bodyshopid + - ciecacode + - clockoff + - clockon + - cost_center + - created_at + - date + - employeeid + - id + - jobid + - productivehrs + - rate + - updated_at + computed_fields: [] + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: timetickets + schema: public + type: create_select_permission diff --git a/hasura/migrations/1594918823530_update_permission_user_public_table_timetickets/up.yaml b/hasura/migrations/1594918823530_update_permission_user_public_table_timetickets/up.yaml new file mode 100644 index 000000000..9b9382fa6 --- /dev/null +++ b/hasura/migrations/1594918823530_update_permission_user_public_table_timetickets/up.yaml @@ -0,0 +1,40 @@ +- args: + role: user + table: + name: timetickets + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - actualhrs + - bodyshopid + - ciecacode + - clockoff + - clockon + - cost_center + - created_at + - date + - employeeid + - id + - jobid + - memo + - productivehrs + - rate + - updated_at + computed_fields: [] + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: timetickets + schema: public + type: create_select_permission diff --git a/hasura/migrations/1594918834840_update_permission_user_public_table_timetickets/down.yaml b/hasura/migrations/1594918834840_update_permission_user_public_table_timetickets/down.yaml new file mode 100644 index 000000000..607a87ce6 --- /dev/null +++ b/hasura/migrations/1594918834840_update_permission_user_public_table_timetickets/down.yaml @@ -0,0 +1,38 @@ +- args: + role: user + table: + name: timetickets + schema: public + type: drop_update_permission +- args: + permission: + columns: + - actualhrs + - bodyshopid + - ciecacode + - clockoff + - clockon + - cost_center + - created_at + - date + - employeeid + - id + - jobid + - productivehrs + - rate + - updated_at + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + set: {} + role: user + table: + name: timetickets + schema: public + type: create_update_permission diff --git a/hasura/migrations/1594918834840_update_permission_user_public_table_timetickets/up.yaml b/hasura/migrations/1594918834840_update_permission_user_public_table_timetickets/up.yaml new file mode 100644 index 000000000..81b11bf65 --- /dev/null +++ b/hasura/migrations/1594918834840_update_permission_user_public_table_timetickets/up.yaml @@ -0,0 +1,39 @@ +- args: + role: user + table: + name: timetickets + schema: public + type: drop_update_permission +- args: + permission: + columns: + - actualhrs + - bodyshopid + - ciecacode + - clockoff + - clockon + - cost_center + - created_at + - date + - employeeid + - id + - jobid + - memo + - productivehrs + - rate + - updated_at + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + set: {} + role: user + table: + name: timetickets + schema: public + type: create_update_permission diff --git a/hasura/migrations/1594921658592_alter_table_public_jobs_add_column_employee_body/down.yaml b/hasura/migrations/1594921658592_alter_table_public_jobs_add_column_employee_body/down.yaml new file mode 100644 index 000000000..82630d41b --- /dev/null +++ b/hasura/migrations/1594921658592_alter_table_public_jobs_add_column_employee_body/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."jobs" DROP COLUMN "employee_body"; + type: run_sql diff --git a/hasura/migrations/1594921658592_alter_table_public_jobs_add_column_employee_body/up.yaml b/hasura/migrations/1594921658592_alter_table_public_jobs_add_column_employee_body/up.yaml new file mode 100644 index 000000000..40e980024 --- /dev/null +++ b/hasura/migrations/1594921658592_alter_table_public_jobs_add_column_employee_body/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."jobs" ADD COLUMN "employee_body" uuid NULL; + type: run_sql diff --git a/hasura/migrations/1594921667947_alter_table_public_jobs_add_column_employee_refinish/down.yaml b/hasura/migrations/1594921667947_alter_table_public_jobs_add_column_employee_refinish/down.yaml new file mode 100644 index 000000000..bb1d0e1b9 --- /dev/null +++ b/hasura/migrations/1594921667947_alter_table_public_jobs_add_column_employee_refinish/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."jobs" DROP COLUMN "employee_refinish"; + type: run_sql diff --git a/hasura/migrations/1594921667947_alter_table_public_jobs_add_column_employee_refinish/up.yaml b/hasura/migrations/1594921667947_alter_table_public_jobs_add_column_employee_refinish/up.yaml new file mode 100644 index 000000000..cf89fdb9b --- /dev/null +++ b/hasura/migrations/1594921667947_alter_table_public_jobs_add_column_employee_refinish/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."jobs" ADD COLUMN "employee_refinish" uuid NULL; + type: run_sql diff --git a/hasura/migrations/1594921687862_set_fk_public_jobs_employee_body/down.yaml b/hasura/migrations/1594921687862_set_fk_public_jobs_employee_body/down.yaml new file mode 100644 index 000000000..d49240e28 --- /dev/null +++ b/hasura/migrations/1594921687862_set_fk_public_jobs_employee_body/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: alter table "public"."jobs" drop constraint "jobs_employee_body_fkey"; + type: run_sql diff --git a/hasura/migrations/1594921687862_set_fk_public_jobs_employee_body/up.yaml b/hasura/migrations/1594921687862_set_fk_public_jobs_employee_body/up.yaml new file mode 100644 index 000000000..b175a8faa --- /dev/null +++ b/hasura/migrations/1594921687862_set_fk_public_jobs_employee_body/up.yaml @@ -0,0 +1,10 @@ +- args: + cascade: false + read_only: false + sql: |- + alter table "public"."jobs" + add constraint "jobs_employee_body_fkey" + foreign key ("employee_body") + references "public"."employees" + ("id") on update set null on delete set null; + type: run_sql diff --git a/hasura/migrations/1594921705289_set_fk_public_jobs_employee_refinish/down.yaml b/hasura/migrations/1594921705289_set_fk_public_jobs_employee_refinish/down.yaml new file mode 100644 index 000000000..2b23b593c --- /dev/null +++ b/hasura/migrations/1594921705289_set_fk_public_jobs_employee_refinish/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: alter table "public"."jobs" drop constraint "jobs_employee_refinish_fkey"; + type: run_sql diff --git a/hasura/migrations/1594921705289_set_fk_public_jobs_employee_refinish/up.yaml b/hasura/migrations/1594921705289_set_fk_public_jobs_employee_refinish/up.yaml new file mode 100644 index 000000000..6b00138db --- /dev/null +++ b/hasura/migrations/1594921705289_set_fk_public_jobs_employee_refinish/up.yaml @@ -0,0 +1,10 @@ +- args: + cascade: false + read_only: false + sql: |- + alter table "public"."jobs" + add constraint "jobs_employee_refinish_fkey" + foreign key ("employee_refinish") + references "public"."employees" + ("id") on update set null on delete set null; + type: run_sql diff --git a/hasura/migrations/1594921899352_track_all_relationships/down.yaml b/hasura/migrations/1594921899352_track_all_relationships/down.yaml new file mode 100644 index 000000000..448bee39c --- /dev/null +++ b/hasura/migrations/1594921899352_track_all_relationships/down.yaml @@ -0,0 +1,24 @@ +- args: + relationship: employee + table: + name: jobs + schema: public + type: drop_relationship +- args: + relationship: employeeByEmployeeBody + table: + name: jobs + schema: public + type: drop_relationship +- args: + relationship: jobs + table: + name: employees + schema: public + type: drop_relationship +- args: + relationship: jobsByEmployeeRefinish + table: + name: employees + schema: public + type: drop_relationship diff --git a/hasura/migrations/1594921899352_track_all_relationships/up.yaml b/hasura/migrations/1594921899352_track_all_relationships/up.yaml new file mode 100644 index 000000000..a5f7a2c41 --- /dev/null +++ b/hasura/migrations/1594921899352_track_all_relationships/up.yaml @@ -0,0 +1,40 @@ +- args: + name: employee + table: + name: jobs + schema: public + using: + foreign_key_constraint_on: employee_refinish + type: create_object_relationship +- args: + name: employeeByEmployeeBody + table: + name: jobs + schema: public + using: + foreign_key_constraint_on: employee_body + type: create_object_relationship +- args: + name: jobs + table: + name: employees + schema: public + using: + foreign_key_constraint_on: + column: employee_body + table: + name: jobs + schema: public + type: create_array_relationship +- args: + name: jobsByEmployeeRefinish + table: + name: employees + schema: public + using: + foreign_key_constraint_on: + column: employee_refinish + table: + name: jobs + schema: public + type: create_array_relationship diff --git a/hasura/migrations/1594923683074_update_permission_user_public_table_jobs/down.yaml b/hasura/migrations/1594923683074_update_permission_user_public_table_jobs/down.yaml new file mode 100644 index 000000000..8aa9cc00c --- /dev/null +++ b/hasura/migrations/1594923683074_update_permission_user_public_table_jobs/down.yaml @@ -0,0 +1,255 @@ +- args: + role: user + table: + name: jobs + schema: public + type: drop_insert_permission +- args: + permission: + check: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - actual_completion + - actual_delivery + - actual_in + - adj_g_disc + - adj_strdis + - adj_towdis + - adjustment_bottom_line + - agt_addr1 + - agt_addr2 + - agt_city + - agt_co_id + - agt_co_nm + - agt_ct_fn + - agt_ct_ln + - agt_ct_ph + - agt_ct_phx + - agt_ctry + - agt_ea + - agt_fax + - agt_faxx + - agt_lic_no + - agt_ph1 + - agt_ph1x + - agt_ph2 + - agt_ph2x + - agt_st + - agt_zip + - area_of_damage + - asgn_date + - asgn_no + - asgn_type + - cat_no + - cieca_stl + - cieca_ttl + - ciecaid + - clm_addr1 + - clm_addr2 + - clm_city + - clm_ct_fn + - clm_ct_ln + - clm_ct_ph + - clm_ct_phx + - clm_ctry + - clm_ea + - clm_fax + - clm_faxx + - clm_no + - clm_ofc_id + - clm_ofc_nm + - clm_ph1 + - clm_ph1x + - clm_ph2 + - clm_ph2x + - clm_st + - clm_title + - clm_total + - clm_zip + - converted + - created_at + - csr + - cust_pr + - date_closed + - date_estimated + - date_exported + - date_invoiced + - date_open + - date_scheduled + - ded_amt + - ded_status + - depreciation_taxes + - est_addr1 + - est_addr2 + - est_city + - est_co_nm + - est_ct_fn + - est_ct_ln + - est_ctry + - est_ea + - est_number + - est_ph1 + - est_st + - est_zip + - federal_tax_payable + - federal_tax_rate + - g_bett_amt + - id + - inproduction + - ins_addr1 + - ins_addr2 + - ins_city + - ins_co_id + - ins_co_nm + - ins_ct_fn + - ins_ct_ln + - ins_ct_ph + - ins_ct_phx + - ins_ctry + - ins_ea + - ins_fax + - ins_faxx + - ins_memo + - ins_ph1 + - ins_ph1x + - ins_ph2 + - ins_ph2x + - ins_st + - ins_title + - ins_zip + - insd_addr1 + - insd_addr2 + - insd_city + - insd_co_nm + - insd_ctry + - insd_ea + - insd_fax + - insd_faxx + - insd_fn + - insd_ln + - insd_ph1 + - insd_ph1x + - insd_ph2 + - insd_ph2x + - insd_st + - insd_title + - insd_zip + - intakechecklist + - invoice_allocation + - invoice_date + - job_totals + - kanbanparent + - kmin + - kmout + - labor_rate_desc + - labor_rate_id + - local_tax_rate + - loss_cat + - loss_date + - loss_desc + - loss_type + - other_amount_payable + - owner_owing + - ownerid + - ownr_addr1 + - ownr_addr2 + - ownr_city + - ownr_co_nm + - ownr_ctry + - ownr_ea + - ownr_fax + - ownr_faxx + - ownr_fn + - ownr_ln + - ownr_ph1 + - ownr_ph1x + - ownr_ph2 + - ownr_ph2x + - ownr_st + - ownr_title + - ownr_zip + - parts_tax_rates + - pay_amt + - pay_chknm + - pay_date + - pay_type + - payee_nms + - plate_no + - plate_st + - po_number + - policy_no + - production_vars + - rate_atp + - rate_la1 + - rate_la2 + - rate_la3 + - rate_la4 + - rate_laa + - rate_lab + - rate_lad + - rate_lae + - rate_laf + - rate_lag + - rate_lam + - rate_lar + - rate_las + - rate_lau + - rate_ma2s + - rate_ma2t + - rate_ma3s + - rate_mabl + - rate_macs + - rate_mahw + - rate_mapa + - rate_mash + - rate_matd + - referral_source + - regie_number + - ro_number + - scheduled_completion + - scheduled_delivery + - scheduled_in + - selling_dealer + - selling_dealer_contact + - servicing_dealer + - servicing_dealer_contact + - shopid + - special_coverage_policy + - state_tax_rate + - status + - statusid + - storage_payable + - tax_lbr_rt + - tax_levies_rt + - tax_paint_mat_rt + - tax_predis + - tax_prethr + - tax_pstthr + - tax_str_rt + - tax_sub_rt + - tax_thramt + - tax_tow_rt + - theft_ind + - tlos_ind + - towing_payable + - unit_number + - updated_at + - v_color + - v_make_desc + - v_model_desc + - v_model_yr + - v_vin + - vehicleid + set: {} + role: user + table: + name: jobs + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1594923683074_update_permission_user_public_table_jobs/up.yaml b/hasura/migrations/1594923683074_update_permission_user_public_table_jobs/up.yaml new file mode 100644 index 000000000..0178be5a6 --- /dev/null +++ b/hasura/migrations/1594923683074_update_permission_user_public_table_jobs/up.yaml @@ -0,0 +1,257 @@ +- args: + role: user + table: + name: jobs + schema: public + type: drop_insert_permission +- args: + permission: + check: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - actual_completion + - actual_delivery + - actual_in + - adj_g_disc + - adj_strdis + - adj_towdis + - adjustment_bottom_line + - agt_addr1 + - agt_addr2 + - agt_city + - agt_co_id + - agt_co_nm + - agt_ct_fn + - agt_ct_ln + - agt_ct_ph + - agt_ct_phx + - agt_ctry + - agt_ea + - agt_fax + - agt_faxx + - agt_lic_no + - agt_ph1 + - agt_ph1x + - agt_ph2 + - agt_ph2x + - agt_st + - agt_zip + - area_of_damage + - asgn_date + - asgn_no + - asgn_type + - cat_no + - cieca_stl + - cieca_ttl + - ciecaid + - clm_addr1 + - clm_addr2 + - clm_city + - clm_ct_fn + - clm_ct_ln + - clm_ct_ph + - clm_ct_phx + - clm_ctry + - clm_ea + - clm_fax + - clm_faxx + - clm_no + - clm_ofc_id + - clm_ofc_nm + - clm_ph1 + - clm_ph1x + - clm_ph2 + - clm_ph2x + - clm_st + - clm_title + - clm_total + - clm_zip + - converted + - created_at + - csr + - cust_pr + - date_closed + - date_estimated + - date_exported + - date_invoiced + - date_open + - date_scheduled + - ded_amt + - ded_status + - depreciation_taxes + - employee_body + - employee_refinish + - est_addr1 + - est_addr2 + - est_city + - est_co_nm + - est_ct_fn + - est_ct_ln + - est_ctry + - est_ea + - est_number + - est_ph1 + - est_st + - est_zip + - federal_tax_payable + - federal_tax_rate + - g_bett_amt + - id + - inproduction + - ins_addr1 + - ins_addr2 + - ins_city + - ins_co_id + - ins_co_nm + - ins_ct_fn + - ins_ct_ln + - ins_ct_ph + - ins_ct_phx + - ins_ctry + - ins_ea + - ins_fax + - ins_faxx + - ins_memo + - ins_ph1 + - ins_ph1x + - ins_ph2 + - ins_ph2x + - ins_st + - ins_title + - ins_zip + - insd_addr1 + - insd_addr2 + - insd_city + - insd_co_nm + - insd_ctry + - insd_ea + - insd_fax + - insd_faxx + - insd_fn + - insd_ln + - insd_ph1 + - insd_ph1x + - insd_ph2 + - insd_ph2x + - insd_st + - insd_title + - insd_zip + - intakechecklist + - invoice_allocation + - invoice_date + - job_totals + - kanbanparent + - kmin + - kmout + - labor_rate_desc + - labor_rate_id + - local_tax_rate + - loss_cat + - loss_date + - loss_desc + - loss_type + - other_amount_payable + - owner_owing + - ownerid + - ownr_addr1 + - ownr_addr2 + - ownr_city + - ownr_co_nm + - ownr_ctry + - ownr_ea + - ownr_fax + - ownr_faxx + - ownr_fn + - ownr_ln + - ownr_ph1 + - ownr_ph1x + - ownr_ph2 + - ownr_ph2x + - ownr_st + - ownr_title + - ownr_zip + - parts_tax_rates + - pay_amt + - pay_chknm + - pay_date + - pay_type + - payee_nms + - plate_no + - plate_st + - po_number + - policy_no + - production_vars + - rate_atp + - rate_la1 + - rate_la2 + - rate_la3 + - rate_la4 + - rate_laa + - rate_lab + - rate_lad + - rate_lae + - rate_laf + - rate_lag + - rate_lam + - rate_lar + - rate_las + - rate_lau + - rate_ma2s + - rate_ma2t + - rate_ma3s + - rate_mabl + - rate_macs + - rate_mahw + - rate_mapa + - rate_mash + - rate_matd + - referral_source + - regie_number + - ro_number + - scheduled_completion + - scheduled_delivery + - scheduled_in + - selling_dealer + - selling_dealer_contact + - servicing_dealer + - servicing_dealer_contact + - shopid + - special_coverage_policy + - state_tax_rate + - status + - statusid + - storage_payable + - tax_lbr_rt + - tax_levies_rt + - tax_paint_mat_rt + - tax_predis + - tax_prethr + - tax_pstthr + - tax_str_rt + - tax_sub_rt + - tax_thramt + - tax_tow_rt + - theft_ind + - tlos_ind + - towing_payable + - unit_number + - updated_at + - v_color + - v_make_desc + - v_model_desc + - v_model_yr + - v_vin + - vehicleid + set: {} + role: user + table: + name: jobs + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1594923695014_update_permission_user_public_table_jobs/down.yaml b/hasura/migrations/1594923695014_update_permission_user_public_table_jobs/down.yaml new file mode 100644 index 000000000..26e7035b1 --- /dev/null +++ b/hasura/migrations/1594923695014_update_permission_user_public_table_jobs/down.yaml @@ -0,0 +1,256 @@ +- args: + role: user + table: + name: jobs + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: true + columns: + - actual_completion + - actual_delivery + - actual_in + - adj_g_disc + - adj_strdis + - adj_towdis + - adjustment_bottom_line + - agt_addr1 + - agt_addr2 + - agt_city + - agt_co_id + - agt_co_nm + - agt_ct_fn + - agt_ct_ln + - agt_ct_ph + - agt_ct_phx + - agt_ctry + - agt_ea + - agt_fax + - agt_faxx + - agt_lic_no + - agt_ph1 + - agt_ph1x + - agt_ph2 + - agt_ph2x + - agt_st + - agt_zip + - area_of_damage + - asgn_date + - asgn_no + - asgn_type + - cat_no + - cieca_stl + - cieca_ttl + - ciecaid + - clm_addr1 + - clm_addr2 + - clm_city + - clm_ct_fn + - clm_ct_ln + - clm_ct_ph + - clm_ct_phx + - clm_ctry + - clm_ea + - clm_fax + - clm_faxx + - clm_no + - clm_ofc_id + - clm_ofc_nm + - clm_ph1 + - clm_ph1x + - clm_ph2 + - clm_ph2x + - clm_st + - clm_title + - clm_total + - clm_zip + - converted + - created_at + - csr + - cust_pr + - date_closed + - date_estimated + - date_exported + - date_invoiced + - date_open + - date_scheduled + - ded_amt + - ded_status + - depreciation_taxes + - est_addr1 + - est_addr2 + - est_city + - est_co_nm + - est_ct_fn + - est_ct_ln + - est_ctry + - est_ea + - est_number + - est_ph1 + - est_st + - est_zip + - federal_tax_payable + - federal_tax_rate + - g_bett_amt + - id + - inproduction + - ins_addr1 + - ins_addr2 + - ins_city + - ins_co_id + - ins_co_nm + - ins_ct_fn + - ins_ct_ln + - ins_ct_ph + - ins_ct_phx + - ins_ctry + - ins_ea + - ins_fax + - ins_faxx + - ins_memo + - ins_ph1 + - ins_ph1x + - ins_ph2 + - ins_ph2x + - ins_st + - ins_title + - ins_zip + - insd_addr1 + - insd_addr2 + - insd_city + - insd_co_nm + - insd_ctry + - insd_ea + - insd_fax + - insd_faxx + - insd_fn + - insd_ln + - insd_ph1 + - insd_ph1x + - insd_ph2 + - insd_ph2x + - insd_st + - insd_title + - insd_zip + - intakechecklist + - invoice_allocation + - invoice_date + - job_totals + - kanbanparent + - kmin + - kmout + - labor_rate_desc + - labor_rate_id + - local_tax_rate + - loss_cat + - loss_date + - loss_desc + - loss_type + - other_amount_payable + - owner_owing + - ownerid + - ownr_addr1 + - ownr_addr2 + - ownr_city + - ownr_co_nm + - ownr_ctry + - ownr_ea + - ownr_fax + - ownr_faxx + - ownr_fn + - ownr_ln + - ownr_ph1 + - ownr_ph1x + - ownr_ph2 + - ownr_ph2x + - ownr_st + - ownr_title + - ownr_zip + - parts_tax_rates + - pay_amt + - pay_chknm + - pay_date + - pay_type + - payee_nms + - plate_no + - plate_st + - po_number + - policy_no + - production_vars + - rate_atp + - rate_la1 + - rate_la2 + - rate_la3 + - rate_la4 + - rate_laa + - rate_lab + - rate_lad + - rate_lae + - rate_laf + - rate_lag + - rate_lam + - rate_lar + - rate_las + - rate_lau + - rate_ma2s + - rate_ma2t + - rate_ma3s + - rate_mabl + - rate_macs + - rate_mahw + - rate_mapa + - rate_mash + - rate_matd + - referral_source + - regie_number + - ro_number + - scheduled_completion + - scheduled_delivery + - scheduled_in + - selling_dealer + - selling_dealer_contact + - servicing_dealer + - servicing_dealer_contact + - shopid + - special_coverage_policy + - state_tax_rate + - status + - statusid + - storage_payable + - tax_lbr_rt + - tax_levies_rt + - tax_paint_mat_rt + - tax_predis + - tax_prethr + - tax_pstthr + - tax_str_rt + - tax_sub_rt + - tax_thramt + - tax_tow_rt + - theft_ind + - tlos_ind + - towing_payable + - unit_number + - updated_at + - v_color + - v_make_desc + - v_model_desc + - v_model_yr + - v_vin + - vehicleid + computed_fields: [] + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: jobs + schema: public + type: create_select_permission diff --git a/hasura/migrations/1594923695014_update_permission_user_public_table_jobs/up.yaml b/hasura/migrations/1594923695014_update_permission_user_public_table_jobs/up.yaml new file mode 100644 index 000000000..e157ffd56 --- /dev/null +++ b/hasura/migrations/1594923695014_update_permission_user_public_table_jobs/up.yaml @@ -0,0 +1,258 @@ +- args: + role: user + table: + name: jobs + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: true + columns: + - actual_completion + - actual_delivery + - actual_in + - adj_g_disc + - adj_strdis + - adj_towdis + - adjustment_bottom_line + - agt_addr1 + - agt_addr2 + - agt_city + - agt_co_id + - agt_co_nm + - agt_ct_fn + - agt_ct_ln + - agt_ct_ph + - agt_ct_phx + - agt_ctry + - agt_ea + - agt_fax + - agt_faxx + - agt_lic_no + - agt_ph1 + - agt_ph1x + - agt_ph2 + - agt_ph2x + - agt_st + - agt_zip + - area_of_damage + - asgn_date + - asgn_no + - asgn_type + - cat_no + - cieca_stl + - cieca_ttl + - ciecaid + - clm_addr1 + - clm_addr2 + - clm_city + - clm_ct_fn + - clm_ct_ln + - clm_ct_ph + - clm_ct_phx + - clm_ctry + - clm_ea + - clm_fax + - clm_faxx + - clm_no + - clm_ofc_id + - clm_ofc_nm + - clm_ph1 + - clm_ph1x + - clm_ph2 + - clm_ph2x + - clm_st + - clm_title + - clm_total + - clm_zip + - converted + - created_at + - csr + - cust_pr + - date_closed + - date_estimated + - date_exported + - date_invoiced + - date_open + - date_scheduled + - ded_amt + - ded_status + - depreciation_taxes + - employee_body + - employee_refinish + - est_addr1 + - est_addr2 + - est_city + - est_co_nm + - est_ct_fn + - est_ct_ln + - est_ctry + - est_ea + - est_number + - est_ph1 + - est_st + - est_zip + - federal_tax_payable + - federal_tax_rate + - g_bett_amt + - id + - inproduction + - ins_addr1 + - ins_addr2 + - ins_city + - ins_co_id + - ins_co_nm + - ins_ct_fn + - ins_ct_ln + - ins_ct_ph + - ins_ct_phx + - ins_ctry + - ins_ea + - ins_fax + - ins_faxx + - ins_memo + - ins_ph1 + - ins_ph1x + - ins_ph2 + - ins_ph2x + - ins_st + - ins_title + - ins_zip + - insd_addr1 + - insd_addr2 + - insd_city + - insd_co_nm + - insd_ctry + - insd_ea + - insd_fax + - insd_faxx + - insd_fn + - insd_ln + - insd_ph1 + - insd_ph1x + - insd_ph2 + - insd_ph2x + - insd_st + - insd_title + - insd_zip + - intakechecklist + - invoice_allocation + - invoice_date + - job_totals + - kanbanparent + - kmin + - kmout + - labor_rate_desc + - labor_rate_id + - local_tax_rate + - loss_cat + - loss_date + - loss_desc + - loss_type + - other_amount_payable + - owner_owing + - ownerid + - ownr_addr1 + - ownr_addr2 + - ownr_city + - ownr_co_nm + - ownr_ctry + - ownr_ea + - ownr_fax + - ownr_faxx + - ownr_fn + - ownr_ln + - ownr_ph1 + - ownr_ph1x + - ownr_ph2 + - ownr_ph2x + - ownr_st + - ownr_title + - ownr_zip + - parts_tax_rates + - pay_amt + - pay_chknm + - pay_date + - pay_type + - payee_nms + - plate_no + - plate_st + - po_number + - policy_no + - production_vars + - rate_atp + - rate_la1 + - rate_la2 + - rate_la3 + - rate_la4 + - rate_laa + - rate_lab + - rate_lad + - rate_lae + - rate_laf + - rate_lag + - rate_lam + - rate_lar + - rate_las + - rate_lau + - rate_ma2s + - rate_ma2t + - rate_ma3s + - rate_mabl + - rate_macs + - rate_mahw + - rate_mapa + - rate_mash + - rate_matd + - referral_source + - regie_number + - ro_number + - scheduled_completion + - scheduled_delivery + - scheduled_in + - selling_dealer + - selling_dealer_contact + - servicing_dealer + - servicing_dealer_contact + - shopid + - special_coverage_policy + - state_tax_rate + - status + - statusid + - storage_payable + - tax_lbr_rt + - tax_levies_rt + - tax_paint_mat_rt + - tax_predis + - tax_prethr + - tax_pstthr + - tax_str_rt + - tax_sub_rt + - tax_thramt + - tax_tow_rt + - theft_ind + - tlos_ind + - towing_payable + - unit_number + - updated_at + - v_color + - v_make_desc + - v_model_desc + - v_model_yr + - v_vin + - vehicleid + computed_fields: [] + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: jobs + schema: public + type: create_select_permission diff --git a/hasura/migrations/1594923702147_update_permission_user_public_table_jobs/down.yaml b/hasura/migrations/1594923702147_update_permission_user_public_table_jobs/down.yaml new file mode 100644 index 000000000..8d2013ec2 --- /dev/null +++ b/hasura/migrations/1594923702147_update_permission_user_public_table_jobs/down.yaml @@ -0,0 +1,255 @@ +- args: + role: user + table: + name: jobs + schema: public + type: drop_update_permission +- args: + permission: + columns: + - actual_completion + - actual_delivery + - actual_in + - adj_g_disc + - adj_strdis + - adj_towdis + - adjustment_bottom_line + - agt_addr1 + - agt_addr2 + - agt_city + - agt_co_id + - agt_co_nm + - agt_ct_fn + - agt_ct_ln + - agt_ct_ph + - agt_ct_phx + - agt_ctry + - agt_ea + - agt_fax + - agt_faxx + - agt_lic_no + - agt_ph1 + - agt_ph1x + - agt_ph2 + - agt_ph2x + - agt_st + - agt_zip + - area_of_damage + - asgn_date + - asgn_no + - asgn_type + - cat_no + - cieca_stl + - cieca_ttl + - ciecaid + - clm_addr1 + - clm_addr2 + - clm_city + - clm_ct_fn + - clm_ct_ln + - clm_ct_ph + - clm_ct_phx + - clm_ctry + - clm_ea + - clm_fax + - clm_faxx + - clm_no + - clm_ofc_id + - clm_ofc_nm + - clm_ph1 + - clm_ph1x + - clm_ph2 + - clm_ph2x + - clm_st + - clm_title + - clm_total + - clm_zip + - converted + - created_at + - csr + - cust_pr + - date_closed + - date_estimated + - date_exported + - date_invoiced + - date_open + - date_scheduled + - ded_amt + - ded_status + - depreciation_taxes + - est_addr1 + - est_addr2 + - est_city + - est_co_nm + - est_ct_fn + - est_ct_ln + - est_ctry + - est_ea + - est_number + - est_ph1 + - est_st + - est_zip + - federal_tax_payable + - federal_tax_rate + - g_bett_amt + - id + - inproduction + - ins_addr1 + - ins_addr2 + - ins_city + - ins_co_id + - ins_co_nm + - ins_ct_fn + - ins_ct_ln + - ins_ct_ph + - ins_ct_phx + - ins_ctry + - ins_ea + - ins_fax + - ins_faxx + - ins_memo + - ins_ph1 + - ins_ph1x + - ins_ph2 + - ins_ph2x + - ins_st + - ins_title + - ins_zip + - insd_addr1 + - insd_addr2 + - insd_city + - insd_co_nm + - insd_ctry + - insd_ea + - insd_fax + - insd_faxx + - insd_fn + - insd_ln + - insd_ph1 + - insd_ph1x + - insd_ph2 + - insd_ph2x + - insd_st + - insd_title + - insd_zip + - intakechecklist + - invoice_allocation + - invoice_date + - job_totals + - kanbanparent + - kmin + - kmout + - labor_rate_desc + - labor_rate_id + - local_tax_rate + - loss_cat + - loss_date + - loss_desc + - loss_type + - other_amount_payable + - owner_owing + - ownerid + - ownr_addr1 + - ownr_addr2 + - ownr_city + - ownr_co_nm + - ownr_ctry + - ownr_ea + - ownr_fax + - ownr_faxx + - ownr_fn + - ownr_ln + - ownr_ph1 + - ownr_ph1x + - ownr_ph2 + - ownr_ph2x + - ownr_st + - ownr_title + - ownr_zip + - parts_tax_rates + - pay_amt + - pay_chknm + - pay_date + - pay_type + - payee_nms + - plate_no + - plate_st + - po_number + - policy_no + - production_vars + - rate_atp + - rate_la1 + - rate_la2 + - rate_la3 + - rate_la4 + - rate_laa + - rate_lab + - rate_lad + - rate_lae + - rate_laf + - rate_lag + - rate_lam + - rate_lar + - rate_las + - rate_lau + - rate_ma2s + - rate_ma2t + - rate_ma3s + - rate_mabl + - rate_macs + - rate_mahw + - rate_mapa + - rate_mash + - rate_matd + - referral_source + - regie_number + - ro_number + - scheduled_completion + - scheduled_delivery + - scheduled_in + - selling_dealer + - selling_dealer_contact + - servicing_dealer + - servicing_dealer_contact + - shopid + - special_coverage_policy + - state_tax_rate + - status + - statusid + - storage_payable + - tax_lbr_rt + - tax_levies_rt + - tax_paint_mat_rt + - tax_predis + - tax_prethr + - tax_pstthr + - tax_str_rt + - tax_sub_rt + - tax_thramt + - tax_tow_rt + - theft_ind + - tlos_ind + - towing_payable + - unit_number + - updated_at + - v_color + - v_make_desc + - v_model_desc + - v_model_yr + - v_vin + - vehicleid + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + set: {} + role: user + table: + name: jobs + schema: public + type: create_update_permission diff --git a/hasura/migrations/1594923702147_update_permission_user_public_table_jobs/up.yaml b/hasura/migrations/1594923702147_update_permission_user_public_table_jobs/up.yaml new file mode 100644 index 000000000..4e85e20cd --- /dev/null +++ b/hasura/migrations/1594923702147_update_permission_user_public_table_jobs/up.yaml @@ -0,0 +1,257 @@ +- args: + role: user + table: + name: jobs + schema: public + type: drop_update_permission +- args: + permission: + columns: + - actual_completion + - actual_delivery + - actual_in + - adj_g_disc + - adj_strdis + - adj_towdis + - adjustment_bottom_line + - agt_addr1 + - agt_addr2 + - agt_city + - agt_co_id + - agt_co_nm + - agt_ct_fn + - agt_ct_ln + - agt_ct_ph + - agt_ct_phx + - agt_ctry + - agt_ea + - agt_fax + - agt_faxx + - agt_lic_no + - agt_ph1 + - agt_ph1x + - agt_ph2 + - agt_ph2x + - agt_st + - agt_zip + - area_of_damage + - asgn_date + - asgn_no + - asgn_type + - cat_no + - cieca_stl + - cieca_ttl + - ciecaid + - clm_addr1 + - clm_addr2 + - clm_city + - clm_ct_fn + - clm_ct_ln + - clm_ct_ph + - clm_ct_phx + - clm_ctry + - clm_ea + - clm_fax + - clm_faxx + - clm_no + - clm_ofc_id + - clm_ofc_nm + - clm_ph1 + - clm_ph1x + - clm_ph2 + - clm_ph2x + - clm_st + - clm_title + - clm_total + - clm_zip + - converted + - created_at + - csr + - cust_pr + - date_closed + - date_estimated + - date_exported + - date_invoiced + - date_open + - date_scheduled + - ded_amt + - ded_status + - depreciation_taxes + - employee_body + - employee_refinish + - est_addr1 + - est_addr2 + - est_city + - est_co_nm + - est_ct_fn + - est_ct_ln + - est_ctry + - est_ea + - est_number + - est_ph1 + - est_st + - est_zip + - federal_tax_payable + - federal_tax_rate + - g_bett_amt + - id + - inproduction + - ins_addr1 + - ins_addr2 + - ins_city + - ins_co_id + - ins_co_nm + - ins_ct_fn + - ins_ct_ln + - ins_ct_ph + - ins_ct_phx + - ins_ctry + - ins_ea + - ins_fax + - ins_faxx + - ins_memo + - ins_ph1 + - ins_ph1x + - ins_ph2 + - ins_ph2x + - ins_st + - ins_title + - ins_zip + - insd_addr1 + - insd_addr2 + - insd_city + - insd_co_nm + - insd_ctry + - insd_ea + - insd_fax + - insd_faxx + - insd_fn + - insd_ln + - insd_ph1 + - insd_ph1x + - insd_ph2 + - insd_ph2x + - insd_st + - insd_title + - insd_zip + - intakechecklist + - invoice_allocation + - invoice_date + - job_totals + - kanbanparent + - kmin + - kmout + - labor_rate_desc + - labor_rate_id + - local_tax_rate + - loss_cat + - loss_date + - loss_desc + - loss_type + - other_amount_payable + - owner_owing + - ownerid + - ownr_addr1 + - ownr_addr2 + - ownr_city + - ownr_co_nm + - ownr_ctry + - ownr_ea + - ownr_fax + - ownr_faxx + - ownr_fn + - ownr_ln + - ownr_ph1 + - ownr_ph1x + - ownr_ph2 + - ownr_ph2x + - ownr_st + - ownr_title + - ownr_zip + - parts_tax_rates + - pay_amt + - pay_chknm + - pay_date + - pay_type + - payee_nms + - plate_no + - plate_st + - po_number + - policy_no + - production_vars + - rate_atp + - rate_la1 + - rate_la2 + - rate_la3 + - rate_la4 + - rate_laa + - rate_lab + - rate_lad + - rate_lae + - rate_laf + - rate_lag + - rate_lam + - rate_lar + - rate_las + - rate_lau + - rate_ma2s + - rate_ma2t + - rate_ma3s + - rate_mabl + - rate_macs + - rate_mahw + - rate_mapa + - rate_mash + - rate_matd + - referral_source + - regie_number + - ro_number + - scheduled_completion + - scheduled_delivery + - scheduled_in + - selling_dealer + - selling_dealer_contact + - servicing_dealer + - servicing_dealer_contact + - shopid + - special_coverage_policy + - state_tax_rate + - status + - statusid + - storage_payable + - tax_lbr_rt + - tax_levies_rt + - tax_paint_mat_rt + - tax_predis + - tax_prethr + - tax_pstthr + - tax_str_rt + - tax_sub_rt + - tax_thramt + - tax_tow_rt + - theft_ind + - tlos_ind + - towing_payable + - unit_number + - updated_at + - v_color + - v_make_desc + - v_model_desc + - v_model_yr + - v_vin + - vehicleid + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + set: {} + role: user + table: + name: jobs + schema: public + type: create_update_permission diff --git a/hasura/migrations/1594925500847_rename_relationship_employee_to_employee_refinish_rel_schema_public_table_jobs/down.yaml b/hasura/migrations/1594925500847_rename_relationship_employee_to_employee_refinish_rel_schema_public_table_jobs/down.yaml new file mode 100644 index 000000000..31423f50b --- /dev/null +++ b/hasura/migrations/1594925500847_rename_relationship_employee_to_employee_refinish_rel_schema_public_table_jobs/down.yaml @@ -0,0 +1,7 @@ +- args: + name: employee_refinish_rel + new_name: employee + table: + name: jobs + schema: public + type: rename_relationship diff --git a/hasura/migrations/1594925500847_rename_relationship_employee_to_employee_refinish_rel_schema_public_table_jobs/up.yaml b/hasura/migrations/1594925500847_rename_relationship_employee_to_employee_refinish_rel_schema_public_table_jobs/up.yaml new file mode 100644 index 000000000..27fa63b3b --- /dev/null +++ b/hasura/migrations/1594925500847_rename_relationship_employee_to_employee_refinish_rel_schema_public_table_jobs/up.yaml @@ -0,0 +1,7 @@ +- args: + name: employee + new_name: employee_refinish_rel + table: + name: jobs + schema: public + type: rename_relationship diff --git a/hasura/migrations/1594925511356_rename_relationship_employeeByEmployeeBody_to_employee_body_rel_schema_public_table_jobs/down.yaml b/hasura/migrations/1594925511356_rename_relationship_employeeByEmployeeBody_to_employee_body_rel_schema_public_table_jobs/down.yaml new file mode 100644 index 000000000..1dcfe0459 --- /dev/null +++ b/hasura/migrations/1594925511356_rename_relationship_employeeByEmployeeBody_to_employee_body_rel_schema_public_table_jobs/down.yaml @@ -0,0 +1,7 @@ +- args: + name: employee_body_rel + new_name: employeeByEmployeeBody + table: + name: jobs + schema: public + type: rename_relationship diff --git a/hasura/migrations/1594925511356_rename_relationship_employeeByEmployeeBody_to_employee_body_rel_schema_public_table_jobs/up.yaml b/hasura/migrations/1594925511356_rename_relationship_employeeByEmployeeBody_to_employee_body_rel_schema_public_table_jobs/up.yaml new file mode 100644 index 000000000..74881e299 --- /dev/null +++ b/hasura/migrations/1594925511356_rename_relationship_employeeByEmployeeBody_to_employee_body_rel_schema_public_table_jobs/up.yaml @@ -0,0 +1,7 @@ +- args: + name: employeeByEmployeeBody + new_name: employee_body_rel + table: + name: jobs + schema: public + type: rename_relationship diff --git a/hasura/migrations/1594932730719_run_sql_migration/down.yaml b/hasura/migrations/1594932730719_run_sql_migration/down.yaml new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/hasura/migrations/1594932730719_run_sql_migration/down.yaml @@ -0,0 +1 @@ +[] diff --git a/hasura/migrations/1594932730719_run_sql_migration/up.yaml b/hasura/migrations/1594932730719_run_sql_migration/up.yaml new file mode 100644 index 000000000..7bc1377bd --- /dev/null +++ b/hasura/migrations/1594932730719_run_sql_migration/up.yaml @@ -0,0 +1,20 @@ +- args: + cascade: true + read_only: false + sql: "CREATE OR REPLACE VIEW \"public\".\"productionview\" AS \n SELECT j.id,\n + \ j.status,\n j.ro_number,\n j.est_number,\n j.ownr_fn,\n j.ownr_ln,\n + \ j.v_model_yr,\n j.v_model_desc,\n j.clm_no,\n j.v_make_desc,\n + \ j.v_color,\n j.plate_no,\n j.actual_in,\n j.scheduled_completion,\n + \ j.scheduled_delivery,\n j.ins_co_nm,\n j.clm_total,\n j.ownr_ph1,\n + \ j.special_coverage_policy,\n j.production_vars,\n lab.labhrs,\n lar.larhrs,\n + \ j.shopid,\n parts.partcount,\n j.kanbanparent,\n j.employee_body,\n + \ j.employee_refinish\n FROM (((jobs j\n LEFT JOIN ( SELECT l.jobid,\n + \ sum(l.mod_lb_hrs) AS labhrs\n FROM joblines l\n WHERE + (l.mod_lbr_ty = 'LAB'::text)\n GROUP BY l.jobid) lab ON ((lab.jobid + = j.id)))\n LEFT JOIN ( SELECT l2.jobid,\n sum(l2.mod_lb_hrs) + AS larhrs\n FROM joblines l2\n WHERE (l2.mod_lbr_ty = 'LAR'::text)\n + \ GROUP BY l2.jobid) lar ON ((lar.jobid = j.id)))\n LEFT JOIN ( + SELECT l3.jobid,\n json_agg(l3.status) AS partcount\n FROM + joblines l3\n WHERE (l3.part_type IS NOT NULL)\n GROUP BY + l3.jobid) parts ON ((parts.jobid = j.id)))\n WHERE (j.inproduction = true);" + type: run_sql diff --git a/hasura/migrations/1594932762413_create_relationship_employee_refinish_rel_public_table_productionview/down.yaml b/hasura/migrations/1594932762413_create_relationship_employee_refinish_rel_public_table_productionview/down.yaml new file mode 100644 index 000000000..e29526af1 --- /dev/null +++ b/hasura/migrations/1594932762413_create_relationship_employee_refinish_rel_public_table_productionview/down.yaml @@ -0,0 +1,6 @@ +- args: + relationship: employee_refinish_rel + table: + name: productionview + schema: public + type: drop_relationship diff --git a/hasura/migrations/1594932762413_create_relationship_employee_refinish_rel_public_table_productionview/up.yaml b/hasura/migrations/1594932762413_create_relationship_employee_refinish_rel_public_table_productionview/up.yaml new file mode 100644 index 000000000..5ee8b08b6 --- /dev/null +++ b/hasura/migrations/1594932762413_create_relationship_employee_refinish_rel_public_table_productionview/up.yaml @@ -0,0 +1,13 @@ +- args: + name: employee_refinish_rel + table: + name: productionview + schema: public + using: + manual_configuration: + column_mapping: + employee_refinish: id + remote_table: + name: employees + schema: public + type: create_object_relationship diff --git a/hasura/migrations/1594932786764_create_relationship_employee_body_rel_public_table_productionview/down.yaml b/hasura/migrations/1594932786764_create_relationship_employee_body_rel_public_table_productionview/down.yaml new file mode 100644 index 000000000..580a35af6 --- /dev/null +++ b/hasura/migrations/1594932786764_create_relationship_employee_body_rel_public_table_productionview/down.yaml @@ -0,0 +1,6 @@ +- args: + relationship: employee_body_rel + table: + name: productionview + schema: public + type: drop_relationship diff --git a/hasura/migrations/1594932786764_create_relationship_employee_body_rel_public_table_productionview/up.yaml b/hasura/migrations/1594932786764_create_relationship_employee_body_rel_public_table_productionview/up.yaml new file mode 100644 index 000000000..8a3bbec81 --- /dev/null +++ b/hasura/migrations/1594932786764_create_relationship_employee_body_rel_public_table_productionview/up.yaml @@ -0,0 +1,13 @@ +- args: + name: employee_body_rel + table: + name: productionview + schema: public + using: + manual_configuration: + column_mapping: + employee_body: id + remote_table: + name: employees + schema: public + type: create_object_relationship diff --git a/hasura/migrations/1594934537921_drop_function_public_search_owner/down.yaml b/hasura/migrations/1594934537921_drop_function_public_search_owner/down.yaml new file mode 100644 index 000000000..22e6a5b37 --- /dev/null +++ b/hasura/migrations/1594934537921_drop_function_public_search_owner/down.yaml @@ -0,0 +1,9 @@ +- args: + cascade: false + read_only: false + sql: "CREATE OR REPLACE FUNCTION public.search_owner(search text)\n RETURNS SETOF + owners\n LANGUAGE plpgsql\n STABLE\nAS $function$\r\n\r\nBEGIN\r\n if search + = '' then\r\n return query select * from owners ;\r\n else \r\n return + query SELECT\r\n *\r\nFROM\r\n owners\r\nWHERE\r\n search <% (ownr_fn) OR\r\n + \ search <% (ownr_ln) OR\r\n search <% (ownr_co_nm) ;\r\n end if;\r\n\r\n\tEND\r\n$function$;" + type: run_sql diff --git a/hasura/migrations/1594934537921_drop_function_public_search_owner/up.yaml b/hasura/migrations/1594934537921_drop_function_public_search_owner/up.yaml new file mode 100644 index 000000000..dacf4304c --- /dev/null +++ b/hasura/migrations/1594934537921_drop_function_public_search_owner/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: DROP FUNCTION "public"."search_owner"("pg_catalog"."text"); + type: run_sql diff --git a/hasura/migrations/1595368680511_alter_table_public_bodyshops_add_column_md_messaging_presets/down.yaml b/hasura/migrations/1595368680511_alter_table_public_bodyshops_add_column_md_messaging_presets/down.yaml new file mode 100644 index 000000000..7181e71eb --- /dev/null +++ b/hasura/migrations/1595368680511_alter_table_public_bodyshops_add_column_md_messaging_presets/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."bodyshops" DROP COLUMN "md_messaging_presets"; + type: run_sql diff --git a/hasura/migrations/1595368680511_alter_table_public_bodyshops_add_column_md_messaging_presets/up.yaml b/hasura/migrations/1595368680511_alter_table_public_bodyshops_add_column_md_messaging_presets/up.yaml new file mode 100644 index 000000000..4effad2dc --- /dev/null +++ b/hasura/migrations/1595368680511_alter_table_public_bodyshops_add_column_md_messaging_presets/up.yaml @@ -0,0 +1,6 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."bodyshops" ADD COLUMN "md_messaging_presets" jsonb + NULL DEFAULT jsonb_build_array(); + type: run_sql diff --git a/hasura/migrations/1595368689122_update_permission_user_public_table_bodyshops/down.yaml b/hasura/migrations/1595368689122_update_permission_user_public_table_bodyshops/down.yaml new file mode 100644 index 000000000..a356f7c0d --- /dev/null +++ b/hasura/migrations/1595368689122_update_permission_user_public_table_bodyshops/down.yaml @@ -0,0 +1,56 @@ +- args: + role: user + table: + name: bodyshops + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - accountingconfig + - address1 + - address2 + - appt_length + - city + - country + - created_at + - email + - federal_tax_id + - id + - inhousevendorid + - insurance_vendor_id + - intakechecklist + - invoice_tax_rates + - logo_img_path + - md_order_statuses + - md_referral_sources + - md_responsibility_centers + - md_ro_statuses + - messagingservicesid + - production_config + - region_config + - scoreboard_target + - shopname + - shoprates + - ssbuckets + - state + - state_tax_id + - stripe_acct_id + - template_header + - textid + - updated_at + - zip_post + computed_fields: [] + filter: + associations: + bodyshop: + associations: + user: + authid: + _eq: X-Hasura-User-Id + role: user + table: + name: bodyshops + schema: public + type: create_select_permission diff --git a/hasura/migrations/1595368689122_update_permission_user_public_table_bodyshops/up.yaml b/hasura/migrations/1595368689122_update_permission_user_public_table_bodyshops/up.yaml new file mode 100644 index 000000000..b0494d6ee --- /dev/null +++ b/hasura/migrations/1595368689122_update_permission_user_public_table_bodyshops/up.yaml @@ -0,0 +1,57 @@ +- args: + role: user + table: + name: bodyshops + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - accountingconfig + - address1 + - address2 + - appt_length + - city + - country + - created_at + - email + - federal_tax_id + - id + - inhousevendorid + - insurance_vendor_id + - intakechecklist + - invoice_tax_rates + - logo_img_path + - md_messaging_presets + - md_order_statuses + - md_referral_sources + - md_responsibility_centers + - md_ro_statuses + - messagingservicesid + - production_config + - region_config + - scoreboard_target + - shopname + - shoprates + - ssbuckets + - state + - state_tax_id + - stripe_acct_id + - template_header + - textid + - updated_at + - zip_post + computed_fields: [] + filter: + associations: + bodyshop: + associations: + user: + authid: + _eq: X-Hasura-User-Id + role: user + table: + name: bodyshops + schema: public + type: create_select_permission diff --git a/hasura/migrations/1595370737421_update_permission_user_public_table_bodyshops/down.yaml b/hasura/migrations/1595370737421_update_permission_user_public_table_bodyshops/down.yaml new file mode 100644 index 000000000..e3ade79e8 --- /dev/null +++ b/hasura/migrations/1595370737421_update_permission_user_public_table_bodyshops/down.yaml @@ -0,0 +1,50 @@ +- args: + role: user + table: + name: bodyshops + schema: public + type: drop_update_permission +- args: + permission: + columns: + - accountingconfig + - address1 + - address2 + - appt_length + - city + - country + - created_at + - email + - federal_tax_id + - id + - inhousevendorid + - insurance_vendor_id + - intakechecklist + - invoice_tax_rates + - logo_img_path + - md_order_statuses + - md_referral_sources + - md_responsibility_centers + - md_ro_statuses + - production_config + - scoreboard_target + - shopname + - shoprates + - ssbuckets + - state + - state_tax_id + - updated_at + - zip_post + filter: + associations: + bodyshop: + associations: + user: + authid: + _eq: X-Hasura-User-Id + set: {} + role: user + table: + name: bodyshops + schema: public + type: create_update_permission diff --git a/hasura/migrations/1595370737421_update_permission_user_public_table_bodyshops/up.yaml b/hasura/migrations/1595370737421_update_permission_user_public_table_bodyshops/up.yaml new file mode 100644 index 000000000..5702e6737 --- /dev/null +++ b/hasura/migrations/1595370737421_update_permission_user_public_table_bodyshops/up.yaml @@ -0,0 +1,51 @@ +- args: + role: user + table: + name: bodyshops + schema: public + type: drop_update_permission +- args: + permission: + columns: + - accountingconfig + - address1 + - address2 + - appt_length + - city + - country + - created_at + - email + - federal_tax_id + - id + - inhousevendorid + - insurance_vendor_id + - intakechecklist + - invoice_tax_rates + - logo_img_path + - md_messaging_presets + - md_order_statuses + - md_referral_sources + - md_responsibility_centers + - md_ro_statuses + - production_config + - scoreboard_target + - shopname + - shoprates + - ssbuckets + - state + - state_tax_id + - updated_at + - zip_post + filter: + associations: + bodyshop: + associations: + user: + authid: + _eq: X-Hasura-User-Id + set: {} + role: user + table: + name: bodyshops + schema: public + type: create_update_permission diff --git a/hasura/migrations/1595971170482_run_sql_migration/down.yaml b/hasura/migrations/1595971170482_run_sql_migration/down.yaml new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/hasura/migrations/1595971170482_run_sql_migration/down.yaml @@ -0,0 +1 @@ +[] diff --git a/hasura/migrations/1595971170482_run_sql_migration/up.yaml b/hasura/migrations/1595971170482_run_sql_migration/up.yaml new file mode 100644 index 000000000..12d51c766 --- /dev/null +++ b/hasura/migrations/1595971170482_run_sql_migration/up.yaml @@ -0,0 +1,6 @@ +- args: + cascade: true + read_only: false + sql: CREATE INDEX idx_invoices_invoicenumber ON invoices USING GIN (invoice_number + gin_trgm_ops); + type: run_sql diff --git a/hasura/migrations/1595971216422_run_sql_migration/down.yaml b/hasura/migrations/1595971216422_run_sql_migration/down.yaml new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/hasura/migrations/1595971216422_run_sql_migration/down.yaml @@ -0,0 +1 @@ +[] diff --git a/hasura/migrations/1595971216422_run_sql_migration/up.yaml b/hasura/migrations/1595971216422_run_sql_migration/up.yaml new file mode 100644 index 000000000..5e9aff249 --- /dev/null +++ b/hasura/migrations/1595971216422_run_sql_migration/up.yaml @@ -0,0 +1,12 @@ +- args: + cascade: true + read_only: false + sql: "CREATE OR REPLACE FUNCTION public.search_invoices(search text)\n RETURNS + SETOF invoices\n LANGUAGE plpgsql\n STABLE\nAS $function$\n\nBEGIN\n if search + = '' then\n return query select * from invoices ;\n else \n return query + SELECT\n *\nFROM\n payments\nWHERE\n search <% (invoice_number);\n end if;\n\n\tEND\n$function$;" + type: run_sql +- args: + name: search_invoices + schema: public + type: track_function diff --git a/hasura/migrations/1595973678869_run_sql_migration/down.yaml b/hasura/migrations/1595973678869_run_sql_migration/down.yaml new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/hasura/migrations/1595973678869_run_sql_migration/down.yaml @@ -0,0 +1 @@ +[] diff --git a/hasura/migrations/1595973678869_run_sql_migration/up.yaml b/hasura/migrations/1595973678869_run_sql_migration/up.yaml new file mode 100644 index 000000000..410506db0 --- /dev/null +++ b/hasura/migrations/1595973678869_run_sql_migration/up.yaml @@ -0,0 +1,8 @@ +- args: + cascade: true + read_only: false + sql: "CREATE OR REPLACE FUNCTION public.search_invoices(search text)\n RETURNS + SETOF invoices\n LANGUAGE plpgsql\n STABLE\nAS $function$\n\nBEGIN\n if search + = '' then\n return query select * from invoices ;\n else \n return query + SELECT\n *\nFROM\n invoices\nWHERE\n search <% (invoice_number);\n end if;\n\n\tEND\n$function$;" + type: run_sql diff --git a/hasura/migrations/1595980612052_alter_table_public_cccontracts_add_column_contract_date/down.yaml b/hasura/migrations/1595980612052_alter_table_public_cccontracts_add_column_contract_date/down.yaml new file mode 100644 index 000000000..128efc232 --- /dev/null +++ b/hasura/migrations/1595980612052_alter_table_public_cccontracts_add_column_contract_date/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."cccontracts" DROP COLUMN "contract_date"; + type: run_sql diff --git a/hasura/migrations/1595980612052_alter_table_public_cccontracts_add_column_contract_date/up.yaml b/hasura/migrations/1595980612052_alter_table_public_cccontracts_add_column_contract_date/up.yaml new file mode 100644 index 000000000..960f6ee10 --- /dev/null +++ b/hasura/migrations/1595980612052_alter_table_public_cccontracts_add_column_contract_date/up.yaml @@ -0,0 +1,6 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."cccontracts" ADD COLUMN "contract_date" date NOT NULL + DEFAULT now(); + type: run_sql diff --git a/hasura/migrations/1595980626673_update_permission_user_public_table_cccontracts/down.yaml b/hasura/migrations/1595980626673_update_permission_user_public_table_cccontracts/down.yaml new file mode 100644 index 000000000..db9b9c2f5 --- /dev/null +++ b/hasura/migrations/1595980626673_update_permission_user_public_table_cccontracts/down.yaml @@ -0,0 +1,52 @@ +- args: + role: user + table: + name: cccontracts + schema: public + type: drop_insert_permission +- args: + permission: + check: + courtesycar: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - id + - created_at + - updated_at + - agreementnumber + - courtesycarid + - jobid + - status + - start + - scheduledreturn + - actualreturn + - kmstart + - kmend + - driver_dlnumber + - driver_dlexpiry + - driver_dlst + - driver_fn + - driver_ln + - driver_addr1 + - driver_addr2 + - driver_city + - driver_state + - driver_zip + - driver_ph1 + - driver_dob + - cc_num + - cc_expiry + - cc_cardholder + set: {} + role: user + table: + name: cccontracts + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1595980626673_update_permission_user_public_table_cccontracts/up.yaml b/hasura/migrations/1595980626673_update_permission_user_public_table_cccontracts/up.yaml new file mode 100644 index 000000000..c1a342491 --- /dev/null +++ b/hasura/migrations/1595980626673_update_permission_user_public_table_cccontracts/up.yaml @@ -0,0 +1,53 @@ +- args: + role: user + table: + name: cccontracts + schema: public + type: drop_insert_permission +- args: + permission: + check: + courtesycar: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - actualreturn + - agreementnumber + - cc_cardholder + - cc_expiry + - cc_num + - contract_date + - courtesycarid + - created_at + - driver_addr1 + - driver_addr2 + - driver_city + - driver_dlexpiry + - driver_dlnumber + - driver_dlst + - driver_dob + - driver_fn + - driver_ln + - driver_ph1 + - driver_state + - driver_zip + - id + - jobid + - kmend + - kmstart + - scheduledreturn + - start + - status + - updated_at + set: {} + role: user + table: + name: cccontracts + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1595980634440_update_permission_user_public_table_cccontracts/down.yaml b/hasura/migrations/1595980634440_update_permission_user_public_table_cccontracts/down.yaml new file mode 100644 index 000000000..f9250216f --- /dev/null +++ b/hasura/migrations/1595980634440_update_permission_user_public_table_cccontracts/down.yaml @@ -0,0 +1,53 @@ +- args: + role: user + table: + name: cccontracts + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - actualreturn + - driver_dlexpiry + - driver_dob + - scheduledreturn + - start + - agreementnumber + - kmend + - kmstart + - cc_cardholder + - cc_expiry + - cc_num + - driver_addr1 + - driver_addr2 + - driver_city + - driver_dlnumber + - driver_dlst + - driver_fn + - driver_ln + - driver_ph1 + - driver_state + - driver_zip + - status + - created_at + - updated_at + - courtesycarid + - id + - jobid + computed_fields: [] + filter: + courtesycar: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: cccontracts + schema: public + type: create_select_permission diff --git a/hasura/migrations/1595980634440_update_permission_user_public_table_cccontracts/up.yaml b/hasura/migrations/1595980634440_update_permission_user_public_table_cccontracts/up.yaml new file mode 100644 index 000000000..4540f23c1 --- /dev/null +++ b/hasura/migrations/1595980634440_update_permission_user_public_table_cccontracts/up.yaml @@ -0,0 +1,54 @@ +- args: + role: user + table: + name: cccontracts + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - actualreturn + - agreementnumber + - cc_cardholder + - cc_expiry + - cc_num + - contract_date + - courtesycarid + - created_at + - driver_addr1 + - driver_addr2 + - driver_city + - driver_dlexpiry + - driver_dlnumber + - driver_dlst + - driver_dob + - driver_fn + - driver_ln + - driver_ph1 + - driver_state + - driver_zip + - id + - jobid + - kmend + - kmstart + - scheduledreturn + - start + - status + - updated_at + computed_fields: [] + filter: + courtesycar: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: cccontracts + schema: public + type: create_select_permission diff --git a/hasura/migrations/1595980641113_update_permission_user_public_table_cccontracts/down.yaml b/hasura/migrations/1595980641113_update_permission_user_public_table_cccontracts/down.yaml new file mode 100644 index 000000000..8c03f840b --- /dev/null +++ b/hasura/migrations/1595980641113_update_permission_user_public_table_cccontracts/down.yaml @@ -0,0 +1,52 @@ +- args: + role: user + table: + name: cccontracts + schema: public + type: drop_update_permission +- args: + permission: + columns: + - actualreturn + - driver_dlexpiry + - driver_dob + - scheduledreturn + - start + - agreementnumber + - kmend + - kmstart + - cc_cardholder + - cc_expiry + - cc_num + - driver_addr1 + - driver_addr2 + - driver_city + - driver_dlnumber + - driver_dlst + - driver_fn + - driver_ln + - driver_ph1 + - driver_state + - driver_zip + - status + - created_at + - updated_at + - courtesycarid + - id + - jobid + filter: + courtesycar: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + set: {} + role: user + table: + name: cccontracts + schema: public + type: create_update_permission diff --git a/hasura/migrations/1595980641113_update_permission_user_public_table_cccontracts/up.yaml b/hasura/migrations/1595980641113_update_permission_user_public_table_cccontracts/up.yaml new file mode 100644 index 000000000..940a40c86 --- /dev/null +++ b/hasura/migrations/1595980641113_update_permission_user_public_table_cccontracts/up.yaml @@ -0,0 +1,53 @@ +- args: + role: user + table: + name: cccontracts + schema: public + type: drop_update_permission +- args: + permission: + columns: + - actualreturn + - agreementnumber + - cc_cardholder + - cc_expiry + - cc_num + - contract_date + - courtesycarid + - created_at + - driver_addr1 + - driver_addr2 + - driver_city + - driver_dlexpiry + - driver_dlnumber + - driver_dlst + - driver_dob + - driver_fn + - driver_ln + - driver_ph1 + - driver_state + - driver_zip + - id + - jobid + - kmend + - kmstart + - scheduledreturn + - start + - status + - updated_at + filter: + courtesycar: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + set: {} + role: user + table: + name: cccontracts + schema: public + type: create_update_permission diff --git a/hasura/migrations/1595981259823_alter_table_public_cccontracts_alter_column_scheduledreturn/down.yaml b/hasura/migrations/1595981259823_alter_table_public_cccontracts_alter_column_scheduledreturn/down.yaml new file mode 100644 index 000000000..587054ea2 --- /dev/null +++ b/hasura/migrations/1595981259823_alter_table_public_cccontracts_alter_column_scheduledreturn/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."cccontracts" ALTER COLUMN "scheduledreturn" TYPE date; + type: run_sql diff --git a/hasura/migrations/1595981259823_alter_table_public_cccontracts_alter_column_scheduledreturn/up.yaml b/hasura/migrations/1595981259823_alter_table_public_cccontracts_alter_column_scheduledreturn/up.yaml new file mode 100644 index 000000000..d8ac374c6 --- /dev/null +++ b/hasura/migrations/1595981259823_alter_table_public_cccontracts_alter_column_scheduledreturn/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."cccontracts" ALTER COLUMN "scheduledreturn" TYPE timestamptz; + type: run_sql diff --git a/hasura/migrations/1595981268153_alter_table_public_cccontracts_alter_column_actualreturn/down.yaml b/hasura/migrations/1595981268153_alter_table_public_cccontracts_alter_column_actualreturn/down.yaml new file mode 100644 index 000000000..a0f395fb8 --- /dev/null +++ b/hasura/migrations/1595981268153_alter_table_public_cccontracts_alter_column_actualreturn/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."cccontracts" ALTER COLUMN "actualreturn" TYPE date; + type: run_sql diff --git a/hasura/migrations/1595981268153_alter_table_public_cccontracts_alter_column_actualreturn/up.yaml b/hasura/migrations/1595981268153_alter_table_public_cccontracts_alter_column_actualreturn/up.yaml new file mode 100644 index 000000000..113266fb0 --- /dev/null +++ b/hasura/migrations/1595981268153_alter_table_public_cccontracts_alter_column_actualreturn/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."cccontracts" ALTER COLUMN "actualreturn" TYPE timestamptz; + type: run_sql diff --git a/hasura/migrations/1595981281561_alter_table_public_cccontracts_alter_column_start/down.yaml b/hasura/migrations/1595981281561_alter_table_public_cccontracts_alter_column_start/down.yaml new file mode 100644 index 000000000..51e31e840 --- /dev/null +++ b/hasura/migrations/1595981281561_alter_table_public_cccontracts_alter_column_start/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."cccontracts" ALTER COLUMN "start" TYPE date; + type: run_sql diff --git a/hasura/migrations/1595981281561_alter_table_public_cccontracts_alter_column_start/up.yaml b/hasura/migrations/1595981281561_alter_table_public_cccontracts_alter_column_start/up.yaml new file mode 100644 index 000000000..dfc83aeb4 --- /dev/null +++ b/hasura/migrations/1595981281561_alter_table_public_cccontracts_alter_column_start/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."cccontracts" ALTER COLUMN "start" TYPE timestamptz; + type: run_sql diff --git a/hasura/migrations/1596043759608_update_permission_user_public_table_cccontracts/down.yaml b/hasura/migrations/1596043759608_update_permission_user_public_table_cccontracts/down.yaml new file mode 100644 index 000000000..4540f23c1 --- /dev/null +++ b/hasura/migrations/1596043759608_update_permission_user_public_table_cccontracts/down.yaml @@ -0,0 +1,54 @@ +- args: + role: user + table: + name: cccontracts + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - actualreturn + - agreementnumber + - cc_cardholder + - cc_expiry + - cc_num + - contract_date + - courtesycarid + - created_at + - driver_addr1 + - driver_addr2 + - driver_city + - driver_dlexpiry + - driver_dlnumber + - driver_dlst + - driver_dob + - driver_fn + - driver_ln + - driver_ph1 + - driver_state + - driver_zip + - id + - jobid + - kmend + - kmstart + - scheduledreturn + - start + - status + - updated_at + computed_fields: [] + filter: + courtesycar: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: cccontracts + schema: public + type: create_select_permission diff --git a/hasura/migrations/1596043759608_update_permission_user_public_table_cccontracts/up.yaml b/hasura/migrations/1596043759608_update_permission_user_public_table_cccontracts/up.yaml new file mode 100644 index 000000000..7c8f665fe --- /dev/null +++ b/hasura/migrations/1596043759608_update_permission_user_public_table_cccontracts/up.yaml @@ -0,0 +1,54 @@ +- args: + role: user + table: + name: cccontracts + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: true + columns: + - actualreturn + - agreementnumber + - cc_cardholder + - cc_expiry + - cc_num + - contract_date + - courtesycarid + - created_at + - driver_addr1 + - driver_addr2 + - driver_city + - driver_dlexpiry + - driver_dlnumber + - driver_dlst + - driver_dob + - driver_fn + - driver_ln + - driver_ph1 + - driver_state + - driver_zip + - id + - jobid + - kmend + - kmstart + - scheduledreturn + - start + - status + - updated_at + computed_fields: [] + filter: + courtesycar: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: cccontracts + schema: public + type: create_select_permission diff --git a/hasura/migrations/1596046286851_alter_table_public_cccontracts_add_column_dailyrate/down.yaml b/hasura/migrations/1596046286851_alter_table_public_cccontracts_add_column_dailyrate/down.yaml new file mode 100644 index 000000000..dd1e5b4be --- /dev/null +++ b/hasura/migrations/1596046286851_alter_table_public_cccontracts_add_column_dailyrate/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."cccontracts" DROP COLUMN "dailyrate"; + type: run_sql diff --git a/hasura/migrations/1596046286851_alter_table_public_cccontracts_add_column_dailyrate/up.yaml b/hasura/migrations/1596046286851_alter_table_public_cccontracts_add_column_dailyrate/up.yaml new file mode 100644 index 000000000..57501317b --- /dev/null +++ b/hasura/migrations/1596046286851_alter_table_public_cccontracts_add_column_dailyrate/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."cccontracts" ADD COLUMN "dailyrate" numeric NULL; + type: run_sql diff --git a/hasura/migrations/1596046305024_alter_table_public_cccontracts_add_column_actax/down.yaml b/hasura/migrations/1596046305024_alter_table_public_cccontracts_add_column_actax/down.yaml new file mode 100644 index 000000000..2ba091dae --- /dev/null +++ b/hasura/migrations/1596046305024_alter_table_public_cccontracts_add_column_actax/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."cccontracts" DROP COLUMN "actax"; + type: run_sql diff --git a/hasura/migrations/1596046305024_alter_table_public_cccontracts_add_column_actax/up.yaml b/hasura/migrations/1596046305024_alter_table_public_cccontracts_add_column_actax/up.yaml new file mode 100644 index 000000000..bcc852b3e --- /dev/null +++ b/hasura/migrations/1596046305024_alter_table_public_cccontracts_add_column_actax/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."cccontracts" ADD COLUMN "actax" numeric NULL; + type: run_sql diff --git a/hasura/migrations/1596046319740_alter_table_public_cccontracts_add_column_dailyfreekm/down.yaml b/hasura/migrations/1596046319740_alter_table_public_cccontracts_add_column_dailyfreekm/down.yaml new file mode 100644 index 000000000..e84609937 --- /dev/null +++ b/hasura/migrations/1596046319740_alter_table_public_cccontracts_add_column_dailyfreekm/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."cccontracts" DROP COLUMN "dailyfreekm"; + type: run_sql diff --git a/hasura/migrations/1596046319740_alter_table_public_cccontracts_add_column_dailyfreekm/up.yaml b/hasura/migrations/1596046319740_alter_table_public_cccontracts_add_column_dailyfreekm/up.yaml new file mode 100644 index 000000000..3863a4a65 --- /dev/null +++ b/hasura/migrations/1596046319740_alter_table_public_cccontracts_add_column_dailyfreekm/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."cccontracts" ADD COLUMN "dailyfreekm" integer NULL; + type: run_sql diff --git a/hasura/migrations/1596046346591_alter_table_public_cccontracts_add_column_refuelcharge/down.yaml b/hasura/migrations/1596046346591_alter_table_public_cccontracts_add_column_refuelcharge/down.yaml new file mode 100644 index 000000000..1e88ae955 --- /dev/null +++ b/hasura/migrations/1596046346591_alter_table_public_cccontracts_add_column_refuelcharge/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."cccontracts" DROP COLUMN "refuelcharge"; + type: run_sql diff --git a/hasura/migrations/1596046346591_alter_table_public_cccontracts_add_column_refuelcharge/up.yaml b/hasura/migrations/1596046346591_alter_table_public_cccontracts_add_column_refuelcharge/up.yaml new file mode 100644 index 000000000..53cab530d --- /dev/null +++ b/hasura/migrations/1596046346591_alter_table_public_cccontracts_add_column_refuelcharge/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."cccontracts" ADD COLUMN "refuelcharge" numeric NULL; + type: run_sql diff --git a/hasura/migrations/1596046359901_alter_table_public_cccontracts_add_column_excesskmrate/down.yaml b/hasura/migrations/1596046359901_alter_table_public_cccontracts_add_column_excesskmrate/down.yaml new file mode 100644 index 000000000..39772daee --- /dev/null +++ b/hasura/migrations/1596046359901_alter_table_public_cccontracts_add_column_excesskmrate/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."cccontracts" DROP COLUMN "excesskmrate"; + type: run_sql diff --git a/hasura/migrations/1596046359901_alter_table_public_cccontracts_add_column_excesskmrate/up.yaml b/hasura/migrations/1596046359901_alter_table_public_cccontracts_add_column_excesskmrate/up.yaml new file mode 100644 index 000000000..9ab273f39 --- /dev/null +++ b/hasura/migrations/1596046359901_alter_table_public_cccontracts_add_column_excesskmrate/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."cccontracts" ADD COLUMN "excesskmrate" numeric NULL; + type: run_sql diff --git a/hasura/migrations/1596046371231_alter_table_public_cccontracts_add_column_cleanupcharge/down.yaml b/hasura/migrations/1596046371231_alter_table_public_cccontracts_add_column_cleanupcharge/down.yaml new file mode 100644 index 000000000..ab1f933b8 --- /dev/null +++ b/hasura/migrations/1596046371231_alter_table_public_cccontracts_add_column_cleanupcharge/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."cccontracts" DROP COLUMN "cleanupcharge"; + type: run_sql diff --git a/hasura/migrations/1596046371231_alter_table_public_cccontracts_add_column_cleanupcharge/up.yaml b/hasura/migrations/1596046371231_alter_table_public_cccontracts_add_column_cleanupcharge/up.yaml new file mode 100644 index 000000000..91ea00b95 --- /dev/null +++ b/hasura/migrations/1596046371231_alter_table_public_cccontracts_add_column_cleanupcharge/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."cccontracts" ADD COLUMN "cleanupcharge" numeric NULL; + type: run_sql diff --git a/hasura/migrations/1596046651239_alter_table_public_cccontracts_add_column_damangewaiver/down.yaml b/hasura/migrations/1596046651239_alter_table_public_cccontracts_add_column_damangewaiver/down.yaml new file mode 100644 index 000000000..de45fb105 --- /dev/null +++ b/hasura/migrations/1596046651239_alter_table_public_cccontracts_add_column_damangewaiver/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."cccontracts" DROP COLUMN "damangewaiver"; + type: run_sql diff --git a/hasura/migrations/1596046651239_alter_table_public_cccontracts_add_column_damangewaiver/up.yaml b/hasura/migrations/1596046651239_alter_table_public_cccontracts_add_column_damangewaiver/up.yaml new file mode 100644 index 000000000..b45cfc7ad --- /dev/null +++ b/hasura/migrations/1596046651239_alter_table_public_cccontracts_add_column_damangewaiver/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."cccontracts" ADD COLUMN "damangewaiver" numeric NULL; + type: run_sql diff --git a/hasura/migrations/1596046679135_alter_table_public_cccontracts_add_column_federaltax/down.yaml b/hasura/migrations/1596046679135_alter_table_public_cccontracts_add_column_federaltax/down.yaml new file mode 100644 index 000000000..54336543c --- /dev/null +++ b/hasura/migrations/1596046679135_alter_table_public_cccontracts_add_column_federaltax/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."cccontracts" DROP COLUMN "federaltax"; + type: run_sql diff --git a/hasura/migrations/1596046679135_alter_table_public_cccontracts_add_column_federaltax/up.yaml b/hasura/migrations/1596046679135_alter_table_public_cccontracts_add_column_federaltax/up.yaml new file mode 100644 index 000000000..ff80c606c --- /dev/null +++ b/hasura/migrations/1596046679135_alter_table_public_cccontracts_add_column_federaltax/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."cccontracts" ADD COLUMN "federaltax" numeric NULL; + type: run_sql diff --git a/hasura/migrations/1596046689469_alter_table_public_cccontracts_add_column_statetax/down.yaml b/hasura/migrations/1596046689469_alter_table_public_cccontracts_add_column_statetax/down.yaml new file mode 100644 index 000000000..60a096607 --- /dev/null +++ b/hasura/migrations/1596046689469_alter_table_public_cccontracts_add_column_statetax/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."cccontracts" DROP COLUMN "statetax"; + type: run_sql diff --git a/hasura/migrations/1596046689469_alter_table_public_cccontracts_add_column_statetax/up.yaml b/hasura/migrations/1596046689469_alter_table_public_cccontracts_add_column_statetax/up.yaml new file mode 100644 index 000000000..5437a46af --- /dev/null +++ b/hasura/migrations/1596046689469_alter_table_public_cccontracts_add_column_statetax/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."cccontracts" ADD COLUMN "statetax" numeric NULL; + type: run_sql diff --git a/hasura/migrations/1596046701676_alter_table_public_cccontracts_add_column_localtax/down.yaml b/hasura/migrations/1596046701676_alter_table_public_cccontracts_add_column_localtax/down.yaml new file mode 100644 index 000000000..dc473a6d3 --- /dev/null +++ b/hasura/migrations/1596046701676_alter_table_public_cccontracts_add_column_localtax/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."cccontracts" DROP COLUMN "localtax"; + type: run_sql diff --git a/hasura/migrations/1596046701676_alter_table_public_cccontracts_add_column_localtax/up.yaml b/hasura/migrations/1596046701676_alter_table_public_cccontracts_add_column_localtax/up.yaml new file mode 100644 index 000000000..91eb9ab40 --- /dev/null +++ b/hasura/migrations/1596046701676_alter_table_public_cccontracts_add_column_localtax/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."cccontracts" ADD COLUMN "localtax" numeric NULL; + type: run_sql diff --git a/hasura/migrations/1596046750711_alter_table_public_cccontracts_add_column_coverage/down.yaml b/hasura/migrations/1596046750711_alter_table_public_cccontracts_add_column_coverage/down.yaml new file mode 100644 index 000000000..d75e3cf51 --- /dev/null +++ b/hasura/migrations/1596046750711_alter_table_public_cccontracts_add_column_coverage/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."cccontracts" DROP COLUMN "coverage"; + type: run_sql diff --git a/hasura/migrations/1596046750711_alter_table_public_cccontracts_add_column_coverage/up.yaml b/hasura/migrations/1596046750711_alter_table_public_cccontracts_add_column_coverage/up.yaml new file mode 100644 index 000000000..ae0caa716 --- /dev/null +++ b/hasura/migrations/1596046750711_alter_table_public_cccontracts_add_column_coverage/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."cccontracts" ADD COLUMN "coverage" numeric NULL; + type: run_sql diff --git a/hasura/migrations/1596046794495_update_permission_user_public_table_cccontracts/down.yaml b/hasura/migrations/1596046794495_update_permission_user_public_table_cccontracts/down.yaml new file mode 100644 index 000000000..c1a342491 --- /dev/null +++ b/hasura/migrations/1596046794495_update_permission_user_public_table_cccontracts/down.yaml @@ -0,0 +1,53 @@ +- args: + role: user + table: + name: cccontracts + schema: public + type: drop_insert_permission +- args: + permission: + check: + courtesycar: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - actualreturn + - agreementnumber + - cc_cardholder + - cc_expiry + - cc_num + - contract_date + - courtesycarid + - created_at + - driver_addr1 + - driver_addr2 + - driver_city + - driver_dlexpiry + - driver_dlnumber + - driver_dlst + - driver_dob + - driver_fn + - driver_ln + - driver_ph1 + - driver_state + - driver_zip + - id + - jobid + - kmend + - kmstart + - scheduledreturn + - start + - status + - updated_at + set: {} + role: user + table: + name: cccontracts + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1596046794495_update_permission_user_public_table_cccontracts/up.yaml b/hasura/migrations/1596046794495_update_permission_user_public_table_cccontracts/up.yaml new file mode 100644 index 000000000..1f31599a2 --- /dev/null +++ b/hasura/migrations/1596046794495_update_permission_user_public_table_cccontracts/up.yaml @@ -0,0 +1,64 @@ +- args: + role: user + table: + name: cccontracts + schema: public + type: drop_insert_permission +- args: + permission: + check: + courtesycar: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - id + - created_at + - updated_at + - agreementnumber + - courtesycarid + - jobid + - status + - start + - scheduledreturn + - actualreturn + - kmstart + - kmend + - driver_dlnumber + - driver_dlexpiry + - driver_dlst + - driver_fn + - driver_ln + - driver_addr1 + - driver_addr2 + - driver_city + - driver_state + - driver_zip + - driver_ph1 + - driver_dob + - cc_num + - cc_expiry + - cc_cardholder + - contract_date + - dailyrate + - actax + - dailyfreekm + - refuelcharge + - excesskmrate + - cleanupcharge + - damangewaiver + - federaltax + - statetax + - localtax + - coverage + set: {} + role: user + table: + name: cccontracts + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1596046801517_update_permission_user_public_table_cccontracts/down.yaml b/hasura/migrations/1596046801517_update_permission_user_public_table_cccontracts/down.yaml new file mode 100644 index 000000000..7c8f665fe --- /dev/null +++ b/hasura/migrations/1596046801517_update_permission_user_public_table_cccontracts/down.yaml @@ -0,0 +1,54 @@ +- args: + role: user + table: + name: cccontracts + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: true + columns: + - actualreturn + - agreementnumber + - cc_cardholder + - cc_expiry + - cc_num + - contract_date + - courtesycarid + - created_at + - driver_addr1 + - driver_addr2 + - driver_city + - driver_dlexpiry + - driver_dlnumber + - driver_dlst + - driver_dob + - driver_fn + - driver_ln + - driver_ph1 + - driver_state + - driver_zip + - id + - jobid + - kmend + - kmstart + - scheduledreturn + - start + - status + - updated_at + computed_fields: [] + filter: + courtesycar: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: cccontracts + schema: public + type: create_select_permission diff --git a/hasura/migrations/1596046801517_update_permission_user_public_table_cccontracts/up.yaml b/hasura/migrations/1596046801517_update_permission_user_public_table_cccontracts/up.yaml new file mode 100644 index 000000000..57c62258d --- /dev/null +++ b/hasura/migrations/1596046801517_update_permission_user_public_table_cccontracts/up.yaml @@ -0,0 +1,65 @@ +- args: + role: user + table: + name: cccontracts + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: true + columns: + - contract_date + - driver_dlexpiry + - driver_dob + - agreementnumber + - dailyfreekm + - actax + - cleanupcharge + - coverage + - dailyrate + - damangewaiver + - excesskmrate + - federaltax + - kmend + - kmstart + - localtax + - refuelcharge + - statetax + - cc_cardholder + - cc_expiry + - cc_num + - driver_addr1 + - driver_addr2 + - driver_city + - driver_dlnumber + - driver_dlst + - driver_fn + - driver_ln + - driver_ph1 + - driver_state + - driver_zip + - status + - actualreturn + - created_at + - scheduledreturn + - start + - updated_at + - courtesycarid + - id + - jobid + computed_fields: [] + filter: + courtesycar: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: cccontracts + schema: public + type: create_select_permission diff --git a/hasura/migrations/1596046808521_update_permission_user_public_table_cccontracts/down.yaml b/hasura/migrations/1596046808521_update_permission_user_public_table_cccontracts/down.yaml new file mode 100644 index 000000000..940a40c86 --- /dev/null +++ b/hasura/migrations/1596046808521_update_permission_user_public_table_cccontracts/down.yaml @@ -0,0 +1,53 @@ +- args: + role: user + table: + name: cccontracts + schema: public + type: drop_update_permission +- args: + permission: + columns: + - actualreturn + - agreementnumber + - cc_cardholder + - cc_expiry + - cc_num + - contract_date + - courtesycarid + - created_at + - driver_addr1 + - driver_addr2 + - driver_city + - driver_dlexpiry + - driver_dlnumber + - driver_dlst + - driver_dob + - driver_fn + - driver_ln + - driver_ph1 + - driver_state + - driver_zip + - id + - jobid + - kmend + - kmstart + - scheduledreturn + - start + - status + - updated_at + filter: + courtesycar: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + set: {} + role: user + table: + name: cccontracts + schema: public + type: create_update_permission diff --git a/hasura/migrations/1596046808521_update_permission_user_public_table_cccontracts/up.yaml b/hasura/migrations/1596046808521_update_permission_user_public_table_cccontracts/up.yaml new file mode 100644 index 000000000..9af4cf599 --- /dev/null +++ b/hasura/migrations/1596046808521_update_permission_user_public_table_cccontracts/up.yaml @@ -0,0 +1,64 @@ +- args: + role: user + table: + name: cccontracts + schema: public + type: drop_update_permission +- args: + permission: + columns: + - contract_date + - driver_dlexpiry + - driver_dob + - agreementnumber + - dailyfreekm + - actax + - cleanupcharge + - coverage + - dailyrate + - damangewaiver + - excesskmrate + - federaltax + - kmend + - kmstart + - localtax + - refuelcharge + - statetax + - cc_cardholder + - cc_expiry + - cc_num + - driver_addr1 + - driver_addr2 + - driver_city + - driver_dlnumber + - driver_dlst + - driver_fn + - driver_ln + - driver_ph1 + - driver_state + - driver_zip + - status + - actualreturn + - created_at + - scheduledreturn + - start + - updated_at + - courtesycarid + - id + - jobid + filter: + courtesycar: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + set: {} + role: user + table: + name: cccontracts + schema: public + type: create_update_permission diff --git a/hasura/migrations/1596047154427_alter_table_public_cccontracts_alter_column_damangewaiver/down.yaml b/hasura/migrations/1596047154427_alter_table_public_cccontracts_alter_column_damangewaiver/down.yaml new file mode 100644 index 000000000..060b8dd59 --- /dev/null +++ b/hasura/migrations/1596047154427_alter_table_public_cccontracts_alter_column_damangewaiver/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: alter table "public"."cccontracts" rename column "damagewaiver" to "damangewaiver"; + type: run_sql diff --git a/hasura/migrations/1596047154427_alter_table_public_cccontracts_alter_column_damangewaiver/up.yaml b/hasura/migrations/1596047154427_alter_table_public_cccontracts_alter_column_damangewaiver/up.yaml new file mode 100644 index 000000000..e9eb4f677 --- /dev/null +++ b/hasura/migrations/1596047154427_alter_table_public_cccontracts_alter_column_damangewaiver/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: alter table "public"."cccontracts" rename column "damangewaiver" to "damagewaiver"; + type: run_sql diff --git a/hasura/migrations/1596048774767_alter_table_public_joblines_add_column_notes/down.yaml b/hasura/migrations/1596048774767_alter_table_public_joblines_add_column_notes/down.yaml new file mode 100644 index 000000000..765a7e089 --- /dev/null +++ b/hasura/migrations/1596048774767_alter_table_public_joblines_add_column_notes/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."joblines" DROP COLUMN "notes"; + type: run_sql diff --git a/hasura/migrations/1596048774767_alter_table_public_joblines_add_column_notes/up.yaml b/hasura/migrations/1596048774767_alter_table_public_joblines_add_column_notes/up.yaml new file mode 100644 index 000000000..58f644049 --- /dev/null +++ b/hasura/migrations/1596048774767_alter_table_public_joblines_add_column_notes/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."joblines" ADD COLUMN "notes" text NULL; + type: run_sql diff --git a/hasura/migrations/1596048785701_update_permission_user_public_table_joblines/down.yaml b/hasura/migrations/1596048785701_update_permission_user_public_table_joblines/down.yaml new file mode 100644 index 000000000..2db656081 --- /dev/null +++ b/hasura/migrations/1596048785701_update_permission_user_public_table_joblines/down.yaml @@ -0,0 +1,75 @@ +- args: + role: user + table: + name: joblines + schema: public + type: drop_insert_permission +- args: + permission: + check: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - act_price + - alt_co_id + - alt_overrd + - alt_part_i + - alt_partm + - alt_partno + - bett_amt + - bett_pctg + - bett_tax + - bett_type + - cert_part + - created_at + - db_hrs + - db_price + - db_ref + - est_seq + - glass_flag + - id + - jobid + - lbr_amt + - lbr_hrs_j + - lbr_inc + - lbr_op + - lbr_op_j + - lbr_tax + - lbr_typ_j + - line_desc + - line_ind + - line_no + - line_ref + - misc_amt + - misc_sublt + - misc_tax + - mod_lb_hrs + - mod_lbr_ty + - oem_partno + - op_code_desc + - paint_stg + - paint_tone + - part_qty + - part_type + - price_inc + - price_j + - prt_dsmk_m + - prt_dsmk_p + - removed + - status + - tax_part + - unq_seq + - updated_at + set: {} + role: user + table: + name: joblines + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1596048785701_update_permission_user_public_table_joblines/up.yaml b/hasura/migrations/1596048785701_update_permission_user_public_table_joblines/up.yaml new file mode 100644 index 000000000..b13a06795 --- /dev/null +++ b/hasura/migrations/1596048785701_update_permission_user_public_table_joblines/up.yaml @@ -0,0 +1,76 @@ +- args: + role: user + table: + name: joblines + schema: public + type: drop_insert_permission +- args: + permission: + check: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - act_price + - alt_co_id + - alt_overrd + - alt_part_i + - alt_partm + - alt_partno + - bett_amt + - bett_pctg + - bett_tax + - bett_type + - cert_part + - created_at + - db_hrs + - db_price + - db_ref + - est_seq + - glass_flag + - id + - jobid + - lbr_amt + - lbr_hrs_j + - lbr_inc + - lbr_op + - lbr_op_j + - lbr_tax + - lbr_typ_j + - line_desc + - line_ind + - line_no + - line_ref + - misc_amt + - misc_sublt + - misc_tax + - mod_lb_hrs + - mod_lbr_ty + - notes + - oem_partno + - op_code_desc + - paint_stg + - paint_tone + - part_qty + - part_type + - price_inc + - price_j + - prt_dsmk_m + - prt_dsmk_p + - removed + - status + - tax_part + - unq_seq + - updated_at + set: {} + role: user + table: + name: joblines + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1596048860276_update_permission_user_public_table_joblines/down.yaml b/hasura/migrations/1596048860276_update_permission_user_public_table_joblines/down.yaml new file mode 100644 index 000000000..ce9b320bc --- /dev/null +++ b/hasura/migrations/1596048860276_update_permission_user_public_table_joblines/down.yaml @@ -0,0 +1,76 @@ +- args: + role: user + table: + name: joblines + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: true + columns: + - act_price + - alt_co_id + - alt_overrd + - alt_part_i + - alt_partm + - alt_partno + - bett_amt + - bett_pctg + - bett_tax + - bett_type + - cert_part + - created_at + - db_hrs + - db_price + - db_ref + - est_seq + - glass_flag + - id + - jobid + - lbr_amt + - lbr_hrs_j + - lbr_inc + - lbr_op + - lbr_op_j + - lbr_tax + - lbr_typ_j + - line_desc + - line_ind + - line_no + - line_ref + - misc_amt + - misc_sublt + - misc_tax + - mod_lb_hrs + - mod_lbr_ty + - oem_partno + - op_code_desc + - paint_stg + - paint_tone + - part_qty + - part_type + - price_inc + - price_j + - prt_dsmk_m + - prt_dsmk_p + - removed + - status + - tax_part + - unq_seq + - updated_at + computed_fields: [] + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: joblines + schema: public + type: create_select_permission diff --git a/hasura/migrations/1596048860276_update_permission_user_public_table_joblines/up.yaml b/hasura/migrations/1596048860276_update_permission_user_public_table_joblines/up.yaml new file mode 100644 index 000000000..30be7464c --- /dev/null +++ b/hasura/migrations/1596048860276_update_permission_user_public_table_joblines/up.yaml @@ -0,0 +1,77 @@ +- args: + role: user + table: + name: joblines + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: true + columns: + - act_price + - alt_co_id + - alt_overrd + - alt_part_i + - alt_partm + - alt_partno + - bett_amt + - bett_pctg + - bett_tax + - bett_type + - cert_part + - created_at + - db_hrs + - db_price + - db_ref + - est_seq + - glass_flag + - id + - jobid + - lbr_amt + - lbr_hrs_j + - lbr_inc + - lbr_op + - lbr_op_j + - lbr_tax + - lbr_typ_j + - line_desc + - line_ind + - line_no + - line_ref + - misc_amt + - misc_sublt + - misc_tax + - mod_lb_hrs + - mod_lbr_ty + - notes + - oem_partno + - op_code_desc + - paint_stg + - paint_tone + - part_qty + - part_type + - price_inc + - price_j + - prt_dsmk_m + - prt_dsmk_p + - removed + - status + - tax_part + - unq_seq + - updated_at + computed_fields: [] + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: joblines + schema: public + type: create_select_permission diff --git a/hasura/migrations/1596048875858_update_permission_user_public_table_joblines/down.yaml b/hasura/migrations/1596048875858_update_permission_user_public_table_joblines/down.yaml new file mode 100644 index 000000000..c32212f9d --- /dev/null +++ b/hasura/migrations/1596048875858_update_permission_user_public_table_joblines/down.yaml @@ -0,0 +1,75 @@ +- args: + role: user + table: + name: joblines + schema: public + type: drop_update_permission +- args: + permission: + columns: + - act_price + - alt_co_id + - alt_overrd + - alt_part_i + - alt_partm + - alt_partno + - bett_amt + - bett_pctg + - bett_tax + - bett_type + - cert_part + - created_at + - db_hrs + - db_price + - db_ref + - est_seq + - glass_flag + - id + - jobid + - lbr_amt + - lbr_hrs_j + - lbr_inc + - lbr_op + - lbr_op_j + - lbr_tax + - lbr_typ_j + - line_desc + - line_ind + - line_no + - line_ref + - misc_amt + - misc_sublt + - misc_tax + - mod_lb_hrs + - mod_lbr_ty + - oem_partno + - op_code_desc + - paint_stg + - paint_tone + - part_qty + - part_type + - price_inc + - price_j + - prt_dsmk_m + - prt_dsmk_p + - removed + - status + - tax_part + - unq_seq + - updated_at + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + set: {} + role: user + table: + name: joblines + schema: public + type: create_update_permission diff --git a/hasura/migrations/1596048875858_update_permission_user_public_table_joblines/up.yaml b/hasura/migrations/1596048875858_update_permission_user_public_table_joblines/up.yaml new file mode 100644 index 000000000..bf210013d --- /dev/null +++ b/hasura/migrations/1596048875858_update_permission_user_public_table_joblines/up.yaml @@ -0,0 +1,76 @@ +- args: + role: user + table: + name: joblines + schema: public + type: drop_update_permission +- args: + permission: + columns: + - act_price + - alt_co_id + - alt_overrd + - alt_part_i + - alt_partm + - alt_partno + - bett_amt + - bett_pctg + - bett_tax + - bett_type + - cert_part + - created_at + - db_hrs + - db_price + - db_ref + - est_seq + - glass_flag + - id + - jobid + - lbr_amt + - lbr_hrs_j + - lbr_inc + - lbr_op + - lbr_op_j + - lbr_tax + - lbr_typ_j + - line_desc + - line_ind + - line_no + - line_ref + - misc_amt + - misc_sublt + - misc_tax + - mod_lb_hrs + - mod_lbr_ty + - notes + - oem_partno + - op_code_desc + - paint_stg + - paint_tone + - part_qty + - part_type + - price_inc + - price_j + - prt_dsmk_m + - prt_dsmk_p + - removed + - status + - tax_part + - unq_seq + - updated_at + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + set: {} + role: user + table: + name: joblines + schema: public + type: create_update_permission diff --git a/hasura/migrations/1596147831219_alter_table_public_bodyshops_add_column_speedprint/down.yaml b/hasura/migrations/1596147831219_alter_table_public_bodyshops_add_column_speedprint/down.yaml new file mode 100644 index 000000000..870334012 --- /dev/null +++ b/hasura/migrations/1596147831219_alter_table_public_bodyshops_add_column_speedprint/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."bodyshops" DROP COLUMN "speedprint"; + type: run_sql diff --git a/hasura/migrations/1596147831219_alter_table_public_bodyshops_add_column_speedprint/up.yaml b/hasura/migrations/1596147831219_alter_table_public_bodyshops_add_column_speedprint/up.yaml new file mode 100644 index 000000000..5c6acea5e --- /dev/null +++ b/hasura/migrations/1596147831219_alter_table_public_bodyshops_add_column_speedprint/up.yaml @@ -0,0 +1,6 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."bodyshops" ADD COLUMN "speedprint" jsonb NULL DEFAULT + jsonb_build_array(); + type: run_sql diff --git a/hasura/migrations/1596147842820_update_permission_user_public_table_bodyshops/down.yaml b/hasura/migrations/1596147842820_update_permission_user_public_table_bodyshops/down.yaml new file mode 100644 index 000000000..b0494d6ee --- /dev/null +++ b/hasura/migrations/1596147842820_update_permission_user_public_table_bodyshops/down.yaml @@ -0,0 +1,57 @@ +- args: + role: user + table: + name: bodyshops + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - accountingconfig + - address1 + - address2 + - appt_length + - city + - country + - created_at + - email + - federal_tax_id + - id + - inhousevendorid + - insurance_vendor_id + - intakechecklist + - invoice_tax_rates + - logo_img_path + - md_messaging_presets + - md_order_statuses + - md_referral_sources + - md_responsibility_centers + - md_ro_statuses + - messagingservicesid + - production_config + - region_config + - scoreboard_target + - shopname + - shoprates + - ssbuckets + - state + - state_tax_id + - stripe_acct_id + - template_header + - textid + - updated_at + - zip_post + computed_fields: [] + filter: + associations: + bodyshop: + associations: + user: + authid: + _eq: X-Hasura-User-Id + role: user + table: + name: bodyshops + schema: public + type: create_select_permission diff --git a/hasura/migrations/1596147842820_update_permission_user_public_table_bodyshops/up.yaml b/hasura/migrations/1596147842820_update_permission_user_public_table_bodyshops/up.yaml new file mode 100644 index 000000000..f95349392 --- /dev/null +++ b/hasura/migrations/1596147842820_update_permission_user_public_table_bodyshops/up.yaml @@ -0,0 +1,58 @@ +- args: + role: user + table: + name: bodyshops + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - accountingconfig + - address1 + - address2 + - appt_length + - city + - country + - created_at + - email + - federal_tax_id + - id + - inhousevendorid + - insurance_vendor_id + - intakechecklist + - invoice_tax_rates + - logo_img_path + - md_messaging_presets + - md_order_statuses + - md_referral_sources + - md_responsibility_centers + - md_ro_statuses + - messagingservicesid + - production_config + - region_config + - scoreboard_target + - shopname + - shoprates + - speedprint + - ssbuckets + - state + - state_tax_id + - stripe_acct_id + - template_header + - textid + - updated_at + - zip_post + computed_fields: [] + filter: + associations: + bodyshop: + associations: + user: + authid: + _eq: X-Hasura-User-Id + role: user + table: + name: bodyshops + schema: public + type: create_select_permission diff --git a/hasura/migrations/1596147854907_update_permission_user_public_table_bodyshops/down.yaml b/hasura/migrations/1596147854907_update_permission_user_public_table_bodyshops/down.yaml new file mode 100644 index 000000000..5702e6737 --- /dev/null +++ b/hasura/migrations/1596147854907_update_permission_user_public_table_bodyshops/down.yaml @@ -0,0 +1,51 @@ +- args: + role: user + table: + name: bodyshops + schema: public + type: drop_update_permission +- args: + permission: + columns: + - accountingconfig + - address1 + - address2 + - appt_length + - city + - country + - created_at + - email + - federal_tax_id + - id + - inhousevendorid + - insurance_vendor_id + - intakechecklist + - invoice_tax_rates + - logo_img_path + - md_messaging_presets + - md_order_statuses + - md_referral_sources + - md_responsibility_centers + - md_ro_statuses + - production_config + - scoreboard_target + - shopname + - shoprates + - ssbuckets + - state + - state_tax_id + - updated_at + - zip_post + filter: + associations: + bodyshop: + associations: + user: + authid: + _eq: X-Hasura-User-Id + set: {} + role: user + table: + name: bodyshops + schema: public + type: create_update_permission diff --git a/hasura/migrations/1596147854907_update_permission_user_public_table_bodyshops/up.yaml b/hasura/migrations/1596147854907_update_permission_user_public_table_bodyshops/up.yaml new file mode 100644 index 000000000..04f255254 --- /dev/null +++ b/hasura/migrations/1596147854907_update_permission_user_public_table_bodyshops/up.yaml @@ -0,0 +1,52 @@ +- args: + role: user + table: + name: bodyshops + schema: public + type: drop_update_permission +- args: + permission: + columns: + - accountingconfig + - address1 + - address2 + - appt_length + - city + - country + - created_at + - email + - federal_tax_id + - id + - inhousevendorid + - insurance_vendor_id + - intakechecklist + - invoice_tax_rates + - logo_img_path + - md_messaging_presets + - md_order_statuses + - md_referral_sources + - md_responsibility_centers + - md_ro_statuses + - production_config + - scoreboard_target + - shopname + - shoprates + - speedprint + - ssbuckets + - state + - state_tax_id + - updated_at + - zip_post + filter: + associations: + bodyshop: + associations: + user: + authid: + _eq: X-Hasura-User-Id + set: {} + role: user + table: + name: bodyshops + schema: public + type: create_update_permission diff --git a/hasura/migrations/1596214147082_alter_table_public_bodyshops_add_column_md_parts_locations/down.yaml b/hasura/migrations/1596214147082_alter_table_public_bodyshops_add_column_md_parts_locations/down.yaml new file mode 100644 index 000000000..68180386e --- /dev/null +++ b/hasura/migrations/1596214147082_alter_table_public_bodyshops_add_column_md_parts_locations/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."bodyshops" DROP COLUMN "md_parts_locations"; + type: run_sql diff --git a/hasura/migrations/1596214147082_alter_table_public_bodyshops_add_column_md_parts_locations/up.yaml b/hasura/migrations/1596214147082_alter_table_public_bodyshops_add_column_md_parts_locations/up.yaml new file mode 100644 index 000000000..4ccb73a04 --- /dev/null +++ b/hasura/migrations/1596214147082_alter_table_public_bodyshops_add_column_md_parts_locations/up.yaml @@ -0,0 +1,6 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."bodyshops" ADD COLUMN "md_parts_locations" jsonb NULL + DEFAULT jsonb_build_array(); + type: run_sql diff --git a/hasura/migrations/1596214157786_update_permission_user_public_table_bodyshops/down.yaml b/hasura/migrations/1596214157786_update_permission_user_public_table_bodyshops/down.yaml new file mode 100644 index 000000000..f95349392 --- /dev/null +++ b/hasura/migrations/1596214157786_update_permission_user_public_table_bodyshops/down.yaml @@ -0,0 +1,58 @@ +- args: + role: user + table: + name: bodyshops + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - accountingconfig + - address1 + - address2 + - appt_length + - city + - country + - created_at + - email + - federal_tax_id + - id + - inhousevendorid + - insurance_vendor_id + - intakechecklist + - invoice_tax_rates + - logo_img_path + - md_messaging_presets + - md_order_statuses + - md_referral_sources + - md_responsibility_centers + - md_ro_statuses + - messagingservicesid + - production_config + - region_config + - scoreboard_target + - shopname + - shoprates + - speedprint + - ssbuckets + - state + - state_tax_id + - stripe_acct_id + - template_header + - textid + - updated_at + - zip_post + computed_fields: [] + filter: + associations: + bodyshop: + associations: + user: + authid: + _eq: X-Hasura-User-Id + role: user + table: + name: bodyshops + schema: public + type: create_select_permission diff --git a/hasura/migrations/1596214157786_update_permission_user_public_table_bodyshops/up.yaml b/hasura/migrations/1596214157786_update_permission_user_public_table_bodyshops/up.yaml new file mode 100644 index 000000000..06a490337 --- /dev/null +++ b/hasura/migrations/1596214157786_update_permission_user_public_table_bodyshops/up.yaml @@ -0,0 +1,59 @@ +- args: + role: user + table: + name: bodyshops + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - accountingconfig + - address1 + - address2 + - appt_length + - city + - country + - created_at + - email + - federal_tax_id + - id + - inhousevendorid + - insurance_vendor_id + - intakechecklist + - invoice_tax_rates + - logo_img_path + - md_messaging_presets + - md_order_statuses + - md_parts_locations + - md_referral_sources + - md_responsibility_centers + - md_ro_statuses + - messagingservicesid + - production_config + - region_config + - scoreboard_target + - shopname + - shoprates + - speedprint + - ssbuckets + - state + - state_tax_id + - stripe_acct_id + - template_header + - textid + - updated_at + - zip_post + computed_fields: [] + filter: + associations: + bodyshop: + associations: + user: + authid: + _eq: X-Hasura-User-Id + role: user + table: + name: bodyshops + schema: public + type: create_select_permission diff --git a/hasura/migrations/1596214165919_update_permission_user_public_table_bodyshops/down.yaml b/hasura/migrations/1596214165919_update_permission_user_public_table_bodyshops/down.yaml new file mode 100644 index 000000000..04f255254 --- /dev/null +++ b/hasura/migrations/1596214165919_update_permission_user_public_table_bodyshops/down.yaml @@ -0,0 +1,52 @@ +- args: + role: user + table: + name: bodyshops + schema: public + type: drop_update_permission +- args: + permission: + columns: + - accountingconfig + - address1 + - address2 + - appt_length + - city + - country + - created_at + - email + - federal_tax_id + - id + - inhousevendorid + - insurance_vendor_id + - intakechecklist + - invoice_tax_rates + - logo_img_path + - md_messaging_presets + - md_order_statuses + - md_referral_sources + - md_responsibility_centers + - md_ro_statuses + - production_config + - scoreboard_target + - shopname + - shoprates + - speedprint + - ssbuckets + - state + - state_tax_id + - updated_at + - zip_post + filter: + associations: + bodyshop: + associations: + user: + authid: + _eq: X-Hasura-User-Id + set: {} + role: user + table: + name: bodyshops + schema: public + type: create_update_permission diff --git a/hasura/migrations/1596214165919_update_permission_user_public_table_bodyshops/up.yaml b/hasura/migrations/1596214165919_update_permission_user_public_table_bodyshops/up.yaml new file mode 100644 index 000000000..e458aac22 --- /dev/null +++ b/hasura/migrations/1596214165919_update_permission_user_public_table_bodyshops/up.yaml @@ -0,0 +1,53 @@ +- args: + role: user + table: + name: bodyshops + schema: public + type: drop_update_permission +- args: + permission: + columns: + - accountingconfig + - address1 + - address2 + - appt_length + - city + - country + - created_at + - email + - federal_tax_id + - id + - inhousevendorid + - insurance_vendor_id + - intakechecklist + - invoice_tax_rates + - logo_img_path + - md_messaging_presets + - md_order_statuses + - md_parts_locations + - md_referral_sources + - md_responsibility_centers + - md_ro_statuses + - production_config + - scoreboard_target + - shopname + - shoprates + - speedprint + - ssbuckets + - state + - state_tax_id + - updated_at + - zip_post + filter: + associations: + bodyshop: + associations: + user: + authid: + _eq: X-Hasura-User-Id + set: {} + role: user + table: + name: bodyshops + schema: public + type: create_update_permission diff --git a/hasura/migrations/1596214559217_alter_table_public_joblines_add_column_location/down.yaml b/hasura/migrations/1596214559217_alter_table_public_joblines_add_column_location/down.yaml new file mode 100644 index 000000000..d32e051a0 --- /dev/null +++ b/hasura/migrations/1596214559217_alter_table_public_joblines_add_column_location/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."joblines" DROP COLUMN "location"; + type: run_sql diff --git a/hasura/migrations/1596214559217_alter_table_public_joblines_add_column_location/up.yaml b/hasura/migrations/1596214559217_alter_table_public_joblines_add_column_location/up.yaml new file mode 100644 index 000000000..b0d5aa00e --- /dev/null +++ b/hasura/migrations/1596214559217_alter_table_public_joblines_add_column_location/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."joblines" ADD COLUMN "location" text NULL; + type: run_sql diff --git a/hasura/migrations/1596214571725_update_permission_user_public_table_joblines/down.yaml b/hasura/migrations/1596214571725_update_permission_user_public_table_joblines/down.yaml new file mode 100644 index 000000000..b13a06795 --- /dev/null +++ b/hasura/migrations/1596214571725_update_permission_user_public_table_joblines/down.yaml @@ -0,0 +1,76 @@ +- args: + role: user + table: + name: joblines + schema: public + type: drop_insert_permission +- args: + permission: + check: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - act_price + - alt_co_id + - alt_overrd + - alt_part_i + - alt_partm + - alt_partno + - bett_amt + - bett_pctg + - bett_tax + - bett_type + - cert_part + - created_at + - db_hrs + - db_price + - db_ref + - est_seq + - glass_flag + - id + - jobid + - lbr_amt + - lbr_hrs_j + - lbr_inc + - lbr_op + - lbr_op_j + - lbr_tax + - lbr_typ_j + - line_desc + - line_ind + - line_no + - line_ref + - misc_amt + - misc_sublt + - misc_tax + - mod_lb_hrs + - mod_lbr_ty + - notes + - oem_partno + - op_code_desc + - paint_stg + - paint_tone + - part_qty + - part_type + - price_inc + - price_j + - prt_dsmk_m + - prt_dsmk_p + - removed + - status + - tax_part + - unq_seq + - updated_at + set: {} + role: user + table: + name: joblines + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1596214571725_update_permission_user_public_table_joblines/up.yaml b/hasura/migrations/1596214571725_update_permission_user_public_table_joblines/up.yaml new file mode 100644 index 000000000..a73177edf --- /dev/null +++ b/hasura/migrations/1596214571725_update_permission_user_public_table_joblines/up.yaml @@ -0,0 +1,77 @@ +- args: + role: user + table: + name: joblines + schema: public + type: drop_insert_permission +- args: + permission: + check: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - act_price + - alt_co_id + - alt_overrd + - alt_part_i + - alt_partm + - alt_partno + - bett_amt + - bett_pctg + - bett_tax + - bett_type + - cert_part + - created_at + - db_hrs + - db_price + - db_ref + - est_seq + - glass_flag + - id + - jobid + - lbr_amt + - lbr_hrs_j + - lbr_inc + - lbr_op + - lbr_op_j + - lbr_tax + - lbr_typ_j + - line_desc + - line_ind + - line_no + - line_ref + - location + - misc_amt + - misc_sublt + - misc_tax + - mod_lb_hrs + - mod_lbr_ty + - notes + - oem_partno + - op_code_desc + - paint_stg + - paint_tone + - part_qty + - part_type + - price_inc + - price_j + - prt_dsmk_m + - prt_dsmk_p + - removed + - status + - tax_part + - unq_seq + - updated_at + set: {} + role: user + table: + name: joblines + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1596214578452_update_permission_user_public_table_joblines/down.yaml b/hasura/migrations/1596214578452_update_permission_user_public_table_joblines/down.yaml new file mode 100644 index 000000000..30be7464c --- /dev/null +++ b/hasura/migrations/1596214578452_update_permission_user_public_table_joblines/down.yaml @@ -0,0 +1,77 @@ +- args: + role: user + table: + name: joblines + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: true + columns: + - act_price + - alt_co_id + - alt_overrd + - alt_part_i + - alt_partm + - alt_partno + - bett_amt + - bett_pctg + - bett_tax + - bett_type + - cert_part + - created_at + - db_hrs + - db_price + - db_ref + - est_seq + - glass_flag + - id + - jobid + - lbr_amt + - lbr_hrs_j + - lbr_inc + - lbr_op + - lbr_op_j + - lbr_tax + - lbr_typ_j + - line_desc + - line_ind + - line_no + - line_ref + - misc_amt + - misc_sublt + - misc_tax + - mod_lb_hrs + - mod_lbr_ty + - notes + - oem_partno + - op_code_desc + - paint_stg + - paint_tone + - part_qty + - part_type + - price_inc + - price_j + - prt_dsmk_m + - prt_dsmk_p + - removed + - status + - tax_part + - unq_seq + - updated_at + computed_fields: [] + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: joblines + schema: public + type: create_select_permission diff --git a/hasura/migrations/1596214578452_update_permission_user_public_table_joblines/up.yaml b/hasura/migrations/1596214578452_update_permission_user_public_table_joblines/up.yaml new file mode 100644 index 000000000..1ff01e737 --- /dev/null +++ b/hasura/migrations/1596214578452_update_permission_user_public_table_joblines/up.yaml @@ -0,0 +1,78 @@ +- args: + role: user + table: + name: joblines + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: true + columns: + - act_price + - alt_co_id + - alt_overrd + - alt_part_i + - alt_partm + - alt_partno + - bett_amt + - bett_pctg + - bett_tax + - bett_type + - cert_part + - created_at + - db_hrs + - db_price + - db_ref + - est_seq + - glass_flag + - id + - jobid + - lbr_amt + - lbr_hrs_j + - lbr_inc + - lbr_op + - lbr_op_j + - lbr_tax + - lbr_typ_j + - line_desc + - line_ind + - line_no + - line_ref + - location + - misc_amt + - misc_sublt + - misc_tax + - mod_lb_hrs + - mod_lbr_ty + - notes + - oem_partno + - op_code_desc + - paint_stg + - paint_tone + - part_qty + - part_type + - price_inc + - price_j + - prt_dsmk_m + - prt_dsmk_p + - removed + - status + - tax_part + - unq_seq + - updated_at + computed_fields: [] + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: joblines + schema: public + type: create_select_permission diff --git a/hasura/migrations/1596214586798_update_permission_user_public_table_joblines/down.yaml b/hasura/migrations/1596214586798_update_permission_user_public_table_joblines/down.yaml new file mode 100644 index 000000000..bf210013d --- /dev/null +++ b/hasura/migrations/1596214586798_update_permission_user_public_table_joblines/down.yaml @@ -0,0 +1,76 @@ +- args: + role: user + table: + name: joblines + schema: public + type: drop_update_permission +- args: + permission: + columns: + - act_price + - alt_co_id + - alt_overrd + - alt_part_i + - alt_partm + - alt_partno + - bett_amt + - bett_pctg + - bett_tax + - bett_type + - cert_part + - created_at + - db_hrs + - db_price + - db_ref + - est_seq + - glass_flag + - id + - jobid + - lbr_amt + - lbr_hrs_j + - lbr_inc + - lbr_op + - lbr_op_j + - lbr_tax + - lbr_typ_j + - line_desc + - line_ind + - line_no + - line_ref + - misc_amt + - misc_sublt + - misc_tax + - mod_lb_hrs + - mod_lbr_ty + - notes + - oem_partno + - op_code_desc + - paint_stg + - paint_tone + - part_qty + - part_type + - price_inc + - price_j + - prt_dsmk_m + - prt_dsmk_p + - removed + - status + - tax_part + - unq_seq + - updated_at + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + set: {} + role: user + table: + name: joblines + schema: public + type: create_update_permission diff --git a/hasura/migrations/1596214586798_update_permission_user_public_table_joblines/up.yaml b/hasura/migrations/1596214586798_update_permission_user_public_table_joblines/up.yaml new file mode 100644 index 000000000..0544129c9 --- /dev/null +++ b/hasura/migrations/1596214586798_update_permission_user_public_table_joblines/up.yaml @@ -0,0 +1,77 @@ +- args: + role: user + table: + name: joblines + schema: public + type: drop_update_permission +- args: + permission: + columns: + - act_price + - alt_co_id + - alt_overrd + - alt_part_i + - alt_partm + - alt_partno + - bett_amt + - bett_pctg + - bett_tax + - bett_type + - cert_part + - created_at + - db_hrs + - db_price + - db_ref + - est_seq + - glass_flag + - id + - jobid + - lbr_amt + - lbr_hrs_j + - lbr_inc + - lbr_op + - lbr_op_j + - lbr_tax + - lbr_typ_j + - line_desc + - line_ind + - line_no + - line_ref + - location + - misc_amt + - misc_sublt + - misc_tax + - mod_lb_hrs + - mod_lbr_ty + - notes + - oem_partno + - op_code_desc + - paint_stg + - paint_tone + - part_qty + - part_type + - price_inc + - price_j + - prt_dsmk_m + - prt_dsmk_p + - removed + - status + - tax_part + - unq_seq + - updated_at + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + set: {} + role: user + table: + name: joblines + schema: public + type: create_update_permission diff --git a/hasura/migrations/1596225983120_alter_table_public_jobs_add_column_employee_prep/down.yaml b/hasura/migrations/1596225983120_alter_table_public_jobs_add_column_employee_prep/down.yaml new file mode 100644 index 000000000..00b35af8c --- /dev/null +++ b/hasura/migrations/1596225983120_alter_table_public_jobs_add_column_employee_prep/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."jobs" DROP COLUMN "employee_prep"; + type: run_sql diff --git a/hasura/migrations/1596225983120_alter_table_public_jobs_add_column_employee_prep/up.yaml b/hasura/migrations/1596225983120_alter_table_public_jobs_add_column_employee_prep/up.yaml new file mode 100644 index 000000000..1971d34f6 --- /dev/null +++ b/hasura/migrations/1596225983120_alter_table_public_jobs_add_column_employee_prep/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."jobs" ADD COLUMN "employee_prep" uuid NULL; + type: run_sql diff --git a/hasura/migrations/1596226073397_set_fk_public_jobs_employee_prep/down.yaml b/hasura/migrations/1596226073397_set_fk_public_jobs_employee_prep/down.yaml new file mode 100644 index 000000000..d6b5a3710 --- /dev/null +++ b/hasura/migrations/1596226073397_set_fk_public_jobs_employee_prep/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: alter table "public"."jobs" drop constraint "jobs_employee_prep_fkey"; + type: run_sql diff --git a/hasura/migrations/1596226073397_set_fk_public_jobs_employee_prep/up.yaml b/hasura/migrations/1596226073397_set_fk_public_jobs_employee_prep/up.yaml new file mode 100644 index 000000000..f485e6fda --- /dev/null +++ b/hasura/migrations/1596226073397_set_fk_public_jobs_employee_prep/up.yaml @@ -0,0 +1,10 @@ +- args: + cascade: false + read_only: false + sql: |- + alter table "public"."jobs" + add constraint "jobs_employee_prep_fkey" + foreign key ("employee_prep") + references "public"."employees" + ("id") on update set null on delete set null; + type: run_sql diff --git a/hasura/migrations/1596226116444_add_relationship_employee_table_public_undefined/down.yaml b/hasura/migrations/1596226116444_add_relationship_employee_table_public_undefined/down.yaml new file mode 100644 index 000000000..22b33f78d --- /dev/null +++ b/hasura/migrations/1596226116444_add_relationship_employee_table_public_undefined/down.yaml @@ -0,0 +1,6 @@ +- args: + relationship: employee + table: + name: jobs + schema: public + type: drop_relationship diff --git a/hasura/migrations/1596226116444_add_relationship_employee_table_public_undefined/up.yaml b/hasura/migrations/1596226116444_add_relationship_employee_table_public_undefined/up.yaml new file mode 100644 index 000000000..36322aafc --- /dev/null +++ b/hasura/migrations/1596226116444_add_relationship_employee_table_public_undefined/up.yaml @@ -0,0 +1,8 @@ +- args: + name: employee + table: + name: jobs + schema: public + using: + foreign_key_constraint_on: employee_prep + type: create_object_relationship diff --git a/hasura/migrations/1596226119743_add_relationship_jobsByEmployeePrep_table_public_undefined/down.yaml b/hasura/migrations/1596226119743_add_relationship_jobsByEmployeePrep_table_public_undefined/down.yaml new file mode 100644 index 000000000..a39fa7c33 --- /dev/null +++ b/hasura/migrations/1596226119743_add_relationship_jobsByEmployeePrep_table_public_undefined/down.yaml @@ -0,0 +1,6 @@ +- args: + relationship: jobsByEmployeePrep + table: + name: employees + schema: public + type: drop_relationship diff --git a/hasura/migrations/1596226119743_add_relationship_jobsByEmployeePrep_table_public_undefined/up.yaml b/hasura/migrations/1596226119743_add_relationship_jobsByEmployeePrep_table_public_undefined/up.yaml new file mode 100644 index 000000000..8a6fe1b21 --- /dev/null +++ b/hasura/migrations/1596226119743_add_relationship_jobsByEmployeePrep_table_public_undefined/up.yaml @@ -0,0 +1,12 @@ +- args: + name: jobsByEmployeePrep + table: + name: employees + schema: public + using: + foreign_key_constraint_on: + column: employee_prep + table: + name: jobs + schema: public + type: create_array_relationship diff --git a/hasura/migrations/1596226134655_rename_relationship_employee_to_employee_prep_rel_schema_public_table_jobs/down.yaml b/hasura/migrations/1596226134655_rename_relationship_employee_to_employee_prep_rel_schema_public_table_jobs/down.yaml new file mode 100644 index 000000000..0ef4046b7 --- /dev/null +++ b/hasura/migrations/1596226134655_rename_relationship_employee_to_employee_prep_rel_schema_public_table_jobs/down.yaml @@ -0,0 +1,7 @@ +- args: + name: employee_prep_rel + new_name: employee + table: + name: jobs + schema: public + type: rename_relationship diff --git a/hasura/migrations/1596226134655_rename_relationship_employee_to_employee_prep_rel_schema_public_table_jobs/up.yaml b/hasura/migrations/1596226134655_rename_relationship_employee_to_employee_prep_rel_schema_public_table_jobs/up.yaml new file mode 100644 index 000000000..188732d05 --- /dev/null +++ b/hasura/migrations/1596226134655_rename_relationship_employee_to_employee_prep_rel_schema_public_table_jobs/up.yaml @@ -0,0 +1,7 @@ +- args: + name: employee + new_name: employee_prep_rel + table: + name: jobs + schema: public + type: rename_relationship diff --git a/hasura/migrations/1596226147493_update_permission_user_public_table_jobs/down.yaml b/hasura/migrations/1596226147493_update_permission_user_public_table_jobs/down.yaml new file mode 100644 index 000000000..0178be5a6 --- /dev/null +++ b/hasura/migrations/1596226147493_update_permission_user_public_table_jobs/down.yaml @@ -0,0 +1,257 @@ +- args: + role: user + table: + name: jobs + schema: public + type: drop_insert_permission +- args: + permission: + check: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - actual_completion + - actual_delivery + - actual_in + - adj_g_disc + - adj_strdis + - adj_towdis + - adjustment_bottom_line + - agt_addr1 + - agt_addr2 + - agt_city + - agt_co_id + - agt_co_nm + - agt_ct_fn + - agt_ct_ln + - agt_ct_ph + - agt_ct_phx + - agt_ctry + - agt_ea + - agt_fax + - agt_faxx + - agt_lic_no + - agt_ph1 + - agt_ph1x + - agt_ph2 + - agt_ph2x + - agt_st + - agt_zip + - area_of_damage + - asgn_date + - asgn_no + - asgn_type + - cat_no + - cieca_stl + - cieca_ttl + - ciecaid + - clm_addr1 + - clm_addr2 + - clm_city + - clm_ct_fn + - clm_ct_ln + - clm_ct_ph + - clm_ct_phx + - clm_ctry + - clm_ea + - clm_fax + - clm_faxx + - clm_no + - clm_ofc_id + - clm_ofc_nm + - clm_ph1 + - clm_ph1x + - clm_ph2 + - clm_ph2x + - clm_st + - clm_title + - clm_total + - clm_zip + - converted + - created_at + - csr + - cust_pr + - date_closed + - date_estimated + - date_exported + - date_invoiced + - date_open + - date_scheduled + - ded_amt + - ded_status + - depreciation_taxes + - employee_body + - employee_refinish + - est_addr1 + - est_addr2 + - est_city + - est_co_nm + - est_ct_fn + - est_ct_ln + - est_ctry + - est_ea + - est_number + - est_ph1 + - est_st + - est_zip + - federal_tax_payable + - federal_tax_rate + - g_bett_amt + - id + - inproduction + - ins_addr1 + - ins_addr2 + - ins_city + - ins_co_id + - ins_co_nm + - ins_ct_fn + - ins_ct_ln + - ins_ct_ph + - ins_ct_phx + - ins_ctry + - ins_ea + - ins_fax + - ins_faxx + - ins_memo + - ins_ph1 + - ins_ph1x + - ins_ph2 + - ins_ph2x + - ins_st + - ins_title + - ins_zip + - insd_addr1 + - insd_addr2 + - insd_city + - insd_co_nm + - insd_ctry + - insd_ea + - insd_fax + - insd_faxx + - insd_fn + - insd_ln + - insd_ph1 + - insd_ph1x + - insd_ph2 + - insd_ph2x + - insd_st + - insd_title + - insd_zip + - intakechecklist + - invoice_allocation + - invoice_date + - job_totals + - kanbanparent + - kmin + - kmout + - labor_rate_desc + - labor_rate_id + - local_tax_rate + - loss_cat + - loss_date + - loss_desc + - loss_type + - other_amount_payable + - owner_owing + - ownerid + - ownr_addr1 + - ownr_addr2 + - ownr_city + - ownr_co_nm + - ownr_ctry + - ownr_ea + - ownr_fax + - ownr_faxx + - ownr_fn + - ownr_ln + - ownr_ph1 + - ownr_ph1x + - ownr_ph2 + - ownr_ph2x + - ownr_st + - ownr_title + - ownr_zip + - parts_tax_rates + - pay_amt + - pay_chknm + - pay_date + - pay_type + - payee_nms + - plate_no + - plate_st + - po_number + - policy_no + - production_vars + - rate_atp + - rate_la1 + - rate_la2 + - rate_la3 + - rate_la4 + - rate_laa + - rate_lab + - rate_lad + - rate_lae + - rate_laf + - rate_lag + - rate_lam + - rate_lar + - rate_las + - rate_lau + - rate_ma2s + - rate_ma2t + - rate_ma3s + - rate_mabl + - rate_macs + - rate_mahw + - rate_mapa + - rate_mash + - rate_matd + - referral_source + - regie_number + - ro_number + - scheduled_completion + - scheduled_delivery + - scheduled_in + - selling_dealer + - selling_dealer_contact + - servicing_dealer + - servicing_dealer_contact + - shopid + - special_coverage_policy + - state_tax_rate + - status + - statusid + - storage_payable + - tax_lbr_rt + - tax_levies_rt + - tax_paint_mat_rt + - tax_predis + - tax_prethr + - tax_pstthr + - tax_str_rt + - tax_sub_rt + - tax_thramt + - tax_tow_rt + - theft_ind + - tlos_ind + - towing_payable + - unit_number + - updated_at + - v_color + - v_make_desc + - v_model_desc + - v_model_yr + - v_vin + - vehicleid + set: {} + role: user + table: + name: jobs + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1596226147493_update_permission_user_public_table_jobs/up.yaml b/hasura/migrations/1596226147493_update_permission_user_public_table_jobs/up.yaml new file mode 100644 index 000000000..d95c715b5 --- /dev/null +++ b/hasura/migrations/1596226147493_update_permission_user_public_table_jobs/up.yaml @@ -0,0 +1,258 @@ +- args: + role: user + table: + name: jobs + schema: public + type: drop_insert_permission +- args: + permission: + check: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - actual_completion + - actual_delivery + - actual_in + - adj_g_disc + - adj_strdis + - adj_towdis + - adjustment_bottom_line + - agt_addr1 + - agt_addr2 + - agt_city + - agt_co_id + - agt_co_nm + - agt_ct_fn + - agt_ct_ln + - agt_ct_ph + - agt_ct_phx + - agt_ctry + - agt_ea + - agt_fax + - agt_faxx + - agt_lic_no + - agt_ph1 + - agt_ph1x + - agt_ph2 + - agt_ph2x + - agt_st + - agt_zip + - area_of_damage + - asgn_date + - asgn_no + - asgn_type + - cat_no + - cieca_stl + - cieca_ttl + - ciecaid + - clm_addr1 + - clm_addr2 + - clm_city + - clm_ct_fn + - clm_ct_ln + - clm_ct_ph + - clm_ct_phx + - clm_ctry + - clm_ea + - clm_fax + - clm_faxx + - clm_no + - clm_ofc_id + - clm_ofc_nm + - clm_ph1 + - clm_ph1x + - clm_ph2 + - clm_ph2x + - clm_st + - clm_title + - clm_total + - clm_zip + - converted + - created_at + - csr + - cust_pr + - date_closed + - date_estimated + - date_exported + - date_invoiced + - date_open + - date_scheduled + - ded_amt + - ded_status + - depreciation_taxes + - employee_body + - employee_prep + - employee_refinish + - est_addr1 + - est_addr2 + - est_city + - est_co_nm + - est_ct_fn + - est_ct_ln + - est_ctry + - est_ea + - est_number + - est_ph1 + - est_st + - est_zip + - federal_tax_payable + - federal_tax_rate + - g_bett_amt + - id + - inproduction + - ins_addr1 + - ins_addr2 + - ins_city + - ins_co_id + - ins_co_nm + - ins_ct_fn + - ins_ct_ln + - ins_ct_ph + - ins_ct_phx + - ins_ctry + - ins_ea + - ins_fax + - ins_faxx + - ins_memo + - ins_ph1 + - ins_ph1x + - ins_ph2 + - ins_ph2x + - ins_st + - ins_title + - ins_zip + - insd_addr1 + - insd_addr2 + - insd_city + - insd_co_nm + - insd_ctry + - insd_ea + - insd_fax + - insd_faxx + - insd_fn + - insd_ln + - insd_ph1 + - insd_ph1x + - insd_ph2 + - insd_ph2x + - insd_st + - insd_title + - insd_zip + - intakechecklist + - invoice_allocation + - invoice_date + - job_totals + - kanbanparent + - kmin + - kmout + - labor_rate_desc + - labor_rate_id + - local_tax_rate + - loss_cat + - loss_date + - loss_desc + - loss_type + - other_amount_payable + - owner_owing + - ownerid + - ownr_addr1 + - ownr_addr2 + - ownr_city + - ownr_co_nm + - ownr_ctry + - ownr_ea + - ownr_fax + - ownr_faxx + - ownr_fn + - ownr_ln + - ownr_ph1 + - ownr_ph1x + - ownr_ph2 + - ownr_ph2x + - ownr_st + - ownr_title + - ownr_zip + - parts_tax_rates + - pay_amt + - pay_chknm + - pay_date + - pay_type + - payee_nms + - plate_no + - plate_st + - po_number + - policy_no + - production_vars + - rate_atp + - rate_la1 + - rate_la2 + - rate_la3 + - rate_la4 + - rate_laa + - rate_lab + - rate_lad + - rate_lae + - rate_laf + - rate_lag + - rate_lam + - rate_lar + - rate_las + - rate_lau + - rate_ma2s + - rate_ma2t + - rate_ma3s + - rate_mabl + - rate_macs + - rate_mahw + - rate_mapa + - rate_mash + - rate_matd + - referral_source + - regie_number + - ro_number + - scheduled_completion + - scheduled_delivery + - scheduled_in + - selling_dealer + - selling_dealer_contact + - servicing_dealer + - servicing_dealer_contact + - shopid + - special_coverage_policy + - state_tax_rate + - status + - statusid + - storage_payable + - tax_lbr_rt + - tax_levies_rt + - tax_paint_mat_rt + - tax_predis + - tax_prethr + - tax_pstthr + - tax_str_rt + - tax_sub_rt + - tax_thramt + - tax_tow_rt + - theft_ind + - tlos_ind + - towing_payable + - unit_number + - updated_at + - v_color + - v_make_desc + - v_model_desc + - v_model_yr + - v_vin + - vehicleid + set: {} + role: user + table: + name: jobs + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1596226171391_update_permission_user_public_table_jobs/down.yaml b/hasura/migrations/1596226171391_update_permission_user_public_table_jobs/down.yaml new file mode 100644 index 000000000..e157ffd56 --- /dev/null +++ b/hasura/migrations/1596226171391_update_permission_user_public_table_jobs/down.yaml @@ -0,0 +1,258 @@ +- args: + role: user + table: + name: jobs + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: true + columns: + - actual_completion + - actual_delivery + - actual_in + - adj_g_disc + - adj_strdis + - adj_towdis + - adjustment_bottom_line + - agt_addr1 + - agt_addr2 + - agt_city + - agt_co_id + - agt_co_nm + - agt_ct_fn + - agt_ct_ln + - agt_ct_ph + - agt_ct_phx + - agt_ctry + - agt_ea + - agt_fax + - agt_faxx + - agt_lic_no + - agt_ph1 + - agt_ph1x + - agt_ph2 + - agt_ph2x + - agt_st + - agt_zip + - area_of_damage + - asgn_date + - asgn_no + - asgn_type + - cat_no + - cieca_stl + - cieca_ttl + - ciecaid + - clm_addr1 + - clm_addr2 + - clm_city + - clm_ct_fn + - clm_ct_ln + - clm_ct_ph + - clm_ct_phx + - clm_ctry + - clm_ea + - clm_fax + - clm_faxx + - clm_no + - clm_ofc_id + - clm_ofc_nm + - clm_ph1 + - clm_ph1x + - clm_ph2 + - clm_ph2x + - clm_st + - clm_title + - clm_total + - clm_zip + - converted + - created_at + - csr + - cust_pr + - date_closed + - date_estimated + - date_exported + - date_invoiced + - date_open + - date_scheduled + - ded_amt + - ded_status + - depreciation_taxes + - employee_body + - employee_refinish + - est_addr1 + - est_addr2 + - est_city + - est_co_nm + - est_ct_fn + - est_ct_ln + - est_ctry + - est_ea + - est_number + - est_ph1 + - est_st + - est_zip + - federal_tax_payable + - federal_tax_rate + - g_bett_amt + - id + - inproduction + - ins_addr1 + - ins_addr2 + - ins_city + - ins_co_id + - ins_co_nm + - ins_ct_fn + - ins_ct_ln + - ins_ct_ph + - ins_ct_phx + - ins_ctry + - ins_ea + - ins_fax + - ins_faxx + - ins_memo + - ins_ph1 + - ins_ph1x + - ins_ph2 + - ins_ph2x + - ins_st + - ins_title + - ins_zip + - insd_addr1 + - insd_addr2 + - insd_city + - insd_co_nm + - insd_ctry + - insd_ea + - insd_fax + - insd_faxx + - insd_fn + - insd_ln + - insd_ph1 + - insd_ph1x + - insd_ph2 + - insd_ph2x + - insd_st + - insd_title + - insd_zip + - intakechecklist + - invoice_allocation + - invoice_date + - job_totals + - kanbanparent + - kmin + - kmout + - labor_rate_desc + - labor_rate_id + - local_tax_rate + - loss_cat + - loss_date + - loss_desc + - loss_type + - other_amount_payable + - owner_owing + - ownerid + - ownr_addr1 + - ownr_addr2 + - ownr_city + - ownr_co_nm + - ownr_ctry + - ownr_ea + - ownr_fax + - ownr_faxx + - ownr_fn + - ownr_ln + - ownr_ph1 + - ownr_ph1x + - ownr_ph2 + - ownr_ph2x + - ownr_st + - ownr_title + - ownr_zip + - parts_tax_rates + - pay_amt + - pay_chknm + - pay_date + - pay_type + - payee_nms + - plate_no + - plate_st + - po_number + - policy_no + - production_vars + - rate_atp + - rate_la1 + - rate_la2 + - rate_la3 + - rate_la4 + - rate_laa + - rate_lab + - rate_lad + - rate_lae + - rate_laf + - rate_lag + - rate_lam + - rate_lar + - rate_las + - rate_lau + - rate_ma2s + - rate_ma2t + - rate_ma3s + - rate_mabl + - rate_macs + - rate_mahw + - rate_mapa + - rate_mash + - rate_matd + - referral_source + - regie_number + - ro_number + - scheduled_completion + - scheduled_delivery + - scheduled_in + - selling_dealer + - selling_dealer_contact + - servicing_dealer + - servicing_dealer_contact + - shopid + - special_coverage_policy + - state_tax_rate + - status + - statusid + - storage_payable + - tax_lbr_rt + - tax_levies_rt + - tax_paint_mat_rt + - tax_predis + - tax_prethr + - tax_pstthr + - tax_str_rt + - tax_sub_rt + - tax_thramt + - tax_tow_rt + - theft_ind + - tlos_ind + - towing_payable + - unit_number + - updated_at + - v_color + - v_make_desc + - v_model_desc + - v_model_yr + - v_vin + - vehicleid + computed_fields: [] + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: jobs + schema: public + type: create_select_permission diff --git a/hasura/migrations/1596226171391_update_permission_user_public_table_jobs/up.yaml b/hasura/migrations/1596226171391_update_permission_user_public_table_jobs/up.yaml new file mode 100644 index 000000000..fc0bcd2fc --- /dev/null +++ b/hasura/migrations/1596226171391_update_permission_user_public_table_jobs/up.yaml @@ -0,0 +1,259 @@ +- args: + role: user + table: + name: jobs + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: true + columns: + - actual_completion + - actual_delivery + - actual_in + - adj_g_disc + - adj_strdis + - adj_towdis + - adjustment_bottom_line + - agt_addr1 + - agt_addr2 + - agt_city + - agt_co_id + - agt_co_nm + - agt_ct_fn + - agt_ct_ln + - agt_ct_ph + - agt_ct_phx + - agt_ctry + - agt_ea + - agt_fax + - agt_faxx + - agt_lic_no + - agt_ph1 + - agt_ph1x + - agt_ph2 + - agt_ph2x + - agt_st + - agt_zip + - area_of_damage + - asgn_date + - asgn_no + - asgn_type + - cat_no + - cieca_stl + - cieca_ttl + - ciecaid + - clm_addr1 + - clm_addr2 + - clm_city + - clm_ct_fn + - clm_ct_ln + - clm_ct_ph + - clm_ct_phx + - clm_ctry + - clm_ea + - clm_fax + - clm_faxx + - clm_no + - clm_ofc_id + - clm_ofc_nm + - clm_ph1 + - clm_ph1x + - clm_ph2 + - clm_ph2x + - clm_st + - clm_title + - clm_total + - clm_zip + - converted + - created_at + - csr + - cust_pr + - date_closed + - date_estimated + - date_exported + - date_invoiced + - date_open + - date_scheduled + - ded_amt + - ded_status + - depreciation_taxes + - employee_body + - employee_prep + - employee_refinish + - est_addr1 + - est_addr2 + - est_city + - est_co_nm + - est_ct_fn + - est_ct_ln + - est_ctry + - est_ea + - est_number + - est_ph1 + - est_st + - est_zip + - federal_tax_payable + - federal_tax_rate + - g_bett_amt + - id + - inproduction + - ins_addr1 + - ins_addr2 + - ins_city + - ins_co_id + - ins_co_nm + - ins_ct_fn + - ins_ct_ln + - ins_ct_ph + - ins_ct_phx + - ins_ctry + - ins_ea + - ins_fax + - ins_faxx + - ins_memo + - ins_ph1 + - ins_ph1x + - ins_ph2 + - ins_ph2x + - ins_st + - ins_title + - ins_zip + - insd_addr1 + - insd_addr2 + - insd_city + - insd_co_nm + - insd_ctry + - insd_ea + - insd_fax + - insd_faxx + - insd_fn + - insd_ln + - insd_ph1 + - insd_ph1x + - insd_ph2 + - insd_ph2x + - insd_st + - insd_title + - insd_zip + - intakechecklist + - invoice_allocation + - invoice_date + - job_totals + - kanbanparent + - kmin + - kmout + - labor_rate_desc + - labor_rate_id + - local_tax_rate + - loss_cat + - loss_date + - loss_desc + - loss_type + - other_amount_payable + - owner_owing + - ownerid + - ownr_addr1 + - ownr_addr2 + - ownr_city + - ownr_co_nm + - ownr_ctry + - ownr_ea + - ownr_fax + - ownr_faxx + - ownr_fn + - ownr_ln + - ownr_ph1 + - ownr_ph1x + - ownr_ph2 + - ownr_ph2x + - ownr_st + - ownr_title + - ownr_zip + - parts_tax_rates + - pay_amt + - pay_chknm + - pay_date + - pay_type + - payee_nms + - plate_no + - plate_st + - po_number + - policy_no + - production_vars + - rate_atp + - rate_la1 + - rate_la2 + - rate_la3 + - rate_la4 + - rate_laa + - rate_lab + - rate_lad + - rate_lae + - rate_laf + - rate_lag + - rate_lam + - rate_lar + - rate_las + - rate_lau + - rate_ma2s + - rate_ma2t + - rate_ma3s + - rate_mabl + - rate_macs + - rate_mahw + - rate_mapa + - rate_mash + - rate_matd + - referral_source + - regie_number + - ro_number + - scheduled_completion + - scheduled_delivery + - scheduled_in + - selling_dealer + - selling_dealer_contact + - servicing_dealer + - servicing_dealer_contact + - shopid + - special_coverage_policy + - state_tax_rate + - status + - statusid + - storage_payable + - tax_lbr_rt + - tax_levies_rt + - tax_paint_mat_rt + - tax_predis + - tax_prethr + - tax_pstthr + - tax_str_rt + - tax_sub_rt + - tax_thramt + - tax_tow_rt + - theft_ind + - tlos_ind + - towing_payable + - unit_number + - updated_at + - v_color + - v_make_desc + - v_model_desc + - v_model_yr + - v_vin + - vehicleid + computed_fields: [] + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: jobs + schema: public + type: create_select_permission diff --git a/hasura/migrations/1596226179648_update_permission_user_public_table_jobs/down.yaml b/hasura/migrations/1596226179648_update_permission_user_public_table_jobs/down.yaml new file mode 100644 index 000000000..4e85e20cd --- /dev/null +++ b/hasura/migrations/1596226179648_update_permission_user_public_table_jobs/down.yaml @@ -0,0 +1,257 @@ +- args: + role: user + table: + name: jobs + schema: public + type: drop_update_permission +- args: + permission: + columns: + - actual_completion + - actual_delivery + - actual_in + - adj_g_disc + - adj_strdis + - adj_towdis + - adjustment_bottom_line + - agt_addr1 + - agt_addr2 + - agt_city + - agt_co_id + - agt_co_nm + - agt_ct_fn + - agt_ct_ln + - agt_ct_ph + - agt_ct_phx + - agt_ctry + - agt_ea + - agt_fax + - agt_faxx + - agt_lic_no + - agt_ph1 + - agt_ph1x + - agt_ph2 + - agt_ph2x + - agt_st + - agt_zip + - area_of_damage + - asgn_date + - asgn_no + - asgn_type + - cat_no + - cieca_stl + - cieca_ttl + - ciecaid + - clm_addr1 + - clm_addr2 + - clm_city + - clm_ct_fn + - clm_ct_ln + - clm_ct_ph + - clm_ct_phx + - clm_ctry + - clm_ea + - clm_fax + - clm_faxx + - clm_no + - clm_ofc_id + - clm_ofc_nm + - clm_ph1 + - clm_ph1x + - clm_ph2 + - clm_ph2x + - clm_st + - clm_title + - clm_total + - clm_zip + - converted + - created_at + - csr + - cust_pr + - date_closed + - date_estimated + - date_exported + - date_invoiced + - date_open + - date_scheduled + - ded_amt + - ded_status + - depreciation_taxes + - employee_body + - employee_refinish + - est_addr1 + - est_addr2 + - est_city + - est_co_nm + - est_ct_fn + - est_ct_ln + - est_ctry + - est_ea + - est_number + - est_ph1 + - est_st + - est_zip + - federal_tax_payable + - federal_tax_rate + - g_bett_amt + - id + - inproduction + - ins_addr1 + - ins_addr2 + - ins_city + - ins_co_id + - ins_co_nm + - ins_ct_fn + - ins_ct_ln + - ins_ct_ph + - ins_ct_phx + - ins_ctry + - ins_ea + - ins_fax + - ins_faxx + - ins_memo + - ins_ph1 + - ins_ph1x + - ins_ph2 + - ins_ph2x + - ins_st + - ins_title + - ins_zip + - insd_addr1 + - insd_addr2 + - insd_city + - insd_co_nm + - insd_ctry + - insd_ea + - insd_fax + - insd_faxx + - insd_fn + - insd_ln + - insd_ph1 + - insd_ph1x + - insd_ph2 + - insd_ph2x + - insd_st + - insd_title + - insd_zip + - intakechecklist + - invoice_allocation + - invoice_date + - job_totals + - kanbanparent + - kmin + - kmout + - labor_rate_desc + - labor_rate_id + - local_tax_rate + - loss_cat + - loss_date + - loss_desc + - loss_type + - other_amount_payable + - owner_owing + - ownerid + - ownr_addr1 + - ownr_addr2 + - ownr_city + - ownr_co_nm + - ownr_ctry + - ownr_ea + - ownr_fax + - ownr_faxx + - ownr_fn + - ownr_ln + - ownr_ph1 + - ownr_ph1x + - ownr_ph2 + - ownr_ph2x + - ownr_st + - ownr_title + - ownr_zip + - parts_tax_rates + - pay_amt + - pay_chknm + - pay_date + - pay_type + - payee_nms + - plate_no + - plate_st + - po_number + - policy_no + - production_vars + - rate_atp + - rate_la1 + - rate_la2 + - rate_la3 + - rate_la4 + - rate_laa + - rate_lab + - rate_lad + - rate_lae + - rate_laf + - rate_lag + - rate_lam + - rate_lar + - rate_las + - rate_lau + - rate_ma2s + - rate_ma2t + - rate_ma3s + - rate_mabl + - rate_macs + - rate_mahw + - rate_mapa + - rate_mash + - rate_matd + - referral_source + - regie_number + - ro_number + - scheduled_completion + - scheduled_delivery + - scheduled_in + - selling_dealer + - selling_dealer_contact + - servicing_dealer + - servicing_dealer_contact + - shopid + - special_coverage_policy + - state_tax_rate + - status + - statusid + - storage_payable + - tax_lbr_rt + - tax_levies_rt + - tax_paint_mat_rt + - tax_predis + - tax_prethr + - tax_pstthr + - tax_str_rt + - tax_sub_rt + - tax_thramt + - tax_tow_rt + - theft_ind + - tlos_ind + - towing_payable + - unit_number + - updated_at + - v_color + - v_make_desc + - v_model_desc + - v_model_yr + - v_vin + - vehicleid + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + set: {} + role: user + table: + name: jobs + schema: public + type: create_update_permission diff --git a/hasura/migrations/1596226179648_update_permission_user_public_table_jobs/up.yaml b/hasura/migrations/1596226179648_update_permission_user_public_table_jobs/up.yaml new file mode 100644 index 000000000..8cf8a1bfb --- /dev/null +++ b/hasura/migrations/1596226179648_update_permission_user_public_table_jobs/up.yaml @@ -0,0 +1,258 @@ +- args: + role: user + table: + name: jobs + schema: public + type: drop_update_permission +- args: + permission: + columns: + - actual_completion + - actual_delivery + - actual_in + - adj_g_disc + - adj_strdis + - adj_towdis + - adjustment_bottom_line + - agt_addr1 + - agt_addr2 + - agt_city + - agt_co_id + - agt_co_nm + - agt_ct_fn + - agt_ct_ln + - agt_ct_ph + - agt_ct_phx + - agt_ctry + - agt_ea + - agt_fax + - agt_faxx + - agt_lic_no + - agt_ph1 + - agt_ph1x + - agt_ph2 + - agt_ph2x + - agt_st + - agt_zip + - area_of_damage + - asgn_date + - asgn_no + - asgn_type + - cat_no + - cieca_stl + - cieca_ttl + - ciecaid + - clm_addr1 + - clm_addr2 + - clm_city + - clm_ct_fn + - clm_ct_ln + - clm_ct_ph + - clm_ct_phx + - clm_ctry + - clm_ea + - clm_fax + - clm_faxx + - clm_no + - clm_ofc_id + - clm_ofc_nm + - clm_ph1 + - clm_ph1x + - clm_ph2 + - clm_ph2x + - clm_st + - clm_title + - clm_total + - clm_zip + - converted + - created_at + - csr + - cust_pr + - date_closed + - date_estimated + - date_exported + - date_invoiced + - date_open + - date_scheduled + - ded_amt + - ded_status + - depreciation_taxes + - employee_body + - employee_prep + - employee_refinish + - est_addr1 + - est_addr2 + - est_city + - est_co_nm + - est_ct_fn + - est_ct_ln + - est_ctry + - est_ea + - est_number + - est_ph1 + - est_st + - est_zip + - federal_tax_payable + - federal_tax_rate + - g_bett_amt + - id + - inproduction + - ins_addr1 + - ins_addr2 + - ins_city + - ins_co_id + - ins_co_nm + - ins_ct_fn + - ins_ct_ln + - ins_ct_ph + - ins_ct_phx + - ins_ctry + - ins_ea + - ins_fax + - ins_faxx + - ins_memo + - ins_ph1 + - ins_ph1x + - ins_ph2 + - ins_ph2x + - ins_st + - ins_title + - ins_zip + - insd_addr1 + - insd_addr2 + - insd_city + - insd_co_nm + - insd_ctry + - insd_ea + - insd_fax + - insd_faxx + - insd_fn + - insd_ln + - insd_ph1 + - insd_ph1x + - insd_ph2 + - insd_ph2x + - insd_st + - insd_title + - insd_zip + - intakechecklist + - invoice_allocation + - invoice_date + - job_totals + - kanbanparent + - kmin + - kmout + - labor_rate_desc + - labor_rate_id + - local_tax_rate + - loss_cat + - loss_date + - loss_desc + - loss_type + - other_amount_payable + - owner_owing + - ownerid + - ownr_addr1 + - ownr_addr2 + - ownr_city + - ownr_co_nm + - ownr_ctry + - ownr_ea + - ownr_fax + - ownr_faxx + - ownr_fn + - ownr_ln + - ownr_ph1 + - ownr_ph1x + - ownr_ph2 + - ownr_ph2x + - ownr_st + - ownr_title + - ownr_zip + - parts_tax_rates + - pay_amt + - pay_chknm + - pay_date + - pay_type + - payee_nms + - plate_no + - plate_st + - po_number + - policy_no + - production_vars + - rate_atp + - rate_la1 + - rate_la2 + - rate_la3 + - rate_la4 + - rate_laa + - rate_lab + - rate_lad + - rate_lae + - rate_laf + - rate_lag + - rate_lam + - rate_lar + - rate_las + - rate_lau + - rate_ma2s + - rate_ma2t + - rate_ma3s + - rate_mabl + - rate_macs + - rate_mahw + - rate_mapa + - rate_mash + - rate_matd + - referral_source + - regie_number + - ro_number + - scheduled_completion + - scheduled_delivery + - scheduled_in + - selling_dealer + - selling_dealer_contact + - servicing_dealer + - servicing_dealer_contact + - shopid + - special_coverage_policy + - state_tax_rate + - status + - statusid + - storage_payable + - tax_lbr_rt + - tax_levies_rt + - tax_paint_mat_rt + - tax_predis + - tax_prethr + - tax_pstthr + - tax_str_rt + - tax_sub_rt + - tax_thramt + - tax_tow_rt + - theft_ind + - tlos_ind + - towing_payable + - unit_number + - updated_at + - v_color + - v_make_desc + - v_model_desc + - v_model_yr + - v_vin + - vehicleid + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + set: {} + role: user + table: + name: jobs + schema: public + type: create_update_permission diff --git a/hasura/migrations/1596466443672_alter_table_public_parts_order_lines_add_column_backordered_on/down.yaml b/hasura/migrations/1596466443672_alter_table_public_parts_order_lines_add_column_backordered_on/down.yaml new file mode 100644 index 000000000..7e01e0670 --- /dev/null +++ b/hasura/migrations/1596466443672_alter_table_public_parts_order_lines_add_column_backordered_on/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."parts_order_lines" DROP COLUMN "backordered_on"; + type: run_sql diff --git a/hasura/migrations/1596466443672_alter_table_public_parts_order_lines_add_column_backordered_on/up.yaml b/hasura/migrations/1596466443672_alter_table_public_parts_order_lines_add_column_backordered_on/up.yaml new file mode 100644 index 000000000..f3226988e --- /dev/null +++ b/hasura/migrations/1596466443672_alter_table_public_parts_order_lines_add_column_backordered_on/up.yaml @@ -0,0 +1,6 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."parts_order_lines" ADD COLUMN "backordered_on" date + NULL; + type: run_sql diff --git a/hasura/migrations/1596466458082_alter_table_public_parts_order_lines_add_column_backordered_eta/down.yaml b/hasura/migrations/1596466458082_alter_table_public_parts_order_lines_add_column_backordered_eta/down.yaml new file mode 100644 index 000000000..6aaaae41a --- /dev/null +++ b/hasura/migrations/1596466458082_alter_table_public_parts_order_lines_add_column_backordered_eta/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."parts_order_lines" DROP COLUMN "backordered_eta"; + type: run_sql diff --git a/hasura/migrations/1596466458082_alter_table_public_parts_order_lines_add_column_backordered_eta/up.yaml b/hasura/migrations/1596466458082_alter_table_public_parts_order_lines_add_column_backordered_eta/up.yaml new file mode 100644 index 000000000..984d4cd3e --- /dev/null +++ b/hasura/migrations/1596466458082_alter_table_public_parts_order_lines_add_column_backordered_eta/up.yaml @@ -0,0 +1,6 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."parts_order_lines" ADD COLUMN "backordered_eta" date + NULL; + type: run_sql diff --git a/hasura/migrations/1596466475798_update_permission_user_public_table_parts_order_lines/down.yaml b/hasura/migrations/1596466475798_update_permission_user_public_table_parts_order_lines/down.yaml new file mode 100644 index 000000000..dbac86335 --- /dev/null +++ b/hasura/migrations/1596466475798_update_permission_user_public_table_parts_order_lines/down.yaml @@ -0,0 +1,38 @@ +- args: + role: user + table: + name: parts_order_lines + schema: public + type: drop_insert_permission +- args: + permission: + check: + parts_order: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - act_price + - created_at + - db_price + - id + - job_line_id + - line_desc + - line_remarks + - oem_partno + - orderid + - quantity + - status + - updated_at + set: {} + role: user + table: + name: parts_order_lines + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1596466475798_update_permission_user_public_table_parts_order_lines/up.yaml b/hasura/migrations/1596466475798_update_permission_user_public_table_parts_order_lines/up.yaml new file mode 100644 index 000000000..f30db5ad8 --- /dev/null +++ b/hasura/migrations/1596466475798_update_permission_user_public_table_parts_order_lines/up.yaml @@ -0,0 +1,40 @@ +- args: + role: user + table: + name: parts_order_lines + schema: public + type: drop_insert_permission +- args: + permission: + check: + parts_order: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - act_price + - backordered_eta + - backordered_on + - created_at + - db_price + - id + - job_line_id + - line_desc + - line_remarks + - oem_partno + - orderid + - quantity + - status + - updated_at + set: {} + role: user + table: + name: parts_order_lines + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1596466485574_update_permission_user_public_table_parts_order_lines/down.yaml b/hasura/migrations/1596466485574_update_permission_user_public_table_parts_order_lines/down.yaml new file mode 100644 index 000000000..e057ea23a --- /dev/null +++ b/hasura/migrations/1596466485574_update_permission_user_public_table_parts_order_lines/down.yaml @@ -0,0 +1,39 @@ +- args: + role: user + table: + name: parts_order_lines + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - act_price + - created_at + - db_price + - id + - job_line_id + - line_desc + - line_remarks + - oem_partno + - orderid + - quantity + - status + - updated_at + computed_fields: [] + filter: + parts_order: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: parts_order_lines + schema: public + type: create_select_permission diff --git a/hasura/migrations/1596466485574_update_permission_user_public_table_parts_order_lines/up.yaml b/hasura/migrations/1596466485574_update_permission_user_public_table_parts_order_lines/up.yaml new file mode 100644 index 000000000..609697074 --- /dev/null +++ b/hasura/migrations/1596466485574_update_permission_user_public_table_parts_order_lines/up.yaml @@ -0,0 +1,41 @@ +- args: + role: user + table: + name: parts_order_lines + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - act_price + - backordered_eta + - backordered_on + - created_at + - db_price + - id + - job_line_id + - line_desc + - line_remarks + - oem_partno + - orderid + - quantity + - status + - updated_at + computed_fields: [] + filter: + parts_order: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: parts_order_lines + schema: public + type: create_select_permission diff --git a/hasura/migrations/1596466492287_update_permission_user_public_table_parts_order_lines/down.yaml b/hasura/migrations/1596466492287_update_permission_user_public_table_parts_order_lines/down.yaml new file mode 100644 index 000000000..0e2acf52e --- /dev/null +++ b/hasura/migrations/1596466492287_update_permission_user_public_table_parts_order_lines/down.yaml @@ -0,0 +1,38 @@ +- args: + role: user + table: + name: parts_order_lines + schema: public + type: drop_update_permission +- args: + permission: + columns: + - act_price + - created_at + - db_price + - id + - job_line_id + - line_desc + - line_remarks + - oem_partno + - orderid + - quantity + - status + - updated_at + filter: + parts_order: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + set: {} + role: user + table: + name: parts_order_lines + schema: public + type: create_update_permission diff --git a/hasura/migrations/1596466492287_update_permission_user_public_table_parts_order_lines/up.yaml b/hasura/migrations/1596466492287_update_permission_user_public_table_parts_order_lines/up.yaml new file mode 100644 index 000000000..09f99df03 --- /dev/null +++ b/hasura/migrations/1596466492287_update_permission_user_public_table_parts_order_lines/up.yaml @@ -0,0 +1,40 @@ +- args: + role: user + table: + name: parts_order_lines + schema: public + type: drop_update_permission +- args: + permission: + columns: + - act_price + - backordered_eta + - backordered_on + - created_at + - db_price + - id + - job_line_id + - line_desc + - line_remarks + - oem_partno + - orderid + - quantity + - status + - updated_at + filter: + parts_order: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + set: {} + role: user + table: + name: parts_order_lines + schema: public + type: create_update_permission diff --git a/hasura/migrations/1596487312718_drop_view_public_productionview/down.yaml b/hasura/migrations/1596487312718_drop_view_public_productionview/down.yaml new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/hasura/migrations/1596487312718_drop_view_public_productionview/down.yaml @@ -0,0 +1 @@ +[] diff --git a/hasura/migrations/1596487312718_drop_view_public_productionview/up.yaml b/hasura/migrations/1596487312718_drop_view_public_productionview/up.yaml new file mode 100644 index 000000000..6e88a06bd --- /dev/null +++ b/hasura/migrations/1596487312718_drop_view_public_productionview/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: DROP VIEW "public"."productionview"; + type: run_sql diff --git a/hasura/migrations/1596561493315_alter_table_public_bodyshops_add_column_md_notes_presets/down.yaml b/hasura/migrations/1596561493315_alter_table_public_bodyshops_add_column_md_notes_presets/down.yaml new file mode 100644 index 000000000..6df4170c7 --- /dev/null +++ b/hasura/migrations/1596561493315_alter_table_public_bodyshops_add_column_md_notes_presets/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."bodyshops" DROP COLUMN "md_notes_presets"; + type: run_sql diff --git a/hasura/migrations/1596561493315_alter_table_public_bodyshops_add_column_md_notes_presets/up.yaml b/hasura/migrations/1596561493315_alter_table_public_bodyshops_add_column_md_notes_presets/up.yaml new file mode 100644 index 000000000..da28d8713 --- /dev/null +++ b/hasura/migrations/1596561493315_alter_table_public_bodyshops_add_column_md_notes_presets/up.yaml @@ -0,0 +1,6 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."bodyshops" ADD COLUMN "md_notes_presets" jsonb NULL + DEFAULT jsonb_build_array(); + type: run_sql diff --git a/hasura/migrations/1596561513554_update_permission_user_public_table_bodyshops/down.yaml b/hasura/migrations/1596561513554_update_permission_user_public_table_bodyshops/down.yaml new file mode 100644 index 000000000..06a490337 --- /dev/null +++ b/hasura/migrations/1596561513554_update_permission_user_public_table_bodyshops/down.yaml @@ -0,0 +1,59 @@ +- args: + role: user + table: + name: bodyshops + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - accountingconfig + - address1 + - address2 + - appt_length + - city + - country + - created_at + - email + - federal_tax_id + - id + - inhousevendorid + - insurance_vendor_id + - intakechecklist + - invoice_tax_rates + - logo_img_path + - md_messaging_presets + - md_order_statuses + - md_parts_locations + - md_referral_sources + - md_responsibility_centers + - md_ro_statuses + - messagingservicesid + - production_config + - region_config + - scoreboard_target + - shopname + - shoprates + - speedprint + - ssbuckets + - state + - state_tax_id + - stripe_acct_id + - template_header + - textid + - updated_at + - zip_post + computed_fields: [] + filter: + associations: + bodyshop: + associations: + user: + authid: + _eq: X-Hasura-User-Id + role: user + table: + name: bodyshops + schema: public + type: create_select_permission diff --git a/hasura/migrations/1596561513554_update_permission_user_public_table_bodyshops/up.yaml b/hasura/migrations/1596561513554_update_permission_user_public_table_bodyshops/up.yaml new file mode 100644 index 000000000..00761bb0f --- /dev/null +++ b/hasura/migrations/1596561513554_update_permission_user_public_table_bodyshops/up.yaml @@ -0,0 +1,60 @@ +- args: + role: user + table: + name: bodyshops + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - accountingconfig + - address1 + - address2 + - appt_length + - city + - country + - created_at + - email + - federal_tax_id + - id + - inhousevendorid + - insurance_vendor_id + - intakechecklist + - invoice_tax_rates + - logo_img_path + - md_messaging_presets + - md_notes_presets + - md_order_statuses + - md_parts_locations + - md_referral_sources + - md_responsibility_centers + - md_ro_statuses + - messagingservicesid + - production_config + - region_config + - scoreboard_target + - shopname + - shoprates + - speedprint + - ssbuckets + - state + - state_tax_id + - stripe_acct_id + - template_header + - textid + - updated_at + - zip_post + computed_fields: [] + filter: + associations: + bodyshop: + associations: + user: + authid: + _eq: X-Hasura-User-Id + role: user + table: + name: bodyshops + schema: public + type: create_select_permission diff --git a/hasura/migrations/1596561522463_update_permission_user_public_table_bodyshops/down.yaml b/hasura/migrations/1596561522463_update_permission_user_public_table_bodyshops/down.yaml new file mode 100644 index 000000000..e458aac22 --- /dev/null +++ b/hasura/migrations/1596561522463_update_permission_user_public_table_bodyshops/down.yaml @@ -0,0 +1,53 @@ +- args: + role: user + table: + name: bodyshops + schema: public + type: drop_update_permission +- args: + permission: + columns: + - accountingconfig + - address1 + - address2 + - appt_length + - city + - country + - created_at + - email + - federal_tax_id + - id + - inhousevendorid + - insurance_vendor_id + - intakechecklist + - invoice_tax_rates + - logo_img_path + - md_messaging_presets + - md_order_statuses + - md_parts_locations + - md_referral_sources + - md_responsibility_centers + - md_ro_statuses + - production_config + - scoreboard_target + - shopname + - shoprates + - speedprint + - ssbuckets + - state + - state_tax_id + - updated_at + - zip_post + filter: + associations: + bodyshop: + associations: + user: + authid: + _eq: X-Hasura-User-Id + set: {} + role: user + table: + name: bodyshops + schema: public + type: create_update_permission diff --git a/hasura/migrations/1596561522463_update_permission_user_public_table_bodyshops/up.yaml b/hasura/migrations/1596561522463_update_permission_user_public_table_bodyshops/up.yaml new file mode 100644 index 000000000..172d0cfce --- /dev/null +++ b/hasura/migrations/1596561522463_update_permission_user_public_table_bodyshops/up.yaml @@ -0,0 +1,54 @@ +- args: + role: user + table: + name: bodyshops + schema: public + type: drop_update_permission +- args: + permission: + columns: + - accountingconfig + - address1 + - address2 + - appt_length + - city + - country + - created_at + - email + - federal_tax_id + - id + - inhousevendorid + - insurance_vendor_id + - intakechecklist + - invoice_tax_rates + - logo_img_path + - md_messaging_presets + - md_notes_presets + - md_order_statuses + - md_parts_locations + - md_referral_sources + - md_responsibility_centers + - md_ro_statuses + - production_config + - scoreboard_target + - shopname + - shoprates + - speedprint + - ssbuckets + - state + - state_tax_id + - updated_at + - zip_post + filter: + associations: + bodyshop: + associations: + user: + authid: + _eq: X-Hasura-User-Id + set: {} + role: user + table: + name: bodyshops + schema: public + type: create_update_permission diff --git a/hasura/migrations/metadata.yaml b/hasura/migrations/metadata.yaml new file mode 100644 index 000000000..72dcdede0 --- /dev/null +++ b/hasura/migrations/metadata.yaml @@ -0,0 +1,4071 @@ +version: 2 +tables: +- table: + schema: public + name: allocations + object_relationships: + - name: employee + using: + foreign_key_constraint_on: employeeid + - name: jobline + using: + foreign_key_constraint_on: joblineid + insert_permissions: + - role: user + permission: + check: + jobline: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - hours + - created_at + - updated_at + - employeeid + - id + - joblineid + select_permissions: + - role: user + permission: + columns: + - hours + - created_at + - updated_at + - employeeid + - id + - joblineid + filter: + jobline: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + update_permissions: + - role: user + permission: + columns: [] + filter: + jobline: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + check: null + delete_permissions: + - role: user + permission: + filter: + jobline: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true +- table: + schema: public + name: appointments + object_relationships: + - name: bodyshop + using: + foreign_key_constraint_on: bodyshopid + - name: job + using: + foreign_key_constraint_on: jobid + insert_permissions: + - role: user + permission: + check: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - arrived + - block + - bodyshopid + - canceled + - created_at + - end + - id + - isintake + - jobid + - start + - title + - updated_at + select_permissions: + - role: user + permission: + columns: + - arrived + - block + - bodyshopid + - canceled + - created_at + - end + - id + - isintake + - jobid + - start + - title + - updated_at + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + allow_aggregations: true + update_permissions: + - role: user + permission: + columns: + - arrived + - block + - bodyshopid + - canceled + - created_at + - end + - id + - isintake + - jobid + - start + - title + - updated_at + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + check: null + delete_permissions: + - role: user + permission: + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true +- table: + schema: public + name: associations + object_relationships: + - name: bodyshop + using: + foreign_key_constraint_on: shopid + - name: user + using: + foreign_key_constraint_on: useremail + select_permissions: + - role: user + permission: + columns: + - id + - shopid + - useremail + - active + filter: + user: + authid: + _eq: X-Hasura-User-Id + update_permissions: + - role: user + permission: + columns: + - active + filter: + user: + authid: + _eq: X-Hasura-User-Id + check: null +- table: + schema: public + name: audit_trail + object_relationships: + - name: bodyshop + using: + foreign_key_constraint_on: bodyshopid + - name: user + using: + foreign_key_constraint_on: useremail + select_permissions: + - role: user + permission: + columns: + - id + - new_val + - old_val + - operation + - schemaname + - tabname + - useremail + - created + - bodyshopid + - recordid + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true +- table: + schema: public + name: available_jobs + object_relationships: + - name: bodyshop + using: + foreign_key_constraint_on: bodyshopid + - name: job + using: + foreign_key_constraint_on: jobid + insert_permissions: + - role: user + permission: + check: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - id + - created_at + - updated_at + - uploaded_by + - cieca_id + - bodyshopid + - est_data + - issupplement + - jobid + - supplement_number + - ownr_name + - vehicle_info + - clm_amt + - clm_no + - source_system + select_permissions: + - role: user + permission: + columns: + - issupplement + - supplement_number + - est_data + - clm_amt + - cieca_id + - clm_no + - ownr_name + - source_system + - uploaded_by + - vehicle_info + - created_at + - updated_at + - bodyshopid + - id + - jobid + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + update_permissions: + - role: user + permission: + columns: [] + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + check: null + delete_permissions: + - role: user + permission: + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true +- table: + schema: public + name: bodyshops + array_relationships: + - name: appointments + using: + foreign_key_constraint_on: + column: bodyshopid + table: + schema: public + name: appointments + - name: associations + using: + foreign_key_constraint_on: + column: shopid + table: + schema: public + name: associations + - name: audit_trails + using: + foreign_key_constraint_on: + column: bodyshopid + table: + schema: public + name: audit_trail + - name: available_jobs + using: + foreign_key_constraint_on: + column: bodyshopid + table: + schema: public + name: available_jobs + - name: conversations + using: + foreign_key_constraint_on: + column: bodyshopid + table: + schema: public + name: conversations + - name: counters + using: + foreign_key_constraint_on: + column: shopid + table: + schema: public + name: counters + - name: courtesycars + using: + foreign_key_constraint_on: + column: bodyshopid + table: + schema: public + name: courtesycars + - name: csiinvites + using: + foreign_key_constraint_on: + column: bodyshopid + table: + schema: public + name: csi + - name: csiquestions + using: + foreign_key_constraint_on: + column: bodyshopid + table: + schema: public + name: csiquestions + - name: employees + using: + foreign_key_constraint_on: + column: shopid + table: + schema: public + name: employees + - name: jobs + using: + foreign_key_constraint_on: + column: shopid + table: + schema: public + name: jobs + - name: owners + using: + foreign_key_constraint_on: + column: shopid + table: + schema: public + name: owners + - name: templates + using: + foreign_key_constraint_on: + column: bodyshopid + table: + schema: public + name: templates + - name: timetickets + using: + foreign_key_constraint_on: + column: bodyshopid + table: + schema: public + name: timetickets + - name: vehicles + using: + foreign_key_constraint_on: + column: shopid + table: + schema: public + name: vehicles + - name: vendors + using: + foreign_key_constraint_on: + column: bodyshopid + table: + schema: public + name: vendors + select_permissions: + - role: user + permission: + columns: + - accountingconfig + - address1 + - address2 + - appt_length + - city + - country + - created_at + - email + - federal_tax_id + - id + - inhousevendorid + - insurance_vendor_id + - intakechecklist + - invoice_tax_rates + - logo_img_path + - md_messaging_presets + - md_notes_presets + - md_order_statuses + - md_parts_locations + - md_referral_sources + - md_responsibility_centers + - md_ro_statuses + - messagingservicesid + - production_config + - region_config + - scoreboard_target + - shopname + - shoprates + - speedprint + - ssbuckets + - state + - state_tax_id + - stripe_acct_id + - template_header + - textid + - updated_at + - zip_post + filter: + associations: + bodyshop: + associations: + user: + authid: + _eq: X-Hasura-User-Id + update_permissions: + - role: user + permission: + columns: + - accountingconfig + - address1 + - address2 + - appt_length + - city + - country + - created_at + - email + - federal_tax_id + - id + - inhousevendorid + - insurance_vendor_id + - intakechecklist + - invoice_tax_rates + - logo_img_path + - md_messaging_presets + - md_notes_presets + - md_order_statuses + - md_parts_locations + - md_referral_sources + - md_responsibility_centers + - md_ro_statuses + - production_config + - scoreboard_target + - shopname + - shoprates + - speedprint + - ssbuckets + - state + - state_tax_id + - updated_at + - zip_post + filter: + associations: + bodyshop: + associations: + user: + authid: + _eq: X-Hasura-User-Id + check: null +- table: + schema: public + name: cccontracts + object_relationships: + - name: courtesycar + using: + foreign_key_constraint_on: courtesycarid + - name: job + using: + foreign_key_constraint_on: jobid + insert_permissions: + - role: user + permission: + check: + courtesycar: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - id + - created_at + - updated_at + - agreementnumber + - courtesycarid + - jobid + - status + - start + - scheduledreturn + - actualreturn + - kmstart + - kmend + - driver_dlnumber + - driver_dlexpiry + - driver_dlst + - driver_fn + - driver_ln + - driver_addr1 + - driver_addr2 + - driver_city + - driver_state + - driver_zip + - driver_ph1 + - driver_dob + - cc_num + - cc_expiry + - cc_cardholder + - contract_date + - dailyrate + - actax + - dailyfreekm + - refuelcharge + - excesskmrate + - cleanupcharge + - damagewaiver + - federaltax + - statetax + - localtax + - coverage + select_permissions: + - role: user + permission: + columns: + - contract_date + - driver_dlexpiry + - driver_dob + - agreementnumber + - dailyfreekm + - actax + - cleanupcharge + - coverage + - dailyrate + - damagewaiver + - excesskmrate + - federaltax + - kmend + - kmstart + - localtax + - refuelcharge + - statetax + - cc_cardholder + - cc_expiry + - cc_num + - driver_addr1 + - driver_addr2 + - driver_city + - driver_dlnumber + - driver_dlst + - driver_fn + - driver_ln + - driver_ph1 + - driver_state + - driver_zip + - status + - actualreturn + - created_at + - scheduledreturn + - start + - updated_at + - courtesycarid + - id + - jobid + filter: + courtesycar: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + allow_aggregations: true + update_permissions: + - role: user + permission: + columns: + - contract_date + - driver_dlexpiry + - driver_dob + - agreementnumber + - dailyfreekm + - actax + - cleanupcharge + - coverage + - dailyrate + - damagewaiver + - excesskmrate + - federaltax + - kmend + - kmstart + - localtax + - refuelcharge + - statetax + - cc_cardholder + - cc_expiry + - cc_num + - driver_addr1 + - driver_addr2 + - driver_city + - driver_dlnumber + - driver_dlst + - driver_fn + - driver_ln + - driver_ph1 + - driver_state + - driver_zip + - status + - actualreturn + - created_at + - scheduledreturn + - start + - updated_at + - courtesycarid + - id + - jobid + filter: + courtesycar: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + check: null + delete_permissions: + - role: user + permission: + filter: + courtesycar: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true +- table: + schema: public + name: conversations + object_relationships: + - name: bodyshop + using: + foreign_key_constraint_on: bodyshopid + array_relationships: + - name: job_conversations + using: + foreign_key_constraint_on: + column: conversationid + table: + schema: public + name: job_conversations + - name: messages + using: + foreign_key_constraint_on: + column: conversationid + table: + schema: public + name: messages + insert_permissions: + - role: user + permission: + check: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - id + - created_at + - updated_at + - bodyshopid + - phone_num + select_permissions: + - role: user + permission: + columns: + - phone_num + - created_at + - updated_at + - bodyshopid + - id + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + allow_aggregations: true + update_permissions: + - role: user + permission: + columns: + - phone_num + - created_at + - updated_at + - bodyshopid + - id + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + check: null +- table: + schema: public + name: counters + object_relationships: + - name: bodyshop + using: + foreign_key_constraint_on: shopid +- table: + schema: public + name: courtesycars + object_relationships: + - name: bodyshop + using: + foreign_key_constraint_on: bodyshopid + array_relationships: + - name: cccontracts + using: + foreign_key_constraint_on: + column: courtesycarid + table: + schema: public + name: cccontracts + insert_permissions: + - role: user + permission: + check: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - id + - created_at + - updated_at + - bodyshopid + - make + - model + - year + - plate + - color + - vin + - fleetnumber + - purchasedate + - servicestartdate + - serviceenddate + - leaseenddate + - status + - nextservicekm + - nextservicedate + - damage + - notes + - fuel + - registrationexpires + - insuranceexpires + - dailycost + - mileage + select_permissions: + - role: user + permission: + columns: + - insuranceexpires + - leaseenddate + - nextservicedate + - purchasedate + - registrationexpires + - serviceenddate + - servicestartdate + - dailycost + - fuel + - mileage + - nextservicekm + - color + - damage + - fleetnumber + - make + - model + - notes + - plate + - status + - vin + - year + - created_at + - updated_at + - bodyshopid + - id + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + update_permissions: + - role: user + permission: + columns: + - insuranceexpires + - leaseenddate + - nextservicedate + - purchasedate + - registrationexpires + - serviceenddate + - servicestartdate + - dailycost + - fuel + - mileage + - nextservicekm + - color + - damage + - fleetnumber + - make + - model + - notes + - plate + - status + - vin + - year + - created_at + - updated_at + - bodyshopid + - id + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + check: null + delete_permissions: + - role: user + permission: + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true +- table: + schema: public + name: csi + object_relationships: + - name: bodyshop + using: + foreign_key_constraint_on: bodyshopid + - name: csiquestion + using: + foreign_key_constraint_on: questionset + - name: job + using: + foreign_key_constraint_on: jobid + insert_permissions: + - role: user + permission: + check: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - bodyshopid + - created_at + - id + - jobid + - questionset + - relateddata + - updated_at + - valid + - validuntil + select_permissions: + - role: anonymous + permission: + columns: + - id + - relateddata + - valid + - validuntil + filter: + valid: + _eq: true + limit: 1 + - role: user + permission: + columns: + - bodyshopid + - completedon + - created_at + - id + - jobid + - questionset + - relateddata + - response + - updated_at + - valid + - validuntil + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + allow_aggregations: true + update_permissions: + - role: anonymous + permission: + columns: + - completedon + - response + - valid + filter: + valid: + _eq: true + check: null + - role: user + permission: + columns: + - bodyshopid + - completedon + - created_at + - id + - jobid + - relateddata + - updated_at + - valid + - validuntil + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + check: null +- table: + schema: public + name: csiquestions + object_relationships: + - name: bodyshop + using: + foreign_key_constraint_on: bodyshopid + array_relationships: + - name: csis + using: + foreign_key_constraint_on: + column: questionset + table: + schema: public + name: csi + insert_permissions: + - role: user + permission: + check: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - current + - config + - created_at + - updated_at + - bodyshopid + - id + select_permissions: + - role: anonymous + permission: + columns: + - config + - id + filter: {} + limit: 1 + - role: user + permission: + columns: + - current + - config + - created_at + - updated_at + - bodyshopid + - id + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + update_permissions: + - role: user + permission: + columns: + - current + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + check: null +- table: + schema: public + name: documents + object_relationships: + - name: invoice + using: + foreign_key_constraint_on: invoiceid + - name: job + using: + foreign_key_constraint_on: jobid + insert_permissions: + - role: user + permission: + check: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - id + - created_at + - updated_at + - uploaded_by + - jobid + - name + - key + - invoiceid + - type + select_permissions: + - role: user + permission: + columns: + - key + - name + - type + - uploaded_by + - created_at + - updated_at + - id + - invoiceid + - jobid + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + update_permissions: + - role: user + permission: + columns: [] + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + check: null + delete_permissions: + - role: user + permission: + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true +- table: + schema: public + name: employees + object_relationships: + - name: bodyshop + using: + foreign_key_constraint_on: shopid + - name: user + using: + foreign_key_constraint_on: user_email + array_relationships: + - name: allocations + using: + foreign_key_constraint_on: + column: employeeid + table: + schema: public + name: allocations + - name: jobs + using: + foreign_key_constraint_on: + column: employee_body + table: + schema: public + name: jobs + - name: jobsByEmployeePrep + using: + foreign_key_constraint_on: + column: employee_prep + table: + schema: public + name: jobs + - name: jobsByEmployeeRefinish + using: + foreign_key_constraint_on: + column: employee_refinish + table: + schema: public + name: jobs + - name: timetickets + using: + foreign_key_constraint_on: + column: employeeid + table: + schema: public + name: timetickets + insert_permissions: + - role: user + permission: + check: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - active + - base_rate + - cost_center + - created_at + - employee_number + - first_name + - flat_rate + - hire_date + - id + - last_name + - pin + - shopid + - termination_date + - updated_at + - user_email + select_permissions: + - role: user + permission: + columns: + - active + - base_rate + - cost_center + - created_at + - employee_number + - first_name + - flat_rate + - hire_date + - id + - last_name + - pin + - shopid + - termination_date + - updated_at + - user_email + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + update_permissions: + - role: user + permission: + columns: + - active + - base_rate + - cost_center + - created_at + - employee_number + - first_name + - flat_rate + - hire_date + - id + - last_name + - pin + - shopid + - termination_date + - updated_at + - user_email + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + check: null + delete_permissions: + - role: user + permission: + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true +- table: + schema: public + name: invoicelines + object_relationships: + - name: invoice + using: + foreign_key_constraint_on: invoiceid + insert_permissions: + - role: user + permission: + check: + invoice: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - actual_cost + - actual_price + - applicable_taxes + - cost_center + - created_at + - id + - invoiceid + - joblineid + - line_desc + - quantity + - updated_at + select_permissions: + - role: user + permission: + columns: + - actual_cost + - actual_price + - applicable_taxes + - cost_center + - created_at + - id + - invoiceid + - joblineid + - line_desc + - quantity + - updated_at + filter: + invoice: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + update_permissions: + - role: user + permission: + columns: + - actual_cost + - actual_price + - applicable_taxes + - cost_center + - created_at + - id + - invoiceid + - joblineid + - line_desc + - quantity + - updated_at + filter: + invoice: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + check: null + delete_permissions: + - role: user + permission: + filter: + invoice: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true +- table: + schema: public + name: invoices + object_relationships: + - name: job + using: + foreign_key_constraint_on: jobid + - name: vendor + using: + foreign_key_constraint_on: vendorid + array_relationships: + - name: documents + using: + foreign_key_constraint_on: + column: invoiceid + table: + schema: public + name: documents + - name: invoicelines + using: + foreign_key_constraint_on: + column: invoiceid + table: + schema: public + name: invoicelines + - name: parts_orders + using: + foreign_key_constraint_on: + column: returnfrominvoice + table: + schema: public + name: parts_orders + insert_permissions: + - role: user + permission: + check: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - created_at + - date + - due_date + - exported + - exported_at + - federal_tax_rate + - id + - invoice_number + - is_credit_memo + - jobid + - local_tax_rate + - state_tax_rate + - total + - updated_at + - vendorid + select_permissions: + - role: user + permission: + columns: + - created_at + - date + - due_date + - exported + - exported_at + - federal_tax_rate + - id + - invoice_number + - is_credit_memo + - jobid + - local_tax_rate + - state_tax_rate + - total + - updated_at + - vendorid + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + allow_aggregations: true + update_permissions: + - role: user + permission: + columns: + - created_at + - date + - due_date + - exported + - exported_at + - federal_tax_rate + - id + - invoice_number + - is_credit_memo + - jobid + - local_tax_rate + - state_tax_rate + - total + - updated_at + - vendorid + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + check: null +- table: + schema: public + name: job_conversations + object_relationships: + - name: conversation + using: + foreign_key_constraint_on: conversationid + - name: job + using: + foreign_key_constraint_on: jobid + insert_permissions: + - role: user + permission: + check: + conversation: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - jobid + - conversationid + select_permissions: + - role: user + permission: + columns: + - conversationid + - jobid + filter: + conversation: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + update_permissions: + - role: user + permission: + columns: + - conversationid + - jobid + filter: + conversation: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + check: null + delete_permissions: + - role: user + permission: + filter: + conversation: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true +- table: + schema: public + name: joblines + object_relationships: + - name: job + using: + foreign_key_constraint_on: jobid + array_relationships: + - name: allocations + using: + foreign_key_constraint_on: + column: joblineid + table: + schema: public + name: allocations + - name: parts_order_lines + using: + foreign_key_constraint_on: + column: job_line_id + table: + schema: public + name: parts_order_lines + insert_permissions: + - role: user + permission: + check: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - act_price + - alt_co_id + - alt_overrd + - alt_part_i + - alt_partm + - alt_partno + - bett_amt + - bett_pctg + - bett_tax + - bett_type + - cert_part + - created_at + - db_hrs + - db_price + - db_ref + - est_seq + - glass_flag + - id + - jobid + - lbr_amt + - lbr_hrs_j + - lbr_inc + - lbr_op + - lbr_op_j + - lbr_tax + - lbr_typ_j + - line_desc + - line_ind + - line_no + - line_ref + - location + - misc_amt + - misc_sublt + - misc_tax + - mod_lb_hrs + - mod_lbr_ty + - notes + - oem_partno + - op_code_desc + - paint_stg + - paint_tone + - part_qty + - part_type + - price_inc + - price_j + - prt_dsmk_m + - prt_dsmk_p + - removed + - status + - tax_part + - unq_seq + - updated_at + select_permissions: + - role: user + permission: + columns: + - act_price + - alt_co_id + - alt_overrd + - alt_part_i + - alt_partm + - alt_partno + - bett_amt + - bett_pctg + - bett_tax + - bett_type + - cert_part + - created_at + - db_hrs + - db_price + - db_ref + - est_seq + - glass_flag + - id + - jobid + - lbr_amt + - lbr_hrs_j + - lbr_inc + - lbr_op + - lbr_op_j + - lbr_tax + - lbr_typ_j + - line_desc + - line_ind + - line_no + - line_ref + - location + - misc_amt + - misc_sublt + - misc_tax + - mod_lb_hrs + - mod_lbr_ty + - notes + - oem_partno + - op_code_desc + - paint_stg + - paint_tone + - part_qty + - part_type + - price_inc + - price_j + - prt_dsmk_m + - prt_dsmk_p + - removed + - status + - tax_part + - unq_seq + - updated_at + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + allow_aggregations: true + update_permissions: + - role: user + permission: + columns: + - act_price + - alt_co_id + - alt_overrd + - alt_part_i + - alt_partm + - alt_partno + - bett_amt + - bett_pctg + - bett_tax + - bett_type + - cert_part + - created_at + - db_hrs + - db_price + - db_ref + - est_seq + - glass_flag + - id + - jobid + - lbr_amt + - lbr_hrs_j + - lbr_inc + - lbr_op + - lbr_op_j + - lbr_tax + - lbr_typ_j + - line_desc + - line_ind + - line_no + - line_ref + - location + - misc_amt + - misc_sublt + - misc_tax + - mod_lb_hrs + - mod_lbr_ty + - notes + - oem_partno + - op_code_desc + - paint_stg + - paint_tone + - part_qty + - part_type + - price_inc + - price_j + - prt_dsmk_m + - prt_dsmk_p + - removed + - status + - tax_part + - unq_seq + - updated_at + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + check: null + delete_permissions: + - role: user + permission: + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true +- table: + schema: public + name: jobs + object_relationships: + - name: bodyshop + using: + foreign_key_constraint_on: shopid + - name: employee_body_rel + using: + foreign_key_constraint_on: employee_body + - name: employee_prep_rel + using: + foreign_key_constraint_on: employee_prep + - name: employee_refinish_rel + using: + foreign_key_constraint_on: employee_refinish + - name: invoice + using: + manual_configuration: + remote_table: + schema: public + name: invoices + column_mapping: + id: jobid + - name: owner + using: + foreign_key_constraint_on: ownerid + - name: vehicle + using: + foreign_key_constraint_on: vehicleid + array_relationships: + - name: appointments + using: + foreign_key_constraint_on: + column: jobid + table: + schema: public + name: appointments + - name: available_jobs + using: + foreign_key_constraint_on: + column: jobid + table: + schema: public + name: available_jobs + - name: cccontracts + using: + foreign_key_constraint_on: + column: jobid + table: + schema: public + name: cccontracts + - name: csiinvites + using: + foreign_key_constraint_on: + column: jobid + table: + schema: public + name: csi + - name: documents + using: + foreign_key_constraint_on: + column: jobid + table: + schema: public + name: documents + - name: invoices + using: + foreign_key_constraint_on: + column: jobid + table: + schema: public + name: invoices + - name: job_conversations + using: + foreign_key_constraint_on: + column: jobid + table: + schema: public + name: job_conversations + - name: joblines + using: + foreign_key_constraint_on: + column: jobid + table: + schema: public + name: joblines + - name: notes + using: + foreign_key_constraint_on: + column: jobid + table: + schema: public + name: notes + - name: parts_orders + using: + foreign_key_constraint_on: + column: jobid + table: + schema: public + name: parts_orders + - name: payments + using: + foreign_key_constraint_on: + column: jobid + table: + schema: public + name: payments + - name: scoreboards + using: + foreign_key_constraint_on: + column: jobid + table: + schema: public + name: scoreboard + - name: timetickets + using: + foreign_key_constraint_on: + column: jobid + table: + schema: public + name: timetickets + insert_permissions: + - role: user + permission: + check: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - actual_completion + - actual_delivery + - actual_in + - adj_g_disc + - adj_strdis + - adj_towdis + - adjustment_bottom_line + - agt_addr1 + - agt_addr2 + - agt_city + - agt_co_id + - agt_co_nm + - agt_ct_fn + - agt_ct_ln + - agt_ct_ph + - agt_ct_phx + - agt_ctry + - agt_ea + - agt_fax + - agt_faxx + - agt_lic_no + - agt_ph1 + - agt_ph1x + - agt_ph2 + - agt_ph2x + - agt_st + - agt_zip + - area_of_damage + - asgn_date + - asgn_no + - asgn_type + - cat_no + - cieca_stl + - cieca_ttl + - ciecaid + - clm_addr1 + - clm_addr2 + - clm_city + - clm_ct_fn + - clm_ct_ln + - clm_ct_ph + - clm_ct_phx + - clm_ctry + - clm_ea + - clm_fax + - clm_faxx + - clm_no + - clm_ofc_id + - clm_ofc_nm + - clm_ph1 + - clm_ph1x + - clm_ph2 + - clm_ph2x + - clm_st + - clm_title + - clm_total + - clm_zip + - converted + - created_at + - csr + - cust_pr + - date_closed + - date_estimated + - date_exported + - date_invoiced + - date_open + - date_scheduled + - ded_amt + - ded_status + - depreciation_taxes + - employee_body + - employee_prep + - employee_refinish + - est_addr1 + - est_addr2 + - est_city + - est_co_nm + - est_ct_fn + - est_ct_ln + - est_ctry + - est_ea + - est_number + - est_ph1 + - est_st + - est_zip + - federal_tax_payable + - federal_tax_rate + - g_bett_amt + - id + - inproduction + - ins_addr1 + - ins_addr2 + - ins_city + - ins_co_id + - ins_co_nm + - ins_ct_fn + - ins_ct_ln + - ins_ct_ph + - ins_ct_phx + - ins_ctry + - ins_ea + - ins_fax + - ins_faxx + - ins_memo + - ins_ph1 + - ins_ph1x + - ins_ph2 + - ins_ph2x + - ins_st + - ins_title + - ins_zip + - insd_addr1 + - insd_addr2 + - insd_city + - insd_co_nm + - insd_ctry + - insd_ea + - insd_fax + - insd_faxx + - insd_fn + - insd_ln + - insd_ph1 + - insd_ph1x + - insd_ph2 + - insd_ph2x + - insd_st + - insd_title + - insd_zip + - intakechecklist + - invoice_allocation + - invoice_date + - job_totals + - kanbanparent + - kmin + - kmout + - labor_rate_desc + - labor_rate_id + - local_tax_rate + - loss_cat + - loss_date + - loss_desc + - loss_type + - other_amount_payable + - owner_owing + - ownerid + - ownr_addr1 + - ownr_addr2 + - ownr_city + - ownr_co_nm + - ownr_ctry + - ownr_ea + - ownr_fax + - ownr_faxx + - ownr_fn + - ownr_ln + - ownr_ph1 + - ownr_ph1x + - ownr_ph2 + - ownr_ph2x + - ownr_st + - ownr_title + - ownr_zip + - parts_tax_rates + - pay_amt + - pay_chknm + - pay_date + - pay_type + - payee_nms + - plate_no + - plate_st + - po_number + - policy_no + - production_vars + - rate_atp + - rate_la1 + - rate_la2 + - rate_la3 + - rate_la4 + - rate_laa + - rate_lab + - rate_lad + - rate_lae + - rate_laf + - rate_lag + - rate_lam + - rate_lar + - rate_las + - rate_lau + - rate_ma2s + - rate_ma2t + - rate_ma3s + - rate_mabl + - rate_macs + - rate_mahw + - rate_mapa + - rate_mash + - rate_matd + - referral_source + - regie_number + - ro_number + - scheduled_completion + - scheduled_delivery + - scheduled_in + - selling_dealer + - selling_dealer_contact + - servicing_dealer + - servicing_dealer_contact + - shopid + - special_coverage_policy + - state_tax_rate + - status + - statusid + - storage_payable + - tax_lbr_rt + - tax_levies_rt + - tax_paint_mat_rt + - tax_predis + - tax_prethr + - tax_pstthr + - tax_str_rt + - tax_sub_rt + - tax_thramt + - tax_tow_rt + - theft_ind + - tlos_ind + - towing_payable + - unit_number + - updated_at + - v_color + - v_make_desc + - v_model_desc + - v_model_yr + - v_vin + - vehicleid + select_permissions: + - role: user + permission: + columns: + - actual_completion + - actual_delivery + - actual_in + - adj_g_disc + - adj_strdis + - adj_towdis + - adjustment_bottom_line + - agt_addr1 + - agt_addr2 + - agt_city + - agt_co_id + - agt_co_nm + - agt_ct_fn + - agt_ct_ln + - agt_ct_ph + - agt_ct_phx + - agt_ctry + - agt_ea + - agt_fax + - agt_faxx + - agt_lic_no + - agt_ph1 + - agt_ph1x + - agt_ph2 + - agt_ph2x + - agt_st + - agt_zip + - area_of_damage + - asgn_date + - asgn_no + - asgn_type + - cat_no + - cieca_stl + - cieca_ttl + - ciecaid + - clm_addr1 + - clm_addr2 + - clm_city + - clm_ct_fn + - clm_ct_ln + - clm_ct_ph + - clm_ct_phx + - clm_ctry + - clm_ea + - clm_fax + - clm_faxx + - clm_no + - clm_ofc_id + - clm_ofc_nm + - clm_ph1 + - clm_ph1x + - clm_ph2 + - clm_ph2x + - clm_st + - clm_title + - clm_total + - clm_zip + - converted + - created_at + - csr + - cust_pr + - date_closed + - date_estimated + - date_exported + - date_invoiced + - date_open + - date_scheduled + - ded_amt + - ded_status + - depreciation_taxes + - employee_body + - employee_prep + - employee_refinish + - est_addr1 + - est_addr2 + - est_city + - est_co_nm + - est_ct_fn + - est_ct_ln + - est_ctry + - est_ea + - est_number + - est_ph1 + - est_st + - est_zip + - federal_tax_payable + - federal_tax_rate + - g_bett_amt + - id + - inproduction + - ins_addr1 + - ins_addr2 + - ins_city + - ins_co_id + - ins_co_nm + - ins_ct_fn + - ins_ct_ln + - ins_ct_ph + - ins_ct_phx + - ins_ctry + - ins_ea + - ins_fax + - ins_faxx + - ins_memo + - ins_ph1 + - ins_ph1x + - ins_ph2 + - ins_ph2x + - ins_st + - ins_title + - ins_zip + - insd_addr1 + - insd_addr2 + - insd_city + - insd_co_nm + - insd_ctry + - insd_ea + - insd_fax + - insd_faxx + - insd_fn + - insd_ln + - insd_ph1 + - insd_ph1x + - insd_ph2 + - insd_ph2x + - insd_st + - insd_title + - insd_zip + - intakechecklist + - invoice_allocation + - invoice_date + - job_totals + - kanbanparent + - kmin + - kmout + - labor_rate_desc + - labor_rate_id + - local_tax_rate + - loss_cat + - loss_date + - loss_desc + - loss_type + - other_amount_payable + - owner_owing + - ownerid + - ownr_addr1 + - ownr_addr2 + - ownr_city + - ownr_co_nm + - ownr_ctry + - ownr_ea + - ownr_fax + - ownr_faxx + - ownr_fn + - ownr_ln + - ownr_ph1 + - ownr_ph1x + - ownr_ph2 + - ownr_ph2x + - ownr_st + - ownr_title + - ownr_zip + - parts_tax_rates + - pay_amt + - pay_chknm + - pay_date + - pay_type + - payee_nms + - plate_no + - plate_st + - po_number + - policy_no + - production_vars + - rate_atp + - rate_la1 + - rate_la2 + - rate_la3 + - rate_la4 + - rate_laa + - rate_lab + - rate_lad + - rate_lae + - rate_laf + - rate_lag + - rate_lam + - rate_lar + - rate_las + - rate_lau + - rate_ma2s + - rate_ma2t + - rate_ma3s + - rate_mabl + - rate_macs + - rate_mahw + - rate_mapa + - rate_mash + - rate_matd + - referral_source + - regie_number + - ro_number + - scheduled_completion + - scheduled_delivery + - scheduled_in + - selling_dealer + - selling_dealer_contact + - servicing_dealer + - servicing_dealer_contact + - shopid + - special_coverage_policy + - state_tax_rate + - status + - statusid + - storage_payable + - tax_lbr_rt + - tax_levies_rt + - tax_paint_mat_rt + - tax_predis + - tax_prethr + - tax_pstthr + - tax_str_rt + - tax_sub_rt + - tax_thramt + - tax_tow_rt + - theft_ind + - tlos_ind + - towing_payable + - unit_number + - updated_at + - v_color + - v_make_desc + - v_model_desc + - v_model_yr + - v_vin + - vehicleid + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + allow_aggregations: true + update_permissions: + - role: user + permission: + columns: + - actual_completion + - actual_delivery + - actual_in + - adj_g_disc + - adj_strdis + - adj_towdis + - adjustment_bottom_line + - agt_addr1 + - agt_addr2 + - agt_city + - agt_co_id + - agt_co_nm + - agt_ct_fn + - agt_ct_ln + - agt_ct_ph + - agt_ct_phx + - agt_ctry + - agt_ea + - agt_fax + - agt_faxx + - agt_lic_no + - agt_ph1 + - agt_ph1x + - agt_ph2 + - agt_ph2x + - agt_st + - agt_zip + - area_of_damage + - asgn_date + - asgn_no + - asgn_type + - cat_no + - cieca_stl + - cieca_ttl + - ciecaid + - clm_addr1 + - clm_addr2 + - clm_city + - clm_ct_fn + - clm_ct_ln + - clm_ct_ph + - clm_ct_phx + - clm_ctry + - clm_ea + - clm_fax + - clm_faxx + - clm_no + - clm_ofc_id + - clm_ofc_nm + - clm_ph1 + - clm_ph1x + - clm_ph2 + - clm_ph2x + - clm_st + - clm_title + - clm_total + - clm_zip + - converted + - created_at + - csr + - cust_pr + - date_closed + - date_estimated + - date_exported + - date_invoiced + - date_open + - date_scheduled + - ded_amt + - ded_status + - depreciation_taxes + - employee_body + - employee_prep + - employee_refinish + - est_addr1 + - est_addr2 + - est_city + - est_co_nm + - est_ct_fn + - est_ct_ln + - est_ctry + - est_ea + - est_number + - est_ph1 + - est_st + - est_zip + - federal_tax_payable + - federal_tax_rate + - g_bett_amt + - id + - inproduction + - ins_addr1 + - ins_addr2 + - ins_city + - ins_co_id + - ins_co_nm + - ins_ct_fn + - ins_ct_ln + - ins_ct_ph + - ins_ct_phx + - ins_ctry + - ins_ea + - ins_fax + - ins_faxx + - ins_memo + - ins_ph1 + - ins_ph1x + - ins_ph2 + - ins_ph2x + - ins_st + - ins_title + - ins_zip + - insd_addr1 + - insd_addr2 + - insd_city + - insd_co_nm + - insd_ctry + - insd_ea + - insd_fax + - insd_faxx + - insd_fn + - insd_ln + - insd_ph1 + - insd_ph1x + - insd_ph2 + - insd_ph2x + - insd_st + - insd_title + - insd_zip + - intakechecklist + - invoice_allocation + - invoice_date + - job_totals + - kanbanparent + - kmin + - kmout + - labor_rate_desc + - labor_rate_id + - local_tax_rate + - loss_cat + - loss_date + - loss_desc + - loss_type + - other_amount_payable + - owner_owing + - ownerid + - ownr_addr1 + - ownr_addr2 + - ownr_city + - ownr_co_nm + - ownr_ctry + - ownr_ea + - ownr_fax + - ownr_faxx + - ownr_fn + - ownr_ln + - ownr_ph1 + - ownr_ph1x + - ownr_ph2 + - ownr_ph2x + - ownr_st + - ownr_title + - ownr_zip + - parts_tax_rates + - pay_amt + - pay_chknm + - pay_date + - pay_type + - payee_nms + - plate_no + - plate_st + - po_number + - policy_no + - production_vars + - rate_atp + - rate_la1 + - rate_la2 + - rate_la3 + - rate_la4 + - rate_laa + - rate_lab + - rate_lad + - rate_lae + - rate_laf + - rate_lag + - rate_lam + - rate_lar + - rate_las + - rate_lau + - rate_ma2s + - rate_ma2t + - rate_ma3s + - rate_mabl + - rate_macs + - rate_mahw + - rate_mapa + - rate_mash + - rate_matd + - referral_source + - regie_number + - ro_number + - scheduled_completion + - scheduled_delivery + - scheduled_in + - selling_dealer + - selling_dealer_contact + - servicing_dealer + - servicing_dealer_contact + - shopid + - special_coverage_policy + - state_tax_rate + - status + - statusid + - storage_payable + - tax_lbr_rt + - tax_levies_rt + - tax_paint_mat_rt + - tax_predis + - tax_prethr + - tax_pstthr + - tax_str_rt + - tax_sub_rt + - tax_thramt + - tax_tow_rt + - theft_ind + - tlos_ind + - towing_payable + - unit_number + - updated_at + - v_color + - v_make_desc + - v_model_desc + - v_model_yr + - v_vin + - vehicleid + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + check: null + delete_permissions: + - role: user + permission: + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true +- table: + schema: public + name: masterdata + select_permissions: + - role: anonymous + permission: + columns: + - key + - value + filter: {} + - role: user + permission: + columns: + - key + - value + filter: {} +- table: + schema: public + name: messages + object_relationships: + - name: conversation + using: + foreign_key_constraint_on: conversationid + insert_permissions: + - role: user + permission: + check: + conversation: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - id + - created_at + - updated_at + - msid + - conversationid + - text + - image + - image_path + - isoutbound + - status + - read + select_permissions: + - role: user + permission: + columns: + - image + - isoutbound + - read + - image_path + - msid + - status + - text + - created_at + - updated_at + - conversationid + - id + filter: + conversation: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + allow_aggregations: true + update_permissions: + - role: user + permission: + columns: + - image + - isoutbound + - read + - image_path + - msid + - status + - text + - created_at + - updated_at + - conversationid + - id + filter: + conversation: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + check: null + delete_permissions: + - role: user + permission: + filter: + conversation: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true +- table: + schema: public + name: notes + object_relationships: + - name: job + using: + foreign_key_constraint_on: jobid + - name: user + using: + foreign_key_constraint_on: created_by + insert_permissions: + - role: user + permission: + check: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - id + - created_at + - updated_at + - jobid + - text + - created_by + - critical + - private + select_permissions: + - role: user + permission: + columns: + - critical + - private + - created_by + - text + - created_at + - updated_at + - id + - jobid + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + update_permissions: + - role: user + permission: + columns: + - critical + - private + - created_by + - text + - created_at + - updated_at + - id + - jobid + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + check: null + delete_permissions: + - role: user + permission: + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true +- table: + schema: public + name: owners + object_relationships: + - name: bodyshop + using: + foreign_key_constraint_on: shopid + array_relationships: + - name: jobs + using: + foreign_key_constraint_on: + column: ownerid + table: + schema: public + name: jobs + insert_permissions: + - role: user + permission: + check: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - id + - created_at + - updated_at + - ownr_fn + - ownr_ln + - ownr_addr1 + - ownr_addr2 + - ownr_city + - ownr_st + - ownr_zip + - ownr_ctry + - ownr_ea + - ownr_ph1 + - preferred_contact + - allow_text_message + - shopid + - ownr_ph2 + - ownr_co_nm + - ownr_title + - accountingid + select_permissions: + - role: user + permission: + columns: + - allow_text_message + - accountingid + - ownr_addr1 + - ownr_addr2 + - ownr_city + - ownr_co_nm + - ownr_ctry + - ownr_ea + - ownr_fn + - ownr_ln + - ownr_ph1 + - ownr_ph2 + - ownr_st + - ownr_title + - ownr_zip + - preferred_contact + - created_at + - updated_at + - id + - shopid + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + allow_aggregations: true + update_permissions: + - role: user + permission: + columns: + - allow_text_message + - accountingid + - ownr_addr1 + - ownr_addr2 + - ownr_city + - ownr_co_nm + - ownr_ctry + - ownr_ea + - ownr_fn + - ownr_ln + - ownr_ph1 + - ownr_ph2 + - ownr_st + - ownr_title + - ownr_zip + - preferred_contact + - created_at + - updated_at + - id + - shopid + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + check: null + delete_permissions: + - role: user + permission: + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true +- table: + schema: public + name: parts_order_lines + object_relationships: + - name: jobline + using: + foreign_key_constraint_on: job_line_id + - name: parts_order + using: + foreign_key_constraint_on: orderid + insert_permissions: + - role: user + permission: + check: + parts_order: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - act_price + - backordered_eta + - backordered_on + - created_at + - db_price + - id + - job_line_id + - line_desc + - line_remarks + - oem_partno + - orderid + - quantity + - status + - updated_at + select_permissions: + - role: user + permission: + columns: + - act_price + - backordered_eta + - backordered_on + - created_at + - db_price + - id + - job_line_id + - line_desc + - line_remarks + - oem_partno + - orderid + - quantity + - status + - updated_at + filter: + parts_order: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + update_permissions: + - role: user + permission: + columns: + - act_price + - backordered_eta + - backordered_on + - created_at + - db_price + - id + - job_line_id + - line_desc + - line_remarks + - oem_partno + - orderid + - quantity + - status + - updated_at + filter: + parts_order: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + check: null + delete_permissions: + - role: user + permission: + filter: + parts_order: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true +- table: + schema: public + name: parts_orders + object_relationships: + - name: invoice + using: + foreign_key_constraint_on: returnfrominvoice + - name: job + using: + foreign_key_constraint_on: jobid + - name: user + using: + foreign_key_constraint_on: user_email + - name: vendor + using: + foreign_key_constraint_on: vendorid + array_relationships: + - name: parts_order_lines + using: + foreign_key_constraint_on: + column: orderid + table: + schema: public + name: parts_order_lines + insert_permissions: + - role: user + permission: + check: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - created_at + - deliver_by + - id + - jobid + - order_date + - order_number + - return + - returnfrominvoice + - status + - updated_at + - user_email + - vendorid + select_permissions: + - role: user + permission: + columns: + - created_at + - deliver_by + - id + - jobid + - order_date + - order_number + - return + - returnfrominvoice + - status + - updated_at + - user_email + - vendorid + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + update_permissions: + - role: user + permission: + columns: + - created_at + - deliver_by + - id + - jobid + - order_date + - order_number + - returnfrominvoice + - status + - updated_at + - user_email + - vendorid + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + check: null + delete_permissions: + - role: user + permission: + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true +- table: + schema: public + name: payments + object_relationships: + - name: job + using: + foreign_key_constraint_on: jobid + insert_permissions: + - role: user + permission: + check: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - amount + - created_at + - exportedat + - id + - jobid + - memo + - payer + - stripeid + - transactionid + - type + - updated_at + select_permissions: + - role: user + permission: + columns: + - amount + - created_at + - exportedat + - id + - jobid + - memo + - payer + - stripeid + - transactionid + - type + - updated_at + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + allow_aggregations: true + update_permissions: + - role: user + permission: + columns: + - amount + - created_at + - exportedat + - id + - jobid + - memo + - payer + - stripeid + - transactionid + - type + - updated_at + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + check: null + delete_permissions: + - role: user + permission: + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true +- table: + schema: public + name: scoreboard + object_relationships: + - name: job + using: + foreign_key_constraint_on: jobid + insert_permissions: + - role: user + permission: + check: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - id + - jobid + - painthrs + - bodyhrs + - date + backend_only: false + select_permissions: + - role: user + permission: + columns: + - date + - bodyhrs + - painthrs + - id + - jobid + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + allow_aggregations: true + update_permissions: + - role: user + permission: + columns: + - date + - bodyhrs + - painthrs + - id + - jobid + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + check: null + delete_permissions: + - role: user + permission: + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true +- table: + schema: public + name: templates + object_relationships: + - name: bodyshop + using: + foreign_key_constraint_on: bodyshopid + insert_permissions: + - role: user + permission: + check: + _or: + - bodyshopid: + _is_null: true + - bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - bodyshopid + - html + - name + - query + select_permissions: + - role: user + permission: + columns: + - html + - name + - query + - created_at + - updated_at + - bodyshopid + - id + filter: + _or: + - bodyshopid: + _is_null: true + - bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + update_permissions: + - role: user + permission: + columns: + - html + - name + - query + - created_at + - updated_at + - bodyshopid + - id + filter: + _or: + - bodyshopid: + _is_null: true + - bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + check: null + delete_permissions: + - role: user + permission: + filter: + _or: + - bodyshopid: + _is_null: false + - bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true +- table: + schema: public + name: timetickets + object_relationships: + - name: bodyshop + using: + foreign_key_constraint_on: bodyshopid + - name: employee + using: + foreign_key_constraint_on: employeeid + - name: job + using: + foreign_key_constraint_on: jobid + insert_permissions: + - role: user + permission: + check: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - actualhrs + - bodyshopid + - ciecacode + - clockoff + - clockon + - cost_center + - created_at + - date + - employeeid + - id + - jobid + - memo + - productivehrs + - rate + - updated_at + select_permissions: + - role: user + permission: + columns: + - actualhrs + - bodyshopid + - ciecacode + - clockoff + - clockon + - cost_center + - created_at + - date + - employeeid + - id + - jobid + - memo + - productivehrs + - rate + - updated_at + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + update_permissions: + - role: user + permission: + columns: + - actualhrs + - bodyshopid + - ciecacode + - clockoff + - clockon + - cost_center + - created_at + - date + - employeeid + - id + - jobid + - memo + - productivehrs + - rate + - updated_at + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + check: null + delete_permissions: + - role: user + permission: + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true +- table: + schema: public + name: users + object_relationships: + - name: employee + using: + manual_configuration: + remote_table: + schema: public + name: employees + column_mapping: + email: user_email + array_relationships: + - name: associations + using: + foreign_key_constraint_on: + column: useremail + table: + schema: public + name: associations + - name: audit_trails + using: + foreign_key_constraint_on: + column: useremail + table: + schema: public + name: audit_trail + - name: notes + using: + foreign_key_constraint_on: + column: created_by + table: + schema: public + name: notes + - name: parts_orders + using: + foreign_key_constraint_on: + column: user_email + table: + schema: public + name: parts_orders + insert_permissions: + - role: user + permission: + check: {} + columns: + - authid + - email + - fcmtokens + select_permissions: + - role: user + permission: + columns: + - authid + - created_at + - dashboardlayout + - email + - fcmtokens + - updated_at + filter: + authid: + _eq: X-Hasura-User-Id + update_permissions: + - role: user + permission: + columns: + - authid + - dashboardlayout + - email + - fcmtokens + filter: + authid: + _eq: X-Hasura-User-Id + check: null +- table: + schema: public + name: vehicles + object_relationships: + - name: bodyshop + using: + foreign_key_constraint_on: shopid + array_relationships: + - name: jobs + using: + foreign_key_constraint_on: + column: vehicleid + table: + schema: public + name: jobs + insert_permissions: + - role: user + permission: + check: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - id + - created_at + - updated_at + - v_vin + - v_make_desc + - v_model_desc + - v_model_yr + - v_color + - v_paint_codes + - v_bstyle + - v_engine + - shopid + - db_v_code + - plate_no + - plate_st + - v_cond + - v_prod_dt + - v_type + - v_trimcode + - trim_color + - v_mldgcode + - v_options + - v_tone + - v_stage + - v_makecode + select_permissions: + - role: user + permission: + columns: + - v_paint_codes + - db_v_code + - plate_no + - plate_st + - trim_color + - v_bstyle + - v_color + - v_cond + - v_engine + - v_makecode + - v_make_desc + - v_mldgcode + - v_model_desc + - v_model_yr + - v_options + - v_prod_dt + - v_stage + - v_tone + - v_trimcode + - v_type + - v_vin + - created_at + - updated_at + - id + - shopid + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + allow_aggregations: true + update_permissions: + - role: user + permission: + columns: + - v_paint_codes + - db_v_code + - plate_no + - plate_st + - trim_color + - v_bstyle + - v_color + - v_cond + - v_engine + - v_makecode + - v_make_desc + - v_mldgcode + - v_model_desc + - v_model_yr + - v_options + - v_prod_dt + - v_stage + - v_tone + - v_trimcode + - v_type + - v_vin + - created_at + - updated_at + - id + - shopid + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + check: null + delete_permissions: + - role: user + permission: + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true +- table: + schema: public + name: vendors + object_relationships: + - name: bodyshop + using: + foreign_key_constraint_on: bodyshopid + array_relationships: + - name: invoices + using: + foreign_key_constraint_on: + column: vendorid + table: + schema: public + name: invoices + - name: parts_orders + using: + foreign_key_constraint_on: + column: vendorid + table: + schema: public + name: parts_orders + insert_permissions: + - role: user + permission: + check: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - due_date + - favorite + - discount + - prompt_discount + - city + - cost_center + - country + - display_name + - email + - name + - state + - street1 + - street2 + - taxid + - terms + - zip + - created_at + - updated_at + - bodyshopid + - id + select_permissions: + - role: user + permission: + columns: + - due_date + - favorite + - discount + - prompt_discount + - city + - cost_center + - country + - display_name + - email + - name + - state + - street1 + - street2 + - taxid + - terms + - zip + - created_at + - updated_at + - bodyshopid + - id + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + update_permissions: + - role: user + permission: + columns: + - due_date + - favorite + - discount + - prompt_discount + - city + - cost_center + - country + - display_name + - email + - name + - state + - street1 + - street2 + - taxid + - terms + - zip + - created_at + - updated_at + - bodyshopid + - id + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + check: null + delete_permissions: + - role: user + permission: + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true +functions: +- function: + schema: public + name: search_invoices +- function: + schema: public + name: search_jobs +- function: + schema: public + name: search_owners +- function: + schema: public + name: search_payments +- function: + schema: public + name: search_vehicles diff --git a/package.json b/package.json index b729e983b..403dc27e3 100644 --- a/package.json +++ b/package.json @@ -3,34 +3,44 @@ "version": "0.0.1", "license": "UNLICENSED", "engines": { - "node": "12.16.2", + "node": "12.18.3", "npm": "6.11.3" }, "scripts": { - "setup": "yarn && cd firebase && yarn && cd .. && cd client && yarn ", + "setup": "yarn && cd firebase && yarn && cd .. && cd client && yarn && cd .. && cd admin && yarn", + "admin": "cd admin && yarn start", "client": "cd client && yarn start", "server": "nodemon server.js", "build": "cd client && npm run build", "dev": "concurrently --kill-others-on-fail \"yarn server\" \"yarn client\"", + "deva": "concurrently --kill-others-on-fail \"yarn server\" \"yarn client\" \"yarn admin\"", "start": "node server.js", "heroku-postbuild": "cd client && npm install && npm install --only=dev --no-shrinkwrap && npm run build" }, "dependencies": { "body-parser": "^1.18.3", - "cloudinary": "^1.21.0", + "cloudinary": "^1.22.0", "compression": "^1.7.4", "cors": "2.8.5", + "dinero.js": "^1.8.1", "dotenv": "8.2.0", "express": "^4.16.4", "express-sslify": "^1.2.0", - "graphql-request": "^1.8.2", + "firebase-admin": "^8.13.0", + "graphql-request": "^2.0.0", "handlebars": "^4.7.6", - "nodemailer": "^6.4.4", - "phone": "^2.4.8", - "twilio": "^3.41.1" + "lodash": "^4.17.19", + "moment": "^2.27.0", + "node-fetch": "^2.6.0", + "node-mailjet": "^3.3.1", + "nodemailer": "^6.4.10", + "phone": "^2.4.13", + "stripe": "^8.70.0", + "twilio": "^3.48.0", + "xmlbuilder": "^15.1.1" }, "devDependencies": { - "concurrently": "^5.1.0", + "concurrently": "^5.2.0", "eslint": "^6.8.0", "eslint-plugin-promise": "^4.2.1", "source-map-explorer": "^2.4.2" diff --git a/sendemail.js b/sendemail.js index 4ae843181..c313d9d9a 100644 --- a/sendemail.js +++ b/sendemail.js @@ -1,5 +1,81 @@ var nodemailer = require("nodemailer"); -require("dotenv").config(); +const path = require("path"); +require("dotenv").config({ + path: path.resolve( + process.cwd(), + `.env.${process.env.NODE_ENV || "development"}` + ), +}); + +const mailjet = require("node-mailjet").connect( + process.env.email_api, + process.env.email_secret +); + +exports.sendEmail = (req, res) => { + if (process.env.NODE_ENV !== "production") { + console.log("[EMAIL] Incoming Message", req.body.from.name); + } + + const request = mailjet.post("send", { version: "v3.1" }).request({ + Messages: [ + { + From: { + Email: req.body.from.address, + Name: req.body.from.name, + }, + To: req.body.to.map((i) => { + return { Email: i }; + }), + + ReplyTo: { + Email: req.body.from.address, + Name: req.body.from.name, + }, + Subject: req.body.subject, + // TextPart: + // "Dear passenger 1, welcome to Mailjet! May the delivery force be with you!", + HTMLPart: req.body.html, + Attachments: req.body.attachments || null, + // Attachments: [ + // { + // ContentType: "text/plain", + // Filename: "test.txt", + // Base64Content: "VGhpcyBpcyB5b3VyIGF0dGFjaGVkIGZpbGUhISEK", + // }, + // ], + }, + ], + }); + request + .then((result) => { + console.log("[EMAIL] Email sent: " + result); + res.json({ success: true, response: result }); + }) + .catch((err) => { + console.log("[EMAIL] Email send failed. ", err); + res.json({ success: false, error: err.message }); + }); + + // transporter.sendMail( + // { + // ...req.body, + // from: { + // name: req.body.from.name , + // address: "noreply@bodyshop.app", + // }, + // }, + // function (error, info) { + // if (error) { + // console.log("[EMAIL] Email send failed. ", error); + // res.json({ success: false, error: error }); + // } else { + // console.log("[EMAIL] Email sent: " + info.response); + // res.json({ success: true, response: info.response }); + // } + // } + // ); +}; var transporter = nodemailer.createTransport({ host: process.env.email_server, @@ -19,28 +95,3 @@ transporter.verify(function (error, success) { console.log("[EMAIL] Succesfully connected to SMTP server."); } }); - -exports.sendEmail = (req, res) => { - if (process.env.NODE_ENV !== "production") { - //console.log("[EMAIL] Incoming Message Body", req.body); - console.log("[EMAIL] Incoming Message", req.body.from.name); - } - transporter.sendMail( - { - ...req.body, - from: { - name: req.body.from.name || "No Reply @ Bodyshop.app", - address: "noreply@bodyshop.app", - }, - }, - function (error, info) { - if (error) { - console.log("[EMAIL] Email send failed. ", error); - res.json({ success: false, error: error }); - } else { - console.log("[EMAIL] Email sent: " + info.response); - res.json({ success: true, response: info.response }); - } - } - ); -}; diff --git a/server.js b/server.js index 68629640c..48394ed5a 100644 --- a/server.js +++ b/server.js @@ -4,8 +4,15 @@ const bodyParser = require("body-parser"); const path = require("path"); const compression = require("compression"); const twilio = require("twilio"); +global.fetch = require("node-fetch"); //var enforce = require("express-sslify"); -if (process.env.NODE_ENV !== "production") require("dotenv").config(); + +require("dotenv").config({ + path: path.resolve( + process.cwd(), + `.env.${process.env.NODE_ENV || "development"}` + ), +}); const https = require("https"); const fs = require("fs"); @@ -15,8 +22,8 @@ const port = process.env.PORT || 5000; //const port = 5000; app.use(compression()); -app.use(bodyParser.json()); -app.use(bodyParser.urlencoded({ extended: true })); +app.use(bodyParser.json({ limit: "50mb" })); +app.use(bodyParser.urlencoded({ limit: "50mb", extended: true })); //app.use(enforce.HTTPS({ trustProtoHeader: true })); app.use(cors()); @@ -25,9 +32,21 @@ var sendEmail = require("./sendemail.js"); app.post("/sendemail", sendEmail.sendEmail); //Test route to ensure Express is responding. -app.get("/test", function (req, res) { - res.json({ success: true }); +app.get("/test", async function (req, res) { + res.status(200).send("OK"); }); +const test = require("./server/_test/test.js"); +app.post("/test", test.testResponse); + +//Accounting-IIF +const accountingIIF = require("./server/accounting/iif/iif"); +app.post("/accounting/iif/receivables", accountingIIF.receivables); + +//Accounting Qbxml +const accountQbxml = require("./server/accounting/qbxml/qbxml"); +app.post("/accounting/qbxml/receivables", accountQbxml.receivables); +app.post("/accounting/qbxml/payables", accountQbxml.payables); +app.post("/accounting/qbxml/payments", accountQbxml.payments); //Cloudinary Media Paths var media = require("./server/media/media"); @@ -50,18 +69,42 @@ app.post( smsStatus.status ); +//Scheduling +var scheduling = require("./server/scheduling/scheduling-job"); +app.post("/scheduling/job", scheduling.job); + //Handlebars Paths for Email/Report Rendering var renderHandlebars = require("./server/render/renderHandlebars"); app.post("/render", renderHandlebars.render); +var fb = require("./server/firebase/firebase-handler"); +app.post("/notifications/send", fb.sendNotification); + +//Stripe Processing +var stripe = require("./server/stripe/payment"); +app.post("/stripe/payment", stripe.payment); +app.post("/stripe/mobilepayment", stripe.mobile_payment); + +//Tech Console +var tech = require("./server/tech/tech"); +app.post("/tech/login", tech.techLogin); + +var utils = require("./server/utils/utils"); +app.post("/utils/time", utils.servertime); + //Serve React App if in Production if (process.env.NODE_ENV === "production") { app.use(express.static(path.join(__dirname, "client/build"))); + app.use(express.static(path.join(__dirname, "admin/build"))); app.get("/service-worker.js", (req, res) => { res.sendFile(path.resolve(__dirname, "..", "build", "service-worker.js")); }); + app.get("/admin*", function (req, res) { + res.sendFile(path.join(__dirname, "admin/build", "index.html")); + }); + app.get("*", function (req, res) { res.sendFile(path.join(__dirname, "client/build", "index.html")); }); diff --git a/server/_test/test.js b/server/_test/test.js new file mode 100644 index 000000000..fd6c2f10b --- /dev/null +++ b/server/_test/test.js @@ -0,0 +1,74 @@ +const path = require("path"); +const admin = require("../firebase/firebase-handler").admin; + +require("dotenv").config({ + path: path.resolve( + process.cwd(), + `.env.${process.env.NODE_ENV || "development"}` + ), +}); + +exports.testResponse = async (req, res) => { + console.log("Test"); + + const uniqueTokens = [ + "f7B-k-ceDNCEAIFYCfhF3M:APA91bEn-xOmUahCBMJBBDqXpVOZJnnb_qhWlo8eOPrIkvFeSc2nqaKd4D8zs3qqZ_VNgS_OhifsetJXcwtczO8N4k3xfDzCyI3i6j6YTUNK56QC-WNmVOLR2C_g-owy7hSvhGhWilZ3", + "eNdzsUqRBBZCM8LQKvqk6e:APA91bFgL0VQLf_TooYmHKQ7_b4H--ZmUYCdgiZpT7dxHSyEkpcCHUz33K7sKqgifUk8rMAEhSsHWa0TJgLbOJxWD6lJaGEpXn8G3PbunkJsJCNCA3CprMONylBr9d6hnQ5wnjUX2Gt6", + ]; + + var message = { + notification: { + title: "Test Notification", + body: "Test Body", + //click_action: "TEST CLICK ACTION", + }, + data: { + jobid: "1234", + title: "Test Notification", + body: "Test Body", + }, + tokens: uniqueTokens, + // android: { + // notification: { + // body: "This is an FCM notification specifically for android.", + // title: "FCM Notification for Android", + // image: "/logo192.png", + // badge: "/logo192.png", + // }, + // }, + webpush: { + headers: { + // Urgency: "high", + }, + notification: { + body: "This is a message from FCM to web", + requireInteraction: "true", + actions: [{ action: "the action - matched in sw", title: "Read" }], + + // renotify: true, + //tag: "1234", image: "/logo192.png", + badge: "/logo240.png", + //badge: "/badge-icon.png", + }, + }, + }; + + // Send a message to the device corresponding to the provided + // registration token. + admin + .messaging() + .sendMulticast(message) + .then((response) => { + // Response is a message ID string. + console.log( + "[TEST] Successfully sent FCM Broadcast.:", + response + //JSON.stringify(response) + ); + }) + .catch((error) => { + console.log("Error sending message:", error); + }); + + res.status(200).send("OK"); +}; diff --git a/server/accounting/accounting-constants.js b/server/accounting/accounting-constants.js new file mode 100644 index 000000000..39c2bb862 --- /dev/null +++ b/server/accounting/accounting-constants.js @@ -0,0 +1 @@ +exports.DineroQbFormat = "0.00"; diff --git a/server/accounting/iif/iif-receivables.js b/server/accounting/iif/iif-receivables.js new file mode 100644 index 000000000..b1c0ef8cf --- /dev/null +++ b/server/accounting/iif/iif-receivables.js @@ -0,0 +1,167 @@ +const GraphQLClient = require("graphql-request").GraphQLClient; +const DineroQbFormat = require("../accounting-constants").DineroQbFormat; +const path = require("path"); +require("dotenv").config({ + path: path.resolve( + process.cwd(), + `.env.${process.env.NODE_ENV || "development"}` + ), +}); +const queries = require("../../graphql-client/queries"); +const Dinero = require("dinero.js"); + +exports.default = async (req, res) => { + const BearerToken = req.headers.authorization; + const { jobId } = req.body; + + const client = new GraphQLClient(process.env.GRAPHQL_ENDPOINT, { + headers: { + Authorization: BearerToken, + }, + }); + + try { + const result = await client + .setHeaders({ Authorization: BearerToken }) + .request(queries.QUERY_JOBS_FOR_RECEIVABLES_EXPORT, { id: jobId }); + + const { jobs_by_pk } = result; + const { bodyshop } = jobs_by_pk; + //Build the IIF file. + const response = []; + response.push(TRNS_HEADER); + response.push( + generateInvoiceHeader(jobs_by_pk, bodyshop.md_responsibility_centers.ar) + ); + + //Allocations + const invoice_allocation = jobs_by_pk.invoice_allocation; + Object.keys(invoice_allocation.partsAllocations).forEach( + (partsAllocationKey) => { + if ( + !!!invoice_allocation.partsAllocations[partsAllocationKey].allocations + ) + return; + + invoice_allocation.partsAllocations[ + partsAllocationKey + ].allocations.forEach((alloc) => { + response.push( + generateInvoiceLine( + jobs_by_pk, + alloc, + bodyshop.md_responsibility_centers + ) + ); + }); + } + ); + Object.keys(invoice_allocation.labMatAllocations).forEach( + (AllocationKey) => { + if (!!!invoice_allocation.labMatAllocations[AllocationKey].allocations) + return; + + invoice_allocation.labMatAllocations[AllocationKey].allocations.forEach( + (alloc) => { + response.push( + generateInvoiceLine( + jobs_by_pk, + alloc, + bodyshop.md_responsibility_centers + ) + ); + } + ); + } + ); + //End Allocations + + //Taxes + const taxMapping = bodyshop.md_responsibility_centers.taxes; + const { federal_tax, state_tax, local_tax } = JSON.parse( + jobs_by_pk.job_totals + ).totals; + const federal_tax_dinero = Dinero(federal_tax); + const state_tax_dinero = Dinero(state_tax); + const local_tax_dinero = Dinero(local_tax); + + if (federal_tax_dinero.getAmount() > 0) { + response.push( + generateTaxLine(jobs_by_pk, federal_tax_dinero, "federal", taxMapping) + ); + } + if (state_tax_dinero.getAmount() > 0) { + response.push( + generateTaxLine(jobs_by_pk, state_tax_dinero, "state", taxMapping) + ); + } + if (local_tax_dinero.getAmount() > 0) { + response.push( + generateTaxLine(jobs_by_pk, local_tax_dinero, "local", taxMapping) + ); + } + //End Taxes + + response.push(END_TRNS); + + //Prep the response and send it. + res.setHeader("Content-type", "application/octet-stream"); + res.setHeader("Content-disposition", "attachment; filename=file.txt"); + res.setHeader("filename", `${jobs_by_pk.ro_number}-RECEIVABLES.iif`); + res.send(response.join("\n")); + } catch (error) { + console.log("error", error); + res.status(400).send(JSON.stringify(error)); + } +}; + +const TRNS_HEADER = `!TRNS TRNSID TRNSTYPE DATE ACCNT NAME CLASS AMOUNT DOCNUM MEMO CLEAR TOPRINT NAMEISTAXABLE ADDR1 ADDR2 ADDR3 ADDR4 DUEDATE TERMS OTHER1 PONUM +!SPL SPLID TRNSTYPE DATE ACCNT NAME CLASS AMOUNT DOCNUM MEMO CLEAR QNTY PRICE INVITEM PAYMETH TAXABLE VALADJ SERVICEDATE OTHER2 EXTRA +!ENDTRNS`; + +const generateInvoiceHeader = (job, arMapping) => + `TRNS INVOICE ${generateJobInvoiceDate(job)} ${arMapping.name} GUO DA Acct.# ${ + job.ownerid + }:${job.ro_number} 0100 ${job.clm_total} ${job.ro_number} N N Y GUO DA Acct.# ${ + job.ownr_id + }:${job.ro_number} ${job.ownr_addr1} ${job.ownr_city} ${job.ownr_st} ${ + job.ownr_zip + } `; + +const generateInvoiceLine = (job, allocation, responsibilityCenters) => { + const { amount, center } = allocation; + const DineroAmount = Dinero(amount); + const account = responsibilityCenters.profits.find( + (i) => i.name.toLowerCase() === center.toLowerCase() + ); + + if (!!!account) { + throw new Error( + `A matching account does not exist for the allocation. Center: ${center}` + ); + } + + return `SPL INVOICE ${generateJobInvoiceDate(job)} ${ + account.accountname + } 0100 ${DineroAmount.multiply(-1).toFormat(DineroQbFormat)} ${job.ro_number} ${ + account.accountdesc + } N ${DineroAmount.toFormat(DineroQbFormat)} ${account.accountitem} Y N `; +}; + +const generateTaxLine = (job, amount, type, taxMapping) => { + return `SPL INVOICE ${generateJobInvoiceDate(job)} ${ + taxMapping[type].accountname + } ${taxMapping[type].accountdesc} 0100 ${amount + .multiply(-1) + .toFormat(DineroQbFormat)} ${job.ro_number} N ${taxMapping[type].rate.toFixed( + 2 + )}% ${taxMapping[type].accountitem} N N AUTOSTAX `; +}; + +const END_TRNS = `ENDTRNS`; + +const generateJobInvoiceDate = (job) => { + return `${new Date(job.date_invoiced).getMonth() + 1}/${new Date( + job.date_invoiced + ).getDate()}/${new Date(job.date_invoiced).getFullYear()}`; +}; diff --git a/server/accounting/iif/iif.js b/server/accounting/iif/iif.js new file mode 100644 index 000000000..52214e4d2 --- /dev/null +++ b/server/accounting/iif/iif.js @@ -0,0 +1 @@ +exports.receivables = require("./iif-receivables").default \ No newline at end of file diff --git a/server/accounting/qbxml/qbxml-payables.js b/server/accounting/qbxml/qbxml-payables.js new file mode 100644 index 000000000..edcf34180 --- /dev/null +++ b/server/accounting/qbxml/qbxml-payables.js @@ -0,0 +1,111 @@ +const GraphQLClient = require("graphql-request").GraphQLClient; +const path = require("path"); +const DineroQbFormat = require("../accounting-constants").DineroQbFormat; +const queries = require("../../graphql-client/queries"); +const Dinero = require("dinero.js"); +var builder = require("xmlbuilder"); +const QbXmlUtils = require("./qbxml-utils"); +require("dotenv").config({ + path: path.resolve( + process.cwd(), + `.env.${process.env.NODE_ENV || "development"}` + ), +}); + +exports.default = async (req, res) => { + const BearerToken = req.headers.authorization; + const { invoices: invoicesToQuery } = req.body; + + const client = new GraphQLClient(process.env.GRAPHQL_ENDPOINT, { + headers: { + Authorization: BearerToken, + }, + }); + + try { + const result = await client + .setHeaders({ Authorization: BearerToken }) + .request(queries.QUERY_INVOICES_FOR_PAYABLES_EXPORT, { + invoices: invoicesToQuery, + }); + const { invoices } = result; + + const QbXmlToExecute = []; + invoices.map((i) => { + QbXmlToExecute.push({ + id: i.id, + okStatusCodes: ["0"], + qbxml: generateBill(i), + }); + }); + + //For each invoice. + + res.status(200).json(QbXmlToExecute); + } catch (error) { + console.log("error", error); + res.status(400).send(JSON.stringify(error)); + } +}; + +const generateBill = (invoice) => { + const billQbxmlObj = { + QBXML: { + QBXMLMsgsRq: { + "@onError": "continueOnError", + [`${invoice.is_credit_memo ? "VendorCreditAddRq" : "BillAddRq"}`]: { + [`${invoice.is_credit_memo ? "VendorCreditAdd" : "BillAdd"}`]: { + VendorRef: { + FullName: invoice.vendor.name, + }, + TxnDate: invoice.date, + DueDate: invoice.due_date, + RefNumber: invoice.invoice_number, + Memo: `RO ${invoice.job.ro_number || ""} OWNER ${ + invoice.job.ownr_fn || "" + } ${invoice.job.ownr_ln || ""} ${invoice.job.ownr_co_nm || ""}`, + ExpenseLineAdd: invoice.invoicelines.map((il) => + generateBillLine( + il, + invoice.job.bodyshop.md_responsibility_centers + ) + ), + }, + }, + }, + }, + }; + + var billQbxml_partial = builder + .create(billQbxmlObj, { + version: "1.30", + encoding: "UTF-8", + headless: true, + }) + .end({ pretty: true }); + + const billQbxml_Full = QbXmlUtils.addQbxmlHeader(billQbxml_partial); + console.log("generateBill -> billQbxml_Full", billQbxml_Full); + + return billQbxml_Full; +}; + +const generateBillLine = (invoiceLine, responsibilityCenters) => { + return { + AccountRef: { + FullName: responsibilityCenters.costs.find( + (c) => c.name === invoiceLine.cost_center + ).accountname, + }, + Amount: Dinero({ + amount: Math.round(invoiceLine.actual_cost * 100), + }).toFormat(DineroQbFormat), + }; +}; + +// [ +// { +// AccountRef: { FullName: "BODY SHOP COST:SUBLET" }, +// Amount: invoice.amount, +// }, +// ], diff --git a/server/accounting/qbxml/qbxml-payments.js b/server/accounting/qbxml/qbxml-payments.js new file mode 100644 index 000000000..857348463 --- /dev/null +++ b/server/accounting/qbxml/qbxml-payments.js @@ -0,0 +1,106 @@ +const GraphQLClient = require("graphql-request").GraphQLClient; +const path = require("path"); +const DineroQbFormat = require("../accounting-constants").DineroQbFormat; +const queries = require("../../graphql-client/queries"); +const Dinero = require("dinero.js"); +var builder = require("xmlbuilder"); +const moment = require("moment"); +const QbXmlUtils = require("./qbxml-utils"); +require("dotenv").config({ + path: path.resolve( + process.cwd(), + `.env.${process.env.NODE_ENV || "development"}` + ), +}); + +const { generateJobTier, generateOwnerTier, generateSourceTier } = QbXmlUtils; + +exports.default = async (req, res) => { + const BearerToken = req.headers.authorization; + const { payments: paymentsToQuery } = req.body; + + const client = new GraphQLClient(process.env.GRAPHQL_ENDPOINT, { + headers: { + Authorization: BearerToken, + }, + }); + + try { + const result = await client + .setHeaders({ Authorization: BearerToken }) + .request(queries.QUERY_PAYMENTS_FOR_EXPORT, { + payments: paymentsToQuery, + }); + const { payments } = result; + + const QbXmlToExecute = []; + payments.map((i) => { + QbXmlToExecute.push({ + id: i.id, + okStatusCodes: ["0"], + qbxml: generatePayment(i), + }); + }); + + res.status(200).json(QbXmlToExecute); + } catch (error) { + console.log("error", error); + res.status(400).send(JSON.stringify(error)); + } +}; + +const generatePayment = (payment) => { + console.log("generatePayment -> payment", payment); + const paymentQbxmlObj = { + QBXML: { + QBXMLMsgsRq: { + "@onError": "continueOnError", + ReceivePaymentAddRq: { + ReceivePaymentAdd: { + CustomerRef: { + FullName: + payment.job.bodyshop.accountingconfig.tiers === 3 + ? `${generateSourceTier(payment.job)}:${generateOwnerTier( + payment.job + )}:${generateJobTier(payment.job)}` + : `${generateOwnerTier(payment.job)}:${generateJobTier( + payment.job + )}`, + }, + ARAccountRef: { + FullName: + payment.job.bodyshop.md_responsibility_centers.ar.accountname, + }, + TxnDate: moment(payment.created_at).format("YYYY-MM-DD"), //Trim String + RefNumber: payment.stripeid || payment.transactionid, + TotalAmount: Dinero({ + amount: Math.round(payment.amount * 100), + }).toFormat(DineroQbFormat), + Memo: `RO ${payment.job.ro_number || ""} OWNER ${ + payment.job.ownr_fn || "" + } ${payment.job.ownr_ln || ""} ${payment.job.ownr_co_nm || ""} ${ + payment.stripeid + }`, + IsAutoApply: true, + // AppliedToTxnAdd:{ + // T + // } + }, + }, + }, + }, + }; + + var paymentQbxmlPartial = builder + .create(paymentQbxmlObj, { + version: "1.30", + encoding: "UTF-8", + headless: true, + }) + .end({ pretty: true }); + + const paymentQbxmlFull = QbXmlUtils.addQbxmlHeader(paymentQbxmlPartial); + console.log("generateBill -> paymentQbxmlFull", paymentQbxmlFull); + + return paymentQbxmlFull; +}; diff --git a/server/accounting/qbxml/qbxml-receivables.js b/server/accounting/qbxml/qbxml-receivables.js new file mode 100644 index 000000000..b5e5efbcf --- /dev/null +++ b/server/accounting/qbxml/qbxml-receivables.js @@ -0,0 +1,318 @@ +const GraphQLClient = require("graphql-request").GraphQLClient; +const path = require("path"); +const DineroQbFormat = require("../accounting-constants").DineroQbFormat; +const queries = require("../../graphql-client/queries"); +const Dinero = require("dinero.js"); +var builder = require("xmlbuilder"); +const QbXmlUtils = require("./qbxml-utils"); +require("dotenv").config({ + path: path.resolve( + process.cwd(), + `.env.${process.env.NODE_ENV || "development"}` + ), +}); + +const { generateJobTier, generateOwnerTier, generateSourceTier } = QbXmlUtils; + +exports.default = async (req, res) => { + const BearerToken = req.headers.authorization; + const { jobIds } = req.body; + + const client = new GraphQLClient(process.env.GRAPHQL_ENDPOINT, { + headers: { + Authorization: BearerToken, + }, + }); + + try { + const result = await client + .setHeaders({ Authorization: BearerToken }) + .request(queries.QUERY_JOBS_FOR_RECEIVABLES_EXPORT, { ids: jobIds }); + console.log("result", result); + const { jobs } = result; + const { bodyshops } = result; + const QbXmlToExecute = []; + + const bodyshop = bodyshops[0]; + + jobs.map((jobs_by_pk) => { + //Is this a two tier, or 3 tier setup? + const isThreeTier = bodyshop.accountingconfig.tiers === 3; + const twoTierPref = bodyshop.accountingconfig.twotierpref; + + if (isThreeTier) { + QbXmlToExecute.push({ + id: jobs_by_pk.id, + okStatusCodes: ["0", "3100"], + qbxml: generateSourceCustomerQbxml(jobs_by_pk, bodyshop), // Create the source customer. + }); + } + + QbXmlToExecute.push({ + id: jobs_by_pk.id, + okStatusCodes: ["0", "3100"], + qbxml: generateJobQbxml( + jobs_by_pk, + bodyshop, + isThreeTier, + 2, + twoTierPref + ), + }); + + QbXmlToExecute.push({ + id: jobs_by_pk.id, + okStatusCodes: ["0", "3100"], + qbxml: generateJobQbxml( + jobs_by_pk, + bodyshop, + isThreeTier, + 3, + twoTierPref + ), + }); + //Generate the actual invoice. + QbXmlToExecute.push({ + id: jobs_by_pk.id, + okStatusCodes: ["0"], + qbxml: generateInvoiceQbxml(jobs_by_pk, bodyshop), + }); + }); + + res.status(200).json(QbXmlToExecute); + } catch (error) { + console.log("error", error); + res.status(400).send(JSON.stringify(error)); + } +}; + +const generateSourceCustomerQbxml = (jobs_by_pk, bodyshop) => { + const customerQbxmlObj = { + QBXML: { + QBXMLMsgsRq: { + "@onError": "continueOnError", + CustomerAddRq: { + CustomerAdd: { + Name: jobs_by_pk.ins_co_nm, + BillAddress: { + Addr1: jobs_by_pk.ownr_addr1, + Addr2: jobs_by_pk.ownr_addr2, + City: jobs_by_pk.ownr_city, + State: jobs_by_pk.ownr_st, + PostalCode: jobs_by_pk.ownrzip, + }, + }, + }, + }, + }, + }; + + var customerQbxml_partial = builder + .create(customerQbxmlObj, { + version: "1.30", + encoding: "UTF-8", + headless: true, + }) + .end({ pretty: true }); + + const customerQbxml_Full = QbXmlUtils.addQbxmlHeader(customerQbxml_partial); + + return customerQbxml_Full; +}; + +const generateJobQbxml = ( + jobs_by_pk, + bodyshop, + isThreeTier, + tierLevel, + twoTierPref +) => { + let Name; + let ParentRefName; + + if (tierLevel === 2) { + Name = generateOwnerTier(jobs_by_pk); + ParentRefName = isThreeTier ? generateSourceTier(jobs_by_pk) : null; + } else if (tierLevel === 3) { + Name = generateJobTier(jobs_by_pk); + ParentRefName = isThreeTier + ? `${jobs_by_pk.ins_co_nm}:${generateOwnerTier(jobs_by_pk)}` + : generateOwnerTier(jobs_by_pk); + } + + const jobQbxmlObj = { + QBXML: { + QBXMLMsgsRq: { + "@onError": "continueOnError", + CustomerAddRq: { + CustomerAdd: { + Name: Name, + ParentRef: ParentRefName + ? { + FullName: ParentRefName, + } + : null, + }, + }, + }, + }, + }; + + var jobQbxml_partial = builder + .create(jobQbxmlObj, { + version: "1.30", + encoding: "UTF-8", + headless: true, + }) + .end({ pretty: true }); + + const jobQbxml_Full = QbXmlUtils.addQbxmlHeader(jobQbxml_partial); + console.log("jobQbxml_Full", jobQbxml_Full); + return jobQbxml_Full; +}; + +const generateInvoiceQbxml = (jobs_by_pk, bodyshop) => { + //Build the Invoice XML file. + const InvoiceLineAdd = []; + const invoice_allocation = jobs_by_pk.invoice_allocation; + Object.keys(invoice_allocation.partsAllocations).forEach( + (partsAllocationKey) => { + if ( + !!!invoice_allocation.partsAllocations[partsAllocationKey].allocations + ) + return; + invoice_allocation.partsAllocations[ + partsAllocationKey + ].allocations.forEach((alloc) => { + InvoiceLineAdd.push( + generateInvoiceLine( + jobs_by_pk, + alloc, + bodyshop.md_responsibility_centers + ) + ); + }); + } + ); + Object.keys(invoice_allocation.labMatAllocations).forEach((AllocationKey) => { + if (!!!invoice_allocation.labMatAllocations[AllocationKey].allocations) + return; + invoice_allocation.labMatAllocations[AllocationKey].allocations.forEach( + (alloc) => { + InvoiceLineAdd.push( + generateInvoiceLine( + jobs_by_pk, + alloc, + bodyshop.md_responsibility_centers + ) + ); + } + ); + }); + + //Add tax lines + const job_totals = JSON.parse(jobs_by_pk.job_totals); + + const federal_tax = Dinero(job_totals.totals.federal_tax); + const state_tax = Dinero(job_totals.totals.state_tax); + const local_tax = Dinero(job_totals.totals.local_tax); + + if (federal_tax.getAmount() > 0) { + InvoiceLineAdd.push({ + ItemRef: { + FullName: bodyshop.md_responsibility_centers.taxes.federal.accountitem, + }, + Desc: bodyshop.md_responsibility_centers.taxes.federal.accountdesc, + Amount: federal_tax.toFormat(DineroQbFormat), + }); + } + + if (state_tax.getAmount() > 0) { + InvoiceLineAdd.push({ + ItemRef: { + FullName: bodyshop.md_responsibility_centers.taxes.state.accountitem, + }, + Desc: bodyshop.md_responsibility_centers.taxes.state.accountdesc, + Amount: state_tax.toFormat(DineroQbFormat), + }); + } + + if (local_tax.getAmount() > 0) { + InvoiceLineAdd.push({ + ItemRef: { + FullName: bodyshop.md_responsibility_centers.taxes.local.accountitem, + }, + Desc: bodyshop.md_responsibility_centers.taxes.local.accountdesc, + Amount: local_tax.toFormat(DineroQbFormat), + }); + } + + const invoiceQbxmlObj = { + QBXML: { + QBXMLMsgsRq: { + "@onError": "stopOnError", + InvoiceAddRq: { + InvoiceAdd: { + CustomerRef: { + FullName: + bodyshop.accountingconfig.tiers === 3 + ? `${generateSourceTier(jobs_by_pk)}:${generateOwnerTier( + jobs_by_pk + )}:${generateJobTier(jobs_by_pk)}` + : `${generateOwnerTier(jobs_by_pk)}:${generateJobTier( + jobs_by_pk + )}`, + }, + TxnDate: new Date(), + RefNumber: jobs_by_pk.ro_number, + BillAddress: { + Addr1: jobs_by_pk.ownr_addr1, + Addr2: jobs_by_pk.ownr_addr2, + City: jobs_by_pk.ownr_city, + State: jobs_by_pk.ownr_st, + PostalCode: jobs_by_pk.ownrzip, + }, + PONumber: jobs_by_pk.clm_no, + InvoiceLineAdd: InvoiceLineAdd, + }, + }, + }, + }, + }; + var invoiceQbxml_partial = builder + .create(invoiceQbxmlObj, { + version: "1.30", + encoding: "UTF-8", + headless: true, + }) + .end({ pretty: true }); + + const invoiceQbxml_Full = QbXmlUtils.addQbxmlHeader(invoiceQbxml_partial); + + return invoiceQbxml_Full; +}; + +const generateInvoiceLine = (job, allocation, responsibilityCenters) => { + const { amount, center } = allocation; + const DineroAmount = Dinero(amount); + const account = responsibilityCenters.profits.find( + (i) => i.name.toLowerCase() === center.toLowerCase() + ); + + if (!!!account) { + throw new Error( + `A matching account does not exist for the allocation. Center: ${center}` + ); + } + + return { + ItemRef: { FullName: account.accountitem }, + Desc: account.accountdesc, + Quantity: 1, + //Rate: 100, + Amount: DineroAmount.toFormat(DineroQbFormat), + SalesTaxCodeRef: { + FullName: "E", + }, + }; +}; diff --git a/server/accounting/qbxml/qbxml-utils.js b/server/accounting/qbxml/qbxml-utils.js new file mode 100644 index 000000000..7b8020bbb --- /dev/null +++ b/server/accounting/qbxml/qbxml-utils.js @@ -0,0 +1,24 @@ +exports.addQbxmlHeader = addQbxmlHeader = (xml) => { + return ` + + ${xml} + `; +}; + +exports.generateSourceTier = (jobs_by_pk) => { + return jobs_by_pk.ins_co_nm; +}; + +exports.generateJobTier = (jobs_by_pk) => { + return jobs_by_pk.ro_number; +}; + +exports.generateOwnerTier = (jobs_by_pk) => { + return jobs_by_pk.ownr_co_nm + ? `${jobs_by_pk.ownr_co_nm} - ${jobs_by_pk.ownr_ln || ""} ${ + jobs_by_pk.ownr_fn || "" + } #${jobs_by_pk.owner.accountingid || ""}` + : `${jobs_by_pk.ownr_ln || ""} ${jobs_by_pk.ownr_fn || ""} #${ + jobs_by_pk.owner.accountingid || "" + }`; +}; diff --git a/server/accounting/qbxml/qbxml.js b/server/accounting/qbxml/qbxml.js new file mode 100644 index 000000000..1626ffed7 --- /dev/null +++ b/server/accounting/qbxml/qbxml.js @@ -0,0 +1,3 @@ +exports.receivables = require("./qbxml-receivables").default; +exports.payables = require("./qbxml-payables").default; +exports.payments = require("./qbxml-payments").default; diff --git a/server/accounting/qbxml/qbxmlObject.json b/server/accounting/qbxml/qbxmlObject.json new file mode 100644 index 000000000..85d61be8c --- /dev/null +++ b/server/accounting/qbxml/qbxmlObject.json @@ -0,0 +1,5 @@ +{ + "id": "12345", + "okStatusCodes": ["0", "31400"], + "qbxml": "the qbxml string" +} diff --git a/server/firebase/firebase-handler.js b/server/firebase/firebase-handler.js new file mode 100644 index 000000000..291b81d46 --- /dev/null +++ b/server/firebase/firebase-handler.js @@ -0,0 +1,41 @@ +var admin = require("firebase-admin"); +const path = require("path"); +require("dotenv").config({ path: path.resolve(process.cwd(), `.env.${process.env.NODE_ENV || 'development'}`) }); + +var serviceAccount = require(process.env.FIREBASE_ADMINSDK_JSON); + +admin.initializeApp({ + credential: admin.credential.cert(serviceAccount), + databaseURL: process.env.FIREBASE_DATABASE_URL, +}); + +exports.admin = admin; + +exports.sendNotification = (req, res) => { + console.log("Firebase Send."); + + var registrationToken = + "fqIWg8ENDFyrRrMWJ1sItR:APA91bHirdZ05Zo66flMlvala97SMXoiQGwP4oCvMwd-vVrSauD_WoNim3kXHGqyP-bzENjkXwA5icyUAReFbeHn6dIaPcbpcsXuY73-eJAXvZiu1gIsrd1BOsnj3dEMT7Q4F6mTPth1"; + var message = { + notification: { title: "The Title", body: "The Body" }, + data: { + jobid: "1234", + }, + token: registrationToken, + }; + + // Send a message to the device corresponding to the provided + // registration token. + admin + .messaging() + .send(message) + .then((response) => { + // Response is a message ID string. + console.log("Successfully sent message:", response); + }) + .catch((error) => { + console.log("Error sending message:", error); + }); + + res.sendStatus(200); +}; diff --git a/server/firebase/imex-dev-firebase-adminsdk.json b/server/firebase/imex-dev-firebase-adminsdk.json new file mode 100644 index 000000000..31fde1800 --- /dev/null +++ b/server/firebase/imex-dev-firebase-adminsdk.json @@ -0,0 +1,12 @@ +{ + "type": "service_account", + "project_id": "imex-dev", + "private_key_id": "4cd5bdb92b883cba1309ee8a7dda4b9925e8f264", + "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDIWWXzD7vPBc1l\nBlbIQRpu8XnQ5CL4kgv2ZsoJ4tQ8cOYRez/puvwI0lZbMIr4KhVEeoe3am0gOXMY\niYmu3MLm7SZEZW/V7aawx462WprlAP9KcwSlVcNC+lSWLrPVvnuRXGi5SWdDBW60\ne2WRqbZKWkMATQkzLZzOLb8wt9VDU5TcY5t4NB7vrTJZLApxZAhX9jyaqR0WjgdS\nsoGNWwfo+wZqgaLHkdf68ELQ+8bJepbj8sExnJmwwiTvXlsYNSs1lTP1Dis56nKe\nRkSlbevyGgO9PGpWH1WIzZP5/vHANWShdXsvuacZ3TCnhNf+ST78A7mTWw8DMSvI\novtfzHrVAgMBAAECggEARdwGVI6z6igXypY/RGyPDwhcdZ5XI12pli2ZXYEeiETF\ntGrJinKM13agbgOrMYVbDRm8oRQXIRlnLLMoszR/MY6XvVmxeWL4sMOk26kUQa3r\nVsZsZEpXX89yFzwJsQpOhA045wLVYuVOCNjOPdBzo9F9c2lpP9MzziDdfdtcHbE1\nR1o3wdwl3RiRS6wEeOsKTCBI3e9eytSh48wBFbYtFjOO07u4Err7iMfdd7WcaOpC\nCUAbnphq3IEKksSWzA/h/UZYCQFX4SJILwY2A5l8wji31ojoMZn+UTWHZeuhA5zW\nzy1rof1o5NHDoQGmGGBLEWs461ylifq8ZFc/u3kNsQKBgQDn5hDMLJ9dUs5e+Z+6\nxP5gvq4/Bwi6AVX76DdWSaCW+jDV03OC8voH0UzbJKZ81/mMDhFL10KRbbG8tBoU\ncpOMpSrsDqIu9C6iniKK5nggzVaqpWduqiHT59duHh4ohcgmhoRAaeCy5Q1u2aOs\nuhUpsX1CPma73Wuw9otPV8n//wKBgQDdK+wGgBl8otkEtNoOGxVdIjyY/3tSKjJN\nA1oW21Q+KKHk3nQ0MQv69XxwmFuyAkco0aT/9w1YjSLhFiDnPTGdsyOlPyzWjzKt\ny7rQQ99W9E6MxHoT4tA0S6UUY55jsnPB+ytckPW8CMc89MKp1Qw1Wx/HsTNoRLtq\nbjb+USGFKwKBgEUc4Cy5r9VUdIUByIUVaOrUaYIHSqaE92dYUgW5c88LSbqwhmCk\nobfqvQki5yuWAp2nI6iCwygslSg0VQF7FFZ6c0xfIB72T1/P2WOkRHEiQY4iNa1Z\nrzNEiYQcHcjd9kTlGk1IQNuQQGylGI7F9sCyUS6JAn1DBHF9SQ+gjmdpAoGAQVsH\nRex4m5Hrmy5t+RkbuQey7GsiX+dEMem5p2Nsg2myXVU29W1A4wnDmeoLvpBZwsAg\nh9rTQMWD9wt48Zvtm3IiKGSAtW5fRWgcbgqAZsuOop40jMfLSojH4TyGw2MqPbog\n2Bul4cieR270Twc7slCZFYNRc5BL6WlkKsaCpz0CgYBlHGMoqaplAWVYJp+O7bbD\nsW8C8+FlFYoT26q8/TCj7dKxKSARsV9vg3eDBz0qCTMIqZGpMHWzF0Fkpr9ZqYdZ\nEvYdmrI+oSi657IQqan0vZwn7QBooE/opBwElHXjhCeAVLmDseLG3sK8OqcbW3aG\n1K7HV6sirgihrTS8iOqs4Q==\n-----END PRIVATE KEY-----\n", + "client_email": "firebase-adminsdk-f2zkh@imex-dev.iam.gserviceaccount.com", + "client_id": "105392652141030688709", + "auth_uri": "https://accounts.google.com/o/oauth2/auth", + "token_uri": "https://oauth2.googleapis.com/token", + "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", + "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-f2zkh%40imex-dev.iam.gserviceaccount.com" +} diff --git a/server/firebase/imex-prod-firebase-adminsdk.json b/server/firebase/imex-prod-firebase-adminsdk.json new file mode 100644 index 000000000..90d3362e8 --- /dev/null +++ b/server/firebase/imex-prod-firebase-adminsdk.json @@ -0,0 +1,12 @@ +{ + "type": "service_account", + "project_id": "imex-prod", + "private_key_id": "5eacc85af252be59a0dcf08009b3219eaabced2e", + "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDLYLP7i2CDFPQw\n1yz6RM1DV3KEEDF9PmbPDcun4P66n5fK2w4fool81MsfAR2no5j38FNM7cDYpo2S\n9e48T3lFxybBHm8PP1DMfMeTys7FGdW/Q0/pdYQRZbPhqSqwJZuj05lkObI4l6V3\nIDIP5wtiOwYSQAp6Vga8atD/sAq+DsOqTbZ5CniBwIlvCVhwcjhf/dry+Tm0ZH6P\nu4bQGD3GL3PQ6cd00oDKE+Gv2emDrgvjmB03RTQDFoBI+bxsMDYhoN7mYS2PfUQD\ndsH+RXqu8dWzPJhacosp3DMfgvgPIdxCR8/h4LT/v20hYNdhGTwZAZUHbEUCEkgf\nOZ0Xa7IVAgMBAAECggEAIR75kMCtEgvqjL2uPH/R8eKe6rT8akosUhIMFaYFtfzh\nqo6sKSi+PU8mWUFERBXXhqFj34ZkvqO5MLLOfpHuzRdWz2KWcaQ9E2BK3F3N+Llx\nXvmmXP3faTnn5ps3MYKeazq9o13mEWNY9iKPJJna979nCLfXPP8fj7XRnaJczYCt\njh+LuzFxtsP9qFXFhTu+0Ji7g7FttQSq/p4JR5Ybhp4t5m8P6GPg+NzC3qZ4b/96\nP0XQNnKHq2bRE4PKP7n8pomNenIDi4/QPmARlxzpAOvTNHwXqgWGf7HG5Sv0bl1F\nNLnHcS6g2aMXq9ZPaaG+4auFNrQ6mQzsf+nVxvYU7QKBgQDz/Vdvs5eTMyu2Cwf2\noSzxh6YYKwgKMUl2jZqEZb1I5/2fB02/mnlAU01WQfcHewlA4J4uJnMvVo3G6guO\nxBfUDnb4TylbxMVyYesJfprOdRyfeOYBuxbjfqpee2aJKtWANxrDe9MZW1p8Ztcy\nTWZIVgmrGvNiT+Z6xKCrv8apSwKBgQDVY5ZQG6ZAYDfMf7j/G67QG31kUJ1GGJNq\nXfg8cjB5nJnF5tM2tdLNje2fthlmhRV44+/xsqiRbI1p8i6iPS9gW/rEsujoFbaB\nGzfRwFgijTxGjgR1Irk1/rTZxnZXYMqhgap9a6Pgw0PttUkFbduSXpQQV/EYTCWs\nL3yrw7pWHwKBgQC3z+t4VqdhmRJcMhFMx34RdC04VerXquv6aZG4HuGsNEJI9Xqo\nV5rzUA6aZlXRh+qfutjQUd1DE4T6D0anxqlg84jDZvf0j9hkZMpqO7wqv+XRaoZ1\nVVpYBwwY5ASKX/+6eUkrbnTJzJ3tzJhg6BifdFoSUtp6/VDYupuE6JSk4wKBgAeX\nz5VyJmxMADBKqy6IsaO+FqwnIjGIVlaGmXqtJYRuShp8qC9eMO4XiskQFb9MJQN0\nOOmEzfK+xhlrALXNL45iN34gT6FShHf7m/Tev0QbenWYQBha7/Q35/+HzFY3n343\nuvVTizVIPXaL6NlEm3eN3f7m4jFXJFAIMIt8H3lJAoGAfveAtfrMMVru9jDZShmY\n+LaVvauSCdq0mtzB9gz/jFA0LC6LXnPjkk0Vul/fOpq1S9E/0PhKELxTgEeobP7a\n2gqa16r12nMkAUlfjlKwuwy1AxEyqpaCLI1raoOFCa9YbrChDtNJp5cLq2z6CZzU\nt19swf9G6W9RbKi8NUGeu1M=\n-----END PRIVATE KEY-----\n", + "client_email": "firebase-adminsdk-m6ypm@imex-prod.iam.gserviceaccount.com", + "client_id": "107364429775431537388", + "auth_uri": "https://accounts.google.com/o/oauth2/auth", + "token_uri": "https://oauth2.googleapis.com/token", + "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", + "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-m6ypm%40imex-prod.iam.gserviceaccount.com" +} diff --git a/server/graphql-client/graphql-client.js b/server/graphql-client/graphql-client.js index 2307187e7..ea8abebf3 100644 --- a/server/graphql-client/graphql-client.js +++ b/server/graphql-client/graphql-client.js @@ -1,9 +1,17 @@ const GraphQLClient = require("graphql-request").GraphQLClient; -require("dotenv").config(); +const path = require("path"); +require("dotenv").config({ + path: path.resolve( + process.cwd(), + `.env.${process.env.NODE_ENV || "development"}` + ), +}); -//TODO May need to use a different client that includes caching of resources. +//TODO May need to use a different client that includes caching of resources. exports.client = new GraphQLClient(process.env.GRAPHQL_ENDPOINT, { headers: { - "x-hasura-admin-secret": process.env.HASURA_ADMIN_SECRET - } + "x-hasura-admin-secret": process.env.HASURA_ADMIN_SECRET, + }, }); + +exports.unauthclient = new GraphQLClient(process.env.GRAPHQL_ENDPOINT); diff --git a/server/graphql-client/queries.js b/server/graphql-client/queries.js index 5392db6a3..caff3d08d 100644 --- a/server/graphql-client/queries.js +++ b/server/graphql-client/queries.js @@ -14,12 +14,20 @@ query FIND_BODYSHOP_BY_MESSAGING_SERVICE_SID( exports.INSERT_MESSAGE = ` mutation INSERT_MESSAGE($msg: [messages_insert_input!]!) { - insert_messages(objects: $msg) { - returning { - id + insert_messages(objects: $msg) { + returning { + conversation { + bodyshop { + associations(where: {active: {_eq: true}}) { + user { + fcmtokens + } + } + } } } } +} `; exports.UPDATE_MESSAGE_STATUS = ` @@ -31,3 +39,150 @@ mutation UPDATE_MESSAGE($msid: String!, $fields: messages_set_input!) { } } `; + +exports.QUERY_JOBS_FOR_RECEIVABLES_EXPORT = ` +query QUERY_JOBS_FOR_RECEIVABLES_EXPORT($ids: [uuid!]!) { + jobs(where: {id: {_in: $ids}}) { + id + job_totals + date_invoiced + ro_number + clm_total + clm_no + invoice_allocation + ownerid + ownr_ln + ownr_fn + ownr_addr1 + ownr_addr2 + ownr_zip + ownr_city + ownr_st + ins_co_nm + owner { + accountingid + } + } + bodyshops(where: {associations: {active: {_eq: true}}}) { + id + md_responsibility_centers + accountingconfig + } +} + `; + +exports.QUERY_INVOICES_FOR_PAYABLES_EXPORT = ` +query QUERY_INVOICES_FOR_PAYABLES_EXPORT($invoices: [uuid!]!) { + invoices(where: {id: {_in: $invoices}}) { + id + date + due_date + federal_tax_rate + invoice_number + is_credit_memo + job { + id + ro_number + clm_no + ownr_fn + ownr_ln + ownr_co_nm + bodyshop{ + md_responsibility_centers + } + } + invoicelines{ + id + cost_center + actual_cost + applicable_taxes + } + state_tax_rate + local_tax_rate + total + vendor{ + id + name + } + } +} + `; + +exports.QUERY_PAYMENTS_FOR_EXPORT = ` + query QUERY_PAYMENTS_FOR_EXPORT($payments: [uuid!]!) { + payments(where: {id: {_in: $payments}}) { + id + created_at + jobid + job { + id + ro_number + est_number + ins_co_nm + owner{ + accountingid + } + ownr_fn + ownr_ln + ownr_co_nm + bodyshop{ + accountingconfig + md_responsibility_centers + } + } + transactionid + memo + amount + stripeid + exportedat + stripeid + } + } + `; + +exports.QUERY_UPCOMING_APPOINTMENTS = ` +query QUERY_UPCOMING_APPOINTMENTS($now: timestamptz!, $jobId: uuid!) { + jobs_by_pk(id: $jobId) { + bodyshop { + ssbuckets + } + jobhrs: joblines_aggregate { + aggregate { + sum { + mod_lb_hrs + } + } + } + } + appointments(where: {_and: {canceled: {_eq: false}, start: {_gte: $now}}}) { + start + isintake + id + job { + joblines_aggregate { + aggregate { + sum { + mod_lb_hrs + } + } + } + } + } + productionview { + id + labhrs + larhrs + scheduled_completion + } +} `; + +exports.QUERY_EMPLOYEE_PIN = `query QUERY_EMPLOYEE_PIN($shopId: uuid!, $employeeId: String!) { + employees(where: {_and: {shopid: {_eq: $shopId}, employee_number: {_eq: $employeeId}}}) { + last_name + first_name + employee_number + id + cost_center + pin + } +}`; diff --git a/server/media/media.js b/server/media/media.js index 7fa9ae259..824a9d364 100644 --- a/server/media/media.js +++ b/server/media/media.js @@ -1,4 +1,10 @@ -require("dotenv").config(); +const path = require("path"); +require("dotenv").config({ + path: path.resolve( + process.cwd(), + `.env.${process.env.NODE_ENV || "development"}` + ), +}); var cloudinary = require("cloudinary").v2; cloudinary.config(process.env.CLOUDINARY_URL); diff --git a/server/render/renderHandlebars.js b/server/render/renderHandlebars.js index db1a381c5..6347ca915 100644 --- a/server/render/renderHandlebars.js +++ b/server/render/renderHandlebars.js @@ -1,6 +1,75 @@ -require("dotenv").config(); +const path = require("path"); +const moment = require("moment"); +require("dotenv").config({ + path: path.resolve( + process.cwd(), + `.env.${process.env.NODE_ENV || "development"}` + ), +}); +var _ = require("lodash"); const Handlebars = require("handlebars"); +//Usage: {{moment appointments_by_pk.start format="dddd, DD MMMM YYYY"}} + +Handlebars.registerHelper("moment", function (context, block) { + if (context && context.hash) { + block = _.cloneDeep(context); + context = undefined; + } + var date = moment(context); + + if (block.hash.timezone) { + date.tz(block.hash.timezone); + } + + var hasFormat = false; + + // Reset the language back to default before doing anything else + date.locale("en"); + + for (var i in block.hash) { + if (i === "format") { + hasFormat = true; + } else if (date[i]) { + date = date[i](block.hash[i]); + } else { + console.log('moment.js does not support "' + i + '"'); + } + } + + if (hasFormat) { + date = date.format(block.hash.format); + } + return date; +}); + +Handlebars.registerHelper("duration", function (context, block) { + if (context && context.hash) { + block = _.cloneDeep(context); + context = 0; + } + var duration = moment.duration(context); + var hasFormat = false; + + // Reset the language back to default before doing anything else + duration = duration.lang("en"); + + for (var i in block.hash) { + if (i === "format") { + hasFormat = true; + } else if (duration[i]) { + duration = duration[i](block.hash[i]); + } else { + console.log('moment.js duration does not support "' + i + '"'); + } + } + + if (hasFormat) { + duration = duration.format(block.hash.format); + } + return duration; +}); + exports.render = (req, res) => { //Perform request validation let view; diff --git a/server/scheduling/scheduling-job.js b/server/scheduling/scheduling-job.js new file mode 100644 index 000000000..9a43effce --- /dev/null +++ b/server/scheduling/scheduling-job.js @@ -0,0 +1,137 @@ +const GraphQLClient = require("graphql-request").GraphQLClient; +const path = require("path"); +const queries = require("../graphql-client/queries"); +const Dinero = require("dinero.js"); +const moment = require("moment"); + +require("dotenv").config({ + path: path.resolve( + process.cwd(), + `.env.${process.env.NODE_ENV || "development"}` + ), +}); + +exports.job = async (req, res) => { + try { + const BearerToken = req.headers.authorization; + const { jobId } = req.body; + + const client = new GraphQLClient(process.env.GRAPHQL_ENDPOINT, { + headers: { + Authorization: BearerToken, + }, + }); + + const result = await client + .setHeaders({ Authorization: BearerToken }) + .request(queries.QUERY_UPCOMING_APPOINTMENTS, { + now: new Date(), + jobId: jobId, + }); + + const { appointments, productionview } = result; + const { ssbuckets } = result.jobs_by_pk.bodyshop; + const jobHrs = result.jobs_by_pk.jobhrs.aggregate.sum.mod_lb_hrs; + + const JobBucket = ssbuckets.filter( + (bucket) => + bucket.gte <= jobHrs && (!!bucket.lt ? bucket.lt > jobHrs : true) + )[0]; + + const bucketMatrix = {}; + + //Get latest date + add 5 days to allow for back end adding.. + const totalMatrixDays = moment + .max([ + ...appointments.map((a) => moment(a.start)), + ...productionview + .map((p) => moment(p.scheduled_completion)) + .filter((p) => p.isValid()), + ]) + .add("5", "days") + .diff(moment(), "days"); + + //Initialize the bucket matrix + for (i = 0; i < totalMatrixDays; i++) { + const theDate = moment().add(i, "days").toISOString().substr(0, 10); + //Only need to create a matrix for jobs of the same bucket. + bucketMatrix[theDate] = { in: 0, out: 0 }; + + // ssbuckets.forEach((bucket) => { + // bucketMatrix[theDate] = { + // ...bucketMatrix[theDate], + // [bucket.id]: { in: 0, out: 0 }, + // }; + // }); + } + + //Populate the jobs scheduled to come in. + appointments.forEach((appointment) => { + const jobHrs = + appointment.job.joblines_aggregate.aggregate.sum.mod_lb_hrs; + //Is the job in the same bucket? + const appointmentBucket = ssbuckets.filter( + (bucket) => + bucket.gte <= jobHrs && (!!bucket.lt ? bucket.lt > jobHrs : true) + )[0]; + if (appointmentBucket.id === JobBucket.id) { + //Theyre the same classification. Add it to the matrix. + const appDate = moment(appointment.start).toISOString().substr(0, 10); + bucketMatrix[appDate] = { + ...bucketMatrix[appDate], + in: bucketMatrix[appDate].in + 1, + }; + } + }); + + //Populate the jobs that are leaving today. + const todayIsoString = moment().toISOString().substr(0, 10); + productionview.forEach((pjob) => { + const jobHrs = pjob.larhrs + pjob.labhrs; + //Is the job in the same bucket? + const pjobBucket = ssbuckets.filter( + (bucket) => + bucket.gte <= jobHrs && (!!bucket.lt ? bucket.lt > jobHrs : true) + )[0]; + if (pjobBucket.id === JobBucket.id) { + //Theyre the same classification. Add it to the matrix. + const compDate = moment(pjob.scheduled_completion); + //Is the schedule completion behind today? If so, use today as it. + let dateToUse; + dateToUse = compDate.isValid() + ? moment().diff(compDate, "days") <= 0 + ? compDate.toISOString().substr(0, 10) + : todayIsoString + : todayIsoString; + + bucketMatrix[dateToUse] = { + ...bucketMatrix[dateToUse], + out: bucketMatrix[dateToUse].out + 1, + }; + } + }); + + //Propose the first 5 dates where we are below target. + + const possibleDates = []; + const bucketMatrixKeys = Object.keys(bucketMatrix); + bucketMatrixKeys.forEach((bmkey) => { + if (JobBucket.target > bucketMatrix[bmkey].in - bucketMatrix[bmkey].out) + possibleDates.push(new Date(bmkey).toISOString().substr(0, 10)); + }); + + //Temp + // possibleDates.push(new Date()); + // possibleDates.push(new Date()); + // possibleDates.push(new Date()); + // possibleDates.push(new Date()); + // possibleDates.push(new Date()); + //Get a list of upcoming appointments + //Get the config for each day + + res.json(possibleDates); + } catch (error) { + console.log("error", error); + res.status(400).send(error); + } +}; diff --git a/server/sms/receive.js b/server/sms/receive.js index 7f5f3c733..9d7dab74d 100644 --- a/server/sms/receive.js +++ b/server/sms/receive.js @@ -1,10 +1,20 @@ -require("dotenv").config(); +const path = require("path"); +require("dotenv").config({ + path: path.resolve( + process.cwd(), + `.env.${process.env.NODE_ENV || "development"}` + ), +}); + const client = require("../graphql-client/graphql-client").client; const queries = require("../graphql-client/queries"); const phone = require("phone"); +const admin = require("../firebase/firebase-handler").admin; exports.receive = (req, res) => { //Perform request validation + console.log("[SMS Receive] Inbound Twilio Message.", req.body.SmsMessageSid); + console.log("req.body", req.body); if ( !!!req.body || !!!req.body.MessagingServiceSid || @@ -16,11 +26,16 @@ exports.receive = (req, res) => { client .request(queries.FIND_BODYSHOP_BY_MESSAGING_SERVICE_SID, { mssid: req.body.MessagingServiceSid, - phone: phone(req.body.From)[0] + phone: phone(req.body.From)[0], }) - .then(response => { + .then((response) => { //TODO Add logic for handling MMS. - let newMessage = { msid: req.body.SmsMessageSid, text: req.body.Body }; + let newMessage = { + msid: req.body.SmsMessageSid, + text: req.body.Body, + image: !!req.body.MediaUrl0, + image_path: req.body.MediaUrl0 || null, + }; if (response.bodyshops[0]) { //Found a bodyshop - should always happen. if (response.bodyshops[0].conversations.length === 0) { @@ -29,8 +44,8 @@ exports.receive = (req, res) => { newMessage.conversation = { data: { bodyshopid: response.bodyshops[0].id, - phone_num: phone(req.body.From)[0] - } + phone_num: phone(req.body.From)[0], + }, }; } else if (response.bodyshops[0].conversations.length === 1) { //Just add it to the conversation @@ -47,18 +62,56 @@ exports.receive = (req, res) => { client .request(queries.INSERT_MESSAGE, { msg: newMessage }) - .then(r2 => { - res.status(200).end(); + .then((r2) => { + res.status(200).send(""); + + const arrayOfAllUserFcmTokens = r2.insert_messages.returning[0].conversation.bodyshop.associations.map( + (a) => a.user.fcmtokens + ); + const allTokens = []; + arrayOfAllUserFcmTokens.map((i) => + Object.keys(i).map((k) => allTokens.push(k)) + ); + const uniqueTokens = [...new Set(allTokens)]; + var message = { + notification: { + title: `SMS - ${phone(req.body.From)[0]}`, + body: req.body.Body, + click_action: "TEST CLICK ACTION", + }, + data: { + jobid: "1234", + title: `New SMS From ${phone(req.body.From)[0]}`, + body: req.body.Body, + }, + tokens: uniqueTokens, + }; + + // Send a message to the device corresponding to the provided + // registration token. + admin + .messaging() + .sendMulticast(message) + .then((response) => { + // Response is a message ID string. + console.log( + "[SMS Receive] Successfully sent FCM Broadcast.:" + //JSON.stringify(response) + ); + }) + .catch((error) => { + console.log("Error sending message:", error); + }); }) - .catch(e2 => { + .catch((e2) => { console.log("e2", e2); - res.status(500).json(e2); + res.sendStatus(500).json(e2); }); } }) - .catch(e1 => { + .catch((e1) => { console.log("e1", e1); - res.status(500).json(e1); + res.sendStatus(500).json(e1); }); } }; @@ -85,3 +138,30 @@ exports.receive = (req, res) => { // "From": "+16049992002", // "ApiVersion": "2010-04-01" // } +// ] req.body { +// [0] ToCountry: 'CA', +// [0] MediaContentType0: 'image/jpeg', +// [0] ToState: 'BC', +// [0] SmsMessageSid: 'MM14fa2851ba26e0dc2b62073f8e7cdf27', +// [0] NumMedia: '1', +// [0] ToCity: 'Vancouver', +// [0] FromZip: '', +// [0] SmsSid: 'MM14fa2851ba26e0dc2b62073f8e7cdf27', +// [0] FromState: 'BC', +// [0] SmsStatus: 'received', +// [0] FromCity: 'VANCOUVER', +// [0] Body: '', +// [0] FromCountry: 'CA', +// [0] To: '+16043301606', +// [0] MessagingServiceSid: 'MG6e259e2add04ffa0d0aa355038670ee1', +// [0] ToZip: '', +// [0] NumSegments: '1', +// [0] MessageSid: 'MM14fa2851ba26e0dc2b62073f8e7cdf27', +// [0] AccountSid: 'AC6c09d337d6b9c68ab6488c2052bd457c', +// [0] From: '+16049992002', +// [0] MediaUrl0: 'https://api.twilio.com/2010-04-01/Accounts/AC6c09d337d6b9c68ab6488c2052bd457c/Messages/MM14fa2851ba26e0dc2b62073f8e7cdf27/Media/MEf129dd37979852f395eb29ffb126e19e', +// [0] ApiVersion: '2010-04-01' +// [0] } + +// [0] MediaContentType0: 'image/jpeg', +// MediaContentType0: 'video/3gpp', diff --git a/server/sms/send.js b/server/sms/send.js index 51d418980..3db67b236 100644 --- a/server/sms/send.js +++ b/server/sms/send.js @@ -1,4 +1,11 @@ -require("dotenv").config(); +const path = require("path"); +require("dotenv").config({ + path: path.resolve( + process.cwd(), + `.env.${process.env.NODE_ENV || "development"}` + ), +}); + const twilio = require("twilio"); const phone = require("phone"); const queries = require("../graphql-client/queries"); @@ -17,27 +24,27 @@ exports.send = (req, res) => { .create({ body: body, messagingServiceSid: messagingServiceSid, - to: phone(to)[0] + to: phone(to)[0], }) - .then(message => { + .then((message) => { let newMessage = { msid: message.sid, text: body, conversationid, - isoutbound: true + isoutbound: true, }; gqlClient .request(queries.INSERT_MESSAGE, { msg: newMessage }) - .then(r2 => { - console.log("Responding GQL Message ID", JSON.stringify(r2)); + .then((r2) => { + //console.log("Responding GQL Message ID", JSON.stringify(r2)); res.sendStatus(200); }) - .catch(e2 => { + .catch((e2) => { console.log("e2", e2); //res.json({ success: false, message: e2 }); }); }) - .catch(e1 => { + .catch((e1) => { //res.json({ success: false, message: error }); console.log("e1", e1); }); diff --git a/server/sms/status.js b/server/sms/status.js index 8522f5e2d..3d56c468e 100644 --- a/server/sms/status.js +++ b/server/sms/status.js @@ -1,4 +1,11 @@ -require("dotenv").config(); +const path = require("path"); +require("dotenv").config({ + path: path.resolve( + process.cwd(), + `.env.${process.env.NODE_ENV || "development"}` + ), +}); + const client = require("../graphql-client/graphql-client").client; const queries = require("../graphql-client/queries"); const phone = require("phone"); @@ -8,12 +15,12 @@ exports.status = (req, res) => { client .request(queries.UPDATE_MESSAGE_STATUS, { msid: SmsSid, - fields: { status: SmsStatus } + fields: { status: SmsStatus }, }) - .then(response => { - console.log("Message Updated"); + .then((response) => { + console.log("Message Updated", JSON.stringify(response)); }) - .catch(error => { + .catch((error) => { console.log("Error updating message status", error); }); res.sendStatus(200); diff --git a/server/stripe/payment.js b/server/stripe/payment.js new file mode 100644 index 000000000..b03605026 --- /dev/null +++ b/server/stripe/payment.js @@ -0,0 +1,81 @@ +const GraphQLClient = require("graphql-request").GraphQLClient; +const path = require("path"); +const queries = require("../graphql-client/queries"); +const Dinero = require("dinero.js"); + +require("dotenv").config({ + path: path.resolve( + process.cwd(), + `.env.${process.env.NODE_ENV || "development"}` + ), +}); +const stripe = require("stripe")(process.env.STRIPE_SECRET_KEY); + +exports.payment = async (req, res) => { + const { amount, stripe_acct_id } = req.body; + console.log("exports.payment -> amount", amount); + console.log("exports.payment -> stripe_acct_id", stripe_acct_id); + try { + await stripe.paymentIntents + .create( + { + payment_method_types: ["card"], + amount: amount, + currency: "cad", + application_fee_amount: 50, + }, + { + stripeAccount: stripe_acct_id, + } + ) + .then(function (paymentIntent) { + try { + return res.send({ + clientSecret: paymentIntent.client_secret, + }); + } catch (err) { + return res.status(500).send({ + error: err.message, + }); + } + }); + } catch (error) { + console.log("error", error); + res.status(400).send(error); + } +}; + +exports.mobile_payment = async (req, res) => { + const { amount, stripe_acct_id } = req.body; + console.log("exports.payment -> amount", amount); + console.log("exports.payment -> stripe_acct_id", stripe_acct_id); + try { + await stripe.paymentIntents + .create( + { + //Pull the amounts from the payment request. + payment_method_types: ["card"], + amount: amount, + currency: "cad", + application_fee_amount: 50, + }, + { + stripeAccount: stripe_acct_id, + } + ) + .then(function (paymentIntent) { + try { + return res.send({ + clientSecret: paymentIntent.client_secret, + }); + } catch (err) { + return res.status(500).send({ + error: err.message, + }); + } + }); + } catch (error) { + console.log("error", error); + res.status(400).send(error); + } +}; diff --git a/server/tech/tech.js b/server/tech/tech.js new file mode 100644 index 000000000..f252eb143 --- /dev/null +++ b/server/tech/tech.js @@ -0,0 +1,49 @@ +const client = require("../graphql-client/graphql-client").client; +const queries = require("../graphql-client/queries"); +const path = require("path"); + +require("dotenv").config({ + path: path.resolve( + process.cwd(), + `.env.${process.env.NODE_ENV || "development"}` + ), +}); + +exports.techLogin = async (req, res) => { + const { shopid, employeeid, pin } = req.body; + console.log( + "exports.techLogin -> shopid, employeeid, password", + shopid, + employeeid, + pin + ); + + try { + const result = await client.request(queries.QUERY_EMPLOYEE_PIN, { + shopId: shopid, + employeeId: employeeid, + }); + console.log("exports.techLogin -> result", result); + + let valid = false; + let error; + let technician; + if (result.employees && result.employees[0]) { + const dbRecord = result.employees[0]; + console.log("exports.techLogin -> dbRecord", dbRecord); + if (dbRecord.pin === pin) { + valid = true; + delete dbRecord.pin; + technician = dbRecord; + } else { + error = "The employee ID and PIN combination are not correct."; + } + } else { + error = "The employee ID does not exist."; + } + res.json({ valid, technician, error }); + } catch (error) { + console.log("error", error); + res.status(400).send(error); + } +}; diff --git a/server/utils/utils.js b/server/utils/utils.js new file mode 100644 index 000000000..4587106be --- /dev/null +++ b/server/utils/utils.js @@ -0,0 +1,3 @@ +exports.servertime = (req, res) => { + res.status(200).send(new Date()); +}; diff --git a/stripe_backup_code.txt b/stripe_backup_code.txt new file mode 100644 index 000000000..c6d4aa6bf --- /dev/null +++ b/stripe_backup_code.txt @@ -0,0 +1 @@ +rzlc-nakm-gsuh-qzrm-ewef \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index fe8e97221..46eab385e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -18,6 +18,201 @@ esutils "^2.0.2" js-tokens "^4.0.0" +"@firebase/app-types@0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@firebase/app-types/-/app-types-0.6.0.tgz#8dcc3e793c6983e9d54f7eb623a7618c05f2d94c" + integrity sha512-ld6rzjXk/SUauHiQZJkeuSJpxIZ5wdnWuF5fWBFQNPaxsaJ9kyYg9GqEvwZ1z2e6JP5cU9gwRBlfW1WkGtGDYA== + +"@firebase/auth-interop-types@0.1.4": + version "0.1.4" + resolved "https://registry.yarnpkg.com/@firebase/auth-interop-types/-/auth-interop-types-0.1.4.tgz#e81589f58508630a5bffa604d7c949a0d01ea97b" + integrity sha512-CLKNS84KGAv5lRnHTQZFWoR11Ti7gIPFirDDXWek/fSU+TdYdnxJFR5XSD4OuGyzUYQ3Dq7aVj5teiRdyBl9hA== + +"@firebase/component@0.1.10": + version "0.1.10" + resolved "https://registry.yarnpkg.com/@firebase/component/-/component-0.1.10.tgz#9df3a6555568602ca7b262a3bff2125024f61649" + integrity sha512-Iy1+f8wp6mROz19oxWUd31NxMlGxtW1IInGHITnVa6eZtXOg0lxcbgYeLp9W3PKzvvNfshHU0obDkcMY97zRAw== + dependencies: + "@firebase/util" "0.2.45" + tslib "1.11.1" + +"@firebase/database-types@0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@firebase/database-types/-/database-types-0.5.0.tgz#603a0865c3180a9ffb6f5fa065d156387385a74d" + integrity sha512-6/W3frFznYOALtw2nrWVPK2ytgdl89CzTqVBHCCGf22wT6uKU63iDBo+Nw+7olFGpD15O0zwYalFIcMZ27tkew== + dependencies: + "@firebase/app-types" "0.6.0" + +"@firebase/database@^0.6.0": + version "0.6.1" + resolved "https://registry.yarnpkg.com/@firebase/database/-/database-0.6.1.tgz#76ee8003aa1fff7ff5deb317959bbb0e35e56765" + integrity sha512-7XqUbj3nK2vEdFjGOXBfKISmpLrM0caIwwfDPxhn6i7X/g6AIH+D1limH+Jit4QeKMh/IJZDNqO7P+Fz+e8q1Q== + dependencies: + "@firebase/auth-interop-types" "0.1.4" + "@firebase/component" "0.1.10" + "@firebase/database-types" "0.5.0" + "@firebase/logger" "0.2.2" + "@firebase/util" "0.2.45" + faye-websocket "0.11.3" + tslib "1.11.1" + +"@firebase/logger@0.2.2": + version "0.2.2" + resolved "https://registry.yarnpkg.com/@firebase/logger/-/logger-0.2.2.tgz#aea3ef8cbb131c9d3daaf8022f120f194a40509f" + integrity sha512-MbEy17Ha1w/DlLtvxG89ScQ+0+yoElGKJ1nUCQHHLjeMNsRwd2wnUPOVCsZvtBzQp8Z0GaFmD4a2iG2v91lEbA== + +"@firebase/util@0.2.45": + version "0.2.45" + resolved "https://registry.yarnpkg.com/@firebase/util/-/util-0.2.45.tgz#d52f28da8a4d7a4fa97d36202a86d5f654fbed6d" + integrity sha512-k3IqXaIgwlPg7m5lXmMUtkqA/p+LMFkFQIqBuDtdT0iyWB6kQDokyjw2Sgd3GoTybs6tWqUKFZupZpV6r73UHw== + dependencies: + tslib "1.11.1" + +"@google-cloud/common@^2.1.1": + version "2.4.0" + resolved "https://registry.yarnpkg.com/@google-cloud/common/-/common-2.4.0.tgz#2783b7de8435024a31453510f2dab5a6a91a4c82" + integrity sha512-zWFjBS35eI9leAHhjfeOYlK5Plcuj/77EzstnrJIZbKgF/nkqjcQuGiMCpzCwOfPyUbz8ZaEOYgbHa759AKbjg== + dependencies: + "@google-cloud/projectify" "^1.0.0" + "@google-cloud/promisify" "^1.0.0" + arrify "^2.0.0" + duplexify "^3.6.0" + ent "^2.2.0" + extend "^3.0.2" + google-auth-library "^5.5.0" + retry-request "^4.0.0" + teeny-request "^6.0.0" + +"@google-cloud/firestore@^3.0.0": + version "3.7.5" + resolved "https://registry.yarnpkg.com/@google-cloud/firestore/-/firestore-3.7.5.tgz#d8d68acb591e607b70bc04f49cab60f30d68a613" + integrity sha512-yfgGDQUlkMLxUMRZnGICWSDSvcV2EIjjK3Wc9MEBfju9ULBX1MfR0hU1PzRdtEK7HQ6a8Dh53QJBBngY2CkazA== + dependencies: + deep-equal "^2.0.0" + functional-red-black-tree "^1.0.1" + google-gax "^1.13.0" + readable-stream "^3.4.0" + through2 "^3.0.0" + +"@google-cloud/paginator@^2.0.0": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@google-cloud/paginator/-/paginator-2.0.3.tgz#c7987ad05d1c3ebcef554381be80e9e8da4e4882" + integrity sha512-kp/pkb2p/p0d8/SKUu4mOq8+HGwF8NPzHWkj+VKrIPQPyMRw8deZtrO/OcSiy9C/7bpfU5Txah5ltUNfPkgEXg== + dependencies: + arrify "^2.0.0" + extend "^3.0.2" + +"@google-cloud/projectify@^1.0.0": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@google-cloud/projectify/-/projectify-1.0.4.tgz#28daabebba6579ed998edcadf1a8f3be17f3b5f0" + integrity sha512-ZdzQUN02eRsmTKfBj9FDL0KNDIFNjBn/d6tHQmA/+FImH5DO6ZV8E7FzxMgAUiVAUq41RFAkb25p1oHOZ8psfg== + +"@google-cloud/promisify@^1.0.0": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@google-cloud/promisify/-/promisify-1.0.4.tgz#ce86ffa94f9cfafa2e68f7b3e4a7fad194189723" + integrity sha512-VccZDcOql77obTnFh0TbNED/6ZbbmHDf8UMNnzO1d5g9V0Htfm4k5cllY8P1tJsRKC3zWYGRLaViiupcgVjBoQ== + +"@google-cloud/storage@^4.1.2": + version "4.7.0" + resolved "https://registry.yarnpkg.com/@google-cloud/storage/-/storage-4.7.0.tgz#a7466086a83911c7979cc238d00a127ffb645615" + integrity sha512-f0guAlbeg7Z0m3gKjCfBCu7FG9qS3M3oL5OQQxlvGoPtK7/qg3+W+KQV73O2/sbuS54n0Kh2mvT5K2FWzF5vVQ== + dependencies: + "@google-cloud/common" "^2.1.1" + "@google-cloud/paginator" "^2.0.0" + "@google-cloud/promisify" "^1.0.0" + arrify "^2.0.0" + compressible "^2.0.12" + concat-stream "^2.0.0" + date-and-time "^0.13.0" + duplexify "^3.5.0" + extend "^3.0.2" + gaxios "^3.0.0" + gcs-resumable-upload "^2.2.4" + hash-stream-validation "^0.2.2" + mime "^2.2.0" + mime-types "^2.0.8" + onetime "^5.1.0" + p-limit "^2.2.0" + pumpify "^2.0.0" + readable-stream "^3.4.0" + snakeize "^0.1.0" + stream-events "^1.0.1" + through2 "^3.0.0" + xdg-basedir "^4.0.0" + +"@grpc/grpc-js@^0.7.4": + version "0.7.9" + resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-0.7.9.tgz#a0fae94fecfd4a44fbde496f689c2b4179407bf5" + integrity sha512-ihn9xWOqubMPBlU77wcYpy7FFamGo5xtsK27EAILL/eoOvGEAq29UOrqRvqYPwWfl2+3laFmGKNR7uCdJhKu4Q== + dependencies: + semver "^6.2.0" + +"@grpc/proto-loader@^0.5.1": + version "0.5.4" + resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.5.4.tgz#038a3820540f621eeb1b05d81fbedfb045e14de0" + integrity sha512-HTM4QpI9B2XFkPz7pjwMyMgZchJ93TVkL3kWPW8GDMDKYxsMnmf4w2TNMJK7+KNiYHS5cJrCEAFlF+AwtXWVPA== + dependencies: + lodash.camelcase "^4.3.0" + protobufjs "^6.8.6" + +"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" + integrity sha1-m4sMxmPWaafY9vXQiToU00jzD78= + +"@protobufjs/base64@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" + integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== + +"@protobufjs/codegen@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" + integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== + +"@protobufjs/eventemitter@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" + integrity sha1-NVy8mLr61ZePntCV85diHx0Ga3A= + +"@protobufjs/fetch@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" + integrity sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU= + dependencies: + "@protobufjs/aspromise" "^1.1.1" + "@protobufjs/inquire" "^1.1.0" + +"@protobufjs/float@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" + integrity sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E= + +"@protobufjs/inquire@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" + integrity sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik= + +"@protobufjs/path@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" + integrity sha1-bMKyDFya1q0NzP0hynZz2Nf79o0= + +"@protobufjs/pool@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" + integrity sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q= + +"@protobufjs/utf8@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" + integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA= + +"@tootallnate/once@1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" + integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== + "@types/body-parser@*": version "1.19.0" resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.0.tgz#0685b3c47eb3006ffed117cdd55164b61f80538f" @@ -46,15 +241,28 @@ "@types/node" "*" "@types/range-parser" "*" -"@types/express@^4.17.3": - version "4.17.3" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.3.tgz#38e4458ce2067873b09a73908df488870c303bd9" - integrity sha512-I8cGRJj3pyOLs/HndoP+25vOqhqWkAZsWMEmq1qXy/b/M3ppufecUwaK2/TVDVxcV61/iSdhykUjQQ2DLSrTdg== +"@types/express@^4.17.7": + version "4.17.7" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.7.tgz#42045be6475636d9801369cd4418ef65cdb0dd59" + integrity sha512-dCOT5lcmV/uC2J9k0rPafATeeyz+99xTt54ReX11/LObZgfzJqZNcW27zGhYyX+9iSEGXGt5qLPwRSvBZcLvtQ== dependencies: "@types/body-parser" "*" "@types/express-serve-static-core" "*" + "@types/qs" "*" "@types/serve-static" "*" +"@types/fs-extra@^8.0.1": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-8.1.0.tgz#1114834b53c3914806cd03b3304b37b3bd221a4d" + integrity sha512-UoOfVEzAUpeSPmjm7h1uk5MH6KZma2z2O7a75onTGjnNvAvMVrPzPL/vBbT65iIGHWj6rokwfmYcmxmlSf2uwg== + dependencies: + "@types/node" "*" + +"@types/long@^4.0.0", "@types/long@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.1.tgz#459c65fa1867dafe6a8f322c4c51695663cc55e9" + integrity sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w== + "@types/mime@*": version "2.0.1" resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.1.tgz#dc488842312a7f075149312905b5e3c0b054c79d" @@ -65,6 +273,26 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.17.tgz#191b71e7f4c325ee0fb23bc4a996477d92b8c39b" integrity sha512-Is+l3mcHvs47sKy+afn2O1rV4ldZFU7W8101cNlOd+MRbjM4Onida8jSZnJdTe/0Pcf25g9BNIUsuugmE6puHA== +"@types/node@>=8.1.0": + version "14.0.11" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.11.tgz#61d4886e2424da73b7b25547f59fdcb534c165a3" + integrity sha512-lCvvI24L21ZVeIiyIUHZ5Oflv1hhHQ5E1S25IRlKIXaRkVgmXpJMI3wUJkmym2bTbCe+WoIibQnMVAU3FguaOg== + +"@types/node@^13.7.0": + version "13.13.4" + resolved "https://registry.yarnpkg.com/@types/node/-/node-13.13.4.tgz#1581d6c16e3d4803eb079c87d4ac893ee7501c2c" + integrity sha512-x26ur3dSXgv5AwKS0lNfbjpCakGIduWU1DU91Zz58ONRWrIKGunmZBNv4P7N+e27sJkiGDsw/3fT4AtsqQBrBA== + +"@types/node@^8.10.59": + version "8.10.60" + resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.60.tgz#73eb4d1e1c8aa5dc724363b57db019cf28863ef7" + integrity sha512-YjPbypHFuiOV0bTgeF07HpEEqhmHaZqYNSdCKeBJa+yFoQ/7BC+FpJcwmi34xUIIRVFktnUyP1dPU8U0612GOg== + +"@types/qs@*": + version "6.9.3" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.3.tgz#b755a0934564a200d3efdf88546ec93c369abd03" + integrity sha512-7s9EQWupR1fTc2pSMtXRQ9w9gLOcrJn+h7HOXw4evxyvVqMi4f+q7d2tnFe3ng3SNHjtK+0EzGMGFUQX4/AQRA== + "@types/range-parser@*": version "1.2.3" resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.3.tgz#7ee330ba7caafb98090bece86a5ee44115904c2c" @@ -78,6 +306,13 @@ "@types/express-serve-static-core" "*" "@types/mime" "*" +abort-controller@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== + dependencies: + event-target-shim "^5.0.0" + accepts@~1.3.5, accepts@~1.3.7: version "1.3.7" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" @@ -86,15 +321,29 @@ accepts@~1.3.5, accepts@~1.3.7: mime-types "~2.1.24" negotiator "0.6.2" -acorn-jsx@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.1.0.tgz#294adb71b57398b0680015f0a38c563ee1db5384" - integrity sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw== +acorn-jsx@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe" + integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ== -acorn@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c" - integrity sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ== +acorn@^7.1.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.3.1.tgz#85010754db53c3fbaf3b9ea3e083aa5c5d147ffd" + integrity sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA== + +agent-base@4, agent-base@^4.1.0, agent-base@^4.2.0, agent-base@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee" + integrity sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg== + dependencies: + es6-promisify "^5.0.0" + +agent-base@6: + version "6.0.0" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.0.tgz#5d0101f19bbfaed39980b22ae866de153b93f09a" + integrity sha512-j1Q7cSCqN+AwrmDd+pzgqc0/NpC655x2bUf5ZjRIO77DcNBFmh+OgRNzF6OKdCC9RSCb19fGd99+bhXFdkRNqw== + dependencies: + debug "4" ajv@^6.10.0, ajv@^6.10.2: version "6.10.2" @@ -107,11 +356,11 @@ ajv@^6.10.0, ajv@^6.10.2: uri-js "^4.2.2" ansi-escapes@^4.2.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.0.tgz#a4ce2b33d6b214b7950d8595c212f12ac9cc569d" - integrity sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg== + version "4.3.1" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" + integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== dependencies: - type-fest "^0.8.1" + type-fest "^0.11.0" ansi-regex@^4.1.0: version "4.1.0" @@ -145,21 +394,48 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" +array-filter@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-1.0.0.tgz#baf79e62e6ef4c2a4c0b831232daffec251f9d83" + integrity sha1-uveeYubvTCpMC4MSMtr/7CUfnYM= + array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= +arrify@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" + integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== + asap@^2.0.0: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= +ast-types@0.x.x: + version "0.13.3" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.3.tgz#50da3f28d17bdbc7969a3a2d83a0e4a72ae755a7" + integrity sha512-XTZ7xGML849LkQP86sWdQzfhwbt3YwIO6MqbX9mUNYY98VKaaVZP7YNNm70IpwecbkkxmfC5IYAzOQ/2p29zRA== + astral-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +available-typed-arrays@^1.0.0, available-typed-arrays@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.2.tgz#6b098ca9d8039079ee3f77f7b783c4480ba513f5" + integrity sha512-XWX3OX8Onv97LMk/ftVyBibpGwY5a8SmuxZPzeOxqmuEqUCOM9ZE+uIaD1VNJ5QnvU2UQusvmKbuM1FR8QWGfQ== + dependencies: + array-filter "^1.0.0" + axios@^0.19.2: version "0.19.2" resolved "https://registry.yarnpkg.com/axios/-/axios-0.19.2.tgz#3ea36c5d8818d0d5f8a8a97a6d36b86cdc00cb27" @@ -172,6 +448,26 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= +base64-js@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" + integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== + +bignumber.js@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-4.1.0.tgz#db6f14067c140bd46624815a7916c92d9b6c24b1" + integrity sha512-eJzYkFYy9L4JzXsbymsFn3p54D+llV27oTQ+ziJG7WFRheJcNZilgVXMG0LoZtlQSKBsJdWtLFqOD0u+U0jZKA== + +bignumber.js@^7.0.0: + version "7.2.1" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-7.2.1.tgz#80c048759d826800807c4bfd521e50edbba57a5f" + integrity sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ== + +bluebird@^3.5.0: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + body-parser@1.19.0, body-parser@^1.18.3: version "1.19.0" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" @@ -206,6 +502,11 @@ buffer-equal-constant-time@1.0.1: resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk= +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + bytes@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" @@ -243,6 +544,14 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +chalk@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" + integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + chardet@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" @@ -255,10 +564,10 @@ cli-cursor@^3.1.0: dependencies: restore-cursor "^3.1.0" -cli-width@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" - integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= +cli-width@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" + integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== cliui@^5.0.0: version "5.0.0" @@ -278,14 +587,20 @@ cliui@^6.0.0: strip-ansi "^6.0.0" wrap-ansi "^6.2.0" -cloudinary@^1.21.0: - version "1.21.0" - resolved "https://registry.yarnpkg.com/cloudinary/-/cloudinary-1.21.0.tgz#9c30935190f49f2e9a0e26a16cd8ade580f675cc" - integrity sha512-am8wpHbHl8bcpy9oGSlWrpWLNQ9szkW/jmhcJdEpMjaL23BYt05V1frWyrXDlo8Jt7aCo5NE6EO0CM9Zaynd5g== +cloudinary@^1.22.0: + version "1.22.0" + resolved "https://registry.yarnpkg.com/cloudinary/-/cloudinary-1.22.0.tgz#48a36aab98838f910d350300419e2b10e4eb7e6b" + integrity sha512-qQhSVqGyOWtGbPc3JrwyUXJEZpdqsEzBFSf5+gTo7gbKbXdzEysLagigoSlp6JYI7YW2oEbz4aeZlgN2ucOkzQ== dependencies: + core-js "^3.6.5" lodash "^4.17.11" q "^1.5.1" +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= + color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -310,11 +625,30 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +combined-stream@^1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + commander@~2.20.3: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== +component-emitter@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +compressible@^2.0.12: + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + compressible@~2.0.16: version "2.0.17" resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.17.tgz#6e8c108a16ad58384a977f3a482ca20bff2f38c1" @@ -340,10 +674,20 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concurrently@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-5.1.0.tgz#05523986ba7aaf4b58a49ddd658fab88fa783132" - integrity sha512-9ViZMu3OOCID3rBgU31mjBftro2chOop0G2u1olq1OuwRBVRw/GxHTg80TVJBUTJfoswMmEUeuOg1g1yu1X2dA== +concat-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-2.0.0.tgz#414cf5af790a48c60ab9be4527d56d5e41133cb1" + integrity sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.0.2" + typedarray "^0.0.6" + +concurrently@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-5.2.0.tgz#ead55121d08a0fc817085584c123cedec2e08975" + integrity sha512-XxcDbQ4/43d6CxR7+iV8IZXhur4KbmEJk1CetVMUqCy34z9l0DkszbY+/9wvmSnToTej0SYomc2WSRH+L0zVJw== dependencies: chalk "^2.4.2" date-fns "^2.0.1" @@ -355,6 +699,18 @@ concurrently@^5.1.0: tree-kill "^1.2.2" yargs "^13.3.0" +configstore@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" + integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== + dependencies: + dot-prop "^5.2.0" + graceful-fs "^4.1.2" + make-dir "^3.0.0" + unique-string "^2.0.0" + write-file-atomic "^3.0.0" + xdg-basedir "^4.0.0" + content-disposition@0.5.3: version "0.5.3" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" @@ -384,6 +740,21 @@ cookie@0.4.0: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== +cookiejar@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.2.tgz#dd8a235530752f988f9a0844f3fc589e3111125c" + integrity sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA== + +core-js@^3.6.5: + version "3.6.5" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.5.tgz#7395dc273af37fb2e50e9bd3d9fe841285231d1a" + integrity sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA== + +core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + cors@2.8.5: version "2.8.5" resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" @@ -392,14 +763,6 @@ cors@2.8.5: object-assign "^4" vary "^1" -cross-fetch@2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-2.2.2.tgz#a47ff4f7fc712daba8f6a695a11c948440d45723" - integrity sha1-pH/09/xxLauo9qaVoRyUhEDUVyM= - dependencies: - node-fetch "2.1.2" - whatwg-fetch "2.0.4" - cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" @@ -411,47 +774,110 @@ cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" +crypto-random-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" + integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== + +data-uri-to-buffer@1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-1.2.0.tgz#77163ea9c20d8641b4707e8f18abdf9a78f34835" + integrity sha512-vKQ9DTQPN1FLYiiEEOQ6IBGFqvjCa5rSK3cWMy/Nespm5d/x3dGFT9UBZnkLxCwua/IXBi2TYnwTEpsOvhC4UQ== + +date-and-time@^0.13.0: + version "0.13.1" + resolved "https://registry.yarnpkg.com/date-and-time/-/date-and-time-0.13.1.tgz#d12ba07ac840d5b112dc4c83f8a03e8a51f78dd6" + integrity sha512-/Uge9DJAT+s+oAcDxtBhyR8+sKjUnZbYmyhbmWjTHNtX7B7oWD8YyYdeXcBRbwSj6hVvj+IQegJam7m7czhbFw== + date-fns@^2.0.1: version "2.10.0" resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.10.0.tgz#abd10604d8bafb0bcbd2ba2e9b0563b922ae4b6b" integrity sha512-EhfEKevYGWhWlZbNeplfhIU/+N+x0iCIx7VzKlXma2EdQyznVlZhCptXUY+BegNpPW2kjdx15Rvq503YcXXrcA== -dayjs@^1.8.21: - version "1.8.23" - resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.8.23.tgz#07b5a8e759c4d75ae07bdd0ad6977f851c01e510" - integrity sha512-NmYHMFONftoZbeOhVz6jfiXI4zSiPN6NoVWJgC0aZQfYVwzy/ZpESPHuCcI0B8BUMpSJQ08zenHDbofOLKq8hQ== +dayjs@^1.8.29: + version "1.8.29" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.8.29.tgz#5d23e341de6bfbd206c01136d2fb0f01877820f5" + integrity sha512-Vm6teig8ZWK7rH/lxzVGxZJCljPdmUr6q/3f4fr5F0VWNGVkZEjZOQJsAN8hUHUqn+NK4XHNEpJZS1MwLyDcLw== -debug@2.6.9: +debug@2, debug@2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" -debug@=3.1.0: +debug@3.1.0, debug@=3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== dependencies: ms "2.0.0" -debug@^4.0.1: +debug@4, debug@^4.0.1, debug@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== dependencies: ms "^2.1.1" +debug@^3.1.0: + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + dependencies: + ms "^2.1.1" + decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= +deep-equal@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.0.3.tgz#cad1c15277ad78a5c01c49c2dee0f54de8a6a7b0" + integrity sha512-Spqdl4H+ky45I9ByyJtXteOm9CaIrPmnIPmOhrkKGNYWeDgCvJ8jNYVCTjChxW4FqGuZnLHADc8EKRMX6+CgvA== + dependencies: + es-abstract "^1.17.5" + es-get-iterator "^1.1.0" + is-arguments "^1.0.4" + is-date-object "^1.0.2" + is-regex "^1.0.5" + isarray "^2.0.5" + object-is "^1.1.2" + object-keys "^1.1.1" + object.assign "^4.1.0" + regexp.prototype.flags "^1.3.0" + side-channel "^1.0.2" + which-boxed-primitive "^1.0.1" + which-collection "^1.0.1" + which-typed-array "^1.1.2" + deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= +define-properties@^1.1.2, define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +degenerator@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/degenerator/-/degenerator-1.0.4.tgz#fcf490a37ece266464d9cc431ab98c5819ced095" + integrity sha1-/PSQo37OJmRk2cxDGrmMWBnO0JU= + dependencies: + ast-types "0.x.x" + escodegen "1.x.x" + esprima "3.x.x" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" @@ -462,6 +888,18 @@ destroy@~1.0.4: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= +dicer@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/dicer/-/dicer-0.3.0.tgz#eacd98b3bfbf92e8ab5c2fdb71aaac44bb06b872" + integrity sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA== + dependencies: + streamsearch "0.1.2" + +dinero.js@^1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/dinero.js/-/dinero.js-1.8.1.tgz#775a647629b4195af9d02f46e9b7fa1fd81e906d" + integrity sha512-AQ09MDKonkGUrhBZZFx4tPTVcVJuHJ0VEA73LvcBoBB2eQSi1DbapeXj4wnUUpx1hVnPdyev1xPNnNMGy/Au0g== + doctrine@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" @@ -469,6 +907,13 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" +dot-prop@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.2.0.tgz#c34ecc29556dc45f1f4c22697b6f4904e0cc4fcb" + integrity sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A== + dependencies: + is-obj "^2.0.0" + dotenv@8.2.0: version "8.2.0" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" @@ -479,7 +924,27 @@ duplexer@^0.1.1: resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" integrity sha1-rOb/gIwc5mtX0ev5eXessCM0z8E= -ecdsa-sig-formatter@1.0.11: +duplexify@^3.5.0, duplexify@^3.6.0: + version "3.7.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +duplexify@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-4.1.1.tgz#7027dc374f157b122a8ae08c2d3ea4d2d953aa61" + integrity sha512-DY3xVEmVHTv1wSzKNbwoU6nVjzI369Y6sPoqfYr0/xlx3IdX2n94xIszTcjPO8W8ZIv0Wb0PXNcjuZyT4wiICA== + dependencies: + end-of-stream "^1.4.1" + inherits "^2.0.3" + readable-stream "^3.1.1" + stream-shift "^1.0.0" + +ecdsa-sig-formatter@1.0.11, ecdsa-sig-formatter@^1.0.11: version "1.0.11" resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== @@ -511,6 +976,18 @@ encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= +end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +ent@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" + integrity sha1-6WQhkyWiHQX0RGai9obtbOX13R0= + error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" @@ -518,6 +995,57 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" +es-abstract@^1.17.0-next.1, es-abstract@^1.17.4, es-abstract@^1.17.5: + version "1.17.5" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.5.tgz#d8c9d1d66c8981fb9200e2251d799eee92774ae9" + integrity sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg== + dependencies: + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.1.5" + is-regex "^1.0.5" + object-inspect "^1.7.0" + object-keys "^1.1.1" + object.assign "^4.1.0" + string.prototype.trimleft "^2.1.1" + string.prototype.trimright "^2.1.1" + +es-get-iterator@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.0.tgz#bb98ad9d6d63b31aacdc8f89d5d0ee57bcb5b4c8" + integrity sha512-UfrmHuWQlNMTs35e1ypnvikg6jCz3SK8v8ImvmDsh36fCVUR1MqoFDiyn0/k52C8NqO3YsO8Oe0azeesNuqSsQ== + dependencies: + es-abstract "^1.17.4" + has-symbols "^1.0.1" + is-arguments "^1.0.4" + is-map "^2.0.1" + is-set "^2.0.1" + is-string "^1.0.5" + isarray "^2.0.5" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +es6-promise@^4.0.3: + version "4.2.8" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== + +es6-promisify@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" + integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM= + dependencies: + es6-promise "^4.0.3" + escape-html@^1.0.3, escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" @@ -528,15 +1056,27 @@ escape-string-regexp@^1.0.5: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= +escodegen@1.x.x: + version "1.14.3" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" + integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== + dependencies: + esprima "^4.0.1" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + eslint-plugin-promise@^4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-4.2.1.tgz#845fd8b2260ad8f82564c1222fce44ad71d9418a" integrity sha512-VoM09vT7bfA7D+upt+FjeBO5eHIJQBUWki1aPvB+vbNiHS3+oGIJGIeyBtKQTME6UPXXy3vV07OL1tHd3ANuDw== eslint-scope@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9" - integrity sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw== + version "5.1.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.0.tgz#d0f971dfe59c69e0cada684b23d49dbf82600ce5" + integrity sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w== dependencies: esrecurse "^4.1.0" estraverse "^4.1.1" @@ -597,25 +1137,30 @@ eslint@^6.8.0: v8-compile-cache "^2.0.3" espree@^6.1.2: - version "6.1.2" - resolved "https://registry.yarnpkg.com/espree/-/espree-6.1.2.tgz#6c272650932b4f91c3714e5e7b5f5e2ecf47262d" - integrity sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA== + version "6.2.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a" + integrity sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw== dependencies: - acorn "^7.1.0" - acorn-jsx "^5.1.0" + acorn "^7.1.1" + acorn-jsx "^5.2.0" eslint-visitor-keys "^1.1.0" -esprima@^4.0.0: +esprima@3.x.x: + version "3.1.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= + +esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esquery@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" - integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== + version "1.3.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" + integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== dependencies: - estraverse "^4.0.0" + estraverse "^5.1.0" esrecurse@^4.1.0: version "4.2.1" @@ -624,11 +1169,16 @@ esrecurse@^4.1.0: dependencies: estraverse "^4.1.0" -estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: +estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== +estraverse@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.1.0.tgz#374309d39fd935ae500e7b92e8a6b4c720e59642" + integrity sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw== + esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" @@ -639,6 +1189,11 @@ etag@~1.8.1: resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= +event-target-shim@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== + express-sslify@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/express-sslify/-/express-sslify-1.2.0.tgz#30e84bceed1557eb187672bbe1430a0a2a100d9c" @@ -680,6 +1235,11 @@ express@^4.16.4: utils-merge "1.0.1" vary "~1.1.2" +extend@^3.0.0, extend@^3.0.2, extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + external-editor@^3.0.3: version "3.1.0" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" @@ -704,10 +1264,22 @@ fast-levenshtein@~2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= +fast-text-encoding@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/fast-text-encoding/-/fast-text-encoding-1.0.2.tgz#ff1ad5677bde049e0f8656aa6083a7ef2c5836e2" + integrity sha512-5rQdinSsycpzvAoHga2EDn+LRX1d5xLFsuNG0Kg61JrAT/tASXcLL0nf/33v+sAxlQcfYmWbTURa1mmAf55jGw== + +faye-websocket@0.11.3: + version "0.11.3" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.3.tgz#5c0e9a8968e8912c286639fde977a8b209f2508e" + integrity sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA== + dependencies: + websocket-driver ">=0.5.1" + figures@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.1.0.tgz#4b198dd07d8d71530642864af2d45dd9e459c4ec" - integrity sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg== + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== dependencies: escape-string-regexp "^1.0.5" @@ -718,6 +1290,11 @@ file-entry-cache@^5.0.1: dependencies: flat-cache "^2.0.1" +file-uri-to-path@1: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + finalhandler@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" @@ -746,6 +1323,20 @@ find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" +firebase-admin@^8.13.0: + version "8.13.0" + resolved "https://registry.yarnpkg.com/firebase-admin/-/firebase-admin-8.13.0.tgz#997d34ae8357d7dc162ba622148bbebcf7f2e923" + integrity sha512-krXj5ncWMJBhCpXSn9UFY6zmDWjFjqgx+1e9ATXKFYndEjmKtNBuJzqdrAdDh7aTUR7X6+0TPx4Hbc08kd0lwQ== + dependencies: + "@firebase/database" "^0.6.0" + "@types/node" "^8.10.59" + dicer "^0.3.0" + jsonwebtoken "^8.5.1" + node-forge "^0.7.6" + optionalDependencies: + "@google-cloud/firestore" "^3.0.0" + "@google-cloud/storage" "^4.1.2" + flat-cache@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" @@ -767,6 +1358,25 @@ follow-redirects@1.5.10: dependencies: debug "=3.1.0" +foreach@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" + integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= + +form-data@^2.3.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.1.tgz#f2cbec57b5e59e23716e128fe44d4e5dd23895f4" + integrity sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +formidable@^1.2.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.2.2.tgz#bf69aea2972982675f00865342b982986f6b8dd9" + integrity sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q== + forwarded@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" @@ -782,16 +1392,83 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= +ftp@~0.3.10: + version "0.3.10" + resolved "https://registry.yarnpkg.com/ftp/-/ftp-0.3.10.tgz#9197d861ad8142f3e63d5a83bfe4c59f7330885d" + integrity sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0= + dependencies: + readable-stream "1.1.x" + xregexp "2.0.0" + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= +gaxios@^2.0.0, gaxios@^2.1.0: + version "2.3.4" + resolved "https://registry.yarnpkg.com/gaxios/-/gaxios-2.3.4.tgz#eea99353f341c270c5f3c29fc46b8ead56f0a173" + integrity sha512-US8UMj8C5pRnao3Zykc4AAVr+cffoNKRTg9Rsf2GiuZCW69vgJj38VK2PzlPuQU73FZ/nTk9/Av6/JGcE1N9vA== + dependencies: + abort-controller "^3.0.0" + extend "^3.0.2" + https-proxy-agent "^5.0.0" + is-stream "^2.0.0" + node-fetch "^2.3.0" + +gaxios@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/gaxios/-/gaxios-3.0.3.tgz#497730758f5b0d43a32ebdbebe5f1bd9f7db7aed" + integrity sha512-PkzQludeIFhd535/yucALT/Wxyj/y2zLyrMwPcJmnLHDugmV49NvAi/vb+VUq/eWztATZCNcb8ue+ywPG+oLuw== + dependencies: + abort-controller "^3.0.0" + extend "^3.0.2" + https-proxy-agent "^5.0.0" + is-stream "^2.0.0" + node-fetch "^2.3.0" + +gcp-metadata@^3.4.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/gcp-metadata/-/gcp-metadata-3.5.0.tgz#6d28343f65a6bbf8449886a0c0e4a71c77577055" + integrity sha512-ZQf+DLZ5aKcRpLzYUyBS3yo3N0JSa82lNDO8rj3nMSlovLcz2riKFBsYgDzeXcv75oo5eqB2lx+B14UvPoCRnA== + dependencies: + gaxios "^2.1.0" + json-bigint "^0.3.0" + +gcs-resumable-upload@^2.2.4: + version "2.3.3" + resolved "https://registry.yarnpkg.com/gcs-resumable-upload/-/gcs-resumable-upload-2.3.3.tgz#02c616ed17eff6676e789910aeab3907d412c5f8" + integrity sha512-sf896I5CC/1AxeaGfSFg3vKMjUq/r+A3bscmVzZm10CElyRanN0XwPu/MxeIO4LSP+9uF6yKzXvNsaTsMXUG6Q== + dependencies: + abort-controller "^3.0.0" + configstore "^5.0.0" + gaxios "^2.0.0" + google-auth-library "^5.0.0" + pumpify "^2.0.0" + stream-events "^1.0.4" + get-caller-file@^2.0.1: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== +get-uri@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-2.0.4.tgz#d4937ab819e218d4cb5ae18e4f5962bef169cc6a" + integrity sha512-v7LT/s8kVjs+Tx0ykk1I+H/rbpzkHvuIq87LmeXptcf5sNWm9uQiwjNAt94SJPA1zOlCntmnOlJvVWKmzsxG8Q== + dependencies: + data-uri-to-buffer "1" + debug "2" + extend "~3.0.2" + file-uri-to-path "1" + ftp "~0.3.10" + readable-stream "2" + glob-parent@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2" @@ -818,12 +1495,68 @@ globals@^12.1.0: dependencies: type-fest "^0.8.1" -graphql-request@^1.8.2: - version "1.8.2" - resolved "https://registry.yarnpkg.com/graphql-request/-/graphql-request-1.8.2.tgz#398d10ae15c585676741bde3fc01d5ca948f8fbe" - integrity sha512-dDX2M+VMsxXFCmUX0Vo0TopIZIX4ggzOtiCsThgtrKR4niiaagsGTDIHj3fsOMFETpa064vzovI+4YV4QnMbcg== +google-auth-library@^5.0.0, google-auth-library@^5.5.0: + version "5.10.1" + resolved "https://registry.yarnpkg.com/google-auth-library/-/google-auth-library-5.10.1.tgz#504ec75487ad140e68dd577c21affa363c87ddff" + integrity sha512-rOlaok5vlpV9rSiUu5EpR0vVpc+PhN62oF4RyX/6++DG1VsaulAFEMlDYBLjJDDPI6OcNOCGAKy9UVB/3NIDXg== dependencies: - cross-fetch "2.2.2" + arrify "^2.0.0" + base64-js "^1.3.0" + ecdsa-sig-formatter "^1.0.11" + fast-text-encoding "^1.0.0" + gaxios "^2.1.0" + gcp-metadata "^3.4.0" + gtoken "^4.1.0" + jws "^4.0.0" + lru-cache "^5.0.0" + +google-gax@^1.13.0: + version "1.15.2" + resolved "https://registry.yarnpkg.com/google-gax/-/google-gax-1.15.2.tgz#a58aff43ec383f4f056f9d796e8d5e4891161eb8" + integrity sha512-yNNiRf9QxWpZNfQQmSPz3rIDTBDDKnLKY/QEsjCaJyDxttespr6v8WRGgU5KrU/6ZM7QRlgBAYXCkxqHhJp0wA== + dependencies: + "@grpc/grpc-js" "^0.7.4" + "@grpc/proto-loader" "^0.5.1" + "@types/fs-extra" "^8.0.1" + "@types/long" "^4.0.0" + abort-controller "^3.0.0" + duplexify "^3.6.0" + google-auth-library "^5.0.0" + is-stream-ended "^0.1.4" + lodash.at "^4.6.0" + lodash.has "^4.5.2" + node-fetch "^2.6.0" + protobufjs "^6.8.9" + retry-request "^4.0.0" + semver "^6.0.0" + walkdir "^0.4.0" + +google-p12-pem@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/google-p12-pem/-/google-p12-pem-2.0.4.tgz#036462394e266472632a78b685f0cc3df4ef337b" + integrity sha512-S4blHBQWZRnEW44OcR7TL9WR+QCqByRvhNDZ/uuQfpxywfupikf/miba8js1jZi6ZOGv5slgSuoshCWh6EMDzg== + dependencies: + node-forge "^0.9.0" + +graceful-fs@^4.1.2: + version "4.2.4" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" + integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== + +graphql-request@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/graphql-request/-/graphql-request-2.0.0.tgz#8dd12cf1eb2ce0c80f4114fd851741e091134862" + integrity sha512-Ww3Ax+G3l2d+mPT8w7HC9LfrKjutnCKtnDq7ZZp2ghVk5IQDjwAk3/arRF1ix17Ky15rm0hrSKVKxRhIVlSuoQ== + +gtoken@^4.1.0: + version "4.1.4" + resolved "https://registry.yarnpkg.com/gtoken/-/gtoken-4.1.4.tgz#925ff1e7df3aaada06611d30ea2d2abf60fcd6a7" + integrity sha512-VxirzD0SWoFUo5p8RDP8Jt2AGyOmyYcT/pOUgDKJCK+iSw0TMqwrVfY37RXTNmoKwrzmDHSk0GMT9FsgVmnVSA== + dependencies: + gaxios "^2.1.0" + google-p12-pem "^2.0.0" + jws "^4.0.0" + mime "^2.2.0" gzip-size@^5.1.1: version "5.1.1" @@ -855,6 +1588,25 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== +has-symbols@^1.0.0, has-symbols@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" + integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hash-stream-validation@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/hash-stream-validation/-/hash-stream-validation-0.2.2.tgz#6b34c4fce5e9fce265f1d3380900049d92a10090" + integrity sha512-cMlva5CxWZOrlS/cY0C+9qAzesn5srhFA8IT1VPiHc9bWWBLkJfEUIZr7MWoi89oOOGmpg8ymchaOjiArsGu5A== + dependencies: + through2 "^2.0.0" + hosted-git-info@^2.1.4: version "2.8.5" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.5.tgz#759cfcf2c4d156ade59b0b2dfabddc42a6b9c70c" @@ -871,7 +1623,7 @@ http-errors@1.7.2: statuses ">= 1.5.0 < 2" toidentifier "1.0.0" -http-errors@~1.7.2: +http-errors@1.7.3, http-errors@~1.7.2: version "1.7.3" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== @@ -882,6 +1634,44 @@ http-errors@~1.7.2: statuses ">= 1.5.0 < 2" toidentifier "1.0.0" +"http-parser-js@>=0.4.0 <0.4.11": + version "0.4.10" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.10.tgz#92c9c1374c35085f75db359ec56cc257cbb93fa4" + integrity sha1-ksnBN0w1CF912zWexWzCV8u5P6Q= + +http-proxy-agent@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405" + integrity sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg== + dependencies: + agent-base "4" + debug "3.1.0" + +http-proxy-agent@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" + integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== + dependencies: + "@tootallnate/once" "1" + agent-base "6" + debug "4" + +https-proxy-agent@^2.2.1: + version "2.2.4" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz#4ee7a737abd92678a293d9b34a1af4d0d08c787b" + integrity sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg== + dependencies: + agent-base "^4.3.0" + debug "^3.1.0" + +https-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" + integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== + dependencies: + agent-base "6" + debug "4" + iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -915,7 +1705,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -926,34 +1716,64 @@ inherits@2.0.3: integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= inquirer@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.0.tgz#9e2b032dde77da1db5db804758b8fea3a970519a" - integrity sha512-rSdC7zelHdRQFkWnhsMu2+2SO41mpv2oF2zy4tMhmiLWkcKbOAs87fWAJhVXttKVwhdZvymvnuM95EyEXg2/tQ== + version "7.3.2" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.2.tgz#25245d2e32dc9f33dbe26eeaada231daa66e9c7c" + integrity sha512-DF4osh1FM6l0RJc5YWYhSDB6TawiBRlbV9Cox8MWlidU218Tb7fm3lQTULyUJDfJ0tjbzl0W4q651mrCCEM55w== dependencies: ansi-escapes "^4.2.1" - chalk "^2.4.2" + chalk "^4.1.0" cli-cursor "^3.1.0" - cli-width "^2.0.0" + cli-width "^3.0.0" external-editor "^3.0.3" figures "^3.0.0" - lodash "^4.17.15" + lodash "^4.17.16" mute-stream "0.0.8" - run-async "^2.2.0" - rxjs "^6.4.0" + run-async "^2.4.0" + rxjs "^6.6.0" string-width "^4.1.0" - strip-ansi "^5.1.0" + strip-ansi "^6.0.0" through "^2.3.6" +ip@^1.1.4, ip@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= + ipaddr.js@1.9.0: version "1.9.0" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.0.tgz#37df74e430a0e47550fe54a2defe30d8acd95f65" integrity sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA== +is-arguments@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3" + integrity sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA== + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= +is-bigint@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.0.tgz#73da8c33208d00f130e9b5e15d23eac9215601c4" + integrity sha512-t5mGUXC/xRheCK431ylNiSkGGpBp8bHENBcENTkDT6ppwPzEVxNGZRvgvmOEfbWkFhA7D2GEuE2mmQTr78sl2g== + +is-boolean-object@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.0.1.tgz#10edc0900dd127697a92f6f9807c7617d68ac48e" + integrity sha512-TqZuVwa/sppcrhUCAYkGBk7w0yxfQQnxq28fjkO53tnK9FQXmdwz2JS5+GjsWQ6RByES1K40nI+yDic5c9/aAQ== + +is-callable@^1.1.4, is-callable@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" + integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q== + +is-date-object@^1.0.1, is-date-object@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" + integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== + is-docker@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.0.0.tgz#2cb0df0e75e2d064fe1864c37cdeacb7b2dcf25b" @@ -981,16 +1801,100 @@ is-glob@^4.0.0, is-glob@^4.0.1: dependencies: is-extglob "^2.1.1" -is-promise@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" - integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= +is-map@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.1.tgz#520dafc4307bb8ebc33b813de5ce7c9400d644a1" + integrity sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw== + +is-number-object@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.4.tgz#36ac95e741cf18b283fc1ddf5e83da798e3ec197" + integrity sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw== + +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + +is-regex@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" + integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== + dependencies: + has "^1.0.3" + +is-set@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.1.tgz#d1604afdab1724986d30091575f54945da7e5f43" + integrity sha512-eJEzOtVyenDs1TMzSQ3kU3K+E0GUS9sno+F0OBT97xsgcJsF9nXMBtkT9/kut5JEpM7oL7X/0qxR17K3mcwIAA== + +is-stream-ended@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-stream-ended/-/is-stream-ended-0.1.4.tgz#f50224e95e06bce0e356d440a4827cd35b267eda" + integrity sha512-xj0XPvmr7bQFTvirqnFr50o0hQIh6ZItDqloxt5aJrR4NQsYeSsyFQERYGCAzfindAcnKjINnwEEgLx4IqVzQw== + +is-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" + integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== + +is-string@^1.0.4, is-string@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" + integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== + +is-symbol@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" + integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== + dependencies: + has-symbols "^1.0.1" + +is-typed-array@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.3.tgz#a4ff5a5e672e1a55f99c7f54e59597af5c1df04d" + integrity sha512-BSYUBOK/HJibQ30wWkWold5txYwMUXQct9YHAQJr8fSwvZoiglcqB0pd7vEN23+Tsi9IUEjztdOSzl4qLVYGTQ== + dependencies: + available-typed-arrays "^1.0.0" + es-abstract "^1.17.4" + foreach "^2.0.5" + has-symbols "^1.0.1" + +is-typedarray@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-weakmap@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" + integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== + +is-weakset@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.1.tgz#e9a0af88dbd751589f5e50d80f4c98b780884f83" + integrity sha512-pi4vhbhVHGLxohUw7PhGsueT4vRGFoXhP7+RGN0jKIv9+8PWYCQTqtADngrxOm2g46hoH0+g8uZZBzMrvVGDmw== is-wsl@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.1.1.tgz#4a1c152d429df3d441669498e2486d3596ebaf1d" integrity sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog== +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -1009,6 +1913,20 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" +json-bigint@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-bigint/-/json-bigint-0.2.3.tgz#118d7f6ff1d38659f19f94cf73e64a75a3f988a8" + integrity sha1-EY1/b/HThlnxn5TPc+ZKdaP5iKg= + dependencies: + bignumber.js "^4.0.0" + +json-bigint@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/json-bigint/-/json-bigint-0.3.0.tgz#0ccd912c4b8270d05f056fbd13814b53d3825b1e" + integrity sha1-DM2RLEuCcNBfBW+9E4FLU9OCWx4= + dependencies: + bignumber.js "^7.0.0" + json-parse-better-errors@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" @@ -1049,6 +1967,15 @@ jwa@^1.4.1: ecdsa-sig-formatter "1.0.11" safe-buffer "^5.0.1" +jwa@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/jwa/-/jwa-2.0.0.tgz#a7e9c3f29dae94027ebcaf49975c9345593410fc" + integrity sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA== + dependencies: + buffer-equal-constant-time "1.0.1" + ecdsa-sig-formatter "1.0.11" + safe-buffer "^5.0.1" + jws@^3.2.2: version "3.2.2" resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" @@ -1057,6 +1984,14 @@ jws@^3.2.2: jwa "^1.4.1" safe-buffer "^5.0.1" +jws@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jws/-/jws-4.0.0.tgz#2d4e8cf6a318ffaa12615e9dec7e86e6c97310f4" + integrity sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg== + dependencies: + jwa "^2.0.0" + safe-buffer "^5.0.1" + levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" @@ -1080,6 +2015,21 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" +lodash.at@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.at/-/lodash.at-4.6.0.tgz#93cdce664f0a1994ea33dd7cd40e23afd11b0ff8" + integrity sha1-k83OZk8KGZTqM9181A4jr9EbD/g= + +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= + +lodash.has@^4.5.2: + version "4.5.2" + resolved "https://registry.yarnpkg.com/lodash.has/-/lodash.has-4.5.2.tgz#d19f4dc1095058cccbe2b0cdf4ee0fe4aa37c862" + integrity sha1-0Z9NwQlQWMzL4rDN9O4P5Ko3yGI= + lodash.includes@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" @@ -1120,6 +2070,38 @@ lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== +lodash@^4.17.16, lodash@^4.17.19: + version "4.17.19" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" + integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== + +long@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" + integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== + +lru-cache@^4.1.2: + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +lru-cache@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +make-dir@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" @@ -1130,7 +2112,7 @@ merge-descriptors@1.0.1: resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= -methods@~1.1.2: +methods@^1.1.1, methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= @@ -1140,6 +2122,18 @@ mime-db@1.42.0, "mime-db@>= 1.40.0 < 2": resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.42.0.tgz#3e252907b4c7adb906597b4b65636272cf9e7bac" integrity sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ== +mime-db@1.44.0, "mime-db@>= 1.43.0 < 2": + version "1.44.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" + integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== + +mime-types@^2.0.8, mime-types@^2.1.12: + version "2.1.27" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" + integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== + dependencies: + mime-db "1.44.0" + mime-types@~2.1.24: version "2.1.25" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.25.tgz#39772d46621f93e2a80a856c53b86a62156a6437" @@ -1147,11 +2141,16 @@ mime-types@~2.1.24: dependencies: mime-db "1.42.0" -mime@1.6.0: +mime@1.6.0, mime@^1.4.1: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== +mime@^2.2.0: + version "2.4.4" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5" + integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA== + mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" @@ -1181,6 +2180,11 @@ mkdirp@^0.5.1: dependencies: minimist "0.0.8" +moment@^2.27.0: + version "2.27.0" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.27.0.tgz#8bff4e3e26a236220dfe3e36de756b6ebaa0105d" + integrity sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ== + ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -1216,20 +2220,46 @@ neo-async@^2.6.0: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== +netmask@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/netmask/-/netmask-1.0.6.tgz#20297e89d86f6f6400f250d9f4f6b4c1945fcd35" + integrity sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU= + nice-try@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== -node-fetch@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.1.2.tgz#ab884e8e7e57e38a944753cec706f788d1768bb5" - integrity sha1-q4hOjn5X44qUR1POxwb3iNF2i7U= +node-fetch@^2.2.0, node-fetch@^2.3.0, node-fetch@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd" + integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== -nodemailer@^6.4.4: - version "6.4.4" - resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-6.4.4.tgz#f4bb26a833786e8908b3ac8afbf2d0382ac24feb" - integrity sha512-2GqGu5o3FBmDibczU3+LZh9lCEiKmNx7LvHl512p8Kj+Kn5FQVOICZv85MDFz/erK0BDd5EJp3nqQLpWCZD1Gg== +node-forge@^0.7.6: + version "0.7.6" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.6.tgz#fdf3b418aee1f94f0ef642cd63486c77ca9724ac" + integrity sha512-sol30LUpz1jQFBjOKwbjxijiE3b6pjd74YwfD0fJOKPjF+fONKb2Yg8rYgS6+bK6VDl+/wfr4IYpC7jDzLUIfw== + +node-forge@^0.9.0: + version "0.9.1" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.9.1.tgz#775368e6846558ab6676858a4d8c6e8d16c677b5" + integrity sha512-G6RlQt5Sb4GMBzXvhfkeFmbqR6MzhtnT7VTHuLadjkii3rdYHNdw0m8zA4BTxVIh68FicCQ2NSUANpsqkr9jvQ== + +node-mailjet@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/node-mailjet/-/node-mailjet-3.3.1.tgz#f06ed4765abf3d6d57e662c32cb586fd7e79a540" + integrity sha512-MMKE5e1vKv3/GMUa6GRZu4rloSNx3Aa/XlOzjr1P7jo9HFSDgzM1V7Tyi/p2/zPzt1nS5BT2vwiaV+YA8l0BcA== + dependencies: + bluebird "^3.5.0" + json-bigint "^0.2.3" + qs "^6.5.0" + superagent "^3.5.2" + superagent-proxy "^1.0.2" + +nodemailer@^6.4.10: + version "6.4.10" + resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-6.4.10.tgz#f4c8dc7991c57f41fd081bef224ef01f7065143d" + integrity sha512-j+pS9CURhPgk6r0ENr7dji+As2xZiHSvZeVnzKniLOw1eRAyM/7flP0u65tCnsapV8JFu+t0l/5VeHsCZEeh9g== normalize-package-data@^2.3.2: version "2.5.0" @@ -1246,6 +2276,34 @@ object-assign@^4: resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= +object-inspect@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" + integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== + +object-is@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.2.tgz#c5d2e87ff9e119f78b7a088441519e2eec1573b6" + integrity sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + +object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" + integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" @@ -1258,7 +2316,7 @@ on-headers@~1.0.2: resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== -once@^1.3.0: +once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= @@ -1280,7 +2338,7 @@ open@^7.0.3: is-docker "^2.0.0" is-wsl "^2.1.1" -optionator@^0.8.3: +optionator@^0.8.1, optionator@^0.8.3: version "0.8.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== @@ -1330,6 +2388,31 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== +pac-proxy-agent@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-2.0.2.tgz#90d9f6730ab0f4d2607dcdcd4d3d641aa26c3896" + integrity sha512-cDNAN1Ehjbf5EHkNY5qnRhGPUCp6SnpyVof5fRzN800QV1Y2OkzbH9rmjZkbBRa8igof903yOnjIl6z0SlAhxA== + dependencies: + agent-base "^4.2.0" + debug "^3.1.0" + get-uri "^2.0.0" + http-proxy-agent "^2.1.0" + https-proxy-agent "^2.2.1" + pac-resolver "^3.0.0" + raw-body "^2.2.0" + socks-proxy-agent "^3.0.0" + +pac-resolver@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-3.0.0.tgz#6aea30787db0a891704deb7800a722a7615a6f26" + integrity sha512-tcc38bsjuE3XZ5+4vP96OfhOugrX+JcnpUbhfuc4LuXBLQhoTthOstZeoQJBDnQUDYzYmdImKsbz0xSl1/9qeA== + dependencies: + co "^4.6.0" + degenerator "^1.0.4" + ip "^1.1.5" + netmask "^1.0.6" + thunkify "^2.1.2" + parent-module@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" @@ -1380,10 +2463,10 @@ path-to-regexp@0.1.7: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= -phone@^2.4.8: - version "2.4.8" - resolved "https://registry.yarnpkg.com/phone/-/phone-2.4.8.tgz#4da4c046b4a90ca65ea04f86e99094b50ed518df" - integrity sha512-8RO0PfJPzjsWKhbU9W79f7exxkEgjrjbkHqG3psV3SI2q+SJqDEC7We3Ylxivk8XNdoZ8jDs4TPHnqCVs8TwNA== +phone@^2.4.13: + version "2.4.13" + resolved "https://registry.yarnpkg.com/phone/-/phone-2.4.13.tgz#ca765ed62811ca28ae4759b5c0016dea717b3e6f" + integrity sha512-C7WWHU9NiMj/cdMcJ/dSrjfSxzdoE5o36JluKkgRtyUthr2EgpzV3bOkSL5/w5NB/OBA2+zOb+gek6i7+mcR0A== pify@^3.0.0: version "3.0.0" @@ -1405,11 +2488,35 @@ prelude-ls@~1.1.2: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + progress@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== +protobufjs@^6.8.6, protobufjs@^6.8.9: + version "6.9.0" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.9.0.tgz#c08b2bf636682598e6fabbf0edb0b1256ff090bd" + integrity sha512-LlGVfEWDXoI/STstRDdZZKb/qusoAWUnmLg9R8OLSO473mBLWHowx8clbX5/+mKDEI+v7GzjoK9tRPZMMcoTrg== + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.4" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.0" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.0" + "@types/long" "^4.0.1" + "@types/node" "^13.7.0" + long "^4.0.0" + proxy-addr@~2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.5.tgz#34cbd64a2d81f4b1fd21e76f9f06c8a45299ee34" @@ -1418,6 +2525,47 @@ proxy-addr@~2.0.5: forwarded "~0.1.2" ipaddr.js "1.9.0" +proxy-agent@2: + version "2.3.1" + resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-2.3.1.tgz#3d49d863d46cf5f37ca8394848346ea02373eac6" + integrity sha512-CNKuhC1jVtm8KJYFTS2ZRO71VCBx3QSA92So/e6NrY6GoJonkx3Irnk4047EsCcswczwqAekRj3s8qLRGahSKg== + dependencies: + agent-base "^4.2.0" + debug "^3.1.0" + http-proxy-agent "^2.1.0" + https-proxy-agent "^2.2.1" + lru-cache "^4.1.2" + pac-proxy-agent "^2.0.1" + proxy-from-env "^1.0.0" + socks-proxy-agent "^3.0.0" + +proxy-from-env@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-2.0.1.tgz#abfc7b5a621307c728b551decbbefb51f0e4aa1e" + integrity sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw== + dependencies: + duplexify "^4.1.1" + inherits "^2.0.3" + pump "^3.0.0" + punycode@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" @@ -1442,10 +2590,10 @@ qs@6.7.0: resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== -qs@^6.9.1: - version "6.9.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.2.tgz#a27b695006544a04bf0e6c6a7e8120778926d5bd" - integrity sha512-2eQ6zajpK7HwqrY1rRtGw5IZvjgtELXzJECaEDuzDFo2jjnIXpJSimzd4qflWZq6bLLi+Zgfj5eDrAzl/lptyg== +qs@^6.5.0, qs@^6.5.1, qs@^6.6.0, qs@^6.9.4: + version "6.9.4" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.4.tgz#9090b290d1f91728d3c22e54843ca44aea5ab687" + integrity sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ== querystringify@^2.1.1: version "2.1.1" @@ -1467,6 +2615,16 @@ raw-body@2.4.0: iconv-lite "0.4.24" unpipe "1.0.0" +raw-body@^2.2.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.1.tgz#30ac82f98bb5ae8c152e67149dac8d55153b168c" + integrity sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA== + dependencies: + bytes "3.1.0" + http-errors "1.7.3" + iconv-lite "0.4.24" + unpipe "1.0.0" + read-pkg@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-4.0.1.tgz#963625378f3e1c4d48c85872b5a6ec7d5d093237" @@ -1476,6 +2634,46 @@ read-pkg@^4.0.1: parse-json "^4.0.0" pify "^3.0.0" +readable-stream@1.1.x: + version "1.1.14" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@2, readable-stream@^2.0.0, readable-stream@^2.3.5, readable-stream@~2.3.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +"readable-stream@2 || 3", readable-stream@^3.0.2, readable-stream@^3.1.1, readable-stream@^3.4.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +regexp.prototype.flags@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz#7aba89b3c13a64509dabcf3ca8d9fbb9bdf5cb75" + integrity sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + regexpp@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" @@ -1516,6 +2714,14 @@ restore-cursor@^3.1.0: onetime "^5.1.0" signal-exit "^3.0.2" +retry-request@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/retry-request/-/retry-request-4.1.1.tgz#f676d0db0de7a6f122c048626ce7ce12101d2bd8" + integrity sha512-BINDzVtLI2BDukjWmjAIRZ0oglnCAkpP2vQjM3jdLhmT62h0xnQgciPwBRDAvHqpkPT2Wo1XuUyLyn6nbGrZQQ== + dependencies: + debug "^4.1.1" + through2 "^3.0.1" + rimraf@2.6.3, rimraf@~2.6.2: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" @@ -1528,26 +2734,31 @@ rootpath@^0.1.2: resolved "https://registry.yarnpkg.com/rootpath/-/rootpath-0.1.2.tgz#5b379a87dca906e9b91d690a599439bef267ea6b" integrity sha1-Wzeah9ypBum5HWkKWZQ5vvJn6ms= -run-async@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" - integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= - dependencies: - is-promise "^2.1.0" +run-async@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== -rxjs@^6.4.0, rxjs@^6.5.2: +rxjs@^6.5.2: version "6.5.3" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.3.tgz#510e26317f4db91a7eb1de77d9dd9ba0a4899a3a" integrity sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA== dependencies: tslib "^1.9.0" -safe-buffer@5.1.2, safe-buffer@~5.1.1: +rxjs@^6.6.0: + version "6.6.0" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.0.tgz#af2901eedf02e3a83ffa7f886240ff9018bbec84" + integrity sha512-3HMA8z/Oz61DUHe+SdOiQyzIf4tOx5oQHmMir7IZEu6TMqCLHT4LRcmNaUS0NwOz8VLvmmBduMsoaUvMaIiqzg== + dependencies: + tslib "^1.9.0" + +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@^5.0.1: +safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@~5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== @@ -1567,7 +2778,7 @@ scmp@^2.1.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@^6.1.2: +semver@^6.0.0, semver@^6.1.2, semver@^6.2.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== @@ -1623,6 +2834,14 @@ shebang-regex@^1.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= +side-channel@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.2.tgz#df5d1abadb4e4bf4af1cd8852bf132d2f7876947" + integrity sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA== + dependencies: + es-abstract "^1.17.0-next.1" + object-inspect "^1.7.0" + signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" @@ -1637,6 +2856,32 @@ slice-ansi@^2.1.0: astral-regex "^1.0.0" is-fullwidth-code-point "^2.0.0" +smart-buffer@^1.0.13: + version "1.1.15" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-1.1.15.tgz#7f114b5b65fab3e2a35aa775bb12f0d1c649bf16" + integrity sha1-fxFLW2X6s+KjWqd1uxLw0cZJvxY= + +snakeize@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/snakeize/-/snakeize-0.1.0.tgz#10c088d8b58eb076b3229bb5a04e232ce126422d" + integrity sha1-EMCI2LWOsHazIpu1oE4jLOEmQi0= + +socks-proxy-agent@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-3.0.1.tgz#2eae7cf8e2a82d34565761539a7f9718c5617659" + integrity sha512-ZwEDymm204mTzvdqyUqOdovVr2YRd2NYskrYrF2LXyZ9qDiMAoFESGK8CRphiO7rtbo2Y757k2Nia3x2hGtalA== + dependencies: + agent-base "^4.1.0" + socks "^1.1.10" + +socks@^1.1.10: + version "1.1.10" + resolved "https://registry.yarnpkg.com/socks/-/socks-1.1.10.tgz#5b8b7fc7c8f341c53ed056e929b7bf4de8ba7b5a" + integrity sha1-W4t/x8jzQcU+0FbpKbe/Tei6e1o= + dependencies: + ip "^1.1.4" + smart-buffer "^1.0.13" + source-map-explorer@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/source-map-explorer/-/source-map-explorer-2.4.2.tgz#fb23f86c3112eacde5683f24efaf4ddc9f677985" @@ -1655,7 +2900,7 @@ source-map-explorer@^2.4.2: temp "^0.9.1" yargs "^15.3.1" -source-map@^0.6.1: +source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== @@ -1706,6 +2951,23 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= +stream-events@^1.0.1, stream-events@^1.0.4, stream-events@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/stream-events/-/stream-events-1.0.5.tgz#bbc898ec4df33a4902d892333d47da9bf1c406d5" + integrity sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg== + dependencies: + stubs "^3.0.0" + +stream-shift@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" + integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== + +streamsearch@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a" + integrity sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo= + string-width@^3.0.0, string-width@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" @@ -1724,6 +2986,59 @@ string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" +string.prototype.trimend@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" + integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + +string.prototype.trimleft@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz#4408aa2e5d6ddd0c9a80739b087fbc067c03b3cc" + integrity sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + string.prototype.trimstart "^1.0.0" + +string.prototype.trimright@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz#c76f1cef30f21bbad8afeb8db1511496cfb0f2a3" + integrity sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + string.prototype.trimend "^1.0.0" + +string.prototype.trimstart@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" + integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" @@ -1739,9 +3054,46 @@ strip-ansi@^6.0.0: ansi-regex "^5.0.0" strip-json-comments@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" - integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +stripe@^8.70.0: + version "8.70.0" + resolved "https://registry.yarnpkg.com/stripe/-/stripe-8.70.0.tgz#0efbebad10ce29ccf3b520da0b3fbc568ea1706e" + integrity sha512-R+ZoUTjtUSc6ufVKG3btZMdVU6KKU5yX+QHjy76CLIIo8zuIq2JUOewNOPMxfSTt8cv+NEaBtsM2DmPxoZPlQA== + dependencies: + "@types/node" ">=8.1.0" + qs "^6.6.0" + +stubs@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/stubs/-/stubs-3.0.0.tgz#e8d2ba1fa9c90570303c030b6900f7d5f89abe5b" + integrity sha1-6NK6H6nJBXAwPAMLaQD31fiavls= + +superagent-proxy@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/superagent-proxy/-/superagent-proxy-1.0.3.tgz#acfa776672f11c24a90ad575e855def8be44f741" + integrity sha512-79Ujg1lRL2ICfuHUdX+H2MjIw73kB7bXsIkxLwHURz3j0XUmEEEoJ+u/wq+mKwna21Uejsm2cGR3OESA00TIjA== + dependencies: + debug "^3.1.0" + proxy-agent "2" + +superagent@^3.5.2: + version "3.8.3" + resolved "https://registry.yarnpkg.com/superagent/-/superagent-3.8.3.tgz#460ea0dbdb7d5b11bc4f78deba565f86a178e128" + integrity sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA== + dependencies: + component-emitter "^1.2.0" + cookiejar "^2.1.0" + debug "^3.1.0" + extend "^3.0.0" + form-data "^2.3.1" + formidable "^1.2.0" + methods "^1.1.1" + mime "^1.4.1" + qs "^6.5.1" + readable-stream "^2.3.5" supports-color@^5.3.0: version "5.5.0" @@ -1774,6 +3126,17 @@ table@^5.2.3: slice-ansi "^2.1.0" string-width "^3.0.0" +teeny-request@^6.0.0: + version "6.0.3" + resolved "https://registry.yarnpkg.com/teeny-request/-/teeny-request-6.0.3.tgz#b617f9d5b7ba95c76a3f257f6ba2342b70228b1f" + integrity sha512-TZG/dfd2r6yeji19es1cUIwAlVD8y+/svB1kAC2Y0bjEyysrfbO8EZvJBRwIE6WkwmUoB7uvWLwTIhJbMXZ1Dw== + dependencies: + http-proxy-agent "^4.0.0" + https-proxy-agent "^5.0.0" + node-fetch "^2.2.0" + stream-events "^1.0.5" + uuid "^7.0.0" + temp@^0.9.1: version "0.9.1" resolved "https://registry.yarnpkg.com/temp/-/temp-0.9.1.tgz#2d666114fafa26966cd4065996d7ceedd4dd4697" @@ -1786,11 +3149,31 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= +through2@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +through2@^3.0.0, through2@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.1.tgz#39276e713c3302edf9e388dd9c812dd3b825bd5a" + integrity sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww== + dependencies: + readable-stream "2 || 3" + through@^2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= +thunkify@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/thunkify/-/thunkify-2.1.2.tgz#faa0e9d230c51acc95ca13a361ac05ca7e04553d" + integrity sha1-+qDp0jDFGsyVyhOjYawFyn4EVT0= + tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -1808,23 +3191,28 @@ tree-kill@^1.2.2: resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== +tslib@1.11.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35" + integrity sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA== + tslib@^1.9.0: version "1.10.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== -twilio@^3.41.1: - version "3.41.1" - resolved "https://registry.yarnpkg.com/twilio/-/twilio-3.41.1.tgz#653f2daccad7fe3ac0362acd1a1347e690dd9795" - integrity sha512-YOAuQtb3xELQJDcL+G6ffDRrZeJSlFRph5peudFYcEa9Or5R0x+r8lShXlYl7yP8w7atCWxETSeySLuStEpvhg== +twilio@^3.48.0: + version "3.48.0" + resolved "https://registry.yarnpkg.com/twilio/-/twilio-3.48.0.tgz#af387f46b12f8b823770fe043071e55ab61fb1b2" + integrity sha512-FDPCze9PxPF88pULND7ZfaVkZtAGh8i0Xo1ZpuW6aOzd4SRGplJBZSrx4IiH1q56di+yKQ6ABw2uXb5rRH+rbQ== dependencies: - "@types/express" "^4.17.3" + "@types/express" "^4.17.7" axios "^0.19.2" - dayjs "^1.8.21" + dayjs "^1.8.29" jsonwebtoken "^8.5.1" - lodash "^4.17.15" + lodash "^4.17.19" q "2.0.x" - qs "^6.9.1" + qs "^6.9.4" rootpath "^0.1.2" scmp "^2.1.0" url-parse "^1.4.7" @@ -1837,6 +3225,11 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" +type-fest@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" + integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== + type-fest@^0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" @@ -1850,6 +3243,18 @@ type-is@~1.6.17, type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + uglify-js@^3.1.4: version "3.9.1" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.9.1.tgz#a56a71c8caa2d36b5556cc1fd57df01ae3491539" @@ -1857,6 +3262,13 @@ uglify-js@^3.1.4: dependencies: commander "~2.20.3" +unique-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" + integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== + dependencies: + crypto-random-string "^2.0.0" + unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" @@ -1877,11 +3289,21 @@ url-parse@^1.4.7: querystringify "^2.1.1" requires-port "^1.0.0" +util-deprecate@^1.0.1, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= +uuid@^7.0.0: + version "7.0.3" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.3.tgz#c5c9f2c8cf25dc0a372c4df1441c41f5bd0c680b" + integrity sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg== + v8-compile-cache@^2.0.3: version "2.1.0" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e" @@ -1900,21 +3322,68 @@ vary@^1, vary@~1.1.2: resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= +walkdir@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/walkdir/-/walkdir-0.4.1.tgz#dc119f83f4421df52e3061e514228a2db20afa39" + integrity sha512-3eBwRyEln6E1MSzcxcVpQIhRG8Q1jLvEqRmCZqS3dsfXEDR/AhOF4d+jHg1qvDCpYaVRZjENPQyrVxAkQqxPgQ== + weak-map@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/weak-map/-/weak-map-1.0.5.tgz#79691584d98607f5070bd3b70a40e6bb22e401eb" integrity sha1-eWkVhNmGB/UHC9O3CkDmuyLkAes= -whatwg-fetch@2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" - integrity sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng== +websocket-driver@>=0.5.1: + version "0.7.3" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.3.tgz#a2d4e0d4f4f116f1e6297eba58b05d430100e9f9" + integrity sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg== + dependencies: + http-parser-js ">=0.4.0 <0.4.11" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" + integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg== + +which-boxed-primitive@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.1.tgz#cbe8f838ebe91ba2471bb69e9edbda67ab5a5ec1" + integrity sha512-7BT4TwISdDGBgaemWU0N0OU7FeAEJ9Oo2P1PHRm/FCWoEi2VLWC9b6xvxAA3C/NMpxg3HXVgi0sMmGbNUbNepQ== + dependencies: + is-bigint "^1.0.0" + is-boolean-object "^1.0.0" + is-number-object "^1.0.3" + is-string "^1.0.4" + is-symbol "^1.0.2" + +which-collection@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" + integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== + dependencies: + is-map "^2.0.1" + is-set "^2.0.1" + is-weakmap "^2.0.1" + is-weakset "^2.0.1" which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= +which-typed-array@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.2.tgz#e5f98e56bda93e3dac196b01d47c1156679c00b2" + integrity sha512-KT6okrd1tE6JdZAy3o2VhMoYPh3+J6EMZLyrxBQsZflI1QCZIxMrIYLkosd8Twf+YfknVIHmYQPgJt238p8dnQ== + dependencies: + available-typed-arrays "^1.0.2" + es-abstract "^1.17.5" + foreach "^2.0.5" + function-bind "^1.1.1" + has-symbols "^1.0.1" + is-typed-array "^1.1.3" + which@^1.2.9: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" @@ -1955,6 +3424,16 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= +write-file-atomic@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + write@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" @@ -1962,16 +3441,46 @@ write@1.0.3: dependencies: mkdirp "^0.5.1" +xdg-basedir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" + integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== + xmlbuilder@^13.0.2: version "13.0.2" resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-13.0.2.tgz#02ae33614b6a047d1c32b5389c1fdacb2bce47a7" integrity sha512-Eux0i2QdDYKbdbA6AM6xE4m6ZTZr4G4xF9kahI2ukSEMCzwce2eX9WlTI5J3s+NU7hpasFsr8hWIONae7LluAQ== +xmlbuilder@^15.1.1: + version "15.1.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-15.1.1.tgz#9dcdce49eea66d8d10b42cae94a79c3c8d0c2ec5" + integrity sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg== + +xregexp@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943" + integrity sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM= + +xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + y18n@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + yargs-parser@^13.1.1: version "13.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0"