Use plan start date and plan end date as every stage start date and stage end datetags/Baseline_180220205_Frontend
| @@ -59,8 +59,8 @@ export interface CreateProjectInputs { | |||||
| // Milestones | // Milestones | ||||
| milestones: { | milestones: { | ||||
| [taskGroupId: TaskGroup["id"]]: { | [taskGroupId: TaskGroup["id"]]: { | ||||
| startDate: string; | |||||
| endDate: string; | |||||
| startDate: string | null; | |||||
| endDate: string | null; | |||||
| payments: PaymentInputs[]; | payments: PaymentInputs[]; | ||||
| }; | }; | ||||
| }; | }; | ||||
| @@ -96,7 +96,9 @@ const hasErrorsInTab = ( | |||||
| errors.projectName || | errors.projectName || | ||||
| errors.projectDescription || | errors.projectDescription || | ||||
| errors.clientId || | errors.clientId || | ||||
| errors.projectCode | |||||
| errors.projectCode || | |||||
| errors.projectPlanStart || | |||||
| errors.projectPlanEnd | |||||
| ); | ); | ||||
| case 2: | case 2: | ||||
| return ( | return ( | ||||
| @@ -273,6 +275,17 @@ const CreateProject: React.FC<Props> = ({ | |||||
| // detect errors | // detect errors | ||||
| let hasErrors = false; | let hasErrors = false; | ||||
| if( | |||||
| !data.projectPlanStart || !data.projectPlanEnd | |||||
| ){ | |||||
| formProps.setError("projectPlanStart", { | |||||
| message: "projectPlanStart is not valid", | |||||
| type: "required", | |||||
| }); | |||||
| setTabIndex(0); | |||||
| hasErrors = true; | |||||
| } | |||||
| // Tab - Staff Allocation and Resource | // Tab - Staff Allocation and Resource | ||||
| if ( | if ( | ||||
| data.totalManhour === null || | data.totalManhour === null || | ||||
| @@ -349,21 +362,29 @@ const CreateProject: React.FC<Props> = ({ | |||||
| .forEach((key) => { | .forEach((key) => { | ||||
| const { startDate, endDate, payments } = | const { startDate, endDate, payments } = | ||||
| data.milestones[parseFloat(key)]; | data.milestones[parseFloat(key)]; | ||||
| if ( | |||||
| !Boolean(startDate) || | |||||
| startDate === "Invalid Date" || | |||||
| !Boolean(endDate) || | |||||
| endDate === "Invalid Date" || | |||||
| new Date(startDate) > new Date(endDate) | |||||
| ) { | |||||
| formProps.setError("milestones", { | |||||
| message: "milestones is not valid", | |||||
| type: "invalid", | |||||
| }); | |||||
| setTabIndex(3); | |||||
| hasErrors = true; | |||||
| } | |||||
| if ( | |||||
| !Boolean(startDate) || | |||||
| startDate === "Invalid Date" || | |||||
| !Boolean(endDate) || | |||||
| endDate === "Invalid Date" | |||||
| ){ | |||||
| data.milestones[parseFloat(key)].startDate = null | |||||
| data.milestones[parseFloat(key)].endDate = null | |||||
| } | |||||
| // if ( | |||||
| // !Boolean(startDate) || | |||||
| // startDate === "Invalid Date" || | |||||
| // !Boolean(endDate) || | |||||
| // endDate === "Invalid Date" || | |||||
| // new Date(startDate) > new Date(endDate) | |||||
| // ) { | |||||
| // formProps.setError("milestones", { | |||||
| // message: "milestones is not valid", | |||||
| // type: "invalid", | |||||
| // }); | |||||
| // setTabIndex(3); | |||||
| // hasErrors = true; | |||||
| // } | |||||
| projectTotal += payments.reduce( | projectTotal += payments.reduce( | ||||
| (acc, payment) => acc + payment.amount, | (acc, payment) => acc + payment.amount, | ||||
| @@ -471,7 +492,9 @@ const CreateProject: React.FC<Props> = ({ | |||||
| errors.projectName || | errors.projectName || | ||||
| errors.projectDescription || | errors.projectDescription || | ||||
| errors.projectCode || | errors.projectCode || | ||||
| errors.clientId | |||||
| errors.clientId || | |||||
| errors.projectPlanStart || | |||||
| errors.projectPlanEnd | |||||
| ) { | ) { | ||||
| setTabIndex(0); | setTabIndex(0); | ||||
| } else if ( | } else if ( | ||||
| @@ -85,9 +85,9 @@ const Milestone: React.FC<Props> = ({ allTasks, isActive }) => { | |||||
| milestonesKeys.forEach(key => { | milestonesKeys.forEach(key => { | ||||
| const { startDate, endDate, payments } = milestones[parseFloat(key)] | const { startDate, endDate, payments } = milestones[parseFloat(key)] | ||||
| if (new Date(startDate) > new Date(endDate) || !Boolean(startDate) || !Boolean(endDate)) { | |||||
| hasError = true | |||||
| } | |||||
| // if (new Date(startDate) > new Date(endDate) || !Boolean(startDate) || !Boolean(endDate)) { | |||||
| // hasError = true | |||||
| // } | |||||
| projectTotal += payments.reduce((acc, payment) => acc + payment.amount, 0) | projectTotal += payments.reduce((acc, payment) => acc + payment.amount, 0) | ||||
| }) | }) | ||||
| @@ -326,7 +326,7 @@ const MilestoneSection: React.FC<Props> = ({ taskGroupId }) => { | |||||
| <Typography variant="overline" display="block" marginBlockEnd={1}> | <Typography variant="overline" display="block" marginBlockEnd={1}> | ||||
| {t("Stage Milestones")} | {t("Stage Milestones")} | ||||
| </Typography> | </Typography> | ||||
| <Grid container spacing={2} columns={{ xs: 6, sm: 12 }}> | |||||
| {/* <Grid container spacing={2} columns={{ xs: 6, sm: 12 }}> | |||||
| <Grid item xs> | <Grid item xs> | ||||
| <FormControl fullWidth> | <FormControl fullWidth> | ||||
| <DatePicker | <DatePicker | ||||
| @@ -385,7 +385,7 @@ const MilestoneSection: React.FC<Props> = ({ taskGroupId }) => { | |||||
| /> | /> | ||||
| </FormControl> | </FormControl> | ||||
| </Grid> | </Grid> | ||||
| </Grid> | |||||
| </Grid> */} | |||||
| <Box | <Box | ||||
| sx={(theme) => ({ | sx={(theme) => ({ | ||||
| marginBlockStart: 1, | marginBlockStart: 1, | ||||
| @@ -86,6 +86,8 @@ const ProjectClientDetails: React.FC<Props> = ({ | |||||
| getValues, | getValues, | ||||
| reset, | reset, | ||||
| resetField, | resetField, | ||||
| setError, | |||||
| clearErrors | |||||
| } = useFormContext<CreateProjectInputs>(); | } = useFormContext<CreateProjectInputs>(); | ||||
| const subsidiaryMap = useMemo<{ | const subsidiaryMap = useMemo<{ | ||||
| @@ -242,6 +244,34 @@ const ProjectClientDetails: React.FC<Props> = ({ | |||||
| const planStart = getValues("projectPlanStart") | const planStart = getValues("projectPlanStart") | ||||
| const planEnd = getValues("projectPlanEnd") | const planEnd = getValues("projectPlanEnd") | ||||
| useEffect(() => { | |||||
| let hasErrors = false | |||||
| if( | |||||
| !planStart || planStart > planEnd | |||||
| ){ | |||||
| hasErrors = true; | |||||
| } | |||||
| if( | |||||
| !planEnd || planStart > planEnd | |||||
| ){ | |||||
| hasErrors = true; | |||||
| } | |||||
| if(hasErrors){ | |||||
| setError("projectPlanStart", { | |||||
| message: "Project Plan Start date is not valid", | |||||
| type: "required", | |||||
| }); | |||||
| setError("projectPlanEnd", { | |||||
| message: "Project Plan End date is not valid", | |||||
| type: "required", | |||||
| }); | |||||
| }else{ | |||||
| clearErrors("projectPlanStart") | |||||
| clearErrors("projectPlanEnd") | |||||
| } | |||||
| },[planStart, planEnd]) | |||||
| return ( | return ( | ||||
| <Card sx={{ display: isActive ? "block" : "none" }}> | <Card sx={{ display: isActive ? "block" : "none" }}> | ||||
| <CardContent component={Stack} spacing={4}> | <CardContent component={Stack} spacing={4}> | ||||
| @@ -311,8 +341,10 @@ const ProjectClientDetails: React.FC<Props> = ({ | |||||
| textField: { | textField: { | ||||
| // required: true, | // required: true, | ||||
| error: | error: | ||||
| Boolean(errors.projectPlanStart) | |||||
| || new Date(planStart) > new Date(planEnd) | |||||
| // Boolean(errors.projectPlanStart) | |||||
| // || | |||||
| new Date(planStart) > new Date(planEnd) | |||||
| || !Boolean(planStart) | |||||
| , | , | ||||
| }, | }, | ||||
| }} | }} | ||||
| @@ -335,9 +367,12 @@ const ProjectClientDetails: React.FC<Props> = ({ | |||||
| }} | }} | ||||
| slotProps={{ | slotProps={{ | ||||
| textField: { | textField: { | ||||
| // required: true, | |||||
| error: | error: | ||||
| Boolean(errors.projectPlanEnd) | |||||
| || new Date(planStart) > new Date(planEnd) | |||||
| // Boolean(errors.projectPlanEnd) | |||||
| // || | |||||
| new Date(planStart) > new Date(planEnd) | |||||
| || !Boolean(planEnd) | |||||
| , | , | ||||
| }, | }, | ||||
| }} | }} | ||||