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