@prismiq/react 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{CustomSQLEditor-DYeId0Gp.d.ts → ChatBubble-ARocmvZD.d.cts} +48 -4
- package/dist/{CustomSQLEditor-BXB4rf1q.d.cts → ChatBubble-BN_CjIpk.d.ts} +48 -4
- package/dist/{DashboardDialog-B3vYC5Gs.d.ts → DashboardDialog-UhUGXx2h.d.ts} +6 -4
- package/dist/{DashboardDialog-LHmrtNQU.d.cts → DashboardDialog-Z-HypxmG.d.cts} +6 -4
- package/dist/{accessibility-2yy5yqRR.d.cts → accessibility-Bu2mNtaB.d.cts} +1 -1
- package/dist/{accessibility-2yy5yqRR.d.ts → accessibility-Bu2mNtaB.d.ts} +1 -1
- package/dist/charts/index.cjs +27 -27
- package/dist/charts/index.d.cts +2 -2
- package/dist/charts/index.d.ts +2 -2
- package/dist/charts/index.js +2 -2
- package/dist/{chunk-NK7HKX2J.cjs → chunk-73TPDGXB.cjs} +7 -7
- package/dist/{chunk-NK7HKX2J.cjs.map → chunk-73TPDGXB.cjs.map} +1 -1
- package/dist/{chunk-FEABEF3J.cjs → chunk-FKXCINUF.cjs} +551 -299
- package/dist/chunk-FKXCINUF.cjs.map +1 -0
- package/dist/{chunk-2H5WTH4K.js → chunk-FQ23KG6G.js} +3 -3
- package/dist/{chunk-2H5WTH4K.js.map → chunk-FQ23KG6G.js.map} +1 -1
- package/dist/{chunk-UPYINBZU.js → chunk-GELI7MDZ.js} +982 -51
- package/dist/chunk-GELI7MDZ.js.map +1 -0
- package/dist/{chunk-WWTT2OJ5.js → chunk-HKZFEXT6.js} +27 -9
- package/dist/chunk-HKZFEXT6.js.map +1 -0
- package/dist/{chunk-MOAEEF5P.js → chunk-JBJ5LEAG.js} +362 -110
- package/dist/chunk-JBJ5LEAG.js.map +1 -0
- package/dist/{chunk-4AVL6GQK.cjs → chunk-KXB2IZI2.cjs} +36 -9
- package/dist/chunk-KXB2IZI2.cjs.map +1 -0
- package/dist/{chunk-EX74SI67.js → chunk-LBE6GIBC.js} +36 -9
- package/dist/chunk-LBE6GIBC.js.map +1 -0
- package/dist/{chunk-NY6TZLST.cjs → chunk-PG7QBH3G.cjs} +988 -53
- package/dist/chunk-PG7QBH3G.cjs.map +1 -0
- package/dist/{chunk-MDXGGZSW.cjs → chunk-ZYVN6XAZ.cjs} +35 -37
- package/dist/chunk-ZYVN6XAZ.cjs.map +1 -0
- package/dist/components/index.cjs +63 -55
- package/dist/components/index.d.cts +2 -2
- package/dist/components/index.d.ts +2 -2
- package/dist/components/index.js +2 -2
- package/dist/dashboard/index.cjs +36 -36
- package/dist/dashboard/index.d.cts +7 -5
- package/dist/dashboard/index.d.ts +7 -5
- package/dist/dashboard/index.js +4 -4
- package/dist/export/index.cjs +7 -7
- package/dist/export/index.d.cts +6 -4
- package/dist/export/index.d.ts +6 -4
- package/dist/export/index.js +1 -1
- package/dist/{index-C-Qcuu4Y.d.cts → index-B8DelfpL.d.cts} +2 -2
- package/dist/{index-rPc7ijt8.d.ts → index-RbfYPQD_.d.ts} +2 -2
- package/dist/index.cjs +150 -134
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +97 -9
- package/dist/index.d.ts +97 -9
- package/dist/index.js +7 -7
- package/dist/index.js.map +1 -1
- package/dist/{types-WrCbOeAV.d.cts → types-ccB9Ps3k.d.cts} +59 -1
- package/dist/{types-WrCbOeAV.d.ts → types-ccB9Ps3k.d.ts} +59 -1
- package/dist/utils/index.cjs +15 -15
- package/dist/utils/index.d.cts +5 -21
- package/dist/utils/index.d.ts +5 -21
- package/dist/utils/index.js +1 -1
- package/package.json +3 -7
- package/dist/chunk-4AVL6GQK.cjs.map +0 -1
- package/dist/chunk-EX74SI67.js.map +0 -1
- package/dist/chunk-FEABEF3J.cjs.map +0 -1
- package/dist/chunk-MDXGGZSW.cjs.map +0 -1
- package/dist/chunk-MOAEEF5P.js.map +0 -1
- package/dist/chunk-NY6TZLST.cjs.map +0 -1
- package/dist/chunk-UPYINBZU.js.map +0 -1
- package/dist/chunk-WWTT2OJ5.js.map +0 -1
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import * as XLSX from 'xlsx';
|
|
2
1
|
import { useState, useMemo, useCallback } from 'react';
|
|
3
2
|
|
|
4
3
|
// src/export/csv.ts
|
|
@@ -96,6 +95,18 @@ function exportToCSV(data, options) {
|
|
|
96
95
|
const fullFilename = filename.endsWith(".csv") ? filename : `${filename}.csv`;
|
|
97
96
|
downloadFile(csv, fullFilename, "text/csv;charset=utf-8");
|
|
98
97
|
}
|
|
98
|
+
|
|
99
|
+
// src/export/excel.ts
|
|
100
|
+
async function loadXLSX() {
|
|
101
|
+
try {
|
|
102
|
+
return await import('xlsx');
|
|
103
|
+
} catch (err) {
|
|
104
|
+
const detail = err instanceof Error ? `: ${err.message}` : "";
|
|
105
|
+
throw new Error(
|
|
106
|
+
`xlsx is required for Excel export. Install it with: npm install xlsx${detail}`
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
99
110
|
function isQueryResult2(data) {
|
|
100
111
|
return typeof data === "object" && data !== null && "columns" in data && "rows" in data && Array.isArray(data.columns) && Array.isArray(data.rows);
|
|
101
112
|
}
|
|
@@ -127,7 +138,8 @@ function calculateColumnWidth(values) {
|
|
|
127
138
|
}
|
|
128
139
|
return Math.min(Math.max(maxLength + 2, 8), 50);
|
|
129
140
|
}
|
|
130
|
-
function exportToExcel(data, options) {
|
|
141
|
+
async function exportToExcel(data, options) {
|
|
142
|
+
const XLSX = await loadXLSX();
|
|
131
143
|
const { columns: allColumns, rows } = normalizeData2(data);
|
|
132
144
|
const exportColumns = options?.columns ?? allColumns;
|
|
133
145
|
const workbook = XLSX.utils.book_new();
|
|
@@ -148,7 +160,7 @@ function exportToExcel(data, options) {
|
|
|
148
160
|
}
|
|
149
161
|
const worksheet = XLSX.utils.aoa_to_sheet(wsData);
|
|
150
162
|
const colWidths = exportColumns.map((col, index) => {
|
|
151
|
-
if (options?.columnWidths?.[col]) {
|
|
163
|
+
if (options?.columnWidths?.[col] !== void 0) {
|
|
152
164
|
return { wch: options.columnWidths[col] };
|
|
153
165
|
}
|
|
154
166
|
const columnValues = [headers[index], ...rows.map((r) => r[col])];
|
|
@@ -164,7 +176,8 @@ function exportToExcel(data, options) {
|
|
|
164
176
|
const fullFilename = filename.endsWith(".xlsx") ? filename : `${filename}.xlsx`;
|
|
165
177
|
XLSX.writeFile(workbook, fullFilename);
|
|
166
178
|
}
|
|
167
|
-
function exportMultipleSheets(sheets, filename) {
|
|
179
|
+
async function exportMultipleSheets(sheets, filename) {
|
|
180
|
+
const XLSX = await loadXLSX();
|
|
168
181
|
const workbook = XLSX.utils.book_new();
|
|
169
182
|
for (const [sheetName, data] of Object.entries(sheets)) {
|
|
170
183
|
const { columns, rows } = normalizeData2(data);
|
|
@@ -196,6 +209,7 @@ function exportMultipleSheets(sheets, filename) {
|
|
|
196
209
|
function useExport(options) {
|
|
197
210
|
const { data, filename, columns, headers } = options;
|
|
198
211
|
const [isExporting, setIsExporting] = useState(false);
|
|
212
|
+
const [error, setError] = useState(null);
|
|
199
213
|
const canExport = useMemo(() => {
|
|
200
214
|
return data !== null && data.rows.length > 0;
|
|
201
215
|
}, [data]);
|
|
@@ -218,9 +232,10 @@ function useExport(options) {
|
|
|
218
232
|
setIsExporting(false);
|
|
219
233
|
}
|
|
220
234
|
}, [canExport, data, generateFilename, columns, headers]);
|
|
221
|
-
const handleExportExcel = useCallback((excelOptions) => {
|
|
235
|
+
const handleExportExcel = useCallback(async (excelOptions) => {
|
|
222
236
|
if (!canExport || !data) return;
|
|
223
237
|
setIsExporting(true);
|
|
238
|
+
setError(null);
|
|
224
239
|
try {
|
|
225
240
|
const exportOptions = {
|
|
226
241
|
filename: generateFilename(),
|
|
@@ -228,7 +243,9 @@ function useExport(options) {
|
|
|
228
243
|
headers,
|
|
229
244
|
...excelOptions
|
|
230
245
|
};
|
|
231
|
-
exportToExcel(data, exportOptions);
|
|
246
|
+
await exportToExcel(data, exportOptions);
|
|
247
|
+
} catch (err) {
|
|
248
|
+
setError(err instanceof Error ? err : new Error(String(err)));
|
|
232
249
|
} finally {
|
|
233
250
|
setIsExporting(false);
|
|
234
251
|
}
|
|
@@ -237,10 +254,11 @@ function useExport(options) {
|
|
|
237
254
|
exportCSV: handleExportCSV,
|
|
238
255
|
exportExcel: handleExportExcel,
|
|
239
256
|
isExporting,
|
|
240
|
-
canExport
|
|
257
|
+
canExport,
|
|
258
|
+
error
|
|
241
259
|
};
|
|
242
260
|
}
|
|
243
261
|
|
|
244
262
|
export { downloadFile, exportMultipleSheets, exportToCSV, exportToExcel, generateCSV, useExport };
|
|
245
|
-
//# sourceMappingURL=chunk-
|
|
246
|
-
//# sourceMappingURL=chunk-
|
|
263
|
+
//# sourceMappingURL=chunk-HKZFEXT6.js.map
|
|
264
|
+
//# sourceMappingURL=chunk-HKZFEXT6.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/export/csv.ts","../src/export/excel.ts","../src/export/useExport.ts"],"names":["isQueryResult","normalizeData"],"mappings":"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","file":"chunk-HKZFEXT6.js","sourcesContent":["/**\n * CSV export functionality.\n */\n\nimport type { QueryResult } from '../types';\nimport type { ExportData, ExportOptions } from './types';\n\n/**\n * Check if data is a QueryResult.\n */\nfunction isQueryResult(data: ExportData): data is QueryResult {\n return (\n typeof data === 'object' &&\n data !== null &&\n 'columns' in data &&\n 'rows' in data &&\n Array.isArray((data as QueryResult).columns) &&\n Array.isArray((data as QueryResult).rows)\n );\n}\n\n/**\n * Convert data to array of objects format.\n */\nfunction normalizeData(data: ExportData): {\n columns: string[];\n rows: Record<string, unknown>[];\n} {\n if (isQueryResult(data)) {\n const rows = data.rows.map((row) => {\n const obj: Record<string, unknown> = {};\n data.columns.forEach((col, index) => {\n obj[col] = row[index];\n });\n return obj;\n });\n return { columns: data.columns, rows };\n }\n\n if (Array.isArray(data) && data.length > 0) {\n const firstRow = data[0];\n if (firstRow && typeof firstRow === 'object') {\n const columns = Object.keys(firstRow);\n return { columns, rows: data };\n }\n }\n\n return { columns: [], rows: [] };\n}\n\n/**\n * Escape a value for CSV.\n *\n * Handles:\n * - Commas (wrap in quotes)\n * - Quotes (double them)\n * - Newlines (wrap in quotes)\n * - Leading/trailing whitespace (wrap in quotes)\n */\nfunction escapeCSVValue(value: unknown): string {\n if (value === null || value === undefined) {\n return '';\n }\n\n const stringValue = String(value);\n\n // Check if we need to quote the value\n const needsQuoting =\n stringValue.includes(',') ||\n stringValue.includes('\"') ||\n stringValue.includes('\\n') ||\n stringValue.includes('\\r') ||\n stringValue.startsWith(' ') ||\n stringValue.endsWith(' ');\n\n if (needsQuoting) {\n // Double any existing quotes and wrap in quotes\n return `\"${stringValue.replace(/\"/g, '\"\"')}\"`;\n }\n\n return stringValue;\n}\n\n/**\n * Format a value for CSV export.\n */\nfunction formatValue(\n value: unknown,\n options?: ExportOptions\n): string {\n if (value === null || value === undefined) {\n return '';\n }\n\n // Handle dates\n if (value instanceof Date) {\n if (options?.dateFormat) {\n // Simple date formatting (could be extended with a library)\n return value.toISOString();\n }\n return value.toISOString();\n }\n\n // Handle numbers\n if (typeof value === 'number') {\n if (options?.numberFormat) {\n return new Intl.NumberFormat(undefined, options.numberFormat).format(value);\n }\n return String(value);\n }\n\n // Handle booleans\n if (typeof value === 'boolean') {\n return value ? 'true' : 'false';\n }\n\n // Handle objects/arrays\n if (typeof value === 'object') {\n return JSON.stringify(value);\n }\n\n return String(value);\n}\n\n/**\n * Generate CSV content from data.\n *\n * @param data - Array of row objects\n * @param columns - Column names\n * @param headers - Custom header names\n * @param options - Export options\n * @returns CSV string\n */\nexport function generateCSV(\n data: Record<string, unknown>[],\n columns: string[],\n headers?: Record<string, string>,\n options?: ExportOptions\n): string {\n const lines: string[] = [];\n\n // Header row\n const headerRow = columns.map((col) => {\n const headerName = headers?.[col] ?? col;\n return escapeCSVValue(headerName);\n });\n lines.push(headerRow.join(','));\n\n // Data rows\n for (const row of data) {\n const rowValues = columns.map((col) => {\n const value = row[col];\n const formatted = formatValue(value, options);\n return escapeCSVValue(formatted);\n });\n lines.push(rowValues.join(','));\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Trigger a file download in the browser.\n *\n * @param content - File content\n * @param filename - File name with extension\n * @param mimeType - MIME type\n */\nexport function downloadFile(\n content: string,\n filename: string,\n mimeType: string\n): void {\n // Create blob\n const blob = new Blob([content], { type: mimeType });\n\n // Create download link\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = filename;\n\n // Trigger download\n document.body.appendChild(link);\n link.click();\n\n // Cleanup\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n}\n\n/**\n * Export data to CSV and trigger download.\n *\n * @param data - QueryResult or array of objects\n * @param options - Export options\n *\n * @example\n * ```tsx\n * // Export query result\n * exportToCSV(queryResult, { filename: 'sales-report' });\n *\n * // Export with custom columns\n * exportToCSV(data, {\n * columns: ['id', 'name', 'value'],\n * headers: { id: 'ID', name: 'Name', value: 'Value' }\n * });\n * ```\n */\nexport function exportToCSV(\n data: ExportData,\n options?: ExportOptions\n): void {\n const { columns: allColumns, rows } = normalizeData(data);\n\n // Use specified columns or all columns\n const exportColumns = options?.columns ?? allColumns;\n\n // Generate CSV\n const csv = generateCSV(rows, exportColumns, options?.headers, options);\n\n // Generate filename\n const filename = options?.filename ?? 'export';\n const fullFilename = filename.endsWith('.csv') ? filename : `${filename}.csv`;\n\n // Download\n downloadFile(csv, fullFilename, 'text/csv;charset=utf-8');\n}\n","/**\n * Excel export functionality.\n *\n * Uses the xlsx library (SheetJS) for Excel file generation.\n */\n\nimport type { QueryResult } from '../types';\nimport type { ExcelExportOptions, ExportData } from './types';\n\ntype XLSXModule = typeof import('xlsx');\n\nasync function loadXLSX(): Promise<XLSXModule> {\n try {\n return await import('xlsx');\n } catch (err) {\n const detail = err instanceof Error ? `: ${err.message}` : '';\n throw new Error(\n `xlsx is required for Excel export. Install it with: npm install xlsx${detail}`\n );\n }\n}\n\n/**\n * Check if data is a QueryResult.\n */\nfunction isQueryResult(data: ExportData): data is QueryResult {\n return (\n typeof data === 'object' &&\n data !== null &&\n 'columns' in data &&\n 'rows' in data &&\n Array.isArray((data as QueryResult).columns) &&\n Array.isArray((data as QueryResult).rows)\n );\n}\n\n/**\n * Convert data to array of objects format.\n */\nfunction normalizeData(data: ExportData): {\n columns: string[];\n rows: Record<string, unknown>[];\n} {\n if (isQueryResult(data)) {\n const rows = data.rows.map((row) => {\n const obj: Record<string, unknown> = {};\n data.columns.forEach((col, index) => {\n obj[col] = row[index];\n });\n return obj;\n });\n return { columns: data.columns, rows };\n }\n\n if (Array.isArray(data) && data.length > 0) {\n const firstRow = data[0];\n if (firstRow && typeof firstRow === 'object') {\n const columns = Object.keys(firstRow);\n return { columns, rows: data };\n }\n }\n\n return { columns: [], rows: [] };\n}\n\n/**\n * Calculate optimal column width based on content.\n */\nfunction calculateColumnWidth(values: unknown[]): number {\n let maxLength = 0;\n\n for (const value of values) {\n const strValue = value === null || value === undefined ? '' : String(value);\n maxLength = Math.max(maxLength, strValue.length);\n }\n\n // Add some padding and cap at reasonable max\n return Math.min(Math.max(maxLength + 2, 8), 50);\n}\n\n/**\n * Export data to Excel and trigger download.\n *\n * @param data - QueryResult or array of objects\n * @param options - Export options\n *\n * @example\n * ```tsx\n * // Basic export\n * exportToExcel(queryResult, { filename: 'sales-report' });\n *\n * // With styling\n * exportToExcel(data, {\n * filename: 'report',\n * sheetName: 'Sales Data',\n * freezeHeader: true,\n * headerStyle: { bold: true, fill: '#e3f2fd', align: 'center' }\n * });\n * ```\n */\nexport async function exportToExcel(\n data: ExportData,\n options?: ExcelExportOptions\n): Promise<void> {\n const XLSX = await loadXLSX();\n const { columns: allColumns, rows } = normalizeData(data);\n\n // Use specified columns or all columns\n const exportColumns = options?.columns ?? allColumns;\n\n // Create workbook and worksheet\n const workbook = XLSX.utils.book_new();\n\n // Prepare data with headers\n const headers = exportColumns.map(col => options?.headers?.[col] ?? col);\n\n // Convert rows to array format for the worksheet\n const wsData: unknown[][] = [headers];\n\n for (const row of rows) {\n const rowData = exportColumns.map(col => {\n const value = row[col];\n // Handle special types\n if (value instanceof Date) {\n return value;\n }\n if (typeof value === 'object' && value !== null) {\n return JSON.stringify(value);\n }\n return value;\n });\n wsData.push(rowData);\n }\n\n // Create worksheet from data\n const worksheet = XLSX.utils.aoa_to_sheet(wsData);\n\n // Set column widths\n const colWidths = exportColumns.map((col, index) => {\n // Use custom width if specified\n if (options?.columnWidths?.[col] !== undefined) {\n return { wch: options.columnWidths[col] };\n }\n\n // Calculate width from content\n const columnValues = [headers[index], ...rows.map(r => r[col])];\n return { wch: calculateColumnWidth(columnValues) };\n });\n worksheet['!cols'] = colWidths;\n\n // Freeze header row if requested\n if (options?.freezeHeader) {\n worksheet['!freeze'] = { xSplit: 0, ySplit: 1 };\n }\n\n // Add worksheet to workbook\n const sheetName = options?.sheetName ?? 'Sheet1';\n XLSX.utils.book_append_sheet(workbook, worksheet, sheetName);\n\n // Generate filename\n const filename = options?.filename ?? 'export';\n const fullFilename = filename.endsWith('.xlsx') ? filename : `${filename}.xlsx`;\n\n // Write and download\n XLSX.writeFile(workbook, fullFilename);\n}\n\n/**\n * Export multiple sheets to a single Excel file.\n *\n * @param sheets - Object mapping sheet names to data\n * @param filename - Output filename\n *\n * @example\n * ```tsx\n * exportMultipleSheets({\n * 'Sales': salesData,\n * 'Customers': customerData,\n * 'Products': productData,\n * }, 'full-report');\n * ```\n */\nexport async function exportMultipleSheets(\n sheets: Record<string, ExportData>,\n filename: string\n): Promise<void> {\n const XLSX = await loadXLSX();\n const workbook = XLSX.utils.book_new();\n\n for (const [sheetName, data] of Object.entries(sheets)) {\n const { columns, rows } = normalizeData(data);\n\n // Prepare data with headers\n const wsData: unknown[][] = [columns];\n\n for (const row of rows) {\n const rowData = columns.map(col => {\n const value = row[col];\n if (value instanceof Date) {\n return value;\n }\n if (typeof value === 'object' && value !== null) {\n return JSON.stringify(value);\n }\n return value;\n });\n wsData.push(rowData);\n }\n\n const worksheet = XLSX.utils.aoa_to_sheet(wsData);\n\n // Auto-size columns\n const colWidths = columns.map((col, index) => {\n const columnValues = [columns[index], ...rows.map(r => r[col])];\n return { wch: calculateColumnWidth(columnValues) };\n });\n worksheet['!cols'] = colWidths;\n\n XLSX.utils.book_append_sheet(workbook, worksheet, sheetName);\n }\n\n const fullFilename = filename.endsWith('.xlsx') ? filename : `${filename}.xlsx`;\n XLSX.writeFile(workbook, fullFilename);\n}\n","'use client';\n\nimport { useCallback, useMemo, useState } from 'react';\nimport type { QueryResult } from '../types';\nimport { exportToCSV } from './csv';\nimport { exportToExcel } from './excel';\nimport type { ExcelExportOptions, ExportOptions } from './types';\n\n/**\n * Options for the useExport hook.\n */\nexport interface UseExportOptions {\n /** Data to export */\n data: QueryResult | null;\n /** Default filename for exports */\n filename?: string;\n /** Columns to export (defaults to all) */\n columns?: string[];\n /** Custom column headers */\n headers?: Record<string, string>;\n}\n\n/**\n * Result of the useExport hook.\n */\nexport interface UseExportResult {\n /** Export to CSV file */\n exportCSV: () => void;\n /** Export to Excel file */\n exportExcel: (options?: ExcelExportOptions) => Promise<void>;\n /** Whether an export is in progress */\n isExporting: boolean;\n /** Whether export is possible (data is available) */\n canExport: boolean;\n /** Error from the most recent export attempt, if any */\n error: Error | null;\n}\n\n/**\n * Hook for exporting query data to CSV or Excel.\n *\n * @param options - Export options\n * @returns Export functions and state\n *\n * @example\n * ```tsx\n * function DataTable({ data }) {\n * const { exportCSV, exportExcel, canExport, isExporting } = useExport({\n * data,\n * filename: 'sales-report',\n * columns: ['id', 'name', 'amount'],\n * headers: { id: 'ID', name: 'Name', amount: 'Amount' }\n * });\n *\n * return (\n * <div>\n * <button onClick={exportCSV} disabled={!canExport || isExporting}>\n * Export CSV\n * </button>\n * <button onClick={() => exportExcel()} disabled={!canExport || isExporting}>\n * Export Excel\n * </button>\n * {isExporting && <span>Exporting...</span>}\n * </div>\n * );\n * }\n * ```\n */\nexport function useExport(options: UseExportOptions): UseExportResult {\n const { data, filename, columns, headers } = options;\n const [isExporting, setIsExporting] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n // Check if export is possible\n const canExport = useMemo(() => {\n return data !== null && data.rows.length > 0;\n }, [data]);\n\n // Generate timestamp for filename\n const generateFilename = useCallback(() => {\n const base = filename ?? 'export';\n const timestamp = new Date().toISOString().slice(0, 10);\n return `${base}-${timestamp}`;\n }, [filename]);\n\n // Export to CSV\n const handleExportCSV = useCallback(() => {\n if (!canExport || !data) return;\n\n setIsExporting(true);\n try {\n const exportOptions: ExportOptions = {\n filename: generateFilename(),\n columns,\n headers,\n };\n exportToCSV(data, exportOptions);\n } finally {\n setIsExporting(false);\n }\n }, [canExport, data, generateFilename, columns, headers]);\n\n // Export to Excel\n const handleExportExcel = useCallback(async (excelOptions?: ExcelExportOptions) => {\n if (!canExport || !data) return;\n\n setIsExporting(true);\n setError(null);\n try {\n const exportOptions: ExcelExportOptions = {\n filename: generateFilename(),\n columns,\n headers,\n ...excelOptions,\n };\n await exportToExcel(data, exportOptions);\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)));\n } finally {\n setIsExporting(false);\n }\n }, [canExport, data, generateFilename, columns, headers]);\n\n return {\n exportCSV: handleExportCSV,\n exportExcel: handleExportExcel,\n isExporting,\n canExport,\n error,\n };\n}\n\nexport default useExport;\n"]}
|