Akira-Kurusu commited on
Commit
1271aa0
·
verified ·
1 Parent(s): 034df8d

Update web/historial-consultas.html

Browse files
Files changed (1) hide show
  1. web/historial-consultas.html +67 -84
web/historial-consultas.html CHANGED
@@ -13,7 +13,7 @@
13
  <!-- Fonts CSS -->
14
  <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">
15
  <!-- Icons CSS -->
16
- <link rel="stylesheet" href="css/feather.css">
17
  <link rel="stylesheet" href="css/select2.css">
18
  <link rel="stylesheet" href="css/daterangepicker.css">
19
  <!-- App CSS -->
@@ -26,14 +26,14 @@
26
  <!-- Top Navigation -->
27
  <nav class="topnav navbar navbar-light">
28
  <button type="button" class="navbar-toggler text-muted mt-2 p-0 mr-3 collapseSidebar">
29
- <i class="fe fe-menu navbar-toggler-icon"></i>
30
  </button>
31
 
32
  <ul class="nav">
33
  <!--
34
  <li class="nav-item">
35
  <a class="nav-link text-muted my-2" href="#" id="modeSwitcher" data-mode="light">
36
- <i class="fe fe-sun fe-16"></i>
37
  </a>
38
  </li>
39
  -->
@@ -54,7 +54,7 @@
54
  <!-- Sidebar -->
55
  <aside class="sidebar-left border-right bg-white shadow" id="leftSidebar" data-simplebar>
56
  <a href="#" class="btn collapseSidebar toggle-btn d-lg-none text-muted ml-2 mt-3" data-toggle="toggle">
57
- <i class="fe fe-x"><span class="sr-only"></span></i>
58
  </a>
59
  <nav class="vertnav navbar navbar-light">
60
  <!-- nav bar -->
@@ -68,31 +68,31 @@
68
  <ul class="navbar-nav flex-fill w-100 mb-2">
69
  <li class="nav-item">
70
  <a class="nav-link" href="./index.html">
71
- <i class="fe fe-home fe-16"></i>
72
  <span class="ml-3 item-text">Dashboard</span>
73
  </a>
74
  </li>
75
  <li class="nav-item">
76
  <a class="nav-link" href="./diagnosis.html">
77
- <i class="fe fe-eye fe-16"></i>
78
  <span class="ml-3 item-text">Diagnóstico</span>
79
  </a>
80
  </li>
81
  <li class="nav-item">
82
  <a class="nav-link" href="./patients.html">
83
- <i class="fe fe-users fe-16"></i>
84
  <span class="ml-3 item-text">Pacientes</span>
85
  </a>
86
  </li>
87
  <li class="nav-item active">
88
  <a class="nav-link" href="./historial-consultas.html">
89
- <i class="fe fe-file-text fe-16"></i>
90
  <span class="ml-3 item-text">Consultas</span>
91
  </a>
92
  </li>
93
  <li class="nav-item active">
94
  <a class="nav-link" href="./users.html">
95
- <i class="fe fe-user fe-16"></i>
96
  <span class="ml-3 item-text">Usuarios</span>
97
  </a>
98
  </li>
@@ -113,7 +113,7 @@
113
  </div>
114
  <div class="col-auto">
115
  <button class="btn btn-primary" onclick="refreshConsultations()">
116
- <i class="fe fe-refresh-cw fe-16 mr-2"></i>Actualizar
117
  </button>
118
  </div>
119
  </div>
@@ -126,7 +126,7 @@
126
  <div class="row align-items-center">
127
  <div class="col-3 text-center">
128
  <span class="circle circle-sm bg-primary">
129
- <i class="fe fe-clipboard fe-16 text-white"></i>
130
  </span>
131
  </div>
132
  <div class="col pr-0">
@@ -143,7 +143,7 @@
143
  <div class="row align-items-center">
144
  <div class="col-3 text-center">
145
  <span class="circle circle-sm bg-warning">
146
- <i class="fe fe-alert-triangle fe-16 text-white"></i>
147
  </span>
148
  </div>
149
  <div class="col pr-0">
@@ -160,7 +160,7 @@
160
  <div class="row align-items-center">
161
  <div class="col-3 text-center">
162
  <span class="circle circle-sm bg-success">
163
- <i class="fe fe-check fe-16 text-white"></i>
164
  </span>
165
  </div>
166
  <div class="col pr-0">
