From 067d12a1d5817ad608c3c8916dc5082c21b991a8 Mon Sep 17 00:00:00 2001 From: KIM_DEAHO <102588838+DHowor1d@users.noreply.github.com> Date: Sat, 13 Sep 2025 20:51:19 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EC=9D=B4=EC=8A=88=20=EC=83=81=EC=84=B8?= =?UTF-8?q?=20=EC=88=98=EC=A0=95,=20=EB=8C=93=EA=B8=80=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/common/TaskDetail.jsx | 475 ------------------ src/components/common/task/TaskActions.jsx | 37 ++ src/components/common/task/TaskComments.jsx | 239 +++++++++ .../common/task/TaskDescription.jsx | 31 ++ src/components/common/task/TaskDetail.jsx | 124 +++++ src/components/common/task/TaskHeader.jsx | 211 ++++++++ src/components/common/task/TaskMetadata.jsx | 42 ++ src/components/common/task/TaskSchedule.jsx | 85 ++++ src/components/kanban/Kanban.jsx | 4 +- src/components/kanban/KanbanCard.jsx | 4 +- src/components/meeting/MeetingCreate.jsx | 6 +- src/data/taskComments.js | 105 ++++ src/index.css | 4 + 13 files changed, 885 insertions(+), 482 deletions(-) delete mode 100644 src/components/common/TaskDetail.jsx create mode 100644 src/components/common/task/TaskActions.jsx create mode 100644 src/components/common/task/TaskComments.jsx create mode 100644 src/components/common/task/TaskDescription.jsx create mode 100644 src/components/common/task/TaskDetail.jsx create mode 100644 src/components/common/task/TaskHeader.jsx create mode 100644 src/components/common/task/TaskMetadata.jsx create mode 100644 src/components/common/task/TaskSchedule.jsx create mode 100644 src/data/taskComments.js diff --git a/src/components/common/TaskDetail.jsx b/src/components/common/TaskDetail.jsx deleted file mode 100644 index 574ceef..0000000 --- a/src/components/common/TaskDetail.jsx +++ /dev/null @@ -1,475 +0,0 @@ -import { useState } from "react"; -import { - ArrowBack, - CalendarToday, - Person, - Flag, - Assignment, - Delete, - Schedule, - Edit, - Save, - Cancel, -} from "@mui/icons-material"; -import BadgeComponent from "./BadgeComponent"; -import Dropdown from "./Dropdown"; -import { membersData } from "../../data/employees"; - -function TaskDetail({ task, onBack, onUpdate, onDelete }) { - const [isEditing, setIsEditing] = useState(false); - const [editData, setEditData] = useState({ - ...task, - memberId: - task?.memberId || task?.memberName - ? membersData.find((m) => m.name === task.memberName)?.id - : null, - }); - - // 편집 핸들러 - const handleEdit = () => { - setIsEditing(true); - setEditData({ - ...task, - memberId: - task?.memberId || task?.memberName - ? membersData.find((m) => m.name === task.memberName)?.id - : null, - }); - }; - - const handleDelete = () => { - if (window.confirm("이 작업을 삭제하시겠습니까?")) { - if (onDelete) { - onDelete(task.id); - } - } - }; - - const handleSave = () => { - if (onUpdate) { - onUpdate(task.id, editData); - } - setIsEditing(false); - }; - - const handleCancel = () => { - setEditData({ - ...task, - memberId: - task?.memberId || task?.memberName - ? membersData.find((m) => m.name === task.memberName)?.id - : null, - }); - setIsEditing(false); - }; - - // 드롭다운 옵션 데이터 - const statusOptions = [ - { value: "TODO", label: "할 일" }, - { value: "PROGRESS", label: "진행 중" }, - { value: "DONE", label: "완료" }, - ]; - - const priorityOptions = [ - { value: "HIGH", label: "높음" }, - { value: "MEDIUM", label: "보통" }, - { value: "LOW", label: "낮음" }, - ]; - - const memberOptions = membersData.map((member) => ({ - value: member.id, - label: member.name, - })); - if (!task) { - return ( -
-
-

작업 정보를 찾을 수 없습니다.

- -
-
- ); - } - - // 날짜 포맷팅 - const formatDate = (dateString) => { - const date = new Date(dateString); - return date.toLocaleDateString("ko-KR", { - year: "numeric", - month: "long", - day: "numeric", - weekday: "long", - }); - }; - - // 우선순위 표시 - const getPriorityInfo = (priority) => { - switch (priority?.toUpperCase()) { - case "HIGH": - return { label: "높음", color: "text-red-600 bg-red-50" }; - case "MEDIUM": - return { label: "보통", color: "text-yellow-600 bg-yellow-50" }; - case "LOW": - return { label: "낮음", color: "text-green-600 bg-green-50" }; - default: - return { label: priority, color: "text-gray-600 bg-gray-50" }; - } - }; - - // 상태 표시 - const getStatusInfo = (status) => { - switch (status?.toUpperCase()) { - case "TODO": - return { label: "할 일", color: "text-gray-600 bg-gray-100" }; - case "PROGRESS": - return { label: "진행 중", color: "text-blue-600 bg-blue-100" }; - case "DONE": - return { label: "완료", color: "text-green-600 bg-green-100" }; - default: - return { label: status, color: "text-gray-600 bg-gray-100" }; - } - }; - - const priorityInfo = getPriorityInfo(task.priority); - const statusInfo = getStatusInfo(task.status); - - // 메타데이터 구성 - const metadataItems = [ - { label: "작업 ID", value: `${task.id}` }, - { label: "프로젝트 ID", value: `${task.projectId}` }, - { - label: "생성일", - value: task.createdAt - ? new Date(task.createdAt).toLocaleDateString("ko-KR") - : "-", - }, - { - label: "수정일", - value: task.updatedAt - ? new Date(task.updatedAt).toLocaleDateString("ko-KR") - : "-", - }, - ]; - - return ( -
-
- {/* 헤더 */} -
-
-
- -
- {isEditing ? ( - - setEditData({ ...editData, title: e.target.value }) - } - className="text-2xl font-semibold text-gray-900 bg-white border border-gray-300 rounded-lg px-3 py-2 w-full focus:outline-none focus:ring-2 focus:ring-blue-500" - placeholder="작업 제목을 입력하세요" - /> - ) : ( -

- {task.title} -

- )} -
- {/* 상태 */} -
- - {isEditing ? ( - - setEditData({ ...editData, status: value }) - } - width="w-32" - className="text-sm" - /> - ) : ( - - {statusInfo.label} - - )} -
- - {/* 우선순위 */} -
- - {isEditing ? ( - - setEditData({ ...editData, priority: value }) - } - width="w-32" - className="text-sm" - /> - ) : ( - - {priorityInfo.label} - - )} -
- - {/* 담당자 */} -
- - {isEditing ? ( - { - const selectedMember = membersData.find( - (m) => m.id === value - ); - setEditData({ - ...editData, - memberId: value, - memberName: selectedMember?.name || "", - }); - }} - width="w-36" - className="text-sm" - placeholder="담당자 선택" - /> - ) : ( - - {task.memberName || "담당자 미지정"} - - )} -
- - {/* 마감일 */} -
- - {isEditing ? ( - - setEditData({ ...editData, endDate: e.target.value }) - } - className="text-sm text-gray-700 border border-gray-300 rounded px-2 py-1 focus:outline-none focus:ring-2 focus:ring-blue-500" - /> - ) : ( - task.endDate && ( - - {formatDate(task.endDate)} - - ) - )} -
-
- - {/* 태그 */} - {task.tags && task.tags.length > 0 && ( -
- 태그: -
- {task.tags.map((tag, index) => ( - - {typeof tag === "object" ? tag.name : tag} - - ))} -
-
- )} -
-
- - {/* 편집 버튼 영역 */} -
- {isEditing ? ( - <> - - - - ) : ( -
- - -
- )} -
-
-
- - {/* 메인 컨텐츠 */} -
-
- {/* 작업 설명 */} -
-

작업 설명

-
- {isEditing ? ( -