feat(screen): PC/POP 화면관리 데이터 분리 (excludePop 필터)

PC 화면관리에서 POP 전용 화면과 그룹이 함께 표시되어 혼동을 주는
문제를 해결하기 위해 excludePop 필터를 도입한다.
[백엔드]
- getScreensByCompany: NOT EXISTS 서브쿼리로 screen_layouts_pop에
  레이아웃이 있는 화면 제외, 테이블 별칭 sd로 통일
- getScreenGroups: hierarchy_path 기반으로 POP 그룹 제외
  (hierarchy_path IS NULL OR NOT LIKE 'POP/%')
- 두 API 모두 excludePop 미전달 시 기존 동작 100% 유지
[프론트엔드]
- screenApi.getScreens, getScreenGroups에 excludePop 파라미터 추가
- PC 화면관리 페이지, ScreenGroupTreeView, ScreenList에서
  excludePop: true 전달
This commit is contained in:
SeongHyun Kim
2026-03-04 14:01:19 +09:00
parent 15e22ba401
commit 37d93d82b1
8 changed files with 32 additions and 16 deletions
@@ -38,7 +38,7 @@ export default function ScreenManagementPage() {
const loadScreens = useCallback(async () => {
try {
setLoading(true);
const result = await screenApi.getScreens({ page: 1, size: 1000, searchTerm: "" });
const result = await screenApi.getScreens({ page: 1, size: 1000, searchTerm: "", excludePop: true });
// screenApi.getScreens는 { data: ScreenDefinition[], total, page, size, totalPages } 형태 반환
if (result.data && result.data.length > 0) {
setScreens(result.data);
@@ -1011,7 +1011,7 @@ export function ScreenGroupTreeView({
const loadGroupsData = async () => {
try {
setLoading(true);
const response = await getScreenGroups({ size: 1000 }); // 모든 그룹 가져오기
const response = await getScreenGroups({ size: 1000, excludePop: true });
if (response.success && response.data) {
setGroups(response.data);
+1 -1
View File
@@ -223,7 +223,7 @@ export default function ScreenList({ onScreenSelect, selectedScreen, onDesignScr
const loadGroups = async () => {
try {
setLoadingGroups(true);
const response = await getScreenGroups();
const response = await getScreenGroups({ excludePop: true });
if (response.success && response.data) {
setGroups(response.data);
}
+1
View File
@@ -16,6 +16,7 @@ export const screenApi = {
size?: number;
companyCode?: string;
searchTerm?: string;
excludePop?: boolean;
}): Promise<PaginatedResponse<ScreenDefinition>> => {
const response = await apiClient.get("/screen-management/screens", { params });
const raw = response.data || {};
+2
View File
@@ -115,12 +115,14 @@ export async function getScreenGroups(params?: {
page?: number;
size?: number;
searchTerm?: string;
excludePop?: boolean;
}): Promise<ApiResponse<ScreenGroup[]>> {
try {
const queryParams = new URLSearchParams();
if (params?.page) queryParams.append("page", params.page.toString());
if (params?.size) queryParams.append("size", params.size.toString());
if (params?.searchTerm) queryParams.append("searchTerm", params.searchTerm);
if (params?.excludePop) queryParams.append("excludePop", "true");
const response = await apiClient.get(`/screen-groups/groups?${queryParams.toString()}`);
return response.data;