diff --git a/.env b/.env index 5afa72dc6..e5b4a00f9 100644 --- a/.env +++ b/.env @@ -8,7 +8,7 @@ MAIL_FROM_ADDRESS= MAIL_FROM_NAME= DB_CLIENT=mysql -DB_HOST=localhost +DB_HOST=127.0.0.1 DB_USER=root -DB_PASSWORD=root +DB_PASSWORD=123123123 DB_NAME=ratteb diff --git a/.vscode/settings.json b/.vscode/settings.json index 20251dd19..fa780b6a1 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -25,5 +25,6 @@ "editor.useTabStops": false, "editor.tabSize": 2, "editor.insertSpaces": true, + "git.ignoreLimitWarning": true, } \ No newline at end of file diff --git a/client/package-lock.json b/client/package-lock.json index 8e7eeef03..d0046898c 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -1041,6 +1041,24 @@ } } }, + "@blueprintjs/datetime": { + "version": "3.15.2", + "resolved": "https://registry.npmjs.org/@blueprintjs/datetime/-/datetime-3.15.2.tgz", + "integrity": "sha512-FQw1BqbO9RBKzLWiXHkSVFxyGFRXHaugG5ST4go+p2IibrxuRDjD6YvrFXo+FLEzi+MsftMo6FkPNm2xApfmHw==", + "requires": { + "@blueprintjs/core": "^3.23.0", + "classnames": "^2.2", + "react-day-picker": "7.3.2", + "tslib": "~1.9.0" + }, + "dependencies": { + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" + } + } + }, "@blueprintjs/icons": { "version": "3.13.0", "resolved": "https://registry.npmjs.org/@blueprintjs/icons/-/icons-3.13.0.tgz", @@ -1057,6 +1075,42 @@ } } }, + "@blueprintjs/select": { + "version": "3.11.2", + "resolved": "https://registry.npmjs.org/@blueprintjs/select/-/select-3.11.2.tgz", + "integrity": "sha512-fU0Km6QI/ayWhzYeu9N1gTj0+L0XUO4KB3u2LfJXgj648UGY8F4HX2ETdJ+XPdtsu6TesrIL7ghMQhtLcvafBg==", + "requires": { + "@blueprintjs/core": "^3.20.0", + "classnames": "^2.2", + "tslib": "~1.9.0" + }, + "dependencies": { + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" + } + } + }, + "@blueprintjs/table": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/@blueprintjs/table/-/table-3.8.3.tgz", + "integrity": "sha512-ppyXy/8USvTe+HHl6VGJk+GqJalwzutTJNAiZMgpTJh8UglH8/245IpDpIlAYlyNW98RhMtloB+5UuBWHpxmhA==", + "requires": { + "@blueprintjs/core": "^3.23.1", + "classnames": "^2.2", + "prop-types": "^15.6.0", + "react-lifecycles-compat": "^3.0.4", + "tslib": "~1.9.0" + }, + "dependencies": { + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" + } + } + }, "@cnakazawa/watch": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", @@ -1491,6 +1545,180 @@ "loader-utils": "^1.2.3" } }, + "@syncfusion/ej2-base": { + "version": "17.4.47", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-base/-/ej2-base-17.4.47.tgz", + "integrity": "sha512-NtW0IKgLYzq4fZBmyG+kT3WEDqD9Wq+fsUkg6k1xQjp8Xy6zCqJul2U15BDF8GwY9nIH/nvsoPFV5+025ypJnA==", + "requires": { + "@syncfusion/ej2-icons": "~17.4.47" + } + }, + "@syncfusion/ej2-buttons": { + "version": "17.4.49", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-buttons/-/ej2-buttons-17.4.49.tgz", + "integrity": "sha512-1Ohe1q8lwg+8e7f0TQzOdDS4l1giDArz3OqPeH92loQvnG2naXG7kHsKaAaADa/0x1B7vWZKLYBg63t30F1RcA==", + "requires": { + "@syncfusion/ej2-base": "~17.4.47" + } + }, + "@syncfusion/ej2-calendars": { + "version": "17.4.50", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-calendars/-/ej2-calendars-17.4.50.tgz", + "integrity": "sha512-ISjzpn1TF67v9vsw3HVaXD/L/ZyWX9iyDW0mMvaIlRliymp7liaFvW/gQE/4okOp7+v6dMW6dGm0bDvC8kFS1A==", + "requires": { + "@syncfusion/ej2-base": "~17.4.47", + "@syncfusion/ej2-buttons": "~17.4.49", + "@syncfusion/ej2-inputs": "~17.4.47", + "@syncfusion/ej2-lists": "~17.4.47", + "@syncfusion/ej2-popups": "~17.4.49" + } + }, + "@syncfusion/ej2-compression": { + "version": "17.4.47", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-compression/-/ej2-compression-17.4.47.tgz", + "integrity": "sha512-Rcwh6wmbwnvzQdASx4xw2WHwtsLZUasS+7a2eXwtuJM+J8tgmxVA/UXXFcb62BoInGMn8aBzfDf9vd2eulvZJg==", + "requires": { + "@syncfusion/ej2-file-utils": "~17.4.47" + } + }, + "@syncfusion/ej2-data": { + "version": "17.4.47", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-data/-/ej2-data-17.4.47.tgz", + "integrity": "sha512-gcpGo6PAlp47mf+WkIS7dUfi2Z9ZEXfs5wdDogDikEUkspPvsQHN853lZj861uXBhtCRMmI4RwIf6K91sZVZAg==", + "requires": { + "@syncfusion/ej2-base": "~17.4.47" + } + }, + "@syncfusion/ej2-dropdowns": { + "version": "17.4.50", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-dropdowns/-/ej2-dropdowns-17.4.50.tgz", + "integrity": "sha512-Fvj1rivIc0d76e1CWFaqluNsxvuj3m8gKcFLilVhgli4Z4RseKfoxLjggoa9l5M9dpGDdqHbTgiqKE7XXk1rZA==", + "requires": { + "@syncfusion/ej2-base": "~17.4.47", + "@syncfusion/ej2-data": "~17.4.47", + "@syncfusion/ej2-inputs": "~17.4.47", + "@syncfusion/ej2-lists": "~17.4.47", + "@syncfusion/ej2-popups": "~17.4.49" + } + }, + "@syncfusion/ej2-excel-export": { + "version": "17.4.47", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-excel-export/-/ej2-excel-export-17.4.47.tgz", + "integrity": "sha512-TjVNHqJ9deZ2FvtaFlXsYaJXNNZCq9e7IesetZiA9mR/l4TYLhCOm1TWtsI2saTNlQV9Vm2nHyEZWLU+lNz9Lw==", + "requires": { + "@syncfusion/ej2-base": "~17.4.47", + "@syncfusion/ej2-compression": "~17.4.47" + } + }, + "@syncfusion/ej2-file-utils": { + "version": "17.4.47", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-file-utils/-/ej2-file-utils-17.4.47.tgz", + "integrity": "sha512-z3QLUkerENnO65HhTwp0v/O2OPzGKOKCve7Nq0CCL5PCwsZfrWoHzPmiZrbUIYU/29dniOrreb9t9lHf30sY5w==" + }, + "@syncfusion/ej2-grids": { + "version": "17.4.50", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-grids/-/ej2-grids-17.4.50.tgz", + "integrity": "sha512-BxOmOgkluJl/64sxOgWJAXbyw8QE0nwfmkwE8pdih4nJ7pjPd43fJcrDYCF+2YOAH/MilE/mxWpWx0ruYbsfxw==", + "requires": { + "@syncfusion/ej2-base": "~17.4.47", + "@syncfusion/ej2-buttons": "~17.4.49", + "@syncfusion/ej2-calendars": "~17.4.50", + "@syncfusion/ej2-compression": "~17.4.47", + "@syncfusion/ej2-data": "~17.4.47", + "@syncfusion/ej2-dropdowns": "~17.4.50", + "@syncfusion/ej2-excel-export": "~17.4.47", + "@syncfusion/ej2-file-utils": "~17.4.47", + "@syncfusion/ej2-inputs": "~17.4.47", + "@syncfusion/ej2-lists": "~17.4.47", + "@syncfusion/ej2-navigations": "~17.4.50", + "@syncfusion/ej2-pdf-export": "~17.4.47", + "@syncfusion/ej2-popups": "~17.4.49", + "@syncfusion/ej2-splitbuttons": "~17.4.49" + } + }, + "@syncfusion/ej2-icons": { + "version": "17.4.47", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-icons/-/ej2-icons-17.4.47.tgz", + "integrity": "sha512-u+6f53FUKPEOVf2ZXVTFOZtqNSkoe4z0VDHjOQXIeX1iLnBjTEgKoKiQXEZGncB814wKW2RJ6htEhgVZW6yxzw==" + }, + "@syncfusion/ej2-inputs": { + "version": "17.4.47", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-inputs/-/ej2-inputs-17.4.47.tgz", + "integrity": "sha512-Eo3eAbFEHcQesr2vvhwx8gGEoY2KHmHa9lPjkmRqb+fAcLieWMU+Wl5VO0UN3dE+Fx28QCEkWS/7pfuvnJLnrg==", + "requires": { + "@syncfusion/ej2-base": "~17.4.47", + "@syncfusion/ej2-buttons": "~17.4.47", + "@syncfusion/ej2-popups": "~17.4.47", + "@syncfusion/ej2-splitbuttons": "~17.4.47" + } + }, + "@syncfusion/ej2-lists": { + "version": "17.4.47", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-lists/-/ej2-lists-17.4.47.tgz", + "integrity": "sha512-DAGxrScsuToio1jEPx4GaKDEKf+TMO7O6UetP3i/F4Xj6XDkSGBap+q2t0cVq5Sy8V87Isv1IFFvPXZ7aWNJRg==", + "requires": { + "@syncfusion/ej2-base": "~17.4.47", + "@syncfusion/ej2-buttons": "~17.4.47", + "@syncfusion/ej2-data": "~17.4.47" + } + }, + "@syncfusion/ej2-navigations": { + "version": "17.4.50", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-navigations/-/ej2-navigations-17.4.50.tgz", + "integrity": "sha512-1imwHDmLL2nf3GpAMI4Q4LmJJjxpkCPqkir8K3hSmFtZE2mBBTgqasU3bcoXP+kwIpx+S4DKCnm01i3x6XqHWQ==", + "requires": { + "@syncfusion/ej2-base": "~17.4.47", + "@syncfusion/ej2-buttons": "~17.4.49", + "@syncfusion/ej2-data": "~17.4.47", + "@syncfusion/ej2-inputs": "~17.4.47", + "@syncfusion/ej2-lists": "~17.4.47", + "@syncfusion/ej2-popups": "~17.4.49" + } + }, + "@syncfusion/ej2-pdf-export": { + "version": "17.4.47", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-pdf-export/-/ej2-pdf-export-17.4.47.tgz", + "integrity": "sha512-HoKeYXYBkWRPuqWj3XJeoLoDc9+2tVuPgaStsTaW+vyDOwFdZt8Y8X1ghKDTENKnGHWT2sqRhTqNFOxylg1Y4Q==", + "requires": { + "@syncfusion/ej2-compression": "~17.4.47" + } + }, + "@syncfusion/ej2-popups": { + "version": "17.4.49", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-popups/-/ej2-popups-17.4.49.tgz", + "integrity": "sha512-4T9I+PoSwPnE9sTUI3dttxUTIppW/dsVSwi/XoCsASsQqrT4U0As27o1tek9v1FshydZRna9R6iX9pv0ux663w==", + "requires": { + "@syncfusion/ej2-base": "~17.4.47", + "@syncfusion/ej2-buttons": "~17.4.49" + } + }, + "@syncfusion/ej2-react-base": { + "version": "17.4.49", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-react-base/-/ej2-react-base-17.4.49.tgz", + "integrity": "sha512-TquWHwdqT5P+rMVYVienMsz/vEEmAt+bZODi3xmlhA4p27HJELbKVGlafjo+6tdEZe0XjQtiaGow8ikyIg4mvA==", + "requires": { + "@syncfusion/ej2-base": "~17.4.47" + } + }, + "@syncfusion/ej2-react-grids": { + "version": "17.4.50", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-react-grids/-/ej2-react-grids-17.4.50.tgz", + "integrity": "sha512-kYGAnrIj0YcOT9Egzwu+9DI5UFq05Yvn+VWh9Gqcpz6gDif3dXy4aNDOlS+rXbJaw/DzZjxjD4aMh4shF6F6BA==", + "requires": { + "@syncfusion/ej2-base": "~17.4.47", + "@syncfusion/ej2-grids": "17.4.50", + "@syncfusion/ej2-react-base": "~17.4.49" + } + }, + "@syncfusion/ej2-splitbuttons": { + "version": "17.4.49", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-splitbuttons/-/ej2-splitbuttons-17.4.49.tgz", + "integrity": "sha512-nnBFzoR5UxCPaaQZUV31L9+hL13x223Tt7lhvqnxTDNmDb2MTwXQ3PPN/VYhza1AQnQjY17Ro7HPqPF7pbMnHQ==", + "requires": { + "@syncfusion/ej2-base": "~17.4.47", + "@syncfusion/ej2-popups": "~17.4.49" + } + }, "@testing-library/dom": { "version": "6.12.2", "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-6.12.2.tgz", @@ -1606,6 +1834,15 @@ "hoist-non-react-statics": "^3.3.0" } }, + "@types/http-proxy": { + "version": "1.17.3", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.3.tgz", + "integrity": "sha512-wIPqXANye5BbORbuh74exbwNzj+UWCwWyeEFJzUQ7Fq3W2NSAy+7x7nX1fgbEypr2/TdKqpeuxLnXWgzN533/Q==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/invariant": { "version": "2.2.31", "resolved": "https://registry.npmjs.org/@types/invariant/-/invariant-2.2.31.tgz", @@ -1633,6 +1870,11 @@ "@types/istanbul-lib-report": "*" } }, + "@types/js-cookie": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-2.2.4.tgz", + "integrity": "sha512-WTfSE1Eauak/Nrg6cA9FgPTFvVawejsai6zXoq0QYTQ3mxONeRtGhKxa7wMlUzWWmzrmTeV+rwLjHgsCntdrsA==" + }, "@types/json-schema": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz", @@ -1680,6 +1922,11 @@ "@types/react": "*" } }, + "@types/sortablejs": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/@types/sortablejs/-/sortablejs-1.10.2.tgz", + "integrity": "sha512-aWK2oTpbjNmLyexl95L4ttd0kFIvbMIf1JR2YbNhUwIk9Y1cOwfAfyvfxBBmtg1ZDy64gpbgEdFjyqnzjh+3/A==" + }, "@types/stack-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", @@ -1920,6 +2167,11 @@ "@xtuc/long": "4.2.2" } }, + "@xobotyi/scrollbar-width": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@xobotyi/scrollbar-width/-/scrollbar-width-1.9.0.tgz", + "integrity": "sha512-W8oNXd3HkW9eQHxk+47iRx4aqd0yIV9NoeykUTd0uE0sYx3LOAQE7rfHOd8xtMP7IADfLIdG0o0H1sXvHUF7dw==" + }, "@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", @@ -2690,6 +2942,79 @@ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" }, + "basscss": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/basscss/-/basscss-8.0.2.tgz", + "integrity": "sha1-4FK1qpXuTV6hGAG8djudco9MAfY=", + "requires": { + "basscss-align": "^1.0.2", + "basscss-border": "^4.0.2", + "basscss-flexbox": "^1.0.1", + "basscss-grid": "^2.0.0", + "basscss-hide": "^1.0.1", + "basscss-layout": "^3.1.0", + "basscss-margin": "^1.0.7", + "basscss-padding": "^1.1.3", + "basscss-position": "^2.0.3", + "basscss-type-scale": "^1.0.5", + "basscss-typography": "^3.0.3" + } + }, + "basscss-align": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/basscss-align/-/basscss-align-1.0.2.tgz", + "integrity": "sha1-KUqmidb5nahuSvTFwokocIVcHDc=" + }, + "basscss-border": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/basscss-border/-/basscss-border-4.0.2.tgz", + "integrity": "sha1-FLRQYym5DLFKvl9NNHPp/pIC3y4=" + }, + "basscss-flexbox": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/basscss-flexbox/-/basscss-flexbox-1.0.2.tgz", + "integrity": "sha512-AtG6yBmmza2nPo3x9X4/7rbW22gLmiSvYvirFs7Aspt1zp5FHwpRBz3BD2v/a3qPdmVM8OvOLVNWISGM6O50MA==" + }, + "basscss-grid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/basscss-grid/-/basscss-grid-2.0.0.tgz", + "integrity": "sha1-b0wxmOeGo4Up+DYrw7O85SVME2k=" + }, + "basscss-hide": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/basscss-hide/-/basscss-hide-1.0.1.tgz", + "integrity": "sha1-NLwTi7qGfGxJq4aCphDvSV5H11A=" + }, + "basscss-layout": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/basscss-layout/-/basscss-layout-3.1.0.tgz", + "integrity": "sha1-+fOS5IDaZmV9n+XenKTAfFecOk4=" + }, + "basscss-margin": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/basscss-margin/-/basscss-margin-1.0.9.tgz", + "integrity": "sha512-wpF8tXrtzU+iMtLvfSgYJlpkIxChOlay3YumoI+yJ6IiOe5uMmEGUG8FWAIkC8QalkKDAURAqHmQ4nbuyUvyag==" + }, + "basscss-padding": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/basscss-padding/-/basscss-padding-1.1.3.tgz", + "integrity": "sha1-adt5lBTm3Vi+2Dd2lSzCmeLmh04=" + }, + "basscss-position": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/basscss-position/-/basscss-position-2.0.3.tgz", + "integrity": "sha1-RnGAofjzhukHLtjQgpTSpuC6QwU=" + }, + "basscss-type-scale": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/basscss-type-scale/-/basscss-type-scale-1.0.6.tgz", + "integrity": "sha512-93KOVRr5iX0e38d6+k2pQ8WW1IA5DigQhJextts4rwbSt2+cr+XrokGJ74HB8LevO54HMoc3VJ8M6oOR2puc8A==" + }, + "basscss-typography": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/basscss-typography/-/basscss-typography-3.0.4.tgz", + "integrity": "sha512-PMCxUfYPpAj8gQV8qI09lfNp7eWNrKtQFkCN2fZjLyReSY/wnw8QP8irpvbJ67vSEhlkA6ZP8j7vmTDoxkyu8g==" + }, "batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", @@ -2800,6 +3125,11 @@ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" }, + "bowser": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-1.9.4.tgz", + "integrity": "sha512-9IdMmj2KjigRq6oWhmwv1W36pDuA4STQZ8q6YO9um+x07xgYNCD3Oou+WP/3L1HNz7iqythGet3/p4wvc8AAwQ==" + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -3577,6 +3907,14 @@ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" }, + "copy-to-clipboard": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz", + "integrity": "sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw==", + "requires": { + "toggle-selection": "^1.0.6" + } + }, "core-js": { "version": "3.6.4", "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz", @@ -3760,6 +4098,15 @@ } } }, + "css-in-js-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/css-in-js-utils/-/css-in-js-utils-2.0.1.tgz", + "integrity": "sha512-PJF0SpJT+WdbVVt0AOYp9C8GnuruRlL/UFW7932nLWmFLQTaWEzTBQEx7/hn4BuV+WON75iAViSUJLiU3PKbpA==", + "requires": { + "hyphenate-style-name": "^1.0.2", + "isobject": "^3.0.1" + } + }, "css-loader": { "version": "3.4.2", "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.4.2.tgz", @@ -4517,6 +4864,14 @@ "is-arrayish": "^0.2.1" } }, + "error-stack-parser": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz", + "integrity": "sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==", + "requires": { + "stackframe": "^1.1.1" + } + }, "es-abstract": { "version": "1.17.4", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", @@ -5391,6 +5746,16 @@ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" }, + "fast-shallow-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-shallow-equal/-/fast-shallow-equal-1.0.0.tgz", + "integrity": "sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw==" + }, + "fastest-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fastest-stable-stringify/-/fastest-stable-stringify-1.0.1.tgz", + "integrity": "sha1-kSLUBtTJ2YvqZEpraFPVh0uHsCg=" + }, "faye-websocket": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", @@ -6341,14 +6706,61 @@ } }, "http-proxy-middleware": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", - "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-1.0.0.tgz", + "integrity": "sha512-1yM4gD7R/U9R5AwA6STkoj8JfjnMeZIUrd8e23Yc14A7xVVLUWlAikgvidklwq1UOroJ07sc6NWNULeOJMYOeQ==", + "dev": true, "requires": { - "http-proxy": "^1.17.0", - "is-glob": "^4.0.0", - "lodash": "^4.17.11", - "micromatch": "^3.1.10" + "@types/http-proxy": "^1.17.3", + "http-proxy": "^1.18.0", + "is-glob": "^4.0.1", + "lodash": "^4.17.15", + "micromatch": "^4.0.2" + }, + "dependencies": { + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + } } }, "http-signature": { @@ -6366,6 +6778,11 @@ "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" }, + "hyphenate-style-name": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.3.tgz", + "integrity": "sha512-EcuixamT82oplpoJ2XU4pDtKGWQ7b00CD9f1ug9IaQ3p1bkHMiKCZ9ut9QDI6qsa6cpUuB+A/I+zLtdNK4n2DQ==" + }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -6488,6 +6905,15 @@ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" }, + "inline-style-prefixer": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-4.0.2.tgz", + "integrity": "sha512-N8nVhwfYga9MiV9jWlwfdj1UDIaZlBFu4cJSJkIr7tZX7sHpHhGR5su1qdpW+7KPL8ISTvCIkcaFi/JdBknvPg==", + "requires": { + "bowser": "^1.7.3", + "css-in-js-utils": "^2.0.0" + } + }, "inquirer": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.4.tgz", @@ -7925,6 +8351,11 @@ "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.2.tgz", "integrity": "sha512-Vg8czh0Q7sFBSUMWWArX/miJeBWYBPpdU/3M/DKSaekLMqrqVPaedp+5mZhie/r0lgrcaYBfwXatEew6gwgiQQ==" }, + "js-cookie": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz", + "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==" + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -8820,6 +9251,11 @@ } } }, + "moment": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", + "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" + }, "move-concurrently": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", @@ -8862,6 +9298,21 @@ "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" }, + "nano-css": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/nano-css/-/nano-css-5.3.0.tgz", + "integrity": "sha512-uM/9NGK9/E9/sTpbIZ/bQ9xOLOIHZwrrb/CRlbDHBU/GFS7Gshl24v/WJhwsVViWkpOXUmiZ66XO7fSB4Wd92Q==", + "requires": { + "css-tree": "^1.0.0-alpha.28", + "csstype": "^2.5.5", + "fastest-stable-stringify": "^1.0.1", + "inline-style-prefixer": "^4.0.0", + "rtl-css-js": "^1.9.0", + "sourcemap-codec": "^1.4.1", + "stacktrace-js": "^2.0.0", + "stylis": "3.5.0" + } + }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -11034,6 +11485,14 @@ "whatwg-fetch": "^3.0.0" } }, + "react-day-picker": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/react-day-picker/-/react-day-picker-7.3.2.tgz", + "integrity": "sha512-mij2j2Un/v2V2ow+hf/hFBMdl6Eis/C/YhBtlI6Xpbvh3Q6WMix78zEkCdw6i9GldafOrpnupWKofv/h5oSI4g==", + "requires": { + "prop-types": "^15.6.2" + } + }, "react-dev-utils": { "version": "10.2.0", "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-10.2.0.tgz", @@ -11177,6 +11636,14 @@ "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-2.0.4.tgz", "integrity": "sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==" }, + "react-grid-system": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/react-grid-system/-/react-grid-system-6.2.3.tgz", + "integrity": "sha512-vkSKzsnI2lyAgO5IDJu/YdOE4Ag67GOH0dZHE7AfCstnh+2kK2fCFZWPgW7r0Gwve34QQNKw0Pv5EVjemBWVpA==", + "requires": { + "prop-types": "^15.7.2" + } + }, "react-hook-form": { "version": "4.9.4", "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-4.9.4.tgz", @@ -11294,6 +11761,29 @@ "tiny-warning": "^1.0.0" } }, + "react-sortablejs": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/react-sortablejs/-/react-sortablejs-2.0.11.tgz", + "integrity": "sha512-Id44yygU6H/fNRp0uWkGZnKGuBF8GF/Ts6gKX5NfwmzceRjH0e0XHsmBuQ6WXhBIVnMM+XgkEPub851mdti0TA==", + "requires": { + "@types/sortablejs": "^1.10.0", + "classnames": "^2.2.6", + "sortablejs": "1.10.1", + "tiny-invariant": "^1.0.6" + }, + "dependencies": { + "sortablejs": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.10.1.tgz", + "integrity": "sha512-N6r7GrVmO8RW1rn0cTdvK3JR0BcqecAJ0PmYMCL3ZuqTH3pY+9QyqkmJSkkLyyDvd+AJnwaxTP22Ybr/83V9hQ==" + } + } + }, + "react-table": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/react-table/-/react-table-7.0.0.tgz", + "integrity": "sha512-/RKUYLuqrupUs0qHdjdQLmgwdQ9mgXPnpshqv2T+OQUGhTu0XuLXVc6GOIywemXNf6qjL3dj81O6zALLK74Emw==" + }, "react-transition-group": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz", @@ -11305,6 +11795,26 @@ "react-lifecycles-compat": "^3.0.4" } }, + "react-use": { + "version": "13.26.1", + "resolved": "https://registry.npmjs.org/react-use/-/react-use-13.26.1.tgz", + "integrity": "sha512-hDc4s8w4WI8G7c1BX+IsrdQFcZPfCHE/6oLpGPtcIPoxVhwj4QvVmNE8RnsnddBJ57HN8Xvkc3jp/8Z/4OB53w==", + "requires": { + "@types/js-cookie": "2.2.4", + "@xobotyi/scrollbar-width": "1.9.0", + "copy-to-clipboard": "^3.2.0", + "fast-deep-equal": "^3.1.1", + "fast-shallow-equal": "^1.0.0", + "js-cookie": "^2.2.1", + "nano-css": "^5.2.1", + "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" + } + }, "read-pkg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", @@ -11798,6 +12308,14 @@ "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==" }, + "rtl-css-js": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/rtl-css-js/-/rtl-css-js-1.14.0.tgz", + "integrity": "sha512-Dl5xDTeN3e7scU1cWX8c9b6/Nqz3u/HgR4gePc1kWXYiQWVQbKCEyK6+Hxve9LbcJ5EieHy1J9nJCN3grTtGwg==", + "requires": { + "@babel/runtime": "^7.1.2" + } + }, "run-async": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", @@ -12145,6 +12663,11 @@ "ajv-keywords": "^3.4.1" } }, + "screenfull": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/screenfull/-/screenfull-5.0.2.tgz", + "integrity": "sha512-cCF2b+L/mnEiORLN5xSAz6H3t18i2oHh9BA8+CQlAh5DRw2+NFAGQJOSYbcGw8B2k04g/lVvFcfZ83b3ysH5UQ==" + }, "scss-tokenizer": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", @@ -12300,6 +12823,11 @@ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, + "set-harmonic-interval": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-harmonic-interval/-/set-harmonic-interval-1.0.1.tgz", + "integrity": "sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g==" + }, "set-value": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", @@ -12594,6 +13122,11 @@ "is-plain-obj": "^1.0.0" } }, + "sortablejs": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.10.2.tgz", + "integrity": "sha512-YkPGufevysvfwn5rfdlGyrGjt7/CRHwvRPogD/lC+TnvcN29jDpCifKP+rBqf+LRldfXSTh+0CGLcSg0VIxq3A==" + }, "source-list-map": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", @@ -12637,6 +13170,11 @@ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" + }, "spdx-correct": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", @@ -12733,11 +13271,50 @@ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" }, + "stack-generator": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/stack-generator/-/stack-generator-2.0.5.tgz", + "integrity": "sha512-/t1ebrbHkrLrDuNMdeAcsvynWgoH/i4o8EGGfX7dEYDoTXOYVAkEpFdtshlvabzc6JlJ8Kf9YdFEoz7JkzGN9Q==", + "requires": { + "stackframe": "^1.1.1" + } + }, "stack-utils": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==" }, + "stackframe": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.1.1.tgz", + "integrity": "sha512-0PlYhdKh6AfFxRyK/v+6/k+/mMfyiEBbTM5L94D0ZytQnJ166wuwoTYLHFWGbs2dpA8Rgq763KGWmN1EQEYHRQ==" + }, + "stacktrace-gps": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/stacktrace-gps/-/stacktrace-gps-3.0.4.tgz", + "integrity": "sha512-qIr8x41yZVSldqdqe6jciXEaSCKw1U8XTXpjDuy0ki/apyTn/r3w9hDAAQOhZdxvsC93H+WwwEu5cq5VemzYeg==", + "requires": { + "source-map": "0.5.6", + "stackframe": "^1.1.1" + }, + "dependencies": { + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=" + } + } + }, + "stacktrace-js": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stacktrace-js/-/stacktrace-js-2.0.2.tgz", + "integrity": "sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==", + "requires": { + "error-stack-parser": "^2.0.6", + "stack-generator": "^2.0.5", + "stacktrace-gps": "^3.0.4" + } + }, "static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", @@ -13071,6 +13648,11 @@ } } }, + "stylis": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-3.5.0.tgz", + "integrity": "sha512-pP7yXN6dwMzAR29Q0mBrabPCe0/mNO1MSr93bhay+hcZondvMMTpeGyd8nbhYJdyperNT2DRxONQuUGcJr5iPw==" + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -13306,6 +13888,11 @@ "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=" }, + "throttle-debounce": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-2.1.0.tgz", + "integrity": "sha512-AOvyNahXQuU7NN+VVvOOX+uW6FPaWdAOdRP5HfwYxAfCzXTFKRMoIMk+n+po318+ktcChx+F1Dd91G3YHeMKyg==" + }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -13423,6 +14010,11 @@ "repeat-string": "^1.6.1" } }, + "toggle-selection": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", + "integrity": "sha1-bkWxJj8gF/oKzH2J14sVuL932jI=" + }, "toidentifier": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", @@ -13463,6 +14055,11 @@ "glob": "^7.1.2" } }, + "ts-easing": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/ts-easing/-/ts-easing-0.2.0.tgz", + "integrity": "sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==" + }, "ts-pnp": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.1.5.tgz", @@ -13711,6 +14308,14 @@ "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" }, + "use-named-routes": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/use-named-routes/-/use-named-routes-0.3.2.tgz", + "integrity": "sha1-/6ruqzPD5/WZdmUmQpMgkCggMfQ=", + "requires": { + "invariant": "^2.2.1" + } + }, "util": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", @@ -15170,6 +15775,17 @@ } } }, + "http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "requires": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + } + }, "is-absolute-url": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", diff --git a/client/package.json b/client/package.json index a862012b1..f6fc8bad4 100644 --- a/client/package.json +++ b/client/package.json @@ -5,8 +5,12 @@ "dependencies": { "@babel/core": "7.8.4", "@blueprintjs/core": "^3.23.1", + "@blueprintjs/datetime": "^3.15.2", + "@blueprintjs/select": "^3.11.2", + "@blueprintjs/table": "^3.8.3", "@reduxjs/toolkit": "^1.2.5", "@svgr/webpack": "4.3.3", + "@syncfusion/ej2-react-grids": "^17.4.50", "@testing-library/jest-dom": "^4.2.4", "@testing-library/react": "^9.4.0", "@testing-library/user-event": "^7.2.1", @@ -18,6 +22,7 @@ "babel-loader": "8.0.6", "babel-plugin-named-asset-import": "^0.3.6", "babel-preset-react-app": "^9.1.1", + "basscss": "^8.0.2", "camelcase": "^5.3.1", "case-sensitive-paths-webpack-plugin": "2.3.0", "css-loader": "3.4.2", @@ -40,7 +45,9 @@ "jest-environment-jsdom-fourteen": "1.0.1", "jest-resolve": "24.9.0", "jest-watch-typeahead": "0.4.2", + "lodash": "^4.17.15", "mini-css-extract-plugin": "0.9.0", + "moment": "^2.24.0", "node-sass": "^4.13.1", "optimize-css-assets-webpack-plugin": "5.0.3", "pnp-webpack-plugin": "1.6.0", @@ -53,21 +60,27 @@ "react-app-polyfill": "^1.0.6", "react-dev-utils": "^10.2.0", "react-dom": "^16.12.0", + "react-grid-system": "^6.2.3", "react-hook-form": "^4.9.4", "react-intl": "^3.12.0", "react-loadable": "^5.5.0", "react-redux": "^7.1.3", "react-router-dom": "^5.1.2", + "react-sortablejs": "^2.0.11", + "react-table": "^7.0.0", + "react-use": "^13.26.1", "redux": "^4.0.5", "redux-thunk": "^2.3.0", "resolve": "1.15.0", "resolve-url-loader": "3.1.1", "sass-loader": "8.0.2", "semver": "6.3.0", + "sortablejs": "^1.10.2", "style-loader": "0.23.1", "terser-webpack-plugin": "2.3.4", "ts-pnp": "1.1.5", "url-loader": "2.3.0", + "use-named-routes": "^0.3.2", "webpack": "4.41.5", "webpack-dev-server": "3.10.2", "webpack-manifest-plugin": "2.2.0", @@ -75,7 +88,7 @@ "yup": "^0.28.1" }, "scripts": { - "start": "node scripts/start.js", + "start": "PORT=8000 node scripts/start.js", "build": "node scripts/build.js", "test": "node scripts/test.js" }, @@ -95,6 +108,7 @@ ] }, "devDependencies": { + "http-proxy-middleware": "^1.0.0", "redux-devtools": "^3.5.0" }, "jest": { @@ -153,5 +167,6 @@ "presets": [ "react-app" ] - } + }, + "proxy": "http://localhost:3000/" } diff --git a/client/public/index.html b/client/public/index.html index aa069f27c..07646468c 100644 --- a/client/public/index.html +++ b/client/public/index.html @@ -39,5 +39,8 @@ To begin the development, run `npm start` or `yarn start`. To create a production bundle, use `npm run build` or `yarn build`. --> + + + diff --git a/client/setupProxy.js b/client/setupProxy.js new file mode 100644 index 000000000..70ca83467 --- /dev/null +++ b/client/setupProxy.js @@ -0,0 +1,11 @@ +const proxy = require('http-proxy-middleware'); + +module.exports = function(app) { + app.use( + '/api', + proxy({ + target: 'http://localhost:3000', + changeOrigin: true, + }) + ); +}; \ No newline at end of file diff --git a/client/src/components/Accounts/AccountsActionsBar.js b/client/src/components/Accounts/AccountsActionsBar.js new file mode 100644 index 000000000..bf32148f3 --- /dev/null +++ b/client/src/components/Accounts/AccountsActionsBar.js @@ -0,0 +1,99 @@ +import React, { useMemo } from 'react'; +import Icon from 'components/Icon'; +import { + Button, + NavbarGroup, + Navbar, + Classes, + NavbarDivider, + MenuItem, + Menu, + Popover, + PopoverInteractionKind, + Position, +} from "@blueprintjs/core"; +import classNames from 'classnames'; +import {connect} from 'react-redux'; +import {useRouteMatch} from 'react-router-dom'; +import DashboardActionsBar from 'components/Dashboard/DashboardActionsBar'; +import DialogConnect from 'connectors/Dialog.connector'; +import AccountsConnect from 'connectors/Accounts.connector'; +import {compose} from 'utils'; + +function AccountsActionsBar({ + openDialog, + views, + bulkActions, +}) { + const {path} = useRouteMatch(); + const onClickNewAccount = () => { openDialog('account-form', {}); }; + + const viewsMenuItems = views.map((view) => { + return (); + }); + + const hasBulkActionsSelected = useMemo(() => { + return Object.keys(bulkActions).length > 0; + }, [bulkActions]); + + return ( + + + {viewsMenuItems}} + minimal={true} + interactionKind={PopoverInteractionKind.HOVER} + position={Position.BOTTOM_LEFT}> + + -

{ pageTitle }

+
+
+ +
+ +
+

{ pageTitle }

+ + { pageSubtitle && ( + <> + +

{ pageSubtitle }

+
+ +
+ +
-
+
- - +
+
@@ -56,5 +77,8 @@ function DashboardTopbar({ pageTitle }) { const mapStateToProps = (state) => ({ pageTitle: state.dashboard.pageTitle, + pageSubtitle: state.dashboard.pageSubtitle, + editViewId: state.dashboard.topbarEditViewId, }); + export default connect(mapStateToProps)(DashboardTopbar); \ No newline at end of file diff --git a/client/src/components/Dashboard/TopbarUser.js b/client/src/components/Dashboard/TopbarUser.js new file mode 100644 index 000000000..1d4cab9dd --- /dev/null +++ b/client/src/components/Dashboard/TopbarUser.js @@ -0,0 +1,33 @@ +import React from 'react'; +import {connect} from 'react-redux'; +import {Menu, MenuItem, MenuDivider, Button, Popover} from '@blueprintjs/core'; +import t from 'store/types'; + +function DashboardTopbarUser({ logout }) { + const onClickLogout = () => { logout(); }; + + const userAvatarDropMenu = ( + + + + + + + + + ); + + return ( + + + + ) +} + +const mapDispatchToProps = (dispatch) => ({ + logout: () => dispatch({ type: t.LOGOUT }), +}); + +export default connect(null, mapDispatchToProps)(DashboardTopbarUser); \ No newline at end of file diff --git a/client/src/components/DataTable.js b/client/src/components/DataTable.js new file mode 100644 index 000000000..16c984034 --- /dev/null +++ b/client/src/components/DataTable.js @@ -0,0 +1,89 @@ +import React from 'react'; +import { useTable, usePagination } from 'react-table' + +export default function DataTable({ + columns, + data, + loading, +}) { + const { + getTableProps, + getTableBodyProps, + headerGroups, + prepareRow, + page, + canPreviousPage, + canNextPage, + pageOptions, + pageCount, + gotoPage, + nextPage, + previousPage, + setPageSize, + // Get the state from the instance + state: { pageIndex, pageSize }, + } = useTable( + { + columns, + data, + initialState: { pageIndex: 0 }, // Pass our hoisted table state + manualPagination: true, // Tell the usePagination + // hook that we'll handle our own data fetching + // This means we'll also have to provide our own + // pageCount. + // pageCount: controlledPageCount, + }, + usePagination + ); + + return ( +
+ + + {headerGroups.map(headerGroup => ( + + {headerGroup.headers.map(column => ( + + ))} + + ))} + + + {page.map((row, i) => { + prepareRow(row) + return ( + + {row.cells.map((cell) => { + return + })} + + ) + })} + + {loading ? ( + // Use our custom loading state to show a loading indicator + + ) : ( + + )} + + +
+ {column.render('Header')} + + {column.isSorted + ? column.isSortedDesc + ? ' 🔽' + : ' 🔼' + : ''} + +
{ cell.render('Cell') }
Loading... + {/* Showing {page.length} of ~{controlledPageCount * pageSize}{' '} results */} +
+
+ ) +} \ No newline at end of file diff --git a/client/src/components/Dialog.js b/client/src/components/Dialog.js new file mode 100644 index 000000000..d06ef5b62 --- /dev/null +++ b/client/src/components/Dialog.js @@ -0,0 +1,13 @@ +import React from 'react'; +import {Dialog, Spinner, Classes} from '@blueprintjs/core'; + +export default function DialogComponent(props) { + const loadingContent = ( +
+ ); + return ( + + {props.isLoading ? loadingContent : props.children} + + ); +} \ No newline at end of file diff --git a/client/src/components/DialogReduxConnect.js b/client/src/components/DialogReduxConnect.js new file mode 100644 index 000000000..d40cc4f53 --- /dev/null +++ b/client/src/components/DialogReduxConnect.js @@ -0,0 +1,22 @@ +import React from 'react'; +import { connect } from 'react-redux'; + +export default (Dialog) => { + + function DialogReduxConnect(props) { + return (); + }; + + const mapStateToProps = (state, props) => { + const dialogs = state.dashboard.dialogs; + + if (dialogs && dialogs.hasOwnProperty['name'] && dialogs[props.name]) { + const { isOpen, payload } = dialogs[props.name]; + return { isOpen, payload }; + } + }; + + return connect( + mapStateToProps, + )(DialogReduxConnect); +} \ No newline at end of file diff --git a/client/src/components/DialogsContainer.js b/client/src/components/DialogsContainer.js new file mode 100644 index 000000000..6e87c7cb7 --- /dev/null +++ b/client/src/components/DialogsContainer.js @@ -0,0 +1,12 @@ +import React from 'react'; +import AccountFormDialog from 'containers/Dashboard/Dialogs/AccountFormDialog'; +import UserFormDialog from 'containers/Dashboard/Dialogs/UserFormDialog'; + +export default function DialogsContainer() { + return ( + + + + + ); +} \ No newline at end of file diff --git a/client/src/components/Expenses/ExpenseForm.js b/client/src/components/Expenses/ExpenseForm.js new file mode 100644 index 000000000..8e297e267 --- /dev/null +++ b/client/src/components/Expenses/ExpenseForm.js @@ -0,0 +1,228 @@ +import React, {useState} from 'react'; +import * as Yup from 'yup'; +import { useFormik } from 'formik'; +import { + FormGroup, + MenuItem, + Intent, + InputGroup, + Position, + Button, + TextArea, + ControlGroup, +} from '@blueprintjs/core'; +import { DateInput } from "@blueprintjs/datetime"; +import { Select } from '@blueprintjs/select'; +import { useIntl } from 'react-intl'; +import { momentFormatter } from 'utils'; +import moment from 'moment'; +import AppToaster from 'components/AppToaster'; + +export default function ExpenseForm({ + accounts, + editExpense, + submitExpense, + expenseDetails, + currencies, +}) { + const intl = useIntl(); + + const [state, setState] = useState({ + selectedExpenseAccount: null, + selectedPaymentAccount: null, + }); + const validationSchema = Yup.object().shape({ + date: Yup.date().required(), + description: Yup.string().trim(), + expense_account_id: Yup.number().required(), + payment_account_id: Yup.number().required(), + amount: Yup.number().required(), + currency_code: Yup.string().required(), + publish: Yup.boolean(), + exchange_rate: Yup.number(), + }); + + const formik = useFormik({ + enableReinitialize: true, + validationSchema: validationSchema, + initialValues: { + date: null, + }, + onSubmit: (values) => { + submitExpense(values).then((response) => { + AppToaster.show({ + message: 'the_expense_has_been_submit', + }); + }).catch((error) => { + + }) + } + }); + + // Account item of select accounts field. + const accountItem = (item, { handleClick, modifiers, query }) => { + return () + }; + + const onChangeAccount = () => { + + }; + + const onChangePaymentAccount = () => { + + }; + + const handleDateChange = (date) => { + const formatted = moment(date).format('YYYY/MM/DD'); + formik.setFieldValue('date', formatted); + }; + + // Filters accounts items. + const filterAccountsPredicater = (query, account, _index, exactMatch) => { + const normalizedTitle = account.name.toLowerCase(); + const normalizedQuery = query.toLowerCase(); + + if (exactMatch) { + return normalizedTitle === normalizedQuery; + } else { + return `${account.code} ${normalizedTitle}`.indexOf(normalizedQuery) >= 0; + } + }; + + const onExpenseAccountSelect = (account) => { + setState({ ...state, selectedExpenseAccount: account }); + formik.setFieldValue('expense_account_id', account.id); + }; + + const onChangePaymentAccountSelect = (account) => { + setState({ ...state, selectedPaymentAccount: account }); + formik.setFieldValue('payment_account_id', account.id); + }; + + const onAmountCurrencySelect = (currency) => { + formik.setFieldValue('currency_code', currency.id); + }; + + const paymentAccountLabel = state.selectedPaymentAccount ? + state.selectedPaymentAccount.name : 'Select Payment Account'; + + const expenseAccountLabel = state.selectedExpenseAccount ? + state.selectedExpenseAccount.name : 'Select Expense Account'; + + const handleClose = () => { + + }; + + return ( +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +