단순 키값 연결 유효성 검사

This commit is contained in:
hyeonsu 2025-09-16 17:50:01 +09:00
parent aece1875e2
commit 352da06d74
1 changed files with 53 additions and 20 deletions

View File

@ -454,30 +454,63 @@ export const ConnectionSetupModal: React.FC<ConnectionSetupModalProps> = ({
}; };
const isButtonDisabled = () => { const isButtonDisabled = () => {
const hasRelationshipName = !!config.relationshipName; // 공통 검증: 관계 이름은 필수
const isDataSave = config.connectionType === "data-save"; const hasRelationshipName = !!config.relationshipName?.trim();
const hasActions = dataSaveSettings.actions.length > 0; if (!hasRelationshipName) return true;
const allActionsHaveMappings = dataSaveSettings.actions.every((action) => action.fieldMappings.length > 0);
const allMappingsComplete = dataSaveSettings.actions.every((action) =>
action.fieldMappings.every((mapping) => {
// 타겟은 항상 필요
if (!mapping.targetTable || !mapping.targetField) return false;
// 소스와 기본값 중 하나는 있어야 함 // 연결 타입별 검증
const hasSource = mapping.sourceTable && mapping.sourceField; switch (config.connectionType) {
const hasDefault = mapping.defaultValue && mapping.defaultValue.trim(); case "simple-key":
// 단순 키값 연결: From과 To 컬럼이 모두 선택되어야 함
const hasFromColumns = selectedFromColumns.length > 0;
const hasToColumns = selectedToColumns.length > 0;
return !hasFromColumns || !hasToColumns;
// FROM 테이블이 비어있으면 기본값이 필요 case "data-save":
if (!mapping.sourceTable) { // 데이터 저장: 액션과 필드 매핑이 완성되어야 함
return !!hasDefault; const hasActions = dataSaveSettings.actions.length > 0;
const allActionsHaveMappings = dataSaveSettings.actions.every((action) => action.fieldMappings.length > 0);
const allMappingsComplete = dataSaveSettings.actions.every((action) =>
action.fieldMappings.every((mapping) => {
// 타겟은 항상 필요
if (!mapping.targetTable || !mapping.targetField) return false;
// 소스와 기본값 중 하나는 있어야 함
const hasSource = mapping.sourceTable && mapping.sourceField;
const hasDefault = mapping.defaultValue && mapping.defaultValue.trim();
// FROM 테이블이 비어있으면 기본값이 필요
if (!mapping.sourceTable) {
return !!hasDefault;
}
// FROM 테이블이 있으면 소스 매핑 완성 또는 기본값 필요
return hasSource || hasDefault;
}),
);
return !hasActions || !allActionsHaveMappings || !allMappingsComplete;
case "external-call":
// 외부 호출: 호출 타입과 필수 설정이 있어야 함
const hasCallType = !!externalCallSettings.callType;
if (!hasCallType) return true;
switch (externalCallSettings.callType) {
case "rest-api":
return !externalCallSettings.apiUrl?.trim();
case "kakao-talk":
return !externalCallSettings.kakaoAccessToken?.trim() || !externalCallSettings.bodyTemplate?.trim();
case "email":
return !externalCallSettings.apiUrl?.trim(); // 이메일 서버 URL 필요
case "webhook":
return !externalCallSettings.apiUrl?.trim();
default:
return true;
} }
// FROM 테이블이 있으면 소스 매핑 완성 또는 기본값 필요 default:
return hasSource || hasDefault; return false;
}), }
);
return !hasRelationshipName || (isDataSave && (!hasActions || !allActionsHaveMappings || !allMappingsComplete));
}; };
if (!connection) return null; if (!connection) return null;