Compare commits

..

No commits in common. "5e27d21257a17ded5e4cfa08b3adc8c106dca2af" and "75b5530d04f08ac7dc4a84fde97097a1a92d8289" have entirely different histories.

12 changed files with 284 additions and 549 deletions

View File

@ -775,8 +775,7 @@ export async function getTableData(
const userField = autoFilter?.userField || "companyCode"; const userField = autoFilter?.userField || "companyCode";
const userValue = (req.user as any)[userField]; const userValue = (req.user as any)[userField];
// 🆕 최고 관리자(company_code = '*')는 모든 회사 데이터 조회 가능 if (userValue) {
if (userValue && userValue !== "*") {
enhancedSearch[filterColumn] = userValue; enhancedSearch[filterColumn] = userValue;
logger.info("🔍 현재 사용자 필터 적용:", { logger.info("🔍 현재 사용자 필터 적용:", {
@ -785,10 +784,6 @@ export async function getTableData(
userValue, userValue,
tableName, tableName,
}); });
} else if (userValue === "*") {
logger.info("🔓 최고 관리자 - 회사 필터 미적용 (모든 회사 데이터 조회)", {
tableName,
});
} else { } else {
logger.warn("⚠️ 사용자 정보 필드 값 없음:", { logger.warn("⚠️ 사용자 정보 필드 값 없음:", {
userField, userField,
@ -797,9 +792,6 @@ export async function getTableData(
} }
} }
// 🆕 최종 검색 조건 로그
logger.info(`🔍 최종 검색 조건 (enhancedSearch):`, JSON.stringify(enhancedSearch));
// 데이터 조회 // 데이터 조회
const result = await tableManagementService.getTableData(tableName, { const result = await tableManagementService.getTableData(tableName, {
page: parseInt(page), page: parseInt(page),

View File

@ -104,7 +104,7 @@ function ScreenViewPage() {
// 편집 모달 이벤트 리스너 등록 // 편집 모달 이벤트 리스너 등록
useEffect(() => { useEffect(() => {
const handleOpenEditModal = (event: CustomEvent) => { const handleOpenEditModal = (event: CustomEvent) => {
// console.log("🎭 편집 모달 열기 이벤트 수신:", event.detail); console.log("🎭 편집 모달 열기 이벤트 수신:", event.detail);
setEditModalConfig({ setEditModalConfig({
screenId: event.detail.screenId, screenId: event.detail.screenId,

View File

@ -261,7 +261,7 @@ export const ScreenModal: React.FC<ScreenModalProps> = ({ className }) => {
// dataSourceId 파라미터 제거 // dataSourceId 파라미터 제거
currentUrl.searchParams.delete("dataSourceId"); currentUrl.searchParams.delete("dataSourceId");
window.history.pushState({}, "", currentUrl.toString()); window.history.pushState({}, "", currentUrl.toString());
// console.log("🧹 URL 파라미터 제거"); console.log("🧹 URL 파라미터 제거");
} }
setModalState({ setModalState({
@ -277,7 +277,7 @@ export const ScreenModal: React.FC<ScreenModalProps> = ({ className }) => {
setSelectedData([]); // 🆕 선택된 데이터 초기화 setSelectedData([]); // 🆕 선택된 데이터 초기화
setContinuousMode(false); setContinuousMode(false);
localStorage.setItem("screenModal_continuousMode", "false"); // localStorage에 저장 localStorage.setItem("screenModal_continuousMode", "false"); // localStorage에 저장
// console.log("🔄 연속 모드 초기화: false"); console.log("🔄 연속 모드 초기화: false");
}; };
// 저장 성공 이벤트 처리 (연속 등록 모드 지원) // 저장 성공 이벤트 처리 (연속 등록 모드 지원)
@ -285,36 +285,36 @@ export const ScreenModal: React.FC<ScreenModalProps> = ({ className }) => {
// 🆕 모달이 열린 후 500ms 이내의 저장 성공 이벤트는 무시 (이전 이벤트 방지) // 🆕 모달이 열린 후 500ms 이내의 저장 성공 이벤트는 무시 (이전 이벤트 방지)
const timeSinceOpen = Date.now() - modalOpenedAtRef.current; const timeSinceOpen = Date.now() - modalOpenedAtRef.current;
if (timeSinceOpen < 500) { if (timeSinceOpen < 500) {
// console.log("⏭️ [ScreenModal] 모달 열린 직후 저장 성공 이벤트 무시:", { timeSinceOpen }); console.log("⏭️ [ScreenModal] 모달 열린 직후 저장 성공 이벤트 무시:", { timeSinceOpen });
return; return;
} }
const isContinuousMode = continuousMode; const isContinuousMode = continuousMode;
// console.log("💾 저장 성공 이벤트 수신"); console.log("💾 저장 성공 이벤트 수신");
// console.log("📌 현재 연속 모드 상태:", isContinuousMode); console.log("📌 현재 연속 모드 상태:", isContinuousMode);
// console.log("📌 localStorage:", localStorage.getItem("screenModal_continuousMode")); console.log("📌 localStorage:", localStorage.getItem("screenModal_continuousMode"));
if (isContinuousMode) { if (isContinuousMode) {
// 연속 모드: 폼만 초기화하고 모달은 유지 // 연속 모드: 폼만 초기화하고 모달은 유지
// console.log("✅ 연속 모드 활성화 - 폼 초기화 및 화면 리셋"); console.log("✅ 연속 모드 활성화 - 폼 초기화 및 화면 리셋");
// 1. 폼 데이터 초기화 // 1. 폼 데이터 초기화
setFormData({}); setFormData({});
// 2. 리셋 키 변경 (컴포넌트 강제 리마운트) // 2. 리셋 키 변경 (컴포넌트 강제 리마운트)
setResetKey((prev) => prev + 1); setResetKey((prev) => prev + 1);
// console.log("🔄 resetKey 증가 - 컴포넌트 리마운트"); console.log("🔄 resetKey 증가 - 컴포넌트 리마운트");
// 3. 화면 데이터 다시 로드 (채번 규칙 새로 생성) // 3. 화면 데이터 다시 로드 (채번 규칙 새로 생성)
if (modalState.screenId) { if (modalState.screenId) {
// console.log("🔄 화면 데이터 다시 로드:", modalState.screenId); console.log("🔄 화면 데이터 다시 로드:", modalState.screenId);
loadScreenData(modalState.screenId); loadScreenData(modalState.screenId);
} }
toast.success("저장되었습니다. 계속 입력하세요."); toast.success("저장되었습니다. 계속 입력하세요.");
} else { } else {
// 일반 모드: 모달 닫기 // 일반 모드: 모달 닫기
// console.log("❌ 일반 모드 - 모달 닫기"); console.log("❌ 일반 모드 - 모달 닫기");
handleCloseModal(); handleCloseModal();
} }
}; };

View File

@ -190,14 +190,14 @@ export const EditModal: React.FC<EditModalProps> = ({ className }) => {
const innerLayoutData = await screenApi.getLayout(section.screenId); const innerLayoutData = await screenApi.getLayout(section.screenId);
saveButton = findSaveButtonInComponents(innerLayoutData?.components || []); saveButton = findSaveButtonInComponents(innerLayoutData?.components || []);
if (saveButton) { if (saveButton) {
// console.log("[EditModal] 조건부 컨테이너 내부에서 저장 버튼 발견:", { console.log("[EditModal] 조건부 컨테이너 내부에서 저장 버튼 발견:", {
// sectionScreenId: section.screenId, sectionScreenId: section.screenId,
// sectionLabel: section.label, sectionLabel: section.label,
// }); });
break; break;
} }
} catch (innerError) { } catch (innerError) {
// console.warn("[EditModal] 내부 화면 레이아웃 조회 실패:", section.screenId); console.warn("[EditModal] 내부 화면 레이아웃 조회 실패:", section.screenId);
} }
} }
} }
@ -207,7 +207,7 @@ export const EditModal: React.FC<EditModalProps> = ({ className }) => {
} }
if (!saveButton) { if (!saveButton) {
// console.log("[EditModal] 저장 버튼을 찾을 수 없음:", targetScreenId); console.log("[EditModal] 저장 버튼을 찾을 수 없음:", targetScreenId);
return null; return null;
} }
@ -219,14 +219,14 @@ export const EditModal: React.FC<EditModalProps> = ({ className }) => {
dataflowConfig: webTypeConfig.dataflowConfig, dataflowConfig: webTypeConfig.dataflowConfig,
dataflowTiming: webTypeConfig.dataflowConfig?.flowConfig?.executionTiming || "after", dataflowTiming: webTypeConfig.dataflowConfig?.flowConfig?.executionTiming || "after",
}; };
// console.log("[EditModal] 저장 버튼 제어로직 설정 발견:", config); console.log("[EditModal] 저장 버튼 제어로직 설정 발견:", config);
return config; return config;
} }
// console.log("[EditModal] 저장 버튼에 제어로직 설정 없음"); console.log("[EditModal] 저장 버튼에 제어로직 설정 없음");
return null; return null;
} catch (error) { } catch (error) {
// console.warn("[EditModal] 저장 버튼 설정 조회 실패:", error); console.warn("[EditModal] 저장 버튼 설정 조회 실패:", error);
return null; return null;
} }
}; };
@ -309,16 +309,16 @@ export const EditModal: React.FC<EditModalProps> = ({ className }) => {
// 🆕 그룹 데이터 조회 함수 // 🆕 그룹 데이터 조회 함수
const loadGroupData = async () => { const loadGroupData = async () => {
if (!modalState.tableName || !modalState.groupByColumns || modalState.groupByColumns.length === 0) { if (!modalState.tableName || !modalState.groupByColumns || modalState.groupByColumns.length === 0) {
// console.warn("테이블명 또는 그룹핑 컬럼이 없습니다."); console.warn("테이블명 또는 그룹핑 컬럼이 없습니다.");
return; return;
} }
try { try {
// console.log("🔍 그룹 데이터 조회 시작:", { console.log("🔍 그룹 데이터 조회 시작:", {
// tableName: modalState.tableName, tableName: modalState.tableName,
// groupByColumns: modalState.groupByColumns, groupByColumns: modalState.groupByColumns,
// editData: modalState.editData, editData: modalState.editData,
// }); });
// 그룹핑 컬럼 값 추출 (예: order_no = "ORD-20251124-001") // 그룹핑 컬럼 값 추출 (예: order_no = "ORD-20251124-001")
const groupValues: Record<string, any> = {}; const groupValues: Record<string, any> = {};
@ -329,14 +329,14 @@ export const EditModal: React.FC<EditModalProps> = ({ className }) => {
}); });
if (Object.keys(groupValues).length === 0) { if (Object.keys(groupValues).length === 0) {
// console.warn("그룹핑 컬럼 값이 없습니다:", modalState.groupByColumns); console.warn("그룹핑 컬럼 값이 없습니다:", modalState.groupByColumns);
return; return;
} }
// console.log("🔍 그룹 조회 요청:", { console.log("🔍 그룹 조회 요청:", {
// tableName: modalState.tableName, tableName: modalState.tableName,
// groupValues, groupValues,
// }); });
// 같은 그룹의 모든 레코드 조회 (entityJoinApi 사용) // 같은 그룹의 모든 레코드 조회 (entityJoinApi 사용)
const { entityJoinApi } = await import("@/lib/api/entityJoin"); const { entityJoinApi } = await import("@/lib/api/entityJoin");
@ -347,13 +347,13 @@ export const EditModal: React.FC<EditModalProps> = ({ className }) => {
enableEntityJoin: true, enableEntityJoin: true,
}); });
// console.log("🔍 그룹 조회 응답:", response); console.log("🔍 그룹 조회 응답:", response);
// entityJoinApi는 배열 또는 { data: [] } 형식으로 반환 // entityJoinApi는 배열 또는 { data: [] } 형식으로 반환
const dataArray = Array.isArray(response) ? response : response?.data || []; const dataArray = Array.isArray(response) ? response : response?.data || [];
if (dataArray.length > 0) { if (dataArray.length > 0) {
// console.log("✅ 그룹 데이터 조회 성공:", dataArray.length, "건"); console.log("✅ 그룹 데이터 조회 성공:", dataArray.length, "건");
setGroupData(dataArray); setGroupData(dataArray);
setOriginalGroupData(JSON.parse(JSON.stringify(dataArray))); // Deep copy setOriginalGroupData(JSON.parse(JSON.stringify(dataArray))); // Deep copy
toast.info(`${dataArray.length}개의 관련 품목을 불러왔습니다.`); toast.info(`${dataArray.length}개의 관련 품목을 불러왔습니다.`);
@ -374,7 +374,7 @@ export const EditModal: React.FC<EditModalProps> = ({ className }) => {
try { try {
setLoading(true); setLoading(true);
// console.log("화면 데이터 로딩 시작:", screenId); console.log("화면 데이터 로딩 시작:", screenId);
// 화면 정보와 레이아웃 데이터 로딩 // 화면 정보와 레이아웃 데이터 로딩
const [screenInfo, layoutData] = await Promise.all([ const [screenInfo, layoutData] = await Promise.all([
@ -382,7 +382,7 @@ export const EditModal: React.FC<EditModalProps> = ({ className }) => {
screenApi.getLayout(screenId), screenApi.getLayout(screenId),
]); ]);
// console.log("API 응답:", { screenInfo, layoutData }); console.log("API 응답:", { screenInfo, layoutData });
if (screenInfo && layoutData) { if (screenInfo && layoutData) {
const components = layoutData.components || []; const components = layoutData.components || [];
@ -395,11 +395,11 @@ export const EditModal: React.FC<EditModalProps> = ({ className }) => {
components, components,
screenInfo: screenInfo, screenInfo: screenInfo,
}); });
// console.log("화면 데이터 설정 완료:", { console.log("화면 데이터 설정 완료:", {
// componentsCount: components.length, componentsCount: components.length,
// dimensions, dimensions,
// screenInfo, screenInfo,
// }); });
} else { } else {
throw new Error("화면 데이터가 없습니다"); throw new Error("화면 데이터가 없습니다");
} }

View File

@ -306,11 +306,11 @@ export const ButtonPrimaryComponent: React.FC<ButtonPrimaryComponentProps> = ({
useEffect(() => { useEffect(() => {
const newData = splitPanelContext?.selectedLeftData ?? null; const newData = splitPanelContext?.selectedLeftData ?? null;
setTrackedSelectedLeftData(newData); setTrackedSelectedLeftData(newData);
// console.log("🔄 [ButtonPrimary] selectedLeftData 변경 감지:", { console.log("🔄 [ButtonPrimary] selectedLeftData 변경 감지:", {
// label: component.label, label: component.label,
// hasData: !!newData, hasData: !!newData,
// dataKeys: newData ? Object.keys(newData) : [], dataKeys: newData ? Object.keys(newData) : [],
// }); });
}, [splitPanelContext?.selectedLeftData, component.label]); }, [splitPanelContext?.selectedLeftData, component.label]);
// modalDataStore 상태 구독 (실시간 업데이트) // modalDataStore 상태 구독 (실시간 업데이트)

View File

@ -53,11 +53,11 @@ export function useEntitySearch({
limit: pagination.limit.toString(), limit: pagination.limit.toString(),
}); });
// console.log("[useEntitySearch] 검색 실행:", { console.log("[useEntitySearch] 검색 실행:", {
// tableName, tableName,
// filterCondition: filterConditionRef.current, filterCondition: filterConditionRef.current,
// searchText: text, searchText: text,
// }); });
const response = await apiClient.get<EntitySearchResponse>( const response = await apiClient.get<EntitySearchResponse>(
`/entity-search/${tableName}?${params.toString()}` `/entity-search/${tableName}?${params.toString()}`

View File

@ -6,7 +6,7 @@ import { RepeatScreenModalDefinition } from "./index";
// 컴포넌트 자동 등록 // 컴포넌트 자동 등록
if (typeof window !== "undefined") { if (typeof window !== "undefined") {
ComponentRegistry.registerComponent(RepeatScreenModalDefinition); ComponentRegistry.registerComponent(RepeatScreenModalDefinition);
// console.log("✅ RepeatScreenModal 컴포넌트 등록 완료"); console.log("✅ RepeatScreenModal 컴포넌트 등록 완료");
} }
export {}; export {};

View File

@ -205,12 +205,12 @@ export const SplitPanelLayoutComponent: React.FC<SplitPanelLayoutComponentProps>
const splitPanelId = `split-panel-${component.id}`; const splitPanelId = `split-panel-${component.id}`;
// 디버깅: Context 연결 상태 확인 // 디버깅: Context 연결 상태 확인
// console.log("🔗 [SplitPanelLayout] Context 연결 상태:", { console.log("🔗 [SplitPanelLayout] Context 연결 상태:", {
// componentId: component.id, componentId: component.id,
// splitPanelId, splitPanelId,
// hasRegisterFunc: typeof ctxRegisterSplitPanel === "function", hasRegisterFunc: typeof ctxRegisterSplitPanel === "function",
// splitPanelsSize: splitPanelContext.splitPanels?.size ?? "없음", splitPanelsSize: splitPanelContext.splitPanels?.size ?? "없음",
// }); });
// Context에 분할 패널 등록 (좌표 정보 포함) - 마운트 시 1회만 실행 // Context에 분할 패널 등록 (좌표 정보 포함) - 마운트 시 1회만 실행
const ctxRegisterRef = useRef(ctxRegisterSplitPanel); const ctxRegisterRef = useRef(ctxRegisterSplitPanel);
@ -235,15 +235,15 @@ export const SplitPanelLayoutComponent: React.FC<SplitPanelLayoutComponentProps>
isDragging: false, isDragging: false,
}; };
// console.log("📦 [SplitPanelLayout] Context에 분할 패널 등록:", { console.log("📦 [SplitPanelLayout] Context에 분할 패널 등록:", {
// splitPanelId, splitPanelId,
// panelInfo, panelInfo,
// }); });
ctxRegisterRef.current(splitPanelId, panelInfo); ctxRegisterRef.current(splitPanelId, panelInfo);
return () => { return () => {
// console.log("📦 [SplitPanelLayout] Context에서 분할 패널 해제:", splitPanelId); console.log("📦 [SplitPanelLayout] Context에서 분할 패널 해제:", splitPanelId);
ctxUnregisterRef.current(splitPanelId); ctxUnregisterRef.current(splitPanelId);
}; };
// 마운트/언마운트 시에만 실행, 위치/크기 변경은 별도 업데이트로 처리 // 마운트/언마운트 시에만 실행, 위치/크기 변경은 별도 업데이트로 처리
@ -311,11 +311,11 @@ export const SplitPanelLayoutComponent: React.FC<SplitPanelLayoutComponentProps>
// 🆕 그룹별 합산된 데이터 계산 // 🆕 그룹별 합산된 데이터 계산
const summedLeftData = useMemo(() => { const summedLeftData = useMemo(() => {
// console.log("🔍 [그룹합산] leftGroupSumConfig:", leftGroupSumConfig); console.log("🔍 [그룹합산] leftGroupSumConfig:", leftGroupSumConfig);
// 그룹핑이 비활성화되었거나 그룹 기준 컬럼이 없으면 원본 데이터 반환 // 그룹핑이 비활성화되었거나 그룹 기준 컬럼이 없으면 원본 데이터 반환
if (!leftGroupSumConfig?.enabled || !leftGroupSumConfig?.groupByColumn) { if (!leftGroupSumConfig?.enabled || !leftGroupSumConfig?.groupByColumn) {
// console.log("🔍 [그룹합산] 그룹핑 비활성화 - 원본 데이터 반환"); console.log("🔍 [그룹합산] 그룹핑 비활성화 - 원본 데이터 반환");
return leftData; return leftData;
} }
@ -756,8 +756,8 @@ export const SplitPanelLayoutComponent: React.FC<SplitPanelLayoutComponentProps>
} }
}); });
// console.log("🔗 [분할패널] additionalJoinColumns:", additionalJoinColumns); console.log("🔗 [분할패널] additionalJoinColumns:", additionalJoinColumns);
// console.log("🔗 [분할패널] configuredColumns:", configuredColumns); console.log("🔗 [분할패널] configuredColumns:", configuredColumns);
const result = await entityJoinApi.getTableDataWithJoins(leftTableName, { const result = await entityJoinApi.getTableDataWithJoins(leftTableName, {
page: 1, page: 1,
@ -769,10 +769,10 @@ export const SplitPanelLayoutComponent: React.FC<SplitPanelLayoutComponentProps>
}); });
// 🔍 디버깅: API 응답 데이터의 키 확인 // 🔍 디버깅: API 응답 데이터의 키 확인
// if (result.data && result.data.length > 0) { if (result.data && result.data.length > 0) {
// console.log("🔗 [분할패널] API 응답 첫 번째 데이터 키:", Object.keys(result.data[0])); console.log("🔗 [분할패널] API 응답 첫 번째 데이터 키:", Object.keys(result.data[0]));
// console.log("🔗 [분할패널] API 응답 첫 번째 데이터:", result.data[0]); console.log("🔗 [분할패널] API 응답 첫 번째 데이터:", result.data[0]);
// } }
// 가나다순 정렬 (좌측 패널의 표시 컬럼 기준) // 가나다순 정렬 (좌측 패널의 표시 컬럼 기준)
const leftColumn = componentConfig.rightPanel?.relation?.leftColumn; const leftColumn = componentConfig.rightPanel?.relation?.leftColumn;
@ -1000,7 +1000,7 @@ export const SplitPanelLayoutComponent: React.FC<SplitPanelLayoutComponentProps>
if (leftTableName && !isDesignMode) { if (leftTableName && !isDesignMode) {
import("@/stores/modalDataStore").then(({ useModalDataStore }) => { import("@/stores/modalDataStore").then(({ useModalDataStore }) => {
useModalDataStore.getState().setData(leftTableName, [item]); useModalDataStore.getState().setData(leftTableName, [item]);
// console.log(`✅ 분할 패널 좌측 선택: ${leftTableName}`, item); console.log(`✅ 분할 패널 좌측 선택: ${leftTableName}`, item);
}); });
} }
}, },
@ -1198,7 +1198,7 @@ export const SplitPanelLayoutComponent: React.FC<SplitPanelLayoutComponentProps>
} }
}); });
setLeftColumnLabels(labels); setLeftColumnLabels(labels);
// console.log("✅ 좌측 컬럼 라벨 로드:", labels); console.log("✅ 좌측 컬럼 라벨 로드:", labels);
} catch (error) { } catch (error) {
console.error("좌측 테이블 컬럼 라벨 로드 실패:", error); console.error("좌측 테이블 컬럼 라벨 로드 실패:", error);
} }
@ -1227,7 +1227,7 @@ export const SplitPanelLayoutComponent: React.FC<SplitPanelLayoutComponentProps>
} }
}); });
setRightColumnLabels(labels); setRightColumnLabels(labels);
// console.log("✅ 우측 컬럼 라벨 로드:", labels); console.log("✅ 우측 컬럼 라벨 로드:", labels);
} catch (error) { } catch (error) {
console.error("우측 테이블 컬럼 정보 로드 실패:", error); console.error("우측 테이블 컬럼 정보 로드 실패:", error);
} }
@ -1269,7 +1269,7 @@ export const SplitPanelLayoutComponent: React.FC<SplitPanelLayoutComponentProps>
}; };
}); });
mappings[columnName] = valueMap; mappings[columnName] = valueMap;
// console.log(`✅ 좌측 카테고리 매핑 로드 [${columnName}]:`, valueMap); console.log(`✅ 좌측 카테고리 매핑 로드 [${columnName}]:`, valueMap);
} }
} catch (error) { } catch (error) {
console.error(`좌측 카테고리 값 조회 실패 [${columnName}]:`, error); console.error(`좌측 카테고리 값 조회 실패 [${columnName}]:`, error);
@ -1307,7 +1307,7 @@ export const SplitPanelLayoutComponent: React.FC<SplitPanelLayoutComponentProps>
} }
}); });
// console.log("🔍 우측 패널 카테고리 로드 대상 테이블:", Array.from(tablesToLoad)); console.log("🔍 우측 패널 카테고리 로드 대상 테이블:", Array.from(tablesToLoad));
// 각 테이블에 대해 카테고리 매핑 로드 // 각 테이블에 대해 카테고리 매핑 로드
for (const tableName of tablesToLoad) { for (const tableName of tablesToLoad) {
@ -1940,7 +1940,7 @@ export const SplitPanelLayoutComponent: React.FC<SplitPanelLayoutComponentProps>
useEffect(() => { useEffect(() => {
const handleRefreshTable = () => { const handleRefreshTable = () => {
if (!isDesignMode) { if (!isDesignMode) {
// console.log("🔄 [SplitPanel] refreshTable 이벤트 수신 - 데이터 새로고침"); console.log("🔄 [SplitPanel] refreshTable 이벤트 수신 - 데이터 새로고침");
loadLeftData(); loadLeftData();
// 선택된 항목이 있으면 우측 패널도 새로고침 // 선택된 항목이 있으면 우측 패널도 새로고침
if (selectedLeftItem) { if (selectedLeftItem) {
@ -2104,12 +2104,12 @@ export const SplitPanelLayoutComponent: React.FC<SplitPanelLayoutComponentProps>
(() => { (() => {
// 🆕 그룹별 합산된 데이터 사용 // 🆕 그룹별 합산된 데이터 사용
const dataSource = summedLeftData; const dataSource = summedLeftData;
// console.log( console.log(
// "🔍 [테이블모드 렌더링] dataSource 개수:", "🔍 [테이블모드 렌더링] dataSource 개수:",
// dataSource.length, dataSource.length,
// "leftGroupSumConfig:", "leftGroupSumConfig:",
// leftGroupSumConfig, leftGroupSumConfig,
// ); );
// 🔧 로컬 검색 필터 적용 // 🔧 로컬 검색 필터 적용
const filteredData = leftSearchQuery const filteredData = leftSearchQuery

View File

@ -816,22 +816,13 @@ export function TableSectionRenderer({
// 이미 초기화되었으면 스킵 // 이미 초기화되었으면 스킵
if (initialDataLoadedRef.current) return; if (initialDataLoadedRef.current) return;
const tableSectionKey = `__tableSection_${sectionId}`; const tableSectionKey = `_tableSection_${sectionId}`;
const initialData = formData[tableSectionKey]; const initialData = formData[tableSectionKey];
console.log("[TableSectionRenderer] 초기 데이터 확인:", {
sectionId,
tableSectionKey,
hasInitialData: !!initialData,
initialDataLength: Array.isArray(initialData) ? initialData.length : 0,
formDataKeys: Object.keys(formData).filter(k => k.startsWith("__tableSection_")),
});
if (Array.isArray(initialData) && initialData.length > 0) { if (Array.isArray(initialData) && initialData.length > 0) {
console.log("[TableSectionRenderer] 초기 데이터 로드:", { console.log("[TableSectionRenderer] 초기 데이터 로드:", {
sectionId, sectionId,
itemCount: initialData.length, itemCount: initialData.length,
firstItem: initialData[0],
}); });
setTableData(initialData); setTableData(initialData);
initialDataLoadedRef.current = true; initialDataLoadedRef.current = true;
@ -1336,7 +1327,7 @@ export function TableSectionRenderer({
} }
} }
} }
// console.log("[TableSectionRenderer] baseFilterCondition:", condition, "preFilters:", filters?.preFilters); console.log("[TableSectionRenderer] baseFilterCondition:", condition, "preFilters:", filters?.preFilters);
return condition; return condition;
}, [filters?.preFilters]); }, [filters?.preFilters]);

View File

@ -3022,11 +3022,11 @@ export class ButtonActionExecutor {
comp.componentType === "split-panel-layout", comp.componentType === "split-panel-layout",
); );
} }
// console.log("🔍 [openEditModal] 분할 패널 확인:", { console.log("🔍 [openEditModal] 분할 패널 확인:", {
// targetScreenId: config.targetScreenId, targetScreenId: config.targetScreenId,
// hasSplitPanel, hasSplitPanel,
// componentTypes: layoutData?.components?.map((c: any) => c.type || c.componentType) || [], componentTypes: layoutData?.components?.map((c: any) => c.type || c.componentType) || [],
// }); });
} catch (error) { } catch (error) {
console.warn("레이아웃 정보를 가져오지 못했습니다:", error); console.warn("레이아웃 정보를 가져오지 못했습니다:", error);
} }

View File

@ -77,7 +77,7 @@ export const useModalDataStore = create<ModalDataState>()(
dataRegistry: {}, dataRegistry: {},
setData: (sourceId, items) => { setData: (sourceId, items) => {
// console.log("📦 [ModalDataStore] 데이터 저장:", { sourceId, itemCount: items.length, items }); console.log("📦 [ModalDataStore] 데이터 저장:", { sourceId, itemCount: items.length, items });
set((state) => ({ set((state) => ({
dataRegistry: { dataRegistry: {
...state.dataRegistry, ...state.dataRegistry,