feat: 엔티티 타입 컬럼 표시 설정을 화면 편집기로 이동

- 테이블 타입 관리에서 엔티티 타입의 표시 컬럼 설정 완전 제거
- 컬럼 설정 패널에서 엔티티 타입일 때 표시 컬럼 조합 선택 기능 추가
- 기본 테이블과 조인 테이블의 컬럼을 자유롭게 조합 가능
- 구분자 설정 및 실시간 미리보기 기능 포함
- 별도 모달 방식 제거하고 기존 컬럼 설정 패널에 통합
This commit is contained in:
kjs
2025-09-23 16:23:36 +09:00
parent 4aefb5be6a
commit de6c7a8008
9 changed files with 293 additions and 51 deletions

View File

@@ -74,7 +74,10 @@ export class EntityJoinController {
typeof screenEntityConfigs === "string"
? JSON.parse(screenEntityConfigs)
: screenEntityConfigs;
logger.info("화면별 엔티티 설정 파싱 완료:", parsedScreenEntityConfigs);
logger.info(
"화면별 엔티티 설정 파싱 완료:",
parsedScreenEntityConfigs
);
} catch (error) {
logger.warn("화면별 엔티티 설정 파싱 오류:", error);
parsedScreenEntityConfigs = {};
@@ -365,14 +368,16 @@ export class EntityJoinController {
);
// 현재 display_column으로 사용 중인 컬럼 제외
const currentDisplayColumn =
config.displayColumn || config.displayColumns[0];
const availableColumns = columns.filter(
(col) => col.columnName !== config.displayColumn
(col) => col.columnName !== currentDisplayColumn
);
return {
joinConfig: config,
tableName: config.referenceTable,
currentDisplayColumn: config.displayColumn,
currentDisplayColumn: currentDisplayColumn,
availableColumns: availableColumns.map((col) => ({
columnName: col.columnName,
columnLabel: col.displayName || col.columnName,
@@ -390,7 +395,8 @@ export class EntityJoinController {
return {
joinConfig: config,
tableName: config.referenceTable,
currentDisplayColumn: config.displayColumn,
currentDisplayColumn:
config.displayColumn || config.displayColumns[0],
availableColumns: [],
error: error instanceof Error ? error.message : "Unknown error",
};

View File

@@ -20,7 +20,7 @@ export class EntityJoinService {
* @param screenEntityConfigs 화면별 엔티티 설정 (선택사항)
*/
async detectEntityJoins(
tableName: string,
tableName: string,
screenEntityConfigs?: Record<string, any>
): Promise<EntityJoinConfig[]> {
try {
@@ -57,7 +57,7 @@ export class EntityJoinService {
const screenConfig = screenEntityConfigs?.[column.column_name];
let displayColumns: string[] = [];
let separator = " - ";
if (screenConfig && screenConfig.displayColumns) {
// 화면에서 설정된 표시 컬럼들 사용
displayColumns = screenConfig.displayColumns;
@@ -66,8 +66,11 @@ export class EntityJoinService {
// 기존 설정된 단일 표시 컬럼 사용
displayColumns = [column.display_column];
} else {
// 기본값: reference_column 사용
displayColumns = [column.reference_column];
// 화면에서 설정하도록 빈 배열로 초기화 (테이블 타입 관리에서 표시 컬럼 설정 제거)
displayColumns = [];
console.log(
`🎯 표시 컬럼을 화면에서 설정하도록 초기화: ${column.column_name} (테이블 타입 관리에서 표시 컬럼 설정 제거됨)`
);
}
// 별칭 컬럼명 생성 (writer -> writer_name)
@@ -153,16 +156,18 @@ export class EntityJoinService {
const joinColumns = joinConfigs
.map((config) => {
const alias = aliasMap.get(config.referenceTable);
const displayColumns = config.displayColumns || [config.displayColumn];
const displayColumns = config.displayColumns || [
config.displayColumn,
];
const separator = config.separator || " - ";
if (displayColumns.length === 1) {
// 단일 컬럼인 경우
return `COALESCE(${alias}.${displayColumns[0]}, '') AS ${config.aliasColumn}`;
} else {
// 여러 컬럼인 경우 CONCAT으로 연결
const concatParts = displayColumns
.map(col => `COALESCE(${alias}.${col}, '')`)
.map((col) => `COALESCE(${alias}.${col}, '')`)
.join(`, '${separator}', `);
return `CONCAT(${concatParts}) AS ${config.aliasColumn}`;
}
@@ -236,7 +241,7 @@ export class EntityJoinService {
const cachedData = await referenceCacheService.getCachedReference(
config.referenceTable,
config.referenceColumn,
config.displayColumn
config.displayColumn || config.displayColumns[0]
);
return cachedData ? "cache" : "join";

View File

@@ -2044,7 +2044,10 @@ export class TableManagementService {
}
// Entity 조인 설정 감지 (화면별 엔티티 설정 전달)
let joinConfigs = await entityJoinService.detectEntityJoins(tableName, options.screenEntityConfigs);
let joinConfigs = await entityJoinService.detectEntityJoins(
tableName,
options.screenEntityConfigs
);
// 추가 조인 컬럼 정보가 있으면 조인 설정에 추가
if (
@@ -2068,8 +2071,10 @@ export class TableManagementService {
sourceColumn: baseJoinConfig.sourceColumn, // 원본 컬럼 (writer)
referenceTable: additionalColumn.sourceTable, // 참조 테이블 (user_info)
referenceColumn: baseJoinConfig.referenceColumn, // 참조 키 (user_id)
displayColumn: additionalColumn.sourceColumn, // 표시할 컬럼 (email)
displayColumns: [additionalColumn.sourceColumn], // 표시할 컬럼 (email)
displayColumn: additionalColumn.sourceColumn, // 하위 호환성
aliasColumn: additionalColumn.joinAlias, // 별칭 (writer_email)
separator: " - ", // 기본 구분자
};
joinConfigs.push(additionalJoinConfig);
@@ -2243,7 +2248,7 @@ export class TableManagementService {
await referenceCacheService.getCachedReference(
config.referenceTable,
config.referenceColumn,
config.displayColumn
config.displayColumn || config.displayColumns[0]
);
}
@@ -2430,7 +2435,7 @@ export class TableManagementService {
const lookupValue = referenceCacheService.getLookupValue(
config.referenceTable,
config.referenceColumn,
config.displayColumn,
config.displayColumn || config.displayColumns[0],
String(sourceValue)
);
@@ -2724,7 +2729,7 @@ export class TableManagementService {
const cachedData = await referenceCacheService.getCachedReference(
config.referenceTable,
config.referenceColumn,
config.displayColumn
config.displayColumn || config.displayColumns[0]
);
if (cachedData && cachedData.size > 0) {
@@ -2808,7 +2813,7 @@ export class TableManagementService {
const cachedData = await referenceCacheService.getCachedReference(
config.referenceTable,
config.referenceColumn,
config.displayColumn
config.displayColumn || config.displayColumns[0]
);
if (cachedData) {
@@ -2847,7 +2852,7 @@ export class TableManagementService {
const hitRate = referenceCacheService.getCacheHitRate(
config.referenceTable,
config.referenceColumn,
config.displayColumn
config.displayColumn || config.displayColumns[0]
);
totalHitRate += hitRate;
}