"use client" import { useState, useEffect } from "react" import { useRouter, useParams } 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 { Users, UserPlus, Search, ArrowLeft, Crown, Edit, Eye, Shield, UserCheck, Trash2, X, CheckCircle, XCircle, Info, Folder, } from "lucide-react" interface FolderRole { userId: string userName: string userEmail: string userAvatar: string role: "owner" | "editor" | "viewer" | "validator" | "contributor" assignedDate: Date assignedBy: string defaultRole: "admin" | "editor" | "viewer" } interface User { id: string name: string email: string avatar: string defaultRole: "admin" | "editor" | "viewer" department: string } export default function FolderRolesPage() { const router = useRouter() const params = useParams() const folderId = params.id as string const [folderName, setFolderName] = useState("") const [folderRoles, setFolderRoles] = useState([]) const [availableUsers, setAvailableUsers] = useState([]) const [searchTerm, setSearchTerm] = useState("") const [showAddUser, setShowAddUser] = useState(false) const [selectedUser, setSelectedUser] = useState("") const [selectedRole, setSelectedRole] = useState("viewer") const [inviteMessage, setInviteMessage] = useState("") const [notification, setNotification] = useState<{ type: "success" | "error" | "info"; message: string } | null>(null) // Simuler le chargement des données useEffect(() => { // Charger les informations du dossier const folderNames: { [key: string]: string } = { "1": "Contrats", "2": "Rapports", "3": "Projets", "4": "Finance", "5": "Ressources Humaines", "6": "Marketing", } setFolderName(folderNames[folderId] || "Dossier") // Charger les rôles existants sur le dossier const mockFolderRoles: FolderRole[] = [ { userId: "1", userName: "Marie Dubois", userEmail: "marie.dubois@docv.fr", userAvatar: "MD", role: "owner", assignedDate: new Date("2024-01-01"), assignedBy: "Système", defaultRole: "admin", }, { userId: "2", userName: "Pierre Martin", userEmail: "pierre.martin@docv.fr", userAvatar: "PM", role: "editor", assignedDate: new Date("2024-01-10"), assignedBy: "Marie Dubois", defaultRole: "editor", }, { userId: "5", userName: "Julie Moreau", userEmail: "julie.moreau@docv.fr", userAvatar: "JM", role: "validator", assignedDate: new Date("2024-01-15"), assignedBy: "Marie Dubois", defaultRole: "admin", }, ] setFolderRoles(mockFolderRoles) // Charger les utilisateurs disponibles (ceux qui n'ont pas encore de rôle sur ce dossier) const allUsers: User[] = [ { id: "3", name: "Sophie Laurent", email: "sophie.laurent@docv.fr", avatar: "SL", defaultRole: "viewer", department: "RH", }, { id: "4", name: "Thomas Rousseau", email: "thomas.rousseau@docv.fr", avatar: "TR", defaultRole: "editor", department: "Finance", }, ] const usersWithRoles = mockFolderRoles.map((fr) => fr.userId) const available = allUsers.filter((user) => !usersWithRoles.includes(user.id)) setAvailableUsers(available) }, [folderId]) // Notification system const showNotification = (type: "success" | "error" | "info", message: string) => { setNotification({ type, message }) setTimeout(() => setNotification(null), 3000) } const getRoleIcon = (role: string) => { switch (role) { case "owner": return case "editor": return case "validator": return case "contributor": return case "viewer": return default: return } } const getRoleColor = (role: string) => { switch (role) { case "owner": return "bg-yellow-100 text-yellow-800 border-yellow-200" case "editor": return "bg-blue-100 text-blue-800 border-blue-200" case "validator": return "bg-green-100 text-green-800 border-green-200" case "contributor": return "bg-purple-100 text-purple-800 border-purple-200" case "viewer": return "bg-gray-100 text-gray-800 border-gray-200" default: return "bg-gray-100 text-gray-800 border-gray-200" } } const getDefaultRoleColor = (role: string) => { switch (role) { case "admin": return "bg-red-100 text-red-800 border-red-200" case "editor": return "bg-blue-100 text-blue-800 border-blue-200" case "viewer": return "bg-gray-100 text-gray-800 border-gray-200" default: return "bg-gray-100 text-gray-800 border-gray-200" } } const handleAddUser = () => { if (!selectedUser) return const user = availableUsers.find((u) => u.id === selectedUser) if (!user) return const newRole: FolderRole = { userId: user.id, userName: user.name, userEmail: user.email, userAvatar: user.avatar, role: selectedRole as "owner" | "editor" | "viewer" | "validator" | "contributor", assignedDate: new Date(), assignedBy: "Utilisateur actuel", defaultRole: user.defaultRole, } setFolderRoles((prev) => [...prev, newRole]) setAvailableUsers((prev) => prev.filter((u) => u.id !== selectedUser)) showNotification("success", `${user.name} ajouté avec le rôle ${selectedRole}`) // Reset form setSelectedUser("") setSelectedRole("viewer") setInviteMessage("") setShowAddUser(false) } const handleChangeRole = (userId: string, newRole: string) => { setFolderRoles((prev) => prev.map((fr) => fr.userId === userId ? { ...fr, role: newRole as "owner" | "editor" | "viewer" | "validator" | "contributor" } : fr, ), ) const user = folderRoles.find((fr) => fr.userId === userId) showNotification("success", `Rôle de ${user?.userName} mis à jour vers ${newRole}`) } const handleRemoveUser = (userId: string) => { const userRole = folderRoles.find((fr) => fr.userId === userId) if (!userRole) return if (userRole.role === "owner") { showNotification("error", "Impossible de supprimer le propriétaire du dossier") return } setFolderRoles((prev) => prev.filter((fr) => fr.userId !== userId)) // Remettre l'utilisateur dans la liste des disponibles const user: User = { id: userRole.userId, name: userRole.userName, email: userRole.userEmail, avatar: userRole.userAvatar, defaultRole: userRole.defaultRole, department: "Département", // Valeur par défaut } setAvailableUsers((prev) => [...prev, user]) showNotification("success", `${userRole.userName} retiré du dossier`) } const filteredRoles = folderRoles.filter( (role) => role.userName.toLowerCase().includes(searchTerm.toLowerCase()) || role.userEmail.toLowerCase().includes(searchTerm.toLowerCase()), ) return (
{/* Notification */} {notification && (
{notification.type === "success" && } {notification.type === "error" && } {notification.type === "info" && } {notification.message}
)} {/* Header */}

Gestion des rôles - Dossier "{folderName}"

Gérez les permissions d'accès et les rôles des utilisateurs sur ce dossier

{/* Stats supprimées selon la consigne */} {/* Search and Add */}
setSearchTerm(e.target.value)} className="pl-10" />
{showAddUser && (

Ajouter un utilisateur au dossier

)}
{/* Roles List */} Utilisateurs avec accès au dossier
{filteredRoles.map((roleAssignment) => ( ))}
Utilisateur Rôle par défaut Rôle sur ce dossier Assigné le Assigné par Actions
{roleAssignment.userAvatar}

{roleAssignment.userName}

{roleAssignment.userEmail}

{roleAssignment.defaultRole} {roleAssignment.assignedDate.toLocaleDateString("fr-FR")} {roleAssignment.assignedBy} {roleAssignment.role !== "owner" && ( )}
{filteredRoles.length === 0 && (

Aucun utilisateur trouvé

Essayez de modifier vos critères de recherche

)}
) }