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..7fd2ecad6856 100644 --- a/superset-frontend/src/utils/downloadAsImage.ts +++ b/superset-frontend/src/utils/downloadAsImage.ts @@ -205,11 +205,29 @@ const processCloneForVisibility = (clone: HTMLElement) => { }); }; +const preserveCanvasContent = (original: Element, clone: Element) => { + const originalCanvases = original.querySelectorAll('canvas'); + const clonedCanvases = clone.querySelectorAll('canvas'); + + originalCanvases.forEach((originalCanvas, i) => { + if (originalCanvases[i] && clonedCanvases[i]) { + 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 = `