From 09fee581860f257980a07bea3bbad95878e4e83e Mon Sep 17 00:00:00 2001 From: kjs Date: Fri, 5 Dec 2025 14:08:07 +0900 Subject: [PATCH] =?UTF-8?q?=ED=99=94=EB=A9=B4=20=EB=B6=84=ED=95=A0=20?= =?UTF-8?q?=ED=8C=A8=EB=84=90=20=EC=9E=90=EB=8F=99=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EB=84=98=EA=B8=B0=EB=8A=94=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EC=84=A4=EC=A0=95=20=EA=B0=80=EB=8A=A5?= =?UTF-8?q?=ED=95=98=EA=B2=8C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../screen-embedding/EmbeddedScreen.tsx | 7 ++++++ .../screen-embedding/ScreenSplitPanel.tsx | 1 + .../screen/InteractiveScreenViewerDynamic.tsx | 6 +++-- frontend/contexts/SplitPanelContext.tsx | 8 +++++++ .../card-display/CardDisplayComponent.tsx | 3 ++- .../ScreenSplitPanelConfigPanel.tsx | 22 +++++++++++++++++++ .../table-list/TableListComponent.tsx | 3 ++- 7 files changed, 46 insertions(+), 4 deletions(-) diff --git a/frontend/components/screen-embedding/EmbeddedScreen.tsx b/frontend/components/screen-embedding/EmbeddedScreen.tsx index 3880fc54..d8e62c00 100644 --- a/frontend/components/screen-embedding/EmbeddedScreen.tsx +++ b/frontend/components/screen-embedding/EmbeddedScreen.tsx @@ -92,10 +92,17 @@ export const EmbeddedScreen = forwardRef { // ์šฐ์ธก ํ™”๋ฉด์ธ ๊ฒฝ์šฐ์—๋งŒ ์ ์šฉ if (position !== "right" || !splitPanelContext) return; + // ์ž๋™ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ์ด ๋น„ํ™œ์„ฑํ™”๋œ ๊ฒฝ์šฐ ์Šคํ‚ต + if (splitPanelContext.disableAutoDataTransfer) { + console.log("๐Ÿ”— [EmbeddedScreen] ์ž๋™ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๋น„ํ™œ์„ฑํ™”๋จ - ๋ฒ„ํŠผ ํด๋ฆญ์œผ๋กœ๋งŒ ์ „๋‹ฌ"); + return; + } + const mappedData = splitPanelContext.getMappedParentData(); if (Object.keys(mappedData).length > 0) { console.log("๐Ÿ”— [EmbeddedScreen] ๋ถ„ํ•  ํŒจ๋„ ๋ถ€๋ชจ ๋ฐ์ดํ„ฐ ์ž๋™ ๋ฐ˜์˜:", mappedData); diff --git a/frontend/components/screen-embedding/ScreenSplitPanel.tsx b/frontend/components/screen-embedding/ScreenSplitPanel.tsx index 60b6bf24..1b0eeb65 100644 --- a/frontend/components/screen-embedding/ScreenSplitPanel.tsx +++ b/frontend/components/screen-embedding/ScreenSplitPanel.tsx @@ -128,6 +128,7 @@ export function ScreenSplitPanel({ screenId, config, initialFormData }: ScreenSp rightScreenId={config?.rightScreenId || null} parentDataMapping={config?.parentDataMapping || []} linkedFilters={config?.linkedFilters || []} + disableAutoDataTransfer={config?.disableAutoDataTransfer ?? false} >
{/* ์ขŒ์ธก ํŒจ๋„ */} diff --git a/frontend/components/screen/InteractiveScreenViewerDynamic.tsx b/frontend/components/screen/InteractiveScreenViewerDynamic.tsx index 41983df3..97dc0734 100644 --- a/frontend/components/screen/InteractiveScreenViewerDynamic.tsx +++ b/frontend/components/screen/InteractiveScreenViewerDynamic.tsx @@ -118,17 +118,19 @@ export const InteractiveScreenViewerDynamic: React.FC>({}); // ๐Ÿ†• ๋ถ„ํ•  ํŒจ๋„์—์„œ ๋งคํ•‘๋œ ๋ถ€๋ชจ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ + // disableAutoDataTransfer๊ฐ€ true์ด๋ฉด ์ž๋™ ์ „๋‹ฌ ๋น„ํ™œ์„ฑํ™” (๋ฒ„ํŠผ ํด๋ฆญ์œผ๋กœ๋งŒ ์ „๋‹ฌ) const splitPanelMappedData = React.useMemo(() => { - if (splitPanelContext) { + if (splitPanelContext && !splitPanelContext.disableAutoDataTransfer) { return splitPanelContext.getMappedParentData(); } return {}; - }, [splitPanelContext, splitPanelContext?.selectedLeftData]); + }, [splitPanelContext, splitPanelContext?.selectedLeftData, splitPanelContext?.disableAutoDataTransfer]); // formData ๊ฒฐ์ • (์™ธ๋ถ€์—์„œ ์ „๋‹ฌ๋ฐ›์€ ๊ฒƒ์ด ์žˆ์œผ๋ฉด ์šฐ์„  ์‚ฌ์šฉ, ๋ถ„ํ•  ํŒจ๋„ ๋ฐ์ดํ„ฐ๋„ ๋ณ‘ํ•ฉ) const formData = React.useMemo(() => { const baseData = externalFormData || localFormData; // ๋ถ„ํ•  ํŒจ๋„ ๋งคํ•‘ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์œผ๋ฉด ๋ณ‘ํ•ฉ (๊ธฐ์กด ๊ฐ’์ด ์—†๋Š” ๊ฒฝ์šฐ์—๋งŒ) + // disableAutoDataTransfer๊ฐ€ true์ด๋ฉด ์ž๋™ ๋ณ‘ํ•ฉ ์•ˆํ•จ if (Object.keys(splitPanelMappedData).length > 0) { const merged = { ...baseData }; for (const [key, value] of Object.entries(splitPanelMappedData)) { diff --git a/frontend/contexts/SplitPanelContext.tsx b/frontend/contexts/SplitPanelContext.tsx index 99cccdd8..20a0be00 100644 --- a/frontend/contexts/SplitPanelContext.tsx +++ b/frontend/contexts/SplitPanelContext.tsx @@ -88,6 +88,9 @@ interface SplitPanelContextValue { // ๐Ÿ†• ์—ฐ๊ฒฐ ํ•„ํ„ฐ ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ (์šฐ์ธก ํ…Œ์ด๋ธ” ์กฐํšŒ ์‹œ ์‚ฌ์šฉ) getLinkedFilterValues: () => Record; + + // ๐Ÿ†• ์ž๋™ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๋น„ํ™œ์„ฑํ™” ์—ฌ๋ถ€ (๋ฒ„ํŠผ ํด๋ฆญ ์‹œ์—๋งŒ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ) + disableAutoDataTransfer: boolean; } const SplitPanelContext = createContext(null); @@ -98,6 +101,7 @@ interface SplitPanelProviderProps { rightScreenId: number | null; parentDataMapping?: ParentDataMapping[]; // ๐Ÿ†• ๋ถ€๋ชจ ๋ฐ์ดํ„ฐ ๋งคํ•‘ ์„ค์ • linkedFilters?: LinkedFilter[]; // ๐Ÿ†• ์—ฐ๊ฒฐ ํ•„ํ„ฐ ์„ค์ • + disableAutoDataTransfer?: boolean; // ๐Ÿ†• ์ž๋™ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๋น„ํ™œ์„ฑํ™” (๋ฒ„ํŠผ ํด๋ฆญ ์‹œ์—๋งŒ ์ „๋‹ฌ) children: React.ReactNode; } @@ -110,6 +114,7 @@ export function SplitPanelProvider({ rightScreenId, parentDataMapping = [], linkedFilters = [], + disableAutoDataTransfer = false, children, }: SplitPanelProviderProps) { // ์ขŒ์ธก/์šฐ์ธก ํ™”๋ฉด์˜ ๋ฐ์ดํ„ฐ ์ˆ˜์‹ ์ž ๋งต @@ -372,6 +377,8 @@ export function SplitPanelProvider({ // ๐Ÿ†• ์—ฐ๊ฒฐ ํ•„ํ„ฐ ๊ด€๋ จ linkedFilters, getLinkedFilterValues, + // ๐Ÿ†• ์ž๋™ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๋น„ํ™œ์„ฑํ™” ์—ฌ๋ถ€ + disableAutoDataTransfer, }), [ splitPanelId, leftScreenId, @@ -391,6 +398,7 @@ export function SplitPanelProvider({ getMappedParentData, linkedFilters, getLinkedFilterValues, + disableAutoDataTransfer, ]); return ( diff --git a/frontend/lib/registry/components/card-display/CardDisplayComponent.tsx b/frontend/lib/registry/components/card-display/CardDisplayComponent.tsx index 55f6ea25..a3876188 100644 --- a/frontend/lib/registry/components/card-display/CardDisplayComponent.tsx +++ b/frontend/lib/registry/components/card-display/CardDisplayComponent.tsx @@ -345,7 +345,8 @@ export const CardDisplayComponent: React.FC = ({ } // ๋ถ„ํ•  ํŒจ๋„ ์ปจํ…์ŠคํŠธ์— ์„ ํƒ๋œ ๋ฐ์ดํ„ฐ ์ €์žฅ (์ขŒ์ธก ํ™”๋ฉด์ธ ๊ฒฝ์šฐ) - if (splitPanelContext && splitPanelPosition === "left") { + // disableAutoDataTransfer๊ฐ€ true์ด๋ฉด ์ž๋™ ์ „๋‹ฌ ๋น„ํ™œ์„ฑํ™” (๋ฒ„ํŠผ ํด๋ฆญ์œผ๋กœ๋งŒ ์ „๋‹ฌ) + if (splitPanelContext && splitPanelPosition === "left" && !splitPanelContext.disableAutoDataTransfer) { if (checked) { splitPanelContext.setSelectedLeftData(data); console.log("[CardDisplay] ๋ถ„ํ•  ํŒจ๋„ ์ขŒ์ธก ๋ฐ์ดํ„ฐ ์ €์žฅ:", { diff --git a/frontend/lib/registry/components/screen-split-panel/ScreenSplitPanelConfigPanel.tsx b/frontend/lib/registry/components/screen-split-panel/ScreenSplitPanelConfigPanel.tsx index b8a1d3dc..0c167ab5 100644 --- a/frontend/lib/registry/components/screen-split-panel/ScreenSplitPanelConfigPanel.tsx +++ b/frontend/lib/registry/components/screen-split-panel/ScreenSplitPanelConfigPanel.tsx @@ -53,6 +53,7 @@ export function ScreenSplitPanelConfigPanel({ config = {}, onChange }: ScreenSpl buttonPosition: config.buttonPosition || "center", parentDataMapping: config.parentDataMapping || [] as ParentDataMapping[], linkedFilters: config.linkedFilters || [] as LinkedFilter[], + disableAutoDataTransfer: config.disableAutoDataTransfer ?? false, // ์ž๋™ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๋น„ํ™œ์„ฑํ™” ...config, }); @@ -69,6 +70,7 @@ export function ScreenSplitPanelConfigPanel({ config = {}, onChange }: ScreenSpl buttonPosition: config.buttonPosition || "center", parentDataMapping: config.parentDataMapping || [], linkedFilters: config.linkedFilters || [], + disableAutoDataTransfer: config.disableAutoDataTransfer ?? false, ...config, }); }, [config]); @@ -386,6 +388,26 @@ export function ScreenSplitPanelConfigPanel({ config = {}, onChange }: ScreenSpl onCheckedChange={(checked) => updateConfig("resizable", checked)} />
+ + + +
+
+ +

+ ์ขŒ์ธก ํ–‰ ์„ ํƒ ์‹œ ์šฐ์ธก์œผ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ์ž๋™ ์ „๋‹ฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. +
+ ๋ฒ„ํŠผ ํด๋ฆญ์œผ๋กœ๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋ ค๋ฉด ํ™œ์„ฑํ™”ํ•˜์„ธ์š”. +

+
+ updateConfig("disableAutoDataTransfer", checked)} + /> +
diff --git a/frontend/lib/registry/components/table-list/TableListComponent.tsx b/frontend/lib/registry/components/table-list/TableListComponent.tsx index 5b397d57..64e6e540 100644 --- a/frontend/lib/registry/components/table-list/TableListComponent.tsx +++ b/frontend/lib/registry/components/table-list/TableListComponent.tsx @@ -1764,7 +1764,8 @@ export const TableListComponent: React.FC = ({ handleRowSelection(rowKey, !isCurrentlySelected); // ๐Ÿ†• ๋ถ„ํ•  ํŒจ๋„ ์ปจํ…์ŠคํŠธ์— ์„ ํƒ๋œ ๋ฐ์ดํ„ฐ ์ €์žฅ (์ขŒ์ธก ํ™”๋ฉด์ธ ๊ฒฝ์šฐ) - if (splitPanelContext && splitPanelPosition === "left") { + // disableAutoDataTransfer๊ฐ€ true์ด๋ฉด ์ž๋™ ์ „๋‹ฌ ๋น„ํ™œ์„ฑํ™” (๋ฒ„ํŠผ ํด๋ฆญ์œผ๋กœ๋งŒ ์ „๋‹ฌ) + if (splitPanelContext && splitPanelPosition === "left" && !splitPanelContext.disableAutoDataTransfer) { if (!isCurrentlySelected) { // ์„ ํƒ๋œ ๊ฒฝ์šฐ: ๋ฐ์ดํ„ฐ ์ €์žฅ splitPanelContext.setSelectedLeftData(row);