Akira-Kurusu commited on
Commit
cf0c049
·
verified ·
1 Parent(s): db53ccb

Update web/index.html

Browse files
Files changed (1) hide show
  1. web/index.html +53 -81
web/index.html CHANGED
@@ -9,7 +9,7 @@
9
  <title>Dashboard</title>
10
  <link rel="stylesheet" href="css/simplebar.css">
11
  <link href="https://fonts.googleapis.com/css2?family=Overpass:ital,wght@0,100;0,200;0,300;0,400;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,600;1,700;1,800;1,900&display=swap" rel="stylesheet">
12
- <link rel="stylesheet" href="css/feather.css">
13
  <link rel="stylesheet" href="css/select2.css">
14
  <link rel="stylesheet" href="css/dropzone.css">
15
  <link rel="stylesheet" href="css/uppy.min.css">
@@ -24,7 +24,7 @@
24
  <div class="wrapper">
25
  <nav class="topnav navbar navbar-light">
26
  <button type="button" class="navbar-toggler text-muted mt-2 p-0 mr-3 collapseSidebar">
27
- <i class="fe fe-menu navbar-toggler-icon"></i>
28
  </button>
29
 
30
  <ul class="nav">
@@ -44,7 +44,7 @@
44
  </nav>
45
  <aside class="sidebar-left border-right bg-white shadow" id="leftSidebar" data-simplebar>
46
  <a href="#" class="btn collapseSidebar toggle-btn d-lg-none text-muted ml-2 mt-3" data-toggle="toggle">
47
- <i class="fe fe-x"><span class="sr-only"></span></i>
48
  </a>
49
  <nav class="vertnav navbar navbar-light">
50
  <!-- nav bar -->
@@ -57,31 +57,31 @@
57
  <ul class="navbar-nav flex-fill w-100 mb-2">
58
  <li class="nav-item active">
59
  <a class="nav-link" href="./index.html">
60
- <i class="fe fe-home fe-16"></i>
61
  <span class="ml-3 item-text">Dashboard</span>
62
  </a>
63
  </li>
64
  <li class="nav-item">
65
  <a class="nav-link" href="./diagnosis.html">
66
- <i class="fe fe-eye fe-16"></i>
67
  <span class="ml-3 item-text">Diagnóstico</span>
68
  </a>
69
  </li>
70
  <li class="nav-item">
71
  <a class="nav-link" href="./patients.html">
72
- <i class="fe fe-users fe-16"></i>
73
  <span class="ml-3 item-text">Pacientes</span>
74
  </a>
75
  </li>
76
  <li class="nav-item">
77
  <a class="nav-link" href="./historial-consultas.html">
78
- <i class="fe fe-file-text fe-16"></i>
79
  <span class="ml-3 item-text">Consultas</span>
80
  </a>
81
  </li>
82
  <li class="nav-item active">
83
  <a class="nav-link" href="./users.html">
84
- <i class="fe fe-user fe-16"></i>
85
  <span class="ml-3 item-text">Usuarios</span>
86
  </a>
87
  </li>
@@ -99,7 +99,7 @@
99
  <div class="row align-items-center">
100
  <div class="col-3 text-center">
101
  <span class="circle circle-sm bg-primary">
102
- <i class="fe fe-users fe-16 text-white"></i>
103
  </span>
104
  </div>
105
  <div class="col pr-0">
@@ -116,7 +116,7 @@
116
  <div class="row align-items-center">
117
  <div class="col-3 text-center">
118
  <span class="circle circle-sm bg-warning">
119
- <i class="fe fe-alert-triangle fe-16 text-white"></i>
120
  </span>
121
  </div>
122
  <div class="col pr-0">
@@ -133,7 +133,7 @@
133
  <div class="row align-items-center">
134
  <div class="col-3 text-center">
135
  <span class="circle circle-sm bg-success">
136
- <i class="fe fe-check fe-16 text-white"></i>
137
  </span>
138
  </div>
139
  <div class="col pr-0">
