diff --git a/.ebextensions/00_cleanup.config b/.ebextensions/00_cleanup.config new file mode 100644 index 000000000..ede6b116b --- /dev/null +++ b/.ebextensions/00_cleanup.config @@ -0,0 +1,5 @@ +commands: + 10_cleanup: + command: | + sudo rm -f /opt/elasticbeanstalk/hooks/configdeploy/post/* + sudo rm -f /etc/nginx/conf.d/* \ No newline at end of file diff --git a/.ebextensions/01_setup.config b/.ebextensions/01_setup.config new file mode 100644 index 000000000..e3214f8fe --- /dev/null +++ b/.ebextensions/01_setup.config @@ -0,0 +1,13 @@ +Resources: + sslSecurityGroupIngress: + Type: AWS::EC2::SecurityGroupIngress + Properties: + GroupId: {"Fn::GetAtt" : ["AWSEBSecurityGroup", "GroupId"]} + IpProtocol: tcp + ToPort: 443 + FromPort: 443 + CidrIp: 0.0.0.0/0 + +packages: + yum: + epel-release: [] \ No newline at end of file diff --git a/.ebextensions/02_nginx.config b/.ebextensions/02_nginx.config new file mode 100644 index 000000000..b93ea16e5 --- /dev/null +++ b/.ebextensions/02_nginx.config @@ -0,0 +1,105 @@ +files: + "/etc/nginx/nginx.pre": + mode: "000644" + owner: root + group: root + content: | + user nginx; + worker_processes auto; + error_log /var/log/nginx/error.log; + pid /var/run/nginx.pid; + + events { + worker_connections 1024; + } + + http { + port_in_redirect off; + default_type application/octet-stream; + + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for"'; + + log_format healthd '$msec"$uri"$status"$request_time"$upstream_response_time"$http_x_forwarded_for'; + + access_log /var/log/nginx/access.log main; + sendfile on; + keepalive_timeout 65; + + include /etc/nginx/mime.types; + include /etc/nginx/conf.d/*.conf; + } + + "/etc/nginx/conf.d/http_custom.conf": + mode: "000644" + owner: root + group: root + content: | + server { + listen 8080; + + location ~ /.well-known/ { + root /var/www/letsencrypt/; + } + + location / { + return 301 https://$host$request_uri; + } + } + + "/etc/nginx/conf.d/https_custom.pre": + mode: "000644" + owner: root + group: root + content: | + upstream nodejs { + server 127.0.0.1:5000; + keepalive 256; + } + server { + listen 443 ssl default; + server_name localhost; + error_page 497 https://$host$request_uri; + + if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})T(\d{2})") { + set $year $1; + set $month $2; + set $day $3; + set $hour $4; + } + + access_log /var/log/nginx/healthd/application.log.$year-$month-$day-$hour healthd; + access_log /var/log/nginx/access.log main; + + location / { + proxy_pass http://nodejs; + proxy_set_header Connection ""; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "Upgrade"; + } + + gzip on; + gzip_comp_level 4; + gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript; + + ssl_certificate /etc/letsencrypt/live/ebcert/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/ebcert/privkey.pem; + ssl_session_timeout 5m; + ssl_protocols TLSv1.1 TLSv1.2; + ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH"; + ssl_prefer_server_ciphers on; + + if ($host ~* ^www\.(.*)) { + set $host_without_www $1; + rewrite ^(.*) https://$host_without_www$1 permanent; + } + + if ($ssl_protocol = "") { + rewrite ^ https://$host$request_uri? permanent; + } + } \ No newline at end of file diff --git a/.ebextensions/03_container_commands.config b/.ebextensions/03_container_commands.config new file mode 100644 index 000000000..ef2b69451 --- /dev/null +++ b/.ebextensions/03_container_commands.config @@ -0,0 +1,45 @@ +container_commands: + 10_setup_nginx: + command: | + sudo rm -f /tmp/deployment/config/#etc#nginx#conf.d#00_elastic_beanstalk_proxy.conf + sudo rm -f /etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf + + sudo rm -f /tmp/deployment/config/#etc#nginx#nginx.conf + sudo rm -f /etc/nginx/nginx.conf + + sudo mv /etc/nginx/nginx.pre /etc/nginx/nginx.conf + + sudo service nginx stop + sudo service nginx start + 20_install_certbot: + command: | + wget https://dl.eff.org/certbot-auto + mv certbot-auto /usr/local/bin/certbot-auto + chown root /usr/local/bin/certbot-auto + chmod 0755 /usr/local/bin/certbot-auto + 30_create_webroot_path: + command: | + sudo rm -rf /var/www/letsencrypt/ + sudo mkdir /var/www/letsencrypt/ + 40_configure_cert: + command: | + certbot_command="/usr/local/bin/certbot-auto certonly --webroot --webroot-path /var/www/letsencrypt --debug --non-interactive --email ${LETSENCRYPT_EMAIL} --agree-tos --expand --keep-until-expiring" + for domain in $(echo ${LETSENCRYPT_DOMAIN} | sed "s/,/ /g") + do + certbot_command="$certbot_command --domains $domain" + done + eval $certbot_command + 50_link_cert: + command: | + domain="$( cut -d ',' -f 1 <<< "${LETSENCRYPT_DOMAIN}" )"; + if [ -d /etc/letsencrypt/live ]; then + domain_folder_name="$(ls /etc/letsencrypt/live | sort -n | grep $domain | head -1)"; + if [ -d /etc/letsencrypt/live/${domain_folder_name} ]; then + ln -sfn /etc/letsencrypt/live/${domain_folder_name} /etc/letsencrypt/live/ebcert + fi + fi + 60_enable_https_config: + command: | + sudo mv /etc/nginx/conf.d/https_custom.pre /etc/nginx/conf.d/https_custom.conf + sudo service nginx stop + sudo service nginx start \ No newline at end of file diff --git a/.ebextensions/04_configdeploy_post_hooks.config b/.ebextensions/04_configdeploy_post_hooks.config new file mode 100644 index 000000000..1574f6ee3 --- /dev/null +++ b/.ebextensions/04_configdeploy_post_hooks.config @@ -0,0 +1,11 @@ +files: + # Elastic Beanstalk recreates the default configuration during every configuration deployment + "/opt/elasticbeanstalk/hooks/configdeploy/post/99_kill_default_nginx.sh": + mode: "000755" + owner: root + group: root + content: | + #!/bin/bash -xe + rm -f /etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf + service nginx stop + service nginx start \ No newline at end of file diff --git a/.ebextensions/05_cron.config b/.ebextensions/05_cron.config new file mode 100644 index 000000000..1c049b8ed --- /dev/null +++ b/.ebextensions/05_cron.config @@ -0,0 +1,8 @@ +files: + # Cron to renew cert + "/etc/cron.d/certbot_renew": + mode: "000644" + owner: root + group: root + content: | + @weekly root /usr/local/bin/certbot-auto renew \ No newline at end of file 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..d210fc9d2 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -1,13 +1,20 @@ { - "version": "0.2.0", - "configurations": [ - { - "name": "Chrome", - "type": "chrome", - "request": "launch", - "url": "http://localhost:3000", - "webRoot": "${workspaceRoot}/src" + "version": "0.2.0", + "configurations": [ + { + "name": "Attach to Chrome", + "port": 9222, + "request": "attach", + "type": "pwa-chrome", + "webRoot": "${workspaceFolder}/client/src" + }, - } - ] -} \ No newline at end of file + { + "name": "Chrome", + "type": "chrome", + "request": "launch", + "url": "http://localhost:3000", + "webRoot": "${workspaceRoot}/client/src" + } + ] +} diff --git a/README.MD b/README.MD index 33dfc36b0..6a6325ba6 100644 --- a/README.MD +++ b/README.MD @@ -1,7 +1,8 @@ React App: Yarn Dependency Management: -To force upgrades for some packages: yarn upgrade-interactive --latest +To force upgrades for some packages: +yarn upgrade-interactive --latest GraphQL API: Hasura is hosted on another dyno. Several environmental variables are required, including disabling the console. @@ -12,3 +13,13 @@ 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 + +cd client && yarn build && cd build && scp -r ** imex@prod-tor1.imex.online:~/bodyshop/client/build && cd .. &&cd .. \ No newline at end of file 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..292b14a4e --- /dev/null +++ b/admin/package.json @@ -0,0 +1,46 @@ +{ + "name": "admin", + "version": "0.1.0", + "private": true, + "dependencies": { + "@apollo/client": "^3.1.2", + "@testing-library/jest-dom": "^5.11.2", + "@testing-library/react": "^10.4.8", + "@testing-library/user-event": "^12.1.0", + "@types/prop-types": "^15.7.3", + "apollo-boost": "^0.4.9", + "apollo-link-context": "^1.0.20", + "apollo-link-logger": "^1.2.3", + "dotenv": "^8.2.0", + "firebase": "^7.17.1", + "graphql": "^15.3.0", + "prop-types": "^15.7.2", + "ra-data-hasura-graphql": "^0.1.12", + "react": "^16.13.1", + "react-admin": "^3.7.2", + "react-dom": "^16.13.1", + "react-icons": "^3.10.0", + "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..823ad9b7f --- /dev/null +++ b/admin/src/components/admin-root/admin-root.component.jsx @@ -0,0 +1,277 @@ +import { ApolloClient, ApolloProvider, InMemoryCache } 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 { FaFileInvoiceDollar } from "react-icons/fa"; +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..2adf29d50 --- /dev/null +++ b/admin/src/components/auth-provider/auth-provider.js @@ -0,0 +1,39 @@ +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); + 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) => { + const user = await getCurrentUser(); + if (!!user) { + return Promise.resolve(); + } else { + return Promise.reject(); + } + }, + checkError: (error) => { + return Promise.resolve(); + }, + getPermissions: (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..1935605a8 --- /dev/null +++ b/admin/src/components/joblines/joblines.edit.jsx @@ -0,0 +1,70 @@ +import React from "react"; +import { + BooleanInput, + DateField, + Edit, + NumberInput, + SimpleForm, + TextInput, +} from "react-admin"; + +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..ae2ec888f --- /dev/null +++ b/admin/src/components/jobs/jobs.edit.jsx @@ -0,0 +1,343 @@ +import React from "react"; +//@ts-ignore +import { + AutocompleteInput, + Edit, + FormTab, + NumberInput, + ReferenceInput, + SelectInput, + TabbedForm, + TextInput, +} from "react-admin"; + +const JobsEdit = (props) => ( + + + +
+ + + +
+
+ +
+ + + + + + + choice.ownr_fn && + choice.ownr_fn.toLowerCase().includes(filter.toLowerCase()) + } + optionText={(record) => + `${record.ownr_fn || ""} ${record.ownr_ln || ""} ${ + record.ownr_co_nm || "" + } (${record.ownr_ph1 || ""})` + } + /> + + + + + + + + + + + choice.ownr_fn && + choice.ownr_fn.toLowerCase().includes(filter.toLowerCase()) + } + optionText={(record) => + `${record.ownr_fn || ""} ${record.ownr_ln || ""} ${ + record.ownr_co_nm || "" + } (${record.ownr_ph1 || ""})` + } + /> + + + + + + +
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+); + +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..445db9d59 --- /dev/null +++ b/admin/src/components/jobs/jobs.show.jsx @@ -0,0 +1,281 @@ +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..92715c253 --- /dev/null +++ b/admin/yarn.lock @@ -0,0 +1,12271 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@apollo/client@^3.1.2": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.1.2.tgz#e384f691706c46aef4d9234b63a03ccc06e9c33c" + integrity sha512-GaA/J0CDSSNe0HVm1abeOIJA3M4fs9Ih7wF2z1AI2SLqv5TBLvwBxh0+0+jCSntPZ3gnDQvR7MHjmXota5V1LQ== + dependencies: + "@types/zen-observable" "^0.8.0" + "@wry/context" "^0.5.2" + "@wry/equality" "^0.2.0" + fast-json-stable-stringify "^2.0.0" + graphql-tag "^2.11.0" + 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.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/runtime@^7.9.2": + version "7.11.2" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.11.2.tgz#f549c13c754cc40b87644b9fa9f09a6a95fe0736" + integrity sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw== + 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.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@firebase/analytics/-/analytics-0.4.1.tgz#0f1e6f4e56af11c3956b1652520095a1fbd2c418" + integrity sha512-y5ZuhqX/PwLi0t7AKxNAi3NnlEwXe0rpknulUWUg3/1dALqtd2RrAOATQoV5FNnKK6YUH5UmK0Jb9KcSjsFeNw== + dependencies: + "@firebase/analytics-types" "0.3.1" + "@firebase/component" "0.1.17" + "@firebase/installations" "0.4.15" + "@firebase/logger" "0.2.6" + "@firebase/util" "0.3.0" + 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.9": + version "0.6.9" + resolved "https://registry.yarnpkg.com/@firebase/app/-/app-0.6.9.tgz#e60412d9b6012afb73caef2a1353e1b4c4182954" + integrity sha512-X2riRgK49IK8LCQ3j7BKLu3zqHDTJSaT6YgcLewtHuOVwtpHfGODiS1cL5VMvKm3ogxP84GA70tN3sdoL/vTog== + dependencies: + "@firebase/app-types" "0.6.1" + "@firebase/component" "0.1.17" + "@firebase/logger" "0.2.6" + "@firebase/util" "0.3.0" + 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.17": + version "0.1.17" + resolved "https://registry.yarnpkg.com/@firebase/component/-/component-0.1.17.tgz#2ce3e1aa060eccf0f06d20368ef9a32cf07c07be" + integrity sha512-/tN5iLcFp9rdpTfCJPfQ/o2ziGHlDxOzNx6XD2FoHlu4pG/PPGu+59iRfQXIowBGhxcTGD/l7oJhZEY/PVg0KQ== + dependencies: + "@firebase/util" "0.3.0" + 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.9": + version "0.6.9" + resolved "https://registry.yarnpkg.com/@firebase/database/-/database-0.6.9.tgz#18a4bdc93b0b10c19a8ad4ff616bba196e5a16e0" + integrity sha512-+X2dNFDpcLEcDRdXp2Hgkf0RnNz3AOIC+Y7UFMQYadm9buB+snXomlnlkMzOj6o+Cp3V7GnpBrKKeeFqzF6wGQ== + dependencies: + "@firebase/auth-interop-types" "0.1.5" + "@firebase/component" "0.1.17" + "@firebase/database-types" "0.5.1" + "@firebase/logger" "0.2.6" + "@firebase/util" "0.3.0" + 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.2": + version "1.16.2" + resolved "https://registry.yarnpkg.com/@firebase/firestore/-/firestore-1.16.2.tgz#66eedeefab569331efc1ad9ab49a8f1c867a9163" + integrity sha512-iIkAL860oD/QA1uYI9JBbWqBYFWd+DnuSj//BIbOGn3DNAruDFy07g8re1vn+0MMas9bMk6CZATJNCFPeH8AsQ== + dependencies: + "@firebase/component" "0.1.17" + "@firebase/firestore-types" "1.12.0" + "@firebase/logger" "0.2.6" + "@firebase/util" "0.3.0" + "@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.49": + version "0.4.49" + resolved "https://registry.yarnpkg.com/@firebase/functions/-/functions-0.4.49.tgz#cca60a2f8e188e020c7e5a5ecf075474885ffb03" + integrity sha512-ma3+z1wMKervmEJCLWxwIjbSV+n3/BTfFPSZdTjt18Wgiso5q4BzEObFkorxaXZiyT3KpZ0qOO97lgcoth2hIA== + dependencies: + "@firebase/component" "0.1.17" + "@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.15": + version "0.4.15" + resolved "https://registry.yarnpkg.com/@firebase/installations/-/installations-0.4.15.tgz#ec5a098aea6b5e3e29e73270eeaaf9791587d20a" + integrity sha512-6uGgDocDGu5gI7FeDBDcLaH4npz0cm2f0kctOFK+5N1CyK8Tv2YGv5/uGqlrTtSwDW+8tgKNo/5XXJJOPr9Jsw== + dependencies: + "@firebase/component" "0.1.17" + "@firebase/installations-types" "0.3.4" + "@firebase/util" "0.3.0" + 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.21": + version "0.6.21" + resolved "https://registry.yarnpkg.com/@firebase/messaging/-/messaging-0.6.21.tgz#d301de72ad055c3f302b917b8a11373cd78c7431" + integrity sha512-cunbFNCtUy25Zp4/jn5lenYUPqgHpjKNUwRjKc7vIzYb4IT2Vu/7kaEptO3K0KQBC6O0QV3ZtqQxKrI9aLiSHg== + dependencies: + "@firebase/component" "0.1.17" + "@firebase/installations" "0.4.15" + "@firebase/messaging-types" "0.4.5" + "@firebase/util" "0.3.0" + 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.10": + version "0.3.10" + resolved "https://registry.yarnpkg.com/@firebase/performance/-/performance-0.3.10.tgz#b68336e23f4b5422bd67f6ce35e28293a6b8945e" + integrity sha512-j/hsx2xfOO1hZulmz7KxemoTIVXxrv94rt79x8qO1HzysT7ziViNvQ9cQGjDZWwVSO29TpLH31GOWLVnwmnxWQ== + dependencies: + "@firebase/component" "0.1.17" + "@firebase/installations" "0.4.15" + "@firebase/logger" "0.2.6" + "@firebase/performance-types" "0.0.13" + "@firebase/util" "0.3.0" + 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.26": + version "0.1.26" + resolved "https://registry.yarnpkg.com/@firebase/remote-config/-/remote-config-0.1.26.tgz#62f448237bc46b986c27ac623b5cc5852007ea05" + integrity sha512-B6+nARVNcswysd6C16nK5tdGECgEpr1wdH6LyqylEQ8hUxYWN18qe49b9uPu+ktaHq0gFLg03gayZvQs7fxJOg== + dependencies: + "@firebase/component" "0.1.17" + "@firebase/installations" "0.4.15" + "@firebase/logger" "0.2.6" + "@firebase/remote-config-types" "0.1.9" + "@firebase/util" "0.3.0" + 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.41": + version "0.3.41" + resolved "https://registry.yarnpkg.com/@firebase/storage/-/storage-0.3.41.tgz#cba8946f980d70e68d52cfb110ad109592a645d0" + integrity sha512-2imzI78HcB7FjUqXMRHsGLlZnTYkaCHBjJflSbypwLrEty0hreR6vx3ThOO5y0MFH93WwifqUFJAa+Twkx6CIA== + dependencies: + "@firebase/component" "0.1.17" + "@firebase/storage-types" "0.3.13" + "@firebase/util" "0.3.0" + tslib "^1.11.1" + +"@firebase/util@0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@firebase/util/-/util-0.3.0.tgz#c3e938192cde4e1c6260aecaaf22103add2352f5" + integrity sha512-GTwC+FSLeCPc44/TXCDReNQ5FPRIS5cb8Gr1XcD1TgiNBOvmyx61Om2YLwHp2GnN++6m6xmwmXARm06HOukATA== + 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@^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@^7.17.1": + version "7.21.8" + resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-7.21.8.tgz#b64b266264bff9135eba3b5c6d4ddc995a3371e6" + integrity sha512-iK1rJubFoeD5gxCryokwh09tnJa1Y4doNDbNFYYqOqz6ELwB1+kEAwlezA5xwMi8QrK7xg+1/aBMzb9X/A/EmA== + 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/jest-dom@^5.11.2": + version "5.11.2" + resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-5.11.2.tgz#c49de331555c70127b5d7fc97344ad5265f4c54c" + integrity sha512-s+rWJx+lanEGKqvOl4qJR0rGjCrxsEjj9qjxFlg4NV4/FRD7fnUUAWPHqwpyafNHfLYArs58FADgdn4UKmjFmw== + dependencies: + "@babel/runtime" "^7.9.2" + "@types/testing-library__jest-dom" "^5.9.1" + aria-query "^4.2.2" + chalk "^3.0.0" + css "^3.0.0" + css.escape "^1.5.1" + jest-diff "^25.1.0" + jest-matcher-utils "^25.1.0" + lodash "^4.17.15" + redent "^3.0.0" + +"@testing-library/react@^10.4.8": + version "10.4.8" + resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-10.4.8.tgz#5eb730291b8fd81cdb2d8877770d060b044ae4a4" + integrity sha512-clgpFR6QHiRRcdhFfAKDhH8UXpNASyfkkANhtCsCVBnai+O+mK1rGtMES+Apc7ql5Wyxu7j8dcLiC4pV5VblHA== + dependencies: + "@babel/runtime" "^7.10.3" + "@testing-library/dom" "^7.17.1" + +"@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/user-event@^12.1.0": + version "12.1.0" + resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-12.1.0.tgz#a2597419466a93e338c91baa7bb22d4da0309d1d" + integrity sha512-aH/XuNFpPD6dA+fh754EGqKeAzpH66HpLJYkv9vOAih2yGmTM8JiZ8uisQDGWRPkc6sxE2zCqDwLR4ZskhRCxw== + dependencies: + "@babel/runtime" "^7.10.2" + +"@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/jest@*": + version "26.0.8" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.8.tgz#f5c5559cf25911ce227f7ce30f1f160f24966369" + integrity sha512-eo3VX9jGASSuv680D4VQ89UmuLZneNxv2MCZjfwlInav05zXVJTzfc//lavdV0GPwSxsXJTy2jALscB7Acqg0g== + dependencies: + jest-diff "^25.2.1" + pretty-format "^25.2.1" + +"@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@*", "@types/prop-types@^15.7.3": + 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-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__jest-dom@^5.9.1": + version "5.9.2" + resolved "https://registry.yarnpkg.com/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.9.2.tgz#59e4771a1cf87d51e89a5cc8195cd3b647cba322" + integrity sha512-K7nUSpH/5i8i0NagTJ+uFUDRueDlnMNhJtMjMwTGPPSqyImbWC/hgKPDCKt6Phu2iMJg2kWqlax+Ucj2DKMwpA== + dependencies: + "@types/jest" "*" + +"@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": + 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" + +"@wry/equality@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.2.0.tgz#a312d1b6a682d0909904c2bcd355b02303104fb7" + integrity sha512-Y4d+WH6hs+KZJUC8YKLYGarjGekBrhslDbf/R20oV+AakHPINSitHfDRQz3EGcEWc1luXYNUvMhawWtZVWNGvQ== + 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.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: + 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" + +css@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/css/-/css-3.0.0.tgz#4447a4d58fdd03367c516ca9f64ae365cee4aa5d" + integrity sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ== + dependencies: + inherits "^2.0.4" + source-map "^0.6.1" + source-map-resolve "^0.6.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== + +diff-sequences@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-25.2.6.tgz#5f467c00edd35352b7bca46d7927d60e687a76dd" + integrity sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg== + +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.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.1: + version "7.17.1" + resolved "https://registry.yarnpkg.com/firebase/-/firebase-7.17.1.tgz#6b2566d91a820a7993e3d2c75435f8baaabb58bb" + integrity sha512-g2Wkk2fz8VoeSrxv2PIQizm2j74EtbpxQ+wd2AvH2iEF5LRaJOsk3zVBtIlyJIQ3vGTmlutIxtyyoDAQcPO9TA== + dependencies: + "@firebase/analytics" "0.4.1" + "@firebase/app" "0.6.9" + "@firebase/app-types" "0.6.1" + "@firebase/auth" "0.14.9" + "@firebase/database" "0.6.9" + "@firebase/firestore" "1.16.2" + "@firebase/functions" "0.4.49" + "@firebase/installations" "0.4.15" + "@firebase/messaging" "0.6.21" + "@firebase/performance" "0.3.10" + "@firebase/polyfill" "0.3.36" + "@firebase/remote-config" "0.1.26" + "@firebase/storage" "0.3.41" + "@firebase/util" "0.3.0" + +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.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-tag@^2.11.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.11.0.tgz#1deb53a01c46a7eb401d6cb59dec86fa1cccbffd" + integrity sha512-VmsD5pJqWJnQZMUeRwrDhfgoyqcfwEkvtpANqcoUG8/tOLkwNgU9mzub/Mc78OJMhHjx7gfAMTxzdG43VGg3bA== + +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.4, 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.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-diff@^25.1.0, jest-diff@^25.2.1, jest-diff@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-25.5.0.tgz#1dd26ed64f96667c068cef026b677dfa01afcfa9" + integrity sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A== + dependencies: + chalk "^3.0.0" + diff-sequences "^25.2.6" + jest-get-type "^25.2.6" + pretty-format "^25.5.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-get-type@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-25.2.6.tgz#0b0a32fab8908b44d508be81681487dbabb8d877" + integrity sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig== + +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.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-matcher-utils@^25.1.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-25.5.0.tgz#fbc98a12d730e5d2453d7f1ed4a4d948e34b7867" + integrity sha512-VWI269+9JS5cpndnpCwm7dy7JtGQT30UHfrnM3mXl22gHGt/b7NkjBqXfbhZ8V4B7ANUsjK18PlSBmG0YH7gjw== + dependencies: + chalk "^3.0.0" + jest-diff "^25.5.0" + jest-get-type "^25.2.6" + pretty-format "^25.5.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.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.2.1, 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.2: + version "3.7.2" + resolved "https://registry.yarnpkg.com/ra-core/-/ra-core-3.7.2.tgz#efbc873cfbf840c4c53e9a7317d6fd526bf55b39" + integrity sha512-cm/RGWX9WUoVVTJkdKKhOOx6tG7IOaY9p+YxbFvweau0Gi9sK+i9t687ifrENukW2YCxIeKpyImjKAT7l8BiLA== + 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.2: + version "3.7.2" + resolved "https://registry.yarnpkg.com/ra-i18n-polyglot/-/ra-i18n-polyglot-3.7.2.tgz#66589baf838a24ab71f251b1c41ec75bcc294f1f" + integrity sha512-WFb6tw/lBnmne6BZit3bO0R45jTRBIkbd/8UMNMRBpZn9vFdphF9NShrNuVPLGnxQPBoz0CBRSTEvyKX7HGnTg== + dependencies: + node-polyglot "^2.2.2" + ra-core "^3.7.2" + +ra-language-english@^3.7.2: + version "3.7.2" + resolved "https://registry.yarnpkg.com/ra-language-english/-/ra-language-english-3.7.2.tgz#19a929cba73c03d34aa0586145005a4759cc2c81" + integrity sha512-1TQPTDgJ4gvF6uh7FcJhWqRUmi7P4Mo1Oy5e57BkrFO6M50Fl+e3McrI0grDQlSbn2bcFRNm13tWK/Z+KXdGeQ== + dependencies: + ra-core "^3.7.2" + +ra-ui-materialui@^3.7.2: + version "3.7.2" + resolved "https://registry.yarnpkg.com/ra-ui-materialui/-/ra-ui-materialui-3.7.2.tgz#1afeb943afc1940787e91094f4fbca72cd082f4c" + integrity sha512-dNmgkZ2YDmXMrCRLLhSBBjSzM9B1x5qsSU0C4az2LyDnniphE4UOjkUCSj0DpgzVC4sevZub5H7QnjpIF3LZcQ== + 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.4.1" + 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.2: + version "3.7.2" + resolved "https://registry.yarnpkg.com/react-admin/-/react-admin-3.7.2.tgz#f1c2895c208c06f63bc8f5eb952ad232a225de18" + integrity sha512-VK99I+s1Dd1f4lFCUY3BRdTO6P1c6Yg1r/px0ZbbM6WyJ7+qFRVoXEhDlIB494WEcjZoJKZSDB464fyxePEWtA== + 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.2" + ra-i18n-polyglot "^3.7.2" + ra-language-english "^3.7.2" + ra-ui-materialui "^3.7.2" + 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-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-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.4.0, react-transition-group@^4.4.1: + 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-resolve@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.6.0.tgz#3d9df87e236b53f16d01e58150fc7711138e5ed2" + integrity sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.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== + +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/apollo.config.js b/apollo.config.js deleted file mode 100644 index e949522fb..000000000 --- a/apollo.config.js +++ /dev/null @@ -1,11 +0,0 @@ -module.exports = { - client: { - service: { - name: "Dev", - url: "https://bodyshop-dev-db.herokuapp.com/v1/graphql", - headers: { - "x-hasura-admin-secret": "Dev-BodyShopAppBySnaptSoftware!" - } - } - } -}; diff --git a/bodyshop_translations.babel b/bodyshop_translations.babel index 883a4e1d3..25490894b 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/public/render-styles.css b/client/public/render-styles.css new file mode 100644 index 000000000..a58cf2b3f --- /dev/null +++ b/client/public/render-styles.css @@ -0,0 +1,85 @@ +/* body { + font-family: "Open Sans", sans-serif; + line-height: 1.25; +} */ + +table { + border: 1px solid #ccc; + border-collapse: collapse; + margin: 0; + padding: 0; + width: 100%; + table-layout: fixed; +} + +table caption { + font-size: 1.5em; + margin: 0.5em 0 0.75em; +} + +table tr { + background-color: #f8f8f8; + border: 1px solid #ddd; + padding: 0.35em; +} + +table th, +table td { + padding: 0.625em; + text-align: center; +} + +table th { + font-size: 0.85em; + letter-spacing: 0.1em; + text-transform: uppercase; +} + +@media screen and (max-width: 600px) { + table { + border: 0; + } + + table caption { + font-size: 1.3em; + } + + table thead { + border: none; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; + } + + table tr { + border-bottom: 3px solid #ddd; + display: block; + margin-bottom: 0.625em; + } + + table td { + border-bottom: 1px solid #ddd; + display: block; + font-size: 0.8em; + text-align: right; + } + + table td::before { + /* + * aria-label has no advantage, it won't be read inside a table + content: attr(aria-label); + */ + content: attr(data-label); + float: left; + font-weight: bold; + text-transform: uppercase; + } + + table td:last-child { + border-bottom: 0; + } +} diff --git a/client/src/App/App.container.jsx b/client/src/App/App.container.jsx index 07e338d4f..ca114ff0e 100644 --- a/client/src/App/App.container.jsx +++ b/client/src/App/App.container.jsx @@ -1,4 +1,6 @@ import { ApolloProvider } from "@apollo/react-common"; +import { ConfigProvider } from "antd"; +import enLocale from "antd/es/locale/en_US"; import { ApolloLink } from "apollo-boost"; import { InMemoryCache } from "apollo-cache-inmemory"; import ApolloClient from "apollo-client"; @@ -9,117 +11,148 @@ 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 axios from "axios"; +import LogRocket from "logrocket"; +import moment from "moment"; +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 - }); - 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"); + +axios.interceptors.request.use( + async (config) => { + if (!config.headers.Authorization) { + const token = + auth.currentUser && (await auth.currentUser.getIdToken(true)); + if (token) { + config.headers.Authorization = `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)))); + return config; + }, + (error) => Promise.reject(error) +); - const cache = new InMemoryCache(); - const client = new ApolloClient({ - link: ApolloLink.from(middlewares), - cache, - connectToDevTools: true - }); +if (process.env.NODE_ENV === "production") LogRocket.init("gvfvfw/bodyshopapp"); - this.state = { client }; - } +const httpLink = new HttpLink({ + uri: process.env.REACT_APP_GRAPHQL_ENDPOINT, +}); - render() { - const { client } = this.state; +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 = + 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 deleted file mode 100644 index 231d0f616..000000000 --- a/client/src/App/App.js +++ /dev/null @@ -1,70 +0,0 @@ -import i18next from "i18next"; -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 ErrorBoundary from "../components/error-boundary/error-boundary.component"; -//Component Imports -import LoadingSpinner from "../components/loading-spinner/loading-spinner.component"; -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"; - -const LandingPage = lazy(() => import("../pages/landing/landing.page")); -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 mapStateToProps = createStructuredSelector({ - currentUser: selectCurrentUser -}); -const mapDispatchToProps = dispatch => ({ - checkUserSession: () => dispatch(checkUserSession()) -}); - -export default connect( - mapStateToProps, - mapDispatchToProps -)(({ checkUserSession, currentUser }) => { - useEffect(() => { - checkUserSession(); - return () => {}; - }, [checkUserSession]); - - 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 ; - } - - return ( -
- - - }> - - - - - - - - - -
- ); -}); diff --git a/client/src/App/App.jsx b/client/src/App/App.jsx new file mode 100644 index 000000000..97b65977a --- /dev/null +++ b/client/src/App/App.jsx @@ -0,0 +1,92 @@ +import "antd/dist/antd.css"; +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 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 PrivateRoute from "../utils/private-route"; +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 CsiPage = lazy(() => import("../pages/csi/csi.container.page")); +const MobilePaymentContainer = lazy(() => + import("../pages/mobile-payment/mobile-payment.container") +); + +const mapStateToProps = createStructuredSelector({ + currentUser: selectCurrentUser, +}); +const mapDispatchToProps = (dispatch) => ({ + checkUserSession: () => dispatch(checkUserSession()), +}); + +export function App({ checkUserSession, currentUser }) { + useEffect(() => { + checkUserSession(); + }, [checkUserSession]); + + //const b = Grid.useBreakpoint(); + // console.log("Breakpoints:", b); + + const { t } = useTranslation(); + + if (currentUser.authorized === null) { + return ; + } + + return ( +
+ + }> + + + + + + + + + + + + + + + + + + + + + + + +
+ ); +} + +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/App/registerServiceWorker.component.jsx b/client/src/App/registerServiceWorker.component.jsx new file mode 100644 index 000000000..7136574f8 --- /dev/null +++ b/client/src/App/registerServiceWorker.component.jsx @@ -0,0 +1,42 @@ +import { AlertOutlined } from "@ant-design/icons"; +import { Button, notification } from "antd"; +import i18n from "i18next"; +import React from "react"; +import * as serviceWorker from "../serviceWorker"; + +const onServiceWorkerUpdate = (registration) => { + console.log("[RSW] onServiceWorkerUpdate", registration); + + const key = `open${Date.now()}`; + const btn = ( + + ); + notification.open({ + icon: , + message: i18n.t("general.messages.newversiontitle"), + description: i18n.t("general.messages.newversionmessage"), + duration: 0, + btn, + key, + }); +}; + +// if (process.env.NODE_ENV === "production") { +// console.log("SWR Registering SW..."); +console.log("Registering Service Worker..."); +serviceWorker.register({ onUpdate: onServiceWorkerUpdate }); +// } diff --git a/client/src/components/_test/paymentMethod.jsx b/client/src/components/_test/paymentMethod.jsx new file mode 100644 index 000000000..e32ebc2c9 --- /dev/null +++ b/client/src/components/_test/paymentMethod.jsx @@ -0,0 +1,96 @@ +import { + PaymentRequestButtonElement, + useStripe +} from "@stripe/react-stripe-js"; +import React, { useEffect, useState } from "react"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +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({ + bodyshop: selectBodyshop, +}); + +const mapDispatchToProps = (dispatch) => ({ + setEmailOptions: (e) => dispatch(setEmailOptions(e)), +}); + +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 ( +
+ + +
+ ); +} + +export default connect(mapStateToProps, mapDispatchToProps)(Test); diff --git a/client/src/components/_test/test.component.jsx b/client/src/components/_test/test.component.jsx index 9d25fd4d8..d554e405b 100644 --- a/client/src/components/_test/test.component.jsx +++ b/client/src/components/_test/test.component.jsx @@ -1,51 +1,25 @@ +import Axios from "axios"; import React from "react"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { - startLoading, - endLoading -} from "../../redux/application/application.actions"; -import { setEmailOptions } from "../../redux/email/email.actions"; -import T, { - Subject -} from "../../emails/templates/appointment-confirmation/appointment-confirmation.template"; -import { EMAIL_APPOINTMENT_CONFIRMATION } from "../../emails/templates/appointment-confirmation/appointment-confirmation.query"; +export default function Test() { + const handleQbSignIn = async () => { + const result = await Axios.post("/qbo/authorize", { userId: "1234" }); + console.log("handleQbSignIn -> result", result.data); + // window.open(result.data, "_blank", "toolbar=0,location=0,menubar=0"); + + var parameters = "location=1,width=800,height=650"; + parameters += + ",left=" + + (window.screen.width - 800) / 2 + + ",top=" + + (window.screen.height - 650) / 2; + + // Launch Popup + window.open(result.data, "connectPopup", parameters); + }; -const mapStateToProps = createStructuredSelector({ - //currentUser: selectCurrentUser -}); -const mapDispatchToProps = dispatch => ({ - setEmailOptions: e => dispatch(setEmailOptions(e)), - load: () => dispatch(startLoading()), - endload: () => dispatch(endLoading()) -}); -export default connect( - mapStateToProps, - mapDispatchToProps -)(function Test({ setEmailOptions, load, endload }) { return (
- - - +
); -}); +} 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..dd0de0185 --- /dev/null +++ b/client/src/components/accounting-payments-table/accounting-payments-table.component.jsx @@ -0,0 +1,193 @@ +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_co_nm + }`} + + ) : ( + {`${record.job.ownr_fn || ""} ${record.job.ownr_ln || ""} ${ + record.job.ownr_co_nm + }`} + ); + }, + }, + { + 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..f11fa1550 --- /dev/null +++ b/client/src/components/accounting-receivables-table/accounting-receivables-table.component.jsx @@ -0,0 +1,226 @@ +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_co_nm || "" + }`} + + ) : ( + {`${record.ownr_fn || ""} ${record.ownr_ln || ""} ${ + record.ownr_co_nm || "" + }`} + ); + }, + }, + { + 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-assignment/allocations-assignment.component.test.js b/client/src/components/allocations-assignment/allocations-assignment.component.test.js index abb5aa466..495f7e1e1 100644 --- a/client/src/components/allocations-assignment/allocations-assignment.component.test.js +++ b/client/src/components/allocations-assignment/allocations-assignment.component.test.js @@ -15,7 +15,7 @@ describe("AllocationsAssignmentComponent component", () => { assignment: {}, setAssignment: jest.fn(), visibilityState: [false, jest.fn()], - maxHours: 4 + maxHours: 4, }; wrapper = mount(); @@ -27,7 +27,6 @@ describe("AllocationsAssignmentComponent component", () => { it("should render a list of employees", () => { const empList = wrapper.find("#employeeSelector"); - console.log(empList.debug()); expect(empList.children()).to.have.lengthOf(2); }); diff --git a/client/src/components/allocations-bulk-assignment/allocations-bulk-assignment.component.jsx b/client/src/components/allocations-bulk-assignment/allocations-bulk-assignment.component.jsx index 4682320d2..9c0bef386 100644 --- a/client/src/components/allocations-bulk-assignment/allocations-bulk-assignment.component.jsx +++ b/client/src/components/allocations-bulk-assignment/allocations-bulk-assignment.component.jsx @@ -6,7 +6,7 @@ import { createStructuredSelector } from "reselect"; import { selectBodyshop } from "../../redux/user/user.selectors"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop + bodyshop: selectBodyshop, }); export default connect( @@ -18,12 +18,11 @@ export default connect( handleAssignment, assignment, setAssignment, - visibilityState + visibilityState, }) { const { t } = useTranslation(); - const onChange = e => { - console.log("e", e); + const onChange = (e) => { setAssignment({ ...assignment, employeeid: e }); }; @@ -34,13 +33,14 @@ export default connect( 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 ? ( - + ) : (
; if (!oldV && newV) return ( - + {Object.keys(newV).map((key, idx) => ( {key}: {JSON.stringify(newV[key])} @@ -19,7 +17,7 @@ export default function AuditTrailValuesComponent({ oldV, newV }) { ); return ( - + {Object.keys(oldV).map((key, idx) => ( {key}: {oldV[key]} diff --git a/client/src/components/barcode-popup/barcode-popup.component.jsx b/client/src/components/barcode-popup/barcode-popup.component.jsx index 7daceb4dc..6e990ce9f 100644 --- a/client/src/components/barcode-popup/barcode-popup.component.jsx +++ b/client/src/components/barcode-popup/barcode-popup.component.jsx @@ -2,7 +2,7 @@ import { Tag, Popover } from "antd"; import React from "react"; import Barcode from "react-barcode"; import { useTranslation } from "react-i18next"; -export default function BarcodePopupComponent({ value }) { +export default function BarcodePopupComponent({ value, children }) { const { t } = useTranslation(); return (
@@ -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 new file mode 100644 index 000000000..4d6f37ca5 --- /dev/null +++ b/client/src/components/breadcrumbs/breadcrumbs.component.jsx @@ -0,0 +1,36 @@ +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 "./breadcrumbs.styles.scss"; + +const mapStateToProps = createStructuredSelector({ + breadcrumbs: selectBreadcrumbs, +}); + +export function BreadCrumbs({ breadcrumbs }) { + return ( +
+ + + + + + + {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..c46daaf4e 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,95 @@ -import { CheckCircleOutlined, CheckOutlined } from "@ant-design/icons"; +import Icon from "@ant-design/icons"; import React, { useEffect, useRef } from "react"; +import { MdDone, MdDoneAll } from "react-icons/md"; +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..9bf1c6897 --- /dev/null +++ b/client/src/components/chat-tag-ro/chat-tag-ro.component.jsx @@ -0,0 +1,51 @@ +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 || "" + } ${item.ownr_co_nm || ""}`} + + ))} + + {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-jobs/contract-jobs.component.jsx b/client/src/components/contract-jobs/contract-jobs.component.jsx index 1d970317c..4520cf212 100644 --- a/client/src/components/contract-jobs/contract-jobs.component.jsx +++ b/client/src/components/contract-jobs/contract-jobs.component.jsx @@ -7,12 +7,12 @@ export default function ContractsJobsComponent({ loading, data, selectedJob, - handleSelect + handleSelect, }) { const [state, setState] = useState({ sortedInfo: {}, filteredInfo: { text: "" }, - search: "" + search: "", }); const { t } = useTranslation(); @@ -35,7 +35,7 @@ export default function ContractsJobsComponent({ {record.ro_number ? record.ro_number : "EST-" + record.est_number} - ) + ), }, { title: t("jobs.fields.owner"), @@ -49,12 +49,14 @@ export default function ContractsJobsComponent({ render: (text, record) => { return record.owner ? ( - {record.ownr_fn} {record.ownr_ln} + {record.ownr_fn} {record.ownr_ln} {record.ownr_co_nm || ""} ) : ( - {`${record.ownr_fn} ${record.ownr_ln}`} + {`${record.ownr_fn} ${record.ownr_ln} ${ + record.ownr_co_nm || "" + }`} ); - } + }, }, { title: t("jobs.fields.status"), @@ -67,7 +69,7 @@ export default function ContractsJobsComponent({ state.sortedInfo.columnKey === "status" && state.sortedInfo.order, render: (text, record) => { return record.status || t("general.labels.na"); - } + }, }, { @@ -79,13 +81,14 @@ export default function ContractsJobsComponent({ 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 || "" + }`} ) : ( t("jobs.errors.novehicle") ); - } + }, }, { title: t("vehicles.fields.plate_no"), @@ -102,7 +105,7 @@ export default function ContractsJobsComponent({ ) : ( t("general.labels.unknown") ); - } + }, }, { title: t("jobs.fields.clm_no"), @@ -119,8 +122,8 @@ export default function ContractsJobsComponent({ ) : ( t("general.labels.unknown") ); - } - } + }, + }, ]; const handleTableChange = (pagination, filters, sorter) => { @@ -131,7 +134,7 @@ export default function ContractsJobsComponent({ state.search === "" ? data : data.filter( - j => + (j) => (j.est_number || "") .toString() .toLowerCase() @@ -140,6 +143,9 @@ export default function ContractsJobsComponent({ .toString() .toLowerCase() .includes(state.search.toLowerCase()) || + (j.ownr_co_nm || "") + .toLowerCase() + .includes(state.search.toLowerCase()) || (j.ownr_fn || "") .toLowerCase() .includes(state.search.toLowerCase()) || @@ -160,7 +166,6 @@ export default function ContractsJobsComponent({ .includes(state.search.toLowerCase()) ); - return (
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: [selectedJob] + selectedRowKeys: [selectedJob], }} /> ); 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..90e7fbaa4 --- /dev/null +++ b/client/src/components/contract-license-decode-button/contract-license-decode-button.component.jsx @@ -0,0 +1,123 @@ +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); + + const handleDecode = (e) => { + logImEXEvent("contract_license_decode"); + setLoading(true); + const aamvaParse = aamva.parse(e.currentTarget.value); + 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..609326542 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,23 @@ -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, 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..ad5f82602 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, saveLoading }) { 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 => { - console.log("Finish", 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 ( @@ -67,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..e0694623e --- /dev/null +++ b/client/src/components/csi-response-list-paginated/csi-response-list-paginated.component.jsx @@ -0,0 +1,161 @@ +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_co_nm + }`} + + ) : ( + {`${record.job.ownr_fn || ""} ${record.job.ownr_ln || ""} ${ + record.job.ownr_co_nm + }`} + ); + }, + }, + { + 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..bfb8a3a5c 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); + 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); + 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 }); - }}> + > {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.component.jsx b/client/src/components/documents-upload/documents-upload.component.jsx index 7a464e229..287866f00 100644 --- a/client/src/components/documents-upload/documents-upload.component.jsx +++ b/client/src/components/documents-upload/documents-upload.component.jsx @@ -2,13 +2,14 @@ import { UploadOutlined } from "@ant-design/icons"; import { Button, Upload } from "antd"; import React from "react"; -export default function DocumentsUploadComponent({ handleUpload }) { +export default function DocumentsUploadComponent({ handleUpload, UploadRef }) { return (
+
); } diff --git a/client/src/components/email-overlay/email-overlay.container.jsx b/client/src/components/email-overlay/email-overlay.container.jsx index 77a9dd688..9432380c5 100644 --- a/client/src/components/email-overlay/email-overlay.container.jsx +++ b/client/src/components/email-overlay/email-overlay.container.jsx @@ -1,94 +1,127 @@ import { Modal, notification } from "antd"; import axios from "axios"; import React, { useEffect, useState } from "react"; -import { useLazyQuery } from "@apollo/react-hooks"; -import ReactDOMServer from "react-dom/server"; import { useTranslation } from "react-i18next"; import { connect } from "react-redux"; import { createStructuredSelector } from "reselect"; +import { logImEXEvent } from "../../firebase/firebase.utils"; import { toggleEmailOverlayVisible } from "../../redux/email/email.actions"; import { selectEmailConfig, - selectEmailVisible + 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"; const mapStateToProps = createStructuredSelector({ modalVisible: selectEmailVisible, - emailConfig: selectEmailConfig + emailConfig: selectEmailConfig, + bodyshop: selectBodyshop, }); -const mapDispatchToProps = dispatch => ({ - toggleEmailOverlayVisible: () => dispatch(toggleEmailOverlayVisible()) + +const mapDispatchToProps = (dispatch) => ({ + toggleEmailOverlayVisible: () => dispatch(toggleEmailOverlayVisible()), }); -export default connect( - mapStateToProps, - mapDispatchToProps -)(function EmailOverlayContainer({ + +export function EmailOverlayContainer({ emailConfig, modalVisible, - toggleEmailOverlayVisible + toggleEmailOverlayVisible, + bodyshop, }) { const { t } = useTranslation(); - const [messageOptions, setMessageOptions] = useState( - emailConfig.messageOptions - ); + 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: [], + }); - useEffect(() => { - setMessageOptions(emailConfig.messageOptions); - }, [setMessageOptions, emailConfig.messageOptions]); + const handleOk = async () => { + logImEXEvent("email_send_from_modal"); - const [executeQuery, { called, loading, data }] = useLazyQuery( - emailConfig.queryConfig[0], - { - ...emailConfig.queryConfig[1], - fetchPolicy: "network-only" - } - ); + const attachments = []; - if ( - emailConfig.queryConfig[0] && - emailConfig.queryConfig[1] && - modalVisible && - !called - ) { - executeQuery(); - } - - if (data && !messageOptions.html && emailConfig.template) { - setMessageOptions({ - ...messageOptions, - html: ReactDOMServer.renderToStaticMarkup( - - ) + await asyncForEach(messageOptions.fileList, async (f) => { + const t = { + ContentType: f.type, + Filename: f.name, + Base64Content: (await toBase64(f)).split(",")[1], + }; + attachments.push(t); }); - } - 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 }) - }); + 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 => { + const handleConfigChange = (event) => { const { name, value } = event.target; setMessageOptions({ ...messageOptions, [name]: value }); }; - const handleHtmlChange = text => { + 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) render(); + }, [modalVisible]); // eslint-disable-line react-hooks/exhaustive-deps return ( toggleEmailOverlayVisible()} + onCancel={() => { + toggleEmailOverlayVisible(); + }} + okButtonProps={{ loading: sending }} > ); -}); +} +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 new file mode 100644 index 000000000..2b8b4977a --- /dev/null +++ b/client/src/components/employee-search-select/employee-search-select.component.jsx @@ -0,0 +1,56 @@ +import { Select, Tag } from "antd"; +import React, { forwardRef, useEffect, useState } from "react"; +import { useTranslation } from "react-i18next"; +const { Option } = Select; +//To be used as a form element only. + +const EmployeeSearchSelect = ( + { value, onChange, options, onSelect, onBlur, ...restProps }, + ref +) => { + const [option, setOption] = useState(value); + const { t } = useTranslation(); + useEffect(() => { + if (value !== option && onChange) { + onChange(option); + } + }, [value, option, onChange]); + + return ( + + ); +}; +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..b040db770 --- /dev/null +++ b/client/src/components/form-fields-changed-alert/form-fields-changed-alert.component.jsx @@ -0,0 +1,51 @@ +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 ( +
+ { + if (loc.pathname === location.pathname) return false; + return t("general.messages.unsavedchangespopup"); + }} + /> + + {t("general.messages.unsavedchanges")} + + {t("general.actions.reset")} + +
+ } + /> + + ); + return
; + }} +
+ ); +} 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-loading-bar/global-loading-bar.component.jsx b/client/src/components/global-loading-bar/global-loading-bar.component.jsx index f3b3a7f36..89ebcb372 100644 --- a/client/src/components/global-loading-bar/global-loading-bar.component.jsx +++ b/client/src/components/global-loading-bar/global-loading-bar.component.jsx @@ -1,52 +1,54 @@ -import { useNProgress } from "@tanem/react-nprogress"; +//import { useNProgress } from "@tanem/react-nprogress"; import React from "react"; import { connect } from "react-redux"; import { createStructuredSelector } from "reselect"; import { selectLoading } from "../../redux/application/application.selectors"; const mapStateToProps = createStructuredSelector({ - loading: selectLoading + loading: selectLoading, }); export default connect(mapStateToProps, null)(GlobalLoadingHeader); function GlobalLoadingHeader({ loading }) { - - const { animationDuration, isFinished, progress } = useNProgress({ - isAnimating: loading - }); - return ( -
-
-
-
-
- ); + return ; + // const { animationDuration, isFinished, progress } = useNProgress({ + // isAnimating: loading, + // }); + // 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..7af1fc6b2 --- /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 || "" + } - ${vehicle.plate_no} - ${vehicle.v_vin}`} +
+ + ), + }; + }), + }, + { + 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 b00ea95ea..7654c9e27 100644 --- a/client/src/components/header/header.component.jsx +++ b/client/src/components/header/header.component.jsx @@ -1,220 +1,344 @@ -import Icon, { CarFilled, FileAddFilled, FileFilled, GlobalOutlined, HomeFilled, TeamOutlined } from "@ant-design/icons"; -import { Avatar, Col, Menu, Row } from "antd"; +import Icon, { + CarFilled, + ClockCircleFilled, + DollarCircleFilled, + FileAddFilled, + FileFilled, + GlobalOutlined, + HomeFilled, + ImportOutlined, + LineChartOutlined, + ScheduleOutlined, + TeamOutlined, + UnorderedListOutlined, + UserOutlined, +} from "@ant-design/icons"; +import { Avatar, Layout, Menu } from "antd"; import React from "react"; import { useTranslation } from "react-i18next"; -import { FaCalendarAlt, FaCarCrash } from "react-icons/fa"; +import { BsKanban } from "react-icons/bs"; +import { + FaCalendarAlt, + FaCarCrash, + FaCreditCard, + FaFileInvoiceDollar, +} from "react-icons/fa"; +import { connect } from "react-redux"; 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 { createStructuredSelector } from "reselect"; +import { selectRecentItems } from "../../redux/application/application.selectors"; +import { setModalContext } from "../../redux/modals/modals.actions"; +import { signOutStart } from "../../redux/user/user.actions"; +import { + selectBodyshop, + selectCurrentUser, +} from "../../redux/user/user.selectors"; +import GlobalSearch from "../global-search/global-search.component"; +import "./header.styles.scss"; -export default ({ - landingHeader, - selectedNavItem, - logo, +const mapStateToProps = createStructuredSelector({ + 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()), +}); + +function Header({ + bodyshop, handleMenuClick, currentUser, - signOutStart -}) => { + signOutStart, + setInvoiceEnterContext, + setTimeTicketContext, + setPaymentContext, + recentItems, +}) { const { t } = useTranslation(); - //TODO Add + const { Header } = Layout; return ( - - {logo ? ( -
- Shop Logo - - ) : null} - - {landingHeader ? ( - - +
+ + + + + {t("menus.header.home")} + + + + + + {t("menus.header.schedule")} + + + + + {t("menus.header.jobs")} + + } + > + + + {t("menus.header.activejobs")} + + + + {t("menus.header.availablejobs")} + + + + + + {t("menus.header.alljobs")} + + - - - {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")} - - - - - ) : ( - + + + {t("menus.header.productionlist")} + + + + + + {t("menus.header.productionboard")} + + + + + + + {t("menus.header.scoreboard")} + + + + + {t("menus.header.customers")} + + } + > + + + + {t("menus.header.owners")} + + + + + + {t("menus.header.vehicles")} + + + + + + {t("menus.header.courtesycars")} + + } + > + + + + {t("menus.header.courtesycars-all")} + + + + + + {t("menus.header.courtesycars-contracts")} + + + + + + {t("menus.header.courtesycars-newcontract")} + + + + + + {t("menus.header.accounting")} + + } + > + + {t("menus.header.invoices")} + + { + setInvoiceEnterContext({ + actions: {}, + context: {}, + }); + }} > - - - - {t("menus.header.home")} + + {t("menus.header.enterinvoices")} + + + + {t("menus.header.allpayments")} + + { + setPaymentContext({ + actions: {}, + context: {}, + }); + }} + > + + {t("menus.header.enterpayment")} + + + + + + {t("menus.header.timetickets")} + + + { + setTimeTicketContext({ + actions: {}, + context: {}, + }); + }} + > + {t("menus.header.entertimeticket")} + + + + + + + {t("menus.header.accounting-receivables")} - - - {t("menus.header.jobs")} - - } - > - - - - {t("menus.header.schedule")} - - - - {t("menus.header.activejobs")} - - - - {t("menus.header.availablejobs")} - - - - - - - - {t("menus.header.owners")} - - - - - - {t("menus.header.vehicles")} - - - + + + {t("menus.header.accounting-payables")} + + + + + {t("menus.header.accounting-payments")} + + + + + + + {t("menus.header.shop_config")} + - - - {t("menus.header.courtesycars")} - - } - > - - - - {t("menus.header.courtesycars-all")} - - - - - - {t("menus.header.courtesycars-contracts")} - - - - - - {t("menus.header.courtesycars-newcontract")} - - - + + + {t("menus.header.shop_templates")} + + - - - {t("menus.header.shop_config")} - - - - {t("menus.header.shop_vendors")} - - - + + + {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()}> - {t("user.actions.signout")} - - - - {t("menus.currentuser.profile")} - - - - - {t("menus.currentuser.languageselector")} - - } - > - - {t("general.languages.english")} - - - {t("general.languages.french")} - - - {t("general.languages.spanish")} - - - - - )} - - + {currentUser.displayName || t("general.labels.unknown")} + + } + > + signOutStart()}> + {t("user.actions.signout")} + + + {t("menus.header.shiftclock")} + + + {t("menus.currentuser.profile")} + + + + {t("menus.currentuser.languageselector")} + + } + > + + {t("general.languages.english")} + + + {t("general.languages.french")} + + + {t("general.languages.spanish")} + + + +
+ ); -}; +} + +export default connect(mapStateToProps, mapDispatchToProps)(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..c1408d4ed --- /dev/null +++ b/client/src/components/invoice-detail-edit/invoice-detail-edit.container.jsx @@ -0,0 +1,124 @@ +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, + joblineid: il.joblineid === "noline" ? null : il.joblineid, + }, + }, + }) + ); + }); + + 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 5359c0c85..000000000 --- a/client/src/components/invoice-enter-modal/invoice-enter-modal.component.jsx +++ /dev/null @@ -1,176 +0,0 @@ -import { - Button, - DatePicker, - Form, - Input, - Modal, - Select, - Switch, - Tag -} from "antd"; -import React from "react"; -import { useTranslation } from "react-i18next"; -import CurrencyInput from "../form-items-formatted/currency-form-item.component"; -import InvoiceEnterModalLinesComponent from "./invoice-enter-modal.lines.component"; - -export default function InvoiceEnterModalComponent({ - visible, - invoice, - handleCancel, - handleFinish, - handleRoSelect, - roAutoCompleteOptions, - handleVendorSelect, - vendorAutoCompleteOptions, - lineData, - vendor, - job, - responsibilityCenters -}) { - const { t } = useTranslation(); - const [form] = Form.useForm(); - const { resetFields } = form; - - return ( -
- form.submit()} - okButtonProps={{ htmlType: "submit" }} - onCancel={handleCancel} - > -
- - - - - - - - -
-
- - - - - - - - - - - - -
- - - -
- - ); -} 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 4c8b72049..5078a0029 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,105 +1,113 @@ -import React, { useState } from "react"; -import { notification } from "antd"; -import { useLazyQuery, useQuery, useMutation } from "@apollo/react-hooks"; +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 { 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 { INSERT_NEW_INVOICE } from "../../graphql/invoices.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 { INSERT_NEW_INVOICE } from "../../graphql/invoices.queries"; -import { useTranslation } from "react-i18next"; +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 + bodyshop: selectBodyshop, + currentUser: selectCurrentUser, }); -const mapDispatchToProps = dispatch => ({ - toggleModalVisible: () => dispatch(toggleModalVisible("invoiceEnter")) +const mapDispatchToProps = (dispatch) => ({ + toggleModalVisible: () => dispatch(toggleModalVisible("invoiceEnter")), }); function InvoiceEnterModalContainer({ invoiceEnterModal, toggleModalVisible, - bodyshop + bodyshop, + currentUser, }) { + const [form] = Form.useForm(); const { t } = useTranslation(); - const linesState = useState([]); - const roSearchState = useState({ text: "", selectedId: null }); - const [roSearch, setRoSearch] = roSearchState; - + const [enterAgain, setEnterAgain] = useState(false); const [insertInvoice] = useMutation(INSERT_NEW_INVOICE); + const [updateJobLines] = useMutation(UPDATE_JOB_LINE_STATUS); + const [loading, setLoading] = useState(false); - const { data: RoAutoCompleteData } = useQuery(ACTIVE_JOBS_FOR_AUTOCOMPLETE, { - fetchPolicy: "network-only", - variables: { statuses: bodyshop.md_ro_statuses.open_statuses || ["Open"] }, - skip: !invoiceEnterModal.visible - }); - - const vendorSearchState = useState({ - text: "", - selectedId: null - }); - const [vendorSearch, setVendorSearch] = vendorSearchState; - const { data: VendorAutoCompleteData } = useQuery( - SEARCH_VENDOR_AUTOCOMPLETE, - { - fetchPolicy: "network-only", - skip: !invoiceEnterModal.visible - } - ); - - const [loadLines, { called, data: lineData }] = useLazyQuery( - GET_JOB_LINES_TO_ENTER_INVOICE, - { - fetchPolicy: "network-only", - variables: { id: roSearch.selectedId } - } - ); - - if (roSearch.selectedId) { - if (!called) loadLines(); - } - const handleRoSelect = (value, obj) => { - setRoSearch({ ...roSearch, selectedId: obj.key }); - }; - - const handleVendorSelect = (value, obj) => { - setVendorSearch({ ...vendorSearch, selectedId: obj.key }); - }; - - const handleFinish = values => { + const handleFinish = (values) => { + setLoading(true); + const { upload, ...remainingValues } = values; insertInvoice({ variables: { invoice: [ - Object.assign( - {}, - values, - { jobid: roSearch.selectedId }, - { vendorid: vendorSearch.selectedId }, - { invoicelines: { data: values.invoicelines } } - ) - ] - } + Object.assign({}, remainingValues, { + invoicelines: { + data: remainingValues.invoicelines.map((i) => { + return { + ...i, + joblineid: i.joblineid === "noline" ? null : i.joblineid, + }; + }), + }, + }), + ], + }, }) - .then(r => { - // if (jobLineEditModal.actions.refetch) - // jobLineEditModal.actions.refetch(); - // toggleModalVisible(); - notification["success"]({ - message: t("invoices.successes.created") + .then((r) => { + const invoiceId = r.data.insert_invoices.returning[0].id; + + 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 => { - console.log("error", error); - + .catch((error) => { + setLoading(false); + setEnterAgain(false); notification["error"]({ message: t("invoices.errors.creating", { - message: error.message - }) + message: JSON.stringify(error), + }), }); }); }; @@ -108,31 +116,65 @@ function InvoiceEnterModalContainer({ toggleModalVisible(); }; + useEffect(() => { + if (enterAgain) form.submit(); + }, [enterAgain, form]); + + useEffect(() => { + if (invoiceEnterModal.visible) form.resetFields(); + }, [invoiceEnterModal.visible, form]); + return ( - form.submit()} + onCancel={handleCancel} + afterClose={() => form.resetFields()} + footer={ + + + + {invoiceEnterModal.context && invoiceEnterModal.context.id ? null : ( + + )} + } - linesState={linesState} - lineData={lineData ? lineData.joblines : null} - vendor={ - vendorSearch.selectedId - ? VendorAutoCompleteData && - VendorAutoCompleteData.vendors.filter( - v => v.id === vendorSearch.selectedId - )[0] - : null - } - job={invoiceEnterModal.context.job || null} - responsibilityCenters={bodyshop.md_responsibility_centers || null} - /> + destroyOnClose + > +
{ + setEnterAgain(false); + }} + initialValues={{ + ...invoiceEnterModal.context.invoice, + jobid: + (invoiceEnterModal.context.job && + invoiceEnterModal.context.job.id) || + null, + 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, + }} + > + + + ); } diff --git a/client/src/components/invoice-enter-modal/invoice-enter-modal.lines.component.jsx b/client/src/components/invoice-enter-modal/invoice-enter-modal.lines.component.jsx deleted file mode 100644 index 79def467f..000000000 --- a/client/src/components/invoice-enter-modal/invoice-enter-modal.lines.component.jsx +++ /dev/null @@ -1,242 +0,0 @@ -import { DeleteFilled } from "@ant-design/icons"; -import { Button, Col, Form, Input, Row, Select, Tag } from "antd"; -import React, { useState } from "react"; -import { useTranslation } from "react-i18next"; -import CurrencyFormatter from "../../utils/CurrencyFormatter"; -import CurrencyInput from "../form-items-formatted/currency-form-item.component"; - -export default function InvoiceEnterModalLinesComponent({ - lineData, - discount, - form, - responsibilityCenters -}) { - const { t } = useTranslation(); - const { setFieldsValue, getFieldsValue } = form; - - const [amounts, setAmounts] = useState({ invoiceTotal: 0, enteredAmount: 0 }); - - return ( -
- - {(fields, { add, remove }) => { - return ( -
- {fields.map((field, index) => ( - -
- - - - {getFieldsValue("invoicelines").invoicelines[index] && - getFieldsValue("invoicelines").invoicelines[index] - .joblinename && - !getFieldsValue("invoicelines").invoicelines[index] - .joblineid ? ( - - - - ) : null} - - - { - setFieldsValue({ - invoicelines: getFieldsValue( - "invoicelines" - ).invoicelines.map((item, idx) => { - if (idx === index) { - return { - ...item, - actual_cost: - parseFloat(e.target.value) * (1 - discount) - }; - } - return item; - }) - }); - }} - /> - - - - setAmounts({ - invoiceTotal: getFieldsValue().total, - enteredTotal: getFieldsValue("invoicelines") - .invoicelines - ? getFieldsValue( - "invoicelines" - ).invoicelines.reduce( - (acc, value) => - acc + - (value && value.actual_cost - ? value.actual_cost - : 0), - 0 - ) - : 0 - }) - } - /> - - - - - - { - remove(field.name); - }} - /> -
-
- ))} - - - -
- ); - }} -
- -
- {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..2c2c1f5cc --- /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)}`, + }, + } + ); + } 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..24a241724 --- /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)}`, + }, + } + ); + } 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..b57764fda --- /dev/null +++ b/client/src/components/invoice-form/invoice-form.component.jsx @@ -0,0 +1,246 @@ +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") } }); + } + }} + /> + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + +
+ + + { + 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..015b8768e --- /dev/null +++ b/client/src/components/invoice-form/invoice-form.lines.component.jsx @@ -0,0 +1,224 @@ +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"; +import FormListMoveArrows from "../form-list-move-arrows/form-list-move-arrows.component"; +export default function InvoiceEnterModalLinesComponent({ + lineData, + discount, + form, + responsibilityCenters, +}) { + const { t } = useTranslation(); + const { setFieldsValue, getFieldsValue } = form; + + return ( + + {(fields, { add, remove, move }) => { + 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 a1a4a2fa9..324fc81ab 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,71 +1,375 @@ -import { 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 { alphaSort } from "../../utils/sorters"; +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"; -export default function InvoicesListTableComponent({ loading, invoices }) { - const [state, setState] = useState({ - sortedInfo: {} - }); - const { t } = useTranslation(); +import { alphaSort } from "../../utils/sorters"; +import queryString from "query-string"; +import { useLocation } from "react-router-dom"; +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, + 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"), dataIndex: "vendorname", key: "vendorname", - // onFilter: (value, record) => record.ro_number.includes(value), - // filteredValue: state.filteredInfo.text || null, sorter: (a, b) => alphaSort(a.vendor.name, b.vendor.name), sortOrder: state.sortedInfo.columnKey === "vendorname" && state.sortedInfo.order, - //ellipsis: true, - render: (text, record) => {record.vendor.name} + render: (text, record) => {record.vendor.name}, }, { title: t("invoices.fields.invoice_number"), dataIndex: "invoice_number", key: "invoice_number", - // onFilter: (value, record) => record.ro_number.includes(value), - // filteredValue: state.filteredInfo.text || null, sorter: (a, b) => alphaSort(a.invoice_number, b.invoice_number), sortOrder: state.sortedInfo.columnKey === "invoice_number" && - state.sortedInfo.order - //ellipsis: true, + state.sortedInfo.order, }, { title: t("invoices.fields.date"), dataIndex: "date", key: "date", - // onFilter: (value, record) => record.ro_number.includes(value), - // filteredValue: state.filteredInfo.text || null, sorter: (a, b) => a.date - b.date, sortOrder: state.sortedInfo.columnKey === "date" && state.sortedInfo.order, - //ellipsis: true, - render: (text, record) => {record.date} - } + 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", + render: (text, record) => ( +
+ + + +
+ ), + }, ]; const handleTableChange = (pagination, filters, sorter) => { setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); }; - const rowExpander = record => ( -
Invoice details
- ); + 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.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", + key: "cost_center", + sorter: (a, b) => alphaSort(a.cost_center, b.cost_center), + sortOrder: + 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) => { + setSelectedInvoiceLinesByInvoice({ + ...selectedInvoiceLinesByInvoice, + [record.id]: selectedRows.map((r) => r.id), + }); + }; + + return ( +
+ {`${t("invoices.fields.invoice_number")} ${ + record.invoice_number + }`} + + + {`${record.federal_tax_rate}%` || ""} + + + {`${record.state_tax_rate}%` || ""} + + + {`${record.local_tax_rate}%` || ""} + + + +
{ + handleOnInvoiceRowclick(selectedRows); + }, + onSelectAll: (selected, selectedRows, changeRows) => { + handleOnInvoiceRowclick(selectedRows); + }, + selectedRowKeys: selectedInvoiceLinesByInvoice[record.id], + type: "checkbox", + }} + /> + + ); + }; return ( -
({ ...item }))} - rowKey="id" - dataSource={invoices} - onChange={handleTableChange} - /> +
+ + {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); + }, + 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-calculate-totals/job-calculate-totals.component.jsx b/client/src/components/job-calculate-totals/job-calculate-totals.component.jsx new file mode 100644 index 000000000..f742d71dc --- /dev/null +++ b/client/src/components/job-calculate-totals/job-calculate-totals.component.jsx @@ -0,0 +1,59 @@ +import { Button, 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 { UPDATE_JOB } from "../../graphql/jobs.queries"; +import { selectBodyshop } from "../../redux/user/user.selectors"; + +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, +}); + +export function JobCalculateTotals({ bodyshop, job }) { + const { t } = useTranslation(); + const [loading, setLoading] = useState(false); + const [updateJob] = useMutation(UPDATE_JOB); + + const handleCalculate = async () => { + setLoading(true); + const newTotals = ( + await Axios.post("/job/totals", { + job: job, + shoprates: bodyshop.shoprates, + }) + ).data; + + const result = await updateJob({ + refetchQueries: ["GET_JOB_BY_PK"], + awaitRefetchQueries: true, + variables: { + jobId: job.id, + job: { + job_totals: newTotals, + }, + }, + }); + if (!!!result.errors) { + notification["success"]({ message: t("jobs.successes.updated") }); + } else { + notification["error"]({ + message: t("jobs.errors.updating", { + error: JSON.stringify(result.errors), + }), + }); + } + setLoading(false); + }; + + return ( +
+ +
+ ); +} +export default connect(mapStateToProps, null)(JobCalculateTotals); 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..1bd3d802a --- /dev/null +++ b/client/src/components/job-costing-modal/job-costing-modal.component.jsx @@ -0,0 +1,184 @@ +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] || "?"; + + 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 ticketTotalsByProfitCenter = job.timetickets.reduce( + (ticket_acc, ticket_val) => { + //At the invoice level. + if (!!!ticket_acc[ticket_val.cost_center]) + ticket_acc[ticket_val.cost_center] = Dinero(); + + ticket_acc[ticket_val.cost_center] = ticket_acc[ + ticket_val.cost_center + ].add( + Dinero({ + amount: Math.round((ticket_val.rate || 0) * 100), + }).multiply(ticket_val.actualhrs || 0) + ); + + return ticket_acc; + }, + {} + ); + + const summaryData = { + totalLaborSales: Dinero({ amount: 0 }), + totalPartsSales: Dinero({ amount: 0 }), + totalSales: Dinero({ amount: 0 }), + totalLaborCost: Dinero({ amount: 0 }), + totalPartsCost: 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_labor = + ticketTotalsByProfitCenter[ccVal] || Dinero({ amount: 0 }); + const cost_parts = + invoiceTotalsByProfitCenter[ccVal] || Dinero({ amount: 0 }); + + const cost = ( + invoiceTotalsByProfitCenter[ccVal] || Dinero({ amount: 0 }) + ).add(ticketTotalsByProfitCenter[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.totalLaborCost = summaryData.totalLaborCost.add(cost_labor); + summaryData.totalPartsCost = summaryData.totalPartsCost.add(cost_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_parts: cost_parts && cost_parts.toFormat(), + cost_labor: cost_labor && cost_labor.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; + } + + 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..fb81eb59a --- /dev/null +++ b/client/src/components/job-costing-parts-table/job-costing-parts-table.component.jsx @@ -0,0 +1,89 @@ +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_labor"), + dataIndex: "cost_labor", + key: "cost_labor", + sorter: (a, b) => a.cost_labor - b.cost_labor, + sortOrder: + state.sortedInfo.columnKey === "cost_labor" && state.sortedInfo.order, + }, + { + title: t("jobs.labels.cost_parts"), + dataIndex: "cost_parts", + key: "cost_parts", + sorter: (a, b) => a.cost_parts - b.cost_parts, + sortOrder: + state.sortedInfo.columnKey === "cost_parts" && 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..730fc3d76 --- /dev/null +++ b/client/src/components/job-costing-statistics/job-costing-statistics.component.jsx @@ -0,0 +1,47 @@ +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..464bcff87 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,735 +1,746 @@ import React from "react"; -export default ({ dmg1, dmg2 }) => ( - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { + const { t } = useTranslation(); + + return ( +
+ {t("jobs.labels.cards.damage")} + + + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + - - + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { - // - // x - // - } - - -); + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { + // + // x + // + } + + +
+ ); +}; diff --git a/client/src/components/job-detail-cards/job-detail-cards.component.jsx b/client/src/components/job-detail-cards/job-detail-cards.component.jsx index b6c01bdae..d7442d2dd 100644 --- a/client/src/components/job-detail-cards/job-detail-cards.component.jsx +++ b/client/src/components/job-detail-cards/job-detail-cards.component.jsx @@ -1,201 +1,178 @@ -import { - EditFilled, - FileImageFilled, - PrinterFilled, - ShoppingFilled -} from "@ant-design/icons"; +import { PrinterFilled } from "@ant-design/icons"; import { useQuery } from "@apollo/react-hooks"; -import { Button, PageHeader, Tag } from "antd"; -import React, { useState } from "react"; +import { Button, Col, Drawer, Grid, PageHeader, Row, Tag, Space } from "antd"; +import queryString from "query-string"; +import React from "react"; import { useTranslation } from "react-i18next"; import { connect } from "react-redux"; -import { Link } from "react-router-dom"; +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 NoteUpsertModal from "../note-upsert-modal/note-upsert-modal.container"; -import ScheduleJobModalContainer from "../schedule-job-modal/schedule-job-modal.container"; -//import JobDetailCardsHeaderComponent from "./job-detail-cards.header.component"; -import JobDetailCardsCustomerComponent from "./job-detail-cards.customer.component"; +import OwnerTagPopoverComponent from "../owner-tag-popover/owner-tag-popover.component"; +import VehicleTagPopoverComponent from "../vehicle-tag-popover/vehicle-tag-popover.component"; import JobDetailCardsDamageComponent from "./job-detail-cards.damage.component"; import JobDetailCardsDatesComponent from "./job-detail-cards.dates.component"; import JobDetailCardsDocumentsComponent from "./job-detail-cards.documents.component"; import JobDetailCardsInsuranceComponent from "./job-detail-cards.insurance.component"; import JobDetailCardsNotesComponent from "./job-detail-cards.notes.component"; import JobDetailCardsPartsComponent from "./job-detail-cards.parts.component"; -import "./job-detail-cards.styles.scss"; import JobDetailCardsTotalsComponent from "./job-detail-cards.totals.component"; -const mapDispatchToProps = dispatch => ({ - setInvoiceEnterContext: context => - dispatch(setModalContext({ context: context, modal: "invoiceEnter" })) +const mapDispatchToProps = (dispatch) => ({ + setPrintCenterContext: (context) => + dispatch(setModalContext({ context: context, modal: "printCenter" })), }); -function JobDetailCards({ selectedJob, setInvoiceEnterContext }) { +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 [noteModalVisible, setNoteModalVisible] = useState(false); - 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 ( -
- - - window.history.back()} - tags={ - - {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}` : `${t("jobs.fields.est_number")} ${ 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.damage.component.jsx b/client/src/components/job-detail-cards/job-detail-cards.damage.component.jsx index 86a95f94f..b2cde2783 100644 --- a/client/src/components/job-detail-cards/job-detail-cards.damage.component.jsx +++ b/client/src/components/job-detail-cards/job-detail-cards.damage.component.jsx @@ -9,11 +9,10 @@ export default function JobDetailCardsDamageComponent({ loading, data }) { return ( {area_of_damage ? ( - - ) : t("jobs.errors.nodamage")} + + ) : ( + t("jobs.errors.nodamage") + )} ); } 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.notes.component.jsx b/client/src/components/job-detail-cards/job-detail-cards.notes.component.jsx index 505e6e5ca..2fd327b99 100644 --- a/client/src/components/job-detail-cards/job-detail-cards.notes.component.jsx +++ b/client/src/components/job-detail-cards/job-detail-cards.notes.component.jsx @@ -17,7 +17,7 @@ export default function JobDetailCardsNotesComponent({ loading, data }) { {data ? ( @@ -25,7 +25,7 @@ export default function JobDetailCardsNotesComponent({ loading, data }) { size="small" bordered dataSource={data.notes} - renderItem={item => ( + renderItem={(item) => ( {item.critical ? ( 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..368213170 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,62 +1,141 @@ -import React from "react"; +import React, { useMemo, useState } from "react"; import { useTranslation } from "react-i18next"; +import { Pie, PieChart, Sector } from "recharts"; import CardTemplate from "./job-detail-cards.template.component"; -import { Pie } from "@nivo/pie"; + export default function JobDetailCardsPartsComponent({ loading, data }) { const { t } = useTranslation(); + const { joblines_status } = data; + // console.log( + // "JobDetailCardsPartsComponent -> joblines_stats", + // joblines_status + // ); - const commonProperties = { - width: 225, - height: 225, - margin: { top: 20, right: 30, bottom: 20, left: 30 }, - animate: true + const memoizedData = useMemo(() => Calculatedata(joblines_status), [ + joblines_status, + ]); + + const [state, setState] = useState({ activeIndex: 0 }); + + const onPieEnter = (data, index) => { + setState({ + activeIndex: index, + }); }; - 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 (
- + + +
); } + +const Calculatedata = (data) => { + if (data.length > 0) { + const statusMapping = {}; + data.map((i) => { + if (!statusMapping[i.status]) + statusMapping[i.status] = { name: i.status || "No Status*", value: 0 }; + statusMapping[i.status].value = statusMapping[i.status].value + i.count; + return null; + }); + return Object.keys(statusMapping).map((key) => { + return statusMapping[key]; + }); + } else { + return [ + { name: "Group A", value: 400 }, + { name: "Group B", value: 300 }, + { name: "Group C", value: 300 }, + { name: "Group D", value: 200 }, + ]; + } +}; + +const renderActiveShape = (props) => { + const RADIAN = Math.PI / 180; + const { + cx, + cy, + midAngle, + innerRadius, + outerRadius, + startAngle, + endAngle, + fill, + payload, + percent, + value, + } = props; + const sin = Math.sin(-RADIAN * midAngle); + const cos = Math.cos(-RADIAN * midAngle); + const sx = cx + (outerRadius + 10) * cos; + const sy = cy + (outerRadius + 10) * sin; + const mx = cx + (outerRadius + 30) * cos; + const my = cy + (outerRadius + 30) * sin; + const ex = mx + (cos >= 0 ? 1 : -1) * 22; + const ey = my; + const textAnchor = cos >= 0 ? "start" : "end"; + + return ( + + + {payload.name} + + + + + + = 0 ? 1 : -1) * 12} + y={ey} + textAnchor={textAnchor} + fill="#333" + >{`Count: ${value}`} + = 0 ? 1 : -1) * 12} + y={ey} + dy={18} + textAnchor={textAnchor} + fill="#999" + > + {`(${(percent * 100).toFixed(2)}%)`} + + + ); +}; 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..ad5a7f787 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-cards/job-detail-cards.vehicle.component.jsx b/client/src/components/job-detail-cards/job-detail-cards.vehicle.component.jsx index f32c57ea7..3a3f2388e 100644 --- a/client/src/components/job-detail-cards/job-detail-cards.vehicle.component.jsx +++ b/client/src/components/job-detail-cards/job-detail-cards.vehicle.component.jsx @@ -13,9 +13,9 @@ export default function JobDetailCardsVehicleComponent({ loading, data }) { > {data ? ( - {data.vehicle?.v_model_yr || t("general.labels.na")}{" "} - {data.vehicle?.v_make_desc || t("general.labels.na")}{" "} - {data.vehicle?.v_model_desc || t("general.labels.na")} + {` ${data.vehicle?.v_model_yr || t("general.labels.na")} ${ + data.vehicle?.v_make_desc || t("general.labels.na") + } ${data.vehicle?.v_model_desc || t("general.labels.na")}`} ) : null}
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 c60a18208..1815dc005 100644 --- a/client/src/components/job-detail-lines/job-lines.component.jsx +++ b/client/src/components/job-detail-lines/job-lines.component.jsx @@ -1,43 +1,60 @@ -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"; -export default function JobLinesComponent({ +const mapDispatchToProps = (dispatch) => ({ + setJobLineEditContext: (context) => + dispatch(setModalContext({ context: context, modal: "jobLineEdit" })), + setPartsOrderContext: (context) => + dispatch(setModalContext({ context: context, modal: "partsOrder" })), +}); + +export function JobLinesComponent({ + setPartsOrderContext, loading, refetch, jobLines, setSearchText, selectedLines, setSelectedLines, - partsOrderModalVisible, jobId, - setJobLineEditContext + setJobLineEditContext, }) { const [state, setState] = useState({ - sortedInfo: {} + sortedInfo: {}, + filteredInfo: {}, }); const { t } = useTranslation(); - const setPartsModalVisible = partsOrderModalVisible[1]; + 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 + state.sortedInfo.columnKey === "line_no" && state.sortedInfo.order, + }, + { + title: t("joblines.fields.line_ind"), + dataIndex: "line_ind", + key: "line_ind", + sorter: (a, b) => alphaSort(a.line_ind, b.line_ind), + sortOrder: + state.sortedInfo.columnKey === "line_ind" && state.sortedInfo.order, }, { title: t("joblines.fields.line_desc"), @@ -47,61 +64,64 @@ export default function JobLinesComponent({ sortOrder: state.sortedInfo.columnKey === "line_desc" && state.sortedInfo.order, ellipsis: true, - editable: true, - width: "20%" }, { 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 - ), + sorter: (a, b) => alphaSort(a.oem_partno, b.oem_partno), sortOrder: state.sortedInfo.columnKey === "oem_partno" && state.sortedInfo.order, ellipsis: true, - editable: true, - width: "10%", - render: (text, record) => ( - - {record.oem_partno ? record.oem_partno : record.op_code_desc} - - ) + 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, - ellipsis: true, - editable: true, - width: "7%" - }, - { - title: t("joblines.fields.line_ind"), - dataIndex: "line_ind", - key: "line_ind", - sorter: (a, b) => alphaSort(a.line_ind, b.line_ind), - sortOrder: - state.sortedInfo.columnKey === "line_ind" && state.sortedInfo.order - }, - { - title: t("joblines.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, - ellipsis: true, - width: "8%", - render: (text, record) => ( - {record.db_price} - ) + 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", @@ -110,18 +130,62 @@ export default function JobLinesComponent({ sortOrder: state.sortedInfo.columnKey === "act_price" && state.sortedInfo.order, ellipsis: true, - width: "8%", 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, + 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 + 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"), @@ -129,132 +193,188 @@ export default function JobLinesComponent({ key: "status", sorter: (a, b) => alphaSort(a.status, b.status), sortOrder: - state.sortedInfo.columnKey === "status" && state.sortedInfo.order - }, - { - title: t("allocations.fields.employee"), - dataIndex: "employee", - key: "employee", - width: "10%", - 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} - - - ) + 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("general.labels.actions"), dataIndex: "actions", key: "actions", render: (text, record) => ( - +
- - ) - } + { + // + } +
+ ), + }, ]; const handleTableChange = (pagination, filters, sorter) => { setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); }; - const formItemLayout = { - labelCol: { - xs: { span: 12 }, - sm: { span: 5 } - }, - wrapperCol: { - xs: { span: 24 }, - sm: { span: 12 } - } + 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")} + + ); + return (
- - +
{ return ( -
- { - e.preventDefault(); - setSearchText(e.target.value); - }} - /> +
+ - + + + + + { + // + } +
+ { + e.preventDefault(); + setSearchText(e.target.value); + }} + /> +
); }} - {...formItemLayout} - loading={loading} - size="small" - expandedRowRender={record => ( -
+ expandedRowRender={(record) => ( +
{t("parts_orders.labels.orderhistory")} - {record.parts_order_lines.map(item => ( + {record.parts_order_lines.map((item) => (
- {`${item.parts_order.order_number || ""} from `} + + {item.parts_order.order_number || ""} + + - {item.parts_order.vendor.name || ""} @@ -263,20 +383,17 @@ export default 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) + setSelectedLines(selectedRows), }} - columns={columns.map(item => ({ ...item }))} - rowKey="id" - dataSource={jobLines} - onChange={handleTableChange} />
); } +export default connect(null, mapDispatchToProps)(JobLinesComponent); 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 5ff515c19..3b2af0227 100644 --- a/client/src/components/job-detail-lines/job-lines.container.jsx +++ b/client/src/components/job-detail-lines/job-lines.container.jsx @@ -1,72 +1,46 @@ -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 default connect( - null, - mapDispatchToProps -)(function JobLinesContainer({ jobId, setJobLineEditContext }) { - const { loading, error, data, refetch } = useQuery(GET_JOB_LINES_BY_PK, { - variables: { id: jobId }, - fetchPolicy: "network-only" - }); - +function JobLinesContainer({ jobId, joblines, refetch }) { const [searchText, setSearchText] = useState(""); const [selectedLines, setSelectedLines] = useState([]); - const partsOrderModalVisible = useState(false); - if (error) return ; + const jobLines = joblines + ? searchText + ? 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()) + ) + : 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} - partsOrderModalVisible={partsOrderModalVisible} jobId={jobId} - setJobLineEditContext={setJobLineEditContext} /> ); -}); +} + +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..0cffe85a8 --- /dev/null +++ b/client/src/components/job-employee-assignments/job-employee-assignments.component.jsx @@ -0,0 +1,148 @@ +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..07a3b52f1 --- /dev/null +++ b/client/src/components/job-intake/components/job-intake-form/job-intake-form.component.jsx @@ -0,0 +1,120 @@ +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) => { + 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), + }), + }); + } + 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..83ba63f83 --- /dev/null +++ b/client/src/components/job-reconciliation-modal/job-reconciliation-modal.component.jsx @@ -0,0 +1,39 @@ +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() || []; + + 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 new file mode 100644 index 000000000..f5ce318fc --- /dev/null +++ b/client/src/components/job-search-select/job-search-select.component.jsx @@ -0,0 +1,50 @@ +import { Select } from "antd"; +import React, { useEffect, useState, forwardRef } from "react"; +const { Option } = Select; + +//To be used as a form element only. + +const JobSearchSelect = ( + { value, onChange, options, onBlur, disabled, loading }, + ref +) => { + const [option, setOption] = useState(value); + + useEffect(() => { + if (value !== option && onChange) { + onChange(option); + } + }, [value, option, onChange]); + + return ( + + ); +}; +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 new file mode 100644 index 000000000..def44dea3 --- /dev/null +++ b/client/src/components/job-totals-table/job-totals-table.component.jsx @@ -0,0 +1,306 @@ +import { Col, Result, Row, Statistic, Typography } from "antd"; +import Dinero from "dinero.js"; +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 JobCalculateTotals from "../job-calculate-totals/job-calculate-totals.component"; +import "./job-totals-table.styles.scss"; + +const mapStateToProps = createStructuredSelector({ + //currentUser: selectCurrentUser + bodyshop: selectBodyshop, +}); + +const colSpan = { + md: { span: 24 }, + lg: { span: 12 }, +}; + +export function JobsTotalsTableComponent({ bodyshop, job }) { + const { t } = useTranslation(); + + console.log("job", job); + + if (!!!job.job_totals) { + return ( + } + /> + ); + } + + return ( +
+ +
+
+ + {t("jobs.labels.labortotals")} + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{t("jobs.fields.rate_laa")} + {Dinero(job.job_totals.rates.laa.total).toFormat()} + {`(${job.job_totals.rates.laa.hours.toFixed(2)} @ ${ + job.job_totals.rates.laa.rate + })`}
{t("jobs.fields.rate_lab")} + {Dinero(job.job_totals.rates.lab.total).toFormat()} + {`(${job.job_totals.rates.lab.hours.toFixed(2)} @ ${ + job.job_totals.rates.lab.rate + })`}
{t("jobs.fields.rate_lad")} + {Dinero(job.job_totals.rates.lad.total).toFormat()} + {`(${job.job_totals.rates.lad.hours.toFixed(2)} @ ${ + job.job_totals.rates.lad.rate + })`}
{t("jobs.fields.rate_lae")} + {Dinero(job.job_totals.rates.lae.total).toFormat()} + {`(${job.job_totals.rates.lae.hours.toFixed(2)} @ ${ + job.job_totals.rates.lae.rate + })`}
{t("jobs.fields.rate_laf")} + {Dinero(job.job_totals.rates.laf.total).toFormat()} + {`(${job.job_totals.rates.laf.hours.toFixed(2)} @ ${ + job.job_totals.rates.laf.rate + })`}
{t("jobs.fields.rate_lag")} + {Dinero(job.job_totals.rates.lag.total).toFormat()} + {`(${job.job_totals.rates.lag.hours.toFixed(2)} @ ${ + job.job_totals.rates.lag.rate + })`}
{t("jobs.fields.rate_lam")} + {Dinero(job.job_totals.rates.lam.total).toFormat()} + {`(${job.job_totals.rates.lam.hours.toFixed(2)} @ ${ + job.job_totals.rates.lam.rate + })`}
{t("jobs.fields.rate_lar")} + {Dinero(job.job_totals.rates.lar.total).toFormat()} + {`(${job.job_totals.rates.lar.hours.toFixed(2)} @ ${ + job.job_totals.rates.lar.rate + })`}
{t("jobs.fields.rate_las")} + {Dinero(job.job_totals.rates.las.total).toFormat()} + {`(${job.job_totals.rates.las.hours.toFixed(2)} @ ${ + job.job_totals.rates.las.rate + })`}
{t("jobs.fields.rate_lau")} + {Dinero(job.job_totals.rates.lau.total).toFormat()} + {`(${job.job_totals.rates.lau.hours.toFixed(2)} @ ${ + job.job_totals.rates.lau.rate + })`}
{t("jobs.fields.rate_la1")} + {Dinero(job.job_totals.rates.la1.total).toFormat()} + {`(${job.job_totals.rates.la1.hours.toFixed(2)} @ ${ + job.job_totals.rates.la1.rate + })`}
{t("jobs.fields.rate_la2")} + {Dinero(job.job_totals.rates.la2.total).toFormat()} + {`(${job.job_totals.rates.la2.hours.toFixed(2)} @ ${ + job.job_totals.rates.la2.rate + })`}
{t("jobs.fields.rate_la3")} + {Dinero(job.job_totals.rates.la3.total).toFormat()} + {`(${job.job_totals.rates.la3.hours.toFixed(2)} @ ${ + job.job_totals.rates.la3.rate + })`}
{t("jobs.fields.rate_la4")} + {Dinero(job.job_totals.rates.la4.total).toFormat()} + {`(${job.job_totals.rates.la4.hours.toFixed(2)} @ ${ + job.job_totals.rates.la4.rate + })`}
{t("jobs.fields.rate_atp")} + {Dinero(job.job_totals.rates.atp.total).toFormat()} + {`(${job.job_totals.rates.atp.hours.toFixed(2)} @ ${ + job.job_totals.rates.atp.rate + })`}
{t("jobs.labels.rates_subtotal")}{Dinero(job.job_totals.rates.subtotal).toFormat()}
+
+ + +
+ + + {Object.keys(job.job_totals.parts.parts.list).map( + (key, idx) => ( + + + + + + ) + )} + + + + + + + + + + + + + + + + + + + + + +
{t(`jobs.fields.${key.toLowerCase()}`)} + {Dinero( + job.job_totals.parts.parts.list[key].total + ).toFormat()} +
{t("jobs.labels.partstotal")} + {Dinero(job.job_totals.parts.parts.total).toFormat()} + {`(${Dinero( + job.job_totals.parts.parts.subtotal + ).toFormat()} ± ${Dinero( + job.job_totals.parts.parts.adjustments + ).toFormat()})`}
{t("jobs.labels.subletstotal")} + {Dinero(job.job_totals.parts.sublets.total).toFormat()} + {`(${Dinero( + job.job_totals.parts.sublets.subtotal + ).toFormat()} ± ${Dinero( + job.job_totals.parts.sublets.adjustments + ).toFormat()})`}
{t("jobs.labels.mapa")} + {Dinero(job.job_totals.rates.mapa.total).toFormat()} + {`(${job.job_totals.rates.mapa.hours.toFixed(2)} @ ${ + job.job_totals.rates.mapa.rate + })`}
{t("jobs.labels.mash")} + {Dinero(job.job_totals.rates.mash.total).toFormat()} + {`(${job.job_totals.rates.mash.hours.toFixed(2)} @ ${ + job.job_totals.rates.mash.rate + })`}
+
{ + if (e.detail === 3) { + try { + console.log("Job", job); + } catch { + console.log("Unable to show job."); + } + } + }} + > + + + +
+
{ + 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..8a68d651b --- /dev/null +++ b/client/src/components/job-totals-table/job-totals-table.styles.scss @@ -0,0 +1,38 @@ +.job-totals-half { + flex: 1; + display: flex; + flex-direction: column; + align-items: center; + + table { + border: 1px solid #ccc; + border-collapse: collapse; + margin: 0; + padding: 0; + width: 80%; + table-layout: fixed; + } + + table tr { + //background-color: #f8f8f8; + border: 1px solid #ddd; + padding: 0.35em; + } + + table th, + table td { + padding: 0.625em; + //text-align: center; + } + table td.currency { + text-align: right; + } +} + +.job-totals-stats { + margin: 1rem; + display: flex; + width: 100%; + //flex-direction: column; + justify-content: space-evenly; +} diff --git a/client/src/components/job-totals-table/job-totals.utility.js b/client/src/components/job-totals-table/job-totals.utility.js new file mode 100644 index 000000000..8d7ab40f6 --- /dev/null +++ b/client/src/components/job-totals-table/job-totals.utility.js @@ -0,0 +1,322 @@ +// 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 +// .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.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; +// } +// }, Dinero({ amount: 0 })); +// let ret = { +// subtotal: subtotal, +// federal_tax: subtotal.percentage((job.federal_tax_rate || 0) * 100), +// statePartsTax, +// 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 +// .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 = { +// la1: { +// hours: jobLines +// .filter((item) => item.mod_lbr_ty === "LA1") +// .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), +// rate: ratesList.rate_la1 || 0, +// }, +// la2: { +// hours: jobLines +// .filter((item) => item.mod_lbr_ty === "LA2") +// .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), +// rate: ratesList.rate_la2 || 0, +// }, +// la3: { +// rate: ratesList.rate_la3 || 0, +// hours: jobLines +// .filter((item) => item.mod_lbr_ty === "LA3") +// .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), +// }, +// la4: { +// rate: ratesList.rate_la4 || 0, +// hours: jobLines +// .filter((item) => item.mod_lbr_ty === "LA4") +// .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), +// }, +// laa: { +// rate: ratesList.rate_laa || 0, +// hours: jobLines +// .filter((item) => item.mod_lbr_ty === "LAA") +// .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), +// }, +// lab: { +// rate: ratesList.rate_lab || 0, +// hours: jobLines +// .filter((item) => item.mod_lbr_ty === "LAB") +// .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), +// }, +// lad: { +// rate: ratesList.rate_lad || 0, +// hours: jobLines +// .filter((item) => item.mod_lbr_ty === "LAD") +// .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), +// }, +// lae: { +// rate: ratesList.rate_lae || 0, +// hours: jobLines +// .filter((item) => item.mod_lbr_ty === "LAE") +// .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), +// }, +// laf: { +// rate: ratesList.rate_laf || 0, +// hours: jobLines +// .filter((item) => item.mod_lbr_ty === "LAF") +// .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), +// }, +// lag: { +// rate: ratesList.rate_lag || 0, +// hours: jobLines +// .filter((item) => item.mod_lbr_ty === "LAG") +// .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), +// }, +// lam: { +// rate: ratesList.rate_lam || 0, +// hours: jobLines +// .filter((item) => item.mod_lbr_ty === "LAM") +// .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), +// }, +// lar: { +// rate: ratesList.rate_lar || 0, +// hours: jobLines +// .filter((item) => item.mod_lbr_ty === "LAR") +// .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), +// }, +// las: { +// rate: ratesList.rate_las || 0, +// hours: jobLines +// .filter((item) => item.mod_lbr_ty === "LAS") +// .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), +// }, +// lau: { +// rate: ratesList.rate_lau || 0, +// hours: jobLines +// .filter((item) => item.mod_lbr_ty === "LAU") +// .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), +// }, +// atp: { +// rate: shoprates.rate_atp || 0, +// hours: +// jobLines.filter((item) => item.line_desc.includes("ATS Amount")) +// .length > 0 +// ? jobLines +// .filter( +// (item) => +// item.mod_lbr_ty !== "LA1" && +// item.mod_lbr_ty !== "LA2" && +// item.mod_lbr_ty !== "LA3" && +// item.mod_lbr_ty !== "LA4" && +// item.mod_lbr_ty !== "LAU" && +// item.mod_lbr_ty !== "LAG" && +// item.mod_lbr_ty !== "LAS" && +// item.mod_lbr_ty !== "LAA" +// ) +// .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0) +// : 0, +// }, +// mapa: { +// rate: ratesList.rate_mapa || 0, +// hours: jobLines +// .filter((item) => item.mod_lbr_ty === "LAR") +// .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), +// }, +// mash: { +// rate: ratesList.rate_mash || 0, +// hours: jobLines +// .filter((item) => item.mod_lbr_ty !== "LAR") +// .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), +// }, +// }; + +// let subtotal = Dinero({ amount: 0 }); +// let rates_subtotal = Dinero({ amount: 0 }); +// for (const property in ret) { +// ret[property].total = Dinero({ amount: ret[property].rate * 100 }) +// .multiply(ret[property].hours) +// .divide(10); +// subtotal = subtotal.add(ret[property].total); +// if ( +// property !== "mapa" && +// property !== "mash" +// //&& property !== "rate_atp" +// ) +// rates_subtotal = rates_subtotal.add(ret[property].total); +// } +// ret.subtotal = subtotal; +// ret.rates_subtotal = rates_subtotal; + +// return ret; +// } + +// function CalculatePartsTotals(jobLines) { +// const ret = jobLines.reduce( +// (acc, value) => { +// switch (value.part_type) { +// case "PAS": +// case "PASL": +// return { +// ...acc, +// sublets: { +// ...acc.sublets, +// 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: +// if (value.part_type === null) 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: { +// 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 +// }, +// sublets: { +// ...ret.sublets, +// total: ret.sublets.subtotal, // + ret.sublets.adjustments, +// }, +// }; +// } + +// function CalculateCustPayable(job) { +// 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..b81cb9add 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,9 +1,13 @@ -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"; -import { DateTimeFormatter } from "../../utils/DateFormatter"; +import { TimeAgoFormatter } from "../../utils/DateFormatter"; import { alphaSort } from "../../utils/sorters"; import OwnerFindModalContainer from "../owner-find-modal/owner-find-modal.container"; @@ -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 }, @@ -105,8 +109,8 @@ export default function JobsAvailableComponent({ sortOrder: state.sortedInfo.columnKey === "updated_at" && state.sortedInfo.order, render: (text, record) => ( - {record.updated_at} - ) + {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 ba4e5cfbc..b1e1b7bc7 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 @@ -1,23 +1,37 @@ -import { notification } from "antd"; -import React, { useState } from "react"; import { useMutation, useQuery } from "@apollo/react-hooks"; +import { notification } from "antd"; +import Axios from "axios"; +import Dinero from "dinero.js"; +import React, { useState } from "react"; import { useTranslation } from "react-i18next"; -import { withRouter } from "react-router-dom"; -import { DELETE_ALL_AVAILABLE_NEW_JOBS, QUERY_AVAILABLE_NEW_JOBS } from "../../graphql/available-jobs.queries"; +import { connect } from "react-redux"; +import { useHistory } from "react-router-dom"; +import { createStructuredSelector } from "reselect"; +import { logImEXEvent } from "../../firebase/firebase.utils"; +import { + DELETE_ALL_AVAILABLE_NEW_JOBS, + QUERY_AVAILABLE_NEW_JOBS, +} from "../../graphql/available-jobs.queries"; import { INSERT_NEW_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 JobsAvailableComponent from "./jobs-available-new.component"; -export default withRouter(function JobsAvailableContainer({ +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, +}); + +export function JobsAvailableContainer({ deleteJob, estDataLazyLoad, - history + bodyshop, }) { const { loading, error, data, refetch } = useQuery(QUERY_AVAILABLE_NEW_JOBS, { - fetchPolicy: "network-only" + fetchPolicy: "network-only", }); + const history = useHistory(); const { t } = useTranslation(); const [modalVisible, setModalVisible] = useState(false); @@ -27,7 +41,9 @@ export default withRouter(function JobsAvailableContainer({ const [insertNewJob] = useMutation(INSERT_NEW_JOB); const [loadEstData, estData] = estDataLazyLoad; - const onModalOk = () => { + const onModalOk = async () => { + logImEXEvent("job_import_new"); + setModalVisible(false); setInsertLoading(true); @@ -41,43 +57,60 @@ export default withRouter(function JobsAvailableContainer({ //We don't have the right data. Error! setInsertLoading(false); notification["error"]({ - message: t("jobs.errors.creating", { error: "No job data present." }) + message: t("jobs.errors.creating", { error: "No job data present." }), }); } else { + const newTotals = ( + await Axios.post("/job/totals", { + job: { + ...estData.data.available_jobs_by_pk.est_data, + joblines: estData.data.available_jobs_by_pk.est_data.joblines.data, + }, + shoprates: bodyshop.shoprates, + }) + ).data; + + const newJob = { + ...estData.data.available_jobs_by_pk.est_data, + clm_total: Dinero(newTotals.totals.total_repairs).toFormat("0.00"), + owner_owing: Dinero(newTotals.custPayable.total).toFormat("0.00"), + job_totals: newTotals, + }; + insertNewJob({ variables: { job: selectedOwner ? Object.assign( {}, - estData.data.available_jobs_by_pk.est_data, + newJob, { owner: null }, { ownerid: selectedOwner } ) - : estData.data.available_jobs_by_pk.est_data - } + : newJob, + }, }) - .then(r => { + .then((r) => { notification["success"]({ message: t("jobs.successes.created"), onClick: () => { - console.log("r", r); history.push( `/manage/jobs/${r.data.insert_jobs.returning[0].id}` ); - } + }, }); //Job has been inserted. Clean up the available jobs record. + deleteJob({ - variables: { id: estData.data.available_jobs_by_pk.id } - }).then(r => { + variables: { id: estData.data.available_jobs_by_pk.id }, + }).then((r) => { refetch(); setInsertLoading(false); }); }) - .catch(r => { + .catch((r) => { //error while inserting notification["error"]({ - message: t("jobs.errors.creating", { error: r.message }) + message: t("jobs.errors.creating", { error: r.message }), }); refetch(); setInsertLoading(false); @@ -115,4 +148,5 @@ export default withRouter(function JobsAvailableContainer({ /> ); -}); +} +export default connect(mapStateToProps, null)(JobsAvailableContainer); 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..fbe6712b0 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,9 +1,13 @@ -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"; -import { DateTimeFormatter } from "../../utils/DateFormatter"; +import { TimeAgoFormatter } from "../../utils/DateFormatter"; import { alphaSort } from "../../utils/sorters"; import JobsFindModalContainer from "../jobs-find-modal/jobs-find-modal.container"; @@ -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 }, @@ -119,21 +124,21 @@ export default function JobsAvailableSupplementComponent({ sortOrder: state.sortedInfo.columnKey === "updated_at" && state.sortedInfo.order, render: (text, record) => ( - {record.updated_at} - ) + {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 b771a76f5..2b2ce5eeb 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,41 +1,55 @@ +import { useApolloClient, useMutation, useQuery } from "@apollo/react-hooks"; import { notification } from "antd"; +import Axios from "axios"; +import Dinero from "dinero.js"; +import gql from "graphql-tag"; import React, { useState } from "react"; -import { useMutation, useQuery } from "@apollo/react-hooks"; import { useTranslation } from "react-i18next"; -import { withRouter } from "react-router-dom"; +import { connect } from "react-redux"; +import { useHistory } from "react-router-dom"; +import { createStructuredSelector } from "reselect"; +import { logImEXEvent } from "../../firebase/firebase.utils"; import { DELETE_ALL_AVAILABLE_SUPPLEMENT_JOBS, - QUERY_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"; -export default withRouter(function JobsAvailableSupplementContainer({ +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, +}); + +export function JobsAvailableSupplementContainer({ deleteJob, estDataLazyLoad, - history + 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); @@ -49,48 +63,72 @@ export default withRouter(function JobsAvailableSupplementContainer({ //We don't have the right data. Error! setInsertLoading(false); notification["error"]({ - message: t("jobs.errors.creating", { error: "No job data present." }) + message: t("jobs.errors.creating", { error: "No job data present." }), }); } else { //create upsert job let supp = estData.data.available_jobs_by_pk.est_data; - console.log("supp before", supp); - delete supp.joblines; - //TODO How to update the estimate lines. + delete supp.owner; delete supp.vehicle; - if (importOptions.overrideHeaders) { - HeaderFields.forEach(item => delete supp[item]); + HeaderFields.forEach((item) => delete supp[item]); } + const newTotals = ( + await Axios.post("/job/totals", { + job: { + ...estData.data.available_jobs_by_pk.est_data, + joblines: estData.data.available_jobs_by_pk.est_data.joblines.data, + }, + shoprates: bodyshop.shoprates, + }) + ).data; + + 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 - } + job: { + ...supp, + clm_total: Dinero(newTotals.totals.total_repairs).toFormat("0.00"), + owner_owing: Dinero(newTotals.custPayable.total).toFormat("0.00"), + job_totals: newTotals, + }, + }, }) - .then(r => { + .then((r) => { notification["success"]({ message: t("jobs.successes.supplemented"), onClick: () => { history.push( `/manage/jobs/${r.data.update_jobs.returning[0].id}` ); - } + }, }); //Job has been inserted. Clean up the available jobs record. deleteJob({ - variables: { id: estData.data.available_jobs_by_pk.id } - }).then(r => { + variables: { id: estData.data.available_jobs_by_pk.id }, + }).then((r) => { refetch(); setInsertLoading(false); }); }) - .catch(r => { + .catch((r) => { //error while inserting notification["error"]({ - message: t("jobs.errors.creating", { error: r.message }) + message: t("jobs.errors.creating", { error: r.message }), }); refetch(); setInsertLoading(false); @@ -100,6 +138,7 @@ export default withRouter(function JobsAvailableSupplementContainer({ const onModalCancel = () => { setModalVisible(false); + modalSearchState[1](""); setSelectedJob(null); }; @@ -125,7 +164,9 @@ export default withRouter(function JobsAvailableSupplementContainer({ loadEstData={loadEstData} estData={estData} importOptionsState={importOptionsState} + modalSearchState={modalSearchState} /> ); -}); +} +export default connect(mapStateToProps, null)(JobsAvailableSupplementContainer); 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..7ffaaf315 --- /dev/null +++ b/client/src/components/jobs-close-save-button/jobs-close-save-button.component.jsx @@ -0,0 +1,72 @@ +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, + + 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..1fb739d58 --- /dev/null +++ b/client/src/components/jobs-close-totals/jobs-close-totals.component.jsx @@ -0,0 +1,79 @@ +import { Descriptions, Statistic } from "antd"; +import React from "react"; +import { useTranslation } from "react-i18next"; +import Dinero from "dinero.js"; + +export default function JobsCloseTotals({ + jobTotals, + labMatTotal, + partsTotal, +}) { + const { t } = useTranslation(); + return ( +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ ); +} diff --git a/client/src/components/jobs-convert-button/jobs-convert-button.component.jsx b/client/src/components/jobs-convert-button/jobs-convert-button.component.jsx new file mode 100644 index 000000000..3d3e63c3f --- /dev/null +++ b/client/src/components/jobs-convert-button/jobs-convert-button.component.jsx @@ -0,0 +1,99 @@ +import { Button, notification, Popover, Form, Select } from "antd"; +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 { CONVERT_JOB_TO_RO } from "../../graphql/jobs.queries"; +import { selectBodyshop } from "../../redux/user/user.selectors"; + +const mapStateToProps = createStructuredSelector({ + //currentUser: selectCurrentUser + bodyshop: selectBodyshop, +}); +const mapDispatchToProps = (dispatch) => ({ + //setUserLanguage: language => dispatch(setUserLanguage(language)) +}); + +export function JobsConvertButton({ bodyshop, job, refetch }) { + const [visible, setVisible] = useState(false); + const [mutationConvertJob] = useMutation(CONVERT_JOB_TO_RO); + const { t } = useTranslation(); + + const handleConvert = (values) => { + mutationConvertJob({ + variables: { jobId: job.id, ...values }, + }).then((r) => { + refetch(); + + notification["success"]({ + message: t("jobs.successes.converted"), + }); + }); + }; + + const popMenu = ( +
+
+ + + + + + + + +
+
+ ); + + return ( + + + + ); +} +export default connect(mapStateToProps, mapDispatchToProps)(JobsConvertButton); 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..84e917bf9 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,10 +1,23 @@ -import { Collapse, Form, Input, InputNumber, Switch, DatePicker } from "antd"; +import { Collapse, Form, Input, InputNumber, Select, Switch } 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 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 mapStateToProps = createStructuredSelector({ + //currentUser: selectCurrentUser + bodyshop: selectBodyshop, +}); +const mapDispatchToProps = (dispatch) => ({ + //setUserLanguage: language => dispatch(setUserLanguage(language)) +}); + +export function JobsCreateJobsInfo({ bodyshop, form, selected }) { const { t } = useTranslation(); const { getFieldValue } = form; return ( @@ -14,116 +27,167 @@ export default function JobsCreateJobsInfo({ form }) { key="insurance" header={t("menus.jobsdetail.insurance")} > - - - - - - - - - - - - - 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? - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Appraiser Info + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + TODO How to handle different taxes and marking them as exempt? { // @@ -132,159 +196,136 @@ 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? - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + TODO This is equivalent of GST payable. + + + + + + + + + + + + + + + + Totals Table + + + + + + + + + + + + + + + + + + + + + + + + + + + + Note //TODO Remove ATP rate? + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
); } +export default connect(mapStateToProps, mapDispatchToProps)(JobsCreateJobsInfo); 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..be6a3dda0 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,22 +1,22 @@ -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 ; return ( ); } diff --git a/client/src/components/jobs-create-owner-info/jobs-create-owner-info.new.component.jsx b/client/src/components/jobs-create-owner-info/jobs-create-owner-info.new.component.jsx index 2b3fa0380..ad8efd6a7 100644 --- a/client/src/components/jobs-create-owner-info/jobs-create-owner-info.new.component.jsx +++ b/client/src/components/jobs-create-owner-info/jobs-create-owner-info.new.component.jsx @@ -4,6 +4,7 @@ import { useTranslation } from "react-i18next"; import JobCreateContext from "../../pages/jobs-create/jobs-create.context"; 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 JobsCreateOwnerInfoNewComponent() { const [state, setState] = useContext(JobCreateContext); @@ -20,103 +21,138 @@ export default function JobsCreateOwnerInfoNewComponent() { owner: { ...state.owner, new: !state.owner.new, - selectedid: null - } + selectedid: null, + }, }); }} > {t("jobs.labels.create.newowner")}
- - - - - - - - - - - - - - - - - - - - - + + + + + + + + - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); } 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..ef0ee1422 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,16 @@ 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_co_nm"), + dataIndex: "ownr_co_nm", + key: "ownr_co_nm", + sorter: (a, b) => alphaSort(a.ownr_co_nm, b.ownr_co_nm), + sortOrder: + tableState.sortedInfo.columnKey === "ownr_co_nm" && + tableState.sortedInfo.order, }, { title: t("owners.fields.ownr_addr1"), @@ -43,7 +52,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 +61,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 +70,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 +82,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" + scroll={{ x: true }} pagination={{ position: "top" }} - columns={columns.map(item => ({ ...item }))} + 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 +137,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 deleted file mode 100644 index 0e5078cb3..000000000 --- a/client/src/components/jobs-detail-claims/jobs-detail-claims.component.jsx +++ /dev/null @@ -1,48 +0,0 @@ -import { Form, Input, Switch } from "antd"; -import React from "react"; -import { useTranslation } from "react-i18next"; - -export default function JobsDetailClaims({ job }) { - const { t } = useTranslation(); - - return ( -
- - - - - - - TODO How to handle different taxes and marking them as exempt? - { - // - // {getFieldDecorator("exempt", { - // initialValue: job.exempt - // })()} - // - } - - - - - - - - - - - - - - - - - - -
- ); -} 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 deleted file mode 100644 index bbba78b5e..000000000 --- a/client/src/components/jobs-detail-financial/jobs-detail-financial.component.jsx +++ /dev/null @@ -1,131 +0,0 @@ -import { Divider, Form, Input, InputNumber } from "antd"; -import React from "react"; -import { useTranslation } from "react-i18next"; - -export default function JobsDetailFinancials({ job }) { - const { t } = useTranslation(); - - return ( -
- - - - - - - - - - TODO This is equivalent of GST payable. - - - - TODO equivalent of other customer amount - - - - - - - - - - - - - - Totals Table - - - - - - - - - - - - - - - - - - - - - - - - - - - - Note //TODO Remove ATP rate? - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- ); -} diff --git a/client/src/components/jobs-detail-general/jobs-detail-general.component.jsx b/client/src/components/jobs-detail-general/jobs-detail-general.component.jsx new file mode 100644 index 000000000..6357bfa12 --- /dev/null +++ b/client/src/components/jobs-detail-general/jobs-detail-general.component.jsx @@ -0,0 +1,219 @@ +import { Col, Form, Input, InputNumber, Row, Select, Switch } 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 FormDatePicker from "../form-date-picker/form-date-picker.component"; +import CurrencyInput from "../form-items-formatted/currency-form-item.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"; + +const mapStateToProps = createStructuredSelector({ + //currentUser: selectCurrentUser + bodyshop: selectBodyshop, +}); +const mapDispatchToProps = (dispatch) => ({ + //setUserLanguage: language => dispatch(setUserLanguage(language)) +}); + +const lossColFields = { sm: { span: 24 }, md: { span: 18 }, lg: { span: 20 } }; +const lossColDamage = { sm: { span: 24 }, md: { span: 6 }, lg: { span: 4 } }; +export function JobsDetailGeneral({ bodyshop, job, form }) { + const { getFieldValue } = form; + const { t } = useTranslation(); + + return ( +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + {job.area_of_damage ? ( + + ) : ( + t("jobs.errors.nodamage") + )} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); +} +export default connect(mapStateToProps, mapDispatchToProps)(JobsDetailGeneral); 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 7b585db89..b86523e89 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,30 +1,178 @@ -import React from "react"; -import { Menu, Dropdown, Button } from "antd"; -import { useTranslation } from "react-i18next"; import { DownCircleFilled } from "@ant-design/icons"; -import { Link } from "react-router-dom"; +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 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"; -export default function JobsDetailHeaderActions({ job }) { +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, +}); + +const mapDispatchToProps = (dispatch) => ({ + 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, + 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")} + + + {!!job.intakechecklist ? ( + t("jobs.actions.intake") + ) : ( + + {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( + client, + job.id, + { defaultOpenStatus: bodyshop.md_ro_statuses.default_imported }, + (newJobId) => { + history.push(`/manage/jobs/${newJobId}`); + } + ) + } + 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 ( - + ); } +export default connect( + mapStateToProps, + mapDispatchToProps +)(JobsDetailHeaderActions); 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.util.js b/client/src/components/jobs-detail-header-actions/jobs-detail-header-actions.duplicate.util.js new file mode 100644 index 000000000..08891ade7 --- /dev/null +++ b/client/src/components/jobs-detail-header-actions/jobs-detail-header-actions.duplicate.util.js @@ -0,0 +1,50 @@ +import { + QUERY_ALL_JOB_FIELDS, + INSERT_NEW_JOB, +} from "../../graphql/jobs.queries"; +import { logImEXEvent } from "../../firebase/firebase.utils"; + +export default function DuplicateJob( + apolloClient, + jobId, + config, + completionCallback +) { + logImEXEvent("job_duplicate"); + + const { defaultOpenStatus } = config; + //get a list of all fields on the job + apolloClient + .query({ query: QUERY_ALL_JOB_FIELDS, variables: { id: jobId } }) + .then((res) => { + const { jobs_by_pk: existingJob } = res.data; + delete existingJob.__typename; + delete existingJob.id; + + existingJob.date_estimated = new Date(); + existingJob.status = defaultOpenStatus; + + const _tempLines = existingJob.joblines; + _tempLines.forEach((line) => { + delete line.id; + delete line.__typename; + }); + + delete existingJob.joblines; + existingJob.joblines = { data: _tempLines }; + + apolloClient + .mutate({ + mutation: INSERT_NEW_JOB, + variables: { job: [existingJob] }, + }) + .then((res2) => { + if (completionCallback) + completionCallback(res2.data.insert_jobs.returning[0].id); + }); + }); + + //insert the new job. call the callback with the returned ID when done. + + return; +} 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 03269ccd5..c190dadc7 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,166 +1,125 @@ -import { DownCircleFilled } from "@ant-design/icons"; -import { - Avatar, - Badge, - Button, - Checkbox, - Descriptions, - Dropdown, - Menu, - notification, - PageHeader, - Tag -} from "antd"; +import { DownCircleFilled, PrinterFilled } from "@ant-design/icons"; +import { Button, Dropdown, Menu, PageHeader, Tag } from "antd"; import React from "react"; import { useTranslation } from "react-i18next"; -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 JobEmployeeAssignments from "../job-employee-assignments/job-employee-assignments.container"; +import JobsConvertButton from "../jobs-convert-button/jobs-convert-button.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 "./jobs-detail-header.styles.scss"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop + bodyshop: selectBodyshop, }); -export default connect( - mapStateToProps, - null -)(function JobsDetailHeader({ +const mapDispatchToProps = (dispatch) => ({ + setPrintCenterContext: (context) => + dispatch(setModalContext({ context: context, modal: "printCenter" })), +}); + +export function JobsDetailHeader({ job, - mutationConvertJob, refetch, - scheduleModalState, + setPrintCenterContext, bodyshop, - updateJobStatus + updateJobStatus, + setScheduleContext, + loading, + form, }) { const { t } = useTranslation(); - const setscheduleModalVisible = scheduleModalState[1]; - - const tombstoneTitle = ( -
- - {job.ro_number - ? `${t("jobs.fields.ro_number")} ${job.ro_number}` - : `EST-${job.est_number}`} -
- ); const statusmenu = ( { + onClick={(e) => { updateJobStatus(e.key); }} > - {bodyshop.md_ro_statuses.statuses.map(item => ( + {bodyshop.md_ro_statuses.statuses.map((item) => ( {item} ))} ); - const menuExtra = [ - - - , - - - , - +
- notification["success"]({ - message: t("jobs.successes.converted") + , - , - - ]; + }} + key="printing" + > + + {t("jobs.actions.printCenter")} + + + + + + ); 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}` } + subTitle={job.status} + tags={[ + , + , + + {t("jobs.labels.inproduction")} + , + + {job.clm_total} + / + {job.owner_owing} + , + ]} extra={menuExtra} > - - - {job.clm_total} - - - - ##NO BINDING YET## - - - - - - - - {job.scheduled_completion ? ( - {job.scheduled_completion} - ) : null} - - - - {job.cccontracts && - job.cccontracts.map(item => ( - -
{`${item.agreementnumber} - ${item.start} - ${item.scheduledreturn}`}
- - ))} -
-
+
+ +
); -}); +} + +export default connect(mapStateToProps, mapDispatchToProps)(JobsDetailHeader); 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 deleted file mode 100644 index 4c79e57db..000000000 --- a/client/src/components/jobs-detail-insurance/jobs-detail-insurance.component.jsx +++ /dev/null @@ -1,117 +0,0 @@ -import { DatePicker, Divider, Form, Input } from "antd"; -import React from "react"; -import { useTranslation } from "react-i18next"; -import FormItemEmail from "../form-items-formatted/email-form-item.component"; -import FormItemPhone from "../form-items-formatted/phone-form-item.component"; - -export default function JobsDetailInsurance({ job, form }) { - const { getFieldValue } = form; - const { t } = useTranslation(); - //initialValue: job.loss_date ? moment(job.loss_date) : null - console.log("job", job); - 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? -
- ); -} 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 new file mode 100644 index 000000000..93ded43a6 --- /dev/null +++ b/client/src/components/jobs-detail-labor/jobs-detail-labor.component.jsx @@ -0,0 +1,35 @@ +import React from "react"; +import LaborAllocationsTableComponent from "../labor-allocations-table/labor-allocations-table.component"; +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 ( +
+ {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 new file mode 100644 index 000000000..22c4f16d7 --- /dev/null +++ b/client/src/components/jobs-detail-labor/jobs-detail-labor.container.jsx @@ -0,0 +1,25 @@ +import { useQuery } from "@apollo/react-hooks"; +import React from "react"; +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, techConsole }) { + const { loading, error, data, refetch } = useQuery(GET_LINE_TICKET_BY_PK, { + variables: { id: jobId }, + skip: !!!jobId, + }); + + if (error) return ; + + return ( + + ); +} 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 df0c2108e..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,47 +1,65 @@ -import { Button } from "antd"; +import { Col, Row } from "antd"; import React from "react"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { setModalContext } from "../../redux/modals/modals.actions"; -import InvoicesListTableComponent from "../invoices-list-table/invoices-list-table.component"; 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 mapStateToProps = createStructuredSelector({ - //currentUser: selectCurrentUser -}); -const mapDispatchToProps = dispatch => ({ - setInvoiceEnterContext: context => - dispatch(setModalContext({ context: context, modal: "invoiceEnter" })) -}); -export default connect( - mapStateToProps, - mapDispatchToProps -)(function JobsDetailPliComponent({ - setInvoiceEnterContext, +const totalsCol = { + xs: { + span: 24, + }, + md: { + span: 4, + }, +}; + +export default function JobsDetailPliComponent({ job, - invoicesQuery + invoicesQuery, + handleInvoiceOnRowClick, + handlePartsOrderOnRowClick, + selectedInvoice, }) { return (
- + {invoicesQuery.error ? ( ) : null} - + +
+ + + + + + + ); -}); +} 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 3c955bf50..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,12 +1,48 @@ -import React from "react"; import { useQuery } from "@apollo/react-hooks"; -import JobsDetailPliComponent from "./jobs-detail-pli.component"; +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, { variables: { jobid: job.id }, - fetchPolicy: "network-only" }); - return ; + const search = queryString.parse(useLocation().search); + const history = useHistory(); + + const handleInvoiceOnRowClick = (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 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-detail-rates/jobs-detail-rates.component.jsx b/client/src/components/jobs-detail-rates/jobs-detail-rates.component.jsx new file mode 100644 index 000000000..c9251e925 --- /dev/null +++ b/client/src/components/jobs-detail-rates/jobs-detail-rates.component.jsx @@ -0,0 +1,134 @@ +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"; +import CurrencyInput from "../form-items-formatted/currency-form-item.component"; +import FormRow from "../layout-form-row/layout-form-row.component"; + +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, +}); + +export function JobsDetailRates({ job, bodyshop }) { + const { t } = useTranslation(); + + return ( +
+ + +
+ + + + + + + + + + + + + {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)(JobsDetailTotals); 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 new file mode 100644 index 000000000..1229947a3 --- /dev/null +++ b/client/src/components/jobs-documents-gallery/jobs-document-gallery.download.component.jsx @@ -0,0 +1,27 @@ +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 handleDownload = () => { + logImEXEvent("jobs_documents_download"); + + axios + .post("/media/download", { + ids: imagesToDownload.map((_) => _.key), + }) + .then((r) => { + window.open(r.data); + }); + }; + + 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 44de66731..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 @@ -1,105 +1,63 @@ -import axios from "axios"; import React, { useEffect, useState } from "react"; import Gallery from "react-grid-gallery"; -//import { Document, Page, pdfjs } from "react-pdf"; import DocumentsUploadContainer from "../documents-upload/documents-upload.container"; -//import LoadingSpinner from "../loading-spinner/loading-spinner.component"; -import { Collapse } from "antd"; -import { useTranslation } from "react-i18next"; +import JobsDocumentsDownloadButton from "./jobs-document-gallery.download.component"; +import JobsDocumentsDeleteButton from "./jobs-documents-gallery.delete.component"; -//pdfjs.GlobalWorkerOptions.workerSrc = `https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.1.266/pdf.worker.min.js`; - -function JobsDocumentsComponent({ data, jobId, refetch }) { +function JobsDocumentsComponent({ + data, + jobId, + refetch, + invoiceId, + invoicesCallback, +}) { const [galleryImages, setgalleryImages] = useState([]); - const [pdfDocuments, setPdfDocuments] = useState([]); useEffect(() => { setgalleryImages( - data - .filter(item => item.thumb_url !== "application/pdf") - .reduce((acc, value) => { - acc.push({ - src: value.url, - thumbnail: value.thumb_url, - thumbnailHeight: 150, - thumbnailWidth: 150, - isSelected: false - }); - return acc; - }, []) + 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}/${process.env.REACT_APP_CLOUDINARY_THUMB_TRANSFORMATIONS}/${value.key}.jpg`, + tags: value.type.includes("pdf") + ? [{ value: "PDF", title: "PDF" }] + : [], + thumbnailHeight: 200, + thumbnailWidth: 200, + isSelected: false, + key: value.key, + id: value.id, + }); + return acc; + }, []) ); }, [data, setgalleryImages]); - useEffect(() => { - setPdfDocuments( - data - .filter(item => item.thumb_url === "application/pdf") - .reduce((acc, value) => { - acc.push({ - src: value.url, - thumbnail: value.thumb_url, - thumbnailHeight: 150, - thumbnailWidth: 150, - isSelected: false - }); - return acc; - }, []) - ); - }, [data, setPdfDocuments]); - const { t } = useTranslation(); return ( -
- - +
+ - - - { - setPdfDocuments( - pdfDocuments.map((g, idx) => - index === idx ? { ...g, isSelected: !g.isSelected } : g - ) - ); - }} - /> - - - { - setgalleryImages( - galleryImages.map((g, idx) => - index === idx ? { ...g, isSelected: !g.isSelected } : g - ) - ); - }} - > - - { - // - // {pdfDocuments.map((doc, idx) => ( - // } file={doc.src}> - // - // - // ))} - // - } - + + + + { + setgalleryImages( + galleryImages.map((g, idx) => + index === idx ? { ...g, isSelected: !g.isSelected } : g + ) + ); + }} + />
); } diff --git a/client/src/components/jobs-documents-gallery/jobs-documents-gallery.container.jsx b/client/src/components/jobs-documents-gallery/jobs-documents-gallery.container.jsx index 8c1de1f84..f162d9cd7 100644 --- a/client/src/components/jobs-documents-gallery/jobs-documents-gallery.container.jsx +++ b/client/src/components/jobs-documents-gallery/jobs-documents-gallery.container.jsx @@ -5,14 +5,28 @@ import AlertComponent from "../alert/alert.component"; import LoadingSpinner from "../loading-spinner/loading-spinner.component"; import JobDocuments from "./jobs-documents-gallery.component"; -export default function JobsDocumentsContainer({ jobId }) { +export default function JobsDocumentsContainer({ + jobId, + invoiceId, + documentsList, + invoicesCallback, +}) { const { loading, error, data, refetch } = useQuery(GET_DOCUMENTS_BY_JOB, { variables: { jobId: jobId }, - fetchPolicy: "network-only" + fetchPolicy: "network-only", + skip: !!invoiceId, }); if (loading) 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 new file mode 100644 index 000000000..7142170f0 --- /dev/null +++ b/client/src/components/jobs-documents-gallery/jobs-documents-gallery.delete.component.jsx @@ -0,0 +1,81 @@ +import { Button, notification } from "antd"; +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, + deletionCallback, +}) { + 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; + + axios + .post("/media/sign", { + public_id: public_id, + timestamp: timestamp, + }) + .then((response) => { + var signature = response.data; + var options = { + headers: { "X-Requested-With": "XMLHttpRequest" }, + }; + const formData = new FormData(); + formData.append("api_key", process.env.REACT_APP_CLOUDINARY_API_KEY); + formData.append("public_id", public_id); + formData.append("timestamp", timestamp); + formData.append("signature", signature); + + axios + .post( + `${process.env.REACT_APP_CLOUDINARY_ENDPOINT}/destroy`, + formData, + options + ) + .then((response) => { + deleteDocument({ variables: { id: image.id } }) + .then((r) => { + if (deletionCallback) deletionCallback(); + }) + .catch((error) => { + notification["error"]({ + message: t("documents.errors.deleting", { + message: JSON.stringify(error), + }), + }); + }); + //Delete it from our database. + }) + .catch((error) => { + notification["error"]({ + message: t("documents.errors.deleting_cloudinary", { + message: JSON.stringify(error), + }), + }); + }); + }); + }); + 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..8b8fcabac --- /dev/null +++ b/client/src/components/jobs-export-all-button/jobs-export-all-button.component.jsx @@ -0,0 +1,131 @@ +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)}`, + }, + } + ); + } 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 1ba0d8be8..98a00e5b2 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"), @@ -40,13 +43,17 @@ export default function JobsFindModalComponent({ render: (text, record) => { return record.owner ? ( - {record.ownr_fn} {record.ownr_ln} + {`${record.ownr_fn || ""} ${record.ownr_ln || ""} ${ + record.ownr_co_nm || "" + }`} ) : ( // t("jobs.errors.noowner") - {`${record.ownr_fn} ${record.ownr_ln}`} + {`${record.ownr_fn || ""} ${record.ownr_ln || ""} ${ + record.ownr_co_nm || "" + }`} ); - } + }, }, { title: t("jobs.fields.ownr_ph1"), @@ -60,7 +67,7 @@ export default function JobsFindModalComponent({ ) : ( t("general.labels.unknown") ); - } + }, }, { title: t("jobs.fields.status"), @@ -70,7 +77,7 @@ export default function JobsFindModalComponent({ ellipsis: true, render: (text, record) => { return record.status || t("general.labels.na"); - } + }, }, { @@ -82,13 +89,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"), @@ -97,12 +105,12 @@ export default function JobsFindModalComponent({ width: "8%", ellipsis: true, render: (text, record) => { - return record.vehicle.plate_no ? ( - {record.vehicle.plate_no} + return record.plate_no ? ( + {record.plate_no} ) : ( t("general.labels.unknown") ); - } + }, }, { title: t("jobs.fields.clm_no"), @@ -116,11 +124,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 +141,52 @@ 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, }) } > 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..f0c8bb6e4 --- /dev/null +++ b/client/src/components/jobs-list-paginated/jobs-list-paginated.component.jsx @@ -0,0 +1,216 @@ +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_co_nm || "" + }`} + + ) : ( + {`${record.ownr_fn || ""} ${record.ownr_ln || ""} ${ + record.ownr_co_nm || "" + }`} + ); + }, + }, + { + 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 690fee55b..9dcf55eb5 100644 --- a/client/src/components/jobs-list/jobs-list.component.jsx +++ b/client/src/components/jobs-list/jobs-list.component.jsx @@ -1,144 +1,214 @@ -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"; -export default withRouter(function JobsList({ - searchTextState, - refetch, - loading, - jobs, - selectedJob, - setSelectedJob, - history -}) { +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: "" } + 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.ro_number || "") + .toString() + .toLowerCase() + .includes(searchText.toLowerCase()) || + (j.ownr_co_nm || "") + .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 setSearchText = searchTextState[1]; const columns = [ { title: t("jobs.fields.ro_number"), dataIndex: "ro_number", key: "ro_number", - width: "8%", - // onFilter: (value, record) => record.ro_number.includes(value), - // filteredValue: state.filteredInfo.text || null, - sorter: (a, b) => - alphaSort( - a.ro_number ? a.ro_number : "EST-" + a.est_number, - b.ro_number ? b.ro_number : "EST-" + 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 : "EST-" + 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_co_nm || "" + }`} ) : ( - // t("jobs.errors.noowner") - {`${record.ownr_fn} ${record.ownr_ln}`} + {`${record.ownr_fn || ""} ${record.ownr_ln || ""} ${ + record.ownr_co_nm || "" + }`} ); - } + }, }, { 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} - + - ) : ( - t("general.labels.unknown") - ); - } + ) : null; + }, }, { 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"); - } + }, }, { 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 || "" + }`} ) : ( - t("jobs.errors.novehicle") + {`${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: state.sortedInfo.columnKey === "plate_no" && state.sortedInfo.order, render: (text, record) => { - return record.plate_no ? ( - {record.plate_no} - ) : ( - t("general.labels.unknown") - ); - } + 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: @@ -149,13 +219,12 @@ export default withRouter(function JobsList({ ) : ( 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: state.sortedInfo.columnKey === "clm_total" && state.sortedInfo.order, @@ -165,81 +234,63 @@ export default withRouter(function JobsList({ ) : ( t("general.labels.unknown") ); - } + }, }, { title: t("jobs.fields.owner_owing"), dataIndex: "owner_owing", key: "owner_owing", - width: "8%", - render: (text, record) => { - return record.owner_owing ? ( - {record.owner_owing} - ) : ( - t("general.labels.unknown") - ); - } - } + render: (text, record) => ( + {record.owner_owing} + ), + }, ]; - const handleTableChange = (pagination, filters, sorter) => { - setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); - }; - - // const handleChange = event => { - // const { value } = event.target; - // setState({ ...state, filterinfo: { text: [value] } }); - // }; - - const handleOnRowClick = record => { - if (record) { - if (record.id) { - setSelectedJob(record.id); - return; - } - } - setSelectedJob(null); - }; - return ( -
-
{ - return ( -
- - { - setSearchText(e.target.value); - }} - enterButton - /> -
- ); - }} - size="small" - pagination={{ position: "top" }} - columns={columns.map(item => ({ ...item }))} - rowKey="id" - dataSource={jobs} - rowSelection={{ selectedRowKeys: [selectedJob] }} - 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 - }; - }} - /> - +
{ + 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)(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 13f5cc0db..6c9300742 100644 --- a/client/src/components/jobs-notes/jobs.notes.component.jsx +++ b/client/src/components/jobs-notes/jobs.notes.component.jsx @@ -1,25 +1,33 @@ -import React, { useState } from "react"; -import { Table, Button, notification } from "antd"; import { - WarningFilled, - EyeInvisibleFilled, DeleteFilled, - EditFilled + EditFilled, + EyeInvisibleFilled, + WarningFilled } from "@ant-design/icons"; +import { Button, Table } from "antd"; +import React from "react"; import { useTranslation } from "react-i18next"; import Moment from "react-moment"; +import { connect } from "react-redux"; +import { setModalContext } from "../../redux/modals/modals.actions"; import NoteUpsertModal from "../note-upsert-modal/note-upsert-modal.container"; -export default function JobNotesComponent({ +const mapDispatchToProps = (dispatch) => ({ + setNoteUpsertContext: (context) => + dispatch(setModalContext({ context: context, modal: "noteUpsert" })), +}); + +export function JobNotesComponent({ loading, data, refetch, - deleteNote, - jobId + handleNoteDelete, + jobId, + setNoteUpsertContext, + deleteLoading, }) { const { t } = useTranslation(); - const [noteModalVisible, setNoteModalVisible] = useState(false); - const [existingNote, setExistingNote] = useState(null); + const columns = [ { title: "", @@ -28,19 +36,18 @@ export default function JobNotesComponent({ width: 80, render: (text, record) => ( - {" "} {record.critical ? ( ) : null} {record.private ? : null} - ) + ), }, { title: t("notes.fields.text"), dataIndex: "text", key: "text", - ellipsis: true + ellipsis: true, }, { @@ -54,13 +61,13 @@ export default 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"), @@ -70,47 +77,40 @@ export default function JobNotesComponent({ render: (text, record) => ( - ) - } + ), + }, ]; return (
- +
({ ...item }))} + columns={columns.map((item) => ({ ...item }))} rowKey="id" dataSource={data} /> ); } +export default connect(null, mapDispatchToProps)(JobNotesComponent); 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 new file mode 100644 index 000000000..8599e61a2 --- /dev/null +++ b/client/src/components/labor-allocations-table/labor-allocations-table.component.jsx @@ -0,0 +1,65 @@ +import React, { useState, useEffect } from "react"; +import { Typography, Row, Col } from "antd"; +import { useTranslation } from "react-i18next"; +import { CalculateAllocationsTotals } from "./labor-allocations-table.utility"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, +}); + +export function LaborAllocationsTable({ joblines, timetickets, bodyshop }) { + const { t } = useTranslation(); + + const [totals, setTotals] = useState([]); + useEffect(() => { + if (!!joblines && !!timetickets && !!bodyshop); + setTotals( + CalculateAllocationsTotals( + bodyshop.md_responsibility_centers, + joblines, + timetickets + ) + ); + }, [joblines, timetickets, bodyshop]); + + return ( +
+ + {t("jobs.labels.laborallocations")} + + + +
+ {t("timetickets.fields.cost_center")} + + + {t("jobs.labels.hrs_total")} + + + {t("jobs.labels.hrs_claimed")} + + + {t("jobs.labels.difference")} + + + {totals.map((t, idx) => ( + + {t.cost_center} + {t.total.toFixed(2)} + {t.claimed.toFixed(2)} + + 0 ? "green" : "red", + }}> + {(t.total - t.claimed).toFixed(2)} + + + + ))} + + ); +} +export default connect(mapStateToProps, null)(LaborAllocationsTable); 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 new file mode 100644 index 000000000..8d36bcfdd --- /dev/null +++ b/client/src/components/labor-allocations-table/labor-allocations-table.utility.js @@ -0,0 +1,29 @@ +export const CalculateAllocationsTotals = ( + responsibilitycenters, + joblines, + timetickets +) => { + const jobCodes = joblines + .map((item) => item.mod_lbr_ty) + .filter((value, index, self) => self.indexOf(value) === index && !!value); + const ticketCodes = timetickets + .map((item) => item.cieca_code) + .filter((value, index, self) => self.indexOf(value) === index && !!value); + const allCodes = [...jobCodes, ...ticketCodes]; + + const r = allCodes.reduce((acc, value) => { + acc.push({ + opcode: 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), + claimed: timetickets.reduce((acc3, val3) => { + return val3.ciecacode === value ? acc3 + val3.productivehrs : acc3; + }, 0), + }); + return acc; + }, []); + + return r; +}; 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/not-found/not-found.component.jsx b/client/src/components/not-found/not-found.component.jsx new file mode 100644 index 000000000..3ecc6a307 --- /dev/null +++ b/client/src/components/not-found/not-found.component.jsx @@ -0,0 +1,16 @@ +import React from "react"; +import { Result } from "antd"; +import { useTranslation } from "react-i18next"; + +export default function NotFound() { + const { t } = useTranslation(); + return ( +
+ +
+ ); +} 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 62bf4ed11..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,58 +1,43 @@ -import { Input, Modal, Switch } from "antd"; +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({ - visible, - changeVisibility, - noteState, - setNoteState, - updateExistingNote, - insertNewNote -}) { +export default function NoteUpsertModalComponent({ form }) { const { t } = useTranslation(); return ( - { - noteState.id ? updateExistingNote() : insertNewNote(); - }} - onCancel={() => { - changeVisibility(false); - }} - > -
- {t("notes.fields.critical")} - { - setNoteState({ ...noteState, critical: checked }); - }} +
+ + + + + + + + -
-
- {t("notes.fields.private")} - { - setNoteState({ ...noteState, private: checked }); - }} - /> -
- - { - setNoteState({ ...noteState, text: e.target.value }); - }} - /> - + + +
); } 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 21cff1230..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 @@ -1,84 +1,103 @@ -import { notification } from "antd"; -import React, { useEffect, useState } from "react"; import { useMutation } from "@apollo/react-hooks"; +import { Form, Modal, notification } from "antd"; +import React, { useEffect } from "react"; import { useTranslation } from "react-i18next"; -import { INSERT_NEW_NOTE, UPDATE_NOTE } from "../../graphql/notes.queries"; -import NoteUpsertModalComponent from "./note-upsert-modal.component"; - - import { connect } from "react-redux"; import { createStructuredSelector } from "reselect"; +import { INSERT_NEW_NOTE, UPDATE_NOTE } from "../../graphql/notes.queries"; +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 + currentUser: selectCurrentUser, + noteUpsertModal: selectNoteUpsert, +}); +const mapDispatchToProps = (dispatch) => ({ + toggleModalVisible: () => dispatch(toggleModalVisible("noteUpsert")), }); -export default connect (mapStateToProps,null)( function NoteUpsertModalContainer({ - jobId, - visible, - changeVisibility, - refetch, - existingNote,currentUser +export function NoteUpsertModalContainer({ + currentUser, + noteUpsertModal, + toggleModalVisible, }) { const { t } = useTranslation(); const [insertNote] = useMutation(INSERT_NEW_NOTE); const [updateNote] = useMutation(UPDATE_NOTE); - const [noteState, setNoteState] = useState({ - private: false, - critical: false, - text: "" - }); + const { visible, context, actions } = noteUpsertModal; + const { jobId, existingNote } = context; + const { refetch } = actions; + + const [form] = Form.useForm(); useEffect(() => { //Required to prevent infinite looping. if (existingNote) { - setNoteState(existingNote); + form.resetFields(); } - }, [existingNote]); + }, [existingNote, form]); - const insertNewNote = () => { - insertNote({ - variables: { - noteInput: [ - { ...noteState, jobid: jobId, created_by: currentUser.email } - ] - } - }).then(r => { - refetch(); - changeVisibility(!visible); - notification["success"]({ - message: t("notes.successes.create") - }); - }); - }; + const handleFinish = (values) => { + if (existingNote) { + logImEXEvent("job_note_update"); - const updateExistingNote = () => { - //Required, otherwise unable to spread in new note prop. - delete noteState.__typename; - updateNote({ - variables: { - noteId: noteState.id, - note: noteState - } - }).then(r => { - notification["success"]({ - message: t("notes.successes.updated") + updateNote({ + variables: { + noteId: existingNote.id, + note: values, + }, + }).then((r) => { + notification["success"]({ + message: t("notes.successes.updated"), + }); }); - }); - refetch(); - changeVisibility(!visible); + if (refetch) refetch(); + toggleModalVisible(); + } else { + logImEXEvent("job_note_insert"); + + insertNote({ + variables: { + noteInput: [ + { ...values, jobid: jobId, created_by: currentUser.email }, + ], + }, + }).then((r) => { + if (refetch) refetch(); + form.resetFields(); + toggleModalVisible(); + notification["success"]({ + message: t("notes.successes.create"), + }); + }); + } }; return ( - + okText={t("general.actions.save")} + onOk={() => { + form.submit(); + }} + onCancel={() => { + toggleModalVisible(); + }} + destroyOnClose + > +
+ + +
); } -); + +export default connect( + mapStateToProps, + mapDispatchToProps +)(NoteUpsertModalContainer); 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..ed260d1cc 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,133 @@ -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 }) { +export default function OwnerDetailFormComponent({ form, loading }) { 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..5b601f7d2 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 @@ -1,5 +1,5 @@ import { Form, notification } from "antd"; -import React from "react"; +import React, { useState } from "react"; import { useMutation } from "@apollo/react-hooks"; import { useTranslation } from "react-i18next"; import { UPDATE_OWNER } from "../../graphql/owners.queries"; @@ -8,20 +8,32 @@ import OwnerDetailFormComponent from "./owner-detail-form.component"; function OwnerDetailFormContainer({ owner, refetch }) { const { t } = useTranslation(); const [form] = Form.useForm(); - + const [loading, setLoading] = useState(false); 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) => { + setLoading(true); + 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(); + setLoading(false); }; return ( @@ -29,9 +41,10 @@ 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-find-modal/owner-find-modal.component.jsx b/client/src/components/owner-find-modal/owner-find-modal.component.jsx index 301ed230d..910493189 100644 --- a/client/src/components/owner-find-modal/owner-find-modal.component.jsx +++ b/client/src/components/owner-find-modal/owner-find-modal.component.jsx @@ -7,7 +7,7 @@ export default function OwnerFindModalComponent({ selectedOwner, setSelectedOwner, ownersListLoading, - ownersList + ownersList, }) { //setSelectedOwner is used to set the record id of the owner to use for adding the job. const { t } = useTranslation(); @@ -16,27 +16,32 @@ export default function OwnerFindModalComponent({ { title: t("owners.fields.ownr_ln"), dataIndex: "ownr_ln", - key: "ownr_ln" + key: "ownr_ln", }, { title: t("owners.fields.ownr_fn"), dataIndex: "ownr_fn", - key: "ownr_fn" + key: "ownr_fn", + }, + { + title: t("owners.fields.ownr_co_nm"), + dataIndex: "ownr_co_nm", + key: "ownr_co_nm", }, { title: t("owners.fields.ownr_addr1"), dataIndex: "ownr_addr1", - key: "ownr_addr1" + key: "ownr_addr1", }, { title: t("owners.fields.ownr_city"), dataIndex: "ownr_city", - key: "ownr_city" + key: "ownr_city", }, { title: t("owners.fields.ownr_ea"), dataIndex: "ownr_ea", - key: "ownr_ea" + key: "ownr_ea", }, { title: t("owners.fields.ownr_ph1"), @@ -44,11 +49,11 @@ export default function OwnerFindModalComponent({ key: "ownr_ph1", render: (text, record) => ( {record.ownr_ph1} - ) - } + ), + }, ]; - const handleOnRowClick = record => { + const handleOnRowClick = (record) => { if (record) { if (record.id) { setSelectedOwner(record.id); @@ -64,22 +69,22 @@ export default function OwnerFindModalComponent({ title={() => t("owners.labels.existing_owners")} size="small" pagination={{ position: "bottom" }} - columns={columns.map(item => ({ ...item }))} + columns={columns.map((item) => ({ ...item }))} rowKey="id" loading={ownersListLoading} dataSource={ownersList} rowSelection={{ - onSelect: props => { + onSelect: (props) => { setSelectedOwner(props.id); }, type: "radio", - selectedRowKeys: [selectedOwner] + selectedRowKeys: [selectedOwner], }} onRow={(record, rowIndex) => { return { - onClick: event => { + onClick: (event) => { handleOnRowClick(record); - } + }, }; }} /> diff --git a/client/src/components/owner-find-modal/owner-find-modal.container.jsx b/client/src/components/owner-find-modal/owner-find-modal.container.jsx index 8dd5d2c3c..a10bb6ff9 100644 --- a/client/src/components/owner-find-modal/owner-find-modal.container.jsx +++ b/client/src/components/owner-find-modal/owner-find-modal.container.jsx @@ -20,27 +20,28 @@ export default function OwnerFindModalContainer({ const ownersList = useQuery(QUERY_SEARCH_OWNER_BY_IDX, { variables: { - search: owner ? `${owner.ownr_fn || ""} ${owner.ownr_ln || ""}` : null + search: owner ? `${owner.ownr_fn || ""} ${owner.ownr_ln || ""}` : null, }, skip: !owner, - fetchPolicy: "network-only" + fetchPolicy: "network-only", }); return ( + {...modalProps} + > {loading ? : null} - {error ? : null} + {error ? : null} {owner ? ( 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..af2c0fc6d 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,26 @@ 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}`} + {`${record.ownr_fn || ""} ${record.ownr_ln || ""} ${ + record.ownr_co_nm || "" + }`} - ) + ), }, { 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 +58,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 d9a4e6a0b..a2a87d24d 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,90 +1,122 @@ -import { AutoComplete, DatePicker, Input, List, Radio } from "antd"; -import { HeartFilled } from "@ant-design/icons"; -import React, { useState } from "react"; +import { DeleteFilled } from "@ant-design/icons"; +import { Form, Input, InputNumber, Radio } from "antd"; +import React from "react"; import { useTranslation } from "react-i18next"; +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"; +import FormListMoveArrows from "../form-list-move-arrows/form-list-move-arrows.component"; + export default function PartsOrderModalComponent({ vendorList, - state, sendTypeState, - orderLinesState + isReturn, + preferredMake, }) { - const [partsOrder, setPartsOrder] = state; const [sendType, setSendType] = sendTypeState; - const orderLines = orderLinesState[0]; - const [vendorComplete, setVendorComplete] = useState(vendorList); + const { t } = useTranslation(); - const handleSearch = value => { - if (value === "") setVendorComplete(vendorList); - else - setVendorComplete( - vendorList.filter(v => - v.name.toLowerCase().includes(value.toLowerCase()) - ) - ); - }; - - const handleSelect = (value, option) => { - setPartsOrder({ ...partsOrder, vendorid: option.key }); - }; - return (
- - {vendorComplete.map(v => ( - -
{v.name}
-
{v.favorite ? : null}
-
- ))} -
- {t("parts_orders.fields.deliver_by")} - { - setPartsOrder({ ...partsOrder, deliver_by: e }); - }} - /> - + + + + + {t("parts_orders.labels.inthisorder")} - ( - - //TODO Editable table/adding line remarks to the order. - ]} - > - { - // - // } - // title={{item.name.last}} - // description='Ant Design, a design language for background applications, is refined by Ant UED Team' - // /> - } -
{`${item.line_desc}${ - item.oem_partno ? " | " + item.oem_partno : "" - }`}
-
- )} - /> - + + {(fields, { add, remove, move }) => { + return ( +
+ {fields.map((field, index) => ( + +
+ + + + + + + + + + + + + + + + { + remove(field.name); + }} + /> + +
+
+ ))} +
+ ); + }} +
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 30786296c..b115a1779 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 @@ -1,189 +1,248 @@ -import { Modal, notification } from "antd"; -import React, { useState, useEffect } from "react"; import { useMutation, useQuery } from "@apollo/react-hooks"; +import { 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_PARTS_ORDERS } from "../../graphql/parts-orders.queries"; +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"; +import { setEmailOptions } from "../../redux/email/email.actions"; +import { toggleModalVisible } from "../../redux/modals/modals.actions"; +import { selectPartsOrder } from "../../redux/modals/modals.selectors"; import { selectBodyshop, - selectCurrentUser + selectCurrentUser, } from "../../redux/user/user.selectors"; import AlertComponent from "../alert/alert.component"; import LoadingSpinner from "../loading-spinner/loading-spinner.component"; import PartsOrderModalComponent from "./parts-order-modal.component"; -import { - setEmailOptions, - toggleEmailOverlayVisible -} from "../../redux/email/email.actions"; -import PartsOrderEmailTemplate from "../../emails/templates/parts-order/parts-order.email"; -import { REPORT_QUERY_PARTS_ORDER_BY_PK } from "../../emails/templates/parts-order/parts-order.query"; +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, - bodyshop: selectBodyshop + bodyshop: selectBodyshop, + partsOrderModal: selectPartsOrder, }); -const mapDispatchToProps = dispatch => ({ - setEmailOptions: e => dispatch(setEmailOptions(e)), - toggleEmailOverlayVisible: () => dispatch(toggleEmailOverlayVisible()) + +const mapDispatchToProps = (dispatch) => ({ + setEmailOptions: (e) => dispatch(setEmailOptions(e)), + toggleModalVisible: () => dispatch(toggleModalVisible("partsOrder")), }); -export default connect( - mapStateToProps, - mapDispatchToProps -)(function PartsOrderModalContainer({ - partsOrderModalVisible, - linesToOrder, - jobId, + +export function PartsOrderModalContainer({ + partsOrderModal, + toggleModalVisible, currentUser, bodyshop, - refetch, setEmailOptions, - toggleEmailOverlayVisible }) { const { t } = useTranslation(); - const [modalVisible, setModalVisible] = partsOrderModalVisible; - //set order lines to be a version of the incoming lines. - const orderLinesState = useState( - 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, - line_remarks: "Alalala", - job_line_id: value.id, - status: bodyshop.md_order_statuses.default_ordered || "Ordered*" - }); - return acc; - }, []) - ); - const [orderLines, setOrderLinesState] = orderLinesState; - useEffect(() => { - if (modalVisible) - setOrderLinesState( - 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, - line_remarks: "Alalala", - job_line_id: value.id, - status: bodyshop.md_order_statuses.default_ordered || "Ordered*" - }); - return acc; - }, []) - ); - }, [ - modalVisible, - setOrderLinesState, + const { visible, context, actions } = partsOrderModal; + const { + jobId, linesToOrder, - bodyshop.md_order_statuses.default_ordered - ]); + isReturn, + vendorId, + returnFromInvoice, + invoiceNumber, + } = context; + + const { refetch } = actions; + const [form] = Form.useForm(); const sendTypeState = useState("e"); const sendType = sendTypeState[0]; - const partsOrderState = useState({ - vendorid: null, - jobid: jobId, - user_email: currentUser.email - }); - const partsOrder = partsOrderState[0]; const { loading, error, data } = useQuery(QUERY_ALL_VENDORS_FOR_ORDER, { - fetchPolicy: "network-only", - skip: !modalVisible + skip: !visible, + variables: { jobId: jobId }, }); + const [insertPartOrder] = useMutation(INSERT_NEW_PARTS_ORDERS); const [updateJobLines] = useMutation(UPDATE_JOB_LINE_STATUS); + const [insertInvoice] = useMutation(INSERT_NEW_INVOICE); - const handleOk = () => { - insertPartOrder({ + const handleFinish = async (values) => { + logImEXEvent("parts_order_insert"); + + const insertResult = await insertPartOrder({ variables: { po: [ { - ...partsOrder, + ...values, + jobid: jobId, + user_email: currentUser.email, status: bodyshop.md_order_statuses.default_ordered || "Ordered*", - parts_order_lines: { - data: orderLines - } - } - ] - } - }) - .then(r => { - updateJobLines({ - variables: { - ids: linesToOrder.map(item => item.id), - status: bodyshop.md_order_statuses.default_ordered || "Ordered*" - } - }) - .then(response => { - notification["success"]({ - message: t("parts_orders.successes.created") - }); - if (refetch) refetch(); - setModalVisible(false); - - if (sendType === "e") { - //Show the email modal and set the data. - - //TODO Remove hardcoding - setEmailOptions({ - messageOptions: { - from: { - name: "Kavia Autobdoy", - address: "noreply@bodyshop.app" - }, - to: "patrickwf@gmail.com", - replyTo: "snaptsoft@gmail.com" - }, - template: PartsOrderEmailTemplate, - queryConfig: [ - REPORT_QUERY_PARTS_ORDER_BY_PK, - { - variables: { - id: r.data.insert_parts_orders.returning[0].id - } - } - ] - }); - //toggleEmailOverlayVisible(); - } - }) - .catch(error => { - notification["error"]({ - message: t("parts_orders.errors.creating"), - description: error.message - }); - }); - }) - .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) { + 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 = { + 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) { + form.resetFields(); + } + }, [visible, linesToOrder, form]); + return ( setModalVisible(false)} - onOk={handleOk} + visible={visible} + title={ + isReturn + ? `${t("parts_orders.labels.returnpartsorder")} ${invoiceNumber}` + : t("parts_orders.labels.newpartsorder") + } + onCancel={() => toggleModalVisible()} + width="90%" + onOk={() => form.submit()} + destroyOnClose + forceRender > {error ? : null} - +
+ +
); -}); +} + +export default connect( + mapStateToProps, + mapDispatchToProps +)(PartsOrderModalContainer); 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..1afe6abc6 --- /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 }) { + return
Parts Pie
; + //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) => { + // 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..1435bc1eb --- /dev/null +++ b/client/src/components/payment-form/payment-form.component.jsx @@ -0,0 +1,147 @@ +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) => { + 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..b24da0534 --- /dev/null +++ b/client/src/components/payment-modal/payment-modal.container.jsx @@ -0,0 +1,204 @@ +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", + }, + }, + } + ); + + 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..57b8ef356 --- /dev/null +++ b/client/src/components/payments-export-all-button/payments-export-all-button.component.jsx @@ -0,0 +1,125 @@ +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)}`, + }, + } + ); + } 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..1649433c8 --- /dev/null +++ b/client/src/components/payments-list-paginated/payment-list-paginated.component.jsx @@ -0,0 +1,161 @@ +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_co_nm + }`} + + ) : ( + {`${record.job.ownr_fn || ""} ${record.job.ownr_ln || ""} ${ + record.job.ownr_co_nm + }`} + ); + }, + }, + { + 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-filters/production-board-filters.component.jsx b/client/src/components/production-board-filters/production-board-filters.component.jsx new file mode 100644 index 000000000..363a78945 --- /dev/null +++ b/client/src/components/production-board-filters/production-board-filters.component.jsx @@ -0,0 +1,40 @@ +import { Input } 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 EmployeeSearchSelectComponent from "../employee-search-select/employee-search-select.component"; +const mapStateToProps = createStructuredSelector({ + //currentUser: selectCurrentUser + bodyshop: selectBodyshop, +}); +const mapDispatchToProps = (dispatch) => ({ + //setUserLanguage: language => dispatch(setUserLanguage(language)) +}); +export default connect( + mapStateToProps, + mapDispatchToProps +)(ProductionBoardFilters); + +export function ProductionBoardFilters({ bodyshop, filter, setFilter }) { + const { t } = useTranslation(); + + return ( +
    + { + setFilter({ ...filter, search: e.target.value }); + }} + /> + setFilter({ ...filter, employeeId: emp })} + allowClear + /> +
    + ); +} 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..245789a50 --- /dev/null +++ b/client/src/components/production-board-kanban-card/production-board-kanban-card.component.jsx @@ -0,0 +1,87 @@ +import React from "react"; +import { Card, Row, Col, Dropdown } 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"; +import ProductionRemoveButton from "../production-remove-button/production-remove-button.component"; +import { useTranslation } from "react-i18next"; + +export default function ProductionBoardCard(card) { + const { t } = useTranslation(); + const menu = ( +
    + + + +
    + ); + + 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.larhrs.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..fe7b73d1b --- /dev/null +++ b/client/src/components/production-board-kanban/production-board-kanban.component.jsx @@ -0,0 +1,128 @@ +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"; +import ProductionBoardFilters from "../production-board-filters/production-board-filters.component"; + +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, +}); + +export function ProductionBoardKanbanComponent({ data, bodyshop }) { + const [boardLanes, setBoardLanes] = useState({ + columns: [{ id: "Loading...", title: "Loading...", cards: [] }], + }); + + const [filter, setFilter] = useState({ search: "", employeeId: null }); + + const [isMoving, setIsMoving] = useState(false); + + const { t } = useTranslation(); + useEffect(() => { + setBoardLanes( + createBoardData(bodyshop.md_ro_statuses.production_statuses, data, filter) + ); + setIsMoving(false); + }, [ + data, + setBoardLanes, + setIsMoving, + bodyshop.md_ro_statuses.production_statuses, + filter, + ]); + + 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..252a0d67c --- /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..324612133 --- /dev/null +++ b/client/src/components/production-board-kanban/production-board-kanban.utils.js @@ -0,0 +1,122 @@ +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, filter) => { + const { search, employeeId } = filter; + console.log("==========GENERATING BOARD DATA============="); + const boardLanes = { + columns: AllStatuses.map((s) => { + return { + id: s, + title: s, + cards: [], + }; + }), + }; + + const filteredJobs = + (search === "" || !search) && !employeeId + ? Jobs + : Jobs.filter((j) => { + let include = false; + if (search && search !== "") { + include = CheckSearch(search, j); + } + + if (!!employeeId) { + include = + include && + (j.employee_body === employeeId || + j.employee_prep === employeeId || + j.employee_refinish === employeeId); + } + + return include; + }); + + const DataGroupedByStatus = _.groupBy(filteredJobs, (d) => d.status); + + Object.keys(DataGroupedByStatus).map((statusGroupKey) => { + boardLanes.columns.find( + (l) => l.id === statusGroupKey + ).cards = sortByParentId(DataGroupedByStatus[statusGroupKey]); + return null; + }); + + return boardLanes; +}; + +const CheckSearch = (search, job) => { + return ( + (job.ro_number || "").toLowerCase().includes(search.toLowerCase()) || + (job.est_number || "") + .toString() + .toLowerCase() + .includes(search.toLowerCase()) || + (job.ownr_fn || "").toLowerCase().includes(search.toLowerCase()) || + (job.ownr_co_nm || "").toLowerCase().includes(search.toLowerCase()) || + (job.ownr_ln || "").toLowerCase().includes(search.toLowerCase()) || + (job.status || "").toLowerCase().includes(search.toLowerCase()) || + (job.v_make_desc || "").toLowerCase().includes(search.toLowerCase()) || + (job.v_model_desc || "").toLowerCase().includes(search.toLowerCase()) || + (job.clm_no || "").toLowerCase().includes(search.toLowerCase()) || + (job.plate_no || "").toLowerCase().includes(search.toLowerCase()) + ); +}; + +// 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..ef65de669 --- /dev/null +++ b/client/src/components/production-list-save-config-button/production-list-save-config-button.component.jsx @@ -0,0 +1,54 @@ +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 = async () => { + logImEXEvent("production_save_config"); + + await updateShop({ + variables: { + id: bodyshop.id, + shop: { + production_config: { + columnKeys: columns.map((i) => { + return { key: i.key, width: i.width }; + }), + tableState, + }, + }, + }, + }); + }; + + 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..778b7bb0b --- /dev/null +++ b/client/src/components/production-list-table/production-list-table.component.jsx @@ -0,0 +1,189 @@ +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_co_nm || "") + .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..9b5e0cec0 --- /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 ( + + - - Manual Job Selection Scheduled Time - { - setAppData({ ...appData, title: e.target.value }); - }} - /> - { - setAppData({ ...appData, start: e }); - }} - /> - { - setAppData({ ...appData, start: e }); - }} - /> - - - { - //TODO Build out notifications. - } - - setFormData({ ...formData, notifyCustomer: e.target.checked }) - } - > - {t("jobs.labels.appointmentconfirmation")} - - - - - - - - ); -} diff --git a/client/src/components/schedule-appointment-modal/schedule-appointment-modal.container.jsx b/client/src/components/schedule-appointment-modal/schedule-appointment-modal.container.jsx deleted file mode 100644 index c9590756b..000000000 --- a/client/src/components/schedule-appointment-modal/schedule-appointment-modal.container.jsx +++ /dev/null @@ -1,74 +0,0 @@ -import { notification } from "antd"; -import moment from "moment"; -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_APPOINTMENT } from "../../graphql/appointments.queries"; -import { selectBodyshop } from "../../redux/user/user.selectors"; -import ScheduleAppointmentModalComponent from "./schedule-appointment-modal.component"; - -const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop -}); - -export default connect( - mapStateToProps, - null -)(function ScheduleAppointmentModalContainer({ - scheduleModalState, - jobId, - bodyshop, - refetch -}) { - const [scheduleModalVisible, setscheduleModalVisible] = scheduleModalState; - const [appData, setAppData] = useState({ - jobid: jobId, - bodyshopid: bodyshop.id, - isintake: false, - start: null - }); - const [insertAppointment] = useMutation(INSERT_APPOINTMENT); - const [formData, setFormData] = useState({ notifyCustomer: false }); - const { t } = useTranslation(); - - return ( - setscheduleModalVisible(false)} - onOk={() => { - //TODO Customize the amount of minutes it will add. - insertAppointment({ - variables: { - app: { ...appData, end: moment(appData.start).add(60, "minutes") } - } - }) - .then(r => { - notification["success"]({ - message: t("appointments.successes.created") - }); - - if (formData.notifyCustomer) { - //TODO Implement customer reminder on scheduling. - alert("Chosed to notify the customer somehow!"); - } - setscheduleModalVisible(false); - if (refetch) refetch(); - }) - .catch(error => { - notification["error"]({ - message: t("appointments.errors.saving", { - message: error.message - }) - }); - }); - }} - /> - ); -}); diff --git a/client/src/components/schedule-block-day/schedule-block-day.component.jsx b/client/src/components/schedule-block-day/schedule-block-day.component.jsx new file mode 100644 index 000000000..f604e2681 --- /dev/null +++ b/client/src/components/schedule-block-day/schedule-block-day.component.jsx @@ -0,0 +1,66 @@ +import { useMutation } from "@apollo/react-hooks"; +import { Dropdown, Menu, notification } from "antd"; +import moment from "moment"; +import React from "react"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { INSERT_APPOINTMENT } from "../../graphql/appointments.queries"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +import { logImEXEvent } from "../../firebase/firebase.utils"; + +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, +}); + +const mapDispatchToProps = (dispatch) => ({ + //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")} + + ); + + 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..dce6eb8c1 --- /dev/null +++ b/client/src/components/schedule-calendar-wrapper/schedule-calendar-header.component.js @@ -0,0 +1,116 @@ +import Icon from "@ant-design/icons"; +import { Popover, Statistic } from "antd"; +import React from "react"; +import { useTranslation } from "react-i18next"; +import { MdFileDownload, MdFileUpload } from "react-icons/md"; +import { connect } from "react-redux"; +import { Link } from "react-router-dom"; +import { createStructuredSelector } from "reselect"; +import { + selectScheduleLoad, + selectScheduleLoadCalculating, +} from "../../redux/application/application.selectors"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +import { DateTimeFormatter } from "../../utils/DateFormatter"; +import LoadingSkeleton from "../loading-skeleton/loading-skeleton.component"; +import ScheduleBlockDay from "../schedule-block-day/schedule-block-day.component"; + +const mapStateToProps = createStructuredSelector({ + //currentUser: selectCurrentUser + bodyshop: selectBodyshop, + load: selectScheduleLoad, + calculating: selectScheduleLoadCalculating, +}); + +const mapDispatchToProps = (dispatch) => ({ + //setUserLanguage: language => dispatch(setUserLanguage(language)) +}); + +export function ScheduleCalendarHeaderComponent({ + bodyshop, + label, + refetch, + date, + load, + calculating, + ...otherProps +}) { + const { t } = useTranslation(); + const loadData = load[date.toISOString().substr(0, 10)]; + + const popContent = () => ( +
    e.stopPropagation()}> +
    + + ); +}; 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..83d67cd5d --- /dev/null +++ b/client/src/components/production-remove-button/production-remove-button.component.jsx @@ -0,0 +1,37 @@ +import { useMutation } from "@apollo/react-hooks"; +import { Button, notification } from "antd"; +import React, { useState } from "react"; +import { useTranslation } from "react-i18next"; +import { logImEXEvent } from "../../firebase/firebase.utils"; +import { UPDATE_JOB } from "../../graphql/jobs.queries"; + +export default function ProductionRemoveButton({ jobId }) { + const [removeJobFromProduction] = useMutation(UPDATE_JOB); + const { t } = useTranslation(); + const [loading, setLoading] = useState(false); + + const handleRemoveFromProd = async () => { + logImEXEvent("production_remove_job"); + setLoading(true); + const result = await removeJobFromProduction({ + variables: { jobId: jobId, job: { inproduction: false } }, + }); + + if (!!!result.errors) { + notification["success"]({ message: t("production.successes.removed") }); + } else { + notification["error"]({ + message: t("production.errors.removing", { + error: JSON.stringify(result.errors), + }), + }); + } + setLoading(false); + }; + + 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 ( {React.cloneElement(children, restProps)}; + + return ( + noauth || ( + + ) + ); +} + +// RbacWrapper.propTypes = { +// currentUser: PropTypes.object.isRequired, +// authLevel: PropTypes.number.isRequired, +// noauth: PropTypes.oneOfType(PropTypes.string, PropTypes.func), +// requiredAuthLevel: PropTypes.number, +// action: PropTypes.string, +// }; + +export default connect(mapStateToProps, null)(RbacWrapper); diff --git a/client/src/components/schedule-appointment-modal/schedule-appointment-modal.component.jsx b/client/src/components/schedule-appointment-modal/schedule-appointment-modal.component.jsx deleted file mode 100644 index a4825e363..000000000 --- a/client/src/components/schedule-appointment-modal/schedule-appointment-modal.component.jsx +++ /dev/null @@ -1,67 +0,0 @@ -import { Checkbox, Col, DatePicker, Modal, Row, TimePicker, Input } from "antd"; -import React from "react"; -import { useTranslation } from "react-i18next"; -import ScheduleDayViewContainer from "../schedule-day-view/schedule-day-view.container"; - -export default function ScheduleJobModalComponent({ - appData, - setAppData, - formData, - setFormData, - ...props -}) { - const { t } = useTranslation(); - //TODO Existing appointments list only refreshes sometimes after modal close. May have to do with the container class. - return ( - - -
    + + {loadData && loadData.jobsOut ? ( + loadData.jobsOut.map((j) => ( + + + + + + )) + ) : ( + + + + )} + +
    + {j.ro_number} + + {`(${( + j.labhrs.aggregate.sum.mod_lb_hrs + + j.larhrs.aggregate.sum.mod_lb_hrs + ).toFixed(1)} ${t("general.labels.hours")})`} + + + {j.scheduled_completion} + +
    {t("appointments.labels.nocompletingjobs")}
    +
    + ); + + const LoadComponent = loadData ? ( + +
    + + {(loadData.hoursIn || 0) && loadData.hoursIn.toFixed(2)} + + {(loadData.hoursOut || 0) && loadData.hoursOut.toFixed(2)} + +
    +
    + ) : null; + + return ( + +
    + {label} + {calculating ? : 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..3c6cb4b42 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,22 @@ -@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); +} + +.rbc-month-view { + height: 125rem; +} + +.rbc-event.rbc-selected { + background-color: slategrey; +} 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 9a0f5a5a7..85ecf8cdd 100644 --- a/client/src/components/schedule-calendar/schedule-calendar.component.jsx +++ b/client/src/components/schedule-calendar/schedule-calendar.component.jsx @@ -1,15 +1,21 @@ -import React from "react"; -//import "react-big-calendar/lib/css/react-big-calendar.css"; -import ScheduleCalendarWrapperComponent from "../schedule-calendar-wrapper/scheduler-calendar-wrapper.component"; -import { Button } from "antd"; import { SyncOutlined } from "@ant-design/icons"; +import { Button } from "antd"; +import React from "react"; import { useTranslation } from "react-i18next"; -import ScheduleAppointmentModalContainer from "../schedule-appointment-modal/schedule-appointment-modal.container"; +import { connect } from "react-redux"; +import { setModalContext } from "../../redux/modals/modals.actions"; +import ScheduleCalendarWrapperComponent from "../schedule-calendar-wrapper/scheduler-calendar-wrapper.component"; +import ScheduleModal from "../schedule-job-modal/schedule-job-modal.container"; -export default function ScheduleCalendarComponent({ +const mapDispatchToProps = (dispatch) => ({ + setScheduleContext: (context) => + dispatch(setModalContext({ context: context, modal: "schedule" })), +}); + +export function ScheduleCalendarComponent({ data, refetch, - scheduleModalState + setScheduleContext, }) { const { t } = useTranslation(); @@ -25,23 +31,21 @@ export default function ScheduleCalendarComponent({ - + - +
    ); } +export default connect(null, mapDispatchToProps)(ScheduleCalendarComponent); diff --git a/client/src/components/schedule-calendar/schedule-calendar.container.jsx b/client/src/components/schedule-calendar/schedule-calendar.container.jsx index b881d9cc6..eff7a1bc8 100644 --- a/client/src/components/schedule-calendar/schedule-calendar.container.jsx +++ b/client/src/components/schedule-calendar/schedule-calendar.container.jsx @@ -1,22 +1,38 @@ -import React, { useState } from "react"; import { useQuery } from "@apollo/react-hooks"; -import ScheduleCalendarComponent from "./schedule-calendar.component"; +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 LoadingSpinner from "../loading-spinner/loading-spinner.component"; 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, { - fetchPolicy: "network-only" + variables: { start: range.start.toDate(), end: range.end.toDate() }, + skip: !!!range.start || !!!range.end, } ); - const scheduleModalState = useState(false); 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( {}, @@ -26,11 +42,16 @@ 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..082973c7b 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.ownr_co_nm) || ""}`} +
    + {`${(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 7faf10e07..50e11885b 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,74 +1,99 @@ -import { Checkbox, Col, DatePicker, Modal, 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, - ...props }) { 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)}`, + }, + } + ); + 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 ( - - - - - - Automatic Job Selection. - - - - Manual Job Selection Scheduled Time - { - setAppData({ ...appData, start: e }); - }} - /> - { - setAppData({ ...appData, start: e }); - }} - /> - - - - + +
    + {t("appointments.fields.time")} + { + setAppData({ ...appData, start: e }); + }} /> - { - //TODO Build out notifications. + +
    +
    + {appData.smartDates.map((d, idx) => ( + + ))} +
    + + {t("appointments.labels.history")} + + + + setAppData({ ...appData, notifyCustomer: e.target.checked }) } - - setFormData({ ...formData, notifyCustomer: e.target.checked }) - } - > - {t("jobs.labels.appointmentconfirmation")} - - - + > + {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 808300ed4..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,93 +1,177 @@ -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, - QUERY_APPOINTMENTS_BY_JOBID + CANCEL_APPOINTMENT_BY_ID, + QUERY_APPOINTMENTS_BY_JOBID, } from "../../graphql/appointments.queries"; import moment from "moment"; -import { notification } from "antd"; +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 + bodyshop: selectBodyshop, + scheduleModal: selectSchedule, }); - -export default connect( - mapStateToProps, - null -)(function ScheduleJobModalContainer({ - scheduleModalState, - jobId, +const mapDispatchToProps = (dispatch) => ({ + toggleModalVisible: () => dispatch(toggleModalVisible("schedule")), + setEmailOptions: (e) => dispatch(setEmailOptions(e)), +}); +export function ScheduleJobModalContainer({ + scheduleModal, bodyshop, - refetch + toggleModalVisible, + setEmailOptions, }) { - const [scheduleModalVisible, setscheduleModalVisible] = scheduleModalState; + const { visible, context, actions } = scheduleModal; + const { jobId, job, previousEvent } = context; + const { refetch } = actions; + const [loading, setLoading] = useState(false); const [appData, setAppData] = useState({ - jobid: jobId, + notifyCustomer: !!(job && job.ownr_ea), + email: (job && job.ownr_ea) || "", start: null, - bodyshopid: bodyshop.id + 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: !scheduleModalVisible + skip: !visible || !!!jobId, }); - return ( - setscheduleModalVisible(false)} - onOk={() => { - //TODO Customize the amount of minutes it will add. - insertAppointment({ - variables: { - app: { ...appData, 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!"); - } - setscheduleModalVisible(false); - if (refetch) refetch(); - }); - }) - .catch(error => { - notification["error"]({ - message: t("appointments.errors.saving", { - message: error.message - }) - }); - }); + 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.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 ( + toggleModalVisible()} + onOk={handleOk} + width={"90%"} + maskClosable={false} + destroyOnClose + okButtonProps={{ + disabled: appData.start ? false : true, + loading: loading, }} - /> + > + + ); -}); +} + +export default connect( + mapStateToProps, + mapDispatchToProps +)(ScheduleJobModalContainer); 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..a5360b19f --- /dev/null +++ b/client/src/components/scoreboard-chart/scoreboard-chart.component.jsx @@ -0,0 +1,113 @@ +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..8cd6655d4 --- /dev/null +++ b/client/src/components/scoreboard-display/scoreboard-display.component.jsx @@ -0,0 +1,30 @@ +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) || []; + + const sbEntriesByDate = {}; + + scoreBoardlist.forEach((i) => { + const entryDate = i.date; + if (!!!sbEntriesByDate[entryDate]) { + sbEntriesByDate[entryDate] = []; + } + sbEntriesByDate[entryDate].push(i); + }); + + 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 = ( +
    + + + ); + + 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..f88b897ef --- /dev/null +++ b/client/src/components/scoreboard-last-days/scoreboard-last-days.component.jsx @@ -0,0 +1,39 @@ +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").format("yyyy-MM-DD")); + } + + 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, move }) => { + 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..81a6b66e3 100644 --- a/client/src/components/shop-info/shop-info.orderstatus.component.jsx +++ b/client/src/components/shop-info/shop-info.orderstatus.component.jsx @@ -2,6 +2,7 @@ import { DeleteFilled } from "@ant-design/icons"; import { Button, Form, Input, Select, Row, Col } from "antd"; import React, { useState } from "react"; import { useTranslation } from "react-i18next"; +import FormListMoveArrows from "../form-list-move-arrows/form-list-move-arrows.component"; //TODO Fix up styles. export default function ShopInfoOrderStatusComponent({ form }) { const { t } = useTranslation(); @@ -20,7 +21,7 @@ export default function ShopInfoOrderStatusComponent({ form }) {
    - {(fields, { add, remove }) => { + {(fields, { add, remove, move }) => { return (
    {fields.map((field, index) => ( @@ -37,8 +38,8 @@ export default function ShopInfoOrderStatusComponent({ form }) { rules={[ { required: true, - message: t("general.validation.required") - } + message: t("general.validation.required"), + }, ]} > @@ -48,6 +49,11 @@ export default function ShopInfoOrderStatusComponent({ form }) { remove(field.name); }} /> +
    ))} @@ -73,8 +79,8 @@ export default function ShopInfoOrderStatusComponent({ form }) { rules={[ { required: true, - message: t("general.validation.required") - } + message: t("general.validation.required"), + }, ]} name={["md_order_statuses", "default_bo"]} > @@ -89,8 +95,8 @@ export default function ShopInfoOrderStatusComponent({ form }) { rules={[ { required: true, - message: t("general.validation.required") - } + message: t("general.validation.required"), + }, ]} name={["md_order_statuses", "default_ordered"]} > @@ -105,8 +111,8 @@ export default function ShopInfoOrderStatusComponent({ form }) { rules={[ { required: true, - message: t("general.validation.required") - } + message: t("general.validation.required"), + }, ]} name={["md_order_statuses", "default_canceled"]} > @@ -121,8 +127,8 @@ export default function ShopInfoOrderStatusComponent({ form }) { rules={[ { required: true, - message: t("general.validation.required") - } + message: t("general.validation.required"), + }, ]} name={["md_order_statuses", "default_received"]} > @@ -132,6 +138,22 @@ export default function ShopInfoOrderStatusComponent({ form }) { ))} + + + diff --git a/client/src/components/shop-info/shop-info.rbac.component.jsx b/client/src/components/shop-info/shop-info.rbac.component.jsx new file mode 100644 index 000000000..aec837af2 --- /dev/null +++ b/client/src/components/shop-info/shop-info.rbac.component.jsx @@ -0,0 +1,447 @@ +import { Form, InputNumber } from "antd"; +import React from "react"; +import { useTranslation } from "react-i18next"; +import LayoutFormRow from "../layout-form-row/layout-form-row.component"; +//TODO Fix up styles. +export default function ShopInfoRbacComponent({ form }) { + const { t } = useTranslation(); + + return ( +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + ); +} diff --git a/client/src/components/shop-info/shop-info.responsibilitycenters.component.jsx b/client/src/components/shop-info/shop-info.responsibilitycenters.component.jsx index fe7fa6b89..b45fabae6 100644 --- a/client/src/components/shop-info/shop-info.responsibilitycenters.component.jsx +++ b/client/src/components/shop-info/shop-info.responsibilitycenters.component.jsx @@ -1,8 +1,9 @@ import { DeleteFilled } from "@ant-design/icons"; -import { Button, Form, Input, Select, Row, Col } from "antd"; +import { Button, Form, Input, Select, InputNumber } from "antd"; import React, { useState } from "react"; import { useTranslation } from "react-i18next"; import styled from "styled-components"; +import LayoutFormRow from "../layout-form-row/layout-form-row.component"; //TODO Fix up styles. const SelectorDiv = styled.div` .ant-form-item .ant-select { @@ -13,435 +14,1469 @@ const SelectorDiv = styled.div` export default function ShopInfoResponsibilityCenterComponent({ form }) { const { t } = useTranslation(); - const [options, setOptions] = useState( + const [costOptions, setCostOptions] = useState( [ - ...(form.getFieldValue(["md_responsibility_centers", "costs"]) || []), - ...(form.getFieldValue(["md_responsibility_centers", "profits"]) || []) + ...(form + .getFieldValue(["md_responsibility_centers", "costs"]) + .map((i) => i.name) || []), + ] || [] + ); + + const [profitOptions, setProfitOptions] = useState( + [ + ...(form + .getFieldValue(["md_responsibility_centers", "profits"]) + .map((i) => i.name) || []), ] || [] ); const handleBlur = () => { - setOptions([ - ...(form.getFieldValue(["md_responsibility_centers", "costs"]) || []), - ...(form.getFieldValue(["md_responsibility_centers", "profits"]) || []) + setCostOptions([ + ...(form + .getFieldValue(["md_responsibility_centers", "costs"]) + .map((i) => i.name) || []), + ]); + setProfitOptions([ + ...(form + .getFieldValue(["md_responsibility_centers", "profits"]) + .map((i) => i.name) || []), ]); }; return (
    - {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.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..cbc5c9d99 100644 --- a/client/src/components/shop-info/shop-info.rostatus.component.jsx +++ b/client/src/components/shop-info/shop-info.rostatus.component.jsx @@ -3,7 +3,7 @@ import { Button, Form, Input, Select, Row, Col } from "antd"; import React, { useState } from "react"; import { useTranslation } from "react-i18next"; import styled from "styled-components"; - +import FormListMoveArrows from "../form-list-move-arrows/form-list-move-arrows.component"; const SelectorDiv = styled.div` .ant-form-item .ant-select { width: 200px; @@ -27,13 +27,14 @@ export default function ShopInfoROStatusComponent({ form }) { {t("bodyshop.labels.alljobstatuses")} - {(fields, { add, remove }) => { + {(fields, { add, remove, move }) => { return (
    {fields.map((field, index) => ( + style={{ padding: 0, margin: 2 }} + >
    + message: t("general.validation.required"), + }, + ]} + > +
    ))} @@ -80,10 +88,30 @@ export default function ShopInfoROStatusComponent({ form }) { { required: true, message: t("general.validation.required"), - type: "array" - } - ]}> - + {options.map((item, idx) => ( + + {item} + + ))} + + + + {options.map((item, idx) => ( {item} @@ -111,10 +140,11 @@ export default function ShopInfoROStatusComponent({ form }) { rules={[ { required: true, - message: t("general.validation.required") - } + message: t("general.validation.required"), + }, ]} - name={["md_ro_statuses", "default_arrived"]}> + name={["md_ro_statuses", "default_arrived"]} + > {options.map((item, idx) => ( {item} @@ -141,10 +172,11 @@ export default function ShopInfoROStatusComponent({ form }) { rules={[ { required: true, - message: t("general.validation.required") - } + message: t("general.validation.required"), + }, ]} - name={["md_ro_statuses", "default_imported"]}> + name={["md_ro_statuses", "default_imported"]} + > {options.map((item, idx) => ( {item} @@ -171,10 +204,11 @@ export default function ShopInfoROStatusComponent({ form }) { rules={[ { required: true, - message: t("general.validation.required") - } + message: t("general.validation.required"), + }, ]} - name={["md_ro_statuses", "default_completed"]}> + name={["md_ro_statuses", "default_completed"]} + > + {options.map((item, idx) => ( + {item} + ))} + + + + + + + + + + + + + + + + + + + + { + 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..68d5e088d --- /dev/null +++ b/client/src/components/shop-template-add/shop-template-add.component.jsx @@ -0,0 +1,90 @@ +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, + QUERY_TEMPLATES_BY_NAME_FOR_DUPE, +} from "../../graphql/templates.queries"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +import { TemplateList } from "../../utils/TemplateConstants"; +import { logImEXEvent } from "../../firebase/firebase.utils"; +import { client } from "../../App/App.container"; + +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 defaultTemplateData = await client.query({ + query: QUERY_TEMPLATES_BY_NAME_FOR_DUPE, + variables: { name: item.key }, + }); + + const template = defaultTemplateData.data.templates.filter( + (t) => t.bodyshopid === null + )[0]; + + const result = await insertTemplate({ + variables: { + template: { + name: item.key, + bodyshopid: bodyshop.id, + jsontemplate: template && template.jsontemplate, + html: template && template.html, + query: template && template.query, + }, + }, + }); + + 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..bf94201fc --- /dev/null +++ b/client/src/components/shop-template-editor-save-button/shop-template-editor-save-button.component.jsx @@ -0,0 +1,56 @@ +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"; +import inlineCss from "inline-css"; + +export default function ShopTemplateSaveButton({ + templateId, + gql, + emailEditorRef, +}) { + const { t } = useTranslation(); + const [updateTemplate] = useMutation(UPDATE_TEMPLATE); + + const handleSave = async () => { + logImEXEvent("shop_template_update"); + + emailEditorRef.current.exportHtml(async (data) => { + console.log("RAW", data.html); + inlineCss(data.html, { + url: `${window.location.protocol}://${window.location.host}/`, + }).then(async function (inlineHtml) { + console.log("Inline :>> ", inlineHtml); + const result = await updateTemplate({ + variables: { + templateId: templateId, + template: { + query: gql, + html: inlineHtml, + jsontemplate: data.design, + }, + }, + }); + 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..367b1dbf9 --- /dev/null +++ b/client/src/components/shop-template-editor/shop-template-editor.component.jsx @@ -0,0 +1,74 @@ +import { Input } from "antd"; +import React, { useEffect, useRef } from "react"; +import EmailEditor from "react-email-editor"; +import ShopTemplateEditorSaveButton from "../shop-template-editor-save-button/shop-template-editor-save-button.component"; + +export default function ShopTemplateEditorComponent({ + templateId, + html, + gql, + json, + editorState, +}) { + const [editorContent, seteditorContent] = editorState; + const emailEditorRef = useRef(null); + + useEffect(() => { + if (json && Object.keys(json).length > 0 && emailEditorRef.current) { + emailEditorRef.current.loadDesign(json); + } + }, [json, emailEditorRef]); + + useEffect(() => { + seteditorContent((prevstate) => { + return { ...prevstate, gql: gql }; + }); + }, [gql, seteditorContent]); + + const exportJson = (props) => { + emailEditorRef.current.saveDesign((js) => { + seteditorContent({ ...editorContent, JSON: js }); + }); + }; + + const exportHtml = (props) => { + emailEditorRef.current.exportHtml((js) => {}); + }; + + return ( +
    + + + + + 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..14485644a --- /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 5dc7075d0..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,99 +1,110 @@ -import { Button, Form, Input } from "antd"; -import { LockFilled } from "@ant-design/icons"; +import { LockOutlined, UserOutlined } from "@ant-design/icons"; +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 } from "../../redux/user/user.selectors"; +import AlertComponent from "../alert/alert.component"; +import "./sign-in-form.styles.scss"; const mapStateToProps = createStructuredSelector({ currentUser: selectCurrentUser, - signInError: selectSignInError + signInError: selectSignInError, }); -const mapDispatchToProps = dispatch => ({ +const mapDispatchToProps = (dispatch) => ({ emailSignInStart: (email, password) => - 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 handleFinish = values => { - console.log("Login"); - + const { t } = useTranslation(); + const handleFinish = (values) => { const { email, password } = values; emailSignInStart(email, password); - //Try to do the login using a saga here. }; + const [form] = Form.useForm(); + //TODO - may be able to run this only on new user creation. if (currentUser.authorized === true) { apolloClient .mutate({ mutation: UPSERT_USER, variables: { authEmail: currentUser.email, - authToken: currentUser.uid - } + authToken: currentUser.uid, + }, }) .then() - .catch(error => { + .catch((error) => { console.log("User login upsert error.", error); }); } + if (currentUser.authorized === true) + return ; + return ( -
    - {currentUser.authorized === true ? : null} - - Bodyshop.app - -
    +
    +
    + ImEX Online + {t("titles.app")} +
    + - - - + { required: true, message: t("general.validation.required") }, + ]}> } - type="password" - placeholder="Password" + prefix={} + placeholder={t("general.labels.username")} /> - -
    Forgot 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..572ac7b19 --- /dev/null +++ b/client/src/components/tech-lookup-jobs-drawer/tech-lookup-jobs-drawer.component.jsx @@ -0,0 +1,145 @@ +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 { GET_JOB_BY_PK } 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(GET_JOB_BY_PK, { + 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 new file mode 100644 index 000000000..281fb7dbf --- /dev/null +++ b/client/src/components/time-ticket-enter-button/time-ticket-enter-button.component.jsx @@ -0,0 +1,31 @@ +import { Button } from "antd"; +import React from "react"; +import { connect } from "react-redux"; +import { setModalContext } from "../../redux/modals/modals.actions"; + +const mapDispatchToProps = (dispatch) => ({ + setTimeTicketContext: (context) => + dispatch(setModalContext({ context: context, modal: "timeTicket" })), +}); + +export function TimeTicketEnterButton({ + actions, + context, + setTimeTicketContext, + disabled, + children, +}) { + return ( + + ); +} +export default connect(null, mapDispatchToProps)(TimeTicketEnterButton); 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 new file mode 100644 index 000000000..1f9706808 --- /dev/null +++ b/client/src/components/time-ticket-list/time-ticket-list.component.jsx @@ -0,0 +1,162 @@ +import { Table } from "antd"; +import React, { useState } from "react"; +import { useTranslation } from "react-i18next"; +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, + techConsole, +}) { + const [state, setState] = useState({ + sortedInfo: {}, + filteredInfo: { text: "" }, + }); + + const { t } = useTranslation(); + + const columns = [ + { + title: t("timetickets.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("timetickets.fields.employee"), + dataIndex: "employee", + key: "employee", + sorter: (a, b) => alphaSort(a.employee.last_name, b.employee.last_name), + sortOrder: state.sortedInfo.columnKey === "vin" && state.sortedInfo.order, + render: (text, record) => ( + {`${record.employee.first_name} ${record.employee.last_name}`} + ), + }, + { + title: t("timetickets.fields.cost_center"), + 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"), + dataIndex: "productivehrs", + key: "productivehrs", + sorter: (a, b) => a.productivehrs - b.productivehrs, + sortOrder: + state.sortedInfo.columnKey === "productivehrs" && + state.sortedInfo.order, + }, + { + title: t("timetickets.fields.actualhrs"), + dataIndex: "actualhrs", + key: "actualhrs", + sorter: (a, b) => a.actualhrs - b.actualhrs, + 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) => { + if (techConsole) return null; + return ( + + {t("general.actions.edit")} + + ); + }, + }, + ]; + + const handleTableChange = (pagination, filters, sorter) => { + setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); + }; + + return ( +
    ({ ...item }))} + 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 new file mode 100644 index 000000000..2d698a33d --- /dev/null +++ b/client/src/components/time-ticket-modal/time-ticket-modal.component.jsx @@ -0,0 +1,129 @@ +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"; + +export default function TimeTicketModalComponent({ + form, + roAutoCompleteOptions, + employeeAutoCompleteOptions, + loadLineTicketData, + lineTicketData, + responsibilityCenters, +}) { + const { t } = useTranslation(); + + return ( +
    +
    + + { + if (form.getFieldValue("jobid") !== null) { + loadLineTicketData({ + variables: { id: form.getFieldValue("jobid") }, + }); + } + }} + /> + + + + +
    + +
    + + + + + + + + + + + + + + + +
    + +
    + ); +} 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 new file mode 100644 index 000000000..bbe1304a0 --- /dev/null +++ b/client/src/components/time-ticket-modal/time-ticket-modal.container.jsx @@ -0,0 +1,215 @@ +import { useLazyQuery, useMutation, useQuery } 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 { QUERY_EMPLOYEES } from "../../graphql/employees.queries"; +import { GET_LINE_TICKET_BY_PK } from "../../graphql/jobs-lines.queries"; +import { ACTIVE_JOBS_FOR_AUTOCOMPLETE } from "../../graphql/jobs.queries"; +import { + INSERT_NEW_TIME_TICKET, + UPDATE_TIME_TICKET, +} from "../../graphql/timetickets.queries"; +import { toggleModalVisible } from "../../redux/modals/modals.actions"; +import { selectTimeTicket } from "../../redux/modals/modals.selectors"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +import TimeTicketModalComponent from "./time-ticket-modal.component"; +import moment from "moment"; + +const mapStateToProps = createStructuredSelector({ + timeTicketModal: selectTimeTicket, + bodyshop: selectBodyshop, +}); +const mapDispatchToProps = (dispatch) => ({ + toggleModalVisible: () => dispatch(toggleModalVisible("timeTicket")), +}); + +export function TimeTicketModalContainer({ + timeTicketModal, + toggleModalVisible, + bodyshop, +}) { + const [form] = Form.useForm(); + const { t } = useTranslation(); + const [enterAgain, setEnterAgain] = useState(false); + const [insertTicket] = useMutation(INSERT_NEW_TIME_TICKET); + const [updateTicket] = useMutation(UPDATE_TIME_TICKET); + const { data: RoAutoCompleteData } = useQuery(ACTIVE_JOBS_FOR_AUTOCOMPLETE, { + variables: { statuses: bodyshop.md_ro_statuses.open_statuses || ["Open"] }, + skip: !timeTicketModal.visible, + }); + const { data: EmployeeAutoCompleteData } = useQuery(QUERY_EMPLOYEES, { + skip: !timeTicketModal.visible, + }); + const [loadLineTicketData, { data: lineTicketData }] = useLazyQuery( + GET_LINE_TICKET_BY_PK + ); + + const handleFinish = (values) => { + if (timeTicketModal.context.id) { + updateTicket({ + variables: { + timeticketId: timeTicketModal.context.id, + timeticket: values, + }, + }) + .then(handleMutationSuccess) + .catch(handleMutationError); + } else { + //Get selected employee rate. + const rate = EmployeeAutoCompleteData.employees.filter( + (i) => i.id === values.employeeid + )[0].base_rate; + + insertTicket({ + variables: { + timeTicketInput: [{ ...values, rate, bodyshopid: bodyshop.id }], + }, + }) + .then(handleMutationSuccess) + .catch(handleMutationError); + } + }; + + const handleMutationSuccess = (response) => { + notification["success"]({ + message: t("timetickets.successes.created"), + }); + 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(); + } + setEnterAgain(false); + }; + + const handleMutationError = (error) => { + setEnterAgain(false); + notification["error"]({ + message: t("timetickets.errors.creating", { + message: JSON.stringify(error), + }), + }); + }; + + const handleCancel = () => { + toggleModalVisible(); + }; + + useEffect(() => { + if (enterAgain) form.submit(); + }, [enterAgain, form]); + + useEffect(() => { + if (timeTicketModal.visible) form.resetFields(); + }, [timeTicketModal.visible, form]); + + const handleFieldsChange = (changedFields, allFields) => { + if (!!changedFields.employeeid && !!EmployeeAutoCompleteData) { + const emps = EmployeeAutoCompleteData.employees.filter( + (e) => e.id === changedFields.employeeid + ); + form.setFieldsValue({ + cost_center: emps.length > 0 ? 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.costs + ).find( + (key) => + bodyshop.md_responsibility_centers.defaults.costs[key] === + changedFields.cost_center + ), + }); + } + }; + + return ( + form.submit()} + onCancel={handleCancel} + forceRender + afterClose={() => form.resetFields()} + footer={ + + + + {timeTicketModal.context && timeTicketModal.context.id ? null : ( + + )} + + } + destroyOnClose + > +
    + + +
    + ); +} + +export default connect( + mapStateToProps, + mapDispatchToProps +)(TimeTicketModalContainer); 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..abe30df56 --- /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); + 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..f6c17a43b --- /dev/null +++ b/client/src/components/time-tickets-summary-employees/time-tickets-summary-employees.component.jsx @@ -0,0 +1,214 @@ +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 employeeCostCenters = item.tickets + .map((i) => i.cost_center) + .filter(onlyUnique); + + return employeeCostCenters.map((costCenter) => { + const actHrs = item.tickets + .filter((ticket) => ticket.cost_center === costCenter) + .reduce((acc, val) => acc + val.actualhrs, 0); + + const prodHrs = item.tickets + .filter((ticket) => ticket.cost_center === costCenter) + .reduce((acc, val) => acc + val.productivehrs, 0); + + const clockHrs = item.tickets + .filter((ticket) => ticket.cost_center === costCenter) + .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..e5a9b9142 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,171 @@ -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, loading }) { 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..0b18735da 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 @@ -1,4 +1,4 @@ -import React from "react"; +import React, { useState } from "react"; import { Form, notification } from "antd"; import { useMutation } from "@apollo/react-hooks"; import VehicleDetailFormComponent from "./vehicle-detail-form.component"; @@ -10,17 +10,30 @@ function VehicleDetailFormContainer({ vehicle, refetch }) { const { t } = useTranslation(); const [updateVehicle] = useMutation(UPDATE_VEHICLE); const [form] = Form.useForm(); + const [loading, setLoading] = useState(false); - 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) => { + setLoading(true); + 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(); + setLoading(false); }; return ( @@ -28,12 +41,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..883de42ac 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"), @@ -34,19 +34,21 @@ export function VehicleDetailJobsComponent({ vehicle, bodyshop }) { key: "owner", render: (text, record) => ( - {`${record.ownr_fn} ${record.ownr_ln}`} + {`${record.ownr_fn || ""} ${record.ownr_ln || ""} ${ + record.ownr_co_nm || "" + }`} - ) + ), }, { 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 +57,8 @@ export function VehicleDetailJobsComponent({ vehicle, bodyshop }) { key: "clm_total", render: (text, record) => ( {record.clm_total} - ) - } + ), + }, ]; return ( @@ -71,20 +73,31 @@ export function VehicleDetailJobsComponent({ vehicle, bodyshop }) { )} pagination={{ position: "bottom" }} - columns={columns.map(item => ({ ...item }))} + 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..4097a9060 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 @@ -15,7 +15,9 @@ export default function VehicleTagPopoverComponent({ job }) { column={1} > - {`${job.v_model_yr || t("general.labels.na")} + {`${job.v_model_yr || t("general.labels.na")} ${ + job.v_color || "" + } ${job.v_make_desc || t("general.labels.na")} ${job.v_model_desc || t("general.labels.na")}`} @@ -63,22 +65,20 @@ 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_color || ""} + ${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 new file mode 100644 index 000000000..93a08215d --- /dev/null +++ b/client/src/components/vendor-search-select/vendor-search-select.component.jsx @@ -0,0 +1,69 @@ +import { Select, Tag } from "antd"; +import React, { useEffect, useState, forwardRef } from "react"; +import { HeartOutlined } from "@ant-design/icons"; +const { Option } = Select; + +//To be used as a form element only. + +const VendorSearchSelect = ( + { value, onChange, options, onSelect, disabled, preferredMake }, + ref +) => { + const [option, setOption] = useState(value); + + useEffect(() => { + if (value !== option && onChange) { + onChange(option); + } + }, [value, option, onChange]); + + const favorites = + preferredMake && options + ? options.filter( + (o) => o.favorite.filter((f) => f === preferredMake).length > 0 + ) + : []; + + return ( + + ); +}; +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..c720b2c9f 100644 --- a/client/src/components/vendors-form/vendors-form.component.jsx +++ b/client/src/components/vendors-form/vendors-form.component.jsx @@ -1,4 +1,4 @@ -import { Button, Form, Input, InputNumber, Switch, Select } from "antd"; +import { Button, Form, Input, InputNumber, Select } from "antd"; import React from "react"; import { useTranslation } from "react-i18next"; import FormItemEmail from "../form-items-formatted/email-form-item.component"; @@ -7,7 +7,7 @@ import { DeleteFilled } from "@ant-design/icons"; export default function VendorsFormComponent({ form, handleDelete, - responsibilityCenters + responsibilityCenters, }) { const { t } = useTranslation(); const { getFieldValue } = form; @@ -30,45 +30,17 @@ export default function VendorsFormComponent({ - -
    - - - - - - - - - -
    -
    { remove(field.name); @@ -125,8 +97,8 @@ export default function VendorsFormComponent({ rules={[ { type: "email", - message: t("general.validation.invalidemail") - } + message: t("general.validation.invalidemail"), + }, ]} name="email" > @@ -150,8 +122,8 @@ export default function VendorsFormComponent({ name="cost_center" > 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 ( {children}; -} - -function Row({ children }) { - return ( -
    - {React.Children.map(children, el => { - if (el.type === Column) return el; - - return ; - })} - - ); -} - -function Grid({ children }) { - return ( -
    {el}
    - - {React.Children.map(children, el => { - if (!el) return; - - if (el.type === Row) return el; - - if (el.type === Column) { - return {el}; - } - - return ( - - - - ); - })} - -
    {el}
    - ); -} - -Grid.Row = Row; -Grid.Column = Column; - -export default Grid; diff --git a/client/src/emails/components/header/header.component.jsx b/client/src/emails/components/header/header.component.jsx deleted file mode 100644 index 8136aba6b..000000000 --- a/client/src/emails/components/header/header.component.jsx +++ /dev/null @@ -1,23 +0,0 @@ -import React from "react"; - -export default function Header({ bodyshop }) { - return ( - - - - - -
    - - -
    - {`${bodyshop.shopname}`} -
    -
    {`${bodyshop.address1} ${bodyshop.address2} ${bodyshop.city} ${bodyshop.state} ${bodyshop.zip_post}`}
    -
    - {bodyshop.email}{" "} - {` | ${bodyshop.ph1}`} -
    -
    - ); -} 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 1f3d81aa8..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 ed1b758d9..6d7f4a3a4 100644 --- a/client/src/firebase/firebase.utils.js +++ b/client/src/firebase/firebase.utils.js @@ -2,31 +2,115 @@ import firebase from "firebase/app"; 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); export const auth = firebase.auth(); export const firestore = firebase.firestore(); +export const analytics = firebase.analytics(); + export default firebase; export const getCurrentUser = () => { return new Promise((resolve, reject) => { - const unsubscribe = auth.onAuthStateChanged(userAuth => { + const unsubscribe = auth.onAuthStateChanged((userAuth) => { unsubscribe(); resolve(userAuth); }, reject); }); }; -export const updateCurrentUser = userDetails => { +export const updateCurrentUser = (userDetails) => { return new Promise((resolve, reject) => { - const unsubscribe = auth.onAuthStateChanged(userAuth => { - console.log("userDetails", userDetails); - userAuth.updateProfile(userDetails).then(r => { + const unsubscribe = auth.onAuthStateChanged((userAuth) => { + userAuth.updateProfile(userDetails).then((r) => { unsubscribe(); resolve(userAuth); }); }, 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..a1981fddc 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,88 @@ export const QUERY_APPOINTMENTS_BY_JOBID = gql` } } `; +export const QUERY_SCHEDULE_LOAD_DATA = gql` + query QUERY_SCHEDULE_LOAD_DATA($start: timestamptz!, $end: timestamptz!) { + labhrs: joblines_aggregate( + where: { + mod_lbr_ty: { _eq: "LAB" } + job: { inproduction: { _eq: true } } + } + ) { + aggregate { + sum { + mod_lb_hrs + } + } + } + + larhrs: joblines_aggregate( + where: { + mod_lbr_ty: { _eq: "LAR" } + job: { inproduction: { _eq: true } } + } + ) { + aggregate { + sum { + mod_lb_hrs + } + } + } + + compJobs: jobs( + where: { scheduled_completion: { _gte: $start, _lte: $end } } + ) { + id + est_number + ro_number + 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 67e65a422..3c4e51f5b 100644 --- a/client/src/graphql/bodyshop.queries.js +++ b/client/src/graphql/bodyshop.queries.js @@ -1,8 +1,20 @@ -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 { + authlevel + useremail + user { + authid + email + dashboardlayout + employee { + id + } + } + } address1 address2 city @@ -20,9 +32,32 @@ export const QUERY_BODYSHOP = gql` state_tax_id updated_at zip_post + shoprates region_config md_responsibility_centers 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 + md_rbac + prodtargethrs + md_classes + md_ins_cos + md_categories + enforce_class employees { id first_name @@ -46,7 +81,99 @@ 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 + md_rbac + prodtargethrs + md_classes + md_ins_cos + md_categories + enforce_class + 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 58c22a411..63aff7dc8 100644 --- a/client/src/graphql/documents.queries.js +++ b/client/src/graphql/documents.queries.js @@ -1,13 +1,12 @@ -import { gql } from "apollo-boost"; +import gql from "graphql-tag"; export const GET_DOCUMENTS_BY_JOB = gql` query GET_DOCUMENTS_BY_JOB($jobId: uuid!) { documents(where: { jobid: { _eq: $jobId } }) { id - url - thumb_url name key + type } } `; @@ -17,8 +16,6 @@ export const INSERT_NEW_DOCUMENT = gql` insert_documents(objects: $docInput) { returning { id - url - thumb_url name key } 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 9a52f38cf..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!]!) { @@ -10,10 +10,88 @@ export const INSERT_NEW_INVOICE = gql` } `; +export const QUERY_ALL_INVOICES_PAGINATED = gql` + 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 + job { + id + ro_number + } + 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 @@ -21,12 +99,133 @@ 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) + } + } + } +`; + +export const QUERY_INVOICE_BY_PK = gql` + query QUERY_INVOICE_BY_PK($invoiceid: uuid!) { + invoices_by_pk(id: $invoiceid) { + due_date + exported + exported_at + id + invoice_number + date + is_credit_memo + jobid + total + updated_at + vendorid + vendor { + id + name + discount + } + invoicelines { + id + line_desc + 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 4f7bb7be1..a38023fda 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,42 @@ export const GET_JOB_LINES_BY_PK = gql` } } } - allocations { + } + } +`; + +export const GET_LINE_TICKET_BY_PK = gql` + query GET_LINE_TICKET_BY_PK($id: uuid!) { + joblines(where: { jobid: { _eq: $id } }) { + id + line_desc + 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 + } + timetickets(where: { jobid: { _eq: $id } }) { + actualhrs + ciecacode + cost_center + date + id + jobid + employeeid + employee { id - hours - employee { - id - first_name - last_name - } + first_name + last_name + employee_number } + productivehrs } } `; @@ -67,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 } } } @@ -74,13 +113,7 @@ export const UPDATE_JOB_LINE = gql` export const GET_JOB_LINES_TO_ENTER_INVOICE = gql` query GET_JOB_LINES_TO_ENTER_INVOICE($id: uuid!) { - joblines( - where: { - jobid: { _eq: $id } - oem_partno: { _neq: "" } - act_price: { _gt: "0" } - } - ) { + joblines(where: { jobid: { _eq: $id } }) { id line_desc part_type @@ -97,3 +130,9 @@ export const GET_JOB_LINES_TO_ENTER_INVOICE = gql` } } `; +// oem_partno: { +// _neq: ""; +// } +// act_price: { +// _gt: "0"; +// } diff --git a/client/src/graphql/jobs.queries.js b/client/src/graphql/jobs.queries.js index 3dde172f1..3d89ceb4e 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!]!) { @@ -52,33 +52,162 @@ 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 + jobs(where: { inproduction: { _eq: true } }) { 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 + 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 + employee_refinish_rel { + id + first_name + last_name + } + employee_prep + employee_prep_rel { + id + first_name + last_name + } + partcount: joblines_aggregate { + nodes { + status } - owner { - id - first_name - last_name + } + + 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 + quantity + } + } + timetickets { + id + rate + cost_center + actualhrs + } } } `; @@ -87,6 +216,22 @@ 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 + } + intakechecklist csr loss_desc kmin @@ -100,6 +245,7 @@ export const GET_JOB_BY_PK = gql` est_number ro_number clm_total + inproduction vehicleid plate_no v_vin @@ -149,6 +295,17 @@ export const GET_JOB_BY_PK = gql` 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 @@ -173,28 +330,29 @@ export const GET_JOB_BY_PK = gql` ownr_ph1 } labor_rate_desc - rate_lab - rate_lad - rate_lae - rate_lar - rate_las - rate_laf - rate_lam - rate_lag rate_atp - rate_lau rate_la1 rate_la2 rate_la3 rate_la4 - rate_mapa - rate_mash - rate_mahw + 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_laa + rate_mahw + rate_mapa + rate_mash rate_matd actual_in scheduled_completion @@ -209,8 +367,13 @@ export const GET_JOB_BY_PK = gql` date_closed date_exported status - joblines { + owner_owing + tax_registration_number + class + category + joblines(where: { jobid: { _eq: $id } }, order_by: { line_no: asc }) { id + line_no unq_seq line_ind line_desc @@ -225,6 +388,31 @@ export const GET_JOB_BY_PK = gql` lbr_op lbr_amt op_code_desc + status + notes + location + parts_order_lines { + id + parts_order { + id + order_number + order_date + user_email + vendor { + id + name + } + } + } + } + payments { + id + amount + payer + created_at + stripeid + transactionid + memo } cccontracts { id @@ -232,12 +420,19 @@ export const GET_JOB_BY_PK = gql` start scheduledreturn agreementnumber - } - appointments_aggregate { - aggregate { - count + courtesycar { + id + make + model + year + plate } } + cieca_ttl + csiinvites { + id + completedon + } } } `; @@ -246,9 +441,16 @@ 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 + joblines_status { + part_type + count + status + } owner { id allow_text_message @@ -261,6 +463,7 @@ export const QUERY_JOB_CARD_DETAILS = gql` v_color plate_no vehicle { + id v_model_yr v_make_desc v_model_desc @@ -284,11 +487,19 @@ 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 @@ -296,7 +507,6 @@ export const QUERY_JOB_CARD_DETAILS = gql` private created_at } - updated_at clm_total ded_amt @@ -309,7 +519,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 } } } @@ -320,8 +599,8 @@ export const UPDATE_JOB = gql` update_jobs(where: { id: { _eq: $jobId } }, _set: $job) { returning { id - est_ph1 - est_ea + date_exported + status } } } @@ -338,12 +617,21 @@ export const UPDATE_JOBS = gql` `; export const CONVERT_JOB_TO_RO = gql` - mutation CONVERT_JOB_TO_RO($jobId: uuid!) { - update_jobs(where: { id: { _eq: $jobId } }, _set: { converted: true }) { + mutation CONVERT_JOB_TO_RO( + $jobId: uuid! + $class: String + $ins_co_nm: String! + ) { + update_jobs( + where: { id: { _eq: $jobId } } + _set: { converted: true, ins_co_nm: $ins_co_nm, class: $class } + ) { returning { id ro_number converted + class + ins_co_nm } } } @@ -385,3 +673,477 @@ 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!) { + jobs_by_pk(id: $id) { + id + 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_faxx + agt_fax + agt_lic_no + agt_ph1 + agt_ph1x + agt_ph2 + agt_zip + agt_st + agt_ph2x + area_of_damage + cat_no + cieca_stl + cieca_ttl + 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_ofc_id + clm_ofc_nm + clm_ph1 + clm_ph1x + clm_ph2 + clm_ph2x + clm_st + clm_title + clm_total + clm_zip + csr + cust_pr + 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_ph1 + est_st + est_zip + federal_tax_payable + federal_tax_rate + g_bett_amt + 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 + job_totals + labor_rate_desc + labor_rate_id + local_tax_rate + 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_lag + rate_laf + 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 + selling_dealer + selling_dealer_contact + servicing_dealer + servicing_dealer_contact + shopid + special_coverage_policy + state_tax_rate + 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 + v_color + v_make_desc + v_model_desc + v_model_yr + v_vin + vehicleid + joblines { + act_price + alt_co_id + alt_overrd + alt_part_i + alt_partm + bett_amt + alt_partno + bett_pctg + bett_tax + bett_type + cert_part + db_hrs + db_price + db_ref + est_seq + glass_flag + id + 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 + status + 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 a95433b55..0174dd6aa 100644 --- a/client/src/graphql/owners.queries.js +++ b/client/src/graphql/owners.queries.js @@ -1,8 +1,8 @@ -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!) { - search_owner(args: { search: $search }) { + search_owners(args: { search: $search }) { ownr_fn ownr_ln ownr_ph1 @@ -45,12 +45,10 @@ export const QUERY_OWNER_BY_ID = gql` clm_no status clm_total - vehicle { - id - v_model_yr - v_model_desc - v_make_desc - } + v_model_yr + v_model_desc + v_make_desc + vehicleid } } } @@ -91,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..aece6edaf --- /dev/null +++ b/client/src/graphql/search.queries.js @@ -0,0 +1,55 @@ +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 + v_vin + plate_no + } + 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 new file mode 100644 index 000000000..3d9e3ad37 --- /dev/null +++ b/client/src/graphql/templates.queries.js @@ -0,0 +1,76 @@ +import gql from "graphql-tag"; + +export const QUERY_TEMPLATES_BY_NAME = gql` + query QUERY_TEMPLATES_BY_NAME($name: String!) { + templates(where: { name: { _eq: $name } }) { + id + name + query + html + bodyshopid + } + } +`; +export const QUERY_TEMPLATES_BY_NAME_FOR_DUPE = gql` + query QUERY_TEMPLATES_BY_NAME_FOR_DUPE($name: String!) { + templates(where: { name: { _eq: $name } }) { + id + name + query + html + bodyshopid + jsontemplate + } + } +`; + +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 + jsontemplate + } + } +`; +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 new file mode 100644 index 000000000..0d2474712 --- /dev/null +++ b/client/src/graphql/timetickets.queries.js @@ -0,0 +1,166 @@ +import gql from "graphql-tag"; + +export const QUERY_TICKETS_BY_JOBID = gql` + query QUERY_TICKETS_BY_JOBID($jobid: uuid!) { + timetickets(where: { jobid: { _eq: $jobid } }) { + actualhrs + cost_center + ciecacode + rate + productivehrs + id + employee { + employee_number + first_name + last_name + id + } + } + } +`; + +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!]! + ) { + insert_timetickets(objects: $timeTicketInput) { + returning { + id + clockon + clockoff + employeeid + productivehrs + actualhrs + ciecacode + date + } + } + } +`; + +export const UPDATE_TIME_TICKET = gql` + mutation UPDATE_TIME_TICKET( + $timeticketId: uuid! + $timeticket: timetickets_set_input! + ) { + update_timetickets( + where: { id: { _eq: $timeticketId } } + _set: $timeticket + ) { + 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 d1bf838e6..163c96a48 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 @@ -67,19 +67,23 @@ export const DELETE_VENDOR = gql` `; export const QUERY_ALL_VENDORS_FOR_ORDER = gql` - query QUERY_ALL_VENDORS_FOR_ORDER { - vendors(order_by: { favorite: desc }) { + query QUERY_ALL_VENDORS_FOR_ORDER($jobId: uuid) { + vendors(order_by: { name: asc }) { name cost_center id favorite + discount + } + jobs(where: { id: { _eq: $jobId } }) { + v_make_desc } } `; export const SEARCH_VENDOR_AUTOCOMPLETE = gql` query SEARCH_VENDOR_AUTOCOMPLETE { - vendors { + vendors(order_by: { name: asc }) { name discount id diff --git a/client/src/index.js b/client/src/index.js index 8cb47c9a0..34ca11d3a 100644 --- a/client/src/index.js +++ b/client/src/index.js @@ -2,13 +2,14 @@ import React from "react"; import ReactDOM from "react-dom"; import { BrowserRouter } from "react-router-dom"; import "./translations/i18n"; -import * as serviceWorker from "./serviceWorker"; +//import * as serviceWorker from "./serviceWorker"; import { Provider } from "react-redux"; import { PersistGate } from "redux-persist/integration/react"; import { store, persistor } from "./redux/store"; import AppContainer from "./App/App.container"; import "./index.css"; import LoadingSpinner from "./components/loading-spinner/loading-spinner.component"; +import "./App/registerServiceWorker.component"; require("dotenv").config(); @@ -26,4 +27,4 @@ ReactDOM.render( document.getElementById("root") ); -serviceWorker.register(); +//serviceWorker.register(); 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..82d9667f1 --- /dev/null +++ b/client/src/pages/accounting-payables/accounting-payables.container.jsx @@ -0,0 +1,50 @@ +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"; +import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; +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..f008a7729 --- /dev/null +++ b/client/src/pages/accounting-payments/accounting-payments.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 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"; +import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; + +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..0d9820f1a --- /dev/null +++ b/client/src/pages/accounting-receivables/accounting-receivables.container.jsx @@ -0,0 +1,54 @@ +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"; +import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; + +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..cf1bf09fe 100644 --- a/client/src/pages/contract-create/contract-create.page.component.jsx +++ b/client/src/pages/contract-create/contract-create.page.component.jsx @@ -1,21 +1,26 @@ -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, + loading, }) { const { t } = useTranslation(); return (
    - + - + +
    ); } 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 6a4163334..81ac0303b 100644 --- a/client/src/pages/contract-create/contract-create.page.container.jsx +++ b/client/src/pages/contract-create/contract-create.page.container.jsx @@ -1,76 +1,106 @@ -import React, { useEffect, useState } from "react"; - -import ContractCreatePageComponent from "./contract-create.page.component"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { selectBodyshop } from "../../redux/user/user.selectors"; -import { Form, notification } from "antd"; -import { useTranslation } from "react-i18next"; -import { INSERT_NEW_CONTRACT } from "../../graphql/cccontracts.queries"; import { useMutation } from "@apollo/react-hooks"; +import { Form, notification } from "antd"; +import React, { useEffect, useState } from "react"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; import { useHistory, useLocation } from "react-router-dom"; +import { createStructuredSelector } from "reselect"; +import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; +import { INSERT_NEW_CONTRACT } from "../../graphql/cccontracts.queries"; +import { setBreadcrumbs } from "../../redux/application/application.actions"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +import ContractCreatePageComponent from "./contract-create.page.component"; + const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop + bodyshop: selectBodyshop, +}); +const mapDispatchToProps = (dispatch) => ({ + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), }); -export function ContractCreatePageContainer({ bodyshop }) { +export function ContractCreatePageContainer({ bodyshop, setBreadcrumbs }) { const [form] = Form.useForm(); const { t } = useTranslation(); const history = useHistory(); const location = useLocation(); + const [loading, setLoading] = useState(false); const selectedCarState = useState(null); const selectedJobState = useState( (location.state && location.state.jobId) || null ); const [insertContract] = useMutation(INSERT_NEW_CONTRACT); - console.log("location", location); - - const handleFinish = values => { + const handleFinish = (values) => { if (!!selectedCarState[0] && !!selectedJobState[0]) { + setLoading(true); insertContract({ variables: { contract: { ...values, courtesycarid: selectedCarState[0], - jobid: selectedJobState[0] - } - } + jobid: selectedJobState[0], + }, + }, }) - .then(response => { + .then((response) => { notification["success"]({ - message: t("contracts.successes.saved") + message: t("contracts.successes.saved"), }); history.push( `/manage/courtesycars/contracts/${response.data.insert_cccontracts.returning[0].id}` ); }) - .catch(error => + .catch((error) => notification["error"]({ message: t("contracts.errors.saving", { - error: JSON.stringify(error) - }) + error: JSON.stringify(error), + }), }) ); } else { notification["error"]({ - message: t("contracts.errors.selectjobandcar") + message: t("contracts.errors.selectjobandcar"), }); } + setLoading(false); }; useEffect(() => { document.title = t("titles.contracts-create"); - }, [t]); + setBreadcrumbs([ + { link: "/manage/courtesycars", label: t("titles.bc.courtesycars") }, + { + link: "/manage/courtesycars/contracts", + label: t("titles.bc.contracts"), + }, + { + link: "/manage/courtesycars/contracts/new", + label: t("titles.bc.contracts-create"), + }, + ]); + }, [t, setBreadcrumbs]); return ( - - - + +
    + + +
    ); } -export default connect(mapStateToProps, null)(ContractCreatePageContainer); +export default connect( + mapStateToProps, + mapDispatchToProps +)(ContractCreatePageContainer); 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 83b803681..0e4665c00 100644 --- a/client/src/pages/contract-detail/contract-detail.page.component.jsx +++ b/client/src/pages/contract-detail/contract-detail.page.component.jsx @@ -1,4 +1,4 @@ -import { Button, Typography } from "antd"; +import { Button, Typography, Row, Col } from "antd"; import React from "react"; import { useTranslation } from "react-i18next"; import { connect } from "react-redux"; @@ -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,33 +18,48 @@ export function ContractDetailPage({ job, courtesyCar, setCourtesyCarReturnModalContext, - refetch + refetch, + form, }) { const { t } = useTranslation(); return (
    - {`Agreement ${(contract && contract.agreementnumber) || - ""}`} - - - - - + + {`Agreement ${ + (contract && contract.agreementnumber) || "" + } - ${t((contract && contract.status) || "")}`} + + + + + + + + + + + + + +
    ); } 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 fb8278739..99e7f892a 100644 --- a/client/src/pages/contract-detail/contract-detail.page.container.jsx +++ b/client/src/pages/contract-detail/contract-detail.page.container.jsx @@ -3,23 +3,37 @@ import { Form, notification } from "antd"; import moment from "moment"; import React, { useEffect } from "react"; import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; import { useParams } from "react-router-dom"; import AlertComponent from "../../components/alert/alert.component"; +import CourtesyCarReturnModalContainer from "../../components/courtesy-car-return-modal/courtesy-car-return-modal.container"; +import LoadingSpinner from "../../components/loading-spinner/loading-spinner.component"; +import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; import { QUERY_CONTRACT_BY_PK, - UPDATE_CONTRACT + UPDATE_CONTRACT, } from "../../graphql/cccontracts.queries"; +import { + addRecentItem, + setBreadcrumbs, +} from "../../redux/application/application.actions"; +import { CreateRecentItem } from "../../utils/create-recent-item"; import ContractDetailPageComponent from "./contract-detail.page.component"; -import CourtesyCarReturnModalContainer from "../../components/courtesy-car-return-modal/courtesy-car-return-modal.container"; +import NotFound from "../../components/not-found/not-found.component"; -export default function ContractDetailPageContainer() { +const mapDispatchToProps = (dispatch) => ({ + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), + addRecentItem: (item) => dispatch(addRecentItem(item)), +}); + +export function ContractDetailPageContainer({ setBreadcrumbs, addRecentItem }) { const { t } = useTranslation(); const [updateContract] = useMutation(UPDATE_CONTRACT); const [form] = Form.useForm(); const { contractId } = useParams(); const { loading, error, data, refetch } = useQuery(QUERY_CONTRACT_BY_PK, { - variables: { id: contractId } + variables: { id: contractId }, }); useEffect(() => { @@ -28,66 +42,112 @@ export default function ContractDetailPageContainer() { : error ? t("titles.app") : t("titles.contracts-detail", { - id: (data && data.cccontracts_by_pk.agreementnumber) || "" + id: + (data && + data.cccontracts_by_pk && + data.cccontracts_by_pk.agreementnumber) || + "", }); - }, [t, data, error, loading]); - 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 }) - }) + setBreadcrumbs([ + { link: "/manage/courtesycars", label: t("titles.bc.courtesycars") }, + { + link: "/manage/courtesycars/contracts", + label: t("titles.bc.contracts"), + }, + { + link: "/manage/courtesycars/contracts/new", + label: t("titles.bc.contracts-detail", { + number: + (data && + data.cccontracts_by_pk && + data.cccontracts_by_pk.agreementnumber) || + "", + }), + }, + ]); + + if (data && data.cccontracts_by_pk) + 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(() => { - if (data) form.resetFields(); + if (data && data.cccontracts_by_pk) form.resetFields(); }, [data, form]); if (error) return ; + if (loading) return ; + + if (!!!data.cccontracts_by_pk) return ; + console.log( + "data.cccontracts_by_pk", + !!!data.cccontracts_by_pk, + data.cccontracts_by_pk + ); + return ( -
    - -
    - - -
    + +
    + +
    + + +
    +
    ); } +export default connect(null, mapDispatchToProps)(ContractDetailPageContainer); 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 08fc143ff..e1eeb04a9 100644 --- a/client/src/pages/contracts/contracts.page.container.jsx +++ b/client/src/pages/contracts/contracts.page.container.jsx @@ -1,19 +1,70 @@ -import React from "react"; -import ContractsPageComponent from "./contracts.page.component"; import { useQuery } from "@apollo/react-hooks"; -import { QUERY_ACTIVE_CONTRACTS } from "../../graphql/cccontracts.queries"; +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_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"; +import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; -export default function ContractsPageContainer() { - const { loading, error, data } = useQuery(QUERY_ACTIVE_CONTRACTS); +const mapDispatchToProps = (dispatch) => ({ + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), +}); + +export function ContractsPageContainer({ setBreadcrumbs }) { + 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"); + + setBreadcrumbs([ + { link: "/manage/courtesycars", label: t("titles.bc.courtesycars") }, + { + link: "/manage/courtesycars/contracts", + label: t("titles.bc.contracts"), + }, + ]); + }, [setBreadcrumbs, t]); if (error) return ; return ( -
    - -
    + +
    + +
    +
    ); } +export default connect(null, mapDispatchToProps)(ContractsPageContainer); 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 cbcd4dd45..2785d70b9 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 @@ -8,38 +8,54 @@ import { INSERT_NEW_COURTESY_CAR } from "../../graphql/courtesy-car.queries"; import { selectBodyshop } from "../../redux/user/user.selectors"; import CourtesyCarCreateComponent from "./courtesy-car-create.page.component"; import { useHistory } from "react-router-dom"; +import { setBreadcrumbs } from "../../redux/application/application.actions"; +import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop + bodyshop: selectBodyshop, }); - -export function CourtesyCarCreateContainer({ bodyshop }) { +const mapDispatchToProps = (dispatch) => ({ + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), +}); +export function CourtesyCarCreateContainer({ bodyshop, setBreadcrumbs }) { const [form] = Form.useForm(); const [insertCourtesyCar] = useMutation(INSERT_NEW_COURTESY_CAR); const { t } = useTranslation(); const history = useHistory(); - const handleFinish = values => { + const handleFinish = (values) => { insertCourtesyCar({ - variables: { courtesycar: { ...values, bodyshopid: bodyshop.id } } + variables: { courtesycar: { ...values, bodyshopid: bodyshop.id } }, }) - .then(response => { + .then((response) => { notification["success"]({ message: t("courtesycars.successes.saved") }); history.push( `/manage/courtesycars/${response.data.insert_courtesycars.returning[0].id}` ); }) - .catch(error => console.log("error", error)); + .catch((error) => console.log("error", error)); }; useEffect(() => { document.title = t("titles.courtesycars-create"); - }, [t]); + setBreadcrumbs([ + { link: "/manage/courtesycars", label: t("titles.bc.courtesycars") }, + { + link: "/manage/courtesycars/new", + label: t("titles.bc.courtesycars-new"), + }, + ]); + }, [t, setBreadcrumbs]); return ( -
    - - + +
    + + +
    ); } -export default connect(mapStateToProps, null)(CourtesyCarCreateContainer); +export default connect( + mapStateToProps, + mapDispatchToProps +)(CourtesyCarCreateContainer); 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..4af0cf62f 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,14 @@ 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, + saveLoading, +}) { 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 8fd114dde..f534c74b3 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 @@ -1,21 +1,37 @@ import { useMutation, useQuery } from "@apollo/react-hooks"; import { Form, notification } from "antd"; import moment from "moment"; -import React, { useEffect } from "react"; +import React, { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; import { useParams } from "react-router-dom"; import AlertComponent from "../../components/alert/alert.component"; +import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; import { QUERY_CC_BY_PK, UPDATE_CC } from "../../graphql/courtesy-car.queries"; +import { + addRecentItem, + setBreadcrumbs, +} from "../../redux/application/application.actions"; +import { CreateRecentItem } from "../../utils/create-recent-item"; import CourtesyCarDetailPageComponent from "./courtesy-car-detail.page.component"; +import NotFound from "../../components/not-found/not-found.component"; +import LoadingSpinner from "../../components/loading-spinner/loading-spinner.component"; -export default function CourtesyCarDetailPageContainer() { +const mapDispatchToProps = (dispatch) => ({ + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), + addRecentItem: (item) => dispatch(addRecentItem(item)), +}); +export function CourtesyCarDetailPageContainer({ + setBreadcrumbs, + addRecentItem, +}) { const { t } = useTranslation(); const [insertCourtesyCar] = useMutation(UPDATE_CC); const [form] = Form.useForm(); const { ccId } = useParams(); - + const [saveLoading, setSaveLoading] = useState(false); const { loading, error, data } = useQuery(QUERY_CC_BY_PK, { - variables: { id: ccId } + variables: { id: ccId }, }); useEffect(() => { @@ -24,66 +40,113 @@ export default function CourtesyCarDetailPageContainer() { : error ? t("titles.app") : t("titles.courtesycars-detail", { - id: (data && data.courtesycars_by_pk.vin) || "" + id: + (data && + data.courtesycars_by_pk && + data.courtesycars_by_pk.fleet_number) || + "", }); - }, [t, data, error, loading]); + setBreadcrumbs([ + { link: "/manage/courtesycars", label: t("titles.bc.courtesycars") }, + { + link: `/manage/courtesycars/${ + (data && data.courtesycars_by_pk && data.courtesycars_by_pk.id) || "" + }`, + label: t("titles.bc.courtesycars-detail", { + number: + (data && + data.courtesycars_by_pk && + data.courtesycars_by_pk.fleetnumber) || + "", + }), + }, + ]); - const handleFinish = values => { - insertCourtesyCar({ - variables: { cc: { ...values }, ccId: ccId } - }) - .then(response => { - notification["success"]({ message: t("courtesycars.successes.saved") }); - }) - .catch(error => - notification["error"]({ - message: t("courtesycars.errors.saving", { error: error }) - }) + if (data && data.courtesycars_by_pk) + 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 = async (values) => { + setSaveLoading(true); + + const result = await insertCourtesyCar({ + variables: { cc: { ...values }, ccId: ccId }, + }); + + if (!!result.errors) { + notification["error"]({ + message: t("courtesycars.errors.saving", { error: error }), + }); + } + + notification["success"]({ + message: t("courtesycars.successes.saved"), + }); + + setSaveLoading(false); }; useEffect(() => { - if (data) form.resetFields(); + if (data && data.courtesycars_by_pk) form.resetFields(); }, [data, form]); + if (loading) return ; if (error) return ; + + if (!!!data.courtesycars_by_pk) return ; + return ( -
    - - + +
    + + +
    ); } +export default connect( + null, + mapDispatchToProps +)(CourtesyCarDetailPageContainer); 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 3aac89538..19f22544a 100644 --- a/client/src/pages/courtesy-cars/courtesy-cars.page.container.jsx +++ b/client/src/pages/courtesy-cars/courtesy-cars.page.container.jsx @@ -1,17 +1,37 @@ -import React from "react"; -import CourtesyCarsPageComponent from "./courtesy-cars.page.component"; import { useQuery } from "@apollo/react-hooks"; +import React, { useEffect } from "react"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; import AlertComponent from "../../components/alert/alert.component"; +import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; import { QUERY_ALL_CC } from "../../graphql/courtesy-car.queries"; +import { setBreadcrumbs } from "../../redux/application/application.actions"; +import CourtesyCarsPageComponent from "./courtesy-cars.page.component"; -export default function CourtesyCarsPageContainer() { - const { loading, error, data } = useQuery(QUERY_ALL_CC); +const mapDispatchToProps = (dispatch) => ({ + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), +}); +export function CourtesyCarsPageContainer({ setBreadcrumbs }) { + const { loading, error, data, refetch } = useQuery(QUERY_ALL_CC); + const { t } = useTranslation(); + useEffect(() => { + document.title = t("titles.courtesycars"); + + setBreadcrumbs([ + { link: "/manage/courtesycars", label: t("titles.bc.courtesycars") }, + ]); + }, [setBreadcrumbs, t]); if (error) return ; return ( - + + + ); } + +export default connect(null, mapDispatchToProps)(CourtesyCarsPageContainer); 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..bb3f3b585 --- /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_co_nm || 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/error-not-found/error-not-found.page.jsx b/client/src/pages/error-not-found/error-not-found.page.jsx deleted file mode 100644 index 4d89a8e98..000000000 --- a/client/src/pages/error-not-found/error-not-found.page.jsx +++ /dev/null @@ -1,5 +0,0 @@ -import React from "react"; - -export default function ErrorNotFound() { - return
    Uh oh, we couldn't find the page you're looking for.
    ; -} diff --git a/client/src/pages/invoices/invoices.page.component.jsx b/client/src/pages/invoices/invoices.page.component.jsx new file mode 100644 index 000000000..a3d57ec95 --- /dev/null +++ b/client/src/pages/invoices/invoices.page.component.jsx @@ -0,0 +1,182 @@ +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 { 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"; + +const mapDispatchToProps = (dispatch) => ({ + setPartsOrderContext: (context) => + dispatch(setModalContext({ context: context, modal: "partsOrder" })), + setInvoiceEnterContext: (context) => + dispatch(setModalContext({ context: context, modal: "invoiceEnter" })), +}); + +export function InvoicesListPage({ + loading, + 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, + 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, + }, + { + 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", + render: (text, record) => ( +
    + + + + +
    + ), + }, + ]; + + 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 ( +
    + + {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 new file mode 100644 index 000000000..34d0fcc5b --- /dev/null +++ b/client/src/pages/invoices/invoices.page.container.jsx @@ -0,0 +1,66 @@ +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 RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; + +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: { + search: search || "", + offset: page ? (page - 1) * 25 : 0, + limit: 25, + order: [ + { + [sortcolumn || "date"]: sortorder + ? sortorder === "descend" + ? "desc" + : "asc" + : "desc", + }, + ], + }, + } + ); + + 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..5f517175b --- /dev/null +++ b/client/src/pages/jobs-all/jobs-all.container.jsx @@ -0,0 +1,65 @@ +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 RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; + +const mapStateToProps = createStructuredSelector({ + //bodyshop: selectBodyshop, +}); + +const mapDispatchToProps = (dispatch) => ({ + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), +}); + +export function AllJobs({ 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-available/jobs-available.page.container.jsx b/client/src/pages/jobs-available/jobs-available.page.container.jsx index 4014ea5bd..b2dbe6129 100644 --- a/client/src/pages/jobs-available/jobs-available.page.container.jsx +++ b/client/src/pages/jobs-available/jobs-available.page.container.jsx @@ -2,32 +2,40 @@ import React, { useEffect } from "react"; import { useMutation, useLazyQuery } from "@apollo/react-hooks"; import { DELETE_AVAILABLE_JOB, - QUERY_AVAILABLE_NEW_JOBS_EST_DATA_BY_PK + QUERY_AVAILABLE_NEW_JOBS_EST_DATA_BY_PK, } from "../../graphql/available-jobs.queries"; import JobsAvailablePageComponent from "./jobs-available.page.component"; import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; -export default function JobsAvailablePageContainer() { +import { setBreadcrumbs } from "../../redux/application/application.actions"; +const mapDispatchToProps = (dispatch) => ({ + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), +}); + +export function JobsAvailablePageContainer({ setBreadcrumbs }) { const [deleteJob] = useMutation(DELETE_AVAILABLE_JOB); const { t } = useTranslation(); - const estDataLazyLoad = useLazyQuery( - QUERY_AVAILABLE_NEW_JOBS_EST_DATA_BY_PK, - { - fetchPolicy: "network-only" - } - ); + const estDataLazyLoad = useLazyQuery(QUERY_AVAILABLE_NEW_JOBS_EST_DATA_BY_PK); useEffect(() => { document.title = t("titles.jobsavailable"); - }, [t]); + setBreadcrumbs([ + { link: "/manage/available", label: t("titles.bc.availablejobs") }, + ]); + }, [t, setBreadcrumbs]); return ( -
    - -
    + +
    + +
    +
    ); } +export default connect(null, mapDispatchToProps)(JobsAvailablePageContainer); 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..7f42797cb --- /dev/null +++ b/client/src/pages/jobs-close/jobs-close.component.jsx @@ -0,0 +1,147 @@ +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..2091af423 --- /dev/null +++ b/client/src/pages/jobs-close/jobs-close.container.jsx @@ -0,0 +1,62 @@ +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 AlertComponent from "../../components/alert/alert.component"; +import LoadingSpinner from "../../components/loading-spinner/loading-spinner.component"; +import NotFound from "../../components/not-found/not-found.component"; +import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; +import { QUERY_JOB_CLOSE_DETAILS } from "../../graphql/jobs.queries"; +import { setBreadcrumbs } from "../../redux/application/application.actions"; +import JobsCloseComponent from "./jobs-close.component"; + +const mapDispatchToProps = (dispatch) => ({ + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), +}); + +export function JobsCloseContainer({ setBreadcrumbs }) { + 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 && 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 && 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 ; + if (!!!data.jobs_by_pk) return ; + + return ( + +
    + +
    +
    + ); +} +export default connect(null, 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..9f0d43f61 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 && ( )} {pageIndex === steps.length - 1 && ( - )} @@ -82,18 +79,18 @@ export default function JobsCreateComponent({ form }) { {state.created ? (
    - + + , - + - + , ]} />
    @@ -108,7 +105,7 @@ export default function JobsCreateComponent({ form }) { onClick={() => { form .validateFields() - .then(r => { + .then((r) => { if (steps[pageIndex].validation) { setErrorMessage(null); setPageIndex(idx); @@ -116,7 +113,7 @@ export default function JobsCreateComponent({ form }) { setErrorMessage(steps[pageIndex].error); } }) - .catch(error => console.log("error", error)); + .catch((error) => console.log("error", error)); }} /> ))} @@ -125,12 +122,18 @@ export default function JobsCreateComponent({ form }) { {errorMessage ? (
    - +
    ) : 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 7132fa291..90d6d0b7a 100644 --- a/client/src/pages/jobs-create/jobs-create.container.jsx +++ b/client/src/pages/jobs-create/jobs-create.container.jsx @@ -9,13 +9,16 @@ import { connect } from "react-redux"; import { createStructuredSelector } from "reselect"; import { selectBodyshop } from "../../redux/user/user.selectors"; import { useTranslation } from "react-i18next"; +import { setBreadcrumbs } from "../../redux/application/application.actions"; +import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop + bodyshop: selectBodyshop, }); -export default connect(mapStateToProps, null)(JobsCreateContainer); - -function JobsCreateContainer({ bodyshop }) { +const mapDispatchToProps = (dispatch) => ({ + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), +}); +function JobsCreateContainer({ bodyshop, setBreadcrumbs }) { const { t } = useTranslation(); const contextState = useState({ vehicle: { new: false, search: "", selectedid: null, vehicleObj: null }, @@ -24,7 +27,7 @@ function JobsCreateContainer({ bodyshop }) { created: false, error: null, newJobId: null, - newJobEstNum: null + newJobEstNum: null, }); const [form] = Form.useForm(); const [state, setState] = contextState; @@ -36,54 +39,63 @@ function JobsCreateContainer({ bodyshop }) { useEffect(() => { if (!!state.owner.selectedid) { loadOwner({ - variables: { id: state.owner.selectedid } + variables: { id: state.owner.selectedid }, }); } }, [state.owner.selectedid, loadOwner]); useEffect(() => { document.title = t("titles.jobs-create"); - }, [t]); + setBreadcrumbs([ + { link: "/manage/available", label: t("titles.bc.availablejobs") }, + { + link: "/manage/jobs/new", + label: t("titles.bc.jobs-new"), + }, + ]); + }, [t, setBreadcrumbs]); - const runInsertJob = job => { + const runInsertJob = (job) => { insertJob({ variables: { job: job } }) - .then(resp => { + .then((resp) => { setState({ ...state, created: true, error: null, newJobId: resp.data.insert_jobs.returning[0].id, - newJobEstNum: resp.data.insert_jobs.returning[0].est_number + newJobEstNum: resp.data.insert_jobs.returning[0].est_number, }); }) - .catch(error => { + .catch((error) => { notification["error"]({ - message: t("jobs.errors.creating", { error: error }) + message: t("jobs.errors.creating", { error: error }), }); setState({ ...state, error: error }); }); }; - const handleFinish = values => { + const handleFinish = (values) => { + console.log("handleFinish -> values", values); let job = Object.assign( {}, values, { vehicle: state.vehicle.selectedid ? null : values.vehicle, - vehicleid: state.vehicle.selectedid || null + vehicleid: state.vehicle.selectedid || null, }, { owner: state.owner.selectedid ? null : values.owner, - ownerid: state.owner.selectedid || null + ownerid: state.owner.selectedid || null, }, { - status: bodyshop.md_ro_statuses.default_imported || "Open*", //Pull from redux store. - shopid: bodyshop.id + 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; @@ -94,7 +106,7 @@ function JobsCreateContainer({ bodyshop }) { 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; @@ -105,8 +117,6 @@ function JobsCreateContainer({ bodyshop }) { 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; @@ -122,9 +132,20 @@ function JobsCreateContainer({ bodyshop }) { return ( -
    - - + +
    + + +
    ); } +export default connect( + mapStateToProps, + mapDispatchToProps +)(JobsCreateContainer); 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 638eacba2..43775c021 100644 --- a/client/src/pages/jobs-detail/jobs-detail.page.component.jsx +++ b/client/src/pages/jobs-detail/jobs-detail.page.component.jsx @@ -3,54 +3,46 @@ import Icon, { CalendarFilled, DollarCircleOutlined, FileImageFilled, - ToolFilled + ToolFilled, } from "@ant-design/icons"; import { Form, notification, Tabs } from "antd"; +import Axios from "axios"; +import Dinero from "dinero.js"; import moment from "moment"; -import React, { lazy, Suspense } from "react"; +import queryString from "query-string"; +import React, { lazy, Suspense, useState } from "react"; import { useTranslation } from "react-i18next"; import { FaHardHat, FaHistory, - FaInfo, FaRegStickyNote, - FaShieldAlt + FaShieldAlt, } from "react-icons/fa"; -import { useHistory } from "react-router-dom"; -//import JobsLinesContainer from "../../components/job-detail-lines/job-lines.container"; -//import JobsDetailClaims from "../../components/jobs-detail-claims/jobs-detail-claims.component"; -//import JobsDetailDatesComponent from "../../components/jobs-detail-dates/jobs-detail-dates.component"; -//import JobsDetailFinancials from "../../components/jobs-detail-financial/jobs-detail-financial.component"; -//import JobsDetailHeader from "../../components/jobs-detail-header/jobs-detail-header.component"; -//import JobsDetailInsurance from "../../components/jobs-detail-insurance/jobs-detail-insurance.component"; -//import JobsDocumentsContainer from "../../components/jobs-documents/jobs-documents.container"; -//import JobNotesContainer from "../../components/jobs-notes/jobs-notes.container"; -//import ScheduleJobModalContainer from "../../components/schedule-job-modal/schedule-job-modal.container"; -//import JobLineUpsertModalContainer from "../../components/job-lines-upsert-modal/job-lines-upsert-modal.container"; -//import EnterInvoiceModalContainer from "../../components/invoice-enter-modal/invoice-enter-modal.container"; +import { connect } from "react-redux"; +import { useHistory, useLocation } from "react-router-dom"; +import { createStructuredSelector } from "reselect"; +import FormFieldsChanged from "../../components/form-fields-changed-alert/form-fields-changed-alert.component"; import LoadingSpinner from "../../components/loading-spinner/loading-spinner.component"; +import { selectBodyshop } from "../../redux/user/user.selectors"; const JobsLinesContainer = lazy(() => import("../../components/job-detail-lines/job-lines.container") ); -const JobsDetailClaims = lazy(() => - import("../../components/jobs-detail-claims/jobs-detail-claims.component") -); + const JobsDetailDatesComponent = lazy(() => import("../../components/jobs-detail-dates/jobs-detail-dates.component") ); -const JobsDetailFinancials = lazy(() => - import( - "../../components/jobs-detail-financial/jobs-detail-financial.component" - ) +const JobsDetailTotals = lazy(() => + import("../../components/jobs-detail-totals/jobs-detail-totals.component") +); +const JobsDetailRates = lazy(() => + import("../../components/jobs-detail-rates/jobs-detail-rates.component") ); const JobsDetailHeader = lazy(() => import("../../components/jobs-detail-header/jobs-detail-header.component") ); -const JobsDetailInsurance = lazy(() => - import( - "../../components/jobs-detail-insurance/jobs-detail-insurance.component" - ) +const JobsDetailGeneral = lazy(() => + import("../../components/jobs-detail-general/jobs-detail-general.component") ); const JobsDocumentsGalleryContainer = lazy(() => import( @@ -68,68 +60,85 @@ const JobLineUpsertModalContainer = lazy(() => "../../components/job-lines-upsert-modal/job-lines-upsert-modal.container" ) ); -const EnterInvoiceModalContainer = lazy(() => - import("../../components/invoice-enter-modal/invoice-enter-modal.container") -); const JobsDetailPliContainer = lazy(() => import("../../components/jobs-detail-pli/jobs-detail-pli.container") ); const JobsDetailAuditContainer = lazy(() => import("../../components/audit-trail-list/audit-trail-list.container") ); +const JobsDetailLaborContainer = lazy(() => + import("../../components/jobs-detail-labor/jobs-detail-labor.container") +); +const JobReconciliationModal = lazy(() => + import( + "../../components/job-reconciliation-modal/job-reconciliation.modal.container" + ) +); -export default function JobsDetailPage({ +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, +}); + +export function JobsDetailPage({ job, mutationUpdateJob, - mutationConvertJob, handleSubmit, refetch, - scheduleModalState, updateJobStatus, - tab + bodyshop, }) { const { t } = useTranslation(); const [form] = Form.useForm(); const history = useHistory(); - + const [loading, setLoading] = useState(false); + 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 => { - mutationUpdateJob({ - variables: { jobId: job.id, job: values } - }).then(r => { - notification["success"]({ - message: t("jobs.successes.savetitle") - }); - refetch().then(r => form.resetFields()); + const handleFinish = async (values) => { + setLoading(true); + //const newTotals = CalculateJob({ ...job, ...values }, bodyshop.shoprates); + const newTotals = ( + await Axios.post("/job/totals", { + job: { ...job, ...values }, + shoprates: bodyshop.shoprates, + }) + ).data; + + const result = await mutationUpdateJob({ + variables: { + jobId: job.id, + job: { + ...values, + clm_total: Dinero(newTotals.totals.total_repairs).toFormat("0.00"), + owner_owing: Dinero(newTotals.custPayable.total).toFormat("0.00"), + job_totals: newTotals, //JSON.stringify(newTotals), + }, + }, }); + + if (!!!result.errors) { + notification["success"]({ + message: t("jobs.successes.savetitle"), + }); + await refetch(); + form.resetFields(); + form.resetFields(); + } + setLoading(false); }; return ( } > - - + + - -
    console.log("a,b", a, b)} name="JobDetailForm" onFinish={handleFinish} {...formItemLayout} @@ -137,67 +146,32 @@ export default 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 }} > + + - history.replace({ ...history.location, search: `?${key}` }) - } + defaultActiveKey={search.tab} + onChange={(key) => history.push({ search: `?tab=${key}` })} > - - - {t("menus.jobsdetail.claimdetail")} - - } - key="claimdetail" - > - - - {t("menus.jobsdetail.insurance")} + {t("menus.jobsdetail.general")} } - key="insurance" + key="general" > - + - + - {t("menus.jobsdetail.financials")} + {t("menus.jobsdetail.rates")} } - key="financials" + key="rates" > - + + + + + {t("menus.jobsdetail.totals")} + + } + key="totals" + > + - Labor + - } + ); } +export default connect(mapStateToProps, null)(JobsDetailPage); diff --git a/client/src/pages/jobs-detail/jobs-detail.page.container.jsx b/client/src/pages/jobs-detail/jobs-detail.page.container.jsx index f044c52f7..f3c936a48 100644 --- a/client/src/pages/jobs-detail/jobs-detail.page.container.jsx +++ b/client/src/pages/jobs-detail/jobs-detail.page.container.jsx @@ -1,35 +1,49 @@ -import { notification } from "antd"; -import React, { useEffect, useState } from "react"; import { useMutation, useQuery } from "@apollo/react-hooks"; +import { notification } from "antd"; +import React, { useEffect } from "react"; import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; import AlertComponent from "../../components/alert/alert.component"; import SpinComponent from "../../components/loading-spinner/loading-spinner.component"; -import { CONVERT_JOB_TO_RO, GET_JOB_BY_PK, UPDATE_JOB, UPDATE_JOB_STATUS } from "../../graphql/jobs.queries"; +import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; +import { + GET_JOB_BY_PK, + UPDATE_JOB, + UPDATE_JOB_STATUS, +} from "../../graphql/jobs.queries"; +import { + addRecentItem, + setBreadcrumbs, +} from "../../redux/application/application.actions"; +import { CreateRecentItem } from "../../utils/create-recent-item"; import JobsDetailPage from "./jobs-detail.page.component"; +import NotFound from "../../components/not-found/not-found.component"; -function JobsDetailPageContainer({ match }) { - const { jobId, tab } = match.params; +const mapDispatchToProps = (dispatch) => ({ + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), + addRecentItem: (item) => dispatch(addRecentItem(item)), +}); + +function JobsDetailPageContainer({ match, setBreadcrumbs, addRecentItem }) { + const { jobId } = match.params; const { t } = useTranslation(); - const scheduleModalState = useState(false); - const { loading, error, data, refetch } = useQuery(GET_JOB_BY_PK, { variables: { id: jobId }, - fetchPolicy: "network-only" + fetchPolicy: "network-only", }); const [mutationUpdateJob] = useMutation(UPDATE_JOB); - const [mutationConvertJob] = useMutation(CONVERT_JOB_TO_RO); const [mutationUpdateJobstatus] = useMutation(UPDATE_JOB_STATUS); - const updateJobStatus = status => { + const updateJobStatus = (status) => { mutationUpdateJobstatus({ - variables: { jobId: jobId, status: status } + variables: { jobId: jobId, status: status }, }) - .then(r => { + .then((r) => { notification["success"]({ message: t("jobs.successes.save") }); refetch(); }) - .catch(error => { + .catch((error) => { notification[error]({ message: t("jobs.errors.saving") }); }); }; @@ -40,27 +54,55 @@ function JobsDetailPageContainer({ match }) { : error ? t("titles.app") : t("titles.jobsdetail", { - ro_number: data.jobs_by_pk.converted - ? data.jobs_by_pk.ro_number - : `EST ${data.jobs_by_pk.est_number}` + ro_number: + data.jobs_by_pk && data.jobs_by_pk.converted + ? data.jobs_by_pk && data.jobs_by_pk.ro_number + : `EST ${data.jobs_by_pk && data.jobs_by_pk.est_number}`, }); - }, [loading, data, t, error]); + setBreadcrumbs([ + { link: "/manage/jobs", label: t("titles.bc.jobs") }, + { + link: `/manage/jobs/${jobId}`, + label: t("titles.bc.jobs-detail", { + number: + (data && + data.jobs_by_pk && + (data.jobs_by_pk && data.jobs_by_pk.converted + ? data && data.jobs_by_pk && data.jobs_by_pk.ro_number + : `EST ${data.jobs_by_pk && data.jobs_by_pk.est_number}`)) || + "", + }), + }, + ]); + + if (data && data.jobs_by_pk) + 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 ; + if (!!!data.jobs_by_pk) return ; return data.jobs_by_pk ? ( - + + + ) : ( ); } -export default JobsDetailPageContainer; +export default connect(null, mapDispatchToProps)(JobsDetailPageContainer); 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..c55ceb82f --- /dev/null +++ b/client/src/pages/jobs-intake/jobs-intake.page.container.jsx @@ -0,0 +1,68 @@ +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"; +import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; + +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 f828fff17..e31ddc1a3 100644 --- a/client/src/pages/jobs/jobs.page.jsx +++ b/client/src/pages/jobs/jobs.page.jsx @@ -1,85 +1,33 @@ -import { useQuery } from "@apollo/react-hooks"; -import React, { useEffect, useState } from "react"; +import React, { useEffect } from "react"; import { useTranslation } from "react-i18next"; -import AlertComponent from "../../components/alert/alert.component"; +import { connect } from "react-redux"; 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 { setBreadcrumbs } from "../../redux/application/application.actions"; +import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; -import { selectBodyshop } from "../../redux/user/user.selectors"; - -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import EnterInvoiceModalContainer from "../../components/invoice-enter-modal/invoice-enter-modal.container"; - -const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop +const mapDispatchToProps = (dispatch) => ({ + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), }); -export default connect( - mapStateToProps, - null -)(function JobsPage({ match, location, bodyshop }) { - const { loading, error, data, refetch } = useQuery(QUERY_ALL_ACTIVE_JOBS, { - fetchPolicy: "network-only", - variables: { - statuses: bodyshop.md_ro_statuses.open_statuses || ["Open"] - } - }); +export function JobsPage({ setBreadcrumbs }) { const { t } = useTranslation(); useEffect(() => { document.title = t("titles.jobs"); - }, [t]); - - const { hash } = location; - const [selectedJob, setSelectedJob] = useState(hash ? hash.substr(1) : null); - const searchTextState = useState(""); - const searchText = searchTextState[0]; - if (error) return ; + setBreadcrumbs([ + { link: "/manage/jobs", label: t("titles.bc.jobs-active") }, + ]); + }, [t, setBreadcrumbs]); 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(null, mapDispatchToProps)(JobsPage); diff --git a/client/src/pages/landing/landing.page.jsx b/client/src/pages/landing/landing.page.jsx index c565e4f58..03085daf5 100644 --- a/client/src/pages/landing/landing.page.jsx +++ b/client/src/pages/landing/landing.page.jsx @@ -1,19 +1,17 @@ import React from "react"; -import { Typography, Layout } from "antd"; +import { connect } from "react-redux"; +import { Redirect } from "react-router-dom"; +import { createStructuredSelector } from "reselect"; +import { selectCurrentUser } from "../../redux/user/user.selectors"; -import HeaderContainer from "../../components/header/header.container"; +const mapStateToProps = createStructuredSelector({ + currentUser: selectCurrentUser, +}); -export default function LandingPage() { - const { Header, Content } = Layout; - return ( - -
    - -
    +export default connect(mapStateToProps, null)(LandingPage); - - Welcome to bodyshop.app. - -
    - ); +export function LandingPage({ currentUser }) { + if (currentUser.authorized) return ; + + return ; } 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 75b4f4c43..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,31 +1,14 @@ import React from "react"; -import DashboardGridComponent from "../../components/dashboard-grid/dashboard-grid.component"; -import Test from "../../components/_test/test.component"; +//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 fed64173c..5f32406d1 100644 --- a/client/src/pages/manage/manage.page.component.jsx +++ b/client/src/pages/manage/manage.page.component.jsx @@ -1,13 +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 TestComponent from "../../components/_test/test.component"; const ManageRootPage = lazy(() => import("../manage-root/manage-root.page.container") @@ -20,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") ); @@ -64,9 +74,76 @@ const ContractDetailPage = lazy(() => const ContractsList = lazy(() => import("../contracts/contracts.page.container") ); -const { Header, Content, Footer } = Layout; +const InvoicesListPage = lazy(() => + import("../invoices/invoices.page.container") +); -export default function Manage({ match }) { +const JobCostingModal = lazy(() => + import("../../components/job-costing-modal/job-costing-modal.container") +); +const EnterInvoiceModalContainer = lazy(() => + import("../../components/invoice-enter-modal/invoice-enter-modal.container") +); +const TimeTicketModalContainer = lazy(() => + import("../../components/time-ticket-modal/time-ticket-modal.container") +); +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") +); + +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(() => { @@ -74,32 +151,59 @@ export default function Manage({ match }) { }, [t]); return ( - -
    - -
    - - - + + + + + + + {conflict ? ( + + ) : ( } > + + + + + + + + + + + + + @@ -149,11 +253,26 @@ export default function Manage({ match }) { path={`${match.path}/vehicles`} component={VehiclesContainer} /> + + + + + + + + + + + + - - - -
    - -
    - - + )} +
    + + +
    {`ImEX Online V.${process.env.NODE_ENV}-${process.env.REACT_APP_GIT_SHA}`}
    +
    ); } +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..235a2892c 100644 --- a/client/src/pages/manage/manage.page.styles.scss +++ b/client/src/pages/manage/manage.page.styles.scss @@ -1 +1,12 @@ -.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; + padding-bottom: 3rem; +} + +.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 5ab821033..42b7c2ba6 100644 --- a/client/src/pages/owners-detail/owners-detail.page.container.jsx +++ b/client/src/pages/owners-detail/owners-detail.page.container.jsx @@ -1,28 +1,81 @@ -import React 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 React, { useEffect } from "react"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; import AlertComponent from "../../components/alert/alert.component"; +import LoadingSpinner from "../../components/loading-spinner/loading-spinner.component"; +import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; import { QUERY_OWNER_BY_ID } from "../../graphql/owners.queries"; -export default function OwnersDetailContainer({ match }) { +import { + addRecentItem, + setBreadcrumbs, +} from "../../redux/application/application.actions"; +import { CreateRecentItem } from "../../utils/create-recent-item"; +import OwnersDetailComponent from "./owners-detail.page.component"; +import NotFound from "../../components/not-found/not-found.component"; + +const mapDispatchToProps = (dispatch) => ({ + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), + addRecentItem: (item) => dispatch(addRecentItem(item)), +}); + +export function OwnersDetailContainer({ + match, + setBreadcrumbs, + addRecentItem, +}) { const { ownerId } = match.params; const { t } = useTranslation(); const { loading, data, error, refetch } = useQuery(QUERY_OWNER_BY_ID, { variables: { id: ownerId }, - fetchPolicy: "network-only" + fetchPolicy: "network-only", }); + useEffect(() => { + document.title = t("titles.owners-detail", { + name: data + ? `${(data.owners_by_pk && data.owners_by_pk.ownr_fn) || ""} ${ + (data.owners_by_pk && data.owners_by_pk.ownr_ln) || "" + } ${(data.owners_by_pk && data.owners_by_pk.ownr_co_nm) || ""}` + : "", + }); + + setBreadcrumbs([ + { link: "/manage/owners", label: t("titles.bc.owners") }, + { + link: `/manage/owners/${ownerId}`, + label: t("titles.bc.owner-detail", { + name: data + ? `${(data.owners_by_pk && data.owners_by_pk.ownr_fn) || ""} ${ + (data.owners_by_pk && data.owners_by_pk.ownr_ln) || "" + } ${(data.owners_by_pk && data.owners_by_pk.ownr_co_nm) || ""}` + : "", + }), + }, + ]); + + if (data && data.owners_by_pk) + 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 ; + if (!!!data.owners_by_pk) return ; - if (data.owners_by_pk) - return ( + return ( + - ); - else - return ( - - ); + + ); } +export default connect(null, mapDispatchToProps)(OwnersDetailContainer); diff --git a/client/src/pages/owners/owners.page.container.jsx b/client/src/pages/owners/owners.page.container.jsx index 172918110..44f4bd396 100644 --- a/client/src/pages/owners/owners.page.container.jsx +++ b/client/src/pages/owners/owners.page.container.jsx @@ -1,12 +1,25 @@ import React, { useEffect } from "react"; import OwnersPageComponent from "./owners.page.component"; import { useTranslation } from "react-i18next"; +import { setBreadcrumbs } from "../../redux/application/application.actions"; +import { connect } from "react-redux"; +import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; -export default function OwnersPageContainer() { +const mapDispatchToProps = (dispatch) => ({ + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), +}); + +export function OwnersPageContainer({ setBreadcrumbs }) { const { t } = useTranslation(); useEffect(() => { document.title = t("titles.owners"); - }, [t]); + setBreadcrumbs([{ link: "/manage/owners", label: t("titles.bc.owners") }]); + }, [t, setBreadcrumbs]); - return ; + return ( + + + + ); } +export default connect(null, mapDispatchToProps)(OwnersPageContainer); 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..756194d5c --- /dev/null +++ b/client/src/pages/payments-all/payments-all.container.page.jsx @@ -0,0 +1,71 @@ +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 RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.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..a65a37454 --- /dev/null +++ b/client/src/pages/production-board/production-board.container.jsx @@ -0,0 +1,40 @@ +import React, { useEffect } from "react"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; +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..97f678e1b --- /dev/null +++ b/client/src/pages/production-list/production-list.container.jsx @@ -0,0 +1,37 @@ +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"; +import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.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/schedule/schedule.page.container.jsx b/client/src/pages/schedule/schedule.page.container.jsx index 8a21042cd..f33098a5a 100644 --- a/client/src/pages/schedule/schedule.page.container.jsx +++ b/client/src/pages/schedule/schedule.page.container.jsx @@ -1,12 +1,28 @@ import React, { useEffect } from "react"; -import SchedulePageComponent from "./schedule.page.component"; import { useTranslation } from "react-i18next"; -export default function SchedulePageContainer() { +import { connect } from "react-redux"; +import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; +import { setBreadcrumbs } from "../../redux/application/application.actions"; +import SchedulePageComponent from "./schedule.page.component"; + +const mapDispatchToProps = (dispatch) => ({ + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), +}); + +export function SchedulePageContainer({ setBreadcrumbs }) { const { t } = useTranslation(); useEffect(() => { document.title = t("titles.schedule"); - }, [t]); + setBreadcrumbs([ + { link: "/manage/schedule", label: t("titles.bc.schedule") }, + ]); + }, [t, setBreadcrumbs]); - return ; + return ( + + + + ); } +export default connect(null, mapDispatchToProps)(SchedulePageContainer); 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..454dad7c1 --- /dev/null +++ b/client/src/pages/scoreboard/scoreboard.page.container.jsx @@ -0,0 +1,52 @@ +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"; +import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; + +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..15209ce06 --- /dev/null +++ b/client/src/pages/shift-clock/shift-clock.page.jsx @@ -0,0 +1,13 @@ +import React from "react"; +import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; +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..566356965 --- /dev/null +++ b/client/src/pages/shop-csi/shop-csi.container.page.jsx @@ -0,0 +1,86 @@ +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"; +import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; +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..06809802c --- /dev/null +++ b/client/src/pages/shop-templates/shop-templates.container.js @@ -0,0 +1,51 @@ +import { Col, Row } from "antd"; +import React, { useEffect } from "react"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; +import ShopTemplateEditor from "../../components/shop-template-editor/shop-template-editor.container"; +import ShopTemplatesListContainer from "../../components/shop-templates-list/shop-templates-list.container"; +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 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..ebae5f25a 100644 --- a/client/src/pages/shop-vendor/shop-vendor.page.container.jsx +++ b/client/src/pages/shop-vendor/shop-vendor.page.container.jsx @@ -1,5 +1,6 @@ -import React, { useEffect, useState } from "react"; +import React, { useEffect } from "react"; import { useTranslation } from "react-i18next"; +import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; import ShopVendorPageComponent from "./shop-vendor.page.component"; export default function ShopVendorPageContainer() { @@ -7,12 +8,10 @@ export default function ShopVendorPageContainer() { useEffect(() => { document.title = t("titles.shop_vendors"); }, [t]); - const fetchState = useState(); - const selectedVendorState = useState(); + return ( - + + + ); } diff --git a/client/src/pages/sign-in/sign-in.page.jsx b/client/src/pages/sign-in/sign-in.page.jsx index 15f6566a2..b8aa829eb 100644 --- a/client/src/pages/sign-in/sign-in.page.jsx +++ b/client/src/pages/sign-in/sign-in.page.jsx @@ -2,5 +2,9 @@ import React from "react"; import SignIn from "../../components/sign-in-form/sign-in-form.component"; export default () => { - return ; + 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..230e221b6 --- /dev/null +++ b/client/src/pages/time-tickets/time-tickets.container.jsx @@ -0,0 +1,75 @@ +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 AlertComponent from "../../components/alert/alert.component"; +import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; +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"; + +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/unauthorized/unauthorized.component.jsx b/client/src/pages/unauthorized/unauthorized.component.jsx deleted file mode 100644 index 913be8192..000000000 --- a/client/src/pages/unauthorized/unauthorized.component.jsx +++ /dev/null @@ -1,15 +0,0 @@ -import React from "react"; -import { Typography } from "antd"; -import HeaderContainer from "../../components/header/header.container"; - -export default function Unauthorized() { - return ( -
    - - Unauthorized - - You do not have permission to view the requested page. - -
    - ); -} 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 ac634a941..99f5d2b25 100644 --- a/client/src/pages/vehicles-detail/vehicles-detail.page.container.jsx +++ b/client/src/pages/vehicles-detail/vehicles-detail.page.container.jsx @@ -5,33 +5,71 @@ 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, + addRecentItem, +} from "../../redux/application/application.actions"; +import { connect } from "react-redux"; +import { CreateRecentItem } from "../../utils/create-recent-item"; +import NotFound from "../../components/not-found/not-found.component"; -export default function VehicleDetailContainer({ match }) { +const mapDispatchToProps = (dispatch) => ({ + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), + addRecentItem: (item) => dispatch(addRecentItem(item)), +}); + +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" + fetchPolicy: "network-only", }); useEffect(() => { document.title = t("titles.vehicledetail", { vehicle: data && data.vehicles_by_pk - ? `${data.vehicles_by_pk.v_model_yr} ${data.vehicles_by_pk.v_make_desc} ${data.vehicles_by_pk.v_model_desc}` - : "" + ? `${data.vehicles_by_pk && data.vehicles_by_pk.v_model_yr} ${ + data.vehicles_by_pk && data.vehicles_by_pk.v_make_desc + } ${data.vehicles_by_pk && data.vehicles_by_pk.v_model_desc}` + : "", }); - }, [t, data]); + setBreadcrumbs([ + { link: "/manage/vehicles", label: t("titles.bc.vehicles") }, + { + link: `/manage/vehicles/${vehId}`, + label: t("titles.bc.vehicle-details", { + vehicle: + data && data.vehicles_by_pk + ? `${data.vehicles_by_pk.v_model_yr} ${data.vehicles_by_pk.v_make_desc} ${data.vehicles_by_pk.v_model_desc}` + : "", + }), + }, + ]); + + if (data && data.vehicles_by_pk) + 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 ; - if (data.vehicles_by_pk) - return ( - - ); - else - return ( - - ); + if (!!!data.vehicles_by_pk) return ; + return ( + + ); } +export default connect(null, mapDispatchToProps)(VehicleDetailContainer); diff --git a/client/src/pages/vehicles/vehicles.page.container.jsx b/client/src/pages/vehicles/vehicles.page.container.jsx index 086998bde..7bf7cdd60 100644 --- a/client/src/pages/vehicles/vehicles.page.container.jsx +++ b/client/src/pages/vehicles/vehicles.page.container.jsx @@ -1,10 +1,23 @@ import React, { useEffect } from "react"; import VehiclesPageComponent from "./vehicles.page.component"; import { useTranslation } from "react-i18next"; -export default function VehiclesPageContainer() { +import { connect } from "react-redux"; + +import { setBreadcrumbs } from "../../redux/application/application.actions"; +const mapDispatchToProps = (dispatch) => ({ + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), +}); + +export function VehiclesPageContainer({ setBreadcrumbs }) { const { t } = useTranslation(); + useEffect(() => { document.title = t("titles.vehicles"); - }, [t]); + setBreadcrumbs([ + { link: "/manage/vehicles", label: t("titles.bc.vehicles") }, + ]); + }, [t, setBreadcrumbs]); + return ; } +export default connect(null, mapDispatchToProps)(VehiclesPageContainer); diff --git a/client/src/redux/application/application.actions.js b/client/src/redux/application/application.actions.js index 98bc8f6cf..69ebf671b 100644 --- a/client/src/redux/application/application.actions.js +++ b/client/src/redux/application/application.actions.js @@ -1,10 +1,35 @@ import ApplicationActionTypes from "./application.types"; export const startLoading = () => ({ - type: ApplicationActionTypes.START_LOADING + type: ApplicationActionTypes.START_LOADING, }); -export const endLoading = options => ({ +export const endLoading = (options) => ({ type: ApplicationActionTypes.END_LOADING, - payload: options + payload: options, +}); + +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 603032589..b55f4efdd 100644 --- a/client/src/redux/application/application.reducer.js +++ b/client/src/redux/application/application.reducer.js @@ -1,24 +1,80 @@ import ApplicationActionTypes from "./application.types"; const INITIAL_STATE = { - loading: false + 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, - loading: true + loading: true, }; case ApplicationActionTypes.END_LOADING: return { ...state, - loading: false + loading: false, }; + 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..f70af1473 --- /dev/null +++ b/client/src/redux/application/application.sagas.js @@ -0,0 +1,107 @@ +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.larhrs.aggregate.sum.mod_lb_hrs + + result.data.labhrs.aggregate.sum.mod_lb_hrs, + }; + + const { arrJobs, compJobs } = result.data; + + arrJobs.forEach((item) => { + const itemDate = moment(item.scheduled_in).format("yyyy-MM-DD"); + 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: [item], + 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).format("yyyy-MM-DD"); + 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] = { + jobsOut: [item], + 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").format("yyyy-MM-DD"); + const prev = moment(today) + .add(day - 1, "days") + .format("yyyy-MM-DD"); + if (!!!load[current]) { + load[current] = {}; + } + if (day === 0) { + //Starting on day 1. The load is current. + load[current].expectedLoad = + load.productionHoursTotal + + (load[current].hoursIn || 0) - + (load[current].hoursOut || 0); + } 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 8f19ef04c..9d38e1f1d 100644 --- a/client/src/redux/application/application.selectors.js +++ b/client/src/redux/application/application.selectors.js @@ -1,8 +1,28 @@ import { createSelector } from "reselect"; -const selectApplication = state => state.application; +const selectApplication = (state) => state.application; export const selectLoading = createSelector( [selectApplication], - application => application.loading + (application) => application.loading +); + +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 8f58f01cf..0f46f9545 100644 --- a/client/src/redux/application/application.types.js +++ b/client/src/redux/application/application.types.js @@ -1,5 +1,10 @@ const ApplicationActionTypes = { START_LOADING: "START_LOADING", - END_LOADING: "END_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.reducer.js b/client/src/redux/email/email.reducer.js index bc6c08fff..df0a1d14e 100644 --- a/client/src/redux/email/email.reducer.js +++ b/client/src/redux/email/email.reducer.js @@ -5,14 +5,13 @@ const INITIAL_STATE = { messageOptions: { from: { name: "ShopName", address: "noreply@bodyshop.app" }, to: null, - replyTo: null + replyTo: null, }, - template: null, - queryConfig: [null, { variables: null }] + template: { name: null, variables: {} }, }, visible: false, - error: null + error: null, }; const emailReducer = (state = INITIAL_STATE, action) => { @@ -20,13 +19,13 @@ const emailReducer = (state = INITIAL_STATE, action) => { case EmailActionTypes.TOGGLE_EMAIL_OVERLAY_VISIBLE: return { ...state, - visible: !state.visible + visible: !state.visible, }; case EmailActionTypes.SET_EMAIL_OPTIONS: return { ...state, emailConfig: { ...action.payload }, - visible: true + visible: true, }; default: return state; 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/email/email.selectors.js b/client/src/redux/email/email.selectors.js index 3a0299aa4..d691f742e 100644 --- a/client/src/redux/email/email.selectors.js +++ b/client/src/redux/email/email.selectors.js @@ -1,25 +1,19 @@ import { createSelector } from "reselect"; -const selectEmail = state => state.email; -const selectEmailConfigMessageOptions = state => +const selectEmail = (state) => state.email; +const selectEmailConfigMessageOptions = (state) => state.email.emailConfig.messageOptions; -const selectEmailConfigTemplate = state => state.email.emailConfig.template; -const selectEmailConfigQuery = state => state.email.emailConfig.queryConfig; +const selectEmailConfigTemplate = (state) => state.email.emailConfig.template; export const selectEmailVisible = createSelector( [selectEmail], - email => email.visible + (email) => email.visible ); export const selectEmailConfig = createSelector( - [ - selectEmailConfigMessageOptions, - selectEmailConfigTemplate, - selectEmailConfigQuery - ], - (messageOptions, template, queryConfig) => ({ + [selectEmailConfigMessageOptions, selectEmailConfigTemplate], + (messageOptions, template) => ({ messageOptions, template, - queryConfig }) ); 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 a66d3aadd..e43bad872 100644 --- a/client/src/redux/messaging/messaging.reducer.js +++ b/client/src/redux/messaging/messaging.reducer.js @@ -2,102 +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 - } - ], - error: 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 + visible: !state.visible, }; - case MessagingActionTypes.SET_CHAT_VISIBLE: + case MessagingActionTypes.SET_SELECTED_CONVERSATION: return { ...state, - visible: true + 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 bb3913f49..b1ae26315 100644 --- a/client/src/redux/modals/modals.reducer.js +++ b/client/src/redux/modals/modals.reducer.js @@ -4,34 +4,45 @@ const baseModal = { visible: false, context: {}, actions: { - refetch: null - } + refetch: null, + }, }; const INITIAL_STATE = { jobLineEdit: { ...baseModal }, invoiceEnter: { ...baseModal }, - courtesyCarReturn: { ...baseModal } + courtesyCarReturn: { ...baseModal }, + noteUpsert: { ...baseModal }, + 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]: { ...state[action.payload], - visible: !state[action.payload].visible - } + visible: !state[action.payload].visible, + }, }; case ModalsActionTypes.SET_MODAL_CONTEXT: + // logImEXEvent("redux_set_modal_context", { modal: action.payload.modal }); + return { ...state, [action.payload.modal]: { ...state[action.payload.modal], ...action.payload.context, - visible: true - } + visible: true, + }, }; default: return state; diff --git a/client/src/redux/modals/modals.sagas.js b/client/src/redux/modals/modals.sagas.js index 7cf750062..3cd4f8c6b 100644 --- a/client/src/redux/modals/modals.sagas.js +++ b/client/src/redux/modals/modals.sagas.js @@ -1,22 +1,5 @@ import { all } from "redux-saga/effects"; -// 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* modalsSagas() { yield all([ //call(onSendEmail), diff --git a/client/src/redux/modals/modals.selectors.js b/client/src/redux/modals/modals.selectors.js index 7c9c3daf4..0697a8145 100644 --- a/client/src/redux/modals/modals.selectors.js +++ b/client/src/redux/modals/modals.selectors.js @@ -1,19 +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 +); + +export const selectSchedule = createSelector( + [selectModals], + (modals) => modals.schedule +); + +export const selectPartsOrder = createSelector( + [selectModals], + (modals) => modals.partsOrder +); + +export const selectTimeTicket = createSelector( + [selectModals], + (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/modals/modals.types.js b/client/src/redux/modals/modals.types.js index 01ea4c793..ebe65e822 100644 --- a/client/src/redux/modals/modals.types.js +++ b/client/src/redux/modals/modals.types.js @@ -1,5 +1,5 @@ const ModalActionTypes = { TOGGLE_MODAL_VISIBLE: "TOGGLE_MODAL_VISIBLE", - SET_MODAL_CONTEXT: "SET_JOBLINEEDIT_CONTEXT" + SET_MODAL_CONTEXT: "SET_MODAL_CONTEXT" }; export default ModalActionTypes; 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..b7a3ca202 100644 --- a/client/src/redux/user/user.actions.js +++ b/client/src/redux/user/user.actions.js @@ -1,55 +1,105 @@ 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, +}); + +export const setAuthlevel = (authlevel) => ({ + type: UserActionTypes.SET_AUTH_LEVEL, + payload: authlevel, }); diff --git a/client/src/redux/user/user.reducer.js b/client/src/redux/user/user.reducer.js index 4b3897443..7d91454b7 100644 --- a/client/src/redux/user/user.reducer.js +++ b/client/src/redux/user/user.reducer.js @@ -3,44 +3,77 @@ import UserActionTypes from "./user.types"; const INITIAL_STATE = { currentUser: { authorized: null, - language: "en_us" + //language: "en-US" }, bodyshop: null, - error: null + fingerprint: null, + error: null, + conflict: false, + passwordreset: { + email: null, + error: null, + success: false, + }, + authLevel: 0, }; 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,8 +83,10 @@ const userReducer = (state = INITIAL_STATE, action) => { case UserActionTypes.EMAIL_SIGN_UP_FAILURE: return { ...state, - error: action.payload + error: action.payload, }; + case UserActionTypes.SET_AUTH_LEVEL: + return { ...state, authLevel: 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..f0148fb55 100644 --- a/client/src/redux/user/user.sagas.js +++ b/client/src/redux/user/user.sagas.js @@ -1,67 +1,90 @@ -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, + setAuthlevel, } 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 +93,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 +105,133 @@ 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); + if (process.env.NODE_ENV === "production") 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); + + if (!payload.email.includes("@imex.")) 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* onSetShopDetails() { + yield takeLatest( + UserActionTypes.SET_SHOP_DETAILS, + SetAuthLevelFromShopDetails + ); +} +export function* SetAuthLevelFromShopDetails({ payload }) { + try { + const userEmail = yield select((state) => state.user.currentUser.email); + + const authRecord = payload.associations.filter( + (a) => a.useremail === userEmail + ); + + yield put(setAuthlevel(authRecord[0] ? authRecord[0].authlevel : 0)); + } catch (error) { + yield put(signInFailure(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), + call(onSetShopDetails), ]); } diff --git a/client/src/redux/user/user.selectors.js b/client/src/redux/user/user.selectors.js index 4384f7ed6..7ec6b8473 100644 --- a/client/src/redux/user/user.selectors.js +++ b/client/src/redux/user/user.selectors.js @@ -1,18 +1,33 @@ 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 +); + +export const selectAuthLevel = createSelector( + [selectUser], + (user) => user.authLevel ); diff --git a/client/src/redux/user/user.types.js b/client/src/redux/user/user.types.js index febfe5eab..1ee363c74 100644 --- a/client/src/redux/user/user.types.js +++ b/client/src/redux/user/user.types.js @@ -15,6 +15,17 @@ 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", + SET_AUTH_LEVEL: "SET_AUTH_LEVEL", }; export default UserActionTypes; diff --git a/client/src/serviceWorker.js b/client/src/serviceWorker.js index f8c7e50c2..4562ae5e0 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,31 @@ export function register(config) { function registerValidSW(swUrl, config) { navigator.serviceWorker .register(swUrl) - .then(registration => { + .then((registration) => { + // Start addition--- + // https://developers.google.com/web/fundamentals/primers/service-workers/lifecycle#manual_updates + // Added code, as our application will be open for a long time and we are a SPA, we need + // to trigger checks for updates frequently + setInterval(() => { + console.log("Checking if service worker was updated in server"); + registration.update(); + }, 15 * 60 * 1000); // Every 15 mins check + // End addition--- + 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 +92,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 +103,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 32c8cea3a..ba6b64e46 100644 --- a/client/src/translations/en_us/common.json +++ b/client/src/translations/en_us/common.json @@ -19,22 +19,30 @@ }, "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: ", + "completingjobs": "Completing Jobs", + "history": "History", + "nocompletingjobs": "No jobs scheduled for completion.", "nodateselected": "No date has been selected.", "priorappointments": "Previous Appointments", "scheduledfor": "Scheduled appointment for: " @@ -61,11 +69,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 +87,42 @@ "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", + "enforce_class": "Enforce Class on Conversion?", "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_categories": "Categories", + "md_classes": "Classes", + "md_ins_cos": "Insurance Companies", + "md_referral_sources": "Referral Sources", + "messaginglabel": "Messaging Preset Label", + "messagingtext": "Messaging Preset Text", + "noteslabel": "Note Label", + "notestext": "Note Text", + "partslocation": "Parts Location", + "prodtargethrs": "Production Target Hours", "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 +131,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 +142,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 +173,63 @@ "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", + "rbac": "Role Based Access Control", "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 +243,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 +274,7 @@ }, "courtesycars": { "actions": { + "new": "New Courtesy Car", "return": "Return Car" }, "errors": { @@ -233,7 +327,45 @@ "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", + "download": "Download Selected Documents" + }, "errors": { "deletes3": "Error deleting document from storage. ", "getpresignurl": "Error obtaining presigned URL for document. {{message}}", @@ -261,8 +393,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." }, @@ -287,24 +419,63 @@ }, "general": { "actions": { + "add": "Add", + "cancel": "Cancel", + "close": "Close", "create": "Create", "delete": "Delete", + "deleteall": "Delete All", "edit": "Edit", - "reset": "Reset to original.", - "save": "Save" + "login": "Login", + "refresh": "Refresh", + "reset": "Reset your changes.", + "resetpassword": "Reset Password", + "save": "Save", + "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.", + "hours": "hrs", "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", + "view": "View", + "yes": "Yes" }, "languages": { "english": "English", @@ -312,13 +483,37 @@ "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.", + "newversionmessage": "Click refresh below to update to the latest available version of ImEX Online.", + "newversiontitle": "New version of ImEX Online Available", + "notfoundsub": "Please make sure that you have access to the data or that the link is correct.", + "notfoundtitle": "We couldn't find what you're looking for...", + "rbacunauth": "You are not authorized to view this content. Please reach out to your shop manager to change your access level.", + "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" @@ -327,8 +522,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", @@ -339,29 +539,47 @@ }, "invoices": { "actions": { - "receive": "Receive Part" + "edit": "Edit", + "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": { - "creating": "Invoice added successfully." + "created": "Invoice added successfully." } }, "joblines": { @@ -375,15 +593,43 @@ "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 #" }, "labels": { @@ -392,27 +638,49 @@ }, "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" + "recalculate": "Recalculate", + "reconcile": "Reconcile", + "schedule": "Schedule", + "sendcsi": "Send CSI", + "viewdetail": "View Details" }, "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.", @@ -426,8 +694,15 @@ "actual_delivery": "Actual Delivery", "actual_in": "Actual In", "adjustment_bottom_line": "Adjustments", + "category": "Category", + "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", + "class": "Class", "clm_no": "Claim #", "clm_total": "Claim Total", "csr": "Customer Service Rep.", @@ -441,12 +716,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", @@ -457,43 +735,73 @@ "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", + "loss_desc": "Loss Description", + "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", "rate_atp": "ATP", - "rate_la1": "LA1 Rate", - "rate_la2": "LA2 Rate", - "rate_la3": "LA3 Rate", - "rate_la4": "LA4 Rate", - "rate_laa": "Aluminum Rate", - "rate_lab": "Labor Rate", - "rate_lad": "Diagnostic Rate", - "rate_lae": "Electrical Rate", - "rate_laf": "Frame Rate", - "rate_lag": "Glass Rate", - "rate_lam": "Mechanical Rate", - "rate_lar": "Refinish Rate", - "rate_las": "Sublet Rate", - "rate_lau": "Aluminum Rate", - "rate_ma2s": "2 Stage Paint Rate", - "rate_ma3s": "3 Stage Paint Rate", + "rate_la1": "LA1", + "rate_la2": "LA2", + "rate_la3": "LA3", + "rate_la4": "LA4", + "rate_laa": "Aluminum", + "rate_lab": "Body", + "rate_lad": "Diagnostic", + "rate_lae": "Electrical", + "rate_laf": "Frame", + "rate_lag": "Glass", + "rate_lam": "Mechanical", + "rate_lar": "Refinish", + "rate_las": "Sublet", + "rate_lau": "Aluminum", + "rate_ma2s": "2 Stage Paint", + "rate_ma3s": "3 Stage Paint", "rate_mabl": "MABL??", "rate_macs": "MACS??", - "rate_mahw": "Hazardous Waste Rate", - "rate_mapa": "Paint Materials Rate", - "rate_mash": "Shop Material Rate", - "rate_matd": "Tire Disposal Rate", + "rate_mahw": "Hazardous Waste", + "rate_mapa": "Paint Materials", + "rate_mash": "Shop Material", + "rate_matd": "Tire Disposal", "referralsource": "Referral Source", "regie_number": "Registration #", "repairtotal": "Repair Total", @@ -509,19 +817,32 @@ "specialcoveragepolicy": "Special Coverage Policy", "status": "Job Status", "storage_payable": "Storage/PVRT", + "tax_registration_number": "Tax Registration Number", "towing_payable": "Towing Payable", "unitnumber": "Unit #", "updated_at": "Updated At", "uploaded_by": "Uploaded By", "vehicle": "Vehicle" }, + "forms": { + "admindates": "Administrative Dates", + "appraiserinfo": "Appraiser Info", + "claiminfo": "Claim Information", + "estdates": "Estimate Dates", + "laborrates": "Labor Rates", + "lossinfo": "Loss Information", + "other": "Other", + "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", @@ -534,6 +855,9 @@ "totals": "Totals", "vehicle": "Vehicle" }, + "cost": "Cost", + "cost_labor": "Cost - Labor", + "cost_parts": "Cost - Parts", "create": { "jobinfo": "Job Info", "newowner": "Create a new Owner instead. ", @@ -542,23 +866,63 @@ "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", + "labortotals": "Labor Totals", "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", - "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. ", @@ -571,42 +935,85 @@ "profile": "Profile" }, "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", "courtesycars-contracts": "Contracts", "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 - Visual", + "productionlist": "Production Board - 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" }, "jobsdetail": { "claimdetail": "Claim Details", "dates": "Dates", - "financials": "Financials", - "insurance": "Insurance", + "general": "General", "labor": "Labor", "partssublet": "Parts/Sublet", - "repairdata": "Repair Data" + "rates": "Rates", + "repairdata": "Repair Data", + "totals": "Totals" }, "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 - Visual", + "productionlist": "Production List" } }, "messaging": { + "actions": { + "link": "Link to Job" + }, "labels": { "messaging": "Messaging", + "nojobs": "Not associated to any job.", + "presets": "Presets", "typeamessage": "Send a message..." } }, @@ -648,6 +1055,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", @@ -658,6 +1066,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", @@ -675,45 +1088,283 @@ } }, "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", - "lineremarks": "Line Remarks" + "job_line_id": "Job Line Id", + "line_desc": "Line Description", + "line_remarks": "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" + }, + "successes": { + "removed": "Job removed from production." + } + }, "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": { + "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-payments": "Payments | $t(titles.app)", + "accounting-receivables": "Receivables | $t(titles.app)", + "app": "ImEX Online", + "bc": { + "accounting-payables": "Payables", + "accounting-payments": "Payments", + "accounting-receivables": "Receivables", + "availablejobs": "Available Jobs", + "contracts": "Contracts", + "contracts-create": "New Contract", + "contracts-detail": "Contract #{{number}}", + "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 - Visual", + "productionlist": "Production Board - 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" + }, + "contracts": "Courtesy Car Contracts | $t(titles.app)", "contracts-create": "New Contract | $t(titles.app)", "contracts-detail": "Contract {{id}} | $t(titles.app)", + "courtesycars": "Courtesy Cars | $t(titles.app)", "courtesycars-create": "New Courtesy Car | $t(titles.app)", "courtesycars-detail": "Courtesy Car {{id}} | $t(titles.app)", - "jobs": "All Jobs | $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 Board - List | $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)" }, @@ -757,6 +1408,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 6ef9e3687..a39723a6f 100644 --- a/client/src/translations/es/common.json +++ b/client/src/translations/es/common.json @@ -19,22 +19,30 @@ }, "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:", + "completingjobs": "", + "history": "", + "nocompletingjobs": "", "nodateselected": "No se ha seleccionado ninguna fecha.", "priorappointments": "Nombramientos previos", "scheduledfor": "Cita programada para:" @@ -66,6 +74,10 @@ }, "bodyshop": { "actions": { + "addbucket": "", + "addpartslocation": "", + "addspeedprint": "", + "addtemplate": "", "newstatus": "" }, "errors": { @@ -75,15 +87,41 @@ "fields": { "address1": "", "address2": "", + "appt_length": "", "city": "", "country": "", + "dailybodytarget": "", + "dailypainttarget": "", "email": "", + "enforce_class": "", "federal_tax_id": "", "insurance_vendor_id": "", + "invoice_federal_tax_rate": "", + "invoice_local_tax_rate": "", + "invoice_state_tax_rate": "", + "lastnumberworkingdays": "", "logo_img_path": "", + "md_categories": "", + "md_classes": "", + "md_ins_cos": "", + "md_referral_sources": "", + "messaginglabel": "", + "messagingtext": "", + "noteslabel": "", + "notestext": "", + "partslocation": "", + "prodtargethrs": "", "responsibilitycenter": "", + "responsibilitycenter_accountdesc": "", + "responsibilitycenter_accountitem": "", + "responsibilitycenter_accountname": "", + "responsibilitycenter_accountnumber": "", + "responsibilitycenter_rate": "", "responsibilitycenters": { + "ap": "", + "ar": "", "atp": "", + "federal_tax": "", "lab": "", "lad": "", "lae": "", @@ -93,6 +131,9 @@ "lar": "", "las": "", "lau": "", + "local_tax": "", + "mapa": "", + "mash": "", "paa": "", "pac": "", "pal": "", @@ -101,9 +142,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 +173,63 @@ "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": "", + "rbac": "", "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 +243,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 +274,7 @@ }, "courtesycars": { "actions": { + "new": "", "return": "" }, "errors": { @@ -233,7 +327,45 @@ "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": "", + "download": "" + }, "errors": { "deletes3": "Error al eliminar el documento del almacenamiento.", "getpresignurl": "Error al obtener la URL prescrita para el documento. {{message}}", @@ -261,8 +393,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." }, @@ -287,24 +419,63 @@ }, "general": { "actions": { + "add": "", + "cancel": "", + "close": "", "create": "", "delete": "Borrar", + "deleteall": "", "edit": "Editar", - "reset": "Restablecer a original.", - "save": "Salvar" + "login": "", + "refresh": "", + "reset": " Restablecer a original.", + "resetpassword": "", + "save": "Salvar", + "saveandnew": "", + "submit": "", + "submitticket": "" + }, + "itemtypes": { + "contract": "", + "courtesycar": "", + "job": "", + "owner": "", + "vehicle": "" }, "labels": { "actions": "Comportamiento", + "areyousure": "", "barcode": "código de barras", + "confirmpassword": "", + "email": "", + "errors": "", + "exceptiontitle": "", + "hours": "", "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": "", + "view": "", + "yes": "" }, "languages": { "english": "Inglés", @@ -312,13 +483,37 @@ "spanish": "español" }, "messages": { - "unsavedchanges": "Usted tiene cambios no guardados." + "exception": "", + "newversionmessage": "", + "newversiontitle": "", + "notfoundsub": "", + "notfoundtitle": "", + "rbacunauth": "", + "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": "" @@ -327,8 +522,13 @@ "actual": "", "actual_cost": "", "cost_center": "", + "federal_tax_applicable": "", + "jobline": "", "line_desc": "", - "retail": "" + "local_tax_applicable": "", + "quantity": "", + "retail": "", + "state_tax_applicable": "" }, "labels": { "entered": "", @@ -339,29 +539,47 @@ }, "invoices": { "actions": { - "receive": "" + "edit": "", + "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": { - "creating": "" + "created": "" } }, "joblines": { @@ -375,15 +593,43 @@ "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 #" }, "labels": { @@ -392,27 +638,49 @@ }, "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" + "recalculate": "", + "reconcile": "", + "schedule": "Programar", + "sendcsi": "", + "viewdetail": "" }, "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.", @@ -426,8 +694,15 @@ "actual_delivery": "Entrega real", "actual_in": "Real en", "adjustment_bottom_line": "Ajustes", + "category": "", + "ccc": "", + "ccd": "", + "ccdr": "", + "ccf": "", + "ccm": "", "cieca_id": "CIECA ID", "claim_total": "Reclamar total", + "class": "", "clm_no": "Reclamación #", "clm_total": "Reclamar total", "csr": "Representante de servicio al cliente.", @@ -441,6 +716,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", @@ -457,17 +735,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", + "loss_desc": "", + "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", @@ -509,19 +817,32 @@ "specialcoveragepolicy": "Política de cobertura especial", "status": "Estado del trabajo", "storage_payable": "Almacenamiento / PVRT", + "tax_registration_number": "", "towing_payable": "Remolque a pagar", "unitnumber": "Unidad #", "updated_at": "Actualizado en", "uploaded_by": "Subido por", "vehicle": "Vehículo" }, + "forms": { + "admindates": "", + "appraiserinfo": "", + "claiminfo": "", + "estdates": "", + "laborrates": "", + "lossinfo": "", + "other": "", + "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", @@ -534,6 +855,9 @@ "totals": "Totales", "vehicle": "Vehículo" }, + "cost": "", + "cost_labor": "", + "cost_parts": "", "create": { "jobinfo": "", "newowner": "", @@ -542,23 +866,63 @@ "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": "", + "labortotals": "", "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", - "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.", @@ -571,42 +935,85 @@ "profile": "Perfil" }, "header": { + "accounting": "", + "accounting-payables": "", + "accounting-payments": "", + "accounting-receivables": "", "activejobs": "Empleos activos", + "alljobs": "", + "allpayments": "", "availablejobs": "Trabajos disponibles", "courtesycars": "", "courtesycars-all": "", "courtesycars-contracts": "", "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": "" }, "jobsdetail": { "claimdetail": "Detalles de la reclamación", "dates": "fechas", - "financials": "finanzas", - "insurance": "Seguro", + "general": "", "labor": "Labor", "partssublet": "Piezas / Subarrendamiento", - "repairdata": "Datos de reparación" + "rates": "", + "repairdata": "Datos de reparación", + "totals": "" }, "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..." } }, @@ -648,6 +1055,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", @@ -658,6 +1066,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", @@ -675,45 +1088,283 @@ } }, "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", - "lineremarks": "Comentarios de línea" + "job_line_id": "", + "line_desc": "", + "line_remarks": "", + "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": "" + }, + "successes": { + "removed": "" + } + }, "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": { + "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-payments": "", + "accounting-receivables": "", + "app": "ImEX Online", + "bc": { + "accounting-payables": "", + "accounting-payments": "", + "accounting-receivables": "", + "availablejobs": "", + "contracts": "", + "contracts-create": "", + "contracts-detail": "", + "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": "" + }, + "contracts": "", "contracts-create": "", "contracts-detail": "", + "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)" }, @@ -757,6 +1408,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 6118fb29e..d05cf738a 100644 --- a/client/src/translations/fr/common.json +++ b/client/src/translations/fr/common.json @@ -19,22 +19,30 @@ }, "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:", + "completingjobs": "", + "history": "", + "nocompletingjobs": "", "nodateselected": "Aucune date n'a été sélectionnée.", "priorappointments": "Rendez-vous précédents", "scheduledfor": "Rendez-vous prévu pour:" @@ -66,6 +74,10 @@ }, "bodyshop": { "actions": { + "addbucket": "", + "addpartslocation": "", + "addspeedprint": "", + "addtemplate": "", "newstatus": "" }, "errors": { @@ -75,15 +87,41 @@ "fields": { "address1": "", "address2": "", + "appt_length": "", "city": "", "country": "", + "dailybodytarget": "", + "dailypainttarget": "", "email": "", + "enforce_class": "", "federal_tax_id": "", "insurance_vendor_id": "", + "invoice_federal_tax_rate": "", + "invoice_local_tax_rate": "", + "invoice_state_tax_rate": "", + "lastnumberworkingdays": "", "logo_img_path": "", + "md_categories": "", + "md_classes": "", + "md_ins_cos": "", + "md_referral_sources": "", + "messaginglabel": "", + "messagingtext": "", + "noteslabel": "", + "notestext": "", + "partslocation": "", + "prodtargethrs": "", "responsibilitycenter": "", + "responsibilitycenter_accountdesc": "", + "responsibilitycenter_accountitem": "", + "responsibilitycenter_accountname": "", + "responsibilitycenter_accountnumber": "", + "responsibilitycenter_rate": "", "responsibilitycenters": { + "ap": "", + "ar": "", "atp": "", + "federal_tax": "", "lab": "", "lad": "", "lae": "", @@ -93,6 +131,9 @@ "lar": "", "las": "", "lau": "", + "local_tax": "", + "mapa": "", + "mash": "", "paa": "", "pac": "", "pal": "", @@ -101,9 +142,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 +173,63 @@ "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": "", + "rbac": "", "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 +243,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 +274,7 @@ }, "courtesycars": { "actions": { + "new": "", "return": "" }, "errors": { @@ -233,7 +327,45 @@ "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": "", + "download": "" + }, "errors": { "deletes3": "Erreur lors de la suppression du document du stockage.", "getpresignurl": "Erreur lors de l'obtention de l'URL présignée pour le document. {{message}}", @@ -261,8 +393,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é." }, @@ -287,24 +419,63 @@ }, "general": { "actions": { + "add": "", + "cancel": "", + "close": "", "create": "", "delete": "Effacer", + "deleteall": "", "edit": "modifier", - "reset": "Rétablir l'original.", - "save": "sauvegarder" + "login": "", + "refresh": "", + "reset": " Rétablir l'original.", + "resetpassword": "", + "save": "sauvegarder", + "saveandnew": "", + "submit": "", + "submitticket": "" + }, + "itemtypes": { + "contract": "", + "courtesycar": "", + "job": "", + "owner": "", + "vehicle": "" }, "labels": { "actions": "actes", + "areyousure": "", "barcode": "code à barre", + "confirmpassword": "", + "email": "", + "errors": "", + "exceptiontitle": "", + "hours": "", "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": "", + "view": "", + "yes": "" }, "languages": { "english": "Anglais", @@ -312,13 +483,37 @@ "spanish": "Espanol" }, "messages": { - "unsavedchanges": "Vous avez des changements non enregistrés." + "exception": "", + "newversionmessage": "", + "newversiontitle": "", + "notfoundsub": "", + "notfoundtitle": "", + "rbacunauth": "", + "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": "" @@ -327,8 +522,13 @@ "actual": "", "actual_cost": "", "cost_center": "", + "federal_tax_applicable": "", + "jobline": "", "line_desc": "", - "retail": "" + "local_tax_applicable": "", + "quantity": "", + "retail": "", + "state_tax_applicable": "" }, "labels": { "entered": "", @@ -339,29 +539,47 @@ }, "invoices": { "actions": { - "receive": "" + "edit": "", + "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": { - "creating": "" + "created": "" } }, "joblines": { @@ -375,15 +593,43 @@ "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 #" }, "labels": { @@ -392,27 +638,49 @@ }, "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" + "recalculate": "", + "reconcile": "", + "schedule": "Programme", + "sendcsi": "", + "viewdetail": "" }, "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é.", @@ -426,8 +694,15 @@ "actual_delivery": "Livraison réelle", "actual_in": "En réel", "adjustment_bottom_line": "Ajustements", + "category": "", + "ccc": "", + "ccd": "", + "ccdr": "", + "ccf": "", + "ccm": "", "cieca_id": "CIECA ID", "claim_total": "Total réclamation", + "class": "", "clm_no": "Prétendre #", "clm_total": "Total réclamation", "csr": "représentant du service à la clientèle", @@ -441,6 +716,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", @@ -457,17 +735,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", + "loss_desc": "", + "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", @@ -509,19 +817,32 @@ "specialcoveragepolicy": "Politique de couverture spéciale", "status": "Statut de l'emploi", "storage_payable": "Stockage / PVRT", + "tax_registration_number": "", "towing_payable": "Remorquage à payer", "unitnumber": "Unité #", "updated_at": "Mis à jour à", "uploaded_by": "Telechargé par", "vehicle": "Véhicule" }, + "forms": { + "admindates": "", + "appraiserinfo": "", + "claiminfo": "", + "estdates": "", + "laborrates": "", + "lossinfo": "", + "other": "", + "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", @@ -534,6 +855,9 @@ "totals": "Totaux", "vehicle": "Véhicule" }, + "cost": "", + "cost_labor": "", + "cost_parts": "", "create": { "jobinfo": "", "newowner": "", @@ -542,23 +866,63 @@ "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": "", + "labortotals": "", "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", - "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.", @@ -571,42 +935,85 @@ "profile": "Profil" }, "header": { + "accounting": "", + "accounting-payables": "", + "accounting-payments": "", + "accounting-receivables": "", "activejobs": "Emplois actifs", + "alljobs": "", + "allpayments": "", "availablejobs": "Emplois disponibles", "courtesycars": "", "courtesycars-all": "", "courtesycars-contracts": "", "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": "" }, "jobsdetail": { "claimdetail": "Détails de la réclamation", "dates": "Rendez-vous", - "financials": "Financiers", - "insurance": "Assurance", + "general": "", "labor": "La main d'oeuvre", "partssublet": "Pièces / Sous-location", - "repairdata": "Données de réparation" + "rates": "", + "repairdata": "Données de réparation", + "totals": "" }, "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..." } }, @@ -648,6 +1055,7 @@ "ownr_addr1": "Adresse", "ownr_addr2": "Adresse 2 ", "ownr_city": "Ville", + "ownr_co_nm": "", "ownr_ctry": "Pays", "ownr_ea": "Email", "ownr_fn": "Prénom", @@ -658,6 +1066,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", @@ -675,45 +1088,283 @@ } }, "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", - "lineremarks": "Remarques sur la ligne" + "job_line_id": "", + "line_desc": "", + "line_remarks": "", + "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": "" + }, + "successes": { + "removed": "" + } + }, "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": { + "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-payments": "", + "accounting-receivables": "", + "app": "ImEX Online", + "bc": { + "accounting-payables": "", + "accounting-payments": "", + "accounting-receivables": "", + "availablejobs": "", + "contracts": "", + "contracts-create": "", + "contracts-detail": "", + "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": "" + }, + "contracts": "", "contracts-create": "", "contracts-detail": "", + "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)" }, @@ -757,6 +1408,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 3ddd99c33..61863eb77 100644 --- a/client/src/translations/i18n.js +++ b/client/src/translations/i18n.js @@ -1,5 +1,6 @@ import i18n from "i18next"; import { initReactI18next } from "react-i18next"; +import LanguageDetector from "i18next-browser-languagedetector"; import en_Translation from "./en_us/common.json"; import fr_Translation from "./fr/common.json"; import es_Translation from "./es/common.json"; @@ -7,23 +8,25 @@ import es_Translation from "./es/common.json"; // the translations // (tip move them in a JSON file and import them) const resources = { - en_us: en_Translation, - fr: fr_Translation, - es: es_Translation + "en-US": en_Translation, + "fr-CA": fr_Translation, + "es-MX": es_Translation, }; i18n - .use(initReactI18next) // passes i18n down to react-i18next + .use(initReactI18next) + .use(LanguageDetector) // passes i18n down to react-i18next .init({ resources, - lng: "en_us", - fallbackLng: "en-us", - debug: true, + //lng: "en", + detection: {}, + fallbackLng: "en-US", + debug: process.env.NODE_ENV === "production" ? false : true, //keySeparator: false, // we do not use keys in form messages.welcome interpolation: { - escapeValue: false // react already safes from xss - } + escapeValue: false, // react already safes from xss + }, }); export default i18n; diff --git a/client/src/utils/DateFormatter.jsx b/client/src/utils/DateFormatter.jsx index 07a41d7b4..cddd773dc 100644 --- a/client/src/utils/DateFormatter.jsx +++ b/client/src/utils/DateFormatter.jsx @@ -1,10 +1,25 @@ import React from "react"; +import moment from "moment"; import Moment from "react-moment"; +import { Tooltip } from "antd"; 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; +} + +export function TimeAgoFormatter(props) { + const m = moment(props.children); + return props.children ? ( + + {m.fromNow()} + + ) : null; } diff --git a/client/src/utils/DocHelpers.js b/client/src/utils/DocHelpers.js deleted file mode 100644 index cd8d32735..000000000 --- a/client/src/utils/DocHelpers.js +++ /dev/null @@ -1,14 +0,0 @@ -export const generateCdnThumb = key => { - const imageRequest = JSON.stringify({ - bucket: process.env.REACT_APP_S3_BUCKET, - key: key, - toFormat: 'png', - edits: { - resize: { - height: 150, - width: 150 - } - } - }); - return `${process.env.REACT_APP_S3_CDN}/${btoa(imageRequest)}`; -}; 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 cbfccd627..ec4c9b0c7 100644 --- a/client/src/utils/private-route.js +++ b/client/src/utils/private-route.js @@ -1,14 +1,16 @@ 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 ( + render={(props) => 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 1f1c3a649..8a040559e 100644 --- a/client/yarn.lock +++ b/client/yarn.lock @@ -9,112 +9,152 @@ 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/colors@^4.0.5": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@ant-design/colors/-/colors-4.0.5.tgz#d7d100d7545cca8f624954604a6892fc48ba5aae" + integrity sha512-3mnuX2prnWOWvpFTS2WH2LoouWlOgtnIpc6IarWN6GOzzLF8dW/U8UctuvIPhoboETehZfJ61XP+CGakBEPJ3Q== + dependencies: + tinycolor2 "^1.4.1" -"@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/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-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/icons@^4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@ant-design/icons/-/icons-4.2.2.tgz#6533c5a02aec49238ec4748074845ad7d85a4f5e" + integrity sha512-DrVV+wcupnHS7PehJ6KiTcJtAR5c25UMgjGECCc6pUT9rsvw0AuYG+a4HDjfxEQuDqKTHwW+oX/nIvCymyLE8Q== dependencies: + "@ant-design/colors" "^3.1.0" + "@ant-design/icons-svg" "^4.0.0" + "@babel/runtime" "^7.10.4" + classnames "^2.2.6" + insert-css "^2.0.0" + rc-util "^5.0.1" + +"@ant-design/react-slick@~0.27.0": + version "0.27.0" + resolved "https://registry.yarnpkg.com/@ant-design/react-slick/-/react-slick-0.27.0.tgz#c5d4bfd879885b74024ffbce42cccb5f7bff41e9" + integrity sha512-dq/p/1oKgew99cNrhT6/BA4v7c7nAhPlS6IcVGVTMsp175bYxbHBT1GfY5vxZyz97YaTnzJ8s2Wql4AOnFQ+9g== + 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/client@latest": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.1.2.tgz#e384f691706c46aef4d9234b63a03ccc06e9c33c" + integrity sha512-GaA/J0CDSSNe0HVm1abeOIJA3M4fs9Ih7wF2z1AI2SLqv5TBLvwBxh0+0+jCSntPZ3gnDQvR7MHjmXota5V1LQ== + dependencies: + "@types/zen-observable" "^0.8.0" + "@wry/context" "^0.5.2" + "@wry/equality" "^0.2.0" + fast-json-stable-stringify "^2.0.0" + graphql-tag "^2.11.0" + 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" + +"@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@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@apollo/react-testing/-/react-testing-4.0.0.tgz#9fd1991584510c2ac051d986547ceccbc9c0a30a" + integrity sha512-P7Z/flUHpRRZYc3FkIqxZH9XD3FuP2Sgks1IXqGq2Zb7qI0aaTfVeRsLYmZNUcFOh2pTHxs0NXgPnH1VfYOpig== dependencies: - "@apollo/react-common" "^3.1.3" - fast-json-stable-stringify "^2.0.0" - tslib "^1.10.0" + "@apollo/client" latest -"@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 +181,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 +453,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 +470,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 +494,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 +510,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 +543,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 +574,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 +596,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 +609,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 +623,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 +651,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 +755,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 +946,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 +1074,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 +1167,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 +1188,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,89 +1202,53 @@ 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", "@babel/runtime@^7.9.2": - 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/runtime@^7.11.1", "@babel/runtime@^7.11.2": + version "7.11.2" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.11.2.tgz#f549c13c754cc40b87644b9fa9f09a6a95fe0736" + integrity sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw== dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/parser" "^7.8.6" - "@babel/types" "^7.8.6" + regenerator-runtime "^0.13.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/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/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/parser" "^7.10.4" + "@babel/types" "^7.10.4" + +"@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.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" + "@babel/helper-validator-identifier" "^7.10.4" 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" - lodash "^4.17.13" - to-fast-properties "^2.0.0" - -"@ckeditor/ckeditor5-build-classic@^18.0.0": - version "18.0.0" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-build-classic/-/ckeditor5-build-classic-18.0.0.tgz#751a475bb14bcadcf6fc6285c979bccd1cb40883" - integrity sha512-7nyaDU5sUSl+7wXPwr0d5bOlO2e0LRQh2iJJCJfAjjuUESwtiBGoFC+Ql5dEht0xlfARoSWQMlkUvGuHOVja7A== - -"@ckeditor/ckeditor5-react@^2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-react/-/ckeditor5-react-2.1.0.tgz#f612546a5a328899a436d71b72ffd632600049e8" - integrity sha512-rlHjRKhwP9tNK0Yj2UJShL14mRfxLPgJ+Pv6zTv/Mvmd4wrwGnJf+5ybOAGK92S02hP1cXH+9km+PRO1b4V+ng== - dependencies: - prop-types "^15.6.1" - "@cnakazawa/watch@^1.0.3": version "1.0.4" resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" @@ -1381,10 +1267,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" @@ -1403,233 +1289,241 @@ 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.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@firebase/analytics/-/analytics-0.4.2.tgz#b4869df9efc0334ae2fe3eba19b65b845a190012" + integrity sha512-WCoeUAO3lP6ikHJ3/XYptV90fpTidzTS9VpAfiVQK8gl9w1zvvKSavY9U3+EVG3frOPCFdE5DBO4MYrUw4gaqw== 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.18" + "@firebase/installations" "0.4.16" + "@firebase/logger" "0.2.6" + "@firebase/util" "0.3.1" + 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.10": + version "0.6.10" + resolved "https://registry.yarnpkg.com/@firebase/app/-/app-0.6.10.tgz#520798f76906897284742b6eeb43257ec73f67a5" + integrity sha512-USg/AbgqBERhY0LayrKmmp7pka08WPa7OlFI46kaNW1pA2mUNf/ifTaxhCr2hGg/eWI0zPhpbEvtGQhSJ/QqWg== 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.18" + "@firebase/logger" "0.2.6" + "@firebase/util" "0.3.1" 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.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.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.18": + version "0.1.18" + resolved "https://registry.yarnpkg.com/@firebase/component/-/component-0.1.18.tgz#28e69e54b79953376283464cb0543bde4c104140" + integrity sha512-c8gd1k/e0sbBTR0xkLIYUN8nVkA0zWxcXGIvdfYtGEsNw6n7kh5HkcxKXOPB8S7bcPpqZkGgBIfvd94IyG2gaQ== dependencies: - "@firebase/util" "0.2.43" - tslib "1.11.1" + "@firebase/util" "0.3.1" + 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.2": + version "0.5.2" + resolved "https://registry.yarnpkg.com/@firebase/database-types/-/database-types-0.5.2.tgz#23bec8477f84f519727f165c687761e29958b63c" + integrity sha512-ap2WQOS3LKmGuVFKUghFft7RxXTyZTDr0Xd8y2aqmWsbJVjgozi0huL/EUMgTjGFrATAjcf2A7aNs8AKKZ2a8g== 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.11": + version "0.6.11" + resolved "https://registry.yarnpkg.com/@firebase/database/-/database-0.6.11.tgz#74a09d5f4769eb97c00bc2f7621f54efbccea6f2" + integrity sha512-QOHhB7+CdjVhEXG9CyX0roA9ARJcEuwbozz0Bix+ULuZqjQ58KUFHMH1apW6EEiUP22d/mYD7dNXsUGshjL9PA== 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.18" + "@firebase/database-types" "0.5.2" + "@firebase/logger" "0.2.6" + "@firebase/util" "0.3.1" 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.5": + version "1.16.5" + resolved "https://registry.yarnpkg.com/@firebase/firestore/-/firestore-1.16.5.tgz#b80b63f18bd70cc101f66c5e0a79dce93f036384" + integrity sha512-GjCL4Ngy46qSdXAg9obXBuIKG2m/7a21dQktqRPaPH9xpHnymq8LxUK7sdUfyY8FBIQp6Si6O61e9fko4FjSMw== 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.18" + "@firebase/firestore-types" "1.12.0" + "@firebase/logger" "0.2.6" + "@firebase/util" "0.3.1" + "@firebase/webchannel-wrapper" "0.3.0" + "@grpc/grpc-js" "^1.0.0" "@grpc/proto-loader" "^0.5.0" - grpc "1.24.2" - tslib "1.11.1" + node-fetch "2.6.0" + 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.50": + version "0.4.50" + resolved "https://registry.yarnpkg.com/@firebase/functions/-/functions-0.4.50.tgz#02ae1a2a42de9c4c73f13c00043dbba6546248a0" + integrity sha512-eBsNrUm/Jfc/xsQXmxQRSkEg6pwHlMd2hice8N90/EeqgwqS/SCvC+O9cJITLlXroAghb9jWDWRvAkDU/TOhpw== dependencies: - "@firebase/component" "0.1.8" - "@firebase/functions-types" "0.3.16" - "@firebase/messaging-types" "0.4.4" + "@firebase/component" "0.1.18" + "@firebase/functions-types" "0.3.17" + "@firebase/messaging-types" "0.5.0" 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.16": + version "0.4.16" + resolved "https://registry.yarnpkg.com/@firebase/installations/-/installations-0.4.16.tgz#5c3f2e542308f06439aeddb0f456f3f36ae808eb" + integrity sha512-gqv3IrBUmPWKpH8wLJ0fZcAH1NEXwQhqjqnK3cQXRcIkEARP430cmIAaj7CcPdgdemHX9HqwJG+So/yBHIYXPA== dependencies: - "@firebase/component" "0.1.8" - "@firebase/installations-types" "0.3.3" - "@firebase/util" "0.2.43" + "@firebase/component" "0.1.18" + "@firebase/installations-types" "0.3.4" + "@firebase/util" "0.3.1" 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.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@firebase/messaging-types/-/messaging-types-0.5.0.tgz#c5d0ef309ced1758fda93ef3ac70a786de2e73c4" + integrity sha512-QaaBswrU6umJYb/ZYvjR5JDSslCGOH6D9P136PhabFAHLTR4TWjsaACvbBXuvwrfCXu10DtcjMxqfhdNIB1Xfg== -"@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.7.0": + version "0.7.0" + resolved "https://registry.yarnpkg.com/@firebase/messaging/-/messaging-0.7.0.tgz#6932f6bfcc04148891751aecce426cafe76e0a06" + integrity sha512-PTD5pQw9QremOjiWWZYOkzcX6OKByMvlG+NQXdTnyL3kLbE01Bdp9iWhkH6ipNpHYMiwcK1RZD4TLkYVBviBsw== 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.18" + "@firebase/installations" "0.4.16" + "@firebase/messaging-types" "0.5.0" + "@firebase/util" "0.3.1" 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.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@firebase/performance/-/performance-0.4.0.tgz#7f5bb47ef085cd83bf331b19d3213e11fbe88941" + integrity sha512-LZG89G2wAjTRsIcuewIx152+DyRzQf8UtPCAjifkFiMcAY4GmZZKeIbIC3b4oQDwTgH5i0IKKd4EOv7dLD97gw== 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.18" + "@firebase/installations" "0.4.16" + "@firebase/logger" "0.2.6" + "@firebase/performance-types" "0.0.13" + "@firebase/util" "0.3.1" + 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.27": + version "0.1.27" + resolved "https://registry.yarnpkg.com/@firebase/remote-config/-/remote-config-0.1.27.tgz#b581cb7d870e7d32bac5967acbbb5d7ec593a2f3" + integrity sha512-BGjmQomRKNf+yGJ/3/5Kw6zNLM5jY9oTVjLmYsQXf6U+HMgz6J2H6EVGc1bZW7YSsvak8f6DomxegQtvfvwaMw== 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.18" + "@firebase/installations" "0.4.16" + "@firebase/logger" "0.2.6" + "@firebase/remote-config-types" "0.1.9" + "@firebase/util" "0.3.1" + 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.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.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.42": + version "0.3.42" + resolved "https://registry.yarnpkg.com/@firebase/storage/-/storage-0.3.42.tgz#e2fe1aa54c004852a848b50f34c2f351e6e517e5" + integrity sha512-FqHDWZPhATQeOFBQUZPsQO7xhnGBxprYVDb9eIjCnh1yRl6WAv/OQGHOF+JU5+H+YkjsKTtr/5VjyDl3Y0UHxw== 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.18" + "@firebase/storage-types" "0.3.13" + "@firebase/util" "0.3.1" + 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.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@firebase/util/-/util-0.3.1.tgz#8c95152a00121bd31fb7c1fc6520ca208976e384" + integrity sha512-zjVd9rfL08dRRdZILFn1RZTHb1euCcnD9N/9P56gdBcm2bvT5XsCC4G6t5toQBpE/H/jYe5h6MZMqfLu3EQLXw== 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.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.3.0.tgz#d1689566b94c25423d1fb2cb031c5c2ea4c9f939" + integrity sha512-VniCGPIgSGNEgOkh5phb3iKmSGIzcwrccy3IomMFRWPCMiCk2y98UQNJEoDs1yIHtZMstVjYWKYxnunIGzC5UQ== + +"@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" @@ -1814,6 +1708,18 @@ "@types/istanbul-reports" "^1.1.1" "@types/yargs" "^13.0.0" +"@jonkemp/package-utils@^1.0.4": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@jonkemp/package-utils/-/package-utils-1.0.5.tgz#a49dcbd649b0c83d4aaade2fcd15d074a5bf9932" + integrity sha512-3gpXj6ZK9/ZDruwCNTUgsGTobER8oSdudQBGp/VpawxaOrKuTzdwWQ0kocB1o5ohJbdTDUfqlLrHJ5busqObiA== + +"@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" @@ -1822,69 +1728,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" @@ -1988,9 +1831,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.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@stripe/stripe-js/-/stripe-js-1.9.0.tgz#a4a166b5de88903573c9a7fd04f39610648f4769" + integrity sha512-/8+zfeRHlsEsxj0qmq9qbrnyF3fx+r97sDxfv7kqOyZFUFzC7DBwQwZlmss6XiV3ez5vz1G1QIjEW29PmLmsAw== "@svgr/babel-plugin-add-jsx-attribute@^4.2.0": version "4.2.0" @@ -2095,20 +1953,27 @@ "@svgr/plugin-svgo" "^4.3.1" loader-utils "^1.2.3" -"@tanem/react-nprogress@^3.0.20": - version "3.0.20" - resolved "https://registry.yarnpkg.com/@tanem/react-nprogress/-/react-nprogress-3.0.20.tgz#98dc33c45460e1d751f6459dca4a8e732c468749" - integrity sha512-eZVDIKCVkTpEQmDVHrrAg3DlofPYR2K/tLgP4XLUQeAzVvMZ4W/GOhEajUGn740JCo6xAaBNhrf3i11ir6/8OA== +"@tanem/react-nprogress@^3.0.40": + version "3.0.40" + resolved "https://registry.yarnpkg.com/@tanem/react-nprogress/-/react-nprogress-3.0.40.tgz#dc1ce391aa1ba00bd8f069e4ad9777886356919c" + integrity sha512-ktwQPIJJr6ooe9lWhA/0RtKkYmBUHMGpzxvJ7Oy0hW3Joi4y+xHSUK/01uUi0+f5koNBrzlkVLAYTUqwmFunTQ== dependencies: - "@babel/runtime" "^7.9.2" + "@babel/runtime" "^7.11.2" hoist-non-react-statics "^3.3.2" prop-types "^15.7.2" - react-use "^13.27.1" + react-use "^15.3.3" + +"@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" @@ -2132,20 +1997,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" @@ -2156,24 +2013,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" @@ -2183,24 +2034,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/js-cookie@2.2.5": - version "2.2.5" - resolved "https://registry.yarnpkg.com/@types/js-cookie/-/js-cookie-2.2.5.tgz#38dfaacae8623b37cc0b0d27398e574e3fc28b1e" - integrity sha512-cpmwBRcHJmmZx0OGU7aPVwGWGbs4iKwVYchk9iuMtxNCA2zorwdaTz4GkLgs2WGxiRZRFKnV1k6tRUHX7tBMxg== +"@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/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/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@*", "@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== @@ -2211,14 +2062,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" @@ -2231,14 +2082,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" @@ -2254,9 +2105,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" "*" @@ -2266,46 +2117,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": @@ -2462,10 +2313,24 @@ "@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.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" + +"@wry/equality@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.2.0.tgz#a312d1b6a682d0909904c2bcd355b02303104fb7" + integrity sha512-Y4d+WH6hs+KZJUC8YKLYGarjGekBrhslDbf/R20oV+AakHPINSitHfDRQz3EGcEWc1luXYNUvMhawWtZVWNGvQ== dependencies: tslib "^1.9.3" @@ -2484,11 +2349,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" @@ -2515,7 +2375,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== @@ -2526,26 +2386,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" @@ -2563,6 +2416,20 @@ adjust-sourcemap-loader@2.0.0: object-path "0.11.4" regex-parser "2.2.10" +agent-base@4, 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@~4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9" + integrity sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg== + dependencies: + es6-promisify "^5.0.0" + aggregate-error@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.1.tgz#db2fe7246e536f40d9b5442a39e117d7dd6a24e0" @@ -2571,21 +2438,20 @@ aggregate-error@^3.0.0: clean-stack "^2.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== +airbnb-prop-types@^2.16.0: + 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" @@ -2593,14 +2459,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" @@ -2628,11 +2494,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" @@ -2679,55 +2545,57 @@ 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.6.1: + version "4.6.1" + resolved "https://registry.yarnpkg.com/antd/-/antd-4.6.1.tgz#d204215d3d00a3ac51a2e93ec2ee1a49adbdb705" + integrity sha512-RsqbFvUNSZ5K114492BNo4p+4MpCUpzIsZLu0XFlufYLyIE3pyw184OZjPnJ7b4qlMEvlIoE14N8qCb4BnZF0w== dependencies: - "@ant-design/icons" "^4.0.0" - "@ant-design/react-slick" "~0.25.5" + "@ant-design/colors" "^4.0.5" + "@ant-design/css-animation" "^1.7.2" + "@ant-design/icons" "^4.2.1" + "@ant-design/react-slick" "~0.27.0" + "@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" + lodash "^4.17.20" + 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.10.0" + rc-image "~3.0.2" + rc-input-number "~6.0.0" + rc-mentions "~1.4.0" + rc-menu "~8.5.2" + rc-motion "^1.0.0" + rc-notification "~4.4.0" + rc-pagination "~3.0.3" + rc-picker "~2.0.6" + rc-progress "~3.0.0" + rc-rate "~2.8.2" + rc-resize-observer "^0.2.3" + rc-select "~11.1.0" + rc-slider "~9.3.0" + rc-steps "~4.1.0" + rc-switch "~3.2.0" + rc-table "~7.9.2" + rc-tabs "~11.6.0" + rc-textarea "~0.3.0" + rc-tooltip "~4.2.0" + rc-tree "~3.9.0" + rc-tree-select "~4.1.1" + rc-trigger "~4.4.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" @@ -2753,14 +2621,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" @@ -2768,72 +2636,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: @@ -2841,37 +2709,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" @@ -2982,7 +2850,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== @@ -3003,19 +2871,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" @@ -3062,6 +2922,11 @@ ast-types-flow@0.0.7, ast-types-flow@^0.0.7: resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" integrity sha1-9wtzXGvKGlycItmCw+Oef+ujva0= +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" @@ -3083,9 +2948,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" @@ -3105,17 +2975,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" @@ -3123,21 +2998,21 @@ 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" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.19.2.tgz#3ea36c5d8818d0d5f8a8a97a6d36b86cdc00cb27" - integrity sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA== +axios@^0.20.0: + version "0.20.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.20.0.tgz#057ba30f04884694993a8cd07fa394cff11c50bd" + integrity sha512-ANA4rr2BDcmmAQLOKft2fufrtuvlqR+cXNNinUmvfeSNCOF98PZL+7M/v1zIdGo7OLjEA9J2gXJL+j4zGsl0bA== dependencies: - follow-redirects "1.5.10" + follow-redirects "^1.10.0" 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" @@ -3191,10 +3066,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" @@ -3291,7 +3166,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= @@ -3309,6 +3184,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" @@ -3332,7 +3212,7 @@ base@^0.11.1: mixin-deep "^1.2.0" pascalcase "^0.1.1" -batch@0.6.1: +batch@0.6.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= @@ -3344,6 +3224,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" @@ -3355,9 +3240,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" @@ -3378,10 +3263,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" @@ -3452,15 +3342,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" @@ -3500,7 +3403,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= @@ -3509,17 +3412,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" @@ -3538,24 +3443,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" @@ -3598,13 +3494,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" @@ -3616,9 +3505,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" @@ -3730,16 +3619,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" @@ -3755,15 +3639,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" @@ -3802,24 +3681,41 @@ chalk@^1.1.1, chalk@^1.1.3: 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== +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" -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== +cheerio@^0.22.0: + version "0.22.0" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-0.22.0.tgz#a9baa860a3f9b595a6b81b1a86873121ed3a269e" + integrity sha1-qbqoYKP5tZWmuBsahocxIe06Jp4= + dependencies: + css-select "~1.2.0" + dom-serializer "~0.1.0" + entities "~1.1.1" + htmlparser2 "^3.9.1" + lodash.assignin "^4.0.9" + lodash.bind "^4.1.4" + lodash.defaults "^4.0.1" + lodash.filter "^4.4.0" + lodash.flatten "^4.2.0" + lodash.foreach "^4.3.0" + lodash.map "^4.4.0" + lodash.merge "^4.4.0" + lodash.pick "^4.2.1" + lodash.reduce "^4.4.0" + lodash.reject "^4.4.0" + lodash.some "^4.4.0" + cheerio@^1.0.0-rc.3: version "1.0.0-rc.3" resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.3.tgz#094636d425b2e9c0f4eb91a46c05630c9a1a8bf6" @@ -3832,7 +3728,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== @@ -3851,10 +3747,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" @@ -3862,7 +3758,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" @@ -3901,7 +3797,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.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== @@ -3926,27 +3822,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" - -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" +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" @@ -3987,9 +3870,9 @@ clone-deep@^4.0.1: 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== + 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" @@ -4058,12 +3941,12 @@ 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: +combined-stream@^1.0.6, combined-stream@^1.0.8, 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== @@ -4090,23 +3973,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: +component-emitter@^1.2.1, component-emitter@^1.3.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== -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" @@ -4134,10 +4005,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,6 +4089,11 @@ 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.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.2.tgz#dd8a235530752f988f9a0844f3fc589e3111125c" + integrity sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA== + copy-concurrently@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" @@ -4243,29 +4119,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== @@ -4304,7 +4175,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== @@ -4315,7 +4186,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== @@ -4372,14 +4243,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" @@ -4387,6 +4250,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" @@ -4446,6 +4316,13 @@ css-prefers-color-scheme@^3.1.1: dependencies: postcss "^7.0.5" +css-rules@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/css-rules/-/css-rules-1.0.9.tgz#614c2c76dda9d9d574336cbc550d16d9cfb78ab5" + integrity sha512-HU0mZu0RFIjRRWn4QIAO8MaE1W7q+JSCIiiKE9g2s3b0xgDEAYXG/F9n35xAkaU9NpvUbxBTMJWx1quRRPXbjg== + dependencies: + cssom "^0.4.4" + 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" @@ -4488,7 +4365,7 @@ css-tree@1.0.0-alpha.37: mdn-data "2.0.4" source-map "^0.6.1" -css-tree@^1.0.0-alpha.28: +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== @@ -4502,9 +4379,9 @@ css-what@2.1: 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" @@ -4600,17 +4477,22 @@ 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" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== +cssom@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" + integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== + cssstyle@^1.0.0, cssstyle@^1.1.1: version "1.4.0" resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.4.0.tgz#9d31328229d3c565c61e586b02041a28fccdccf1" @@ -4619,9 +4501,14 @@ cssstyle@^1.0.0, cssstyle@^1.1.1: cssom "0.3.x" csstype@^2.2.0, csstype@^2.5.5, 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== + version "2.6.11" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.11.tgz#452f4d024149ecf260a852b025e36562a253ffc5" + integrity sha512-l8YyEC9NBkSm783PFTvh0FmJy7s5pFKrDp49ZL7zBGX3fWkO+N4EEyan1qqp8cwPLDcD0OSdyY6hAMoxp34JFw== + +csstype@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.2.tgz#ee5ff8f208c8cd613b389f7b222c9801ca62b3f7" + integrity sha512-ofovWglpqoqbfLNOTBNZLSbMuGrblAf1efvvArGKOZMBrIoJeu5UsAipQolkijtyQx5MtAzT/J9IHj/CEY1mJw== currently-unhandled@^0.4.1: version "0.4.1" @@ -4635,27 +4522,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== @@ -4667,33 +4554,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== @@ -4725,6 +4605,11 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" +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== + 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" @@ -4739,39 +4624,54 @@ date-arithmetic@^4.0.1: resolved "https://registry.yarnpkg.com/date-arithmetic/-/date-arithmetic-4.1.0.tgz#e5d6434e9deb71f79760a37b729e4a515e730ddf" integrity sha512-QWxYLR5P/6GStZcdem+V1xoto6DMadYWpMXU82ES3/RfR3Wdwr3D0+be7mgOJ+Ov0G9D5Dmb9T17sNLQYj9XOg== -debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.9: +date-fns@^2.15.0: + version "2.15.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.15.0.tgz#424de6b3778e4e69d3ff27046ec136af58ae5d5f" + integrity sha512-ZCPzAMJZn3rNUvvQIMlXhDr4A+Ar07eLeGsGREoWU19a3Pqf5oYa+ccd+B3F6XVtQY6HANMFdOQ8A+ipFnvJdQ== + +dayjs@^1.8.30: + version "1.8.32" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.8.32.tgz#66c48b95c397d9f7907e89bd29f78b3d19d40294" + integrity sha512-V91aTRu5btP+uzGHaaOfodckEfBWhmi9foRP7cauAO1PTB8+tZ9o0Jec7q6TIIRY1N4q1IfiKsZunkB/AEWqMQ== + +debug@2, 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.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@^3.0.0, debug@^3.1.1, debug@^3.2.5, debug@^3.2.6: - 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: +debug@4, 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.1.1, decamelize@^1.1.2, decamelize@^1.2.0: +debug@^3.1.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" + +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" @@ -4794,11 +4694,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,6 +4736,15 @@ define-property@^2.0.2: is-descriptor "^1.0.2" isobject "^3.0.1" +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" + del@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" @@ -4882,11 +4786,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" @@ -4919,6 +4818,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" @@ -4975,9 +4879,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" @@ -4994,13 +4898,21 @@ dom-helpers@^3.4.0: "@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== + 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-helpers@^5.1.3: + version "5.2.0" + resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.0.tgz#57fd054c5f8f34c52a3eeffdb7e7e93cd357d95b" + integrity sha512-Ru5o9+V8CpunKnz5LGgWXkmrH/20cGKwcHwS4m73zIvs54CN9epEmT/HLqFJW3kXpakAFkEdzgy1hzlJe3E4OQ== + dependencies: + "@babel/runtime" "^7.8.7" + csstype "^3.0.2" + dom-serializer@0: version "0.2.2" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" @@ -5009,7 +4921,7 @@ dom-serializer@0: domelementtype "^2.0.1" entities "^2.0.0" -dom-serializer@~0.1.1: +dom-serializer@~0.1.0, dom-serializer@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.1.tgz#1ec4059e284babed36eec2941d4a970a189ce7c0" integrity sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA== @@ -5120,25 +5032,22 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 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== +ejs@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.5.tgz#aed723844dc20acb4b170cd9ab1017e476a0d93b" + integrity sha512-dldq3ZfFtgVTJMLjOe+/3sROTzALlL9E34V4/sDtUd/KlBSS0s6U1/+WPE1B4sj9CXHJpL1M6rhNJnc9Wbal9w== + 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" @@ -5174,11 +5083,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" @@ -5188,9 +5097,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" @@ -5202,31 +5111,31 @@ 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" - resolved "https://registry.yarnpkg.com/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.15.2.tgz#b16db2f0ea424d58a808f9df86ab6212895a4501" - integrity sha512-SkvDrb8xU3lSxID8Qic9rB8pvevDbLybxPK6D/vW7PrT0s2Cl/zJYuXvsd1EBTz0q4o3iqG3FJhpYz3nUNpM2Q== +enzyme-adapter-react-16@^1.15.3: + version "1.15.3" + resolved "https://registry.yarnpkg.com/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.15.3.tgz#90154055be3318d70a51df61ac89cfa22e3d5f60" + integrity sha512-98rqNI4n9HZslWIPuuwy4hK1bxRuMy+XX0CU1dS8iUqcgisTxeBaap6oPp2r4MWC8OphCbbqAT8EU/xHz3zIaQ== dependencies: - enzyme-adapter-utils "^1.13.0" - enzyme-shallow-equal "^1.0.1" + enzyme-adapter-utils "^1.13.1" + enzyme-shallow-equal "^1.0.4" has "^1.0.3" object.assign "^4.1.0" object.values "^1.1.1" prop-types "^15.7.2" - react-is "^16.12.0" + react-is "^16.13.1" react-test-renderer "^16.0.0-0" semver "^5.7.0" -enzyme-adapter-utils@^1.13.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/enzyme-adapter-utils/-/enzyme-adapter-utils-1.13.0.tgz#01c885dde2114b4690bf741f8dc94cee3060eb78" - integrity sha512-YuEtfQp76Lj5TG1NvtP2eGJnFKogk/zT70fyYHXK2j3v6CtuHqc8YmgH/vaiBfL8K1SgVVbQXtTcgQZFwzTVyQ== +enzyme-adapter-utils@^1.13.1: + version "1.13.1" + resolved "https://registry.yarnpkg.com/enzyme-adapter-utils/-/enzyme-adapter-utils-1.13.1.tgz#59c1b734b0927543e3d8dc477299ec957feb312d" + integrity sha512-5A9MXXgmh/Tkvee3bL/9RCAAgleHqFnsurTYCbymecO4ohvtNO5zqIhHxV370t7nJAwaCfkgtffarKpC0GPt0g== dependencies: - airbnb-prop-types "^2.15.0" + airbnb-prop-types "^2.16.0" function.prototype.name "^1.1.2" object.assign "^4.1.0" object.fromentries "^2.0.2" @@ -5241,6 +5150,14 @@ enzyme-shallow-equal@^1.0.1: has "^1.0.3" object-is "^1.0.2" +enzyme-shallow-equal@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.4.tgz#b9256cb25a5f430f9bfe073a84808c1d74fced2e" + integrity sha512-MttIwB8kKxypwHvRynuC3ahyNc+cFbR8mjVIltnmzQ0uKGqmsfO4bfBuLxb0beLNPhjblUEYvEbsg+VSygvF1Q== + dependencies: + has "^1.0.3" + object-is "^1.1.2" + enzyme@^3.11.0: version "3.11.0" resolved "https://registry.yarnpkg.com/enzyme/-/enzyme-3.11.0.tgz#71d680c580fe9349f6f5ac6c775bc3e6b7a79c28" @@ -5290,22 +5207,22 @@ error-stack-parser@^2.0.6: 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: - version "1.17.4" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.4.tgz#e3aedf19706b20e7c2594c35fc0d57605a79e184" - integrity sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ== +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" @@ -5334,6 +5251,18 @@ es6-iterator@2.0.3, es6-iterator@~2.0.3: es5-ext "^0.10.35" es6-symbol "^3.1.1" +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" + 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" @@ -5342,6 +5271,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" @@ -5357,10 +5291,10 @@ escape-string-regexp@^1.0.2, 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.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== +escodegen@1.x.x, escodegen@^1.11.0, escodegen@^1.9.1: + 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" @@ -5377,9 +5311,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" @@ -5396,9 +5330,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" @@ -5475,9 +5409,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" @@ -5489,10 +5423,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" @@ -5538,25 +5479,30 @@ 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@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.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" @@ -5565,12 +5511,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== @@ -5586,9 +5537,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" @@ -5749,6 +5700,16 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" +extract-css@^1.5.4: + version "1.5.5" + resolved "https://registry.yarnpkg.com/extract-css/-/extract-css-1.5.5.tgz#0082ae6f1ff8d0375739344e8874fd703d7ea05c" + integrity sha512-fvNKsWJxK8WaSyl9CsSw2lSn8qEKe0rBOaZXZ/fkCeux4tInHoFjTA1YBDi55iNwWTfe9VfLFsoBPCIIn5eArw== + dependencies: + batch "^0.6.1" + href-content "^1.2.3" + list-stylesheets "^1.2.8" + style-data "^1.4.6" + extsprintf@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" @@ -5759,10 +5720,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" @@ -5786,6 +5747,11 @@ fast-levenshtein@~2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= +fast-safe-stringify@^2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz#124aa885899261f68aedb42a7c080de9da608743" + integrity sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA== + 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" @@ -5817,23 +5783,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" @@ -5857,11 +5810,18 @@ file-loader@4.3.0: loader-utils "^1.2.3" schema-utils "^2.5.0" -file-uri-to-path@1.0.0: +file-uri-to-path@1, 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== +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" @@ -5915,10 +5875,10 @@ find-cache-dir@^2.1.0: make-dir "^2.0.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== +find-cache-dir@^3.3.1: + 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" @@ -5954,25 +5914,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.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/fingerprintjs2/-/fingerprintjs2-2.1.2.tgz#d4812e627356f04b279c63b995b72591b2ab5ed5" + integrity sha512-ZPsLgjziFRbUb5tXWpEMtWp4XFnzSah8SiNfl3aoURDZ+2zi2tuIOYUULqDBV+Cb6paN+raWT+Q2qpOaCbX/Yw== + +firebase@^7.19.0: + version "7.19.0" + resolved "https://registry.yarnpkg.com/firebase/-/firebase-7.19.0.tgz#cfa64ebc56f3ef095df31d20f1de4dc5fa80f793" + integrity sha512-gS0nFagMfDLEucgcMD/tCfpLH+crnTurpyMsh6JEvith7GA8cRA4S3T3300xPL6dSZliI7EiGsCNBXBil6sAUw== 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.4.2" + "@firebase/app" "0.6.10" + "@firebase/app-types" "0.6.1" + "@firebase/auth" "0.14.9" + "@firebase/database" "0.6.11" + "@firebase/firestore" "1.16.5" + "@firebase/functions" "0.4.50" + "@firebase/installations" "0.4.16" + "@firebase/messaging" "0.7.0" + "@firebase/performance" "0.4.0" + "@firebase/polyfill" "0.3.36" + "@firebase/remote-config" "0.1.27" + "@firebase/storage" "0.3.42" + "@firebase/util" "0.3.1" flat-cache@^2.0.1: version "2.0.1" @@ -5983,10 +5948,15 @@ flat-cache@^2.0.1: rimraf "2.6.3" write "1.0.3" +flat-util@^1.1.1: + version "1.1.5" + resolved "https://registry.yarnpkg.com/flat-util/-/flat-util-1.1.5.tgz#7d14fae7df4b0076088a52e5b7d8f7ad342e6d80" + integrity sha512-xul8tthzyD+jVhbwG+V4ne/qMA5zb8LXC75mMeWxZsCoUqCfrvaPgL6v87LG3L8an///BCiXWy8Du8i4dBdCIQ== + 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" @@ -6001,19 +5971,15 @@ flush-write-stream@^1.0.0: inherits "^2.0.3" readable-stream "^2.3.6" -follow-redirects@1.5.10: - version "1.5.10" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a" - integrity sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ== - dependencies: - 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== + +follow-redirects@^1.10.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.0.tgz#b42e8d93a2a7eea5ed88633676d6597bc8e384db" + integrity sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA== for-in@^0.1.3: version "0.1.8" @@ -6051,6 +6017,15 @@ fork-ts-checker-webpack-plugin@3.1.1: tapable "^1.0.0" worker-rpc "^0.1.0" +form-data@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.0.tgz#31b7e39c85f1355b7139ee0c647cf0de7f83c682" + integrity sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + form-data@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" @@ -6060,6 +6035,11 @@ form-data@~2.3.2: combined-stream "^1.0.6" mime-types "^2.1.12" +formidable@^1.2.2: + 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" @@ -6112,13 +6092,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" @@ -6141,19 +6114,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" @@ -6164,12 +6142,20 @@ fstream@^1.0.0, fstream@^1.0.12: mkdirp ">=0.5 0" rimraf "2" +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== -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== @@ -6214,21 +6200,11 @@ gensync@^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-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" @@ -6246,6 +6222,18 @@ get-stream@^4.0.0: dependencies: pump "^3.0.0" +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" + 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" @@ -6267,9 +6255,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" @@ -6278,7 +6266,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== @@ -6312,9 +6300,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" @@ -6343,53 +6331,39 @@ 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.11.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.11.0.tgz#1deb53a01c46a7eb401d6cb59dec86fa1cccbffd" + integrity sha512-VmsD5pJqWJnQZMUeRwrDhfgoyqcfwEkvtpANqcoUG8/tOLkwNgU9mzub/Mc78OJMhHjx7gfAMTxzdG43VGg3bA== 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" @@ -6398,15 +6372,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" @@ -6492,12 +6461,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" @@ -6538,11 +6508,6 @@ hmac-drbg@^1.0.0: 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.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" @@ -6551,9 +6516,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" @@ -6565,6 +6530,13 @@ hpack.js@^2.1.6: readable-stream "^2.0.1" wbuf "^1.1.0" +href-content@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/href-content/-/href-content-1.2.3.tgz#330f25b5e547a924060f2767b6335afec9509af1" + integrity sha512-Ap8D5Bw0e0IpRMxw6vX6+w6TRie5Jpto92529WxfZLDSpwB0u0cuX7xuRXSSvy/M1vvPRluvME2ktK5n0znoAA== + dependencies: + remote-content "^1.2.3" + hsl-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e" @@ -6594,20 +6566,20 @@ html-encoding-sniffer@^1.0.2: 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-entities@^1.3.1: + 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" @@ -6664,17 +6636,7 @@ http-errors@1.7.2: 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: +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== @@ -6685,10 +6647,28 @@ 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-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-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-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-middleware@0.19.1: version "0.19.1" @@ -6701,9 +6681,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" @@ -6723,25 +6703,47 @@ 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, hyphenate-style-name@^1.0.2: - 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== - -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== +https-proxy-agent@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-3.0.1.tgz#b8c286433e87602311b01c8ea34413d856a4af81" + integrity sha512-+ML2Rbh6DAuee7d07tYGEKOEi2voWPUGan+ExdPbPW6Z3svq+JCqr0v8WmKPOkz1vOVykPCBSuobe7G8GJUtVg== dependencies: - "@babel/runtime" "^7.3.1" + agent-base "^4.3.0" + debug "^3.1.0" -iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4, iconv-lite@~0.4.13: +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@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/i18next-browser-languagedetector/-/i18next-browser-languagedetector-6.0.1.tgz#83654bc87302be2a6a5a75146ffea97b4ca268cf" + integrity sha512-3H+OsNQn3FciomUU0d4zPFHsvJv4X66lBelXk9hnIDYDsveIgT7dWZ3/VvcSlpKk9lvCK770blRZ/CwHMXZqWw== + dependencies: + "@babel/runtime" "^7.5.5" + +i18next@^19.7.0: + version "19.7.0" + resolved "https://registry.yarnpkg.com/i18next/-/i18next-19.7.0.tgz#e637bbbf36481d34b7d5e6d3b04e1bb654bf2a26" + integrity sha512-sxZhj6u7HbEYOMx81oGwq5MiXISRBVg2wRY3n6YIbe+HtU8ydzlGzv6ErHdrRKYxATBFssVXYbc3lNZoyB4vfA== + dependencies: + "@babel/runtime" "^7.10.1" + +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" @@ -6771,13 +6773,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" @@ -6793,6 +6788,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" @@ -6837,9 +6839,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" @@ -6871,7 +6873,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== @@ -6886,11 +6888,24 @@ 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== +inline-css@^2.6.3: + version "2.6.3" + resolved "https://registry.yarnpkg.com/inline-css/-/inline-css-2.6.3.tgz#8227a575fc86406c571edb6bdf4758baa5917718" + integrity sha512-MQez0TJJ216JF2Su5/nUcaHvDy6Q9K9tf7hwCJewMXfTitN8ary4IHzgic0b1vjmjhNXzRcYmH25yIJ6JoBRSA== + dependencies: + cheerio "^0.22.0" + css-rules "^1.0.9" + extract-css "^1.5.4" + flat-util "^1.1.1" + pick-util "^1.0.1" + slick "^1.12.2" + specificity "^0.4.1" + inline-style-prefixer@^2.0.0: version "2.0.5" resolved "https://registry.yarnpkg.com/inline-style-prefixer/-/inline-style-prefixer-2.0.5.tgz#c153c7e88fd84fef5c602e95a8168b2770671fe7" @@ -6907,7 +6922,7 @@ inline-style-prefixer@^4.0.0: bowser "^1.7.3" css-in-js-utils "^2.0.0" -inquirer@7.0.4, inquirer@^7.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== @@ -6926,6 +6941,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" @@ -6948,29 +6982,19 @@ 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" - 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: +ip@1.1.5, 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= @@ -7043,10 +7067,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" @@ -7230,17 +7254,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" @@ -7307,9 +7326,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" @@ -7338,7 +7359,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= @@ -7396,11 +7417,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" @@ -7601,9 +7632,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" @@ -7772,10 +7803,10 @@ jest-worker@^24.6.0, jest-worker@^24.9.0: 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== +jest-worker@^25.4.0: + 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" @@ -7789,15 +7820,20 @@ 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" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -7809,9 +7845,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" @@ -7951,17 +7987,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" @@ -7988,13 +8017,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" @@ -8054,20 +8088,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" - 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" @@ -8098,6 +8118,14 @@ lines-and-columns@^1.1.6: resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= +list-stylesheets@^1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/list-stylesheets/-/list-stylesheets-1.2.8.tgz#5cd9680e27d25bd13fb4340b1f9222709dda7261" + integrity sha512-m67MaQucMsuTfBHR7uFTsuhKluBNjoKn+1IQtuklNThtb+vnTXxLohbW0eyh8mdnpw0Q5PM3EocuPBb+Gwi0Kg== + dependencies: + cheerio "^0.22.0" + pick-util "^1.0.1" + load-json-file@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" @@ -8130,12 +8158,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" @@ -8151,7 +8179,7 @@ loader-utils@1.2.3: emojis-list "^2.0.0" json5 "^1.0.1" -loader-utils@^1.0.0, loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: +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== @@ -8183,7 +8211,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== @@ -8193,50 +8221,95 @@ lodash._reinterpolate@^3.0.0: resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= +lodash.assignin@^4.0.9: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assignin/-/lodash.assignin-4.2.0.tgz#ba8df5fb841eb0a3e8044232b0e263a8dc6a28a2" + integrity sha1-uo31+4QesKPoBEIysOJjqNxqKKI= + +lodash.bind@^4.1.4: + version "4.2.1" + resolved "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-4.2.1.tgz#7ae3017e939622ac31b7d7d7dcb1b34db1690d35" + integrity sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU= + 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.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.defaults@^4.0.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" + integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw= lodash.escape@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-4.0.1.tgz#c9044690c21e04294beaa517712fded1fa88de98" integrity sha1-yQRGkMIeBClL6qUXcS/e0fqI3pg= +lodash.filter@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.filter/-/lodash.filter-4.6.0.tgz#668b1d4981603ae1cc5a6fa760143e480b4c4ace" + integrity sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4= + +lodash.flatten@^4.2.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" + integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= + lodash.flattendeep@^4.4.0: version "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.foreach@^4.3.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53" + integrity sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM= 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.map@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3" + integrity sha1-dx7Hg540c9nEzeKLGTlMNWL09tM= 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.once@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" - integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w= +lodash.merge@^4.4.0: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.pick@^4.2.1: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" + integrity sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM= + +lodash.reduce@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.reduce/-/lodash.reduce-4.6.0.tgz#f1ab6b839299ad48f784abbf476596f03b914d3b" + integrity sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs= + +lodash.reject@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.reject/-/lodash.reject-4.6.0.tgz#80d6492dc1470864bbf583533b651f42a9f52415" + integrity sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU= + +lodash.some@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d" + integrity sha1-G7nzFO9ri63tE7VJFpsqlF62jk0= lodash.sortby@^4.7.0: version "4.7.0" @@ -8258,31 +8331,41 @@ 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== +lodash@^4.17.20: + version "4.17.20" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" + integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== + +loglevel@^1.6.8: + 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.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/logrocket/-/logrocket-1.0.11.tgz#5a4df9887304e9239a5a9d09676ba4d42a88a65a" + integrity sha512-H0dTrM//LwngQ8cTicVhRF7JFm8h5AOvcPSAi+F0jmrxM9UHFZQgkOpDUbr6013tZbhet1NbiEBROXi74zpV3A== 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: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -8329,17 +8412,12 @@ 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" -make-event-props@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/make-event-props/-/make-event-props-1.2.0.tgz#96b87d88919533b8f8934b58b4c3d5679459a0cf" - integrity sha512-BmWFkm/jZzVH9A0tEBdkjAARUz/eha+5IRyfOndeSMKRadkgR5DawoBHoRwLxkYmjJOI5bHkXKpaZocxj+dKgg== - makeerror@1.0.x: version "1.0.11" resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" @@ -8352,13 +8430,6 @@ mamacro@^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" @@ -8376,6 +8447,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" @@ -8400,14 +8476,12 @@ media-typer@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== +mediaquery-text@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/mediaquery-text/-/mediaquery-text-1.1.5.tgz#6ced6675205ba9d5497bf34ebd0f42f23cfb0684" + integrity sha512-T27sUGebV4BhxKpvBThwlZHnMR5elqw4hDSXs0ohHBRGh7k79LaR3lmJHJlIjrNa+LHTl35OWUW56dSGtMNzXQ== dependencies: - map-age-cleaner "^0.1.1" - mimic-fn "^2.0.0" - p-is-promise "^2.0.0" + cssom "^0.4.4" memoize-one@^5.1.1: version "5.1.1" @@ -8446,11 +8520,6 @@ meow@^3.7.0: redent "^1.0.0" trim-newlines "^1.0.0" -merge-class-names@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/merge-class-names/-/merge-class-names-1.3.0.tgz#c4cdc1a981a81dd9afc27aa4287e912a337c5dee" - integrity sha512-k0Qaj36VBpKgdc8c188LEZvo6v/zzry/FUufwopWbMSp6/knfVFU/KIB55/hJjeIpg18IH2WskXJCRnM/1BrdQ== - merge-deep@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/merge-deep/-/merge-deep-3.0.2.tgz#f39fa100a4f1bd34ff29f7d2bf4508fbb8d83ad2" @@ -8471,11 +8540,11 @@ 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: +methods@^1.1.2, methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= @@ -8504,6 +8573,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" @@ -8512,41 +8586,40 @@ 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" 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== +mime@^2.4.4, mime@^2.4.6: + 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: +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" @@ -8558,14 +8631,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: @@ -8585,17 +8656,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== @@ -8615,34 +8676,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" @@ -8675,24 +8721,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.5, 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" @@ -8745,9 +8789,9 @@ 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" @@ -8763,6 +8807,13 @@ nano-css@^5.2.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" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" @@ -8786,9 +8837,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" @@ -8796,24 +8847,20 @@ 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== + +netmask@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/netmask/-/netmask-1.0.6.tgz#20297e89d86f6f6400f250d9f4f6b4c1945fcd35" + integrity sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU= next-tick@~1.0.0: version "1.0.0" @@ -8833,10 +8880,10 @@ no-case@^3.0.3: lower-case "^2.0.1" tslib "^1.10.0" -node-ensure@^0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/node-ensure/-/node-ensure-0.0.0.tgz#ecae764150de99861ec5c810fd5d096b183932a7" - integrity sha1-7K52QVDemYYexcgQ/V0Jaxg5Mqc= +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== node-fetch@^1.0.1: version "1.7.3" @@ -8919,40 +8966,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" @@ -8968,7 +8990,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" @@ -8979,14 +9001,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" @@ -9029,27 +9043,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" @@ -9057,7 +9050,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== @@ -9094,7 +9087,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= @@ -9114,14 +9107,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" @@ -9150,14 +9146,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: @@ -9200,12 +9195,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" @@ -9234,17 +9227,17 @@ onetime@^5.1.0: 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== + 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" -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.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/open/-/open-7.2.0.tgz#212959bd7b0ce2e8e3676adc76e3cf2f0a2498b4" + integrity sha512-4HeyhxCvBTI5uBePsAdi55C5fmqnWZ2e2MlmvWi5KW5tdH5rxoiv/aMtbeVxKZc3eWkT1GymMnLG8XC4Rq4TDQ== dependencies: is-docker "^2.0.0" is-wsl "^2.1.1" @@ -9263,6 +9256,13 @@ optimism@^0.10.0: 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" @@ -9283,11 +9283,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" @@ -9305,28 +9300,12 @@ 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" - 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.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= -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== @@ -9334,11 +9313,6 @@ osenv@0, osenv@^0.1.4: os-homedir "^1.0.0" os-tmpdir "^1.0.0" -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" @@ -9351,11 +9325,6 @@ p-finally@^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" @@ -9363,10 +9332,10 @@ p-limit@^1.1.0: 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== +p-limit@^2.0.0, p-limit@^2.2.0, p-limit@^2.3.0: + 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" @@ -9425,6 +9394,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@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-3.0.1.tgz#115b1e58f92576cac2eba718593ca7b0e37de2ad" + integrity sha512-44DUg21G/liUZ48dJpUSjZnFfZro/0K5JTyFYLBcmh9+T6Ooi4/i4efwUiEy0+4oQusCBqWdhv16XohIj1GqnQ== + dependencies: + agent-base "^4.2.0" + debug "^4.1.1" + get-uri "^2.0.0" + http-proxy-agent "^2.1.0" + https-proxy-agent "^3.0.0" + pac-resolver "^3.0.0" + raw-body "^2.2.0" + socks-proxy-agent "^4.0.1" + +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" + pako@~1.0.5: version "1.0.11" resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" @@ -9454,7 +9448,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== @@ -9619,9 +9613,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" @@ -9629,28 +9623,27 @@ pbkdf2@^3.0.3: safe-buffer "^5.0.1" sha.js "^2.4.8" -pdfjs-dist@2.1.266: - version "2.1.266" - resolved "https://registry.yarnpkg.com/pdfjs-dist/-/pdfjs-dist-2.1.266.tgz#cded02268b389559e807f410d2a729db62160026" - integrity sha512-Jy7o1wE3NezPxozexSbq4ltuLT0Z21ew/qrEiAEeUZzHxMHGk4DUV1D7RuCXg5vJDvHmjX1YssN+we9QfRRgXQ== - dependencies: - node-ensure "^0.0.0" - worker-loader "^2.0.0" - -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.15: + version "2.4.15" + resolved "https://registry.yarnpkg.com/phone/-/phone-2.4.15.tgz#4ab158ac011c8107e873d7b1d12abcc88fda6bf3" + integrity sha512-C1/0wWjwSOxoqYcwMtnb8KhxaFUhBIg0srDa9WZ5mBeCMkmUhC9jJIrWzUQnJdaM5bagLp9wmNHzKPVjLCF0kg== + +pick-util@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/pick-util/-/pick-util-1.1.2.tgz#92598c8b4ea035a6f5e9e1a4676c3c1cf1960b84" + integrity sha512-oNlBxOhuENySDSCl9QDjFQES+p3GUpCV+DbUNwnJrgGoHGu6kjj7M6++ryuqKhwkCOg0X/rlaSbV1VTnuVcLzw== + dependencies: + "@jonkemp/package-utils" "^1.0.4" + +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" @@ -9738,14 +9731,14 @@ popper.js@^1.15.0: resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1.tgz#2a223cb3dc7b6213d740e40372be40de43e65b1b" 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== +portfinder@^1.0.26: + version "1.0.28" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778" + integrity sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA== dependencies: async "^2.6.2" debug "^3.1.1" - mkdirp "^0.5.1" + mkdirp "^0.5.5" posix-character-classes@^0.1.0: version "0.1.1" @@ -10084,9 +10077,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" @@ -10381,10 +10374,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" @@ -10404,10 +10397,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" @@ -10446,11 +10439,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" @@ -10476,24 +10464,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" @@ -10507,7 +10488,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.1, 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== @@ -10516,20 +10497,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" @@ -10541,8 +10512,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: @@ -10553,6 +10524,25 @@ proxy-addr@~2.0.5: forwarded "~0.1.2" ipaddr.js "1.9.1" +proxy-agent@3: + version "3.1.1" + resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-3.1.1.tgz#7e04e06bf36afa624a1540be247b47c970bd3014" + integrity sha512-WudaR0eTsDx33O3EJE16PjBRZWcX8GqCEeERw1W3hZJgH/F2a46g7jty6UGty6NeJ4CKQy8ds2CJPMiyeqaTvw== + dependencies: + agent-base "^4.2.0" + debug "4" + http-proxy-agent "^2.1.0" + https-proxy-agent "^3.0.0" + lru-cache "^5.1.1" + pac-proxy-agent "^3.0.1" + proxy-from-env "^1.0.0" + socks-proxy-agent "^4.0.1" + +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== + prr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" @@ -10564,9 +10554,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" @@ -10630,6 +10620,11 @@ 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.4: + version "6.9.4" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.4.tgz#9090b290d1f91728d3c22e54843ca44aea5ab687" + integrity sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ== + qs@~6.5.2: version "6.5.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" @@ -10643,6 +10638,15 @@ query-string@^4.1.0: object-assign "^4.1.0" strict-uri-encode "^1.0.0" +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" + strict-uri-encode "^2.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" @@ -10658,7 +10662,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== @@ -10678,7 +10687,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== @@ -10708,376 +10717,462 @@ 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== +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" + +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.1" + resolved "https://registry.yarnpkg.com/rc-dialog/-/rc-dialog-8.1.1.tgz#ce54bd78e940c030b69d3acfc87874536966a27b" + integrity sha512-ToyHiMlV94z8LfnmeKoVvu04Pd9+HdwwSHhY2a8IWeYGA5Cjk1WyIZvS+njCsm8rSMM4NqPqFkMZA0N/Iw0NrQ== 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-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: + rc-animate "3.x" + rc-util "^5.0.1" + +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.10.0: + version "1.10.1" + resolved "https://registry.yarnpkg.com/rc-field-form/-/rc-field-form-1.10.1.tgz#f6eb76b5f24b58938ebadfc03cdd814c24de7db3" + integrity sha512-aosTtNTqLYX2jsG5GyCv7axe+b57XH73T7TmmrX/cmhemhtFjvNE6RkRkmtP9VOJnZg5YGC5HfK172cnJ1Ij7Q== 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-image@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rc-image/-/rc-image-3.0.2.tgz#5f57cc08a0cfe41a6a56c6c81a094f1f5c5272dc" + integrity sha512-kzUQw0EuxjTatIY6ZJXLtwtm9jDPUK6RnQ8HBxWPCZl1trgEbddU9TwxLfyNs030qztD1j/2juRCYKsEiSgAKQ== dependencies: - babel-runtime "6.x" - hammerjs "^2.0.8" - prop-types "^15.5.9" + "@ant-design/icons" "^4.2.2" + "@babel/runtime" "^7.11.2" + classnames "^2.2.6" + rc-dialog "^8.1.0" + rc-util "^5.0.6" -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== +rc-input-number@~6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/rc-input-number/-/rc-input-number-6.0.0.tgz#0c0af57c8183f3ca6b87f7edf6fed3bd5a3ba16f" + integrity sha512-vbe+g7HvR/joknSnvLkBTi9N9I+LsV4kljfuog8WNiS7OAF3aEN0QcHSOQ4+xk6+Hx9P1tU63z2+TyEx8W/j2Q== dependencies: - babel-runtime "6.x" - classnames "^2.2.0" - prop-types "^15.5.7" - rc-util "^4.5.1" - rmc-feedback "^2.0.0" + "@babel/runtime" "^7.10.1" + classnames "^2.2.5" + 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: + 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-menu@~8.5.2: + version "8.5.2" + resolved "https://registry.yarnpkg.com/rc-menu/-/rc-menu-8.5.2.tgz#fa43bccabfcf422b9d3cdfcae5b71da08bab7e54" + integrity sha512-GPtr7qoCynVEkFgco/9cW0z/xU33GV89Q6r8FgEkrdhaQSJzuSC+v8pv+Bll5fVGQlJyJgOVqiKk7l2Knk1jYg== dependencies: + "@babel/runtime" "^7.10.1" classnames "2.x" - rc-animate "2.x" - rc-util "^4.0.4" + mini-store "^3.0.1" + omit.js "^2.0.0" + rc-motion "^1.0.1" + rc-trigger "^4.4.0" + rc-util "^5.0.1" + resize-observer-polyfill "^1.5.0" + shallowequal "^1.1.0" -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-motion@^1.0.0, rc-motion@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/rc-motion/-/rc-motion-1.0.1.tgz#9a9106cd8e932a25f49a3324443dada90c9b8006" + integrity sha512-+gk3bk72678cnwqsKmLTaqLNnAdvxe97SEttyGrrGH29UHiDj1tZTRwguDEAHZ9ZW44VMLmKhr2BKZqZOBPm0Q== dependencies: + "@babel/runtime" "^7.11.1" + classnames "^2.2.1" + raf "^3.4.1" + rc-util "^5.0.6" + +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 "3.x" + rc-util "^5.0.1" + +rc-pagination@~3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/rc-pagination/-/rc-pagination-3.0.3.tgz#48ce55822e153ed9f9b8961fcb3bb8ecab8df37c" + integrity sha512-xm6LsiSOAWlxferiL5e0jcun1B9vbvYzcIkqpYZR7YvC5ZrcU9KKihb+DZe3DY+oUc49xhX2qGS4D66ITHqekQ== + 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@~2.0.6: + version "2.0.7" + resolved "https://registry.yarnpkg.com/rc-picker/-/rc-picker-2.0.7.tgz#cb8a6179a3bfcd925ebfa8a178ca5d526fdfa445" + integrity sha512-0G8vSPRe4EGUx5TpKBL/4evB6N1qx6J8y2rXDqQPHetUbrLEhRSzWLIJ4RZpBNSqa0iOwLJ8RIW+a/1q8Wcopg== dependencies: + "@babel/runtime" "^7.10.1" classnames "^2.2.1" + date-fns "^2.15.0" + dayjs "^1.8.30" 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.1.1: + version "11.1.1" + resolved "https://registry.yarnpkg.com/rc-select/-/rc-select-11.1.1.tgz#c46ed5ac5d93816d587380a5607c6826d3b099d2" + integrity sha512-A2KEHVEhoq6cBdli0qNyR3M4WH7P0MDQKJC3r2QXiz0DPXa/+Ncrkmh8gh5i5WMsSPq8EPWfII7xkxDAxiWW3A== 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-motion "^1.0.1" + 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-select@~11.1.0: + version "11.1.6" + resolved "https://registry.yarnpkg.com/rc-select/-/rc-select-11.1.6.tgz#39bb7c685dc61f65d5d73554df58979587c45b16" + integrity sha512-X5kCwUGIe3uF5las4bFiXzD3F/hxs5Nz+wpf3xG6esg352ThP5kBROmMOeb91Yo2nOPZyiH6jnLsZLecnyWbZQ== dependencies: - babel-runtime "6.x" + "@babel/runtime" "^7.10.1" + classnames "2.x" + rc-motion "^1.0.1" + rc-trigger "^4.3.0" + rc-util "^5.0.1" + rc-virtual-list "^3.0.3" + warning "^4.0.3" + +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" "^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.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/rc-steps/-/rc-steps-4.1.2.tgz#370f4c6b40d3888f03b271f1628953c66eb91c04" + integrity sha512-kTPiojPtJi12Y7whRqlydRgJXQ1u9JlvGchI6xDrmOMZVpCTLpfc/18iu+aHCtCZaSnM2ENU/9lfm/naWVFcRw== 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.9.2: + version "7.9.4" + resolved "https://registry.yarnpkg.com/rc-table/-/rc-table-7.9.4.tgz#d9fd41578b1d422c8f98b772bf3f0dfcb93c5b83" + integrity sha512-af3Figjca+K3ZEzIHHc0m7jgg0Z2vdValPU2i6XEMpfrjBJIgDqkQy6qmClqQ54F0CEXaw9y2j16CI8y3jK7MQ== 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.4" 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.6.0: + version "11.6.1" + resolved "https://registry.yarnpkg.com/rc-tabs/-/rc-tabs-11.6.1.tgz#a31a277b12f807cc7bdc31476c0d21124ce93e14" + integrity sha512-fJZUOmwBo2E4WTbucCSZO/N1ZK+d9K/QchgDeycTIqxl5D/xtX0Dw/vC2DFi140OFjAy2JL7H0EmsSeOFfCgzw== 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: + rc-trigger "^4.2.1" + +rc-tree-select@~4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/rc-tree-select/-/rc-tree-select-4.1.1.tgz#2d3c61f2449de72839eddf94ab876d3f6567692f" + integrity sha512-pawxt/W1chLpjtAEQe8mXI9C9DYNMGS/BR6eBmOY8cJDK6OWSa6M88S6F0jXc+A10D/CLfHAfF1ZIj7VGse+5Q== + dependencies: + "@babel/runtime" "^7.10.1" classnames "2.x" - rc-select "^10.1.0" - rc-tree "^3.1.0" - rc-util "^4.17.0" + rc-select "^11.1.1" + rc-tree "^3.8.0" + rc-util "^5.0.5" -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== +rc-tree@^3.8.0: + version "3.8.5" + resolved "https://registry.yarnpkg.com/rc-tree/-/rc-tree-3.8.5.tgz#1f6d8c14a4f9263d5a426f7a24703a4c7be46ea3" + integrity sha512-audXUWwxyGB/4rLI4v+KuVucbc74y5t10XYQlR5WUe1J0sQuxP19+5GTb6DgrGXPxWOC6mxmkiw/xsKissE0GA== dependencies: + "@babel/runtime" "^7.10.1" classnames "2.x" - prop-types "^15.5.8" - rc-animate "^2.9.2" - rc-util "^4.11.0" + rc-motion "^1.0.0" + rc-util "^5.0.0" rc-virtual-list "^1.1.0" - react-lifecycles-compat "^3.0.4" -rc-trigger@^4.0.0, rc-trigger@~4.0.0: - 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== +rc-tree@~3.9.0: + version "3.9.1" + resolved "https://registry.yarnpkg.com/rc-tree/-/rc-tree-3.9.1.tgz#22e158300bf339abc9df625682d7b7c2d85047c0" + integrity sha512-LSLkSRT2tYEkXSdm+2Q2qvnMO2udAMgimbvdOD4Dc6ds9zfYiJWtkQTVimrvIQeS501ENH0XHzkGV07IPAp+kQ== dependencies: + "@babel/runtime" "^7.10.1" + classnames "2.x" + rc-motion "^1.0.0" + rc-util "^5.0.0" + rc-virtual-list "^2.1.1" + +rc-trigger@^4.0.0, rc-trigger@^4.2.0, rc-trigger@^4.2.1, 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" - 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" + rc-align "^4.0.0" + rc-animate "^3.0.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-trigger@^4.4.0, rc-trigger@~4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/rc-trigger/-/rc-trigger-4.4.0.tgz#52be45c7b40327b297ebacff84d69ce9285606bc" + integrity sha512-09562wc5I1JUbCdWohcFYJeLTpjKjEqH+0lY7plDtyI9yFXRngrvmqsrSJyT6Nat+C35ymD7fhwCCPq3cfUI4g== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.6" + raf "^3.4.1" + rc-align "^4.0.0" + rc-motion "^1.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== +rc-util@^5.0.4, rc-util@^5.0.7: + version "5.0.7" + resolved "https://registry.yarnpkg.com/rc-util/-/rc-util-5.0.7.tgz#125c3a2fd917803afbb685f9eadc789b085dc813" + integrity sha512-nr98b5aMqqvIqxm16nF+zC3K3f81r+HsflT5E9Encr5itRwV7Vo/5GjJMNds/WiFV33rilq7vzb3xeAbCycmwg== 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-util@^5.0.5, rc-util@^5.0.6: + version "5.0.6" + resolved "https://registry.yarnpkg.com/rc-util/-/rc-util-5.0.6.tgz#2b828bc87a818a66384b813f76a561ad4609e9b0" + integrity sha512-uLGxF9WjbpJSjd6iDnIjl8ZeMUglpcuh1DwO26aaXh++yAmlB6eIAJMUwwJCuqJvo4quCvsDPg1VkqHILc4U0A== + dependencies: + react-is "^16.12.0" + shallowequal "^1.1.0" + +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== +rc-virtual-list@^2.1.1: + version "2.1.7" + resolved "https://registry.yarnpkg.com/rc-virtual-list/-/rc-virtual-list-2.1.7.tgz#fd790696db799f5be005ca3ac3a4e34c3e26cf36" + integrity sha512-+TWTxtTTSRFDmEU1B+EdETIBlBdnoR24uZTuLiY4O5XACMH7UA0p4IMudYXRK5ens0s4070narFPj2TFM+1hrA== dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" + classnames "^2.2.6" + rc-resize-observer "^0.2.3" + rc-util "^5.0.7" -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== +rc-virtual-list@^3.0.3: + version "3.0.4" + resolved "https://registry.yarnpkg.com/rc-virtual-list/-/rc-virtual-list-3.0.4.tgz#d2d517b2c913f09ad51a6a572e496ffad887bbd2" + integrity sha512-rWNQTMLUlFKeqYZK/Zy5aXY00KKjc0YzzmY6l68t8g6f1ivalozCvvJcKhQ9Azt5HmHdiyvUODCVk1/ZQrL5KA== 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" + classnames "^2.2.6" + rc-resize-observer "^0.2.3" + rc-util "^5.0.7" + +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: + "@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" @@ -11099,10 +11194,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.1: + version "0.26.1" + resolved "https://registry.yarnpkg.com/react-big-calendar/-/react-big-calendar-0.26.1.tgz#48e26eeeee049227436bb23457025705f070105b" + integrity sha512-8OuWNUauoCEibrXcQpjP7tMo887yRujij1a5lgaYNbdJQzlmb1QTWl/+N0xgPfeLW/Nwiqnw3lYRgFoQiFjpSw== dependencies: "@babel/runtime" "^7.1.5" clsx "^1.0.4" @@ -11112,7 +11220,7 @@ 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" @@ -11146,7 +11254,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== @@ -11156,19 +11264,36 @@ 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" +react-email-editor@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/react-email-editor/-/react-email-editor-1.1.1.tgz#5a809c5588cf0a2042cf144771ef340cded36f92" + integrity sha512-8V4Iba3dSw0eTmNQlmhisPv2EsiWAwEBVvKsWFiW/BcQ1x42vchbWCNCX7ss0njMQ9r7uReSptrcy10f4MtVEA== + 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-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" resolved "https://registry.yarnpkg.com/react-grid-gallery/-/react-grid-gallery-0.5.5.tgz#1b3f3c23a190834e587ab613c96d53ec3af4f0a2" @@ -11177,43 +11302,36 @@ react-grid-gallery@^0.5.5: prop-types "^15.5.8" react-images "^0.5.16" -react-grid-layout@^0.18.3: - version "0.18.3" - resolved "https://registry.yarnpkg.com/react-grid-layout/-/react-grid-layout-0.18.3.tgz#4f9540199f35211077eae0aa5bc83096a672c39c" - integrity sha512-lHkrk941Tk5nTwZPa9uj6ttHBT0VehSHwEhWbINBJKvM1GRaFNOefvjcuxSyuCI5JWjVUP+Qm3ARt2470AlxMA== +react-grid-layout@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/react-grid-layout/-/react-grid-layout-1.0.0.tgz#85495f1e9da2e5b9dad5ece82b3052d624be709d" + integrity sha512-0gSnLQL9dYZtAlZCjIPYIqZtswnzMhIT1uip78vs3J432FLOF6LD5PmYaRm34V/s6bEpS9cMZNMcsOanwZXBEw== dependencies: classnames "2.x" lodash.isequal "^4.0.0" prop-types "^15.0.0" react-draggable "^4.0.0" - react-resizable "^1.9.0" + react-resizable "^1.10.0" -react-html-email@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/react-html-email/-/react-html-email-3.0.0.tgz#a5a51b78271a33daf9b14638e9e4c5df93f691aa" - integrity sha512-eIBmZjqoS1SLAOi/QYTHLnZSmBM5AhP/cScJGhVDHlBJFtMyiR4qBUQYQDCqRtNPDKHWGMbbS/+XHSgD+C2hng== - dependencies: - prop-types "^15.5.10" - -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.1: + version "11.7.1" + resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-11.7.1.tgz#80c993bf7c4f07937ce0e5ff4e2d7d97bfe3f42f" + integrity sha512-K7qWaQ03Nc25BqSqdKz1iGU5inwNQnDVcen/tpiILEXyd0w/z+untrsuUy5Y3PqAkwJ7m1FACwBttSSitxDKQA== 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.11.0: + version "3.11.0" + resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-3.11.0.tgz#2ca2903dfab8268ca18ebd8cc2e879921ec3b254" + integrity sha512-JRgiI/vdF6uyBgyZhVyYJUZAop95Sy4XDe/jmT3R/bKliFWpO/uZBwvSjWEdxwzec7SYbEPNPck0Kff2tUGM2Q== 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.6: + version "0.3.6" + resolved "https://registry.yarnpkg.com/react-image-file-resizer/-/react-image-file-resizer-0.3.6.tgz#9c879971da6cdef143fb3808f641061f54a974a1" + integrity sha512-/lu4KDwau9EHY5rj5NCNypIse19OeEm51dEruS0FWwSr42JKAGzIrxd4+HXJsoONf/xffShMqnRBU+bO0WFHfw== react-images@^0.5.16: version "0.5.19" @@ -11225,45 +11343,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" @@ -11284,24 +11378,36 @@ react-overlays@^2.0.0-0: uncontrollable "^7.0.0" warning "^4.0.3" -react-pdf@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/react-pdf/-/react-pdf-4.1.0.tgz#fcb874f28050fe9593c4e04652c7bff94bb1acf9" - integrity sha512-SYwkWc+vRQHfrpDls3DOgn4G+wT0mYGJRor20e28GPRW8VB+6o8WqZ4QZxsl50z+dKM7UscXFnK/02eN3NXi2g== +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: - "@babel/runtime" "^7.0.0" - lodash.once "^4.1.1" - make-event-props "^1.1.0" - merge-class-names "^1.1.1" - pdfjs-dist "2.1.266" - prop-types "^15.6.2" + 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: version "7.2.0" resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.2.0.tgz#f970f62192b3981642fec46fd0db18a074fe879d" integrity sha512-EvCAZYGfOLqwV7gh849xy9/pt55rJXPwmYvI4lilPM5rUT/1NxuuN59ipdBksRVSvz0KInbPnp4IfoXJXCqiDA== @@ -11312,7 +11418,18 @@ react-redux@^7.2.0: prop-types "^15.7.2" react-is "^16.9.0" -react-resizable@^1.9.0: +react-redux@^7.2.1: + version "7.2.1" + resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.2.1.tgz#8dedf784901014db2feca1ab633864dee68ad985" + integrity sha512-T+VfD/bvgGTUA74iW9d2i5THrDQWbweXP0AVNI8tNd1Rk5ch1rnMiJkDD67ejw7YBKM4+REvcvqRuWJb7BLuEg== + 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-resizable@^1.10.0, react-resizable@^1.10.1: 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== @@ -11320,39 +11437,49 @@ 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" 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== +react-scripts@3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/react-scripts/-/react-scripts-3.4.3.tgz#21de5eb93de41ee92cd0b85b0e1298d0bb2e6c51" + integrity sha512-oSnoWmii/iKdeQiwaO6map1lUaZLmG0xIUyb/HwCVFLT7gNbj8JZ9RmpvMCZ4fB98ZUMRfNmp/ft8uy/xD1RLA== dependencies: "@babel/core" "7.9.0" "@svgr/webpack" "4.3.3" @@ -11399,11 +11526,11 @@ react-scripts@3.4.1: sass-loader "8.0.2" semver "6.3.0" style-loader "0.23.1" - terser-webpack-plugin "2.3.5" + terser-webpack-plugin "2.3.8" ts-pnp "1.1.6" url-loader "2.3.0" webpack "4.42.0" - webpack-dev-server "3.10.3" + webpack-dev-server "3.11.0" webpack-manifest-plugin "2.2.0" workbox-webpack-plugin "4.3.1" optionalDependencies: @@ -11417,17 +11544,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== @@ -11437,26 +11574,62 @@ react-transition-group@2: prop-types "^15.6.2" react-lifecycles-compat "^3.0.4" -react-use@^13.27.1: - version "13.27.1" - resolved "https://registry.yarnpkg.com/react-use/-/react-use-13.27.1.tgz#e2ae2b708dafc7893c4772628801589aab9de370" - integrity sha512-bAwdqDMXs5lovEanXnL1izledfrPEUUv1afoTVB59eUiYcDyKul+M/dT/2WcgHjoY/R6QlrTcZoW4R7ifwvBfw== +react-trello@^2.2.8: + version "2.2.8" + resolved "https://registry.yarnpkg.com/react-trello/-/react-trello-2.2.8.tgz#8ec2010b71317ecbc75a81ab6492a67a09329115" + integrity sha512-SsEYq6z8n2FE1jP54MP7hKtOuxFTJLL4fm/NvulWKeM6Z8zZnM1FnWeZ8W84iFkAWjd1BXytOaZb0dMz3/H0RQ== dependencies: - "@types/js-cookie" "2.2.5" + autosize "^4.0.2" + classnames "^2.2.6" + immutability-helper "^2.8.1" + lodash "^4.17.11" + prop-types "^15.7.2" + 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.3: + version "15.3.3" + resolved "https://registry.yarnpkg.com/react-use/-/react-use-15.3.3.tgz#f16de7a16286c446388e8bd99680952fc3dc9a95" + integrity sha512-nYb94JbmDCaLZg3sOXmFW8HN+lXWxnl0caspXoYfZG1CON8JfLN9jMOyxRDUpm7dUq7WZ5mIept/ByqBQKJ0wQ== + dependencies: + "@types/js-cookie" "2.2.6" "@xobotyi/scrollbar-width" "1.9.5" copy-to-clipboard "^3.2.0" - fast-deep-equal "^3.1.1" + 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 "^1.10.0" + tslib "^2.0.0" -react@^16.13.1: +react-virtualized@^9.22.2: + version "9.22.2" + resolved "https://registry.yarnpkg.com/react-virtualized/-/react-virtualized-9.22.2.tgz#217a870bad91e5438f46f01a009e1d8ce1060a5a" + integrity sha512-5j4h4FhxTdOpBKtePSs1yk6LDNT4oGtUwjT7Nkh61Z8vv3fTG/XeOf8J4li1AYaexOwTXnw0HFVxsV0GBUqwRw== + dependencies: + "@babel/runtime" "^7.7.2" + clsx "^1.0.4" + dom-helpers "^5.1.3" + loose-envify "^1.4.0" + prop-types "^15.7.2" + 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== @@ -11516,7 +11689,7 @@ read-pkg@^3.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.0.6, 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: +"readable-stream@1 || 2", readable-stream@2, readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, 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== @@ -11529,7 +11702,17 @@ 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@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@^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== @@ -11547,12 +11730,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" @@ -11561,17 +11744,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" @@ -11588,6 +11783,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" @@ -11607,7 +11834,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.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/redux-state-sync/-/redux-state-sync-3.1.2.tgz#3f9dcd48d89eac85b45552cbcd31834d85e591d6" + integrity sha512-HJtyqckwb56iE2OvNOLwjW+Qnn7xA/R+jqP4mdYnSREk0bKVs4gVbE4bsiUZGOw5DzXlz5jHozg1x38gggWArQ== + 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== @@ -11620,13 +11854,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" @@ -11635,39 +11862,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" @@ -11696,21 +11910,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" @@ -11724,17 +11926,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" @@ -11748,6 +11943,15 @@ relateurl@^0.2.7: resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= +remote-content@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/remote-content/-/remote-content-1.2.3.tgz#6d175c93949df496cbacc78cf8583cc1fe229705" + integrity sha512-cxyyyURneyIeUHWLdQ+G3BLT9LP4KY0lljsuUHYh9XBVOB1R+ChmgjirEQKKE4CV9VlbqvtGZ2qOafufenoT+A== + dependencies: + proxy-from-env "^1.0.0" + superagent "^5.2.1" + superagent-proxy "^2.0.0" + 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" @@ -11828,11 +12032,6 @@ require-directory@^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" @@ -11909,9 +12108,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" @@ -11956,7 +12155,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== @@ -11970,6 +12169,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" @@ -11978,14 +12184,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" @@ -12006,12 +12204,10 @@ rtl-css-js@^1.9.0: dependencies: "@babel/runtime" "^7.1.2" -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== - dependencies: - is-promise "^2.1.0" +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" @@ -12020,10 +12216,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" @@ -12032,10 +12228,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" @@ -12044,7 +12240,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== @@ -12069,15 +12265,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" @@ -12102,14 +12298,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" @@ -12118,14 +12306,6 @@ scheduler@^0.19.1: loose-envify "^1.1.0" object-assign "^4.1.1" -schema-utils@^0.4.0: - version "0.4.7" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187" - integrity sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ== - dependencies: - ajv "^6.1.0" - ajv-keywords "^3.1.0" - schema-utils@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" @@ -12135,20 +12315,13 @@ 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.5, schema-utils@^2.6.6: + 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" - 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" + "@types/json-schema" "^7.0.4" + ajv "^6.12.2" ajv-keywords "^3.4.1" screenfull@^5.0.0: @@ -12156,12 +12329,12 @@ screenfull@^5.0.0: 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" @@ -12183,7 +12356,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== @@ -12198,6 +12371,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" @@ -12222,10 +12400,19 @@ send@0.17.1: 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== +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" + +serialize-javascript@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" + integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== + dependencies: + randombytes "^2.1.0" serve-index@^1.9.1: version "1.9.1" @@ -12270,7 +12457,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= @@ -12358,9 +12545,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" @@ -12370,9 +12557,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" @@ -12398,6 +12585,16 @@ slice-ansi@^2.1.0: astral-regex "^1.0.0" is-fullwidth-code-point "^2.0.0" +slick@^1.12.2: + version "1.12.2" + resolved "https://registry.yarnpkg.com/slick/-/slick-1.12.2.tgz#bd048ddb74de7d1ca6915faa4a57570b3550c2d7" + integrity sha1-vQSN23TefRymkV+qSldXCzVQwtc= + +smart-buffer@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.1.0.tgz#91605c25d91652f4661ea69ccf45f1b331ca21ba" + integrity sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw== + snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" @@ -12440,13 +12637,30 @@ sockjs-client@1.4.0: 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== +sockjs@0.3.20: + version "0.3.20" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.20.tgz#b26a283ec562ef8b2687b44033a4eeceac75d855" + integrity sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA== dependencies: faye-websocket "^0.10.0" - uuid "^3.0.1" + uuid "^3.4.0" + websocket-driver "0.6.5" + +socks-proxy-agent@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz#3c8991f3145b2799e70e11bd5fbc8b1963116386" + integrity sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg== + dependencies: + agent-base "~4.2.1" + socks "~2.3.2" + +socks@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.3.3.tgz#01129f0a5d534d2b897712ed8aceab7ee65d78e3" + integrity sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA== + dependencies: + ip "1.1.5" + smart-buffer "^4.1.0" sort-keys@^1.0.0: version "1.1.2" @@ -12460,23 +12674,23 @@ source-list-map@^2.0.0: resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== -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" - integrity sha512-3ECQLffCFV8QgrTqcmddLkWL4/aQs6ljYfgWCLselo5QtizOfOeUCKnS4rFn7MIrdeZLM6TZrseOtsrWZhWKoQ== +source-map-explorer@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/source-map-explorer/-/source-map-explorer-2.5.0.tgz#42e12c76743e8a0ca0579d472ea5ba623e0d0498" + integrity sha512-kWhlt0celEwwuULIY+sRoZKibc/8/Ec4ckcKThDMQW3hT7KxReYW1XktwFJIbZ2VF9Yf/hA74bcoIZOSXXQIgQ== dependencies: btoa "^1.2.1" - chalk "^3.0.0" + chalk "^4.1.0" convert-source-map "^1.7.0" - ejs "^3.0.2" + ejs "^3.1.5" escape-html "^1.0.3" glob "^7.1.6" gzip-size "^5.1.1" - lodash "^4.17.15" - open "^7.0.3" + lodash "^4.17.20" + open "^7.1.0" source-map "^0.7.3" temp "^0.9.1" - yargs "^15.3.1" + yargs "^15.4.1" source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: version "0.5.3" @@ -12490,9 +12704,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" @@ -12535,22 +12749,22 @@ sourcemap-codec@^1.4.1: 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" @@ -12572,10 +12786,10 @@ spdy-transport@^3.0.0: 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== +spdy@^4.0.2: + 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" @@ -12583,6 +12797,16 @@ spdy@^4.0.1: select-hose "^2.0.0" spdy-transport "^3.0.0" +specificity@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/specificity/-/specificity-0.4.1.tgz#aab5e645012db08ba182e151165738d00887b019" + integrity sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg== + +split-on-first@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f" + integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw== + 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" @@ -12643,9 +12867,9 @@ stack-utils@^1.0.1: integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA== stackframe@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.1.1.tgz#ffef0a3318b1b60c3b58564989aca5660729ec71" - integrity sha512-0PlYhdKh6AfFxRyK/v+6/k+/mMfyiEBbTM5L94D0ZytQnJ166wuwoTYLHFWGbs2dpA8Rgq763KGWmN1EQEYHRQ== + 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" @@ -12726,6 +12950,11 @@ strict-uri-encode@^1.0.0: resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= +strict-uri-encode@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" + integrity sha1-ucczDHBChi9rFC3CdLvMWGbONUY= + string-convert@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/string-convert/-/string-convert-0.2.1.tgz#6982cc3049fbb4cd85f8b24568b9d9bf39eeff97" @@ -12747,7 +12976,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= @@ -12756,7 +12985,7 @@ string-width@^1.0.1, string-width@^1.0.2: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.1: +"string-width@^1.0.2 || 2": version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== @@ -12803,21 +13032,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" @@ -12826,6 +13055,11 @@ string_decoder@^1.0.0, string_decoder@^1.1.1: 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" @@ -12903,14 +13137,18 @@ 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== + 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== -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= +style-data@^1.4.6: + version "1.4.6" + resolved "https://registry.yarnpkg.com/style-data/-/style-data-1.4.6.tgz#65c56095b038328f7ca9806aa4803b9198b342a5" + integrity sha512-+LaK67ydMxB9u/qoOlnb19ZEbaV5Eo2cOzLKolccNBM+2wRczAVIJnXzUZ6BM6LwyqEqFsA8+sX09zNt1MqkGw== + dependencies: + cheerio "^0.22.0" + mediaquery-text "^1.1.5" + pick-util "^1.0.1" style-loader@0.23.1: version "0.23.1" @@ -12920,14 +13158,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" @@ -12950,10 +13188,10 @@ stylis@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.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== +subscriptions-transport-ws@^0.9.18: + version "0.9.18" + resolved "https://registry.yarnpkg.com/subscriptions-transport-ws/-/subscriptions-transport-ws-0.9.18.tgz#bcf02320c911fbadb054f7f928e51c6041a37b97" + integrity sha512-tztzcBTNoEbuErsVQpTN2xUNN/efAZXyCyL5m3x4t6SKrEiTL2N8SaKWBFWM4u56pL79ULif3zjyeq+oV+nOaA== dependencies: backo2 "^1.0.2" eventemitter3 "^3.1.0" @@ -12961,6 +13199,31 @@ subscriptions-transport-ws@^0.9.16: symbol-observable "^1.0.4" ws "^5.2.0" +superagent-proxy@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/superagent-proxy/-/superagent-proxy-2.0.0.tgz#9f57515cd660e2e9ce55c0e6bd70f92eb07c3ee0" + integrity sha512-TktJma5jPdiH1BNN+reF/RMW3b8aBTCV7KlLFV0uYcREgNf3pvo7Rdt564OcFHwkGb3mYEhHuWPBhSbOwiNaYw== + dependencies: + debug "^3.1.0" + proxy-agent "3" + +superagent@^5.2.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/superagent/-/superagent-5.3.1.tgz#d62f3234d76b8138c1320e90fa83dc1850ccabf1" + integrity sha512-wjJ/MoTid2/RuGCOFtlacyGNxN9QLMgcpYLDQlWFIhhdJ93kNscFonGvrpAHSCVjRVj++DGCglocF7Aej1KHvQ== + dependencies: + component-emitter "^1.3.0" + cookiejar "^2.1.2" + debug "^4.1.1" + fast-safe-stringify "^2.0.7" + form-data "^3.0.0" + formidable "^1.2.2" + methods "^1.1.2" + mime "^2.4.6" + qs "^6.9.4" + readable-stream "^3.6.0" + semver "^7.3.2" + supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" @@ -12988,9 +13251,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" @@ -13045,19 +13308,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" @@ -13065,40 +13315,40 @@ temp@^0.9.1: dependencies: rimraf "~2.6.2" -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== +terser-webpack-plugin@2.3.8: + version "2.3.8" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-2.3.8.tgz#894764a19b0743f2f704e7c2a848c5283a696724" + integrity sha512-/fKw3R+hWyHfYx7Bv6oPqmk4HGQcrWLtV3X6ggvPuwPNHSnzvVV51z6OaaCOus4YLjutYGOz3pEpbhe6Up2s1w== 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" + find-cache-dir "^3.3.1" + jest-worker "^25.4.0" + p-limit "^2.3.0" + schema-utils "^2.6.6" + serialize-javascript "^4.0.0" source-map "^0.6.1" - terser "^4.4.3" + terser "^4.6.12" 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== +terser@^4.1.2, terser@^4.6.12, terser@^4.6.3: + 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" @@ -13125,9 +13375,9 @@ throat@^4.0.0: integrity sha1-iQN8vJLFarGJJua6TLsgDhVnKmo= throttle-debounce@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/throttle-debounce/-/throttle-debounce-2.1.0.tgz#257e648f0a56bd9e54fe0f132c4ab8611df4e1d5" - integrity sha512-AOvyNahXQuU7NN+VVvOOX+uW6FPaWdAOdRP5HfwYxAfCzXTFKRMoIMk+n+po318+ktcChx+F1Dd91G3YHeMKyg== + 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" @@ -13142,6 +13392,11 @@ through@^2.3.6: 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= + thunky@^1.0.2: version "1.1.0" resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" @@ -13159,12 +13414,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== @@ -13191,11 +13446,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" @@ -13228,6 +13495,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" @@ -13253,6 +13527,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" @@ -13277,15 +13556,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" @@ -13318,6 +13607,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" @@ -13365,11 +13659,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" @@ -13393,20 +13682,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" @@ -13447,6 +13731,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" @@ -13507,6 +13799,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" @@ -13559,15 +13856,15 @@ utils-merge@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: +uuid@^3.3.2, uuid@^3.4.0: 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== + 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" @@ -13612,11 +13909,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" @@ -13634,21 +13931,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" @@ -13673,10 +13979,10 @@ webpack-dev-middleware@^3.7.2: 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== +webpack-dev-server@3.11.0: + version "3.11.0" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz#8f154a3bce1bcfd1cc618ef4e703278855e7ff8c" + integrity sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg== dependencies: ansi-html "0.0.7" bonjour "^3.5.0" @@ -13686,31 +13992,31 @@ webpack-dev-server@3.10.3: debug "^4.1.1" del "^4.1.1" express "^4.17.1" - html-entities "^1.2.1" + html-entities "^1.3.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" + loglevel "^1.6.8" opn "^5.5.0" p-retry "^3.0.1" - portfinder "^1.0.25" + portfinder "^1.0.26" schema-utils "^1.0.0" selfsigned "^1.10.7" semver "^6.3.0" serve-index "^1.9.1" - sockjs "0.3.19" + sockjs "0.3.20" sockjs-client "1.4.0" - spdy "^4.0.1" + spdy "^4.0.2" 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" + yargs "^13.3.2" webpack-log@^2.0.0: version "2.0.0" @@ -13767,19 +14073,26 @@ webpack@4.42.0: 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== +websocket-driver@0.6.5: + version "0.6.5" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.6.5.tgz#5cb2556ceb85f4373c6d8238aa691c8454e13a36" + integrity sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY= dependencies: - http-parser-js ">=0.4.0 <0.4.11" + websocket-extensions ">=0.1.1" + +websocket-driver@>=0.5.1: + 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.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" @@ -13794,9 +14107,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" @@ -13821,11 +14134,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" @@ -13852,11 +14160,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" @@ -14004,14 +14307,6 @@ worker-farm@^1.7.0: dependencies: errno "~0.1.7" -worker-loader@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/worker-loader/-/worker-loader-2.0.0.tgz#45fda3ef76aca815771a89107399ee4119b430ac" - integrity sha512-tnvNp4K3KQOpfRnD20m8xltE3eWh89Ye+5oj7wXEEHKac1P4oZ6p9oTj8/8ExqoSBnk9nu5Pr4nKfQ1hn2APJw== - dependencies: - loader-utils "^1.0.0" - schema-utils "^0.4.0" - worker-rpc@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/worker-rpc/-/worker-rpc-0.1.1.tgz#cb565bd6d7071a8f16660686051e969ad32f54d5" @@ -14019,14 +14314,6 @@ worker-rpc@^0.1.0: 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" @@ -14095,6 +14382,11 @@ xmlhttprequest@1.8.0: resolved "https://registry.yarnpkg.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz#67fe075c5c24fef39f9d65f5f7b7fe75171968fc" integrity sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw= +xregexp@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943" + integrity sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM= + xregexp@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.3.0.tgz#7e92e73d9174a99a59743f67a4ce879a04b5ae50" @@ -14107,12 +14399,7 @@ 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: +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== @@ -14122,7 +14409,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== @@ -14133,65 +14420,30 @@ 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" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" - integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ== +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@^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@^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@^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== - 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" - 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.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" @@ -14202,12 +14454,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== +yargs@^15.4.1: + 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" @@ -14219,49 +14471,17 @@ 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" -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/download-images.js b/download-images.js deleted file mode 100644 index b6600dcd0..000000000 --- a/download-images.js +++ /dev/null @@ -1,24 +0,0 @@ -//var JSZip = require("jszip"); -const axios = require("axios"); // to get the images -require("dotenv").config(); - -module.exports.downloadImages = async function(req, res) { - if (process.env.NODE_ENV !== "production") { - console.log("[IMAGES] Incoming Images to Download", req.body); - } - // const zip = new JSZip(); - // //res.json({ success: true }); - // req.body.images.forEach(i => { - // axios.get(i).then(r => zip.file(r)); - // // const buffer = await response.buffer(); - // // zip.file(file, buffer); - // }); - // // // Set the name of the zip file in the download - // res.setHeader("Content-Type", "application/zip"); - - // zip.generateAsync({ type: "nodebuffer" }).then( - // function(content) { - // res.send(content); - // }.bind(res) - // ); -}; 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/.eslintrc.json b/firebase/functions/.eslintrc.json deleted file mode 100644 index 6b6beb656..000000000 --- a/firebase/functions/.eslintrc.json +++ /dev/null @@ -1,123 +0,0 @@ -{ - "parserOptions": { - // Required for certain syntax usages - "ecmaVersion": 2017 - }, - "plugins": [ - "promise" - ], - "extends": "eslint:recommended", - "rules": { - // Removed rule "disallow the use of console" from recommended eslint rules - "no-console": "off", - - // Removed rule "disallow multiple spaces in regular expressions" from recommended eslint rules - "no-regex-spaces": "off", - - // Removed rule "disallow the use of debugger" from recommended eslint rules - "no-debugger": "off", - - // Removed rule "disallow unused variables" from recommended eslint rules - "no-unused-vars": "off", - - // Removed rule "disallow mixed spaces and tabs for indentation" from recommended eslint rules - "no-mixed-spaces-and-tabs": "off", - - // Removed rule "disallow the use of undeclared variables unless mentioned in /*global */ comments" from recommended eslint rules - "no-undef": "off", - - // Warn against template literal placeholder syntax in regular strings - "no-template-curly-in-string": 1, - - // Warn if return statements do not either always or never specify values - "consistent-return": 1, - - // Warn if no return statements in callbacks of array methods - "array-callback-return": 1, - - // Require the use of === and !== - "eqeqeq": 2, - - // Disallow the use of alert, confirm, and prompt - "no-alert": 2, - - // Disallow the use of arguments.caller or arguments.callee - "no-caller": 2, - - // Disallow null comparisons without type-checking operators - "no-eq-null": 2, - - // Disallow the use of eval() - "no-eval": 2, - - // Warn against extending native types - "no-extend-native": 1, - - // Warn against unnecessary calls to .bind() - "no-extra-bind": 1, - - // Warn against unnecessary labels - "no-extra-label": 1, - - // Disallow leading or trailing decimal points in numeric literals - "no-floating-decimal": 2, - - // Warn against shorthand type conversions - "no-implicit-coercion": 1, - - // Warn against function declarations and expressions inside loop statements - "no-loop-func": 1, - - // Disallow new operators with the Function object - "no-new-func": 2, - - // Warn against new operators with the String, Number, and Boolean objects - "no-new-wrappers": 1, - - // Disallow throwing literals as exceptions - "no-throw-literal": 2, - - // Require using Error objects as Promise rejection reasons - "prefer-promise-reject-errors": 2, - - // Enforce “for” loop update clause moving the counter in the right direction - "for-direction": 2, - - // Enforce return statements in getters - "getter-return": 2, - - // Disallow await inside of loops - "no-await-in-loop": 2, - - // Disallow comparing against -0 - "no-compare-neg-zero": 2, - - // Warn against catch clause parameters from shadowing variables in the outer scope - "no-catch-shadow": 1, - - // Disallow identifiers from shadowing restricted names - "no-shadow-restricted-names": 2, - - // Enforce return statements in callbacks of array methods - "callback-return": 2, - - // Require error handling in callbacks - "handle-callback-err": 2, - - // Warn against string concatenation with __dirname and __filename - "no-path-concat": 1, - - // Prefer using arrow functions for callbacks - "prefer-arrow-callback": 1, - - // Return inside each then() to create readable and reusable Promise chains. - // Forces developers to return console logs and http calls in promises. - "promise/always-return": 2, - - //Enforces the use of catch() on un-returned promises - "promise/catch-or-return": 2, - - // Warn against nested then() or catch() statements - "promise/no-nesting": 1 - } -} diff --git a/firebase/functions/.eslintrc.jsonx b/firebase/functions/.eslintrc.jsonx new file mode 100644 index 000000000..5cb11cd2e --- /dev/null +++ b/firebase/functions/.eslintrc.jsonx @@ -0,0 +1,123 @@ +// { +// "parserOptions": { +// // Required for certain syntax usages +// "ecmaVersion": 2017 +// }, +// "plugins": [ +// "promise" +// ], +// "extends": "eslint:recommended", +// "rules": { +// // Removed rule "disallow the use of console" from recommended eslint rules +// "no-console": "off", + +// // Removed rule "disallow multiple spaces in regular expressions" from recommended eslint rules +// "no-regex-spaces": "off", + +// // Removed rule "disallow the use of debugger" from recommended eslint rules +// "no-debugger": "off", + +// // Removed rule "disallow unused variables" from recommended eslint rules +// "no-unused-vars": "off", + +// // Removed rule "disallow mixed spaces and tabs for indentation" from recommended eslint rules +// "no-mixed-spaces-and-tabs": "off", + +// // Removed rule "disallow the use of undeclared variables unless mentioned in /*global */ comments" from recommended eslint rules +// "no-undef": "off", + +// // Warn against template literal placeholder syntax in regular strings +// "no-template-curly-in-string": 1, + +// // Warn if return statements do not either always or never specify values +// "consistent-return": 1, + +// // Warn if no return statements in callbacks of array methods +// "array-callback-return": 1, + +// // Require the use of === and !== +// "eqeqeq": 2, + +// // Disallow the use of alert, confirm, and prompt +// "no-alert": 2, + +// // Disallow the use of arguments.caller or arguments.callee +// "no-caller": 2, + +// // Disallow null comparisons without type-checking operators +// "no-eq-null": 2, + +// // Disallow the use of eval() +// "no-eval": 2, + +// // Warn against extending native types +// "no-extend-native": 1, + +// // Warn against unnecessary calls to .bind() +// "no-extra-bind": 1, + +// // Warn against unnecessary labels +// "no-extra-label": 1, + +// // Disallow leading or trailing decimal points in numeric literals +// "no-floating-decimal": 2, + +// // Warn against shorthand type conversions +// "no-implicit-coercion": 1, + +// // Warn against function declarations and expressions inside loop statements +// "no-loop-func": 1, + +// // Disallow new operators with the Function object +// "no-new-func": 2, + +// // Warn against new operators with the String, Number, and Boolean objects +// "no-new-wrappers": 1, + +// // Disallow throwing literals as exceptions +// "no-throw-literal": 2, + +// // Require using Error objects as Promise rejection reasons +// "prefer-promise-reject-errors": 2, + +// // Enforce “for” loop update clause moving the counter in the right direction +// "for-direction": 2, + +// // Enforce return statements in getters +// "getter-return": 2, + +// // Disallow await inside of loops +// "no-await-in-loop": 2, + +// // Disallow comparing against -0 +// "no-compare-neg-zero": 2, + +// // Warn against catch clause parameters from shadowing variables in the outer scope +// "no-catch-shadow": 1, + +// // Disallow identifiers from shadowing restricted names +// "no-shadow-restricted-names": 2, + +// // Enforce return statements in callbacks of array methods +// "callback-return": 2, + +// // Require error handling in callbacks +// "handle-callback-err": 2, + +// // Warn against string concatenation with __dirname and __filename +// "no-path-concat": 1, + +// // Prefer using arrow functions for callbacks +// "prefer-arrow-callback": 1, + +// // Return inside each then() to create readable and reusable Promise chains. +// // Forces developers to return console logs and http calls in promises. +// "promise/always-return": 2, + +// //Enforces the use of catch() on un-returned promises +// "promise/catch-or-return": 2, + +// // Warn against nested then() or catch() statements +// "promise/no-nesting": 1 +// } +// } 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/1586216036874_update_permission_user_public_table_joblines/down.yaml b/hasura/migrations/1586216036874_update_permission_user_public_table_joblines/down.yaml new file mode 100644 index 000000000..c639e07f8 --- /dev/null +++ b/hasura/migrations/1586216036874_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: false + 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/1586216036874_update_permission_user_public_table_joblines/up.yaml b/hasura/migrations/1586216036874_update_permission_user_public_table_joblines/up.yaml new file mode 100644 index 000000000..317c3b0d8 --- /dev/null +++ b/hasura/migrations/1586216036874_update_permission_user_public_table_joblines/up.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/1586284810616_alter_table_public_bodyshops_add_column_shoprates/down.yaml b/hasura/migrations/1586284810616_alter_table_public_bodyshops_add_column_shoprates/down.yaml new file mode 100644 index 000000000..0d06fd743 --- /dev/null +++ b/hasura/migrations/1586284810616_alter_table_public_bodyshops_add_column_shoprates/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."bodyshops" DROP COLUMN "shoprates"; + type: run_sql diff --git a/hasura/migrations/1586284810616_alter_table_public_bodyshops_add_column_shoprates/up.yaml b/hasura/migrations/1586284810616_alter_table_public_bodyshops_add_column_shoprates/up.yaml new file mode 100644 index 000000000..4bc14e6fc --- /dev/null +++ b/hasura/migrations/1586284810616_alter_table_public_bodyshops_add_column_shoprates/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."bodyshops" ADD COLUMN "shoprates" jsonb NULL; + type: run_sql diff --git a/hasura/migrations/1586284824617_update_permission_user_public_table_bodyshops/down.yaml b/hasura/migrations/1586284824617_update_permission_user_public_table_bodyshops/down.yaml new file mode 100644 index 000000000..825ae0c0c --- /dev/null +++ b/hasura/migrations/1586284824617_update_permission_user_public_table_bodyshops/down.yaml @@ -0,0 +1,43 @@ +- args: + role: user + table: + name: bodyshops + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - id + - shopname + - created_at + - updated_at + - address1 + - address2 + - city + - state + - zip_post + - country + - email + - federal_tax_id + - insurance_vendor_id + - state_tax_id + - logo_img_path + - md_ro_statuses + - region_config + - md_order_statuses + - md_responsibility_centers + - messagingservicesid + 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/1586284824617_update_permission_user_public_table_bodyshops/up.yaml b/hasura/migrations/1586284824617_update_permission_user_public_table_bodyshops/up.yaml new file mode 100644 index 000000000..18a9c8a58 --- /dev/null +++ b/hasura/migrations/1586284824617_update_permission_user_public_table_bodyshops/up.yaml @@ -0,0 +1,44 @@ +- 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 + - 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/1586284834270_update_permission_user_public_table_bodyshops/down.yaml b/hasura/migrations/1586284834270_update_permission_user_public_table_bodyshops/down.yaml new file mode 100644 index 000000000..703a9ce7b --- /dev/null +++ b/hasura/migrations/1586284834270_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: + - md_order_statuses + - md_responsibility_centers + - md_ro_statuses + - address1 + - address2 + - city + - country + - email + - federal_tax_id + - insurance_vendor_id + - logo_img_path + - region_config + - shopname + - state + - state_tax_id + - zip_post + - created_at + - updated_at + - id + 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/1586284834270_update_permission_user_public_table_bodyshops/up.yaml b/hasura/migrations/1586284834270_update_permission_user_public_table_bodyshops/up.yaml new file mode 100644 index 000000000..297c7d9db --- /dev/null +++ b/hasura/migrations/1586284834270_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 + - region_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/1586365217566_alter_table_public_jobs_add_column_parts_tax_rates/down.yaml b/hasura/migrations/1586365217566_alter_table_public_jobs_add_column_parts_tax_rates/down.yaml new file mode 100644 index 000000000..9f7a0cd30 --- /dev/null +++ b/hasura/migrations/1586365217566_alter_table_public_jobs_add_column_parts_tax_rates/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."jobs" DROP COLUMN "parts_tax_rates"; + type: run_sql diff --git a/hasura/migrations/1586365217566_alter_table_public_jobs_add_column_parts_tax_rates/up.yaml b/hasura/migrations/1586365217566_alter_table_public_jobs_add_column_parts_tax_rates/up.yaml new file mode 100644 index 000000000..e5a499ab2 --- /dev/null +++ b/hasura/migrations/1586365217566_alter_table_public_jobs_add_column_parts_tax_rates/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."jobs" ADD COLUMN "parts_tax_rates" jsonb NULL; + type: run_sql diff --git a/hasura/migrations/1586365232521_update_permission_user_public_table_jobs/down.yaml b/hasura/migrations/1586365232521_update_permission_user_public_table_jobs/down.yaml new file mode 100644 index 000000000..4715fb662 --- /dev/null +++ b/hasura/migrations/1586365232521_update_permission_user_public_table_jobs/down.yaml @@ -0,0 +1,252 @@ +- 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 + - 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 + - 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/1586365232521_update_permission_user_public_table_jobs/up.yaml b/hasura/migrations/1586365232521_update_permission_user_public_table_jobs/up.yaml new file mode 100644 index 000000000..43bf2e0ab --- /dev/null +++ b/hasura/migrations/1586365232521_update_permission_user_public_table_jobs/up.yaml @@ -0,0 +1,253 @@ +- 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 + - 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/1586365248281_update_permission_user_public_table_jobs/down.yaml b/hasura/migrations/1586365248281_update_permission_user_public_table_jobs/down.yaml new file mode 100644 index 000000000..cf9388142 --- /dev/null +++ b/hasura/migrations/1586365248281_update_permission_user_public_table_jobs/down.yaml @@ -0,0 +1,250 @@ +- 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 + - 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 + - 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/1586365248281_update_permission_user_public_table_jobs/up.yaml b/hasura/migrations/1586365248281_update_permission_user_public_table_jobs/up.yaml new file mode 100644 index 000000000..1f52ac4cf --- /dev/null +++ b/hasura/migrations/1586365248281_update_permission_user_public_table_jobs/up.yaml @@ -0,0 +1,251 @@ +- 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 + - 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/1586365257227_update_permission_user_public_table_jobs/down.yaml b/hasura/migrations/1586365257227_update_permission_user_public_table_jobs/down.yaml new file mode 100644 index 000000000..87f60eed1 --- /dev/null +++ b/hasura/migrations/1586365257227_update_permission_user_public_table_jobs/down.yaml @@ -0,0 +1,252 @@ +- 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 + - 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 + - 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/1586365257227_update_permission_user_public_table_jobs/up.yaml b/hasura/migrations/1586365257227_update_permission_user_public_table_jobs/up.yaml new file mode 100644 index 000000000..68a2a7ed5 --- /dev/null +++ b/hasura/migrations/1586365257227_update_permission_user_public_table_jobs/up.yaml @@ -0,0 +1,253 @@ +- 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 + - 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/1586879989913_alter_table_public_jobs_add_column_job_totals/down.yaml b/hasura/migrations/1586879989913_alter_table_public_jobs_add_column_job_totals/down.yaml new file mode 100644 index 000000000..371308f87 --- /dev/null +++ b/hasura/migrations/1586879989913_alter_table_public_jobs_add_column_job_totals/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."jobs" DROP COLUMN "job_totals"; + type: run_sql diff --git a/hasura/migrations/1586879989913_alter_table_public_jobs_add_column_job_totals/up.yaml b/hasura/migrations/1586879989913_alter_table_public_jobs_add_column_job_totals/up.yaml new file mode 100644 index 000000000..2c1b18561 --- /dev/null +++ b/hasura/migrations/1586879989913_alter_table_public_jobs_add_column_job_totals/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."jobs" ADD COLUMN "job_totals" jsonb NULL; + type: run_sql diff --git a/hasura/migrations/1586880003979_update_permission_user_public_table_jobs/down.yaml b/hasura/migrations/1586880003979_update_permission_user_public_table_jobs/down.yaml new file mode 100644 index 000000000..43bf2e0ab --- /dev/null +++ b/hasura/migrations/1586880003979_update_permission_user_public_table_jobs/down.yaml @@ -0,0 +1,253 @@ +- 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 + - 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/1586880003979_update_permission_user_public_table_jobs/up.yaml b/hasura/migrations/1586880003979_update_permission_user_public_table_jobs/up.yaml new file mode 100644 index 000000000..785d7b5d3 --- /dev/null +++ b/hasura/migrations/1586880003979_update_permission_user_public_table_jobs/up.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/1586880014259_update_permission_user_public_table_jobs/down.yaml b/hasura/migrations/1586880014259_update_permission_user_public_table_jobs/down.yaml new file mode 100644 index 000000000..1f52ac4cf --- /dev/null +++ b/hasura/migrations/1586880014259_update_permission_user_public_table_jobs/down.yaml @@ -0,0 +1,251 @@ +- 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 + - 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/1586880014259_update_permission_user_public_table_jobs/up.yaml b/hasura/migrations/1586880014259_update_permission_user_public_table_jobs/up.yaml new file mode 100644 index 000000000..4364ff937 --- /dev/null +++ b/hasura/migrations/1586880014259_update_permission_user_public_table_jobs/up.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/1586880020786_update_permission_user_public_table_jobs/down.yaml b/hasura/migrations/1586880020786_update_permission_user_public_table_jobs/down.yaml new file mode 100644 index 000000000..68a2a7ed5 --- /dev/null +++ b/hasura/migrations/1586880020786_update_permission_user_public_table_jobs/down.yaml @@ -0,0 +1,253 @@ +- 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 + - 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/1586880020786_update_permission_user_public_table_jobs/up.yaml b/hasura/migrations/1586880020786_update_permission_user_public_table_jobs/up.yaml new file mode 100644 index 000000000..06e843cbc --- /dev/null +++ b/hasura/migrations/1586880020786_update_permission_user_public_table_jobs/up.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/1586907397057_create_table_public_timetickets/down.yaml b/hasura/migrations/1586907397057_create_table_public_timetickets/down.yaml new file mode 100644 index 000000000..882adffb8 --- /dev/null +++ b/hasura/migrations/1586907397057_create_table_public_timetickets/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: DROP TABLE "public"."timetickets"; + type: run_sql diff --git a/hasura/migrations/1586907397057_create_table_public_timetickets/up.yaml b/hasura/migrations/1586907397057_create_table_public_timetickets/up.yaml new file mode 100644 index 000000000..06a8b6c21 --- /dev/null +++ b/hasura/migrations/1586907397057_create_table_public_timetickets/up.yaml @@ -0,0 +1,29 @@ +- 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\".\"timetickets\"(\"id\" uuid NOT NULL DEFAULT gen_random_uuid(), + \"created_at\" timestamptz NOT NULL DEFAULT now(), \"updated_at\" timestamptz + NOT NULL DEFAULT now(), \"date\" date NOT NULL DEFAULT now(), \"cost_center\" + text NOT NULL, \"employeeid\" uuid NOT NULL, \"jobid\" uuid NOT NULL, \"rate\" + numeric NOT NULL DEFAULT 0, \"productivehrs\" numeric NOT NULL DEFAULT 0, \"actualhrs\" + numeric NOT NULL DEFAULT 0, \"clockon\" timestamptz, \"clockoff\" timestamptz, + \"ciecacode\" text NOT NULL, PRIMARY KEY (\"id\") , FOREIGN KEY (\"employeeid\") + REFERENCES \"public\".\"employees\"(\"id\") ON UPDATE restrict ON DELETE restrict, + 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_timetickets_updated_at\"\nBEFORE + UPDATE ON \"public\".\"timetickets\"\nFOR EACH ROW\nEXECUTE PROCEDURE \"public\".\"set_current_timestamp_updated_at\"();\nCOMMENT + ON TRIGGER \"set_public_timetickets_updated_at\" ON \"public\".\"timetickets\" + \nIS 'trigger to set value of column \"updated_at\" to current timestamp on + row update';" + type: run_sql +- args: + name: timetickets + schema: public + type: add_existing_table_or_view diff --git a/hasura/migrations/1586907431308_track_all_relationships/down.yaml b/hasura/migrations/1586907431308_track_all_relationships/down.yaml new file mode 100644 index 000000000..1e6704090 --- /dev/null +++ b/hasura/migrations/1586907431308_track_all_relationships/down.yaml @@ -0,0 +1,24 @@ +- args: + relationship: timetickets + table: + name: employees + schema: public + type: drop_relationship +- args: + relationship: timetickets + table: + name: jobs + schema: public + type: drop_relationship +- args: + relationship: job + table: + name: timetickets + schema: public + type: drop_relationship +- args: + relationship: employee + table: + name: timetickets + schema: public + type: drop_relationship diff --git a/hasura/migrations/1586907431308_track_all_relationships/up.yaml b/hasura/migrations/1586907431308_track_all_relationships/up.yaml new file mode 100644 index 000000000..5c7630853 --- /dev/null +++ b/hasura/migrations/1586907431308_track_all_relationships/up.yaml @@ -0,0 +1,40 @@ +- args: + name: timetickets + table: + name: employees + schema: public + using: + foreign_key_constraint_on: + column: employeeid + table: + name: timetickets + schema: public + type: create_array_relationship +- args: + name: timetickets + table: + name: jobs + schema: public + using: + foreign_key_constraint_on: + column: jobid + table: + name: timetickets + schema: public + type: create_array_relationship +- args: + name: job + table: + name: timetickets + schema: public + using: + foreign_key_constraint_on: jobid + type: create_object_relationship +- args: + name: employee + table: + name: timetickets + schema: public + using: + foreign_key_constraint_on: employeeid + type: create_object_relationship diff --git a/hasura/migrations/1586907537557_update_permission_user_public_table_timetickets/down.yaml b/hasura/migrations/1586907537557_update_permission_user_public_table_timetickets/down.yaml new file mode 100644 index 000000000..fdcea370b --- /dev/null +++ b/hasura/migrations/1586907537557_update_permission_user_public_table_timetickets/down.yaml @@ -0,0 +1,6 @@ +- args: + role: user + table: + name: timetickets + schema: public + type: drop_insert_permission diff --git a/hasura/migrations/1586907537557_update_permission_user_public_table_timetickets/up.yaml b/hasura/migrations/1586907537557_update_permission_user_public_table_timetickets/up.yaml new file mode 100644 index 000000000..3fa31fb9f --- /dev/null +++ b/hasura/migrations/1586907537557_update_permission_user_public_table_timetickets/up.yaml @@ -0,0 +1,36 @@ +- 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 + - date + - cost_center + - employeeid + - jobid + - rate + - productivehrs + - actualhrs + - clockon + - clockoff + - ciecacode + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: timetickets + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1586907552709_update_permission_user_public_table_timetickets/down.yaml b/hasura/migrations/1586907552709_update_permission_user_public_table_timetickets/down.yaml new file mode 100644 index 000000000..270f493b2 --- /dev/null +++ b/hasura/migrations/1586907552709_update_permission_user_public_table_timetickets/down.yaml @@ -0,0 +1,6 @@ +- args: + role: user + table: + name: timetickets + schema: public + type: drop_select_permission diff --git a/hasura/migrations/1586907552709_update_permission_user_public_table_timetickets/up.yaml b/hasura/migrations/1586907552709_update_permission_user_public_table_timetickets/up.yaml new file mode 100644 index 000000000..5ad4ebe3e --- /dev/null +++ b/hasura/migrations/1586907552709_update_permission_user_public_table_timetickets/up.yaml @@ -0,0 +1,34 @@ +- 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 + limit: null + role: user + table: + name: timetickets + schema: public + type: create_select_permission diff --git a/hasura/migrations/1586907564632_update_permission_user_public_table_timetickets/down.yaml b/hasura/migrations/1586907564632_update_permission_user_public_table_timetickets/down.yaml new file mode 100644 index 000000000..2cca595cb --- /dev/null +++ b/hasura/migrations/1586907564632_update_permission_user_public_table_timetickets/down.yaml @@ -0,0 +1,6 @@ +- args: + role: user + table: + name: timetickets + schema: public + type: drop_update_permission diff --git a/hasura/migrations/1586907564632_update_permission_user_public_table_timetickets/up.yaml b/hasura/migrations/1586907564632_update_permission_user_public_table_timetickets/up.yaml new file mode 100644 index 000000000..04b050c44 --- /dev/null +++ b/hasura/migrations/1586907564632_update_permission_user_public_table_timetickets/up.yaml @@ -0,0 +1,35 @@ +- 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 + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: timetickets + schema: public + type: create_update_permission diff --git a/hasura/migrations/1586907569694_update_permission_user_public_table_timetickets/down.yaml b/hasura/migrations/1586907569694_update_permission_user_public_table_timetickets/down.yaml new file mode 100644 index 000000000..92ce7cf39 --- /dev/null +++ b/hasura/migrations/1586907569694_update_permission_user_public_table_timetickets/down.yaml @@ -0,0 +1,6 @@ +- args: + role: user + table: + name: timetickets + schema: public + type: drop_delete_permission diff --git a/hasura/migrations/1586907569694_update_permission_user_public_table_timetickets/up.yaml b/hasura/migrations/1586907569694_update_permission_user_public_table_timetickets/up.yaml new file mode 100644 index 000000000..d84cea1b8 --- /dev/null +++ b/hasura/migrations/1586907569694_update_permission_user_public_table_timetickets/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: timetickets + schema: public + type: create_delete_permission diff --git a/hasura/migrations/1587060807479_alter_table_public_bodyshops_add_column_template_header/down.yaml b/hasura/migrations/1587060807479_alter_table_public_bodyshops_add_column_template_header/down.yaml new file mode 100644 index 000000000..e96404a91 --- /dev/null +++ b/hasura/migrations/1587060807479_alter_table_public_bodyshops_add_column_template_header/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."bodyshops" DROP COLUMN "template_header"; + type: run_sql diff --git a/hasura/migrations/1587060807479_alter_table_public_bodyshops_add_column_template_header/up.yaml b/hasura/migrations/1587060807479_alter_table_public_bodyshops_add_column_template_header/up.yaml new file mode 100644 index 000000000..99b37f336 --- /dev/null +++ b/hasura/migrations/1587060807479_alter_table_public_bodyshops_add_column_template_header/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."bodyshops" ADD COLUMN "template_header" text NULL; + type: run_sql diff --git a/hasura/migrations/1587060816740_update_permission_user_public_table_bodyshops/down.yaml b/hasura/migrations/1587060816740_update_permission_user_public_table_bodyshops/down.yaml new file mode 100644 index 000000000..18a9c8a58 --- /dev/null +++ b/hasura/migrations/1587060816740_update_permission_user_public_table_bodyshops/down.yaml @@ -0,0 +1,44 @@ +- 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 + - 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/1587060816740_update_permission_user_public_table_bodyshops/up.yaml b/hasura/migrations/1587060816740_update_permission_user_public_table_bodyshops/up.yaml new file mode 100644 index 000000000..ffca2644f --- /dev/null +++ b/hasura/migrations/1587060816740_update_permission_user_public_table_bodyshops/up.yaml @@ -0,0 +1,45 @@ +- 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 + - 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/1587060828703_update_permission_user_public_table_bodyshops/down.yaml b/hasura/migrations/1587060828703_update_permission_user_public_table_bodyshops/down.yaml new file mode 100644 index 000000000..297c7d9db --- /dev/null +++ b/hasura/migrations/1587060828703_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 + - region_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/1587060828703_update_permission_user_public_table_bodyshops/up.yaml b/hasura/migrations/1587060828703_update_permission_user_public_table_bodyshops/up.yaml new file mode 100644 index 000000000..fc6bba57f --- /dev/null +++ b/hasura/migrations/1587060828703_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 + - logo_img_path + - md_order_statuses + - md_responsibility_centers + - md_ro_statuses + - messagingservicesid + - region_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/1587062110920_create_table_public_templates/down.yaml b/hasura/migrations/1587062110920_create_table_public_templates/down.yaml new file mode 100644 index 000000000..fd0fffff3 --- /dev/null +++ b/hasura/migrations/1587062110920_create_table_public_templates/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: DROP TABLE "public"."templates"; + type: run_sql diff --git a/hasura/migrations/1587062110920_create_table_public_templates/up.yaml b/hasura/migrations/1587062110920_create_table_public_templates/up.yaml new file mode 100644 index 000000000..18fbf0bab --- /dev/null +++ b/hasura/migrations/1587062110920_create_table_public_templates/up.yaml @@ -0,0 +1,24 @@ +- 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\".\"templates\"(\"id\" uuid NOT NULL DEFAULT gen_random_uuid(), + \"created_at\" timestamptz NOT NULL DEFAULT now(), \"updated_at\" timestamptz + NOT NULL DEFAULT now(), \"bodyshopid\" uuid, \"name\" text NOT NULL, \"html\" + text NOT NULL, \"query\" text NOT NULL, 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_templates_updated_at\"\nBEFORE + UPDATE ON \"public\".\"templates\"\nFOR EACH ROW\nEXECUTE PROCEDURE \"public\".\"set_current_timestamp_updated_at\"();\nCOMMENT + ON TRIGGER \"set_public_templates_updated_at\" ON \"public\".\"templates\" \nIS + 'trigger to set value of column \"updated_at\" to current timestamp on row update';" + type: run_sql +- args: + name: templates + schema: public + type: add_existing_table_or_view diff --git a/hasura/migrations/1587062123352_track_all_relationships/down.yaml b/hasura/migrations/1587062123352_track_all_relationships/down.yaml new file mode 100644 index 000000000..a170056fb --- /dev/null +++ b/hasura/migrations/1587062123352_track_all_relationships/down.yaml @@ -0,0 +1,12 @@ +- args: + relationship: templates + table: + name: bodyshops + schema: public + type: drop_relationship +- args: + relationship: bodyshop + table: + name: templates + schema: public + type: drop_relationship diff --git a/hasura/migrations/1587062123352_track_all_relationships/up.yaml b/hasura/migrations/1587062123352_track_all_relationships/up.yaml new file mode 100644 index 000000000..2c4ab676e --- /dev/null +++ b/hasura/migrations/1587062123352_track_all_relationships/up.yaml @@ -0,0 +1,20 @@ +- args: + name: templates + table: + name: bodyshops + schema: public + using: + foreign_key_constraint_on: + column: bodyshopid + table: + name: templates + schema: public + type: create_array_relationship +- args: + name: bodyshop + table: + name: templates + schema: public + using: + foreign_key_constraint_on: bodyshopid + type: create_object_relationship diff --git a/hasura/migrations/1587062292554_update_permission_user_public_table_templates/down.yaml b/hasura/migrations/1587062292554_update_permission_user_public_table_templates/down.yaml new file mode 100644 index 000000000..e02f50e10 --- /dev/null +++ b/hasura/migrations/1587062292554_update_permission_user_public_table_templates/down.yaml @@ -0,0 +1,6 @@ +- args: + role: user + table: + name: templates + schema: public + type: drop_select_permission diff --git a/hasura/migrations/1587062292554_update_permission_user_public_table_templates/up.yaml b/hasura/migrations/1587062292554_update_permission_user_public_table_templates/up.yaml new file mode 100644 index 000000000..551467acc --- /dev/null +++ b/hasura/migrations/1587062292554_update_permission_user_public_table_templates/up.yaml @@ -0,0 +1,30 @@ +- args: + permission: + allow_aggregations: false + columns: + - html + - name + - query + - created_at + - updated_at + - bodyshopid + - id + computed_fields: [] + filter: + _or: + - bodyshopid: + _is_null: true + - bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + limit: null + role: user + table: + name: templates + schema: public + type: create_select_permission diff --git a/hasura/migrations/1587062297744_update_permission_user_public_table_templates/down.yaml b/hasura/migrations/1587062297744_update_permission_user_public_table_templates/down.yaml new file mode 100644 index 000000000..5820d3827 --- /dev/null +++ b/hasura/migrations/1587062297744_update_permission_user_public_table_templates/down.yaml @@ -0,0 +1,6 @@ +- args: + role: user + table: + name: templates + schema: public + type: drop_update_permission diff --git a/hasura/migrations/1587062297744_update_permission_user_public_table_templates/up.yaml b/hasura/migrations/1587062297744_update_permission_user_public_table_templates/up.yaml new file mode 100644 index 000000000..354ddfc4d --- /dev/null +++ b/hasura/migrations/1587062297744_update_permission_user_public_table_templates/up.yaml @@ -0,0 +1,31 @@ +- args: + 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 + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: templates + schema: public + type: create_update_permission diff --git a/hasura/migrations/1587398898639_alter_table_public_bodyshops_add_column_textid/down.yaml b/hasura/migrations/1587398898639_alter_table_public_bodyshops_add_column_textid/down.yaml new file mode 100644 index 000000000..6447565eb --- /dev/null +++ b/hasura/migrations/1587398898639_alter_table_public_bodyshops_add_column_textid/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."bodyshops" DROP COLUMN "textid"; + type: run_sql diff --git a/hasura/migrations/1587398898639_alter_table_public_bodyshops_add_column_textid/up.yaml b/hasura/migrations/1587398898639_alter_table_public_bodyshops_add_column_textid/up.yaml new file mode 100644 index 000000000..b0083e8a5 --- /dev/null +++ b/hasura/migrations/1587398898639_alter_table_public_bodyshops_add_column_textid/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."bodyshops" ADD COLUMN "textid" text NULL; + type: run_sql diff --git a/hasura/migrations/1587398906593_update_permission_user_public_table_bodyshops/down.yaml b/hasura/migrations/1587398906593_update_permission_user_public_table_bodyshops/down.yaml new file mode 100644 index 000000000..ffca2644f --- /dev/null +++ b/hasura/migrations/1587398906593_update_permission_user_public_table_bodyshops/down.yaml @@ -0,0 +1,45 @@ +- 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 + - 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/1587398906593_update_permission_user_public_table_bodyshops/up.yaml b/hasura/migrations/1587398906593_update_permission_user_public_table_bodyshops/up.yaml new file mode 100644 index 000000000..f107f80d5 --- /dev/null +++ b/hasura/migrations/1587398906593_update_permission_user_public_table_bodyshops/up.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/1587398924400_update_permission_user_public_table_bodyshops/down.yaml b/hasura/migrations/1587398924400_update_permission_user_public_table_bodyshops/down.yaml new file mode 100644 index 000000000..fc6bba57f --- /dev/null +++ b/hasura/migrations/1587398924400_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 + - logo_img_path + - md_order_statuses + - md_responsibility_centers + - md_ro_statuses + - messagingservicesid + - region_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/1587398924400_update_permission_user_public_table_bodyshops/up.yaml b/hasura/migrations/1587398924400_update_permission_user_public_table_bodyshops/up.yaml new file mode 100644 index 000000000..5ae0c6dad --- /dev/null +++ b/hasura/migrations/1587398924400_update_permission_user_public_table_bodyshops/up.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/1587408177344_alter_table_public_documents_add_column_type/down.yaml b/hasura/migrations/1587408177344_alter_table_public_documents_add_column_type/down.yaml new file mode 100644 index 000000000..ffaf72873 --- /dev/null +++ b/hasura/migrations/1587408177344_alter_table_public_documents_add_column_type/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."documents" DROP COLUMN "type"; + type: run_sql diff --git a/hasura/migrations/1587408177344_alter_table_public_documents_add_column_type/up.yaml b/hasura/migrations/1587408177344_alter_table_public_documents_add_column_type/up.yaml new file mode 100644 index 000000000..a0b878812 --- /dev/null +++ b/hasura/migrations/1587408177344_alter_table_public_documents_add_column_type/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."documents" ADD COLUMN "type" text NULL; + type: run_sql diff --git a/hasura/migrations/1587408195798_update_permission_user_public_table_documents/down.yaml b/hasura/migrations/1587408195798_update_permission_user_public_table_documents/down.yaml new file mode 100644 index 000000000..3d103eca5 --- /dev/null +++ b/hasura/migrations/1587408195798_update_permission_user_public_table_documents/down.yaml @@ -0,0 +1,35 @@ +- args: + role: user + table: + name: documents + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - created_at + - id + - jobid + - key + - name + - thumb_url + - updated_at + - uploaded_by + - url + computed_fields: [] + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: documents + schema: public + type: create_select_permission diff --git a/hasura/migrations/1587408195798_update_permission_user_public_table_documents/up.yaml b/hasura/migrations/1587408195798_update_permission_user_public_table_documents/up.yaml new file mode 100644 index 000000000..f933e16a3 --- /dev/null +++ b/hasura/migrations/1587408195798_update_permission_user_public_table_documents/up.yaml @@ -0,0 +1,37 @@ +- args: + role: user + table: + name: documents + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - created_at + - id + - invoiceid + - jobid + - key + - name + - thumb_url + - type + - updated_at + - uploaded_by + - url + computed_fields: [] + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: documents + schema: public + type: create_select_permission diff --git a/hasura/migrations/1587408202367_update_permission_user_public_table_documents/down.yaml b/hasura/migrations/1587408202367_update_permission_user_public_table_documents/down.yaml new file mode 100644 index 000000000..2c0ca6648 --- /dev/null +++ b/hasura/migrations/1587408202367_update_permission_user_public_table_documents/down.yaml @@ -0,0 +1,37 @@ +- args: + role: user + table: + name: documents + 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 + - id + - jobid + - key + - name + - thumb_url + - updated_at + - uploaded_by + - url + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: documents + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1587408202367_update_permission_user_public_table_documents/up.yaml b/hasura/migrations/1587408202367_update_permission_user_public_table_documents/up.yaml new file mode 100644 index 000000000..687d76892 --- /dev/null +++ b/hasura/migrations/1587408202367_update_permission_user_public_table_documents/up.yaml @@ -0,0 +1,39 @@ +- args: + role: user + table: + name: documents + schema: public + type: drop_insert_permission +- args: + permission: + check: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - key + - name + - thumb_url + - type + - uploaded_by + - url + - created_at + - updated_at + - id + - invoiceid + - jobid + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: documents + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1587408207340_update_permission_user_public_table_documents/down.yaml b/hasura/migrations/1587408207340_update_permission_user_public_table_documents/down.yaml new file mode 100644 index 000000000..515730b23 --- /dev/null +++ b/hasura/migrations/1587408207340_update_permission_user_public_table_documents/down.yaml @@ -0,0 +1,37 @@ +- args: + role: user + table: + name: documents + schema: public + type: drop_update_permission +- args: + permission: + columns: + - created_at + - id + - jobid + - key + - name + - thumb_url + - updated_at + - uploaded_by + - url + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: documents + schema: public + type: create_update_permission diff --git a/hasura/migrations/1587408207340_update_permission_user_public_table_documents/up.yaml b/hasura/migrations/1587408207340_update_permission_user_public_table_documents/up.yaml new file mode 100644 index 000000000..1f0b95e9a --- /dev/null +++ b/hasura/migrations/1587408207340_update_permission_user_public_table_documents/up.yaml @@ -0,0 +1,39 @@ +- args: + role: user + table: + name: documents + schema: public + type: drop_update_permission +- args: + permission: + columns: + - key + - name + - thumb_url + - type + - uploaded_by + - url + - created_at + - updated_at + - id + - invoiceid + - jobid + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: documents + schema: public + type: create_update_permission diff --git a/hasura/migrations/1587417631171_run_sql_migration/down.yaml b/hasura/migrations/1587417631171_run_sql_migration/down.yaml new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/hasura/migrations/1587417631171_run_sql_migration/down.yaml @@ -0,0 +1 @@ +[] diff --git a/hasura/migrations/1587417631171_run_sql_migration/up.yaml b/hasura/migrations/1587417631171_run_sql_migration/up.yaml new file mode 100644 index 000000000..0ec8bfdb8 --- /dev/null +++ b/hasura/migrations/1587417631171_run_sql_migration/up.yaml @@ -0,0 +1,6 @@ +- args: + cascade: true + read_only: false + sql: "ALTER TABLE documents \r\nDROP COLUMN url ;\r\nALTER TABLE documents \r\nDROP + COLUMN thumb_url ;" + type: run_sql diff --git a/hasura/migrations/1587417677218_update_permission_user_public_table_documents/down.yaml b/hasura/migrations/1587417677218_update_permission_user_public_table_documents/down.yaml new file mode 100644 index 000000000..dd7923c4f --- /dev/null +++ b/hasura/migrations/1587417677218_update_permission_user_public_table_documents/down.yaml @@ -0,0 +1,6 @@ +- args: + role: user + table: + name: documents + schema: public + type: drop_insert_permission diff --git a/hasura/migrations/1587417677218_update_permission_user_public_table_documents/up.yaml b/hasura/migrations/1587417677218_update_permission_user_public_table_documents/up.yaml new file mode 100644 index 000000000..56a5dbd56 --- /dev/null +++ b/hasura/migrations/1587417677218_update_permission_user_public_table_documents/up.yaml @@ -0,0 +1,32 @@ +- 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 + - uploaded_by + - jobid + - name + - key + - invoiceid + - type + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: documents + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1587417682323_update_permission_user_public_table_documents/down.yaml b/hasura/migrations/1587417682323_update_permission_user_public_table_documents/down.yaml new file mode 100644 index 000000000..51466ca34 --- /dev/null +++ b/hasura/migrations/1587417682323_update_permission_user_public_table_documents/down.yaml @@ -0,0 +1,6 @@ +- args: + role: user + table: + name: documents + schema: public + type: drop_select_permission diff --git a/hasura/migrations/1587417682323_update_permission_user_public_table_documents/up.yaml b/hasura/migrations/1587417682323_update_permission_user_public_table_documents/up.yaml new file mode 100644 index 000000000..a0e4d6d93 --- /dev/null +++ b/hasura/migrations/1587417682323_update_permission_user_public_table_documents/up.yaml @@ -0,0 +1,30 @@ +- args: + permission: + allow_aggregations: false + columns: + - key + - name + - type + - uploaded_by + - created_at + - updated_at + - id + - invoiceid + - jobid + computed_fields: [] + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + limit: null + role: user + table: + name: documents + schema: public + type: create_select_permission diff --git a/hasura/migrations/1587417686752_update_permission_user_public_table_documents/down.yaml b/hasura/migrations/1587417686752_update_permission_user_public_table_documents/down.yaml new file mode 100644 index 000000000..d9430d461 --- /dev/null +++ b/hasura/migrations/1587417686752_update_permission_user_public_table_documents/down.yaml @@ -0,0 +1,6 @@ +- args: + role: user + table: + name: documents + schema: public + type: drop_update_permission diff --git a/hasura/migrations/1587417686752_update_permission_user_public_table_documents/up.yaml b/hasura/migrations/1587417686752_update_permission_user_public_table_documents/up.yaml new file mode 100644 index 000000000..44c270411 --- /dev/null +++ b/hasura/migrations/1587417686752_update_permission_user_public_table_documents/up.yaml @@ -0,0 +1,22 @@ +- args: + permission: + columns: [] + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + localPresets: + - key: "" + value: "" + set: {} + role: user + table: + name: documents + schema: public + type: create_update_permission 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/1596645614646_alter_table_public_vendors_alter_column_favorite/down.yaml b/hasura/migrations/1596645614646_alter_table_public_vendors_alter_column_favorite/down.yaml new file mode 100644 index 000000000..052d77739 --- /dev/null +++ b/hasura/migrations/1596645614646_alter_table_public_vendors_alter_column_favorite/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE ONLY "public"."vendors" ALTER COLUMN "favorite" DROP DEFAULT; + type: run_sql diff --git a/hasura/migrations/1596645614646_alter_table_public_vendors_alter_column_favorite/up.yaml b/hasura/migrations/1596645614646_alter_table_public_vendors_alter_column_favorite/up.yaml new file mode 100644 index 000000000..bf9a9b888 --- /dev/null +++ b/hasura/migrations/1596645614646_alter_table_public_vendors_alter_column_favorite/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE ONLY "public"."vendors" ALTER COLUMN "favorite" SET DEFAULT jsonb_build_array(); + type: run_sql diff --git a/hasura/migrations/1596730747611_run_sql_migration/down.yaml b/hasura/migrations/1596730747611_run_sql_migration/down.yaml new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/hasura/migrations/1596730747611_run_sql_migration/down.yaml @@ -0,0 +1 @@ +[] diff --git a/hasura/migrations/1596730747611_run_sql_migration/up.yaml b/hasura/migrations/1596730747611_run_sql_migration/up.yaml new file mode 100644 index 000000000..53a7fdfa3 --- /dev/null +++ b/hasura/migrations/1596730747611_run_sql_migration/up.yaml @@ -0,0 +1,14 @@ +- args: + cascade: true + read_only: false + sql: "CREATE OR REPLACE FUNCTION public.parts_status_by_job_id(jobid uuid)\n RETURNS + SETOF joblines\n LANGUAGE plpgsql\n STABLE\nAS $function$\n\nBEGIN\n if jobid + = '' then\n return query select status ,count(1), part_type from joblines + j group by status, part_type ;\n else \n return query select status ,count(1), + part_type from joblines j where j.jobid =jobid group by status, part_type;\n + \ end if;\n\n\tEND\n$function$;" + type: run_sql +- args: + name: parts_status_by_job_id + schema: public + type: track_function diff --git a/hasura/migrations/1596731037543_drop_function_public_parts_status_by_job_id/down.yaml b/hasura/migrations/1596731037543_drop_function_public_parts_status_by_job_id/down.yaml new file mode 100644 index 000000000..51ec77c06 --- /dev/null +++ b/hasura/migrations/1596731037543_drop_function_public_parts_status_by_job_id/down.yaml @@ -0,0 +1,10 @@ +- args: + cascade: false + read_only: false + sql: "CREATE OR REPLACE FUNCTION public.parts_status_by_job_id(jobid uuid)\n RETURNS + SETOF joblines\n LANGUAGE plpgsql\n STABLE\nAS $function$\n\nBEGIN\n if jobid + = '' then\n return query select status ,count(1), part_type from joblines + j group by status, part_type ;\n else \n return query select status ,count(1), + part_type from joblines j where j.jobid =jobid group by status, part_type;\n + \ end if;\n\n\tEND\n$function$;" + type: run_sql diff --git a/hasura/migrations/1596731037543_drop_function_public_parts_status_by_job_id/up.yaml b/hasura/migrations/1596731037543_drop_function_public_parts_status_by_job_id/up.yaml new file mode 100644 index 000000000..cbae152a7 --- /dev/null +++ b/hasura/migrations/1596731037543_drop_function_public_parts_status_by_job_id/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: DROP FUNCTION "public"."parts_status_by_job_id"("pg_catalog"."uuid"); + type: run_sql diff --git a/hasura/migrations/1596731045755_run_sql_migration/down.yaml b/hasura/migrations/1596731045755_run_sql_migration/down.yaml new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/hasura/migrations/1596731045755_run_sql_migration/down.yaml @@ -0,0 +1 @@ +[] diff --git a/hasura/migrations/1596731045755_run_sql_migration/up.yaml b/hasura/migrations/1596731045755_run_sql_migration/up.yaml new file mode 100644 index 000000000..a586e30dd --- /dev/null +++ b/hasura/migrations/1596731045755_run_sql_migration/up.yaml @@ -0,0 +1,14 @@ +- args: + cascade: true + read_only: false + sql: "CREATE OR REPLACE FUNCTION public.parts_status_by_job_id(jobid text)\n RETURNS + SETOF joblines\n LANGUAGE plpgsql\n STABLE\nAS $function$\n\nBEGIN\n if jobid + = '' then\n return query select status ,count(1), part_type from joblines + j group by status, part_type ;\n else \n return query select status ,count(1), + part_type from joblines j where j.jobid =jobid group by status, part_type;\n + \ end if;\n\n\tEND\n$function$;" + type: run_sql +- args: + name: parts_status_by_job_id + schema: public + type: track_function diff --git a/hasura/migrations/1596731075703_drop_function_public_parts_status_by_job_id/down.yaml b/hasura/migrations/1596731075703_drop_function_public_parts_status_by_job_id/down.yaml new file mode 100644 index 000000000..6f0c45314 --- /dev/null +++ b/hasura/migrations/1596731075703_drop_function_public_parts_status_by_job_id/down.yaml @@ -0,0 +1,10 @@ +- args: + cascade: false + read_only: false + sql: "CREATE OR REPLACE FUNCTION public.parts_status_by_job_id(jobid text)\n RETURNS + SETOF joblines\n LANGUAGE plpgsql\n STABLE\nAS $function$\n\nBEGIN\n if jobid + = '' then\n return query select status ,count(1), part_type from joblines + j group by status, part_type ;\n else \n return query select status ,count(1), + part_type from joblines j where j.jobid =jobid group by status, part_type;\n + \ end if;\n\n\tEND\n$function$;" + type: run_sql diff --git a/hasura/migrations/1596731075703_drop_function_public_parts_status_by_job_id/up.yaml b/hasura/migrations/1596731075703_drop_function_public_parts_status_by_job_id/up.yaml new file mode 100644 index 000000000..98fff7d24 --- /dev/null +++ b/hasura/migrations/1596731075703_drop_function_public_parts_status_by_job_id/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: DROP FUNCTION "public"."parts_status_by_job_id"("pg_catalog"."text"); + type: run_sql diff --git a/hasura/migrations/1596731097672_run_sql_migration/down.yaml b/hasura/migrations/1596731097672_run_sql_migration/down.yaml new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/hasura/migrations/1596731097672_run_sql_migration/down.yaml @@ -0,0 +1 @@ +[] diff --git a/hasura/migrations/1596731097672_run_sql_migration/up.yaml b/hasura/migrations/1596731097672_run_sql_migration/up.yaml new file mode 100644 index 000000000..0a659dbd5 --- /dev/null +++ b/hasura/migrations/1596731097672_run_sql_migration/up.yaml @@ -0,0 +1,14 @@ +- args: + cascade: true + read_only: false + sql: "CREATE OR REPLACE FUNCTION public.parts_status_by_job_id(jobIdVar text)\n + RETURNS SETOF joblines\n LANGUAGE plpgsql\n STABLE\nAS $function$\n\nBEGIN\n + \ if jobIdVar = '' then\n return query select status ,count(1), part_type + from joblines j group by status, part_type ;\n else \n return query select + status ,count(1), part_type from joblines j where j.jobid =jobIdVar group by + status, part_type;\n end if;\n\n\tEND\n$function$;" + type: run_sql +- args: + name: parts_status_by_job_id + schema: public + type: track_function diff --git a/hasura/migrations/1596731183831_drop_function_public_parts_status_by_job_id/down.yaml b/hasura/migrations/1596731183831_drop_function_public_parts_status_by_job_id/down.yaml new file mode 100644 index 000000000..64b09ac53 --- /dev/null +++ b/hasura/migrations/1596731183831_drop_function_public_parts_status_by_job_id/down.yaml @@ -0,0 +1,10 @@ +- args: + cascade: false + read_only: false + sql: "CREATE OR REPLACE FUNCTION public.parts_status_by_job_id(jobidvar text)\n + RETURNS SETOF joblines\n LANGUAGE plpgsql\n STABLE\nAS $function$\n\nBEGIN\n + \ if jobIdVar = '' then\n return query select status ,count(1), part_type + from joblines j group by status, part_type ;\n else \n return query select + status ,count(1), part_type from joblines j where j.jobid =jobIdVar group by + status, part_type;\n end if;\n\n\tEND\n$function$;" + type: run_sql diff --git a/hasura/migrations/1596731183831_drop_function_public_parts_status_by_job_id/up.yaml b/hasura/migrations/1596731183831_drop_function_public_parts_status_by_job_id/up.yaml new file mode 100644 index 000000000..98fff7d24 --- /dev/null +++ b/hasura/migrations/1596731183831_drop_function_public_parts_status_by_job_id/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: DROP FUNCTION "public"."parts_status_by_job_id"("pg_catalog"."text"); + type: run_sql diff --git a/hasura/migrations/1596731190786_run_sql_migration/down.yaml b/hasura/migrations/1596731190786_run_sql_migration/down.yaml new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/hasura/migrations/1596731190786_run_sql_migration/down.yaml @@ -0,0 +1 @@ +[] diff --git a/hasura/migrations/1596731190786_run_sql_migration/up.yaml b/hasura/migrations/1596731190786_run_sql_migration/up.yaml new file mode 100644 index 000000000..5a4f1b9e4 --- /dev/null +++ b/hasura/migrations/1596731190786_run_sql_migration/up.yaml @@ -0,0 +1,14 @@ +- args: + cascade: true + read_only: false + sql: "CREATE OR REPLACE FUNCTION public.parts_status_by_job_id(jobIdVar uuid)\n + RETURNS SETOF joblines\n LANGUAGE plpgsql\n STABLE\nAS $function$\n\nBEGIN\n + \ if jobIdVar = '' then\n return query select status ,count(1), part_type + from joblines j group by status, part_type ;\n else \n return query select + status ,count(1), part_type from joblines j where j.jobid =jobIdVar group by + status, part_type;\n end if;\n\n\tEND\n$function$;" + type: run_sql +- args: + name: parts_status_by_job_id + schema: public + type: track_function diff --git a/hasura/migrations/1596731313289_run_sql_migration/down.yaml b/hasura/migrations/1596731313289_run_sql_migration/down.yaml new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/hasura/migrations/1596731313289_run_sql_migration/down.yaml @@ -0,0 +1 @@ +[] diff --git a/hasura/migrations/1596731313289_run_sql_migration/up.yaml b/hasura/migrations/1596731313289_run_sql_migration/up.yaml new file mode 100644 index 000000000..56c08fdc4 --- /dev/null +++ b/hasura/migrations/1596731313289_run_sql_migration/up.yaml @@ -0,0 +1,8 @@ +- args: + cascade: true + read_only: false + sql: "CREATE OR REPLACE FUNCTION public.parts_status_by_job_id(jobidvar uuid)\n + RETURNS SETOF joblines\n LANGUAGE plpgsql\n STABLE\nAS $function$\n\nBEGIN\n + \ \n return query select status ,count(1), part_type from joblines j where + j.jobid =jobIdVar group by status, part_type;\n\n\n\tEND\n$function$;" + type: run_sql diff --git a/hasura/migrations/1596731327292_run_sql_migration/down.yaml b/hasura/migrations/1596731327292_run_sql_migration/down.yaml new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/hasura/migrations/1596731327292_run_sql_migration/down.yaml @@ -0,0 +1 @@ +[] diff --git a/hasura/migrations/1596731327292_run_sql_migration/up.yaml b/hasura/migrations/1596731327292_run_sql_migration/up.yaml new file mode 100644 index 000000000..fb2831454 --- /dev/null +++ b/hasura/migrations/1596731327292_run_sql_migration/up.yaml @@ -0,0 +1,8 @@ +- args: + cascade: true + read_only: false + sql: "CREATE OR REPLACE FUNCTION public.parts_status_by_job_id(jobidvar uuid)\n + RETURNS SETOF joblines\n LANGUAGE plpgsql\n STABLE\nAS $function$\n\nBEGIN\n + \ \n return query select status ,count(1), part_type from joblines j where + j.jobid =jobidvar group by status, part_type;\n\n\n\tEND\n$function$;" + type: run_sql diff --git a/hasura/migrations/1596731474176_drop_function_public_parts_status_by_job_id/down.yaml b/hasura/migrations/1596731474176_drop_function_public_parts_status_by_job_id/down.yaml new file mode 100644 index 000000000..3676c9dbf --- /dev/null +++ b/hasura/migrations/1596731474176_drop_function_public_parts_status_by_job_id/down.yaml @@ -0,0 +1,8 @@ +- args: + cascade: false + read_only: false + sql: "CREATE OR REPLACE FUNCTION public.parts_status_by_job_id(jobidvar uuid)\n + RETURNS SETOF joblines\n LANGUAGE plpgsql\n STABLE\nAS $function$\n\nBEGIN\n + \ \n return query select status ,count(1), part_type from joblines j where + j.jobid =jobidvar group by status, part_type;\n\n\n\tEND\n$function$;" + type: run_sql diff --git a/hasura/migrations/1596731474176_drop_function_public_parts_status_by_job_id/up.yaml b/hasura/migrations/1596731474176_drop_function_public_parts_status_by_job_id/up.yaml new file mode 100644 index 000000000..cbae152a7 --- /dev/null +++ b/hasura/migrations/1596731474176_drop_function_public_parts_status_by_job_id/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: DROP FUNCTION "public"."parts_status_by_job_id"("pg_catalog"."uuid"); + type: run_sql diff --git a/hasura/migrations/1596731602565_run_sql_migration/down.yaml b/hasura/migrations/1596731602565_run_sql_migration/down.yaml new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/hasura/migrations/1596731602565_run_sql_migration/down.yaml @@ -0,0 +1 @@ +[] diff --git a/hasura/migrations/1596731602565_run_sql_migration/up.yaml b/hasura/migrations/1596731602565_run_sql_migration/up.yaml new file mode 100644 index 000000000..f2b2470d6 --- /dev/null +++ b/hasura/migrations/1596731602565_run_sql_migration/up.yaml @@ -0,0 +1,10 @@ +- args: + cascade: true + read_only: false + sql: create view joblines_stats as select jobid, status ,count(1), part_type + from joblines j group by jobid, status, part_type ; + type: run_sql +- args: + name: joblines_stats + schema: public + type: add_existing_table_or_view diff --git a/hasura/migrations/1596731617912_rename_view_public_joblines_stats/down.yaml b/hasura/migrations/1596731617912_rename_view_public_joblines_stats/down.yaml new file mode 100644 index 000000000..eb7771d97 --- /dev/null +++ b/hasura/migrations/1596731617912_rename_view_public_joblines_stats/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: alter view "public"."joblines_status" rename to "joblines_stats"; + type: run_sql diff --git a/hasura/migrations/1596731617912_rename_view_public_joblines_stats/up.yaml b/hasura/migrations/1596731617912_rename_view_public_joblines_stats/up.yaml new file mode 100644 index 000000000..9afff91c8 --- /dev/null +++ b/hasura/migrations/1596731617912_rename_view_public_joblines_stats/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: alter view "public"."joblines_stats" rename to "joblines_status"; + type: run_sql diff --git a/hasura/migrations/1596731720387_create_relationship_job_public_table_joblines_status/down.yaml b/hasura/migrations/1596731720387_create_relationship_job_public_table_joblines_status/down.yaml new file mode 100644 index 000000000..992563b81 --- /dev/null +++ b/hasura/migrations/1596731720387_create_relationship_job_public_table_joblines_status/down.yaml @@ -0,0 +1,6 @@ +- args: + relationship: job + table: + name: joblines_status + schema: public + type: drop_relationship diff --git a/hasura/migrations/1596731720387_create_relationship_job_public_table_joblines_status/up.yaml b/hasura/migrations/1596731720387_create_relationship_job_public_table_joblines_status/up.yaml new file mode 100644 index 000000000..800097652 --- /dev/null +++ b/hasura/migrations/1596731720387_create_relationship_job_public_table_joblines_status/up.yaml @@ -0,0 +1,13 @@ +- args: + name: job + table: + name: joblines_status + schema: public + using: + manual_configuration: + column_mapping: + jobid: id + remote_table: + name: jobs + schema: public + type: create_object_relationship diff --git a/hasura/migrations/1596731789600_create_relationship_joblines_status_public_table_jobs/down.yaml b/hasura/migrations/1596731789600_create_relationship_joblines_status_public_table_jobs/down.yaml new file mode 100644 index 000000000..8a1659e18 --- /dev/null +++ b/hasura/migrations/1596731789600_create_relationship_joblines_status_public_table_jobs/down.yaml @@ -0,0 +1,6 @@ +- args: + relationship: joblines_status + table: + name: jobs + schema: public + type: drop_relationship diff --git a/hasura/migrations/1596731789600_create_relationship_joblines_status_public_table_jobs/up.yaml b/hasura/migrations/1596731789600_create_relationship_joblines_status_public_table_jobs/up.yaml new file mode 100644 index 000000000..fa8844fa1 --- /dev/null +++ b/hasura/migrations/1596731789600_create_relationship_joblines_status_public_table_jobs/up.yaml @@ -0,0 +1,13 @@ +- args: + name: joblines_status + table: + name: jobs + schema: public + using: + manual_configuration: + column_mapping: + id: jobid + remote_table: + name: joblines_status + schema: public + type: create_array_relationship diff --git a/hasura/migrations/1596731930213_update_permission_user_public_table_joblines_status/down.yaml b/hasura/migrations/1596731930213_update_permission_user_public_table_joblines_status/down.yaml new file mode 100644 index 000000000..5e0cc7891 --- /dev/null +++ b/hasura/migrations/1596731930213_update_permission_user_public_table_joblines_status/down.yaml @@ -0,0 +1,6 @@ +- args: + role: user + table: + name: joblines_status + schema: public + type: drop_select_permission diff --git a/hasura/migrations/1596731930213_update_permission_user_public_table_joblines_status/up.yaml b/hasura/migrations/1596731930213_update_permission_user_public_table_joblines_status/up.yaml new file mode 100644 index 000000000..a1969f745 --- /dev/null +++ b/hasura/migrations/1596731930213_update_permission_user_public_table_joblines_status/up.yaml @@ -0,0 +1,26 @@ +- args: + permission: + allow_aggregations: false + backend_only: false + columns: + - jobid + - status + - count + - part_type + computed_fields: [] + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + limit: null + role: user + table: + name: joblines_status + schema: public + type: create_select_permission diff --git a/hasura/migrations/1597086476520_alter_table_public_associations_add_column_authlevel/down.yaml b/hasura/migrations/1597086476520_alter_table_public_associations_add_column_authlevel/down.yaml new file mode 100644 index 000000000..8f5f5718e --- /dev/null +++ b/hasura/migrations/1597086476520_alter_table_public_associations_add_column_authlevel/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."associations" DROP COLUMN "authlevel"; + type: run_sql diff --git a/hasura/migrations/1597086476520_alter_table_public_associations_add_column_authlevel/up.yaml b/hasura/migrations/1597086476520_alter_table_public_associations_add_column_authlevel/up.yaml new file mode 100644 index 000000000..84d149f7e --- /dev/null +++ b/hasura/migrations/1597086476520_alter_table_public_associations_add_column_authlevel/up.yaml @@ -0,0 +1,6 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."associations" ADD COLUMN "authlevel" integer NOT NULL + DEFAULT 0; + type: run_sql diff --git a/hasura/migrations/1597086494884_update_permission_user_public_table_associations/down.yaml b/hasura/migrations/1597086494884_update_permission_user_public_table_associations/down.yaml new file mode 100644 index 000000000..c17e5bb8a --- /dev/null +++ b/hasura/migrations/1597086494884_update_permission_user_public_table_associations/down.yaml @@ -0,0 +1,24 @@ +- args: + role: user + table: + name: associations + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - id + - shopid + - useremail + - active + computed_fields: [] + filter: + user: + authid: + _eq: X-Hasura-User-Id + role: user + table: + name: associations + schema: public + type: create_select_permission diff --git a/hasura/migrations/1597086494884_update_permission_user_public_table_associations/up.yaml b/hasura/migrations/1597086494884_update_permission_user_public_table_associations/up.yaml new file mode 100644 index 000000000..015c4e179 --- /dev/null +++ b/hasura/migrations/1597086494884_update_permission_user_public_table_associations/up.yaml @@ -0,0 +1,25 @@ +- args: + role: user + table: + name: associations + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - active + - authlevel + - id + - shopid + - useremail + computed_fields: [] + filter: + user: + authid: + _eq: X-Hasura-User-Id + role: user + table: + name: associations + schema: public + type: create_select_permission diff --git a/hasura/migrations/1597101073656_alter_table_public_bodyshops_add_column_md_rbac/down.yaml b/hasura/migrations/1597101073656_alter_table_public_bodyshops_add_column_md_rbac/down.yaml new file mode 100644 index 000000000..b8211a7cb --- /dev/null +++ b/hasura/migrations/1597101073656_alter_table_public_bodyshops_add_column_md_rbac/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."bodyshops" DROP COLUMN "md_rbac"; + type: run_sql diff --git a/hasura/migrations/1597101073656_alter_table_public_bodyshops_add_column_md_rbac/up.yaml b/hasura/migrations/1597101073656_alter_table_public_bodyshops_add_column_md_rbac/up.yaml new file mode 100644 index 000000000..d5331b8e5 --- /dev/null +++ b/hasura/migrations/1597101073656_alter_table_public_bodyshops_add_column_md_rbac/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."bodyshops" ADD COLUMN "md_rbac" jsonb NULL; + type: run_sql diff --git a/hasura/migrations/1597101084487_alter_table_public_bodyshops_alter_column_md_notes_presets/down.yaml b/hasura/migrations/1597101084487_alter_table_public_bodyshops_alter_column_md_notes_presets/down.yaml new file mode 100644 index 000000000..b3f79f8ab --- /dev/null +++ b/hasura/migrations/1597101084487_alter_table_public_bodyshops_alter_column_md_notes_presets/down.yaml @@ -0,0 +1,6 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."bodyshops" ALTER COLUMN "md_notes_presets" DROP NOT + NULL; + type: run_sql diff --git a/hasura/migrations/1597101084487_alter_table_public_bodyshops_alter_column_md_notes_presets/up.yaml b/hasura/migrations/1597101084487_alter_table_public_bodyshops_alter_column_md_notes_presets/up.yaml new file mode 100644 index 000000000..b178e1e87 --- /dev/null +++ b/hasura/migrations/1597101084487_alter_table_public_bodyshops_alter_column_md_notes_presets/up.yaml @@ -0,0 +1,6 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."bodyshops" ALTER COLUMN "md_notes_presets" SET NOT + NULL; + type: run_sql diff --git a/hasura/migrations/1597101096084_alter_table_public_bodyshops_alter_column_md_messaging_presets/down.yaml b/hasura/migrations/1597101096084_alter_table_public_bodyshops_alter_column_md_messaging_presets/down.yaml new file mode 100644 index 000000000..adbb75c64 --- /dev/null +++ b/hasura/migrations/1597101096084_alter_table_public_bodyshops_alter_column_md_messaging_presets/down.yaml @@ -0,0 +1,6 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."bodyshops" ALTER COLUMN "md_messaging_presets" DROP + NOT NULL; + type: run_sql diff --git a/hasura/migrations/1597101096084_alter_table_public_bodyshops_alter_column_md_messaging_presets/up.yaml b/hasura/migrations/1597101096084_alter_table_public_bodyshops_alter_column_md_messaging_presets/up.yaml new file mode 100644 index 000000000..f734acf1d --- /dev/null +++ b/hasura/migrations/1597101096084_alter_table_public_bodyshops_alter_column_md_messaging_presets/up.yaml @@ -0,0 +1,6 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."bodyshops" ALTER COLUMN "md_messaging_presets" SET + NOT NULL; + type: run_sql diff --git a/hasura/migrations/1597101103779_update_permission_user_public_table_bodyshops/down.yaml b/hasura/migrations/1597101103779_update_permission_user_public_table_bodyshops/down.yaml new file mode 100644 index 000000000..00761bb0f --- /dev/null +++ b/hasura/migrations/1597101103779_update_permission_user_public_table_bodyshops/down.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/1597101103779_update_permission_user_public_table_bodyshops/up.yaml b/hasura/migrations/1597101103779_update_permission_user_public_table_bodyshops/up.yaml new file mode 100644 index 000000000..66dc3a4da --- /dev/null +++ b/hasura/migrations/1597101103779_update_permission_user_public_table_bodyshops/up.yaml @@ -0,0 +1,61 @@ +- 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_rbac + - 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/1597101110854_update_permission_user_public_table_bodyshops/down.yaml b/hasura/migrations/1597101110854_update_permission_user_public_table_bodyshops/down.yaml new file mode 100644 index 000000000..172d0cfce --- /dev/null +++ b/hasura/migrations/1597101110854_update_permission_user_public_table_bodyshops/down.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/1597101110854_update_permission_user_public_table_bodyshops/up.yaml b/hasura/migrations/1597101110854_update_permission_user_public_table_bodyshops/up.yaml new file mode 100644 index 000000000..2d3b1252f --- /dev/null +++ b/hasura/migrations/1597101110854_update_permission_user_public_table_bodyshops/up.yaml @@ -0,0 +1,55 @@ +- 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_rbac + - 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/1597428970612_alter_table_public_templates_add_column_jsontemplate/down.yaml b/hasura/migrations/1597428970612_alter_table_public_templates_add_column_jsontemplate/down.yaml new file mode 100644 index 000000000..dfa8706ce --- /dev/null +++ b/hasura/migrations/1597428970612_alter_table_public_templates_add_column_jsontemplate/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."templates" DROP COLUMN "jsontemplate"; + type: run_sql diff --git a/hasura/migrations/1597428970612_alter_table_public_templates_add_column_jsontemplate/up.yaml b/hasura/migrations/1597428970612_alter_table_public_templates_add_column_jsontemplate/up.yaml new file mode 100644 index 000000000..5ec8d4dd2 --- /dev/null +++ b/hasura/migrations/1597428970612_alter_table_public_templates_add_column_jsontemplate/up.yaml @@ -0,0 +1,6 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."templates" ADD COLUMN "jsontemplate" jsonb NULL DEFAULT + jsonb_build_object(); + type: run_sql diff --git a/hasura/migrations/1597428983824_update_permission_user_public_table_templates/down.yaml b/hasura/migrations/1597428983824_update_permission_user_public_table_templates/down.yaml new file mode 100644 index 000000000..a70f1aae7 --- /dev/null +++ b/hasura/migrations/1597428983824_update_permission_user_public_table_templates/down.yaml @@ -0,0 +1,31 @@ +- args: + role: user + table: + name: templates + schema: public + type: drop_insert_permission +- args: + 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 + set: {} + role: user + table: + name: templates + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1597428983824_update_permission_user_public_table_templates/up.yaml b/hasura/migrations/1597428983824_update_permission_user_public_table_templates/up.yaml new file mode 100644 index 000000000..029afd466 --- /dev/null +++ b/hasura/migrations/1597428983824_update_permission_user_public_table_templates/up.yaml @@ -0,0 +1,32 @@ +- args: + role: user + table: + name: templates + schema: public + type: drop_insert_permission +- args: + permission: + check: + _or: + - bodyshopid: + _is_null: true + - bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - bodyshopid + - html + - jsontemplate + - name + - query + set: {} + role: user + table: + name: templates + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1597428991518_update_permission_user_public_table_templates/down.yaml b/hasura/migrations/1597428991518_update_permission_user_public_table_templates/down.yaml new file mode 100644 index 000000000..70a94c9a6 --- /dev/null +++ b/hasura/migrations/1597428991518_update_permission_user_public_table_templates/down.yaml @@ -0,0 +1,35 @@ +- args: + role: user + table: + name: templates + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - html + - name + - query + - created_at + - updated_at + - bodyshopid + - id + computed_fields: [] + filter: + _or: + - bodyshopid: + _is_null: true + - bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: templates + schema: public + type: create_select_permission diff --git a/hasura/migrations/1597428991518_update_permission_user_public_table_templates/up.yaml b/hasura/migrations/1597428991518_update_permission_user_public_table_templates/up.yaml new file mode 100644 index 000000000..c50c223b2 --- /dev/null +++ b/hasura/migrations/1597428991518_update_permission_user_public_table_templates/up.yaml @@ -0,0 +1,36 @@ +- args: + role: user + table: + name: templates + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - bodyshopid + - created_at + - html + - id + - jsontemplate + - name + - query + - updated_at + computed_fields: [] + filter: + _or: + - bodyshopid: + _is_null: true + - bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: templates + schema: public + type: create_select_permission diff --git a/hasura/migrations/1597428999933_update_permission_user_public_table_templates/down.yaml b/hasura/migrations/1597428999933_update_permission_user_public_table_templates/down.yaml new file mode 100644 index 000000000..c97f49641 --- /dev/null +++ b/hasura/migrations/1597428999933_update_permission_user_public_table_templates/down.yaml @@ -0,0 +1,34 @@ +- args: + role: user + table: + name: templates + schema: public + type: drop_update_permission +- args: + 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 + set: {} + role: user + table: + name: templates + schema: public + type: create_update_permission diff --git a/hasura/migrations/1597428999933_update_permission_user_public_table_templates/up.yaml b/hasura/migrations/1597428999933_update_permission_user_public_table_templates/up.yaml new file mode 100644 index 000000000..4b636cbd9 --- /dev/null +++ b/hasura/migrations/1597428999933_update_permission_user_public_table_templates/up.yaml @@ -0,0 +1,35 @@ +- args: + role: user + table: + name: templates + schema: public + type: drop_update_permission +- args: + permission: + columns: + - bodyshopid + - created_at + - html + - id + - jsontemplate + - name + - query + - updated_at + filter: + _or: + - bodyshopid: + _is_null: true + - bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + set: {} + role: user + table: + name: templates + schema: public + type: create_update_permission diff --git a/hasura/migrations/1597681392700_alter_table_public_bodyshops_add_column_prodtargethrs/down.yaml b/hasura/migrations/1597681392700_alter_table_public_bodyshops_add_column_prodtargethrs/down.yaml new file mode 100644 index 000000000..d1002d052 --- /dev/null +++ b/hasura/migrations/1597681392700_alter_table_public_bodyshops_add_column_prodtargethrs/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."bodyshops" DROP COLUMN "prodtargethrs"; + type: run_sql diff --git a/hasura/migrations/1597681392700_alter_table_public_bodyshops_add_column_prodtargethrs/up.yaml b/hasura/migrations/1597681392700_alter_table_public_bodyshops_add_column_prodtargethrs/up.yaml new file mode 100644 index 000000000..3bc131951 --- /dev/null +++ b/hasura/migrations/1597681392700_alter_table_public_bodyshops_add_column_prodtargethrs/up.yaml @@ -0,0 +1,6 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."bodyshops" ADD COLUMN "prodtargethrs" numeric NOT NULL + DEFAULT 1; + type: run_sql diff --git a/hasura/migrations/1597681402689_update_permission_user_public_table_bodyshops/down.yaml b/hasura/migrations/1597681402689_update_permission_user_public_table_bodyshops/down.yaml new file mode 100644 index 000000000..66dc3a4da --- /dev/null +++ b/hasura/migrations/1597681402689_update_permission_user_public_table_bodyshops/down.yaml @@ -0,0 +1,61 @@ +- 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_rbac + - 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/1597681402689_update_permission_user_public_table_bodyshops/up.yaml b/hasura/migrations/1597681402689_update_permission_user_public_table_bodyshops/up.yaml new file mode 100644 index 000000000..715668e1d --- /dev/null +++ b/hasura/migrations/1597681402689_update_permission_user_public_table_bodyshops/up.yaml @@ -0,0 +1,62 @@ +- 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_rbac + - md_referral_sources + - md_responsibility_centers + - md_ro_statuses + - messagingservicesid + - prodtargethrs + - 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/1597681427500_update_permission_user_public_table_bodyshops/down.yaml b/hasura/migrations/1597681427500_update_permission_user_public_table_bodyshops/down.yaml new file mode 100644 index 000000000..2d3b1252f --- /dev/null +++ b/hasura/migrations/1597681427500_update_permission_user_public_table_bodyshops/down.yaml @@ -0,0 +1,55 @@ +- 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_rbac + - 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/1597681427500_update_permission_user_public_table_bodyshops/up.yaml b/hasura/migrations/1597681427500_update_permission_user_public_table_bodyshops/up.yaml new file mode 100644 index 000000000..42dbb2e30 --- /dev/null +++ b/hasura/migrations/1597681427500_update_permission_user_public_table_bodyshops/up.yaml @@ -0,0 +1,56 @@ +- 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_rbac + - md_referral_sources + - md_responsibility_centers + - md_ro_statuses + - prodtargethrs + - 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/1597686736155_update_permission_user_public_table_jobs/down.yaml b/hasura/migrations/1597686736155_update_permission_user_public_table_jobs/down.yaml new file mode 100644 index 000000000..d95c715b5 --- /dev/null +++ b/hasura/migrations/1597686736155_update_permission_user_public_table_jobs/down.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/1597686736155_update_permission_user_public_table_jobs/up.yaml b/hasura/migrations/1597686736155_update_permission_user_public_table_jobs/up.yaml new file mode 100644 index 000000000..8c91c13a8 --- /dev/null +++ b/hasura/migrations/1597686736155_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_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 + - 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/1597686746605_update_permission_user_public_table_jobs/down.yaml b/hasura/migrations/1597686746605_update_permission_user_public_table_jobs/down.yaml new file mode 100644 index 000000000..fc0bcd2fc --- /dev/null +++ b/hasura/migrations/1597686746605_update_permission_user_public_table_jobs/down.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/1597686746605_update_permission_user_public_table_jobs/up.yaml b/hasura/migrations/1597686746605_update_permission_user_public_table_jobs/up.yaml new file mode 100644 index 000000000..9b31ff1aa --- /dev/null +++ b/hasura/migrations/1597686746605_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_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 + - 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/1597686758732_update_permission_user_public_table_jobs/down.yaml b/hasura/migrations/1597686758732_update_permission_user_public_table_jobs/down.yaml new file mode 100644 index 000000000..8cf8a1bfb --- /dev/null +++ b/hasura/migrations/1597686758732_update_permission_user_public_table_jobs/down.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/1597686758732_update_permission_user_public_table_jobs/up.yaml b/hasura/migrations/1597686758732_update_permission_user_public_table_jobs/up.yaml new file mode 100644 index 000000000..f8c3ef292 --- /dev/null +++ b/hasura/migrations/1597686758732_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_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 + - 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/1597686775898_alter_table_public_jobs_drop_column_statusid/down.yaml b/hasura/migrations/1597686775898_alter_table_public_jobs_drop_column_statusid/down.yaml new file mode 100644 index 000000000..1cff06224 --- /dev/null +++ b/hasura/migrations/1597686775898_alter_table_public_jobs_drop_column_statusid/down.yaml @@ -0,0 +1,10 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."jobs" ADD COLUMN "statusid" uuid; + type: run_sql +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."jobs" ALTER COLUMN "statusid" DROP NOT NULL; + type: run_sql diff --git a/hasura/migrations/1597686775898_alter_table_public_jobs_drop_column_statusid/up.yaml b/hasura/migrations/1597686775898_alter_table_public_jobs_drop_column_statusid/up.yaml new file mode 100644 index 000000000..7344568f6 --- /dev/null +++ b/hasura/migrations/1597686775898_alter_table_public_jobs_drop_column_statusid/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."jobs" DROP COLUMN "statusid" CASCADE; + type: run_sql diff --git a/hasura/migrations/1597777830351_alter_table_public_jobs_add_column_tax_registration_number/down.yaml b/hasura/migrations/1597777830351_alter_table_public_jobs_add_column_tax_registration_number/down.yaml new file mode 100644 index 000000000..206e5c90e --- /dev/null +++ b/hasura/migrations/1597777830351_alter_table_public_jobs_add_column_tax_registration_number/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."jobs" DROP COLUMN "tax_registration_number"; + type: run_sql diff --git a/hasura/migrations/1597777830351_alter_table_public_jobs_add_column_tax_registration_number/up.yaml b/hasura/migrations/1597777830351_alter_table_public_jobs_add_column_tax_registration_number/up.yaml new file mode 100644 index 000000000..0b7ab3c17 --- /dev/null +++ b/hasura/migrations/1597777830351_alter_table_public_jobs_add_column_tax_registration_number/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."jobs" ADD COLUMN "tax_registration_number" text NULL; + type: run_sql diff --git a/hasura/migrations/1597777848218_update_permission_user_public_table_jobs/down.yaml b/hasura/migrations/1597777848218_update_permission_user_public_table_jobs/down.yaml new file mode 100644 index 000000000..8c91c13a8 --- /dev/null +++ b/hasura/migrations/1597777848218_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_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 + - 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/1597777848218_update_permission_user_public_table_jobs/up.yaml b/hasura/migrations/1597777848218_update_permission_user_public_table_jobs/up.yaml new file mode 100644 index 000000000..9b8fc8048 --- /dev/null +++ b/hasura/migrations/1597777848218_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 + - storage_payable + - tax_lbr_rt + - tax_levies_rt + - tax_paint_mat_rt + - tax_predis + - tax_prethr + - tax_pstthr + - tax_registration_number + - 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/1597777863211_update_permission_user_public_table_jobs/down.yaml b/hasura/migrations/1597777863211_update_permission_user_public_table_jobs/down.yaml new file mode 100644 index 000000000..9b31ff1aa --- /dev/null +++ b/hasura/migrations/1597777863211_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_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 + - 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/1597777863211_update_permission_user_public_table_jobs/up.yaml b/hasura/migrations/1597777863211_update_permission_user_public_table_jobs/up.yaml new file mode 100644 index 000000000..24da5a9c0 --- /dev/null +++ b/hasura/migrations/1597777863211_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 + - storage_payable + - tax_lbr_rt + - tax_levies_rt + - tax_paint_mat_rt + - tax_predis + - tax_prethr + - tax_pstthr + - tax_registration_number + - 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/1597777876008_update_permission_user_public_table_jobs/down.yaml b/hasura/migrations/1597777876008_update_permission_user_public_table_jobs/down.yaml new file mode 100644 index 000000000..f8c3ef292 --- /dev/null +++ b/hasura/migrations/1597777876008_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_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 + - 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/1597777876008_update_permission_user_public_table_jobs/up.yaml b/hasura/migrations/1597777876008_update_permission_user_public_table_jobs/up.yaml new file mode 100644 index 000000000..757c2697c --- /dev/null +++ b/hasura/migrations/1597777876008_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 + - storage_payable + - tax_lbr_rt + - tax_levies_rt + - tax_paint_mat_rt + - tax_predis + - tax_prethr + - tax_pstthr + - tax_registration_number + - 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/1597779262877_alter_table_public_jobs_add_column_class/down.yaml b/hasura/migrations/1597779262877_alter_table_public_jobs_add_column_class/down.yaml new file mode 100644 index 000000000..bb968e2b9 --- /dev/null +++ b/hasura/migrations/1597779262877_alter_table_public_jobs_add_column_class/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."jobs" DROP COLUMN "class"; + type: run_sql diff --git a/hasura/migrations/1597779262877_alter_table_public_jobs_add_column_class/up.yaml b/hasura/migrations/1597779262877_alter_table_public_jobs_add_column_class/up.yaml new file mode 100644 index 000000000..ee34154f1 --- /dev/null +++ b/hasura/migrations/1597779262877_alter_table_public_jobs_add_column_class/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."jobs" ADD COLUMN "class" text NULL; + type: run_sql diff --git a/hasura/migrations/1597779499987_alter_table_public_jobs_add_column_category/down.yaml b/hasura/migrations/1597779499987_alter_table_public_jobs_add_column_category/down.yaml new file mode 100644 index 000000000..c93ff384b --- /dev/null +++ b/hasura/migrations/1597779499987_alter_table_public_jobs_add_column_category/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."jobs" DROP COLUMN "category"; + type: run_sql diff --git a/hasura/migrations/1597779499987_alter_table_public_jobs_add_column_category/up.yaml b/hasura/migrations/1597779499987_alter_table_public_jobs_add_column_category/up.yaml new file mode 100644 index 000000000..62af969a2 --- /dev/null +++ b/hasura/migrations/1597779499987_alter_table_public_jobs_add_column_category/up.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."jobs" ADD COLUMN "category" text NULL; + type: run_sql diff --git a/hasura/migrations/1597779720123_update_permission_user_public_table_jobs/down.yaml b/hasura/migrations/1597779720123_update_permission_user_public_table_jobs/down.yaml new file mode 100644 index 000000000..9b8fc8048 --- /dev/null +++ b/hasura/migrations/1597779720123_update_permission_user_public_table_jobs/down.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 + - storage_payable + - tax_lbr_rt + - tax_levies_rt + - tax_paint_mat_rt + - tax_predis + - tax_prethr + - tax_pstthr + - tax_registration_number + - 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/1597779720123_update_permission_user_public_table_jobs/up.yaml b/hasura/migrations/1597779720123_update_permission_user_public_table_jobs/up.yaml new file mode 100644 index 000000000..9a4fd9c0e --- /dev/null +++ b/hasura/migrations/1597779720123_update_permission_user_public_table_jobs/up.yaml @@ -0,0 +1,260 @@ +- 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 + - category + - cieca_stl + - cieca_ttl + - ciecaid + - class + - 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 + - storage_payable + - tax_lbr_rt + - tax_levies_rt + - tax_paint_mat_rt + - tax_predis + - tax_prethr + - tax_pstthr + - tax_registration_number + - 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/1597779769450_update_permission_user_public_table_jobs/down.yaml b/hasura/migrations/1597779769450_update_permission_user_public_table_jobs/down.yaml new file mode 100644 index 000000000..24da5a9c0 --- /dev/null +++ b/hasura/migrations/1597779769450_update_permission_user_public_table_jobs/down.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 + - storage_payable + - tax_lbr_rt + - tax_levies_rt + - tax_paint_mat_rt + - tax_predis + - tax_prethr + - tax_pstthr + - tax_registration_number + - 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/1597779769450_update_permission_user_public_table_jobs/up.yaml b/hasura/migrations/1597779769450_update_permission_user_public_table_jobs/up.yaml new file mode 100644 index 000000000..0100f9fe3 --- /dev/null +++ b/hasura/migrations/1597779769450_update_permission_user_public_table_jobs/up.yaml @@ -0,0 +1,261 @@ +- 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 + - category + - cieca_stl + - cieca_ttl + - ciecaid + - class + - 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 + - storage_payable + - tax_lbr_rt + - tax_levies_rt + - tax_paint_mat_rt + - tax_predis + - tax_prethr + - tax_pstthr + - tax_registration_number + - 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/1597779780370_update_permission_user_public_table_jobs/down.yaml b/hasura/migrations/1597779780370_update_permission_user_public_table_jobs/down.yaml new file mode 100644 index 000000000..757c2697c --- /dev/null +++ b/hasura/migrations/1597779780370_update_permission_user_public_table_jobs/down.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 + - storage_payable + - tax_lbr_rt + - tax_levies_rt + - tax_paint_mat_rt + - tax_predis + - tax_prethr + - tax_pstthr + - tax_registration_number + - 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/1597779780370_update_permission_user_public_table_jobs/up.yaml b/hasura/migrations/1597779780370_update_permission_user_public_table_jobs/up.yaml new file mode 100644 index 000000000..d13ee33a1 --- /dev/null +++ b/hasura/migrations/1597779780370_update_permission_user_public_table_jobs/up.yaml @@ -0,0 +1,260 @@ +- 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 + - category + - cieca_stl + - cieca_ttl + - ciecaid + - class + - 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 + - storage_payable + - tax_lbr_rt + - tax_levies_rt + - tax_paint_mat_rt + - tax_predis + - tax_prethr + - tax_pstthr + - tax_registration_number + - 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/1597854452477_alter_table_public_bodyshops_add_column_md_classes/down.yaml b/hasura/migrations/1597854452477_alter_table_public_bodyshops_add_column_md_classes/down.yaml new file mode 100644 index 000000000..ab2c7f9e4 --- /dev/null +++ b/hasura/migrations/1597854452477_alter_table_public_bodyshops_add_column_md_classes/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."bodyshops" DROP COLUMN "md_classes"; + type: run_sql diff --git a/hasura/migrations/1597854452477_alter_table_public_bodyshops_add_column_md_classes/up.yaml b/hasura/migrations/1597854452477_alter_table_public_bodyshops_add_column_md_classes/up.yaml new file mode 100644 index 000000000..9fce3f75f --- /dev/null +++ b/hasura/migrations/1597854452477_alter_table_public_bodyshops_add_column_md_classes/up.yaml @@ -0,0 +1,6 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."bodyshops" ADD COLUMN "md_classes" jsonb NULL DEFAULT + jsonb_build_array(); + type: run_sql diff --git a/hasura/migrations/1597854464958_alter_table_public_bodyshops_add_column_md_categories/down.yaml b/hasura/migrations/1597854464958_alter_table_public_bodyshops_add_column_md_categories/down.yaml new file mode 100644 index 000000000..377bdd5c5 --- /dev/null +++ b/hasura/migrations/1597854464958_alter_table_public_bodyshops_add_column_md_categories/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."bodyshops" DROP COLUMN "md_categories"; + type: run_sql diff --git a/hasura/migrations/1597854464958_alter_table_public_bodyshops_add_column_md_categories/up.yaml b/hasura/migrations/1597854464958_alter_table_public_bodyshops_add_column_md_categories/up.yaml new file mode 100644 index 000000000..f00a0bca7 --- /dev/null +++ b/hasura/migrations/1597854464958_alter_table_public_bodyshops_add_column_md_categories/up.yaml @@ -0,0 +1,6 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."bodyshops" ADD COLUMN "md_categories" jsonb NULL DEFAULT + jsonb_build_array(); + type: run_sql diff --git a/hasura/migrations/1597854487005_alter_table_public_bodyshops_add_column_md_ins_cos/down.yaml b/hasura/migrations/1597854487005_alter_table_public_bodyshops_add_column_md_ins_cos/down.yaml new file mode 100644 index 000000000..529d79f74 --- /dev/null +++ b/hasura/migrations/1597854487005_alter_table_public_bodyshops_add_column_md_ins_cos/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."bodyshops" DROP COLUMN "md_ins_cos"; + type: run_sql diff --git a/hasura/migrations/1597854487005_alter_table_public_bodyshops_add_column_md_ins_cos/up.yaml b/hasura/migrations/1597854487005_alter_table_public_bodyshops_add_column_md_ins_cos/up.yaml new file mode 100644 index 000000000..0b048abd1 --- /dev/null +++ b/hasura/migrations/1597854487005_alter_table_public_bodyshops_add_column_md_ins_cos/up.yaml @@ -0,0 +1,6 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."bodyshops" ADD COLUMN "md_ins_cos" jsonb NULL DEFAULT + jsonb_build_array(); + type: run_sql diff --git a/hasura/migrations/1597854499320_update_permission_user_public_table_bodyshops/down.yaml b/hasura/migrations/1597854499320_update_permission_user_public_table_bodyshops/down.yaml new file mode 100644 index 000000000..715668e1d --- /dev/null +++ b/hasura/migrations/1597854499320_update_permission_user_public_table_bodyshops/down.yaml @@ -0,0 +1,62 @@ +- 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_rbac + - md_referral_sources + - md_responsibility_centers + - md_ro_statuses + - messagingservicesid + - prodtargethrs + - 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/1597854499320_update_permission_user_public_table_bodyshops/up.yaml b/hasura/migrations/1597854499320_update_permission_user_public_table_bodyshops/up.yaml new file mode 100644 index 000000000..f4a8dafa8 --- /dev/null +++ b/hasura/migrations/1597854499320_update_permission_user_public_table_bodyshops/up.yaml @@ -0,0 +1,65 @@ +- 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_categories + - md_classes + - md_ins_cos + - md_messaging_presets + - md_notes_presets + - md_order_statuses + - md_parts_locations + - md_rbac + - md_referral_sources + - md_responsibility_centers + - md_ro_statuses + - messagingservicesid + - prodtargethrs + - 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/1597854509708_update_permission_user_public_table_bodyshops/down.yaml b/hasura/migrations/1597854509708_update_permission_user_public_table_bodyshops/down.yaml new file mode 100644 index 000000000..42dbb2e30 --- /dev/null +++ b/hasura/migrations/1597854509708_update_permission_user_public_table_bodyshops/down.yaml @@ -0,0 +1,56 @@ +- 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_rbac + - md_referral_sources + - md_responsibility_centers + - md_ro_statuses + - prodtargethrs + - 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/1597854509708_update_permission_user_public_table_bodyshops/up.yaml b/hasura/migrations/1597854509708_update_permission_user_public_table_bodyshops/up.yaml new file mode 100644 index 000000000..cd9607890 --- /dev/null +++ b/hasura/migrations/1597854509708_update_permission_user_public_table_bodyshops/up.yaml @@ -0,0 +1,59 @@ +- 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_categories + - md_classes + - md_ins_cos + - md_messaging_presets + - md_notes_presets + - md_order_statuses + - md_parts_locations + - md_rbac + - md_referral_sources + - md_responsibility_centers + - md_ro_statuses + - prodtargethrs + - 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/1597856801481_alter_table_public_bodyshops_add_column_enforce_class/down.yaml b/hasura/migrations/1597856801481_alter_table_public_bodyshops_add_column_enforce_class/down.yaml new file mode 100644 index 000000000..7c71d8b6b --- /dev/null +++ b/hasura/migrations/1597856801481_alter_table_public_bodyshops_add_column_enforce_class/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."bodyshops" DROP COLUMN "enforce_class"; + type: run_sql diff --git a/hasura/migrations/1597856801481_alter_table_public_bodyshops_add_column_enforce_class/up.yaml b/hasura/migrations/1597856801481_alter_table_public_bodyshops_add_column_enforce_class/up.yaml new file mode 100644 index 000000000..8d0391a7d --- /dev/null +++ b/hasura/migrations/1597856801481_alter_table_public_bodyshops_add_column_enforce_class/up.yaml @@ -0,0 +1,6 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."bodyshops" ADD COLUMN "enforce_class" bool NOT NULL + DEFAULT false; + type: run_sql diff --git a/hasura/migrations/1597856850558_update_permission_user_public_table_bodyshops/down.yaml b/hasura/migrations/1597856850558_update_permission_user_public_table_bodyshops/down.yaml new file mode 100644 index 000000000..f4a8dafa8 --- /dev/null +++ b/hasura/migrations/1597856850558_update_permission_user_public_table_bodyshops/down.yaml @@ -0,0 +1,65 @@ +- 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_categories + - md_classes + - md_ins_cos + - md_messaging_presets + - md_notes_presets + - md_order_statuses + - md_parts_locations + - md_rbac + - md_referral_sources + - md_responsibility_centers + - md_ro_statuses + - messagingservicesid + - prodtargethrs + - 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/1597856850558_update_permission_user_public_table_bodyshops/up.yaml b/hasura/migrations/1597856850558_update_permission_user_public_table_bodyshops/up.yaml new file mode 100644 index 000000000..ed6ba8e94 --- /dev/null +++ b/hasura/migrations/1597856850558_update_permission_user_public_table_bodyshops/up.yaml @@ -0,0 +1,66 @@ +- 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 + - enforce_class + - federal_tax_id + - id + - inhousevendorid + - insurance_vendor_id + - intakechecklist + - invoice_tax_rates + - logo_img_path + - md_categories + - md_classes + - md_ins_cos + - md_messaging_presets + - md_notes_presets + - md_order_statuses + - md_parts_locations + - md_rbac + - md_referral_sources + - md_responsibility_centers + - md_ro_statuses + - messagingservicesid + - prodtargethrs + - 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/1597856859918_update_permission_user_public_table_bodyshops/down.yaml b/hasura/migrations/1597856859918_update_permission_user_public_table_bodyshops/down.yaml new file mode 100644 index 000000000..cd9607890 --- /dev/null +++ b/hasura/migrations/1597856859918_update_permission_user_public_table_bodyshops/down.yaml @@ -0,0 +1,59 @@ +- 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_categories + - md_classes + - md_ins_cos + - md_messaging_presets + - md_notes_presets + - md_order_statuses + - md_parts_locations + - md_rbac + - md_referral_sources + - md_responsibility_centers + - md_ro_statuses + - prodtargethrs + - 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/1597856859918_update_permission_user_public_table_bodyshops/up.yaml b/hasura/migrations/1597856859918_update_permission_user_public_table_bodyshops/up.yaml new file mode 100644 index 000000000..4614d8cf1 --- /dev/null +++ b/hasura/migrations/1597856859918_update_permission_user_public_table_bodyshops/up.yaml @@ -0,0 +1,60 @@ +- 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 + - enforce_class + - federal_tax_id + - id + - inhousevendorid + - insurance_vendor_id + - intakechecklist + - invoice_tax_rates + - logo_img_path + - md_categories + - md_classes + - md_ins_cos + - md_messaging_presets + - md_notes_presets + - md_order_statuses + - md_parts_locations + - md_rbac + - md_referral_sources + - md_responsibility_centers + - md_ro_statuses + - prodtargethrs + - 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/1597946820994_alter_table_public_available_jobs_add_unique_clm_no_bodyshopid/down.yaml b/hasura/migrations/1597946820994_alter_table_public_available_jobs_add_unique_clm_no_bodyshopid/down.yaml new file mode 100644 index 000000000..e8fa788db --- /dev/null +++ b/hasura/migrations/1597946820994_alter_table_public_available_jobs_add_unique_clm_no_bodyshopid/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: alter table "public"."available_jobs" drop constraint "available_jobs_clm_no_bodyshopid_key"; + type: run_sql diff --git a/hasura/migrations/1597946820994_alter_table_public_available_jobs_add_unique_clm_no_bodyshopid/up.yaml b/hasura/migrations/1597946820994_alter_table_public_available_jobs_add_unique_clm_no_bodyshopid/up.yaml new file mode 100644 index 000000000..8882889c9 --- /dev/null +++ b/hasura/migrations/1597946820994_alter_table_public_available_jobs_add_unique_clm_no_bodyshopid/up.yaml @@ -0,0 +1,6 @@ +- args: + cascade: false + read_only: false + sql: alter table "public"."available_jobs" add constraint "available_jobs_clm_no_bodyshopid_key" + unique ("clm_no", "bodyshopid"); + type: run_sql diff --git a/hasura/migrations/1597955468157_update_permission_user_public_table_available_jobs/down.yaml b/hasura/migrations/1597955468157_update_permission_user_public_table_available_jobs/down.yaml new file mode 100644 index 000000000..90b0105b5 --- /dev/null +++ b/hasura/migrations/1597955468157_update_permission_user_public_table_available_jobs/down.yaml @@ -0,0 +1,24 @@ +- args: + role: user + table: + name: available_jobs + schema: public + type: drop_update_permission +- args: + permission: + columns: [] + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + set: {} + role: user + table: + name: available_jobs + schema: public + type: create_update_permission diff --git a/hasura/migrations/1597955468157_update_permission_user_public_table_available_jobs/up.yaml b/hasura/migrations/1597955468157_update_permission_user_public_table_available_jobs/up.yaml new file mode 100644 index 000000000..ea3838750 --- /dev/null +++ b/hasura/migrations/1597955468157_update_permission_user_public_table_available_jobs/up.yaml @@ -0,0 +1,33 @@ +- args: + role: user + table: + name: available_jobs + schema: public + type: drop_update_permission +- args: + permission: + columns: + - cieca_id + - clm_amt + - est_data + - issupplement + - ownr_name + - source_system + - supplement_number + - uploaded_by + - vehicle_info + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + set: {} + role: user + table: + name: available_jobs + schema: public + type: create_update_permission diff --git a/hasura/migrations/metadata.yaml b/hasura/migrations/metadata.yaml new file mode 100644 index 000000000..9872b5cfb --- /dev/null +++ b/hasura/migrations/metadata.yaml @@ -0,0 +1,4140 @@ +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: + - active + - authlevel + - id + - shopid + - useremail + 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: + - cieca_id + - clm_amt + - est_data + - issupplement + - ownr_name + - source_system + - supplement_number + - uploaded_by + - vehicle_info + 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 + - enforce_class + - federal_tax_id + - id + - inhousevendorid + - insurance_vendor_id + - intakechecklist + - invoice_tax_rates + - logo_img_path + - md_categories + - md_classes + - md_ins_cos + - md_messaging_presets + - md_notes_presets + - md_order_statuses + - md_parts_locations + - md_rbac + - md_referral_sources + - md_responsibility_centers + - md_ro_statuses + - messagingservicesid + - prodtargethrs + - 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 + - enforce_class + - federal_tax_id + - id + - inhousevendorid + - insurance_vendor_id + - intakechecklist + - invoice_tax_rates + - logo_img_path + - md_categories + - md_classes + - md_ins_cos + - md_messaging_presets + - md_notes_presets + - md_order_statuses + - md_parts_locations + - md_rbac + - md_referral_sources + - md_responsibility_centers + - md_ro_statuses + - prodtargethrs + - 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: joblines_status + object_relationships: + - name: job + using: + manual_configuration: + remote_table: + schema: public + name: jobs + column_mapping: + jobid: id + select_permissions: + - role: user + permission: + columns: + - jobid + - status + - count + - part_type + 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: joblines_status + using: + manual_configuration: + remote_table: + schema: public + name: joblines_status + column_mapping: + id: jobid + - 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 + - category + - cieca_stl + - cieca_ttl + - ciecaid + - class + - 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 + - storage_payable + - tax_lbr_rt + - tax_levies_rt + - tax_paint_mat_rt + - tax_predis + - tax_prethr + - tax_pstthr + - tax_registration_number + - 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 + - category + - cieca_stl + - cieca_ttl + - ciecaid + - class + - 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 + - storage_payable + - tax_lbr_rt + - tax_levies_rt + - tax_paint_mat_rt + - tax_predis + - tax_prethr + - tax_pstthr + - tax_registration_number + - 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 + - category + - cieca_stl + - cieca_ttl + - ciecaid + - class + - 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 + - storage_payable + - tax_lbr_rt + - tax_levies_rt + - tax_paint_mat_rt + - tax_predis + - tax_prethr + - tax_pstthr + - tax_registration_number + - 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 + - jsontemplate + - name + - query + select_permissions: + - role: user + permission: + columns: + - bodyshopid + - created_at + - html + - id + - jsontemplate + - name + - query + - updated_at + 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: + - bodyshopid + - created_at + - html + - id + - jsontemplate + - name + - query + - updated_at + 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 31d667b6e..b1e50db51 100644 --- a/package.json +++ b/package.json @@ -3,37 +3,48 @@ "version": "0.0.1", "license": "UNLICENSED", "engines": { - "node": "12.16.1", + "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": { - "apollo-cache-persist": "^0.1.1", - "aws-sdk": "^2.630.0", "body-parser": "^1.18.3", + "cloudinary": "^1.22.0", "compression": "^1.7.4", "cors": "2.8.5", + "csrf": "^3.1.0", + "dinero.js": "^1.8.1", "dotenv": "8.2.0", "express": "^4.16.4", "express-sslify": "^1.2.0", - "firebase-tools": "^7.14.0", - "graphql-request": "^1.8.2", - "nodemailer": "^6.4.4", - "phone": "^2.4.8", - "source-map-explorer": "^2.3.1", - "twilio": "^3.41.1" + "firebase-admin": "^9.1.1", + "graphql": "^15.3.0", + "graphql-request": "^3.0.0", + "handlebars": "^4.7.6", + "intuit-oauth": "^3.0.2", + "lodash": "^4.17.20", + "moment": "^2.27.0", + "node-fetch": "^2.6.0", + "node-mailjet": "^3.3.1", + "phone": "^2.4.15", + "stripe": "^8.89.0", + "twilio": "^3.49.0", + "xmlbuilder": "^15.1.1" }, "devDependencies": { - "concurrently": "^5.1.0", - "eslint": "^6.8.0", - "eslint-plugin-promise": "^4.2.1" + "concurrently": "^5.3.0", + "eslint": "^6.6.0", + "eslint-plugin-promise": "^4.2.1", + "source-map-explorer": "^2.5.0" } } diff --git a/s3upload.js b/s3upload.js deleted file mode 100644 index 00e9efd5d..000000000 --- a/s3upload.js +++ /dev/null @@ -1,88 +0,0 @@ -var aws = require("aws-sdk"); -require("dotenv").config(); -// Configure aws with your accessKeyId and your secretAccessKey -aws.config.update({ - region: "ca-central-1", // Put your aws region here - accessKeyId: process.env.AWSAccessKeyId, - secretAccessKey: process.env.AWSSecretKey -}); - -const S3_BUCKET = process.env.Bucket; -// Now lets export this function so we can call it from somewhere else - -exports.sign_s3 = (req, res) => { - console.log("Get S3 Signed Put for bucket: " + S3_BUCKET); - const s3 = new aws.S3(); // Create a new instance of S3 - const fileName = req.body.fileName; - const fileType = req.body.fileType; - // Set up the payload of what we are sending to the S3 api - const s3Params = { - Bucket: S3_BUCKET, - Key: fileName, - Expires: 500, - ContentType: fileType, - ACL: "public-read" - }; - // Make a request to the S3 API to get a signed URL which we can use to upload our file - s3.getSignedUrl("putObject", s3Params, (err, data) => { - if (err) { - console.log(err); - res.json({ success: false, error: err }); - } - // Data payload of what we are sending back, the url of the signedRequest and a URL where we can access the content after its saved. - const returnData = { - signedRequest: data, - url: `https://${S3_BUCKET}.s3.amazonaws.com/${fileName}` - }; - // Send it all back - res.json({ success: true, data: { returnData } }); - }); -}; - -exports.get_s3 = (req, res) => { - const s3 = new aws.S3(); // Create a new instance of S3 - const fileName = req.body.fileName; - //const fileType = req.body.fileType; - // Set up the payload of what we are sending to the S3 api - const s3Params = { - Bucket: S3_BUCKET, - Key: fileName, - Expires: 500 - }; - // Make a request to the S3 API to get a signed URL which we can use to upload our file - s3.getSignedUrl("getObject", s3Params, (err, data) => { - if (err) { - console.log(err); - res.json({ success: false, error: err }); - } - // Data payload of what we are sending back, the url of the signedRequest and a URL where we can access the content after its saved. - const returnData = { - signedRequest: data, - url: `https://${S3_BUCKET}.s3.amazonaws.com/${fileName}` - }; - // Send it all back - res.json({ success: true, data: { returnData } }); - }); -}; - -exports.delete_s3 = (req, res) => { - const s3 = new aws.S3(); // Create a new instance of S3 - const fileName = req.body.fileName; - //const fileType = req.body.fileType; - // Set up the payload of what we are sending to the S3 api - console.log("fileName", req.body); - const s3Params = { - Bucket: S3_BUCKET, - Key: fileName - }; - - s3.deleteObject(s3Params, function(err, data) { - if (err) { - res.json({ success: false, message: err.message }); - } - // error - else { - res.json({ success: true, data }); - } // deleted - }); -}; diff --git a/sendemail.js b/sendemail.js index 868c6b65b..5f3c81e0b 100644 --- a/sendemail.js +++ b/sendemail.js @@ -1,45 +1,96 @@ -var nodemailer = require("nodemailer"); -require("dotenv").config(); - -var transporter = nodemailer.createTransport({ - host: process.env.email_server, - port: 465, - secure: true, // upgrade later with STARTTLS - auth: { - user: process.env.email_api, - pass: process.env.email_secret - } +const path = require("path"); +require("dotenv").config({ + path: path.resolve( + process.cwd(), + `.env.${process.env.NODE_ENV || "development"}` + ), }); -// verify connection configuration -transporter.verify(function(error, success) { - if (error) { - console.log(error); - } else { - console.log("[EMAIL] Succesfully connected to SMTP server."); - } -}); +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 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 }); - } - } - ); + + 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, +// port: 465, +// secure: true, // upgrade later with STARTTLS +// auth: { +// user: process.env.email_api, +// pass: process.env.email_secret, +// }, +// }); + +// // verify connection configuration +// transporter.verify(function (error, success) { +// if (error) { +// console.log(error); +// } else { +// console.log("[EMAIL] Succesfully connected to SMTP server."); +// } +// }); diff --git a/server.js b/server.js index 620b812f6..3dbc02c31 100644 --- a/server.js +++ b/server.js @@ -4,34 +4,79 @@ const bodyParser = require("body-parser"); const path = require("path"); const compression = require("compression"); const twilio = require("twilio"); -var enforce = require("express-sslify"); -if (process.env.NODE_ENV !== "production") require("dotenv").config(); +global.fetch = require("node-fetch"); +var fb = require("./server/firebase/firebase-handler"); + +//var enforce = require("express-sslify"); + +require("dotenv").config({ + path: path.resolve( + process.cwd(), + `.env.${process.env.NODE_ENV || "development"}` + ), +}); const https = require("https"); const fs = require("fs"); const app = express(); -//const port = process.env.PORT || 5000; -const port = 5000; +const port = process.env.PORT || 5000; +//const port = 5000; +//app.use(fb.validateFirebaseIdToken); app.use(compression()); -app.use(bodyParser.json()); -app.use(bodyParser.urlencoded({ extended: true })); -app.use(enforce.HTTPS({ trustProtoHeader: true })); +app.use(bodyParser.json({ limit: "50mb" })); +app.use(bodyParser.urlencoded({ limit: "50mb", extended: true })); +//app.use(enforce.HTTPS({ trustProtoHeader: true })); app.use(cors()); -var s3upload = require("./s3upload"); -app.post("/sign_s3", s3upload.sign_s3); -app.get("/sign_s3", s3upload.get_s3); -app.post("/delete_s3", s3upload.delete_s3); - +//Email Based Paths. var sendEmail = require("./sendemail.js"); -app.post("/sendemail", sendEmail.sendEmail); +app.post("/sendemail", fb.validateFirebaseIdToken, sendEmail.sendEmail); -app.get("/test", function(req, res) { - res.json({ success: true }); +//Test route to ensure Express is responding. +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", + fb.validateFirebaseIdToken, + accountingIIF.receivables +); + +//Accounting Qbxml +const accountQbxml = require("./server/accounting/qbxml/qbxml"); +app.post( + "/accounting/qbxml/receivables", + fb.validateFirebaseIdToken, + accountQbxml.receivables +); +app.post( + "/accounting/qbxml/payables", + fb.validateFirebaseIdToken, + accountQbxml.payables +); +app.post( + "/accounting/qbxml/payments", + fb.validateFirebaseIdToken, + accountQbxml.payments +); + +//Cloudinary Media Paths +var media = require("./server/media/media"); +app.post( + "/media/sign", + fb.validateFirebaseIdToken, + media.createSignedUploadURL +); +app.post("/media/download", fb.validateFirebaseIdToken, media.downloadFiles); + +//SMS/Twilio Paths var smsReceive = require("./server/sms/receive"); app.post( "/sms/receive", @@ -39,7 +84,7 @@ app.post( smsReceive.receive ); var smsSend = require("./server/sms/send"); -app.post("/sms/send", smsSend.send); +app.post("/sms/send", fb.validateFirebaseIdToken, smsSend.send); var smsStatus = require("./server/sms/status"); app.post( "/sms/status", @@ -47,40 +92,84 @@ app.post( smsStatus.status ); -var downloadImages = require("./download-images"); -app.get("/downloadImages", downloadImages.downloadImages); +var job = require("./server/job/job"); +app.post("/job/totals", fb.validateFirebaseIdToken, job.totals); +//Scheduling +var scheduling = require("./server/scheduling/scheduling-job"); +app.post("/scheduling/job", fb.validateFirebaseIdToken, scheduling.job); + +//Handlebars Paths for Email/Report Rendering +var renderHandlebars = require("./server/render/renderHandlebars"); +app.post("/render", fb.validateFirebaseIdToken, renderHandlebars.render); + +app.post( + "/notifications/send", + fb.validateFirebaseIdToken, + fb.sendNotification +); + +//Stripe Processing +var stripe = require("./server/stripe/payment"); +app.post("/stripe/payment", fb.validateFirebaseIdToken, stripe.payment); +app.post( + "/stripe/mobilepayment", + fb.validateFirebaseIdToken, + stripe.mobile_payment +); + +//Tech Console +var tech = require("./server/tech/tech"); +app.post("/tech/login", fb.validateFirebaseIdToken, tech.techLogin); + +var utils = require("./server/utils/utils"); +app.post("/utils/time", utils.servertime); + +var qbo = require("./server/accounting/qbo/qbo"); +app.post("/qbo/authorize", qbo.authorize); +app.get("/qbo/callback", qbo.callback); + +//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")); + res.sendFile(path.resolve(__dirname, "client/build", "service-worker.js")); }); - app.get("*", function(req, res) { + 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")); }); } if (process.env.NODE_ENV === "production") { - app.listen(port, error => { + app.listen(port, (error) => { if (error) throw error; console.log("[PRODUCTION] Server running on port " + port); }); } else { - https - .createServer( - { - key: fs.readFileSync("./key.pem"), - cert: fs.readFileSync("./cert.pem"), - passphrase: "Wl0d8k@!" - }, - app - ) - .listen(port, error => { - if (error) throw error; - console.log("[DEV/STAGING] Mock HTTPS Server running on port " + port); - }); + app.listen(port, (error) => { + if (error) throw error; + console.log("[DEVELOPMENT] Non Secured Server running on port " + port); + }); + // https + // .createServer( + // { + // key: fs.readFileSync("./key.pem"), + // cert: fs.readFileSync("./cert.pem"), + // passphrase: "Wl0d8k@!", + // }, + // app + // ) + // .listen(port, (error) => { + // if (error) throw error; + // console.log("[DEV/STAGING] Mock HTTPS Server running on port " + port); + // }); } // app.listen(port, error => { 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/qbo/qbo-authorize.js b/server/accounting/qbo/qbo-authorize.js new file mode 100644 index 000000000..045ccca7a --- /dev/null +++ b/server/accounting/qbo/qbo-authorize.js @@ -0,0 +1,31 @@ +const path = require("path"); +require("dotenv").config({ + path: path.resolve( + process.cwd(), + `.env.${process.env.NODE_ENV || "development"}` + ), +}); +const OAuthClient = require("intuit-oauth"); +var Tokens = require("csrf"); +var tokens = new Tokens(); +const oauthClient = new OAuthClient({ + clientId: process.env.QB_ONLINE_CLIENT_ID, + clientSecret: process.env.QB_ONLINE_SECRET, + environment: "sandbox", //process.env.NODE_ENV === "production" ? "production" : "sandbox", + redirectUri: process.env.QB_ONLINE_REDIRECT_URI, +}); + +exports.default = async (req, res) => { + console.log("QBO Authorize Called"); + const { userId } = req.body; + console.log("exports.default -> userId", userId); + // AuthorizationUri + + const authUri = oauthClient.authorizeUri({ + scope: [OAuthClient.scopes.Accounting, OAuthClient.scopes.OpenId], + state: tokens.create(userId), + }); // can be an array of multiple scopes ex : {scope:[OAuthClient.scopes.Accounting,OAuthClient.scopes.OpenId]} + console.log("authUri", authUri); + // Redirect the authUri + res.send(authUri); +}; diff --git a/server/accounting/qbo/qbo-callback.js b/server/accounting/qbo/qbo-callback.js new file mode 100644 index 000000000..109e65ccd --- /dev/null +++ b/server/accounting/qbo/qbo-callback.js @@ -0,0 +1,36 @@ +const path = require("path"); +require("dotenv").config({ + path: path.resolve( + process.cwd(), + `.env.${process.env.NODE_ENV || "development"}` + ), +}); +const OAuthClient = require("intuit-oauth"); +var Tokens = require("csrf"); + +const oauthClient = new OAuthClient({ + clientId: process.env.QB_ONLINE_CLIENT_ID, + clientSecret: process.env.QB_ONLINE_SECRET, + environment: "sandbox", //process.env.NODE_ENV === "production" ? "production" : "sandbox", + redirectUri: process.env.QB_ONLINE_REDIRECT_URI, +}); + +exports.default = async (req, res) => { + // Parse the redirect URL for authCode and exchange them for tokens + const parseRedirect = req.url; + const { code, state, realmId } = req.query; + console.log("exports.default -> state", state); + // Exchange the auth code retrieved from the **req.url** on the redirectUri + oauthClient + .createToken(parseRedirect) + .then(function (authResponse) { + console.log("The Token is " + JSON.stringify(authResponse.getJson())); + const { access_token, refresh_token } = authResponse.getJson(); + console.log("exports.default -> refresh_token", refresh_token); + console.log("exports.default -> access_token", access_token); + }) + .catch(function (e) { + console.error("The error message is :" + e.originalMessage); + console.error(e.intuit_tid); + }); +}; diff --git a/server/accounting/qbo/qbo.js b/server/accounting/qbo/qbo.js new file mode 100644 index 000000000..d68708d51 --- /dev/null +++ b/server/accounting/qbo/qbo.js @@ -0,0 +1,11 @@ +exports.callback = require("./qbo-callback").default; +exports.authorize = require("./qbo-authorize").default; + +const OAuthClient = require("intuit-oauth"); +const path = require("path"); +require("dotenv").config({ + path: path.resolve( + process.cwd(), + `.env.${process.env.NODE_ENV || "development"}` + ), +}); 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..0a3f4c902 --- /dev/null +++ b/server/firebase/firebase-handler.js @@ -0,0 +1,91 @@ +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) => { + 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); +}; + +exports.validateFirebaseIdToken = async (req, res, next) => { + console.log("Check if request is authorized with Firebase ID token"); + + if ( + (!req.headers.authorization || + !req.headers.authorization.startsWith("Bearer ")) && + !(req.cookies && req.cookies.__session) + ) { + console.error("Unauthorized attempt. No authorization provided."); + res.status(403).send("Unauthorized"); + return; + } + + let idToken; + if ( + req.headers.authorization && + req.headers.authorization.startsWith("Bearer ") + ) { + // console.log('Found "Authorization" header'); + // Read the ID Token from the Authorization header. + idToken = req.headers.authorization.split("Bearer ")[1]; + } else if (req.cookies) { + //console.log('Found "__session" cookie'); + // Read the ID Token from cookie. + idToken = req.cookies.__session; + } else { + // No cookie + console.error("Unauthorized attempt. No cookie provided."); + + res.status(403).send("Unauthorized"); + return; + } + + try { + const decodedIdToken = await admin.auth().verifyIdToken(idToken); + //console.log("ID Token correctly decoded", decodedIdToken); + req.user = decodedIdToken; + next(); + return; + } catch (error) { + console.error("Error while verifying Firebase ID token:", error); + res.status(403).send("Unauthorized"); + return; + } +}; 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/job/job-totals.js b/server/job/job-totals.js new file mode 100644 index 000000000..543ef77e0 --- /dev/null +++ b/server/job/job-totals.js @@ -0,0 +1,326 @@ +const Dinero = require("dinero.js"); + +exports.default = async function (req, res) { + const { job, shoprates } = req.body; + console.log(`Calculating Job Totals for ${job.id} - ${job.ro_number}`); + try { + let ret = { + parts: CalculatePartsTotals(job.joblines), + rates: CalculateRatesTotals(job, shoprates), + custPayable: CalculateCustPayable(job), + }; + ret.totals = CalculateTaxesTotals(job, ret); + // console.log("CalculateJob -> Final", ret); + res.status(200).json(ret); + } catch (error) { + console.log("error", error); + res.status(400).send(JSON.stringify(error)); + } +}; + +function CalculateTaxesTotals(job, otherTotals) { + 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.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; + } + }, Dinero({ amount: 0 })); + let ret = { + subtotal: subtotal, + federal_tax: subtotal.percentage((job.federal_tax_rate || 0) * 100), + statePartsTax, + 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 + .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 = { + la1: { + hours: jobLines + .filter((item) => item.mod_lbr_ty === "LA1") + .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), + rate: ratesList.rate_la1 || 0, + }, + la2: { + hours: jobLines + .filter((item) => item.mod_lbr_ty === "LA2") + .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), + rate: ratesList.rate_la2 || 0, + }, + la3: { + rate: ratesList.rate_la3 || 0, + hours: jobLines + .filter((item) => item.mod_lbr_ty === "LA3") + .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), + }, + la4: { + rate: ratesList.rate_la4 || 0, + hours: jobLines + .filter((item) => item.mod_lbr_ty === "LA4") + .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), + }, + laa: { + rate: ratesList.rate_laa || 0, + hours: jobLines + .filter((item) => item.mod_lbr_ty === "LAA") + .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), + }, + lab: { + rate: ratesList.rate_lab || 0, + hours: jobLines + .filter((item) => item.mod_lbr_ty === "LAB") + .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), + }, + lad: { + rate: ratesList.rate_lad || 0, + hours: jobLines + .filter((item) => item.mod_lbr_ty === "LAD") + .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), + }, + lae: { + rate: ratesList.rate_lae || 0, + hours: jobLines + .filter((item) => item.mod_lbr_ty === "LAE") + .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), + }, + laf: { + rate: ratesList.rate_laf || 0, + hours: jobLines + .filter((item) => item.mod_lbr_ty === "LAF") + .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), + }, + lag: { + rate: ratesList.rate_lag || 0, + hours: jobLines + .filter((item) => item.mod_lbr_ty === "LAG") + .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), + }, + lam: { + rate: ratesList.rate_lam || 0, + hours: jobLines + .filter((item) => item.mod_lbr_ty === "LAM") + .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), + }, + lar: { + rate: ratesList.rate_lar || 0, + hours: jobLines + .filter((item) => item.mod_lbr_ty === "LAR") + .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), + }, + las: { + rate: ratesList.rate_las || 0, + hours: jobLines + .filter((item) => item.mod_lbr_ty === "LAS") + .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), + }, + lau: { + rate: ratesList.rate_lau || 0, + hours: jobLines + .filter((item) => item.mod_lbr_ty === "LAU") + .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), + }, + atp: { + rate: shoprates.rate_atp || 0, + hours: + jobLines.filter((item) => item.line_desc.includes("ATS Amount")) + .length > 0 + ? jobLines + .filter( + (item) => + item.mod_lbr_ty !== "LA1" && + item.mod_lbr_ty !== "LA2" && + item.mod_lbr_ty !== "LA3" && + item.mod_lbr_ty !== "LA4" && + item.mod_lbr_ty !== "LAU" && + item.mod_lbr_ty !== "LAG" && + item.mod_lbr_ty !== "LAS" && + item.mod_lbr_ty !== "LAA" + ) + .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0) + : 0, + }, + mapa: { + rate: ratesList.rate_mapa || 0, + hours: jobLines + .filter((item) => item.mod_lbr_ty === "LAR") + .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), + }, + mash: { + rate: ratesList.rate_mash || 0, + hours: jobLines + .filter((item) => item.mod_lbr_ty !== "LAR") + .reduce((acc, value) => acc + value.mod_lb_hrs * 10, 0), + }, + }; + + let subtotal = Dinero({ amount: 0 }); + let rates_subtotal = Dinero({ amount: 0 }); + for (const property in ret) { + ret[property].total = Dinero({ amount: ret[property].rate * 100 }) + .multiply(ret[property].hours) + .divide(10); + subtotal = subtotal.add(ret[property].total); + if ( + property !== "mapa" && + property !== "mash" + //&& property !== "rate_atp" + ) + rates_subtotal = rates_subtotal.add(ret[property].total); + } + ret.subtotal = subtotal; + ret.rates_subtotal = rates_subtotal; + + return ret; +} + +function CalculatePartsTotals(jobLines) { + const ret = jobLines.reduce( + (acc, value) => { + switch (value.part_type) { + case "PAS": + case "PASL": + return { + ...acc, + sublets: { + ...acc.sublets, + 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: + if (value.part_type === null) 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: { + 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 + }, + sublets: { + ...ret.sublets, + total: ret.sublets.subtotal, // + ret.sublets.adjustments, + }, + }; +} + +function CalculateCustPayable(job) { + 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/server/job/job.js b/server/job/job.js new file mode 100644 index 000000000..9739bde89 --- /dev/null +++ b/server/job/job.js @@ -0,0 +1 @@ +exports.totals = require("./job-totals").default; diff --git a/server/media/media.js b/server/media/media.js new file mode 100644 index 000000000..824a9d364 --- /dev/null +++ b/server/media/media.js @@ -0,0 +1,27 @@ +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); + +exports.createSignedUploadURL = (req, res) => { + console.log("Request to create signed upload URL for Cloudinary.", req.body); + + res.send( + cloudinary.utils.api_sign_request( + req.body, + process.env.CLOUDINARY_API_SECRET + ) + ); +}; + +exports.downloadFiles = (req, res) => { + const { ids } = req.body; + const url = cloudinary.utils.download_zip_url({ public_ids: ids }); + res.send(url); +}; diff --git a/server/render/renderHandlebars.js b/server/render/renderHandlebars.js new file mode 100644 index 000000000..6347ca915 --- /dev/null +++ b/server/render/renderHandlebars.js @@ -0,0 +1,88 @@ +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; + console.log("[HJS Render] New Render Request."); + + //console.log("[HJS Render] Context", req.body.context); + if (req.body.context.bodyshop.template_header) { + console.log("[HJS Render] Including Header"); + view = `${req.body.context.bodyshop.template_header}${req.body.view}`; + } else { + console.log("[HJS Render] No header to include."); + view = req.body.view; + } + var template = Handlebars.compile(view); + res.send(template(req.body.context)); +}; diff --git a/server/scheduling/scheduling-job.js b/server/scheduling/scheduling-job.js new file mode 100644 index 000000000..81554839a --- /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").format("yyyy-MM-DD"); + //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).format("yyyy-MM-DD"); + bucketMatrix[appDate] = { + ...bucketMatrix[appDate], + in: bucketMatrix[appDate].in + 1, + }; + } + }); + + //Populate the jobs that are leaving today. + const todayIsoString = moment().format("yyyy-MM-DD"); + 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.format("yyyy-MM-DD") + : 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..1b10b5b1c --- /dev/null +++ b/server/stripe/payment.js @@ -0,0 +1,79 @@ +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; + + 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; + + 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..b7c6873e4 --- /dev/null +++ b/server/tech/tech.js @@ -0,0 +1,41 @@ +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; + + try { + const result = await client.request(queries.QUERY_EMPLOYEE_PIN, { + shopId: shopid, + employeeId: employeeid, + }); + + let valid = false; + let error; + let technician; + if (result.employees && result.employees[0]) { + const dbRecord = result.employees[0]; + 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 403a48499..85ebac798 100644 --- a/yarn.lock +++ b/yarn.lock @@ -18,62 +18,146 @@ esutils "^2.0.2" js-tokens "^4.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== +"@dabh/diagnostics@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@dabh/diagnostics/-/diagnostics-2.0.2.tgz#290d08f7b381b8f94607dc8f471a12c675f9db31" + integrity sha512-+A1YivoVDNNVCdfozHSR8v/jyuuLTMXwjWuxPFlFlUapXoGc+Gj9mDlTDDfrwl7rXCl2tNZ0kE8sIBO6YOn96Q== + dependencies: + colorspace "1.1.x" + enabled "2.0.x" + kuler "^2.0.0" + +"@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/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/component@0.1.18": + version "0.1.18" + resolved "https://registry.yarnpkg.com/@firebase/component/-/component-0.1.18.tgz#28e69e54b79953376283464cb0543bde4c104140" + integrity sha512-c8gd1k/e0sbBTR0xkLIYUN8nVkA0zWxcXGIvdfYtGEsNw6n7kh5HkcxKXOPB8S7bcPpqZkGgBIfvd94IyG2gaQ== + dependencies: + "@firebase/util" "0.3.1" + tslib "^1.11.1" + +"@firebase/database-types@0.5.2", "@firebase/database-types@^0.5.2": + version "0.5.2" + resolved "https://registry.yarnpkg.com/@firebase/database-types/-/database-types-0.5.2.tgz#23bec8477f84f519727f165c687761e29958b63c" + integrity sha512-ap2WQOS3LKmGuVFKUghFft7RxXTyZTDr0Xd8y2aqmWsbJVjgozi0huL/EUMgTjGFrATAjcf2A7aNs8AKKZ2a8g== + dependencies: + "@firebase/app-types" "0.6.1" + +"@firebase/database@^0.6.10": + version "0.6.11" + resolved "https://registry.yarnpkg.com/@firebase/database/-/database-0.6.11.tgz#74a09d5f4769eb97c00bc2f7621f54efbccea6f2" + integrity sha512-QOHhB7+CdjVhEXG9CyX0roA9ARJcEuwbozz0Bix+ULuZqjQ58KUFHMH1apW6EEiUP22d/mYD7dNXsUGshjL9PA== + dependencies: + "@firebase/auth-interop-types" "0.1.5" + "@firebase/component" "0.1.18" + "@firebase/database-types" "0.5.2" + "@firebase/logger" "0.2.6" + "@firebase/util" "0.3.1" + faye-websocket "0.11.3" + 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/util@0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@firebase/util/-/util-0.3.1.tgz#8c95152a00121bd31fb7c1fc6520ca208976e384" + integrity sha512-zjVd9rfL08dRRdZILFn1RZTHb1euCcnD9N/9P56gdBcm2bvT5XsCC4G6t5toQBpE/H/jYe5h6MZMqfLu3EQLXw== + dependencies: + tslib "^1.11.1" + +"@google-cloud/common@^3.0.0": + version "3.3.2" + resolved "https://registry.yarnpkg.com/@google-cloud/common/-/common-3.3.2.tgz#595ce85ebbcaa8b38519336bf6747e32e7706df7" + integrity sha512-W7JRLBEJWYtZQQuGQX06U6GBOSLrSrlvZxv6kGNwJtFrusu6AVgZltQ9Pajuz9Dh9aSXy9aTnBcyxn2/O0EGUw== + dependencies: + "@google-cloud/projectify" "^2.0.0" + "@google-cloud/promisify" "^2.0.0" + arrify "^2.0.1" + duplexify "^4.1.1" + ent "^2.2.0" + extend "^3.0.2" + google-auth-library "^6.0.0" + retry-request "^4.1.1" + teeny-request "^7.0.0" + +"@google-cloud/firestore@^4.0.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@google-cloud/firestore/-/firestore-4.2.0.tgz#5ff83838076972b86c16ae64d35429c190c69ea9" + integrity sha512-YCiKaTYCbXSoEvZ8cTmpgg4ebAvmFUOu3hj/aX+lHiOK7LsoFVi4jgNknogSqIiv04bxAysTBodpgn8XoZ4l5g== + dependencies: + fast-deep-equal "^3.1.1" + functional-red-black-tree "^1.0.1" + google-gax "^2.2.0" + +"@google-cloud/paginator@^3.0.0": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@google-cloud/paginator/-/paginator-3.0.3.tgz#23e0cd4c84a2f9332817dce572ab665c9eebefce" + integrity sha512-bu9AUf6TvDOtA6z5Su+kRLmMTNEA23QFjr41lH/7UpcEjGoLmXxEiJIU1hwfiiBi9c6IrgtpTsA89Zy7gjxw3w== dependencies: arrify "^2.0.0" extend "^3.0.2" -"@google-cloud/precise-date@^1.0.0": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@google-cloud/precise-date/-/precise-date-1.0.3.tgz#39c600ed52213f4158692a72c90d13b2162a93d2" - integrity sha512-wWnDGh9y3cJHLuVEY8t6un78vizzMWsS7oIWKeFtPj+Ndy+dXvHW0HTx29ZUhen+tswSlQYlwFubvuRP5kKdzQ== +"@google-cloud/projectify@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@google-cloud/projectify/-/projectify-2.0.1.tgz#13350ee609346435c795bbfe133a08dfeab78d65" + integrity sha512-ZDG38U/Yy6Zr21LaR3BTiiLtpJl6RkPS/JwoRT453G+6Q1DhlV0waNf8Lfu+YVYGIIxgKnLayJRfYlFJfiI8iQ== -"@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@^2.0.0": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@google-cloud/promisify/-/promisify-2.0.2.tgz#81d654b4cb227c65c7ad2f9a7715262febd409ed" + integrity sha512-EvuabjzzZ9E2+OaYf+7P9OAiiwbTxKYL0oGLnREQd+Su2NTQBpomkdlkBowFvyWsaV0d1sSGxrKpSNcrhPqbxg== -"@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/pubsub@^1.1.5": - version "1.1.6" - resolved "https://registry.yarnpkg.com/@google-cloud/pubsub/-/pubsub-1.1.6.tgz#67ade0a44dd01e4bc834809a4fe3b621b3659256" - integrity sha512-yx8cBFLs7c9r2td2Ab2fPCmLa2tBQvEyFEy2xUVyQlNclUW3Zg2EKGAa6/Y2be/Yp3GC3Q7fBa9nR9AwLiB84Q== +"@google-cloud/storage@^5.0.0": + version "5.1.2" + resolved "https://registry.yarnpkg.com/@google-cloud/storage/-/storage-5.1.2.tgz#e80cc3922046facf3e278daa90f43cda31745cdc" + integrity sha512-j2blsBVv6Tt5Z7ff6kOSIg5zVQPdlcTQh/4zMb9h7xMj4ekwndQA60le8c1KEa+Y6SR3EM6ER2AvKYK53P7vdQ== dependencies: - "@google-cloud/paginator" "^2.0.0" - "@google-cloud/precise-date" "^1.0.0" - "@google-cloud/projectify" "^1.0.0" - "@google-cloud/promisify" "^1.0.0" - "@sindresorhus/is" "^1.0.0" - "@types/duplexify" "^3.6.0" - "@types/long" "^4.0.0" + "@google-cloud/common" "^3.0.0" + "@google-cloud/paginator" "^3.0.0" + "@google-cloud/promisify" "^2.0.0" arrify "^2.0.0" - async-each "^1.0.1" + compressible "^2.0.12" + concat-stream "^2.0.0" + date-and-time "^0.13.0" + duplexify "^3.5.0" extend "^3.0.2" - google-auth-library "^5.5.0" - google-gax "^1.7.5" - is-stream-ended "^0.1.4" - lodash.snakecase "^4.1.1" - p-defer "^3.0.0" - protobufjs "^6.8.1" + gaxios "^3.0.0" + gcs-resumable-upload "^3.0.0" + hash-stream-validation "^0.2.2" + mime "^2.2.0" + mime-types "^2.0.8" + onetime "^5.1.0" + p-limit "^3.0.1" + pumpify "^2.0.0" + readable-stream "^3.4.0" + snakeize "^0.1.0" + stream-events "^1.0.1" + through2 "^4.0.0" + xdg-basedir "^4.0.0" -"@grpc/grpc-js@^0.6.12": - version "0.6.14" - resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-0.6.14.tgz#956d38e8541af2296fdb651fcc6e80f30e51b3b5" - integrity sha512-M6q3MtHzk0NQPs1PB+SXSJtkDtK8WXJh+1B1WVJQp5HTURadzj9t1bUb/Fjhq+K57lKsOgL60r8WGmE7vks1eg== +"@grpc/grpc-js@~1.1.1": + 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.1": - 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.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" @@ -131,10 +215,10 @@ resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA= -"@sindresorhus/is@^1.0.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-1.2.0.tgz#63ce3638cb85231f3704164c90a18ef816da3fb7" - integrity sha512-mwhXGkRV5dlvQc4EgPDxDxO6WuMBVymGFd1CA+2Y+z5dG9MNspoQ+AWjl/Ld1MnpCL8AKbosZlDVohqcIwuWsw== +"@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" @@ -149,6 +233,13 @@ resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== +"@types/concat-stream@^1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@types/concat-stream/-/concat-stream-1.6.0.tgz#394dbe0bb5fee46b38d896735e8b68ef2390d00d" + integrity sha1-OU2+C7X+5Gs42JZzXoto7yOQ0A0= + dependencies: + "@types/node" "*" + "@types/connect@*": version "3.4.33" resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.33.tgz#31610c901eca573b8713c3330abc6e6b9f588546" @@ -156,13 +247,6 @@ dependencies: "@types/node" "*" -"@types/duplexify@^3.6.0": - version "3.6.0" - resolved "https://registry.yarnpkg.com/@types/duplexify/-/duplexify-3.6.0.tgz#dfc82b64bd3a2168f5bd26444af165bf0237dcd8" - integrity sha512-5zOA53RUlzN74bvrSGwjudssD9F3a797sDZQkiYpUOxW+WHaXTCPz4/d5Dgi6FKnOqZ2CpaTo0DhgIfsXAOE/A== - dependencies: - "@types/node" "*" - "@types/express-serve-static-core@*": version "4.17.3" resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.3.tgz#dc8068ee3e354d7fba69feb86b3dfeee49b10f09" @@ -171,19 +255,32 @@ "@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/long@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.0.tgz#719551d2352d301ac8b81db732acb6bdc28dbdef" - integrity sha512-1w52Nyx4Gq47uuu0EVcsHBxZFJgurQ+rTKS3qMHxR1GY2T8c2AJYd6vZoZ9q1rupaDjU0yT+Jc2XTyXkjeMA+Q== +"@types/form-data@0.0.33": + version "0.0.33" + resolved "https://registry.yarnpkg.com/@types/form-data/-/form-data-0.0.33.tgz#c9ac85b2a5fd18435b8c85d9ecb50e6d6c893ff8" + integrity sha1-yayFsqX9GENbjIXZ7LUObWyJP/g= + 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/methods@^1.1.0": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@types/methods/-/methods-1.1.1.tgz#4a440afcd01b687d267f2c61c7c1328b86c40172" + integrity sha512-hvD1Yz0xugpvbFNVihc0Eu60Y/o1dD8LmSdN4d5QHV315ljuVGlwS5DYrb3RqFi6JskDC0Xi6/Bv6aEe/1A9bw== "@types/mime@*": version "2.0.1" @@ -195,10 +292,25 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.17.tgz#191b71e7f4c325ee0fb23bc4a996477d92b8c39b" integrity sha512-Is+l3mcHvs47sKy+afn2O1rV4ldZFU7W8101cNlOd+MRbjM4Onida8jSZnJdTe/0Pcf25g9BNIUsuugmE6puHA== -"@types/node@^10.1.0": - version "10.17.9" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.9.tgz#4f251a1ed77ac7ef09d456247d67fc8173f6b9da" - integrity sha512-+6VygF9LbG7Gaqeog2G7u1+RUcmo0q1rI+2ZxdIg2fAUngk5Vz9fOCHXdloNUOHEPd1EuuOpL5O0CdgN9Fx5UQ== +"@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@^10.10.0": + version "10.17.28" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.28.tgz#0e36d718a29355ee51cec83b42d921299200f6d9" + integrity sha512-dzjES1Egb4c1a89C7lKwQh8pwjYmlOAG9dW1pBgxEk57tMrLnssOfEthz8kdkNaBd7lIqQx7APm5+mZ619IiCQ== + +"@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/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" @@ -213,13 +325,10 @@ "@types/express-serve-static-core" "*" "@types/mime" "*" -JSONStream@^1.2.1: - version "1.3.5" - resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" - integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== - dependencies: - jsonparse "^1.2.0" - through ">=2.2.7 <3" +"@types/tough-cookie@^2.3.0": + version "2.3.7" + resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-2.3.7.tgz#979434b5900f9d710f5d4e15c466cadb8e9fdc47" + integrity sha512-rMQbgMGxnLsdn8e9aPVyuN+zMQLrZ2QW8xlv7eWS1mydfGXN+tsTKffcIzd8rGCcLdmi3xvQw2MDaZI1bBNTaw== abort-controller@^3.0.0: version "3.0.0" @@ -236,24 +345,31 @@ 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.4.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.0.tgz#e1ad486e6c54501634c6c397c5c121daa383607c" + integrity sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w== -agent-base@^4.3.0: +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" -ajv@^6.10.0, ajv@^6.10.2, ajv@^6.5.5: +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" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== @@ -263,34 +379,12 @@ ajv@^6.10.0, ajv@^6.10.2, ajv@^6.5.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ansi-align@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" - integrity sha1-w2rsy6VjuJzrVW82kPCx2eNUf38= - dependencies: - string-width "^2.0.0" - -ansi-escapes@^3.1.0, ansi-escapes@^3.2.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.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" - -ansi-regex@^2.0.0, ansi-regex@^2.1.1: - 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= + type-fest "^0.11.0" ansi-regex@^4.1.0: version "4.1.0" @@ -302,11 +396,6 @@ ansi-regex@^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" @@ -322,53 +411,6 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: "@types/color-name" "^1.1.1" color-convert "^2.0.1" -ansicolors@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979" - integrity sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk= - -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-cache-persist@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/apollo-cache-persist/-/apollo-cache-persist-0.1.1.tgz#e6cfe1983b998982a679aaf05241d3ed395edb1e" - integrity sha512-/7GAyblPR169ryW3ugbtHqiU0UGkhIt10NeaO2gn2ClxjLHF/nIkJD5mx/0OCF2vLNbbnzLZVDeIO1pf72TrEA== - -archiver-utils@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-2.1.0.tgz#e8a460e94b693c3e3da182a098ca6285ba9249e2" - integrity sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw== - dependencies: - glob "^7.1.4" - graceful-fs "^4.2.0" - lazystream "^1.0.0" - lodash.defaults "^4.2.0" - lodash.difference "^4.5.0" - lodash.flatten "^4.4.0" - lodash.isplainobject "^4.0.6" - lodash.union "^4.6.0" - normalize-path "^3.0.0" - readable-stream "^2.0.0" - -archiver@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/archiver/-/archiver-3.1.1.tgz#9db7819d4daf60aec10fe86b16cb9258ced66ea0" - integrity sha512-5Hxxcig7gw5Jod/8Gq0OneVgLYET+oNHcxgWItq4TbhOzRLKNAFUb9edAftiMKXvXfCB0vbGrJdZDNq0dWMsxg== - dependencies: - archiver-utils "^2.1.0" - async "^2.6.3" - buffer-crc32 "^0.2.1" - glob "^7.1.4" - readable-stream "^3.4.0" - tar-stream "^2.1.0" - zip-stream "^2.1.2" - argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -376,116 +418,50 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" -array-flatten@1.1.1, array-flatten@^1.0.0: +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.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.1.tgz#426bb9da84090c1838d812c8150af20a8331e296" - integrity sha1-Qmu52oQJDBg42BLIFQryCoMx4pY= - -arrify@^2.0.0: +arrify@^2.0.0, arrify@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== -as-array@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/as-array/-/as-array-1.0.0.tgz#28a6eeeaa5729f1f4eca2047df5e9de1abda0ed1" - integrity sha1-KKbu6qVynx9OyiBH316d4avaDtE= - dependencies: - lodash.isarguments "2.4.x" - lodash.isobject "^2.4.1" - lodash.values "^2.4.1" - -as-array@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/as-array/-/as-array-2.0.0.tgz#4f04805d87f8fce8e511bc2108f8e5e3a287d547" - integrity sha1-TwSAXYf4/OjlEbwhCPjl46KH1Uc= - 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= -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= +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== -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@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@^1.3.0, async@^1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" - integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= - -async@^2.3.0, async@^2.6.2, async@^2.6.3: - 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" - -async@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/async/-/async-1.0.0.tgz#f8fc04ca3a13784ade9e1641af98578cfbd647a9" - integrity sha1-+PwEyjoTeErenhZBr5hXjPvWR6k= +async@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.0.tgz#b3a2685c5ebb641d3de02d161002c60fc9f85720" + integrity sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw== asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= -aws-sdk@^2.630.0: - version "2.630.0" - resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.630.0.tgz#108ccd50b585226db8d1798def73f7b873a2efa6" - integrity sha512-7BDPUIqmMZfZf+KN2Z3RpGDYGkEucQORLM2EqXuE91ETW5ySvoNd771+EaE3OS+FUx3JejfcVk8Rr2ZFU38RjA== - dependencies: - buffer "4.9.1" - events "1.1.1" - ieee754 "1.1.13" - jmespath "0.15.0" - querystring "0.2.0" - sax "1.2.1" - url "0.10.3" - uuid "3.3.2" - xml2js "0.4.19" - -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.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.0.tgz#24390e6ad61386b0a747265754d2a17219de862c" - integrity sha512-Uvq6hVe90D0B2WEnUqtdgY1bATGz3mw33nH9Y+dmA+w5DHvUmBgkr5rM/KCHpCsiFNRUfokW/szpPPgMK2hm4A== - -axios@^0.18.0: - version "0.18.1" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.18.1.tgz#ff3f0de2e7b5d180e757ad98000f1081b87bcea3" - integrity sha512-0BfJq4NSfQXd+SkFdrvFbG7addhYSBA2mQwISr46pD6E5iqkWg02RAs8vyTT/j0RTnoYmeXauBuSv1qKwR179g== - dependencies: - follow-redirects "1.5.10" - is-buffer "^2.0.2" +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== axios@^0.19.2: version "0.19.2" @@ -499,66 +475,27 @@ 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.0.2, base64-js@^1.2.3, base64-js@^1.3.0: +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== -basic-auth-connect@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/basic-auth-connect/-/basic-auth-connect-1.0.0.tgz#fdb0b43962ca7b40456a7c2bb48fe173da2d2122" - integrity sha1-/bC0OWLKe0BFanwrtI/hc9otISI= +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== -basic-auth@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" - integrity sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg== - dependencies: - safe-buffer "5.1.2" +bignumber.js@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.0.tgz#805880f84a329b5eac6e7cb6f8274b6d82bdf075" + integrity sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A== -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" +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== -big-integer@^1.6.17: - version "1.6.48" - resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.48.tgz#8fd88bd1632cba4a1c8c3e3d7159f08bb95b4b9e" - integrity sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w== - -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== - -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== - -binary@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/binary/-/binary-0.3.0.tgz#9f60553bc5ce8c3386f3b553cff47462adecaa79" - integrity sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk= - dependencies: - buffers "~0.1.1" - chainsaw "~0.1.0" - -bl@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-3.0.0.tgz#3611ec00579fd18561754360b21e9f784500ff88" - integrity sha512-EUAyP5UHU5hxF8BPT0LKW8gjYLhq1DQIcneOX/pL/m2Alo+OYDQAJlHq+yseMP50Os2nHXOSic6Ss3vSQeyf4A== - dependencies: - readable-stream "^3.0.1" - -bluebird@~3.4.1: - version "3.4.7" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.7.tgz#f72d760be09b7f76d08ed8fae98b289a8d05fab3" - integrity sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM= - -body-parser@1.19.0, body-parser@^1.18.3, body-parser@^1.19.0: +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" integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== @@ -574,19 +511,6 @@ body-parser@1.19.0, body-parser@^1.18.3, body-parser@^1.19.0: raw-body "2.4.0" type-is "~1.6.17" -boxen@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" - integrity sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw== - dependencies: - ansi-align "^2.0.0" - camelcase "^4.0.0" - chalk "^2.0.1" - cli-boxes "^1.0.0" - string-width "^2.0.0" - term-size "^1.2.0" - widest-line "^2.0.0" - brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -595,54 +519,20 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.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" - btoa@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/btoa/-/btoa-1.2.1.tgz#01a9909f8b2c93f6bf680ba26131eb30f7fa3d73" integrity sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g== -buffer-crc32@^0.2.1, buffer-crc32@^0.2.13: - version "0.2.13" - resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" - integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= - buffer-equal-constant-time@1.0.1: version "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-indexof-polyfill@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.1.tgz#a9fb806ce8145d5428510ce72f278bb363a638bf" - integrity sha1-qfuAbOgUXVQoUQznLyeLs2OmOL8= - -buffer@4.9.1: - version "4.9.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" - integrity sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg= - dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - isarray "^1.0.0" - -buffer@^5.1.0: - version "5.4.3" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.4.3.tgz#3fbc9c69eb713d323e3fc1a895eee0710c072115" - integrity sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A== - dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - -buffers@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/buffers/-/buffers-0.1.1.tgz#b24579c3bed4d6d396aeee6d9a8ae7f5482ab7bb" - integrity sha1-skV5w77U1tOWru5tmorn9Ugqt7s= +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" @@ -659,53 +549,12 @@ callsites@^3.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -camelcase@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" - integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= - camelcase@^5.0.0: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -capture-stack-trace@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" - integrity sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw== - -cardinal@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/cardinal/-/cardinal-2.1.1.tgz#7cc1055d822d212954d07b085dea251cc7bc5505" - integrity sha1-fMEFXYItISlU0HsIXeolHMe8VQU= - dependencies: - ansicolors "~0.3.2" - redeyed "~2.1.0" - -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= - -chainsaw@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/chainsaw/-/chainsaw-0.1.0.tgz#5eab50b28afe58074d0d58291388828b5e5fbc98" - integrity sha1-XqtQsor+WAdNDVgpE4iCi15fvJg= - dependencies: - traverse ">=0.3.0 <0.4" - -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@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4.2: +chalk@^2.0.0, chalk@^2.1.0, 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== @@ -714,80 +563,19 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.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== +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" -char-spinner@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/char-spinner/-/char-spinner-1.0.1.tgz#e6ea67bd247e107112983b7ab0479ed362800081" - integrity sha1-5upnvSR+EHESmDt6sEee02KAAIE= - 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@^3.0.2: - version "3.3.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.0.tgz#12c0714668c55800f659e262d4962a97faf554a6" - integrity sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A== - 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.2.0" - optionalDependencies: - fsevents "~2.1.1" - -chownr@^1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.3.tgz#42d837d5239688d55f303003a508230fa6727142" - integrity sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw== - -ci-info@^1.5.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" - integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== - -cjson@^0.3.1: - version "0.3.3" - resolved "https://registry.yarnpkg.com/cjson/-/cjson-0.3.3.tgz#a92d9c786e5bf9b930806329ee05d5d3261b4afa" - integrity sha1-qS2ceG5b+bkwgGMp7gXV0yYbSvo= - dependencies: - json-parse-helpfulerror "^1.0.3" - -cli-boxes@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" - integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM= - -cli-color@^1.2.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/cli-color/-/cli-color-1.4.0.tgz#7d10738f48526824f8fe7da51857cb0f572fe01f" - integrity sha512-xu6RvQqqrWEo6MPR1eixqGPywhYBHRs653F9jfXB2Hx4jdM/3WxiNE1vppRmxtMIfl16SFYTpYlrnqH/HsK/2w== - dependencies: - ansi-regex "^2.1.1" - d "1" - es5-ext "^0.10.46" - es6-iterator "^2.0.3" - memoizee "^0.4.14" - timers-ext "^0.1.5" - -cli-cursor@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" - integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= - dependencies: - restore-cursor "^2.0.0" - cli-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" @@ -795,22 +583,10 @@ cli-cursor@^3.1.0: dependencies: restore-cursor "^3.1.0" -cli-spinners@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.2.0.tgz#e8b988d9206c692302d8ee834e7a85c0144d8f77" - integrity sha512-tgU3fKwzYjiLEQgPMD9Jt+JjHVL9kW93FiIMX/l7rivvOD4/LL0Mf7gda3+4U2KJBloybwgj5KEoQgGRioMiKQ== - -cli-table@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23" - integrity sha1-9TsFJmqLGguTSz0IIebi3FkUriM= - dependencies: - colors "1.0.3" - -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" @@ -830,12 +606,21 @@ cliui@^6.0.0: strip-ansi "^6.0.0" wrap-ansi "^6.2.0" -clone@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" - integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= +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" -color-convert@^1.9.0: +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, 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== @@ -854,44 +639,63 @@ color-name@1.1.3: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= -color-name@~1.1.4: +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== -colors@1.0.3, colors@1.0.x: - version "1.0.3" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" - integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs= +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" -combined-stream@^1.0.6, combined-stream@~1.0.6: +color@3.0.x: + version "3.0.0" + resolved "https://registry.yarnpkg.com/color/-/color-3.0.0.tgz#d920b4328d534a3ac8295d68f7bd4ba6c427be9a" + integrity sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w== + dependencies: + color-convert "^1.9.1" + color-string "^1.5.2" + +colors@^1.2.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== + +colorspace@1.1.x: + version "1.1.2" + resolved "https://registry.yarnpkg.com/colorspace/-/colorspace-1.1.2.tgz#e0128950d082b86a2168580796a0aa5d6c68d8c5" + integrity sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ== + dependencies: + color "3.0.x" + text-hex "1.0.x" + +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@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-4.0.1.tgz#b67622721785993182e807f4883633e6401ba53c" - integrity sha512-IPF4ouhCP+qdlcmCedhxX4xiGBPyigb8v5NeUp+0LyhwLgxMqyp3S0vl7TAPfS/hiP7FC3caI/PB9lTmP8r1NA== +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== -compare-semver@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/compare-semver/-/compare-semver-1.1.0.tgz#7c0a79a27bb80b6c6994445f82958259d3d02153" - integrity sha1-fAp5onu4C2xplERfgpWCWdPQIVM= - dependencies: - semver "^5.0.1" +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== -compress-commons@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-2.1.1.tgz#9410d9a534cf8435e3fbbb7c6ce48de2dc2f0610" - integrity sha512-eVw6n7CnEMFzc3duyFVrQEuY1BlHR3rYsSztyG32ibGMW722i3C6IizEGMFmfMU+A+fALvBIwxN3czffTcdA+Q== +compressible@^2.0.12: + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== dependencies: - buffer-crc32 "^0.2.13" - crc32-stream "^3.0.1" - normalize-path "^3.0.0" - readable-stream "^2.3.6" + mime-db ">= 1.43.0 < 2" compressible@~2.0.16: version "2.0.17" @@ -900,7 +704,7 @@ compressible@~2.0.16: dependencies: mime-db ">= 1.40.0 < 2" -compression@^1.7.0, compression@^1.7.4: +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== @@ -918,10 +722,30 @@ 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@^1.4.7: + 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" + +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.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-5.3.0.tgz#7500de6410d043c912b2da27de3202cb489b1e7b" + integrity sha512-8MhqOB6PWlBfA2vJ8a0bSFKATOdWlHiQlk11IfmQBPaHVP8oP2gsh2MObE6UR3hqDHqvaIvLTyceNW6obVuFHQ== dependencies: chalk "^2.4.2" date-fns "^2.0.1" @@ -933,48 +757,17 @@ concurrently@^5.1.0: tree-kill "^1.2.2" yargs "^13.3.0" -configstore@^1.2.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/configstore/-/configstore-1.4.0.tgz#c35781d0501d268c25c54b8b17f6240e8a4fb021" - integrity sha1-w1eB0FAdJowlxUuLF/YkDopPsCE= +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" - mkdirp "^0.5.0" - object-assign "^4.0.1" - os-tmpdir "^1.0.0" - osenv "^0.1.0" - uuid "^2.0.1" - write-file-atomic "^1.1.2" - xdg-basedir "^2.0.0" - -configstore@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f" - integrity sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw== - dependencies: - dot-prop "^4.1.0" - graceful-fs "^4.1.2" - make-dir "^1.0.0" - unique-string "^1.0.0" - write-file-atomic "^2.0.0" - xdg-basedir "^3.0.0" - -connect-query@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/connect-query/-/connect-query-1.0.0.tgz#de44f577209da2404d1fc04692d1a4118e582119" - integrity sha1-3kT1dyCdokBNH8BGktGkEY5YIRk= - dependencies: - qs "~6.4.0" - -connect@^3.6.2: - version "3.7.0" - resolved "https://registry.yarnpkg.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8" - integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== - dependencies: - debug "2.6.9" - finalhandler "1.1.2" - parseurl "~1.3.3" - utils-merge "1.0.1" + 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" @@ -1005,7 +798,17 @@ cookie@0.4.0: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== -core-util-is@1.0.2, core-util-is@~1.0.0: +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= @@ -1018,59 +821,12 @@ cors@2.8.5: object-assign "^4" vary "^1" -crc32-stream@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-3.0.1.tgz#cae6eeed003b0e44d739d279de5ae63b171b4e85" - integrity sha512-mctvpXlbzsvK+6z8kJwSJ5crm7yBwrQMTybJzMw1O4lLGJqjlDCXY2Zw7KheiA6XBEcBmfLx1D88mjRGVJtY9w== +cross-fetch@^3.0.4: + version "3.0.5" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.0.5.tgz#2739d2981892e7ab488a7ad03b92df2816e03f4c" + integrity sha512-FFLcLtraisj5eteosnX1gf01qYDCOc4fDy0+euOt8Kn9YBY2NtXL/pCoYPavw24NIQkQqm5ZOLsGD5Zzj0gyew== dependencies: - crc "^3.4.4" - readable-stream "^3.4.0" - -crc@^3.4.4: - version "3.8.0" - resolved "https://registry.yarnpkg.com/crc/-/crc-3.8.0.tgz#ad60269c2c856f8c299e2c4cc0de4556914056c6" - integrity sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ== - dependencies: - buffer "^5.1.0" - -create-error-class@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" - integrity sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y= - dependencies: - capture-stack-trace "^1.0.0" - -cross-env@^5.1.3: - version "5.2.1" - resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-5.2.1.tgz#b2c76c1ca7add66dc874d11798466094f551b34d" - integrity sha512-1yHhtcfAd1r4nwQgknowuUNfIT9E8dOMMspC36g45dN+iD1blloi7xp8X/xAIDnjHWyt1uQ8PHk2fkNaym7soQ== - dependencies: - cross-spawn "^6.0.5" - -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@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41" - integrity sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE= - dependencies: - lru-cache "^4.0.1" - which "^1.2.9" - -cross-spawn@^5.0.1: - version "5.1.0" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" - integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= - dependencies: - lru-cache "^4.0.1" - shebang-command "^1.2.0" - which "^1.2.9" + node-fetch "2.6.0" cross-spawn@^6.0.5: version "6.0.5" @@ -1083,104 +839,91 @@ cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" -crypto-random-string@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" - integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= +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== -csv-streamify@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/csv-streamify/-/csv-streamify-3.0.4.tgz#4cb614c57e3f299cca17b63fdcb4ad167777f47a" - integrity sha1-TLYUxX4/KZzKF7Y/3LStFnd39Ho= +csrf@^3.0.4, csrf@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/csrf/-/csrf-3.1.0.tgz#ec75e9656d004d674b8ef5ba47b41fbfd6cb9c30" + integrity sha512-uTqEnCvWRk042asU6JtapDTcJeeailFy4ydOQS28bj1hcLnYRiqi8SsD2jS412AY1I/4qdOwWZun774iqywf9w== dependencies: - through2 "2.0.1" + rndm "1.2.0" + tsscmp "1.0.6" + uid-safe "2.1.5" -cycle@1.0.x: - version "1.0.3" - resolved "https://registry.yarnpkg.com/cycle/-/cycle-1.0.3.tgz#21e80b2be8580f98b468f379430662b046c34ad2" - integrity sha1-IegLK+hYD5i0aPN5QwZisEbDStI= +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== -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" - -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" +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@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.0.tgz#373687bffa678b38b1cd91f861b63850035ddc87" - integrity sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg== - dependencies: - ms "^2.1.1" - -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@^3.0.0, debug@^3.1.0, debug@^3.1.1: - 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.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-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== +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-is@^0.1.3, deep-is@~0.1.3: +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= -defaults@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" - integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= +degenerator@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/degenerator/-/degenerator-1.0.4.tgz#fcf490a37ece266464d9cc431ab98c5819ced095" + integrity sha1-/PSQo37OJmRk2cxDGrmMWBnO0JU= dependencies: - clone "^1.0.2" + ast-types "0.x.x" + escodegen "1.x.x" + esprima "3.x.x" delayed-stream@~1.0.0: version "1.0.0" @@ -1192,15 +935,22 @@ depd@~1.1.2: resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= -destroy@^1.0.4, destroy@~1.0.4: +destroy@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= -didyoumean@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.1.tgz#e92edfdada6537d484d73c0172fd1eba0c4976ff" - integrity sha1-6S7f2tplN9SE1zwBcv0eugxJdv8= +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" @@ -1209,41 +959,24 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -dot-prop@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" - integrity sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ== +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 "^1.0.0" + 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" integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== -dotenv@^6.1.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-6.2.0.tgz#941c0410535d942c8becf28d3f357dbd9d476064" - integrity sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w== - -duplexer2@~0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" - integrity sha1-ixLauHjA1p4+eJEFFmKjL8a93ME= - dependencies: - readable-stream "^2.0.2" - -duplexer3@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" - integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= - 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.6.0: +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== @@ -1253,15 +986,17 @@ duplexify@^3.6.0: 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= +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: - jsbn "~0.1.0" - safer-buffer "^2.1.0" + 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, 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== @@ -1273,10 +1008,12 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -ejs@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.0.1.tgz#30c8f6ee9948502cc32e85c37a3f8b39b5a614a5" - integrity sha512-cuIMtJwxvzumSAkqaaoGY/L6Fc/t6YvoP9/VIaK0V/CyqKLEQ8sqODmYfy/cjXEdZ9+OOL8TecbJu+1RsofGDw== +ejs@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.5.tgz#aed723844dc20acb4b170cd9ab1017e476a0d93b" + integrity sha512-dldq3ZfFtgVTJMLjOe+/3sROTzALlL9E34V4/sDtUd/KlBSS0s6U1/+WPE1B4sj9CXHJpL1M6rhNJnc9Wbal9w== + dependencies: + jake "^10.6.1" emoji-regex@^7.0.1: version "7.0.3" @@ -1288,18 +1025,28 @@ emoji-regex@^8.0.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== +enabled@2.0.x: + version "2.0.0" + resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2" + integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== + encodeurl@~1.0.2: version "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.4.1: +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" @@ -1307,24 +1054,6 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es5-ext@^0.10.35, es5-ext@^0.10.45, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46: - 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-promise@^4.0.3: version "4.2.8" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" @@ -1337,43 +1066,37 @@ es6-promisify@^5.0.0: dependencies: es6-promise "^4.0.3" -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" - -es6-weak-map@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53" - integrity sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA== - dependencies: - d "1" - es5-ext "^0.10.46" - es6-iterator "^2.0.3" - es6-symbol "^3.1.1" - 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" integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= -escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: +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.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" @@ -1390,7 +1113,7 @@ eslint-visitor-keys@^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.8.0: +eslint@^6.6.0: version "6.8.0" resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb" integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig== @@ -1434,25 +1157,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@~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" @@ -1461,11 +1189,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" @@ -1476,42 +1209,11 @@ etag@~1.8.1: resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= -event-emitter@^0.3.5: - version "0.3.5" - resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" - integrity sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk= - dependencies: - d "1" - es5-ext "~0.10.14" - 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== -events@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" - integrity sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ= - -execa@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" - integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= - dependencies: - cross-spawn "^5.0.1" - get-stream "^3.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-code@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/exit-code/-/exit-code-1.0.2.tgz#ce165811c9f117af6a5f882940b96ae7f9aecc34" - integrity sha1-zhZYEcnxF69qX4gpQLlq5/muzDQ= - express-sslify@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/express-sslify/-/express-sslify-1.2.0.tgz#30e84bceed1557eb187672bbe1430a0a2a100d9c" @@ -1553,14 +1255,7 @@ express@^4.16.4: 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@^3.0.1, extend@^3.0.2, extend@~3.0.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== @@ -1574,26 +1269,16 @@ external-editor@^3.0.3: iconv-lite "^0.4.24" tmp "^0.0.33" -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= - -eyes@0.1.x: - version "0.1.8" - resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" - integrity sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A= - fast-deep-equal@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= +fast-deep-equal@^3.1.1: + 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-json-stable-stringify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" @@ -1604,29 +1289,32 @@ fast-levenshtein@~2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= +fast-safe-stringify@^2.0.4: + version "2.0.7" + resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz#124aa885899261f68aedb42a7c080de9da608743" + integrity sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA== + fast-text-encoding@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fast-text-encoding/-/fast-text-encoding-1.0.0.tgz#3e5ce8293409cfaa7177a71b9ca84e1b1e6f25ef" - integrity sha512-R9bHCvweUxxwkDwhjav5vxpFvdPGlVngtqmx4pIZfSUhM/Q4NiIUHB456BAf+Q1Nwu3HEZYONtu+Rya+af4jiQ== + 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== -fast-url-parser@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/fast-url-parser/-/fast-url-parser-1.1.3.tgz#f4af3ea9f34d8a271cf58ad2b3759f431f0b318d" - integrity sha1-9K8+qfNNiicc9YrSs3WfQx8LMY0= +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: - punycode "^1.3.2" + websocket-driver ">=0.5.1" -figures@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= - dependencies: - escape-string-regexp "^1.0.5" +fecha@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.0.tgz#3ffb6395453e3f3efff850404f0a59b6747f5f41" + integrity sha512-aN3pcx/DSmtyoovUudctc8+6Hl4T+hI9GBBHLjA76jdZl7+b1sgh5g4k+u/GL3dTy1/pnYzKp69FpJ0OicE3Wg== 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" @@ -1637,19 +1325,19 @@ file-entry-cache@^5.0.1: dependencies: flat-cache "^2.0.1" -filesize@^3.1.3: - version "3.6.1" - resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317" - integrity sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg== +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== -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== +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: - to-regex-range "^5.0.1" + minimatch "^3.0.4" -finalhandler@1.1.2, finalhandler@~1.1.2: +finalhandler@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== @@ -1677,67 +1365,20 @@ find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" -firebase-tools@^7.14.0: - version "7.14.0" - resolved "https://registry.yarnpkg.com/firebase-tools/-/firebase-tools-7.14.0.tgz#947a496b62fd75cbe842d8112631c3c1d61a4c63" - integrity sha512-bASBsY28tbdqLIAM92PirxLZWE0i5CgiLNrOkiKxz0vdQbOrGJEUcgOQGQe4xM9AaqbPw87FoTT0xJWrEUJKWw== +firebase-admin@^9.1.1: + version "9.1.1" + resolved "https://registry.yarnpkg.com/firebase-admin/-/firebase-admin-9.1.1.tgz#153aff515140a41d92ebc51231c12c7b2f4c3e69" + integrity sha512-HkzY9yN/kOe1EQgjheURAQ4pFBerI54TBL0+nj1fwzKnAnGCpcI73Bbwx99Pk3u2x4rj6bDcsZfz9bA8y7DWtQ== dependencies: - "@google-cloud/pubsub" "^1.1.5" - JSONStream "^1.2.1" - archiver "^3.0.0" - body-parser "^1.19.0" - chokidar "^3.0.2" - cjson "^0.3.1" - cli-color "^1.2.0" - cli-table "^0.3.1" - commander "^4.0.1" - configstore "^1.2.0" - cross-env "^5.1.3" - cross-spawn "^4.0.0" - csv-streamify "^3.0.4" - didyoumean "^1.2.1" - dotenv "^6.1.0" - exit-code "^1.0.2" - express "^4.16.4" - filesize "^3.1.3" - fs-extra "^0.23.1" - glob "^7.1.2" - google-auto-auth "^0.10.1" - google-gax "~1.12.0" - inquirer "~6.3.1" - jsonschema "^1.0.2" - jsonwebtoken "^8.2.1" - lodash "^4.17.14" - marked "^0.7.0" - marked-terminal "^3.3.0" - minimatch "^3.0.4" - open "^6.3.0" - ora "^3.4.0" - plist "^3.0.1" - portfinder "^1.0.23" - progress "^2.0.3" - request "^2.87.0" - rimraf "^3.0.0" - semver "^5.7.1" - superstatic "^6.0.1" - tar "^4.3.0" - tcp-port-used "^1.0.1" - tmp "0.0.33" - universal-analytics "^0.4.16" - unzipper "^0.10.5" - update-notifier "^2.5.0" - uuid "^3.0.0" - winston "^1.0.1" - -flat-arguments@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/flat-arguments/-/flat-arguments-1.0.2.tgz#9baa780adf0501f282d726c9c6a038dba44ea76f" - integrity sha1-m6p4Ct8FAfKC1ybJxqA426ROp28= - dependencies: - array-flatten "^1.0.0" - as-array "^1.0.0" - lodash.isarguments "^3.0.0" - lodash.isobject "^3.0.0" + "@firebase/database" "^0.6.10" + "@firebase/database-types" "^0.5.2" + "@types/node" "^10.10.0" + dicer "^0.3.0" + jsonwebtoken "^8.5.1" + node-forge "^0.9.1" + optionalDependencies: + "@google-cloud/firestore" "^4.0.0" + "@google-cloud/storage" "^5.0.0" flat-cache@^2.0.1: version "2.0.1" @@ -1753,6 +1394,11 @@ flatted@^2.0.0: resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08" integrity sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg== +fn.name@1.x.x: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" + integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== + follow-redirects@1.5.10: version "1.5.10" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a" @@ -1760,20 +1406,20 @@ follow-redirects@1.5.10: dependencies: debug "=3.1.0" -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= - -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== +form-data@^2.0.0, 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" @@ -1784,141 +1430,81 @@ fresh@0.5.2: resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= -fs-constants@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" - integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== - -fs-extra@^0.23.1: - version "0.23.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.23.1.tgz#6611dba6adf2ab8dc9c69fab37cddf8818157e3d" - integrity sha1-ZhHbpq3yq43Jxp+rN83fiBgVfj0= - dependencies: - graceful-fs "^4.1.2" - jsonfile "^2.1.0" - path-is-absolute "^1.0.0" - rimraf "^2.2.8" - -fs-extra@^0.30.0: - version "0.30.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" - integrity sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A= - dependencies: - graceful-fs "^4.1.2" - jsonfile "^2.1.0" - klaw "^1.0.0" - path-is-absolute "^1.0.0" - rimraf "^2.2.8" - -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.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.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805" - integrity sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA== - -fstream@^1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045" - integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg== +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: - graceful-fs "^4.1.2" - inherits "~2.0.0" - mkdirp ">=0.5 0" - rimraf "2" + readable-stream "1.1.x" + xregexp "2.0.0" 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@^1.0.4: - version "1.8.4" - resolved "https://registry.yarnpkg.com/gaxios/-/gaxios-1.8.4.tgz#e08c34fe93c0a9b67a52b7b9e7a64e6435f9a339" - integrity sha512-BoENMnu1Gav18HcpV9IleMPZ9exM+AvUjrAOV4Mzs/vfz2Lu/ABv451iEXByKiMPn2M140uul1txXCg83sAENw== +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 "^2.2.1" - node-fetch "^2.3.0" - -gaxios@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/gaxios/-/gaxios-2.2.0.tgz#7c51653c224415ac9218416cb94ff48610b816bc" - integrity sha512-54Y7s3yvtEO9CZ0yBVQHI5fzS7TzkjlnuLdDEkeyL1SNYMv877VofvA56E/C3dvj3rS7GFiyMWl833Qrr+nrkg== - dependencies: - abort-controller "^3.0.0" - extend "^3.0.2" - https-proxy-agent "^3.0.0" + https-proxy-agent "^5.0.0" is-stream "^2.0.0" node-fetch "^2.3.0" -gcp-metadata@^0.6.1, gcp-metadata@^0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/gcp-metadata/-/gcp-metadata-0.6.3.tgz#4550c08859c528b370459bd77a7187ea0bdbc4ab" - integrity sha512-MSmczZctbz91AxCvqp9GHBoZOSbJKAICV7Ow/AIWSJZRrRchUd5NL1b2P4OfP+4m490BEUPhhARfpHdqCxuCvg== +gcp-metadata@^4.1.0: + version "4.1.4" + resolved "https://registry.yarnpkg.com/gcp-metadata/-/gcp-metadata-4.1.4.tgz#3adadb9158c716c325849ee893741721a3c09e7e" + integrity sha512-5J/GIH0yWt/56R3dNaNWPGQ/zXsZOddYECfJaqxFWgrZ9HC2Kvc5vl9upOgUUHKzURjAVf2N+f6tEJiojqXUuA== dependencies: - axios "^0.18.0" - extend "^3.0.1" - retry-axios "0.3.2" + gaxios "^3.0.0" + json-bigint "^1.0.0" -gcp-metadata@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/gcp-metadata/-/gcp-metadata-3.2.2.tgz#dcac6bf65775d5caa3a2e161469c0af068849256" - integrity sha512-vR7kcJMCYJG/mYWp/a1OszdOqnLB/XW1GorWW1hc1lWVNL26L497zypWb9cG0CYDQ4Bl1Wk0+fSZFFjwJlTQgQ== +gcs-resumable-upload@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/gcs-resumable-upload/-/gcs-resumable-upload-3.1.1.tgz#67c766a0555d6a352f9651b7603337207167d0de" + integrity sha512-RS1osvAicj9+MjCc6jAcVL1Pt3tg7NK2C2gXM5nqD1Gs0klF2kj5nnAFSBy97JrtslMIQzpb7iSuxaG8rFWd2A== dependencies: - gaxios "^2.1.0" - json-bigint "^0.3.0" + abort-controller "^3.0.0" + configstore "^5.0.0" + extend "^3.0.2" + gaxios "^3.0.0" + google-auth-library "^6.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-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" - integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= - -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= +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: - assert-plus "^1.0.0" + 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, glob-parent@~5.1.0: +glob-parent@^5.0.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-slash@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/glob-slash/-/glob-slash-1.0.0.tgz#fe52efa433233f74a2fe64c7abb9bc848202ab95" - integrity sha1-/lLvpDMjP3Si/mTHq7m8hIICq5U= - -glob-slasher@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/glob-slasher/-/glob-slasher-1.0.1.tgz#747a0e5bb222642ee10d3e05443e109493cb0f8e" - integrity sha1-dHoOW7IiZC7hDT4FRD4QlJPLD44= - dependencies: - glob-slash "^1.0.0" - lodash.isobject "^2.4.1" - toxic "^1.0.0" - -glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: +glob@^7.1.3, glob@^7.1.6: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== @@ -1930,13 +1516,6 @@ glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: once "^1.3.0" path-is-absolute "^1.0.0" -global-dirs@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" - integrity sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU= - dependencies: - ini "^1.3.4" - globals@^12.1.0: version "12.3.0" resolved "https://registry.yarnpkg.com/globals/-/globals-12.3.0.tgz#1e564ee5c4dded2ab098b0f88f24702a3c56be13" @@ -1944,126 +1523,73 @@ globals@^12.1.0: dependencies: type-fest "^0.8.1" -google-auth-library@^1.3.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/google-auth-library/-/google-auth-library-1.6.1.tgz#9c73d831ad720c0c3048ab89d0ffdec714d07dd2" - integrity sha512-jYiWC8NA9n9OtQM7ANn0Tk464do9yhKEtaJ72pKcaBiEwn4LwcGYIYOfwtfsSm3aur/ed3tlSxbmg24IAT6gAg== - dependencies: - axios "^0.18.0" - gcp-metadata "^0.6.3" - gtoken "^2.3.0" - jws "^3.1.5" - lodash.isstring "^4.0.1" - lru-cache "^4.1.3" - retry-axios "^0.3.2" - -google-auth-library@^5.0.0, google-auth-library@^5.5.0: - version "5.7.0" - resolved "https://registry.yarnpkg.com/google-auth-library/-/google-auth-library-5.7.0.tgz#2d8273793a9177f9f37f3920861f4256419c77ae" - integrity sha512-uclMldsQNf64Qr67O8TINdnqbU/Ixv81WryX+sF9g7uP0igJ98aCR/uU399u1ABLa53LNsyji+bo+bP8/iL9dA== +google-auth-library@^6.0.0: + version "6.0.6" + resolved "https://registry.yarnpkg.com/google-auth-library/-/google-auth-library-6.0.6.tgz#5102e5c643baab45b4c16e9752cd56b8861f3a82" + integrity sha512-fWYdRdg55HSJoRq9k568jJA1lrhg9i2xgfhVIMJbskUmbDpJGHsbv9l41DGhCDXM21F9Kn4kUwdysgxSYBYJUw== dependencies: 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.2.0" - gtoken "^4.1.0" - jws "^3.1.5" - lru-cache "^5.0.0" + gaxios "^3.0.0" + gcp-metadata "^4.1.0" + gtoken "^5.0.0" + jws "^4.0.0" + lru-cache "^6.0.0" -google-auto-auth@^0.10.1: - version "0.10.1" - resolved "https://registry.yarnpkg.com/google-auto-auth/-/google-auto-auth-0.10.1.tgz#68834a6f3da59a6cb27fce56f76e3d99ee49d0a2" - integrity sha512-iIqSbY7Ypd32mnHGbYctp80vZzXoDlvI9gEfvtl3kmyy5HzOcrZCIGCBdSlIzRsg7nHpQiHE3Zl6Ycur6TSodQ== +google-gax@^2.2.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/google-gax/-/google-gax-2.7.0.tgz#5aaff7bdbe32730f975f416dd4897c558c89ab84" + integrity sha512-0dBATy8mMVlfOBrT85Q+NzBpZ4OJZUMrPI9wJULpiIDq2w1zlN30Duor+fQUcMEjanYEc72G58M4iUVve0jfXw== dependencies: - async "^2.3.0" - gcp-metadata "^0.6.1" - google-auth-library "^1.3.1" - request "^2.79.0" - -google-gax@^1.7.5, google-gax@~1.12.0: - version "1.12.0" - resolved "https://registry.yarnpkg.com/google-gax/-/google-gax-1.12.0.tgz#f926f7e6abda245db38ecbebbbf58daaf3a8f687" - integrity sha512-BeeoxVO6y9K20gUsexUwptutd0PfrTItrA02JWwwstlBIOAcvgFp86MHWufQsnrkPVhxBjHXq65aIkSejtJjDg== - dependencies: - "@grpc/grpc-js" "^0.6.12" + "@grpc/grpc-js" "~1.1.1" "@grpc/proto-loader" "^0.5.1" "@types/long" "^4.0.0" abort-controller "^3.0.0" duplexify "^3.6.0" - google-auth-library "^5.0.0" + google-auth-library "^6.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.8" + protobufjs "^6.9.0" retry-request "^4.0.0" semver "^6.0.0" walkdir "^0.4.0" -google-p12-pem@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/google-p12-pem/-/google-p12-pem-1.0.4.tgz#b77fb833a2eb9f7f3c689e2e54f095276f777605" - integrity sha512-SwLAUJqUfTB2iS+wFfSS/G9p7bt4eWcc2LyfvmUXe7cWp6p3mpxDo6LLI29MXdU6wvPcQ/up298X7GMC5ylAlA== - dependencies: - node-forge "^0.8.0" - pify "^4.0.0" - -google-p12-pem@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/google-p12-pem/-/google-p12-pem-2.0.3.tgz#14ecd78a94bd03bf86d74d9d0724787e85c7731f" - integrity sha512-Tq2kBCANxYYPxaBpTgCpRfdoPs9+/lNzc/Iaee4kuMVW5ascD+HwhpBsTLwH85C9Ev4qfB8KKHmpPQYyD2vg2w== +google-p12-pem@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/google-p12-pem/-/google-p12-pem-3.0.2.tgz#12d443994b6f4cd8c9e4ac479f2f18d4694cbdb8" + integrity sha512-tbjzndQvSIHGBLzHnhDs3cL4RBjLbLXc2pYvGH+imGVu5b4RMAttUTdnmW2UH0t11QeBTXZ7wlXPS7hrypO/tg== dependencies: node-forge "^0.9.0" -got@^6.7.1: - version "6.7.1" - resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" - integrity sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA= - dependencies: - create-error-class "^3.0.0" - duplexer3 "^0.1.4" - get-stream "^3.0.0" - is-redirect "^1.0.0" - is-retry-allowed "^1.0.0" - is-stream "^1.0.0" - lowercase-keys "^1.0.0" - safe-buffer "^5.0.1" - timed-out "^4.0.0" - unzip-response "^2.0.1" - url-parse-lax "^1.0.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== -graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, 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-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== +graphql-request@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/graphql-request/-/graphql-request-3.0.0.tgz#942d81bbd621cc2223d35fbf2b42edf8be822b83" + integrity sha512-zW8AuLnKMYOnpVKdANU9FzLDoj4u4AoU6KZ79e+BcJaNiuw/vgCJ0p7ppDMSDrW77a12Moa7J7Mg4w0f9Kd/Kg== dependencies: - cross-fetch "2.2.2" + cross-fetch "^3.0.4" -gtoken@^2.3.0: - version "2.3.3" - resolved "https://registry.yarnpkg.com/gtoken/-/gtoken-2.3.3.tgz#8a7fe155c5ce0c4b71c886cfb282a9060d94a641" - integrity sha512-EaB49bu/TCoNeQjhCYKI/CurooBKkGxIqFHsWABW0b25fobBYVTMe84A8EBVVZhl8emiUdNypil9huMOTmyAnw== - dependencies: - gaxios "^1.0.4" - google-p12-pem "^1.0.0" - jws "^3.1.5" - mime "^2.2.0" - pify "^4.0.0" +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== -gtoken@^4.1.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/gtoken/-/gtoken-4.1.3.tgz#efa9e42f59d02731f15de466b09331d7afc393cf" - integrity sha512-ofW+FiXjswyKdkjMcDbe6E4K7cDDdE82dGDhZIc++kUECqaE7MSErf6arJPAjcnYn1qxE1/Ti06qQuqgVusovQ== +gtoken@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/gtoken/-/gtoken-5.0.3.tgz#b76ef8e9a2fed6fef165e47f7d05b60c498e4d05" + integrity sha512-Nyd1wZCMRc2dj/mAD0LlfQLcAO06uKdpKJXvK85SGrF5+5+Bpfil9u/2aw35ltvEHjvl0h5FMKN5knEU+9JrOg== dependencies: - gaxios "^2.1.0" - google-p12-pem "^2.0.0" - jws "^3.1.5" + gaxios "^3.0.0" + google-p12-pem "^3.0.0" + jws "^4.0.0" mime "^2.2.0" gzip-size@^5.1.1: @@ -2074,30 +1600,17 @@ gzip-size@^5.1.1: duplexer "^0.1.1" pify "^4.0.1" -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.0: - version "5.1.3" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" - integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== +handlebars@^4.7.6: + version "4.7.6" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.6.tgz#d4c05c1baf90e9945f77aa68a7a219aa4a7df74e" + integrity sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA== dependencies: - ajv "^6.5.5" - har-schema "^2.0.0" - -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@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" - integrity sha1-6CB68cx7MNRGzHC3NLXovhj4jVE= + minimist "^1.2.5" + neo-async "^2.6.0" + source-map "^0.6.1" + wordwrap "^1.0.0" + optionalDependencies: + uglify-js "^3.1.4" has-flag@^3.0.0: version "3.0.0" @@ -2109,10 +1622,12 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -home-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/home-dir/-/home-dir-1.0.0.tgz#2917eb44bdc9072ceda942579543847e3017fe4e" - integrity sha1-KRfrRL3JByztqUJXlUOEfjAX/k4= +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" @@ -2130,7 +1645,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== @@ -2141,14 +1656,27 @@ http-errors@~1.7.2: statuses ">= 1.5.0 < 2" toidentifier "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= +"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: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" + 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" @@ -2158,13 +1686,13 @@ https-proxy-agent@^2.2.1: agent-base "^4.3.0" debug "^3.1.0" -https-proxy-agent@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-3.0.1.tgz#b8c286433e87602311b01c8ea34413d856a4af81" - integrity sha512-+ML2Rbh6DAuee7d07tYGEKOEi2voWPUGan+ExdPbPW6Z3svq+JCqr0v8WmKPOkz1vOVykPCBSuobe7G8GJUtVg== +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 "^4.3.0" - debug "^3.1.0" + agent-base "6" + debug "4" iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" @@ -2173,11 +1701,6 @@ iconv-lite@0.4.24, iconv-lite@^0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" -ieee754@1.1.13, 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== - ignore@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" @@ -2191,11 +1714,6 @@ import-fresh@^3.0.0: parent-module "^1.0.0" resolve-from "^4.0.0" -import-lazy@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" - integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= - imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -2209,7 +1727,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.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== @@ -2219,53 +1737,42 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= -ini@^1.3.4, ini@~1.3.0: - version "1.3.5" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" - integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== - 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.3" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" + integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== 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.19" 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" -inquirer@~6.3.1: - version "6.3.1" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.3.1.tgz#7a413b5e7950811013a3db491c61d1f3b776e8e7" - integrity sha512-MmL624rfkFt4TG9y/Jvmt8vdmOo836U7Y0Hxr2aFk3RelZEGX4Igk0KabWrcaaZaTv9uzglOqWh1Vly+FAWAXA== +intuit-oauth@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/intuit-oauth/-/intuit-oauth-3.0.2.tgz#1636eafbe6c489303f1b2a7b999f4e29cd9eedab" + integrity sha512-J3/KBtaf4SW0r2VOZLAjVYAFFOpUl6WIrte/WKi1WDQFUddGTb1nqZKkaFevYKOeicK+CRGA64c+iLR72onNEA== dependencies: - ansi-escapes "^3.2.0" - chalk "^2.4.2" - cli-cursor "^2.1.0" - cli-width "^2.0.0" - external-editor "^3.0.3" - figures "^2.0.0" - lodash "^4.17.11" - mute-stream "0.0.7" - run-async "^2.2.0" - rxjs "^6.4.0" - string-width "^2.1.0" - strip-ansi "^5.1.0" - through "^2.3.6" + atob "2.1.2" + csrf "^3.0.4" + jsonwebtoken "^8.3.0" + popsicle "10.0.1" + query-string "^6.12.1" + rsa-pem-from-mod-exp "^0.8.4" + winston "^3.1.0" -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.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" @@ -2277,24 +1784,10 @@ is-arrayish@^0.2.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= -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@^2.0.2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623" - integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A== - -is-ci@^1.0.10: - version "1.2.1" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" - integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg== - dependencies: - ci-info "^1.5.0" +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-docker@^2.0.0: version "2.0.0" @@ -2316,108 +1809,44 @@ is-fullwidth-code-point@^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-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: +is-glob@^4.0.0, 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-installed-globally@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" - integrity sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA= - dependencies: - global-dirs "^0.1.0" - is-path-inside "^1.0.0" - -is-npm@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" - integrity sha1-8vtjpl5JBbQGyGBydloaTceTufQ= - -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.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" - integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= - -is-path-inside@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" - integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= - dependencies: - path-is-inside "^1.0.1" - -is-promise@^2.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-redirect@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" - integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= - -is-retry-allowed@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" - integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== +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-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@^1.0.0, 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-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-typedarray@~1.0.0: +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-url@^1.2.2: - version "1.2.4" - resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" - integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== - -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== -is2@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is2/-/is2-2.0.1.tgz#8ac355644840921ce435d94f05d3a94634d3481a" - integrity sha512-+WaJvnaA7aJySz2q/8sLjMb2Mw14KTplHmSwcSpZ/fWJPkUmqw3YTzSWbPJ7OAwRvdYTWF2Wg+yYJ1AdP5Z8CA== - dependencies: - deep-is "^0.1.3" - ip-regex "^2.1.0" - is-url "^1.2.2" - 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= @@ -2427,29 +1856,15 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= -isstream@0.1.x, 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= - -jju@^1.1.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/jju/-/jju-1.4.0.tgz#a3abe2718af241a2b2904f84a625970f389ae32a" - integrity sha1-o6vicYryQaKykE+EpiWXDzia4yo= - -jmespath@0.15.0: - version "0.15.0" - resolved "https://registry.yarnpkg.com/jmespath/-/jmespath-0.15.0.tgz#a3f222a9aae9f966f5d27c796510e28091764217" - integrity sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc= - -join-path@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/join-path/-/join-path-1.1.1.tgz#10535a126d24cbd65f7ffcdf15ef2e631076b505" - integrity sha1-EFNaEm0ky9Zff/zfFe8uYxB2tQU= +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: - as-array "^2.0.0" - url-join "0.0.1" - valid-url "^1" + async "0.9.x" + chalk "^2.4.2" + filelist "^1.0.1" + minimatch "^3.0.4" js-tokens@^4.0.0: version "4.0.0" @@ -2464,68 +1879,36 @@ js-yaml@^3.13.1: 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= - -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= +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 "^7.0.0" + bignumber.js "^4.0.0" + +json-bigint@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-bigint/-/json-bigint-1.0.0.tgz#ae547823ac0cad8398667f8cd9ef4730f5b01ff1" + integrity sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ== + dependencies: + bignumber.js "^9.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" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== -json-parse-helpfulerror@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/json-parse-helpfulerror/-/json-parse-helpfulerror-1.0.3.tgz#13f14ce02eed4e981297b64eb9e3b932e2dd13dc" - integrity sha1-E/FM4C7tTpgSl7ZOueO5MuLdE9w= - dependencies: - jju "^1.1.0" - 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-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= - -jsonfile@^2.1.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" - integrity sha1-NzaitCi4e72gzIO1P6PWM6NcKug= - optionalDependencies: - graceful-fs "^4.1.6" - -jsonparse@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" - integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= - -jsonschema@^1.0.2: - version "1.2.5" - resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.2.5.tgz#bab69d97fa28946aec0a56a9cc266d23fe80ae61" - integrity sha512-kVTF+08x25PQ0CjuVc0gRM9EUPb0Fe9Ln/utFOgcdxEIOHuU7ooBk/UPTd7t1M91pP35m0MU1T8M5P7vP1bRRw== - -jsonwebtoken@^8.2.1, jsonwebtoken@^8.5.1: +jsonwebtoken@^8.3.0, jsonwebtoken@^8.5.1: version "8.5.1" resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d" integrity sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w== @@ -2541,16 +1924,6 @@ jsonwebtoken@^8.2.1, jsonwebtoken@^8.5.1: ms "^2.1.1" semver "^5.6.0" -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" - jwa@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a" @@ -2560,7 +1933,16 @@ jwa@^1.4.1: ecdsa-sig-formatter "1.0.11" safe-buffer "^5.0.1" -jws@^3.1.5, jws@^3.2.2: +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" integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== @@ -2568,26 +1950,18 @@ jws@^3.1.5, jws@^3.2.2: jwa "^1.4.1" safe-buffer "^5.0.1" -klaw@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" - integrity sha1-QIhDO0azsbolnXh4XY6W9zugJDk= - optionalDependencies: - graceful-fs "^4.1.9" - -latest-version@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" - integrity sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU= +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: - package-json "^4.0.0" + jwa "^2.0.0" + safe-buffer "^5.0.1" -lazystream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4" - integrity sha1-9plf4PggOS9hOWvolGJAe7dxaOQ= - dependencies: - readable-stream "^2.0.5" +kuler@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" + integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== levn@^0.3.0, levn@~0.3.0: version "0.3.0" @@ -2597,11 +1971,6 @@ levn@^0.3.0, levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" -listenercount@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/listenercount/-/listenercount-1.0.1.tgz#84c8a72ab59c4725321480c975e6508342e70937" - integrity sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc= - locate-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" @@ -2617,23 +1986,6 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" -lodash._isnative@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._isnative/-/lodash._isnative-2.4.1.tgz#3ea6404b784a7be836c7b57580e1cdf79b14832c" - integrity sha1-PqZAS3hKe+g2x7V1gOHN95sUgyw= - -lodash._objecttypes@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz#7c0b7f69d98a1f76529f890b0cdb1b4dfec11c11" - integrity sha1-fAt/admKH3ZSn4kLDNsbTf7BHBE= - -lodash._shimkeys@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz#6e9cc9666ff081f0b5a6c978b83e242e6949d203" - integrity sha1-bpzJZm/wgfC1psl4uD4kLmlJ0gM= - dependencies: - lodash._objecttypes "~2.4.1" - lodash.at@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.at/-/lodash.at-4.6.0.tgz#93cdce664f0a1994ea33dd7cd40e23afd11b0ff8" @@ -2644,21 +1996,6 @@ lodash.camelcase@^4.3.0: resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= -lodash.defaults@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" - integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw= - -lodash.difference@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.difference/-/lodash.difference-4.5.0.tgz#9ccb4e505d486b91651345772885a2df27fd017c" - integrity sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw= - -lodash.flatten@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" - integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= - lodash.has@^4.5.2: version "4.5.2" resolved "https://registry.yarnpkg.com/lodash.has/-/lodash.has-4.5.2.tgz#d19f4dc1095058cccbe2b0cdf4ee0fe4aa37c862" @@ -2669,16 +2006,6 @@ lodash.includes@^4.3.0: resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" integrity sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8= -lodash.isarguments@2.4.x: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-2.4.1.tgz#4931a9c08253adf091ae7ca192258a973876ecca" - integrity sha1-STGpwIJTrfCRrnyhkiWKlzh27Mo= - -lodash.isarguments@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" - integrity sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo= - lodash.isboolean@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" @@ -2694,18 +2021,6 @@ lodash.isnumber@^3.0.3: resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" integrity sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w= -lodash.isobject@^2.4.1, lodash.isobject@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.isobject/-/lodash.isobject-2.4.1.tgz#5a2e47fe69953f1ee631a7eba1fe64d2d06558f5" - integrity sha1-Wi5H/mmVPx7mMafrof5k0tBlWPU= - dependencies: - lodash._objecttypes "~2.4.1" - -lodash.isobject@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/lodash.isobject/-/lodash.isobject-3.0.2.tgz#3c8fb8d5b5bf4bf90ae06e14f2a530a4ed935e1d" - integrity sha1-PI+41bW/S/kK4G4U8qUwpO2TXh0= - lodash.isplainobject@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" @@ -2716,65 +2031,43 @@ lodash.isstring@^4.0.1: resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE= -lodash.keys@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-2.4.1.tgz#48dea46df8ff7632b10d706b8acb26591e2b3727" - integrity sha1-SN6kbfj/djKxDXBrissmWR4rNyc= - dependencies: - lodash._isnative "~2.4.1" - lodash._shimkeys "~2.4.1" - lodash.isobject "~2.4.1" - lodash.once@^4.0.0: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w= -lodash.snakecase@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d" - integrity sha1-OdcUo1NXFHg3rv1ktdy7Fr7Nj40= - -lodash.toarray@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz#24c4bfcd6b2fba38bfd0594db1179d8e9b656561" - integrity sha1-JMS/zWsvuji/0FlNsRedjptlZWE= - -lodash.union@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88" - integrity sha1-SLtQiECfFvGCFmZkHETdGqrjzYg= - -lodash.values@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-2.4.1.tgz#abf514436b3cb705001627978cbcf30b1280eea4" - integrity sha1-q/UUQ2s8twUAFieXjLzzCxKA7qQ= - dependencies: - lodash.keys "~2.4.1" - -lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.4, lodash@^4.17.5: +lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== -log-symbols@^2.2.0: +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== + +lodash@^4.17.20: + version "4.17.20" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" + integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== + +logform@^2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" - integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== + resolved "https://registry.yarnpkg.com/logform/-/logform-2.2.0.tgz#40f036d19161fc76b68ab50fdc7fe495544492f2" + integrity sha512-N0qPlqfypFx7UHNn4B3lzS/b0uLqt2hmuoa+PpuXNYgozdJYAyauF5Ky0BWVjrxDlMWiT3qN4zPq3vVAfZy7Yg== dependencies: - chalk "^2.0.1" + colors "^1.2.1" + fast-safe-stringify "^2.0.4" + fecha "^4.2.0" + ms "^2.1.1" + triple-beam "^1.3.0" 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== -lowercase-keys@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" - integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== - -lru-cache@^4.0.1, lru-cache@^4.1.3: +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== @@ -2782,69 +2075,43 @@ lru-cache@^4.0.1, lru-cache@^4.1.3: 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== +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== dependencies: - yallist "^3.0.2" + yallist "^4.0.0" -lru-queue@0.1: - version "0.1.0" - resolved "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3" - integrity sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM= +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: - es5-ext "~0.10.2" + semver "^6.0.0" -make-dir@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" - integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== +make-error-cause@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/make-error-cause/-/make-error-cause-1.2.2.tgz#df0388fcd0b37816dff0a5fb8108939777dcbc9d" + integrity sha1-3wOI/NCzeBbf8KX7gQiTl3fcvJ0= dependencies: - pify "^3.0.0" + make-error "^1.2.0" -marked-terminal@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/marked-terminal/-/marked-terminal-3.3.0.tgz#25ce0c0299285998c7636beaefc87055341ba1bd" - integrity sha512-+IUQJ5VlZoAFsM5MHNT7g3RHSkA3eETqhRCdXv4niUMAKHQ7lb1yvAcuGPmm4soxhmtX13u4Li6ZToXtvSEH+A== - dependencies: - ansi-escapes "^3.1.0" - cardinal "^2.1.1" - chalk "^2.4.1" - cli-table "^0.3.1" - node-emoji "^1.4.1" - supports-hyperlinks "^1.0.1" - -marked@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/marked/-/marked-0.7.0.tgz#b64201f051d271b1edc10a04d1ae9b74bb8e5c0e" - integrity sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg== +make-error@^1.2.0: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== 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= -memoizee@^0.4.14: - version "0.4.14" - resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.4.14.tgz#07a00f204699f9a95c2d9e77218271c7cd610d57" - integrity sha512-/SWFvWegAIYAO4NQMpcX+gcra0yEZu4OntmUdrBaWrJncxOqAziGFlHxc7yjKVK2uu3lpPW27P27wkR82wA8mg== - dependencies: - d "1" - es5-ext "^0.10.45" - es6-weak-map "^2.0.2" - event-emitter "^0.3.5" - is-promise "^2.1" - lru-queue "0.1" - next-tick "1" - timers-ext "^0.1.5" - 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= -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= @@ -2854,14 +2121,26 @@ 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-types@^2.1.12, mime-types@^2.1.16, mime-types@~2.1.19, mime-types@~2.1.24: +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" integrity sha512-5KhStqB5xpTAeGqKBAMgwaYMnQik7teQN4IAzC7npDv6kzeU6prfkR67bc87J1kWMPGkoaZSq1npmexMgkmEVg== 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== @@ -2871,11 +2150,6 @@ mime@^2.2.0: resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5" integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA== -mimic-fn@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" - integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== - mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" @@ -2893,43 +2167,22 @@ minimist@0.0.8: resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= -minimist@^1.1.0, 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: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== -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" - -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" - -"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" -morgan@^1.8.2: - version "1.9.1" - resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.9.1.tgz#0a8d16734a1d9afbc824b99df87e738e58e2da59" - integrity sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA== - dependencies: - basic-auth "~2.0.0" - debug "2.6.9" - depd "~1.1.2" - on-finished "~2.3.0" - on-headers "~1.0.1" +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" @@ -2946,26 +2199,11 @@ ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -mute-stream@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" - integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= - 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== -nash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/nash/-/nash-3.0.0.tgz#bced3a0cb8434c2ad30d1a0d567cfc0c37128eea" - integrity sha512-M5SahEycXUmko3zOvsBkF6p94CWLhnyy9hfpQ9Qzp+rQkQ8D1OaTlfTl1OBWktq9Fak3oDXKU+ev7tiMaMu+1w== - dependencies: - async "^1.3.0" - flat-arguments "^1.0.0" - lodash "^4.17.5" - minimist "^1.1.0" - natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -2976,47 +2214,41 @@ negotiator@0.6.2: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== -next-tick@1, 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= +neo-async@^2.6.0: + version "2.6.1" + 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-emoji@^1.4.1: - version "1.10.0" - resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.10.0.tgz#8886abd25d9c7bb61802a658523d1f8d2a89b2da" - integrity sha512-Yt3384If5H6BYGVHiHwTL+99OzJKHhgp82S8/dktEK73T26BazdgZ4JZh92xSVtGNJvz9UbXdNAc5hcrXV42vw== - dependencies: - lodash.toarray "^4.4.0" - -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.3.0, node-fetch@^2.6.0: +node-fetch@2.6.0, 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== -node-forge@^0.8.0: - version "0.8.5" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.8.5.tgz#57906f07614dc72762c84cef442f427c0e1b86ee" - integrity sha512-vFMQIWt+J/7FLNyKouZ9TazT74PRV3wgv9UT4cRjC8BffxFbKXkgIWR42URCPSnHm/QDz6BOlb2Q0U4+VQT67Q== - -node-forge@^0.9.0: +node-forge@^0.9.0, node-forge@^0.9.1: version "0.9.1" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.9.1.tgz#775368e6846558ab6676858a4d8c6e8d16c677b5" integrity sha512-G6RlQt5Sb4GMBzXvhfkeFmbqR6MzhtnT7VTHuLadjkii3rdYHNdw0m8zA4BTxVIh68FicCQ2NSUANpsqkr9jvQ== -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-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" normalize-package-data@^2.3.2: version "2.5.0" @@ -3028,53 +2260,36 @@ normalize-package-data@^2.3.2: semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.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== - -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" - -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, object-assign@^4.0.1: +object-assign@^4: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= -on-finished@^2.2.0, on-finished@~2.3.0: +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.0, on-headers@~1.0.1, on-headers@~1.0.2: +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.4.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= dependencies: wrappy "1" -onetime@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" - integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= +one-time@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/one-time/-/one-time-1.0.0.tgz#e06bc174aed214ed58edede573b433bbf827cb45" + integrity sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g== dependencies: - mimic-fn "^1.0.0" + fn.name "1.x.x" onetime@^5.1.0: version "5.1.0" @@ -3083,22 +2298,15 @@ onetime@^5.1.0: dependencies: mimic-fn "^2.1.0" -open@^6.3.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/open/-/open-6.4.0.tgz#5c13e96d0dc894686164f18965ecfe889ecfc8a9" - integrity sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg== - dependencies: - is-wsl "^1.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== +open@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/open/-/open-7.2.0.tgz#212959bd7b0ce2e8e3676adc76e3cf2f0a2498b4" + integrity sha512-4HeyhxCvBTI5uBePsAdi55C5fmqnWZ2e2MlmvWi5KW5tdH5rxoiv/aMtbeVxKZc3eWkT1GymMnLG8XC4Rq4TDQ== dependencies: 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== @@ -3110,46 +2318,11 @@ optionator@^0.8.3: type-check "~0.3.2" word-wrap "~1.2.3" -ora@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/ora/-/ora-3.4.0.tgz#bf0752491059a3ef3ed4c85097531de9fdbcd318" - integrity sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg== - dependencies: - chalk "^2.4.2" - cli-cursor "^2.1.0" - cli-spinners "^2.0.0" - log-symbols "^2.2.0" - strip-ansi "^5.2.0" - wcwidth "^1.0.1" - -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= - -os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: +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= -osenv@^0.1.0: - version "0.1.5" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" - integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" - -p-defer@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-3.0.0.tgz#d1dceb4ee9b2b604b1d94ffec83760175d4e6f83" - integrity sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw== - -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-limit@^2.0.0: version "2.2.1" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.1.tgz#aa07a788cc3151c939b5131f63570f0dd2009537" @@ -3158,9 +2331,16 @@ p-limit@^2.0.0: p-try "^2.0.0" p-limit@^2.2.0: - 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" + +p-limit@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.0.2.tgz#1664e010af3cadc681baafd3e2a437be7b0fb5fe" + integrity sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg== dependencies: p-try "^2.0.0" @@ -3183,15 +2363,30 @@ 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== -package-json@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" - integrity sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0= +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: - got "^6.7.1" - registry-auth-token "^3.0.1" - registry-url "^3.0.3" - semver "^5.1.0" + 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" @@ -3208,7 +2403,7 @@ parse-json@^4.0.0: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" -parseurl@~1.3.2, parseurl@~1.3.3: +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== @@ -3228,12 +2423,7 @@ path-is-absolute@^1.0.0: 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.1: - 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: +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= @@ -3248,95 +2438,59 @@ 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= -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" - -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= - -phone@^2.4.8: - version "2.4.8" - resolved "https://registry.yarnpkg.com/phone/-/phone-2.4.8.tgz#4da4c046b4a90ca65ea04f86e99094b50ed518df" - integrity sha512-8RO0PfJPzjsWKhbU9W79f7exxkEgjrjbkHqG3psV3SI2q+SJqDEC7We3Ylxivk8XNdoZ8jDs4TPHnqCVs8TwNA== - -picomatch@^2.0.4: - version "2.1.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.1.1.tgz#ecdfbea7704adb5fe6fb47f9866c4c0e15e905c5" - integrity sha512-OYMyqkKzK7blWO/+XZYP6w8hH0LDvkBvdvKukti+7kqYFCiEAk+gI3DWnryapc0Dau05ugGTy0foQ6mqn4AHYA== +phone@^2.4.15: + version "2.4.15" + resolved "https://registry.yarnpkg.com/phone/-/phone-2.4.15.tgz#4ab158ac011c8107e873d7b1d12abcc88fda6bf3" + integrity sha512-C1/0wWjwSOxoqYcwMtnb8KhxaFUhBIg0srDa9WZ5mBeCMkmUhC9jJIrWzUQnJdaM5bagLp9wmNHzKPVjLCF0kg== 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.0, pify@^4.0.1: +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== -pkginfo@0.3.x: - version "0.3.1" - resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.3.1.tgz#5b29f6a81f70717142e09e765bbeab97b4f81e21" - integrity sha1-Wyn2qB9wcXFC4J52W76rl7T4HiE= - -plist@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/plist/-/plist-3.0.1.tgz#a9b931d17c304e8912ef0ba3bdd6182baf2e1f8c" - integrity sha512-GpgvHHocGRyQm74b6FWEZZVRroHKE1I0/BTjAmySaohK+cUn+hZpbqXkc3KWgW3gQYkqcQej35FohcT0FRlkRQ== - dependencies: - base64-js "^1.2.3" - xmlbuilder "^9.0.7" - xmldom "0.1.x" - pop-iterate@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/pop-iterate/-/pop-iterate-1.0.1.tgz#ceacfdab4abf353d7a0f2aaa2c1fc7b3f9413ba3" integrity sha1-zqz9q0q/NT16DyqqLB/Hs/lBO6M= -portfinder@^1.0.23: - version "1.0.25" - resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.25.tgz#254fd337ffba869f4b9d37edc298059cb4d35eca" - integrity sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg== +popsicle@10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/popsicle/-/popsicle-10.0.1.tgz#2abd36130560647c74eaf08400d473ae25c4486f" + integrity sha512-IFVBRz+hc05+MiVDH+KH9QoeE6gjFOiIZNxKePIwz+JbH/yP9rLreUT9+GocxRweYBiRh7O9+MfI5X1zKfSH6Q== dependencies: - async "^2.6.2" - debug "^3.1.1" - mkdirp "^0.5.1" + "@types/concat-stream" "^1.6.0" + "@types/form-data" "0.0.33" + "@types/methods" "^1.1.0" + "@types/tough-cookie" "^2.3.0" + concat-stream "^1.4.7" + form-data "^2.0.0" + make-error-cause "^1.2.1" + tough-cookie "^2.0.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.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" - integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= - -process-nextick-args@~1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" - integrity sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M= - 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, progress@^2.0.3: +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.1, protobufjs@^6.8.6, protobufjs@^6.8.8: - version "6.8.8" - resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.8.8.tgz#c8b4f1282fd7a90e6f5b109ed11c84af82908e7c" - integrity sha512-AAmHtD5pXgZfi7GMpllpO3q1Xw1OYldr+dMUlAnffGTAhqkg72WdmSY71uKBF/JuyiKs8psYbtKrhi0ASCD8qw== +protobufjs@^6.8.6: + 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" @@ -3348,8 +2502,27 @@ protobufjs@^6.8.1, protobufjs@^6.8.6, protobufjs@^6.8.8: "@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" + +protobufjs@^6.9.0: + 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: @@ -3360,27 +2533,53 @@ 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= -psl@^1.1.24: - version "1.6.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.6.0.tgz#60557582ee23b6c43719d9890fb4170ecd91e110" - integrity sha512-SYKKmVel98NCOYXpkwUqZqh0ahZeeKfmisiLIcEZdsb+WbLv02g/dI5BUmZnIyOe7RzZtLax81nnb2HbvC2tzA== +psl@^1.1.28: + version "1.8.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== -punycode@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" - integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= +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" -punycode@^1.3.2, punycode@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= +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: +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== @@ -3394,36 +2593,40 @@ q@2.0.x: pop-iterate "^1.0.1" weak-map "^1.0.5" +q@^1.5.1: + 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.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== -qs@~6.4.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" - integrity sha1-E+JtKK1rD/qpExLNO/cI7TUecjM= - -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== - -querystring@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= +query-string@^6.12.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" + strict-uri-encode "^2.0.0" 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== +random-bytes@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/random-bytes/-/random-bytes-1.0.0.tgz#4f68a1dc0ae58bd3fb95848c30324db75d64360b" + integrity sha1-T2ih3Arli9P7lYSMMDJNt11kNgs= + range-parser@~1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" @@ -3439,15 +2642,15 @@ raw-body@2.4.0: iconv-lite "0.4.24" unpipe "1.0.0" -rc@^1.0.1, rc@^1.1.6: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== +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: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" + 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" @@ -3458,19 +2661,20 @@ read-pkg@^4.0.1: parse-json "^4.0.0" pify "^3.0.0" -"readable-stream@2 || 3", readable-stream@^3.0.1, readable-stream@^3.1.1, readable-stream@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.4.0.tgz#a51c26754658e0a3c21dbf59163bd45ba6f447fc" - integrity sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ== +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: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" -readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.3.6, readable-stream@~2.3.6: - version "2.3.6" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" - integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== +readable-stream@2, readable-stream@^2.0.0, readable-stream@^2.2.2, readable-stream@^2.3.5, readable-stream@^2.3.7, 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" @@ -3480,78 +2684,20 @@ readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.0.5, readable string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@~2.0.0: - version "2.0.6" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" - integrity sha1-j5A0HmilPMySh4jaz80Rs265t44= +"readable-stream@2 || 3", readable-stream@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: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "~1.0.0" - process-nextick-args "~1.0.6" - string_decoder "~0.10.x" - util-deprecate "~1.0.1" - -readdirp@~3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.2.0.tgz#c30c33352b12c96dfb4b895421a49fd5a9593839" - integrity sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ== - dependencies: - picomatch "^2.0.4" - -redeyed@~2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/redeyed/-/redeyed-2.1.1.tgz#8984b5815d99cb220469c99eeeffe38913e6cc0b" - integrity sha1-iYS1gV2ZyyIEacme7v/jiRPmzAs= - dependencies: - esprima "~4.0.0" + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.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== -registry-auth-token@^3.0.1: - version "3.4.0" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.4.0.tgz#d7446815433f5d5ed6431cd5dca21048f66b397e" - integrity sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A== - dependencies: - rc "^1.1.6" - safe-buffer "^5.0.1" - -registry-url@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" - integrity sha1-PU74cPc93h138M+aOBQyRE4XSUI= - dependencies: - rc "^1.0.1" - -request@^2.79.0, request@^2.87.0, request@^2.88.0: - version "2.88.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" - integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== - 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.0" - 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.4.3" - 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" @@ -3579,14 +2725,6 @@ resolve@^1.10.0: dependencies: path-parse "^1.0.6" -restore-cursor@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" - integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= - dependencies: - onetime "^2.0.0" - signal-exit "^3.0.2" - restore-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" @@ -3595,11 +2733,6 @@ restore-cursor@^3.1.0: onetime "^5.1.0" signal-exit "^3.0.2" -retry-axios@0.3.2, retry-axios@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/retry-axios/-/retry-axios-0.3.2.tgz#5757c80f585b4cc4c4986aa2ffd47a60c6d35e13" - integrity sha512-jp4YlI0qyDFfXiXGhkCOliBN1G7fRH03Nqy8YdShzGqbY5/9S2x/IR6C88ls2DFkbWuL3ASkP7QD3pVrNpPgwQ== - retry-request@^4.0.0: version "4.1.1" resolved "https://registry.yarnpkg.com/retry-request/-/retry-request-4.1.1.tgz#f676d0db0de7a6f122c048626ce7ce12101d2bd8" @@ -3608,12 +2741,13 @@ retry-request@^4.0.0: debug "^4.1.1" through2 "^3.0.1" -rimraf@2, rimraf@^2.2.8: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== +retry-request@^4.1.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/retry-request/-/retry-request-4.1.2.tgz#88eb28ba5b0b81c3692f03dd9f2f91868be2a30b" + integrity sha512-fa4OwUcplhOYIhTm7zt6xsUfoApWo+auhvxbpPR4XLxHj0k67MhPItpCzYWzOEjtJlCH4MJ5V0qUrXiu/pOpag== dependencies: - glob "^7.1.3" + debug "^4.1.1" + through2 "^3.0.1" rimraf@2.6.3, rimraf@~2.6.2: version "2.6.3" @@ -3622,88 +2756,61 @@ rimraf@2.6.3, rimraf@~2.6.2: dependencies: glob "^7.1.3" -rimraf@^3.0.0: - 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" +rndm@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/rndm/-/rndm-1.2.0.tgz#f33fe9cfb52bbfd520aa18323bc65db110a1b76c" + integrity sha1-8z/pz7Urv9UgqhgyO8ZdsRCht2w= rootpath@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/rootpath/-/rootpath-0.1.2.tgz#5b379a87dca906e9b91d690a599439bef267ea6b" integrity sha1-Wzeah9ypBum5HWkKWZQ5vvJn6ms= -router@^1.3.1: - version "1.3.3" - resolved "https://registry.yarnpkg.com/router/-/router-1.3.3.tgz#c142f6b5ea4d6b3359022ca95b6580bd217f89cf" - integrity sha1-wUL2tepNazNZAiypW2WAvSF/ic8= - dependencies: - array-flatten "2.1.1" - debug "2.6.9" - methods "~1.1.2" - parseurl "~1.3.2" - path-to-regexp "0.1.7" - setprototypeof "1.1.0" - utils-merge "1.0.1" +rsa-pem-from-mod-exp@^0.8.4: + version "0.8.4" + resolved "https://registry.yarnpkg.com/rsa-pem-from-mod-exp/-/rsa-pem-from-mod-exp-0.8.4.tgz#362a42c6d304056d493b3f12bceabb2c6576a6d4" + integrity sha1-NipCxtMEBW1JOz8SvOq7LGV2ptQ= -rsvp@^3.6.2: - version "3.6.2" - resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" - integrity sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw== +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-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" - -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" +rxjs@^6.6.0: + version "6.6.2" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.2.tgz#8096a7ac03f2cc4fe5860ef6e572810d9e01c0d2" + integrity sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg== + 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.2, safe-buffer@~5.2.0: +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== -"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": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sax@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.1.tgz#7b8e656190b228e81a66aea748480d828cd2d37a" - integrity sha1-e45lYZCyKOgaZq6nSEgNgozS03o= - -sax@>=0.6.0: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== - scmp@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/scmp/-/scmp-2.1.0.tgz#37b8e197c425bdeb570ab91cc356b311a11f9c9a" integrity sha512-o/mRQGk9Rcer/jEEw/yw4mwo3EU/NvYvp577/Btqrym9Qy5/MdWGBqipbALgd2lrdWTJ5/gqDusxfnQBxOxT2Q== -semver-diff@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" - integrity sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY= - dependencies: - semver "^5.0.3" - -"semver@2 || 3 || 4 || 5", semver@^5.0.1, semver@^5.0.3, semver@^5.1.0, semver@^5.5.0, semver@^5.6.0, semver@^5.7.1: +"semver@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -3747,16 +2854,6 @@ set-blocking@^2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= -setimmediate@~1.0.4: - 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" @@ -3774,11 +2871,18 @@ shebang-regex@^1.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= -signal-exit@^3.0.0, signal-exit@^3.0.2: +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" + slice-ansi@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" @@ -3788,28 +2892,54 @@ slice-ansi@^2.1.0: astral-regex "^1.0.0" is-fullwidth-code-point "^2.0.0" -slide@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" - integrity sha1-VusCfWW00tzmyy4tMsTUr8nh1wc= +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= -source-map-explorer@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/source-map-explorer/-/source-map-explorer-2.3.1.tgz#d91615a19ad1f4e08d05616bee6e30ddb770ae70" - integrity sha512-l3WQUCwaqia5x7EBnNp4GYwhXnROMz3NqKM2QMwQ3ADgjekp+enP+PHkjjbjoVX6WJ2G5mbvM6TjeE/q7fnIFw== +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.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/source-map-explorer/-/source-map-explorer-2.5.0.tgz#42e12c76743e8a0ca0579d472ea5ba623e0d0498" + integrity sha512-kWhlt0celEwwuULIY+sRoZKibc/8/Ec4ckcKThDMQW3hT7KxReYW1XktwFJIbZ2VF9Yf/hA74bcoIZOSXXQIgQ== dependencies: btoa "^1.2.1" - chalk "^3.0.0" + chalk "^4.1.0" convert-source-map "^1.7.0" - ejs "^3.0.1" + ejs "^3.1.5" escape-html "^1.0.3" glob "^7.1.6" gzip-size "^5.1.1" - lodash "^4.17.15" - open "^7.0.2" + lodash "^4.17.20" + open "^7.1.0" source-map "^0.7.3" temp "^0.9.1" - yargs "^15.1.0" + yargs "^15.4.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== source-map@^0.7.3: version "0.7.3" @@ -3847,26 +2977,16 @@ spdx-license-ids@^3.0.0: resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== +split-on-first@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f" + integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw== + 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" - stack-trace@0.0.x: version "0.0.10" resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" @@ -3877,25 +2997,27 @@ stack-trace@0.0.x: 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.0" - resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" - integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI= - -string-length@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-1.0.1.tgz#56970fb1c38558e9e70b728bf3de269ac45adfac" - integrity sha1-VpcPscOFWOnnC3KL894mmsRa36w= - dependencies: - strip-ansi "^3.0.0" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" + integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== -string-width@^2.0.0, string-width@^2.1.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" +streamsearch@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a" + integrity sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo= + +strict-uri-encode@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" + integrity sha1-ucczDHBChi9rFC3CdLvMWGbONUY= string-width@^3.0.0, string-width@^3.1.0: version "3.1.0" @@ -3934,20 +3056,6 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -strip-ansi@^3.0.0: - 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" @@ -3962,63 +3070,49 @@ strip-ansi@^6.0.0: dependencies: ansi-regex "^5.0.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-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== -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= - -superstatic@^6.0.1: - version "6.0.4" - resolved "https://registry.yarnpkg.com/superstatic/-/superstatic-6.0.4.tgz#5c38fe05e2e9513b68d5ba2798925e4839c151dd" - integrity sha512-Nfli9mSPa9fJloKuDeUOdqC1lcw4c4SnxiWPB8s7Yn1iYo7Ja3pj7qc8AXMqHVqn/Kf7QsxBjAeOJTpuJ0mcrQ== +stripe@^8.89.0: + version "8.89.0" + resolved "https://registry.yarnpkg.com/stripe/-/stripe-8.89.0.tgz#fcd48ba7e298d547c89b686dea155f0507c25e67" + integrity sha512-XiAuNAyv2ORCWZrIaG22frr7rXP1J5+XsHA4QUBwB0fePB5kxV0O6FFMrZ8nipYZ43pnez5EIJ/Oxb1jLq6w6g== dependencies: - as-array "^2.0.0" - async "^1.5.2" - basic-auth-connect "^1.0.0" - chalk "^1.1.3" - char-spinner "^1.0.1" - compare-semver "^1.0.0" - compression "^1.7.0" - connect "^3.6.2" - connect-query "^1.0.0" - destroy "^1.0.4" - fast-url-parser "^1.1.3" - fs-extra "^0.30.0" - glob "^7.1.2" - glob-slasher "^1.0.1" - home-dir "^1.0.0" - is-url "^1.2.2" - join-path "^1.1.1" - lodash "^4.17.4" - mime-types "^2.1.16" - minimatch "^3.0.4" - morgan "^1.8.2" - nash "^3.0.0" - on-finished "^2.2.0" - on-headers "^1.0.0" - path-to-regexp "^1.7.0" - router "^1.3.1" - rsvp "^3.6.2" - string-length "^1.0.0" - try-require "^1.0.0" - update-notifier "^2.5.0" + "@types/node" ">=8.1.0" + qs "^6.6.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= +stubs@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/stubs/-/stubs-3.0.0.tgz#e8d2ba1fa9c90570303c030b6900f7d5f89abe5b" + integrity sha1-6NK6H6nJBXAwPAMLaQD31fiavls= -supports-color@^5.0.0, supports-color@^5.3.0: +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" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== @@ -4039,14 +3133,6 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -supports-hyperlinks@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-1.0.1.tgz#71daedf36cc1060ac5100c351bb3da48c29c0ef7" - integrity sha512-HHi5kVSefKaJkGYXbDuKbUGRVxqnWGn3J2e39CYcNJEfWciGq2zYtOhXLTlvrOZW1QU7VX67w7fMmWafHX9Pfw== - dependencies: - has-flag "^2.0.0" - supports-color "^5.0.0" - table@^5.2.3: version "5.4.6" resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" @@ -4057,37 +3143,16 @@ table@^5.2.3: slice-ansi "^2.1.0" string-width "^3.0.0" -tar-stream@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.1.0.tgz#d1aaa3661f05b38b5acc9b7020efdca5179a2cc3" - integrity sha512-+DAn4Nb4+gz6WZigRzKEZl1QuJVOLtAwwF+WUxy1fJ6X63CaGaUAxJRD2KEn1OMfcbCjySTYpNC6WmfQoIEOdw== +teeny-request@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/teeny-request/-/teeny-request-7.0.0.tgz#0e5c090bd9102ed559ffc8c9ddb00fbe1256db30" + integrity sha512-kWD3sdGmIix6w7c8ZdVKxWq+3YwVPGWz+Mq0wRZXayEKY/YHb63b8uphfBzcFDmyq8frD9+UTc3wLyOhltRbtg== dependencies: - bl "^3.0.0" - end-of-stream "^1.4.1" - fs-constants "^1.0.0" - inherits "^2.0.3" - readable-stream "^3.1.1" - -tar@^4.3.0: - 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" - -tcp-port-used@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/tcp-port-used/-/tcp-port-used-1.0.1.tgz#46061078e2d38c73979a2c2c12b5a674e6689d70" - integrity sha512-rwi5xJeU6utXoEIiMvVBMc9eJ2/ofzB+7nLOdnZuFTmNCLqRiQh2sMG9MqCxHU/69VC/Fwp5dV9306Qd54ll1Q== - dependencies: - debug "4.1.0" - is2 "2.0.1" + http-proxy-agent "^4.0.0" + https-proxy-agent "^5.0.0" + node-fetch "^2.2.0" + stream-events "^1.0.5" + uuid "^8.0.0" temp@^0.9.1: version "0.9.1" @@ -4096,25 +3161,23 @@ temp@^0.9.1: dependencies: rimraf "~2.6.2" -term-size@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" - integrity sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk= - dependencies: - execa "^0.7.0" +text-hex@1.0.x: + version "1.0.0" + resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" + integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== 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= -through2@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.1.tgz#384e75314d49f32de12eebb8136b8eb6b5d59da9" - integrity sha1-OE51MU1J8y3hLuu4E2uOtrXVnak= +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.0.0" - xtend "~4.0.0" + readable-stream "~2.3.6" + xtend "~4.0.1" through2@^3.0.1: version "3.0.1" @@ -4123,102 +3186,80 @@ through2@^3.0.1: dependencies: readable-stream "2 || 3" -"through@>=2.2.7 <3", through@^2.3.6: +through2@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/through2/-/through2-4.0.2.tgz#a7ce3ac2a7a8b0b966c80e7c49f0484c3b239764" + integrity sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw== + dependencies: + readable-stream "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= -timed-out@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" - integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= +thunkify@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/thunkify/-/thunkify-2.1.2.tgz#faa0e9d230c51acc95ca13a361ac05ca7e04553d" + integrity sha1-+qDp0jDFGsyVyhOjYawFyn4EVT0= -timers-ext@^0.1.5: - version "0.1.7" - resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.7.tgz#6f57ad8578e07a3fb9f91d9387d65647555e25c6" - integrity sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ== - dependencies: - es5-ext "~0.10.46" - next-tick "1" - -tmp@0.0.33, tmp@^0.0.33: +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" -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" - 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.4.3: - version "2.4.3" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" - integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== +tough-cookie@^2.0.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.24" - punycode "^1.4.1" - -toxic@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/toxic/-/toxic-1.0.1.tgz#8c2e2528da591100adc3883f2c0e56acfb1c7288" - integrity sha512-WI3rIGdcaKULYg7KVoB0zcjikqvcYYvcuT6D89bFPz2rVR0Rl0PK6x8/X62rtdLtBKIE985NzVf/auTtGegIIg== - dependencies: - lodash "^4.17.10" - -"traverse@>=0.3.0 <0.4": - version "0.3.9" - resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.3.9.tgz#717b8f220cc0bb7b44e40514c22b2e8bbc70d8b9" - integrity sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk= + psl "^1.1.28" + punycode "^2.1.1" tree-kill@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== -try-require@^1.0.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/try-require/-/try-require-1.2.1.tgz#34489a2cac0c09c1cc10ed91ba011594d4333be2" - integrity sha1-NEiaLKwMCcHMEO2RugEVlNQzO+I= +triple-beam@^1.2.0, triple-beam@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.3.0.tgz#a595214c7298db8339eeeee083e4d10bd8cb8dd9" + integrity sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw== + +tslib@^1.11.1: + version "1.13.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" + integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== 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== -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" +tsscmp@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/tsscmp/-/tsscmp-1.0.6.tgz#85b99583ac3589ec4bfef825b5000aa911d605eb" + integrity sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA== -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= - -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.49.0: + version "3.49.0" + resolved "https://registry.yarnpkg.com/twilio/-/twilio-3.49.0.tgz#4c2caa9fb9f293c4535fb8e87c4bbe4ee928f11c" + integrity sha512-XuWny4sqj92ch3dQhC6WhGcPSODOOFd3fgkYocSi5j59Rq1DwAxGL4b9MgM5to4CbrGlm4Qr4gaxffiQsRfyEQ== 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" @@ -4231,6 +3272,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" @@ -4244,74 +3290,44 @@ type-is@~1.6.17, type-is@~1.6.18: 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== +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" -type@^2.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" + integrity sha512-JUPoL1jHsc9fOjVFHdQIhqEEJsQvfKDjlubcCilu8U26uZ73qOg8VsN8O1jbuei44ZPlwL7kmbAdM4tzaUvqnA== + dependencies: + commander "~2.20.3" + +uid-safe@2.1.5: + version "2.1.5" + resolved "https://registry.yarnpkg.com/uid-safe/-/uid-safe-2.1.5.tgz#2b3d5c7240e8fc2e58f8aa269e5ee49c0857bd3a" + integrity sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA== + dependencies: + random-bytes "~1.0.0" + +unique-string@^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== - -unique-string@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" - integrity sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo= + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" + integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== dependencies: - crypto-random-string "^1.0.0" - -universal-analytics@^0.4.16: - version "0.4.20" - resolved "https://registry.yarnpkg.com/universal-analytics/-/universal-analytics-0.4.20.tgz#d6b64e5312bf74f7c368e3024a922135dbf24b03" - integrity sha512-gE91dtMvNkjO+kWsPstHRtSwHXz0l2axqptGYp5ceg4MsuurloM0PU3pdOfpb5zBXUvyjT4PwhWK2m39uczZuw== - dependencies: - debug "^3.0.0" - request "^2.88.0" - uuid "^3.0.0" + 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" integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= -unzip-response@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" - integrity sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c= - -unzipper@^0.10.5: - version "0.10.5" - resolved "https://registry.yarnpkg.com/unzipper/-/unzipper-0.10.5.tgz#4d189ae6f8af634b26efe1a1817c399e0dd4a1a0" - integrity sha512-i5ufkXNjWZYxU/0nKKf6LkvW8kn9YzRvfwuPWjXP+JTFce/8bqeR0gEfbiN2IDdJa6ZU6/2IzFRLK0z1v0uptw== - dependencies: - big-integer "^1.6.17" - binary "~0.3.0" - bluebird "~3.4.1" - buffer-indexof-polyfill "~1.0.0" - duplexer2 "~0.1.4" - fstream "^1.0.12" - graceful-fs "^4.2.2" - listenercount "~1.0.1" - readable-stream "~2.3.6" - setimmediate "~1.0.4" - -update-notifier@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6" - integrity sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw== - dependencies: - boxen "^1.2.1" - chalk "^2.0.1" - configstore "^3.0.0" - import-lazy "^2.1.0" - is-ci "^1.0.10" - is-installed-globally "^0.1.0" - is-npm "^1.0.0" - latest-version "^3.0.0" - semver-diff "^2.0.0" - xdg-basedir "^3.0.0" - uri-js@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" @@ -4319,18 +3335,6 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -url-join@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/url-join/-/url-join-0.0.1.tgz#1db48ad422d3402469a87f7d97bdebfe4fb1e3c8" - integrity sha1-HbSK1CLTQCRpqH99l73r/k+x48g= - -url-parse-lax@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" - integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM= - dependencies: - prepend-http "^1.0.1" - url-parse@^1.4.7: version "1.4.7" resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.7.tgz#a8a83535e8c00a316e403a5db4ac1b9b853ae278" @@ -4339,14 +3343,6 @@ url-parse@^1.4.7: querystringify "^2.1.1" requires-port "^1.0.0" -url@0.10.3: - version "0.10.3" - resolved "https://registry.yarnpkg.com/url/-/url-0.10.3.tgz#021e4d9c7705f21bbf37d03ceb58767402774c64" - integrity sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ= - dependencies: - punycode "1.3.2" - querystring "0.2.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" @@ -4357,31 +3353,16 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= -uuid@3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" - integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== - -uuid@^2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" - integrity sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho= - -uuid@^3.0.0, uuid@^3.3.2: - version "3.3.3" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.3.tgz#4568f0216e78760ee1dbf3a4d2cf53e224112866" - integrity sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ== +uuid@^8.0.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.0.tgz#ab738085ca22dc9a8c92725e459b1d507df5d6ea" + integrity sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ== 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== -valid-url@^1: - version "1.0.9" - resolved "https://registry.yarnpkg.com/valid-url/-/valid-url-1.0.9.tgz#1c14479b40f1397a75782f115e4086447433a200" - integrity sha1-HBRHm0DxOXp1eC8RXkCGRHQzogA= - 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" @@ -4395,36 +3376,29 @@ vary@^1, vary@~1.1.2: resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= -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" - 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== -wcwidth@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" - integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= - dependencies: - defaults "^1.0.3" - 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-module@^2.0.0: version "2.0.0" @@ -4438,31 +3412,39 @@ which@^1.2.9: dependencies: isexe "^2.0.0" -widest-line@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" - integrity sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA== +winston-transport@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.4.0.tgz#17af518daa690d5b2ecccaa7acf7b20ca7925e59" + integrity sha512-Lc7/p3GtqtqPBYYtS6KCN3c77/2QCev51DvcJKbkFPQNoj1sinkGwLGFDxkXY9J6p9+EPnYs+D90uwbnaiURTw== dependencies: - string-width "^2.1.1" + readable-stream "^2.3.7" + triple-beam "^1.2.0" -winston@^1.0.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/winston/-/winston-1.1.2.tgz#68edd769ff79d4f9528cf0e5d80021aade67480c" - integrity sha1-aO3Xaf951PlSjPDl2AAhqt5nSAw= +winston@^3.1.0: + version "3.3.3" + resolved "https://registry.yarnpkg.com/winston/-/winston-3.3.3.tgz#ae6172042cafb29786afa3d09c8ff833ab7c9170" + integrity sha512-oEXTISQnC8VlSAKf1KYSSd7J6IWuRPQqDdo8eoRNaYKLvwSb5+79Z3Yi1lrl6KDpU6/VWaxpakDAtb1oQ4n9aw== dependencies: - async "~1.0.0" - colors "1.0.x" - cycle "1.0.x" - eyes "0.1.x" - isstream "0.1.x" - pkginfo "0.3.x" + "@dabh/diagnostics" "^2.0.2" + async "^3.1.0" + is-stream "^2.0.0" + logform "^2.2.0" + one-time "^1.0.0" + readable-stream "^3.4.0" stack-trace "0.0.x" + triple-beam "^1.3.0" + winston-transport "^4.4.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== +wordwrap@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= + wrap-ansi@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" @@ -4486,23 +3468,15 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= -write-file-atomic@^1.1.2: - version "1.3.4" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.4.tgz#f807a4f0b1d9e913ae7a48112e6cc3af1991b45f" - integrity sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8= +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: - graceful-fs "^4.1.11" - imurmurhash "^0.1.4" - slide "^1.1.5" - -write-file-atomic@^2.0.0: - version "2.4.3" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" - integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== - dependencies: - graceful-fs "^4.1.11" 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" @@ -4511,42 +3485,27 @@ write@1.0.3: dependencies: mkdirp "^0.5.1" -xdg-basedir@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-2.0.0.tgz#edbc903cc385fc04523d966a335504b5504d1bd2" - integrity sha1-7byQPMOF/ARSPZZqM1UEtVBNG9I= - dependencies: - os-homedir "^1.0.0" - -xdg-basedir@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" - integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ= - -xml2js@0.4.19: - version "0.4.19" - resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7" - integrity sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q== - dependencies: - sax ">=0.6.0" - xmlbuilder "~9.0.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@^9.0.7, xmlbuilder@~9.0.1: - version "9.0.7" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" - integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0= +xmlbuilder@^15.1.1: + version "15.1.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-15.1.1.tgz#9dcdce49eea66d8d10b42cae94a79c3c8d0c2ec5" + integrity sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg== -xmldom@0.1.x: - version "0.1.27" - resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9" - integrity sha1-1QH5ezvbQDr4757MIFcxh6rawOk= +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.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== @@ -4561,10 +3520,10 @@ 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: - 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== yargs-parser@^13.1.1: version "13.1.1" @@ -4574,10 +3533,10 @@ yargs-parser@^13.1.1: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^18.1.0: - version "18.1.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.0.tgz#1b0ab1118ebd41f68bb30e729f4c83df36ae84c3" - integrity sha512-o/Jr6JBOv6Yx3pL+5naWSoIA2jJ+ZkMYQG/ie9qFbukBe4uzmBatlXFOiu/tNKRWEtyf+n5w7jc/O16ufqOTdQ== +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" @@ -4598,10 +3557,10 @@ yargs@^13.3.0: y18n "^4.0.0" yargs-parser "^13.1.1" -yargs@^15.1.0: - version "15.3.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.3.0.tgz#403af6edc75b3ae04bf66c94202228ba119f0976" - integrity sha512-g/QCnmjgOl1YJjGsnUg2SatC7NUYEiLXJqxNOQU9qSpjzGtGXda9b+OKccr1kLTy8BN9yqEyqfq5lxlwdc13TA== +yargs@^15.4.1: + 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" @@ -4613,13 +3572,4 @@ yargs@^15.1.0: string-width "^4.2.0" which-module "^2.0.0" y18n "^4.0.0" - yargs-parser "^18.1.0" - -zip-stream@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-2.1.2.tgz#841efd23214b602ff49c497cba1a85d8b5fbc39c" - integrity sha512-ykebHGa2+uzth/R4HZLkZh3XFJzivhVsjJt8bN3GvBzLaqqrUdRacu+c4QtnUgjkkQfsOuNE1JgLKMCPNmkKgg== - dependencies: - archiver-utils "^2.1.0" - compress-commons "^2.1.1" - readable-stream "^3.4.0" + yargs-parser "^18.1.2"