화면 분할 패널 기능

This commit is contained in:
kjs
2025-11-28 14:56:11 +09:00
parent 30dac204c0
commit f15846fd10
27 changed files with 2455 additions and 207 deletions

View File

@@ -12,28 +12,56 @@ import { logger } from "./logger";
/**
* 매핑 규칙 적용
* @param data 배열 또는 단일 객체
* @param rules 매핑 규칙 배열
* @returns 매핑된 배열
*/
export function applyMappingRules(data: any[], rules: MappingRule[]): any[] {
if (!data || data.length === 0) {
export function applyMappingRules(data: any[] | any, rules: MappingRule[]): any[] {
// 빈 데이터 처리
if (!data) {
return [];
}
// 🆕 배열이 아닌 경우 배열로 변환
const dataArray = Array.isArray(data) ? data : [data];
if (dataArray.length === 0) {
return [];
}
// 규칙이 없으면 원본 데이터 반환
if (!rules || rules.length === 0) {
return dataArray;
}
// 변환 함수가 있는 규칙 확인
const hasTransform = rules.some((rule) => rule.transform && rule.transform !== "none");
if (hasTransform) {
// 변환 함수가 있으면 단일 값 또는 집계 결과 반환
return [applyTransformRules(data, rules)];
return [applyTransformRules(dataArray, rules)];
}
// 일반 매핑 (각 행에 대해 매핑)
return data.map((row) => {
const mappedRow: any = {};
// 🆕 원본 데이터를 복사한 후 매핑 규칙 적용 (매핑되지 않은 필드도 유지)
return dataArray.map((row) => {
// 원본 데이터 복사
const mappedRow: any = { ...row };
for (const rule of rules) {
// sourceField와 targetField가 모두 있어야 매핑 적용
if (!rule.sourceField || !rule.targetField) {
continue;
}
const sourceValue = getNestedValue(row, rule.sourceField);
const targetValue = sourceValue ?? rule.defaultValue;
// 소스 필드와 타겟 필드가 다르면 소스 필드 제거 후 타겟 필드에 설정
if (rule.sourceField !== rule.targetField) {
delete mappedRow[rule.sourceField];
}
setNestedValue(mappedRow, rule.targetField, targetValue);
}