From a790caeefcf4eca42e3a8eef357dbc94cce4d710 Mon Sep 17 00:00:00 2001 From: Mehmet Salih Yavuz Date: Fri, 3 Oct 2025 21:10:59 +0300 Subject: [PATCH 1/3] fix(explore): Include chart canvases in the screenshot --- .../useExploreAdditionalActionsMenu/index.jsx | 1 + .../src/utils/downloadAsImage.ts | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/index.jsx b/superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/index.jsx index 19278a747b9d..fdc85dd248f5 100644 --- a/superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/index.jsx +++ b/superset-frontend/src/explore/components/useExploreAdditionalActionsMenu/index.jsx @@ -393,6 +393,7 @@ export const useExploreAdditionalActionsMenu = ( '.panel-body .chart-container', slice?.slice_name ?? t('New chart'), true, + theme, )(e.domEvent); setIsDropdownVisible(false); dispatch( diff --git a/superset-frontend/src/utils/downloadAsImage.ts b/superset-frontend/src/utils/downloadAsImage.ts index e8e36bc27e88..cd4633e59d6f 100644 --- a/superset-frontend/src/utils/downloadAsImage.ts +++ b/superset-frontend/src/utils/downloadAsImage.ts @@ -205,11 +205,30 @@ const processCloneForVisibility = (clone: HTMLElement) => { }); }; +const preserveCanvasContent = (original: Element, clone: Element) => { + const originalCanvases = original.querySelectorAll('canvas'); + const clonedCanvases = clone.querySelectorAll('canvas'); + + for (let i = 0; i < originalCanvases.length; i++) { + if (originalCanvases[i] && clonedCanvases[i]) { + const originalCanvas = originalCanvases[i] as HTMLCanvasElement; + const clonedCanvas = clonedCanvases[i] as HTMLCanvasElement; + const ctx = clonedCanvas.getContext('2d'); + if (ctx) { + clonedCanvas.width = originalCanvas.width; + clonedCanvas.height = originalCanvas.height; + ctx.drawImage(originalCanvas, 0, 0); + } + } + } +}; + const createEnhancedClone = ( originalElement: Element, ): { clone: HTMLElement; cleanup: () => void } => { const clone = originalElement.cloneNode(true) as HTMLElement; copyAllComputedStyles(originalElement, clone); + preserveCanvasContent(originalElement, clone); const tempContainer = document.createElement('div'); tempContainer.style.cssText = ` From 57e6bf95264d448e1fd81f596fb1cb5c297c6f83 Mon Sep 17 00:00:00 2001 From: Mehmet Salih Yavuz Date: Fri, 3 Oct 2025 21:24:37 +0300 Subject: [PATCH 2/3] fix: ci --- superset-frontend/src/utils/downloadAsImage.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/superset-frontend/src/utils/downloadAsImage.ts b/superset-frontend/src/utils/downloadAsImage.ts index cd4633e59d6f..5dc91e73ca5b 100644 --- a/superset-frontend/src/utils/downloadAsImage.ts +++ b/superset-frontend/src/utils/downloadAsImage.ts @@ -208,7 +208,7 @@ const processCloneForVisibility = (clone: HTMLElement) => { const preserveCanvasContent = (original: Element, clone: Element) => { const originalCanvases = original.querySelectorAll('canvas'); const clonedCanvases = clone.querySelectorAll('canvas'); - + for (let i = 0; i < originalCanvases.length; i++) { if (originalCanvases[i] && clonedCanvases[i]) { const originalCanvas = originalCanvases[i] as HTMLCanvasElement; From 61d4297e4f56fcfd0c9034964aaa7db68c3080f0 Mon Sep 17 00:00:00 2001 From: Mehmet Salih Yavuz Date: Mon, 6 Oct 2025 14:05:17 +0300 Subject: [PATCH 3/3] fix: foreach --- superset-frontend/src/utils/downloadAsImage.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/superset-frontend/src/utils/downloadAsImage.ts b/superset-frontend/src/utils/downloadAsImage.ts index 5dc91e73ca5b..7fd2ecad6856 100644 --- a/superset-frontend/src/utils/downloadAsImage.ts +++ b/superset-frontend/src/utils/downloadAsImage.ts @@ -209,9 +209,8 @@ const preserveCanvasContent = (original: Element, clone: Element) => { const originalCanvases = original.querySelectorAll('canvas'); const clonedCanvases = clone.querySelectorAll('canvas'); - for (let i = 0; i < originalCanvases.length; i++) { + originalCanvases.forEach((originalCanvas, i) => { if (originalCanvases[i] && clonedCanvases[i]) { - const originalCanvas = originalCanvases[i] as HTMLCanvasElement; const clonedCanvas = clonedCanvases[i] as HTMLCanvasElement; const ctx = clonedCanvas.getContext('2d'); if (ctx) { @@ -220,7 +219,7 @@ const preserveCanvasContent = (original: Element, clone: Element) => { ctx.drawImage(originalCanvas, 0, 0); } } - } + }); }; const createEnhancedClone = (