최고관리자가 부여한 권한에 따라 메뉴 보여주기
This commit is contained in:
@@ -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],
|
||||
[],
|
||||
);
|
||||
|
||||
// 메뉴 행 렌더링
|
||||
|
||||
@@ -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),
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user