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 Array>, }); 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.render(); }; reader.readAsBinaryString(file); }; const executeImport = async ( columnMappings: string[], data: { pk: string | number; rows: any; }[] ) => { const table = (db as any)[local.tableName]; if (table) { // execute } }; 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.data.length > 0 && (

Imported Data:

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