103 lines
2.7 KiB
TypeScript
103 lines
2.7 KiB
TypeScript
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";
|
|
}
|
|
};
|