diff --git a/frontend/app/(main)/admin/userMng/rolesList/[id]/page.tsx b/frontend/app/(main)/admin/userMng/rolesList/[id]/page.tsx index 62d9b3e0..3c3464fb 100644 --- a/frontend/app/(main)/admin/userMng/rolesList/[id]/page.tsx +++ b/frontend/app/(main)/admin/userMng/rolesList/[id]/page.tsx @@ -388,9 +388,7 @@ export default function RoleDetailPage({ params }: { params: Promise<{ id: strin

{roleGroup.authName}

-

- {roleGroup.authCode} • {roleGroup.companyCode} -

+

{roleGroup.authCode}

= { "roles.title": "권한 그룹 관리", - "roles.description": "회사 내 권한 그룹을 생성하고 멤버를 관리합니다 (회사 관리자 이상)", + "roles.description": "권한 그룹을 생성하고 멤버를 관리합니다 (회사 관리자 이상)", "access.denied": "접근 권한 없음", "access.denied.msg": "권한 그룹 관리는 회사 관리자 이상만 접근할 수 있습니다.", "button.back": "뒤로 가기", "error.occurred": "오류가 발생했습니다", "error.close.aria": "에러 메시지 닫기", "roles.list.title": "권한 그룹 목록", - "filter.company.placeholder": "회사 선택", - "filter.company.all": "전체 회사", "button.create": "권한 그룹 생성", "loading": "권한 그룹 목록을 불러오는 중...", "empty.message": "등록된 권한 그룹이 없습니다.", "empty.hint": "권한 그룹을 생성하여 멤버를 관리해보세요.", "status.active": "활성", "status.inactive": "비활성", - "label.company": "회사", "label.memberCount": "멤버 수", "label.menuPermissions": "메뉴 권한", "count.members": "{count}명", @@ -94,17 +86,12 @@ export default function RolesPage() { const isAdmin = (currentUser?.companyCode === "*" && currentUser?.userType === "SUPER_ADMIN") || currentUser?.userType === "COMPANY_ADMIN"; - const isSuperAdmin = currentUser?.companyCode === "*" && currentUser?.userType === "SUPER_ADMIN"; // 상태 관리 const [roleGroups, setRoleGroups] = useState([]); const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(null); - // 회사 필터 (최고 관리자 전용) - const [companies, setCompanies] = useState>([]); - const [selectedCompany, setSelectedCompany] = useState("all"); - // 모달 상태 const [formModal, setFormModal] = useState({ isOpen: false, @@ -116,42 +103,18 @@ export default function RolesPage() { role: null as RoleGroup | null, }); - // 회사 목록 로드 (최고 관리자만) - const loadCompanies = useCallback(async () => { - if (!isSuperAdmin) return; - - try { - const companies = await companyAPI.getList(); - setCompanies(companies); - } catch (error) { - console.error("회사 목록 로드 오류:", error); - } - }, [isSuperAdmin]); - - // 데이터 로드 + // 데이터 로드 (단일 테넌시: 현재 사용자 회사 기준) const loadRoleGroups = useCallback(async () => { setIsLoading(true); setError(null); try { - // 최고 관리자: selectedCompany에 따라 필터링 (all이면 전체 조회) - // 회사 관리자: 자기 회사만 조회 - const companyFilter = - isSuperAdmin && selectedCompany !== "all" - ? selectedCompany - : isSuperAdmin - ? undefined - : currentUser?.companyCode; - - console.log("권한 그룹 목록 조회:", { isSuperAdmin, selectedCompany, companyFilter }); - const response = await roleAPI.getList({ - companyCode: companyFilter, + companyCode: currentUser?.companyCode, }); if (response.success && response.data) { setRoleGroups(response.data); - console.log("권한 그룹 조회 성공:", response.data.length, "개"); } else { setError(response.message || t("error.load.list")); } @@ -161,18 +124,15 @@ export default function RolesPage() { } finally { setIsLoading(false); } - }, [isSuperAdmin, selectedCompany, currentUser?.companyCode]); + }, [currentUser?.companyCode, t]); useEffect(() => { if (isAdmin) { - if (isSuperAdmin) { - loadCompanies(); // 최고 관리자는 회사 목록 먼저 로드 - } loadRoleGroups(); } else { setIsLoading(false); } - }, [isAdmin, isSuperAdmin, loadRoleGroups, loadCompanies]); + }, [isAdmin, loadRoleGroups]); // 권한 그룹 생성 핸들러 const handleCreateRole = useCallback(() => { @@ -271,34 +231,7 @@ export default function RolesPage() { {/* 액션 버튼 영역 */}
-
-

{t("roles.list.title")} ({roleGroups.length})

- - {/* 최고 관리자 전용: 회사 필터 */} - {isSuperAdmin && ( -
- - - {selectedCompany !== "all" && ( - - )} -
- )} -
+

{t("roles.list.title")} ({roleGroups.length})

- - - - - - - {isLoadingCompanies ? "로딩 중..." : "회사를 찾을 수 없습니다."} - - - {companies.map((company) => ( - { - handleInputChange("companyCode", company.company_code); - setCompanyComboOpen(false); - }} - className="text-xs sm:text-sm" - > - -
- {company.company_name} - {company.company_code} -
-
- ))} -
-
-
-
- -

- 모든 회사에 권한 그룹을 생성할 수 있습니다. -

- - ) : ( - <> - -

- 자신의 회사에만 권한 그룹을 생성할 수 있습니다. -

- - )} -
- )} - {/* 상태 (수정 모드에서만 표시) */} {isEditMode && (
diff --git a/frontend/components/messenger/MessageInput.tsx b/frontend/components/messenger/MessageInput.tsx index 241fcae7..dcf9fffc 100644 --- a/frontend/components/messenger/MessageInput.tsx +++ b/frontend/components/messenger/MessageInput.tsx @@ -39,7 +39,7 @@ function MessageInput({ roomId, onTypingStart, onTypingStop }: MessageInputProps const { data: users } = useCompanyUsers(); const filteredMentionUsers = mentionQuery !== null && users - ? users.filter((u) => u.userName.toLowerCase().includes(mentionQuery.toLowerCase())).slice(0, 5) + ? users.filter((u) => u.userName?.toLowerCase().includes(mentionQuery.toLowerCase())).slice(0, 5) : []; // Revoke object URLs when pending files change or component unmounts diff --git a/frontend/components/messenger/NewRoomModal.tsx b/frontend/components/messenger/NewRoomModal.tsx index 09fa513c..fde5b435 100644 --- a/frontend/components/messenger/NewRoomModal.tsx +++ b/frontend/components/messenger/NewRoomModal.tsx @@ -35,10 +35,11 @@ export function NewRoomModal({ open, onOpenChange, userStatuses }: NewRoomModalP const createRoom = useCreateRoom(); const { selectRoom } = useMessengerContext(); + const q = search.toLowerCase(); const filtered = users.filter( (u) => - u.userName.toLowerCase().includes(search.toLowerCase()) || - (u.deptName && u.deptName.toLowerCase().includes(search.toLowerCase())) + u.userName?.toLowerCase().includes(q) || + u.deptName?.toLowerCase().includes(q) ); const toggleUser = (userId: string) => {