diff --git a/extensions/kafka-streams/deployment/src/main/resources/dev-ui/qwc-kafka-streams-topology.js b/extensions/kafka-streams/deployment/src/main/resources/dev-ui/qwc-kafka-streams-topology.js
index 7e69d75f9976e..98d40dd857ada 100644
--- a/extensions/kafka-streams/deployment/src/main/resources/dev-ui/qwc-kafka-streams-topology.js
+++ b/extensions/kafka-streams/deployment/src/main/resources/dev-ui/qwc-kafka-streams-topology.js
@@ -1,7 +1,8 @@
import { QwcHotReloadElement, html, css } from 'qwc-hot-reload-element';
import { unsafeHTML } from 'lit/directives/unsafe-html.js';
import { JsonRpc } from 'jsonrpc';
-
+import { devuiState } from 'devui-state';
+import { notifier } from 'notifier';
import { Graphviz } from "@hpcc-js/wasm/graphviz.js";
import '@vaadin/details';
@@ -52,7 +53,7 @@ export class QwcKafkaStreamsTopology extends QwcHotReloadElement {
Graphviz
Mermaid
- ${this._tabContent}
`;
+ ${this._tabContent}
`;
}
return html` this._downloadTopologyAsPng()}>
+ Download as PNG
+ `;
} else {
this._tabContent = html`Graph engine not started.`;
}
}
+ _downloadTopologyAsPng() {
+ let svgData = this.renderRoot?.querySelector('#svgSpan').getElementsByTagName("svg")[0];
+ let img = new Image(svgData.width.baseVal.value, svgData.height.baseVal.value);
+ img.src = `data:image/svg+xml;base64,${btoa(new XMLSerializer().serializeToString(svgData))}`;
+ img.onload = function () {
+ let cnv = document.createElement('canvas');
+ cnv.width = img.width;
+ cnv.height = img.height;
+ cnv.getContext("2d").drawImage(img, 0, 0);
+ cnv.toBlob((blob) => {
+ let lnk = document.createElement('a');
+ lnk.href = URL.createObjectURL(blob);
+ lnk.download = "Topology-" + devuiState.applicationInfo.applicationName + "-" + new Date().toISOString().replace(/\D/g,'') + ".png";
+ lnk.click();
+ notifier.showSuccessMessage(lnk.download + " downloaded.", 'bottom-end');
+ });
+ }
+ }
+
_selectDetailsTab() {
this._tabContent = html`