initiall commit

This commit is contained in:
Tomas Dvorak committed 2026-04-10 12:03:31 +02:00
commit 7ddfb1f52b
276 files changed
+37629

No files matched your search

+108
View File
@@ -0,0 +1,108 @@
/**
* Export utilities for downloading data in various formats
*/
/**
* Export data as JSON file
*/
export function exportJSON(data: any, filename: string) {
const json = JSON.stringify(data, null, 2);
const blob = new Blob([json], { type: "application/json" });
downloadBlob(blob, `${filename}.json`);
}
/**
* Export data as CSV file
*/
export function exportCSV(data: any[], filename: string, headers?: string[]) {
if (data.length === 0) {
throw new Error("No data to export");
}
// Get headers from first object if not provided
const csvHeaders = headers || Object.keys(data[0]);
// Create CSV content
const csvRows = [
csvHeaders.join(","), // Header row
...data.map(row =>
csvHeaders.map(header => {
const value = row[header];
// Escape quotes and wrap in quotes if contains comma or quote
const stringValue = String(value ?? "");
if (stringValue.includes(",") || stringValue.includes('"') || stringValue.includes("\n")) {
return `"${stringValue.replace(/"/g, '""')}"`;
}
return stringValue;
}).join(",")
)
];
const csv = csvRows.join("\n");
const blob = new Blob([csv], { type: "text/csv" });
downloadBlob(blob, `${filename}.csv`);
}
/**
* Export data as text file
*/
export function exportText(text: string, filename: string) {
const blob = new Blob([text], { type: "text/plain" });
downloadBlob(blob, `${filename}.txt`);
}
/**
* Download a blob as a file
*/
function downloadBlob(blob: Blob, filename: string) {
const url = URL.createObjectURL(blob);
const link = document.createElement("a");
link.href = url;
link.download = filename;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
URL.revokeObjectURL(url);
}
/**
* Copy text to clipboard
*/
export async function copyToClipboard(text: string): Promise<boolean> {
try {
await navigator.clipboard.writeText(text);
return true;
} catch (err) {
// Fallback for older browsers
const textarea = document.createElement("textarea");
textarea.value = text;
textarea.style.position = "fixed";
textarea.style.opacity = "0";
document.body.appendChild(textarea);
textarea.select();
const success = document.execCommand("copy");
document.body.removeChild(textarea);
return success;
}
}
/**
* Format data for export with timestamps
*/
export function prepareExportData(data: any[], includeTimestamp = true) {
if (!includeTimestamp) return data;
return data.map(item => ({
...item,
exported_at: new Date().toISOString(),
}));
}
/**
* Generate filename with timestamp
*/
export function generateFilename(base: string, extension?: string): string {
const timestamp = new Date().toISOString().replace(/[:.]/g, "-").slice(0, -5);
const ext = extension ? `.${extension}` : "";
return `${base}_${timestamp}${ext}`;
}