@@ -177,7 +177,7 @@
177
  <div class="row align-items-center">
178
  <div class="col-3 text-center">
179
  <span class="circle circle-sm bg-info">
180
- <i class="fe fe-users fe-16 text-white"></i>
181
  </span>
182
  </div>
183
  <div class="col pr-0">
@@ -194,7 +194,7 @@
194
  <div class="card shadow mb-4">
195
  <div class="card-header">
196
  <h6 class="card-title mb-0">
197
- <i class="fe fe-filter mr-2"></i>Filtros y Búsqueda
198
  </h6>
199
  </div>
200
  <div class="card-body">
@@ -230,7 +230,7 @@
230
  <div class="form-group">
231
  <label>&nbsp;</label>
232
  <button type="button" class="btn btn-primary btn-block" onclick="applyFilters()">
233
- <i class="fe fe-search mr-1"></i>Buscar
234
  </button>
235
  </div>
236
  </div>
@@ -242,7 +242,7 @@
242
  <div class="card shadow">
243
  <div class="card-header">
244
  <h6 class="card-title mb-0">
245
- <i class="fe fe-clipboard mr-2"></i>Lista de Consultas
246
  <span class="badge badge-secondary ml-2" id="recordCount">0 registros</span>
247
  </h6>
248
  </div>
@@ -294,11 +294,11 @@
294
 
295
  <!-- Empty State -->
296
  <div id="emptyState" class="text-center py-5" style="display: none;">
297
- <i class="fe fe-inbox fe-48 text-muted mb-3"></i>
298
  <h6 class="text-muted">No se encontraron consultas</h6>
299
  <p class="text-muted">No hay consultas que coincidan con los filtros seleccionados.</p>
300
  <button class="btn btn-outline-primary" onclick="clearFilters()">
301
- <i class="fe fe-refresh-cw mr-1"></i>Limpiar Filtros
302
  </button>
303
  </div>
304
  </div>
@@ -315,7 +315,7 @@
315
  <div class="modal-content">
316
  <div class="modal-header">
317
  <h5 class="modal-title" id="consultationModalLabel">
318
- <i class="fe fe-eye mr-2"></i>Detalles de Consulta
319
  </h5>
320
  <button type="button" class="close" data-dismiss="modal" aria-label="Close">
321
  <span aria-hidden="true">&times;</span>
@@ -327,7 +327,7 @@
327
  <div class="modal-footer">
328
  <button type="button" class="btn btn-secondary" data-dismiss="modal">Cerrar</button>
329
  <button type="button" class="btn btn-danger" id="deleteConsultationBtn" onclick="deleteConsultation()">
330
- <i class="fe fe-trash-2 mr-1"></i>Eliminar
331
  </button>
332
  </div>
333
  </div>
@@ -505,12 +505,12 @@
505
  <button class="btn btn-sm btn-outline-primary"
506
  onclick="viewConsultationDetails(${consultation.consultationID})"
507
  title="Ver detalles">
508
- <i class="fe fe-eye fe-12"></i>
509
  </button>
510
  <button class="btn btn-sm btn-outline-danger"
511
  onclick="confirmDeleteConsultation(${consultation.consultationID})"
512
  title="Eliminar">
513
- <i class="fe fe-trash-2 fe-12"></i>
514
  </button>
515
  </div>
516
  </td>
@@ -534,7 +534,7 @@
534
  container.append(`
535
  <li class="page-item ${prevDisabled}">
536
  <a class="page-link" href="#" onclick="changePage(${pagination.current_page - 1})" ${prevDisabled ? 'tabindex="-1"' : ''}>
537
- <i class="fe fe-chevron-left"></i>
538
  </a>
539
  </li>
540
  `);
@@ -582,7 +582,7 @@
582
  container.append(`
583
  <li class="page-item ${nextDisabled}">
584
  <a class="page-link" href="#" onclick="changePage(${pagination.current_page + 1})" ${nextDisabled ? 'tabindex="-1"' : ''}>
585
- <i class="fe fe-chevron-right"></i>
586
  </a>
587
  </li>
588
  `);
@@ -600,33 +600,14 @@
600
  console.log(`Viendo detalles de consulta: ${consultationId}`);
601
  currentConsultationId = consultationId;
602
 
