From f585385129bc06af7b8e41c1d92b6dcd67ce335a Mon Sep 17 00:00:00 2001 From: Paul Date: Wed, 4 Oct 2023 21:01:54 +0200 Subject: [PATCH] Update print view (#11) --- package-lock.json | 607 +++++++++--------- package.json | 8 +- .../FirecallItems/FirecallItemDialog.tsx | 4 + src/components/FirecallItems/infos/area.tsx | 3 + src/components/FirecallItems/infos/circle.tsx | 1 + .../FirecallItems/infos/connection.tsx | 1 + src/components/FirecallItems/infos/diary.tsx | 5 +- src/components/FirecallItems/infos/line.tsx | 1 + src/components/FirecallItems/infos/marker.tsx | 2 +- .../FirecallItems/infos/vehicle.tsx | 19 +- src/components/Map/MapActionButtons.tsx | 1 + src/components/Map/markers/AreaMarker.tsx | 3 +- src/components/Map/markers/FirecallMarker.tsx | 12 +- src/components/inputs/DateTimePicker.tsx | 47 +- src/components/pages/EinsatzTagebuchPrint.tsx | 202 ++++++ src/components/pages/Fahrzeuge.tsx | 35 +- src/components/pages/FahrzeugePrint.tsx | 93 +++ src/hooks/useFirecallItemUpdate.ts | 7 +- src/hooks/useVehicles.ts | 47 ++ src/pages/print.tsx | 17 +- 20 files changed, 748 insertions(+), 367 deletions(-) create mode 100644 src/components/pages/EinsatzTagebuchPrint.tsx create mode 100644 src/components/pages/FahrzeugePrint.tsx create mode 100644 src/hooks/useVehicles.ts diff --git a/package-lock.json b/package-lock.json index 81da755..edd05ab 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,14 +7,14 @@ "name": "ffn-map", "license": "MPL-2.0", "dependencies": { - "@emotion/react": "^11.10.6", - "@emotion/styled": "^11.10.6", + "@emotion/react": "^11.11.1", + "@emotion/styled": "^11.11.0", "@mdi/js": "^7.2.96", "@mdi/react": "^1.6.1", "@mui/icons-material": "^5.11.16", - "@mui/material": "^5.12.0", + "@mui/material": "^5.14.11", "@mui/x-data-grid": "^6.1.0", - "@mui/x-date-pickers": "^6.1.0", + "@mui/x-date-pickers": "^6.16.0", "@turf/bbox-polygon": "^6.5.0", "@turf/boolean-within": "^6.5.0", "@turf/center": "^6.5.0", @@ -56,50 +56,115 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", - "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dependencies": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/helper-module-imports": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", - "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", "dependencies": { - "@babel/types": "^7.21.4" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "engines": { @@ -183,23 +248,23 @@ } }, "node_modules/@babel/runtime": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", - "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", + "version": "7.23.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.1.tgz", + "integrity": "sha512-hC2v6p8ZSI/W0HUzh3V8C5g+NwSKzKPtJwSpTjwl0o297GP9+ZLQSkdvHz46CM3LqyoXxq+5G9komY+eSqSO0g==", "dependencies": { - "regenerator-runtime": "^0.13.11" + "regenerator-runtime": "^0.14.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/types": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.4.tgz", - "integrity": "sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", "dependencies": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { @@ -218,183 +283,66 @@ "node": ">=12" } }, - "node_modules/@date-io/core": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/@date-io/core/-/core-2.16.0.tgz", - "integrity": "sha512-DYmSzkr+jToahwWrsiRA2/pzMEtz9Bq1euJwoOuYwuwIYXnZFtHajY2E6a1VNVDc9jP8YUXK1BvnZH9mmT19Zg==" - }, - "node_modules/@date-io/date-fns": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/@date-io/date-fns/-/date-fns-2.16.0.tgz", - "integrity": "sha512-bfm5FJjucqlrnQcXDVU5RD+nlGmL3iWgkHTq3uAZWVIuBu6dDmGa3m8a6zo2VQQpu8ambq9H22UyUpn7590joA==", - "dependencies": { - "@date-io/core": "^2.16.0" - }, - "peerDependencies": { - "date-fns": "^2.0.0" - }, - "peerDependenciesMeta": { - "date-fns": { - "optional": true - } - } - }, - "node_modules/@date-io/date-fns-jalali": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/@date-io/date-fns-jalali/-/date-fns-jalali-2.16.0.tgz", - "integrity": "sha512-MNVvGYwRiBydbvY7gvZM14W2kosIG29G1Ekw5qmYWOXkIIFngh6ZvV7/uVGDCW+gqlIeSz/XitZXA9n8RO0tJw==", - "dependencies": { - "@date-io/core": "^2.16.0" - }, - "peerDependencies": { - "date-fns-jalali": "^2.13.0-0" - }, - "peerDependenciesMeta": { - "date-fns-jalali": { - "optional": true - } - } - }, - "node_modules/@date-io/dayjs": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/@date-io/dayjs/-/dayjs-2.16.0.tgz", - "integrity": "sha512-y5qKyX2j/HG3zMvIxTobYZRGnd1FUW2olZLS0vTj7bEkBQkjd2RO7/FEwDY03Z1geVGlXKnzIATEVBVaGzV4Iw==", - "dependencies": { - "@date-io/core": "^2.16.0" - }, - "peerDependencies": { - "dayjs": "^1.8.17" - }, - "peerDependenciesMeta": { - "dayjs": { - "optional": true - } - } - }, - "node_modules/@date-io/hijri": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/@date-io/hijri/-/hijri-2.16.1.tgz", - "integrity": "sha512-6BxY0mtnqj5cBiXluRs3uWN0mSJwGw0AB2ZxqtEHvBFoiSYEojW51AETnfPIWpdvDsBn+WAC7QrfBvQZnoyIkQ==", - "dependencies": { - "@date-io/moment": "^2.16.1" - }, - "peerDependencies": { - "moment-hijri": "^2.1.2" - }, - "peerDependenciesMeta": { - "moment-hijri": { - "optional": true - } - } - }, - "node_modules/@date-io/jalaali": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/@date-io/jalaali/-/jalaali-2.16.1.tgz", - "integrity": "sha512-GLw87G/WJ1DNrQHW8p/LqkqAqTUSqBSRin0H1pRPwCccB5Fh7GT64sadjzEvjW56lPJ0aq2vp5yI2eIjZajfrw==", - "dependencies": { - "@date-io/moment": "^2.16.1" - }, - "peerDependencies": { - "moment-jalaali": "^0.7.4 || ^0.8.0 || ^0.9.0" - }, - "peerDependenciesMeta": { - "moment-jalaali": { - "optional": true - } - } - }, - "node_modules/@date-io/luxon": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/@date-io/luxon/-/luxon-2.16.1.tgz", - "integrity": "sha512-aeYp5K9PSHV28946pC+9UKUi/xMMYoaGelrpDibZSgHu2VWHXrr7zWLEr+pMPThSs5vt8Ei365PO+84pCm37WQ==", - "dependencies": { - "@date-io/core": "^2.16.0" - }, - "peerDependencies": { - "luxon": "^1.21.3 || ^2.x || ^3.x" - }, - "peerDependenciesMeta": { - "luxon": { - "optional": true - } - } - }, - "node_modules/@date-io/moment": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/@date-io/moment/-/moment-2.16.1.tgz", - "integrity": "sha512-JkxldQxUqZBfZtsaCcCMkm/dmytdyq5pS1RxshCQ4fHhsvP5A7gSqPD22QbVXMcJydi3d3v1Y8BQdUKEuGACZQ==", - "dependencies": { - "@date-io/core": "^2.16.0" - }, - "peerDependencies": { - "moment": "^2.24.0" - }, - "peerDependenciesMeta": { - "moment": { - "optional": true - } - } - }, "node_modules/@emotion/babel-plugin": { - "version": "11.10.6", - "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.10.6.tgz", - "integrity": "sha512-p2dAqtVrkhSa7xz1u/m9eHYdLi+en8NowrmXeF/dKtJpU8lCWli8RUAati7NcSl0afsBott48pdnANuD0wh9QQ==", + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", + "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", "dependencies": { "@babel/helper-module-imports": "^7.16.7", "@babel/runtime": "^7.18.3", - "@emotion/hash": "^0.9.0", - "@emotion/memoize": "^0.8.0", - "@emotion/serialize": "^1.1.1", + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/serialize": "^1.1.2", "babel-plugin-macros": "^3.1.0", "convert-source-map": "^1.5.0", "escape-string-regexp": "^4.0.0", "find-root": "^1.1.0", "source-map": "^0.5.7", - "stylis": "4.1.3" + "stylis": "4.2.0" } }, "node_modules/@emotion/cache": { - "version": "11.10.7", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.10.7.tgz", - "integrity": "sha512-VLl1/2D6LOjH57Y8Vem1RoZ9haWF4jesHDGiHtKozDQuBIkJm2gimVo0I02sWCuzZtVACeixTVB4jeE8qvCBoQ==", + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", + "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", "dependencies": { - "@emotion/memoize": "^0.8.0", - "@emotion/sheet": "^1.2.1", - "@emotion/utils": "^1.2.0", - "@emotion/weak-memoize": "^0.3.0", - "stylis": "4.1.3" + "@emotion/memoize": "^0.8.1", + "@emotion/sheet": "^1.2.2", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "stylis": "4.2.0" } }, "node_modules/@emotion/hash": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.0.tgz", - "integrity": "sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ==" + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" }, "node_modules/@emotion/is-prop-valid": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz", - "integrity": "sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz", + "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==", "dependencies": { - "@emotion/memoize": "^0.8.0" + "@emotion/memoize": "^0.8.1" } }, "node_modules/@emotion/memoize": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.0.tgz", - "integrity": "sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA==" + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" }, "node_modules/@emotion/react": { - "version": "11.10.6", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.10.6.tgz", - "integrity": "sha512-6HT8jBmcSkfzO7mc+N1L9uwvOnlcGoix8Zn7srt+9ga0MjREo6lRpuVX0kzo6Jp6oTqDhREOFsygN6Ew4fEQbw==", + "version": "11.11.1", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.1.tgz", + "integrity": "sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA==", "dependencies": { "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.10.6", - "@emotion/cache": "^11.10.5", - "@emotion/serialize": "^1.1.1", - "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", - "@emotion/utils": "^1.2.0", - "@emotion/weak-memoize": "^0.3.0", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/cache": "^11.11.0", + "@emotion/serialize": "^1.1.2", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", "hoist-non-react-statics": "^3.3.1" }, "peerDependencies": { @@ -407,33 +355,33 @@ } }, "node_modules/@emotion/serialize": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.1.tgz", - "integrity": "sha512-Zl/0LFggN7+L1liljxXdsVSVlg6E/Z/olVWpfxUTxOAmi8NU7YoeWeLfi1RmnB2TATHoaWwIBRoL+FvAJiTUQA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.2.tgz", + "integrity": "sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==", "dependencies": { - "@emotion/hash": "^0.9.0", - "@emotion/memoize": "^0.8.0", - "@emotion/unitless": "^0.8.0", - "@emotion/utils": "^1.2.0", + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/unitless": "^0.8.1", + "@emotion/utils": "^1.2.1", "csstype": "^3.0.2" } }, "node_modules/@emotion/sheet": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.1.tgz", - "integrity": "sha512-zxRBwl93sHMsOj4zs+OslQKg/uhF38MB+OMKoCrVuS0nyTkqnau+BM3WGEoOptg9Oz45T/aIGs1qbVAsEFo3nA==" + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", + "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" }, "node_modules/@emotion/styled": { - "version": "11.10.6", - "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.10.6.tgz", - "integrity": "sha512-OXtBzOmDSJo5Q0AFemHCfl+bUueT8BIcPSxu0EGTpGk6DmI5dnhSzQANm1e1ze0YZL7TDyAyy6s/b/zmGOS3Og==", + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.0.tgz", + "integrity": "sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==", "dependencies": { "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.10.6", - "@emotion/is-prop-valid": "^1.2.0", - "@emotion/serialize": "^1.1.1", - "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", - "@emotion/utils": "^1.2.0" + "@emotion/babel-plugin": "^11.11.0", + "@emotion/is-prop-valid": "^1.2.1", + "@emotion/serialize": "^1.1.2", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1" }, "peerDependencies": { "@emotion/react": "^11.0.0-rc.0", @@ -446,27 +394,27 @@ } }, "node_modules/@emotion/unitless": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.0.tgz", - "integrity": "sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==" + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" }, "node_modules/@emotion/use-insertion-effect-with-fallbacks": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.0.tgz", - "integrity": "sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", + "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", "peerDependencies": { "react": ">=16.8.0" } }, "node_modules/@emotion/utils": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.0.tgz", - "integrity": "sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" }, "node_modules/@emotion/weak-memoize": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz", - "integrity": "sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg==" + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", + "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", @@ -1018,6 +966,40 @@ "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.10.1.tgz", "integrity": "sha512-Dq5rYfEpdeel0bLVN+nfD1VWmzCkK+pJbSjIawGE+RY4+NIJqhbUDDQjvV0NUK84fMfwxvtFoCtEe70HfZjFcw==" }, + "node_modules/@floating-ui/core": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.0.tgz", + "integrity": "sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==", + "dependencies": { + "@floating-ui/utils": "^0.1.3" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz", + "integrity": "sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==", + "dependencies": { + "@floating-ui/core": "^1.4.2", + "@floating-ui/utils": "^0.1.3" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.2.tgz", + "integrity": "sha512-5qhlDvjaLmAst/rKb3VdlCinwTF4EYMiVxuuc/HVUjs46W0zgtbMmAZ1UTsDrRTxRmUEzl92mOtWbeeXL26lSQ==", + "dependencies": { + "@floating-ui/dom": "^1.5.1" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.4.tgz", + "integrity": "sha512-qprfWkn82Iw821mcKofJ5Pk9wgioHicxcQMxx+5zt5GSKoqdWvgG5AxVmpmUUjzTLPVSH5auBrhI93Deayn/DA==" + }, "node_modules/@google-cloud/firestore": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-6.5.0.tgz", @@ -1188,9 +1170,9 @@ } }, "node_modules/@grpc/proto-loader/node_modules/protobufjs": { - "version": "6.11.3", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.3.tgz", - "integrity": "sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg==", + "version": "6.11.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz", + "integrity": "sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==", "hasInstallScript": true, "dependencies": { "@protobufjs/aspromise": "^1.1.2", @@ -1296,18 +1278,17 @@ } }, "node_modules/@mui/base": { - "version": "5.0.0-alpha.125", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.125.tgz", - "integrity": "sha512-hAHJJ97SATu6SrkLH/HsAayK1zMZt89lrWyKuAInBKVyn363H78d1MnwyZwre9vDK5MrPoDL/NnZxtAXhwTnBA==", + "version": "5.0.0-beta.17", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.17.tgz", + "integrity": "sha512-xNbk7iOXrglNdIxFBN0k3ySsPIFLWCnFxqsAYl7CIcDkD9low4kJ7IUuy6ctwx/HAy2fenrT3KXHr1sGjAMgpQ==", "dependencies": { - "@babel/runtime": "^7.21.0", - "@emotion/is-prop-valid": "^1.2.0", + "@babel/runtime": "^7.22.15", + "@floating-ui/react-dom": "^2.0.2", "@mui/types": "^7.2.4", - "@mui/utils": "^5.12.0", - "@popperjs/core": "^2.11.7", - "clsx": "^1.2.1", - "prop-types": "^15.8.1", - "react-is": "^18.2.0" + "@mui/utils": "^5.14.11", + "@popperjs/core": "^2.11.8", + "clsx": "^2.0.0", + "prop-types": "^15.8.1" }, "engines": { "node": ">=12.0.0" @@ -1327,10 +1308,18 @@ } } }, + "node_modules/@mui/base/node_modules/clsx": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", + "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==", + "engines": { + "node": ">=6" + } + }, "node_modules/@mui/core-downloads-tracker": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.12.0.tgz", - "integrity": "sha512-1hoFIdlLI0sG+mkJgm70FjgIVpfLcE1vxPtNolg1tLFXrvbXGUYp9NHy3d6c41nDkg2OajuVS+Mn6A8UirFuMw==", + "version": "5.14.11", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.11.tgz", + "integrity": "sha512-uY8FLQURhXe3f3O4dS5OSGML9KDm9+IE226cBu78jarVIzdQGPlXwGIlSI9VJR8MvZDA6C0+6XfWDhWCHruC5Q==", "funding": { "type": "opencollective", "url": "https://opencollective.com/mui" @@ -1362,18 +1351,18 @@ } }, "node_modules/@mui/material": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.12.0.tgz", - "integrity": "sha512-IMellv153zJ6+xfhLWgXpAm/9hsX8qE6gP66xWcW/Pf2B8ubyVhmkTXsp8pAJxk81D6p/EyYcnAjo5DiDVkj9g==", - "dependencies": { - "@babel/runtime": "^7.21.0", - "@mui/base": "5.0.0-alpha.125", - "@mui/core-downloads-tracker": "^5.12.0", - "@mui/system": "^5.12.0", + "version": "5.14.11", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.14.11.tgz", + "integrity": "sha512-DnSdJzcR7lwG12JA5L2t8JF+RDzMygu5rCNW+logWb/KW2/TRzwLyVWO+CorHTBjBRd38DBxnwOCDiYkDd+N3A==", + "dependencies": { + "@babel/runtime": "^7.22.15", + "@mui/base": "5.0.0-beta.17", + "@mui/core-downloads-tracker": "^5.14.11", + "@mui/system": "^5.14.11", "@mui/types": "^7.2.4", - "@mui/utils": "^5.12.0", - "@types/react-transition-group": "^4.4.5", - "clsx": "^1.2.1", + "@mui/utils": "^5.14.11", + "@types/react-transition-group": "^4.4.6", + "clsx": "^2.0.0", "csstype": "^3.1.2", "prop-types": "^15.8.1", "react-is": "^18.2.0", @@ -1405,13 +1394,21 @@ } } }, + "node_modules/@mui/material/node_modules/clsx": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", + "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==", + "engines": { + "node": ">=6" + } + }, "node_modules/@mui/private-theming": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.12.0.tgz", - "integrity": "sha512-w5dwMen1CUm1puAtubqxY9BIzrBxbOThsg2iWMvRJmWyJAPdf3Z583fPXpqeA2lhTW79uH2jajk5Ka4FuGlTPg==", + "version": "5.14.11", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.11.tgz", + "integrity": "sha512-MSnNNzTu9pfKLCKs1ZAKwOTgE4bz+fQA0fNr8Jm7NDmuWmw0CaN9Vq2/MHsatE7+S0A25IAKby46Uv1u53rKVQ==", "dependencies": { - "@babel/runtime": "^7.21.0", - "@mui/utils": "^5.12.0", + "@babel/runtime": "^7.22.15", + "@mui/utils": "^5.14.11", "prop-types": "^15.8.1" }, "engines": { @@ -1432,12 +1429,12 @@ } }, "node_modules/@mui/styled-engine": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.12.0.tgz", - "integrity": "sha512-frh8L7CRnvD0RDmIqEv6jFeKQUIXqW90BaZ6OrxJ2j4kIsiVLu29Gss4SbBvvrWwwatR72sBmC3w1aG4fjp9mQ==", + "version": "5.14.11", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.14.11.tgz", + "integrity": "sha512-jdUlqRgTYQ8RMtPX4MbRZqar6W2OiIb6J5KEFbIu4FqvPrk44Each4ppg/LAqp1qNlBYq5i+7Q10MYLMpDxX9A==", "dependencies": { - "@babel/runtime": "^7.21.0", - "@emotion/cache": "^11.10.7", + "@babel/runtime": "^7.22.15", + "@emotion/cache": "^11.11.0", "csstype": "^3.1.2", "prop-types": "^15.8.1" }, @@ -1463,16 +1460,16 @@ } }, "node_modules/@mui/system": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.12.0.tgz", - "integrity": "sha512-Zi+WHuiJfK1ya+9+oeJQ1rLIBdY8CGDYT5oVlQg/6kIuyiCaE6SnN9PVzxBxfY77wHuOPwz4kxcPe9srdZc12Q==", + "version": "5.14.11", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.11.tgz", + "integrity": "sha512-yl8xV+y0k7j6dzBsHabKwoShmjqLa8kTxrhUI3JpqLG358VRVMJRW/ES0HhvfcCi4IVXde+Tc2P3K1akGL8zoA==", "dependencies": { - "@babel/runtime": "^7.21.0", - "@mui/private-theming": "^5.12.0", - "@mui/styled-engine": "^5.12.0", + "@babel/runtime": "^7.22.15", + "@mui/private-theming": "^5.14.11", + "@mui/styled-engine": "^5.14.11", "@mui/types": "^7.2.4", - "@mui/utils": "^5.12.0", - "clsx": "^1.2.1", + "@mui/utils": "^5.14.11", + "clsx": "^2.0.0", "csstype": "^3.1.2", "prop-types": "^15.8.1" }, @@ -1501,6 +1498,14 @@ } } }, + "node_modules/@mui/system/node_modules/clsx": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", + "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==", + "engines": { + "node": ">=6" + } + }, "node_modules/@mui/types": { "version": "7.2.4", "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.4.tgz", @@ -1515,13 +1520,12 @@ } }, "node_modules/@mui/utils": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.12.0.tgz", - "integrity": "sha512-RmQwgzF72p7Yr4+AAUO6j1v2uzt6wr7SWXn68KBsnfVpdOHyclCzH2lr/Xu6YOw9su4JRtdAIYfJFXsS6Cjkmw==", + "version": "5.14.11", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.11.tgz", + "integrity": "sha512-fmkIiCPKyDssYrJ5qk+dime1nlO3dmWfCtaPY/uVBqCRMBZ11JhddB9m8sjI2mgqQQwRJG5bq3biaosNdU/s4Q==", "dependencies": { - "@babel/runtime": "^7.21.0", + "@babel/runtime": "^7.22.15", "@types/prop-types": "^15.7.5", - "@types/react-is": "^16.7.1 || ^17.0.0", "prop-types": "^15.8.1", "react-is": "^18.2.0" }, @@ -1533,7 +1537,13 @@ "url": "https://opencollective.com/mui" }, "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, "node_modules/@mui/x-data-grid": { @@ -1562,22 +1572,15 @@ } }, "node_modules/@mui/x-date-pickers": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-6.1.0.tgz", - "integrity": "sha512-5EIP6ulvAqXsHCLusQAzf2jjzXeoL7WSad/ID8FIOh3x9tvUiBfM67c1YH/Wiv+RnBDAXGfdxHw9f9OphaIymA==", - "dependencies": { - "@babel/runtime": "^7.21.0", - "@date-io/core": "^2.16.0", - "@date-io/date-fns": "^2.16.0", - "@date-io/date-fns-jalali": "^2.16.0", - "@date-io/dayjs": "^2.16.0", - "@date-io/hijri": "^2.16.1", - "@date-io/jalaali": "^2.16.1", - "@date-io/luxon": "^2.16.1", - "@date-io/moment": "^2.16.1", - "@mui/utils": "^5.11.13", - "@types/react-transition-group": "^4.4.5", - "clsx": "^1.2.1", + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-6.16.0.tgz", + "integrity": "sha512-5xN/OuVtcy/bX/Yx4cJrGWLmHTMTZkufhQMtInFOM8u93TJJSPwA7X86vQdl6OztYNyYKnEpxNKxSrxcDHfKFQ==", + "dependencies": { + "@babel/runtime": "^7.22.15", + "@mui/base": "^5.0.0-beta.14", + "@mui/utils": "^5.14.8", + "@types/react-transition-group": "^4.4.6", + "clsx": "^2.0.0", "prop-types": "^15.8.1", "react-transition-group": "^4.4.5" }, @@ -1599,9 +1602,9 @@ "luxon": "^3.0.2", "moment": "^2.29.4", "moment-hijri": "^2.1.2", - "moment-jalaali": "^0.7.4 || ^0.8.0 || ^0.9.0", - "react": "^17.0.2 || ^18.0.0", - "react-dom": "^17.0.2 || ^18.0.0" + "moment-jalaali": "^0.7.4 || ^0.8.0 || ^0.9.0 || ^0.10.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" }, "peerDependenciesMeta": { "@emotion/react": { @@ -1633,6 +1636,14 @@ } } }, + "node_modules/@mui/x-date-pickers/node_modules/clsx": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", + "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==", + "engines": { + "node": ">=6" + } + }, "node_modules/@next/env": { "version": "13.3.0", "resolved": "https://registry.npmjs.org/@next/env/-/env-13.3.0.tgz", @@ -1838,9 +1849,9 @@ } }, "node_modules/@popperjs/core": { - "version": "2.11.7", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.7.tgz", - "integrity": "sha512-Cr4OjIkipTtcXKjAsm8agyleBuDHvxzeBoa1v543lbv1YaIwQjESsVcmjiWiPEbC1FIeHOG/Op9kdCmAmiS3Kw==", + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", "funding": { "type": "opencollective", "url": "https://opencollective.com/popperjs" @@ -2234,18 +2245,10 @@ "csstype": "^3.0.2" } }, - "node_modules/@types/react-is": { - "version": "17.0.3", - "resolved": "https://registry.npmjs.org/@types/react-is/-/react-is-17.0.3.tgz", - "integrity": "sha512-aBTIWg1emtu95bLTLx0cpkxwGW3ueZv71nE2YFBpL8k/z5czEW8yYpOo8Dp+UUAFAtKwNaOsh/ioSeQnWlZcfw==", - "dependencies": { - "@types/react": "*" - } - }, "node_modules/@types/react-transition-group": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.5.tgz", - "integrity": "sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA==", + "version": "4.4.7", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.7.tgz", + "integrity": "sha512-ICCyBl5mvyqYp8Qeq9B5G/fyBSRC0zx3XM3sCC6KkcMsNeAHqXBKkmat4GqdJET5jtYUpZXrxI5flve5qhi2Eg==", "dependencies": { "@types/react": "*" } @@ -6176,9 +6179,9 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" }, "node_modules/regexp.prototype.flags": { "version": "1.4.3", @@ -6614,9 +6617,9 @@ } }, "node_modules/stylis": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz", - "integrity": "sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==" + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" }, "node_modules/supports-color": { "version": "7.2.0", diff --git a/package.json b/package.json index 88cefeb..e863a90 100644 --- a/package.json +++ b/package.json @@ -14,14 +14,14 @@ "updateClusters": "npx tsc --outDir dist src/server/cluster-import && node dist/server/cluster-import.js" }, "dependencies": { - "@emotion/react": "^11.10.6", - "@emotion/styled": "^11.10.6", + "@emotion/react": "^11.11.1", + "@emotion/styled": "^11.11.0", "@mdi/js": "^7.2.96", "@mdi/react": "^1.6.1", "@mui/icons-material": "^5.11.16", - "@mui/material": "^5.12.0", + "@mui/material": "^5.14.11", "@mui/x-data-grid": "^6.1.0", - "@mui/x-date-pickers": "^6.1.0", + "@mui/x-date-pickers": "^6.16.0", "@turf/bbox-polygon": "^6.5.0", "@turf/boolean-within": "^6.5.0", "@turf/center": "^6.5.0", diff --git a/src/components/FirecallItems/FirecallItemDialog.tsx b/src/components/FirecallItems/FirecallItemDialog.tsx index 775f9b4..0eb0eaa 100644 --- a/src/components/FirecallItems/FirecallItemDialog.tsx +++ b/src/components/FirecallItems/FirecallItemDialog.tsx @@ -52,6 +52,10 @@ export default function FirecallItemDialog({ const handleChange = (event: SelectChangeEvent) => { setItemField('type', event.target.value); + setFirecallItem((prev) => ({ + ...firecallItemInfo(event.target.value).factory(), + ...prev, + })); }; return ( diff --git a/src/components/FirecallItems/infos/area.tsx b/src/components/FirecallItems/infos/area.tsx index dfb4d30..eedfce3 100644 --- a/src/components/FirecallItems/infos/area.tsx +++ b/src/components/FirecallItems/infos/area.tsx @@ -19,6 +19,7 @@ export const areaInfo: FirecallItemInfo = { name: 'Bezeichnung', beschreibung: 'Beschreibung', color: 'Farbe (HTML bzw. Englisch)', + opacity: 'Deckkraft (in Prozent)', }, dateFields: [], factory: () => ({ @@ -29,6 +30,8 @@ export const areaInfo: FirecallItemInfo = { destLng: mapPosition.lng + 0.0001, positions: JSON.stringify([]), color: 'blue', + opacity: 50, + datum: new Date().toISOString(), }), popupFn: (item: Connection) => ( <> diff --git a/src/components/FirecallItems/infos/circle.tsx b/src/components/FirecallItems/infos/circle.tsx index 59c78b8..5329f05 100644 --- a/src/components/FirecallItems/infos/circle.tsx +++ b/src/components/FirecallItems/infos/circle.tsx @@ -28,6 +28,7 @@ export const circleInfo: FirecallItemInfo = { beschreibung: '', color: 'green', radius: 50, + datum: new Date().toISOString(), }), popupFn: (item: Circle) => ( <> diff --git a/src/components/FirecallItems/infos/connection.tsx b/src/components/FirecallItems/infos/connection.tsx index 8b34d34..cb6c94a 100644 --- a/src/components/FirecallItems/infos/connection.tsx +++ b/src/components/FirecallItems/infos/connection.tsx @@ -64,6 +64,7 @@ export const connectionInfo: FirecallItemInfo = { destLng: mapPosition.lng + 0.0001, positions: JSON.stringify([]), color: 'blue', + datum: new Date().toISOString(), }), popupFn: (item: Connection) => ( <> diff --git a/src/components/FirecallItems/infos/diary.tsx b/src/components/FirecallItems/infos/diary.tsx index cfc7c41..47a2f82 100644 --- a/src/components/FirecallItems/infos/diary.tsx +++ b/src/components/FirecallItems/infos/diary.tsx @@ -2,12 +2,15 @@ import moment from 'moment'; import { Diary, FirecallItem } from '../../firebase/firestore'; import { markerIcon } from '../icons'; import { FirecallItemInfo } from './types'; +import { formatTimestamp } from '../../../common/time-format'; export const diaryItemInfo: FirecallItemInfo = { name: 'Einsatztagebuch', title: (item) => `${item.name || ''}`, info: (item) => - `${item.datum} ${item.von || item.an ? `${item.von} => ${item.an}` : ''}`, + `${formatTimestamp(item.datum)} ${ + item.von || item.an ? `${item.von} => ${item.an}` : '' + }`, body: (item) => `${item.beschreibung || ''}`, fields: { name: 'Bezeichnung', diff --git a/src/components/FirecallItems/infos/line.tsx b/src/components/FirecallItems/infos/line.tsx index aab34ba..5f3a071 100644 --- a/src/components/FirecallItems/infos/line.tsx +++ b/src/components/FirecallItems/infos/line.tsx @@ -31,6 +31,7 @@ export const lineInfo: FirecallItemInfo = { positions: JSON.stringify([]), color: 'green', opacity: 100, + datum: new Date().toISOString(), }), popupFn: (item: Line) => ( <> diff --git a/src/components/FirecallItems/infos/marker.tsx b/src/components/FirecallItems/infos/marker.tsx index e7984b7..fe535e6 100644 --- a/src/components/FirecallItems/infos/marker.tsx +++ b/src/components/FirecallItems/infos/marker.tsx @@ -19,7 +19,7 @@ export const markerInfo: FirecallItemInfo = { type: 'marker', name: '', beschreibung: '', - datum: '', + datum: new Date().toISOString(), }), // fieldTypes: { beschreibung: 'multiline' }, dialogText: (item) => `Markierung`, diff --git a/src/components/FirecallItems/infos/vehicle.tsx b/src/components/FirecallItems/infos/vehicle.tsx index 1bc04ed..7a10fa1 100644 --- a/src/components/FirecallItems/infos/vehicle.tsx +++ b/src/components/FirecallItems/infos/vehicle.tsx @@ -9,10 +9,16 @@ export const vehicleItemInfo: FirecallItemInfo = { title: (item) => `${item.name} ${item.fw}`, info: (vehicle) => `1:${vehicle.besatzung || 0} ATS: ${vehicle.ats || 0}`, body: (vehicle) => `${ - vehicle.alarmierung ? 'Alarmierung: ' + vehicle.alarmierung : '' + vehicle.alarmierung + ? 'Alarmierung: ' + formatTimestamp(vehicle.alarmierung) + : '' } - ${vehicle.eintreffen ? ' Eintreffen: ' + vehicle.eintreffen : ''} - ${vehicle.abruecken ? ' Abrücken: ' + vehicle.abruecken : ''} + ${ + vehicle.eintreffen + ? ' Eintreffen: ' + formatTimestamp(vehicle.eintreffen) + : '' + } + ${vehicle.abruecken ? ' Abrücken: ' + formatTimestamp(vehicle.abruecken) : ''} Position ${vehicle.lat} ${vehicle.lng}`, fields: { name: 'Bezeichnung', @@ -33,10 +39,13 @@ export const vehicleItemInfo: FirecallItemInfo = { beschreibung: '', fw: '', type: 'vehicle', - alarmierung: moment().toISOString(), - eintreffen: moment().toISOString(), + // alarmierung: moment().toISOString(), + // eintreffen: moment().toISOString(), + alarmierung: '', + eintreffen: '', ats: 0, rotation: '0', + datum: new Date().toISOString(), } as Fzg), dialogText: (item) => `Einsatzfahrzeug`, icon: (gisObj: FirecallItem) => diff --git a/src/components/Map/MapActionButtons.tsx b/src/components/Map/MapActionButtons.tsx index 4dc2193..809a76b 100644 --- a/src/components/Map/MapActionButtons.tsx +++ b/src/components/Map/MapActionButtons.tsx @@ -26,6 +26,7 @@ export default function MapActionButtons({ map }: MapActionButtonsOptions) { (item?: FirecallItem) => { if (item) { addDoc(collection(firestore, 'call', firecallId, 'item'), { + datum: new Date().toISOString(), ...firecallItemInfo(item.type).factory(), ...item, lat: map.getCenter().lat, diff --git a/src/components/Map/markers/AreaMarker.tsx b/src/components/Map/markers/AreaMarker.tsx index 5b098ee..adcd3fa 100644 --- a/src/components/Map/markers/AreaMarker.tsx +++ b/src/components/Map/markers/AreaMarker.tsx @@ -138,7 +138,8 @@ export default function AreaMarker({ record, selectItem }: AreaMarkerProps) { positions={positions} pathOptions={{ color: record.color || '#0000ff', - opacity: ((record as any)?.opacity || 100.0) / 100, + opacity: ((record as any)?.opacity || 50.0) / 100, + fillOpacity: ((record as any)?.opacity || 50.0) / 100, }} > diff --git a/src/components/Map/markers/FirecallMarker.tsx b/src/components/Map/markers/FirecallMarker.tsx index 3bc3c14..1fd707f 100644 --- a/src/components/Map/markers/FirecallMarker.tsx +++ b/src/components/Map/markers/FirecallMarker.tsx @@ -1,6 +1,7 @@ import { doc, setDoc } from 'firebase/firestore'; import L, { LeafletEventHandlerFnMap } from 'leaflet'; -import { Marker, Popup } from 'react-leaflet'; +import { useEffect } from 'react'; +import { Marker, Popup, useMap } from 'react-leaflet'; import { defaultPosition } from '../../../hooks/constants'; import { firestore } from '../../firebase/firebase'; import { Firecall } from '../../firebase/firestore'; @@ -36,6 +37,15 @@ function onDragEnd(firecall: Firecall, event: L.DragEndEvent) { } export default function FirecallMarker({ firecall }: FirecallMarkerProps) { + const map = useMap(); + + useEffect(() => { + map.setView([ + firecall.lat || defaultPosition.lat, + firecall.lng || defaultPosition.lng, + ]); + }, [firecall.lat, firecall.lng, map]); + return ( (moment()); return ( - - { - setValue(newValue); - }} - ampm={false} - /> - + + + + { + setValue(newValue); + }} + ampm={false} + /> + + + + + setValue(moment())}> + + + + + ); } diff --git a/src/components/pages/EinsatzTagebuchPrint.tsx b/src/components/pages/EinsatzTagebuchPrint.tsx new file mode 100644 index 0000000..66b43da --- /dev/null +++ b/src/components/pages/EinsatzTagebuchPrint.tsx @@ -0,0 +1,202 @@ +import Box from '@mui/material/Box'; +import Grid from '@mui/material/Grid'; +import Typography from '@mui/material/Typography'; +import { GridColDef } from '@mui/x-data-grid'; +import moment from 'moment'; +import { useEffect, useState } from 'react'; +import { dateTimeFormat, parseTimestamp } from '../../common/time-format'; +import useFirebaseCollection from '../../hooks/useFirebaseCollection'; +import { useFirecallId } from '../../hooks/useFirecall'; +import FirecallItemCard from '../FirecallItems/FirecallItemCard'; +import { + Diary, + FirecallItem, + Fzg, + filterActiveItems, +} from '../firebase/firestore'; + +export function useDiaries() { + const firecallId = useFirecallId(); + + const [diaries, setDiaries] = useState([]); + + const firecallItems = useFirebaseCollection({ + collectionName: 'call', + pathSegments: [firecallId, 'item'], + // queryConstraints: [where('type', '==', 'vehicle')], + queryConstraints: [], + filterFn: filterActiveItems, + }); + + useEffect(() => { + const cars: Fzg[] = firecallItems.filter( + (item: FirecallItem) => item.type === 'vehicle' + ) as Fzg[]; + const firecallEntries: Diary[] = [ + cars + .filter((item) => item.alarmierung) + .map( + (item) => + ({ + id: 'alarmierung' + item.id, + datum: item.alarmierung, + type: 'diary', + name: `${item.name} ${item.fw || ''} alarmiert`, + beschreibung: `${item.besatzung ? '1:' + item.besatzung : ''} ${ + item.ats ? 'ATS ' + item.ats : '' + }`, + editable: false, + original: item, + } as Diary) + ), + cars + .filter((item) => item.eintreffen) + .map( + (item) => + ({ + id: 'eintreffen' + item.id, + datum: item.eintreffen, + type: 'diary', + name: `${item.name} ${item.fw || ''} eingetroffen`, + beschreibung: `${item.besatzung ? '1:' + item.besatzung : ''} ${ + item.ats ? 'ATS ' + item.ats : '' + }`, + editable: false, + original: item, + } as Diary) + ), + cars + .filter((item) => item.abruecken) + .map( + (item) => + ({ + id: 'abruecken' + item.id, + datum: item.abruecken, + type: 'diary', + name: `${item.name} ${item.fw || ''} abgerückt`, + beschreibung: `${item.besatzung ? '1:' + item.besatzung : ''} ${ + item.ats ? 'ATS ' + item.ats : '' + }`, + editable: false, + original: item, + } as Diary) + ), + firecallItems + .filter( + (item: FirecallItem) => + ['vehicle', 'diary'].indexOf(item.type) < 0 && item.datum + ) + .map( + (item: FirecallItem) => + ({ + ...item, + type: 'diary', + editable: true, + original: item, + } as Diary) + ), + firecallItems + .filter((item: FirecallItem) => item.type === 'diary') + .map( + (item: FirecallItem) => + ({ ...item, original: item, editable: true } as Diary) + ), + ].flat(); + const diaries = firecallEntries + .map((a) => { + const m = parseTimestamp(a.datum); + if (m) { + a.datum = m.format(); + } else { + a.datum = new Date().toISOString(); + } + return a; + }) + .sort((a, b) => a.datum.localeCompare(b.datum)) + .map((a) => ({ + ...a, + datum: moment(a.datum).format(dateTimeFormat), + })); + setDiaries(diaries); + }, [firecallItems]); + return diaries; +} + +function useGridColumns() { + const [columns, setColumns] = useState(); + useEffect(() => { + setColumns([ + { field: 'name', headerName: 'Name', minWidth: 150, flex: 0.3 }, + { field: 'datum', headerName: 'Datum', flex: 0.3 }, + { field: 'beschreibung', headerName: 'Beschreibung', flex: 0.4 }, + ]); + }, []); + return columns; +} + +export interface EinsatzTagebuchOptions { + boxHeight?: string; +} +export default function EinsatzTagebuchPrint({ + boxHeight = '600px', +}: EinsatzTagebuchOptions) { + const firecallId = useFirecallId(); + const diaries = useDiaries(); + const columns = useGridColumns(); + + return ( + <> + {false && ( + + + Einsatz Tagebuch + + + {diaries.map((item) => ( + + ))} + + + )} + + {columns && ( + + + Einsatz Tagebuch + + {/* row.id} + initialState={{ + pagination: { + paginationModel: { + pageSize: 500, + }, + }, + }} + pageSizeOptions={[100, 500, 1000, 10000]} + /> */} + + + + + + + {diaries.map((item) => ( + + + + + + ))} +
NameDatumBeschreibung
{item.name}{item.datum}{item.beschreibung}
+
+ )} + + ); +} diff --git a/src/components/pages/Fahrzeuge.tsx b/src/components/pages/Fahrzeuge.tsx index 35e1e2a..6290f89 100644 --- a/src/components/pages/Fahrzeuge.tsx +++ b/src/components/pages/Fahrzeuge.tsx @@ -1,46 +1,15 @@ import Box from '@mui/material/Box'; import Grid from '@mui/material/Grid'; import Typography from '@mui/material/Typography'; -import { useEffect, useState } from 'react'; -import useFirebaseCollection from '../../hooks/useFirebaseCollection'; import useFirebaseLogin from '../../hooks/useFirebaseLogin'; import { useFirecallId } from '../../hooks/useFirecall'; -import { - filterActiveItems, - FirecallItem, - Fzg, - Rohr, -} from '../firebase/firestore'; +import useVehicles from '../../hooks/useVehicles'; import FirecallItemCard from '../FirecallItems/FirecallItemCard'; export default function Fahrzeuge() { const { isAuthorized } = useFirebaseLogin(); const firecallId = useFirecallId(); - // console.info(`firecall id ${firecallId}`); - const [vehicles, setVehicles] = useState([]); - const [rohre, setRohre] = useState([]); - const [otherItems, setOtherItems] = useState([]); - - const firecallItems = useFirebaseCollection({ - collectionName: 'call', - pathSegments: [firecallId, 'item'], - // queryConstraints: [where('type', '==', 'vehicle')], - filterFn: filterActiveItems, - }); - - useEffect(() => { - if (firecallItems) { - setVehicles( - firecallItems.filter((item) => item?.type === 'vehicle') as Fzg[] - ); - setRohre(firecallItems.filter((item) => item?.type === 'rohr') as Rohr[]); - setOtherItems( - firecallItems.filter( - (item) => item?.type !== 'rohr' && item.type !== 'vehicle' - ) - ); - } - }, [firecallItems]); + const { vehicles, rohre, otherItems } = useVehicles(); if (!isAuthorized) { return <>; diff --git a/src/components/pages/FahrzeugePrint.tsx b/src/components/pages/FahrzeugePrint.tsx new file mode 100644 index 0000000..02ee2c8 --- /dev/null +++ b/src/components/pages/FahrzeugePrint.tsx @@ -0,0 +1,93 @@ +import Box from '@mui/material/Box'; +import Grid from '@mui/material/Grid'; +import Typography from '@mui/material/Typography'; +import useFirebaseLogin from '../../hooks/useFirebaseLogin'; +import { useFirecallId } from '../../hooks/useFirecall'; +import useVehicles from '../../hooks/useVehicles'; +import FirecallItemCard from '../FirecallItems/FirecallItemCard'; +import { formatTimestamp } from '../../common/time-format'; +import { firecallItemInfo } from '../FirecallItems/infos/firecallitems'; + +export default function FahrzeugePrint() { + const { isAuthorized } = useFirebaseLogin(); + const firecallId = useFirecallId(); + const { vehicles, rohre, otherItems: others } = useVehicles(); + const otherItems = [...rohre, ...others]; + + if (!isAuthorized) { + return <>; + } + + return ( + + + {vehicles.length} Fahrzeuge im Einsatz + + + + + + + + + + + + + {vehicles + .sort( + ({ fw: a = '', name: aa = '' }, { fw: b = '', name: bb = '' }) => + a.localeCompare(b) - aa.localeCompare(bb) / 10 + ) + .map((fzg) => ( + + + + + + + + + + + ))} +
FeuerwehrFahrzeugBesatzung (ATS)BeschreibungAlarmierungEintreffenabrueckenGPS Position
{fzg.fw}{fzg.name} + 1:{fzg.besatzung || 0} ({fzg.ats}) + {fzg.beschreibung}{fzg.alarmierung && formatTimestamp(fzg.alarmierung)}{fzg.eintreffen && formatTimestamp(fzg.eintreffen)}{fzg.abruecken && formatTimestamp(fzg.abruecken)} + {fzg.lat} {fzg.lng} +
+ + + {otherItems.length} weitere Einsatzmarker + + + + + + + + + + {otherItems.map((item) => ( + + + + + + + + ))} +
TypNameBeschreibungDatumKoordinaten
{item.type}{item.name} + {firecallItemInfo(item.type).popupFn(item)} + {item.beschreibung && ( + <> +
+ {item.beschreibung} + + )} +
{item.datum && formatTimestamp(item.datum)} + {item.lat} {item.lng} +
+
+ ); +} diff --git a/src/hooks/useFirecallItemUpdate.ts b/src/hooks/useFirecallItemUpdate.ts index 598c845..cac9642 100644 --- a/src/hooks/useFirecallItemUpdate.ts +++ b/src/hooks/useFirecallItemUpdate.ts @@ -13,7 +13,12 @@ export default function useFirecallItemUpdate(firecallId: string = 'unknown') { ); await setDoc( doc(firestore, 'call', firecallId, 'item', '' + item.id), - { ...item, updatedAt: new Date(), updatedBy: email }, + { + datum: new Date().toISOString(), + ...item, + updatedAt: new Date(), + updatedBy: email, + }, { merge: true } ); }, diff --git a/src/hooks/useVehicles.ts b/src/hooks/useVehicles.ts new file mode 100644 index 0000000..43293d2 --- /dev/null +++ b/src/hooks/useVehicles.ts @@ -0,0 +1,47 @@ +import { useEffect, useState } from 'react'; +import { + FirecallItem, + Fzg, + Rohr, + filterActiveItems, +} from '../components/firebase/firestore'; +import useFirebaseCollection from './useFirebaseCollection'; +import { useFirecallId } from './useFirecall'; + +export default function useVehicles() { + const firecallId = useFirecallId(); + // console.info(`firecall id ${firecallId}`); + const [vehicles, setVehicles] = useState([]); + const [rohre, setRohre] = useState([]); + const [otherItems, setOtherItems] = useState([]); + + const firecallItems = useFirebaseCollection({ + collectionName: 'call', + pathSegments: [firecallId, 'item'], + // queryConstraints: [where('type', '==', 'vehicle')], + filterFn: filterActiveItems, + }); + + useEffect(() => { + if (firecallItems) { + setVehicles( + firecallItems.filter((item) => item?.type === 'vehicle') as Fzg[] + ); + setRohre(firecallItems.filter((item) => item?.type === 'rohr') as Rohr[]); + setOtherItems( + firecallItems.filter( + (item) => + item?.type !== 'rohr' && + item.type !== 'vehicle' && + item.type !== 'diary' + ) + ); + } + }, [firecallItems]); + + return { + vehicles, + rohre, + otherItems, + }; +} diff --git a/src/pages/print.tsx b/src/pages/print.tsx index e30386b..4f222b1 100644 --- a/src/pages/print.tsx +++ b/src/pages/print.tsx @@ -1,3 +1,4 @@ +import Grid from '@mui/material/Grid'; import dynamic from 'next/dynamic'; const DynamicMap = dynamic( @@ -9,14 +10,14 @@ const DynamicMap = dynamic( const DynamicFahrzeuge = dynamic( () => { - return import('../components/pages/Fahrzeuge'); + return import('../components/pages/FahrzeugePrint'); }, { ssr: false } ); const EinsatzTagebuch = dynamic( () => { - return import('../components/pages/EinsatzTagebuch'); + return import('../components/pages/EinsatzTagebuchPrint'); }, { ssr: false } ); @@ -24,7 +25,17 @@ const EinsatzTagebuch = dynamic( export default function PrintPage() { return ( <> - + + +   + + + + + +   + +