From af1b7155278a2823a2bede275b7ea98616d0ca88 Mon Sep 17 00:00:00 2001 From: whqtker Date: Sun, 2 Aug 2026 01:48:01 +0900 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20=EC=A7=80=EC=9B=90=20=EB=8C=80?= =?UTF-8?q?=ED=95=99=20=EC=88=98=EC=A0=95=20=EB=AA=A8=EB=8B=AC=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EC=A0=95=EC=9B=90=20=EC=99=B8=20=ED=95=84=EB=93=9C?= =?UTF-8?q?=EA=B0=80=20=EC=B1=84=EC=9B=8C=EC=A7=80=EC=A7=80=20=EC=95=8A?= =?UTF-8?q?=EB=8D=98=20=EB=AC=B8=EC=A0=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 수정 모달을 열 때 검색 목록(search/text) 응답의 값으로 폼을 채웠는데, 그 응답에는 정원(studentCapacity) 외 필드가 애초에 포함되어 있지 않아 나머지 항목은 값이 있어도 항상 비어 보였다. GET /admin/univ-apply-infos/{id} 단건 조회 API(백엔드 #817)를 호출해 상세 정보를 받아온 뒤 폼을 채우도록 수정했다. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01EwpgqdNTrn8dGDr7g7WnYg --- .../tabs/UnivApplyInfoManageTab.tsx | 173 ++++++++++-------- apps/admin/src/lib/api/admin.ts | 3 + 2 files changed, 104 insertions(+), 72 deletions(-) diff --git a/apps/admin/src/components/features/univ-apply-infos/tabs/UnivApplyInfoManageTab.tsx b/apps/admin/src/components/features/univ-apply-infos/tabs/UnivApplyInfoManageTab.tsx index 29cf32b3..767b1dec 100644 --- a/apps/admin/src/components/features/univ-apply-infos/tabs/UnivApplyInfoManageTab.tsx +++ b/apps/admin/src/components/features/univ-apply-infos/tabs/UnivApplyInfoManageTab.tsx @@ -1,7 +1,7 @@ "use client"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; -import { type FormEvent, useId, useState } from "react"; +import { type FormEvent, useEffect, useId, useState } from "react"; import { toast } from "sonner"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; @@ -69,6 +69,7 @@ export function UnivApplyInfoManageTab() { const [editModal, setEditModal] = useState({ open: false }); const [editForm, setEditForm] = useState({}); const [editExtraInfoText, setEditExtraInfoText] = useState(""); + const editingId = editModal.open ? editModal.id : undefined; const [createModal, setCreateModal] = useState({ open: false }); const [createForm, setCreateForm] = useState>({}); @@ -103,6 +104,28 @@ export function UnivApplyInfoManageTab() { enabled: hostSearchQuery.length > 0, }); + const editDetailQuery = useQuery({ + queryKey: ["univ-apply-infos", "detail", editingId], + queryFn: () => adminApi.getUnivApplyInfo(editingId as number), + enabled: editingId !== undefined, + }); + + // biome-ignore lint/correctness/useExhaustiveDependencies: 조회된 상세 정보의 id가 바뀔 때만 폼을 채워야 하며, 리페치로 데이터 참조가 바뀌어도 수정 중인 값을 덮어쓰면 안 됨 + useEffect(() => { + if (!editDetailQuery.data) return; + const detail = editDetailQuery.data; + setEditForm({ + studentCapacity: detail.studentCapacity, + semesterAvailableForDispatch: detail.semesterAvailableForDispatch, + semesterRequirement: detail.semesterRequirement, + detailsForLanguage: detail.detailsForLanguage, + gpaRequirement: detail.gpaRequirement, + gpaRequirementCriteria: detail.gpaRequirementCriteria, + detailsForAccommodation: detail.detailsForAccommodation, + }); + setEditExtraInfoText(detail.extraInfo ? JSON.stringify(detail.extraInfo, null, 2) : ""); + }, [editDetailQuery.data?.id]); + const updateMutation = useMutation({ mutationFn: ({ id, data }: { id: number; data: UnivApplyInfoUpdatePayload }) => adminApi.updateUnivApplyInfo(id, data), @@ -158,7 +181,7 @@ export function UnivApplyInfoManageTab() { }; const handleOpenEdit = (item: UnivApplyInfoSearchResult) => { - setEditForm({ studentCapacity: item.studentCapacity }); + setEditForm({}); setEditExtraInfoText(""); setEditModal({ open: true, id: item.id, name: item.koreanName }); }; @@ -363,85 +386,91 @@ export function UnivApplyInfoManageTab() { ✕ -
-
- - - setEditForm((p) => ({ - ...p, - studentCapacity: e.target.value ? Number(e.target.value) : undefined, - })) - } - /> -
-
- - -
- {EDIT_TEXT_FIELDS.map(({ key, label }) => ( -
-