From 82d7057d53bd5360e7a6f628894efb47c15d3e6b Mon Sep 17 00:00:00 2001
From: Sjoerd <svink@graphpolaris.com>
Date: Tue, 5 Nov 2024 08:59:40 +0000
Subject: [PATCH] feat: screenshot button for query builder

---
 .../lib/querybuilder/panel/QueryBuilder.tsx   | 20 ++++++++++++++++++-
 1 file changed, 19 insertions(+), 1 deletion(-)

diff --git a/libs/shared/lib/querybuilder/panel/QueryBuilder.tsx b/libs/shared/lib/querybuilder/panel/QueryBuilder.tsx
index ad0ff3253..cb27bb409 100644
--- a/libs/shared/lib/querybuilder/panel/QueryBuilder.tsx
+++ b/libs/shared/lib/querybuilder/panel/QueryBuilder.tsx
@@ -45,6 +45,7 @@ import { ConnectingNodeDataI } from './utils/connectorDrop';
 import { resultSetFocus } from '../../data-access/store/interactionSlice';
 import { QueryBuilderDispatcherContext } from './QueryBuilderDispatcher';
 import { QueryBuilderNav, QueryBuilderToggleSettings } from './QueryBuilderNav';
+import html2canvas from 'html2canvas';
 import { ContextMenu } from './ContextMenu';
 
 export type QueryBuilderProps = {
@@ -57,6 +58,7 @@ export type QueryBuilderProps = {
 export const QueryBuilderInner = (props: QueryBuilderProps) => {
   const [toggleSettings, setToggleSettings] = useState<QueryBuilderToggleSettings>();
   const reactFlowWrapper = useRef<HTMLDivElement>(null);
+  const reactFlowRef = useRef<HTMLDivElement>(null);
   const queryBuilderSettings = useQuerybuilderSettings();
   const saveStateAuthorization = useActiveSaveStateAuthorization();
 
@@ -504,6 +506,21 @@ export const QueryBuilderInner = (props: QueryBuilderProps) => {
     }
   }, [queryBuilderSettings]);
 
+  const handleScreenshot = async () => {
+    if (reactFlowRef.current) {
+      try {
+        const canvas = await html2canvas(reactFlowRef.current);
+        const screenshotUrl = canvas.toDataURL('image/jpeg');
+        const link = document.createElement('a');
+        link.href = screenshotUrl;
+        link.download = 'querybuilder.png';
+        link.click();
+      } catch (error) {
+        dispatch(addError('Screenshot failed.'));
+      }
+    }
+  };
+
   return (
     <QueryBuilderDispatcherContext.Provider
       value={{
@@ -543,7 +560,7 @@ export const QueryBuilderInner = (props: QueryBuilderProps) => {
           onRunQuery={() => {
             if (props.onRunQuery) props.onRunQuery();
           }}
-          onScreenshot={() => {}}
+          onScreenshot={handleScreenshot}
           onLogic={() => {
             if (toggleSettings === 'logic') setToggleSettings(undefined);
             else setToggleSettings('logic');
@@ -602,6 +619,7 @@ export const QueryBuilderInner = (props: QueryBuilderProps) => {
           </defs>
         </svg>
         <ReactFlow
+          ref={reactFlowRef}
           edges={elements.edges}
           nodes={elements.nodes}
           snapGrid={[10, 10]}
-- 
GitLab