@@ -150,7 +150,7 @@
150
  <div class="row align-items-center">
151
  <div class="col-3 text-center">
152
  <span class="circle circle-sm bg-info">
153
- <i class="fe fe-percent fe-16 text-white"></i>
154
  </span>
155
  </div>
156
  <div class="col pr-0">
@@ -182,7 +182,7 @@
182
  <div class="card shadow h-100 mb-4">
183
  <div class="card-header">
184
  <h6 class="card-title mb-0">
185
- <i class="fe fe-pie-chart mr-2"></i>
186
  Rangos de Edad con Retinopatía
187
  </h6>
188
  </div>
@@ -229,7 +229,7 @@
229
  <tbody id="recentConsultationsBody">
230
  <tr>
231
  <td colspan="5" class="text-center text-muted">
232
- <i class="fe fe-loader fe-16 spinner"></i> Cargando consultas...
233
  </td>
234
  </tr>
235
  </tbody>
@@ -255,7 +255,7 @@
255
  <div class="list-group-item bg-transparent">
256
  <div class="row align-items-center">
257
  <div class="col-auto">
258
- <span class="fe fe-box fe-24"></span>
259
  </div>
260
  <div class="col">
261
  <small><strong>Package has uploaded successfull</strong></small>
@@ -267,7 +267,7 @@
267
  <div class="list-group-item bg-transparent">
268
  <div class="row align-items-center">
269
  <div class="col-auto">
270
- <span class="fe fe-download fe-24"></span>
271
  </div>
272
  <div class="col">
273
  <small><strong>Widgets are updated successfull</strong></small>
@@ -279,7 +279,7 @@
279
  <div class="list-group-item bg-transparent">
280
  <div class="row align-items-center">
281
  <div class="col-auto">
282
- <span class="fe fe-inbox fe-24"></span>
283
  </div>
284
  <div class="col">
285
  <small><strong>Notifications have been sent</strong></small>
@@ -291,7 +291,7 @@
291
  <div class="list-group-item bg-transparent">
292
  <div class="row align-items-center">
293
  <div class="col-auto">
294
- <span class="fe fe-link fe-24"></span>
295
  </div>
296
  <div class="col">
297
  <small><strong>Link was attached to menu</strong></small>
@@ -321,13 +321,13 @@
321
  <div class="row align-items-center">
322
  <div class="col-6 text-center">
323
  <div class="squircle bg-success justify-content-center">
324
- <i class="fe fe-cpu fe-32 align-self-center text-white"></i>
325
  </div>
326
  <p>Control area</p>
327
  </div>
328
  <div class="col-6 text-center">
329
  <div class="squircle bg-primary justify-content-center">
330
- <i class="fe fe-activity fe-32 align-self-center text-white"></i>
331
  </div>
332
  <p>Activity</p>
333
  </div>
@@ -335,13 +335,13 @@
335
  <div class="row align-items-center">
336
  <div class="col-6 text-center">
337
  <div class="squircle bg-primary justify-content-center">
338
- <i class="fe fe-droplet fe-32 align-self-center text-white"></i>
339
  </div>
340
  <p>Droplet</p>
341
  </div>
342
  <div class="col-6 text-center">
343
  <div class="squircle bg-primary justify-content-center">
344
- <i class="fe fe-upload-cloud fe-32 align-self-center text-white"></i>
345
  </div>
346
  <p>Upload</p>
347
  </div>
@@ -349,13 +349,13 @@
349
  <div class="row align-items-center">
350
  <div class="col-6 text-center">
351
  <div class="squircle bg-primary justify-content-center">
352
- <i class="fe fe-users fe-32 align-self-center text-white"></i>
353
  </div>
354
  <p>Users</p>
355
  </div>
356
  <div class="col-6 text-center">
357
  <div class="squircle bg-primary justify-content-center">
358
- <i class="fe fe-settings fe-32 align-self-center text-white"></i>
359
  </div>
360
  <p>Settings</p>
361
  </div>
@@ -365,36 +365,6 @@
365
  </div>
