| @@ -25,6 +25,9 @@ import { useSearchParams } from 'next/navigation'; | |||
| import { fetchAllClientSubsidiaryProjects} from "@/app/api/clientprojects/actions"; | |||
| // const ReactApexChart = dynamic(() => import('react-apexcharts'), { ssr: false }); | |||
| type SearchProjectQuery = Partial<Omit<ClientSubsidiaryProjectResult, "id">>; | |||
| type SearchProjectParamNames = keyof SearchProjectQuery; | |||
| interface Props { | |||
| // clientSubsidiaryProjectResult: ClientSubsidiaryProjectResult[]; | |||
| } | |||
| @@ -51,6 +54,7 @@ const ProgressByClient: React.FC<Props> = () => { | |||
| React.useState("-"); | |||
| const [actualManhourSpent, setActualManhourSpent]: any = React.useState("-"); | |||
| const [remainedManhour, setRemainedManhour]: any = React.useState("-"); | |||
| const [filteredClientSubsidiaryProjectResult, setFilteredClientSubsidiaryProjectResult]:any[] = useState([]); | |||
| const [lastUpdate, setLastUpdate]: any = React.useState("-"); | |||
| const [dropdownDemo, setDropdownDemo] = useState(""); | |||
| const [dateDemo, setDateDemo] = useState(null); | |||
| @@ -100,6 +104,7 @@ const ProgressByClient: React.FC<Props> = () => { | |||
| Number(customerId),tableSorting,Number(0)) | |||
| console.log(clickResult) | |||
| setClientSubsidiaryProjectResult(clickResult); | |||
| setFilteredClientSubsidiaryProjectResult(clickResult); | |||
| } else { | |||
| const clickResult = await fetchAllClientSubsidiaryProjects( | |||
| Number(customerId), | |||
| @@ -149,7 +154,13 @@ const ProgressByClient: React.FC<Props> = () => { | |||
| fetchData() | |||
| }, [customerId,subsidiaryId,tableSorting]); | |||
| const projectSearchCriteria: Criterion<SearchProjectParamNames>[] = useMemo( | |||
| () => [ | |||
| { label: t("Project Code"), paramName: "projectCode", type: "text" }, | |||
| { label: t("Project Name"), paramName: "projectName", type: "text" }, | |||
| ], | |||
| [t], | |||
| ); | |||
| const rows2 = [ | |||
| { | |||
| @@ -623,11 +634,25 @@ const ProgressByClient: React.FC<Props> = () => { | |||
| className="text-slate-500" | |||
| title= {t("Resource Consumption and Coming Milestones")} | |||
| /> | |||
| {clientSubsidiaryProjectResult.length > 0 && ( | |||
| <SearchBox | |||
| criteria={projectSearchCriteria} | |||
| onSearch={(query) => { | |||
| setFilteredClientSubsidiaryProjectResult( | |||
| clientSubsidiaryProjectResult.filter( | |||
| (cp:any) => | |||
| cp.projectCode.toLowerCase().includes(query.projectCode.toLowerCase()) && | |||
| cp.projectName.toLowerCase().includes(query.projectName.toLowerCase()) | |||
| ), | |||
| ); | |||
| }} | |||
| /> | |||
| )} | |||
| <div | |||
| style={{ display: "inline-block", width: "99%", marginLeft: 10 }} | |||
| > | |||
| <CustomDatagrid | |||
| rows={clientSubsidiaryProjectResult} | |||
| rows={filteredClientSubsidiaryProjectResult} | |||
| columns={columns2} | |||
| columnWidth={200} | |||
| dataGridHeight={300} | |||
| @@ -19,9 +19,12 @@ import SearchBox, { Criterion } from "../SearchBox"; | |||
| import ProgressByTeamSearch from "@/components/ProgressByTeamSearch"; | |||
| import { Suspense } from "react"; | |||
| import { useSearchParams } from 'next/navigation'; | |||
| import { fetchAllTeamProjects} from "@/app/api/teamprojects/actions"; | |||
| import { fetchAllTeamProjects,ClientSubsidiaryProjectResult} from "@/app/api/teamprojects/actions"; | |||
| // const ReactApexChart = dynamic(() => import('react-apexcharts'), { ssr: false }); | |||
| type SearchProjectQuery = Partial<Omit<ClientSubsidiaryProjectResult, "id">>; | |||
| type SearchProjectParamNames = keyof SearchProjectQuery; | |||
| const ProgressByTeam: React.FC = () => { | |||
| const searchParams = useSearchParams(); | |||
| const teamLeadId = searchParams.get('teamLeadId'); | |||
| @@ -51,6 +54,7 @@ const ProgressByTeam: React.FC = () => { | |||
| const [chartProjectName, setChartProjectName]:any[] = useState([]); | |||
| const [chartProjectDisplayName, setChartProjectDisplayName]:any[] = useState([]); | |||
| const [chartProjectBudgetedHour, setChartProjectBudgetedHour]:any[] = useState([]); | |||
| const [filteredTeamProjectResult, setFilteredTeamProjectResult]:any[] = useState([]); | |||
| const [chartProjectSpentHour, setChartProjectSpentHour]:any[] = useState([]); | |||
| const [chartManhourConsumptionPercentage, setChartManhourConsumptionPercentage]:any[] = useState([]); | |||
| const color = ["#f57f90", "#94f7d6", "#87c5f5", "#ab95f5", "#fcd68b", | |||
| @@ -89,6 +93,14 @@ const ProgressByTeam: React.FC = () => { | |||
| const recordsPerPage = 10; | |||
| const [tableSorting, setTableSorting] = useState('ProjectName'); | |||
| const projectSearchCriteria: Criterion<SearchProjectParamNames>[] = useMemo( | |||
| () => [ | |||
| { label: t("Project Code"), paramName: "projectCode", type: "text" }, | |||
| { label: t("Project Name"), paramName: "projectName", type: "text" }, | |||
| ], | |||
| [t], | |||
| ); | |||
| const fetchData = async () => { | |||
| console.log(tableSorting) | |||
| if (teamLeadId) { | |||
| @@ -97,6 +109,7 @@ const ProgressByTeam: React.FC = () => { | |||
| Number(teamLeadId),tableSorting) | |||
| console.log(clickResult) | |||
| setTeamProjectResult(clickResult); | |||
| setFilteredTeamProjectResult(clickResult); | |||
| } catch (error) { | |||
| console.error('Error fetching team projects:', error); | |||
| } | |||
| @@ -734,11 +747,25 @@ const ProgressByTeam: React.FC = () => { | |||
| className="text-slate-500" | |||
| title= {t("Resource Consumption and Coming Milestones")} | |||
| /> | |||
| {teamProjectResult.length > 0 && ( | |||
| <SearchBox | |||
| criteria={projectSearchCriteria} | |||
| onSearch={(query) => { | |||
| setFilteredTeamProjectResult( | |||
| teamProjectResult.filter( | |||
| (cp:any) => | |||
| cp.projectCode.toLowerCase().includes(query.projectCode.toLowerCase()) && | |||
| cp.projectName.toLowerCase().includes(query.projectName.toLowerCase()) | |||
| ), | |||
| ); | |||
| }} | |||
| /> | |||
| )} | |||
| <div | |||
| style={{ display: "inline-block", width: "99%", marginLeft: 10 }} | |||
| > | |||
| <CustomDatagrid | |||
| rows={teamProjectResult} | |||
| rows={filteredTeamProjectResult} | |||
| columns={columns2} | |||
| columnWidth={200} | |||
| dataGridHeight={300} | |||
| @@ -74,20 +74,16 @@ const ProjectCashFlow: React.FC = () => { | |||
| if (!isInitializing) { | |||
| setSelectionModel(newSelectionModel); | |||
| console.log(newSelectionModel) | |||
| console.log(projectData) | |||
| const selectedRowsData = projectData.filter((row: any) => | |||
| newSelectionModel.includes(row.id) | |||
| ); | |||
| const projectIdList = selectedRowsData.map((row: any) => row.id); | |||
| console.log(selectedRowsData) | |||
| setSelectedProjectIdList(projectIdList); | |||
| } | |||
| }; | |||
| const fetchData = async () => { | |||
| const cashFlowProject = await fetchProjectsCashFlow(); | |||
| console.log(cashFlowProject) | |||
| setProjectData(cashFlowProject) | |||
| setFilteredResult(cashFlowProject) | |||
| } | |||
| @@ -129,7 +125,6 @@ const ProjectCashFlow: React.FC = () => { | |||
| } | |||
| const fetchReceivableAndExpenditureData = async () => { | |||
| console.log("s2") | |||
| if (selectedProjectIdList.length === 0) { | |||
| setReceivedPercentage(0) | |||
| setInvoicedPercentage(0) | |||
| @@ -764,15 +759,12 @@ const ProjectCashFlow: React.FC = () => { | |||
| ); | |||
| function isDateInRange(dateToCheck: string, startDate: string, endDate: string): boolean { | |||
| console.log(startDate) | |||
| console.log(endDate) | |||
| if (!startDate || !endDate) { | |||
| return false; | |||
| } | |||
| const dateToCheckObj = new Date(dateToCheck); | |||
| const startDateObj = new Date(startDate); | |||
| const endDateObj = new Date(endDate); | |||
| console.log(dateToCheckObj) | |||
| return dateToCheckObj >= startDateObj && dateToCheckObj <= endDateObj; | |||
| } | |||
| @@ -787,7 +779,6 @@ const ProjectCashFlow: React.FC = () => { | |||
| <SearchBox | |||
| criteria={searchCriteria} | |||
| onSearch={(query) => { | |||
| console.log(query) | |||
| setFilteredResult( | |||
| projectData.filter( | |||
| (cp:any) => | |||
| @@ -19,10 +19,11 @@ import SearchBox, { Criterion } from "../SearchBox"; | |||
| import ProgressByTeamSearch from "@/components/ProgressByTeamSearch"; | |||
| import { Suspense } from "react"; | |||
| import { useSearchParams } from 'next/navigation'; | |||
| import { fetchAllTeamProjects, TeamProjectResult, fetchTeamProjects, fetchAllTeamConsumption, fetchAllTeamConsumptionColorOrder} from "@/app/api/teamprojects/actions"; | |||
| import { fetchAllTeamProjects, TeamProjectResult, ClientSubsidiaryProjectResult, fetchTeamProjects, fetchAllTeamConsumption, fetchAllTeamConsumptionColorOrder} from "@/app/api/teamprojects/actions"; | |||
| import Typography from "@mui/material/Typography"; | |||
| // const ReactApexChart = dynamic(() => import('react-apexcharts'), { ssr: false }); | |||
| type SearchProjectQuery = Partial<Omit<ClientSubsidiaryProjectResult, "id">>; | |||
| type SearchProjectParamNames = keyof SearchProjectQuery; | |||
| interface Props { | |||
| projects: TeamProjectResult[]; | |||
| } | |||
| @@ -44,6 +45,7 @@ const ProjectResourceConsumptionRanking: React.FC = () => { | |||
| const [colorArray, setColorArray]: any[] = useState([]); | |||
| const [selectionModel, setSelectionModel]: any[] = React.useState([]); | |||
| const [pieChartColor, setPieChartColor]: any[] = React.useState([]); | |||
| const [filteredTeamProjectResult, setFilteredTeamProjectResult]:any[] = useState([]); | |||
| const [totalSpentPercentage, setTotalSpentPercentage]: any = React.useState(); | |||
| const [projectBudgetManhour, setProjectBudgetManhour]: any = | |||
| React.useState("-"); | |||
| @@ -117,6 +119,7 @@ const ProjectResourceConsumptionRanking: React.FC = () => { | |||
| selectedTeamIdList,tableSorting) | |||
| console.log(clickResult) | |||
| setTeamProjectResult(clickResult); | |||
| setFilteredTeamProjectResult(clickResult); | |||
| setTeamProjectColorOrder(colorOrder); | |||
| } catch (error) { | |||
| console.error('Error fetching team consumption:', error); | |||
| @@ -124,6 +127,14 @@ const ProjectResourceConsumptionRanking: React.FC = () => { | |||
| } | |||
| } | |||
| const projectSearchCriteria: Criterion<SearchProjectParamNames>[] = useMemo( | |||
| () => [ | |||
| { label: t("Project Code"), paramName: "projectCode", type: "text" }, | |||
| { label: t("Project Name"), paramName: "projectName", type: "text" }, | |||
| ], | |||
| [t], | |||
| ); | |||
| const searchCriteria: Criterion<SearchParamNames>[] = useMemo( | |||
| () => [ | |||
| { label: t("Team Code"), paramName: "teamCode", type: "text" }, | |||
| @@ -854,11 +865,25 @@ const ProjectResourceConsumptionRanking: React.FC = () => { | |||
| className="text-slate-500" | |||
| title={t("Resource Consumption and Coming Milestones")} | |||
| /> | |||
| {teamProjectResult.length > 0 && ( | |||
| <SearchBox | |||
| criteria={projectSearchCriteria} | |||
| onSearch={(query) => { | |||
| setFilteredTeamProjectResult( | |||
| teamProjectResult.filter( | |||
| (cp:any) => | |||
| cp.projectCode.toLowerCase().includes(query.projectCode.toLowerCase()) && | |||
| cp.projectName.toLowerCase().includes(query.projectName.toLowerCase()) | |||
| ), | |||
| ); | |||
| }} | |||
| /> | |||
| )} | |||
| <div | |||
| style={{ display: "inline-block", width: "99%", marginLeft: 10 }} | |||
| > | |||
| <CustomDatagrid | |||
| rows={teamProjectResult} | |||
| rows={filteredTeamProjectResult} | |||
| columns={columns2} | |||
| columnWidth={200} | |||
| dataGridHeight={300} | |||