|
|
|
import React, { useState, useEffect } from 'react'; |
|
import './AdminPanel.css'; |
|
|
|
function AdminPanel({ isCollapsed, onToggleCollapse, userName, onLogout,setPage }) { |
|
const [documents, setDocuments] = useState([]); |
|
const [isLoading, setIsLoading] = useState(false); |
|
const [error, setError] = useState(null); |
|
const [uploadStatus, setUploadStatus] = useState(null); |
|
const [uploadData, setUploadData] = useState({ |
|
title: '', |
|
tags: '' |
|
}); |
|
const [selectedFile, setSelectedFile] = useState(null); |
|
|
|
useEffect(() => { |
|
fetchDocuments(); |
|
}, []); |
|
|
|
const fetchDocuments = async () => { |
|
setIsLoading(true); |
|
try { |
|
const response = await fetch('/api/admin/knowledge', { |
|
credentials: 'include' |
|
}); |
|
|
|
if (response.ok) { |
|
const data = await response.json(); |
|
setDocuments(data.documents); |
|
} else { |
|
const errorData = await response.json(); |
|
setError(`Erreur: ${errorData.detail || 'Impossible de charger les documents'}`); |
|
} |
|
} catch (err) { |
|
setError(`Erreur: ${err.message}`); |
|
} finally { |
|
setIsLoading(false); |
|
} |
|
}; |
|
|
|
const handleInputChange = (e) => { |
|
const { name, value } = e.target; |
|
setUploadData({ |
|
...uploadData, |
|
[name]: value |
|
}); |
|
}; |
|
|
|
const handleFileChange = (e) => { |
|
setSelectedFile(e.target.files[0]); |
|
}; |
|
|
|
const handleUpload = async (e) => { |
|
e.preventDefault(); |
|
|
|
if (!selectedFile) { |
|
setUploadStatus('Veuillez sélectionner un fichier PDF'); |
|
return; |
|
} |
|
|
|
setUploadStatus('Téléchargement en cours...'); |
|
|
|
const formData = new FormData(); |
|
formData.append('file', selectedFile); |
|
formData.append('title', uploadData.title || selectedFile.name); |
|
formData.append('tags', uploadData.tags); |
|
|
|
try { |
|
const response = await fetch('/api/admin/knowledge/upload', { |
|
method: 'POST', |
|
credentials: 'include', |
|
body: formData |
|
}); |
|
|
|
const data = await response.json(); |
|
|
|
if (response.ok) { |
|
setUploadStatus('Document téléchargé avec succès!'); |
|
setUploadData({ title: '', tags: '' }); |
|
setSelectedFile(null); |
|
|
|
} else { |
|
setUploadStatus(`Erreur: ${data.detail || 'Échec du téléchargement'}`); |
|
} |
|
} catch (err) { |
|
setUploadStatus(`Erreur: ${err.message}`); |
|
} |
|
}; |
|
|
|
const handleDelete = async (docId) => { |
|
if (!window.confirm('Êtes-vous sûr de vouloir supprimer ce document?')) { |
|
return; |
|
} |
|
|
|
try { |
|
const response = await fetch(`/api/admin/knowledge/${docId}`, { |
|
method: 'DELETE', |
|
credentials: 'include' |
|
}); |
|
|
|
if (response.ok) { |
|
setDocuments(documents.filter(doc => doc.id !== docId)); |
|
setUploadStatus('Document supprimé avec succès!'); |
|
setTimeout(() => setUploadStatus(null), 3000); |
|
|
|
} else { |
|
const data = await response.json(); |
|
setError(`Erreur: ${data.detail || 'Échec de la suppression'}`); |
|
} |
|
} catch (err) { |
|
setError(`Erreur: ${err.message}`); |
|
} |
|
}; |
|
|
|
return ( |
|
<div className="admin-panel"> |
|
<div className="admin-header"> |
|
<h1>Panneau d'administration</h1> |
|
<div className="admin-user-info"> |
|
<span>Connecté en tant que: {userName}</span> |
|
<button onClick={() => setPage("chat")} className="back-btn"> |
|
Retour au chat |
|
</button> |
|
<button onClick={onLogout} className="logout-btn">Déconnexion</button> |
|
</div> |
|
</div> |
|
|
|
<div className="admin-content"> |
|
<div className="admin-section"> |
|
<h2>Ajouter un document PDF</h2> |
|
<form onSubmit={handleUpload} className="upload-form"> |
|
<div className="form-group"> |
|
<label>Titre (optionnel):</label> |
|
<input |
|
type="text" |
|
name="title" |
|
value={uploadData.title} |
|
onChange={handleInputChange} |
|
placeholder="Titre du document" |
|
/> |
|
</div> |
|
|
|
<div className="form-group"> |
|
<label>Tags (séparés par des virgules):</label> |
|
<input |
|
type="text" |
|
name="tags" |
|
value={uploadData.tags} |
|
onChange={handleInputChange} |
|
placeholder="schizophrénie, traitement, symptômes, etc." |
|
/> |
|
</div> |
|
|
|
<div className="form-group"> |
|
<label>Fichier PDF:</label> |
|
<input |
|
type="file" |
|
accept=".pdf" |
|
onChange={handleFileChange} |
|
/> |
|
</div> |
|
|
|
<button type="submit" className="upload-btn"> |
|
Télécharger le document |
|
</button> |
|
|
|
{uploadStatus && ( |
|
<div className={`upload-status ${uploadStatus.includes('Erreur') ? 'error' : 'success'}`}> |
|
{uploadStatus} |
|
</div> |
|
)} |
|
</form> |
|
|
|
<div className="admin-section"> |
|
<h2>Documents disponibles</h2> |
|
{isLoading ? ( |
|
<p>Chargement...</p> |
|
) : error ? ( |
|
<p className="error">{error}</p> |
|
) : documents.length === 0 ? ( |
|
<p>Aucun document trouvé.</p> |
|
) : ( |
|
<table className="documents-table"> |
|
<thead> |
|
<tr> |
|
<th>Titre</th> |
|
<th>Tags</th> |
|
<th>Date d'ajout</th> |
|
<th>Actions</th> |
|
</tr> |
|
</thead> |
|
<tbody> |
|
{documents.map(doc => ( |
|
<tr key={doc.id}> |
|
<td>{doc.title}</td> |
|
<td>{doc.tags.join(', ')}</td> |
|
<td>{new Date(doc.date).toLocaleDateString()}</td> |
|
<td> |
|
<button onClick={() => handleDelete(doc.id)} className="delete-btn"> |
|
Supprimer |
|
</button> |
|
</td> |
|
</tr> |
|
))} |
|
</tbody> |
|
</table> |
|
)} |
|
</div> |
|
</div> |
|
|
|
|
|
</div> |
|
</div> |
|
); |
|
} |
|
|
|
export default AdminPanel; |