603
- // Mostrar loading en el modal mientras carga
604
- $('#consultationModalBody').html(`
605
- <div class="text-center py-4">
606
- <div class="spinner-border text-primary" role="status"></div>
607
- <p class="text-muted mt-2">Cargando detalles...</p>
608
- </div>
609
- `);
610
- $('#consultationModal').modal('show');
611
-
612
- api.getConsultation(consultationId).then(function(response) {
613
- if (response && response.success) {
614
- renderConsultationModal(response.consultation, response.consultation.riskFactors || []);
615
  } else {
616
- $('#consultationModalBody').html(`
617
- <div class="alert alert-danger">
618
- <i class="fe fe-alert-circle mr-2"></i>
619
- ${response?.message || 'No se pudo cargar la consulta.'}
620
- </div>
621
- `);
622
  }
623
- }).catch(function() {
624
- $('#consultationModalBody').html(`
625
- <div class="alert alert-danger">
626
- <i class="fe fe-alert-circle mr-2"></i>
627
- Error de conexión al cargar la consulta.
628
- </div>
629
- `);
630
  });
631
  }
632
 
@@ -640,9 +621,9 @@
640
  new Date(consultation.consultationDate).toLocaleString('es-ES') : 'N/A';
641
 
642
  const confidence = consultation.confidence ?
643
- `${parseFloat(consultation.confidence).toFixed(1)}%` : 'N/A';
644
 
645
- // Calcular edad
646
  let age = 'N/A';
647
  if (consultation.birthDate) {
648
  try {
@@ -654,13 +635,11 @@
654
  age--;
655
  }
656
  age += ' años';
657
- } catch (e) { age = 'N/A'; }
 
 
658
  }
659
 
660
- // Género legible
661
- const genderMap = { 'M': 'Masculino', 'F': 'Femenino' };
662
- const genderText = genderMap[consultation.gender] || consultation.gender || 'N/A';
663
-
664
  // Factores de riesgo
665
  let riskFactorsHtml = '';
666
  if (riskFactors && riskFactors.length > 0) {
@@ -668,24 +647,19 @@
668
  `<span class="badge badge-secondary mr-1 mb-1">${rf.name}</span>`
669
  ).join('');
670
  } else {
671
- riskFactorsHtml = '<span class="text-muted small">Sin factores de riesgo registrados</span>';
672
  }
673
 
674
- // Badge del doctor que registró la consulta
675
- const doctorBadge = consultation.doctorName
676
- ? `<span class="badge badge-info ml-1">${consultation.doctorName}</span>`
677
- : '';
678
-
679
  const modalContent = `
680
  <div class="row">
681
  <div class="col-md-6">
682
  <h6 class="mb-3">
683
- <i class="fe fe-user mr-2"></i>Información del Paciente
684
  </h6>
685
  <table class="table table-sm">
686
  <tr>
687
  <td><strong>Nombre:</strong></td>
688
- <td>${consultation.patientName || 'N/A'}</td>
689
  </tr>
690
  <tr>
691
  <td><strong>Edad:</strong></td>
@@ -693,7 +667,7 @@
693
  </tr>
694
  <tr>
695
  <td><strong>Género:</strong></td>
696
- <td>${genderText}</td>
697
  </tr>
698
  <tr>
699
  <td><strong>Tipo Diabetes:</strong></td>
@@ -703,7 +677,7 @@
703
  </div>
704
  <div class="col-md-6">
705
  <h6 class="mb-3">
706
- <i class="fe fe-clipboard mr-2"></i>Información de la Consulta
707
  </h6>
708
  <table class="table table-sm">
709
  <tr>
@@ -719,16 +693,16 @@
719
  <td>${confidence}</td>
720
  </tr>
721
  <tr>
722
- <td><strong>Doctor:</strong></td>
723
- <td>${doctorBadge || 'N/A'}</td>
724
  </tr>
725
  </table>
726
  </div>
727
  </div>
728
 
729
- <div class="row mt-3">
730
  <div class="col-12">
731
- <div class="alert ${resultClass} d-flex align-items-center mb-0">
732
  <i class="fe ${resultIcon} fe-24 mr-3"></i>
733
  <div>
734
  <h6 class="mb-1">${resultText}</h6>
@@ -738,24 +712,15 @@
738
  </div>
739
  </div>
740
 
741
- <div class="row mt-3">
742
- <div class="col-12">
743
- <h6 class="mb-2">
744
- <i class="fe fe-shield mr-2"></i>Factores de Riesgo del Paciente
745
- </h6>
746
- <div>${riskFactorsHtml}</div>
747
- </div>
748
- </div>
749
-
750
  ${consultation.notes ? `
