From 581fd7a19f1ae6f31f995fcaf0372fe94d8a2716 Mon Sep 17 00:00:00 2001 From: theorose49 Date: Sun, 28 Jun 2026 11:23:38 +0900 Subject: [PATCH] =?UTF-8?q?feat(project):=20=EA=B3=84=EC=95=BD=EB=B2=94?= =?UTF-8?q?=EC=9C=84=20=EA=B8=80/=EA=B7=B8=EB=A6=BC=20=EC=9E=85=EB=A0=A5?= =?UTF-8?q?=EC=B9=B8=20+=20=EC=9D=B8=ED=84=B4/=EC=A7=81=EC=B1=85/=EC=B4=88?= =?UTF-8?q?=EA=B3=BC=EA=B7=BC=EB=AC=B4/=EB=A1=9C=EA=B3=A0/=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=EC=95=84=EC=9B=83=20=EA=B0=9C=EC=84=A0=EB=B6=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 (1M context) --- src/lib/format.ts | 1 + src/pages/ProjectDetail.tsx | 7 ++++--- src/pages/Projects.tsx | 19 +++++++++---------- src/pages/admin/ProjectsAdmin.tsx | 4 ++-- src/types.ts | 4 ++-- 5 files changed, 18 insertions(+), 17 deletions(-) diff --git a/src/lib/format.ts b/src/lib/format.ts index c2b3a22..e83d036 100644 --- a/src/lib/format.ts +++ b/src/lib/format.ts @@ -119,6 +119,7 @@ export const STAGE_KIND_LABELS: Record = { final: "잔금", }; +// 인센티브 BE/non-BE 라벨 (프로젝트 계약범위와 무관 — 그쪽은 자유 텍스트) export const SCOPE_LABELS: Record = { be: "BE", non_be: "non-BE", diff --git a/src/pages/ProjectDetail.tsx b/src/pages/ProjectDetail.tsx index 19b72a7..49fab99 100644 --- a/src/pages/ProjectDetail.tsx +++ b/src/pages/ProjectDetail.tsx @@ -18,7 +18,7 @@ import { import { Gantt } from "@/components/Gantt"; import { Kanban } from "@/components/Kanban"; import { - formatDate, formatWon, formatSize, PROJECT_STATUS_META, SCOPE_LABELS, LANE_LABELS, classNames, + formatDate, formatWon, formatSize, PROJECT_STATUS_META, LANE_LABELS, classNames, } from "@/lib/format"; import type { Lane, PaymentSplit, Project, ProjectTask } from "@/types"; @@ -46,7 +46,7 @@ export function ProjectDetailPage() { 프로젝트 목록 {p.name} {m && }} - description={`${p.companyName} · ${p.productName} ${p.versionName} · ${p.consultingType} · ${p.country} · ${SCOPE_LABELS[p.scope] ?? p.scope}`} + description={`${p.companyName} · ${p.productName} ${p.versionName} · ${p.consultingType} · ${p.country}`} />
@@ -77,7 +77,8 @@ function Overview({ project: p }: { project: Project }) {
- + +
diff --git a/src/pages/Projects.tsx b/src/pages/Projects.tsx index 8981f79..b497179 100644 --- a/src/pages/Projects.tsx +++ b/src/pages/Projects.tsx @@ -10,7 +10,7 @@ import { Card, Button, Badge, PageHeader, Modal, Field, Input, Select, Textarea, EmptyState, LoadingState, } from "@/components/ui"; -import { formatDate, PROJECT_STATUS_META, SCOPE_LABELS } from "@/lib/format"; +import { formatDate, PROJECT_STATUS_META } from "@/lib/format"; // 나의 업무 > 프로젝트: 본인이 참여한 프로젝트만 보는 read-only 뷰 (관리자·유저 동일). // 생성/관리는 관리자 전용 페이지(/admin/projects)에서만 가능. @@ -58,7 +58,8 @@ export function ProjectsPage() {
{p.consultingType} {p.country} - {SCOPE_LABELS[p.scope] ?? p.scope} + {p.scopeText && } + {p.scopeGraphic && 그림}
PM {p.pmEmail?.split("@")[0] || "—"} @@ -82,7 +83,7 @@ export function CreateProjectModal({ onClose }: { onClose: () => void }) { const [productId, setProductId] = useState(""); const verQ = useQuery({ queryKey: ["versions", productId], queryFn: () => getVersions(productId), enabled: !!productId }); const [versionId, setVersionId] = useState(""); - const [form, setForm] = useState({ name: "", consultingType: "", country: "", scope: "both", pmEmail: "", cautions: "", startDate: "", dueDate: "" }); + const [form, setForm] = useState({ name: "", consultingType: "", country: "", scopeText: "", scopeGraphic: "", pmEmail: "", cautions: "", startDate: "", dueDate: "" }); // quick-add master data const [newCompany, setNewCompany] = useState(""); @@ -97,7 +98,6 @@ export function CreateProjectModal({ onClose }: { onClose: () => void }) { mutationFn: () => createProject({ ...form, companyId, productId, versionId, companyName: comp?.name, productName: prod?.name, versionName: ver?.label, - scope: form.scope as any, }), onSuccess: () => { qc.invalidateQueries({ queryKey: ["projects"] }); onClose(); }, }); @@ -144,14 +144,13 @@ export function CreateProjectModal({ onClose }: { onClose: () => void }) {
-
+
setForm({ ...form, consultingType: e.target.value })} placeholder="예: 510(k)" /> setForm({ ...form, country: e.target.value })} placeholder="예: 미국(FDA)" /> - - - +
+
+