From 79dea999ad571bfcccf427126c8cfbb9c5b785bc Mon Sep 17 00:00:00 2001 From: Jan Date: Sun, 12 Oct 2025 13:41:37 +0200 Subject: [PATCH] - intermediate commit --- pom.xml | 1 + src/frontend/assets/map.json | 165 +++++++++ src/frontend/index.html | 12 +- src/frontend/package-lock.json | 120 ++++++ src/frontend/package.json | 2 + src/frontend/src/App.vue | 1 + src/frontend/src/backend.js | 1 - .../src/components/UI/AzureMapsComponent.vue | 346 ------------------ .../src/components/UI/OpenStreetMapEmbed.vue | 191 ++++++++++ .../components/layout/edit/SupplierView.vue | 12 +- src/frontend/src/logger.js | 2 +- src/frontend/src/router.js | 2 - src/frontend/src/store/activeuser.js | 5 +- src/frontend/src/store/assistant.js | 62 +--- src/frontend/src/store/country.js | 104 +----- src/frontend/src/store/premise.js | 46 +-- src/frontend/src/store/properties.js | 100 +---- src/frontend/src/store/reportSearch.js | 102 +----- src/frontend/src/store/stage.js | 100 +---- src/frontend/vite.config.js | 5 + .../de/avatic/lcc/config/AzureMapsConfig.java | 39 -- .../java/de/avatic/lcc/config/CorsConfig.java | 3 + .../lcc/config/DevUserEmulationFilter.java | 10 +- .../de/avatic/lcc/config/LccOidcUser.java | 19 + .../java/de/avatic/lcc/config/RestConfig.java | 14 + .../de/avatic/lcc/config/SecurityConfig.java | 41 ++- .../configuration/NodeController.java | 7 +- .../controller/custom/CustomController.java | 2 +- .../controller/maps/AzureMapsController.java | 225 ++---------- .../avatic/lcc/model/azuremaps/Address.java | 87 +++++ .../lcc/model/azuremaps/AdminDistrict.java | 30 ++ .../azuremaps/BatchGeocodingRequest.java | 28 ++ .../azuremaps/BatchGeocodingResponse.java | 35 ++ .../model/azuremaps/BatchGeocodingResult.java | 44 +++ .../avatic/lcc/model/azuremaps/BatchItem.java | 56 +++ .../model/azuremaps/BatchResponseItem.java | 29 ++ .../lcc/model/azuremaps/CountryRegion.java | 30 ++ .../avatic/lcc/model/azuremaps/Feature.java | 54 +++ .../lcc/model/azuremaps/GeocodePoint.java | 43 +++ .../model/azuremaps/GeocodingResponse.java | 32 ++ .../lcc/model/azuremaps/GeocodingResult.java | 54 +++ .../avatic/lcc/model/azuremaps/Geometry.java | 32 ++ .../lcc/model/azuremaps/Properties.java | 54 +++ .../de/avatic/lcc/model/azuremaps/Route.java | 36 ++ .../azuremaps/RouteDirectionsResponse.java | 27 ++ .../avatic/lcc/model/azuremaps/RouteLeg.java | 27 ++ .../lcc/model/azuremaps/RoutePoint.java | 26 ++ .../lcc/model/azuremaps/RouteSection.java | 44 +++ .../lcc/model/azuremaps/RouteSummary.java | 62 ++++ .../avatic/lcc/model/azuremaps/Summary.java | 29 ++ .../DistanceMatrixRepository.java | 76 +++- .../repositories/users/UserRepository.java | 35 +- .../de/avatic/lcc/service/GeoApiService.java | 15 - .../lcc/service/api/BatchGeoApiService.java | 200 ++++++++++ .../service/{ => api}/CustomApiService.java | 2 +- .../lcc/service/api/DistanceApiService.java | 109 ++++++ .../avatic/lcc/service/api/GeoApiService.java | 68 ++++ .../lcc/service/bulk/BulkImportService.java | 6 +- .../bulk/helper/ConstraintGenerator.java | 16 +- .../calculation/ChangeMaterialService.java | 2 +- .../calculation/ChangeSupplierService.java | 2 +- .../calculation/PremiseCreationService.java | 2 +- .../steps/CustomCostCalculationService.java | 2 +- .../service/excelMapper/NodeExcelMapper.java | 17 +- .../PreCalculationCheckService.java | 2 +- src/main/resources/application.properties | 3 +- src/test/resources/master_data/users.sql | 12 +- 67 files changed, 1997 insertions(+), 1170 deletions(-) create mode 100644 src/frontend/assets/map.json delete mode 100644 src/frontend/src/components/UI/AzureMapsComponent.vue create mode 100644 src/frontend/src/components/UI/OpenStreetMapEmbed.vue delete mode 100644 src/main/java/de/avatic/lcc/config/AzureMapsConfig.java create mode 100644 src/main/java/de/avatic/lcc/config/RestConfig.java create mode 100644 src/main/java/de/avatic/lcc/model/azuremaps/Address.java create mode 100644 src/main/java/de/avatic/lcc/model/azuremaps/AdminDistrict.java create mode 100644 src/main/java/de/avatic/lcc/model/azuremaps/BatchGeocodingRequest.java create mode 100644 src/main/java/de/avatic/lcc/model/azuremaps/BatchGeocodingResponse.java create mode 100644 src/main/java/de/avatic/lcc/model/azuremaps/BatchGeocodingResult.java create mode 100644 src/main/java/de/avatic/lcc/model/azuremaps/BatchItem.java create mode 100644 src/main/java/de/avatic/lcc/model/azuremaps/BatchResponseItem.java create mode 100644 src/main/java/de/avatic/lcc/model/azuremaps/CountryRegion.java create mode 100644 src/main/java/de/avatic/lcc/model/azuremaps/Feature.java create mode 100644 src/main/java/de/avatic/lcc/model/azuremaps/GeocodePoint.java create mode 100644 src/main/java/de/avatic/lcc/model/azuremaps/GeocodingResponse.java create mode 100644 src/main/java/de/avatic/lcc/model/azuremaps/GeocodingResult.java create mode 100644 src/main/java/de/avatic/lcc/model/azuremaps/Geometry.java create mode 100644 src/main/java/de/avatic/lcc/model/azuremaps/Properties.java create mode 100644 src/main/java/de/avatic/lcc/model/azuremaps/Route.java create mode 100644 src/main/java/de/avatic/lcc/model/azuremaps/RouteDirectionsResponse.java create mode 100644 src/main/java/de/avatic/lcc/model/azuremaps/RouteLeg.java create mode 100644 src/main/java/de/avatic/lcc/model/azuremaps/RoutePoint.java create mode 100644 src/main/java/de/avatic/lcc/model/azuremaps/RouteSection.java create mode 100644 src/main/java/de/avatic/lcc/model/azuremaps/RouteSummary.java create mode 100644 src/main/java/de/avatic/lcc/model/azuremaps/Summary.java delete mode 100644 src/main/java/de/avatic/lcc/service/GeoApiService.java create mode 100644 src/main/java/de/avatic/lcc/service/api/BatchGeoApiService.java rename src/main/java/de/avatic/lcc/service/{ => api}/CustomApiService.java (90%) create mode 100644 src/main/java/de/avatic/lcc/service/api/DistanceApiService.java create mode 100644 src/main/java/de/avatic/lcc/service/api/GeoApiService.java diff --git a/pom.xml b/pom.xml index 2cdaeab..94e4f62 100644 --- a/pom.xml +++ b/pom.xml @@ -32,6 +32,7 @@ 5.18.0 + org.springframework.boot spring-boot-starter-batch diff --git a/src/frontend/assets/map.json b/src/frontend/assets/map.json new file mode 100644 index 0000000..84dff7c --- /dev/null +++ b/src/frontend/assets/map.json @@ -0,0 +1,165 @@ +{ +"version": 8, +"name": "Custom Style", +"sources": { +"raster-tiles": { +"type": "raster", +"tiles": ["https://atlas.microsoft.com/map/tile?api-version=2.0&tilesetId=microsoft.base.road&zoom={z}&x={x}&y={y}"], +"tileSize": 256, +"attribution": "© Microsoft" +} +}, +"sprite": "https://atlas.microsoft.com/map/sprites/atlas?api-version=2.0", +"glyphs": "https://atlas.microsoft.com/map/fonts/{fontstack}/{range}.pbf?api-version=2.0", +"layers": [ +{ +"id": "background", +"type": "background", +"paint": { +"background-color": "#f8fafc" +} +}, +{ +"id": "landcover", +"type": "fill", +"source": "vectorTiles", +"source-layer": "Landcover", +"paint": { +"fill-color": "#ffffff", +"fill-opacity": 0.8 +} +}, +{ +"id": "water", +"type": "fill", +"source": "vectorTiles", +"source-layer": "Water", +"paint": { +"fill-color": "#8DB3FE" +} +}, +{ +"id": "water-outline", +"type": "line", +"source": "vectorTiles", +"source-layer": "Water", +"paint": { +"line-color": "#6B869C", +"line-width": 1 +} +}, +{ +"id": "park", +"type": "fill", +"source": "vectorTiles", +"source-layer": "Landuse", +"filter": ["==", ["get", "class"], "park"], +"paint": { +"fill-color": "#5AF0B4", +"fill-opacity": 0.3 +} +}, +{ +"id": "building", +"type": "fill", +"source": "vectorTiles", +"source-layer": "Building", +"paint": { +"fill-color": "#6b7280", +"fill-opacity": 0.6 +} +}, +{ +"id": "building-outline", +"type": "line", +"source": "vectorTiles", +"source-layer": "Building", +"paint": { +"line-color": "#002F54", +"line-width": 0.5 +} +}, +{ +"id": "road-minor", +"type": "line", +"source": "vectorTiles", +"source-layer": "Road", +"filter": ["in", ["get", "class"], ["literal", ["service", "track"]]], +"paint": { +"line-color": "#ffffff", +"line-width": 2 +} +}, +{ +"id": "road-major", +"type": "line", +"source": "vectorTiles", +"source-layer": "Road", +"filter": ["in", ["get", "class"], ["literal", ["primary", "secondary", "tertiary"]]], +"paint": { +"line-color": "#6B869C", +"line-width": 3 +} +}, +{ +"id": "road-highway", +"type": "line", +"source": "vectorTiles", +"source-layer": "Road", +"filter": ["in", ["get", "class"], ["literal", ["motorway", "trunk"]]], +"paint": { +"line-color": "#BC2B72", +"line-width": 4 +} +}, +{ +"id": "road-label", +"type": "symbol", +"source": "vectorTiles", +"source-layer": "Road", +"layout": { +"text-field": ["get", "name"], +"text-font": ["Poppins"], +"text-size": 12, +"symbol-placement": "line" +}, +"paint": { +"text-color": "#002F54", +"text-halo-color": "#ffffff", +"text-halo-width": 2 +} +}, +{ +"id": "place-label", +"type": "symbol", +"source": "vectorTiles", +"source-layer": "Place", +"layout": { +"text-field": ["get", "name"], +"text-font": ["Poppins"], +"text-size": 14 +}, +"paint": { +"text-color": "#002F54", +"text-halo-color": "#ffffff", +"text-halo-width": 2 +} +}, +{ +"id": "poi-label", +"type": "symbol", +"source": "vectorTiles", +"source-layer": "POI", +"layout": { +"text-field": ["get", "name"], +"text-font": ["Poppins"], +"text-size": 11 +}, +"paint": { +"text-color": "#5AF0B4", +"text-halo-color": "#002F54", +"text-halo-width": 1.5 +} +} +] +} \ No newline at end of file diff --git a/src/frontend/index.html b/src/frontend/index.html index 467a876..581899e 100644 --- a/src/frontend/index.html +++ b/src/frontend/index.html @@ -1,13 +1,13 @@ - + LCC - - -
- - + + +
+ + diff --git a/src/frontend/package-lock.json b/src/frontend/package-lock.json index 687924b..e7552ea 100644 --- a/src/frontend/package-lock.json +++ b/src/frontend/package-lock.json @@ -10,7 +10,9 @@ "dependencies": { "@phosphor-icons/vue": "^2.2.1", "@vueuse/core": "^13.6.0", + "azure-maps-control": "^3.6.1", "chart.js": "^4.5.0", + "leaflet": "^1.9.4", "loglevel": "^1.9.2", "pinia": "^3.0.3", "vite-plugin-static-copy": "^3.1.3", @@ -41,6 +43,27 @@ "node": ">=6.0.0" } }, + "node_modules/@azure/msal-browser": { + "version": "2.39.0", + "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-2.39.0.tgz", + "integrity": "sha512-kks/n2AJzKUk+DBqZhiD+7zeQGBl+WpSOQYzWy6hff3bU0ZrYFqr4keFLlzB5VKuKZog0X59/FGHb1RPBDZLVg==", + "license": "MIT", + "dependencies": { + "@azure/msal-common": "13.3.3" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@azure/msal-common": { + "version": "13.3.3", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-13.3.3.tgz", + "integrity": "sha512-n278DdCXKeiWhLwhEL7/u9HRMyzhUXLefeajiknf6AmEedoiOiv2r5aRJ7LXdT3NGPyubkdIbthaJlVtmuEqvA==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/@babel/code-frame": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", @@ -957,6 +980,46 @@ "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==", "license": "MIT" }, + "node_modules/@mapbox/jsonlint-lines-primitives": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz", + "integrity": "sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@mapbox/mapbox-gl-supported": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@mapbox/mapbox-gl-supported/-/mapbox-gl-supported-2.0.1.tgz", + "integrity": "sha512-HP6XvfNIzfoMVfyGjBckjiAOQK9WfX0ywdLubuPMPv+Vqf5fj0uCbgBQYpiqcWZT6cbyyRnTSXDheT1ugvF6UQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@mapbox/unitbezier": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.1.tgz", + "integrity": "sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw==", + "license": "BSD-2-Clause" + }, + "node_modules/@maplibre/maplibre-gl-style-spec": { + "version": "20.4.0", + "resolved": "https://registry.npmjs.org/@maplibre/maplibre-gl-style-spec/-/maplibre-gl-style-spec-20.4.0.tgz", + "integrity": "sha512-AzBy3095fTFPjDjmWpR2w6HVRAZJ6hQZUCwk5Plz6EyfnfuQW1odeW5i2Ai47Y6TBA2hQnC+azscjBSALpaWgw==", + "license": "ISC", + "dependencies": { + "@mapbox/jsonlint-lines-primitives": "~2.0.2", + "@mapbox/unitbezier": "^0.0.1", + "json-stringify-pretty-compact": "^4.0.0", + "minimist": "^1.2.8", + "quickselect": "^2.0.0", + "rw": "^1.3.3", + "tinyqueue": "^3.0.0" + }, + "bin": { + "gl-style-format": "dist/gl-style-format.mjs", + "gl-style-migrate": "dist/gl-style-migrate.mjs", + "gl-style-validate": "dist/gl-style-validate.mjs" + } + }, "node_modules/@phosphor-icons/vue": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@phosphor-icons/vue/-/vue-2.2.1.tgz", @@ -1282,6 +1345,12 @@ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "license": "MIT" }, + "node_modules/@types/geojson": { + "version": "7946.0.16", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", + "license": "MIT" + }, "node_modules/@types/web-bluetooth": { "version": "0.0.21", "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz", @@ -1627,6 +1696,18 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/azure-maps-control": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/azure-maps-control/-/azure-maps-control-3.6.1.tgz", + "integrity": "sha512-EqJ96GOjUcCG9XizUbyqDu92x3KKT9C9AwRL3hmPicQjn00ql7em6RbBqJYO4nvIoH53DG6MOITj9t/zv1mQYg==", + "license": "SEE LICENSE.TXT", + "dependencies": { + "@azure/msal-browser": "^2.32.1", + "@mapbox/mapbox-gl-supported": "^2.0.1", + "@maplibre/maplibre-gl-style-spec": "^20.0.0", + "@types/geojson": "^7946.0.14" + } + }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", @@ -2290,6 +2371,12 @@ "node": ">=6" } }, + "node_modules/json-stringify-pretty-compact": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-4.0.0.tgz", + "integrity": "sha512-3CNZ2DnrpByG9Nqj6Xo8vqbjT4F6N+tb4Gb28ESAZjYZ5yqvmc56J+/kuIwkaAMOyblTQhUW7PxMkUb8Q36N3Q==", + "license": "MIT" + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -2322,6 +2409,12 @@ "dev": true, "license": "MIT" }, + "node_modules/leaflet": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.9.4.tgz", + "integrity": "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==", + "license": "BSD-2-Clause" + }, "node_modules/loglevel": { "version": "1.9.2", "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.2.tgz", @@ -2354,6 +2447,15 @@ "@jridgewell/sourcemap-codec": "^1.5.5" } }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/mitt": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", @@ -2598,6 +2700,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/quickselect": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz", + "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==", + "license": "ISC" + }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -2681,6 +2789,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", + "license": "BSD-3-Clause" + }, "node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -2801,6 +2915,12 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, + "node_modules/tinyqueue": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-3.0.0.tgz", + "integrity": "sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g==", + "license": "ISC" + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", diff --git a/src/frontend/package.json b/src/frontend/package.json index f6d0659..07c28f8 100644 --- a/src/frontend/package.json +++ b/src/frontend/package.json @@ -14,7 +14,9 @@ "dependencies": { "@phosphor-icons/vue": "^2.2.1", "@vueuse/core": "^13.6.0", + "azure-maps-control": "^3.6.1", "chart.js": "^4.5.0", + "leaflet": "^1.9.4", "loglevel": "^1.9.2", "pinia": "^3.0.3", "vite-plugin-static-copy": "^3.1.3", diff --git a/src/frontend/src/App.vue b/src/frontend/src/App.vue index 38cc276..122f690 100644 --- a/src/frontend/src/App.vue +++ b/src/frontend/src/App.vue @@ -16,6 +16,7 @@ import ErrorNotification from "@/components/UI/ErrorNotifcation.vue"; export default { components: {ErrorNotification, TheHeader}, + } diff --git a/src/frontend/src/backend.js b/src/frontend/src/backend.js index 6a6b33c..7a2d69e 100644 --- a/src/frontend/src/backend.js +++ b/src/frontend/src/backend.js @@ -123,7 +123,6 @@ const executeRequest = async (requestingStore, request) => { throw e; }); - let data = null; if (request.expectResponse) { try { diff --git a/src/frontend/src/components/UI/AzureMapsComponent.vue b/src/frontend/src/components/UI/AzureMapsComponent.vue deleted file mode 100644 index 1adcec3..0000000 --- a/src/frontend/src/components/UI/AzureMapsComponent.vue +++ /dev/null @@ -1,346 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/frontend/src/components/UI/OpenStreetMapEmbed.vue b/src/frontend/src/components/UI/OpenStreetMapEmbed.vue new file mode 100644 index 0000000..1f8d5d7 --- /dev/null +++ b/src/frontend/src/components/UI/OpenStreetMapEmbed.vue @@ -0,0 +1,191 @@ + + + + + \ No newline at end of file diff --git a/src/frontend/src/components/layout/edit/SupplierView.vue b/src/frontend/src/components/layout/edit/SupplierView.vue index 406f39d..0fe608d 100644 --- a/src/frontend/src/components/layout/edit/SupplierView.vue +++ b/src/frontend/src/components/layout/edit/SupplierView.vue @@ -16,7 +16,7 @@
{{ coordinatesDMS }}
- +