feat: 관리자 테이블 스타일 개선 및 탭 컴포넌트 디자인 수정

- 외부 커넥션 관리 테이블 표준화 (DB 연결, REST API 연결)
- 모든 관리자 테이블의 그림자 제거 (테이블 타입 관리 왼쪽 카드 제외)
- 테이블 타입 관리 왼쪽 카드 호버 효과 강화 (shadow-lg, bg-muted/20)
- 탭 컴포넌트 배경색 밝게 조정 (bg-muted/30)
- 탭 트리거 테두리 제거
This commit is contained in:
kjs
2025-10-30 17:55:55 +09:00
parent 4924fbe71d
commit 148155e6fe
16 changed files with 560 additions and 177 deletions

View File

@@ -19,7 +19,15 @@ export class AdminService {
// menuType에 따른 WHERE 조건 생성
const menuTypeCondition =
menuType !== undefined ? `MENU_TYPE = ${parseInt(menuType)}` : "1 = 1";
menuType !== undefined ? `MENU.MENU_TYPE = ${parseInt(menuType)}` : "1 = 1";
// 메뉴 관리 화면인지 좌측 사이드바인지 구분
// includeInactive가 true거나 menuType이 undefined면 메뉴 관리 화면
const includeInactive = paramMap.includeInactive === true;
const isManagementScreen = includeInactive || menuType === undefined;
// 메뉴 관리 화면: 모든 상태의 메뉴 표시, 좌측 사이드바: active만 표시
const statusCondition = isManagementScreen ? "1 = 1" : "MENU.STATUS = 'active'";
const subStatusCondition = isManagementScreen ? "1 = 1" : "MENU_SUB.STATUS = 'active'";
// 1. 권한 그룹 기반 필터링 (좌측 사이드바인 경우만)
let authFilter = "";
@@ -27,8 +35,8 @@ export class AdminService {
let queryParams: any[] = [userLang];
let paramIndex = 2;
if (menuType !== undefined && userType !== "SUPER_ADMIN") {
// 좌측 사이드바 + SUPER_ADMIN이 아닌 경우
if (menuType !== undefined && userType !== "SUPER_ADMIN" && !isManagementScreen) {
// 좌측 사이드바 + SUPER_ADMIN이 아닌 경우만 권한 체크
const userRoleGroups = await query<any>(
`
SELECT DISTINCT am.objid AS role_objid, am.auth_name
@@ -123,7 +131,7 @@ export class AdminService {
return [];
}
}
} else if (menuType !== undefined && userType === "SUPER_ADMIN") {
} else if (menuType !== undefined && userType === "SUPER_ADMIN" && !isManagementScreen) {
// 좌측 사이드바 + SUPER_ADMIN: 권한 그룹 체크 없이 모든 공통 메뉴 표시
logger.info(`✅ 최고 관리자는 권한 그룹 체크 없이 모든 공통 메뉴 표시`);
// unionFilter는 비워둠 (하위 메뉴도 공통 메뉴만)
@@ -136,7 +144,7 @@ export class AdminService {
// SUPER_ADMIN과 COMPANY_ADMIN 구분
if (userType === "SUPER_ADMIN" && userCompanyCode === "*") {
// SUPER_ADMIN
if (menuType === undefined) {
if (isManagementScreen) {
// 메뉴 관리 화면: 모든 메뉴
logger.info("✅ 메뉴 관리 화면 (SUPER_ADMIN): 모든 메뉴 표시");
companyFilter = "";
@@ -145,16 +153,34 @@ export class AdminService {
logger.info("✅ 좌측 사이드바 (SUPER_ADMIN): 공통 메뉴만 표시");
companyFilter = `AND MENU.COMPANY_CODE = '*'`;
}
} else if (menuType === undefined) {
// 메뉴 관리 화면: 자기 회사 + 공통 메뉴
} else if (isManagementScreen) {
// 메뉴 관리 화면: 회사별 필터링
if (userType === "SUPER_ADMIN" && userCompanyCode === "*") {
// 최고 관리자: 모든 메뉴 (공통 + 모든 회사)
logger.info("✅ 메뉴 관리 화면 (SUPER_ADMIN): 모든 메뉴 표시");
companyFilter = "";
} else {
// 회사 관리자: 자기 회사 메뉴만 (공통 메뉴 제외)
logger.info(
`✅ 메뉴 관리 화면 (${userType}): 회사 ${userCompanyCode} 메뉴만 표시 (공통 메뉴 제외)`
);
companyFilter = `AND MENU.COMPANY_CODE = $${paramIndex}`;
queryParams.push(userCompanyCode);
paramIndex++;
// 하위 메뉴에도 회사 필터링 적용 (공통 메뉴 제외)
if (unionFilter === "") {
unionFilter = `AND MENU_SUB.COMPANY_CODE = $${paramIndex - 1}`;
}
}
} else if (menuType !== undefined) {
// 좌측 사이드바: authFilter에서 이미 회사 필터링 포함
// 회사 관리자는 좌측 사이드바에서도 자기 회사 메뉴 조회 가능
logger.info(
`메뉴 관리 화면: 회사 ${userCompanyCode} + 공통 메뉴 표시`
`좌측 사이드바: 회사 ${userCompanyCode} 메뉴 표시 (${userType})`
);
companyFilter = `AND (MENU.COMPANY_CODE = $${paramIndex} OR MENU.COMPANY_CODE = '*')`;
queryParams.push(userCompanyCode);
paramIndex++;
// companyFilter는 authFilter에서 이미 처리됨
}
// menuType이 정의된 경우 (좌측 사이드바)는 authFilter에서 이미 회사 필터링 포함
// 기존 Java의 selectAdminMenuList 쿼리를 Raw Query로 포팅
// WITH RECURSIVE 쿼리 구현
@@ -237,7 +263,7 @@ export class AdminService {
)
FROM MENU_INFO MENU
WHERE ${menuTypeCondition}
AND STATUS = 'active'
AND ${statusCondition}
${companyFilter}
${authFilter}
AND NOT EXISTS (
@@ -304,7 +330,7 @@ export class AdminService {
FROM MENU_INFO MENU_SUB
JOIN V_MENU ON MENU_SUB.PARENT_OBJ_ID = V_MENU.OBJID
WHERE MENU_SUB.OBJID != ANY(V_MENU.PATH)
AND MENU_SUB.STATUS = 'active'
AND ${subStatusCondition}
${unionFilter}
)
SELECT