diff --git a/package-lock.json b/package-lock.json index 6e78c867..3a4a41cd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28,6 +28,7 @@ "exponential-backoff": "^3.1.1", "file-saver": "^2.0.5", "html-loader": "4.2.0", + "html2canvas": "^1.4.1", "inquirer": "^8.2.0", "jszip": "^3.7.1", "jszip-utils": "^0.1.0", @@ -74,7 +75,6 @@ "stylelint": "^16.6.1", "stylelint-config-property-sort-order-smacss": "^10.0.0", "stylelint-config-standard": "^36.0.1", - "ts-node": "^10.9.2", "vue-cli-plugin-vuetify": "^2.4.3", "vue-template-compiler": "^2.6.11", "vuetify-loader": "^1.9.2" @@ -6413,6 +6413,15 @@ "node": ">=0.10.0" } }, + "node_modules/base64-arraybuffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", + "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -8433,6 +8442,15 @@ "node": ">=12 || >=16" } }, + "node_modules/css-line-break": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-line-break/-/css-line-break-2.1.0.tgz", + "integrity": "sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==", + "license": "MIT", + "dependencies": { + "utrie": "^1.0.2" + } + }, "node_modules/css-loader": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.6.0.tgz", @@ -12604,6 +12622,19 @@ "object-assign": "^4.0.1" } }, + "node_modules/html2canvas": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/html2canvas/-/html2canvas-1.4.1.tgz", + "integrity": "sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==", + "license": "MIT", + "dependencies": { + "css-line-break": "^2.1.0", + "text-segmentation": "^1.0.3" + }, + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/htmlparser2": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", @@ -46888,6 +46919,15 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, + "node_modules/text-segmentation": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/text-segmentation/-/text-segmentation-1.0.3.tgz", + "integrity": "sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==", + "license": "MIT", + "dependencies": { + "utrie": "^1.0.2" + } + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -47854,6 +47894,15 @@ "node": ">= 0.4.0" } }, + "node_modules/utrie": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/utrie/-/utrie-1.0.2.tgz", + "integrity": "sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==", + "license": "MIT", + "dependencies": { + "base64-arraybuffer": "^1.0.2" + } + }, "node_modules/uuid": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", diff --git a/package.json b/package.json index 86a9a70a..7135329f 100644 --- a/package.json +++ b/package.json @@ -50,6 +50,7 @@ "exponential-backoff": "^3.1.1", "file-saver": "^2.0.5", "html-loader": "4.2.0", + "html2canvas": "^1.4.1", "inquirer": "^8.2.0", "jszip": "^3.7.1", "jszip-utils": "^0.1.0", diff --git a/public/translations/en.json b/public/translations/en.json index ceb8cc12..962a8630 100644 --- a/public/translations/en.json +++ b/public/translations/en.json @@ -95,5 +95,6 @@ "whatIsYourEmail": "What is your email?", "whoAreYou": "Who are you?", "wmsLayer": "WMS layer", - "wmsUrl": "WMS url" + "wmsUrl": "WMS url", + "screenshot": "Take a snapshot of the current view and save it to png" } diff --git a/public/translations/nl.json b/public/translations/nl.json index 3cce7dbb..9d32f2f1 100644 --- a/public/translations/nl.json +++ b/public/translations/nl.json @@ -95,5 +95,6 @@ "whatIsYourEmail": "Wat is uw e-mailadres?", "whoAreYou": "Wie bent u?", "wmsLayer": "WMS laag", - "wmsUrl": "WMS url" + "wmsUrl": "WMS url", + "screenshot": "Maak een snapshot van het huidige weergave en sla deze op naar png" } diff --git a/src/App.vue b/src/App.vue index af016fb6..c7bb9dc3 100644 --- a/src/App.vue +++ b/src/App.vue @@ -8,6 +8,7 @@ :items="localeItems" @input="switchLocaleAndAddViewerData($event.title)" /> + locale.replace(/-.+/, '') const localeIsAvailable = locale => availableLocales.includes(locale) @@ -166,6 +170,7 @@ UserAgreementDialog, FeedbackDialog, AcknowledgmentsDialog, + ScreenshotButton }, data: () => ({ @@ -188,6 +193,7 @@ feedbackDialogOpen: false, clickedUserAgreementOpen: false, acknowledgmentsDialogOpen: false, + mapInstance: null }), computed: { @@ -220,6 +226,14 @@ }, mounted() { + this.$nextTick(() => { + if (this.$refs.mapbox && this.$refs.mapbox.map) { + this.mapInstance = this.$refs.mapbox.map; + } else { + console.error("Mapbox instance is not available"); + } + }); + this.$router.onReady(async (route) => { const savedLocale = window.localStorage.getItem('locale') let browserLocales = [] diff --git a/src/components/ScreenshotButton/ScreenshotButton.vue b/src/components/ScreenshotButton/ScreenshotButton.vue new file mode 100644 index 00000000..b3b77e70 --- /dev/null +++ b/src/components/ScreenshotButton/ScreenshotButton.vue @@ -0,0 +1,167 @@ + + +