From 5cbbed0c8cdbc9f1dcf1f10162bbbbb844a09895 Mon Sep 17 00:00:00 2001 From: Sebastian Kuzniarz <kuzniarz@zedat.fu-berlin.de> Date: Fri, 14 Jan 2022 14:56:27 +0100 Subject: [PATCH] Implemented several GUI parts - Fixed minor issues - Added several forms --- client/package-lock.json | 442 ++ client/package.json | 3 + client/public/locales/de/translation.json | 54 +- client/public/locales/en/translation.json | 55 +- client/src/Router.tsx | 5 +- client/src/components/ManagedBoatTile.tsx | 17 +- client/src/components/Modal.tsx | 2 +- client/src/components/RentedBoatTile.tsx | 2 +- client/src/components/StaffLayout.tsx | 3 + client/src/components/StaffModal.tsx | 6 +- client/src/components/UserLayout.tsx | 2 +- client/src/components/forms/BoatInfo.tsx | 137 + .../src/components/forms/EditBoatTypeForm.tsx | 134 + client/src/components/forms/EditSports.tsx | 89 + .../src/components/{ => layout}/Divider.tsx | 0 .../src/components/{ => layout}/Loading.tsx | 0 client/src/index.tsx | 2 +- client/src/pages/public/BookingForm.tsx | 2 +- .../pages/public/BookingSignOutSuccess.tsx | 2 +- client/src/pages/public/BookingSuccessful.tsx | 2 +- client/src/pages/staff/BoatManager.tsx | 46 +- client/src/pages/staff/BoatOverview.tsx | 31 +- client/src/pages/staff/BoatTypeOverview.tsx | 41 +- client/src/pages/staff/Sports.tsx | 67 + client/src/pages/staff/StaffLogin.tsx | 2 +- client/src/pages/staff/Statistics.tsx | 4258 ++++++++++++++++- 26 files changed, 5316 insertions(+), 88 deletions(-) create mode 100644 client/src/components/forms/BoatInfo.tsx create mode 100644 client/src/components/forms/EditBoatTypeForm.tsx create mode 100644 client/src/components/forms/EditSports.tsx rename client/src/components/{ => layout}/Divider.tsx (100%) rename client/src/components/{ => layout}/Loading.tsx (100%) create mode 100644 client/src/pages/staff/Sports.tsx diff --git a/client/package-lock.json b/client/package-lock.json index b0892c3..2df4541 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -12,6 +12,9 @@ "@fortawesome/free-regular-svg-icons": "^5.15.4", "@fortawesome/free-solid-svg-icons": "^5.15.4", "@fortawesome/react-fontawesome": "^0.1.16", + "@nivo/calendar": "^0.79.1", + "@nivo/colors": "^0.79.1", + "@nivo/core": "^0.79.0", "@types/node": "^12.20.36", "@types/react": "^17.0.34", "@types/react-dom": "^17.0.11", @@ -2382,6 +2385,98 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/@nivo/calendar": { + "version": "0.79.1", + "resolved": "https://registry.npmjs.org/@nivo/calendar/-/calendar-0.79.1.tgz", + "integrity": "sha512-xX83jlyKAPk+ieS03vaNZqhW/atL56lghsT8fPSQzsYJTCNWFjjcLvR2UkG8LgVNUrZEvc9nSbrg5VvctaNCHQ==", + "dependencies": { + "@nivo/legends": "0.79.1", + "@nivo/tooltip": "0.79.0", + "d3-scale": "^3.2.3", + "d3-time": "^1.0.10", + "d3-time-format": "^3.0.0", + "lodash": "^4.17.21" + }, + "peerDependencies": { + "@nivo/core": "0.79.0", + "react": ">= 16.14.0 < 18.0.0" + } + }, + "node_modules/@nivo/calendar/node_modules/d3-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz", + "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==" + }, + "node_modules/@nivo/colors": { + "version": "0.79.1", + "resolved": "https://registry.npmjs.org/@nivo/colors/-/colors-0.79.1.tgz", + "integrity": "sha512-45huBmz46OoQtfqzHrnqDJ9msebOBX84fTijyOBi8mn8iTDOK2xWgzT7cCYP3hKE58IclkibkzVyWCeJ+rUlqg==", + "dependencies": { + "d3-color": "^2.0.0", + "d3-scale": "^3.2.3", + "d3-scale-chromatic": "^2.0.0", + "lodash": "^4.17.21" + }, + "peerDependencies": { + "@nivo/core": "0.79.0", + "prop-types": ">= 15.5.10 < 16.0.0", + "react": ">= 16.14.0 < 18.0.0" + } + }, + "node_modules/@nivo/core": { + "version": "0.79.0", + "resolved": "https://registry.npmjs.org/@nivo/core/-/core-0.79.0.tgz", + "integrity": "sha512-e1iGodmGuXkF+QWAjhHVFc+lUnfBoUwaWqVcBXBfebzNc50tTJrTTMHyQczjgOIfTc8gEu23lAY4mVZCDKscig==", + "dependencies": { + "@nivo/recompose": "0.79.0", + "@react-spring/web": "9.3.1", + "d3-color": "^2.0.0", + "d3-format": "^1.4.4", + "d3-interpolate": "^2.0.1", + "d3-scale": "^3.2.3", + "d3-scale-chromatic": "^2.0.0", + "d3-shape": "^1.3.5", + "d3-time-format": "^3.0.0", + "lodash": "^4.17.21" + }, + "peerDependencies": { + "@nivo/tooltip": "0.79.0", + "prop-types": ">= 15.5.10 < 16.0.0", + "react": ">= 16.14.0 < 18.0.0" + } + }, + "node_modules/@nivo/legends": { + "version": "0.79.1", + "resolved": "https://registry.npmjs.org/@nivo/legends/-/legends-0.79.1.tgz", + "integrity": "sha512-AoabiLherOAk3/HR/N791fONxNdwNk/gCTJC/6BKUo2nX+JngEYm3nVFmTC1R6RdjwJTeCb9Vtuc4MHA+mcgig==", + "peerDependencies": { + "@nivo/core": "0.79.0", + "prop-types": ">= 15.5.10 < 16.0.0", + "react": ">= 16.14.0 < 18.0.0" + } + }, + "node_modules/@nivo/recompose": { + "version": "0.79.0", + "resolved": "https://registry.npmjs.org/@nivo/recompose/-/recompose-0.79.0.tgz", + "integrity": "sha512-2GFnOHfA2jzTOA5mdKMwJ6myCRGoXQQbQvFFQ7B/+hnHfU/yrOVpiGt6TPAn3qReC4dyDYrzy1hr9UeQh677ig==", + "dependencies": { + "react-lifecycles-compat": "^3.0.4" + }, + "peerDependencies": { + "react": ">= 16.14.0 < 18.0.0" + } + }, + "node_modules/@nivo/tooltip": { + "version": "0.79.0", + "resolved": "https://registry.npmjs.org/@nivo/tooltip/-/tooltip-0.79.0.tgz", + "integrity": "sha512-hsJsvhDVR9P/QqIEDIttaA6aslR3tU9So1s/k2jMdppL7J9ZH/IrVx9TbIP7jDKmnU5AMIP5uSstXj9JiKLhQA==", + "dependencies": { + "@react-spring/web": "9.3.1" + }, + "peerDependencies": { + "@nivo/core": "0.79.0" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -2480,6 +2575,72 @@ "react": "^16.8.0 || ^17.0.0-rc.1" } }, + "node_modules/@react-spring/animated": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.3.2.tgz", + "integrity": "sha512-pBvKydRHbTzuyaeHtxGIOvnskZxGo/S5/YK1rtYm88b9NQZuZa95Rgd3O0muFL+99nvBMBL8cvQGD0UJmsqQsg==", + "dependencies": { + "@react-spring/shared": "~9.3.0", + "@react-spring/types": "~9.3.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0" + } + }, + "node_modules/@react-spring/core": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@react-spring/core/-/core-9.3.2.tgz", + "integrity": "sha512-kMRjkgdQ6LJ0lmb/wQlONpghaMT83UxglXHJC6m9kZS/GKVmN//TYMEK85xN1rC5Gg+BmjG61DtLCSkkLDTfNw==", + "dependencies": { + "@react-spring/animated": "~9.3.0", + "@react-spring/shared": "~9.3.0", + "@react-spring/types": "~9.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-spring/donate" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0" + } + }, + "node_modules/@react-spring/rafz": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@react-spring/rafz/-/rafz-9.3.2.tgz", + "integrity": "sha512-YtqNnAYp5bl6NdnDOD5TcYS40VJmB+Civ4LPtcWuRPKDAOa/XAf3nep48r0wPTmkK936mpX8aIm7h+luW59u5A==" + }, + "node_modules/@react-spring/shared": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-9.3.2.tgz", + "integrity": "sha512-ypGQQ8w7mWnrELLon4h6mBCBxdd8j1pgLzmHXLpTC/f4ya2wdP+0WIKBWXJymIf+5NiTsXgSJra5SnHP5FBY+A==", + "dependencies": { + "@react-spring/rafz": "~9.3.0", + "@react-spring/types": "~9.3.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0" + } + }, + "node_modules/@react-spring/types": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@react-spring/types/-/types-9.3.2.tgz", + "integrity": "sha512-u+IK9z9Re4hjNkBYKebZr7xVDYTai2RNBsI4UPL/k0B6lCNSwuqWIXfKZUDVlMOeZHtDqayJn4xz6HcSkTj3FQ==" + }, + "node_modules/@react-spring/web": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/@react-spring/web/-/web-9.3.1.tgz", + "integrity": "sha512-sisZIgFGva/Z+xKWPSfXpukF0AP3kR9ALTxlHL87fVotMUCJX5vtH/YlVcywToEFwTHKt3MpI5Wy2M+vgVEeaw==", + "dependencies": { + "@react-spring/animated": "~9.3.0", + "@react-spring/core": "~9.3.0", + "@react-spring/shared": "~9.3.0", + "@react-spring/types": "~9.3.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + } + }, "node_modules/@restart/context": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/@restart/context/-/context-2.1.4.tgz", @@ -6262,6 +6423,82 @@ "type": "^1.0.1" } }, + "node_modules/d3-array": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", + "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", + "dependencies": { + "internmap": "^1.0.0" + } + }, + "node_modules/d3-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-2.0.0.tgz", + "integrity": "sha512-SPXi0TSKPD4g9tw0NMZFnR95XVgUZiBH+uUTqQuDu1OsE2zomHU7ho0FISciaPvosimixwHFl3WHLGabv6dDgQ==" + }, + "node_modules/d3-format": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.5.tgz", + "integrity": "sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ==" + }, + "node_modules/d3-interpolate": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-2.0.1.tgz", + "integrity": "sha512-c5UhwwTs/yybcmTpAVqwSFl6vrQ8JZJoT5F7xNFK9pymv5C0Ymcc9/LIJHtYIggg/yS9YHw8i8O8tgb9pupjeQ==", + "dependencies": { + "d3-color": "1 - 2" + } + }, + "node_modules/d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" + }, + "node_modules/d3-scale": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.3.0.tgz", + "integrity": "sha512-1JGp44NQCt5d1g+Yy+GeOnZP7xHo0ii8zsQp6PGzd+C1/dl0KGsp9A7Mxwp+1D1o4unbTTxVdU/ZOIEBoeZPbQ==", + "dependencies": { + "d3-array": "^2.3.0", + "d3-format": "1 - 2", + "d3-interpolate": "1.2.0 - 2", + "d3-time": "^2.1.1", + "d3-time-format": "2 - 3" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-2.0.0.tgz", + "integrity": "sha512-LLqy7dJSL8yDy7NRmf6xSlsFZ6zYvJ4BcWFE4zBrOPnQERv9zj24ohnXKRbyi9YHnYV+HN1oEO3iFK971/gkzA==", + "dependencies": { + "d3-color": "1 - 2", + "d3-interpolate": "1 - 2" + } + }, + "node_modules/d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "dependencies": { + "d3-path": "1" + } + }, + "node_modules/d3-time": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-2.1.1.tgz", + "integrity": "sha512-/eIQe/eR4kCQwq7yxi7z4c6qEXf2IYGcjoWB5OOQy4Tq9Uv39/947qlDcN2TLkiTzQWzvnsuYPB9TrWaNfipKQ==", + "dependencies": { + "d3-array": "2" + } + }, + "node_modules/d3-time-format": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-3.0.0.tgz", + "integrity": "sha512-UXJh6EKsHBTjopVqZBhFysQcoXSv/5yLONZvkQ5Kk3qbwiUYkdX17Xa1PT6U1ZWXGGfB1ey5L8dKMlFq2DO0Ag==", + "dependencies": { + "d3-time": "1 - 2" + } + }, "node_modules/damerau-levenshtein": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.7.tgz", @@ -10080,6 +10317,11 @@ "node": ">= 0.4" } }, + "node_modules/internmap": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", + "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==" + }, "node_modules/invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", @@ -24260,6 +24502,76 @@ "chalk": "^4.0.0" } }, + "@nivo/calendar": { + "version": "0.79.1", + "resolved": "https://registry.npmjs.org/@nivo/calendar/-/calendar-0.79.1.tgz", + "integrity": "sha512-xX83jlyKAPk+ieS03vaNZqhW/atL56lghsT8fPSQzsYJTCNWFjjcLvR2UkG8LgVNUrZEvc9nSbrg5VvctaNCHQ==", + "requires": { + "@nivo/legends": "0.79.1", + "@nivo/tooltip": "0.79.0", + "d3-scale": "^3.2.3", + "d3-time": "^1.0.10", + "d3-time-format": "^3.0.0", + "lodash": "^4.17.21" + }, + "dependencies": { + "d3-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz", + "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==" + } + } + }, + "@nivo/colors": { + "version": "0.79.1", + "resolved": "https://registry.npmjs.org/@nivo/colors/-/colors-0.79.1.tgz", + "integrity": "sha512-45huBmz46OoQtfqzHrnqDJ9msebOBX84fTijyOBi8mn8iTDOK2xWgzT7cCYP3hKE58IclkibkzVyWCeJ+rUlqg==", + "requires": { + "d3-color": "^2.0.0", + "d3-scale": "^3.2.3", + "d3-scale-chromatic": "^2.0.0", + "lodash": "^4.17.21" + } + }, + "@nivo/core": { + "version": "0.79.0", + "resolved": "https://registry.npmjs.org/@nivo/core/-/core-0.79.0.tgz", + "integrity": "sha512-e1iGodmGuXkF+QWAjhHVFc+lUnfBoUwaWqVcBXBfebzNc50tTJrTTMHyQczjgOIfTc8gEu23lAY4mVZCDKscig==", + "requires": { + "@nivo/recompose": "0.79.0", + "@react-spring/web": "9.3.1", + "d3-color": "^2.0.0", + "d3-format": "^1.4.4", + "d3-interpolate": "^2.0.1", + "d3-scale": "^3.2.3", + "d3-scale-chromatic": "^2.0.0", + "d3-shape": "^1.3.5", + "d3-time-format": "^3.0.0", + "lodash": "^4.17.21" + } + }, + "@nivo/legends": { + "version": "0.79.1", + "resolved": "https://registry.npmjs.org/@nivo/legends/-/legends-0.79.1.tgz", + "integrity": "sha512-AoabiLherOAk3/HR/N791fONxNdwNk/gCTJC/6BKUo2nX+JngEYm3nVFmTC1R6RdjwJTeCb9Vtuc4MHA+mcgig==", + "requires": {} + }, + "@nivo/recompose": { + "version": "0.79.0", + "resolved": "https://registry.npmjs.org/@nivo/recompose/-/recompose-0.79.0.tgz", + "integrity": "sha512-2GFnOHfA2jzTOA5mdKMwJ6myCRGoXQQbQvFFQ7B/+hnHfU/yrOVpiGt6TPAn3qReC4dyDYrzy1hr9UeQh677ig==", + "requires": { + "react-lifecycles-compat": "^3.0.4" + } + }, + "@nivo/tooltip": { + "version": "0.79.0", + "resolved": "https://registry.npmjs.org/@nivo/tooltip/-/tooltip-0.79.0.tgz", + "integrity": "sha512-hsJsvhDVR9P/QqIEDIttaA6aslR3tU9So1s/k2jMdppL7J9ZH/IrVx9TbIP7jDKmnU5AMIP5uSstXj9JiKLhQA==", + "requires": { + "@react-spring/web": "9.3.1" + } + }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -24331,6 +24643,55 @@ "@babel/runtime": "^7.6.2" } }, + "@react-spring/animated": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.3.2.tgz", + "integrity": "sha512-pBvKydRHbTzuyaeHtxGIOvnskZxGo/S5/YK1rtYm88b9NQZuZa95Rgd3O0muFL+99nvBMBL8cvQGD0UJmsqQsg==", + "requires": { + "@react-spring/shared": "~9.3.0", + "@react-spring/types": "~9.3.0" + } + }, + "@react-spring/core": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@react-spring/core/-/core-9.3.2.tgz", + "integrity": "sha512-kMRjkgdQ6LJ0lmb/wQlONpghaMT83UxglXHJC6m9kZS/GKVmN//TYMEK85xN1rC5Gg+BmjG61DtLCSkkLDTfNw==", + "requires": { + "@react-spring/animated": "~9.3.0", + "@react-spring/shared": "~9.3.0", + "@react-spring/types": "~9.3.0" + } + }, + "@react-spring/rafz": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@react-spring/rafz/-/rafz-9.3.2.tgz", + "integrity": "sha512-YtqNnAYp5bl6NdnDOD5TcYS40VJmB+Civ4LPtcWuRPKDAOa/XAf3nep48r0wPTmkK936mpX8aIm7h+luW59u5A==" + }, + "@react-spring/shared": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-9.3.2.tgz", + "integrity": "sha512-ypGQQ8w7mWnrELLon4h6mBCBxdd8j1pgLzmHXLpTC/f4ya2wdP+0WIKBWXJymIf+5NiTsXgSJra5SnHP5FBY+A==", + "requires": { + "@react-spring/rafz": "~9.3.0", + "@react-spring/types": "~9.3.0" + } + }, + "@react-spring/types": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@react-spring/types/-/types-9.3.2.tgz", + "integrity": "sha512-u+IK9z9Re4hjNkBYKebZr7xVDYTai2RNBsI4UPL/k0B6lCNSwuqWIXfKZUDVlMOeZHtDqayJn4xz6HcSkTj3FQ==" + }, + "@react-spring/web": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/@react-spring/web/-/web-9.3.1.tgz", + "integrity": "sha512-sisZIgFGva/Z+xKWPSfXpukF0AP3kR9ALTxlHL87fVotMUCJX5vtH/YlVcywToEFwTHKt3MpI5Wy2M+vgVEeaw==", + "requires": { + "@react-spring/animated": "~9.3.0", + "@react-spring/core": "~9.3.0", + "@react-spring/shared": "~9.3.0", + "@react-spring/types": "~9.3.0" + } + }, "@restart/context": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/@restart/context/-/context-2.1.4.tgz", @@ -27338,6 +27699,82 @@ "type": "^1.0.1" } }, + "d3-array": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", + "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", + "requires": { + "internmap": "^1.0.0" + } + }, + "d3-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-2.0.0.tgz", + "integrity": "sha512-SPXi0TSKPD4g9tw0NMZFnR95XVgUZiBH+uUTqQuDu1OsE2zomHU7ho0FISciaPvosimixwHFl3WHLGabv6dDgQ==" + }, + "d3-format": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.5.tgz", + "integrity": "sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ==" + }, + "d3-interpolate": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-2.0.1.tgz", + "integrity": "sha512-c5UhwwTs/yybcmTpAVqwSFl6vrQ8JZJoT5F7xNFK9pymv5C0Ymcc9/LIJHtYIggg/yS9YHw8i8O8tgb9pupjeQ==", + "requires": { + "d3-color": "1 - 2" + } + }, + "d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" + }, + "d3-scale": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.3.0.tgz", + "integrity": "sha512-1JGp44NQCt5d1g+Yy+GeOnZP7xHo0ii8zsQp6PGzd+C1/dl0KGsp9A7Mxwp+1D1o4unbTTxVdU/ZOIEBoeZPbQ==", + "requires": { + "d3-array": "^2.3.0", + "d3-format": "1 - 2", + "d3-interpolate": "1.2.0 - 2", + "d3-time": "^2.1.1", + "d3-time-format": "2 - 3" + } + }, + "d3-scale-chromatic": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-2.0.0.tgz", + "integrity": "sha512-LLqy7dJSL8yDy7NRmf6xSlsFZ6zYvJ4BcWFE4zBrOPnQERv9zj24ohnXKRbyi9YHnYV+HN1oEO3iFK971/gkzA==", + "requires": { + "d3-color": "1 - 2", + "d3-interpolate": "1 - 2" + } + }, + "d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "requires": { + "d3-path": "1" + } + }, + "d3-time": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-2.1.1.tgz", + "integrity": "sha512-/eIQe/eR4kCQwq7yxi7z4c6qEXf2IYGcjoWB5OOQy4Tq9Uv39/947qlDcN2TLkiTzQWzvnsuYPB9TrWaNfipKQ==", + "requires": { + "d3-array": "2" + } + }, + "d3-time-format": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-3.0.0.tgz", + "integrity": "sha512-UXJh6EKsHBTjopVqZBhFysQcoXSv/5yLONZvkQ5Kk3qbwiUYkdX17Xa1PT6U1ZWXGGfB1ey5L8dKMlFq2DO0Ag==", + "requires": { + "d3-time": "1 - 2" + } + }, "damerau-levenshtein": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.7.tgz", @@ -30287,6 +30724,11 @@ "side-channel": "^1.0.4" } }, + "internmap": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", + "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==" + }, "invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", diff --git a/client/package.json b/client/package.json index b29629a..2c2dc1d 100644 --- a/client/package.json +++ b/client/package.json @@ -7,6 +7,9 @@ "@fortawesome/free-regular-svg-icons": "^5.15.4", "@fortawesome/free-solid-svg-icons": "^5.15.4", "@fortawesome/react-fontawesome": "^0.1.16", + "@nivo/calendar": "^0.79.1", + "@nivo/colors": "^0.79.1", + "@nivo/core": "^0.79.0", "@types/node": "^12.20.36", "@types/react": "^17.0.34", "@types/react-dom": "^17.0.11", diff --git a/client/public/locales/de/translation.json b/client/public/locales/de/translation.json index 639c916..33ef1a4 100644 --- a/client/public/locales/de/translation.json +++ b/client/public/locales/de/translation.json @@ -55,22 +55,63 @@ "buttonBoatOverview": "Bootsübersicht", "buttonManageBoats": "Boote verwalten", "buttonStatistics": "Statistiken", - "buttonLogout": "Abmelden" + "buttonLogout": "Abmelden", + "buttonBoatTypes": "Boots Typen", + "buttonSports": "Sportarten" }, "boatOverview": { "labelOverdue": "Ausgeliehene Boote - Überfällig", "labelCurrentlyRented": "Momentan augeliehene Boote", - "buttonShowAll": "Alle anzeigen" + "buttonShowAll": "Alle anzeigen", + "BoatInfo": "Bootsinfo", + "EndRide": "Ausleihe beenden" }, "boatManager": { "blockedBoats": "Gesperrte Boote", - "availableBoats": "Verfügbare Boote" + "availableBoats": "Verfügbare Boote", + "addBoat": "Boot hinzufügen", + "Add": "Hinzufügen", + "InfoBoat": "Bootsinfo", + "Info": "Editieren", + "BlockBoat": "Boot sperren", + "Block": "Sperren", + "UnblockBoat": "Boot freigeben", + "Unblock": "Freigeben" }, "managedBoatTile": { "buttonInfo": "Info", - "buttonUnblock": "Entsperren", + "buttonUnblock": "Freigeben", "buttonBlock": "Sperren" - + }, + "boatTypeOverview": { + "Id": "ID", + "Name": "Bezeichner", + "Seats": "Plätze", + "Sport": "Sportart", + "addBoatType": "Bootstyp hinzufügen", + "EditBoatType": "Bootstyp editieren", + "DeleteBoatType": "Bootstyp löschen?", + "Add": "Hinzufügen", + "Delete": "Löschen", + "Edit": "Editieren", + "messages":{ + "required":"{{val}} wird benötigt", + "DeleteText": "Sind Sie sicher, dass Sie '{{val}}' löschen wollen?" + } + }, + "sports": { + "Id": "ID", + "Name": "Sportart", + "AddSport": "Sport hinzufügen", + "EditSport": "Sport editieren", + "DeleteSport": "Sport löschen?", + "Add": "Hinzufügen", + "Delete": "Löschen", + "Edit": "Editieren", + "messages":{ + "required":"{{val}} wird benötigt", + "DeleteText": "Sind Sie sicher, dass Sie '{{val}}' löschen wollen?" + } }, "routes": { "/": "Wassersport", @@ -81,6 +122,7 @@ "/staff/overview": "Bootsübersicht", "/staff/boattypes": "Bootstypen", "/staff/manage": "Boote Verwalten", - "/staff/statistics": "Statistiken" + "/staff/statistics": "Statistiken", + "/staff/sports": "Sportarten" } } diff --git a/client/public/locales/en/translation.json b/client/public/locales/en/translation.json index 86732e7..ad853f4 100644 --- a/client/public/locales/en/translation.json +++ b/client/public/locales/en/translation.json @@ -43,8 +43,8 @@ "labelPassword": "Password", "buttonSignIn": "Login", "messages": { - "required": "{{val}} wird benötigt", - "invalidEmail" : "Bitte trage eine gültige Email ein" + "required": "{{val}} is required", + "invalidEmail" : "Please enter a valid Email" } }, "staffModal": { @@ -55,22 +55,64 @@ "buttonBoatOverview": "Boat Overview", "buttonManageBoats": "Manage Boats", "buttonStatistics": "Statistics", - "buttonLogout": "Logout" + "buttonLogout": "Logout", + "buttonBoatTypes": "Boat Types", + "buttonSports": "Sports" }, "boatOverview": { "labelOverdue": "Rented Boats - Overdue", "labelCurrentlyRented": "Currently Rented Boats", - "buttonShowAll": "Show all" + "buttonShowAll": "Show all", + "BoatInfo": "Boat Info", + "EndRide": "End Ride" }, "boatManager": { "blockedBoats": "Blocked Boats", - "availableBoats": "Available Boats" + "availableBoats": "Available Boats", + "addBoat": "Add Boat", + "Add": "Add", + "InfoBoat": "Boat Info", + "Info": "Edit", + "BlockBoat": "Block Boat", + "Block": "Block", + "UnblockBoat": "Unblock Boat", + "Unblock": "Unblock" }, "managedBoatTile": { "buttonInfo": "Info", "buttonUnblock": "Unblock", "buttonBlock": "Block" }, + "boatTypeOverview": { + "Id": "ID", + "Name": "Type Name", + "Seats": "Seats", + "Sport": "Sport", + "addBoatType": "Add Boat Type", + "EditBoatType": "Edit Boat Type", + "DeleteBoatType": "Delete Boat Type?", + "Add": "Add", + "Delete": "Delete", + "Edit": "Edit", + "messages":{ + "required":"{{val}} is required", + "DeleteText": "Are you sure, you want to delete '{{val}}'?" + } + }, + "sports": { + "Id": "ID", + "Name": "Sport Type", + "AddSport": "Add Sport", + "EditSport": "Edit Sport", + "DeleteSport": "Delete Sport?", + "Add": "Add", + "Delete": "Delete", + "Edit": "Edit", + "messages":{ + "required":"{{val}} is required", + "DeleteText": "Are you sure, you want to delete '{{val}}'?" + } + }, "routes": { "/": "Water Sports", "/book": "Book a Boat", @@ -80,6 +122,7 @@ "/staff/overview": "Boat Overview", "/staff/boattypes" : "Boat Types", "/staff/manage": "Manage Boats", - "/staff/statistics": "Statistics" + "/staff/statistics": "Statistics", + "/staff/sports": "Sports" } } diff --git a/client/src/Router.tsx b/client/src/Router.tsx index 929a337..af93d52 100644 --- a/client/src/Router.tsx +++ b/client/src/Router.tsx @@ -12,6 +12,7 @@ import BookingSuccessful from "./pages/public/BookingSuccessful"; import Home from "./pages/public/Home"; import StaffLogin from "./pages/staff/StaffLogin" import StatisticOverview from "./pages/staff/Statistics"; +import Sports from "./pages/staff/Sports"; function Router() { return ( @@ -37,11 +38,11 @@ function Router() { </Route> </Route> <Route path="staff" element={<StaffLayout />}> - <Route path="" element={<Navigate to="/staff/overview" />}/> + <Route path="" element={<Navigate to="/staff/overview" />} /> <Route path="overview" element={<BoatOverview />} /> <Route path="boattypes" element={<BoatTypeOverview />} /> + <Route path="sports" element={<Sports />} /> <Route path="manage" element={<BoatManager />} /> - <Route path="statistics" element={<StatisticOverview />} /> </Route> diff --git a/client/src/components/ManagedBoatTile.tsx b/client/src/components/ManagedBoatTile.tsx index f0e2ce4..f60b4b5 100644 --- a/client/src/components/ManagedBoatTile.tsx +++ b/client/src/components/ManagedBoatTile.tsx @@ -1,11 +1,18 @@ import React from "react"; import { Button, Col } from "react-bootstrap"; import { useTranslation } from "react-i18next"; -// import { Image } from "react-bootstrap"; -// import { Link } from "react-router-dom"; -function ManagedBoatTile(props: any) { +function ManagedBoatTile(props: { + boatName?: string; + time?: string; + persons?: string; + blocked?: boolean; + lastUsed?: string; + onInfoClick?: () => any; + onBlockClick?: () => any; +}) { const { t } = useTranslation(); + return ( <Col> <div className={`card-body shadow position-relative mb-1 rounded-2 ${props.blocked ? 'bg-info' : 'bg-success'}`} style={{ height: "90px" }}> @@ -13,8 +20,8 @@ function ManagedBoatTile(props: any) { style={{ width: "95%", overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }}>{props.boatName}</div> <div className="tile-label-time position-absolute me-2 mt-2 top-0 end-0 text-white">{props.lastUsed}</div> <div className="d-flex justify-content-between" style={{ marginTop: "24px", width: "104%", marginLeft: "-2%" }}> - <Button variant="secondary" style={{ flex: 0.48 }} className="mb-2 ms-2 bottom-0 start-0 shadow-sm text-uppercase rounded-pill">{t("managedBoatTile.buttonInfo")}</Button> - <Button variant={`${props.blocked ? 'success' : 'danger'}`} style={{ flex: 0.48 }} className={`mb-2 me-2 bottom-0 end-0 shadow-sm text-uppercase rounded-pill`}>{props.blocked ? t("managedBoatTile.buttonUnblock") : t("managedBoatTile.buttonBlock")}</Button> + <Button onClick={props.onInfoClick ? props.onInfoClick : () => { }} variant="secondary" style={{ flex: 0.48 }} className="mb-2 ms-2 bottom-0 start-0 shadow-sm text-uppercase rounded-pill">{t("managedBoatTile.buttonInfo")}</Button> + <Button onClick={props.onBlockClick ? props.onBlockClick : () => { }} variant={`${props.blocked ? 'success' : 'danger'}`} style={{ flex: 0.48 }} className={`mb-2 me-2 bottom-0 end-0 shadow-sm text-uppercase rounded-pill`}>{props.blocked ? t("managedBoatTile.buttonUnblock") : t("managedBoatTile.buttonBlock")}</Button> </div> </div> </Col> diff --git a/client/src/components/Modal.tsx b/client/src/components/Modal.tsx index 36081f2..e94e7e0 100644 --- a/client/src/components/Modal.tsx +++ b/client/src/components/Modal.tsx @@ -4,7 +4,7 @@ import React from "react"; import { Image } from "react-bootstrap"; import { Link } from "react-router-dom"; import logo from "../assets/logo_unisport.png"; -import Divider from "./Divider"; +import Divider from "./layout/Divider"; function Modal(props: any) { return ( diff --git a/client/src/components/RentedBoatTile.tsx b/client/src/components/RentedBoatTile.tsx index d75327f..3bac05b 100644 --- a/client/src/components/RentedBoatTile.tsx +++ b/client/src/components/RentedBoatTile.tsx @@ -14,7 +14,7 @@ function RentedBoatTile(props: any) { <div className="tile-label-persons position-absolute ms-2 mb-2 bottom-0 start-0 text-white">{props.persons}</div> {/* Conditonally render the overdue text if it is set*/} {props.overdue && - <div className="tile-label-overdue position-absolute me-2 mb-2 bottom-0 end-0 text-white fw-bold">{props.overdue}</div> + <div className="tile-label-overdue position-absolute me-2 mb-2 bottom-0 end-0 text-white fw-bold">Overdue!</div> } </div> </Col> diff --git a/client/src/components/StaffLayout.tsx b/client/src/components/StaffLayout.tsx index 596bbad..6809b34 100644 --- a/client/src/components/StaffLayout.tsx +++ b/client/src/components/StaffLayout.tsx @@ -17,11 +17,14 @@ function StaffLayout() { <Nav activeKey={location.pathname}> <Nav.Link href="/staff/overview">{t("staffNav.buttonBoatOverview")}</Nav.Link> <Nav.Link href="/staff/manage">{t("staffNav.buttonManageBoats")}</Nav.Link> + <Nav.Link href="/staff/boattypes">{t("staffNav.buttonBoatTypes")}</Nav.Link> + <Nav.Link href="/staff/sports">{t("staffNav.buttonSports")}</Nav.Link> <Nav.Link href="/staff/statistics">{t("staffNav.buttonStatistics")}</Nav.Link> </Nav> </div> <div> <Nav.Link>{t("staffNav.buttonLogout")}</Nav.Link> + </div> </Nav> </Navbar.Collapse> diff --git a/client/src/components/StaffModal.tsx b/client/src/components/StaffModal.tsx index 3de2e86..f4bbb6f 100644 --- a/client/src/components/StaffModal.tsx +++ b/client/src/components/StaffModal.tsx @@ -16,10 +16,12 @@ function StaffModal(props: { const {t} = useTranslation(); return ( <Modal - {...props} + header={props.header} + show={props.show} size="lg" aria-labelledby="contained-modal-title-vcenter" centered + onHide={props.onHide} > <Modal.Header closeButton> <Modal.Title id="contained-modal-title-vcenter"> @@ -38,7 +40,7 @@ function StaffModal(props: { {props.hideText || t("staffModal.Cancel")} </Button> {!props.hideSuccess ? <Button - variant={props.successColor || "primary"} + variant={props.successColor || "success"} onClick={props.onSuccess} > {props.successText || t("staffModal.Done")} diff --git a/client/src/components/UserLayout.tsx b/client/src/components/UserLayout.tsx index 7863cff..fa7eb71 100644 --- a/client/src/components/UserLayout.tsx +++ b/client/src/components/UserLayout.tsx @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from "react"; +import React, { useEffect } from "react"; import { useTranslation } from "react-i18next"; import { Outlet } from "react-router"; import { useLocation } from "react-router-dom"; diff --git a/client/src/components/forms/BoatInfo.tsx b/client/src/components/forms/BoatInfo.tsx new file mode 100644 index 0000000..37b857d --- /dev/null +++ b/client/src/components/forms/BoatInfo.tsx @@ -0,0 +1,137 @@ +import React from "react"; +import { Form } from "react-bootstrap"; +import { Controller, useForm } from "react-hook-form"; +import { useTranslation } from "react-i18next"; +import validator from "validator"; + +type FormData = { + sport: string; + boatName: string; + startTime: string; + estimatedEndTime: string; + destination: string; + name: string; + email: string; + annotations: string; +}; + +function BoatInfo(props: any) { + + const { + control, + handleSubmit, + formState: { errors }, + } = useForm<FormData>({ + mode: "onBlur" + }); + const { t } = useTranslation(); + + const onSubmit = (data: FormData) => { + try { + /** + * Logic to handle authentication. Should be separated into a service in another file. + * await login(data); + * + * + * navigate("/boatManager"); + */ + } catch (e) { + alert("error"); + } + }; + + return ( + <Form onSubmit={handleSubmit(onSubmit)}> + <Controller + name="sport" + control={control} + defaultValue= {props.sport} + render={({ field }) => ( + <div className="mb-2"> + <Form.Label >{t("bookingForm.labelSport")}</Form.Label> + <Form.Control disabled type="text" {...field} /> + </div> + )} + /> + <Controller + name="boatName" + control={control} + defaultValue={props.boatName} + render={({ field }) => ( + <div className="mb-2"> + <Form.Label>{t("bookingForm.labelBoatName")}</Form.Label> + <Form.Control disabled type="text" {...field}/> + </div> + )} + /> + <Controller + name="startTime" + control={control} + defaultValue={props.startTime} + render={({ field }) => ( + <div className="mb-2"> + <Form.Label>{t("bookingForm.labelStartTime")}</Form.Label> + <Form.Control disabled type="time" {...field}/> + </div> + )} + /> + <Controller + name="estimatedEndTime" + control={control} + defaultValue={props.estimatedEndTime} + render={({ field }) => ( + <div className="mb-2"> + <Form.Label>{t("bookingForm.labelEstimatedEndTime")}</Form.Label> + <Form.Control disabled type="time" {...field}/> + </div> + )} + /> + <Controller + name="destination" + control={control} + defaultValue={props.destination} + render={({ field }) => ( + <div className="mb-2"> + <Form.Label>{t("bookingForm.labelDestination")}</Form.Label> + <Form.Control disabled type="text" {...field}/> + </div> + )} + /> + <Controller + name="name" + control={control} + defaultValue={props.name} + render={({ field }) => ( + <div className="mb-2"> + <Form.Label>{t("bookingForm.labelName")}</Form.Label> + <Form.Control disabled type="text" {...field}/> + </div> + )} + /> + <Controller + name="email" + control={control} + defaultValue={props.email} + render={({ field }) => ( + <div className="mb-2"> + <Form.Label>{t("bookingForm.labelEmail")}</Form.Label> + <Form.Control disabled type="email" {...field}/> + </div> + )} + /> + <Controller + name="annotations" + control={control} + defaultValue={props.annotations} + render={({ field }) => ( + <div className="mb-2"> + <Form.Label>{t("bookingForm.labelAnnotations")}</Form.Label> + <Form.Control disabled type="text" {...field}/> + </div> + )} + /> + </Form> + ); +} + +export default BoatInfo; \ No newline at end of file diff --git a/client/src/components/forms/EditBoatTypeForm.tsx b/client/src/components/forms/EditBoatTypeForm.tsx new file mode 100644 index 0000000..c5fe678 --- /dev/null +++ b/client/src/components/forms/EditBoatTypeForm.tsx @@ -0,0 +1,134 @@ +import React from "react"; +import { Form } from "react-bootstrap"; +import { Controller, useForm } from "react-hook-form"; +import { useTranslation } from "react-i18next"; +import validator from "validator"; + +type FormData = { + id: number; + boatTypename: string; + seats: number; + sport: string; +}; + +function EditBoatType(props: any) { + + const { + control, + handleSubmit, + formState: { errors }, + } = useForm<FormData>({ + mode: "onBlur" + }); + const { t } = useTranslation(); + + const onSubmit = (data: FormData) => { + try { + /** + * Logic to handle authentication. Should be separated into a service in another file. + * await login(data); + * + * + * navigate("/boatManager"); + */ + } catch (e) { + alert("error"); + } + }; + + return ( + <Form onSubmit={handleSubmit(onSubmit)}> + {props.id && + <Controller + name="id" + control={control} + defaultValue= {props.id} + render={({ field }) => ( + <div className="mb-2"> + <Form.Label >{t("boatTypeOverview.Id")}</Form.Label> + <Form.Control disabled type="text" {...field} /> + </div> + )} + rules={{ + required: { + value: true, + message: t("boatTypeOverview.messages.required", { + val: t("boatTypeOverview.Id"), + }), + } + }} + /> + } + <Controller + name="boatTypename" + control={control} + defaultValue={props.boatTypename} + render={({ field }) => ( + <div className="mb-2"> + <Form.Label>{t("boatTypeOverview.Name")}</Form.Label> + <Form.Control type="text" {...field} isInvalid={!!errors.boatTypename}/> + <Form.Control.Feedback type="invalid"> + {errors.boatTypename?.message} + </Form.Control.Feedback> + </div> + )} + rules={{ + required: { + value: true, + message: t("boatTypeOverview.messages.required", { + val: t("boatTypeOverview.Name"), + }), + }, + validate: (value: string) => + validator.isAlphanumeric(value) || + t("boatTypeOverview.messages.required").toString(), + }} + /> + <Controller + name="seats" + control={control} + defaultValue={props.seats} + render={({ field }) => ( + <div className="mb-2"> + <Form.Label>{t("boatTypeOverview.Seats")}</Form.Label> + <Form.Control type="text" {...field} isInvalid={!!errors.boatTypename}/> + <Form.Control.Feedback type="invalid"> + {errors.seats?.message} + </Form.Control.Feedback> + </div> + )} + rules={{ + required: { + value: true, + message: t("boatTypeOverview.messages.required", { + val: t("boatTypeOverview.Seats"), + }), + } + }} + /> + <Controller + name="sport" + control={control} + defaultValue={props.sport} + render={({ field }) => ( + <div className="mb-2"> + <Form.Label>{t("boatTypeOverview.Sport")}</Form.Label> + <Form.Select> + <option>1</option> + </Form.Select> + </div> + )} + rules={{ + required: { + value: true, + message: t("boatTypeOverview.messages.required", { + val: t("boatTypeOverview.Sport"), + }), + } + }} + /> + </Form> + ); +} + +export default EditBoatType; \ No newline at end of file diff --git a/client/src/components/forms/EditSports.tsx b/client/src/components/forms/EditSports.tsx new file mode 100644 index 0000000..382a737 --- /dev/null +++ b/client/src/components/forms/EditSports.tsx @@ -0,0 +1,89 @@ +import React from "react"; +import { Form } from "react-bootstrap"; +import { Controller, useForm } from "react-hook-form"; +import { useTranslation } from "react-i18next"; +import validator from "validator"; + +type FormData = { + id: number; + name: string; +}; + +function EditSports(props: any) { + + const { + control, + handleSubmit, + formState: { errors }, + } = useForm<FormData>({ + mode: "onBlur" + }); + const { t } = useTranslation(); + + const onSubmit = (data: FormData) => { + try { + /** + * Logic to handle authentication. Should be separated into a service in another file. + * await login(data); + * + * + * navigate("/boatManager"); + */ + } catch (e) { + alert("error"); + } + }; + + return ( + <Form onSubmit={handleSubmit(onSubmit)}> + {props.id && + <Controller + name="id" + control={control} + defaultValue= {props.id} + render={({ field }) => ( + <div className="mb-2"> + <Form.Label >{t("sports.Id")}</Form.Label> + <Form.Control disabled type="text" {...field} /> + </div> + )} + rules={{ + required: { + value: true, + message: t("boatTypeOverview.messages.required", { + val: t("boatTypeOverview.Id"), + }), + } + }} + /> + } + <Controller + name="name" + control={control} + defaultValue={props.name} + render={({ field }) => ( + <div className="mb-2"> + <Form.Label>{t("sports.Name")}</Form.Label> + <Form.Control type="text" {...field} isInvalid={!!errors.name}/> + <Form.Control.Feedback type="invalid"> + {errors.name?.message} + </Form.Control.Feedback> + </div> + )} + rules={{ + required: { + value: true, + message: t("Sports.messages.required", { + val: t("Sports.Name"), + }), + }, + validate: (value: string) => + validator.isAlphanumeric(value) || + t("Sports.messages.required").toString(), + }} + /> + </Form> + ); +} + +export default EditSports; \ No newline at end of file diff --git a/client/src/components/Divider.tsx b/client/src/components/layout/Divider.tsx similarity index 100% rename from client/src/components/Divider.tsx rename to client/src/components/layout/Divider.tsx diff --git a/client/src/components/Loading.tsx b/client/src/components/layout/Loading.tsx similarity index 100% rename from client/src/components/Loading.tsx rename to client/src/components/layout/Loading.tsx diff --git a/client/src/index.tsx b/client/src/index.tsx index 3ee6e0c..3655d79 100644 --- a/client/src/index.tsx +++ b/client/src/index.tsx @@ -1,6 +1,6 @@ import React, { Suspense } from "react"; import ReactDOM from "react-dom"; -import Loading from "./components/Loading"; +import Loading from "./components/layout/Loading"; import "./i18n"; import Router from "./Router"; import "./styles/app.scss"; diff --git a/client/src/pages/public/BookingForm.tsx b/client/src/pages/public/BookingForm.tsx index 75c2cff..8a3fde4 100644 --- a/client/src/pages/public/BookingForm.tsx +++ b/client/src/pages/public/BookingForm.tsx @@ -4,7 +4,7 @@ import { Controller, useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { useNavigate } from "react-router"; import validator from "validator"; -import Divider from "../../components/Divider"; +import Divider from "../../components/layout/Divider"; import Modal from "../../components/Modal"; type FormData = { diff --git a/client/src/pages/public/BookingSignOutSuccess.tsx b/client/src/pages/public/BookingSignOutSuccess.tsx index 86c75bb..075b5e3 100644 --- a/client/src/pages/public/BookingSignOutSuccess.tsx +++ b/client/src/pages/public/BookingSignOutSuccess.tsx @@ -3,7 +3,7 @@ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import React from "react"; import { Col, Container, Row } from "react-bootstrap"; import { useTranslation } from "react-i18next"; -import Divider from "../../components/Divider"; +import Divider from "../../components/layout/Divider"; import Modal from "../../components/Modal"; function BookingSignOutSuccess() { diff --git a/client/src/pages/public/BookingSuccessful.tsx b/client/src/pages/public/BookingSuccessful.tsx index 3611c20..9b6e694 100644 --- a/client/src/pages/public/BookingSuccessful.tsx +++ b/client/src/pages/public/BookingSuccessful.tsx @@ -3,7 +3,7 @@ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import React from "react"; import { Col, Container, Row } from "react-bootstrap"; import { useTranslation } from "react-i18next"; -import Divider from "../../components/Divider"; +import Divider from "../../components/layout/Divider"; import Modal from "../../components/Modal"; function BookingSuccessful() { diff --git a/client/src/pages/staff/BoatManager.tsx b/client/src/pages/staff/BoatManager.tsx index ef79ed7..06d4eb6 100644 --- a/client/src/pages/staff/BoatManager.tsx +++ b/client/src/pages/staff/BoatManager.tsx @@ -1,9 +1,7 @@ -import React, { useEffect, useState } from "react"; +import React, { useState } from "react"; import { Button, Container, Row } from "react-bootstrap"; import { useTranslation } from "react-i18next"; -import Divider from "../../components/Divider"; import ManagedBoatTile from "../../components/ManagedBoatTile"; -import { faEdit, faTrashAlt } from "@fortawesome/free-regular-svg-icons"; import { faPlus } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import StaffModal from "../../components/StaffModal" @@ -11,6 +9,15 @@ import StaffModal from "../../components/StaffModal" function BoatManager() { const { t } = useTranslation(); const [addElement, setAddElement] = useState<any>(false); + const [infoElement, setInfoElement] = useState<any>(false); + const [blockElement, setBlockElement] = useState<any>(false); + const [unblockElement, setUnBlockElement] = useState<any>(false); + + const boats = [{ id: 1, boatName: "Nicholas Unless-Jesus-Christ-Had-Died-For-Thee-Thou-Hadst-Been-Damned Barbon", time: "13:15-15:14", seats: 2, blocked: true }, { id: 2, boatName: "Canoe 1", time: "13:15-15:14", seats: 2, blocked: true }, { id: 3, boatName: "Canoe 1", time: "13:15-15:14", seats: 2, blocked: true }, + { id: 4, boatName: "Canoe 1", time: "13:15-15:14", seats: 2, blocked: true }, { id: 5, boatName: "Canoe 1", time: "13:15-15:14", seats: 2, blocked: true }, { id: 6, boatName: "Canoe 1", time: "13:15-15:14", seats: 2, blocked: true }, + { id: 7, boatName: "Canoe 1", time: "13:15-15:14", seats: 2, blocked: false }, { id: 8, boatName: "Canoe 1", time: "13:15-15:14", seats: 2, blocked: false }, { id: 9, boatName: "Canoe 1", time: "13:15-15:14", seats: 2, blocked: false }, + { id: 10, boatName: "Canoe 1", time: "13:15-15:14", seats: 2, blocked: false }, { id: 11, boatName: "Canoe 1", time: "13:15-15:14", seats: 2, blocked: false }, { id: 12, boatName: "Canoe 1", time: "13:15-15:14", seats: 2, blocked: false },] + return ( <div className="text-center position-relative"> @@ -18,13 +25,11 @@ function BoatManager() { {/*TODO: Make dynamic*/} <div className="py-3 bg-light border"> <Container> - <div className="overdue-tiles text-center"> + <div className="blocked-tiles text-center"> <Row xs={1} md={2} xxl={3}> - <ManagedBoatTile boatName="Nicholas Unless-Jesus-Christ-Had-Died-For-Thee-Thou-Hadst-Been-Damned Barbon" blocked={true}></ManagedBoatTile> - <ManagedBoatTile boatName="Canoe 7" blocked={true}></ManagedBoatTile> - <ManagedBoatTile boatName="Canoe 13" blocked={true}></ManagedBoatTile> - <ManagedBoatTile boatName="Canoe 16" blocked={true}></ManagedBoatTile> - <ManagedBoatTile boatName="Canoe 22" blocked={true}></ManagedBoatTile> + {boats.filter(x => x.blocked).map(x => + <ManagedBoatTile key={x.id} boatName={x.boatName} onInfoClick={() => { setInfoElement(x) }} onBlockClick={() => { setUnBlockElement(x) }} blocked={true}></ManagedBoatTile> + )} </Row> </div> <Button variant="light" className="mt-3 shadow-sm bg-white border w-50 text-uppercase rounded-pill">{t("boatOverview.buttonShowAll")}</Button> @@ -34,25 +39,28 @@ function BoatManager() { <h2 className="my-3">{t("boatManager.availableBoats")}</h2> <div className="py-3 bg-light border"> <Container> - <div className="overdue-tiles text-center"> + <div className="blocked-tiles text-center"> <Row xs={1} md={2} xxl={3}> - <ManagedBoatTile boatName="Canoe 2" time="13:15-15:14" persons="3 Person" blocked={false}></ManagedBoatTile> - <ManagedBoatTile boatName="Canoe 5" time="13:15-15:14" persons="3 Person" blocked={false}></ManagedBoatTile> - <ManagedBoatTile boatName="Canoe 6" time="13:15-15:14" persons="3 Person" blocked={false}></ManagedBoatTile> - <ManagedBoatTile boatName="Canoe 9" time="13:15-15:14" persons="3 Person" blocked={false}></ManagedBoatTile> - <ManagedBoatTile boatName="Canoe 18" time="13:15-15:14" persons="3 Person" blocked={false}></ManagedBoatTile> - <ManagedBoatTile boatName="Canoe 20" time="13:15-15:14" persons="3 Person" blocked={false}></ManagedBoatTile> + {boats.filter(x => !x.blocked).map(x => + <ManagedBoatTile key={x.id} boatName={x.boatName} time={x.time} persons={x.seats + " Person"} onInfoClick={() => { setInfoElement(x) }} onBlockClick={() => { setBlockElement(x) }} blocked={false}></ManagedBoatTile> + )} </Row> </div> <Button variant="light" className="mt-3 shadow-sm bg-white border w-50 text-uppercase rounded-pill">{t("boatOverview.buttonShowAll")}</Button> </Container> </div> <div className="d-flex px-2 py-1 justify-content-end bg-white border-top" style={{ position: "sticky", right: "5px", bottom: "0", zIndex: 3 }}> - <Button onClick={() => { setAddElement(true) }} variant="secondary"><FontAwesomeIcon icon={faPlus} className="text-white" /> Add Boat</Button> + <Button onClick={() => { setAddElement(true) }} variant="secondary"><FontAwesomeIcon icon={faPlus} className="text-white me-2" />{t("boatManager.addBoat")}</Button> </div> - <StaffModal header={"Add BoatType"} show={addElement} successText="Add" onHide={() => { setAddElement(false) }} onSuccess={() => { setAddElement(undefined) }}> + <StaffModal header={t("boatManager.addBoat")} show={addElement} successText={t("boatManager.Add")} onHide={() => { setAddElement(false) }} onSuccess={() => { setAddElement(false) }}> + </StaffModal> + <StaffModal header={t("boatManager.InfoBoat")} show={infoElement} successText={t("boatManager.Info")} onHide={() => { setInfoElement(false) }} onSuccess={() => { setInfoElement(false) }}> + </StaffModal> + <StaffModal header={t("boatManager.BlockBoat")} show={blockElement} successText={t("boatManager.Block")} onHide={() => { setBlockElement(false) }} onSuccess={() => { setBlockElement(false) }}> + </StaffModal> + <StaffModal header={t("boatManager.UnblockBoat")} show={unblockElement} successText={t("boatManager.Unblock")} onHide={() => { setUnBlockElement(false) }} onSuccess={() => { setUnBlockElement(false) }}> </StaffModal> - </div> + </div > ); } diff --git a/client/src/pages/staff/BoatOverview.tsx b/client/src/pages/staff/BoatOverview.tsx index 6adb69d..0385879 100644 --- a/client/src/pages/staff/BoatOverview.tsx +++ b/client/src/pages/staff/BoatOverview.tsx @@ -1,14 +1,19 @@ -import React, { useEffect, useState } from "react"; +import React, { useState } from "react"; import { Button, Container, Row } from "react-bootstrap"; import { useTranslation } from "react-i18next"; -import Divider from "../../components/Divider"; import RentedBoatTile from "../../components/RentedBoatTile"; import StaffModal from "../../components/StaffModal"; +import BoatInfo from "../../components/forms/BoatInfo"; function BoatOverview() { const { t } = useTranslation(); - const [infoElement, setInfoElement] = useState<any>(undefined); + const [infoElement, setInfoElement] = useState<any>(undefined); + + const boats = [{ id: 1, boatName: "Canoe 1", time: "13:15-15:14", seats: 2, overdue: true }, { id: 2, boatName: "Canoe 1", time: "13:15-15:14", seats: 2, overdue: true }, { id: 3, boatName: "Canoe 1", time: "13:15-15:14", seats: 2, overdue: true }, + { id: 4, boatName: "Canoe 1", time: "13:15-15:14", seats: 2, overdue: true }, { id: 5, boatName: "Canoe 1", time: "13:15-15:14", seats: 2, overdue: true }, { id: 6, boatName: "Canoe 1", time: "13:15-15:14", seats: 2, overdue: true }, + { id: 7, boatName: "Canoe 1", time: "13:15-15:14", seats: 2, overdue: false }, { id: 8, boatName: "Canoe 1", time: "13:15-15:14", seats: 2, overdue: false }, { id: 9, boatName: "Canoe 1", time: "13:15-15:14", seats: 2, overdue: false }, + { id: 10, boatName: "Canoe 1", time: "13:15-15:14", seats: 2, overdue: false }, { id: 11, boatName: "Canoe 1", time: "13:15-15:14", seats: 2, overdue: false }, { id: 12, boatName: "Canoe 1", time: "13:15-15:14", seats: 2, overdue: false },] return ( <div className="text-center"> @@ -18,11 +23,9 @@ function BoatOverview() { <Container> <div className="overdue-tiles text-center"> <Row xs={1} md={2} xxl={3}> - <RentedBoatTile boatName="Canoe 1" time="13:15-15:14" persons="1 Person" overdue="Overdue!" clickEvent={()=>{setInfoElement({boatName:"ABC"})}}></RentedBoatTile> - <RentedBoatTile boatName="Canoe 7" time="13:15-15:14" persons="3 Person" overdue="Overdue!" clickEvent={()=>{setInfoElement({boatName:"CDE"})}}></RentedBoatTile> - <RentedBoatTile boatName="Canoe 13" time="13:15-15:14" persons="3 Person" overdue="Overdue!" clickEvent={()=>{setInfoElement({boatName:"DEF"})}}></RentedBoatTile> - <RentedBoatTile boatName="Canoe 16" time="13:15-15:14" persons="3 Person" overdue="Overdue!" clickEvent={()=>{setInfoElement({boatName:"EFG"})}}></RentedBoatTile> - <RentedBoatTile boatName="Canoe 22" time="13:15-15:14" persons="3 Person" overdue="Overdue!" clickEvent={()=>{setInfoElement({boatName:"FGH"})}}></RentedBoatTile> + {boats.filter(x => x.overdue).map(x => + <RentedBoatTile key={x.id} boatName={x.boatName} time={x.time} persons={x.seats + " Person"} overdue={true} clickEvent={() => { setInfoElement(x) }}></RentedBoatTile> + )} </Row> </div> <Button variant="light" className="mt-3 shadow-sm bg-white border w-50 text-uppercase rounded-pill">{t("boatOverview.buttonShowAll")}</Button> @@ -34,18 +37,16 @@ function BoatOverview() { <Container> <div className="overdue-tiles text-center"> <Row xs={1} md={2} xxl={3}> - <RentedBoatTile boatName="Canoe 2" time="13:15-15:14" persons="3 Person" overdue={false}></RentedBoatTile> - <RentedBoatTile boatName="Canoe 5" time="13:15-15:14" persons="3 Person" overdue={false}></RentedBoatTile> - <RentedBoatTile boatName="Canoe 6" time="13:15-15:14" persons="3 Person" overdue={false}></RentedBoatTile> - <RentedBoatTile boatName="Canoe 9" time="13:15-15:14" persons="3 Person" overdue={false}></RentedBoatTile> - <RentedBoatTile boatName="Canoe 18" time="13:15-15:14" persons="3 Person" overdue={false}></RentedBoatTile> - <RentedBoatTile boatName="Canoe 20" time="13:15-15:14" persons="3 Person" overdue={false}></RentedBoatTile> + {boats.filter(x => !x.overdue).map(x => + <RentedBoatTile key={x.id} boatName={x.boatName} time={x.time} persons={x.seats + " Person"} overdue={false} clickEvent={() => { setInfoElement(x) }}></RentedBoatTile> + )} </Row> </div> <Button variant="light" className="mt-3 shadow-sm bg-white border w-50 text-uppercase rounded-pill">{t("boatOverview.buttonShowAll")}</Button> </Container> </div> - <StaffModal header={"Boat Info"} show={infoElement?.boatName} onHide={() => { setInfoElement(undefined) }} onSuccess={() => { setInfoElement(undefined) }}> + <StaffModal header={t("boatOverview.BoatInfo")} show={infoElement?.boatName} successText={t("boatOverview.EndRide")} successColor="dark" onHide={() => { setInfoElement(undefined) }} onSuccess={() => { setInfoElement(undefined) }}> + <BoatInfo></BoatInfo> </StaffModal> </div> ); diff --git a/client/src/pages/staff/BoatTypeOverview.tsx b/client/src/pages/staff/BoatTypeOverview.tsx index 142c0dc..c4e42d0 100644 --- a/client/src/pages/staff/BoatTypeOverview.tsx +++ b/client/src/pages/staff/BoatTypeOverview.tsx @@ -1,34 +1,32 @@ -import React, { useEffect, useState } from "react"; +import React, { useState } from "react"; import { Table, Button } from "react-bootstrap"; import { useTranslation } from "react-i18next"; import { faEdit, faTrashAlt } from "@fortawesome/free-regular-svg-icons"; import { faPlus } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import StaffModal from "../../components/StaffModal"; +import EditBoatTypeForm from "../../components/forms/EditBoatTypeForm"; function BoatTypeOverview() { const { t } = useTranslation(); - const [editElement, setEditElement] = useState<any>(undefined); - const [deleteElement, setDeleteElement] = useState<any>(undefined); - const [addElement, setAddElement] = useState<any>(false); + const [editElement, setEditElement] = useState<({ id: number; name: string; seats: number; sport: number; } | undefined)>(undefined); + const [deleteElement, setDeleteElement] = useState<({ id: number; name: string; seats: number; sport: number; } | undefined)>(undefined); + const [addElement, setAddElement] = useState<({ id: number; name: string; seats: number; sport: number; } | boolean)>(false); return ( <div className="m-1 h-100"> - <div className="my-2 d-flex justify-content-end mx-2"> - <Button onClick={() => { setAddElement(true) }} variant="secondary"><FontAwesomeIcon icon={faPlus} className="text-white" /> Add</Button> - </div> <Table responsive striped bordered hover> <thead> <tr> - <th>Id</th> - <th>Name</th> - <th>Seats</th> - <th>Sport</th> + <th>{t("boatTypeOverview.Id")}</th> + <th>{t("boatTypeOverview.Name")}</th> + <th>{t("boatTypeOverview.Seats")}</th> + <th>{t("boatTypeOverview.Sport")}</th> <th></th> </tr> </thead> - <tbody> + <tbody style={{ overflowY: "scroll", maxHeight: "100px" }}> { - [{ id: 1, name: "Das Boot 1", seats: 1, sport: 1 }, { id: 2, name: "Das Boot 2", seats: 1, sport: 1 }, { id: 3, name: "Das Boot 3", seats: 1, sport: 1 }].map(x => ( + [{ id: 1, name: "Das Boot 1", seats: 1, sport: 1 }, { id: 2, name: "Das Boot 2", seats: 1, sport: 1 }, { id: 3, name: "Das Boot 3", seats: 1, sport: 1 }, { id: 4, name: "Das Boot 2", seats: 1, sport: 1 }, { id: 5, name: "Das Boot 2", seats: 1, sport: 1 }, { id: 6, name: "Das Boot 2", seats: 1, sport: 1 }, { id: 7, name: "Das Boot 2", seats: 1, sport: 1 }, { id: 8, name: "Das Boot 2", seats: 1, sport: 1 }, { id: 9, name: "Das Boot 2", seats: 1, sport: 1 }].map(x => ( <tr key={x.id}> <td>{x.id}</td> <td>{x.name}</td> @@ -53,17 +51,20 @@ function BoatTypeOverview() { } </tbody> </Table> - <StaffModal header={"Add BoatType"} show={addElement} successText="Add" onHide={() => { setAddElement(false) }} onSuccess={() => { setAddElement(undefined) }}> - + <div className="d-flex px-2 py-1 justify-content-end bg-white border-top" style={{ position: "sticky", right: "5px", bottom: "0", zIndex: 3 }}> + <Button onClick={() => { setAddElement(true) }} variant="secondary"><FontAwesomeIcon icon={faPlus} className="text-white me-2" />{t("boatTypeOverview.addBoatType")}</Button> + </div> + <StaffModal header={t("boatTypeOverview.addBoatType")} show={!!addElement} successText={t("boatTypeOverview.Add")} onHide={() => { setAddElement(false) }} onSuccess={() => { setAddElement(false) }}> + <EditBoatTypeForm boatTypename={""} seats={1} sport={editElement?.sport}></EditBoatTypeForm> </StaffModal> - <StaffModal header={"Edit BoatType"} show={editElement} onHide={() => { setEditElement(undefined) }} onSuccess={() => { setEditElement(undefined) }}> - + <StaffModal header={t("boatTypeOverview.EditBoatType")} successText={t("boatTypeOverview.Edit")} show={!!editElement} onHide={() => { setEditElement(undefined) }} onSuccess={() => { setEditElement(undefined) }}> + <EditBoatTypeForm id={editElement?.id} boatTypename={editElement?.name} seats={editElement?.seats} sport={editElement?.sport}></EditBoatTypeForm> </StaffModal> - <StaffModal header={"Delete BoatType?"} hideColor="secondary" successText="Delete" successColor="danger" show={deleteElement} onHide={() => { setDeleteElement(undefined) }} onSuccess={() => { setDeleteElement(undefined) }}> - <span>Do you really want to delete "{deleteElement?.name}"?</span> + <StaffModal header={t("boatTypeOverview.DeleteBoatType")} hideColor="secondary" successText={t("boatTypeOverview.Delete")} successColor="danger" show={!!deleteElement} onHide={() => { setDeleteElement(undefined) }} onSuccess={() => { setDeleteElement(undefined) }}> + <span>{t("boatTypeOverview.messages.DeleteText", { val: deleteElement?.name })}</span> </StaffModal> </div> - ); + ) } export default BoatTypeOverview; diff --git a/client/src/pages/staff/Sports.tsx b/client/src/pages/staff/Sports.tsx new file mode 100644 index 0000000..e217925 --- /dev/null +++ b/client/src/pages/staff/Sports.tsx @@ -0,0 +1,67 @@ +import React, { useState } from "react"; +import { Table, Button } from "react-bootstrap"; +import { useTranslation } from "react-i18next"; +import { faEdit, faTrashAlt } from "@fortawesome/free-regular-svg-icons"; +import { faPlus } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import StaffModal from "../../components/StaffModal"; +import EditSports from "../../components/forms/EditSports"; + + +function Sports() { + const { t } = useTranslation(); + const [editElement, setEditElement] = useState<{ id: number; name: string;}|undefined>(undefined); + const [deleteElement, setDeleteElement] = useState<any>(undefined); + const [addElement, setAddElement] = useState<any>(false); + return ( + <div className="m-1 h-100"> + <Table responsive striped bordered hover> + <thead> + <tr> + <th>{t("sports.Id")}</th> + <th>{t("sports.Name")}</th> + <th></th> + </tr> + </thead> + <tbody> + { + [{ id: 1, name: "Wasser 1" }, { id: 2, name: "Wasser 2" }].map(x => ( + <tr key={x.id}> + <td>{x.id}</td> + <td>{x.name}</td> + <td> + <div className="d-flex"> + <div className="mx-2" onClick={() => { setEditElement(x) }}><FontAwesomeIcon + icon={faEdit} + className="text-secondary clickableIcon" + size="1x" /> + </div> + <div className="mx-2" onClick={() => { setDeleteElement(x) }}><FontAwesomeIcon + icon={faTrashAlt} + className="text-danger clickableIcon" + size="1x" /> + </div> + </div> + </td> + </tr> + )) + } + </tbody> + </Table> + <div className="d-flex px-2 py-1 justify-content-end bg-white border-top" style={{ position: "sticky", right: "5px", bottom: "0", zIndex: 3 }}> + <Button onClick={() => { setAddElement(true) }} variant="secondary"><FontAwesomeIcon icon={faPlus} className="text-white me-2" />{t("sports.AddSport")}</Button> + </div> + <StaffModal header={t("sports.AddSport")} show={addElement} successText={t("sports.Add")} onHide={() => { setAddElement(false) }} onSuccess={() => { setAddElement(undefined) }}> + <EditSports></EditSports> + </StaffModal> + <StaffModal header={t("sports.EditSport")} show={!!editElement} successText={t("sports.Edit")} onHide={() => { setEditElement(undefined) }} onSuccess={() => { setEditElement(undefined) }}> + <EditSports id={editElement?.id} name={editElement?.name} ></EditSports> + </StaffModal> + <StaffModal header={t("sports.DeleteSport")} hideColor="secondary" successText={t("sports.Delete")} successColor="danger" show={deleteElement} onHide={() => { setDeleteElement(undefined) }} onSuccess={() => { setDeleteElement(undefined) }}> + <span>{t("sports.messages.DeleteText", {val: deleteElement?.name})}</span> + </StaffModal> + </div> + ); +} + +export default Sports; diff --git a/client/src/pages/staff/StaffLogin.tsx b/client/src/pages/staff/StaffLogin.tsx index f33bf23..102ceeb 100644 --- a/client/src/pages/staff/StaffLogin.tsx +++ b/client/src/pages/staff/StaffLogin.tsx @@ -3,7 +3,7 @@ import { Button, Col, Container, Form, Row } from "react-bootstrap"; import { Controller, useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import validator from "validator"; -import Divider from "../../components/Divider"; +import Divider from "../../components/layout/Divider"; import Modal from "../../components/Modal"; type FormData = { diff --git a/client/src/pages/staff/Statistics.tsx b/client/src/pages/staff/Statistics.tsx index 197d8b5..32215ff 100644 --- a/client/src/pages/staff/Statistics.tsx +++ b/client/src/pages/staff/Statistics.tsx @@ -1,12 +1,4260 @@ -import React, { useEffect, useState } from "react"; -import { useTranslation } from "react-i18next"; - +import React from "react"; +// import { useTranslation } from "react-i18next"; +import { ResponsiveCalendar } from "@nivo/calendar" +import { Form, Row } from "react-bootstrap"; function StatisticOverview() { - const { t } = useTranslation(); + // const { t } = useTranslation(); + + const data = [ + { + "value": 375, + "day": "2015-12-03" + }, + { + "value": 251, + "day": "2017-12-05" + }, + { + "value": 210, + "day": "2015-12-07" + }, + { + "value": 155, + "day": "2016-06-22" + }, + { + "value": 88, + "day": "2016-03-16" + }, + { + "value": 226, + "day": "2017-01-24" + }, + { + "value": 213, + "day": "2015-09-23" + }, + { + "value": 40, + "day": "2017-04-26" + }, + { + "value": 36, + "day": "2017-10-14" + }, + { + "value": 270, + "day": "2015-12-24" + }, + { + "value": 283, + "day": "2017-09-03" + }, + { + "value": 100, + "day": "2016-09-17" + }, + { + "value": 59, + "day": "2016-12-23" + }, + { + "value": 230, + "day": "2016-04-30" + }, + { + "value": 51, + "day": "2018-07-11" + }, + { + "value": 375, + "day": "2017-06-18" + }, + { + "value": 290, + "day": "2017-11-08" + }, + { + "value": 57, + "day": "2015-10-29" + }, + { + "value": 53, + "day": "2016-10-12" + }, + { + "value": 107, + "day": "2017-06-19" + }, + { + "value": 374, + "day": "2016-04-27" + }, + { + "value": 52, + "day": "2015-11-15" + }, + { + "value": 249, + "day": "2017-09-14" + }, + { + "value": 181, + "day": "2018-03-02" + }, + { + "value": 373, + "day": "2015-12-10" + }, + { + "value": 167, + "day": "2017-02-08" + }, + { + "value": 252, + "day": "2018-07-14" + }, + { + "value": 94, + "day": "2016-03-11" + }, + { + "value": 332, + "day": "2017-05-22" + }, + { + "value": 99, + "day": "2016-06-07" + }, + { + "value": 297, + "day": "2017-04-06" + }, + { + "value": 158, + "day": "2016-05-13" + }, + { + "value": 113, + "day": "2016-04-19" + }, + { + "value": 78, + "day": "2016-10-04" + }, + { + "value": 150, + "day": "2016-01-09" + }, + { + "value": 118, + "day": "2017-12-07" + }, + { + "value": 80, + "day": "2018-03-10" + }, + { + "value": 346, + "day": "2018-03-04" + }, + { + "value": 355, + "day": "2018-01-13" + }, + { + "value": 64, + "day": "2018-07-06" + }, + { + "value": 153, + "day": "2016-10-08" + }, + { + "value": 129, + "day": "2016-08-24" + }, + { + "value": 134, + "day": "2017-01-02" + }, + { + "value": 256, + "day": "2015-10-03" + }, + { + "value": 327, + "day": "2015-06-14" + }, + { + "value": 143, + "day": "2017-05-07" + }, + { + "value": 63, + "day": "2017-01-17" + }, + { + "value": 16, + "day": "2018-07-07" + }, + { + "value": 161, + "day": "2018-03-01" + }, + { + "value": 200, + "day": "2018-01-06" + }, + { + "value": 357, + "day": "2016-02-06" + }, + { + "value": 304, + "day": "2018-06-11" + }, + { + "value": 10, + "day": "2017-09-02" + }, + { + "value": 236, + "day": "2017-11-03" + }, + { + "value": 246, + "day": "2015-07-27" + }, + { + "value": 69, + "day": "2017-01-18" + }, + { + "value": 275, + "day": "2016-10-29" + }, + { + "value": 297, + "day": "2015-12-01" + }, + { + "value": 310, + "day": "2016-02-27" + }, + { + "value": 365, + "day": "2018-06-05" + }, + { + "value": 196, + "day": "2016-02-23" + }, + { + "value": 91, + "day": "2016-12-30" + }, + { + "value": 71, + "day": "2017-10-23" + }, + { + "value": 148, + "day": "2016-02-08" + }, + { + "value": 314, + "day": "2016-11-06" + }, + { + "value": 255, + "day": "2016-12-02" + }, + { + "value": 136, + "day": "2017-12-09" + }, + { + "value": 154, + "day": "2016-01-23" + }, + { + "value": 235, + "day": "2018-05-08" + }, + { + "value": 328, + "day": "2017-10-04" + }, + { + "value": 228, + "day": "2017-10-15" + }, + { + "value": 166, + "day": "2016-04-01" + }, + { + "value": 310, + "day": "2016-10-30" + }, + { + "value": 92, + "day": "2017-06-17" + }, + { + "value": 28, + "day": "2016-06-08" + }, + { + "value": 101, + "day": "2015-08-11" + }, + { + "value": 243, + "day": "2016-08-20" + }, + { + "value": 46, + "day": "2016-02-29" + }, + { + "value": 380, + "day": "2017-04-02" + }, + { + "value": 309, + "day": "2015-05-18" + }, + { + "value": 193, + "day": "2015-07-19" + }, + { + "value": 33, + "day": "2018-05-14" + }, + { + "value": 146, + "day": "2017-06-23" + }, + { + "value": 261, + "day": "2015-04-24" + }, + { + "value": 219, + "day": "2018-01-26" + }, + { + "value": 92, + "day": "2016-11-30" + }, + { + "value": 48, + "day": "2015-10-26" + }, + { + "value": 146, + "day": "2017-12-08" + }, + { + "value": 214, + "day": "2017-10-16" + }, + { + "value": 380, + "day": "2016-05-25" + }, + { + "value": 100, + "day": "2017-07-26" + }, + { + "value": 60, + "day": "2016-06-01" + }, + { + "value": 42, + "day": "2016-10-20" + }, + { + "value": 224, + "day": "2017-08-01" + }, + { + "value": 136, + "day": "2015-09-18" + }, + { + "value": 62, + "day": "2016-12-14" + }, + { + "value": 177, + "day": "2018-02-28" + }, + { + "value": 163, + "day": "2017-07-25" + }, + { + "value": 32, + "day": "2017-01-05" + }, + { + "value": 241, + "day": "2016-10-07" + }, + { + "value": 309, + "day": "2015-11-12" + }, + { + "value": 238, + "day": "2015-09-07" + }, + { + "value": 36, + "day": "2017-07-01" + }, + { + "value": 24, + "day": "2017-08-04" + }, + { + "value": 18, + "day": "2018-03-11" + }, + { + "value": 132, + "day": "2015-09-17" + }, + { + "value": 17, + "day": "2017-05-30" + }, + { + "value": 68, + "day": "2017-07-28" + }, + { + "value": 118, + "day": "2015-12-13" + }, + { + "value": 109, + "day": "2017-10-27" + }, + { + "value": 318, + "day": "2018-07-24" + }, + { + "value": 356, + "day": "2016-07-17" + }, + { + "value": 394, + "day": "2015-05-21" + }, + { + "value": 93, + "day": "2016-04-02" + }, + { + "value": 4, + "day": "2018-06-16" + }, + { + "value": 176, + "day": "2016-09-22" + }, + { + "value": 24, + "day": "2015-10-24" + }, + { + "value": 49, + "day": "2018-04-11" + }, + { + "value": 312, + "day": "2016-11-03" + }, + { + "value": 343, + "day": "2016-06-23" + }, + { + "value": 303, + "day": "2017-06-29" + }, + { + "value": 286, + "day": "2015-05-04" + }, + { + "value": 13, + "day": "2016-03-07" + }, + { + "value": 87, + "day": "2017-07-06" + }, + { + "value": 133, + "day": "2017-10-07" + }, + { + "value": 158, + "day": "2017-09-21" + }, + { + "value": 330, + "day": "2018-05-31" + }, + { + "value": 29, + "day": "2017-09-08" + }, + { + "value": 98, + "day": "2016-02-11" + }, + { + "value": 213, + "day": "2015-12-06" + }, + { + "value": 71, + "day": "2015-05-05" + }, + { + "value": 337, + "day": "2015-12-26" + }, + { + "value": 109, + "day": "2016-01-12" + }, + { + "value": 87, + "day": "2017-09-27" + }, + { + "value": 141, + "day": "2017-03-16" + }, + { + "value": 37, + "day": "2015-04-13" + }, + { + "value": 116, + "day": "2016-02-25" + }, + { + "value": 42, + "day": "2018-02-16" + }, + { + "value": 270, + "day": "2015-06-03" + }, + { + "value": 388, + "day": "2017-11-01" + }, + { + "value": 88, + "day": "2016-12-29" + }, + { + "value": 18, + "day": "2015-08-02" + }, + { + "value": 257, + "day": "2016-08-04" + }, + { + "value": 205, + "day": "2015-05-25" + }, + { + "value": 272, + "day": "2015-10-07" + }, + { + "value": 233, + "day": "2016-03-03" + }, + { + "value": 166, + "day": "2016-04-14" + }, + { + "value": 104, + "day": "2018-05-11" + }, + { + "value": 52, + "day": "2017-01-10" + }, + { + "value": 20, + "day": "2016-09-14" + }, + { + "value": 75, + "day": "2018-01-03" + }, + { + "value": 378, + "day": "2018-07-04" + }, + { + "value": 164, + "day": "2018-01-29" + }, + { + "value": 41, + "day": "2017-02-11" + }, + { + "value": 247, + "day": "2018-08-09" + }, + { + "value": 35, + "day": "2016-08-30" + }, + { + "value": 206, + "day": "2015-05-13" + }, + { + "value": 369, + "day": "2015-07-26" + }, + { + "value": 121, + "day": "2016-07-11" + }, + { + "value": 195, + "day": "2018-02-08" + }, + { + "value": 339, + "day": "2016-02-28" + }, + { + "value": 184, + "day": "2016-11-29" + }, + { + "value": 335, + "day": "2017-04-17" + }, + { + "value": 9, + "day": "2016-07-01" + }, + { + "value": 61, + "day": "2017-10-21" + }, + { + "value": 230, + "day": "2017-07-07" + }, + { + "value": 54, + "day": "2015-06-23" + }, + { + "value": 184, + "day": "2016-07-13" + }, + { + "value": 132, + "day": "2015-10-18" + }, + { + "value": 235, + "day": "2017-02-04" + }, + { + "value": 357, + "day": "2016-06-30" + }, + { + "value": 267, + "day": "2015-05-15" + }, + { + "value": 87, + "day": "2017-05-26" + }, + { + "value": 323, + "day": "2018-01-18" + }, + { + "value": 254, + "day": "2015-08-03" + }, + { + "value": 120, + "day": "2016-06-17" + }, + { + "value": 318, + "day": "2017-05-11" + }, + { + "value": 174, + "day": "2016-06-26" + }, + { + "value": 162, + "day": "2017-02-01" + }, + { + "value": 233, + "day": "2015-06-08" + }, + { + "value": 291, + "day": "2018-06-01" + }, + { + "value": 3, + "day": "2015-04-21" + }, + { + "value": 288, + "day": "2017-10-25" + }, + { + "value": 34, + "day": "2015-05-22" + }, + { + "value": 319, + "day": "2016-11-08" + }, + { + "value": 77, + "day": "2017-03-13" + }, + { + "value": 143, + "day": "2018-02-01" + }, + { + "value": 314, + "day": "2016-06-20" + }, + { + "value": 77, + "day": "2017-06-05" + }, + { + "value": 61, + "day": "2017-12-19" + }, + { + "value": 301, + "day": "2017-03-01" + }, + { + "value": 70, + "day": "2015-12-27" + }, + { + "value": 246, + "day": "2016-04-20" + }, + { + "value": 250, + "day": "2018-02-03" + }, + { + "value": 246, + "day": "2015-11-27" + }, + { + "value": 238, + "day": "2018-05-15" + }, + { + "value": 333, + "day": "2017-07-21" + }, + { + "value": 343, + "day": "2016-07-31" + }, + { + "value": 210, + "day": "2016-03-23" + }, + { + "value": 77, + "day": "2015-11-19" + }, + { + "value": 298, + "day": "2017-02-06" + }, + { + "value": 265, + "day": "2017-08-05" + }, + { + "value": 130, + "day": "2018-05-03" + }, + { + "value": 364, + "day": "2016-07-04" + }, + { + "value": 203, + "day": "2016-05-26" + }, + { + "value": 318, + "day": "2017-07-20" + }, + { + "value": 294, + "day": "2016-12-08" + }, + { + "value": 25, + "day": "2017-01-07" + }, + { + "value": 289, + "day": "2017-12-04" + }, + { + "value": 110, + "day": "2016-04-04" + }, + { + "value": 400, + "day": "2017-06-11" + }, + { + "value": 152, + "day": "2017-12-18" + }, + { + "value": 234, + "day": "2016-12-18" + }, + { + "value": 244, + "day": "2015-06-21" + }, + { + "value": 144, + "day": "2015-08-21" + }, + { + "value": 350, + "day": "2016-08-14" + }, + { + "value": 90, + "day": "2015-12-11" + }, + { + "value": 273, + "day": "2017-01-01" + }, + { + "value": 294, + "day": "2016-10-17" + }, + { + "value": 308, + "day": "2017-07-15" + }, + { + "value": 173, + "day": "2016-11-21" + }, + { + "value": 372, + "day": "2017-05-01" + }, + { + "value": 330, + "day": "2017-08-12" + }, + { + "value": 11, + "day": "2018-04-24" + }, + { + "value": 144, + "day": "2017-04-28" + }, + { + "value": 352, + "day": "2015-07-31" + }, + { + "value": 84, + "day": "2018-01-07" + }, + { + "value": 124, + "day": "2017-10-26" + }, + { + "value": 234, + "day": "2017-03-25" + }, + { + "value": 90, + "day": "2018-07-09" + }, + { + "value": 316, + "day": "2016-11-18" + }, + { + "value": 159, + "day": "2016-07-26" + }, + { + "value": 297, + "day": "2018-04-05" + }, + { + "value": 142, + "day": "2018-08-02" + }, + { + "value": 36, + "day": "2018-07-13" + }, + { + "value": 324, + "day": "2015-12-02" + }, + { + "value": 150, + "day": "2017-02-10" + }, + { + "value": 47, + "day": "2017-06-27" + }, + { + "value": 321, + "day": "2017-01-22" + }, + { + "value": 99, + "day": "2016-03-22" + }, + { + "value": 284, + "day": "2016-05-07" + }, + { + "value": 157, + "day": "2016-10-19" + }, + { + "value": 362, + "day": "2017-06-10" + }, + { + "value": 79, + "day": "2015-12-15" + }, + { + "value": 322, + "day": "2017-12-28" + }, + { + "value": 220, + "day": "2016-01-06" + }, + { + "value": 315, + "day": "2017-09-18" + }, + { + "value": 127, + "day": "2015-11-03" + }, + { + "value": 57, + "day": "2016-07-23" + }, + { + "value": 205, + "day": "2018-04-29" + }, + { + "value": 273, + "day": "2015-06-01" + }, + { + "value": 272, + "day": "2015-09-12" + }, + { + "value": 342, + "day": "2018-03-30" + }, + { + "value": 145, + "day": "2016-01-27" + }, + { + "value": 374, + "day": "2015-10-21" + }, + { + "value": 298, + "day": "2017-01-20" + }, + { + "value": 200, + "day": "2017-06-02" + }, + { + "value": 341, + "day": "2015-07-24" + }, + { + "value": 305, + "day": "2016-07-24" + }, + { + "value": 351, + "day": "2017-10-28" + }, + { + "value": 95, + "day": "2017-05-15" + }, + { + "value": 207, + "day": "2016-08-07" + }, + { + "value": 352, + "day": "2018-02-05" + }, + { + "value": 48, + "day": "2017-04-16" + }, + { + "value": 106, + "day": "2017-05-05" + }, + { + "value": 218, + "day": "2017-10-01" + }, + { + "value": 340, + "day": "2015-08-30" + }, + { + "value": 178, + "day": "2017-11-06" + }, + { + "value": 270, + "day": "2016-06-19" + }, + { + "value": 298, + "day": "2017-03-21" + }, + { + "value": 385, + "day": "2017-08-21" + }, + { + "value": 52, + "day": "2016-11-27" + }, + { + "value": 252, + "day": "2016-09-21" + }, + { + "value": 214, + "day": "2015-09-01" + }, + { + "value": 26, + "day": "2018-04-26" + }, + { + "value": 82, + "day": "2017-04-01" + }, + { + "value": 291, + "day": "2015-05-19" + }, + { + "value": 89, + "day": "2018-01-14" + }, + { + "value": 274, + "day": "2015-05-12" + }, + { + "value": 41, + "day": "2016-07-07" + }, + { + "value": 318, + "day": "2016-02-05" + }, + { + "value": 254, + "day": "2015-10-12" + }, + { + "value": 131, + "day": "2016-05-10" + }, + { + "value": 124, + "day": "2017-11-14" + }, + { + "value": 212, + "day": "2017-06-21" + }, + { + "value": 343, + "day": "2015-07-09" + }, + { + "value": 383, + "day": "2017-05-25" + }, + { + "value": 214, + "day": "2015-08-16" + }, + { + "value": 195, + "day": "2016-11-25" + }, + { + "value": 203, + "day": "2017-08-15" + }, + { + "value": 297, + "day": "2015-10-14" + }, + { + "value": 114, + "day": "2015-05-11" + }, + { + "value": 260, + "day": "2018-03-03" + }, + { + "value": 143, + "day": "2015-05-27" + }, + { + "value": 242, + "day": "2018-02-06" + }, + { + "value": 175, + "day": "2016-01-13" + }, + { + "value": 355, + "day": "2017-05-06" + }, + { + "value": 271, + "day": "2017-11-26" + }, + { + "value": 237, + "day": "2015-10-08" + }, + { + "value": 365, + "day": "2015-09-08" + }, + { + "value": 20, + "day": "2017-06-15" + }, + { + "value": 75, + "day": "2017-08-22" + }, + { + "value": 270, + "day": "2015-07-16" + }, + { + "value": 257, + "day": "2015-10-06" + }, + { + "value": 327, + "day": "2017-02-18" + }, + { + "value": 272, + "day": "2016-05-24" + }, + { + "value": 365, + "day": "2016-06-05" + }, + { + "value": 169, + "day": "2016-06-18" + }, + { + "value": 221, + "day": "2016-04-18" + }, + { + "value": 37, + "day": "2015-10-23" + }, + { + "value": 226, + "day": "2015-11-24" + }, + { + "value": 177, + "day": "2016-10-14" + }, + { + "value": 220, + "day": "2015-04-05" + }, + { + "value": 76, + "day": "2015-12-09" + }, + { + "value": 219, + "day": "2016-08-26" + }, + { + "value": 132, + "day": "2016-04-15" + }, + { + "value": 65, + "day": "2018-05-19" + }, + { + "value": 337, + "day": "2016-01-29" + }, + { + "value": 239, + "day": "2018-08-05" + }, + { + "value": 37, + "day": "2016-10-03" + }, + { + "value": 9, + "day": "2017-02-17" + }, + { + "value": 12, + "day": "2017-07-24" + }, + { + "value": 8, + "day": "2016-10-10" + }, + { + "value": 248, + "day": "2015-09-10" + }, + { + "value": 122, + "day": "2017-07-18" + }, + { + "value": 352, + "day": "2015-04-25" + }, + { + "value": 142, + "day": "2018-04-20" + }, + { + "value": 122, + "day": "2018-04-03" + }, + { + "value": 386, + "day": "2016-03-02" + }, + { + "value": 244, + "day": "2015-05-31" + }, + { + "value": 6, + "day": "2017-06-12" + }, + { + "value": 21, + "day": "2016-11-13" + }, + { + "value": 205, + "day": "2018-06-18" + }, + { + "value": 96, + "day": "2017-11-02" + }, + { + "value": 339, + "day": "2017-09-22" + }, + { + "value": 236, + "day": "2016-09-23" + }, + { + "value": 67, + "day": "2018-02-15" + }, + { + "value": 123, + "day": "2017-02-12" + }, + { + "value": 59, + "day": "2015-06-26" + }, + { + "value": 209, + "day": "2015-04-11" + }, + { + "value": 8, + "day": "2017-05-03" + }, + { + "value": 314, + "day": "2017-09-30" + }, + { + "value": 346, + "day": "2016-11-05" + }, + { + "value": 273, + "day": "2015-08-08" + }, + { + "value": 78, + "day": "2017-10-22" + }, + { + "value": 16, + "day": "2016-07-19" + }, + { + "value": 108, + "day": "2017-12-10" + }, + { + "value": 242, + "day": "2015-07-12" + }, + { + "value": 129, + "day": "2015-09-03" + }, + { + "value": 153, + "day": "2017-11-19" + }, + { + "value": 369, + "day": "2015-05-24" + }, + { + "value": 274, + "day": "2017-03-29" + }, + { + "value": 75, + "day": "2016-02-21" + }, + { + "value": 386, + "day": "2016-02-19" + }, + { + "value": 251, + "day": "2016-08-06" + }, + { + "value": 394, + "day": "2018-01-20" + }, + { + "value": 96, + "day": "2016-09-26" + }, + { + "value": 165, + "day": "2016-04-26" + }, + { + "value": 389, + "day": "2016-04-07" + }, + { + "value": 359, + "day": "2016-11-20" + }, + { + "value": 188, + "day": "2016-04-13" + }, + { + "value": 172, + "day": "2015-07-20" + }, + { + "value": 317, + "day": "2016-10-06" + }, + { + "value": 65, + "day": "2016-05-19" + }, + { + "value": 386, + "day": "2017-06-30" + }, + { + "value": 93, + "day": "2015-05-26" + }, + { + "value": 375, + "day": "2017-08-09" + }, + { + "value": 170, + "day": "2017-09-05" + }, + { + "value": 358, + "day": "2015-11-16" + }, + { + "value": 182, + "day": "2015-08-07" + }, + { + "value": 292, + "day": "2016-09-20" + }, + { + "value": 143, + "day": "2015-04-19" + }, + { + "value": 123, + "day": "2018-07-27" + }, + { + "value": 23, + "day": "2018-07-19" + }, + { + "value": 331, + "day": "2017-12-12" + }, + { + "value": 290, + "day": "2017-01-03" + }, + { + "value": 230, + "day": "2017-09-20" + }, + { + "value": 172, + "day": "2017-07-23" + }, + { + "value": 216, + "day": "2018-05-07" + }, + { + "value": 346, + "day": "2017-09-17" + }, + { + "value": 254, + "day": "2018-01-24" + }, + { + "value": 388, + "day": "2015-11-10" + }, + { + "value": 268, + "day": "2018-01-16" + }, + { + "value": 171, + "day": "2015-06-10" + }, + { + "value": 110, + "day": "2016-09-15" + }, + { + "value": 89, + "day": "2017-08-17" + }, + { + "value": 210, + "day": "2018-01-22" + }, + { + "value": 182, + "day": "2016-05-28" + }, + { + "value": 177, + "day": "2015-07-04" + }, + { + "value": 345, + "day": "2016-01-10" + }, + { + "value": 262, + "day": "2017-06-25" + }, + { + "value": 20, + "day": "2017-07-16" + }, + { + "value": 85, + "day": "2016-07-10" + }, + { + "value": 59, + "day": "2018-06-13" + }, + { + "value": 315, + "day": "2017-03-12" + }, + { + "value": 273, + "day": "2017-08-23" + }, + { + "value": 227, + "day": "2017-11-13" + }, + { + "value": 297, + "day": "2017-03-28" + }, + { + "value": 129, + "day": "2016-05-04" + }, + { + "value": 237, + "day": "2017-09-15" + }, + { + "value": 140, + "day": "2015-10-25" + }, + { + "value": 84, + "day": "2016-04-23" + }, + { + "value": 145, + "day": "2017-06-04" + }, + { + "value": 41, + "day": "2017-05-20" + }, + { + "value": 184, + "day": "2017-01-12" + }, + { + "value": 392, + "day": "2018-03-05" + }, + { + "value": 168, + "day": "2017-03-30" + }, + { + "value": 191, + "day": "2017-03-09" + }, + { + "value": 364, + "day": "2017-07-29" + }, + { + "value": 211, + "day": "2017-01-25" + }, + { + "value": 275, + "day": "2016-12-17" + }, + { + "value": 320, + "day": "2017-03-27" + }, + { + "value": 178, + "day": "2015-05-16" + }, + { + "value": 186, + "day": "2018-07-20" + }, + { + "value": 42, + "day": "2016-10-28" + }, + { + "value": 43, + "day": "2018-02-14" + }, + { + "value": 245, + "day": "2015-04-30" + }, + { + "value": 58, + "day": "2015-11-06" + }, + { + "value": 311, + "day": "2016-01-15" + }, + { + "value": 104, + "day": "2017-06-01" + }, + { + "value": 56, + "day": "2016-10-31" + }, + { + "value": 129, + "day": "2017-02-21" + }, + { + "value": 116, + "day": "2016-09-13" + }, + { + "value": 154, + "day": "2017-05-12" + }, + { + "value": 163, + "day": "2015-05-14" + }, + { + "value": 399, + "day": "2018-06-02" + }, + { + "value": 312, + "day": "2015-04-14" + }, + { + "value": 313, + "day": "2015-10-04" + }, + { + "value": 61, + "day": "2015-09-02" + }, + { + "value": 60, + "day": "2016-12-28" + }, + { + "value": 206, + "day": "2015-07-25" + }, + { + "value": 77, + "day": "2015-04-26" + }, + { + "value": 119, + "day": "2015-10-05" + }, + { + "value": 253, + "day": "2018-06-21" + }, + { + "value": 284, + "day": "2015-07-14" + }, + { + "value": 38, + "day": "2017-08-30" + }, + { + "value": 22, + "day": "2017-01-29" + }, + { + "value": 47, + "day": "2017-12-21" + }, + { + "value": 26, + "day": "2015-09-13" + }, + { + "value": 22, + "day": "2016-10-22" + }, + { + "value": 254, + "day": "2017-10-18" + }, + { + "value": 6, + "day": "2018-04-17" + }, + { + "value": 96, + "day": "2017-05-23" + }, + { + "value": 18, + "day": "2016-03-20" + }, + { + "value": 102, + "day": "2016-12-04" + }, + { + "value": 153, + "day": "2016-07-08" + }, + { + "value": 354, + "day": "2017-03-07" + }, + { + "value": 112, + "day": "2016-11-28" + }, + { + "value": 354, + "day": "2017-03-06" + }, + { + "value": 30, + "day": "2018-08-01" + }, + { + "value": 199, + "day": "2016-06-06" + }, + { + "value": 365, + "day": "2018-05-26" + }, + { + "value": 331, + "day": "2016-01-05" + }, + { + "value": 132, + "day": "2015-08-22" + }, + { + "value": 337, + "day": "2017-03-02" + }, + { + "value": 46, + "day": "2017-08-26" + }, + { + "value": 360, + "day": "2017-08-31" + }, + { + "value": 349, + "day": "2016-08-11" + }, + { + "value": 247, + "day": "2015-08-05" + }, + { + "value": 373, + "day": "2018-01-25" + }, + { + "value": 314, + "day": "2015-08-18" + }, + { + "value": 139, + "day": "2016-03-04" + }, + { + "value": 230, + "day": "2017-05-16" + }, + { + "value": 232, + "day": "2016-02-26" + }, + { + "value": 38, + "day": "2018-01-21" + }, + { + "value": 199, + "day": "2018-06-09" + }, + { + "value": 170, + "day": "2016-09-30" + }, + { + "value": 96, + "day": "2015-06-16" + }, + { + "value": 44, + "day": "2016-12-19" + }, + { + "value": 391, + "day": "2015-11-29" + }, + { + "value": 331, + "day": "2016-02-18" + }, + { + "value": 255, + "day": "2015-07-22" + }, + { + "value": 25, + "day": "2018-05-13" + }, + { + "value": 250, + "day": "2017-06-16" + }, + { + "value": 129, + "day": "2017-12-03" + }, + { + "value": 115, + "day": "2017-07-10" + }, + { + "value": 271, + "day": "2017-10-13" + }, + { + "value": 32, + "day": "2017-01-06" + }, + { + "value": 80, + "day": "2016-08-27" + }, + { + "value": 43, + "day": "2018-03-18" + }, + { + "value": 49, + "day": "2015-12-30" + }, + { + "value": 358, + "day": "2018-06-24" + }, + { + "value": 338, + "day": "2015-11-17" + }, + { + "value": 137, + "day": "2016-05-20" + }, + { + "value": 204, + "day": "2015-08-10" + }, + { + "value": 183, + "day": "2015-09-22" + }, + { + "value": 157, + "day": "2016-07-14" + }, + { + "value": 16, + "day": "2016-04-11" + }, + { + "value": 334, + "day": "2018-02-12" + }, + { + "value": 349, + "day": "2015-11-09" + }, + { + "value": 131, + "day": "2018-02-19" + }, + { + "value": 371, + "day": "2016-09-01" + }, + { + "value": 15, + "day": "2015-06-12" + }, + { + "value": 159, + "day": "2016-07-16" + }, + { + "value": 369, + "day": "2016-05-29" + }, + { + "value": 290, + "day": "2015-08-13" + }, + { + "value": 139, + "day": "2015-08-27" + }, + { + "value": 330, + "day": "2016-03-19" + }, + { + "value": 84, + "day": "2016-08-15" + }, + { + "value": 196, + "day": "2016-10-11" + }, + { + "value": 90, + "day": "2015-08-28" + }, + { + "value": 106, + "day": "2018-04-12" + }, + { + "value": 319, + "day": "2015-10-13" + }, + { + "value": 328, + "day": "2017-03-20" + }, + { + "value": 86, + "day": "2015-09-29" + }, + { + "value": 253, + "day": "2015-09-04" + }, + { + "value": 103, + "day": "2017-12-01" + }, + { + "value": 121, + "day": "2018-07-18" + }, + { + "value": 120, + "day": "2016-05-09" + }, + { + "value": 297, + "day": "2016-08-16" + }, + { + "value": 27, + "day": "2015-12-20" + }, + { + "value": 25, + "day": "2016-07-22" + }, + { + "value": 296, + "day": "2017-11-07" + }, + { + "value": 49, + "day": "2016-01-02" + }, + { + "value": 224, + "day": "2016-04-21" + }, + { + "value": 68, + "day": "2017-11-24" + }, + { + "value": 362, + "day": "2016-09-06" + }, + { + "value": 185, + "day": "2015-10-15" + }, + { + "value": 39, + "day": "2015-10-22" + }, + { + "value": 36, + "day": "2016-07-29" + }, + { + "value": 329, + "day": "2015-05-02" + }, + { + "value": 362, + "day": "2018-07-28" + }, + { + "value": 146, + "day": "2015-11-11" + }, + { + "value": 209, + "day": "2015-09-15" + }, + { + "value": 350, + "day": "2018-06-28" + }, + { + "value": 247, + "day": "2015-11-22" + }, + { + "value": 310, + "day": "2017-02-14" + }, + { + "value": 326, + "day": "2016-06-21" + }, + { + "value": 162, + "day": "2015-07-06" + }, + { + "value": 261, + "day": "2016-10-16" + }, + { + "value": 375, + "day": "2017-04-24" + }, + { + "value": 35, + "day": "2017-10-31" + }, + { + "value": 321, + "day": "2018-01-31" + }, + { + "value": 133, + "day": "2017-05-13" + }, + { + "value": 331, + "day": "2015-08-17" + }, + { + "value": 338, + "day": "2017-04-29" + }, + { + "value": 136, + "day": "2016-07-25" + }, + { + "value": 164, + "day": "2016-01-19" + }, + { + "value": 126, + "day": "2018-06-14" + }, + { + "value": 8, + "day": "2017-04-15" + }, + { + "value": 56, + "day": "2018-02-22" + }, + { + "value": 184, + "day": "2016-01-28" + }, + { + "value": 71, + "day": "2018-06-19" + }, + { + "value": 185, + "day": "2018-04-15" + }, + { + "value": 88, + "day": "2016-07-03" + }, + { + "value": 278, + "day": "2017-11-27" + }, + { + "value": 31, + "day": "2018-07-21" + }, + { + "value": 92, + "day": "2018-02-20" + }, + { + "value": 2, + "day": "2015-08-14" + }, + { + "value": 324, + "day": "2018-06-06" + }, + { + "value": 363, + "day": "2017-04-07" + }, + { + "value": 399, + "day": "2018-05-16" + }, + { + "value": 320, + "day": "2015-09-28" + }, + { + "value": 146, + "day": "2017-09-09" + }, + { + "value": 34, + "day": "2018-06-23" + }, + { + "value": 215, + "day": "2016-09-18" + }, + { + "value": 100, + "day": "2018-05-17" + }, + { + "value": 299, + "day": "2016-09-05" + }, + { + "value": 217, + "day": "2016-08-13" + }, + { + "value": 271, + "day": "2016-11-16" + }, + { + "value": 199, + "day": "2017-11-21" + }, + { + "value": 145, + "day": "2015-09-16" + }, + { + "value": 109, + "day": "2016-03-24" + }, + { + "value": 6, + "day": "2017-02-24" + }, + { + "value": 218, + "day": "2015-04-18" + }, + { + "value": 166, + "day": "2018-05-20" + }, + { + "value": 350, + "day": "2018-01-08" + }, + { + "value": 292, + "day": "2015-11-08" + }, + { + "value": 106, + "day": "2016-06-14" + }, + { + "value": 82, + "day": "2016-03-25" + }, + { + "value": 173, + "day": "2015-07-11" + }, + { + "value": 164, + "day": "2016-02-16" + }, + { + "value": 190, + "day": "2018-07-01" + }, + { + "value": 52, + "day": "2017-03-23" + }, + { + "value": 151, + "day": "2015-09-21" + }, + { + "value": 363, + "day": "2015-04-09" + }, + { + "value": 18, + "day": "2015-04-23" + }, + { + "value": 242, + "day": "2017-03-19" + }, + { + "value": 192, + "day": "2015-10-01" + }, + { + "value": 30, + "day": "2015-04-16" + }, + { + "value": 396, + "day": "2016-04-24" + }, + { + "value": 242, + "day": "2016-07-15" + }, + { + "value": 42, + "day": "2016-09-27" + }, + { + "value": 178, + "day": "2017-09-26" + }, + { + "value": 188, + "day": "2016-04-05" + }, + { + "value": 182, + "day": "2015-12-18" + }, + { + "value": 368, + "day": "2016-08-01" + }, + { + "value": 145, + "day": "2017-10-05" + }, + { + "value": 3, + "day": "2016-08-22" + }, + { + "value": 177, + "day": "2018-06-26" + }, + { + "value": 277, + "day": "2015-04-07" + }, + { + "value": 317, + "day": "2016-09-08" + }, + { + "value": 388, + "day": "2018-03-17" + }, + { + "value": 394, + "day": "2015-10-19" + }, + { + "value": 397, + "day": "2018-04-28" + }, + { + "value": 389, + "day": "2016-01-14" + }, + { + "value": 241, + "day": "2016-05-16" + }, + { + "value": 35, + "day": "2016-04-10" + }, + { + "value": 174, + "day": "2016-03-08" + }, + { + "value": 58, + "day": "2015-07-28" + }, + { + "value": 308, + "day": "2015-12-16" + }, + { + "value": 101, + "day": "2015-07-10" + }, + { + "value": 31, + "day": "2017-10-02" + }, + { + "value": 212, + "day": "2015-06-11" + }, + { + "value": 239, + "day": "2017-06-20" + }, + { + "value": 321, + "day": "2016-07-21" + }, + { + "value": 102, + "day": "2015-12-17" + }, + { + "value": 18, + "day": "2016-07-28" + }, + { + "value": 278, + "day": "2015-07-21" + }, + { + "value": 67, + "day": "2017-09-23" + }, + { + "value": 58, + "day": "2017-02-28" + }, + { + "value": 269, + "day": "2018-08-06" + }, + { + "value": 66, + "day": "2018-01-15" + }, + { + "value": 389, + "day": "2016-05-23" + }, + { + "value": 122, + "day": "2015-11-18" + }, + { + "value": 318, + "day": "2015-11-30" + }, + { + "value": 221, + "day": "2016-12-03" + }, + { + "value": 161, + "day": "2018-02-26" + }, + { + "value": 156, + "day": "2018-08-04" + }, + { + "value": 292, + "day": "2015-08-26" + }, + { + "value": 284, + "day": "2018-01-12" + }, + { + "value": 101, + "day": "2018-05-30" + }, + { + "value": 288, + "day": "2017-11-30" + }, + { + "value": 91, + "day": "2015-09-30" + }, + { + "value": 227, + "day": "2017-05-04" + }, + { + "value": 358, + "day": "2016-11-11" + }, + { + "value": 254, + "day": "2018-03-09" + }, + { + "value": 155, + "day": "2017-03-18" + }, + { + "value": 306, + "day": "2017-11-10" + }, + { + "value": 348, + "day": "2016-07-30" + }, + { + "value": 215, + "day": "2016-05-21" + }, + { + "value": 211, + "day": "2016-11-01" + }, + { + "value": 368, + "day": "2016-01-11" + }, + { + "value": 173, + "day": "2016-05-14" + }, + { + "value": 358, + "day": "2016-05-22" + }, + { + "value": 60, + "day": "2017-03-05" + }, + { + "value": 68, + "day": "2016-08-25" + }, + { + "value": 232, + "day": "2017-08-16" + }, + { + "value": 21, + "day": "2015-11-05" + }, + { + "value": 29, + "day": "2017-06-24" + }, + { + "value": 116, + "day": "2015-06-28" + }, + { + "value": 35, + "day": "2017-12-22" + }, + { + "value": 225, + "day": "2017-12-14" + }, + { + "value": 267, + "day": "2016-10-15" + }, + { + "value": 307, + "day": "2015-06-07" + }, + { + "value": 41, + "day": "2017-07-22" + }, + { + "value": 310, + "day": "2015-09-11" + }, + { + "value": 49, + "day": "2017-04-12" + }, + { + "value": 90, + "day": "2015-09-05" + }, + { + "value": 64, + "day": "2018-04-08" + }, + { + "value": 139, + "day": "2017-03-26" + }, + { + "value": 202, + "day": "2017-04-08" + }, + { + "value": 347, + "day": "2016-05-11" + }, + { + "value": 275, + "day": "2017-01-08" + }, + { + "value": 134, + "day": "2018-07-02" + }, + { + "value": 36, + "day": "2018-05-05" + }, + { + "value": 64, + "day": "2018-04-22" + }, + { + "value": 287, + "day": "2015-10-17" + }, + { + "value": 198, + "day": "2017-12-26" + }, + { + "value": 233, + "day": "2017-06-13" + }, + { + "value": 200, + "day": "2017-01-30" + }, + { + "value": 338, + "day": "2017-05-18" + }, + { + "value": 209, + "day": "2016-12-06" + }, + { + "value": 216, + "day": "2018-06-27" + }, + { + "value": 340, + "day": "2016-03-14" + }, + { + "value": 228, + "day": "2017-07-31" + }, + { + "value": 38, + "day": "2018-07-08" + }, + { + "value": 268, + "day": "2018-04-07" + }, + { + "value": 310, + "day": "2017-01-16" + }, + { + "value": 372, + "day": "2016-10-23" + }, + { + "value": 115, + "day": "2015-07-08" + }, + { + "value": 284, + "day": "2017-01-27" + }, + { + "value": 301, + "day": "2018-07-10" + }, + { + "value": 72, + "day": "2017-11-17" + }, + { + "value": 101, + "day": "2015-09-14" + }, + { + "value": 5, + "day": "2015-12-05" + }, + { + "value": 21, + "day": "2018-03-08" + }, + { + "value": 245, + "day": "2015-04-10" + }, + { + "value": 15, + "day": "2018-04-10" + }, + { + "value": 158, + "day": "2015-07-30" + }, + { + "value": 43, + "day": "2017-02-13" + }, + { + "value": 243, + "day": "2015-09-20" + }, + { + "value": 129, + "day": "2018-04-23" + }, + { + "value": 185, + "day": "2015-12-23" + }, + { + "value": 178, + "day": "2018-03-23" + }, + { + "value": 157, + "day": "2015-10-02" + }, + { + "value": 365, + "day": "2015-08-19" + }, + { + "value": 5, + "day": "2018-05-22" + }, + { + "value": 288, + "day": "2016-11-26" + }, + { + "value": 256, + "day": "2017-05-08" + }, + { + "value": 105, + "day": "2018-06-12" + }, + { + "value": 150, + "day": "2017-05-24" + }, + { + "value": 318, + "day": "2015-05-08" + }, + { + "value": 150, + "day": "2017-12-11" + }, + { + "value": 76, + "day": "2016-07-12" + }, + { + "value": 25, + "day": "2017-10-09" + }, + { + "value": 224, + "day": "2018-07-03" + }, + { + "value": 259, + "day": "2016-11-14" + }, + { + "value": 191, + "day": "2015-05-28" + }, + { + "value": 371, + "day": "2016-02-20" + }, + { + "value": 16, + "day": "2018-07-29" + }, + { + "value": 327, + "day": "2018-04-21" + }, + { + "value": 275, + "day": "2018-03-19" + }, + { + "value": 243, + "day": "2016-10-27" + }, + { + "value": 123, + "day": "2015-12-08" + }, + { + "value": 147, + "day": "2017-08-28" + }, + { + "value": 251, + "day": "2015-06-25" + }, + { + "value": 21, + "day": "2016-07-02" + }, + { + "value": 120, + "day": "2015-11-04" + }, + { + "value": 38, + "day": "2015-08-04" + }, + { + "value": 366, + "day": "2018-05-25" + }, + { + "value": 387, + "day": "2016-12-31" + }, + { + "value": 279, + "day": "2015-06-13" + }, + { + "value": 362, + "day": "2015-10-11" + }, + { + "value": 372, + "day": "2015-11-01" + }, + { + "value": 310, + "day": "2017-12-27" + }, + { + "value": 257, + "day": "2017-06-09" + }, + { + "value": 176, + "day": "2016-05-01" + }, + { + "value": 269, + "day": "2016-05-17" + }, + { + "value": 57, + "day": "2016-09-07" + }, + { + "value": 109, + "day": "2015-05-01" + }, + { + "value": 286, + "day": "2016-05-31" + }, + { + "value": 226, + "day": "2016-04-12" + }, + { + "value": 138, + "day": "2016-01-01" + }, + { + "value": 90, + "day": "2016-09-24" + }, + { + "value": 91, + "day": "2015-08-25" + }, + { + "value": 350, + "day": "2017-09-10" + }, + { + "value": 257, + "day": "2017-05-02" + }, + { + "value": 360, + "day": "2016-05-08" + }, + { + "value": 63, + "day": "2016-08-18" + }, + { + "value": 192, + "day": "2015-07-07" + }, + { + "value": 333, + "day": "2017-10-03" + }, + { + "value": 103, + "day": "2016-01-20" + }, + { + "value": 45, + "day": "2017-07-08" + }, + { + "value": 331, + "day": "2015-12-25" + }, + { + "value": 111, + "day": "2018-05-24" + }, + { + "value": 375, + "day": "2016-12-15" + }, + { + "value": 73, + "day": "2018-08-08" + }, + { + "value": 290, + "day": "2017-08-24" + }, + { + "value": 180, + "day": "2017-07-17" + }, + { + "value": 36, + "day": "2016-01-18" + }, + { + "value": 82, + "day": "2018-01-19" + }, + { + "value": 134, + "day": "2015-05-06" + }, + { + "value": 261, + "day": "2017-03-03" + }, + { + "value": 22, + "day": "2017-09-19" + }, + { + "value": 340, + "day": "2016-03-06" + }, + { + "value": 219, + "day": "2015-06-15" + }, + { + "value": 25, + "day": "2017-12-30" + }, + { + "value": 62, + "day": "2017-12-13" + }, + { + "value": 260, + "day": "2017-04-20" + }, + { + "value": 72, + "day": "2015-05-30" + }, + { + "value": 380, + "day": "2017-08-27" + }, + { + "value": 99, + "day": "2017-01-23" + }, + { + "value": 299, + "day": "2016-08-31" + }, + { + "value": 175, + "day": "2017-08-03" + }, + { + "value": 89, + "day": "2015-07-18" + }, + { + "value": 126, + "day": "2017-03-10" + }, + { + "value": 364, + "day": "2017-07-27" + }, + { + "value": 397, + "day": "2017-06-26" + }, + { + "value": 312, + "day": "2017-02-16" + }, + { + "value": 240, + "day": "2015-06-29" + }, + { + "value": 384, + "day": "2016-11-02" + }, + { + "value": 376, + "day": "2015-06-04" + }, + { + "value": 284, + "day": "2018-02-27" + }, + { + "value": 264, + "day": "2015-10-10" + }, + { + "value": 328, + "day": "2018-06-25" + }, + { + "value": 105, + "day": "2015-07-03" + }, + { + "value": 363, + "day": "2018-03-27" + }, + { + "value": 301, + "day": "2017-04-27" + }, + { + "value": 196, + "day": "2015-06-05" + }, + { + "value": 229, + "day": "2017-11-25" + }, + { + "value": 94, + "day": "2018-06-30" + }, + { + "value": 234, + "day": "2016-02-07" + }, + { + "value": 320, + "day": "2017-10-17" + }, + { + "value": 195, + "day": "2018-06-10" + }, + { + "value": 368, + "day": "2018-03-22" + }, + { + "value": 374, + "day": "2015-04-12" + }, + { + "value": 122, + "day": "2015-12-29" + }, + { + "value": 260, + "day": "2017-06-03" + }, + { + "value": 196, + "day": "2015-08-24" + }, + { + "value": 266, + "day": "2017-08-25" + }, + { + "value": 92, + "day": "2018-05-23" + }, + { + "value": 47, + "day": "2016-02-02" + }, + { + "value": 329, + "day": "2015-12-04" + }, + { + "value": 16, + "day": "2018-04-18" + }, + { + "value": 296, + "day": "2018-02-17" + }, + { + "value": 345, + "day": "2017-06-06" + }, + { + "value": 193, + "day": "2017-02-05" + }, + { + "value": 378, + "day": "2015-12-31" + }, + { + "value": 247, + "day": "2015-06-22" + }, + { + "value": 135, + "day": "2017-01-26" + }, + { + "value": 112, + "day": "2017-03-31" + }, + { + "value": 260, + "day": "2016-03-01" + }, + { + "value": 390, + "day": "2015-11-23" + }, + { + "value": 304, + "day": "2015-11-13" + }, + { + "value": 139, + "day": "2017-09-29" + }, + { + "value": 199, + "day": "2018-04-27" + }, + { + "value": 17, + "day": "2015-04-20" + }, + { + "value": 307, + "day": "2018-05-01" + }, + { + "value": 151, + "day": "2015-09-27" + }, + { + "value": 110, + "day": "2015-08-29" + }, + { + "value": 244, + "day": "2015-06-27" + }, + { + "value": 221, + "day": "2017-08-13" + }, + { + "value": 338, + "day": "2017-09-06" + }, + { + "value": 338, + "day": "2017-12-29" + }, + { + "value": 283, + "day": "2017-02-23" + }, + { + "value": 366, + "day": "2017-01-28" + }, + { + "value": 234, + "day": "2015-09-26" + }, + { + "value": 122, + "day": "2017-04-19" + }, + { + "value": 18, + "day": "2015-06-17" + }, + { + "value": 259, + "day": "2016-08-02" + }, + { + "value": 213, + "day": "2015-05-07" + }, + { + "value": 108, + "day": "2017-08-20" + }, + { + "value": 86, + "day": "2017-04-04" + }, + { + "value": 53, + "day": "2018-03-26" + }, + { + "value": 78, + "day": "2015-10-28" + }, + { + "value": 348, + "day": "2017-04-18" + }, + { + "value": 304, + "day": "2016-05-02" + }, + { + "value": 151, + "day": "2016-04-08" + }, + { + "value": 366, + "day": "2016-01-25" + }, + { + "value": 172, + "day": "2015-06-18" + }, + { + "value": 46, + "day": "2017-05-31" + }, + { + "value": 303, + "day": "2017-02-22" + }, + { + "value": 78, + "day": "2016-09-09" + }, + { + "value": 298, + "day": "2016-07-18" + }, + { + "value": 95, + "day": "2017-06-08" + }, + { + "value": 50, + "day": "2018-03-29" + }, + { + "value": 256, + "day": "2016-06-16" + }, + { + "value": 298, + "day": "2017-03-04" + }, + { + "value": 292, + "day": "2018-07-15" + }, + { + "value": 358, + "day": "2018-04-02" + }, + { + "value": 111, + "day": "2017-06-14" + }, + { + "value": 66, + "day": "2018-06-08" + }, + { + "value": 297, + "day": "2017-09-25" + }, + { + "value": 251, + "day": "2016-10-26" + }, + { + "value": 363, + "day": "2016-09-10" + }, + { + "value": 366, + "day": "2016-04-16" + }, + { + "value": 252, + "day": "2016-05-30" + }, + { + "value": 87, + "day": "2016-12-13" + }, + { + "value": 78, + "day": "2017-03-24" + }, + { + "value": 2, + "day": "2018-07-16" + }, + { + "value": 66, + "day": "2016-09-12" + }, + { + "value": 251, + "day": "2015-09-25" + }, + { + "value": 104, + "day": "2017-09-16" + }, + { + "value": 168, + "day": "2016-10-18" + }, + { + "value": 209, + "day": "2017-07-09" + }, + { + "value": 393, + "day": "2017-12-25" + }, + { + "value": 362, + "day": "2016-04-06" + }, + { + "value": 46, + "day": "2015-06-24" + }, + { + "value": 237, + "day": "2016-01-08" + }, + { + "value": 162, + "day": "2018-07-22" + }, + { + "value": 68, + "day": "2017-05-14" + }, + { + "value": 102, + "day": "2017-03-11" + }, + { + "value": 11, + "day": "2017-12-15" + }, + { + "value": 352, + "day": "2017-07-03" + }, + { + "value": 257, + "day": "2018-06-04" + }, + { + "value": 18, + "day": "2017-11-23" + }, + { + "value": 44, + "day": "2017-11-16" + }, + { + "value": 254, + "day": "2016-09-19" + }, + { + "value": 4, + "day": "2016-03-31" + }, + { + "value": 364, + "day": "2016-04-29" + }, + { + "value": 168, + "day": "2018-05-04" + }, + { + "value": 156, + "day": "2017-04-13" + }, + { + "value": 105, + "day": "2017-03-08" + }, + { + "value": 211, + "day": "2018-07-12" + }, + { + "value": 297, + "day": "2016-01-16" + }, + { + "value": 330, + "day": "2016-03-09" + }, + { + "value": 208, + "day": "2016-11-17" + }, + { + "value": 303, + "day": "2015-12-14" + }, + { + "value": 97, + "day": "2015-12-28" + }, + { + "value": 10, + "day": "2017-12-23" + }, + { + "value": 151, + "day": "2015-11-28" + }, + { + "value": 211, + "day": "2016-03-21" + }, + { + "value": 244, + "day": "2017-04-10" + }, + { + "value": 335, + "day": "2018-01-30" + }, + { + "value": 51, + "day": "2016-04-09" + }, + { + "value": 364, + "day": "2018-01-10" + }, + { + "value": 15, + "day": "2016-03-26" + }, + { + "value": 41, + "day": "2018-01-11" + }, + { + "value": 186, + "day": "2015-09-06" + }, + { + "value": 193, + "day": "2018-04-06" + }, + { + "value": 158, + "day": "2017-02-19" + }, + { + "value": 243, + "day": "2018-01-09" + }, + { + "value": 332, + "day": "2017-09-13" + }, + { + "value": 363, + "day": "2018-05-27" + }, + { + "value": 257, + "day": "2015-04-08" + }, + { + "value": 31, + "day": "2015-07-13" + }, + { + "value": 82, + "day": "2016-11-12" + }, + { + "value": 226, + "day": "2016-07-27" + }, + { + "value": 1, + "day": "2016-03-18" + }, + { + "value": 222, + "day": "2015-04-06" + }, + { + "value": 193, + "day": "2017-11-05" + }, + { + "value": 91, + "day": "2017-11-29" + }, + { + "value": 250, + "day": "2018-03-12" + }, + { + "value": 175, + "day": "2017-08-02" + }, + { + "value": 148, + "day": "2017-07-19" + }, + { + "value": 372, + "day": "2016-12-07" + }, + { + "value": 63, + "day": "2016-09-28" + }, + { + "value": 219, + "day": "2016-04-17" + }, + { + "value": 45, + "day": "2018-04-13" + }, + { + "value": 74, + "day": "2018-03-15" + }, + { + "value": 102, + "day": "2018-06-22" + }, + { + "value": 232, + "day": "2016-10-09" + }, + { + "value": 389, + "day": "2015-06-09" + }, + { + "value": 370, + "day": "2016-03-13" + }, + { + "value": 122, + "day": "2018-03-25" + }, + { + "value": 338, + "day": "2016-12-05" + }, + { + "value": 316, + "day": "2018-02-07" + }, + { + "value": 282, + "day": "2016-12-27" + }, + { + "value": 334, + "day": "2017-08-10" + }, + { + "value": 170, + "day": "2018-07-26" + }, + { + "value": 165, + "day": "2016-11-15" + }, + { + "value": 145, + "day": "2017-04-03" + }, + { + "value": 146, + "day": "2016-12-11" + }, + { + "value": 234, + "day": "2017-11-11" + }, + { + "value": 334, + "day": "2015-06-19" + }, + { + "value": 62, + "day": "2016-11-23" + }, + { + "value": 246, + "day": "2015-11-21" + }, + { + "value": 144, + "day": "2017-02-09" + }, + { + "value": 275, + "day": "2017-02-15" + }, + { + "value": 232, + "day": "2018-04-30" + }, + { + "value": 158, + "day": "2015-10-30" + }, + { + "value": 246, + "day": "2016-01-22" + }, + { + "value": 225, + "day": "2015-10-27" + }, + { + "value": 50, + "day": "2016-02-10" + }, + { + "value": 327, + "day": "2018-01-01" + }, + { + "value": 356, + "day": "2017-07-14" + }, + { + "value": 371, + "day": "2015-04-17" + }, + { + "value": 134, + "day": "2017-06-07" + }, + { + "value": 337, + "day": "2015-04-22" + }, + { + "value": 331, + "day": "2016-12-16" + }, + { + "value": 280, + "day": "2018-02-24" + }, + { + "value": 318, + "day": "2015-04-03" + }, + { + "value": 29, + "day": "2016-09-02" + }, + { + "value": 70, + "day": "2015-07-15" + }, + { + "value": 218, + "day": "2017-04-11" + }, + { + "value": 306, + "day": "2018-08-03" + }, + { + "value": 48, + "day": "2018-02-02" + }, + { + "value": 341, + "day": "2016-02-12" + }, + { + "value": 388, + "day": "2016-10-25" + }, + { + "value": 157, + "day": "2017-10-29" + }, + { + "value": 371, + "day": "2016-06-11" + }, + { + "value": 151, + "day": "2015-12-21" + }, + { + "value": 303, + "day": "2016-05-15" + }, + { + "value": 84, + "day": "2017-02-26" + }, + { + "value": 351, + "day": "2015-08-31" + }, + { + "value": 77, + "day": "2017-03-22" + }, + { + "value": 132, + "day": "2018-05-18" + }, + { + "value": 152, + "day": "2017-09-11" + }, + { + "value": 96, + "day": "2015-08-09" + }, + { + "value": 184, + "day": "2015-05-09" + }, + { + "value": 145, + "day": "2017-09-24" + }, + { + "value": 340, + "day": "2015-09-19" + }, + { + "value": 6, + "day": "2017-12-24" + }, + { + "value": 150, + "day": "2018-01-04" + }, + { + "value": 44, + "day": "2016-12-09" + }, + { + "value": 210, + "day": "2016-07-05" + }, + { + "value": 14, + "day": "2016-01-17" + }, + { + "value": 252, + "day": "2016-11-10" + }, + { + "value": 182, + "day": "2017-01-14" + }, + { + "value": 188, + "day": "2017-05-21" + }, + { + "value": 274, + "day": "2015-05-20" + }, + { + "value": 186, + "day": "2016-12-24" + }, + { + "value": 121, + "day": "2016-01-04" + }, + { + "value": 97, + "day": "2016-05-05" + }, + { + "value": 22, + "day": "2017-04-22" + }, + { + "value": 35, + "day": "2017-10-19" + }, + { + "value": 351, + "day": "2018-03-14" + }, + { + "value": 195, + "day": "2015-08-01" + }, + { + "value": 24, + "day": "2018-02-25" + }, + { + "value": 386, + "day": "2016-06-10" + }, + { + "value": 177, + "day": "2015-11-20" + }, + { + "value": 25, + "day": "2015-07-01" + }, + { + "value": 174, + "day": "2016-02-04" + }, + { + "value": 350, + "day": "2018-02-09" + }, + { + "value": 50, + "day": "2016-03-28" + }, + { + "value": 181, + "day": "2018-03-06" + }, + { + "value": 295, + "day": "2018-03-21" + }, + { + "value": 13, + "day": "2015-11-25" + }, + { + "value": 183, + "day": "2018-01-27" + }, + { + "value": 372, + "day": "2018-01-02" + }, + { + "value": 358, + "day": "2015-11-02" + }, + { + "value": 104, + "day": "2018-05-02" + }, + { + "value": 19, + "day": "2017-06-22" + }, + { + "value": 388, + "day": "2018-06-15" + }, + { + "value": 196, + "day": "2016-01-26" + }, + { + "value": 130, + "day": "2015-11-07" + }, + { + "value": 211, + "day": "2016-05-27" + }, + { + "value": 245, + "day": "2017-10-11" + }, + { + "value": 296, + "day": "2017-05-17" + }, + { + "value": 57, + "day": "2016-02-13" + }, + { + "value": 154, + "day": "2015-05-17" + }, + { + "value": 42, + "day": "2018-02-11" + }, + { + "value": 232, + "day": "2018-07-25" + }, + { + "value": 172, + "day": "2016-06-24" + }, + { + "value": 167, + "day": "2016-01-21" + }, + { + "value": 285, + "day": "2017-07-04" + }, + { + "value": 108, + "day": "2016-12-12" + }, + { + "value": 244, + "day": "2018-04-14" + }, + { + "value": 53, + "day": "2016-08-03" + }, + { + "value": 320, + "day": "2018-04-04" + }, + { + "value": 203, + "day": "2015-11-26" + }, + { + "value": 243, + "day": "2017-07-13" + }, + { + "value": 152, + "day": "2017-04-14" + }, + { + "value": 281, + "day": "2017-07-05" + }, + { + "value": 116, + "day": "2015-04-29" + }, + { + "value": 146, + "day": "2016-11-09" + }, + { + "value": 73, + "day": "2016-02-15" + }, + { + "value": 320, + "day": "2017-09-28" + }, + { + "value": 116, + "day": "2016-06-12" + }, + { + "value": 126, + "day": "2018-08-10" + }, + { + "value": 45, + "day": "2018-06-17" + }, + { + "value": 304, + "day": "2015-07-05" + }, + { + "value": 187, + "day": "2017-04-23" + }, + { + "value": 320, + "day": "2018-03-31" + }, + { + "value": 163, + "day": "2017-02-03" + }, + { + "value": 308, + "day": "2015-06-30" + }, + { + "value": 173, + "day": "2017-11-28" + }, + { + "value": 286, + "day": "2018-07-31" + }, + { + "value": 386, + "day": "2016-03-27" + }, + { + "value": 389, + "day": "2015-11-14" + }, + { + "value": 237, + "day": "2016-11-04" + }, + { + "value": 127, + "day": "2018-08-07" + }, + { + "value": 315, + "day": "2018-06-03" + }, + { + "value": 185, + "day": "2015-10-20" + }, + { + "value": 277, + "day": "2018-07-05" + }, + { + "value": 235, + "day": "2017-02-27" + }, + { + "value": 271, + "day": "2018-04-01" + }, + { + "value": 117, + "day": "2015-04-27" + }, + { + "value": 99, + "day": "2018-07-23" + }, + { + "value": 111, + "day": "2017-04-25" + }, + { + "value": 141, + "day": "2018-04-25" + }, + { + "value": 209, + "day": "2017-10-08" + }, + { + "value": 5, + "day": "2016-03-17" + }, + { + "value": 225, + "day": "2016-08-19" + }, + { + "value": 137, + "day": "2017-09-12" + }, + { + "value": 18, + "day": "2017-07-11" + }, + { + "value": 367, + "day": "2018-02-04" + }, + { + "value": 80, + "day": "2017-01-11" + }, + { + "value": 361, + "day": "2015-06-02" + }, + { + "value": 90, + "day": "2017-01-31" + }, + { + "value": 352, + "day": "2015-05-10" + }, + { + "value": 122, + "day": "2015-04-04" + }, + { + "value": 286, + "day": "2016-09-03" + }, + { + "value": 257, + "day": "2017-10-24" + }, + { + "value": 285, + "day": "2016-04-22" + }, + { + "value": 144, + "day": "2017-04-05" + }, + { + "value": 7, + "day": "2016-03-15" + }, + { + "value": 232, + "day": "2016-05-06" + }, + { + "value": 278, + "day": "2017-05-09" + }, + { + "value": 13, + "day": "2016-08-28" + }, + { + "value": 257, + "day": "2016-08-08" + } + ] return ( - <div className="m-1 h-100"> + <div className="m-1 d-flex" style={{ height: "calc(100vh - 58px)" }}> + <Form> + <Form.Group className="mb-3" controlId="formBasicEmail"> + <Form.Label>From</Form.Label> + <Form.Control type="datetime-local" /> + </Form.Group> + <Form.Group className="mb-3" controlId="formBasicEmail"> + <Form.Label>To</Form.Label> + <Form.Control type="datetime-local" /> + </Form.Group> + </Form> + <div className="w-50 h-50"> + <ResponsiveCalendar + data={data} + from="2015-03-01" + to="2016-07-12" + emptyColor="#eeeeee" + colors={['#61cdbb', '#97e3d5', '#e8c1a0', '#f47560']} + margin={{ top: 40, right: 40, bottom: 40, left: 40 }} + yearSpacing={40} + monthBorderColor="#ffffff" + dayBorderWidth={2} + dayBorderColor="#ffffff" + legends={[ + { + anchor: 'bottom-right', + direction: 'row', + translateY: 36, + itemCount: 4, + itemWidth: 42, + itemHeight: 36, + itemsSpacing: 14, + itemDirection: 'right-to-left' + } + ]} + /> + </div> </div> ); -- GitLab