ConnectionSetupModal 리팩터링
This commit is contained in:
102
frontend/utils/connectionUtils.ts
Normal file
102
frontend/utils/connectionUtils.ts
Normal file
@@ -0,0 +1,102 @@
|
||||
import { ConditionNode } from "@/lib/api/dataflow";
|
||||
|
||||
/**
|
||||
* 고유 ID 생성 함수
|
||||
*/
|
||||
export const generateConditionId = (): string => {
|
||||
return `cond_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
||||
};
|
||||
|
||||
/**
|
||||
* 그룹 ID 생성 함수
|
||||
*/
|
||||
export const generateGroupId = (): string => {
|
||||
return `group_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
||||
};
|
||||
|
||||
/**
|
||||
* 액션 그룹 ID 생성 함수
|
||||
*/
|
||||
export const generateActionGroupId = (): string => {
|
||||
return `action_group_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
||||
};
|
||||
|
||||
/**
|
||||
* 열린 그룹 찾기
|
||||
*/
|
||||
export const findOpenGroups = (conditions: ConditionNode[]) => {
|
||||
const openGroups: Array<{ groupId: string; groupLevel: number }> = [];
|
||||
|
||||
for (const condition of conditions) {
|
||||
if (condition.type === "group-start") {
|
||||
openGroups.push({
|
||||
groupId: condition.groupId!,
|
||||
groupLevel: condition.groupLevel!,
|
||||
});
|
||||
} else if (condition.type === "group-end") {
|
||||
// 해당 그룹 제거
|
||||
const groupIndex = openGroups.findIndex((g) => g.groupId === condition.groupId);
|
||||
if (groupIndex !== -1) {
|
||||
openGroups.splice(groupIndex, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return openGroups;
|
||||
};
|
||||
|
||||
/**
|
||||
* 다음 그룹 레벨 계산
|
||||
*/
|
||||
export const getNextGroupLevel = (conditions: ConditionNode[]): number => {
|
||||
const openGroups = findOpenGroups(conditions);
|
||||
return openGroups.length;
|
||||
};
|
||||
|
||||
/**
|
||||
* 현재 조건의 그룹 레벨 계산
|
||||
*/
|
||||
export const getCurrentGroupLevel = (conditions: ConditionNode[], conditionIndex: number): number => {
|
||||
let level = 0;
|
||||
for (let i = 0; i < conditionIndex; i++) {
|
||||
const condition = conditions[i];
|
||||
if (condition.type === "group-start") {
|
||||
level++;
|
||||
} else if (condition.type === "group-end") {
|
||||
level--;
|
||||
}
|
||||
}
|
||||
return level;
|
||||
};
|
||||
|
||||
/**
|
||||
* 조건부 연결인지 확인하는 헬퍼 함수
|
||||
*/
|
||||
export const isConditionalConnection = (connectionType: string): boolean => {
|
||||
return connectionType === "data-save" || connectionType === "external-call";
|
||||
};
|
||||
|
||||
/**
|
||||
* 데이터 타입에 따른 입력 타입 결정
|
||||
*/
|
||||
export const getInputTypeForDataType = (dataType: string): "text" | "number" | "datetime-local" | "date" | "time" => {
|
||||
const lowerDataType = dataType?.toLowerCase() || "string";
|
||||
|
||||
if (lowerDataType.includes("timestamp") || lowerDataType.includes("datetime")) {
|
||||
return "datetime-local";
|
||||
} else if (lowerDataType.includes("date")) {
|
||||
return "date";
|
||||
} else if (lowerDataType.includes("time")) {
|
||||
return "time";
|
||||
} else if (
|
||||
lowerDataType.includes("int") ||
|
||||
lowerDataType.includes("numeric") ||
|
||||
lowerDataType.includes("decimal") ||
|
||||
lowerDataType.includes("float") ||
|
||||
lowerDataType.includes("double")
|
||||
) {
|
||||
return "number";
|
||||
} else {
|
||||
return "text";
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user