mirror of
https://github.com/umami-software/umami.git
synced 2026-02-05 05:07:15 +01:00
# Conflicts: # db/mysql/schema.prisma # package.json # pnpm-lock.yaml # src/app/(main)/reports/[reportId]/ReportBody.tsx # src/app/(main)/reports/[reportId]/ReportPage.tsx # src/app/(main)/reports/utm/UTMView.tsx # src/app/(main)/websites/[websiteId]/WebsiteMetricsBar.tsx # src/app/(main)/websites/[websiteId]/WebsiteTableView.tsx # src/app/(main)/websites/[websiteId]/events/EventsPage.tsx # src/app/api/reports/[reportId]/route.ts # src/app/api/websites/[websiteId]/metrics/route.ts # src/components/hooks/queries/useReport.ts # src/components/icons.ts # src/components/messages.ts # src/components/metrics/MetricsTable.module.css # src/components/metrics/MetricsTable.tsx # src/queries/sql/events/getEventMetrics.ts # src/queries/sql/reports/getUTM.ts
42 lines
1 KiB
TypeScript
42 lines
1 KiB
TypeScript
import Papa from 'papaparse';
|
|
import { Button, Icon, TooltipTrigger, Tooltip } from '@umami/react-zen';
|
|
import { Download } from '@/components/icons';
|
|
import { useMessages } from '@/components/hooks';
|
|
|
|
export function DownloadButton({
|
|
filename = 'data',
|
|
data,
|
|
}: {
|
|
filename?: string;
|
|
data?: any;
|
|
onClick?: () => void;
|
|
}) {
|
|
const { formatMessage, labels } = useMessages();
|
|
|
|
const handleClick = async () => {
|
|
downloadCsv(`${filename}.csv`, Papa.unparse(data));
|
|
};
|
|
|
|
return (
|
|
<TooltipTrigger delay={0}>
|
|
<Button variant="quiet" onClick={handleClick} isDisabled={!data}>
|
|
<Icon>
|
|
<Download />
|
|
</Icon>
|
|
</Button>
|
|
<Tooltip>{formatMessage(labels.download)}</Tooltip>
|
|
</TooltipTrigger>
|
|
);
|
|
}
|
|
|
|
function downloadCsv(filename: string, data: any) {
|
|
const blob = new Blob([data], { type: 'text/csv' });
|
|
const url = URL.createObjectURL(blob);
|
|
|
|
const a = document.createElement('a');
|
|
a.href = url;
|
|
a.download = filename;
|
|
a.click();
|
|
|
|
URL.revokeObjectURL(url);
|
|
}
|