Files
Your NamebaishaliHolocron b9ac5ae0b2 first commit
2026-06-15 12:57:03 +05:30

138 lines
3.7 KiB
TypeScript
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// import { getProductById } from "@/app/utils/api/productOfprojectsApi";
import { DataTableLayout, ColumnDef } from "ikoncomponents";
import React, { useEffect } from "react";
import { Project } from "../../../types/project";
import ResourceForm from "../resourceForm";
import { ProductOfProject, ResourceAllocationDto } from "@/app/utils/interface/productOfProject";
import { getProductsApi } from "@/app/utils/api/productOfProjectApi";
import { getScheduleApi } from "@/app/utils/api/projectApi";
import { getProductById } from "@/app/utils/api/productOfprojectsApi";
import { getResourceAllocations } from "@/app/utils/api/productsResourceAllocation";
interface ProductResourceTabContentProps {
productIdentifier: string;
}
interface ResourceData {
staff: string;
role: string;
grade: string;
// cost?: number | undefined;
[key: string]: string | number; // Allows dynamic month columns
}
export default function ResourcesTab({ project }: { project: ProductOfProject }) {
const [productData, setProductData] = React.useState<ProductOfProject | null>(project);
const [resourceModalOpen, setResourceModalOpen] = React.useState<boolean>(false);
useEffect(() => {
const fetchdata = async () => {
const response = await getProductsApi(project.projectIdentifier);
const scheduleResponse= await getScheduleApi(project.projectIdentifier);
response[0].scheduleData = scheduleResponse;
response[0].resourceDataWithAllocation = await getResourceAllocations(response[0].productIdentifier);
setProductData(response[0])
}
  fetchdata();
}, []);
debugger
const columnsProductDetails: ColumnDef<ResourceData>[] = [
{
accessorKey: "staff",
header: () => (
<div className={"text-center"}>Staff</div>
),
},
{
accessorKey: "role",
header: () => (
<div className={"text-center"}>Role</div>
),
},
{
accessorKey: "grade",
header: () => (
<div className={"text-center"}>Grade</div>
),
},
{
accessorKey: "task",
header: "Task"
},
];
const resourceAllocation = productData?.resourceDataWithAllocation;
const months = getMonthsFromAllocation(resourceAllocation ?? []);
for(const i in months){
columnsProductDetails.push({
accessorKey: months[i] as keyof ResourceData,
header: months[i]
})
}
const tableData = convertToTableRows(resourceAllocation)
return (
<>
{!productData?.scheduleData?.task ? (
<div className="text-center mt-10">
<p>No Resource</p>
</div>
) : (
<DataTableLayout
data={tableData}
columns={columnsProductDetails}
extraTools={{
keyExtractor: (row: ResourceData) => row.staff,
totalPages: 0,
currentPage: 0,
actionNode: <ResourceForm productData={productData} />,
}}
/>
)}
</>
);
}
function convertToTableRows(data: ResourceAllocationDto[] | undefined): ResourceData[] {
if(!data){
return [];
}
return data.map(item => {
const row: ResourceData = {
staff: item.employeeName,
role: item.role,
grade: String(item.gradeId),
task: item.taskName
};
// Merge allocation months (Nov_2025, Dec_2025, etc.)
Object.entries(item.allocation ?? {}).forEach(([month, value]) => {
row[month] = (value as number) ?? 0;
});
return row;
});
}
export function getMonthsFromAllocation(data: ResourceAllocationDto[] | undefined): string[] {
if (!Array.isArray(data) || data.length === 0) return [];
const firstItem = data[0];
return firstItem?.allocation
? Object.keys(firstItem.allocation)
: [];
}