import { GFCol } from "@/gen/utils"; import { useLocal } from "@/utils/use-local"; import { ChangeEvent, FC, MouseEvent } from "react"; import * as XLSX from "xlsx"; type ImportExcelProps = { gen_fields: string[]; gen_table: string; }; export const ImportExcel: FC = ({ gen_fields, gen_table, }) => { const local = useLocal({ data: [] as any[], columns: [] as string[], fields: [] as string[], tableName: "", selectedRows: [] as { pk: string | number; rows: any; }[], pk: null as null | GFCol, columnMappings: [] as { column: string; selectedColumn: string }[], isLoading: false, progress: 0, showPreviewExcel: false, insertedData: [] as any[] }); const pk = local.pk?.name || "id"; const getAllKeys = (arr: Array>): string[] => { const keysSet = new Set(); arr.forEach((obj) => { Object.keys(obj).forEach((key) => keysSet.add(key)); }); return Array.from(keysSet); }; const handleFileUpload = (e: ChangeEvent) => { const file = e.target.files?.[0]; if (!file) return; const reader = new FileReader(); reader.onload = (event: ProgressEvent) => { if (!event.target?.result) return; const workbook = XLSX.read(event.target.result, { type: "binary" }); const sheetName = workbook.SheetNames[0]; const sheet = workbook.Sheets[sheetName]; const sheetData = XLSX.utils.sheet_to_json(sheet); local.data = sheetData; local.columns = getAllKeys(local.data); gen_fields.forEach((data: any) => { local.fields.push(JSON.parse(data).name); }); local.tableName = gen_table; local.showPreviewExcel = true; local.render(); }; reader.readAsBinaryString(file); }; const executeImport = async (e: MouseEvent) => { e.preventDefault(); const table = (db as any)[local.tableName]; if (table) { local.showPreviewExcel = false; local.isLoading = true; local.progress = 0; local.insertedData = []; local.render(); const totalRows = local.selectedRows.length; let processedRows = 0; for (const row of local.selectedRows) { let insertRow: any = {}; local.columnMappings.forEach((columnMapping) => { insertRow[columnMapping.selectedColumn] = row.rows[columnMapping.column]; }); let insertedData = await table.create({ data: insertRow }); local.insertedData.push(insertedData); local.render(); processedRows++; local.progress = Math.round((processedRows / totalRows) * 100); local.render(); } local.isLoading = false; local.render(); } }; const headerCheckboxClick = (e: ChangeEvent) => { if (e.target.checked) { local.data.forEach((data) => { local.selectedRows.push({ pk: data[pk], rows: data, }); }); local.render(); console.log("Select All", local.selectedRows); } else { local.selectedRows = []; local.render(); console.log("Deselect all", local.selectedRows); } }; const checkboxClick = (rowId: any) => (e: MouseEvent) => { e.preventDefault(); e.stopPropagation(); const checked = !!local.selectedRows.find((data) => data.pk === rowId); console.log(checked); if (!checked) { const checkedRowData = local.data.filter((row) => row[pk] === rowId); local.selectedRows.push({ pk: rowId, rows: checkedRowData, }); local.render(); console.log("selected", local.selectedRows); } else { local.selectedRows = local.selectedRows.filter( (data) => data.pk !== rowId ); local.render(); console.log("deselected", local.selectedRows); } }; const columnMappingChange = (col: string) => (e: ChangeEvent) => { const selectedValue = e.target.value; local.columnMappings.push({ column: col, selectedColumn: selectedValue, }); local.render(); console.log("column mappings", local.columnMappings); }; const isRowChecked = (id: any) => { return local.selectedRows.some((checked) => checked.pk === id); }; const isConfirmed = (e: MouseEvent) => { console.log("selected rows", local.selectedRows); console.log("column mappings", local.columnMappings); }; return (
{local.showPreviewExcel && (local.data.length > 0 && (

Your Excel Data:

{local.columns.map((col) => ( ))} {local.data.map((row, index) => ( {local.columns.map((col) => ( ))} ))}
{col}{" "}
{row[col]}
))} {local.isLoading && (
{local.progress}%
)} {local.insertedData.length > 0 && (

Inserted Data:

{local.columns.map((col) => ( ))} {local.insertedData.map((row, index) => ( {local.columns.map((col) => ( ))} ))}
{col}
{row[col]}
)}
); };