diff --git a/src/pages/taskmanager/components/task-detail/TaskDetailModal.tsx b/src/pages/taskmanager/components/task-detail/TaskDetailModal.tsx index ae193c1..7c3e643 100644 --- a/src/pages/taskmanager/components/task-detail/TaskDetailModal.tsx +++ b/src/pages/taskmanager/components/task-detail/TaskDetailModal.tsx @@ -33,8 +33,14 @@ const TaskDetailModal: FC = ({ open, task, statusLabel, onClose }) => { const updateTask = useUpdateTask(); const deleteTask = useDeleteTask(); - const taskDetail: TaskDetailType | undefined = - getTaskDetail.data?.data?.task ?? getTaskDetail.data?.data; + const rawTaskDetail = getTaskDetail.data?.data?.task ?? getTaskDetail.data?.data; + const taskDetail: TaskDetailType | undefined = rawTaskDetail + ? { + ...rawTaskDetail, + id: rawTaskDetail.id ?? task?.id ?? "", + labels: rawTaskDetail.labels ?? rawTaskDetail.remarks, + } + : undefined; useEffect(() => { if (!open) { @@ -128,7 +134,12 @@ const TaskDetailModal: FC = ({ open, task, statusLabel, onClose }) => { />
- +
void; taskDetail?: TaskDetailType; + taskId: string; }; const parseDate = (value?: string): DateObject | null => { @@ -31,10 +35,12 @@ const parseDate = (value?: string): DateObject | null => { return date.isValid ? date : null; }; -const TaskDetailToolbar: FC = ({ activeTab, onTabChange, taskDetail }) => { +const TaskDetailToolbar: FC = ({ activeTab, onTabChange, taskDetail, taskId }) => { + const { t } = useTranslation("global"); + const createTaskRemark = useCreateTaskRemark(); const [labelsView, setLabelsView] = useState("list"); - const [labels, setLabels] = useState(DEFAULT_LABELS); - const [selectedLabelIds, setSelectedLabelIds] = useState>(new Set(["1"])); + const [labels, setLabels] = useState([]); + const [selectedLabelIds, setSelectedLabelIds] = useState>(new Set()); const [selectedUserIds, setSelectedUserIds] = useState>(new Set(["1"])); const [checklists, setChecklists] = useState(DEFAULT_CHECKLISTS); const [startDate, setStartDate] = useState(DEFAULT_DATE_RANGE.startDate); @@ -43,9 +49,14 @@ const TaskDetailToolbar: FC = ({ activeTab, onTabChange, taskDetail }) => useEffect(() => { if (!taskDetail) return; - if (taskDetail.labels?.length) { - setLabels(taskDetail.labels); - setSelectedLabelIds(new Set(taskDetail.labels.map((label) => label.id))); + const taskLabels = taskDetail.labels ?? taskDetail.remarks ?? []; + + if (taskLabels.length) { + setLabels(taskLabels); + setSelectedLabelIds(new Set(taskLabels.map((label) => label.id))); + } else { + setLabels([]); + setSelectedLabelIds(new Set()); } if (taskDetail.users?.length) { @@ -108,14 +119,34 @@ const TaskDetailToolbar: FC = ({ activeTab, onTabChange, taskDetail }) => }; const handleCreate = (title: string, color: string) => { - const newLabel: TaskLabel = { - id: crypto.randomUUID(), - title, - color, - }; - setLabels((prev) => [...prev, newLabel]); - setSelectedLabelIds((prev) => new Set([...prev, newLabel.id])); - setLabelsView("list"); + const effectiveTaskId = taskId || taskDetail?.id; + if (!effectiveTaskId) return; + + createTaskRemark.mutate( + { title, color, taskId: effectiveTaskId }, + { + onSuccess: (response) => { + const remark = + response.data?.remark ?? + (response as { remark?: TaskLabel }).remark ?? + (response.data as TaskLabel | undefined); + if (remark?.id) { + const newLabel: TaskLabel = { + id: remark.id, + title: remark.title, + color: remark.color, + }; + setLabels((prev) => [...prev, newLabel]); + setSelectedLabelIds((prev) => new Set([...prev, newLabel.id])); + } + setLabelsView("list"); + toast.success(t("success")); + }, + onError: (error: ErrorType) => { + toast.error(error.response?.data?.error.message[0]); + }, + }, + ); }; const handleChecklistClose = () => { @@ -163,6 +194,7 @@ const TaskDetailToolbar: FC = ({ activeTab, onTabChange, taskDetail }) => onViewChange={setLabelsView} onToggle={handleLabelToggle} onCreate={handleCreate} + isSubmitting={createTaskRemark.isPending} /> ) : null } diff --git a/src/pages/taskmanager/components/task-detail/labels/TaskDetailLabelsPopover.tsx b/src/pages/taskmanager/components/task-detail/labels/TaskDetailLabelsPopover.tsx index 5daf2f8..134eff5 100644 --- a/src/pages/taskmanager/components/task-detail/labels/TaskDetailLabelsPopover.tsx +++ b/src/pages/taskmanager/components/task-detail/labels/TaskDetailLabelsPopover.tsx @@ -10,6 +10,7 @@ type Props = { onViewChange: (view: LabelsView) => void; onToggle: (id: string) => void; onCreate: (title: string, color: string) => void; + isSubmitting?: boolean; }; const TaskDetailLabelsPopover: FC = ({ @@ -19,6 +20,7 @@ const TaskDetailLabelsPopover: FC = ({ onViewChange, onToggle, onCreate, + isSubmitting = false, }) => { return ( <> @@ -34,6 +36,7 @@ const TaskDetailLabelsPopover: FC = ({ onViewChange("list")} onSubmit={onCreate} + isSubmitting={isSubmitting} /> )} diff --git a/src/pages/taskmanager/components/task-detail/labels/TaskDetailNewLabelForm.tsx b/src/pages/taskmanager/components/task-detail/labels/TaskDetailNewLabelForm.tsx index bfe9cdb..4c038cd 100644 --- a/src/pages/taskmanager/components/task-detail/labels/TaskDetailNewLabelForm.tsx +++ b/src/pages/taskmanager/components/task-detail/labels/TaskDetailNewLabelForm.tsx @@ -10,9 +10,10 @@ import { LABEL_COLOR_OPTIONS } from "./constants"; type Props = { onBack: () => void; onSubmit: (title: string, color: string) => void; + isSubmitting?: boolean; }; -const TaskDetailNewLabelForm: FC = ({ onBack, onSubmit }) => { +const TaskDetailNewLabelForm: FC = ({ onBack, onSubmit, isSubmitting = false }) => { const { t } = useTranslation("global"); const colorInputRef = useRef(null); const [title, setTitle] = useState(""); @@ -48,7 +49,8 @@ const TaskDetailNewLabelForm: FC = ({ onBack, onSubmit }) => {