- {/* 최고 관리자는 회사명 표시 */}
- {isSuperAdmin && (
-
- {t("label.company")}
-
- {companies.find((c) => c.company_code === role.companyCode)?.company_name || role.companyCode}
-
-
- )}
diff --git a/frontend/components/admin/RoleFormModal.tsx b/frontend/components/admin/RoleFormModal.tsx
index b6e0fd0b..f2ac5809 100644
--- a/frontend/components/admin/RoleFormModal.tsx
+++ b/frontend/components/admin/RoleFormModal.tsx
@@ -13,13 +13,9 @@ import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
import { Label } from "@/components/ui/label";
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select";
-import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from "@/components/ui/command";
-import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover";
import { roleAPI, RoleGroup } from "@/lib/api/role";
import { useAuth } from "@/hooks/useAuth";
-import { AlertCircle, Check, ChevronsUpDown } from "lucide-react";
-import { cn } from "@/lib/utils";
-import { companyAPI } from "@/lib/api/company";
+import { AlertCircle } from "lucide-react";
interface RoleFormModalProps {
isOpen: boolean;
@@ -42,14 +38,10 @@ export function RoleFormModal({ isOpen, onClose, onSuccess, editingRole }: RoleF
const { user: currentUser } = useAuth();
const isEditMode = !!editingRole;
- // 최고 관리자 여부
- const isSuperAdmin = currentUser?.companyCode === "*" && currentUser?.userType === "SUPER_ADMIN";
-
// 폼 데이터
const [formData, setFormData] = useState({
authName: "",
authCode: "",
- companyCode: currentUser?.companyCode || "",
status: "active",
});
@@ -59,14 +51,9 @@ export function RoleFormModal({ isOpen, onClose, onSuccess, editingRole }: RoleF
const [alertMessage, setAlertMessage] = useState("");
const [alertType, setAlertType] = useState<"success" | "error" | "info">("info");
- // 회사 목록 (최고 관리자용)
- const [companies, setCompanies] = useState>([]);
- const [isLoadingCompanies, setIsLoadingCompanies] = useState(false);
- const [companyComboOpen, setCompanyComboOpen] = useState(false);
-
// 폼 유효성 검사
const isFormValid = useMemo(() => {
- return formData.authName.trim() !== "" && formData.authCode.trim() !== "" && formData.companyCode.trim() !== "";
+ return formData.authName.trim() !== "" && formData.authCode.trim() !== "";
}, [formData]);
// 알림 표시
@@ -77,38 +64,14 @@ export function RoleFormModal({ isOpen, onClose, onSuccess, editingRole }: RoleF
setTimeout(() => setShowAlert(false), 3000);
}, []);
- // 회사 목록 로드 (최고 관리자만)
- const loadCompanies = useCallback(async () => {
- if (!isSuperAdmin) return;
-
- setIsLoadingCompanies(true);
- try {
- // companyAPI.getList()는 Promise를 반환하므로 직접 사용
- const companies = await companyAPI.getList();
- console.log("📋 회사 목록 로드 성공:", companies);
- setCompanies(companies);
- } catch (error) {
- console.error("❌ 회사 목록 로드 오류:", error);
- displayAlert("회사 목록을 불러오는데 실패했습니다.", "error");
- } finally {
- setIsLoadingCompanies(false);
- }
- }, [isSuperAdmin, displayAlert]);
-
// 초기화
useEffect(() => {
if (isOpen) {
- // 최고 관리자이고 생성 모드일 때만 회사 목록 로드
- if (isSuperAdmin && !isEditMode) {
- loadCompanies();
- }
-
if (isEditMode && editingRole) {
// 수정 모드: 기존 데이터 로드
setFormData({
authName: editingRole.authName || "",
authCode: editingRole.authCode || "",
- companyCode: editingRole.companyCode || "",
status: editingRole.status || "active",
});
} else {
@@ -116,13 +79,12 @@ export function RoleFormModal({ isOpen, onClose, onSuccess, editingRole }: RoleF
setFormData({
authName: "",
authCode: "",
- companyCode: currentUser?.companyCode || "",
status: "active",
});
}
setShowAlert(false);
}
- }, [isOpen, isEditMode, editingRole, currentUser?.companyCode, isSuperAdmin, loadCompanies]);
+ }, [isOpen, isEditMode, editingRole]);
// 입력 핸들러
const handleInputChange = useCallback((field: string, value: string) => {
@@ -148,11 +110,11 @@ export function RoleFormModal({ isOpen, onClose, onSuccess, editingRole }: RoleF
status: formData.status,
});
} else {
- // 생성
+ // 생성 (단일 테넌시: 현재 사용자 회사 코드 사용)
response = await roleAPI.create({
authName: formData.authName,
authCode: formData.authCode,
- companyCode: formData.companyCode,
+ companyCode: currentUser?.companyCode || "",
});
}
@@ -226,102 +188,6 @@ export function RoleFormModal({ isOpen, onClose, onSuccess, editingRole }: RoleF
- {/* 회사 (수정 모드에서는 비활성화) */}
- {isEditMode ? (
-
-
-
-
회사 코드는 수정할 수 없습니다.
-
- ) : (
-
-
- {isSuperAdmin ? (
- <>
-
-
-
-
-
-
-
-
-
- {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) => {