浏览代码

update project

tags/Baseline_30082024_FRONTEND_UAT
cyril.tsui 1年前
父节点
当前提交
8e7fb7cf20
共有 4 个文件被更改,包括 26 次插入23 次删除
  1. +18
    -18
      src/components/CreateProject/CreateProject.tsx
  2. +4
    -3
      src/components/CreateProject/Milestone.tsx
  3. +2
    -0
      src/components/CreateProject/MilestoneSection.tsx
  4. +2
    -2
      src/components/CreateProject/StaffAllocation.tsx

+ 18
- 18
src/components/CreateProject/CreateProject.tsx 查看文件

@@ -170,12 +170,12 @@ const CreateProject: React.FC<Props> = ({


// Tab - Milestone // Tab - Milestone
let projectTotal = 0 let projectTotal = 0
const milestonesKeys = Object.keys(data.milestones)
const milestonesKeys = Object.keys(data.milestones).filter(key => taskGroupKeys.includes(key))
milestonesKeys.filter(key => Object.keys(data.taskGroups).includes(key)).forEach(key => { milestonesKeys.filter(key => Object.keys(data.taskGroups).includes(key)).forEach(key => {
const { startDate, endDate, payments } = data.milestones[parseFloat(key)] const { startDate, endDate, payments } = data.milestones[parseFloat(key)]


if (!Boolean(startDate) || startDate === "Invalid Date" || !Boolean(endDate) || endDate === "Invalid Date" || new Date(startDate) > new Date(endDate)) { 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"})
formProps.setError("milestones", { message: "milestones is not valid", type: "invalid" })
setTabIndex(3) setTabIndex(3)
hasErrors = true hasErrors = true
} }
@@ -183,8 +183,8 @@ const CreateProject: React.FC<Props> = ({
projectTotal += payments.reduce((acc, payment) => acc + payment.amount, 0) projectTotal += payments.reduce((acc, payment) => acc + payment.amount, 0)
}) })


if (projectTotal !== data.expectedProjectFee) {
formProps.setError("milestones", {message: "milestones is not valid", type: "invalid"})
if (projectTotal !== data.expectedProjectFee || milestonesKeys.length !== taskGroupKeys.length) {
formProps.setError("milestones", { message: "milestones is not valid", type: "invalid" })
setTabIndex(3) setTabIndex(3)
hasErrors = true hasErrors = true
} }
@@ -219,7 +219,7 @@ const CreateProject: React.FC<Props> = ({
data.projectActualEnd = dayjs().format("YYYY-MM-DD"); data.projectActualEnd = dayjs().format("YYYY-MM-DD");
} }


data.taskTemplateId = data.taskTemplateId === "All" ? undefined : data.taskTemplateId;
data.taskTemplateId = data.taskTemplateId === "All" ? undefined : data.taskTemplateId;
const response = await saveProject(data); const response = await saveProject(data);


if (response.id > 0) { if (response.id > 0) {
@@ -293,7 +293,7 @@ const CreateProject: React.FC<Props> = ({
{isEditMode && !(formProps.getValues("projectDeleted") === true) && ( {isEditMode && !(formProps.getValues("projectDeleted") === true) && (
<Stack direction="row" gap={1}> <Stack direction="row" gap={1}>
{/* {!formProps.getValues("projectActualStart") && ( */} {/* {!formProps.getValues("projectActualStart") && ( */}
{formProps.getValues("projectStatus") === "Pending to Start" && (
{formProps.getValues("projectStatus").toLowerCase() === "pending to start" && (
<Button <Button
name="start" name="start"
type="submit" type="submit"
@@ -306,21 +306,21 @@ const CreateProject: React.FC<Props> = ({
)} )}
{/* {formProps.getValues("projectActualStart") && {/* {formProps.getValues("projectActualStart") &&
!formProps.getValues("projectActualEnd") && ( */} !formProps.getValues("projectActualEnd") && ( */}
{formProps.getValues("projectStatus") === "On-going" && (
<Button
name="complete"
type="submit"
variant="contained"
startIcon={<DoneIcon />}
color="info"
>
{t("Complete Project")}
</Button>
)}
{formProps.getValues("projectStatus").toLowerCase() === "on-going" && (
<Button
name="complete"
type="submit"
variant="contained"
startIcon={<DoneIcon />}
color="info"
>
{t("Complete Project")}
</Button>
)}
{!( {!(
// formProps.getValues("projectActualStart") && // formProps.getValues("projectActualStart") &&
// formProps.getValues("projectActualEnd") // formProps.getValues("projectActualEnd")
formProps.getValues("projectStatus") === "Completed" ||
formProps.getValues("projectStatus") === "Completed" ||
formProps.getValues("projectStatus") === "Deleted" formProps.getValues("projectStatus") === "Deleted"
) && ( ) && (
<Button <Button


+ 4
- 3
src/components/CreateProject/Milestone.tsx 查看文件

@@ -61,11 +61,12 @@ const Milestone: React.FC<Props> = ({ allTasks, isActive }) => {
const milestones = watch("milestones") const milestones = watch("milestones")
const expectedTotalFee = watch("expectedProjectFee"); const expectedTotalFee = watch("expectedProjectFee");
useEffect(() => { useEffect(() => {
const milestonesKeys = Object.keys(milestones)
const taskGroupsIds = taskGroups.map(taskGroup => taskGroup.id.toString())
const milestonesKeys = Object.keys(milestones).filter(key => taskGroupsIds.includes(key))
let hasError = false let hasError = false
let projectTotal = 0 let projectTotal = 0


milestonesKeys.filter(key => taskGroups.map(taskGroup => taskGroup.id).includes(parseInt(key))).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)) { if (new Date(startDate) > new Date(endDate) || !Boolean(startDate) || !Boolean(endDate)) {
@@ -75,7 +76,7 @@ const Milestone: React.FC<Props> = ({ allTasks, isActive }) => {
projectTotal += payments.reduce((acc, payment) => acc + payment.amount, 0) projectTotal += payments.reduce((acc, payment) => acc + payment.amount, 0)
}) })


if (projectTotal !== expectedTotalFee) {
if (projectTotal !== expectedTotalFee || milestonesKeys.length !== taskGroupsIds.length) {
hasError = true hasError = true
} }
// console.log(Object.keys(milestones).reduce((acc, key) => acc + milestones[parseFloat(key)].payments.reduce((acc2, value) => acc2 + value.amount, 0), 0)) // console.log(Object.keys(milestones).reduce((acc, key) => acc + milestones[parseFloat(key)].payments.reduce((acc2, value) => acc2 + value.amount, 0), 0))


+ 2
- 0
src/components/CreateProject/MilestoneSection.tsx 查看文件

@@ -244,6 +244,7 @@ const MilestoneSection: React.FC<Props> = ({ taskGroupId }) => {
<DatePicker <DatePicker
label={t("Stage Start Date")} label={t("Stage Start Date")}
value={startDate ? dayjs(startDate) : null} value={startDate ? dayjs(startDate) : null}
format="YYYY/MM/DD"
onChange={(date) => { onChange={(date) => {
if (!date) return; if (!date) return;
const milestones = getValues("milestones"); const milestones = getValues("milestones");
@@ -272,6 +273,7 @@ const MilestoneSection: React.FC<Props> = ({ taskGroupId }) => {
<DatePicker <DatePicker
label={t("Stage End Date")} label={t("Stage End Date")}
value={endDate ? dayjs(endDate) : null} value={endDate ? dayjs(endDate) : null}
format="YYYY/MM/DD"
onChange={(date) => { onChange={(date) => {
if (!date) return; if (!date) return;
const milestones = getValues("milestones"); const milestones = getValues("milestones");


+ 2
- 2
src/components/CreateProject/StaffAllocation.tsx 查看文件

@@ -39,8 +39,8 @@ import { StaffResult } from "@/app/api/staff";


const staffComparator = (a: StaffResult, b: StaffResult) => { const staffComparator = (a: StaffResult, b: StaffResult) => {
return ( return (
a.team.localeCompare(b.team) ||
a.grade.localeCompare(b.grade) ||
a.team?.localeCompare(b.team) ||
a.grade?.localeCompare(b.grade) ||
a.id - b.id a.id - b.id
); );
}; };


正在加载...
取消
保存