751
- <div class="row mt-3">
752
  <div class="col-12">
753
  <h6 class="mb-2">
754
- <i class="fe fe-edit-2 mr-2"></i>Notas de la Consulta
755
  </h6>
756
  <div class="card bg-light">
757
- <div class="card-body py-2">
758
- <p class="mb-0 small">${consultation.notes}</p>
759
  </div>
760
  </div>
761
  </div>
@@ -986,5 +951,23 @@
986
 
987
  <!-- App scripts -->
988
  <script src="js/apps.js"></script>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
989
  </body>
990
  </html>
 
13
  <!-- Fonts CSS -->
14
  <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">
15
  <!-- Icons CSS -->
16
+ <script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
17
  <link rel="stylesheet" href="css/select2.css">
18
  <link rel="stylesheet" href="css/daterangepicker.css">
19
  <!-- App CSS -->
 
26
  <!-- Top Navigation -->
27
  <nav class="topnav navbar navbar-light">
28
  <button type="button" class="navbar-toggler text-muted mt-2 p-0 mr-3 collapseSidebar">
29
+ <i data-feather="menu" class="navbar-toggler-icon"></i>
30
  </button>
31
 
32
  <ul class="nav">
33
  <!--
34
  <li class="nav-item">
35
  <a class="nav-link text-muted my-2" href="#" id="modeSwitcher" data-mode="light">
36
+ <i data-feather="sun" class="fe-16"></i>
37
  </a>
38
  </li>
39
  -->
 
54
  <!-- Sidebar -->
55
  <aside class="sidebar-left border-right bg-white shadow" id="leftSidebar" data-simplebar>
56
  <a href="#" class="btn collapseSidebar toggle-btn d-lg-none text-muted ml-2 mt-3" data-toggle="toggle">
57
+ <i data-feather="x"><span class="sr-only"></span></i>
58
  </a>
59
  <nav class="vertnav navbar navbar-light">
60
  <!-- nav bar -->
 
68
  <ul class="navbar-nav flex-fill w-100 mb-2">
69
  <li class="nav-item">
70
  <a class="nav-link" href="./index.html">
71
+ <i data-feather="home" class="fe-16"></i>
72
  <span class="ml-3 item-text">Dashboard</span>
73
  </a>
74
  </li>
75
  <li class="nav-item">
76
  <a class="nav-link" href="./diagnosis.html">
77
+ <i data-feather="eye" class="fe-16"></i>
78
  <span class="ml-3 item-text">Diagnóstico</span>
79
  </a>
80
  </li>
81
  <li class="nav-item">
82
  <a class="nav-link" href="./patients.html">
83
+ <i data-feather="users" class="fe-16"></i>
84
  <span class="ml-3 item-text">Pacientes</span>
85
  </a>
86
  </li>
87
  <li class="nav-item active">
88
  <a class="nav-link" href="./historial-consultas.html">
89
+ <i data-feather="file-text" class="fe-16"></i>
90
  <span class="ml-3 item-text">Consultas</span>
91
  </a>
92
  </li>
93
  <li class="nav-item active">
94
  <a class="nav-link" href="./users.html">
95
+ <i data-feather="user" class="fe-16"></i>
96
  <span class="ml-3 item-text">Usuarios</span>
97
  </a>
98
  </li>
 
113
  </div>
114
  <div class="col-auto">
115
  <button class="btn btn-primary" onclick="refreshConsultations()">
116
+ <i data-feather="refresh-cw" class="fe-16 mr-2"></i>Actualizar
117
  </button>
118
  </div>
119
  </div>
 
126
  <div class="row align-items-center">
127
  <div class="col-3 text-center">
128
  <span class="circle circle-sm bg-primary">
129
+ <i data-feather="clipboard" class="fe-16 text-white"></i>
130
  </span>
131
  </div>
132
  <div class="col pr-0">
 
143
  <div class="row align-items-center">
144
  <div class="col-3 text-center">
145
  <span class="circle circle-sm bg-warning">
146
+ <i data-feather="alert-triangle" class="fe-16 text-white"></i>
147
  </span>
148
  </div>
149
  <div class="col pr-0">
 
160
  <div class="row align-items-center">
161
  <div class="col-3 text-center">
