From 386ce629ace0aa4b563c44a5b6359cbcbc04e1d0 Mon Sep 17 00:00:00 2001 From: dohyeons Date: Wed, 24 Dec 2025 10:20:21 +0900 Subject: [PATCH] =?UTF-8?q?=EB=8B=A4=EC=A4=91=20=EC=84=A0=ED=83=9D=20?= =?UTF-8?q?=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EB=8F=99=EC=8B=9C=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99=20=EB=B0=8F=20=EC=9E=A0=EA=B8=88=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EB=B3=B5=EC=82=AC=20=EC=A0=9C?= =?UTF-8?q?=ED=95=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/contexts/ReportDesignerContext.tsx | 22 ++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/frontend/contexts/ReportDesignerContext.tsx b/frontend/contexts/ReportDesignerContext.tsx index 098e419e..a55a1c6d 100644 --- a/frontend/contexts/ReportDesignerContext.tsx +++ b/frontend/contexts/ReportDesignerContext.tsx @@ -285,7 +285,18 @@ export function ReportDesignerProvider({ reportId, children }: { reportId: strin // 복사 (Ctrl+C) const copyComponents = useCallback(() => { if (selectedComponentIds.length > 0) { - const componentsToCopy = components.filter((comp) => selectedComponentIds.includes(comp.id)); + // 잠긴 컴포넌트는 복사에서 제외 + const componentsToCopy = components.filter( + (comp) => selectedComponentIds.includes(comp.id) && !comp.locked + ); + if (componentsToCopy.length === 0) { + toast({ + title: "복사 불가", + description: "잠긴 컴포넌트는 복사할 수 없습니다.", + variant: "destructive", + }); + return; + } setClipboard(componentsToCopy); toast({ title: "복사 완료", @@ -294,6 +305,15 @@ export function ReportDesignerProvider({ reportId, children }: { reportId: strin } else if (selectedComponentId) { const componentToCopy = components.find((comp) => comp.id === selectedComponentId); if (componentToCopy) { + // 잠긴 컴포넌트는 복사 불가 + if (componentToCopy.locked) { + toast({ + title: "복사 불가", + description: "잠긴 컴포넌트는 복사할 수 없습니다.", + variant: "destructive", + }); + return; + } setClipboard([componentToCopy]); toast({ title: "복사 완료",