366
  </div>
367
  </main> <!-- main -->
368
-
369
- <!-- Modal de Bienvenida -->
370
- <div class="modal fade" id="welcomeModal" tabindex="-1" role="dialog" aria-hidden="true" data-backdrop="true" data-keyboard="true">
371
- <div class="modal-dialog modal-dialog-centered" role="document" style="max-width: 420px;">
372
- <div class="modal-content" style="border-radius: 16px; overflow: hidden; border: none; box-shadow: 0 20px 60px rgba(0,0,0,0.15);">
373
- <!-- Header con gradiente -->
374
- <div style="background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); padding: 2rem; text-align: center;">
375
- <div style="width: 72px; height: 72px; background: rgba(255,255,255,0.2); border-radius: 50%; display: flex; align-items: center; justify-content: center; margin: 0 auto 1rem;">
376
- <i class="fe fe-user" style="font-size: 2rem; color: white;"></i>
377
- </div>
378
- <h4 style="color: white; margin: 0; font-weight: 700;">¡Bienvenido de vuelta!</h4>
379
- </div>
380
- <!-- Cuerpo -->
381
- <div class="modal-body text-center py-4 px-4">
382
- <h5 class="mb-1" style="font-weight: 600; color: #2d3748;">
383
- Hola, <span id="welcomeUsername" style="color: #667eea;"></span> 👋
384
- </h5>
385
- <p class="text-muted mb-0" style="font-size: 0.9rem;">
386
- Has iniciado sesión correctamente en el sistema de diagnóstico de Retinopatía Diabética.
387
- </p>
388
- </div>
389
- <!-- Footer -->
390
- <div class="modal-footer justify-content-center border-0 pt-0 pb-4">
391
- <button type="button" class="btn btn-primary px-5" data-dismiss="modal" style="border-radius: 25px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); border: none;">
392
- Continuar al Dashboard
393
- </button>
394
- </div>
395
- </div>
396
- </div>
397
- </div>
398
  <script src="js/jquery.min.js"></script>
399
  <script src="js/popper.min.js"></script>
400
  <script src="js/moment.min.js"></script>
@@ -415,22 +385,6 @@
415
  api.getSession().catch(() => { window.location.href = 'auth-login.html'; })
416
  .then(r => { if (r && !r.success) window.location.href = 'auth-login.html'; });
417
  </script>
418
- <script>
419
- // Mostrar modal de bienvenida si viene de un login reciente
420
- $(document).ready(function() {
421
- if (sessionStorage.getItem('justLoggedIn') === 'true') {
422
- sessionStorage.removeItem('justLoggedIn');
423
- api.getSession().then(function(response) {
424
- if (response && response.success && response.user) {
425
- $('#welcomeUsername').text(response.user.username);
426
- setTimeout(function() {
427
- $('#welcomeModal').modal('show');
428
- }, 400);
429
- }
430
- });
431
- }
432
- });
433
- </script>
434
  <script src="js/gauge.min.js"></script>
435
  <script src="js/jquery.sparkline.min.js"></script>
436
  <script src="js/apexcharts.min.js"></script>
@@ -928,7 +882,7 @@
928
  $('#recentConsultationsBody').html(`
929
  <tr>
930
  <td colspan="5" class="text-center text-muted">
931
- <i class="fe fe-loader fe-16 spinner"></i> Cargando consultas...
932
  </td>
933
  </tr>
934
  `);
