@@ -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} | ||||