github.com/turbot/steampipe@v1.7.0-rc.0.0.20240517123944-7cef272d4458/ui/dashboard/src/hooks/useDownloadPanelData.ts (about) 1 import { PanelDefinition } from "../types"; 2 import { saveAs } from "file-saver"; 3 import { timestampForFilename } from "../utils/date"; 4 import { useCallback, useState } from "react"; 5 import { useDashboard } from "./useDashboard"; 6 import { usePapaParse } from "react-papaparse"; 7 8 const useDownloadPanelData = (definition: PanelDefinition) => { 9 const { selectedDashboard } = useDashboard(); 10 const { jsonToCSV } = usePapaParse(); 11 const [processing, setProcessing] = useState(false); 12 13 const downloadQueryData = useCallback(async () => { 14 if (!definition.data) { 15 return; 16 } 17 setProcessing(true); 18 const data = definition.data; 19 const colNames = data.columns.map((c) => c.name); 20 let csvRows: any[] = []; 21 22 const jsonbColIndices = data.columns 23 .filter((i) => i.data_type === "JSONB") 24 .map((i) => data.columns.indexOf(i)); // would return e.g. [3,6,9] 25 26 for (const row of data.rows) { 27 // Deep copy the row or else it will update 28 // the values in query output 29 const csvRow: any[] = []; 30 colNames.forEach((col, index) => { 31 csvRow[index] = jsonbColIndices.includes(index) 32 ? JSON.stringify(row[col]) 33 : row[col]; 34 }); 35 csvRows.push(csvRow); 36 } 37 38 const csv = jsonToCSV([colNames, ...csvRows]); 39 const blob = new Blob([csv], { type: "text/csv;charset=utf-8" }); 40 41 saveAs( 42 blob, 43 `${( 44 selectedDashboard?.full_name || 45 definition.dashboard || 46 "" 47 ).replaceAll(".", "_")}_${definition.panel_type}_${timestampForFilename( 48 Date.now() 49 )}.csv` 50 ); 51 setProcessing(false); 52 }, [definition, jsonToCSV, selectedDashboard]); 53 54 return { download: downloadQueryData, processing }; 55 }; 56 57 export default useDownloadPanelData;