"use client"; import { useEffect, useMemo, useRef, useState } from "react"; import { Search, Award } from "lucide-react"; import { ColumnDef, DataTableLayout, Card, Input, } from "ikoncomponents"; import { getAllGrade } from "@/app/utils/api/companyData/gradeApi.ts"; import { GradeResponseDto } from "@/app/utils/api/companyData/gradeApi.ts/type"; function GradeDataTable() { const [gradeTableData, setGradeTableData] = useState([]); const [isLoading, setIsLoading] = useState(true); const [search, setSearch] = useState(""); // DataTableLayout defaults to list view and has no prop to start in grid, so // once mounted we click its built-in "Grid View" toggle once to default to cards. const tableContainerRef = useRef(null); const defaultedToGrid = useRef(false); const filteredGradeTableData = useMemo(() => { if (!search.trim()) return gradeTableData; return gradeTableData.filter((gradeData) => gradeData.grade?.toLowerCase().includes(search.toLowerCase()), ); }, [gradeTableData, search]); const fetchGradeTableData = async () => { setIsLoading(true); try { const gradeData = await getAllGrade(); setGradeTableData(gradeData?.content || []); } catch (error) { console.error("Error fetching grade data:", error); } finally { setIsLoading(false); } }; useEffect(() => { fetchGradeTableData(); }, []); // Switch DataTableLayout into grid (card) view as soon as it mounts, once. useEffect(() => { if (isLoading || defaultedToGrid.current) return; const gridButton = tableContainerRef.current?.querySelector( 'button[title="Grid View"]', ); if (gridButton) { gridButton.click(); defaultedToGrid.current = true; } }, [isLoading]); // ikoncomponents passes the row object directly to cell(), not { row }. const columns: ColumnDef[] = [ { accessorKey: "grade", header: "Grade", cell: (row) => {row.grade || "n/a"}, }, ]; return (
{/* Header */}

Grades

{filteredGradeTableData.length} of {gradeTableData.length} grades

row.id, totalPages: 1, currentPage: 1, isLoading, onReload: fetchGradeTableData, actionNode: (
setSearch(e.target.value)} />
), gridComponent: (data: GradeResponseDto[]) => (
{data.length > 0 ? ( data.map((gradeItem) => ( {/* Left accent rail */}

Grade

{gradeItem.grade || "-"}

)) ) : (
No grades found.
)}
), }} />
); } export default GradeDataTable;