diff --git a/src/Geopilot.Frontend/package-lock.json b/src/Geopilot.Frontend/package-lock.json index a83c5378..167b1509 100644 --- a/src/Geopilot.Frontend/package-lock.json +++ b/src/Geopilot.Frontend/package-lock.json @@ -13,25 +13,20 @@ "@mui/icons-material": "^5.16.0", "@mui/material": "^5.16.0", "@mui/x-data-grid": "^7.9.0", - "bootstrap": "^5.3.3", "date-fns": "^2.30.0", - "dayjs": "^1.11.11", "i18next": "^23.11.5", "i18next-browser-languagedetector": "^8.0.0", "i18next-http-backend": "^2.5.2", "oidc-client-ts": "^3.0.1", "react": "^18.3.1", - "react-bootstrap": "^2.10.4", "react-dom": "^18.3.1", "react-dropzone": "^14.2.3", "react-hook-form": "^7.52.2", "react-i18next": "^14.1.2", - "react-icons": "^5.2.1", "react-markdown": "^9.0.1", "react-oidc-context": "^3.1.0", "react-router-dom": "^6.24.1", - "rehype-external-links": "^3.0.0", - "styled-components": "^6.1.11" + "rehype-external-links": "^3.0.0" }, "devDependencies": { "@types/react": "^18.3.3", @@ -1219,7 +1214,7 @@ } } }, - "node_modules/@mui/private-theming": { + "node_modules/@mui/material/node_modules/@mui/private-theming": { "version": "5.16.6", "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.16.6.tgz", "integrity": "sha512-rAk+Rh8Clg7Cd7shZhyt2HGTTE5wYKNSJ5sspf28Fqm/PZ69Er9o6KX25g03/FG2dfpg5GCwZh/xOojiTfm3hw==", @@ -1245,7 +1240,7 @@ } } }, - "node_modules/@mui/styled-engine": { + "node_modules/@mui/material/node_modules/@mui/styled-engine": { "version": "5.16.6", "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.16.6.tgz", "integrity": "sha512-zaThmS67ZmtHSWToTiHslbI8jwrmITcN93LQaR2lKArbvS7Z3iLkwRoiikNWutx9MBs8Q6okKvbZq1RQYB3v7g==", @@ -1276,7 +1271,7 @@ } } }, - "node_modules/@mui/system": { + "node_modules/@mui/material/node_modules/@mui/system": { "version": "5.16.7", "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.16.7.tgz", "integrity": "sha512-Jncvs/r/d/itkxh7O7opOunTqbbSSzMTHzZkNLM+FjAOg+cYAZHrPDlYe1ZGKUYORwwb2XexlWnpZp0kZ4AHuA==", @@ -1315,6 +1310,165 @@ } } }, + "node_modules/@mui/private-theming": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-6.0.1.tgz", + "integrity": "sha512-jQCJml1OwIrhqN5tTk5Lpqx2RZKQnShE8lMlvAkuO7Ft+xaHkP8J3iHpEk3/Pzue34DfBQtK00jcaplgM47mBA==", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.25.0", + "@mui/utils": "^6.0.1", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/private-theming/node_modules/@mui/utils": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-6.0.1.tgz", + "integrity": "sha512-YmQYb2tY5nJactHltTrKA15TZfbd1R003a2xYHxUuycTv9n83rsIwHkypOxM4x7+c+Pc8xfCuE9EfLT3B3n40Q==", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.25.0", + "@mui/types": "^7.2.16", + "@types/prop-types": "^15.7.12", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^18.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/styled-engine": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-6.0.1.tgz", + "integrity": "sha512-7ZOnUhIak2vosDgMlBE/oLrsvvF3O8QKmTFpP6bhZkHjPu4dv0DbF1vC7gzgkOqiMaT0/NgRQCFW9zh38pIvsg==", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.25.0", + "@emotion/cache": "^11.13.1", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/@mui/system": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-6.0.1.tgz", + "integrity": "sha512-RdWyCMi+GkAekOnpMKhy51lyzid4F6Vj96vekp3AExkFY21JWg2+KVBqcAgJOROJ3RiaeDJf98n0yrixlCvuEw==", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.25.0", + "@mui/private-theming": "^6.0.1", + "@mui/styled-engine": "^6.0.1", + "@mui/types": "^7.2.16", + "@mui/utils": "^6.0.1", + "clsx": "^2.1.1", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/system/node_modules/@mui/utils": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-6.0.1.tgz", + "integrity": "sha512-YmQYb2tY5nJactHltTrKA15TZfbd1R003a2xYHxUuycTv9n83rsIwHkypOxM4x7+c+Pc8xfCuE9EfLT3B3n40Q==", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.25.0", + "@mui/types": "^7.2.16", + "@types/prop-types": "^15.7.12", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^18.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/@mui/types": { "version": "7.2.16", "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.16.tgz", @@ -1358,14 +1512,13 @@ } }, "node_modules/@mui/x-data-grid": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@mui/x-data-grid/-/x-data-grid-7.14.0.tgz", - "integrity": "sha512-ddVtvFXmENHADHzO0TGV2dzUQflexsXMbxEKMq3rBmgJ9QyeiZWBEwzgDps1CzqU5vi9QyDACCcPyoAuL6t3tQ==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@mui/x-data-grid/-/x-data-grid-7.15.0.tgz", + "integrity": "sha512-S7FLp+SUz/fo+JAQcM4npnL70tGnL4qcYYMkjK4tPkPLrTnBWlm47D5OoGNzpPO1CnOAryFR5h0rdwbeHZmAWg==", "dependencies": { - "@babel/runtime": "^7.25.0", - "@mui/system": "^5.16.7", + "@babel/runtime": "^7.25.4", "@mui/utils": "^5.16.6", - "@mui/x-internals": "7.14.0", + "@mui/x-internals": "7.15.0", "clsx": "^2.1.1", "prop-types": "^15.8.1", "reselect": "^4.1.8" @@ -1380,7 +1533,8 @@ "peerDependencies": { "@emotion/react": "^11.9.0", "@emotion/styled": "^11.8.1", - "@mui/material": "^5.15.14", + "@mui/material": "^5.15.14 || ^6.0.0", + "@mui/system": "^5.15.14 || ^6.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0" }, @@ -1394,11 +1548,11 @@ } }, "node_modules/@mui/x-internals": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@mui/x-internals/-/x-internals-7.14.0.tgz", - "integrity": "sha512-+qWIHLgt2vgH6bKmf7IwRvS86UbZRWKAdDY/yTQJaqzCzyesUvQhD+WRxe1kpdCK8UE061S9/Ju7hLkM4kjRNA==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@mui/x-internals/-/x-internals-7.15.0.tgz", + "integrity": "sha512-Q/IZvZhHpe64Ost1mRbdp6ML8KQQBprwwgzqo6pZbrCaWMPB2gk2jcUwdCwnLsc+gutaEPVhZ8N7it8VZcHtbg==", "dependencies": { - "@babel/runtime": "^7.25.0", + "@babel/runtime": "^7.25.4", "@mui/utils": "^5.16.6" }, "engines": { @@ -1468,20 +1622,6 @@ "url": "https://opencollective.com/popperjs" } }, - "node_modules/@react-aria/ssr": { - "version": "3.9.5", - "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.5.tgz", - "integrity": "sha512-xEwGKoysu+oXulibNUSkXf8itW0npHHTa6c4AyYeZIJyRoegeteYuFpZUBPtIDE8RfHdNsSmE1ssOkxRnwbkuQ==", - "dependencies": { - "@swc/helpers": "^0.5.0" - }, - "engines": { - "node": ">= 12" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0" - } - }, "node_modules/@remix-run/router": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.19.1.tgz", @@ -1490,45 +1630,6 @@ "node": ">=14.0.0" } }, - "node_modules/@restart/hooks": { - "version": "0.4.16", - "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.4.16.tgz", - "integrity": "sha512-f7aCv7c+nU/3mF7NWLtVVr0Ra80RqsO89hO72r+Y/nvQr5+q0UFGkocElTH6MJApvReVh6JHUFYn2cw1WdHF3w==", - "dependencies": { - "dequal": "^2.0.3" - }, - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "node_modules/@restart/ui": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@restart/ui/-/ui-1.8.0.tgz", - "integrity": "sha512-xJEOXUOTmT4FngTmhdjKFRrVVF0hwCLNPdatLCHkyS4dkiSK12cEu1Y0fjxktjJrdst9jJIc5J6ihMJCoWEN/g==", - "dependencies": { - "@babel/runtime": "^7.21.0", - "@popperjs/core": "^2.11.6", - "@react-aria/ssr": "^3.5.0", - "@restart/hooks": "^0.4.9", - "@types/warning": "^3.0.0", - "dequal": "^2.0.3", - "dom-helpers": "^5.2.0", - "uncontrollable": "^8.0.1", - "warning": "^4.0.3" - }, - "peerDependencies": { - "react": ">=16.14.0", - "react-dom": ">=16.14.0" - } - }, - "node_modules/@restart/ui/node_modules/uncontrollable": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-8.0.4.tgz", - "integrity": "sha512-ulRWYWHvscPFc0QQXvyJjY6LIXU56f0h8pQFvhxiKk5V1fcI8gp9Ht9leVAhrVjzqMw0BgjspBINx9r6oyJUvQ==", - "peerDependencies": { - "react": ">=16.14.0" - } - }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.21.1", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.1.tgz", @@ -1737,14 +1838,6 @@ "win32" ] }, - "node_modules/@swc/helpers": { - "version": "0.5.12", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.12.tgz", - "integrity": "sha512-KMZNXiGibsW9kvZAO1Pam2JPTDBm+KSHMMHWdsyI/1DbIZjT2A6Gy3hblVXUMEDvUAKq+e0vL0X0o54owWji7g==", - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", @@ -1913,21 +2006,11 @@ "integrity": "sha512-0vWLNK2D5MT9dg0iOo8GlKguPAU02QjmZitPEsXRuJXU/OGIOt9vT9Fc26wtYuavLxtO45v9PGleoL9Z0k1LHg==", "dev": true }, - "node_modules/@types/stylis": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.5.tgz", - "integrity": "sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==" - }, "node_modules/@types/unist": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==" }, - "node_modules/@types/warning": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.3.tgz", - "integrity": "sha512-D1XC7WK8K+zZEveUPY+cf4+kgauk8N4eHr/XIHXGlGYkHLud6hK9lYfZk1ry1TNh798cZUCgb6MqGEG8DkJt6Q==" - }, "node_modules/@types/yauzl": { "version": "2.10.3", "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", @@ -2608,24 +2691,6 @@ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", "dev": true }, - "node_modules/bootstrap": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.3.tgz", - "integrity": "sha512-8HLCdWgyoMguSO9o+aH+iuZ+aht+mzW0u3HIMzVu7Srrpv7EBBxTnrFlSCskwdY1+EOFQSm7uMJhNQHkdPcmjg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/twbs" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/bootstrap" - } - ], - "peerDependencies": { - "@popperjs/core": "^2.11.8" - } - }, "node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", @@ -2748,14 +2813,6 @@ "node": ">=6" } }, - "node_modules/camelize": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", - "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/caniuse-lite": { "version": "1.0.30001653", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001653.tgz", @@ -2896,11 +2953,6 @@ "node": ">=8" } }, - "node_modules/classnames": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", - "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" - }, "node_modules/clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", @@ -3073,24 +3125,6 @@ "node": ">= 8" } }, - "node_modules/css-color-keywords": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", - "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", - "engines": { - "node": ">=4" - } - }, - "node_modules/css-to-react-native": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", - "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", - "dependencies": { - "camelize": "^1.0.0", - "css-color-keywords": "^1.0.0", - "postcss-value-parser": "^4.0.2" - } - }, "node_modules/csstype": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", @@ -3344,7 +3378,8 @@ "node_modules/dayjs": { "version": "1.11.13", "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", - "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==" + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", + "dev": true }, "node_modules/debug": { "version": "4.3.6", @@ -5091,14 +5126,6 @@ "node": ">= 0.4" } }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, "node_modules/is-absolute-url": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-4.0.1.tgz", @@ -6755,6 +6782,7 @@ "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, "funding": [ { "type": "github", @@ -7228,9 +7256,10 @@ } }, "node_modules/postcss": { - "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "version": "8.4.41", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", + "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", + "dev": true, "funding": [ { "type": "opencollective", @@ -7247,18 +7276,13 @@ ], "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.0", + "picocolors": "^1.0.1", "source-map-js": "^1.2.0" }, "engines": { "node": "^10 || ^12 || >=14" } }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -7338,23 +7362,6 @@ "react-is": "^16.13.1" } }, - "node_modules/prop-types-extra": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.1.tgz", - "integrity": "sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew==", - "dependencies": { - "react-is": "^16.3.2", - "warning": "^4.0.0" - }, - "peerDependencies": { - "react": ">=0.14.0" - } - }, - "node_modules/prop-types-extra/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, "node_modules/prop-types/node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", @@ -7452,35 +7459,6 @@ "node": ">=0.10.0" } }, - "node_modules/react-bootstrap": { - "version": "2.10.4", - "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-2.10.4.tgz", - "integrity": "sha512-W3398nBM2CBfmGP2evneEO3ZZwEMPtHs72q++eNw60uDGDAdiGn0f9yNys91eo7/y8CTF5Ke1C0QO8JFVPU40Q==", - "dependencies": { - "@babel/runtime": "^7.24.7", - "@restart/hooks": "^0.4.9", - "@restart/ui": "^1.6.9", - "@types/react-transition-group": "^4.4.6", - "classnames": "^2.3.2", - "dom-helpers": "^5.2.1", - "invariant": "^2.2.4", - "prop-types": "^15.8.1", - "prop-types-extra": "^1.1.0", - "react-transition-group": "^4.4.5", - "uncontrollable": "^7.2.1", - "warning": "^4.0.3" - }, - "peerDependencies": { - "@types/react": ">=16.14.8", - "react": ">=16.14.0", - "react-dom": ">=16.14.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, "node_modules/react-dom": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", @@ -7545,24 +7523,11 @@ } } }, - "node_modules/react-icons": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.3.0.tgz", - "integrity": "sha512-DnUk8aFbTyQPSkCfF8dbX6kQjXA9DktMeJqfjrg6cK9vwQVMxmcA3BfP4QoiztVmEHtwlTgLFsPuH2NskKT6eg==", - "peerDependencies": { - "react": "*" - } - }, "node_modules/react-is": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" }, - "node_modules/react-lifecycles-compat": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" - }, "node_modules/react-markdown": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-9.0.1.tgz", @@ -8080,11 +8045,6 @@ "node": ">= 0.4" } }, - "node_modules/shallowequal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -8207,6 +8167,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -8458,61 +8419,6 @@ "inline-style-parser": "0.2.3" } }, - "node_modules/styled-components": { - "version": "6.1.12", - "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.1.12.tgz", - "integrity": "sha512-n/O4PzRPhbYI0k1vKKayfti3C/IGcPf+DqcrOB7O/ab9x4u/zjqraneT5N45+sIe87cxrCApXM8Bna7NYxwoTA==", - "dependencies": { - "@emotion/is-prop-valid": "1.2.2", - "@emotion/unitless": "0.8.1", - "@types/stylis": "4.2.5", - "css-to-react-native": "3.2.0", - "csstype": "3.1.3", - "postcss": "8.4.38", - "shallowequal": "1.1.0", - "stylis": "4.3.2", - "tslib": "2.6.2" - }, - "engines": { - "node": ">= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/styled-components" - }, - "peerDependencies": { - "react": ">= 16.8.0", - "react-dom": ">= 16.8.0" - } - }, - "node_modules/styled-components/node_modules/@emotion/is-prop-valid": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz", - "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==", - "dependencies": { - "@emotion/memoize": "^0.8.1" - } - }, - "node_modules/styled-components/node_modules/@emotion/memoize": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", - "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" - }, - "node_modules/styled-components/node_modules/@emotion/unitless": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", - "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" - }, - "node_modules/styled-components/node_modules/stylis": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.2.tgz", - "integrity": "sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==" - }, - "node_modules/styled-components/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, "node_modules/stylis": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", @@ -8842,20 +8748,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/uncontrollable": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.2.1.tgz", - "integrity": "sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ==", - "dependencies": { - "@babel/runtime": "^7.6.3", - "@types/react": ">=16.9.11", - "invariant": "^2.2.4", - "react-lifecycles-compat": "^3.0.4" - }, - "peerDependencies": { - "react": ">=15.0.0" - } - }, "node_modules/undici-types": { "version": "6.19.8", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", @@ -9154,34 +9046,6 @@ } } }, - "node_modules/vite/node_modules/postcss": { - "version": "8.4.41", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", - "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.1", - "source-map-js": "^1.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, "node_modules/void-elements": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", @@ -9190,14 +9054,6 @@ "node": ">=0.10.0" } }, - "node_modules/warning": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", - "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", diff --git a/src/Geopilot.Frontend/package.json b/src/Geopilot.Frontend/package.json index 74744252..6e3346c0 100644 --- a/src/Geopilot.Frontend/package.json +++ b/src/Geopilot.Frontend/package.json @@ -19,25 +19,20 @@ "@mui/icons-material": "^5.16.0", "@mui/material": "^5.16.0", "@mui/x-data-grid": "^7.9.0", - "bootstrap": "^5.3.3", "date-fns": "^2.30.0", - "dayjs": "^1.11.11", "i18next": "^23.11.5", "i18next-browser-languagedetector": "^8.0.0", "i18next-http-backend": "^2.5.2", "oidc-client-ts": "^3.0.1", "react": "^18.3.1", - "react-bootstrap": "^2.10.4", "react-dom": "^18.3.1", "react-dropzone": "^14.2.3", "react-hook-form": "^7.52.2", "react-i18next": "^14.1.2", - "react-icons": "^5.2.1", "react-markdown": "^9.0.1", "react-oidc-context": "^3.1.0", "react-router-dom": "^6.24.1", - "rehype-external-links": "^3.0.0", - "styled-components": "^6.1.11" + "rehype-external-links": "^3.0.0" }, "devDependencies": { "@types/react": "^18.3.3", diff --git a/src/Geopilot.Frontend/public/locale/de/common.json b/src/Geopilot.Frontend/public/locale/de/common.json index 2ce462a3..44819807 100644 --- a/src/Geopilot.Frontend/public/locale/de/common.json +++ b/src/Geopilot.Frontend/public/locale/de/common.json @@ -8,14 +8,11 @@ "bugTracking": "Bugtracking", "cancel": "Abbrechen", "clickToUpload": "Zum Hochladen klicken", - "close": "Schliessen", "codeLicenseInfo": "Der Code steht unter der MIT Lizenz im Github Repository zur Verfügung. Falls Ihnen Bugs begegnen, können Sie dort einen Issue eröffnen.", "comment": "Kommentar", "completedWithErrors": "Mit Fehlern abgeschlossen", "contentNotFound": "Ups, nichts gefunden!", "createDelivery": "Lieferung erstellen", - "createDeliveryFailed": "Bei der Lieferung ist ein unbekannter Fehler aufgetreten, bitte versuchen Sie es mit einer neuen Validierung.", - "createDeliverySuccess": "Lieferung erfolgreich", "delete": "Löschen", "deleteDeliveryConfirmationMessage": "Diese Aktion kann nicht rückgängig gemacht werden.", "deleteDeliveryConfirmationTitle": "Möchten Sie die Daten der Lieferung wirklich löschen?", @@ -35,23 +32,18 @@ "development": "Entwicklung", "disconnect": "Verbindungen trennen", "done": "Fertig", - "downloadLogTooltip": "-Datei herunterladen", "dragAndDrop": "Drag & Drop", "edit": "Bearbeiten", "email": "E-Mail", - "errors": "Fehler", "failed": "Fehlgeschlagen", - "file": "Datei", "fileDropzoneErrorChooseFile": "Bitte wählen Sie eine gültige Datei aus", "fileDropzoneErrorFileTooLarge": "Die ausgewählte Datei ist über 200MB gross", "fileDropzoneErrorNotSupported": "Der Dateityp wird nicht unterstützt", "fileDropzoneErrorTooManyFiles": "Es kann nur eine Datei aufs Mal geprüft werden", "fileTypes": "Formate", "fileTypesLoadingError": "Beim Laden der Formate ist ein Fehler aufgetreten: {{error}}", - "help": "Hilfe", "id": "ID", "imprint": "Impressum", - "info": "Info", "invalidContentType": "Ungültiger Antworttyp", "isAdmin": "Ist Admin", "isPartialDelivery": "Ist Teillieferung", @@ -61,7 +53,6 @@ "logIn": "Anmelden", "logInForDelivery": "Anmelden um Lieferung zu erstellen", "logOut": "Abmelden", - "loggedInAs": "Angemeldet als {{name}}", "longitude": "Länge", "mandate": "Mandat", "mandateDisconnectMessage": "Das Mandat wird von allen Organisationen getrennt. Diese Aktion kann nicht rückgängig gemacht werden.", @@ -70,7 +61,6 @@ "mandates": "Mandate", "mandatesLoadingError": "Beim Laden der Mandate ist ein Fehler aufgetreten: {{error}}", "name": "Name", - "noErrors": "Keine Fehler", "or": "oder", "organisationDisconnectMessage": "Die Organisation wird von allen Mandaten und Benutzer:innen getrennt. Diese Aktion kann nicht rückgängig gemacht werden.", "organisationDisconnectTitle": "Möchten Sie die Organisation wirklich inaktiv setzen?", @@ -79,19 +69,14 @@ "organisationsLoadingError": "Beim Laden der Organisationen ist ein Fehler aufgetreten: {{error}}", "predecessor": "Vorgänger", "privacyPolicy": "Datenschutz", - "reset": "Aktuelle Änderungen zurücksetzen", - "resetDelivery": "Lieferung zurücksetzen", + "resetCurrentChanges": "Aktuelle Änderungen zurücksetzen", "save": "Speichern", "spatialExtent": "Räumliche Ausdehnung", "spatialExtentIncompleteMessage": "Es müssen entweder alle Felder leer oder alle abgefüllt sein. Möchten Sie die aktuellen Änderungen zurücksetzen?", "spatialExtentIncompleteTitle": "Ungültige räumliche Ausdehnung", "stacBrowser": "STAC Browser", - "termsOfUse": "Nutzungsbestimmungen", "termsOfUseAcceptance": "Ich akzeptiere die Nutzungsbestimmungen.", - "type": "Typ", "upload": "Hochladen", - "uploadFile": "{{fileName}} hochladen...", - "uploadNotSuccessful": "Der Upload war nicht erfolgreich. Die Validierung wurde abgebrochen.", "userDisconnectMessage": "Der Benutzer wird von allen Organisationen getrennt. Diese Aktion kann nicht rückgängig gemacht werden.", "userDisconnectTitle": "Möchten Sie den Benutzer wirklich inaktiv setzen?", "userLoadingError": "Beim Laden der Benutzer:in ist ein Fehler aufgetreten: {{error}}", diff --git a/src/Geopilot.Frontend/public/locale/en/common.json b/src/Geopilot.Frontend/public/locale/en/common.json index cc4dda1e..3cbe4719 100644 --- a/src/Geopilot.Frontend/public/locale/en/common.json +++ b/src/Geopilot.Frontend/public/locale/en/common.json @@ -8,14 +8,11 @@ "bugTracking": "bug tracking", "cancel": "Cancel", "clickToUpload": "Click to upload", - "close": "Close", - "codeLicenseInfo": "The code is available under the MIT license in the Github repository. If you encounter bugs, you can open a issue there.", + "codeLicenseInfo": "The code is available under the MIT license in the Github repository. If you encounter bugs, you can open an issue there.", "comment": "Comment", "completedWithErrors": "Completed with errors", "contentNotFound": "Oops, nothing found!", "createDelivery": "Create delivery", - "createDeliveryFailed": "An unknown error occurred during delivery, please try a new validation.", - "createDeliverySuccess": "Delivery successful", "delete": "Delete", "deleteDeliveryConfirmationMessage": "This action cannot be undone.", "deleteDeliveryConfirmationTitle": "Do you really want to delete the delivery data?", @@ -30,28 +27,23 @@ "deliveryOverviewDeleteError": "An error occurred while deleting the delivery: {{error}}", "deliveryOverviewDeleteIdError": "An error occurred while deleting the delivery with the ID {{id}}", "deliveryOverviewDeleteIdNotExistError": "The delivery with the ID {{id}} does not exist and therefore cannot be deleted.", - "deliveryOverviewLoadError": "An error occurred while loading the deliveries: {{error}}", + "deliveryOverviewLoadingError": "An error occurred while loading the deliveries: {{error}}", "deliveryTitle": "Online validation & delivery of geodata", "development": "Development", "disconnect": "Disconnect", "done": "Done", - "downloadLogTooltip": "Download log file", "dragAndDrop": "drag and drop", "edit": "Edit", "email": "Email", - "errors": "Errors", "failed": "Failed", - "file": "File", "fileDropzoneErrorChooseFile": "Please choose a valid file", "fileDropzoneErrorFileTooLarge": "The selected file is larger than 200MB", "fileDropzoneErrorNotSupported": "The file type is not supported", "fileDropzoneErrorTooManyFiles": "Only one file can be checked at a time", "fileTypes": "Formats", "fileTypesLoadingError": "An error occurred while loading the formats: {{error}}", - "help": "Help", "id": "ID", "imprint": "Imprint", - "info": "Info", "invalidContentType": "Invalid response type", "isAdmin": "Is Admin", "isPartialDelivery": "Is partial delivery", @@ -61,7 +53,6 @@ "logIn": "Log In", "logInForDelivery": "Log in to create delivery", "logOut": "Log Out", - "loggedInAs": "Logged in as {{name}}", "longitude": "Longitude", "mandate": "Mandate", "mandateDisconnectMessage": "This will remove all connections to organisations and cannot be undone.", @@ -70,7 +61,6 @@ "mandates": "Mandates", "mandatesLoadingError": "An error occurred while loading the mandates: {{error}}", "name": "Name", - "noErrors": "No Errors", "or": "or", "organisationDisconnectMessage": "This will remove all connections to mandates and users, and cannot be undone.", "organisationDisconnectTitle": "Do you really want to disconnect the organisation?", @@ -79,19 +69,14 @@ "organisationsLoadingError": "An error occurred while loading the organisations: {{error}}", "predecessor": "Predecessor", "privacyPolicy": "Privacy policy", - "reset": "Reset current changes", - "resetDelivery": "Reset delivery", + "resetCurrentChanges": "Reset current changes", "save": "Save", "spatialExtent": "Spatial extent", "spatialExtentIncompleteMessage": "All fields must either be empty or filled in. Would you like to reset the current changes?", "spatialExtentIncompleteTitle": "Invalid spatial extent", "stacBrowser": "STAC Browser", - "termsOfUse": "Terms of use", "termsOfUseAcceptance": "I accept the terms of use.", - "type": "Type", "upload": "Upload", - "uploadFile": "Upload {{fileName}}...", - "uploadNotSuccessful": "The upload was not successful. Validation has been aborted.", "userDisconnectMessage": "This will remove all connections to organisations and cannot be undone.", "userDisconnectTitle": "Do you really want to disconnect the user?", "userLoadingError": "An error occurred while loading the user: {{error}}", diff --git a/src/Geopilot.Frontend/public/locale/fr/common.json b/src/Geopilot.Frontend/public/locale/fr/common.json index 8b1a3da4..761bde82 100644 --- a/src/Geopilot.Frontend/public/locale/fr/common.json +++ b/src/Geopilot.Frontend/public/locale/fr/common.json @@ -8,14 +8,11 @@ "bugTracking": "Suivi des bugs", "cancel": "Annuler", "clickToUpload": "Cliquer pour télécharger", - "close": "Fermer", "codeLicenseInfo": "Le code est disponible sous la licence MIT dans le référentiel GitHub. Si vous rencontrez des bugs, vous pouvez ouvrir un problème là-bas.", "comment": "Commentaire", "completedWithErrors": "Terminé avec des erreurs", "contentNotFound": "Oups, rien n'a été trouvé!", "createDelivery": "Créer une livraison", - "createDeliveryFailed": "Une erreur inconnue s'est produite lors de la livraison. Veuillez réessayer avec une nouvelle validation.", - "createDeliverySuccess": "Livraison réussie", "delete": "Supprimer", "deleteDeliveryConfirmationMessage": "Cette action est irréversible.", "deleteDeliveryConfirmationTitle": "Voulez-vous vraiment supprimer les données de la livraison?", @@ -35,23 +32,18 @@ "development": "Développement", "disconnect": "Déconnecter", "done": "Terminé", - "downloadLogTooltip": "Télécharger le fichier -", "dragAndDrop": "glisser et poser", "edit": "Éditer", "email": "E-mail", - "errors": "Erreurs", "failed": "Échoué", - "file": "Fichier", "fileDropzoneErrorChooseFile": "Veuillez sélectionner un fichier valide", "fileDropzoneErrorFileTooLarge": "Le fichier sélectionné est supérieur à 200 Mo", "fileDropzoneErrorNotSupported": "Le type de fichier n'est pas pris en charge", "fileDropzoneErrorTooManyFiles": "Seul un fichier peut être vérifié à la fois", "fileTypes": "Formats", "fileTypesLoadingError": "Une erreur s'est produite lors du chargement des formats: {{error}}", - "help": "Aide", "id": "ID", "imprint": "Mentions légales", - "info": "Info", "invalidContentType": "Type de réponse non valide", "isAdmin": "Est administrateur", "isPartialDelivery": "La livraison partielle est-elle", @@ -61,7 +53,6 @@ "logIn": "Se connecter", "logInForDelivery": "Connectez-vous pour créer une livraison", "logOut": "Se déconnecter", - "loggedInAs": "Connecté en tant que {{name}}", "longitude": "Longitude", "mandate": "Mandat", "mandateDisconnectMessage": "Cette opération supprime toutes les connexions avec les organisations. Cette action ne peut pas être annulée.", @@ -70,7 +61,6 @@ "mandates": "Mandats", "mandatesLoadingError": "Une erreur s'est produite lors du chargement des mandats: {{error}}", "name": "Nom", - "noErrors": "Pas d'erreurs", "or": "ou", "organisationDisconnectMessage": "Cette action supprime toutes les connexions avec les mandats et les utilisateurs. Cette action ne peut pas être annulée.", "organisationDisconnectTitle": "Voulez-vous vraiment déconnecter l'organisation?", @@ -79,19 +69,14 @@ "organisationsLoadingError": "Une erreur s'est produite lors du chargement des organisations: {{error}}", "predecessor": "Prédécesseur", "privacyPolicy": "Politique de confidentialité", - "reset": "Réinitialiser les modifications en cours", - "resetDelivery": "Réinitialiser la livraison", + "resetCurrentChanges": "Réinitialiser les modifications en cours", "save": "Sauver", "spatialExtent": "Étendue spatiale", "spatialExtentIncompleteMessage": "Tous les champs doivent être soit vides, soit tous remplis. Vous souhaitez réinitialiser les modifications en cours?", "spatialExtentIncompleteTitle": "Étendue spatiale non valide", "stacBrowser": "Navigateur STAC", - "termsOfUse": "Conditions d'utilisation", "termsOfUseAcceptance": "J'accepte les conditions d'utilisation.", - "type": "Type", "upload": "Télécharger", - "uploadFile": "Télécharger {{fileName}}...", - "uploadNotSuccessful": "Le téléchargement n'a pas réussi. La validation a été annulée.", "userDisconnectMessage": "Cet utilisateur sera déconnecté de toutes les organisations. Cette action ne peut pas être annulée.", "userDisconnectTitle": "Voulez-vous vraiment déconnecter l'utilisateur?", "userLoadingError": "Une erreur s'est produite lors du chargement d'utilisateur: {{error}}", diff --git a/src/Geopilot.Frontend/public/locale/it/common.json b/src/Geopilot.Frontend/public/locale/it/common.json index ca5a3e3f..5f31ec1e 100644 --- a/src/Geopilot.Frontend/public/locale/it/common.json +++ b/src/Geopilot.Frontend/public/locale/it/common.json @@ -8,14 +8,11 @@ "bugTracking": "Tracciamento bug", "cancel": "Annulla", "clickToUpload": "Clicca per caricare", - "close": "Chiudi", "codeLicenseInfo": "Il codice è disponibile sotto la licenza MIT nel repository di GitHub. Se trovi dei bug, puoi aprire un Issue lì.", "comment": "Commento", "completedWithErrors": "Completato con errori", "contentNotFound": "Ops, non è stato trovato nulla!", "createDelivery": "Crea consegna", - "createDeliveryFailed": "Si è verificato un errore sconosciuto durante la consegna, prova a fare una nuova validazione.", - "createDeliverySuccess": "Consegna creata con successo", "delete": "Elimina", "deleteDeliveryConfirmationMessage": "Questa azione non può essere annullata.", "deleteDeliveryConfirmationTitle": "Vuoi davvero eliminare i dati della consegna?", @@ -35,23 +32,18 @@ "development": "Sviluppo", "disconnect": "Disconnessione", "done": "Fatto", - "downloadLogTooltip": "Scarica file -", "dragAndDrop": "drag and drop", "edit": "Modifica", "email": "E-mail", - "errors": "Errori", "failed": "Fallito", - "file": "File", "fileDropzoneErrorChooseFile": "Seleziona un file valido", "fileDropzoneErrorFileTooLarge": "Il file selezionato è troppo grande (oltre 200MB)", "fileDropzoneErrorNotSupported": "Tipo di file non supportato", "fileDropzoneErrorTooManyFiles": "Puoi verificare solo un file alla volta", "fileTypes": "Formati", "fileTypesLoadingError": "Si è verificato un errore durante il caricamento dei formati: {{error}}", - "help": "Aiuto", "id": "ID", "imprint": "Impressum", - "info": "Informazioni", "invalidContentType": "Tipo di risposta non valido", "isAdmin": "È amministratore", "isPartialDelivery": "È una consegna parziale", @@ -61,7 +53,6 @@ "logIn": "Accedi", "logInForDelivery": "Accedi per creare una consegna", "logOut": "Esci", - "loggedInAs": "Accesso effettuato come {{name}}", "longitude": "Longitudine", "mandate": "Mandato", "mandateDisconnectMessage": "Questa operazione rimuove tutti i collegamenti alle organizzazioni e non può essere annullata.", @@ -70,7 +61,6 @@ "mandates": "Mandati", "mandatesLoadingError": "Si è verificato un errore durante il caricamento dei mandati: {{error}}", "name": "Nome", - "noErrors": "Nessun errore", "or": "o", "organisationDisconnectMessage": "Questa operazione rimuove tutti i collegamenti ai mandati e agli utenti, e non può essere annullata.", "organisationDisconnectTitle": "Volete davvero scollegare l'organizzazione?", @@ -79,19 +69,14 @@ "organisationsLoadingError": "Si è verificato un errore durante il caricamento delle organizzazioni: {{error}}", "predecessor": "Predecessore", "privacyPolicy": "Informativa sulla privacy", - "reset": "Ripristino delle modifiche correnti", - "resetDelivery": "Ripristino la consegna", + "resetCurrentChanges": "Ripristino delle modifiche correnti", "save": "Salvare", "spatialExtent": "Misura spaziale", "spatialExtentIncompleteMessage": "Tutti i campi devono essere vuoti o compilati. Volete ripristinare le modifiche correnti?", "spatialExtentIncompleteTitle": "Misura spaziale non valida", "stacBrowser": "Browser STAC", - "termsOfUse": "Termini di utilizzo", "termsOfUseAcceptance": "Accetto i Termini di utilizzo.", - "type": "Tipo", "upload": "Caricare", - "uploadFile": "Carica {{fileName}}...", - "uploadNotSuccessful": "Caricamento non riuscito. La validazione è stata interrotta.", "userDisconnectMessage": "Questa operazione rimuove tutti i collegamenti alle organizzazioni e non può essere annullata.", "userDisconnectTitle": "Volete davvero scollegare l'utente?", "userLoadingError": "Si è verificato un errore durante il caricamento del' utento: {{error}}", diff --git a/src/Geopilot.Frontend/src/appContext.tsx b/src/Geopilot.Frontend/src/appContext.tsx index 07ceca68..b8f62a63 100644 --- a/src/Geopilot.Frontend/src/appContext.tsx +++ b/src/Geopilot.Frontend/src/appContext.tsx @@ -65,9 +65,9 @@ export const AppContext = () => { diff --git a/src/Geopilot.Frontend/src/components/dataGrid/dataGridSpatialExtentColumn.tsx b/src/Geopilot.Frontend/src/components/dataGrid/dataGridSpatialExtentColumn.tsx index a8440569..14e985ca 100644 --- a/src/Geopilot.Frontend/src/components/dataGrid/dataGridSpatialExtentColumn.tsx +++ b/src/Geopilot.Frontend/src/components/dataGrid/dataGridSpatialExtentColumn.tsx @@ -78,7 +78,7 @@ const DataGridSpatialExtentColumn = ({ params }: DataGridSpatialExtentColumnProp showPrompt(t("spatialExtentIncompleteTitle"), t("spatialExtentIncompleteMessage"), [ { label: t("cancel") }, { - label: t("reset"), + label: t("resetCurrentChanges"), action: () => { setDefaultSpatialExtent(); setPopoverAnchor(null); diff --git a/src/Geopilot.Frontend/src/components/dataGrid/dataGridSpatialExtentPopoverContent.tsx b/src/Geopilot.Frontend/src/components/dataGrid/dataGridSpatialExtentPopoverContent.tsx index 28a3b739..4d9f86b5 100644 --- a/src/Geopilot.Frontend/src/components/dataGrid/dataGridSpatialExtentPopoverContent.tsx +++ b/src/Geopilot.Frontend/src/components/dataGrid/dataGridSpatialExtentPopoverContent.tsx @@ -61,7 +61,7 @@ export const DataGridSpatialExtentPopoverContent: FC diff --git a/src/Geopilot.Frontend/src/components/fileDropzone.tsx b/src/Geopilot.Frontend/src/components/fileDropzone.tsx index 9eb2957d..082853e5 100644 --- a/src/Geopilot.Frontend/src/components/fileDropzone.tsx +++ b/src/Geopilot.Frontend/src/components/fileDropzone.tsx @@ -39,7 +39,7 @@ export const FileDropzone: FC = ({ ? "" : (fileExtensions?.length ?? 0) > 1 ? `${fileExtensions!.slice(0, -1).join(", ")} ${t("or")} ${fileExtensions!.slice(-1)}` - : fileExtensions?.join(", ") ?? ""; + : (fileExtensions?.join(", ") ?? ""); }, [acceptsAllFileTypes, fileExtensions, t]); const onDrop = useCallback( @@ -98,7 +98,7 @@ export const FileDropzone: FC = ({ flexDirection: "column", alignItems: "center", justifyContent: "center", - minHeight: "100px", + minHeight: "56px", padding: "20px", border: `2px dashed`, borderColor: disabled diff --git a/src/Geopilot.Frontend/src/components/markdownContent.tsx b/src/Geopilot.Frontend/src/components/markdownContent.tsx index 5d532880..0eb6797f 100644 --- a/src/Geopilot.Frontend/src/components/markdownContent.tsx +++ b/src/Geopilot.Frontend/src/components/markdownContent.tsx @@ -4,7 +4,7 @@ import ReactMarkdown from "react-markdown"; import rehypeExternalLinks from "rehype-external-links"; import { FC } from "react"; -import { Typography } from "@mui/material"; +import { Link, Typography } from "@mui/material"; interface MarkdownContentProps { content: string; @@ -23,6 +23,7 @@ export const MarkdownContent: FC = ({ content, routeHash } h5: props => , h6: props => , p: props => , + a: props => , }}> {content} diff --git a/src/Geopilot.Frontend/src/index.css b/src/Geopilot.Frontend/src/index.css index e69de29b..293d3b1f 100644 --- a/src/Geopilot.Frontend/src/index.css +++ b/src/Geopilot.Frontend/src/index.css @@ -0,0 +1,3 @@ +body { + margin: 0; +} diff --git a/src/Geopilot.Frontend/src/main.tsx b/src/Geopilot.Frontend/src/main.tsx index 7dc3a0fd..a882db15 100644 --- a/src/Geopilot.Frontend/src/main.tsx +++ b/src/Geopilot.Frontend/src/main.tsx @@ -2,7 +2,6 @@ import React from "react"; import ReactDOM from "react-dom/client"; import "./index.css"; import "./assets/fonts/fonts.css"; -import "bootstrap/dist/css/bootstrap.min.css"; import { AppContext } from "./appContext.tsx"; ReactDOM.createRoot(document.getElementById("root")!).render( diff --git a/src/Geopilot.Frontend/src/old/About.jsx b/src/Geopilot.Frontend/src/old/About.jsx deleted file mode 100644 index fc7bf88d..00000000 --- a/src/Geopilot.Frontend/src/old/About.jsx +++ /dev/null @@ -1,50 +0,0 @@ -import { useTranslation, Trans } from "react-i18next"; - -export const About = ({ clientSettings, licenseInfo, appVersion }) => { - const { t } = useTranslation(); - - return ( -
-

