AxL95 commited on
Commit
b0f36cd
·
verified ·
1 Parent(s): 0828269

Create AdminPanel.jsx

Browse files
frontend/src/components/AdminPanel.jsx ADDED
@@ -0,0 +1,217 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // src/components/AdminPanel.js
2
+ import React, { useState, useEffect } from 'react';
3
+ import './AdminPanel.css';
4
+
5
+ function AdminPanel({ isCollapsed, onToggleCollapse, userName, onLogout,setPage }) {
6
+ const [documents, setDocuments] = useState([]);
7
+ const [isLoading, setIsLoading] = useState(false);
8
+ const [error, setError] = useState(null);
9
+ const [uploadStatus, setUploadStatus] = useState(null);
10
+ const [uploadData, setUploadData] = useState({
11
+ title: '',
12
+ tags: ''
13
+ });
14
+ const [selectedFile, setSelectedFile] = useState(null);
15
+
16
+ useEffect(() => {
17
+ fetchDocuments();
18
+ }, []);
19
+
20
+ const fetchDocuments = async () => {
21
+ setIsLoading(true);
22
+ try {
23
+ const response = await fetch('http://localhost:7860/api/admin/knowledge', {
24
+ credentials: 'include'
25
+ });
26
+
27
+ if (response.ok) {
28
+ const data = await response.json();
29
+ setDocuments(data.documents);
30
+ } else {
31
+ const errorData = await response.json();
32
+ setError(`Erreur: ${errorData.detail || 'Impossible de charger les documents'}`);
33
+ }
34
+ } catch (err) {
35
+ setError(`Erreur: ${err.message}`);
36
+ } finally {
37
+ setIsLoading(false);
38
+ }
39
+ };
40
+
41
+ const handleInputChange = (e) => {
42
+ const { name, value } = e.target;
43
+ setUploadData({
44
+ ...uploadData,
45
+ [name]: value
46
+ });
47
+ };
48
+
49
+ const handleFileChange = (e) => {
50
+ setSelectedFile(e.target.files[0]);
51
+ };
52
+
53
+ const handleUpload = async (e) => {
54
+ e.preventDefault();
55
+
56
+ if (!selectedFile) {
57
+ setUploadStatus('Veuillez sélectionner un fichier PDF');
58
+ return;
59
+ }
60
+
61
+ setUploadStatus('Téléchargement en cours...');
62
+
63
+ const formData = new FormData();
64
+ formData.append('file', selectedFile);
65
+ formData.append('title', uploadData.title || selectedFile.name);
66
+ formData.append('tags', uploadData.tags);
67
+
68
+ try {
69
+ const response = await fetch('http://localhost:7860/api/admin/knowledge/upload', {
70
+ method: 'POST',
71
+ credentials: 'include',
72
+ body: formData
73
+ });
74
+
75
+ const data = await response.json();
76
+
77
+ if (response.ok) {
78
+ setUploadStatus('Document téléchargé avec succès!');
79
+ setUploadData({ title: '', tags: '' });
80
+ setSelectedFile(null);
81
+ // Recharger la liste des documents
82
+ } else {
83
+ setUploadStatus(`Erreur: ${data.detail || 'Échec du téléchargement'}`);
84
+ }
85
+ } catch (err) {
86
+ setUploadStatus(`Erreur: ${err.message}`);
87
+ }
88
+ };
89
+
90
+ const handleDelete = async (docId) => {
91
+ if (!window.confirm('Êtes-vous sûr de vouloir supprimer ce document?')) {
92
+ return;
93
+ }
94
+
95
+ try {
96
+ const response = await fetch(`http://localhost:7860/api/admin/knowledge/${docId}`, {
97
+ method: 'DELETE',
98
+ credentials: 'include'
99
+ });
100
+
101
+ if (response.ok) {
102
+ setDocuments(documents.filter(doc => doc.id !== docId));
103
+ setUploadStatus('Document supprimé avec succès!');
104
+ setTimeout(() => setUploadStatus(null), 3000); // Effacer le message après 3 secondes
105
+ // Mettre à jour la liste des documents
106
+ } else {
107
+ const data = await response.json();
108
+ setError(`Erreur: ${data.detail || 'Échec de la suppression'}`);
109
+ }
110
+ } catch (err) {
111
+ setError(`Erreur: ${err.message}`);
112
+ }
113
+ };
114
+
115
+ return (
116
+ <div className="admin-panel">
117
+ <div className="admin-header">
118
+ <h1>Panneau d'administration</h1>
119
+ <div className="admin-user-info">
120
+ <span>Connecté en tant que: {userName}</span>
121
+ <button onClick={() => setPage("chat")} className="back-btn">
122
+ Retour au chat
123
+ </button>
124
+ <button onClick={onLogout} className="logout-btn">Déconnexion</button>
125
+ </div>
126
+ </div>
127
+
128
+ <div className="admin-content">
129
+ <div className="admin-section">
130
+ <h2>Ajouter un document PDF</h2>
131
+ <form onSubmit={handleUpload} className="upload-form">
132
+ <div className="form-group">
133
+ <label>Titre (optionnel):</label>
134
+ <input
135
+ type="text"
136
+ name="title"
137
+ value={uploadData.title}
138
+ onChange={handleInputChange}
139
+ placeholder="Titre du document"
140
+ />
141
+ </div>
142
+
143
+ <div className="form-group">
144
+ <label>Tags (séparés par des virgules):</label>
145
+ <input
146
+ type="text"
147
+ name="tags"
148
+ value={uploadData.tags}
149
+ onChange={handleInputChange}
150
+ placeholder="schizophrénie, traitement, symptômes, etc."
151
+ />
152
+ </div>
153
+
154
+ <div className="form-group">
155
+ <label>Fichier PDF:</label>
156
+ <input
157
+ type="file"
158
+ accept=".pdf"
159
+ onChange={handleFileChange}
160
+ />
161
+ </div>
162
+
163
+ <button type="submit" className="upload-btn">
164
+ Télécharger le document
165
+ </button>
166
+
167
+ {uploadStatus && (
168
+ <div className={`upload-status ${uploadStatus.includes('Erreur') ? 'error' : 'success'}`}>
169
+ {uploadStatus}
170
+ </div>
171
+ )}
172
+ </form>
173
+
174
+ <div className="admin-section">
175
+ <h2>Documents disponibles</h2>
176
+ {isLoading ? (
177
+ <p>Chargement...</p>
178
+ ) : error ? (
179
+ <p className="error">{error}</p>
180
+ ) : documents.length === 0 ? (
181
+ <p>Aucun document trouvé.</p>
182
+ ) : (
183
+ <table className="documents-table">
184
+ <thead>
185
+ <tr>
186
+ <th>Titre</th>
187
+ <th>Tags</th>
188
+ <th>Date d'ajout</th>
189
+ <th>Actions</th>
190
+ </tr>
191
+ </thead>
192
+ <tbody>
193
+ {documents.map(doc => (
194
+ <tr key={doc.id}>
195
+ <td>{doc.title}</td>
196
+ <td>{doc.tags.join(', ')}</td>
197
+ <td>{new Date(doc.date).toLocaleDateString()}</td>
198
+ <td>
199
+ <button onClick={() => handleDelete(doc.id)} className="delete-btn">
200
+ Supprimer
201
+ </button>
202
+ </td>
203
+ </tr>
204
+ ))}
205
+ </tbody>
206
+ </table>
207
+ )}
208
+ </div>
209
+ </div>
210
+
211
+
212
+ </div>
213
+ </div>
214
+ );
215
+ }
216
+
217
+ export default AdminPanel;