"use client" import { useState } from "react" import { useRouter } from "next/navigation" import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" import { Badge } from "@/components/ui/badge" 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 { Textarea } from "@/components/ui/textarea" import { Checkbox } from "@/components/ui/checkbox" import { Users, UserPlus, Search, MoreHorizontal, Mail, UserX, Edit, Trash2, CheckCircle, XCircle, Clock, Crown, Eye, MessageSquare, Settings, X, AlertTriangle, UserCheck, } from "lucide-react" interface User { id: string name: string email: string role: "admin" | "editor" | "viewer" status: "active" | "pending" | "inactive" lastActive: string avatar: string department: string joinDate: string documentsCount: number folderRoles: { [folderId: string]: { role: "owner" | "editor" | "viewer" | "validator" | "contributor" folderName: string assignedDate: Date } } spaceRole: "admin" | "manager" | "user" | "guest" permissions: { canInvite: boolean canManageRoles: boolean canDelete: boolean canDeactivate: boolean } } interface ActionModal { type: "invite" | "message" | "roles" | "deactivate" | "delete" | null user: User | null users: User[] } export default function UsersPage() { const router = useRouter() const [searchTerm, setSearchTerm] = useState("") const [roleFilter, setRoleFilter] = useState("all") const [statusFilter, setStatusFilter] = useState("all") const [selectedUsers, setSelectedUsers] = useState([]) const [actionModal, setActionModal] = useState({ type: null, user: null, users: [] }) const [notification, setNotification] = useState<{ type: "success" | "error" | "info"; message: string } | null>(null) // Modal states const [inviteEmail, setInviteEmail] = useState("") const [inviteRole, setInviteRole] = useState("viewer") const [inviteDepartment, setInviteDepartment] = useState("") const [inviteMessage, setInviteMessage] = useState("") const [messageContent, setMessageContent] = useState("") const [messageSubject, setMessageSubject] = useState("") const [newUserRole, setNewUserRole] = useState("") const [newSpaceRole, setNewSpaceRole] = useState("") const [deactivateReason, setDeactivateReason] = useState("") const [users, setUsers] = useState([ { id: "1", name: "Marie Dubois", email: "marie.dubois@docv.fr", role: "admin", status: "active", lastActive: "Il y a 2 minutes", avatar: "MD", department: "Direction", joinDate: "2023-01-15", documentsCount: 245, folderRoles: { contracts: { role: "owner", folderName: "Contrats", assignedDate: new Date("2024-01-01") }, finance: { role: "editor", folderName: "Finance", assignedDate: new Date("2024-01-05") }, }, spaceRole: "admin", permissions: { canInvite: true, canManageRoles: true, canDelete: false, canDeactivate: true, }, }, { id: "2", name: "Pierre Martin", email: "pierre.martin@docv.fr", role: "editor", status: "active", lastActive: "Il y a 1 heure", avatar: "PM", department: "Juridique", joinDate: "2023-03-20", documentsCount: 189, folderRoles: { contracts: { role: "editor", folderName: "Contrats", assignedDate: new Date("2024-01-10") }, reports: { role: "viewer", folderName: "Rapports", assignedDate: new Date("2024-01-15") }, }, spaceRole: "user", permissions: { canInvite: true, canManageRoles: false, canDelete: false, canDeactivate: false, }, }, { id: "3", name: "Sophie Laurent", email: "sophie.laurent@docv.fr", role: "viewer", status: "pending", lastActive: "Jamais connecté", avatar: "SL", department: "RH", joinDate: "2024-01-10", documentsCount: 0, folderRoles: { hr: { role: "owner", folderName: "Ressources Humaines", assignedDate: new Date("2024-01-10") }, }, spaceRole: "user", permissions: { canInvite: false, canManageRoles: false, canDelete: false, canDeactivate: false, }, }, { id: "4", name: "Thomas Rousseau", email: "thomas.rousseau@docv.fr", role: "editor", status: "inactive", lastActive: "Il y a 2 semaines", avatar: "TR", department: "Finance", joinDate: "2023-06-12", documentsCount: 156, folderRoles: { finance: { role: "owner", folderName: "Finance", assignedDate: new Date("2023-06-12") }, reports: { role: "contributor", folderName: "Rapports", assignedDate: new Date("2023-07-01") }, }, spaceRole: "user", permissions: { canInvite: true, canManageRoles: false, canDelete: false, canDeactivate: false, }, }, { id: "5", name: "Julie Moreau", email: "julie.moreau@docv.fr", role: "admin", status: "active", lastActive: "Il y a 30 minutes", avatar: "JM", department: "IT", joinDate: "2023-02-28", documentsCount: 312, folderRoles: { projects: { role: "owner", folderName: "Projets", assignedDate: new Date("2023-02-28") }, contracts: { role: "validator", folderName: "Contrats", assignedDate: new Date("2023-03-01") }, hr: { role: "editor", folderName: "Ressources Humaines", assignedDate: new Date("2023-03-15") }, }, spaceRole: "admin", permissions: { canInvite: true, canManageRoles: true, canDelete: true, canDeactivate: true, }, }, ]) const stats = { total: users.length, active: users.filter((u) => u.status === "active").length, pending: users.filter((u) => u.status === "pending").length, admins: users.filter((u) => u.role === "admin").length, } // Notification system const showNotification = (type: "success" | "error" | "info", message: string) => { setNotification({ type, message }) setTimeout(() => setNotification(null), 3000) } // User actions const handleInviteUser = () => { setInviteEmail("") setInviteRole("viewer") setInviteDepartment("") setInviteMessage("") setActionModal({ type: "invite", user: null, users: [] }) } const handleMessageUser = (user: User) => { setMessageSubject("") setMessageContent("") setActionModal({ type: "message", user, users: [] }) } const handleBulkMessage = () => { const selectedUserData = users.filter((user) => selectedUsers.includes(user.id)) setMessageSubject("") setMessageContent("") setActionModal({ type: "message", user: null, users: selectedUserData }) } const handleChangeRoles = (user: User) => { setNewUserRole(user.role) setNewSpaceRole(user.spaceRole) setActionModal({ type: "roles", user, users: [] }) } const handleBulkChangeRoles = () => { const selectedUserData = users.filter((user) => selectedUsers.includes(user.id)) setNewUserRole("") setNewSpaceRole("") setActionModal({ type: "roles", user: null, users: selectedUserData }) } const handleDeactivateUser = (user: User) => { setDeactivateReason("") setActionModal({ type: "deactivate", user, users: [] }) } const handleBulkDeactivate = () => { const selectedUserData = users.filter((user) => selectedUsers.includes(user.id) && user.permissions.canDeactivate) if (selectedUserData.length === 0) { showNotification("error", "Aucun utilisateur sélectionné ne peut être désactivé") return } setDeactivateReason("") setActionModal({ type: "deactivate", user: null, users: selectedUserData }) } const handleDeleteUser = (user: User) => { setActionModal({ type: "delete", user, users: [] }) } // Modal actions const confirmInvite = () => { const newUser: User = { id: (users.length + 1).toString(), name: inviteEmail.split("@")[0], email: inviteEmail, role: inviteRole as "admin" | "editor" | "viewer", status: "pending", lastActive: "Jamais connecté", avatar: inviteEmail.substring(0, 2).toUpperCase(), department: inviteDepartment, joinDate: new Date().toISOString().split("T")[0], documentsCount: 0, folderRoles: {}, spaceRole: inviteRole === "admin" ? "admin" : "user", permissions: { canInvite: inviteRole !== "viewer", canManageRoles: inviteRole === "admin", canDelete: inviteRole === "admin", canDeactivate: inviteRole === "admin", }, } setUsers((prev) => [...prev, newUser]) showNotification("success", `Invitation envoyée à ${inviteEmail}`) setActionModal({ type: null, user: null, users: [] }) } const confirmMessage = () => { if (actionModal.user) { // Créer une nouvelle conversation ou rediriger vers une existante const conversationData = { userId: actionModal.user.id, userName: actionModal.user.name, subject: messageSubject, content: messageContent, timestamp: new Date().toISOString(), } // Stocker les données du message pour le chat sessionStorage.setItem("newMessage", JSON.stringify(conversationData)) showNotification("success", `Redirection vers le chat avec ${actionModal.user.name}...`) setTimeout(() => { router.push(`/dashboard/chat?user=${actionModal.user.id}&message=new`) }, 1000) } else if (actionModal.users.length > 0) { // Pour les messages groupés const groupData = { users: actionModal.users.map((u) => ({ id: u.id, name: u.name })), subject: messageSubject, content: messageContent, timestamp: new Date().toISOString(), } sessionStorage.setItem("newGroupMessage", JSON.stringify(groupData)) showNotification( "success", `Redirection vers le chat de groupe avec ${actionModal.users.length} utilisateur(s)...`, ) setTimeout(() => { router.push("/dashboard/chat?type=group&message=new") }, 1000) setSelectedUsers([]) } setActionModal({ type: null, user: null, users: [] }) } const confirmRoleChange = () => { if (actionModal.user) { const updatedUser = { ...actionModal.user, role: newUserRole as "admin" | "editor" | "viewer", spaceRole: newSpaceRole as "admin" | "manager" | "user" | "guest", permissions: { canInvite: newUserRole !== "viewer", canManageRoles: newUserRole === "admin", canDelete: newUserRole === "admin", canDeactivate: newUserRole === "admin", }, } setUsers((prev) => prev.map((u) => (u.id === updatedUser.id ? updatedUser : u))) showNotification("success", `Rôles mis à jour pour ${actionModal.user.name}`) } else if (actionModal.users.length > 0) { const userIds = actionModal.users.map((u) => u.id) setUsers((prev) => prev.map((u) => userIds.includes(u.id) ? { ...u, role: newUserRole as "admin" | "editor" | "viewer", spaceRole: newSpaceRole as "admin" | "manager" | "user" | "guest", permissions: { canInvite: newUserRole !== "viewer", canManageRoles: newUserRole === "admin", canDelete: newUserRole === "admin", canDeactivate: newUserRole === "admin", }, } : u, ), ) showNotification("success", `Rôles mis à jour pour ${actionModal.users.length} utilisateur(s)`) setSelectedUsers([]) } setActionModal({ type: null, user: null, users: [] }) } const confirmDeactivate = () => { if (actionModal.user) { const updatedUser = { ...actionModal.user, status: "inactive" as const } setUsers((prev) => prev.map((u) => (u.id === updatedUser.id ? updatedUser : u))) showNotification("success", `${actionModal.user.name} désactivé`) } else if (actionModal.users.length > 0) { const userIds = actionModal.users.map((u) => u.id) setUsers((prev) => prev.map((u) => (userIds.includes(u.id) ? { ...u, status: "inactive" as const } : u))) showNotification("success", `${actionModal.users.length} utilisateur(s) désactivé(s)`) setSelectedUsers([]) } setActionModal({ type: null, user: null, users: [] }) } const confirmDelete = () => { if (actionModal.user) { setUsers((prev) => prev.filter((u) => u.id !== actionModal.user!.id)) showNotification("success", `${actionModal.user.name} supprimé`) } setActionModal({ type: null, user: null, users: [] }) } const filteredUsers = users.filter((user) => { const matchesSearch = user.name.toLowerCase().includes(searchTerm.toLowerCase()) || user.email.toLowerCase().includes(searchTerm.toLowerCase()) const matchesRole = roleFilter === "all" || user.role === roleFilter const matchesStatus = statusFilter === "all" || user.status === statusFilter return matchesSearch && matchesRole && matchesStatus }) const getRoleColor = (role: string) => { switch (role) { case "admin": return "bg-red-100 text-red-800" case "editor": return "bg-blue-100 text-blue-800" case "viewer": return "bg-gray-100 text-gray-800" default: return "bg-gray-100 text-gray-800" } } const getStatusColor = (status: string) => { switch (status) { case "active": return "bg-green-100 text-green-800" case "pending": return "bg-yellow-100 text-yellow-800" case "inactive": return "bg-gray-100 text-gray-800" default: return "bg-gray-100 text-gray-800" } } const getStatusIcon = (status: string) => { switch (status) { case "active": return case "pending": return case "inactive": return default: return } } const getRoleIcon = (role: string) => { switch (role) { case "admin": return case "editor": return case "viewer": return default: return } } const handleSelectUser = (userId: string) => { setSelectedUsers((prev) => (prev.includes(userId) ? prev.filter((id) => id !== userId) : [...prev, userId])) } const handleSelectAll = () => { if (selectedUsers.length === filteredUsers.length) { setSelectedUsers([]) } else { setSelectedUsers(filteredUsers.map((user) => user.id)) } } return (
{/* Notification */} {notification && (
{notification.type === "success" && } {notification.type === "error" && } {notification.type === "info" && } {notification.message}
)} {/* Header */}

