From 714df90b5df8d58b0537b973ecca3dee9d3e8386 Mon Sep 17 00:00:00 2001 From: HiJuwon Date: Fri, 22 Aug 2025 02:28:31 +0900 Subject: [PATCH 1/9] =?UTF-8?q?#196=20[MOD]=20=EC=83=81=EC=84=B8=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20=EC=A2=8C/=EC=9A=B0=20=EC=98=81=EC=97=AD?= =?UTF-8?q?=20=EC=B5=9C=EC=86=8C=20=EA=B0=80=EB=A1=9C=20=EB=84=88=EB=B9=84?= =?UTF-8?q?=20=EC=A7=80=EC=A0=95=20&=20=EC=B5=9C=EC=83=81=EC=9C=84=20?= =?UTF-8?q?=EC=BB=A8=ED=85=8C=EC=9D=B4=EB=84=88=EC=97=90=20overflow-x-auto?= =?UTF-8?q?=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/goal/GoalDetail.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/pages/goal/GoalDetail.tsx b/src/pages/goal/GoalDetail.tsx index b95a114..566e9bf 100644 --- a/src/pages/goal/GoalDetail.tsx +++ b/src/pages/goal/GoalDetail.tsx @@ -340,14 +340,14 @@ const GoalDetail = ({ initialMode }: GoalDetailProps) => { }; return ( -
+
{/* 상세페이지 헤더 */} {/* 상세페이지 메인 */} -
+
{/* 상세페이지 좌측 영역 - 제목 & 상세설명 & 댓글 */} -
+
{/* 상세페이지 제목 */} {
{/* 상세페이지 우측 영역 - 속성 탭 & 하단의 작성 완료 버튼 */} -
+
{/* 속성 탭 */}
속성
From 422aef7681241afa1d325b7e32fd06b4eff736bf Mon Sep 17 00:00:00 2001 From: HiJuwon Date: Fri, 22 Aug 2025 02:35:00 +0900 Subject: [PATCH 2/9] =?UTF-8?q?#196=20[MOD]=20=EC=A0=84=EC=B2=B4=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=ED=8E=98=EC=9D=B4=EC=A7=80=20=EB=AA=A8?= =?UTF-8?q?=EB=91=90=20=EC=A2=8C/=EC=9A=B0=20=EC=98=81=EC=97=AD=20?= =?UTF-8?q?=EC=B5=9C=EC=86=8C=20width=20=EC=A7=80=EC=A0=95=20&=20=EC=B5=9C?= =?UTF-8?q?=EC=83=81=EC=9C=84=20=EC=BB=A8=ED=85=8C=EC=9D=B4=EB=84=88?= =?UTF-8?q?=EC=97=90=20overflow-x-auto=20=EC=A0=81=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=97=AC=20=EB=B0=98=EC=9D=91=ED=98=95=20=EC=88=98=EC=A0=95=20?= =?UTF-8?q?=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/external/ExternalDetail.tsx | 8 ++++---- src/pages/issue/IssueDetail.tsx | 8 ++++---- src/pages/workspace/WorkspaceExternalDetail.tsx | 8 ++++---- src/pages/workspace/WorkspaceGoalDetail.tsx | 8 ++++---- src/pages/workspace/WorkspaceIssueDetail.tsx | 8 ++++---- 5 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/pages/external/ExternalDetail.tsx b/src/pages/external/ExternalDetail.tsx index 81b9f2d..230a4e2 100644 --- a/src/pages/external/ExternalDetail.tsx +++ b/src/pages/external/ExternalDetail.tsx @@ -476,14 +476,14 @@ const ExternalDetail = ({ initialMode }: ExternalDetailProps) => { }; return ( -
+
{/* 상세페이지 헤더 */} {/* 상세페이지 메인 */} -
+
{/* 상세페이지 좌측 영역 - 제목 & 상세설명 & 댓글 */} -
+
{/* 상세페이지 제목 */} {
{/* 상세페이지 우측 영역 - 속성 탭 & 하단의 작성 완료 버튼 */} -
+
{/* 속성 탭 */}
속성
diff --git a/src/pages/issue/IssueDetail.tsx b/src/pages/issue/IssueDetail.tsx index 877e3d7..99bc8f8 100644 --- a/src/pages/issue/IssueDetail.tsx +++ b/src/pages/issue/IssueDetail.tsx @@ -355,14 +355,14 @@ const IssueDetail = ({ initialMode }: IssueDetailProps) => { }; return ( -
+
{/* 상세페이지 헤더 */} {/* 상세페이지 메인 */} -
+
{/* 상세페이지 좌측 영역 - 제목 & 상세설명 & 댓글 */} -
+
{/* 상세페이지 제목 */} {
{/* 상세페이지 우측 영역 - 속성 탭 & 하단의 작성 완료 버튼 */} -
+
{/* 속성 탭 */}
속성
diff --git a/src/pages/workspace/WorkspaceExternalDetail.tsx b/src/pages/workspace/WorkspaceExternalDetail.tsx index e42e8b9..5e5b15b 100644 --- a/src/pages/workspace/WorkspaceExternalDetail.tsx +++ b/src/pages/workspace/WorkspaceExternalDetail.tsx @@ -477,14 +477,14 @@ const WorkspaceExternalDetail = ({ initialMode }: WorkspaceExternalDetailProps) }; return ( -
+
{/* 상세페이지 헤더 */} {/* 상세페이지 메인 */} -
+
{/* 상세페이지 좌측 영역 - 제목 & 상세설명 & 댓글 */} -
+
{/* 상세페이지 제목 */} {/* 상세페이지 우측 영역 - 속성 탭 & 하단의 작성 완료 버튼 */} -
+
{/* 속성 탭 */}
속성
diff --git a/src/pages/workspace/WorkspaceGoalDetail.tsx b/src/pages/workspace/WorkspaceGoalDetail.tsx index c0a8e42..93c3ee9 100644 --- a/src/pages/workspace/WorkspaceGoalDetail.tsx +++ b/src/pages/workspace/WorkspaceGoalDetail.tsx @@ -343,14 +343,14 @@ const WorkspaceGoalDetail = ({ initialMode }: WorkspaceGoalDetailProps) => { }; return ( -
+
{/* 상세페이지 헤더 */} {/* 상세페이지 메인 */} -
+
{/* 상세페이지 좌측 영역 - 제목 & 상세설명 & 댓글 */} -
+
{/* 상세페이지 제목 */} {
{/* 상세페이지 우측 영역 - 속성 탭 & 하단의 작성 완료 버튼 */} -
+
{/* 속성 탭 */}
속성
diff --git a/src/pages/workspace/WorkspaceIssueDetail.tsx b/src/pages/workspace/WorkspaceIssueDetail.tsx index 9be35d6..35e7401 100644 --- a/src/pages/workspace/WorkspaceIssueDetail.tsx +++ b/src/pages/workspace/WorkspaceIssueDetail.tsx @@ -355,14 +355,14 @@ const WorkspaceIssueDetail = ({ initialMode }: WorkspaceIssueDetailProps) => { }; return ( -
+
{/* 상세페이지 헤더 */} {/* 상세페이지 메인 */} -
+
{/* 상세페이지 좌측 영역 - 제목 & 상세설명 & 댓글 */} -
+
{/* 상세페이지 제목 */} {
{/* 상세페이지 우측 영역 - 속성 탭 & 하단의 작성 완료 버튼 */} -
+
{/* 속성 탭 */}
속성
From d04f4cde8d8f88438288619fc85fa1138a71f89c Mon Sep 17 00:00:00 2001 From: HiJuwon Date: Fri, 22 Aug 2025 03:31:28 +0900 Subject: [PATCH 3/9] =?UTF-8?q?#198=20[MOD]=20DetailHeader=20=EB=82=B4?= =?UTF-8?q?=EB=B6=80=EC=97=90=EC=84=9C=20=EC=A7=81=EC=A0=91=20=ED=9B=85?= =?UTF-8?q?=EC=9D=84=20=ED=98=B8=EC=B6=9C=ED=95=98=EC=97=AC=20Id=EA=B0=92?= =?UTF-8?q?=20=EB=B6=88=EB=9F=AC=EC=98=A4=EB=8A=94=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C=20&=20=ED=97=A4=EB=8D=94=20=EB=A0=8C?= =?UTF-8?q?=EB=8D=94=EB=A7=81=EB=A7=8C=20=ED=95=98=EB=8A=94=20=EA=B2=83?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20?= =?UTF-8?q?=EC=97=AD=ED=95=A0=20=EC=B6=95=EC=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/DetailView/DetailHeader.tsx | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/src/components/DetailView/DetailHeader.tsx b/src/components/DetailView/DetailHeader.tsx index bb2f535..54cbaef 100644 --- a/src/components/DetailView/DetailHeader.tsx +++ b/src/components/DetailView/DetailHeader.tsx @@ -1,7 +1,4 @@ import TeamIcon from '../ListView/TeamIcon'; -import { useGetGoalName } from '../../apis/goal/useGetGoalName.ts'; -import { useGetExternalName } from '../../apis/external/useGetExternalName.ts'; -import { useGetIssueName } from '../../apis/issue/useGetIssueName.ts'; import { useNavigate, useParams } from 'react-router-dom'; import { useGetWorkspaceTeams } from '../../apis/setting/useGetWorkspaceTeams.ts'; import { useMemo } from 'react'; @@ -10,17 +7,12 @@ interface DetailHeaderProps { type: 'goal' | 'issue' | 'external'; defaultTitle: string; // 상세페이지 제목에 아무것도 입력되지 않았을 때 기본 타이틀 title: string; // 상세페이지 제목으로부터 전달받아올 타이틀 + detailId?: string; // 상세페이지 id (부모에서 받아올 예정) } -const DetailHeader = ({ type, defaultTitle, title }: DetailHeaderProps) => { +const DetailHeader = ({ type, defaultTitle, title, detailId }: DetailHeaderProps) => { const navigate = useNavigate(); const teamId = Number(useParams<{ teamId: string }>().teamId); - const { data: detailId } = - type === 'goal' - ? useGetGoalName(teamId) - : type === 'issue' - ? useGetIssueName(teamId) - : useGetExternalName(teamId); // 팀 정보 불러오기 const { data: teamData } = useGetWorkspaceTeams(); @@ -28,17 +20,22 @@ const DetailHeader = ({ type, defaultTitle, title }: DetailHeaderProps) => { return teamData?.pages[0].teamList.find((team) => team.teamId === Number(teamId)); }, [teamData, teamId]); + const canNavigate = Boolean(currentTeam?.teamId); + return (
{/* 팀 아이콘, 팀명, props로 요소 전달 가능 */} navigate(`/workspace/team/${currentTeam?.teamId}/${type}`)} + onClick={() => { + if (!canNavigate) return; + navigate(`/workspace/team/${currentTeam?.teamId}/${type}`); + }} />
{/* 상세페이지 ID */} -
{detailId}
+
{detailId ?? ''}
{/** * 상세페이지 이름 * - 상세페이지 제목에 아무것도 입력되지 않았을 때는 defaultTitle(placeholder명과 동일) 렌더링 From d9353cbcda1f244ac1a0886963c798ede93b4279 Mon Sep 17 00:00:00 2001 From: HiJuwon Date: Fri, 22 Aug 2025 03:32:18 +0900 Subject: [PATCH 4/9] =?UTF-8?q?#198=20[MOD]=20=EB=AA=A9=ED=91=9C=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EC=A1=B0=ED=9A=8C=20API=20=ED=95=A8?= =?UTF-8?q?=EC=88=98=EC=97=90=20enabled=20=EC=98=B5=EC=85=98=EC=9D=84=20?= =?UTF-8?q?=ED=9B=85=20=EB=B0=94=EA=B9=A5=EC=97=90=EC=84=9C=20=EA=B2=B0?= =?UTF-8?q?=EC=A0=95=ED=95=98=EB=8F=84=EB=A1=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/apis/goal/useGetGoalName.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/apis/goal/useGetGoalName.ts b/src/apis/goal/useGetGoalName.ts index ba5a9b9..9666402 100644 --- a/src/apis/goal/useGetGoalName.ts +++ b/src/apis/goal/useGetGoalName.ts @@ -17,9 +17,10 @@ const getGoalName = async (teamId: number): Promise => { } }; -export const useGetGoalName = (teamId: number) => { +export const useGetGoalName = (teamId: number, opts?: { enabled?: boolean }) => { return useQuery({ queryKey: [queryKey.GOAL_NAME, teamId], queryFn: () => getGoalName(teamId), + enabled: (opts?.enabled ?? true) && Number.isFinite(teamId) && teamId > 0, }); }; From 098182166d7299ad04f379a06b2ebb43dcd606c5 Mon Sep 17 00:00:00 2001 From: HiJuwon Date: Fri, 22 Aug 2025 03:32:58 +0900 Subject: [PATCH 5/9] =?UTF-8?q?#198=20[MOD]=20GoalDetail=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=EB=AA=A8=EB=93=9C=EA=B0=80=20=EC=95=84=EB=8B=90=20?= =?UTF-8?q?=EB=95=8C=EB=8A=94=20=EC=A1=B0=ED=9A=8C=20=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=EC=9D=98=20name=EC=9D=84=20=EA=B0=80=EC=A0=B8?= =?UTF-8?q?=EC=99=80=20DetailHeader=EC=97=90=20DetailId=EB=A1=9C=20?= =?UTF-8?q?=EB=84=98=EA=B8=B0=EB=8A=94=20=EA=B2=83=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/goal/GoalDetail.tsx | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/pages/goal/GoalDetail.tsx b/src/pages/goal/GoalDetail.tsx index 566e9bf..d86a679 100644 --- a/src/pages/goal/GoalDetail.tsx +++ b/src/pages/goal/GoalDetail.tsx @@ -53,6 +53,7 @@ import { queryKey } from '../../constants/queryKey'; import queryClient from '../../utils/queryClient'; import { useModalActions, useModalInfo } from '../../hooks/useModal'; import Modal from '../../components/Modal/Modal'; +import { useGetGoalName } from '../../apis/goal/useGetGoalName'; /** 상세페이지 모드 구분 * (1) create - 생성 모드: 처음에 생성하여 작성 완료하기 전 @@ -103,6 +104,15 @@ const GoalDetail = ({ initialMode }: GoalDetailProps) => { const canPatch = Number.isFinite(numericGoalId); // PATCH 가능 조건 const blocker = useBlocker(isEditable); // 편집하고 있는 상황에 화면 이동을 블로킹 + // 생성 모드에서만 "다음 생성될 이름"을 조회 + const isCreate = mode === 'create'; + const { data: nextGeneratedName } = useGetGoalName(teamId, { + enabled: isCreate, + }); + + // 헤더표시용 이름: 생성 모드면 nextGeneratedName, 그 외엔 조회 데이터의 name + const headerDetailName = isCreate ? nextGeneratedName : goalDetail?.name; + // 단일 선택 라벨 const selectedStatusLabel = STATUS_LABELS[state]; const selectedPriorityLabel = PRIORITY_LABELS[priority]; @@ -342,7 +352,12 @@ const GoalDetail = ({ initialMode }: GoalDetailProps) => { return (
{/* 상세페이지 헤더 */} - + {/* 상세페이지 메인 */}
From 2886a25cb97dccd3f9f44513711047089946c7df Mon Sep 17 00:00:00 2001 From: HiJuwon Date: Fri, 22 Aug 2025 03:35:19 +0900 Subject: [PATCH 6/9] =?UTF-8?q?#198=20[MOD]=20=EC=83=9D=EC=84=B1=EB=90=A0?= =?UTF-8?q?=20=EC=9D=B4=EC=8A=88=20=EC=9D=B4=EB=A6=84=20=EC=A1=B0=ED=9A=8C?= =?UTF-8?q?=20&=20=EC=99=B8=EB=B6=80=20=EC=9D=B4=EB=A6=84=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20API=20=ED=95=A8=EC=88=98=EC=97=90=20enabled=20?= =?UTF-8?q?=EC=98=B5=EC=85=98=EC=9D=84=20=ED=9B=85=20=EB=B0=94=EA=B9=A5?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EC=B2=98=EB=A6=AC=ED=95=98=EC=97=AC=20?= =?UTF-8?q?=EC=8B=A4=ED=96=89=ED=95=98=EB=8F=84=EB=A1=9D=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/apis/external/useGetExternalName.ts | 3 ++- src/apis/issue/useGetIssueName.ts | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/apis/external/useGetExternalName.ts b/src/apis/external/useGetExternalName.ts index 35619b3..922452f 100644 --- a/src/apis/external/useGetExternalName.ts +++ b/src/apis/external/useGetExternalName.ts @@ -17,9 +17,10 @@ const getExternalName = async (teamId: number): Promise => { } }; -export const useGetExternalName = (teamId: number) => { +export const useGetExternalName = (teamId: number, opts?: { enabled?: boolean }) => { return useQuery({ queryKey: [queryKey.EXTERNAL_NAME, teamId], queryFn: () => getExternalName(teamId), + enabled: (opts?.enabled ?? true) && Number.isFinite(teamId) && teamId > 0, }); }; diff --git a/src/apis/issue/useGetIssueName.ts b/src/apis/issue/useGetIssueName.ts index af4c302..5d138d1 100644 --- a/src/apis/issue/useGetIssueName.ts +++ b/src/apis/issue/useGetIssueName.ts @@ -17,9 +17,10 @@ const getIssueName = async (teamId: number): Promise => { } }; -export const useGetIssueName = (teamId: number) => { +export const useGetIssueName = (teamId: number, opts?: { enabled?: boolean }) => { return useQuery({ queryKey: [queryKey.ISSUE_NAME, teamId], queryFn: () => getIssueName(teamId), + enabled: (opts?.enabled ?? true) && Number.isFinite(teamId) && teamId > 0, }); }; From 2abf75fd5af4b6c32b0f4d8e8cc9b6725a8b475e Mon Sep 17 00:00:00 2001 From: HiJuwon Date: Fri, 22 Aug 2025 03:39:47 +0900 Subject: [PATCH 7/9] =?UTF-8?q?#198=20[MOD]=20=EC=9B=8C=ED=81=AC=EC=8A=A4?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=8A=A4=20=EA=B8=B0=EB=B3=B8=ED=8C=80?= =?UTF-8?q?=EC=9D=98=20=EC=83=81=EC=84=B8=ED=8E=98=EC=9D=B4=EC=A7=80=20?= =?UTF-8?q?=ED=97=A4=EB=8D=94=EC=97=90=20=EC=83=81=EC=84=B8=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20Id=EB=A5=BC=20=EB=B0=9B=EC=95=84=EC=98=A4?= =?UTF-8?q?=EB=8A=94=20=EB=A1=9C=EC=A7=81=20=EC=A0=9C=EA=B1=B0=20&=20?= =?UTF-8?q?=ED=97=A4=EB=8D=94=20=EB=A0=8C=EB=8D=94=EB=A7=81=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EC=97=AD?= =?UTF-8?q?=ED=95=A0=20=EC=B6=95=EC=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DetailView/WorkspaceDetailHeader.tsx | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/src/components/DetailView/WorkspaceDetailHeader.tsx b/src/components/DetailView/WorkspaceDetailHeader.tsx index 8365b79..cd2cae8 100644 --- a/src/components/DetailView/WorkspaceDetailHeader.tsx +++ b/src/components/DetailView/WorkspaceDetailHeader.tsx @@ -1,8 +1,5 @@ import WorkspaceIcon from '../ListView/WorkspaceIcon'; import { useNavigate, useParams } from 'react-router-dom'; -import { useGetGoalName } from '../../apis/goal/useGetGoalName.ts'; -import { useGetIssueName } from '../../apis/issue/useGetIssueName.ts'; -import { useGetExternalName } from '../../apis/external/useGetExternalName.ts'; import { useGetWorkspaceTeams } from '../../apis/setting/useGetWorkspaceTeams.ts'; import { useMemo } from 'react'; @@ -10,17 +7,17 @@ interface WorkspaceDetailHeaderProps { type: 'goal' | 'issue' | 'external'; defaultTitle: string; // 상세페이지 제목에 아무것도 입력되지 않았을 때 기본 타이틀 title: string; // 상세페이지 제목으로부터 전달받아올 타이틀 + detailId?: string; } -const WorkspaceDetailHeader = ({ type, defaultTitle, title }: WorkspaceDetailHeaderProps) => { +const WorkspaceDetailHeader = ({ + type, + defaultTitle, + title, + detailId, +}: WorkspaceDetailHeaderProps) => { const navigate = useNavigate(); const teamId = Number(useParams<{ teamId: string }>().teamId); - const { data: detailId } = - type === 'goal' - ? useGetGoalName(teamId) - : type === 'issue' - ? useGetIssueName(teamId) - : useGetExternalName(teamId); // 팀 정보 불러오기 const { data: teamData } = useGetWorkspaceTeams(); @@ -28,17 +25,22 @@ const WorkspaceDetailHeader = ({ type, defaultTitle, title }: WorkspaceDetailHea return teamData?.pages[0].teamList.find((team) => team.teamId === Number(teamId)); }, [teamData, teamId]); + const canNavigate = Boolean(currentTeam?.teamId); + return (
{/* 워크스페이스 아이콘, 워크스페이스명, props로 요소 전달 가능 */} navigate(`/workspace/default/team/${currentTeam?.teamId}/${type}`)} + onClick={() => { + if (!canNavigate) return; + navigate(`/workspace/default/team/${currentTeam?.teamId}/${type}`); + }} />
{/* 상세페이지 ID */} -
{detailId}
+
{detailId ?? ''}
{/** * 상세페이지 이름 * - 상세페이지 제목에 아무것도 입력되지 않았을 때는 defaultTitle(placeholder명과 동일) 렌더링 From 820408ddd1d345546ee97aa8f940ce6c5242b097 Mon Sep 17 00:00:00 2001 From: HiJuwon Date: Fri, 22 Aug 2025 03:40:27 +0900 Subject: [PATCH 8/9] =?UTF-8?q?#198=20[MOD]=20=EC=9B=8C=ED=81=AC=EC=8A=A4?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=8A=A4=20=EA=B8=B0=EB=B3=B8=20=ED=8C=80?= =?UTF-8?q?=EC=9D=98=20=ED=97=A4=EB=8D=94=20Id=EB=A5=BC=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=EB=AA=A8=EB=93=9C=EC=99=80=20=EC=95=84=EB=8B=90=20?= =?UTF-8?q?=EB=95=8C=EC=97=90=20=EB=94=B0=EB=9D=BC=20=EB=8B=A4=EB=A5=B8=20?= =?UTF-8?q?=EB=B0=A9=EC=8B=9D=EC=9C=BC=EB=A1=9C=20=EC=A1=B0=ED=9A=8C?= =?UTF-8?q?=ED=95=98=EC=97=AC=20=EA=B0=92=20=EB=84=98=EA=B2=A8=EC=A3=BC?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/workspace/WorkspaceGoalDetail.tsx | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/pages/workspace/WorkspaceGoalDetail.tsx b/src/pages/workspace/WorkspaceGoalDetail.tsx index 93c3ee9..d69a0a5 100644 --- a/src/pages/workspace/WorkspaceGoalDetail.tsx +++ b/src/pages/workspace/WorkspaceGoalDetail.tsx @@ -53,6 +53,7 @@ import queryClient from '../../utils/queryClient'; import { queryKey } from '../../constants/queryKey'; import { useModalActions, useModalInfo } from '../../hooks/useModal'; import Modal from '../../components/Modal/Modal'; +import { useGetGoalName } from '../../apis/goal/useGetGoalName'; /** 상세페이지 모드 구분 * (1) create - 생성 모드: 처음에 생성하여 작성 완료하기 전 @@ -103,6 +104,15 @@ const WorkspaceGoalDetail = ({ initialMode }: WorkspaceGoalDetailProps) => { const canPatch = Number.isFinite(numericGoalId); // PATCH 가능 조건 const blocker = useBlocker(isEditable); // 편집하고 있는 상황에 화면 이동을 블로킹 + // 생성 모드에서만 "다음 생성될 이름"을 조회 + const isCreate = mode === 'create'; + const { data: nextGeneratedName } = useGetGoalName(teamId, { + enabled: isCreate, + }); + + // 헤더표시용 이름: 생성 모드면 nextGeneratedName, 그 외엔 조회 데이터의 name + const headerDetailName = isCreate ? nextGeneratedName : goalDetail?.name; + // 단일 선택 라벨 const selectedStatusLabel = STATUS_LABELS[state]; const selectedPriorityLabel = PRIORITY_LABELS[priority]; @@ -251,9 +261,6 @@ const WorkspaceGoalDetail = ({ initialMode }: WorkspaceGoalDetailProps) => { const handleCompletion = () => { if (!isCompleted) { // create 또는 edit 모드에서 view 모드로 전환하려는 시점 - if (Number.isFinite(numericGoalId)) { - queryClient.invalidateQueries({ queryKey: ['GOAL_DETAIL', numericGoalId] }); // 동일 goalId에서 view로 들어갈 때도 최신화 - } handleSubmit(); // 저장 성공 시 모드 전환 } else { handleToggleMode(); // 모드 전환 @@ -345,7 +352,12 @@ const WorkspaceGoalDetail = ({ initialMode }: WorkspaceGoalDetailProps) => { return (
{/* 상세페이지 헤더 */} - + {/* 상세페이지 메인 */}
From 73681c54f06016c368d7496f764a9661915b2dfd Mon Sep 17 00:00:00 2001 From: HiJuwon Date: Fri, 22 Aug 2025 03:51:18 +0900 Subject: [PATCH 9/9] =?UTF-8?q?#198=20[MOD]=20=EC=83=81=EC=84=B8=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20=EC=A0=84=EB=B6=80=20=ED=97=A4=EB=8D=94=20?= =?UTF-8?q?Id=EB=A5=BC=20=EC=83=9D=EC=84=B1=20=EB=AA=A8=EB=93=9C=EC=99=80?= =?UTF-8?q?=20=EC=95=84=EB=8B=90=20=EB=95=8C=EC=97=90=20=EB=94=B0=EB=9D=BC?= =?UTF-8?q?=20=EB=8B=A4=EB=A5=B8=20=EB=B0=A9=EC=8B=9D=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=ED=95=98=EC=97=AC=20=EA=B0=92=20=EB=84=98?= =?UTF-8?q?=EA=B2=A8=EC=A3=BC=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95=20?= =?UTF-8?q?=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/external/ExternalDetail.tsx | 17 ++++++++++++++++- src/pages/issue/IssueDetail.tsx | 17 ++++++++++++++++- src/pages/workspace/WorkspaceExternalDetail.tsx | 17 ++++++++++++++++- src/pages/workspace/WorkspaceIssueDetail.tsx | 17 ++++++++++++++++- 4 files changed, 64 insertions(+), 4 deletions(-) diff --git a/src/pages/external/ExternalDetail.tsx b/src/pages/external/ExternalDetail.tsx index 230a4e2..6e9eb70 100644 --- a/src/pages/external/ExternalDetail.tsx +++ b/src/pages/external/ExternalDetail.tsx @@ -68,6 +68,7 @@ import { import { useToast } from '../../components/Toast/ToastProvider.tsx'; import { useModalActions, useModalInfo } from '../../hooks/useModal.ts'; import Modal from '../../components/Modal/Modal.tsx'; +import { useGetExternalName } from '../../apis/external/useGetExternalName.ts'; /** 상세페이지 모드 구분 * (1) create - 생성 모드: 처음에 생성하여 작성 완료하기 전 @@ -162,6 +163,15 @@ const ExternalDetail = ({ initialMode }: ExternalDetailProps) => { ] : []; + // 생성 모드에서만 "다음 생성될 이름"을 조회 + const isCreate = mode === 'create'; + const { data: nextGeneratedName } = useGetExternalName(teamId, { + enabled: isCreate, + }); + + // 헤더표시용 이름: 생성 모드면 nextGeneratedName, 그 외엔 조회 데이터의 name + const headerDetailName = isCreate ? nextGeneratedName : externalDetail?.name; + // 단일 선택 라벨 const selectedStatusLabel = STATUS_LABELS[state]; const selectedPriorityLabel = PRIORITY_LABELS[priority]; @@ -478,7 +488,12 @@ const ExternalDetail = ({ initialMode }: ExternalDetailProps) => { return (
{/* 상세페이지 헤더 */} - + {/* 상세페이지 메인 */}
diff --git a/src/pages/issue/IssueDetail.tsx b/src/pages/issue/IssueDetail.tsx index 99bc8f8..61d2577 100644 --- a/src/pages/issue/IssueDetail.tsx +++ b/src/pages/issue/IssueDetail.tsx @@ -54,6 +54,7 @@ import { queryKey } from '../../constants/queryKey.ts'; import { useHydrateIssueDetail } from '../../hooks/useHydrateIssueDetail.ts'; import { useModalActions, useModalInfo } from '../../hooks/useModal.ts'; import Modal from '../../components/Modal/Modal.tsx'; +import { useGetIssueName } from '../../apis/issue/useGetIssueName.ts'; /** 상세페이지 모드 구분 * (1) create - 생성 모드: 처음에 생성하여 작성 완료하기 전 @@ -107,6 +108,15 @@ const IssueDetail = ({ initialMode }: IssueDetailProps) => { const canPatch = Number.isFinite(numericIssueId); // PATCH 가능 조건 const blocker = useBlocker(isEditable); // 편집하고 있는 상황에 화면 이동을 블로킹 + // 생성 모드에서만 "다음 생성될 이름"을 조회 + const isCreate = mode === 'create'; + const { data: nextGeneratedName } = useGetIssueName(teamId, { + enabled: isCreate, + }); + + // 헤더표시용 이름: 생성 모드면 nextGeneratedName, 그 외엔 조회 데이터의 name + const headerDetailName = isCreate ? nextGeneratedName : issueDetail?.name; + // 단일 선택 라벨 const selectedStatusLabel = STATUS_LABELS[state]; const selectedPriorityLabel = PRIORITY_LABELS[priority]; @@ -357,7 +367,12 @@ const IssueDetail = ({ initialMode }: IssueDetailProps) => { return (
{/* 상세페이지 헤더 */} - + {/* 상세페이지 메인 */}
diff --git a/src/pages/workspace/WorkspaceExternalDetail.tsx b/src/pages/workspace/WorkspaceExternalDetail.tsx index 5e5b15b..0ad7e87 100644 --- a/src/pages/workspace/WorkspaceExternalDetail.tsx +++ b/src/pages/workspace/WorkspaceExternalDetail.tsx @@ -68,6 +68,7 @@ import { useHydrateExternalDetail } from '../../hooks/useHydrateExternalDetail.t import { useModalActions, useModalInfo } from '../../hooks/useModal.ts'; import { useToast } from '../../components/Toast/ToastProvider.tsx'; import Modal from '../../components/Modal/Modal.tsx'; +import { useGetExternalName } from '../../apis/external/useGetExternalName.ts'; /** 상세페이지 모드 구분 * (1) create - 생성 모드: 처음에 생성하여 작성 완료하기 전 @@ -162,6 +163,15 @@ const WorkspaceExternalDetail = ({ initialMode }: WorkspaceExternalDetailProps) ] : []; + // 생성 모드에서만 "다음 생성될 이름"을 조회 + const isCreate = mode === 'create'; + const { data: nextGeneratedName } = useGetExternalName(teamId, { + enabled: isCreate, + }); + + // 헤더표시용 이름: 생성 모드면 nextGeneratedName, 그 외엔 조회 데이터의 name + const headerDetailName = isCreate ? nextGeneratedName : externalDetail?.name; + // 단일 선택 라벨 const selectedStatusLabel = STATUS_LABELS[state]; const selectedPriorityLabel = PRIORITY_LABELS[priority]; @@ -479,7 +489,12 @@ const WorkspaceExternalDetail = ({ initialMode }: WorkspaceExternalDetailProps) return (
{/* 상세페이지 헤더 */} - + {/* 상세페이지 메인 */}
diff --git a/src/pages/workspace/WorkspaceIssueDetail.tsx b/src/pages/workspace/WorkspaceIssueDetail.tsx index 35e7401..bf41604 100644 --- a/src/pages/workspace/WorkspaceIssueDetail.tsx +++ b/src/pages/workspace/WorkspaceIssueDetail.tsx @@ -54,6 +54,7 @@ import queryClient from '../../utils/queryClient.ts'; import { useHydrateIssueDetail } from '../../hooks/useHydrateIssueDetail.ts'; import { useModalActions, useModalInfo } from '../../hooks/useModal.ts'; import Modal from '../../components/Modal/Modal.tsx'; +import { useGetIssueName } from '../../apis/issue/useGetIssueName.ts'; /** 상세페이지 모드 구분 * (1) create - 생성 모드: 처음에 생성하여 작성 완료하기 전 @@ -107,6 +108,15 @@ const WorkspaceIssueDetail = ({ initialMode }: WorkspaceIssueDetailProps) => { const canPatch = Number.isFinite(numericIssueId); // PATCH 가능 조건 const blocker = useBlocker(isEditable); // 편집하고 있는 상황에 화면 이동을 블로킹 + // 생성 모드에서만 "다음 생성될 이름"을 조회 + const isCreate = mode === 'create'; + const { data: nextGeneratedName } = useGetIssueName(teamId, { + enabled: isCreate, + }); + + // 헤더표시용 이름: 생성 모드면 nextGeneratedName, 그 외엔 조회 데이터의 name + const headerDetailName = isCreate ? nextGeneratedName : issueDetail?.name; + // 단일 선택 라벨 const selectedStatusLabel = STATUS_LABELS[state]; const selectedPriorityLabel = PRIORITY_LABELS[priority]; @@ -357,7 +367,12 @@ const WorkspaceIssueDetail = ({ initialMode }: WorkspaceIssueDetailProps) => { return (
{/* 상세페이지 헤더 */} - + {/* 상세페이지 메인 */}