162
  <span class="circle circle-sm bg-success">
163
+ <i data-feather="check" class="fe-16 text-white"></i>
164
  </span>
165
  </div>
166
  <div class="col pr-0">
 
177
  <div class="row align-items-center">
178
  <div class="col-3 text-center">
179
  <span class="circle circle-sm bg-info">
180
+ <i data-feather="users" class="fe-16 text-white"></i>
181
  </span>
182
  </div>
183
  <div class="col pr-0">
 
194
  <div class="card shadow mb-4">
195
  <div class="card-header">
196
  <h6 class="card-title mb-0">
197
+ <i data-feather="filter" class="mr-2"></i>Filtros y Búsqueda
198
  </h6>
199
  </div>
200
  <div class="card-body">
 
230
  <div class="form-group">
231
  <label>&nbsp;</label>
232
  <button type="button" class="btn btn-primary btn-block" onclick="applyFilters()">
233
+ <i data-feather="search" class="mr-1"></i>Buscar
234
  </button>
235
  </div>
236
  </div>
 
242
  <div class="card shadow">
243
  <div class="card-header">
244
  <h6 class="card-title mb-0">
245
+ <i data-feather="clipboard" class="mr-2"></i>Lista de Consultas
246
  <span class="badge badge-secondary ml-2" id="recordCount">0 registros</span>
247
  </h6>
248
  </div>
 
294
 
295
  <!-- Empty State -->
296
  <div id="emptyState" class="text-center py-5" style="display: none;">
297
+ <i data-feather="inbox" class="fe-48 text-muted mb-3"></i>
298
  <h6 class="text-muted">No se encontraron consultas</h6>
299
  <p class="text-muted">No hay consultas que coincidan con los filtros seleccionados.</p>
300
  <button class="btn btn-outline-primary" onclick="clearFilters()">
301
+ <i data-feather="refresh-cw" class="mr-1"></i>Limpiar Filtros
302
  </button>
303
  </div>
304
  </div>
 
315
  <div class="modal-content">
316
  <div class="modal-header">
317
  <h5 class="modal-title" id="consultationModalLabel">
318
+ <i data-feather="eye" class="mr-2"></i>Detalles de Consulta
319
  </h5>
320
  <button type="button" class="close" data-dismiss="modal" aria-label="Close">
321
  <span aria-hidden="true">&times;</span>
 
327
  <div class="modal-footer">
328
  <button type="button" class="btn btn-secondary" data-dismiss="modal">Cerrar</button>
329
  <button type="button" class="btn btn-danger" id="deleteConsultationBtn" onclick="deleteConsultation()">
330
+ <i data-feather="trash-2" class="mr-1"></i>Eliminar
331
  </button>
332
  </div>
333
  </div>
 
505
  <button class="btn btn-sm btn-outline-primary"
506
  onclick="viewConsultationDetails(${consultation.consultationID})"
507
  title="Ver detalles">
508
+ <i data-feather="eye" class="fe-12"></i>
509
  </button>
510
  <button class="btn btn-sm btn-outline-danger"
511
  onclick="confirmDeleteConsultation(${consultation.consultationID})"
512
  title="Eliminar">
513
+ <i data-feather="trash-2" class="fe-12"></i>
514
  </button>
515
  </div>
516
  </td>
 
534
  container.append(`
535
  <li class="page-item ${prevDisabled}">
536
  <a class="page-link" href="#" onclick="changePage(${pagination.current_page - 1})" ${prevDisabled ? 'tabindex="-1"' : ''}>
537
+ <i data-feather="chevron-left"></i>
538
  </a>
539
  </li>
540
  `);
 
582
  container.append(`
583
  <li class="page-item ${nextDisabled}">
584
  <a class="page-link" href="#" onclick="changePage(${pagination.current_page + 1})" ${nextDisabled ? 'tabindex="-1"' : ''}>
585
+ <i data-feather="chevron-right"></i>
586
  </a>
587
  </li>
588
  `);
 
600
  console.log(`Viendo detalles de consulta: ${consultationId}`);
601
  currentConsultationId = consultationId;
602
 
603
+ api.getConsultations(1, 100).then(function(response) {
604
+ const consultation = (response.consultations || []).find(c => c.consultationID === consultationId);
605
+ if (consultation) {
606
+ renderConsultationModal(consultation, []);
607
+ $('#consultationModal').modal('show');
 
 
 
 
 
 
 
608
  } else {
609
+ showAlert('error', 'Consulta no encontrada');
 
 
 
 
 
610
  }
 
 
 
 
 
 
 
611
  });