{t("about")}

-

{t("versionInformation")}

-

- {clientSettings?.application?.name}: {appVersion} -

-

- {t("development")} & {t("bugTracking")} -

-

- - ), - repositoryLink: , - issuesLink: , - }} - /> -

-

{t("licenseInformation")}

- {Object.keys(licenseInfo).map(key => ( -
-

- {licenseInfo[key].name} - {licenseInfo[key].version && ` (${t("version")} ${licenseInfo[key].version})`}{" "} -

-

- {licenseInfo[key].repository} -

-

{licenseInfo[key].description}

-

{licenseInfo[key].copyright}

-

- {t("licenses")}: {licenseInfo[key].licenses} -

-

{licenseInfo[key].licenseText}

-
- ))} -
- ); -}; - -export default About; diff --git a/src/Geopilot.Frontend/src/old/AdminTemplate.tsx b/src/Geopilot.Frontend/src/old/AdminTemplate.tsx deleted file mode 100644 index d9e8ee1b..00000000 --- a/src/Geopilot.Frontend/src/old/AdminTemplate.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import { useGeopilotAuth } from "../auth"; -import { FC, ReactNode } from "react"; - -interface AdminTemplateProps { - children: ReactNode; -} - -export const AdminTemplate: FC = ({ children }) => { - const { enabled, user } = useGeopilotAuth(); - - return enabled && user?.isAdmin ? children : null; -}; diff --git a/src/Geopilot.Frontend/src/old/BannerContent.jsx b/src/Geopilot.Frontend/src/old/BannerContent.jsx deleted file mode 100644 index 7ddbc4d4..00000000 --- a/src/Geopilot.Frontend/src/old/BannerContent.jsx +++ /dev/null @@ -1,15 +0,0 @@ -import { Alert } from "react-bootstrap"; -import ReactMarkdown from "react-markdown"; -import { IoClose } from "react-icons/io5"; -import rehypeExternalLinks from "rehype-external-links"; - -export const BannerContent = ({ content, onHide }) => ( - - rehypeExternalLinks({ target: "_blank" })]}>{content || ""} - - - - -); - -export default BannerContent; diff --git a/src/Geopilot.Frontend/src/old/Footer.jsx b/src/Geopilot.Frontend/src/old/Footer.jsx deleted file mode 100644 index 6e1e1b5f..00000000 --- a/src/Geopilot.Frontend/src/old/Footer.jsx +++ /dev/null @@ -1,83 +0,0 @@ -import "../app.css"; -import About from "./About.jsx"; -import swissMadeSwissHosted from "./sms-sh.png"; -import { Button } from "react-bootstrap"; -import { useTranslation } from "react-i18next"; - -export const Footer = ({ - openModalContent, - infoHilfeContent, - nutzungsbestimmungenContent, - datenschutzContent, - impressumContent, - clientSettings, - licenseInfoCustom, - licenseInfo, - appVersion, -}) => { - const { t } = useTranslation(); - return ( -
-
- {infoHilfeContent && ( - - )} - {nutzungsbestimmungenContent && ( - - )} - {datenschutzContent && ( - - )} - {impressumContent && ( - - )} - -
-
- - Swiss Hosting Logo - -
-
- ); -}; - -export default Footer; diff --git a/src/Geopilot.Frontend/src/old/Header.tsx b/src/Geopilot.Frontend/src/old/Header.tsx deleted file mode 100644 index 65f02540..00000000 --- a/src/Geopilot.Frontend/src/old/Header.tsx +++ /dev/null @@ -1,170 +0,0 @@ -import { useGeopilotAuth } from "../auth"; -import { useTranslation } from "react-i18next"; -import { - AppBar, - Box, - Button, - Divider, - Drawer, - IconButton, - List, - ListItem, - ListItemButton, - ListItemIcon, - ListItemText, - Toolbar, - Typography, -} from "@mui/material"; -import MenuIcon from "@mui/icons-material/Menu"; -import AccountCircleOutlinedIcon from "@mui/icons-material/AccountCircleOutlined"; -import { LoggedInTemplate } from "./LoggedInTemplate.js"; -import { LoggedOutTemplate } from "./LoggedOutTemplate.js"; -import { AdminTemplate } from "./AdminTemplate.js"; -import { useLocation, useNavigate } from "react-router-dom"; -import { ClientSettings } from "../appInterfaces"; -import { FC, useState } from "react"; -import OpenInNewIcon from "@mui/icons-material/OpenInNew"; - -interface HeaderProps { - clientSettings: ClientSettings; - hasDrawerToggle?: boolean; - handleDrawerToggle?: () => void; -} - -export const Header: FC = ({ clientSettings, hasDrawerToggle, handleDrawerToggle }) => { - const { user, login, logout } = useGeopilotAuth(); - const { t } = useTranslation(); - const navigate = useNavigate(); - const location = useLocation(); - const [userMenuOpen, setUserMenuOpen] = useState(false); - - const toggleUserMenu = (newOpen: boolean) => () => { - setUserMenuOpen(newOpen); - }; - - const isActive = (path: string) => { - if (path === "") { - return location.pathname === "/"; - } - return location.pathname.split("/").includes(path); - }; - - return ( - <> - - - - {hasDrawerToggle ? ( - <> - - - - - {`Logo { - const img = e.target as HTMLImageElement; - img.style.display = "none"; - }} - /> - - - ) : ( - {`Logo { - const img = e.target as HTMLImageElement; - img.style.display = "none"; - }} - /> - )} - - {location.pathname.includes("admin") ? t("administration").toUpperCase() : t("delivery").toUpperCase()} - - - - - - - - - - - - - - - -
- - - - - - - - - - { - navigate("/"); - }}> - - - - - - { - navigate("/admin"); - }}> - - - - - { - window.open("/browser", "_blank"); - }}> - - - - - - - - - - -
-
- - ); -}; - -export default Header; diff --git a/src/Geopilot.Frontend/src/old/LoggedInTemplate.tsx b/src/Geopilot.Frontend/src/old/LoggedInTemplate.tsx deleted file mode 100644 index b52268ce..00000000 --- a/src/Geopilot.Frontend/src/old/LoggedInTemplate.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import { useGeopilotAuth } from "../auth"; -import { FC, ReactNode } from "react"; - -interface LoggedInTemplateProps { - children: ReactNode; -} - -export const LoggedInTemplate: FC = ({ children }) => { - const { enabled, user } = useGeopilotAuth(); - - return enabled && user ? children : null; -}; diff --git a/src/Geopilot.Frontend/src/old/LoggedOutTemplate.tsx b/src/Geopilot.Frontend/src/old/LoggedOutTemplate.tsx deleted file mode 100644 index 16773774..00000000 --- a/src/Geopilot.Frontend/src/old/LoggedOutTemplate.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import { useGeopilotAuth } from "../auth"; -import { FC, ReactNode } from "react"; - -interface LoggedOutTemplateProps { - children: ReactNode; -} - -export const LoggedOutTemplate: FC = ({ children }) => { - const { enabled, user } = useGeopilotAuth(); - - return !enabled || user ? null : children; -}; diff --git a/src/Geopilot.Frontend/src/old/ModalContent.jsx b/src/Geopilot.Frontend/src/old/ModalContent.jsx deleted file mode 100644 index a2886610..00000000 --- a/src/Geopilot.Frontend/src/old/ModalContent.jsx +++ /dev/null @@ -1,29 +0,0 @@ -import ReactMarkdown from "react-markdown"; -import { Modal, Button } from "react-bootstrap"; -import rehypeExternalLinks from "rehype-external-links"; -import { useTranslation } from "react-i18next"; - -export const ModalContent = props => { - const { content, type, onHide } = props; - const { t } = useTranslation(); - - return ( - - - {type === "markdown" && ( - rehypeExternalLinks({ target: "_blank" })]}> - {content || ""} - - )} - {type === "raw" && content} - - - - - - ); -}; - -export default ModalContent; diff --git a/src/Geopilot.Frontend/src/old/home/Delivery.jsx b/src/Geopilot.Frontend/src/old/home/Delivery.jsx deleted file mode 100644 index f1242546..00000000 --- a/src/Geopilot.Frontend/src/old/home/Delivery.jsx +++ /dev/null @@ -1,172 +0,0 @@ -import { Alert, Button, Container, Card, Col, Collapse, Form, Row, Spinner } from "react-bootstrap"; -import { useState, useEffect } from "react"; -import { useTranslation } from "react-i18next"; - -const DeliveryState = Object.freeze({ - Unavailable: "unavailable", - Available: "available", - Running: "running", - Completed: "completed", - Failed: "failed", -}); - -export const Delivery = ({ statusData, validationRunning }) => { - const { t } = useTranslation(); - const [deliveryState, setDeliveryState] = useState(DeliveryState.Unavailable); - const [mandates, setMandates] = useState(undefined); - const [previousDeliveries, setPreviousDeliveries] = useState(undefined); - - const [selectedMandateId, setSelectedMandateId] = useState(undefined); - const [partialDelivery, setPartialDelivery] = useState(false); - const [selectedDeliveryId, setSelectedDeliveryId] = useState(undefined); - const [comment, setComment] = useState(""); - - useEffect(() => { - setDeliveryState(DeliveryState.Unavailable); - setMandates(undefined); - setPreviousDeliveries(undefined); - setSelectedMandateId(undefined); - setPartialDelivery(false); - setSelectedDeliveryId(undefined); - setComment(""); - }, [statusData?.jobId]); - - useEffect(() => { - if (statusData?.status === DeliveryState.Completed && !validationRunning) { - fetch("/api/v1/mandate?" + new URLSearchParams({ jobId: statusData?.jobId })) - .then(res => res.ok && res.json()) - .then(json => { - setMandates(json); - setSelectedMandateId(json[0]?.id); - setDeliveryState(json?.length > 0 ? DeliveryState.Available : DeliveryState.Unavailable); - }); - } - }, [statusData?.jobId, statusData?.status, validationRunning]); - - const executeDelivery = async () => { - setDeliveryState(DeliveryState.Running); - try { - var response = await fetch("api/v1/delivery", { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({ - JobId: statusData.jobId, - MandateId: selectedMandateId, - PartialDelivery: partialDelivery, - PrecursorDeliveryId: selectedDeliveryId, - Comment: comment, - }), - }); - if (response.ok) { - setDeliveryState(DeliveryState.Completed); - } else { - throw Error(response.statusText); - } - } catch (error) { - setDeliveryState(DeliveryState.Failed); - } - }; - - useEffect(() => { - if (selectedMandateId == undefined) { - return; - } - - fetch("/api/v1/delivery?" + new URLSearchParams({ mandateId: selectedMandateId })) - .then(res => res.ok && res.json()) - .then(setPreviousDeliveries); - }, [selectedMandateId]); - - return ( - - - - -
-
- - - {t("mandate")} - - - { - setSelectedMandateId(e.target.value); - }}> - {mandates - ?.sort((a, b) => a.name.localeCompare(b.name)) - .map(mandate => ( - - ))} - - - - - - {t("type")} - - - { - setPartialDelivery(e.target.checked); - }} - /> - - - - - {t("predecessor")} - - - setSelectedDeliveryId(e.target.value > 0 ? e.target.value : undefined)}> - - {previousDeliveries?.map(delivery => ( - - ))} - - - - - - {t("comment")} - - - setComment(e.target.value)} /> - - -
-
-
- - {deliveryState === DeliveryState.Available && ( - - )} - {deliveryState === DeliveryState.Running && ( - -
-
-
- ); -}; diff --git a/src/Geopilot.Frontend/src/old/home/DeliveryContainer.jsx b/src/Geopilot.Frontend/src/old/home/DeliveryContainer.jsx deleted file mode 100644 index d9a76ce7..00000000 --- a/src/Geopilot.Frontend/src/old/home/DeliveryContainer.jsx +++ /dev/null @@ -1,28 +0,0 @@ -import { Button, Card, Collapse, Container } from "react-bootstrap"; -import { Delivery } from "./Delivery.jsx"; -import { useGeopilotAuth } from "@/auth"; -import { LoggedInTemplate } from "@/auth/LoggedInTemplate"; -import { LoggedOutTemplate } from "@/auth/LoggedOutTemplate"; -import { useTranslation } from "react-i18next"; - -export const DeliveryContainer = ({ statusData, validationRunning }) => { - const { login } = useGeopilotAuth(); - const { t } = useTranslation(); - - return ( - <> - - - - - - - - - - - - - - ); -}; diff --git a/src/Geopilot.Frontend/src/old/home/FileDropzone.jsx b/src/Geopilot.Frontend/src/old/home/FileDropzone.jsx deleted file mode 100644 index a3679a13..00000000 --- a/src/Geopilot.Frontend/src/old/home/FileDropzone.jsx +++ /dev/null @@ -1,204 +0,0 @@ -import { useCallback, useState, useEffect } from "react"; -import { useDropzone } from "react-dropzone"; -import { MdCancel, MdFileUpload } from "react-icons/md"; -import { Button, Spinner } from "react-bootstrap"; -import styled from "styled-components"; -import { useTranslation, Trans } from "react-i18next"; -import i18n from "../../i18n.js"; - -const getColor = isDragActive => { - if (isDragActive) { - return "#2196f3"; - } else { - return "#d1d6d991"; - } -}; - -const Container = styled.div` - flex: 1; - display: flex; - flex-direction: column; - align-items: center; - min-height: 15vh; - max-width: 95vw; - font-size: 20px; - border-width: 2px; - border-radius: 5px; - border-color: ${props => getColor(props.$isDragActive)}; - border-style: dashed; - background-color: #d1d6d991; - color: #9f9f9f; - outline: none; - transition: border 0.24s ease-in-out; -`; - -export const FileDropzone = ({ - setFileToCheck, - setUploadLogsEnabled, - fileToCheck, - nutzungsbestimmungenAvailable, - checkedNutzungsbestimmungen, - checkFile, - validationRunning, - setCheckedNutzungsbestimmungen, - showNutzungsbestimmungen, - acceptedFileTypes, - fileToCheckRef, -}) => { - const { t } = useTranslation(); - const [fileAvailable, setFileAvailable] = useState(false); - const [dropZoneDefaultText, setDropZoneDefaultText] = useState(); - const [dropZoneText, setDropZoneText] = useState(dropZoneDefaultText); - const [dropZoneTextClass, setDropZoneTextClass] = useState("dropzone dropzone-text-disabled"); - - const acceptsAllFileTypes = acceptedFileTypes?.includes(".*") ?? false; - const acceptedFileTypesText = acceptedFileTypes?.join(", ") ?? ""; - - useEffect(() => { - let fileDescription = acceptsAllFileTypes ? t("file") : `${t("file")} (${acceptedFileTypesText})`; - if (i18n.language !== "de") { - fileDescription = fileDescription.toLowerCase(); - } - setDropZoneDefaultText(t("dropZoneDefaultText", { fileDescription })); - }, [acceptsAllFileTypes, acceptedFileTypesText, t]); - useEffect(() => setDropZoneText(dropZoneDefaultText), [dropZoneDefaultText]); - - const onDropAccepted = useCallback( - acceptedFiles => { - const updateDropZoneClass = () => { - if (!checkFile || (nutzungsbestimmungenAvailable && !checkedNutzungsbestimmungen)) { - setDropZoneTextClass("dropzone dropzone-text-disabled"); - } else { - setDropZoneTextClass("dropzone dropzone-text-file"); - } - }; - updateDropZoneClass(); - if (acceptedFiles.length === 1) { - setDropZoneText(acceptedFiles[0].name); - updateDropZoneClass(); - setFileToCheck(acceptedFiles[0]); - fileToCheckRef.current = acceptedFiles[0]; - setFileAvailable(true); - } - }, - [checkFile, checkedNutzungsbestimmungen, fileToCheckRef, nutzungsbestimmungenAvailable, setFileToCheck], - ); - - const resetFileToCheck = useCallback(() => { - setFileToCheck(null); - fileToCheckRef.current = null; - }, [fileToCheckRef, setFileToCheck]); - - const onDropRejected = useCallback( - fileRejections => { - setDropZoneTextClass("dropzone dropzone-text-error"); - const errorCode = fileRejections[0].errors[0].code; - const genericError = acceptsAllFileTypes - ? t("dropZoneErrorChooseFile") - : t("dropZoneErrorChooseFileOfType", { acceptedFileTypesText: acceptedFileTypesText }); - - switch (errorCode) { - case "file-invalid-type": - setDropZoneText(t("dropZoneErrorChooseFileOfType", { genericError: genericError })); - break; - case "too-many-files": - setDropZoneText(t("dropZoneErrorTooManyFiles")); - break; - case "file-too-large": - setDropZoneText(t("dropZoneErrorFileTooLarge")); - break; - default: - setDropZoneText(genericError); - break; - } - resetFileToCheck(); - setFileAvailable(false); - }, - [resetFileToCheck, acceptsAllFileTypes, acceptedFileTypesText, t], - ); - - const removeFile = e => { - e.stopPropagation(); - setUploadLogsEnabled(false); - resetFileToCheck(); - setFileAvailable(false); - setDropZoneText(dropZoneDefaultText); - setDropZoneTextClass("dropzone dropzone-text-disabled"); - }; - - const accept = acceptsAllFileTypes - ? undefined - : { - "application/x-geopilot-files": acceptedFileTypes ?? [], - }; - const { getRootProps, getInputProps, isDragActive } = useDropzone({ - onDropAccepted, - onDropRejected, - maxFiles: 1, - maxSize: 209715200, - accept, - }); - - return ( -
- - -
- {fileAvailable && ( - - - - )} - {dropZoneText} - {!fileAvailable && ( -

- -

- )} - {fileToCheck && nutzungsbestimmungenAvailable && ( -
e.stopPropagation()} className="terms-of-use"> - -
- )} - {validationRunning && ( -
- -
- )} - {fileAvailable && ( -

- -

- )} -
-
-
- ); -}; diff --git a/src/Geopilot.Frontend/src/old/home/Home.jsx b/src/Geopilot.Frontend/src/old/home/Home.jsx deleted file mode 100644 index 4a97b2c0..00000000 --- a/src/Geopilot.Frontend/src/old/home/Home.jsx +++ /dev/null @@ -1,165 +0,0 @@ -import "../../app.css"; -import { useCallback, useEffect, useRef, useState } from "react"; -import { Container, Stack } from "react-bootstrap"; -import { useTranslation } from "react-i18next"; -import { FileDropzone } from "./FileDropzone.jsx"; -import { Title } from "./Title.jsx"; -import { Protokoll } from "./Protokoll.jsx"; -import { DeliveryContainer } from "./DeliveryContainer.jsx"; -import Header from "../Header"; - -export const Home = ({ - clientSettings, - nutzungsbestimmungenAvailable, - showNutzungsbestimmungen, - quickStartContent, - setShowBannerContent, -}) => { - const { t } = useTranslation(); - const [fileToCheck, setFileToCheck] = useState(null); - const fileToCheckRef = useRef(fileToCheck); - const [validationRunning, setValidationRunning] = useState(false); - const [statusInterval, setStatusInterval] = useState(null); - const [statusData, setStatusData] = useState(null); - const [checkedNutzungsbestimmungen, setCheckedNutzungsbestimmungen] = useState(false); - const [isFirstValidation, setIsFirstValidation] = useState(true); - const [log, setLog] = useState([]); - const [uploadLogsInterval, setUploadLogsInterval] = useState(0); - const [uploadLogsEnabled, setUploadLogsEnabled] = useState(false); - const [validationSettings, setValidationSettings] = useState({}); - - useEffect(() => { - fetch("/api/v1/validation") - .then(res => res.headers.get("content-type")?.includes("application/json") && res.json()) - .then(settings => setValidationSettings(settings)); - }, []); - - // Enable Upload logging - useEffect(() => { - if (uploadLogsInterval !== 0) setUploadLogsEnabled(true); - }, [uploadLogsInterval]); - useEffect(() => { - if (!uploadLogsEnabled) clearInterval(uploadLogsInterval); - }, [uploadLogsEnabled, uploadLogsInterval]); - - const resetLog = useCallback(() => setLog([]), [setLog]); - const updateLog = useCallback( - (message, { disableUploadLogs = true } = {}) => { - if (disableUploadLogs) setUploadLogsEnabled(false); - setLog(log => { - if (message === log[log.length - 1]) return log; - else return [...log, message]; - }); - }, - [setUploadLogsEnabled], - ); - - // Reset log and abort upload on file change - useEffect(() => { - resetLog(); - setStatusData(null); - setValidationRunning(false); - setUploadLogsEnabled(false); - if (statusInterval) clearInterval(statusInterval); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [fileToCheck]); - - // Show banner on first validation - useEffect(() => { - if (validationRunning && isFirstValidation) { - setTimeout(() => { - setShowBannerContent(true); - setIsFirstValidation(false); - }, 2000); - } - }, [validationRunning, isFirstValidation, setShowBannerContent, setIsFirstValidation]); - - const logUploadLogMessages = () => - updateLog(`${t("uploadFile", { fileName: fileToCheck.name })}`, { disableUploadLogs: false }); - const setIntervalImmediately = (func, interval) => { - func(); - return setInterval(func, interval); - }; - const checkFile = e => { - e.stopPropagation(); - resetLog(); - setStatusData(null); - setValidationRunning(true); - setUploadLogsInterval(setIntervalImmediately(logUploadLogMessages, 2000)); - uploadFile(fileToCheck); - }; - - const uploadFile = async file => { - const formData = new FormData(); - formData.append("file", file, file.name); - const response = await fetch(`api/v1/validation`, { - method: "POST", - body: formData, - }); - if (response.ok) { - // Use ref instead of state to check current file status in async function - if (fileToCheckRef.current) { - const data = await response.json(); - const getStatusData = async data => { - const status = await fetch(`/api/v1/validation/${data.jobId}`, { - method: "GET", - }); - return await status.json(); - }; - - const interval = setIntervalImmediately(async () => { - const statusData = await getStatusData(data); - if ( - statusData.status === "completed" || - statusData.status === "completedWithErrors" || - statusData.status === "failed" - ) { - clearInterval(interval); - setValidationRunning(false); - setStatusData(statusData); - } - }, 2000); - setStatusInterval(interval); - } - } else { - console.log("Error while uploading file: " + response.json()); - updateLog(t("uploadNotSuccessful")); - setValidationRunning(false); - } - }; - - return ( - <> -
-
- - - - <FileDropzone - setUploadLogsEnabled={setUploadLogsEnabled} - setFileToCheck={setFileToCheck} - fileToCheck={fileToCheck} - nutzungsbestimmungenAvailable={nutzungsbestimmungenAvailable} - checkedNutzungsbestimmungen={checkedNutzungsbestimmungen} - checkFile={checkFile} - validationRunning={validationRunning} - setCheckedNutzungsbestimmungen={setCheckedNutzungsbestimmungen} - showNutzungsbestimmungen={showNutzungsbestimmungen} - acceptedFileTypes={validationSettings?.allowedFileExtensions} - fileToCheckRef={fileToCheckRef} - /> - </Container> - <Protokoll - log={log} - statusData={statusData} - fileName={fileToCheck ? fileToCheck.name : ""} - validationRunning={validationRunning} - /> - <DeliveryContainer statusData={statusData} validationRunning={validationRunning} /> - </Stack> - </main> - </> - ); -}; - -export default Home; diff --git a/src/Geopilot.Frontend/src/old/home/InfoCarousel.jsx b/src/Geopilot.Frontend/src/old/home/InfoCarousel.jsx deleted file mode 100644 index f79c1bb7..00000000 --- a/src/Geopilot.Frontend/src/old/home/InfoCarousel.jsx +++ /dev/null @@ -1,14 +0,0 @@ -import "../../app.css"; -import { Carousel } from "react-bootstrap"; - -export const InfoCarousel = ({ content }) => ( - <Carousel interval={null} nextLabel="" prevLabel=""> - {content?.split("\n").map(item => ( - <Carousel.Item key={item}> - <div>{item}</div> - </Carousel.Item> - ))} - </Carousel> -); - -export default InfoCarousel; diff --git a/src/Geopilot.Frontend/src/old/home/Protokoll.jsx b/src/Geopilot.Frontend/src/old/home/Protokoll.jsx deleted file mode 100644 index d2381b7d..00000000 --- a/src/Geopilot.Frontend/src/old/home/Protokoll.jsx +++ /dev/null @@ -1,60 +0,0 @@ -import "../../app.css"; -import { ValidatorResult } from "./ValidatorResult.jsx"; -import { useState, useRef, useEffect } from "react"; -import DayJS from "dayjs"; -import { Card, Collapse, Container } from "react-bootstrap"; - -export const Protokoll = ({ log, statusData, fileName, validationRunning }) => { - const [indicateWaiting, setIndicateWaiting] = useState(false); - const protokollTimestamp = DayJS(new Date()).format("YYYYMMDDHHmm"); - const protokollFileName = "Ilivalidator_output_" + fileName + "_" + protokollTimestamp; - const logEndRef = useRef(null); - - // Autoscroll protokoll log - useEffect(() => { - logEndRef.current?.scrollIntoView({ behavior: "smooth" }); - }, [log]); - - // Show flash dot to indicate waiting - useEffect(() => { - setTimeout(() => { - if (validationRunning === true) { - setIndicateWaiting(!indicateWaiting); - } else { - setIndicateWaiting(false); - } - }, 500); - }); - - return ( - <Collapse in={log.length > 0}> - <Container> - {log.length > 0 && ( - <Card className="protokoll-card"> - <Card.Body> - <div className="protokoll"> - {log.map((logEntry, index) => ( - <div key={index}> - {logEntry} - {indicateWaiting && index === log.length - 1 && "."} - </div> - ))} - <div ref={logEndRef} /> - </div> - {statusData && - Object.entries(statusData.validatorResults).map(([validatorName, result]) => ( - <ValidatorResult - key={validatorName} - jobId={statusData.jobId} - protokollFileName={protokollFileName} - validatorName={validatorName} - result={result} - /> - ))} - </Card.Body> - </Card> - )} - </Container> - </Collapse> - ); -}; diff --git a/src/Geopilot.Frontend/src/old/home/Title.jsx b/src/Geopilot.Frontend/src/old/home/Title.jsx deleted file mode 100644 index 6aab6e71..00000000 --- a/src/Geopilot.Frontend/src/old/home/Title.jsx +++ /dev/null @@ -1,35 +0,0 @@ -import { useState } from "react"; -import InfoCarousel from "./InfoCarousel.jsx"; -import "../../app.css"; -import { useEffect } from "react"; -import { useTranslation } from "react-i18next"; - -export const Title = ({ clientSettings, quickStartContent }) => { - const { t } = useTranslation(); - const [customAppLogoPresent, setCustomAppLogoPresent] = useState(false); - - useEffect(() => { - setCustomAppLogoPresent(clientSettings?.application?.logo !== undefined); - }, [clientSettings?.application]); - - return ( - <div className="title-wrapper"> - <div className="app-subtitle">{t("appSubTitle")}</div> - {customAppLogoPresent ? ( - <div> - <img - className="app-logo" - src={clientSettings?.application?.logo} - alt="App Logo" - onError={() => setCustomAppLogoPresent(false)} - /> - </div> - ) : ( - <div className="app-title">{clientSettings?.application?.name}</div> - )} - {quickStartContent && <InfoCarousel content={quickStartContent} />} - </div> - ); -}; - -export default Title; diff --git a/src/Geopilot.Frontend/src/old/home/ValidatorResult.jsx b/src/Geopilot.Frontend/src/old/home/ValidatorResult.jsx deleted file mode 100644 index f80485d9..00000000 --- a/src/Geopilot.Frontend/src/old/home/ValidatorResult.jsx +++ /dev/null @@ -1,43 +0,0 @@ -import { Card } from "react-bootstrap"; -import { GoFile } from "react-icons/go"; -import { useTranslation } from "react-i18next"; - -function getExtension(filename) { - const index = filename.lastIndexOf("."); - return index === -1 ? "" : filename.substring(index); -} - -export const ValidatorResult = ({ jobId, protokollFileName, validatorName, result }) => { - const { t } = useTranslation(); - const statusClass = result && result.status === "completed" ? "valid" : "errors"; - const statusText = result && result.status === "completed" ? `${t("noErrors")}!` : `${t("errors")}!`; - - return ( - <> - <hr /> - <h4>{validatorName}</h4> - <p>{result.statusMessage}</p> - <Card.Title className={statusClass}> - {statusText} - <span> - {result.logFiles && - Object.entries(result.logFiles).map(([logFileType, logFile]) => ( - <span key={logFileType} className="icon-tooltip"> - <a - download={protokollFileName + getExtension(logFile)} - className={statusClass + " download-icon"} - href={`/api/v1/validation/${jobId}/files/${logFile}`}> - <GoFile /> - <span className="download-description">{logFileType}</span> - </a> - <span className="icon-tooltip-text"> - {logFileType} - {t("downloadLogTooltip")} - </span> - </span> - ))} - </span> - </Card.Title> - </> - ); -}; diff --git a/src/Geopilot.Frontend/src/old/sms-sh.png b/src/Geopilot.Frontend/src/old/sms-sh.png deleted file mode 100644 index 471b2989..00000000 Binary files a/src/Geopilot.Frontend/src/old/sms-sh.png and /dev/null differ diff --git a/src/Geopilot.Frontend/src/pages/footer/about.tsx b/src/Geopilot.Frontend/src/pages/footer/about.tsx index 523670a2..3c776c45 100644 --- a/src/Geopilot.Frontend/src/pages/footer/about.tsx +++ b/src/Geopilot.Frontend/src/pages/footer/about.tsx @@ -1,7 +1,7 @@ import { Trans, useTranslation } from "react-i18next"; import { useEffect, useState } from "react"; import { useApi } from "../../api"; -import { Typography } from "@mui/material"; +import { Link, Typography } from "@mui/material"; import { MarkdownContent } from "../../components/markdownContent.tsx"; import { useAppSettings } from "../../components/appSettings/appSettingsInterface.ts"; import { ContentType } from "../../api/apiInterfaces.ts"; @@ -75,10 +75,16 @@ export const About = () => { i18nKey="codeLicenseInfo" components={{ licenseLink: ( - <a href="https://github.com/GeoWerkstatt/geopilot/blob/main/LICENSE" target="_blank" rel="noreferrer" /> + <Link + href="https://github.com/GeoWerkstatt/geopilot/blob/main/LICENSE" + target="_blank" + rel="noreferrer" + /> + ), + repositoryLink: <Link href="https://github.com/GeoWerkstatt/geopilot" target="_blank" rel="noreferrer" />, + issuesLink: ( + <Link href="https://github.com/GeoWerkstatt/geopilot/issues/" target="_blank" rel="noreferrer" /> ), - repositoryLink: <a href="https://github.com/GeoWerkstatt/geopilot" target="_blank" rel="noreferrer" />, - issuesLink: <a href="https://github.com/GeoWerkstatt/geopilot/issues/" target="_blank" rel="noreferrer" />, }} /> </p> @@ -95,7 +101,7 @@ export const About = () => { {licenseInfoCustom[key].version && ` (${t("version")} ${licenseInfoCustom[key].version})`}{" "} </Typography> <p> - <a href={licenseInfoCustom[key].repository}>{licenseInfoCustom[key].repository}</a> + <Link href={licenseInfoCustom[key].repository}>{licenseInfoCustom[key].repository}</Link> </p> <p>{licenseInfoCustom[key].description}</p> <p>{licenseInfoCustom[key].copyright}</p> @@ -113,7 +119,7 @@ export const About = () => { {licenseInfo[key].version && ` (${t("version")} ${licenseInfo[key].version})`}{" "} </Typography> <p> - <a href={licenseInfo[key].repository}>{licenseInfo[key].repository}</a> + <Link href={licenseInfo[key].repository}>{licenseInfo[key].repository}</Link> </p> <p>{licenseInfo[key].description}</p> <p>{licenseInfo[key].copyright}</p> diff --git a/src/Geopilot.Frontend/src/pages/footer/footer.tsx b/src/Geopilot.Frontend/src/pages/footer/footer.tsx index c9826f6c..fc3fb638 100644 --- a/src/Geopilot.Frontend/src/pages/footer/footer.tsx +++ b/src/Geopilot.Frontend/src/pages/footer/footer.tsx @@ -13,7 +13,6 @@ const Footer = () => { return ( <FlexRowCenterBox sx={{ - width: { xs: "100%", md: `calc(100% - ${marginLeft})` }, flexWrap: "wrap", marginLeft: { xs: "0", md: marginLeft }, padding: "0 20px 10px 20px",