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 (
-
- );
-};
-
-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 ? (
- <>
-
-
-
-
- {
- const img = e.target as HTMLImageElement;
- img.style.display = "none";
- }}
- />
-
- >
- ) : (
- {
- 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 (
-
-
-
-
-
-
-
- {deliveryState === DeliveryState.Available && (
-
- )}
- {deliveryState === DeliveryState.Running && (
-
- )}
- {deliveryState === DeliveryState.Completed && (
-
- )}
- {deliveryState === DeliveryState.Failed && {t("createDeliveryFailed")}}
-
-
-
-
- );
-};
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 (
- <>
-
-
-
-
-
-
-
-
-
-
-
- >
- );
-};
-
-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 }) => (
-
- {content?.split("\n").map(item => (
-
- {item}
-
- ))}
-
-);
-
-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 (
- 0}>
-
- {log.length > 0 && (
-
-
-
- {log.map((logEntry, index) => (
-
- {logEntry}
- {indicateWaiting && index === log.length - 1 && "."}
-
- ))}
-
-
- {statusData &&
- Object.entries(statusData.validatorResults).map(([validatorName, result]) => (
-
- ))}
-
-
- )}
-
-
- );
-};
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 (
-
-
{t("appSubTitle")}
- {customAppLogoPresent ? (
-
-
setCustomAppLogoPresent(false)}
- />
-
- ) : (
-
{clientSettings?.application?.name}
- )}
- {quickStartContent &&
}
-
- );
-};
-
-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 (
- <>
-
- {validatorName}
- {result.statusMessage}
-
- {statusText}
-
- {result.logFiles &&
- Object.entries(result.logFiles).map(([logFileType, logFile]) => (
-
-
-
- {logFileType}
-
-
- {logFileType}
- {t("downloadLogTooltip")}
-
-
- ))}
-
-
- >
- );
-};
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: (
-
+
+ ),
+ repositoryLink: ,
+ issuesLink: (
+
),
- repositoryLink: ,
- issuesLink: ,
}}
/>
@@ -95,7 +101,7 @@ export const About = () => {
{licenseInfoCustom[key].version && ` (${t("version")} ${licenseInfoCustom[key].version})`}{" "}
- {licenseInfoCustom[key].repository}
+ {licenseInfoCustom[key].repository}
{licenseInfoCustom[key].description}
{licenseInfoCustom[key].copyright}
@@ -113,7 +119,7 @@ export const About = () => {
{licenseInfo[key].version && ` (${t("version")} ${licenseInfo[key].version})`}{" "}
- {licenseInfo[key].repository}
+ {licenseInfo[key].repository}
{licenseInfo[key].description}
{licenseInfo[key].copyright}
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 (