feat: 화면 관리 기능 개선 (복제/삭제/그룹 관리/테이블 설정)

- 화면 관리 시스템의 복제, 삭제, 수정 및 테이블 설정 기능을 전면 개선
- 그룹 삭제 시 하위 그룹과의 연관성 정리 및 로딩 프로그레스 바 추가
- 화면 수정 기능 추가: 이름, 그룹, 역할, 정렬 순서 변경
- 테이블 설정 모달에 관련 기능 추가 및 데이터 일관성 유지
- 메뉴-화면 그룹 동기화 API 추가 및 관련 상태 관리 기능 구현
- 검색어 필터링 로직 개선: 다중 키워드 지원
- 관련 파일 및 진행 상태 업데이트
This commit is contained in:
DDD1542
2026-01-16 14:48:15 +09:00
parent b2dc06d0f2
commit ab52c49492
10 changed files with 1906 additions and 50 deletions

View File

@@ -498,3 +498,97 @@ export async function getScreenSubTables(
}
}
// ============================================================
// 메뉴-화면그룹 동기화 API
// ============================================================
export interface SyncDetail {
action: 'created' | 'linked' | 'skipped' | 'error';
sourceName: string;
sourceId: number | string;
targetId?: number | string;
reason?: string;
}
export interface SyncResult {
success: boolean;
created: number;
linked: number;
skipped: number;
errors: string[];
details: SyncDetail[];
}
export interface SyncStatus {
screenGroups: { total: number; linked: number; unlinked: number };
menuItems: { total: number; linked: number; unlinked: number };
potentialMatches: Array<{ menuName: string; groupName: string; similarity: string }>;
}
// 동기화 상태 조회
export async function getMenuScreenSyncStatus(
targetCompanyCode?: string
): Promise<ApiResponse<SyncStatus>> {
try {
const queryParams = targetCompanyCode ? `?targetCompanyCode=${targetCompanyCode}` : '';
const response = await apiClient.get(`/screen-groups/sync/status${queryParams}`);
return response.data;
} catch (error: any) {
return { success: false, error: error.message };
}
}
// 화면관리 → 메뉴 동기화
export async function syncScreenGroupsToMenu(
targetCompanyCode?: string
): Promise<ApiResponse<SyncResult>> {
try {
const response = await apiClient.post("/screen-groups/sync/screen-to-menu", { targetCompanyCode });
return response.data;
} catch (error: any) {
return { success: false, error: error.message };
}
}
// 메뉴 → 화면관리 동기화
export async function syncMenuToScreenGroups(
targetCompanyCode?: string
): Promise<ApiResponse<SyncResult>> {
try {
const response = await apiClient.post("/screen-groups/sync/menu-to-screen", { targetCompanyCode });
return response.data;
} catch (error: any) {
return { success: false, error: error.message };
}
}
// 전체 동기화 결과 타입
export interface AllCompaniesSyncResult {
totalCompanies: number;
successCount: number;
failedCount: number;
totalCreated: number;
totalLinked: number;
details: Array<{
companyCode: string;
companyName: string;
direction: 'screens-to-menus' | 'menus-to-screens';
created: number;
linked: number;
skipped: number;
success: boolean;
error?: string;
}>;
}
// 전체 회사 동기화 (최고 관리자만)
export async function syncAllCompanies(): Promise<ApiResponse<AllCompaniesSyncResult>> {
try {
const response = await apiClient.post("/screen-groups/sync/all");
return response.data;
} catch (error: any) {
return { success: false, error: error.message };
}
}