612
  }
613
 
 
621
  new Date(consultation.consultationDate).toLocaleString('es-ES') : 'N/A';
622
 
623
  const confidence = consultation.confidence ?
624
+ `${consultation.confidence.toFixed(1)}%` : 'N/A';
625
 
626
+ // Calcular edad si hay fecha de nacimiento
627
  let age = 'N/A';
628
  if (consultation.birthDate) {
629
  try {
 
635
  age--;
636
  }
637
  age += ' años';
638
+ } catch (e) {
639
+ age = 'N/A';
640
+ }
641
  }
642
 
 
 
 
 
643
  // Factores de riesgo
644
  let riskFactorsHtml = '';
645
  if (riskFactors && riskFactors.length > 0) {
 
647
  `<span class="badge badge-secondary mr-1 mb-1">${rf.name}</span>`
648
  ).join('');
649
  } else {
650
+ riskFactorsHtml = '<span class="text-muted">No se han registrado factores de riesgo</span>';
651
  }
652
 
 
 
 
 
 
653
  const modalContent = `
654
  <div class="row">
655
  <div class="col-md-6">
656
  <h6 class="mb-3">
657
+ <i data-feather="user" class="mr-2"></i>Información del Paciente
658
  </h6>
659
  <table class="table table-sm">
660
  <tr>
661
  <td><strong>Nombre:</strong></td>
662
+ <td>${consultation.patientName || consultation.patient_name || 'N/A'}</td>
663
  </tr>
664
  <tr>
665
  <td><strong>Edad:</strong></td>
 
667
  </tr>
668
  <tr>
669
  <td><strong>Género:</strong></td>
670
+ <td>${consultation.gender || 'N/A'}</td>
671
  </tr>
672
  <tr>
673
  <td><strong>Tipo Diabetes:</strong></td>
 
677
  </div>
678
  <div class="col-md-6">
679
  <h6 class="mb-3">
680
+ <i data-feather="clipboard" class="mr-2"></i>Información de la Consulta
681
  </h6>
682
  <table class="table table-sm">
683
  <tr>
 
693
  <td>${confidence}</td>
694
  </tr>
695
  <tr>
696
+ <td><strong>Imagen:</strong></td>
697
+ <td>${consultation.imagePath || 'N/A'}</td>
698
  </tr>
699
  </table>
700
  </div>
701
  </div>
702
 
703
+ <div class="row mt-4">
704
  <div class="col-12">
705
+ <div class="alert ${resultClass} d-flex align-items-center">
706
  <i class="fe ${resultIcon} fe-24 mr-3"></i>
707
  <div>
708
  <h6 class="mb-1">${resultText}</h6>
 
712
  </div>
713
  </div>
714
 
 
 
 
 
 
 
 
 
 
715
  ${consultation.notes ? `
716
+ <div class="row">
717
  <div class="col-12">
718
  <h6 class="mb-2">
719
+ <i data-feather="edit-2" class="mr-2"></i>Notas de la Consulta
720
  </h6>
721
  <div class="card bg-light">
722
+ <div class="card-body">
723
+ <p class="mb-0">${consultation.notes}</p>
724
  </div>
725
  </div>
726
  </div>
 
951
 
952
  <!-- App scripts -->
953
  <script src="js/apps.js"></script>
954
+ <script>
955
+ // Feather Icons: reemplaza <i data-feather="X"> con SVG inline
956
+ // Inmune a problemas de fuentes locales
957
+ function _initFeather() {
958
+ if (typeof feather !== 'undefined') feather.replace({ 'stroke-width': 1.8 });
959
+ }
960
+ document.addEventListener('DOMContentLoaded', _initFeather);
961
+ // Re-render al inyectar HTML dinámico (modals, cards, tablas)
962
+ var _fObserver = new MutationObserver(function(mutations) {
963
+ var needsRefresh = mutations.some(function(m) {
964
+ return m.addedNodes.length > 0;
965
+ });
966
+ if (needsRefresh) _initFeather();
967
+ });
968
+ document.addEventListener('DOMContentLoaded', function() {
969
+ _fObserver.observe(document.body, { childList: true, subtree: true });
970
+ });
971
+ </script>
972
  </body>
973
  </html>