Gestion des rôles - Profils utilisateurs

Gérez les utilisateurs, leurs rôles et leurs permissions dans l'espace

{/* Stats */}

Total

{stats.total}

Actifs

{stats.active}

En attente

{stats.pending}

Admins

{stats.admins}

{/* Filters and Search */}
setSearchTerm(e.target.value)} className="pl-10" />
{selectedUsers.length > 0 && (
{selectedUsers.length} utilisateur(s) sélectionné(s)
)}
{/* Users Table */} Liste des utilisateurs
{filteredUsers.map((user) => ( ))}
0} onCheckedChange={handleSelectAll} /> Utilisateur Rôle Statut Département Documents Dernière activité Actions
handleSelectUser(user.id)} />
{user.avatar}

{user.name}

{user.email}

{getRoleIcon(user.role)} {user.role}
{getStatusIcon(user.status)} {user.status}
{user.department} {user.documentsCount} {user.lastActive}
{user.permissions.canManageRoles && ( )}
{user.permissions.canDeactivate && user.status === "active" && ( )} {user.permissions.canDelete && ( )}
{filteredUsers.length === 0 && (

Aucun utilisateur trouvé

Essayez de modifier vos critères de recherche

)}
{/* Modals */} {actionModal.type && (
{/* Invite Modal */} {actionModal.type === "invite" && ( <>

Inviter un utilisateur

setInviteEmail(e.target.value)} placeholder="utilisateur@exemple.com" />
setInviteDepartment(e.target.value)} placeholder="ex: Juridique" />