/** * POP 화면 그룹 관리 API 클라이언트 * - hierarchy_path LIKE 'POP/%' 필터로 POP 카테고리만 조회 * - 데스크톱 screen_groups와 동일 테이블 사용, 필터로 분리 */ import { apiClient } from "./client"; import { ScreenGroup, ScreenGroupScreen } from "./screenGroup"; // ============================================================ // POP 화면 그룹 타입 (ScreenGroup 재활용) // ============================================================ export interface PopScreenGroup extends ScreenGroup { // 추가 필드 필요시 여기에 정의 children?: PopScreenGroup[]; // 트리 구조용 } export interface CreatePopScreenGroupRequest { group_name: string; group_code: string; description?: string; icon?: string; display_order?: number; parent_group_id?: number | null; target_company_code?: string; // 최고관리자용 } export interface UpdatePopScreenGroupRequest { group_name?: string; description?: string; icon?: string; display_order?: number; is_active?: boolean; } // ============================================================ // API 함수 // ============================================================ /** * POP 화면 그룹 목록 조회 * - hierarchy_path가 'POP'으로 시작하는 그룹만 조회 */ export async function getPopScreenGroups(searchTerm?: string): Promise { try { const params = new URLSearchParams(); if (searchTerm) { params.append("searchTerm", searchTerm); } const url = `/screen-groups/pop/groups${params.toString() ? `?${params.toString()}` : ""}`; const response = await apiClient.get<{ success: boolean; data: PopScreenGroup[] }>(url); if (response.data?.success) { return response.data.data || []; } return []; } catch (error) { console.error("POP 화면 그룹 조회 실패:", error); return []; } } /** * POP 화면 그룹 생성 */ export async function createPopScreenGroup( data: CreatePopScreenGroupRequest ): Promise<{ success: boolean; data?: PopScreenGroup; message?: string }> { try { const response = await apiClient.post<{ success: boolean; data: PopScreenGroup; message: string }>( "/screen-groups/pop/groups", data ); return response.data; } catch (error: any) { console.error("POP 화면 그룹 생성 실패:", error); return { success: false, message: error.response?.data?.message || "생성에 실패했습니다." }; } } /** * POP 화면 그룹 수정 */ export async function updatePopScreenGroup( id: number, data: UpdatePopScreenGroupRequest ): Promise<{ success: boolean; data?: PopScreenGroup; message?: string }> { try { const response = await apiClient.put<{ success: boolean; data: PopScreenGroup; message: string }>( `/screen-groups/pop/groups/${id}`, data ); return response.data; } catch (error: any) { console.error("POP 화면 그룹 수정 실패:", error); return { success: false, message: error.response?.data?.message || "수정에 실패했습니다." }; } } /** * POP 화면 그룹 삭제 */ export async function deletePopScreenGroup( id: number ): Promise<{ success: boolean; message?: string }> { try { const response = await apiClient.delete<{ success: boolean; message: string }>( `/screen-groups/pop/groups/${id}` ); return response.data; } catch (error: any) { console.error("POP 화면 그룹 삭제 실패:", error); return { success: false, message: error.response?.data?.message || "삭제에 실패했습니다." }; } } /** * POP 루트 그룹 확보 (없으면 자동 생성) */ export async function ensurePopRootGroup(): Promise<{ success: boolean; data?: PopScreenGroup; message?: string }> { try { const response = await apiClient.post<{ success: boolean; data: PopScreenGroup; message: string }>( "/screen-groups/pop/ensure-root" ); return response.data; } catch (error: any) { console.error("POP 루트 그룹 확보 실패:", error); return { success: false, message: error.response?.data?.message || "루트 그룹 확보에 실패했습니다." }; } } // ============================================================ // 유틸리티 함수 // ============================================================ /** * 플랫 리스트를 트리 구조로 변환 */ export function buildPopGroupTree(groups: PopScreenGroup[]): PopScreenGroup[] { const groupMap = new Map(); const rootGroups: PopScreenGroup[] = []; // 먼저 모든 그룹을 맵에 저장 groups.forEach((group) => { groupMap.set(group.id, { ...group, children: [] }); }); // 트리 구조 생성 groups.forEach((group) => { const node = groupMap.get(group.id)!; if (group.parent_group_id && groupMap.has(group.parent_group_id)) { // 부모가 있으면 부모의 children에 추가 const parent = groupMap.get(group.parent_group_id)!; parent.children = parent.children || []; parent.children.push(node); } else { // 부모가 없거나 POP 루트면 최상위에 추가 // hierarchy_path가 'POP'이거나 'POP/XXX' 형태인지 확인 if (group.hierarchy_path === "POP" || (group.hierarchy_path?.startsWith("POP/") && group.hierarchy_path.split("/").length === 2)) { rootGroups.push(node); } } }); // display_order로 정렬 const sortByOrder = (a: PopScreenGroup, b: PopScreenGroup) => (a.display_order || 0) - (b.display_order || 0); rootGroups.sort(sortByOrder); rootGroups.forEach((group) => { if (group.children) { group.children.sort(sortByOrder); } }); return rootGroups; }