From a34230ae90112429f51f2a34eca9285208d76d21 Mon Sep 17 00:00:00 2001 From: kjs Date: Mon, 5 Jan 2026 17:44:32 +0900 Subject: [PATCH] =?UTF-8?q?=EB=AA=A8=EB=8B=AC=EC=97=B4=EA=B8=B0=20?= =?UTF-8?q?=EC=95=A1=EC=85=98=20=ED=86=B5=ED=95=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/components/common/ScreenModal.tsx | 122 +------ .../config-panels/ButtonConfigPanel.tsx | 60 ++-- frontend/components/unified/UnifiedList.tsx | 2 +- frontend/contexts/TableOptionsContext.tsx | 3 - frontend/hooks/queries/useCodes.ts | 33 +- .../lib/registry/DynamicComponentRenderer.tsx | 26 +- .../button-primary/ButtonPrimaryComponent.tsx | 56 +-- .../select-basic/SelectBasicComponent.tsx | 151 +------- .../table-list/TableListComponent.tsx | 18 +- .../text-input/TextInputComponent.tsx | 8 - frontend/lib/utils/buttonActions.ts | 328 ++++++++++++++---- frontend/stores/modalDataStore.ts | 3 - 12 files changed, 339 insertions(+), 471 deletions(-) diff --git a/frontend/components/common/ScreenModal.tsx b/frontend/components/common/ScreenModal.tsx index cceadae9..69ae82d7 100644 --- a/frontend/components/common/ScreenModal.tsx +++ b/frontend/components/common/ScreenModal.tsx @@ -141,21 +141,12 @@ export const ScreenModal: React.FC = ({ className }) => { selectedIds, } = event.detail; - console.log("๐Ÿ“ฆ [ScreenModal] ๋ชจ๋‹ฌ ์—ด๊ธฐ ์ด๋ฒคํŠธ ์ˆ˜์‹ :", { - screenId, - title, - selectedData: eventSelectedData, - selectedIds, - }); - // ๐Ÿ†• ๋ชจ๋‹ฌ ์—ด๋ฆฐ ์‹œ๊ฐ„ ๊ธฐ๋ก modalOpenedAtRef.current = Date.now(); - console.log("๐Ÿ• [ScreenModal] ๋ชจ๋‹ฌ ์—ด๋ฆผ ์‹œ๊ฐ„ ๊ธฐ๋ก:", modalOpenedAtRef.current); // ๐Ÿ†• ์„ ํƒ๋œ ๋ฐ์ดํ„ฐ ์ €์žฅ (RepeatScreenModal ๋“ฑ์—์„œ ์‚ฌ์šฉ) if (eventSelectedData && Array.isArray(eventSelectedData)) { setSelectedData(eventSelectedData); - console.log("๐Ÿ“ฆ [ScreenModal] ์„ ํƒ๋œ ๋ฐ์ดํ„ฐ ์ €์žฅ:", eventSelectedData.length, "๊ฑด"); } else { setSelectedData([]); } @@ -168,12 +159,10 @@ export const ScreenModal: React.FC = ({ className }) => { }); // pushState๋กœ URL ๋ณ€๊ฒฝ (ํŽ˜์ด์ง€ ์ƒˆ๋กœ๊ณ ์นจ ์—†์ด) window.history.pushState({}, "", currentUrl.toString()); - console.log("โœ… URL ํŒŒ๋ผ๋ฏธํ„ฐ ์ถ”๊ฐ€:", urlParams); } // ๐Ÿ†• editData๊ฐ€ ์žˆ์œผ๋ฉด formData์™€ originalData๋กœ ์„ค์ • (์ˆ˜์ • ๋ชจ๋“œ) if (editData) { - console.log("๐Ÿ“ [ScreenModal] ์ˆ˜์ • ๋ฐ์ดํ„ฐ ์„ค์ •:", editData); setFormData(editData); setOriginalData(editData); // ๐Ÿ†• ์›๋ณธ ๋ฐ์ดํ„ฐ ์ €์žฅ (UPDATE ํŒ๋‹จ์šฉ) } else { @@ -204,9 +193,6 @@ export const ScreenModal: React.FC = ({ className }) => { const sourceValue = rawParentData[mapping.sourceColumn]; if (sourceValue !== undefined && sourceValue !== null) { parentData[mapping.targetColumn] = sourceValue; - console.log( - `๐Ÿ”— [ScreenModal] ๋งคํ•‘ ํ•„๋“œ ์ „๋‹ฌ: ${mapping.sourceColumn} โ†’ ${mapping.targetColumn} = ${sourceValue}`, - ); } } @@ -231,13 +217,11 @@ export const ScreenModal: React.FC = ({ className }) => { const isLinkField = linkFieldPatterns.some((pattern) => key.endsWith(pattern)); if (isLinkField) { parentData[key] = value; - console.log(`๐Ÿ”— [ScreenModal] ์—ฐ๊ฒฐ ํ•„๋“œ ์ž๋™ ๊ฐ์ง€: ${key} = ${value}`); } } } if (Object.keys(parentData).length > 0) { - console.log("๐Ÿ”— [ScreenModal] ๋ถ„ํ•  ํŒจ๋„ ๋ถ€๋ชจ ๋ฐ์ดํ„ฐ ์ดˆ๊ธฐ๊ฐ’ ์„ค์ • (์—ฐ๊ฒฐ ํ•„๋“œ๋งŒ):", parentData); setFormData(parentData); } else { setFormData({}); @@ -261,7 +245,6 @@ export const ScreenModal: React.FC = ({ className }) => { // dataSourceId ํŒŒ๋ผ๋ฏธํ„ฐ ์ œ๊ฑฐ currentUrl.searchParams.delete("dataSourceId"); window.history.pushState({}, "", currentUrl.toString()); - console.log("๐Ÿงน URL ํŒŒ๋ผ๋ฏธํ„ฐ ์ œ๊ฑฐ"); } setModalState({ @@ -276,8 +259,7 @@ export const ScreenModal: React.FC = ({ className }) => { setOriginalData(null); // ๐Ÿ†• ์›๋ณธ ๋ฐ์ดํ„ฐ ์ดˆ๊ธฐํ™” setSelectedData([]); // ๐Ÿ†• ์„ ํƒ๋œ ๋ฐ์ดํ„ฐ ์ดˆ๊ธฐํ™” setContinuousMode(false); - localStorage.setItem("screenModal_continuousMode", "false"); // localStorage์— ์ €์žฅ - console.log("๐Ÿ”„ ์—ฐ์† ๋ชจ๋“œ ์ดˆ๊ธฐํ™”: false"); + localStorage.setItem("screenModal_continuousMode", "false"); }; // ์ €์žฅ ์„ฑ๊ณต ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ (์—ฐ์† ๋“ฑ๋ก ๋ชจ๋“œ ์ง€์›) @@ -285,36 +267,24 @@ export const ScreenModal: React.FC = ({ className }) => { // ๐Ÿ†• ๋ชจ๋‹ฌ์ด ์—ด๋ฆฐ ํ›„ 500ms ์ด๋‚ด์˜ ์ €์žฅ ์„ฑ๊ณต ์ด๋ฒคํŠธ๋Š” ๋ฌด์‹œ (์ด์ „ ์ด๋ฒคํŠธ ๋ฐฉ์ง€) const timeSinceOpen = Date.now() - modalOpenedAtRef.current; if (timeSinceOpen < 500) { - console.log("โญ๏ธ [ScreenModal] ๋ชจ๋‹ฌ ์—ด๋ฆฐ ์งํ›„ ์ €์žฅ ์„ฑ๊ณต ์ด๋ฒคํŠธ ๋ฌด์‹œ:", { timeSinceOpen }); return; } const isContinuousMode = continuousMode; - console.log("๐Ÿ’พ ์ €์žฅ ์„ฑ๊ณต ์ด๋ฒคํŠธ ์ˆ˜์‹ "); - console.log("๐Ÿ“Œ ํ˜„์žฌ ์—ฐ์† ๋ชจ๋“œ ์ƒํƒœ:", isContinuousMode); - console.log("๐Ÿ“Œ localStorage:", localStorage.getItem("screenModal_continuousMode")); if (isContinuousMode) { // ์—ฐ์† ๋ชจ๋“œ: ํผ๋งŒ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ๋ชจ๋‹ฌ์€ ์œ ์ง€ - console.log("โœ… ์—ฐ์† ๋ชจ๋“œ ํ™œ์„ฑํ™” - ํผ ์ดˆ๊ธฐํ™” ๋ฐ ํ™”๋ฉด ๋ฆฌ์…‹"); - - // 1. ํผ ๋ฐ์ดํ„ฐ ์ดˆ๊ธฐํ™” setFormData({}); - - // 2. ๋ฆฌ์…‹ ํ‚ค ๋ณ€๊ฒฝ (์ปดํฌ๋„ŒํŠธ ๊ฐ•์ œ ๋ฆฌ๋งˆ์šดํŠธ) setResetKey((prev) => prev + 1); - console.log("๐Ÿ”„ resetKey ์ฆ๊ฐ€ - ์ปดํฌ๋„ŒํŠธ ๋ฆฌ๋งˆ์šดํŠธ"); - // 3. ํ™”๋ฉด ๋ฐ์ดํ„ฐ ๋‹ค์‹œ ๋กœ๋“œ (์ฑ„๋ฒˆ ๊ทœ์น™ ์ƒˆ๋กœ ์ƒ์„ฑ) + // ํ™”๋ฉด ๋ฐ์ดํ„ฐ ๋‹ค์‹œ ๋กœ๋“œ (์ฑ„๋ฒˆ ๊ทœ์น™ ์ƒˆ๋กœ ์ƒ์„ฑ) if (modalState.screenId) { - console.log("๐Ÿ”„ ํ™”๋ฉด ๋ฐ์ดํ„ฐ ๋‹ค์‹œ ๋กœ๋“œ:", modalState.screenId); loadScreenData(modalState.screenId); } toast.success("์ €์žฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ณ„์† ์ž…๋ ฅํ•˜์„ธ์š”."); } else { // ์ผ๋ฐ˜ ๋ชจ๋“œ: ๋ชจ๋‹ฌ ๋‹ซ๊ธฐ - console.log("โŒ ์ผ๋ฐ˜ ๋ชจ๋“œ - ๋ชจ๋‹ฌ ๋‹ซ๊ธฐ"); handleCloseModal(); } }; @@ -341,16 +311,12 @@ export const ScreenModal: React.FC = ({ className }) => { try { setLoading(true); - console.log("ํ™”๋ฉด ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ ์‹œ์ž‘:", screenId); - // ํ™”๋ฉด ์ •๋ณด์™€ ๋ ˆ์ด์•„์›ƒ ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ const [screenInfo, layoutData] = await Promise.all([ screenApi.getScreen(screenId), screenApi.getLayout(screenId), ]); - console.log("API ์‘๋‹ต:", { screenInfo, layoutData }); - // ๐Ÿ†• URL ํŒŒ๋ผ๋ฏธํ„ฐ ํ™•์ธ (์ˆ˜์ • ๋ชจ๋“œ) if (typeof window !== "undefined") { const urlParams = new URLSearchParams(window.location.search); @@ -359,36 +325,19 @@ export const ScreenModal: React.FC = ({ className }) => { const tableName = urlParams.get("tableName") || screenInfo.tableName; const groupByColumnsParam = urlParams.get("groupByColumns"); - console.log("๐Ÿ“‹ URL ํŒŒ๋ผ๋ฏธํ„ฐ ํ™•์ธ:", { mode, editId, tableName, groupByColumnsParam }); - // ์ˆ˜์ • ๋ชจ๋“œ์ด๊ณ  editId๊ฐ€ ์žˆ์œผ๋ฉด ํ•ด๋‹น ๋ ˆ์ฝ”๋“œ ์กฐํšŒ if (mode === "edit" && editId && tableName) { try { - console.log("๐Ÿ” ์ˆ˜์ • ๋ฐ์ดํ„ฐ ์กฐํšŒ ์‹œ์ž‘:", { tableName, editId, groupByColumnsParam }); - - const { dataApi } = await import("@/lib/api/data"); - // groupByColumns ํŒŒ์‹ฑ let groupByColumns: string[] = []; if (groupByColumnsParam) { try { groupByColumns = JSON.parse(groupByColumnsParam); - console.log("โœ… [ScreenModal] groupByColumns ํŒŒ์‹ฑ ์„ฑ๊ณต:", groupByColumns); - } catch (e) { - console.warn("groupByColumns ํŒŒ์‹ฑ ์‹คํŒจ:", e); + } catch { + // groupByColumns ํŒŒ์‹ฑ ์‹คํŒจ ์‹œ ๋ฌด์‹œ } - } else { - console.warn("โš ๏ธ [ScreenModal] groupByColumnsParam์ด ์—†์Šต๋‹ˆ๋‹ค!"); } - console.log("๐Ÿš€ [ScreenModal] API ํ˜ธ์ถœ ์ง์ „:", { - tableName, - editId, - enableEntityJoin: true, - groupByColumns, - groupByColumnsLength: groupByColumns.length, - }); - // ๐Ÿ†• apiClient๋ฅผ named import๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ const { apiClient } = await import("@/lib/api/client"); const params: any = { @@ -396,37 +345,12 @@ export const ScreenModal: React.FC = ({ className }) => { }; if (groupByColumns.length > 0) { params.groupByColumns = JSON.stringify(groupByColumns); - console.log("โœ… [ScreenModal] groupByColumns๋ฅผ params์— ์ถ”๊ฐ€:", params.groupByColumns); } - console.log("๐Ÿ“ก [ScreenModal] ์‹ค์ œ API ์š”์ฒญ:", { - url: `/data/${tableName}/${editId}`, - params, - }); - const apiResponse = await apiClient.get(`/data/${tableName}/${editId}`, { params }); const response = apiResponse.data; - console.log("๐Ÿ“ฉ [ScreenModal] API ์‘๋‹ต ๋ฐ›์Œ:", { - success: response.success, - hasData: !!response.data, - dataType: response.data ? (Array.isArray(response.data) ? "๋ฐฐ์—ด" : "๊ฐ์ฒด") : "์—†์Œ", - dataLength: Array.isArray(response.data) ? response.data.length : 1, - }); - if (response.success && response.data) { - // ๋ฐฐ์—ด์ธ ๊ฒฝ์šฐ (๊ทธ๋ฃนํ•‘) vs ๋‹จ์ผ ๊ฐ์ฒด - const isArray = Array.isArray(response.data); - - if (isArray) { - console.log(`โœ… ์ˆ˜์ • ๋ฐ์ดํ„ฐ ๋กœ๋“œ ์™„๋ฃŒ (๊ทธ๋ฃน ๋ ˆ์ฝ”๋“œ: ${response.data.length}๊ฐœ)`); - console.log("๐Ÿ“ฆ ์ „์ฒด ๋ฐ์ดํ„ฐ (JSON):", JSON.stringify(response.data, null, 2)); - } else { - console.log("โœ… ์ˆ˜์ • ๋ฐ์ดํ„ฐ ๋กœ๋“œ ์™„๋ฃŒ (ํ•„๋“œ ์ˆ˜:", Object.keys(response.data).length, ")"); - console.log("๐Ÿ“Š ๋ชจ๋“  ํ•„๋“œ ํ‚ค:", Object.keys(response.data)); - console.log("๐Ÿ“ฆ ์ „์ฒด ๋ฐ์ดํ„ฐ (JSON):", JSON.stringify(response.data, null, 2)); - } - // ๐Ÿ”ง ๋‚ ์งœ ํ•„๋“œ ์ •๊ทœํ™” (ํƒ€์ž„์กด ์ œ๊ฑฐ) const normalizeDates = (data: any): any => { if (Array.isArray(data)) { @@ -441,10 +365,7 @@ export const ScreenModal: React.FC = ({ className }) => { for (const [key, value] of Object.entries(data)) { if (typeof value === "string" && /^\d{4}-\d{2}-\d{2}T/.test(value)) { // ISO ๋‚ ์งœ ํ˜•์‹ ๊ฐ์ง€: YYYY-MM-DD๋งŒ ์ถ”์ถœ - const before = value; - const after = value.split("T")[0]; - console.log(`๐Ÿ”ง [๋‚ ์งœ ์ •๊ทœํ™”] ${key}: ${before} โ†’ ${after}`); - normalized[key] = after; + normalized[key] = value.split("T")[0]; } else { normalized[key] = value; } @@ -452,31 +373,21 @@ export const ScreenModal: React.FC = ({ className }) => { return normalized; }; - console.log("๐Ÿ“ฅ [ScreenModal] API ์‘๋‹ต ์›๋ณธ:", JSON.stringify(response.data, null, 2)); const normalizedData = normalizeDates(response.data); - console.log("๐Ÿ“ฅ [ScreenModal] ์ •๊ทœํ™” ํ›„:", JSON.stringify(normalizedData, null, 2)); // ๐Ÿ”ง ๋ฐฐ์—ด ๋ฐ์ดํ„ฐ๋Š” formData๋กœ ์„ค์ •ํ•˜์ง€ ์•Š์Œ (SelectedItemsDetailInput๋งŒ ์‚ฌ์šฉ) if (Array.isArray(normalizedData)) { - console.log( - "โš ๏ธ [ScreenModal] ๊ทธ๋ฃน ๋ ˆ์ฝ”๋“œ(๋ฐฐ์—ด)๋Š” formData๋กœ ์„ค์ •ํ•˜์ง€ ์•Š์Œ. SelectedItemsDetailInput๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.", - ); setFormData(normalizedData); // SelectedItemsDetailInput์ด ์ง์ ‘ ์‚ฌ์šฉ setOriginalData(normalizedData[0] || null); // ๐Ÿ†• ์ฒซ ๋ฒˆ์งธ ๋ ˆ์ฝ”๋“œ๋ฅผ ์›๋ณธ์œผ๋กœ ์ €์žฅ } else { setFormData(normalizedData); setOriginalData(normalizedData); // ๐Ÿ†• ์›๋ณธ ๋ฐ์ดํ„ฐ ์ €์žฅ (UPDATE ํŒ๋‹จ์šฉ) } - - // setFormData ์งํ›„ ํ™•์ธ - console.log("๐Ÿ”„ setFormData ํ˜ธ์ถœ ์™„๋ฃŒ (๋‚ ์งœ ์ •๊ทœํ™”๋จ)"); - console.log("๐Ÿ”„ setOriginalData ํ˜ธ์ถœ ์™„๋ฃŒ (UPDATE ํŒ๋‹จ์šฉ)"); } else { - console.error("โŒ ์ˆ˜์ • ๋ฐ์ดํ„ฐ ๋กœ๋“œ ์‹คํŒจ:", response.error); toast.error("๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."); } } catch (error) { - console.error("โŒ ์ˆ˜์ • ๋ฐ์ดํ„ฐ ์กฐํšŒ ์˜ค๋ฅ˜:", error); + console.error("์ˆ˜์ • ๋ฐ์ดํ„ฐ ์กฐํšŒ ์˜ค๋ฅ˜:", error); toast.error("๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค."); } } @@ -498,11 +409,9 @@ export const ScreenModal: React.FC = ({ className }) => { offsetX: 0, offsetY: 0, }; - console.log("โœ… ํ™”๋ฉด ๊ด€๋ฆฌ ํ•ด์ƒ๋„ ์‚ฌ์šฉ:", dimensions); } else { // ํ•ด์ƒ๋„ ์ •๋ณด๊ฐ€ ์—†์œผ๋ฉด ์ž๋™ ๊ณ„์‚ฐ dimensions = calculateScreenDimensions(components); - console.log("โš ๏ธ ์ž๋™ ๊ณ„์‚ฐ๋œ ํฌ๊ธฐ ์‚ฌ์šฉ:", dimensions); } setScreenDimensions(dimensions); @@ -511,11 +420,6 @@ export const ScreenModal: React.FC = ({ className }) => { components, screenInfo: screenInfo, }); - console.log("ํ™”๋ฉด ๋ฐ์ดํ„ฐ ์„ค์ • ์™„๋ฃŒ:", { - componentsCount: components.length, - dimensions, - screenInfo, - }); } else { throw new Error("ํ™”๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค"); } @@ -537,7 +441,6 @@ export const ScreenModal: React.FC = ({ className }) => { currentUrl.searchParams.delete("tableName"); currentUrl.searchParams.delete("groupByColumns"); window.history.pushState({}, "", currentUrl.toString()); - console.log("๐Ÿงน [ScreenModal] URL ํŒŒ๋ผ๋ฏธํ„ฐ ์ œ๊ฑฐ (๋ชจ๋‹ฌ ๋‹ซํž˜)"); } setModalState({ @@ -695,15 +598,6 @@ export const ScreenModal: React.FC = ({ className }) => { }, }; - // ๐Ÿ†• formData ์ „๋‹ฌ ํ™•์ธ ๋กœ๊ทธ - console.log("๐Ÿ“ [ScreenModal] InteractiveScreenViewerDynamic์— formData ์ „๋‹ฌ:", { - componentId: component.id, - componentType: component.type, - componentComponentType: (component as any).componentType, // ๐Ÿ†• ์‹ค์ œ componentType ํ™•์ธ - hasFormData: !!formData, - formDataKeys: formData ? Object.keys(formData) : [], - }); - return ( = ({ className }) => { formData={formData} originalData={originalData} // ๐Ÿ†• ์›๋ณธ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ (UPDATE ํŒ๋‹จ์šฉ) onFormDataChange={(fieldName, value) => { - console.log("๐Ÿ”ง [ScreenModal] onFormDataChange ํ˜ธ์ถœ:", { fieldName, value }); setFormData((prev) => { const newFormData = { ...prev, [fieldName]: value, }; - console.log("๐Ÿ”ง [ScreenModal] formData ์—…๋ฐ์ดํŠธ:", { prev, newFormData }); return newFormData; }); }} onRefresh={() => { // ๋ถ€๋ชจ ํ™”๋ฉด์˜ ํ…Œ์ด๋ธ” ์ƒˆ๋กœ๊ณ ์นจ ์ด๋ฒคํŠธ ๋ฐœ์†ก - console.log("๐Ÿ”„ ๋ชจ๋‹ฌ์—์„œ ๋ถ€๋ชจ ํ™”๋ฉด ํ…Œ์ด๋ธ” ์ƒˆ๋กœ๊ณ ์นจ ์ด๋ฒคํŠธ ๋ฐœ์†ก"); window.dispatchEvent(new CustomEvent("refreshTable")); }} screenInfo={{ @@ -758,7 +649,6 @@ export const ScreenModal: React.FC = ({ className }) => { const isChecked = checked === true; setContinuousMode(isChecked); localStorage.setItem("screenModal_continuousMode", String(isChecked)); - console.log("๐Ÿ”„ ์—ฐ์† ๋ชจ๋“œ ๋ณ€๊ฒฝ:", isChecked); }} />