"use client";
import { ColumnDef, DataTableLayout } from "ikoncomponents";
import { useEffect, useRef, useState } from "react";
import { getAllWorkingDays } from "@/app/utils/api/workingDays";
interface WorkingDaysDetailsData {
id: string;
year: string;
month: string;
workingDays: string;
}
function WorkingDaysDetailsTable() {
const [workingDaysDetails, setWorkingDaysDetails] = useState<
WorkingDaysDetailsData[]
>([]);
const [isLoading, setIsLoading] = useState(true);
const fetchWorkingDaysDetailsData = async () => {
setIsLoading(true);
try {
const workingDayData = await getAllWorkingDays();
let flatData: WorkingDaysDetailsData[] = [];
if (workingDayData?.content) {
workingDayData.content.forEach((item: any) => {
if (item.workingDaysDetails) {
Object.values(item.workingDaysDetails).forEach((yearObj: any) => {
Object.values(yearObj).forEach((monthObj: any) => {
flatData.push({
id: `${monthObj.year}-${monthObj.month}`,
year: monthObj.year,
month: monthObj.month,
workingDays: String(monthObj.workingDays),
});
});
});
}
});
}
setWorkingDaysDetails(flatData);
} catch (error) {
console.error("Error fetching WorkingDaysDetails data:", error);
} finally {
setIsLoading(false);
}
};
// Headers must be plain strings: DataTableLayout's grouping resolver maps the
// grouped header string back to its accessorKey, and only string headers expose
// the drag handle. Function headers (e.g. a centered
) can't be grouped.
const columns: ColumnDef
[] = [
{
accessorKey: "year",
header: "Year",
},
{
accessorKey: "month",
header: "Month",
},
{
accessorKey: "workingDays",
header: "Number of working days",
},
];
// DataTableLayout keeps its grouping state internal with no prop to seed it —
// grouping is only triggered by dragging a column onto the grouping bar. To
// default-group by year, once the table has mounted we synthesise that drop
// (a "drop" event carrying columnHeader=Year) on the grouping drop zone once.
const tableContainerRef = useRef(null);
const groupedByYear = useRef(false);
useEffect(() => {
fetchWorkingDaysDetailsData();
}, []);
useEffect(() => {
if (isLoading || groupedByYear.current) return;
const container = tableContainerRef.current;
if (!container) return;
// This table is list-only, so hide DataTableLayout's built-in List/Grid
// toggle (it has no prop to disable it). Hide the whole toggle group rather
// than just the grid button so a lone list button isn't left dangling.
const gridButton = container.querySelector(
'button[title="Grid View"]',
);
if (gridButton?.parentElement) {
gridButton.parentElement.style.display = "none";
}
const dropZone = container.querySelector(
'div[class*="border-dashed"]',
);
if (!dropZone) return;
const dataTransfer = new DataTransfer();
dataTransfer.setData("columnHeader", "Year");
dropZone.dispatchEvent(
new DragEvent("drop", { bubbles: true, cancelable: true, dataTransfer }),
);
groupedByYear.current = true;
}, [isLoading]);
return (
row.id,
totalPages: 1,
currentPage: 1,
isLoading,
onReload: fetchWorkingDaysDetailsData,
}}
/>
);
}
export default WorkingDaysDetailsTable;