From d2567d35b610b63e6dabcbfeb0ebeb8538bab98c Mon Sep 17 00:00:00 2001
From: AdalbertoCV <34152734@uaz.edu.mx>
Date: Mon, 14 Oct 2024 13:28:44 -0600
Subject: [PATCH] recuperar reporte por id, o enviando variables individuales +
Primera parte de tabla de usuarios
---
cosiap_api/dynamic_tables/views.py | 48 +-
cosiap_frontend/src/App.css | 809 ++++++++++++++++++
cosiap_frontend/src/App.jsx | 3 +-
cosiap_frontend/src/api.js | 2 +-
.../src/components/admin/TablaUsuarios.jsx | 31 +-
.../common/utility/RenderElementEdit.jsx | 2 +-
.../common/utility/RenderElementView.jsx | 2 +-
.../common/utility/RenderElemento.jsx | 2 +-
.../common/utility/ReusableTable.css | 32 -
.../common/utility/ReusableTable.jsx | 2 +-
.../components/modalidades/CrearModalidad.css | 266 ------
.../components/modalidades/CrearModalidad.jsx | 2 +-
.../modalidades/EditarModalidad.jsx | 2 +-
.../modalidades/ListaModalidades.jsx | 2 +-
.../src/components/modalidades/Modalidad.css | 412 ---------
.../src/components/modalidades/Modalidad.jsx | 2 +-
.../solicitudes/EditarSolicitud.jsx | 2 +-
.../solicitudes/HistorialSolicitudes.css | 44 -
.../solicitudes/HistorialSolicitudes.jsx | 2 +-
.../components/solicitudes/VerSolicitud.jsx | 2 +-
20 files changed, 897 insertions(+), 772 deletions(-)
delete mode 100644 cosiap_frontend/src/components/common/utility/ReusableTable.css
delete mode 100644 cosiap_frontend/src/components/modalidades/CrearModalidad.css
delete mode 100644 cosiap_frontend/src/components/modalidades/Modalidad.css
delete mode 100644 cosiap_frontend/src/components/solicitudes/HistorialSolicitudes.css
diff --git a/cosiap_api/dynamic_tables/views.py b/cosiap_api/dynamic_tables/views.py
index 8d5640b..b5d74cd 100644
--- a/cosiap_api/dynamic_tables/views.py
+++ b/cosiap_api/dynamic_tables/views.py
@@ -58,11 +58,41 @@ class DynamicTableAPIView(BasePermissionAPIView):
return instance
def get_configuracion_reporte(self, request):
+ '''
+ Creamos la configuración enviando los parámetros desde query params
+ '''
+ self.model_name = request.query_params.get('model_name', None)
+ self.columns = request.query_params.get('columns', [])
+ self.filters = self.parse_json_param(request.query_params.get('filters', '{}'))
+ self.exclude_columns = request.query_params.get('exclude_columns', [])
+ self.exclude_filters = self.parse_json_param(request.query_params.get('exclude_filters', '{}'))
+ self.search_query = request.query_params.get('search_query', '')
+
+ reporte = DynamicTableReport.objects.create(
+ model_name=self.model_name,
+ columns=self.columns,
+ filters=self.filters,
+ exclude_columns=self.exclude_columns,
+ exclude_filters=self.exclude_filters,
+ search_query=self.search_query
+ )
+
+ return reporte
+
+ def parse_json_param(self, param):
+ '''Convierte un string JSON a un diccionario, si es posible.'''
+ try:
+ import json
+ return json.loads(param)
+ except (ValueError, TypeError):
+ return {}
+
+
+ def get_configuracion_reporte_id(self, request, reporte_id=None):
'''
Crear una configuración con los datos actuales de la request, sobrescribiendo los predeterminados si se proporcionan.
'''
try:
- reporte_id = request.query_params.get('reporte_id', None)
if reporte_id:
reporte_data = DynamicTableReport.objects.get(id=reporte_id)
self.model_name = reporte_data.model_name
@@ -123,7 +153,13 @@ class DynamicTableAPIView(BasePermissionAPIView):
return Response(response_data, status = status.HTTP_400_BAD_REQUEST)
try:
if user.is_staff:
- configuracion_reporte = self.get_configuracion_reporte(request)
+ reporte_id = request.query_params.get('reporte_id', None)
+ if reporte_id:
+ configuracion_reporte = self.get_configuracion_reporte_id(request, reporte_id)
+ elif any(key in request.query_params for key in ['columns', 'filters', 'exclude_columns', 'exclude_filters', 'search_query']):
+ configuracion_reporte = self.get_configuracion_reporte(request)
+ else:
+ configuracion_reporte = self.get_configuracion_reporte_id(request)
if self.dynamic_form_exist:
serializer = DynamicTableDynamicForm(instance=configuracion_reporte, model_class=self.model_class)
else:
@@ -165,7 +201,13 @@ class DynamicTableAPIView(BasePermissionAPIView):
register_updates = request.data.get('register_updates', {})
# Extraer la configuración, o si no fue enviada asignamos la predeterminada
- configuracion = self.get_configuracion_reporte(request)
+ reporte_id = request.query_params.get('reporte_id', None)
+ if reporte_id:
+ configuracion = self.get_configuracion_reporte_id(request, reporte_id)
+ elif any(key in request.query_params for key in ['columns', 'filters', 'exclude_columns', 'exclude_filters', 'search_query']):
+ configuracion = self.get_configuracion_reporte(request)
+ else:
+ configuracion = self.get_configuracion_reporte_id(request)
if self.dynamic_form_exist:
serializer = DynamicTableDynamicForm(instance=configuracion,model_class=self.model_class)
else:
diff --git a/cosiap_frontend/src/App.css b/cosiap_frontend/src/App.css
index 5f67fab..695f37c 100644
--- a/cosiap_frontend/src/App.css
+++ b/cosiap_frontend/src/App.css
@@ -1,3 +1,812 @@
body {
background: var(--pagina-fondo);
+}
+
+/* Estilo para los estados */
+.estado-label {
+ padding: 5px 10px;
+ border-radius: 8px;
+ color: white;
+ font-weight: bold;
+ display: inline-block;
+ text-align: center;
+ min-width: 100px;
+}
+
+.estado-aprobado {
+ background-color: rgb(126, 233, 126);
+}
+
+.estado-rechazado {
+ background-color: rgb(223, 91, 91);
+}
+
+.estado-pendiente {
+ background-color: rgb(109, 163, 216);
+ color: black;
+}
+
+
+.button-ver{
+ background-color: grey;
+ color: white;
+ padding: 5px 10px;
+ border-radius: 5px;
+ margin-right: 10px;
+ border: none;
+ cursor: pointer;
+}
+
+.button-editar{
+ background-color: brown;
+ color: white;
+ padding: 5px 10px;
+ border-radius: 5px;
+ margin-right: 10px;
+ border: none;
+ cursor: pointer;
+}
+
+/* Estilos para el card blanco */
+.white-card {
+ background-color: white;
+ padding: 20px;
+ border-radius: 8px;
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
+ margin-bottom: 20px;
+}
+
+/* Estilos para las filas del formulario */
+.form-row {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: space-between;
+ margin-bottom: 15px;
+}
+
+.form-group {
+ flex: 1;
+ margin-right: 15px;
+ margin-bottom: 15px;
+}
+
+.form-group label {
+ display: block;
+ font-weight: bold;
+ margin-bottom: 5px;
+}
+
+.form-group input,
+.form-group textarea,
+.form-group select {
+ width: 100%;
+ padding: 8px;
+ border: 1px solid #ccc;
+ border-radius: 4px;
+ font-size: 16px;
+}
+
+.form-group input[type="file"] {
+ padding: 0;
+}
+
+textarea {
+ resize: vertical;
+}
+
+/* Estilos para secciones */
+.section {
+ background-color: #f9f9f9;
+ padding: 15px;
+ margin-bottom: 20px;
+ border-radius: 8px;
+ border: 1px solid #ddd;
+}
+
+/* Estilos para elementos */
+.element {
+ background-color: #f2f2f2;
+ padding: 10px;
+ margin-bottom: 10px;
+ border-radius: 6px;
+ border: 1px solid #ccc;
+}
+
+/* Estilos para opciones */
+.option {
+ background-color: #e9e9e9;
+ padding: 8px;
+ margin-bottom: 8px;
+ border-radius: 4px;
+ border: 1px solid #bbb;
+}
+
+/* Botones */
+.add-button {
+ background-color: #696d69;
+ color: white;
+ border: none;
+ padding: 8px 12px;
+ font-size: 14px;
+ border-radius: 16px;
+ cursor: pointer;
+ margin-top: 10px;
+ margin-right: 10px;
+}
+
+.add-button:hover {
+ background-color: #45a049;
+}
+
+.delete-button {
+ background-color: #f44336;
+ color: white;
+ border: none;
+ padding: 8px 12px;
+ font-size: 14px;
+ border-radius: 16px;
+ cursor: pointer;
+ margin-top: 10px;
+ margin-right: 10px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.delete-button i {
+ font-size: 16px; /* Ajusta el tamaño del ícono */
+}
+
+.delete-button:hover {
+ background-color: #e53935;
+}
+
+/* Botón de envío */
+.submit-button {
+ background-color: #4fb659;
+ color: white;
+ padding: 10px 20px;
+ font-size: 14px;
+ border: none;
+ border-radius: 16px;
+ cursor: pointer;
+ font-style: oblique;
+ margin-top: 20px;
+}
+
+.submit-button:hover {
+ background-color: #19d2b0;
+}
+
+/* Checkbox más pequeño */
+input[type="checkbox"] {
+ width: 20px;
+ height: 20px;
+ cursor: pointer;
+ margin-right: 10px;
+}
+
+
+.subtitle-text {
+ font-size: 20px;
+ color: #c65f5f;
+}
+
+.subtitle-text-1 {
+ font-size: 18px;
+ color: #752323;
+}
+
+.subtitle-text-2 {
+ font-size: 16px;
+ color: #9e5f5f;
+}
+
+/* Ajustar márgenes y tamaño del texto en etiquetas */
+.form-group label {
+ font-size: 16px;
+ color: #333;
+ margin-bottom: 8px;
+}
+
+.button-container {
+ display: flex;
+ justify-content: space-between;
+ margin-top: 20px;
+ padding: 0 20px;
+}
+
+.preview-image {
+ width: 100px;
+ height: 100px;
+ object-fit: cover;
+ border: 1px solid #ccc;
+ margin-top: 10px;
+}
+
+.card {
+ border: 1px solid #ddd;
+ border-radius: 5px;
+ margin: 15px 0;
+ padding: 10px;
+ background-color: #f5f5f5;
+}
+
+.element-card {
+ border: 1px solid #ddd;
+ border-radius: 5px;
+ margin: 15px 0;
+ padding: 10px;
+ background-color: #adacac;
+}
+
+.element-card-header{
+ font-weight: bold;
+}
+
+.element-card-body{
+ padding: 10px;
+}
+
+.card-header {
+ font-weight: bold;
+}
+
+.card-body {
+ padding: 10px;
+}
+
+.option-card {
+ margin-left: 20px;
+ border: 1px solid #bbb;
+ padding: 5px;
+ border-radius: 5px;
+ background-color: #e9e9e9;
+}
+
+.form-row {
+ display: flex;
+ align-items: center; /* Alinea los elementos al centro verticalmente */
+ gap: 10px; /* Espacio entre los elementos */
+ height: auto; /* Asegúrate de que la altura del contenedor sea flexible */
+}
+
+.form-row label {
+ flex-shrink: 0; /* Evita que el label se encoja */
+}
+
+.form-row input {
+ flex: 1; /* Hace que el input ocupe el espacio disponible */
+}
+
+.element-row {
+ display: flex;
+ align-items: center;
+ justify-content: space-between; /* Para que el input esté a la izquierda y los botones a la derecha */
+ gap: 10px; /* Espacio entre el input y los botones */
+ width: 100%; /* Asegura que ocupe todo el ancho disponible */
+}
+
+.element-input {
+width: 100%;
+padding: 8px;
+border: 1px solid #ccc;
+border-radius: 4px;
+font-size: 16px;
+}
+
+.element-buttons {
+ display: flex;
+ gap: 5px; /* Espacio entre los botones */
+}
+
+.form-row input,
+.form-row button,
+.form-row label {
+ line-height: normal; /* Asegura que todos los elementos tengan una línea de texto coherente */
+ padding: 8px; /* Ajusta el padding para que sea igual en todos los elementos */
+ height: auto; /* Permite que los elementos ajusten su altura automáticamente */
+ font-size: 15px; /* Asegura que todos tengan el mismo tamaño de fuente */
+ font-style:normal;
+}
+
+.form-row input {
+ flex: 1; /* Hace que el input crezca según el espacio disponible */
+}
+
+/* Estilos generales para inputs */
+.input-class,
+.textarea-class,
+.select-class,
+.date-input-class,
+.time-input-class,
+.file-input-class {
+ width: 100%;
+ padding: 10px;
+ color: rgb(0, 0, 0);
+ margin: 10px 0;
+ font-size: 16px;
+ border: 2px solid #555; /* Aumentamos el grosor y un color más oscuro */
+ border-radius: 4px;
+ box-sizing: border-box;
+ transition: border-color 0.3s ease;
+}
+
+/* Efecto de enfoque (focus) para resaltarlos cuando el usuario interactúe */
+.input-class:focus,
+.textarea-class:focus,
+.select-class:focus,
+.date-input-class:focus,
+.time-input-class:focus,
+.file-input-class:focus {
+ border-color: #4CAF50; /* Cambia el color del borde al interactuar */
+ outline: none; /* Elimina el borde por defecto del navegador */
+ box-shadow: 0 0 5px rgba(76, 175, 80, 0.5); /* Efecto sutil de sombra verde */
+}
+
+/* Estilos para el textarea */
+.textarea-class {
+ height: 150px;
+ resize: vertical;
+}
+
+/* Estilos para los select */
+.select-class {
+ height: 40px;
+ background-color: white;
+}
+
+/* Grupo de casillas: Mantener una distribución compacta */
+.checkbox-group {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 10px; /* Espacio entre las casillas */
+}
+
+/* Etiquetas de las casillas */
+.checkbox-label {
+ display: flex;
+ align-items: center;
+ margin-right: 15px;
+ font-size: 16px; /* Tamaño de texto estándar */
+}
+
+/* Estilo personalizado para el checkbox */
+.checkbox-label input[type="checkbox"] {
+ width: 20px; /* Tamaño del checkbox */
+ height: 20px; /* Tamaño del checkbox */
+ margin-right: 5px; /* Espacio entre la casilla y el texto */
+ cursor: pointer;
+ border: 2px solid #333; /* Borde visible */
+ border-radius: 4px; /* Esquinas redondeadas */
+ appearance: none; /* Eliminar el estilo por defecto del navegador */
+ position: relative;
+}
+
+/* Estilo cuando está seleccionado */
+.checkbox-label input[type="checkbox"]:checked {
+ background-color: #333; /* Fondo oscuro cuando está seleccionado */
+}
+
+/* Agregar un pseudo-elemento para el 'checkmark' */
+.checkbox-label input[type="checkbox"]:checked::after {
+ color: white;
+ font-size: 14px;
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ transform: translate(-50%, -50%);
+}
+
+
+/* Estilos para el input de archivo */
+.file-input-class {
+ cursor: pointer;
+}
+
+/* Estilos para la fecha y hora */
+.date-input-class,
+.time-input-class {
+ max-width: 200px;
+}
+
+/* Estilo para el separador */
+.separator-class {
+ border: 0;
+ height: 1px;
+ background: #e0e0e0;
+ margin: 20px 0;
+}
+
+
+/* Contenedor principal */
+.container {
+ width: 100%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ padding: 20px;
+ background-color: #f9f9f9;
+ border-radius: 45px;
+ margin-top: 20px;
+ }
+
+ /* Sección de la imagen y título */
+ .image-container {
+ position: relative;
+ width: 100%;
+ height: 400px;
+ border-radius: 45px 45px 0 0;
+ overflow: hidden;
+ }
+
+ .image-container img {
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+ }
+
+ .image-overlay {
+ position: absolute;
+ inset: 0;
+ background-color: rgba(128, 128, 128, 0.6);
+ border-radius: 45px 45px 0 0;
+ }
+
+ .image-text-container {
+ position: absolute;
+ top: 10%;
+ width: 100%;
+ text-align: center;
+ color: var(--blanco);
+ }
+
+ .image-text-container h3 {
+ font-size: 2rem;
+ font-weight: bold;
+ text-transform: uppercase;
+ }
+
+ .image-text-container h4 {
+ font-size: 2.5rem;
+ margin-top: 20px;
+ }
+
+ .image-text-container p {
+ font-size: 1.2rem;
+ margin-top: 20px;
+ }
+
+ /* Estilos de las cards de las secciones */
+ .section-card {
+ background-color: var(--blanco);
+ width: 90%;
+ margin: 20px 0;
+ padding: 20px;
+ border-radius: 20px;
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
+ }
+
+ .section-card h3 {
+ font-size: 1.8rem;
+ font-weight: bold;
+ margin-bottom: 10px;
+ color: brown;
+ text-align: center;
+ }
+
+ /* Contenedor de los elementos, para agruparlos en filas */
+ .elementos-container {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 20px;
+ justify-content: space-between;
+ }
+
+ /* Cada elemento tiene su propia card */
+ .element-card {
+ background-color: var(--gris-claro);
+ border-radius: 10px;
+ padding: 15px;
+ width: 30%; /* Toma 30% del ancho para 3 elementos por fila */
+ box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+ }
+
+ /* Estilos para los inputs dentro de las element-cards */
+ .element-card input,
+ .element-card textarea,
+ .element-card select {
+ width: 100%;
+ padding: 10px;
+ font-size: 1rem;
+ margin-top: 5px;
+ border: 1px solid var(--gris);
+ border-radius: 5px;
+ }
+
+ /* Input específico para archivo */
+ .file-input-class {
+ background-color: var(--blanco);
+ cursor: pointer;
+ }
+
+ /* Estilo de la card del monto solicitado */
+ .monto-card {
+ background-color: var(--blanco);
+ width: 90%;
+ margin: 30px 0;
+ padding: 30px;
+ border-radius: 20px;
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
+ }
+
+ .monto-card h3 {
+ font-size: 1.8rem;
+ font-weight: bold;
+ margin-bottom: 10px;
+ color: brown;
+ text-align: center;
+ }
+
+ .monto-card .input-container {
+ display: flex;
+ justify-content: center;
+ margin-top: 20px;
+ }
+
+/* Botones de acción */
+.buttons-container {
+ display: flex;
+ justify-content: space-between; /* Un botón a la izquierda, otro a la derecha */
+ width: 100%; /* El contenedor ocupa todo el ancho disponible */
+ margin-top: 20px;
+ padding: 0 40px; /* Espacio a los lados del contenedor, ajusta según lo necesites */
+ box-sizing: border-box; /* Asegura que el padding no afecte el ancho total */
+}
+
+.button, .submit-button {
+ background-color: var(--secundario);
+ color: var(--blanco);
+ font-weight: bold;
+ font-style: normal;
+ padding: 10px 20px;
+ border-radius: 10px;
+ cursor: pointer;
+ transition: background-color 0.3s ease;
+}
+
+.submit-button {
+ background-color: #4CAF50;
+}
+
+
+
+
+ .button:hover {
+ background-color: var(--secundario-f);
+ }
+
+ .alert {
+ position: fixed;
+ top: 20px; /* Distancia desde la parte superior */
+ left: 50%;
+ transform: translateX(-50%); /* Centrar horizontalmente */
+ padding: 15px;
+ color: white;
+ width: calc(100% - 40px); /* Ajustar el ancho */
+ max-width: 600px; /* Ancho máximo */
+ text-align: center;
+ z-index: 1000;
+ border-radius: 5px;
+ transition: opacity 0.5s ease; /* Transición suave */
+}
+
+.success {
+ background-color: #19a81e; /* Verde para éxito */
+}
+
+.error {
+ background-color: #f44336; /* Rojo para error */
+}
+
+
+.download-button {
+ display: inline-block;
+ padding: 10px 20px;
+ margin-top: 10px;
+ background-color: #955e3d; /* Color de fondo */
+ color: white; /* Color del texto */
+ text-align: center;
+ text-decoration: none;
+ font-size: 12px;
+ font-weight: bold;
+ border-radius: 5px;
+ transition: background-color 0.3s ease;
+}
+
+.download-button:hover {
+ background-color: #45a049; /* Color de fondo al pasar el mouse */
+}
+
+.download-button:active {
+ background-color: #3e8e41; /* Color de fondo al hacer clic */
+}
+
+.download-button:focus {
+ outline: none; /* Elimina el borde de enfoque */
+}
+
+.view-document-button {
+ display: inline-block;
+ padding: 10px 20px;
+ margin-top: 10px;
+ background-color: #4f6ebc; /* Color de fondo */
+ color: white; /* Color del texto */
+ text-align: center;
+ text-decoration: none;
+ font-size: 12px;
+ font-weight: bold;
+ border-radius: 5px;
+ transition: background-color 0.3s ease;
+}
+
+.info-container {
+ border: 1px solid #e0e0e0; /* Borde suave */
+ border-radius: 8px; /* Bordes redondeados */
+ padding: 15px; /* Relleno interior */
+ background-color: #f9f9f9; /* Fondo claro */
+ margin-bottom: 20px; /* Separación con otros elementos */
+ box-shadow: 0px 4px 6px rgba(0, 0, 0, 0.1); /* Sombra para darle profundidad */
+ text-align: center;
+}
+
+.info-container p {
+ margin: 8px 0; /* Margen entre los párrafos */
+}
+
+.info-container strong {
+ color: #333; /* Color fuerte para los títulos */
+}
+
+/* Borde dependiendo del estado */
+.border-green {
+ border: 4px solid rgb(19, 183, 19);
+}
+
+.border-yellow {
+ border: 4px solid rgb(221, 221, 111);
+}
+
+.border-red {
+ border: 4px solid rgb(206, 71, 71);
+}
+
+/* Texto de la observación */
+.observacion-text {
+ margin-top: 5px;
+ display: block;
+}
+
+.border-green .observacion-text {
+ color: green;
+}
+
+.border-yellow .observacion-text {
+ color: yellow;
+}
+
+.border-red .observacion-text {
+ color: red;
+}
+
+/* Contenedor de los inputs con borde */
+.element-container {
+ margin-bottom: 15px;
+ padding: 10px;
+ border-radius: 5px;
+}
+
+/* Otros estilos de inputs */
+.input-class,
+.textarea-class,
+.select-class,
+.file-input-class,
+.date-input-class,
+.time-input-class {
+ width: 100%;
+ padding: 10px;
+ border-radius: 5px;
+ border: 1px solid #ccc;
+}
+
+.required-text {
+ color: red;
+ font-size: 0.8em;
+}
+
+.table-container {
+ border-radius: 15px;
+ overflow: hidden;
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
+ margin: 20px;
+ background-color: #fff;
+}
+
+.table {
+ width: 100%;
+ border-collapse: collapse;
+}
+
+.table th {
+ background-color: brown;
+ color: #fff;
+ padding: 12px;
+ text-align: left;
+ font-size: 16px;
+}
+
+.table td {
+ padding: 12px;
+ text-align: left;
+ font-size: 14px;
+ border-bottom: 1px solid #ddd;
+}
+
+.table tr:nth-child(even) {
+ background-color: #f9f9f9; /* Color para filas pares */
+}
+
+/* Contenedor de la barra de búsqueda */
+.search-container {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ width: 400px;
+ margin: 50px auto;
+ border: 2px solid #333;
+ border-radius: 25px;
+ background-color: #f0f0f0;
+ box-shadow: 0 8px 15px rgba(0, 0, 0, 0.1);
+ transition: box-shadow 0.3s ease;
+}
+
+.search-container:hover {
+ box-shadow: 0 10px 25px rgba(0, 0, 0, 0.2);
+}
+
+/* Estilo del input */
+.search-input {
+ flex: 1;
+ border:#938c8c;
+ background: none;
+ padding: 15px;
+ font-size: 16px;
+ outline: none;
+ color: #333;
+ border-radius: 25px 0 0 25px;
+}
+
+/* Placeholder personalizado */
+.search-input::placeholder {
+ color: #aaa;
+ font-style: italic;
+}
+
+/* Estilo del botón de búsqueda */
+.search-btn {
+ border: none;
+ background-color: #938c8c;
+ color: white;
+ padding: 9px 20px;
+ cursor: pointer;
+ border-radius: 0 25px 25px 0;
+ font-size: 18px;
+ transition: background-color 0.3s ease;
+}
+
+.search-btn:hover {
+ background-color: #555;
}
\ No newline at end of file
diff --git a/cosiap_frontend/src/App.jsx b/cosiap_frontend/src/App.jsx
index 7a199b1..a64f228 100644
--- a/cosiap_frontend/src/App.jsx
+++ b/cosiap_frontend/src/App.jsx
@@ -34,6 +34,7 @@ import EditarSolicitud from "./components/solicitudes/EditarSolicitud";
import VisualizarSolicitud from "./components/solicitudes/VerSolicitud";
import RecepcionApoyo from "./components/users/RecepcionApoyo/RecepcionApoyo";
import Solicitudes from "./components/SolicitudesAdmin/Solicitudes";
+import ListaUsuarios from "./components/admin/TablaUsuarios";
function App() {
const [viewPageLoader, setViewPageLoader] = useState(false);
@@ -118,7 +119,7 @@ function RoutesApp({ setViewPageLoader }) {
}
>
- } />
+ } />
} />
} />
} />
diff --git a/cosiap_frontend/src/api.js b/cosiap_frontend/src/api.js
index 02c4b17..0bc346d 100644
--- a/cosiap_frontend/src/api.js
+++ b/cosiap_frontend/src/api.js
@@ -84,7 +84,7 @@ const api = {
//Endpoints del submodulo solicitantes
solicitantes: {
- get: () => ax.get('api/usuarios/solicitantes'),
+ get: (params) => ax.get('api/usuarios/solicitantes',params),
post: (data) => ax.post('api/usuarios/solicitantes/', data),
getById: (id) => ax.get(`api/usuarios/solicitantes/${id}`),
update: (id, data) => ax.put(`api/usuarios/solicitantes/${id}`, data),
diff --git a/cosiap_frontend/src/components/admin/TablaUsuarios.jsx b/cosiap_frontend/src/components/admin/TablaUsuarios.jsx
index 4f51002..bd2411f 100644
--- a/cosiap_frontend/src/components/admin/TablaUsuarios.jsx
+++ b/cosiap_frontend/src/components/admin/TablaUsuarios.jsx
@@ -2,13 +2,13 @@ import { useState, useEffect } from "react";
import api from '../../api';
import Tabla from "../common/utility/ReusableTable"; // Importa la tabla reutilizable
import MainContainer from "../common/utility/MainContainer";
-import {useNavigate} from 'react-router-dom';
+import '@/App.css';
// Componente para recuperar la lista de usuarios solicitantes del sistema
const ListaUsuarios = () => {
const [usuarios, setUsuarios] = useState([]);
- const navigate = useNavigate();
+ const [searchQuery, setSearchQuery] = useState('');
// obtenemos a los usuarios al cargar la página
@@ -61,8 +61,35 @@ const ListaUsuarios = () => {
}
];
+ // Actualiza el estado de `searchQuery` con cada cambio en el input
+ const handleInputChange = (e) => setSearchQuery(e.target.value);
+
+ const handleSearch = async () => {
+ try {
+ const response = await api.usuarios.solicitantes.get({
+ params: { search_query: searchQuery , model_name: "Solicitante", columns: "__all__"}
+ });
+ setUsuarios(response.data.data);
+ } catch (error) {
+ console.error('Error al buscar usuarios:', error);
+ }
+ };
+
return (
+
+
+
+
+
diff --git a/cosiap_frontend/src/components/common/utility/RenderElementEdit.jsx b/cosiap_frontend/src/components/common/utility/RenderElementEdit.jsx
index 25a856f..2482832 100644
--- a/cosiap_frontend/src/components/common/utility/RenderElementEdit.jsx
+++ b/cosiap_frontend/src/components/common/utility/RenderElementEdit.jsx
@@ -1,4 +1,4 @@
-import '@/components/modalidades/Modalidad.css'
+import '@/App.css';
export const renderElemento = (seccionId, elemento, handleInputChange, handleCheckboxChange, respuestas) => {
const { tipo, opciones, id, nombre, obligatorio } = elemento;
diff --git a/cosiap_frontend/src/components/common/utility/RenderElementView.jsx b/cosiap_frontend/src/components/common/utility/RenderElementView.jsx
index bd20af7..30d2865 100644
--- a/cosiap_frontend/src/components/common/utility/RenderElementView.jsx
+++ b/cosiap_frontend/src/components/common/utility/RenderElementView.jsx
@@ -1,4 +1,4 @@
-import '@/components/modalidades/Modalidad.css'
+import '@/App.css';
export const renderElemento = (seccionId, elemento, handleInputChange, handleCheckboxChange, respuestas) => {
const { tipo, opciones, id, nombre, obligatorio } = elemento;
diff --git a/cosiap_frontend/src/components/common/utility/RenderElemento.jsx b/cosiap_frontend/src/components/common/utility/RenderElemento.jsx
index 6e9c491..497fe5f 100644
--- a/cosiap_frontend/src/components/common/utility/RenderElemento.jsx
+++ b/cosiap_frontend/src/components/common/utility/RenderElemento.jsx
@@ -1,4 +1,4 @@
-import '@/components/modalidades/Modalidad.css'
+import '@/App.css';
import api from "@/api";
export const renderElemento = (seccionId, elemento, handleInputChange, handleCheckboxChange) => {
diff --git a/cosiap_frontend/src/components/common/utility/ReusableTable.css b/cosiap_frontend/src/components/common/utility/ReusableTable.css
deleted file mode 100644
index a7f4515..0000000
--- a/cosiap_frontend/src/components/common/utility/ReusableTable.css
+++ /dev/null
@@ -1,32 +0,0 @@
-.table-container {
- border-radius: 15px;
- overflow: hidden;
- box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
- margin: 20px;
- background-color: #fff;
- }
-
- .table {
- width: 100%;
- border-collapse: collapse;
- }
-
- .table th {
- background-color: brown;
- color: #fff;
- padding: 12px;
- text-align: left;
- font-size: 16px;
- }
-
- .table td {
- padding: 12px;
- text-align: left;
- font-size: 14px;
- border-bottom: 1px solid #ddd;
- }
-
- .table tr:nth-child(even) {
- background-color: #f9f9f9; /* Color para filas pares */
- }
-
\ No newline at end of file
diff --git a/cosiap_frontend/src/components/common/utility/ReusableTable.jsx b/cosiap_frontend/src/components/common/utility/ReusableTable.jsx
index 7cc44b1..cbc612b 100644
--- a/cosiap_frontend/src/components/common/utility/ReusableTable.jsx
+++ b/cosiap_frontend/src/components/common/utility/ReusableTable.jsx
@@ -1,4 +1,4 @@
-import '@/components/common/utility/ReusableTable.css'; // Asegúrate de que la ruta sea correcta
+import '@/App.css';
const Tabla = ({ columnas, datos }) => {
return (
diff --git a/cosiap_frontend/src/components/modalidades/CrearModalidad.css b/cosiap_frontend/src/components/modalidades/CrearModalidad.css
deleted file mode 100644
index f6215d7..0000000
--- a/cosiap_frontend/src/components/modalidades/CrearModalidad.css
+++ /dev/null
@@ -1,266 +0,0 @@
-/* Estilos para el card blanco */
-.white-card {
- background-color: white;
- padding: 20px;
- border-radius: 8px;
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
- margin-bottom: 20px;
-}
-
-/* Estilos para las filas del formulario */
-.form-row {
- display: flex;
- flex-wrap: wrap;
- justify-content: space-between;
- margin-bottom: 15px;
-}
-
-.form-group {
- flex: 1;
- margin-right: 15px;
- margin-bottom: 15px;
-}
-
-.form-group label {
- display: block;
- font-weight: bold;
- margin-bottom: 5px;
-}
-
-.form-group input,
-.form-group textarea,
-.form-group select {
- width: 100%;
- padding: 8px;
- border: 1px solid #ccc;
- border-radius: 4px;
- font-size: 16px;
-}
-
-.form-group input[type="file"] {
- padding: 0;
-}
-
-textarea {
- resize: vertical;
-}
-
-/* Estilos para secciones */
-.section {
- background-color: #f9f9f9;
- padding: 15px;
- margin-bottom: 20px;
- border-radius: 8px;
- border: 1px solid #ddd;
-}
-
-/* Estilos para elementos */
-.element {
- background-color: #f2f2f2;
- padding: 10px;
- margin-bottom: 10px;
- border-radius: 6px;
- border: 1px solid #ccc;
-}
-
-/* Estilos para opciones */
-.option {
- background-color: #e9e9e9;
- padding: 8px;
- margin-bottom: 8px;
- border-radius: 4px;
- border: 1px solid #bbb;
-}
-
-/* Botones */
-.add-button {
- background-color: #696d69;
- color: white;
- border: none;
- padding: 8px 12px;
- font-size: 14px;
- border-radius: 16px;
- cursor: pointer;
- margin-top: 10px;
- margin-right: 10px;
-}
-
-.add-button:hover {
- background-color: #45a049;
-}
-
-.delete-button {
- background-color: #f44336;
- color: white;
- border: none;
- padding: 8px 12px;
- font-size: 14px;
- border-radius: 16px;
- cursor: pointer;
- margin-top: 10px;
- margin-right: 10px;
- display: flex;
- align-items: center;
- justify-content: center;
-}
-
-.delete-button i {
- font-size: 16px; /* Ajusta el tamaño del ícono */
-}
-
-.delete-button:hover {
- background-color: #e53935;
-}
-
-/* Botón de envío */
-.submit-button {
- background-color: #4fb659;
- color: white;
- padding: 10px 20px;
- font-size: 14px;
- border: none;
- border-radius: 16px;
- cursor: pointer;
- font-style: oblique;
- margin-top: 20px;
-}
-
-.submit-button:hover {
- background-color: #19d2b0;
-}
-
-/* Checkbox más pequeño */
-input[type="checkbox"] {
- width: 20px;
- height: 20px;
- cursor: pointer;
- margin-right: 10px;
-}
-
-
-.subtitle-text {
- font-size: 20px;
- color: #c65f5f;
-}
-
-.subtitle-text-1 {
- font-size: 18px;
- color: #752323;
-}
-
-.subtitle-text-2 {
- font-size: 16px;
- color: #9e5f5f;
-}
-
-/* Ajustar márgenes y tamaño del texto en etiquetas */
-.form-group label {
- font-size: 16px;
- color: #333;
- margin-bottom: 8px;
-}
-
-.button-container {
- display: flex;
- justify-content: space-between;
- margin-top: 20px;
- padding: 0 20px;
-}
-
-.preview-image {
- width: 100px;
- height: 100px;
- object-fit: cover;
- border: 1px solid #ccc;
- margin-top: 10px;
-}
-
-.card {
- border: 1px solid #ddd;
- border-radius: 5px;
- margin: 15px 0;
- padding: 10px;
- background-color: #f5f5f5;
-}
-
-.element-card {
- border: 1px solid #ddd;
- border-radius: 5px;
- margin: 15px 0;
- padding: 10px;
- background-color: #adacac;
-}
-
-.element-card-header{
- font-weight: bold;
-}
-
-.element-card-body{
- padding: 10px;
-}
-
-.card-header {
- font-weight: bold;
-}
-
-.card-body {
- padding: 10px;
-}
-
-.option-card {
- margin-left: 20px;
- border: 1px solid #bbb;
- padding: 5px;
- border-radius: 5px;
- background-color: #e9e9e9;
-}
-
-.form-row {
- display: flex;
- align-items: center; /* Alinea los elementos al centro verticalmente */
- gap: 10px; /* Espacio entre los elementos */
- height: auto; /* Asegúrate de que la altura del contenedor sea flexible */
-}
-
-.form-row label {
- flex-shrink: 0; /* Evita que el label se encoja */
-}
-
-.form-row input {
- flex: 1; /* Hace que el input ocupe el espacio disponible */
-}
-
-.element-row {
- display: flex;
- align-items: center;
- justify-content: space-between; /* Para que el input esté a la izquierda y los botones a la derecha */
- gap: 10px; /* Espacio entre el input y los botones */
- width: 100%; /* Asegura que ocupe todo el ancho disponible */
-}
-
-.element-input {
- width: 100%;
- padding: 8px;
- border: 1px solid #ccc;
- border-radius: 4px;
- font-size: 16px;
-}
-
-.element-buttons {
- display: flex;
- gap: 5px; /* Espacio entre los botones */
-}
-
-.form-row input,
-.form-row button,
-.form-row label {
- line-height: normal; /* Asegura que todos los elementos tengan una línea de texto coherente */
- padding: 8px; /* Ajusta el padding para que sea igual en todos los elementos */
- height: auto; /* Permite que los elementos ajusten su altura automáticamente */
- font-size: 15px; /* Asegura que todos tengan el mismo tamaño de fuente */
- font-style:normal;
-}
-
-.form-row input {
- flex: 1; /* Hace que el input crezca según el espacio disponible */
-}
\ No newline at end of file
diff --git a/cosiap_frontend/src/components/modalidades/CrearModalidad.jsx b/cosiap_frontend/src/components/modalidades/CrearModalidad.jsx
index 3bcf905..b2b18e1 100644
--- a/cosiap_frontend/src/components/modalidades/CrearModalidad.jsx
+++ b/cosiap_frontend/src/components/modalidades/CrearModalidad.jsx
@@ -1,6 +1,6 @@
import { useState, useEffect } from "react";
import api from '../../api';
-import './CrearModalidad.css'
+import '@/App.css';
import MainContainer from "../common/utility/MainContainer";
import { useNavigate } from 'react-router-dom';
diff --git a/cosiap_frontend/src/components/modalidades/EditarModalidad.jsx b/cosiap_frontend/src/components/modalidades/EditarModalidad.jsx
index f01eaa5..f63a223 100644
--- a/cosiap_frontend/src/components/modalidades/EditarModalidad.jsx
+++ b/cosiap_frontend/src/components/modalidades/EditarModalidad.jsx
@@ -1,6 +1,6 @@
import { useState, useEffect } from "react";
import api from '../../api';
-import './CrearModalidad.css';
+import '@/App.css';
import MainContainer from "../common/utility/MainContainer";
import { useNavigate, useParams } from 'react-router-dom';
diff --git a/cosiap_frontend/src/components/modalidades/ListaModalidades.jsx b/cosiap_frontend/src/components/modalidades/ListaModalidades.jsx
index 8f63855..059fcc7 100644
--- a/cosiap_frontend/src/components/modalidades/ListaModalidades.jsx
+++ b/cosiap_frontend/src/components/modalidades/ListaModalidades.jsx
@@ -4,7 +4,7 @@ import { ModalidadCard } from "@/components/modalidades/ModalidadCard";
import api from "@/api";
import { useState, useEffect } from "react";
import MainContainer from "@/components/common/utility/MainContainer";
-import './CrearModalidad.css'
+import '@/App.css';
import { useNavigate } from "react-router-dom";
export default function ListaModalidades({
diff --git a/cosiap_frontend/src/components/modalidades/Modalidad.css b/cosiap_frontend/src/components/modalidades/Modalidad.css
deleted file mode 100644
index fa88749..0000000
--- a/cosiap_frontend/src/components/modalidades/Modalidad.css
+++ /dev/null
@@ -1,412 +0,0 @@
-/* Estilos generales para inputs */
-.input-class,
-.textarea-class,
-.select-class,
-.date-input-class,
-.time-input-class,
-.file-input-class {
- width: 100%;
- padding: 10px;
- color: rgb(0, 0, 0);
- margin: 10px 0;
- font-size: 16px;
- border: 2px solid #555; /* Aumentamos el grosor y un color más oscuro */
- border-radius: 4px;
- box-sizing: border-box;
- transition: border-color 0.3s ease;
-}
-
-/* Efecto de enfoque (focus) para resaltarlos cuando el usuario interactúe */
-.input-class:focus,
-.textarea-class:focus,
-.select-class:focus,
-.date-input-class:focus,
-.time-input-class:focus,
-.file-input-class:focus {
- border-color: #4CAF50; /* Cambia el color del borde al interactuar */
- outline: none; /* Elimina el borde por defecto del navegador */
- box-shadow: 0 0 5px rgba(76, 175, 80, 0.5); /* Efecto sutil de sombra verde */
-}
-
-/* Estilos para el textarea */
-.textarea-class {
- height: 150px;
- resize: vertical;
-}
-
-/* Estilos para los select */
-.select-class {
- height: 40px;
- background-color: white;
-}
-
-/* Grupo de casillas: Mantener una distribución compacta */
-.checkbox-group {
- display: flex;
- flex-wrap: wrap;
- gap: 10px; /* Espacio entre las casillas */
-}
-
-/* Etiquetas de las casillas */
-.checkbox-label {
- display: flex;
- align-items: center;
- margin-right: 15px;
- font-size: 16px; /* Tamaño de texto estándar */
-}
-
-/* Estilo personalizado para el checkbox */
-.checkbox-label input[type="checkbox"] {
- width: 20px; /* Tamaño del checkbox */
- height: 20px; /* Tamaño del checkbox */
- margin-right: 5px; /* Espacio entre la casilla y el texto */
- cursor: pointer;
- border: 2px solid #333; /* Borde visible */
- border-radius: 4px; /* Esquinas redondeadas */
- appearance: none; /* Eliminar el estilo por defecto del navegador */
- position: relative;
-}
-
-/* Estilo cuando está seleccionado */
-.checkbox-label input[type="checkbox"]:checked {
- background-color: #333; /* Fondo oscuro cuando está seleccionado */
-}
-
-/* Agregar un pseudo-elemento para el 'checkmark' */
-.checkbox-label input[type="checkbox"]:checked::after {
- color: white;
- font-size: 14px;
- position: absolute;
- top: 50%;
- left: 50%;
- transform: translate(-50%, -50%);
-}
-
-
-/* Estilos para el input de archivo */
-.file-input-class {
- cursor: pointer;
-}
-
-/* Estilos para la fecha y hora */
-.date-input-class,
-.time-input-class {
- max-width: 200px;
-}
-
-/* Estilo para el separador */
-.separator-class {
- border: 0;
- height: 1px;
- background: #e0e0e0;
- margin: 20px 0;
-}
-
-
-/* Contenedor principal */
-.container {
- width: 100%;
- display: flex;
- flex-direction: column;
- align-items: center;
- padding: 20px;
- background-color: #f9f9f9;
- border-radius: 45px;
- margin-top: 20px;
- }
-
- /* Sección de la imagen y título */
- .image-container {
- position: relative;
- width: 100%;
- height: 400px;
- border-radius: 45px 45px 0 0;
- overflow: hidden;
- }
-
- .image-container img {
- width: 100%;
- height: 100%;
- object-fit: cover;
- }
-
- .image-overlay {
- position: absolute;
- inset: 0;
- background-color: rgba(128, 128, 128, 0.6);
- border-radius: 45px 45px 0 0;
- }
-
- .image-text-container {
- position: absolute;
- top: 10%;
- width: 100%;
- text-align: center;
- color: var(--blanco);
- }
-
- .image-text-container h3 {
- font-size: 2rem;
- font-weight: bold;
- text-transform: uppercase;
- }
-
- .image-text-container h4 {
- font-size: 2.5rem;
- margin-top: 20px;
- }
-
- .image-text-container p {
- font-size: 1.2rem;
- margin-top: 20px;
- }
-
- /* Estilos de las cards de las secciones */
- .section-card {
- background-color: var(--blanco);
- width: 90%;
- margin: 20px 0;
- padding: 20px;
- border-radius: 20px;
- box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
- }
-
- .section-card h3 {
- font-size: 1.8rem;
- font-weight: bold;
- margin-bottom: 10px;
- color: brown;
- text-align: center;
- }
-
- /* Contenedor de los elementos, para agruparlos en filas */
- .elementos-container {
- display: flex;
- flex-wrap: wrap;
- gap: 20px;
- justify-content: space-between;
- }
-
- /* Cada elemento tiene su propia card */
- .element-card {
- background-color: var(--gris-claro);
- border-radius: 10px;
- padding: 15px;
- width: 30%; /* Toma 30% del ancho para 3 elementos por fila */
- box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
- display: flex;
- flex-direction: column;
- justify-content: space-between;
- }
-
- /* Estilos para los inputs dentro de las element-cards */
- .element-card input,
- .element-card textarea,
- .element-card select {
- width: 100%;
- padding: 10px;
- font-size: 1rem;
- margin-top: 5px;
- border: 1px solid var(--gris);
- border-radius: 5px;
- }
-
- /* Input específico para archivo */
- .file-input-class {
- background-color: var(--blanco);
- cursor: pointer;
- }
-
- /* Estilo de la card del monto solicitado */
- .monto-card {
- background-color: var(--blanco);
- width: 90%;
- margin: 30px 0;
- padding: 30px;
- border-radius: 20px;
- box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
- }
-
- .monto-card h3 {
- font-size: 1.8rem;
- font-weight: bold;
- margin-bottom: 10px;
- color: brown;
- text-align: center;
- }
-
- .monto-card .input-container {
- display: flex;
- justify-content: center;
- margin-top: 20px;
- }
-
-/* Botones de acción */
-.buttons-container {
- display: flex;
- justify-content: space-between; /* Un botón a la izquierda, otro a la derecha */
- width: 100%; /* El contenedor ocupa todo el ancho disponible */
- margin-top: 20px;
- padding: 0 40px; /* Espacio a los lados del contenedor, ajusta según lo necesites */
- box-sizing: border-box; /* Asegura que el padding no afecte el ancho total */
-}
-
-.button, .submit-button {
- background-color: var(--secundario);
- color: var(--blanco);
- font-weight: bold;
- font-style: normal;
- padding: 10px 20px;
- border-radius: 10px;
- cursor: pointer;
- transition: background-color 0.3s ease;
-}
-
-.submit-button {
- background-color: #4CAF50;
-}
-
-
-
-
- .button:hover {
- background-color: var(--secundario-f);
- }
-
- .alert {
- position: fixed;
- top: 20px; /* Distancia desde la parte superior */
- left: 50%;
- transform: translateX(-50%); /* Centrar horizontalmente */
- padding: 15px;
- color: white;
- width: calc(100% - 40px); /* Ajustar el ancho */
- max-width: 600px; /* Ancho máximo */
- text-align: center;
- z-index: 1000;
- border-radius: 5px;
- transition: opacity 0.5s ease; /* Transición suave */
-}
-
-.success {
- background-color: #19a81e; /* Verde para éxito */
-}
-
-.error {
- background-color: #f44336; /* Rojo para error */
-}
-
-
-.download-button {
- display: inline-block;
- padding: 10px 20px;
- margin-top: 10px;
- background-color: #955e3d; /* Color de fondo */
- color: white; /* Color del texto */
- text-align: center;
- text-decoration: none;
- font-size: 12px;
- font-weight: bold;
- border-radius: 5px;
- transition: background-color 0.3s ease;
-}
-
-.download-button:hover {
- background-color: #45a049; /* Color de fondo al pasar el mouse */
-}
-
-.download-button:active {
- background-color: #3e8e41; /* Color de fondo al hacer clic */
-}
-
-.download-button:focus {
- outline: none; /* Elimina el borde de enfoque */
-}
-
-.view-document-button {
- display: inline-block;
- padding: 10px 20px;
- margin-top: 10px;
- background-color: #4f6ebc; /* Color de fondo */
- color: white; /* Color del texto */
- text-align: center;
- text-decoration: none;
- font-size: 12px;
- font-weight: bold;
- border-radius: 5px;
- transition: background-color 0.3s ease;
-}
-
-.info-container {
- border: 1px solid #e0e0e0; /* Borde suave */
- border-radius: 8px; /* Bordes redondeados */
- padding: 15px; /* Relleno interior */
- background-color: #f9f9f9; /* Fondo claro */
- margin-bottom: 20px; /* Separación con otros elementos */
- box-shadow: 0px 4px 6px rgba(0, 0, 0, 0.1); /* Sombra para darle profundidad */
- text-align: center;
-}
-
-.info-container p {
- margin: 8px 0; /* Margen entre los párrafos */
-}
-
-.info-container strong {
- color: #333; /* Color fuerte para los títulos */
-}
-
-/* Borde dependiendo del estado */
-.border-green {
- border: 4px solid rgb(19, 183, 19);
-}
-
-.border-yellow {
- border: 4px solid rgb(221, 221, 111);
-}
-
-.border-red {
- border: 4px solid rgb(206, 71, 71);
-}
-
-/* Texto de la observación */
-.observacion-text {
- margin-top: 5px;
- display: block;
-}
-
-.border-green .observacion-text {
- color: green;
-}
-
-.border-yellow .observacion-text {
- color: yellow;
-}
-
-.border-red .observacion-text {
- color: red;
-}
-
-/* Contenedor de los inputs con borde */
-.element-container {
- margin-bottom: 15px;
- padding: 10px;
- border-radius: 5px;
-}
-
-/* Otros estilos de inputs */
-.input-class,
-.textarea-class,
-.select-class,
-.file-input-class,
-.date-input-class,
-.time-input-class {
- width: 100%;
- padding: 10px;
- border-radius: 5px;
- border: 1px solid #ccc;
-}
-
-.required-text {
- color: red;
- font-size: 0.8em;
-}
\ No newline at end of file
diff --git a/cosiap_frontend/src/components/modalidades/Modalidad.jsx b/cosiap_frontend/src/components/modalidades/Modalidad.jsx
index ec6b551..3424c42 100644
--- a/cosiap_frontend/src/components/modalidades/Modalidad.jsx
+++ b/cosiap_frontend/src/components/modalidades/Modalidad.jsx
@@ -1,6 +1,6 @@
import InputMonto from "@/components/common/utility/InputMonto";
import { renderElemento } from "@/components/common/utility/RenderElemento";
-import '@/components/modalidades/Modalidad.css'
+import '@/App.css';
/* Validaciones para formularios */
import {
diff --git a/cosiap_frontend/src/components/solicitudes/EditarSolicitud.jsx b/cosiap_frontend/src/components/solicitudes/EditarSolicitud.jsx
index 8c5f9e9..cc874bf 100644
--- a/cosiap_frontend/src/components/solicitudes/EditarSolicitud.jsx
+++ b/cosiap_frontend/src/components/solicitudes/EditarSolicitud.jsx
@@ -3,7 +3,7 @@ import api from '../../api';
import MainContainer from "../common/utility/MainContainer";
import { useNavigate, useParams } from 'react-router-dom';
import { renderElemento } from "@/components/common/utility/RenderElementEdit";
-import '@/components/modalidades/Modalidad.css'
+import '@/App.css';
/* Validaciones para formularios */
import {
MontoValidation,
diff --git a/cosiap_frontend/src/components/solicitudes/HistorialSolicitudes.css b/cosiap_frontend/src/components/solicitudes/HistorialSolicitudes.css
deleted file mode 100644
index 208f84b..0000000
--- a/cosiap_frontend/src/components/solicitudes/HistorialSolicitudes.css
+++ /dev/null
@@ -1,44 +0,0 @@
-/* Estilo para los estados */
-.estado-label {
- padding: 5px 10px;
- border-radius: 8px;
- color: white;
- font-weight: bold;
- display: inline-block;
- text-align: center;
- min-width: 100px;
-}
-
-.estado-aprobado {
- background-color: rgb(126, 233, 126);
-}
-
-.estado-rechazado {
- background-color: rgb(223, 91, 91);
-}
-
-.estado-pendiente {
- background-color: rgb(109, 163, 216);
- color: black;
-}
-
-
-.button-ver{
- background-color: grey;
- color: white;
- padding: 5px 10px;
- border-radius: 5px;
- margin-right: 10px;
- border: none;
- cursor: pointer;
-}
-
-.button-editar{
- background-color: brown;
- color: white;
- padding: 5px 10px;
- border-radius: 5px;
- margin-right: 10px;
- border: none;
- cursor: pointer;
-}
\ No newline at end of file
diff --git a/cosiap_frontend/src/components/solicitudes/HistorialSolicitudes.jsx b/cosiap_frontend/src/components/solicitudes/HistorialSolicitudes.jsx
index ed9afbf..c44f2af 100644
--- a/cosiap_frontend/src/components/solicitudes/HistorialSolicitudes.jsx
+++ b/cosiap_frontend/src/components/solicitudes/HistorialSolicitudes.jsx
@@ -2,7 +2,7 @@ import { useState, useEffect } from "react";
import api from '../../api';
import Tabla from "../common/utility/ReusableTable"; // Importa la tabla reutilizable
import MainContainer from "../common/utility/MainContainer";
-import '@/components/solicitudes/HistorialSolicitudes.css'; // Importa los estilos
+import '@/App.css';
import { useNavigate} from 'react-router-dom';
diff --git a/cosiap_frontend/src/components/solicitudes/VerSolicitud.jsx b/cosiap_frontend/src/components/solicitudes/VerSolicitud.jsx
index de1d259..f699c88 100644
--- a/cosiap_frontend/src/components/solicitudes/VerSolicitud.jsx
+++ b/cosiap_frontend/src/components/solicitudes/VerSolicitud.jsx
@@ -3,7 +3,7 @@ import api from '../../api';
import MainContainer from "../common/utility/MainContainer";
import { useParams, useNavigate } from 'react-router-dom';
import { renderElemento } from "@/components/common/utility/RenderElementView";
-import '@/components/modalidades/Modalidad.css';
+import '@/App.css';
const VisualizarSolicitud = () => {
const { id } = useParams();
--
GitLab