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 @@
+
+
+
+
+ mdi-content-save
+
+
+
+ {{ $t('screenshot') }}
+
+
+
+
+