Merge branch 'ksh'

This commit is contained in:
SeongHyun Kim
2026-01-15 13:27:01 +09:00
7 changed files with 1733 additions and 117 deletions

View File

@@ -737,61 +737,99 @@ export const ButtonPrimaryComponent: React.FC<ButtonPrimaryComponentProps> = ({
return;
}
if (!screenContext) {
toast.error("화면 컨텍스트를 찾을 수 없습니다.");
return;
}
try {
// 1. 소스 컴포넌트에서 데이터 가져오기
let sourceProvider = screenContext.getDataProvider(dataTransferConfig.sourceComponentId);
let sourceData: any[] = [];
// 🆕 소스 컴포넌트를 찾을 수 없으면, 현재 화면에서 테이블 리스트 자동 탐색
// (조건부 컨테이너의 다른 섹션으로 전환했을 때 이전 컴포넌트 ID가 남아있는 경우 대응)
if (!sourceProvider) {
console.log(`⚠️ [ButtonPrimary] 지정된 소스 컴포넌트를 찾을 수 없음: ${dataTransferConfig.sourceComponentId}`);
console.log(`🔍 [ButtonPrimary] 현재 화면에서 DataProvider 자동 탐색...`);
const allProviders = screenContext.getAllDataProviders();
// 테이블 리스트 우선 탐색
for (const [id, provider] of allProviders) {
if (provider.componentType === "table-list") {
sourceProvider = provider;
console.log(`✅ [ButtonPrimary] 테이블 리스트 자동 발견: ${id}`);
break;
}
}
// 테이블 리스트가 없으면 첫 번째 DataProvider 사용
if (!sourceProvider && allProviders.size > 0) {
const firstEntry = allProviders.entries().next().value;
if (firstEntry) {
sourceProvider = firstEntry[1];
console.log(
`✅ [ButtonPrimary] 첫 번째 DataProvider 사용: ${firstEntry[0]} (${sourceProvider.componentType})`,
);
}
}
// 1. ScreenContext에서 DataProvider를 통해 데이터 가져오기 시도
if (screenContext) {
let sourceProvider = screenContext.getDataProvider(dataTransferConfig.sourceComponentId);
// 소스 컴포넌트를 찾을 수 없으면, 현재 화면에서 테이블 리스트 자동 탐색
if (!sourceProvider) {
toast.error("데이터를 제공할 수 있는 컴포넌트를 찾을 수 없습니다.");
return;
console.log(`⚠️ [ButtonPrimary] 지정된 소스 컴포넌트를 찾을 수 없음: ${dataTransferConfig.sourceComponentId}`);
console.log(`🔍 [ButtonPrimary] 현재 화면에서 DataProvider 자동 탐색...`);
const allProviders = screenContext.getAllDataProviders();
console.log(`📋 [ButtonPrimary] 등록된 DataProvider 목록:`, Array.from(allProviders.keys()));
// 테이블 리스트 우선 탐색
for (const [id, provider] of allProviders) {
if (provider.componentType === "table-list") {
sourceProvider = provider;
console.log(`✅ [ButtonPrimary] 테이블 리스트 자동 발견: ${id}`);
break;
}
}
// 테이블 리스트가 없으면 첫 번째 DataProvider 사용
if (!sourceProvider && allProviders.size > 0) {
const firstEntry = allProviders.entries().next().value;
if (firstEntry) {
sourceProvider = firstEntry[1];
console.log(
`✅ [ButtonPrimary] 첫 번째 DataProvider 사용: ${firstEntry[0]} (${sourceProvider.componentType})`,
);
}
}
}
if (sourceProvider) {
const rawSourceData = sourceProvider.getSelectedData();
sourceData = Array.isArray(rawSourceData) ? rawSourceData : rawSourceData ? [rawSourceData] : [];
console.log("📦 [ButtonPrimary] ScreenContext에서 소스 데이터 획득:", {
rawSourceData,
sourceData,
count: sourceData.length
});
}
} else {
console.log("⚠️ [ButtonPrimary] ScreenContext가 없습니다. modalDataStore에서 데이터를 찾습니다.");
}
// 2. ScreenContext에서 데이터를 찾지 못한 경우, modalDataStore에서 fallback 조회
if (sourceData.length === 0) {
console.log("🔍 [ButtonPrimary] modalDataStore에서 데이터 탐색 시도...");
try {
const { useModalDataStore } = await import("@/stores/modalDataStore");
const dataRegistry = useModalDataStore.getState().dataRegistry;
console.log("📋 [ButtonPrimary] modalDataStore 전체 키:", Object.keys(dataRegistry));
// sourceTableName이 지정되어 있으면 해당 테이블에서 조회
const sourceTableName = dataTransferConfig.sourceTableName || tableName;
if (sourceTableName && dataRegistry[sourceTableName]) {
const modalData = dataRegistry[sourceTableName];
sourceData = modalData.map((item: any) => item.originalData || item);
console.log(`✅ [ButtonPrimary] modalDataStore에서 데이터 발견 (${sourceTableName}):`, sourceData.length, "건");
} else {
// 테이블명으로 못 찾으면 첫 번째 데이터 사용
const firstKey = Object.keys(dataRegistry)[0];
if (firstKey && dataRegistry[firstKey]?.length > 0) {
const modalData = dataRegistry[firstKey];
sourceData = modalData.map((item: any) => item.originalData || item);
console.log(`✅ [ButtonPrimary] modalDataStore 첫 번째 키에서 데이터 발견 (${firstKey}):`, sourceData.length, "건");
}
}
} catch (err) {
console.warn("⚠️ [ButtonPrimary] modalDataStore 접근 실패:", err);
}
}
const rawSourceData = sourceProvider.getSelectedData();
// 🆕 배열이 아닌 경우 배열로 변환
const sourceData = Array.isArray(rawSourceData) ? rawSourceData : rawSourceData ? [rawSourceData] : [];
console.log("📦 소스 데이터:", { rawSourceData, sourceData, isArray: Array.isArray(rawSourceData) });
// 3. 여전히 데이터가 없으면 에러
if (!sourceData || sourceData.length === 0) {
toast.warning("선택된 데이터 없습니다.");
console.error("❌ [ButtonPrimary] 선택된 데이터를 찾을 수 없습니다.", {
hasScreenContext: !!screenContext,
sourceComponentId: dataTransferConfig.sourceComponentId,
sourceTableName: dataTransferConfig.sourceTableName || tableName,
});
toast.warning("선택된 데이터가 없습니다. 항목을 먼저 선택해주세요.");
return;
}
console.log("📦 [ButtonPrimary] 최종 소스 데이터:", { sourceData, count: sourceData.length });
// 1.5. 추가 데이터 소스 처리 (예: 조건부 컨테이너의 카테고리 값)
let additionalData: Record<string, any> = {};