diff --git a/web/pgadmin/misc/static/explain/js/explain.js b/web/pgadmin/misc/static/explain/js/explain.js
index a3a0ff4f9..da50040fd 100644
--- a/web/pgadmin/misc/static/explain/js/explain.js
+++ b/web/pgadmin/misc/static/explain/js/explain.js
@@ -937,7 +937,7 @@ define('pgadmin.misc.explain', [
drawImage: function(
g, image_content, currentXpos, currentYpos, graphContainer,
- toolTipContainer
+ toolTipContainer, downloadSVG=false
) {
// Draw the actual image for current node
var image = g.image(
@@ -955,6 +955,73 @@ define('pgadmin.misc.explain', [
// Draw tooltip
var image_data = this.toJSON(),
nodeLabel = this.getLabel();
+
+ if (downloadSVG) {
+ var title = '
';
+ _.each(image_data, function (value, key) {
+ if (
+ key !== 'image' &&
+ key !== 'Plans' &&
+ key !== 'level' &&
+ key !== 'image' &&
+ key !== 'image_text' &&
+ key !== 'xpos' &&
+ key !== 'ypos' &&
+ key !== 'width' &&
+ key !== 'height'
+ ) {
+ title += `${key}: ${value}\n`;
+ }
+ });
+
+ title += '';
+
+ image.append(Snap.parse(title));
+
+ image.mouseover(() => {
+ // Empty the tooltip content if it has any and add new data
+ let toolTipBody = toolTipContainer.find('.details-body');
+ let toolTipTitle = toolTipContainer.find('.details-title');
+ toolTipTitle.text(nodeLabel);
+
+ toolTipBody.empty();
+
+ // Remove the title content so that we can show our custom build tooltips.
+ image.node.textContent = '';
+
+ var tooltipTable = $(`
+ `).appendTo(toolTipBody);
+ var tooltip = tooltipTable.find('tbody');
+
+ _.each(image_data, function (value, key) {
+ if (
+ key !== 'image' &&
+ key !== 'Plans' &&
+ key !== 'level' &&
+ key !== 'image' &&
+ key !== 'image_text' &&
+ key !== 'xpos' &&
+ key !== 'ypos' &&
+ key !== 'width' &&
+ key !== 'height'
+ ) {
+ key = _.escape(key);
+ value = _.escape(value);
+ tooltip.append(`
+
+ | ${key} |
+ ${value} |
+
+ `);
+ }
+ });
+ toolTipContainer.removeClass('d-none');
+ toolTipBody.scrollTop(0);
+ });
+ }
+
image.click(() => {
// Empty the tooltip content if it has any and add new data
let toolTipBody = toolTipContainer.find('.details-body');
@@ -1033,10 +1100,11 @@ define('pgadmin.misc.explain', [
var onSVGLoaded = function(data) {
var svg_image = Snap();
svg_image.append(data);
+ var downloadSVG = true;
that.drawImage(
g, svg_image.toDataURL(), startX, startY, graphContainer,
- toolTipContainer
+ toolTipContainer, downloadSVG
);
// This attribute is required to download the file as SVG image.