최고관리자가 부여한 권한에 따라 메뉴 보여주기

This commit is contained in:
kjs
2025-10-27 18:27:32 +09:00
parent 15776e76f5
commit 821336d40d
8 changed files with 2265 additions and 30 deletions

View File

@@ -6,6 +6,7 @@ import { Checkbox } from "@/components/ui/checkbox";
import { Input } from "@/components/ui/input";
import { Search, ChevronRight, ChevronDown } from "lucide-react";
import { RoleGroup, roleAPI } from "@/lib/api/role";
import { useAuth } from "@/hooks/useAuth";
interface MenuPermission {
menuObjid: number;
@@ -35,21 +36,42 @@ interface MenuPermissionsTableProps {
* - 검색 기능
*/
export function MenuPermissionsTable({ permissions, onPermissionsChange, roleGroup }: MenuPermissionsTableProps) {
const { user: currentUser } = useAuth();
const [searchText, setSearchText] = useState("");
const [expandedMenus, setExpandedMenus] = useState<Set<number>>(new Set());
const [allMenus, setAllMenus] = useState<any[]>([]);
const [isLoading, setIsLoading] = useState(true);
// 최고 관리자 여부 확인
const isSuperAdmin = currentUser?.companyCode === "*" && currentUser?.userType === "SUPER_ADMIN";
// 전체 메뉴 목록 로드
useEffect(() => {
// currentUser가 로드될 때까지 대기
if (!currentUser) {
console.log("⏳ [MenuPermissionsTable] currentUser 로드 대기 중...");
return;
}
const loadAllMenus = async () => {
// 최고 관리자: companyCode 없이 모든 메뉴 조회
// 회사 관리자: 자기 회사 메뉴만 조회
const targetCompanyCode = isSuperAdmin ? undefined : roleGroup.companyCode;
console.log("🔍 [MenuPermissionsTable] 전체 메뉴 로드 시작", {
companyCode: roleGroup.companyCode,
currentUser: {
userId: currentUser.userId,
companyCode: currentUser.companyCode,
userType: currentUser.userType,
},
isSuperAdmin,
roleGroupCompanyCode: roleGroup.companyCode,
targetCompanyCode: targetCompanyCode || "전체",
});
try {
setIsLoading(true);
const response = await roleAPI.getAllMenus(roleGroup.companyCode);
const response = await roleAPI.getAllMenus(targetCompanyCode);
console.log("✅ [MenuPermissionsTable] 전체 메뉴 로드 응답", {
success: response.success,
@@ -71,7 +93,7 @@ export function MenuPermissionsTable({ permissions, onPermissionsChange, roleGro
};
loadAllMenus();
}, [roleGroup.companyCode]);
}, [currentUser, isSuperAdmin, roleGroup.companyCode]);
// 메뉴 권한 상태 (로컬 상태 관리)
const [menuPermissions, setMenuPermissions] = useState<Map<number, MenuPermission>>(new Map());
@@ -106,6 +128,14 @@ export function MenuPermissionsTable({ permissions, onPermissionsChange, roleGro
}
}, [allMenus, permissions, isInitialized]);
// menuPermissions가 변경되면 부모에 전달 (초기화 이후에만)
useEffect(() => {
if (isInitialized && menuPermissions.size > 0) {
const updatedPermissions = Array.from(menuPermissions.values());
onPermissionsChange(updatedPermissions);
}
}, [menuPermissions, isInitialized, onPermissionsChange]);
// 메뉴 트리 구조 생성 (menuPermissions에서)
const menuTree: MenuPermission[] = Array.from(menuPermissions.values());
@@ -136,16 +166,12 @@ export function MenuPermissionsTable({ permissions, onPermissionsChange, roleGro
});
}
// 변경된 상태를 부모에 전달
const updatedPermissions = Array.from(newMap.values());
onPermissionsChange(updatedPermissions);
return newMap;
});
console.log("✅ 권한 변경:", { menuObjid, permission, checked });
},
[onPermissionsChange],
[],
);
// 전체 선택/해제
@@ -161,16 +187,12 @@ export function MenuPermissionsTable({ permissions, onPermissionsChange, roleGro
});
});
// 변경된 상태를 부모에 전달
const updatedPermissions = Array.from(newMap.values());
onPermissionsChange(updatedPermissions);
return newMap;
});
console.log("✅ 전체 선택:", { permission, checked });
},
[onPermissionsChange],
[],
);
// 메뉴 행 렌더링

View File

@@ -56,7 +56,9 @@ function getAuthToken(): string | null {
// 인증 헤더 생성 헬퍼
function getAuthHeaders(): HeadersInit {
const token = getAuthToken();
const headers: HeadersInit = {};
const headers: HeadersInit = {
"Content-Type": "application/json",
};
if (token) {
headers["Authorization"] = `Bearer ${token}`;
}
@@ -406,12 +408,9 @@ export async function getAllStepCounts(flowId: number): Promise<ApiResponse<Flow
*/
export async function moveData(data: MoveDataRequest): Promise<ApiResponse<{ success: boolean }>> {
try {
const token = getAuthToken();
const response = await fetch(`${API_BASE}/flow/move`, {
method: "POST",
headers: getAuthHeaders(),
...(token && { Authorization: `Bearer ${token}` }),
headers: getAuthHeaders(),
credentials: "include",
body: JSON.stringify(data),
});
@@ -447,12 +446,9 @@ export async function moveBatchData(
data: MoveBatchDataRequest,
): Promise<ApiResponse<{ success: boolean; results: any[] }>> {
try {
const token = getAuthToken();
const response = await fetch(`${API_BASE}/flow/move-batch`, {
method: "POST",
headers: getAuthHeaders(),
...(token && { Authorization: `Bearer ${token}` }),
headers: getAuthHeaders(),
credentials: "include",
body: JSON.stringify(data),
});