@@ -950,7 +904,7 @@
950
  tbody.append(`
951
  <tr>
952
  <td colspan="5" class="text-center text-muted">
953
- <i class="fe fe-inbox fe-16"></i><br>
954
  No hay consultas recientes
955
  </td>
956
  </tr>
@@ -1051,7 +1005,7 @@
1051
  $('#recentConsultationsBody').html(`
1052
  <tr>
1053
  <td colspan="5" class="text-center text-danger">
1054
- <i class="fe fe-alert-triangle fe-16"></i><br>
1055
  ${message || 'Error al cargar consultas'}
1056
  </td>
1057
  </tr>
@@ -1318,7 +1272,7 @@
1318
  </table>
1319
  </div>
1320
  <small class="text-muted">
1321
- <i class="fe fe-info mr-1"></i>
1322
  Vista alternativa - el gráfico principal no se pudo cargar
1323
  </small>
1324
  </div>
@@ -1342,11 +1296,11 @@
1342
  chartElement.innerHTML = `
1343
  <div class="d-flex justify-content-center align-items-center" style="height: 350px;">
1344
  <div class="text-center text-muted">
1345
- <i class="fe fe-bar-chart-2 fe-48 mb-3"></i>
1346
  <h6>No hay datos disponibles</h6>
1347
  <p class="small">Las consultas aparecerán aquí cuando se registren</p>
1348
  <button class="btn btn-sm btn-outline-primary" onclick="insertSampleData()">
1349
- <i class="fe fe-plus mr-1"></i>Generar datos de prueba
1350
  </button>
1351
  </div>
1352
  </div>
@@ -1364,7 +1318,7 @@
1364
  tbody.append(`
1365
  <tr>
1366
  <td colspan="5" class="text-center text-muted">
1367
- <i class="fe fe-inbox fe-24 mb-2"></i><br>
1368
  No hay análisis recientes
1369
  </td>
1370
  </tr>
@@ -1384,7 +1338,7 @@
1384
  <td>${analysis.prediction.confidence}%</td>
1385
  <td>
1386
  <button class="btn btn-sm btn-outline-primary" onclick="viewAnalysis('${analysis.filename}')">
1387
- <i class="fe fe-eye fe-12"></i>
1388
  </button>
1389
  </td>
1390
  </tr>
@@ -1460,7 +1414,7 @@
1460
  const fileName = $('#imageInput')[0].files[0]?.name || 'imagen_' + Date.now() + '.jpg';
1461
 
1462
  api.predict(imgSrc, fileName).then(function(result) {
1463
- $('#analyzeBtn').prop('disabled', false).html('<i class="fe fe-eye mr-2"></i>Analizar con IA');
1464
 
1465
  if (result && result.success) {
1466
  showAnalysisResults(result);
@@ -1508,7 +1462,7 @@
1508
  $('#systemTestBtn').prop('disabled', true).html('<i class="spinner-border spinner-border-sm mr-2"></i>Probando...');
1509
 
1510
  api.getModelInfo().then(function(result) {
1511
- $('#systemTestBtn').prop('disabled', false).html('<i class="fe fe-refresh-cw fe-16 mr-2"></i>Probar Sistema');
1512
  if (result && result.loaded) {
1513
  showAlert('info', '• Modelo IA: SÍ\n• Base de datos: SÍ');
1514
  } else {
@@ -1823,7 +1777,7 @@
1823
  chartElement.innerHTML = `
1824
  <div class="d-flex justify-content-center align-items-center" style="height: 300px;">
1825
  <div class="text-center text-muted">
1826
- <i class="fe fe-users fe-48 mb-3"></i>
1827
  <h6>No hay datos de edad</h6>
1828
  <p class="small">Los rangos de edad aparecerán cuando haya<br>pacientes con retinopatía diabética</p>
1829
  </div>
@@ -2009,5 +1963,23 @@
2009
  }, 200);
2010
  });
2011
  </script>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2012
  </body>
2013
  </html>
 
9
  <title>Dashboard</title>
10
  <link rel="stylesheet" href="css/simplebar.css">
11
  <link href="https://fonts.googleapis.com/css2?family=Overpass:ital,wght@0,100;0,200;0,300;0,400;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,600;1,700;1,800;1,900&display=swap" rel="stylesheet">
12
+ <script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
13
  <link rel="stylesheet" href="css/select2.css">
14
  <link rel="stylesheet" href="css/dropzone.css">
15
  <link rel="stylesheet" href="css/uppy.min.css">
 
24
  <div class="wrapper">
25
  <nav class="topnav navbar navbar-light">
26
  <button type="button" class="navbar-toggler text-muted mt-2 p-0 mr-3 collapseSidebar">
27
+ <i data-feather="menu" class="navbar-toggler-icon"></i>
28
  </button>
29
 
30
  <ul class="nav">
 
44
  </nav>
45
  <aside class="sidebar-left border-right bg-white shadow" id="leftSidebar" data-simplebar>
46
  <a href="#" class="btn collapseSidebar toggle-btn d-lg-none text-muted ml-2 mt-3" data-toggle="toggle">
47
+ <i data-feather="x"><span class="sr-only"></span></i>
48
  </a>
49
  <nav class="vertnav navbar navbar-light">
50
  <!-- nav bar -->
 
57
  <ul class="navbar-nav flex-fill w-100 mb-2">
58
  <li class="nav-item active">
59
  <a class="nav-link" href="./index.html">
60
+ <i data-feather="home" class="fe-16"></i>
61
  <span class="ml-3 item-text">Dashboard</span>
62
  </a>
63
  </li>
64
  <li class="nav-item">
65
  <a class="nav-link" href="./diagnosis.html">
66
+ <i data-feather="eye" class="fe-16"></i>
67
  <span class="ml-3 item-text">Diagnóstico</span>
68
  </a>
69
  </li>
70
  <li class="nav-item">
71
  <a class="nav-link" href="./patients.html">
72
+ <i data-feather="users" class="fe-16"></i>
73
  <span class="ml-3 item-text">Pacientes</span>
74
  </a>
75
  </li>
76
  <li class="nav-item">
77
  <a class="nav-link" href="./historial-consultas.html">
78
+ <i data-feather="file-text" class="fe-16"></i>
79
  <span class="ml-3 item-text">Consultas</span>
80
  </a>
81
  </li>
82
  <li class="nav-item active">
83
  <a class="nav-link" href="./users.html">
84
+ <i data-feather="user" class="fe-16"></i>
85
  <span class="ml-3 item-text">Usuarios</span>
86
  </a>
87
  </li>
 
99
  <div class="row align-items-center">
100
  <div class="col-3 text-center">
101
  <span class="circle circle-sm bg-primary">
102
+ <i data-feather="users" class="fe-16 text-white"></i>
103
  </span>
104
  </div>
105
  <div class="col pr-0">
 
116
  <div class="row align-items-center">
117
  <div class="col-3 text-center">
118
  <span class="circle circle-sm bg-warning">
119
+ <i data-feather="alert-triangle" class="fe-16 text-white"></i>
120
  </span>
121
  </div>
122
  <div class="col pr-0">
 
133
  <div class="row align-items-center">
134
  <div class="col-3 text-center">
135
  <span class="circle circle-sm bg-success">
136
+ <i data-feather="check" class="fe-16 text-white"></i>
137
  </span>
138
  </div>
139
  <div class="col pr-0">
 
150
  <div class="row align-items-center">
151
  <div class="col-3 text-center">
152
  <span class="circle circle-sm bg-info">
153
+ <i data-feather="percent" class="fe-16 text-white"></i>
154
  </span>
155
  </div>
156
  <div class="col pr-0">
 
182
  <div class="card shadow h-100 mb-4">
183
  <div class="card-header">
184
  <h6 class="card-title mb-0">
185
+ <i data-feather="pie-chart" class="mr-2"></i>
186
  Rangos de Edad con Retinopatía
187
  </h6>
188
  </div>
 
229
  <tbody id="recentConsultationsBody">
230
  <tr>
231
  <td colspan="5" class="text-center text-muted">
232
+ <i data-feather="loader" class="fe-16 spinner"></i> Cargando consultas...
233
  </td>
234
  </tr>
235
  </tbody>
 
255
  <div class="list-group-item bg-transparent">
256
  <div class="row align-items-center">
257
  <div class="col-auto">
258
+ <span data-feather="box" class="fe-24"></span>
259
  </div>
260
  <div class="col">
261
  <small><strong>Package has uploaded successfull</strong></small>
 
267
  <div class="list-group-item bg-transparent">
268
  <div class="row align-items-center">
269
  <div class="col-auto">
270
+ <span data-feather="download" class="fe-24"></span>
271
  </div>
272
  <div class="col">
273
  <small><strong>Widgets are updated successfull</strong></small>
 
279
  <div class="list-group-item bg-transparent">
280
  <div class="row align-items-center">
281
  <div class="col-auto">
282
+ <span data-feather="inbox" class="fe-24"></span>
283
  </div>
284
  <div class="col">
285
  <small><strong>Notifications have been sent</strong></small>
 
291
  <div class="list-group-item bg-transparent">
292
  <div class="row align-items-center">
293
  <div class="col-auto">
294
+ <span data-feather="link" class="fe-24"></span>
295
  </div>
296
  <div class="col">
297
  <small><strong>Link was attached to menu</strong></small>
 
321
  <div class="row align-items-center">
322
  <div class="col-6 text-center">
323
  <div class="squircle bg-success justify-content-center">
324
+ <i data-feather="cpu" class="fe-32 align-self-center text-white"></i>
325
  </div>
326
  <p>Control area</p>
327
  </div>
328
  <div class="col-6 text-center">
329
  <div class="squircle bg-primary justify-content-center">
330
+ <i data-feather="activity" class="fe-32 align-self-center text-white"></i>
331
  </div>
332
  <p>Activity</p>
333
  </div>
 
335
  <div class="row align-items-center">
336
  <div class="col-6 text-center">
337
  <div class="squircle bg-primary justify-content-center">
338
+ <i data-feather="droplet" class="fe-32 align-self-center text-white"></i>
339
  </div>
340
  <p>Droplet</p>
341
  </div>
342
  <div class="col-6 text-center">
343
  <div class="squircle bg-primary justify-content-center">
344
+ <i data-feather="upload-cloud" class="fe-32 align-self-center text-white"></i>
345
  </div>
346
  <p>Upload</p>
347
  </div>
 
349
  <div class="row align-items-center">
350
  <div class="col-6 text-center">
351
  <div class="squircle bg-primary justify-content-center">
352
+ <i data-feather="users" class="fe-32 align-self-center text-white"></i>
353
  </div>
354
  <p>Users</p>
355
  </div>
356
  <div class="col-6 text-center">
357
  <div class="squircle bg-primary justify-content-center">
358
+ <i data-feather="settings" class="fe-32 align-self-center text-white"></i>
359
  </div>
360
  <p>Settings</p>
361
  </div>
 
365
  </div>
366
  </div>
367
  </main> <!-- main -->
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
368
  <script src="js/jquery.min.js"></script>
369
  <script src="js/popper.min.js"></script>
370
  <script src="js/moment.min.js"></script>
 
385
  api.getSession().catch(() => { window.location.href = 'auth-login.html'; })
386
  .then(r => { if (r && !r.success) window.location.href = 'auth-login.html'; });
387
  </script>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
388
  <script src="js/gauge.min.js"></script>
389
  <script src="js/jquery.sparkline.min.js"></script>
390
  <script src="js/apexcharts.min.js"></script>
 
882
  $('#recentConsultationsBody').html(`
883
  <tr>
884
  <td colspan="5" class="text-center text-muted">
885
+ <i data-feather="loader" class="fe-16 spinner"></i> Cargando consultas...
886
  </td>
887
  </tr>
888
  `);
 
904
  tbody.append(`
905
  <tr>
906
  <td colspan="5" class="text-center text-muted">
907
+ <i data-feather="inbox" class="fe-16"></i><br>
908
  No hay consultas recientes
909
  </td>
910
  </tr>
 
1005
  $('#recentConsultationsBody').html(`
1006
  <tr>
1007
  <td colspan="5" class="text-center text-danger">
1008
+ <i data-feather="alert-triangle" class="fe-16"></i><br>
1009
  ${message || 'Error al cargar consultas'}
1010
  </td>
1011
  </tr>
 
1272
  </table>
1273
  </div>
1274
  <small class="text-muted">
1275
+ <i data-feather="info" class="mr-1"></i>
1276
  Vista alternativa - el gráfico principal no se pudo cargar
1277
  </small>
1278
  </div>
 
1296
  chartElement.innerHTML = `
1297
  <div class="d-flex justify-content-center align-items-center" style="height: 350px;">
1298
  <div class="text-center text-muted">
1299
+ <i data-feather="bar-chart-2" class="fe-48 mb-3"></i>
1300
  <h6>No hay datos disponibles</h6>
1301
  <p class="small">Las consultas aparecerán aquí cuando se registren</p>
1302
  <button class="btn btn-sm btn-outline-primary" onclick="insertSampleData()">
1303
+ <i data-feather="plus" class="mr-1"></i>Generar datos de prueba
1304
  </button>
1305
  </div>
1306
  </div>
 
1318
  tbody.append(`
1319
  <tr>
1320
  <td colspan="5" class="text-center text-muted">
1321
+ <i data-feather="inbox" class="fe-24 mb-2"></i><br>
1322
  No hay análisis recientes
1323
  </td>
1324
  </tr>
 
1338
  <td>${analysis.prediction.confidence}%</td>
1339
  <td>
1340
  <button class="btn btn-sm btn-outline-primary" onclick="viewAnalysis('${analysis.filename}')">
1341
+ <i data-feather="eye" class="fe-12"></i>
1342
  </button>
1343
  </td>
1344
  </tr>
 
1414
  const fileName = $('#imageInput')[0].files[0]?.name || 'imagen_' + Date.now() + '.jpg';
1415
 
1416
  api.predict(imgSrc, fileName).then(function(result) {
1417
+ $('#analyzeBtn').prop('disabled', false).html('<i data-feather="eye" class="mr-2"></i>Analizar con IA');
1418
 
1419
  if (result && result.success) {
1420
  showAnalysisResults(result);
 
1462
  $('#systemTestBtn').prop('disabled', true).html('<i class="spinner-border spinner-border-sm mr-2"></i>Probando...');
1463
 
1464
  api.getModelInfo().then(function(result) {
1465
+ $('#systemTestBtn').prop('disabled', false).html('<i data-feather="refresh-cw" class="fe-16 mr-2"></i>Probar Sistema');
1466
  if (result && result.loaded) {
1467
  showAlert('info', '• Modelo IA: SÍ\n• Base de datos: SÍ');
1468
  } else {
 
1777
  chartElement.innerHTML = `
1778
  <div class="d-flex justify-content-center align-items-center" style="height: 300px;">
1779
  <div class="text-center text-muted">
1780
+ <i data-feather="users" class="fe-48 mb-3"></i>
1781
  <h6>No hay datos de edad</h6>
1782
  <p class="small">Los rangos de edad aparecerán cuando haya<br>pacientes con retinopatía diabética</p>
1783
  </div>
 
1963
  }, 200);
1964
  });
1965
  </script>
1966
+ <script>
1967
+ // Feather Icons: reemplaza <i data-feather="X"> con SVG inline
1968
+ // Inmune a problemas de fuentes locales
1969
+ function _initFeather() {
1970
+ if (typeof feather !== 'undefined') feather.replace({ 'stroke-width': 1.8 });
1971
+ }
1972
+ document.addEventListener('DOMContentLoaded', _initFeather);
1973
+ // Re-render al inyectar HTML dinámico (modals, cards, tablas)
1974
+ var _fObserver = new MutationObserver(function(mutations) {
1975
+ var needsRefresh = mutations.some(function(m) {
1976
+ return m.addedNodes.length > 0;
1977
+ });
1978
+ if (needsRefresh) _initFeather();
1979
+ });
1980
+ document.addEventListener('DOMContentLoaded', function() {
1981
+ _fObserver.observe(document.body, { childList: true, subtree: true });
1982
+ });
1983
+ </script>
1984
  </body>
1985
  </html>