diff --git a/src/app/api/tasks/actions.ts b/src/app/api/tasks/actions.ts index 3414bf6..652db0c 100644 --- a/src/app/api/tasks/actions.ts +++ b/src/app/api/tasks/actions.ts @@ -26,8 +26,13 @@ export interface NewTaskTemplateFormInputs { }; } +export interface NewTaskTemplateResponse { + taskTemplate: TaskTemplate; + message: string; +} + export const saveTaskTemplate = async (data: NewTaskTemplateFormInputs) => { - const newTaskTemplate = await serverFetchJson( + const newTaskTemplate = await serverFetchJson( `${BASE_API_URL}/tasks/templates/save`, { method: "POST", diff --git a/src/components/CreateProject/Milestone.tsx b/src/components/CreateProject/Milestone.tsx index d854af9..e9816c1 100644 --- a/src/components/CreateProject/Milestone.tsx +++ b/src/components/CreateProject/Milestone.tsx @@ -48,9 +48,13 @@ const Milestone: React.FC = ({ allTasks, isActive }) => { ); const [currentTaskGroupId, setCurrentTaskGroupId] = useState( - taskGroups[0].id, + taskGroups[0].id ); + useEffect(() => { + if (taskGroups.length >= 0 && !taskGroups.map(taskGroup => taskGroup.id).includes(currentTaskGroupId)) setCurrentTaskGroupId(taskGroups[0].id) + }, [taskGroups]) + /*const onSelectTaskGroup = useCallback( (event: SelectChangeEvent) => { const id = event.target.value; @@ -111,7 +115,7 @@ const Milestone: React.FC = ({ allTasks, isActive }) => { value={taskGroups.find(taskGroup => taskGroup.id === currentTaskGroupId)} options={taskGroups} getOptionLabel={(taskGroup) => taskGroup.name} - isOptionEqualToValue={(option, value) => option.id === value.id} + isOptionEqualToValue={(option, value) => option.id === value?.id} renderOption={(params, option) => { return ( diff --git a/src/components/CreateTaskTemplate/CreateTaskTemplate.tsx b/src/components/CreateTaskTemplate/CreateTaskTemplate.tsx index 79f30af..04f1f36 100644 --- a/src/components/CreateTaskTemplate/CreateTaskTemplate.tsx +++ b/src/components/CreateTaskTemplate/CreateTaskTemplate.tsx @@ -83,8 +83,6 @@ const CreateTaskTemplate: React.FC = ({ tasks, defaultInputs, grades }) = const onSubmit: SubmitHandler = React.useCallback( async (data) => { try { - console.log(data) - setServerError(""); let hasErrors = false @@ -98,16 +96,17 @@ const CreateTaskTemplate: React.FC = ({ tasks, defaultInputs, grades }) = } if (hasErrors) return false - + submitDialog(async () => { const response = await saveTaskTemplate(data); - if (response?.id !== null && response?.id !== undefined && response?.id > 0) { + if (response.message === "Success") { successDialog(t("Submit Success"), t).then(() => { router.replace("/tasks"); }) } else { errorDialog(t("Submit Fail"), t).then(() => { + formProps.setError("code", { message: response.message, type: "custom" }) return false }) } @@ -140,8 +139,8 @@ const CreateTaskTemplate: React.FC = ({ tasks, defaultInputs, grades }) = {...formProps.register("code", { required: t("Task template code is required"), })} - error={Boolean(formProps.formState.errors.code?.message)} - helperText={formProps.formState.errors.code?.message} + error={Boolean(formProps.formState.errors.code)} + helperText={Boolean(formProps.formState.errors.code) && t(formProps.formState.errors.code?.message!!)} /> @@ -151,8 +150,8 @@ const CreateTaskTemplate: React.FC = ({ tasks, defaultInputs, grades }) = {...formProps.register("name", { required: t("Task template name is required"), })} - error={Boolean(formProps.formState.errors.name?.message)} - helperText={formProps.formState.errors.name?.message} + error={Boolean(formProps.formState.errors.name)} + helperText={Boolean(formProps.formState.errors.name) && t(formProps.formState.errors.name?.message!!)} /> diff --git a/src/components/CustomerSearch/CustomerSearch.tsx b/src/components/CustomerSearch/CustomerSearch.tsx index ec34628..93bef1d 100644 --- a/src/components/CustomerSearch/CustomerSearch.tsx +++ b/src/components/CustomerSearch/CustomerSearch.tsx @@ -38,7 +38,7 @@ const CustomerSearch: React.FC = ({ customers }) => { const onTaskClick = useCallback((customer: Customer) => { const params = new URLSearchParams(searchParams.toString()) params.set("id", customer.id.toString()) - router.replace(`/settings/customer/edit?${params.toString()}`); + router.push(`/settings/customer/edit?${params.toString()}`); }, []); const onDeleteClick = useCallback((customer: Customer) => { diff --git a/src/components/SubsidiarySearch/SubsidiarySearch.tsx b/src/components/SubsidiarySearch/SubsidiarySearch.tsx index c4e1db5..45e4ded 100644 --- a/src/components/SubsidiarySearch/SubsidiarySearch.tsx +++ b/src/components/SubsidiarySearch/SubsidiarySearch.tsx @@ -38,7 +38,7 @@ const SubsidiarySearch: React.FC = ({ subsidiaries }) => { const onTaskClick = useCallback((subsidiary: Subsidiary) => { const params = new URLSearchParams(searchParams.toString()) params.set("id", subsidiary.id.toString()) - router.replace(`/settings/subsidiary/edit?${params.toString()}`); + router.push(`/settings/subsidiary/edit?${params.toString()}`); }, []); const onDeleteClick = useCallback((subsidiary: Subsidiary) => { diff --git a/src/i18n/en/tasks.json b/src/i18n/en/tasks.json index d70d00a..6829944 100644 --- a/src/i18n/en/tasks.json +++ b/src/i18n/en/tasks.json @@ -11,6 +11,7 @@ "Task template code is required": "Task template code is required", "Task template name is required": "Task template name is required", + "The task template code has already existed": "The task template code has already existed", "Do you want to submit?": "Do you want to submit?", "Submit Success": "Submit Success", diff --git a/src/i18n/zh/tasks.json b/src/i18n/zh/tasks.json index 16ba727..34e30e6 100644 --- a/src/i18n/zh/tasks.json +++ b/src/i18n/zh/tasks.json @@ -11,6 +11,7 @@ "Task template code is required": "需要工作範本編號", "Task template name is required": "需要工作範本名稱", + "The task template code has already existed": "該工作範本編號已存在", "Do you want to submit?": "你是否確認要提交?", "Submit Success": "提交成功",