"use client" import { useState, useEffect } from "react" import { useSearchParams, useRouter } from "next/navigation" import { Card, CardContent } 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 { Checkbox } from "@/components/ui/checkbox" import { Textarea } from "@/components/ui/textarea" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" import { FileText, Grid3X3, List, Search, Filter, Plus, Upload, Download, Eye, Edit, Trash2, FolderOpen, Star, Clock, FileImage, FileSpreadsheet, FileVideo, Archive, SortAsc, SortDesc, X, CheckCircle, XCircle, Info, UserPlus, FileQuestion, ShieldCheck, Cloud, HardDrive, CloudUpload, Users, Crown, Shield, User, Folder, Brain, Settings, Calendar, AlertTriangle, } from "lucide-react" interface Document { id: number name: string type: string size: string modified: Date created: Date author: string folder: string folderId: string tags: string[] status: string thumbnail: string description?: string version: string isValidated: boolean hasCertificate: boolean summary?: string storageType: "temporary" | "permanent" permissions: { canView: boolean canEdit: boolean canDelete: boolean canInvite: boolean canValidate: boolean canArchive: boolean canAnalyze: boolean } temporaryStorageConfig?: { duration: number // en jours dataUsage: string thirdPartyAccess: string } } interface ActionModal { type: | "view" | "edit" | "invite" | "delete" | "move" | "rename" | "request" | "validate" | "certificate" | "archive" | "storage_config" | "import" | "new_document" | null document: Document | null documents: Document[] } interface UserWithRoles { id: string name: string email: string avatar: string folderRoles: { [folderId: string]: { role: "owner" | "editor" | "viewer" | "validator" | "contributor" assignedDate: Date } } spaceRole: "admin" | "manager" | "user" | "guest" spaceRoles: { [spaceId: string]: { role: "admin" | "manager" | "user" | "guest" spaceName: string } } } interface Role { id: string name: string description: string level: "folder" | "space" | "global" } export default function DocumentsPage() { const searchParams = useSearchParams() const router = useRouter() const folderFilter = searchParams.get("folder") const [viewMode, setViewMode] = useState<'list'>('list') const [searchTerm, setSearchTerm] = useState("") const [selectedDocuments, setSelectedDocuments] = useState([]) const [sortBy, setSortBy] = useState("modified") const [sortOrder, setSortOrder] = useState<"asc" | "desc">("desc") const [filterType, setFilterType] = useState("all") const [filterAuthor, setFilterAuthor] = useState("all") const [filterStorage, setFilterStorage] = useState("all") const [filterFolder, setFilterFolder] = useState(folderFilter || "all") const [showFilters, setShowFilters] = useState(false) const [actionModal, setActionModal] = useState({ type: null, document: null, documents: [] }) // Modal states const [inviteMessage, setInviteMessage] = useState("") const [selectedUser, setSelectedUser] = useState("") const [selectedRole, setSelectedRole] = useState("") const [inviteScope, setInviteScope] = useState<"user" | "role">("user") const [newFolderName, setNewFolderName] = useState("") const [newDocumentName, setNewDocumentName] = useState("") const [editDescription, setEditDescription] = useState("") const [editAttachment, setEditAttachment] = useState(null) const [editMessage, setEditMessage] = useState("") const [requestDocumentName, setRequestDocumentName] = useState("") const [requestMessage, setRequestMessage] = useState("") const [archiveReason, setArchiveReason] = useState("") const [retentionPeriod, setRetentionPeriod] = useState("5") const [notification, setNotification] = useState<{ type: "success" | "error" | "info"; message: string } | null>(null) // Storage configuration states const [storageDuration, setStorageDuration] = useState("30") const [dataUsage, setDataUsage] = useState("") const [thirdPartyAccess, setThirdPartyAccess] = useState("") // Import states const [importFiles, setImportFiles] = useState(null) const [importFolder, setImportFolder] = useState("") const [importDescription, setImportDescription] = useState("") const [documents, setDocuments] = useState([]) const [stats, setStats] = useState({ total: 0, thisWeek: 0, validated: 0, favorites: 0, permanent: 0, temporary: 0, }) const [folders] = useState([ { id: "general", name: "Général" }, ]) const [users] = useState([ { id: "1", name: "Marie Dubois", email: "marie.dubois@company.com", avatar: "MD", folderRoles: { general: { role: "owner", assignedDate: new Date("2024-01-01") }, }, spaceRole: "manager", spaceRoles: { main: { role: "manager", spaceName: "Espace Principal" }, legal: { role: "admin", spaceName: "Espace Juridique" }, }, }, { id: "2", name: "Sophie Laurent", email: "sophie.laurent@company.com", avatar: "SL", folderRoles: { general: { role: "editor", assignedDate: new Date("2024-01-02") }, }, spaceRole: "user", spaceRoles: { main: { role: "user", spaceName: "Espace Principal" }, analytics: { role: "manager", spaceName: "Espace Analytics" }, }, }, { id: "3", name: "Jean Martin", email: "jean.martin@company.com", avatar: "JM", folderRoles: { general: { role: "viewer", assignedDate: new Date("2024-01-03") }, }, spaceRole: "user", spaceRoles: { main: { role: "user", spaceName: "Espace Principal" }, projects: { role: "admin", spaceName: "Espace Projets" }, }, }, { id: "4", name: "Pierre Durand", email: "pierre.durand@company.com", avatar: "PD", folderRoles: { general: { role: "contributor", assignedDate: new Date("2024-01-04") }, }, spaceRole: "user", spaceRoles: { main: { role: "user", spaceName: "Espace Principal" }, training: { role: "admin", spaceName: "Espace Formation" }, }, }, { id: "5", name: "Admin Système", email: "admin@company.com", avatar: "AD", folderRoles: { policies: { role: "owner", assignedDate: new Date("2024-01-01") }, archives: { role: "owner", assignedDate: new Date("2024-01-01") }, contracts: { role: "validator", assignedDate: new Date("2024-01-01") }, finance: { role: "validator", assignedDate: new Date("2024-01-01") }, }, spaceRole: "admin", spaceRoles: { main: { role: "admin", spaceName: "Espace Principal" }, legal: { role: "admin", spaceName: "Espace Juridique" }, analytics: { role: "admin", spaceName: "Espace Analytics" }, projects: { role: "admin", spaceName: "Espace Projets" }, training: { role: "admin", spaceName: "Espace Formation" }, }, }, ]) const [roles] = useState([ { id: "folder-owner", name: "Propriétaire du dossier", description: "Contrôle total sur le dossier", level: "folder", }, { id: "folder-editor", name: "Éditeur du dossier", description: "Peut modifier les documents", level: "folder" }, { id: "folder-validator", name: "Validateur du dossier", description: "Peut valider les documents", level: "folder", }, { id: "folder-contributor", name: "Contributeur du dossier", description: "Peut ajouter des documents", level: "folder", }, { id: "folder-viewer", name: "Lecteur du dossier", description: "Lecture seule", level: "folder" }, { id: "space-admin", name: "Administrateur d'espace", description: "Contrôle total sur l'espace", level: "space" }, { id: "space-manager", name: "Gestionnaire d'espace", description: "Gestion des utilisateurs et dossiers", level: "space", }, { id: "space-user", name: "Utilisateur d'espace", description: "Accès standard à l'espace", level: "space" }, { id: "space-guest", name: "Invité d'espace", description: "Accès limité à l'espace", level: "space" }, { id: "global-admin", name: "Administrateur global", description: "Accès à tous les espaces", level: "global" }, { id: "global-manager", name: "Gestionnaire global", description: "Gestion multi-espaces", level: "global" }, ]) // Mettre à jour le filtre de dossier quand l'URL change useEffect(() => { if (folderFilter) { setFilterFolder(folderFilter) setShowFilters(true) } }, [folderFilter]) useEffect(() => { // Simuler le chargement des documents const loadDocuments = () => { const mockDocuments: Document[] = [ { id: 1, name: "Contrat_Client_ABC.pdf", type: "PDF", size: "2.4 MB", modified: new Date("2024-01-15T10:30:00"), created: new Date("2024-01-15T09:00:00"), author: "Marie Dubois", folder: "Contrats", folderId: "contracts", tags: ["contrat", "client", "juridique"], status: "validated", thumbnail: "/placeholder.svg?height=120&width=120&text=PDF", description: "Contrat de prestation de services avec le client ABC Corp.", version: "v1.2", isValidated: true, hasCertificate: true, storageType: "permanent", summary: "Contrat de prestation de services d'une durée de 12 mois avec ABC Corp. Montant total : 150 000€ HT. Clauses de confidentialité et de propriété intellectuelle incluses.", permissions: { canView: true, canEdit: true, canDelete: true, canInvite: true, canValidate: true, canArchive: false, canAnalyze: true, }, }, { id: 2, name: "Rapport_Mensuel_Nov.docx", type: "DOCX", size: "1.8 MB", modified: new Date("2024-01-15T08:45:00"), created: new Date("2024-01-10T14:20:00"), author: "Sophie Laurent", folder: "Rapports", folderId: "reports", tags: ["rapport", "mensuel", "analyse"], status: "pending", thumbnail: "/placeholder.svg?height=120&width=120&text=DOCX", description: "Rapport mensuel d'activité pour novembre 2024.", version: "v2.1", isValidated: false, hasCertificate: false, storageType: "temporary", summary: "Rapport d'activité mensuel présentant les KPIs, les réalisations et les objectifs pour le mois de novembre. Croissance de 15% par rapport au mois précédent.", permissions: { canView: true, canEdit: false, canDelete: false, canInvite: true, canValidate: false, canArchive: true, canAnalyze: true, }, temporaryStorageConfig: { duration: 90, dataUsage: "Rapport mensuel d'activité pour suivi des performances", thirdPartyAccess: "Équipe direction, consultants externes autorisés", }, }, { id: 3, name: "Présentation_Projet.pptx", type: "PPTX", size: "5.2 MB", modified: new Date("2024-01-15T07:15:00"), created: new Date("2024-01-12T11:30:00"), author: "Jean Martin", folder: "Projets", folderId: "projects", tags: ["présentation", "projet", "alpha"], status: "draft", thumbnail: "/placeholder.svg?height=120&width=120&text=PPTX", description: "Présentation du projet Alpha pour le comité de direction.", version: "v1.0", isValidated: false, hasCertificate: false, storageType: "temporary", summary: "Présentation détaillée du projet Alpha incluant le planning, le budget prévisionnel de 500K€ et les ressources nécessaires. Lancement prévu en Q2 2024.", permissions: { canView: true, canEdit: true, canDelete: true, canInvite: true, canValidate: true, canArchive: true, canAnalyze: true, }, temporaryStorageConfig: { duration: 180, dataUsage: "Présentation projet pour validation comité de direction", thirdPartyAccess: "Comité de direction, équipe projet, partenaires techniques", }, }, { id: 4, name: "Budget_2024.xlsx", type: "XLSX", size: "892 KB", modified: new Date("2024-01-14T16:20:00"), created: new Date("2024-01-08T09:45:00"), author: "Marie Dubois", folder: "Finance", folderId: "finance", tags: ["budget", "2024", "finance"], status: "validated", thumbnail: "/placeholder.svg?height=120&width=120&text=XLSX", description: "Budget prévisionnel pour l'année 2024.", version: "v3.0", isValidated: true, hasCertificate: true, storageType: "permanent", summary: "Budget prévisionnel 2024 avec une allocation totale de 2.5M€. Répartition par département et projets stratégiques. Croissance prévue de 20%.", permissions: { canView: true, canEdit: true, canDelete: true, canInvite: true, canValidate: true, canArchive: false, canAnalyze: true, }, }, { id: 5, name: "Politique_Sécurité.pdf", type: "PDF", size: "1.1 MB", modified: new Date("2024-01-14T14:10:00"), created: new Date("2024-01-05T10:00:00"), author: "Admin Système", folder: "Politiques", folderId: "policies", tags: ["sécurité", "politique", "règlement"], status: "validated", thumbnail: "/placeholder.svg?height=120&width=120&text=PDF", description: "Politique de sécurité informatique de l'entreprise.", version: "v1.0", isValidated: true, hasCertificate: true, storageType: "permanent", summary: "Document officiel définissant les règles de sécurité informatique. Couvre la gestion des mots de passe, l'accès aux données et les procédures d'incident.", permissions: { canView: true, canEdit: false, canDelete: false, canInvite: false, canValidate: false, canArchive: false, canAnalyze: true, }, }, { id: 6, name: "Formation_Équipe.mp4", type: "MP4", size: "45.2 MB", modified: new Date("2024-01-13T11:30:00"), created: new Date("2024-01-13T11:30:00"), author: "Pierre Durand", folder: "Formation", folderId: "training", tags: ["formation", "vidéo", "équipe"], status: "draft", thumbnail: "/placeholder.svg?height=120&width=120&text=MP4", description: "Vidéo de formation pour la nouvelle équipe.", version: "v1.0", isValidated: false, hasCertificate: false, storageType: "temporary", summary: "Vidéo de formation de 45 minutes couvrant les processus internes, les outils utilisés et les bonnes pratiques. Destinée aux nouveaux collaborateurs.", permissions: { canView: true, canEdit: true, canDelete: true, canInvite: true, canValidate: true, canArchive: true, canAnalyze: true, }, temporaryStorageConfig: { duration: 365, dataUsage: "Vidéo de formation pour onboarding nouveaux collaborateurs", thirdPartyAccess: "RH, managers, nouveaux employés, prestataires formation", }, }, { id: 7, name: "Logo_Entreprise.png", type: "PNG", size: "256 KB", modified: new Date("2024-01-12T15:45:00"), created: new Date("2024-01-12T15:45:00"), author: "Design Team", folder: "Assets", folderId: "assets", tags: ["logo", "design", "branding"], status: "validated", thumbnail: "/placeholder.svg?height=120&width=120&text=PNG", description: "Logo officiel de l'entreprise en haute résolution.", version: "v2.0", isValidated: true, hasCertificate: false, storageType: "temporary", summary: "Logo officiel de l'entreprise en format PNG haute résolution (300 DPI). Versions couleur et monochrome disponibles pour tous supports de communication.", permissions: { canView: true, canEdit: true, canDelete: true, canInvite: true, canValidate: true, canArchive: true, canAnalyze: true, }, temporaryStorageConfig: { duration: 730, dataUsage: "Logo officiel pour supports de communication et marketing", thirdPartyAccess: "Équipe marketing, agences externes, partenaires commerciaux", }, }, { id: 8, name: "Archive_2023.zip", type: "ZIP", size: "128 MB", modified: new Date("2024-01-10T09:00:00"), created: new Date("2024-01-10T09:00:00"), author: "Admin Système", folder: "Archives", folderId: "archives", tags: ["archive", "2023", "backup"], status: "archived", thumbnail: "/placeholder.svg?height=120&width=120&text=ZIP", description: "Archive complète des documents de l'année 2023.", version: "v1.0", isValidated: true, hasCertificate: false, storageType: "permanent", summary: "Archive complète contenant tous les documents de l'année 2023. Inclut les contrats, rapports, présentations et documents administratifs.", permissions: { canView: true, canEdit: false, canDelete: false, canInvite: false, canValidate: false, canArchive: true, canAnalyze: true, }, }, { id: 9, name: "Note_Projet_Nouveau.docx", type: "DOCX", size: "0.8 MB", modified: new Date(), created: new Date(), author: "Utilisateur actuel", folder: "Nouveaux Dossiers", folderId: "new-folders", tags: ["nouveau", "projet"], status: "draft", thumbnail: "/placeholder.svg?height=120&width=120&text=DOCX", description: "Documentation initiale d'un nouveau projet.", version: "v0.1", isValidated: false, hasCertificate: false, storageType: "temporary", summary: "Note de cadrage et premiers éléments du projet.", permissions: { canView: true, canEdit: true, canDelete: true, canInvite: true, canValidate: false, canArchive: true, canAnalyze: true, }, }, { id: 10, name: "Budget_Preliminaire.xlsx", type: "XLSX", size: "0.3 MB", modified: new Date(), created: new Date(), author: "Utilisateur actuel", folder: "Lancements", folderId: "launch", tags: ["nouveau", "budget"], status: "pending", thumbnail: "/placeholder.svg?height=120&width=120&text=XLSX", description: "Budget préliminaire pour un nouveau dossier.", version: "v0.1", isValidated: false, hasCertificate: false, storageType: "temporary", summary: "Prévisions de coûts et enveloppe initiale.", permissions: { canView: true, canEdit: true, canDelete: true, canInvite: true, canValidate: false, canArchive: true, canAnalyze: true, }, }, ] setDocuments(mockDocuments) setStats({ total: mockDocuments.length, thisWeek: mockDocuments.filter((doc) => { const weekAgo = new Date() weekAgo.setDate(weekAgo.getDate() - 7) return doc.modified > weekAgo }).length, validated: mockDocuments.filter((doc) => doc.isValidated).length, favorites: mockDocuments.filter((doc) => doc.favorite).length, permanent: mockDocuments.filter((doc) => doc.storageType === "permanent").length, temporary: mockDocuments.filter((doc) => doc.storageType === "temporary").length, }) } loadDocuments() }, []) // Notification system const showNotification = (type: "success" | "error" | "info", message: string) => { setNotification({ type, message }) setTimeout(() => setNotification(null), 3000) } // Fonction pour envoyer une notification dans le chat du dossier const sendFolderChatNotification = (folderId: string, message: string, actionType: string, documentName?: string) => { const folderUsers = users.filter((user) => user.folderRoles[folderId]) console.log("Notification envoyée dans le chat du dossier:", { folderId, folderName: folders.find((f) => f.id === folderId)?.name, recipients: folderUsers.map((u) => ({ name: u.name, role: u.folderRoles[folderId]?.role })), message, actionType, documentName, timestamp: new Date().toISOString(), }) folderUsers.forEach((user) => { console.log(`📱 Notification push envoyée à ${user.name} (${user.email})`) }) } // Document actions const handleViewDocument = (doc: Document) => { setActionModal({ type: "view", document: doc, documents: [] }) } const handleEditDocument = (doc: Document) => { setEditDescription(doc.description || "") setEditMessage("") setEditAttachment(null) setActionModal({ type: "edit", document: doc, documents: [] }) } const handleInviteDocument = (doc: Document) => { setInviteMessage("") setSelectedUser("") setSelectedRole("") setInviteScope("user") setActionModal({ type: "invite", document: doc, documents: [] }) } const handleDeleteDocument = (doc: Document) => { setActionModal({ type: "delete", document: doc, documents: [] }) } const handleMoveDocument = (doc: Document) => { setNewFolderName(doc.folder) setActionModal({ type: "move", document: doc, documents: [] }) } const handleRenameDocument = (doc: Document) => { setNewDocumentName(doc.name) setActionModal({ type: "rename", document: doc, documents: [] }) } const handleDownloadDocument = (doc: Document) => { const storageText = doc.storageType === "permanent" ? "stockage permanent" : "stockage temporaire" showNotification("info", `Récupération de ${doc.name} du ${storageText}...`) sendFolderChatNotification(doc.folderId, `📥 ${doc.name} a été récupéré du ${storageText}`, "download", doc.name) setTimeout(() => { showNotification("success", `${doc.name} récupéré avec succès`) }, 1500) } const handleDownloadCertificate = (doc: Document) => { if (doc.hasCertificate) { showNotification("info", `Téléchargement du certificat blockchain pour ${doc.name}...`) sendFolderChatNotification( doc.folderId, `🔗 Certificat blockchain téléchargé pour ${doc.name}`, "blockchain_certificate_download", doc.name, ) setTimeout(() => { showNotification("success", `Certificat blockchain de ${doc.name} téléchargé avec succès`) }, 2000) } } const handleArchiveDocument = (doc: Document) => { setArchiveReason("") setRetentionPeriod("5") setActionModal({ type: "archive", document: doc, documents: [] }) } const handleRequestDocument = (selectedDocs: Document[]) => { setRequestDocumentName("") setRequestMessage("") setActionModal({ type: "request", document: null, documents: selectedDocs }) } const handleImportDocuments = () => { setImportFiles(null) setImportFolder(filterFolder !== "all" ? filterFolder : "") setImportDescription("") setActionModal({ type: "import", document: null, documents: [] }) } const handleValidateDocuments = (docIds: number[]) => { if (!docIds || docIds.length === 0) return; // Ouvre le modal de validation pour le premier document sélectionné (ou gérer en bulk si besoin) const doc = documents.find((d) => d.id === docIds[0]); if (doc) { setActionModal({ type: "validate", document: doc, documents: docIds.map(id => documents.find(d => d.id === id)).filter(Boolean) }); } }; const handleViewCertificate = (doc: Document) => { if (doc.hasCertificate) { setActionModal({ type: "certificate", document: doc, documents: [] }) } } const handleConfigureStorage = (doc: Document) => { if (doc.temporaryStorageConfig) { setStorageDuration(doc.temporaryStorageConfig.duration.toString()) setDataUsage(doc.temporaryStorageConfig.dataUsage) setThirdPartyAccess(doc.temporaryStorageConfig.thirdPartyAccess) } else { setStorageDuration("30") setDataUsage("") setThirdPartyAccess("") } setActionModal({ type: "storage_config", document: doc, documents: [] }) } const handleToggleFavorite = (docId: number) => { const doc = documents.find((d) => d.id === docId) if (!doc) return setDocuments((prev) => prev.map((d) => (d.id === docId ? { ...d, favorite: !d.favorite } : d))) const action = doc.favorite ? "retiré des" : "ajouté aux" showNotification("success", `${doc.name} ${action} favoris`) sendFolderChatNotification(doc.folderId, `⭐ ${doc.name} a été ${action} favoris`, "favorite", doc.name) } const handleAIAnalysis = (doc: Document) => { showNotification("info", `Analyse IA en cours pour ${doc.name}...`) setTimeout( () => { const analysisResults = [ // Analyse pour PDF/Contrats `📄 **Analyse IA du document "${doc.name}"**\n\n` + `**Type de document :** ${doc.type} (${doc.size})\n` + `**Statut :** ${doc.isValidated ? "✅ Validé" : "⏳ En attente"}\n` + `**Dernière modification :** ${formatDate(doc.modified)}\n\n` + `**Analyse du contenu :**\n` + `• ${doc.type === "PDF" ? "Document juridique détecté" : "Document standard"}\n` + `• ${doc.tags.length} tag(s) identifié(s) : ${doc.tags.join(", ")}\n` + `• ${doc.summary ? "Résumé automatique disponible" : "Contenu analysé"}\n\n` + `**Métriques de qualité :**\n` + `• Lisibilité : ${Math.floor(Math.random() * 20) + 80}%\n` + `• Conformité : ${doc.isValidated ? "100%" : Math.floor(Math.random() * 30) + 60 + "%"}\n` + `• Sécurité : ${doc.storageType === "permanent" ? "Maximale" : "Standard"}\n\n` + `**Recommandations :**\n` + `• ${doc.storageType === "temporary" ? "Archivage permanent recommandé" : "Archivage optimal"}\n` + `• ${!doc.isValidated ? "Validation requise avant finalisation" : "Document prêt pour utilisation"}\n` + `• ${doc.tags.length < 3 ? "Améliorer le tagging pour une meilleure recherche" : "Tagging satisfaisant"}\n\n` + `**Score global :** ${Math.floor(Math.random() * 20) + 80}/100`, // Analyse spécialisée par type `🔍 **Analyse spécialisée - ${doc.name}**\n\n` + `**Classification automatique :**\n` + `• Format : ${doc.type} (${doc.size})\n` + `• Catégorie : ${doc.folder}\n` + `• Complexité : ${["Faible", "Modérée", "Élevée"][Math.floor(Math.random() * 3)]}\n\n` + `**Analyse technique :**\n` + `${ doc.type === "PDF" ? "• Pages analysées : " + Math.floor(Math.random() * 50 + 10) + "\n• Clauses détectées : " + Math.floor(Math.random() * 15 + 5) : doc.type === "XLSX" ? "• Feuilles analysées : " + Math.floor(Math.random() * 10 + 1) + "\n• Formules détectées : " + Math.floor(Math.random() * 100 + 20) : doc.type === "DOCX" ? "• Mots analysés : " + Math.floor(Math.random() * 5000 + 1000) + "\n• Sections détectées : " + Math.floor(Math.random() * 10 + 3) : "• Contenu multimédia analysé\n• Métadonnées extraites" }\n\n` + `**Insights IA :**\n` + `• ${Math.random() > 0.5 ? "Document fréquemment consulté" : "Usage modéré détecté"}\n` + `• ${Math.random() > 0.5 ? "Collaboration active identifiée" : "Document principalement individuel"}\n` + `• ${doc.version !== "v1.0" ? "Historique de versions riche" : "Document récent"}\n\n` + `**Actions suggérées :**\n` + `• ${Math.random() > 0.5 ? "Créer un modèle basé sur ce document" : "Standardiser le format"}\n` + `• ${Math.random() > 0.5 ? "Planifier une révision" : "Maintenir la version actuelle"}\n` + `• Prochaine analyse : ${new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toLocaleDateString("fr-FR")}`, // Analyse de conformité et sécurité `🛡️ **Audit de conformité - ${doc.name}**\n\n` + `**Analyse de sécurité :**\n` + `• Chiffrement : ${doc.storageType === "permanent" ? "AES-256" : "Standard"}\n` + `• Accès : ${doc.permissions.canView ? "Contrôlé" : "Restreint"}\n` + `• Traçabilité : ${doc.hasCertificate ? "Complète" : "Partielle"}\n\n` + `**Conformité RGPD :**\n` + `• Données personnelles : ${Math.random() > 0.7 ? "⚠️ Détectées" : "✅ Aucune"}\n` + `• Durée de conservation : ${doc.storageType === "permanent" ? "Conforme" : "À vérifier"}\n` + `• Droit à l'oubli : ${Math.random() > 0.5 ? "Applicable" : "Non applicable"}\n\n` + `**Analyse des risques :**\n` + `• Niveau de risque : ${["Faible", "Modéré", "Élevé"][Math.floor(Math.random() * 3)]}\n` + `• Exposition : ${doc.permissions.canInvite ? "Partageable" : "Interne uniquement"}\n` + `• Criticité : ${doc.isValidated ? "Validée" : "À évaluer"}\n\n` + `**Recommandations de sécurité :**\n` + `• ${doc.storageType === "temporary" ? "Migration vers stockage sécurisé recommandée" : "Sécurité optimale"}\n` + `• ${!doc.hasCertificate ? "Certification numérique suggérée" : "Certification à jour"}\n` + `• Audit de sécurité : ${Math.random() > 0.5 ? "Recommandé dans 6 mois" : "Conforme pour 12 mois"}\n\n` + `**Score de conformité :** ${Math.floor(Math.random() * 15) + 85}/100`, ] const randomAnalysis = analysisResults[Math.floor(Math.random() * analysisResults.length)] // Envoyer l'analyse dans le chat du dossier sendFolderChatNotification(doc.folderId, `🤖 ${randomAnalysis}`, "document_ai_analysis", doc.name) showNotification("success", `Analyse IA terminée pour ${doc.name}. Redirection vers le chat...`) // Rediriger vers le chat après 1.5 secondes setTimeout(() => { router.push("/dashboard/chat") }, 1500) }, 2000 + Math.random() * 2000, ) } const handleManageDocumentRoles = (doc: Document) => { // Rediriger vers la gestion des rôles du document router.push(`/dashboard/documents/${doc.id}/roles`) } // Bulk actions const handleBulkDownload = () => { const selectedDocs = documents.filter((doc) => selectedDocuments.includes(doc.id)) showNotification("info", `Récupération de ${selectedDocs.length} document(s)...`) const folderGroups = selectedDocs.reduce( (acc, doc) => { if (!acc[doc.folderId]) acc[doc.folderId] = [] acc[doc.folderId].push(doc.name) return acc }, {} as { [folderId: string]: string[] }, ) Object.entries(folderGroups).forEach(([folderId, docNames]) => { sendFolderChatNotification( folderId, `📥 ${docNames.length} document(s) récupéré(s) : ${docNames.join(", ")}`, "bulk_download", ) }) setTimeout(() => { showNotification("success", `${selectedDocs.length} document(s) récupéré(s) avec succès`) setSelectedDocuments([]) }, 2000) } const handleBulkInvite = () => { const selectedDocs = documents.filter((doc) => selectedDocuments.includes(doc.id) && doc.permissions.canInvite) if (selectedDocs.length === 0) { showNotification("error", "Aucun document sélectionné ne peut être partagé") return } setInviteMessage("") setSelectedUser("") setSelectedRole("") setInviteScope("user") setActionModal({ type: "invite", document: null, documents: selectedDocs }) } const handleBulkArchive = () => { const selectedDocs = documents.filter((doc) => selectedDocuments.includes(doc.id) && doc.permissions.canArchive) if (selectedDocs.length === 0) { showNotification("error", "Aucun document sélectionné ne peut être archivé") return } setArchiveReason("") setRetentionPeriod("5") setActionModal({ type: "archive", document: null, documents: selectedDocs }) } const handleBulkMove = () => { const selectedDocs = documents.filter((doc) => selectedDocuments.includes(doc.id)) setNewFolderName("") setActionModal({ type: "move", document: null, documents: selectedDocs }) } const handleBulkDelete = () => { const selectedDocs = documents.filter((doc) => selectedDocuments.includes(doc.id)) setActionModal({ type: "delete", document: null, documents: selectedDocs }) } const handleBulkAIAnalysis = () => { const selectedDocs = documents.filter((doc) => selectedDocuments.includes(doc.id) && doc.permissions.canAnalyze) if (selectedDocs.length === 0) { showNotification("error", "Aucun document sélectionné ne peut être analysé") return } showNotification("info", `Analyse IA en cours pour ${selectedDocs.length} document(s)...`) // Analyser chaque document avec un délai échelonné selectedDocs.forEach((doc, index) => { setTimeout(() => { const bulkAnalysis = `📊 **Analyse IA groupée - Document "${doc.name}"**\n\n` + `**Position dans l'analyse :** ${index + 1}/${selectedDocs.length}\n` + `**Type :** ${doc.type} (${doc.size})\n` + `**Dossier :** ${doc.folder}\n\n` + `**Analyse rapide :**\n` + `• Statut : ${doc.isValidated ? "✅ Validé" : "⏳ En attente"}\n` + `• Stockage : ${doc.storageType === "permanent" ? "☁️ Permanent" : "💾 Temporaire"}\n` + `• Tags : ${doc.tags.join(", ")}\n\n` + `**Score de qualité :** ${Math.floor(Math.random() * 20) + 75}/100\n` + `**Recommandation :** ${doc.storageType === "temporary" ? "Archivage suggéré" : "Optimisé"}` sendFolderChatNotification(doc.folderId, `🤖 ${bulkAnalysis}`, "bulk_document_ai_analysis", doc.name) }, index * 1000) }) setTimeout( () => { const totalSize = selectedDocs.reduce((sum, doc) => sum + Number.parseFloat(doc.size.replace(/[^\d.]/g, "")), 0) showNotification( "success", `Analyse IA terminée pour ${selectedDocs.length} document(s) (${totalSize.toFixed(1)} MB). Redirection vers le chat...`, ) setSelectedDocuments([]) // Rediriger vers le chat après l'analyse groupée setTimeout(() => { router.push("/dashboard/chat") }, 1500) }, selectedDocs.length * 1000 + 1000, ) } // Modal actions const confirmInvite = () => { const recipient = inviteScope === "user" ? users.find((u) => u.id === selectedUser)?.name : roles.find((r) => r.id === selectedRole)?.name if (actionModal.document) { showNotification("success", `${actionModal.document.name} partagé avec ${recipient}. Un message a été envoyé.`) sendFolderChatNotification( actionModal.document.folderId, `👥 ${actionModal.document.name} a été partagé avec ${recipient}. Message: ${inviteMessage}`, "invite", actionModal.document.name, ) } else if (actionModal.documents.length > 0) { const folderGroups = actionModal.documents.reduce( (acc, doc) => { if (!acc[doc.folderId]) acc[doc.folderId] = [] acc[doc.folderId].push(doc.name) return acc }, {} as { [folderId: string]: string[] }, ) Object.entries(folderGroups).forEach(([folderId, docNames]) => { sendFolderChatNotification( folderId, `👥 ${docNames.length} document(s) partagé(s) avec ${recipient} : ${docNames.join(", ")}. Message: ${inviteMessage}`, "bulk_invite", ) }) showNotification( "success", `${actionModal.documents.length} document(s) partagé(s) avec ${recipient}. Messages envoyés.`, ) setSelectedDocuments([]) } setActionModal({ type: null, document: null, documents: [] }) } const confirmDelete = () => { if (actionModal.document) { sendFolderChatNotification( actionModal.document.folderId, `🗑️ ${actionModal.document.name} a été supprimé`, "delete", actionModal.document.name, ) setDocuments((prev) => prev.filter((doc) => doc.id !== actionModal.document!.id)) showNotification("success", `${actionModal.document.name} supprimé`) } else if (actionModal.documents.length > 0) { const folderGroups = actionModal.documents.reduce( (acc, doc) => { if (!acc[doc.folderId]) acc[doc.folderId] = [] acc[doc.folderId].push(doc.name) return acc }, {} as { [folderId: string]: string[] }, ) Object.entries(folderGroups).forEach(([folderId, docNames]) => { sendFolderChatNotification( folderId, `🗑️ ${docNames.length} document(s) supprimé(s) : ${docNames.join(", ")}`, "bulk_delete", ) }) const docIds = actionModal.documents.map((doc) => doc.id) setDocuments((prev) => prev.filter((doc) => !docIds.includes(doc.id))) showNotification("success", `${actionModal.documents.length} document(s) supprimé(s)`) setSelectedDocuments([]) } setActionModal({ type: null, document: null, documents: [] }) } const confirmMove = () => { if (actionModal.document) { const oldFolderId = actionModal.document.folderId const newFolder = folders.find((f) => f.name === newFolderName) const newFolderId = newFolder?.id || oldFolderId const updatedDoc = { ...actionModal.document, folder: newFolderName, folderId: newFolderId } setDocuments((prev) => prev.map((doc) => (doc.id === updatedDoc.id ? updatedDoc : doc))) showNotification("success", `${actionModal.document.name} déplacé vers ${newFolderName}`) if (oldFolderId !== newFolderId) { sendFolderChatNotification( oldFolderId, `📤 ${actionModal.document.name} a été déplacé vers ${newFolderName}`, "move_out", actionModal.document.name, ) sendFolderChatNotification( newFolderId, `📥 ${actionModal.document.name} a été déplacé depuis ${actionModal.document.folder}`, "move_in", actionModal.document.name, ) } } else if (actionModal.documents.length > 0) { const newFolder = folders.find((f) => f.name === newFolderName) const newFolderId = newFolder?.id || "" const folderGroups = actionModal.documents.reduce( (acc, doc) => { if (!acc[doc.folderId]) acc[doc.folderId] = [] acc[doc.folderId].push(doc.name) return acc }, {} as { [folderId: string]: string[] }, ) Object.entries(folderGroups).forEach(([oldFolderId, docNames]) => { if (oldFolderId !== newFolderId) { sendFolderChatNotification( oldFolderId, `📤 ${docNames.length} document(s) déplacé(s) vers ${newFolderName} : ${docNames.join(", ")}`, "bulk_move_out", ) } }) if (newFolderId) { sendFolderChatNotification( newFolderId, `📥 ${actionModal.documents.length} document(s) déplacé(s) dans ce dossier : ${actionModal.documents.map((d) => d.name).join(", ")}`, "bulk_move_in", ) } const docIds = actionModal.documents.map((doc) => doc.id) setDocuments((prev) => prev.map((doc) => (docIds.includes(doc.id) ? { ...doc, folder: newFolderName, folderId: newFolderId } : doc)), ) showNotification("success", `${actionModal.documents.length} document(s) déplacé(s) vers ${newFolderName}`) setSelectedDocuments([]) } setActionModal({ type: null, document: null, documents: [] }) } const confirmRename = () => { if (actionModal.document) { const updatedDoc = { ...actionModal.document, name: newDocumentName } setDocuments((prev) => prev.map((doc) => (doc.id === updatedDoc.id ? updatedDoc : doc))) showNotification("success", `Document renommé en ${newDocumentName}`) sendFolderChatNotification( actionModal.document.folderId, `✏️ Document renommé : "${actionModal.document.name}" → "${newDocumentName}"`, "rename", newDocumentName, ) } setActionModal({ type: null, document: null, documents: [] }) } const confirmEdit = () => { if (actionModal.document) { const updatedDoc = { ...actionModal.document, description: editDescription, modified: new Date(), } setDocuments((prev) => prev.map((doc) => (doc.id === updatedDoc.id ? updatedDoc : doc))) showNotification("success", `${actionModal.document.name} mis à jour`) let message = `✏️ ${actionModal.document.name} a été modifié` if (editMessage.trim()) { message += ` - ${editMessage}` } if (editAttachment) { message += ` (avec pièce jointe: ${editAttachment.name})` } sendFolderChatNotification(actionModal.document.folderId, message, "edit", actionModal.document.name) showNotification("info", "Message envoyé dans le chat du dossier") } setActionModal({ type: null, document: null, documents: [] }) } const confirmRequest = () => { if (!requestDocumentName.trim()) { showNotification("error", "Veuillez spécifier le nom du document à demander") return } if (!selectedRole) { showNotification("error", "Veuillez sélectionner le rôle de destination") return } const requestData = { documentName: requestDocumentName, message: requestMessage, requestedBy: "Utilisateur actuel", requestDate: new Date(), folder: importFolder || "Général", role: selectedRole, } showNotification("success", `Demande de document "${requestDocumentName}" envoyée au rôle ${selectedRole}`) const targetFolder = folders.find((f) => f.name === (importFolder || "Général")) if (targetFolder) { sendFolderChatNotification( targetFolder.id, `📋 Demande de document : "${requestDocumentName}" Rôle ciblé : ${selectedRole} Message : ${requestMessage || "Aucun message spécifique"}`, "document_request", ) } console.log("Demande de document:", requestData) setActionModal({ type: null, document: null, documents: [] }) } const confirmImport = () => { if (!importFiles || importFiles.length === 0) { showNotification("error", "Veuillez sélectionner au moins un fichier à importer") return } if (!importFolder.trim()) { showNotification("error", "Veuillez sélectionner un dossier de destination") return } const fileList = Array.from(importFiles) const totalSize = fileList.reduce((sum, file) => sum + file.size, 0) const totalSizeMB = (totalSize / (1024 * 1024)).toFixed(2) showNotification("info", `Import en cours de ${fileList.length} fichier(s) (${totalSizeMB} MB)...`) // Simuler l'import avec un délai setTimeout(() => { const newDocuments: Document[] = fileList.map((file, index) => ({ id: Math.max(...documents.map((d) => d.id)) + index + 1, name: file.name, type: file.name.split(".").pop()?.toUpperCase() || "FILE", size: `${(file.size / (1024 * 1024)).toFixed(2)} MB`, modified: new Date(), created: new Date(), author: "Utilisateur actuel", folder: importFolder, folderId: folders.find((f) => f.name === importFolder)?.id || "general", tags: [], status: "draft", thumbnail: `/placeholder.svg?height=120&width=120&text=${file.name.split(".").pop()?.toUpperCase()}`, description: importDescription || `Document importé : ${file.name}`, version: "v1.0", isValidated: false, hasCertificate: false, storageType: "temporary" as const, permissions: { canView: true, canEdit: true, canDelete: true, canInvite: true, canValidate: true, canArchive: true, canAnalyze: true, }, })) setDocuments((prev) => [...prev, ...newDocuments]) // Notification de succès showNotification("success", `${fileList.length} document(s) importé(s) avec succès dans ${importFolder}`) // Notification dans le chat du dossier const targetFolder = folders.find((f) => f.name === importFolder) if (targetFolder) { const fileNames = fileList.map((f) => f.name).join(", ") sendFolderChatNotification( targetFolder.id, `📁 ${fileList.length} nouveau(x) document(s) importé(s) :\n${fileNames}\n\nDescription : ${importDescription || "Aucune description"}`, "documents_import", ) } // Mettre à jour les stats setStats((prev) => ({ ...prev, total: prev.total + fileList.length, temporary: prev.temporary + fileList.length, })) }, 2000) setActionModal({ type: null, document: null, documents: [] }) } const confirmValidate = () => { if (!actionModal.documents || actionModal.documents.length === 0) return; setDocuments((prev) => prev.map((doc) => actionModal.documents.some((d) => d.id === doc.id) ? { ...doc, isValidated: true, status: "validated", storageType: "permanent" } : doc )); showNotification("success", `${actionModal.documents.length} document(s) validé(s) et déplacé(s) en permanent`); setActionModal({ type: null, document: null, documents: [] }); }; const confirmArchive = () => { if (actionModal.document) { const updatedDoc = { ...actionModal.document, storageType: "permanent" as const, status: "archived", modified: new Date(), } setDocuments((prev) => prev.map((doc) => (doc.id === updatedDoc.id ? updatedDoc : doc))) showNotification("success", `${actionModal.document.name} archivé vers le stockage permanent`) let message = `📦 ${actionModal.document.name} a été archivé vers le stockage permanent (conservation: ${retentionPeriod} ans)` if (archiveReason.trim()) { message += ` - Raison: ${archiveReason}` } sendFolderChatNotification(actionModal.document.folderId, message, "archive", actionModal.document.name) } else if (actionModal.documents.length > 0) { const folderGroups = actionModal.documents.reduce( (acc, doc) => { if (!acc[doc.folderId]) acc[doc.folderId] = [] acc[doc.folderId].push(doc.name) return acc }, {} as { [folderId: string]: string[] }, ) Object.entries(folderGroups).forEach(([folderId, docNames]) => { let message = `📦 ${docNames.length} document(s) archivé(s) vers le stockage permanent (conservation: ${retentionPeriod} ans) : ${docNames.join(", ")}` if (archiveReason.trim()) { message += ` - Raison: ${archiveReason}` } sendFolderChatNotification(folderId, message, "bulk_archive") }) const docIds = actionModal.documents.map((doc) => doc.id) setDocuments((prev) => prev.map((doc) => docIds.includes(doc.id) ? { ...doc, storageType: "permanent" as const, status: "archived", modified: new Date() } : doc, ), ) showNotification("success", `${actionModal.documents.length} document(s) archivé(s) vers le stockage permanent`) setSelectedDocuments([]) } setActionModal({ type: null, document: null, documents: [] }) } const confirmStorageConfig = () => { if (actionModal.document) { const updatedDoc = { ...actionModal.document, temporaryStorageConfig: { duration: Number.parseInt(storageDuration), dataUsage: dataUsage, thirdPartyAccess: thirdPartyAccess, }, modified: new Date(), } setDocuments((prev) => prev.map((doc) => (doc.id === updatedDoc.id ? updatedDoc : doc))) showNotification("success", `Configuration de stockage mise à jour pour ${actionModal.document.name}`) const message = `⚙️ Configuration de stockage temporaire mise à jour pour ${actionModal.document.name}:\n` + `• Durée: ${storageDuration} jours\n` + `• Usage: ${dataUsage}\n` + `• Accès tiers: ${thirdPartyAccess}` sendFolderChatNotification(actionModal.document.folderId, message, "storage_config", actionModal.document.name) } setActionModal({ type: null, document: null, documents: [] }) } const filteredDocuments = documents .filter((doc) => { if (searchTerm && !doc.name.toLowerCase().includes(searchTerm.toLowerCase())) { return false } if (filterType !== "all" && doc.type.toLowerCase() !== filterType.toLowerCase()) { return false } if (filterAuthor !== "all" && doc.author !== filterAuthor) { return false } if (filterStorage !== "all" && doc.storageType !== filterStorage) { return false } if (filterFolder !== "all" && doc.folder !== filterFolder) { return false } return true }) .sort((a, b) => { let aValue, bValue switch (sortBy) { case "name": aValue = a.name.toLowerCase() bValue = b.name.toLowerCase() break case "size": aValue = Number.parseFloat(a.size.replace(/[^\d.]/g, "")) bValue = Number.parseFloat(b.size.replace(/[^\d.]/g, "")) break case "author": aValue = a.author.toLowerCase() bValue = b.author.toLowerCase() break case "modified": default: aValue = a.modified.getTime() bValue = b.modified.getTime() break } if (sortOrder === "asc") { return aValue > bValue ? 1 : -1 } else { return aValue < bValue ? 1 : -1 } }) const getFileIcon = (type: string) => { switch (type.toLowerCase()) { case "pdf": return case "docx": case "doc": return case "xlsx": case "xls": return case "pptx": case "ppt": return case "png": case "jpg": case "jpeg": return case "mp4": case "avi": return case "zip": case "rar": return default: return } } const isNewDocument = (doc: DocumentData) => { const now = Date.now() const diffMs = now - doc.modified.getTime() const twoDaysMs = 2 * 24 * 60 * 60 * 1000 return diffMs <= twoDaysMs } const getStorageIcon = (storageType: string) => { return storageType === "permanent" ? ( ) : ( ) } const getRoleIcon = (role: string) => { switch (role) { case "owner": return case "editor": return case "validator": return case "contributor": return case "viewer": return case "admin": return case "manager": return case "user": return case "guest": return default: return } } const getStatusBadge = (status: string, isValidated: boolean) => { if (isValidated) { return Validé } switch (status) { case "pending": return En attente case "draft": return Brouillon case "rejected": return Rejeté case "archived": return Archivé default: return null } } const formatDate = (date: Date) => { const now = new Date() const diffInHours = (now.getTime() - date.getTime()) / (1000 * 60 * 60) if (diffInHours < 1) { return "Il y a quelques minutes" } else if (diffInHours < 24) { return `Il y a ${Math.floor(diffInHours)} heure${Math.floor(diffInHours) > 1 ? "s" : ""}` } else if (diffInHours < 48) { return "Hier" } else { return date.toLocaleDateString("fr-FR") } } const toggleDocumentSelection = (docId: number) => { setSelectedDocuments((prev) => (prev.includes(docId) ? prev.filter((id) => id !== docId) : [...prev, docId])) } const selectAllDocuments = () => { if (selectedDocuments.length === filteredDocuments.length) { setSelectedDocuments([]) } else { setSelectedDocuments(filteredDocuments.map((doc) => doc.id)) } } const handleMoveDocuments = (docIds: number[]) => { if (!docIds || docIds.length === 0) return; const docs = docIds.map(id => documents.find(d => d.id === id)).filter(Boolean); setNewFolderName(""); setActionModal({ type: "move", document: docs[0], documents: docs }); }; const handleChangeStorage = (docIds: number[]) => { if (!docIds || docIds.length === 0) return; const docs = docIds.map(id => documents.find(d => d.id === id)).filter(Boolean); setStorageDuration("30"); setDataUsage(""); setThirdPartyAccess(""); setActionModal({ type: "storage_config", document: docs[0], documents: docs }); }; return (
{/* Notification */} {notification && (
{notification.type === "success" && } {notification.type === "error" && } {notification.type === "info" && } {notification.message}
)} {/* Header */}

Documents {filterFolder !== "all" && ( - {filterFolder} )}

{filterFolder !== "all" ? `Documents du dossier ${filterFolder}` : "Gérez vos documents et fichiers"}

{/* Search and Filters */}
{/* Vue grille supprimée: forcer la vue liste uniquement */}
{/* Advanced Filters */} {showFilters && (
)}
{/* Bulk Actions minimalistes: certificats et rôles uniquement */} {selectedDocuments.length > 0 && (
{selectedDocuments.length} document{selectedDocuments.length > 1 ? "s" : ""} sélectionné {selectedDocuments.length > 1 ? "s" : ""}
)} {/* Documents List/Grid */} {viewMode === "list" ? (
{filteredDocuments.map((doc) => ( ))}
Nom Taille Modifié Auteur Dossier Statut
toggleDocumentSelection(doc.id)} />
{getFileIcon(doc.type)}
{doc.name} {isNewDocument(doc) && ( NEW )} {getStorageIcon(doc.storageType)} {doc.isValidated && } {doc.temporaryStorageConfig && ( )}
{doc.size} {formatDate(doc.modified)} {doc.author} {doc.folder} {getStatusBadge(doc.status, doc.isValidated)}
) : (
{filteredDocuments.map((doc) => (
toggleDocumentSelection(doc.id)} />
{isNewDocument(doc) && ( NEW )} {getStorageIcon(doc.storageType)} {doc.isValidated && } {doc.temporaryStorageConfig && ( )} {doc.storageType === "temporary" && ( )} {doc.hasCertificate && ( )}
{getFileIcon(doc.type)}

{doc.name}

{doc.size}

{formatDate(doc.modified)}

{getStorageIcon(doc.storageType)} {doc.storageType === "permanent" ? "Permanent" : "Temporaire"} {doc.storageType === "temporary" && doc.temporaryStorageConfig && ( ({doc.temporaryStorageConfig.duration}j) )}

{getStatusBadge(doc.status, doc.isValidated) && (
{getStatusBadge(doc.status, doc.isValidated)}
)}
{doc.permissions.canAnalyze && ( )}
))}
)} {filteredDocuments.length === 0 && (

Aucun document trouvé

{searchTerm || filterType !== "all" || filterAuthor !== "all" || filterStorage !== "all" || filterFolder !== "all" ? "Essayez de modifier vos critères de recherche" : "Commencez par importer votre premier document"}

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

Importer des documents

Import de documents

Sélectionnez les fichiers à importer et choisissez le dossier de destination.

setImportFiles(e.target.files)} className="mt-1" accept=".pdf,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.png,.jpg,.jpeg,.gif,.mp4,.avi,.zip,.rar" />

Formats supportés: PDF, Word, Excel, PowerPoint, Images, Vidéos, Archives

{importFiles && importFiles.length > 0 && (

{importFiles.length} fichier(s) sélectionné(s):

    {Array.from(importFiles).map((file, index) => (
  • {file.name} {(file.size / (1024 * 1024)).toFixed(2)} MB
  • ))}
)}