Clean up unused modal
This commit is contained in:
parent
6d736e3668
commit
eaf5b653e9
@ -869,551 +869,46 @@ export default function FoldersPage() {
|
|||||||
>
|
>
|
||||||
<X className="h-4 w-4 text-gray-100" />
|
<X className="h-4 w-4 text-gray-100" />
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
)}
|
||||||
|
|
||||||
<div className="space-y-6">
|
|
||||||
<div className="bg-gray-800 border border-gray-700 rounded-lg p-4">
|
|
||||||
<div className="flex items-center space-x-3">
|
|
||||||
<FileCheck className="h-8 w-8 text-blue-400" />
|
|
||||||
<div>
|
|
||||||
<h4 className="font-semibold text-blue-200">Certificats des documents</h4>
|
|
||||||
<p className="text-sm text-blue-300">
|
|
||||||
Téléchargez les certificats blockchain individuels des documents de ce dossier
|
|
||||||
</p>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
) : (
|
||||||
|
<div className="space-y-4">
|
||||||
<div className="grid grid-cols-1 gap-4">
|
{/* Folder list */}
|
||||||
{actionModal.folder.documents?.map((doc) => (
|
<div className="space-y-2">
|
||||||
<div key={doc.id} className="border border-gray-700 rounded-lg p-4 bg-gray-900">
|
{sortedFolders.map((folder) => (
|
||||||
|
<Card key={folder.folderNumber} className="hover:shadow-md transition-shadow bg-gray-800 border border-gray-700">
|
||||||
|
<CardContent className="p-4">
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div className="flex items-center space-x-3">
|
<div className="flex items-center space-x-3">
|
||||||
<FileText className="h-8 w-8 text-gray-300" />
|
<Folder className="h-5 w-5 text-blue-600" />
|
||||||
<div>
|
<div>
|
||||||
<h5 className="font-medium text-gray-100">{doc.name}</h5>
|
<h3 className="font-medium text-gray-100">{folder.name}</h3>
|
||||||
{doc.hasCertificate && doc.certificateId && (
|
<p className="text-sm text-gray-400">{folder.description}</p>
|
||||||
<p className="text-sm text-gray-400">ID: {doc.certificateId}</p>
|
<div className="flex items-center space-x-4 mt-1">
|
||||||
)}
|
<span className="text-xs text-gray-400">#{folder.folderNumber}</span>
|
||||||
</div>
|
<span className="text-xs text-gray-400">
|
||||||
</div>
|
<Clock className="h-3 w-3 inline mr-1" />
|
||||||
<div className="flex items-center space-x-2">
|
{new Date(folder.updated_at).toLocaleDateString()}
|
||||||
{doc.hasCertificate ? (
|
|
||||||
<>
|
|
||||||
<Badge className="bg-green-800 text-green-100">Certifié</Badge>
|
|
||||||
<Button
|
|
||||||
variant="outline"
|
|
||||||
size="sm"
|
|
||||||
onClick={() => {
|
|
||||||
showNotification("info", `Téléchargement du certificat pour ${doc.name}...`)
|
|
||||||
setTimeout(() => {
|
|
||||||
showNotification("success", `Certificat de ${doc.name} téléchargé`)
|
|
||||||
sendFolderChatNotification(
|
|
||||||
actionModal.folder!.id.toString(),
|
|
||||||
`📜 Certificat du document "${doc.name}" téléchargé`,
|
|
||||||
"document_certificate_download",
|
|
||||||
)
|
|
||||||
}, 1500)
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<Download className="h-4 w-4 mr-2" />
|
|
||||||
Télécharger
|
|
||||||
</Button>
|
|
||||||
</>
|
|
||||||
) : (
|
|
||||||
<Badge variant="outline" className="bg-gray-700 text-gray-300">
|
|
||||||
Non certifié
|
|
||||||
</Badge>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="bg-gray-800 p-4 rounded-lg border border-gray-700">
|
|
||||||
<h5 className="font-medium text-gray-100 mb-3">Actions groupées</h5>
|
|
||||||
<div className="flex space-x-3">
|
|
||||||
<Button
|
|
||||||
variant="outline"
|
|
||||||
onClick={() => {
|
|
||||||
const certifiedDocs = actionModal.folder!.documents?.filter((doc) => doc.hasCertificate) || []
|
|
||||||
showNotification("info", `Téléchargement de ${certifiedDocs.length} certificat(s)...`)
|
|
||||||
setTimeout(() => {
|
|
||||||
showNotification("success", `${certifiedDocs.length} certificat(s) téléchargé(s)`)
|
|
||||||
sendFolderChatNotification(
|
|
||||||
actionModal.folder!.id.toString(),
|
|
||||||
`📦 Archive des certificats téléchargée (${certifiedDocs.length} documents)`,
|
|
||||||
"bulk_certificates_download",
|
|
||||||
)
|
|
||||||
}, 2000)
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<Archive className="h-4 w-4 mr-2" />
|
|
||||||
Télécharger tous les certificats (.zip)
|
|
||||||
</Button>
|
|
||||||
<Button
|
|
||||||
variant="outline"
|
|
||||||
onClick={() => {
|
|
||||||
showNotification("info", "Vérification en ligne des certificats...")
|
|
||||||
setTimeout(() => {
|
|
||||||
showNotification("success", "Tous les certificats sont valides")
|
|
||||||
}, 3000)
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<ShieldCheck className="h-4 w-4 mr-2" />
|
|
||||||
Vérifier tous en ligne
|
|
||||||
</Button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</>
|
|
||||||
)}
|
|
||||||
|
|
||||||
{/* Storage Config Modal */}
|
|
||||||
{actionModal.type === "storage_config" && actionModal.folder && (
|
|
||||||
<>
|
|
||||||
<div className="flex items-center justify-between mb-4">
|
|
||||||
<h3 className="text-lg font-semibold text-gray-100">
|
|
||||||
Configuration du stockage temporaire
|
|
||||||
</h3>
|
|
||||||
<Button
|
|
||||||
variant="ghost"
|
|
||||||
size="sm"
|
|
||||||
onClick={() => setActionModal({ type: null, folder: null, folders: [] })}
|
|
||||||
>
|
|
||||||
<X className="h-4 w-4 text-gray-100" />
|
|
||||||
</Button>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="space-y-4">
|
|
||||||
<div className="bg-gray-800 p-3 rounded-lg border border-gray-700">
|
|
||||||
<div className="flex items-center space-x-2 mb-2">
|
|
||||||
<Timer className="h-5 w-5 text-orange-400" />
|
|
||||||
<span className="font-medium text-orange-300">
|
|
||||||
Configuration du stockage temporaire
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<p className="text-sm text-orange-200">
|
|
||||||
Configurez la durée de conservation et les informations d'usage pour le dossier{" "}
|
|
||||||
<strong>{actionModal.folder.name}</strong> en stockage temporaire.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div>
|
|
||||||
<Label htmlFor="storageDuration" className="text-gray-100">Durée de conservation (en jours)</Label>
|
|
||||||
<Select value={storageDuration} onValueChange={setStorageDuration}>
|
|
||||||
<SelectTrigger className="bg-gray-900 text-gray-100 border-gray-700">
|
|
||||||
<SelectValue />
|
|
||||||
</SelectTrigger>
|
|
||||||
<SelectContent className="bg-gray-900 text-gray-100 border-gray-700">
|
|
||||||
<SelectItem value="7">7 jours</SelectItem>
|
|
||||||
<SelectItem value="15">15 jours</SelectItem>
|
|
||||||
<SelectItem value="30">30 jours</SelectItem>
|
|
||||||
<SelectItem value="60">60 jours</SelectItem>
|
|
||||||
<SelectItem value="90">90 jours</SelectItem>
|
|
||||||
<SelectItem value="180">180 jours</SelectItem>
|
|
||||||
<SelectItem value="365">1 an</SelectItem>
|
|
||||||
</SelectContent>
|
|
||||||
</Select>
|
|
||||||
<p className="text-xs text-gray-400 mt-1">
|
|
||||||
Durée pendant laquelle les données seront conservées en stockage temporaire avant archivage automatique
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div>
|
|
||||||
<Label htmlFor="dataUsage" className="text-gray-100">Usage de la donnée</Label>
|
|
||||||
<Textarea
|
|
||||||
id="dataUsage"
|
|
||||||
value={dataUsage}
|
|
||||||
onChange={(e) => setDataUsage(e.target.value)}
|
|
||||||
placeholder="Décrivez l'usage prévu de ces données (ex: analyses commerciales, rapports internes, documentation projet...)"
|
|
||||||
rows={3}
|
|
||||||
className="bg-gray-900 text-gray-100 border-gray-700"
|
|
||||||
/>
|
|
||||||
<p className="text-xs text-gray-400 mt-1">
|
|
||||||
Description de l'utilisation prévue des données contenues dans ce dossier
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div>
|
|
||||||
<Label htmlFor="thirdPartyAccess" className="text-gray-100">Tiers pouvant avoir accès</Label>
|
|
||||||
<Textarea
|
|
||||||
id="thirdPartyAccess"
|
|
||||||
value={thirdPartyAccess}
|
|
||||||
onChange={(e) => setThirdPartyAccess(e.target.value)}
|
|
||||||
placeholder="Listez les tiers externes qui pourraient avoir accès à ces données (ex: consultants, partenaires, auditeurs...)"
|
|
||||||
rows={3}
|
|
||||||
className="bg-gray-900 text-gray-100 border-gray-700"
|
|
||||||
/>
|
|
||||||
<p className="text-xs text-gray-400 mt-1">
|
|
||||||
Liste des parties externes qui pourraient être amenées à consulter ces données
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="bg-gray-800 p-3 rounded-lg border border-gray-700">
|
|
||||||
<div className="flex items-center space-x-2 mb-2">
|
|
||||||
<Info className="h-4 w-4 text-blue-400" />
|
|
||||||
<span className="font-medium text-blue-200">Information RGPD</span>
|
|
||||||
</div>
|
|
||||||
<p className="text-xs text-blue-300">
|
|
||||||
Ces informations sont utilisées pour assurer la conformité RGPD et la traçabilité des données.
|
|
||||||
Elles seront incluses dans le registre des traitements.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="flex justify-end space-x-2">
|
|
||||||
<Button
|
|
||||||
variant="outline"
|
|
||||||
onClick={() => setActionModal({ type: null, folder: null, folders: [] })}
|
|
||||||
>
|
|
||||||
Annuler
|
|
||||||
</Button>
|
|
||||||
<Button onClick={confirmStorageConfig}>
|
|
||||||
<Timer className="h-4 w-4 mr-2" />
|
|
||||||
Enregistrer la configuration
|
|
||||||
</Button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</>
|
|
||||||
)}
|
|
||||||
|
|
||||||
{/* Certificate Modal */}
|
|
||||||
{actionModal.type === "certificate" && actionModal.folder && (
|
|
||||||
<>
|
|
||||||
<div className="flex items-center justify-between mb-4">
|
|
||||||
<h3 className="text-lg font-semibold text-gray-100">
|
|
||||||
Certificat de validation du dossier
|
|
||||||
</h3>
|
|
||||||
<Button
|
|
||||||
variant="ghost"
|
|
||||||
size="sm"
|
|
||||||
onClick={() => setActionModal({ type: null, folder: null, folders: [] })}
|
|
||||||
>
|
|
||||||
<X className="h-4 w-4 text-gray-100" />
|
|
||||||
</Button>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="space-y-6">
|
|
||||||
<div className="bg-gray-800 border border-green-700 rounded-lg p-4">
|
|
||||||
<div className="flex items-center space-x-3">
|
|
||||||
<ShieldCheck className="h-8 w-8 text-green-400" />
|
|
||||||
<div>
|
|
||||||
<h4 className="font-semibold text-green-300">Dossier certifié</h4>
|
|
||||||
<p className="text-sm text-green-200">
|
|
||||||
Ce dossier et tous ses documents ont été validés et certifiés numériquement
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
|
|
||||||
<div className="bg-gray-900 p-4 rounded-lg border border-gray-700">
|
|
||||||
<h5 className="font-medium text-gray-100 mb-3">Informations du dossier</h5>
|
|
||||||
<div className="space-y-2 text-sm text-gray-300">
|
|
||||||
<div className="flex justify-between">
|
|
||||||
<span className="text-gray-400">Nom :</span>
|
|
||||||
<span className="font-medium">{actionModal.folder.name}</span>
|
|
||||||
</div>
|
|
||||||
<div className="flex justify-between">
|
|
||||||
<span className="text-gray-400">Documents :</span>
|
|
||||||
<span className="font-medium">{actionModal.folder.documentsCount}</span>
|
|
||||||
</div>
|
|
||||||
<div className="flex justify-between">
|
|
||||||
<span className="text-gray-400">Taille totale :</span>
|
|
||||||
<span className="font-medium">{actionModal.folder.size}</span>
|
|
||||||
</div>
|
|
||||||
<div className="flex justify-between">
|
|
||||||
<span className="text-gray-400">Type :</span>
|
|
||||||
<span className="font-medium capitalize">{actionModal.folder.type}</span>
|
|
||||||
</div>
|
|
||||||
<div className="flex justify-between">
|
|
||||||
<span className="text-gray-400">Hash du dossier :</span>
|
|
||||||
<span className="font-mono text-xs bg-gray-800 p-1 rounded break-all text-gray-200">
|
|
||||||
{Math.random().toString(36).substring(2, 15) +
|
|
||||||
Math.random().toString(36).substring(2, 15)}
|
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="bg-gray-900 p-4 rounded-lg border border-gray-700">
|
|
||||||
<h5 className="font-medium text-gray-100 mb-3">Certificat numérique</h5>
|
|
||||||
<div className="space-y-2 text-sm text-gray-300">
|
|
||||||
<div className="flex justify-between">
|
|
||||||
<span className="text-gray-400">Émis le :</span>
|
|
||||||
<span className="font-medium">{actionModal.folder.modified.toLocaleDateString("fr-FR")}</span>
|
|
||||||
</div>
|
|
||||||
<div className="flex justify-between">
|
|
||||||
<span className="text-gray-400">Validé par :</span>
|
|
||||||
<span className="font-medium">{actionModal.folder.owner}</span>
|
|
||||||
</div>
|
|
||||||
<div className="flex justify-between">
|
|
||||||
<span className="text-gray-400">Autorité :</span>
|
|
||||||
<span className="font-medium">DocV Folder Certification</span>
|
|
||||||
</div>
|
|
||||||
<div className="flex justify-between">
|
|
||||||
<span className="text-gray-400">ID Certificat :</span>
|
|
||||||
<span className="font-mono text-xs bg-gray-800 p-1 rounded text-gray-200">
|
|
||||||
FOLDER-CERT-{actionModal.folder.id}-{new Date().getFullYear()}
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<div className="flex justify-between">
|
|
||||||
<span className="text-gray-400">Validité :</span>
|
|
||||||
<span className="font-medium text-green-400">
|
|
||||||
{new Date(Date.now() + 365 * 24 * 60 * 60 * 1000).toLocaleDateString("fr-FR")}
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="bg-gray-800 border border-blue-700 rounded-lg p-4">
|
|
||||||
<h5 className="font-medium text-blue-300 mb-3">Validation du dossier complet</h5>
|
|
||||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-4 text-gray-300">
|
|
||||||
<div className="space-y-2 text-sm">
|
|
||||||
<div className="flex items-center space-x-2">
|
<div className="flex items-center space-x-2">
|
||||||
<CheckCircle className="h-4 w-4 text-green-400" />
|
{folder.notes.length > 0 && (
|
||||||
<span>Intégrité de tous les documents vérifiée</span>
|
<Badge variant="outline">{folder.notes.length} notes</Badge>
|
||||||
</div>
|
)}
|
||||||
<div className="flex items-center space-x-2">
|
|
||||||
<CheckCircle className="h-4 w-4 text-green-400" />
|
|
||||||
<span>Structure du dossier validée</span>
|
|
||||||
</div>
|
|
||||||
<div className="flex items-center space-x-2">
|
|
||||||
<CheckCircle className="h-4 w-4 text-green-400" />
|
|
||||||
<span>Permissions et accès contrôlés</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div className="space-y-2 text-sm">
|
|
||||||
<div className="flex items-center space-x-2">
|
|
||||||
<CheckCircle className="h-4 w-4 text-green-400" />
|
|
||||||
<span>Horodatage certifié pour tous les fichiers</span>
|
|
||||||
</div>
|
|
||||||
<div className="flex items-center space-x-2">
|
|
||||||
<CheckCircle className="h-4 w-4 text-green-400" />
|
|
||||||
<span>Conformité RGPD du dossier</span>
|
|
||||||
</div>
|
|
||||||
<div className="flex items-center space-x-2">
|
|
||||||
<CheckCircle className="h-4 w-4 text-green-400" />
|
|
||||||
<span>Traçabilité complète des modifications</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="bg-gray-900 border border-green-700 rounded-lg p-4">
|
|
||||||
<h5 className="font-medium text-gray-100 mb-3">Chaîne de confiance distribuée</h5>
|
|
||||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-4 text-gray-300">
|
|
||||||
<div className="space-y-2 text-sm">
|
|
||||||
<div className="flex items-center space-x-2">
|
|
||||||
<div className="w-3 h-3 bg-green-500 rounded-full"></div>
|
|
||||||
<span>Block #{Math.floor(Math.random() * 1000000)} - Dossier principal</span>
|
|
||||||
</div>
|
|
||||||
<div className="flex items-center space-x-2">
|
|
||||||
<div className="w-3 h-3 bg-blue-500 rounded-full"></div>
|
|
||||||
<span>{actionModal.folder.documentsCount} documents liés dans la blockchain</span>
|
|
||||||
</div>
|
|
||||||
<div className="flex items-center space-x-2">
|
|
||||||
<div className="w-3 h-3 bg-purple-500 rounded-full"></div>
|
|
||||||
<span>Réplication sur {Math.floor(Math.random() * 5) + 3} nœuds souverains</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div className="space-y-2 text-sm">
|
|
||||||
<div className="flex items-center space-x-2">
|
|
||||||
<div className="w-3 h-3 bg-orange-500 rounded-full"></div>
|
|
||||||
<span>Stockage {actionModal.folder.storageType === "permanent" ? "permanent" : "temporaire"} certifié</span>
|
|
||||||
</div>
|
|
||||||
<div className="flex items-center space-x-2">
|
|
||||||
<div className="w-3 h-3 bg-red-500 rounded-full"></div>
|
|
||||||
<span>{Math.floor(Math.random() * 100) + 50} confirmations réseau</span>
|
|
||||||
</div>
|
|
||||||
<div className="flex items-center space-x-2">
|
|
||||||
<div className="w-3 h-3 bg-indigo-500 rounded-full"></div>
|
|
||||||
<span>Audit de sécurité: {new Date().toLocaleDateString("fr-FR")}</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{actionModal.folder.expectedDocuments.length > 0 && (
|
|
||||||
<div className="bg-gray-800 border border-yellow-700 rounded-lg p-4">
|
|
||||||
<h5 className="font-medium text-yellow-300 mb-3">Documents attendus - Statut de validation</h5>
|
|
||||||
<div className="space-y-2 text-gray-300 text-sm">
|
|
||||||
{actionModal.folder.expectedDocuments.map((doc, index) => (
|
|
||||||
<div key={index} className="flex items-center justify-between">
|
|
||||||
<div className="flex items-center space-x-2">
|
|
||||||
<FileText className="h-4 w-4 text-gray-400" />
|
|
||||||
<span>{doc.name}</span>
|
|
||||||
{doc.required && <span className="text-red-500 text-xs">*</span>}
|
|
||||||
</div>
|
|
||||||
<div className="flex items-center space-x-2">
|
|
||||||
<Badge
|
|
||||||
className={
|
|
||||||
doc.status === "received"
|
|
||||||
? "bg-green-700 text-green-200"
|
|
||||||
: doc.status === "pending"
|
|
||||||
? "bg-orange-700 text-orange-200"
|
|
||||||
: "bg-red-700 text-red-200"
|
|
||||||
}
|
|
||||||
>
|
|
||||||
{doc.status === "received"
|
|
||||||
? "✓ Validé"
|
|
||||||
: doc.status === "pending"
|
|
||||||
? "⏳ En attente"
|
|
||||||
: "❌ Manquant"}
|
|
||||||
</Badge>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</CardContent>
|
||||||
|
</Card>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
<div className="flex justify-end space-x-3 pt-4 border-t border-gray-700">
|
|
||||||
<Button
|
|
||||||
variant="outline"
|
|
||||||
onClick={() => {
|
|
||||||
showNotification("success", `Certificat du dossier ${actionModal.folder!.name} téléchargé`);
|
|
||||||
sendFolderChatNotification(
|
|
||||||
actionModal.folder!.id.toString(),
|
|
||||||
`📜 Certificat de validation du dossier téléchargé`,
|
|
||||||
"folder_certificate_download",
|
|
||||||
);
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<Download className="h-4 w-4 mr-2" />
|
|
||||||
Télécharger le certificat (.pdf)
|
|
||||||
</Button>
|
|
||||||
<Button
|
|
||||||
variant="outline"
|
|
||||||
onClick={() => {
|
|
||||||
showNotification("info", "Vérification en ligne du certificat du dossier...");
|
|
||||||
setTimeout(() => {
|
|
||||||
showNotification("success", "Certificat du dossier vérifié avec succès");
|
|
||||||
}, 3000);
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<ShieldCheck className="h-4 w-4 mr-2" />
|
|
||||||
Vérifier en ligne
|
|
||||||
</Button>
|
|
||||||
<Button
|
|
||||||
variant="outline"
|
|
||||||
onClick={() => {
|
|
||||||
showNotification("info", "Préparation de l'archive certifiée...");
|
|
||||||
setTimeout(() => {
|
|
||||||
showNotification(
|
|
||||||
"success",
|
|
||||||
`Archive certifiée du dossier ${actionModal.folder!.name} téléchargée`,
|
|
||||||
);
|
|
||||||
sendFolderChatNotification(
|
|
||||||
actionModal.folder!.id.toString(),
|
|
||||||
`📦 Archive certifiée complète téléchargée (${actionModal.folder!.documentsCount} documents)`,
|
|
||||||
"certified_archive_download",
|
|
||||||
);
|
|
||||||
}, 4000);
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<Archive className="h-4 w-4 mr-2" />
|
|
||||||
Archive certifiée (.zip)
|
|
||||||
</Button>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</>
|
|
||||||
)}
|
|
||||||
|
|
||||||
{/* Request Document Modal */}
|
|
||||||
{actionModal.type === "request_document" && actionModal.folder && (
|
|
||||||
<>
|
|
||||||
<div className="flex items-center justify-between mb-4">
|
|
||||||
<h3 className="text-lg font-semibold text-gray-100">Demander un document</h3>
|
|
||||||
<Button
|
|
||||||
variant="ghost"
|
|
||||||
size="sm"
|
|
||||||
onClick={() => setActionModal({ type: null, folder: null, folders: [] })}
|
|
||||||
>
|
|
||||||
<X className="h-4 w-4 text-gray-100" />
|
|
||||||
</Button>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="space-y-4">
|
|
||||||
<div className="bg-gray-800 p-3 rounded-lg">
|
|
||||||
<p className="text-sm text-blue-300">
|
|
||||||
Sélectionnez un document attendu pour le dossier <strong>{actionModal.folder.name}</strong> et
|
|
||||||
envoyez une demande à la personne responsable.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div>
|
|
||||||
<Label htmlFor="selectedDocument" className="text-gray-100">Document à demander</Label>
|
|
||||||
<Select value={selectedDocument} onValueChange={setSelectedDocument}>
|
|
||||||
<SelectTrigger className="bg-gray-900 text-gray-100 border-gray-700">
|
|
||||||
<SelectValue placeholder="Choisir un document" />
|
|
||||||
</SelectTrigger>
|
|
||||||
<SelectContent className="bg-gray-900 text-gray-100 border-gray-700">
|
|
||||||
{actionModal.folder.expectedDocuments.map((doc) => (
|
|
||||||
<SelectItem key={doc.name} value={doc.name}>
|
|
||||||
<div className="flex items-center justify-between w-full">
|
|
||||||
<div className="flex items-center space-x-2">
|
|
||||||
<FileText className="h-4 w-4 text-gray-300" />
|
|
||||||
<span>{doc.name}</span>
|
|
||||||
{doc.required && <span className="text-red-500">*</span>}
|
|
||||||
</div>
|
|
||||||
<div className="flex items-center space-x-2">
|
|
||||||
<Badge
|
|
||||||
className={
|
|
||||||
doc.status === "received"
|
|
||||||
? "bg-green-700 text-green-200"
|
|
||||||
: doc.status === "pending"
|
|
||||||
? "bg-orange-700 text-orange-200"
|
|
||||||
: "bg-red-700 text-red-200"
|
|
||||||
}
|
|
||||||
>
|
|
||||||
{doc.status === "received"
|
|
||||||
? "Reçu"
|
|
||||||
: doc.status === "pending"
|
|
||||||
? "En attente"
|
|
||||||
: "Manquant"}
|
|
||||||
</Badge>
|
|
||||||
<span className="text-xs text-gray-400">({doc.assignedRole})</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</SelectItem>
|
|
||||||
))}
|
|
||||||
</SelectContent>
|
|
||||||
</Select>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div>
|
|
||||||
<Label htmlFor="requestMessage" className="text-gray-100">Message de demande</Label>
|
|
||||||
<Textarea
|
|
||||||
id="requestMessage"
|
|
||||||
value={requestMessage}
|
|
||||||
onChange={(e) => setRequestMessage(e.target.value)}
|
|
||||||
placeholder="Ajouter un message pour expliquer votre demande..."
|
|
||||||
rows={3}
|
|
||||||
className="bg-gray-900 text-gray-100 border-gray-700 placeholder-gray-500"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="flex justify-end space-x-2">
|
|
||||||
<Button
|
|
||||||
variant="outline"
|
|
||||||
onClick={() => setActionModal({ type: null, folder: null, folders: [] })}
|
|
||||||
>
|
|
||||||
Annuler
|
|
||||||
</Button>
|
|
||||||
<Button onClick={confirmRequestDocument} disabled={!selectedDocument}>
|
|
||||||
<FileQuestion className="h-4 w-4 mr-2" />
|
|
||||||
Envoyer la demande
|
|
||||||
</Button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
|
|
||||||
{/* Modals */}
|
{/* Modals */}
|
||||||
{isModalOpen && (
|
{isModalOpen && (
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user