diff --git a/src/pages/users/admin/codigos.jsx b/src/pages/users/admin/codigos.jsx index 2301c7f..240debd 100644 --- a/src/pages/users/admin/codigos.jsx +++ b/src/pages/users/admin/codigos.jsx @@ -17,7 +17,7 @@ const ComponenteCodigos = () => { const [fechaInicio, setFechaInicio] = useState(''); // Estado para fecha de inicio const [fechaFin, setFechaFin] = useState(''); // Estado para fecha de fin const [planesSeleccionados, setPlanesSeleccionados] = useState([]); - + const [comunasSeleccionadas, setComunasSeleccionadas] = useState([]); // Estado para comunas seleccionadas // Lista de comunas y categorías const comunas = [ @@ -46,10 +46,10 @@ const ComponenteCodigos = () => { ]; const planes = [ - "Mensual", - "Trimestral", - "Semestral", - "Anual" + "Mes", + "Trimestre", + "Semestre", + "Año" ] const handlePlanChange = (plan) => { @@ -133,36 +133,26 @@ const ComponenteCodigos = () => {

Generador de Códigos

-
- -
- setDuracion(e.target.value)} - placeholder="Duración" - className="codigo-input" - /> - -
-
+
setUsos(e.target.value)} - placeholder="Número de usos" - className="codigo-input" - /> + type="number" + value={usos} + onChange={(e) => { + const valor = parseInt(e.target.value, 10); + if (!isNaN(valor) && valor >= 1) { + setUsos(valor); // Actualiza si es válido + } else { + setUsos(''); // Vacía el campo si no es válido + } + }} + min="1" // Establece el mínimo permitido en el atributo HTML + placeholder="Número de usos" + className="codigo-input" + /> +
@@ -177,25 +167,58 @@ const ComponenteCodigos = () => {
- {tipoCodigo === "Georreferenciado" && ( -
- - -
- )} +
+ {/* Contenedor de etiquetas de comunas seleccionadas */} +
+ {comunasSeleccionadas.map((comuna) => ( + + {comuna} + + + ))} +
+
+ {/* Selector para agregar nuevas comunas */} + +
+ +)} + + + +



diff --git a/src/pages/users/admin/precios.jsx b/src/pages/users/admin/precios.jsx index 2f92e62..7824c53 100644 --- a/src/pages/users/admin/precios.jsx +++ b/src/pages/users/admin/precios.jsx @@ -165,6 +165,13 @@ function GestionPreciosTabla() { ), }); + const handleSave = () => { + const isConfirmed = window.confirm("¿Está seguro de que desea guardar los cambios?"); + if (isConfirmed) { + formik.handleSubmit(); // Llama a la función de submit de Formik + } + }; + const formik = useFormik({ initialValues, validationSchema, @@ -185,9 +192,18 @@ function GestionPreciosTabla() { return (
+
+

Gestión de Precios

+ +
+ + +
-

Gestión de Precios

-

1. Ingresa el precio normal y precio promocional de tu plan. + +

1. Ingresa el precio normal (IVA incluído) y precio promocional de tu plan.



2. Escoge cuál de los dos se mostrará al usuario (si el precio normal o el precio en promoción).



@@ -212,6 +228,7 @@ function GestionPreciosTabla() {

+

@@ -241,6 +258,7 @@ function GestionPreciosTabla() { disabled={formik.values.precios[index][periodo].activo === "inactivo"} className="gestion-precios-input" /> +



+ {/* Mostrar placeholder personalizado si no hay valor */} + {!formik.values.precios[index][periodo].fechaInicio && ( - Fecha de inicio + + )} + +
+ +
+ + {/* Mostrar placeholder personalizado si no hay valor */} + {!formik.values.precios[index][periodo].fechaFin && ( + + )} + + {/* Mostrar mensaje de error si existe */} + {formik.errors.precios?.[index]?.[periodo]?.fechaFin && + formik.touched.precios?.[index]?.[periodo]?.fechaFin && ( +
{formik.errors.precios[index][periodo].fechaFin}
)}
+ + + + + -
- -



- {formik.errors.precios?.[index]?.[periodo]?.fechaFin && - formik.touched.precios?.[index]?.[periodo]?.fechaFin && ( -
{formik.errors.precios[index][periodo].fechaFin}
- )} - {!formik.values.precios[index][periodo].fechaInicio && ( - Fecha de término - )} -
+
@@ -325,9 +347,7 @@ function GestionPreciosTabla() { ))} - +
diff --git a/src/pages/users/notificacion.jsx b/src/pages/users/notificacion.jsx index 33b55f2..4a5d71b 100644 --- a/src/pages/users/notificacion.jsx +++ b/src/pages/users/notificacion.jsx @@ -30,7 +30,12 @@ const Notification = () => { const [url, setUrl] = useState(''); const [comunaInput, setComunaInput] = useState(''); // Input del usuario const comunas = ['Santiago', 'Providencia', 'Ñuñoa', 'La Florida', 'Las Condes']; // Lista fija de comunas - const preferencias = ['Deportes', 'Cultura', 'Educación', 'Salud', 'Tecnología']; + const preferencias = [ + 'Salud y Belleza', 'Arte y Cultura', 'Cine, Teatro y Espectáculos', + 'Comida y Restaurantes', 'Hobbies', 'Música', 'Deportes y Actividad Física', + 'Mascotas', 'Hogar', 'Ciencia y Tecnología', 'Educación', 'Mundo Automotor', + 'Mundo Niños', 'Viajes y Turismo' + ]; const [seleccionadas, setSeleccionadas] = useState([]); const [filteredComunas, setFilteredComunas] = useState([]); const [showDays, setShowDays] = useState(false); @@ -441,45 +446,44 @@ const Notification = () => {
{repeat && ( -
- {/* Input y dropdown en la misma fila */} -
- - - -
- - {/* Mostrar los días de la semana si "semana" está seleccionado */} - {showDays && ( -
- {['D', 'L', 'M', 'X', 'J', 'V', 'S'].map((day) => ( - - ))} + <> +
+ {/* Input y dropdown en la misma fila */} +
+ + + +
- )} -
-)} -{/* Mostrar opciones adicionales si "mes" está seleccionado */} -{unit === 'mes' && ( + + {/* Mostrar los días de la semana si "semana" está seleccionado */} + {showDays && ( +
+ {['D', 'L', 'M', 'X', 'J', 'V', 'S'].map((day) => ( + + ))} +
+ )} + {unit === 'mes' && (
)} - {/* Opciones adicionales si "día" o "año" están seleccionados */} - {(unit === 'día' || unit === 'año') && ( -
-

Termina

-
- -
- - {/* Opción "El" */} -
- -
- - {/* Opción "Después de" */} -
- -
+



+ {/* Mostrar la sección "Termina" solo cuando `repeat` está activado */} +
+

Termina

+
+ +
+ + {/* Opción "El" */} +
+ - repeticiones +
+ + {/* Opción "Después de" */} +
+ +
+ + repeticiones +
-
- - - - )} + +)} + + diff --git a/src/styles/users/admin/codigos.css b/src/styles/users/admin/codigos.css index fadcdd4..7568ce3 100644 --- a/src/styles/users/admin/codigos.css +++ b/src/styles/users/admin/codigos.css @@ -1,5 +1,4 @@ - .codigo-container { max-width: 1000px; margin: 50px auto; @@ -108,11 +107,40 @@ .checkbox-container { display: grid; grid-template-columns: repeat(2, 1fr); /* 2 columnas del mismo tamaño */ - gap: 10px; /* Espacio entre filas y columnas */ + gap: 0px; /* Espacio entre filas y columnas */ } .checkbox-item { display: flex; align-items: center; } - \ No newline at end of file + + .comuna-select { + width: 70%; /* Ocupa todo el ancho disponible */ + padding: 10px; /* Espaciado interno */ + font-size: 14px; /* Tamaño de fuente */ + border: 1px solid #ccc; /* Borde gris */ + border-radius: 5px; /* Bordes redondeados */ + background-color: #fff; /* Fondo blanco */ + color: #333; /* Color del texto */ + transition: border-color 0.3s ease, box-shadow 0.3s ease; + appearance: none; /* Elimina el estilo predeterminado del navegador */ + background-image: url("data:image/svg+xml;charset=US-ASCII,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24'%3E%3Cpath fill='%23333' d='M7 10l5 5 5-5H7z'/%3E%3C/svg%3E"); /* Icono de flecha */ + background-repeat: no-repeat; + background-position: right 10px center; + background-size: 12px; + cursor: pointer; /* Cambia el cursor a una mano */ + margin-left: 0; + text-align: left; + } + + .comuna-select:focus { + border-color: #007bff; /* Cambia el borde a azul al enfocar */ + outline: none; /* Elimina el contorno predeterminado */ + box-shadow: 0 0 5px rgba(0, 123, 255, 0.5); /* Sombra azul */ + } + + .comuna-select-container { + display: flex; + justify-content: flex-start; /* Alinea los elementos hacia la izquierda */ + } \ No newline at end of file diff --git a/src/styles/users/admin/precios.css b/src/styles/users/admin/precios.css index 882d6c1..c698807 100644 --- a/src/styles/users/admin/precios.css +++ b/src/styles/users/admin/precios.css @@ -4,11 +4,8 @@ } /* Title */ - .gestion-precios-title { - font-size: 24px; - font-weight: bold; - margin-bottom: 20px; - } + + /* Filter container */ .filtro-categoria-container { @@ -29,19 +26,8 @@ } - /* Table */ - .gestion-precios-table { - width: 100%; - border-collapse: collapse; - margin-bottom: 20px; - } - - .gestion-precios-th, - .gestion-precios-td { - border: 1px solid #ccc; - padding: 10px; - } + .error-message { color: #d93025; /* Rojo elegante */ @@ -66,56 +52,152 @@ } - - /* Estilo para eliminar las flechas de incremento en el input number */ + /* Tabla general */ +.gestion-precios-table { + width: 100%; + border-collapse: collapse; /* Elimina espacios entre bordes */ + margin-bottom: 20px; + background-color: #f9f9f9; /* Fondo claro para la tabla */ + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); /* Sombra para resaltar */ + border-radius: 8px; /* Bordes redondeados */ + overflow: hidden; /* Asegura que los bordes sean visibles */ +} + +/* Estilo de los encabezados de tabla */ +.gestion-precios-th { + background-color: #fc7b03; /* Fondo naranja */ + color: white; /* Texto blanco */ + font-size: 16px; + font-weight: bold; + text-align: center; /* Texto centrado */ + padding: 12px; /* Espaciado interno */ + border: 1px solid #ddd; /* Bordes claros */ +} + +/* Estilo para celdas */ +.gestion-precios-td { + padding: 12px; /* Espaciado interno */ + text-align: center; /* Texto centrado */ + border: 1px solid #ddd; /* Bordes claros */ + font-size: 14px; + color: #333; /* Texto oscuro */ + background-color: #fff; /* Fondo blanco */ +} + +/* Resaltado en filas al pasar el cursor */ +.gestion-precios-td:hover { + background-color: #f0f0f0; /* Fondo gris claro */ +} + +/* Inputs dentro de las celdas */ .gestion-precios-input { - -moz-appearance: textfield; /* Firefox */ - -webkit-appearance: none; /* Chrome, Safari */ - appearance: none; /* Otros navegadores */ - /* O el valor que desees en píxeles */ - /* O puedes usar otras unidades como %, em, rem, etc. */ + width: 100%; /* Ocupa todo el ancho de la celda */ + padding: 8px; + font-size: 14px; + border: 1px solid #ccc; + border-radius: 4px; + box-sizing: border-box; /* Asegura que el padding no desborde */ +} +/* Inputs enfocados */ +.gestion-precios-input:focus { + border-color: #007bff; /* Azul para el borde al enfocar */ + outline: none; /* Elimina el contorno predeterminado */ + box-shadow: 0 0 5px rgba(0, 123, 255, 0.3); /* Sombra azul clara */ } -/* Para asegurar que los estilos se apliquen correctamente */ -.gestion-precios-input::-webkit-outer-spin-button, -.gestion-precios-input::-webkit-inner-spin-button { - -webkit-appearance: none; - margin: 0; +/* Estilo para selects dentro de la tabla */ +.gestion-precios-input select { + width: 100%; + padding: 8px; + font-size: 14px; + border: 1px solid #ccc; + border-radius: 4px; +} + +/* Fila de la tabla */ +.gestion-precios-row { + transition: background-color 0.3s ease; /* Transición suave para el hover */ +} + +/* Placeholder para fechas */ +.date-input-container .placeholder { + + top: 50%; + left: 10px; + transform: translateY(-50%); + color: #aaa; + pointer-events: none; /* Evita interferencia con clics */ + } +/* Sombra al hacer hover sobre los campos */ +.date-input-container input:focus { + box-shadow: 0 0 5px rgba(0, 123, 255, 0.5); +} + + + - /* Button */ - .gestion-precios-button { - background-color: #fc7b03 !important; /* Color de fondo naranja */ - color: white; - font-weight: bold !important; /* Texto en negrita */ - border-radius: 20px; /* Bordes redondeados */ - padding: 10px 20px; /* Tamaño del botón */ - cursor: pointer; /* Icono de mano al pasar el mouse */ - transition: background-color 0.3s; /* Transición suave */ - border: none; /* Sin borde */ + + + + .gestion-precios-container-button { + text-align: right; /* Alinea el texto y los elementos inline a la derecha */ + padding: 10px; /* Espaciado opcional */ + } .date-input-container { - position: relative; + width: 100%; /* Asegúrate de que ocupe todo el ancho disponible de la celda */ + max-width: 300px; /* Ajusta este valor según el tamaño deseado */ display: flex; + flex-direction: column; /* Para organizar los elementos verticalmente */ + gap: 20px; + } - .date-placeholder { - color: transparent; + + + + + + .date-input-container input[type="date"] { + width: 100%; /* Ocupa todo el ancho del contenedor */ + padding: 8px; /* Espaciado interno */ + font-size: 14px; /* Tamaño de fuente */ + border: 1px solid #ccc; /* Bordes suaves */ + border-radius: 4px; /* Bordes redondeados */ + } - .date-input-container .placeholder { - position: absolute; - top: 50%; - left: 10px; - transform: translateY(-50%); - color: #aaa; - pointer-events: none; /* Para que no interfiera con los clics */ + + .gestion-precios-header { + display: flex; /* Activa Flexbox */ + justify-content: space-between; /* Título a la izquierda, botón a la derecha */ + align-items: center; /* Alinea verticalmente ambos elementos */ + margin-bottom: 20px; /* Espacio debajo del encabezado */ + padding: 15px; + margin-left: 10px; + margin-top: 20px; + margin-bottom: 0; } - input[type="date"]:focus + .placeholder { - display: none; + .gestion-precios-title { + font-size: 24px; /* Tamaño del título */ + font-weight: bold; /* Negrita */ + margin: 0; /* Elimina márgenes extra */ + } + + .gestion-precios-button { + background-color: #fc7b03; /* Color de fondo */ + color: white; /* Color del texto */ + font-weight: bold; /* Negrita */ + border-radius: 20px; /* Bordes redondeados */ + padding: 10px 20px; /* Tamaño del botón */ + cursor: pointer; /* Cursor de mano al pasar */ + transition: background-color 0.3s; /* Transición suave */ + border: none; /* Sin borde */ + font-size: 16px; /* Ajusta el tamaño del texto del botón */ } diff --git a/src/styles/users/notification.css b/src/styles/users/notification.css index 279cf90..47ebbe6 100644 --- a/src/styles/users/notification.css +++ b/src/styles/users/notification.css @@ -333,6 +333,7 @@ body { gap: 10px; /* Espaciado entre los días */ margin-top: 10px; /* Espaciado superior respecto al input y select */ flex-wrap: wrap; /* Permitir que los días se acomoden en varias filas si es necesario */ + } @@ -396,35 +397,29 @@ body { /* Quitar estilos predeterminados de focus */ .repeat-number:focus, .repeat-select:focus { - border-color: #8c52ff; /* Color del borde al enfocar */ + border-color: #ffa426; /* Color del borde al enfocar */ outline: none; /* Eliminar contorno predeterminado */ } /* Contenedor del dropdown adicional */ .month-options-container { display: flex; /* Usa flexbox */ - justify-content: center; /* Centra horizontalmente */ - margin-top: 15px; /* Espaciado superior */ + + + padding: 30px; } /* Dropdown adicional */ .month-options-dropdown { - width: 60%; /* Ancho ajustado al contenido */ - padding: 10px; + width: 100%; /* Ancho ajustado al contenido */ font-size: 14px; border: 1px solid #ccc; border-radius: 5px; background-color: #fff; } -/* Aumentar el tamaño del radio button */ -/* Contenedor principal */ -.termination-options { - margin-top: 20px; -} - -/* Estilo de cada opción */ +/* Estilo del contenedor para las opciones de "Termina" */ .termination-item { display: flex; align-items: center; @@ -437,7 +432,29 @@ body { width: 18px; height: 18px; margin-right: 10px; - vertical-align: middle; + border: 1px solid #ccc; + border-radius: 5px; + background-color: #fff; + appearance: none; /* Elimina el diseño predeterminado */ + cursor: pointer; +} + +/* Radio Buttons activos */ +.termination-item input[type="radio"]:checked { + background-color: #ffa920; + border-color: #000000; +} + +/* Inputs adicionales (deshabilitados) */ +.termination-date, +.termination-number { + height: 40px; /* Coincide con el height del dropdown y input number */ + padding: 5px 10px; + font-size: 14px; + border: 1px solid #ccc; + border-radius: 5px; + box-sizing: border-box; + width: auto; /* Ajusta según el contenido */ } /* Inputs deshabilitados */ @@ -449,10 +466,37 @@ body { cursor: not-allowed; } +/* Inputs habilitados */ +.termination-date:enabled, +.termination-number:enabled { + border-color: #000000; +} -/* Título de la sección "Termina" */ +/* Opciones de repetición */ +.repetition-container { + display: flex; + align-items: center; + gap: 5px; +} + +/* Etiqueta de repetición */ +.repetition-label { + font-size: 14px; + color: #333; +} +.termination-options { + display: flex; + flex-direction: column; + gap: 15px; /* Espaciado entre opciones */ + padding: 10px; + border: 1px solid #ccc; + border-radius: 5px; + background-color: #fff; + width: 100%; +} .termination-title { font-size: 16px; - font-weight: bold; + font-weight: 500; + color: #333; margin-bottom: 10px; }