Skip to content

Commit

Permalink
Export data table as CSV
Browse files Browse the repository at this point in the history
  • Loading branch information
Odonno committed Feb 5, 2025
1 parent 35d1a62 commit fb349d6
Showing 1 changed file with 45 additions and 1 deletion.
46 changes: 45 additions & 1 deletion src/screens/surrealist/views/query/ResultPane/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,13 @@ import {
iconList,
iconLive,
iconQuery,
iconUpload,
} from "~/util/icons";

import type { SelectionRange } from "@codemirror/state";
import type { EditorView } from "@codemirror/view";
import { unparse } from "papaparse";
import { isArray, isObject } from "radash";
import { useMemo, useState } from "react";
import { useLayoutEffect } from "react";
import { isMini } from "~/adapter";
Expand Down Expand Up @@ -75,6 +78,7 @@ export function ResultPane({ activeTab, selection, editor, corners }: ResultPane

const isLight = useIsLight();
const [resultTab, setResultTab] = useState<number>(1);
const selectedTab = resultTab - 1;
const resultMode = activeTab.resultMode;
const resultFormat = activeTab.resultFormat;
const responses = responseMap[activeTab.id] || [];
Expand Down Expand Up @@ -141,6 +145,33 @@ export function ResultPane({ activeTab, selection, editor, corners }: ResultPane

const showFormat = !isMini && (resultMode === "combined" || resultMode === "single");

const selectedResponse = responses[selectedTab] ?? { result: null };
const isExportVisible = resultMode === "table";
const canExport = useMemo(() => {
return (
isExportVisible &&
isArray(selectedResponse.result) &&
selectedResponse.result.length > 0 &&
selectedResponse.result.every((r) => isObject(r))
);
}, [isExportVisible, selectedResponse.result]);

const exportAsCsv = useStable(() => {
const csvContent = unparse(selectedResponse.result);

const blob = new Blob([csvContent], { type: "text/csv" });

const url = URL.createObjectURL(blob);
const link = document.createElement("a");
link.href = url;
link.download = "export.csv";

document.body.appendChild(link);
link.click();
document.body.removeChild(link);
URL.revokeObjectURL(url);
});

return (
<ContentPane
title={panelTitle}
Expand All @@ -153,6 +184,19 @@ export function ResultPane({ activeTab, selection, editor, corners }: ResultPane
wrap="nowrap"
className={classes.controls}
>
{isExportVisible ? (
<Button
onClick={exportAsCsv}
variant="light"
size="xs"
radius="sm"
leftSection={<Icon path={iconUpload} />}
disabled={!canExport}
>
Export as CSV
</Button>
) : null}

{resultMode === "live" ? (
isLive && (
<Button
Expand Down Expand Up @@ -319,7 +363,7 @@ export function ResultPane({ activeTab, selection, editor, corners }: ResultPane
) : (
<Preview
responses={responses}
selected={resultTab - 1}
selected={selectedTab}
query={activeTab}
isLive={isLive}
/>
Expand Down

0 comments on commit fb349d6

Please sign in to comment.