Feat: Implementar selección múltiple y filtrado de subcategorías
All checks were successful
build-and-deploy / build-and-deploy (push) Successful in 1m5s

- Cambiar subcategoriaActiva a subcategoriasActivas (array) para permitir selección múltiple
- Agregar flex-wrap a barra de subcategorías en lugar de scroll horizontal
- Implementar toggleSubcategoria para agregar/quitar subcategorías
- Pasar subcategoriasActivas a FormularioMuestra como prop
- Agregar helpers deberMostrarSeccion para filtrar inputs
- Aplicar v-if a todas las secciones según subcategorías activas
- Botón Limpiar Todo para resetear filtros
This commit is contained in:
2025-10-18 14:47:38 -06:00
parent b639aa24bb
commit 8cf62f0057
3 changed files with 66 additions and 22 deletions

View File

@@ -129,25 +129,25 @@
<!-- Subcategorías -->
<div v-if="subcategoriasDisponibles.length > 0" class="subcategorias-container border-t">
<div class="container mx-auto px-4">
<div class="flex overflow-x-auto gap-1 py-1.5">
<div class="flex flex-wrap gap-1 py-1.5">
<button
v-for="subcategoria in subcategoriasDisponibles"
:key="subcategoria.value"
:class="[
'subcategoria-chip',
{ 'subcategoria-chip-active': subcategoriaActiva === subcategoria.value },
{ 'subcategoria-chip-active': subcategoriasActivas.includes(subcategoria.value) },
]"
@click="subcategoriaActiva = subcategoria.value"
@click="toggleSubcategoria(subcategoria.value)"
>
{{ subcategoria.label }}
</button>
<button
v-if="subcategoriaActiva !== null"
v-if="subcategoriasActivas.length > 0"
class="subcategoria-chip subcategoria-chip-clear"
@click="subcategoriaActiva = null"
@click="subcategoriasActivas = []"
>
<UIcon name="i-lucide-x" class="w-3 h-3 inline mr-1" />
Limpiar
Limpiar Todo
</button>
</div>
</div>
@@ -180,6 +180,7 @@
v-if="sesionActiva && obtenerMuestraPorValue(item.value)"
:muestra="obtenerMuestraPorValue(item.value)!"
:tab-activa="tabActiva"
:subcategorias-activas="subcategoriasActivas"
/>
<div v-else class="text-error">
Error: No se pudo cargar la muestra (value: {{ item.value }})
@@ -215,7 +216,7 @@ const {
cargando,
error,
tabActiva,
subcategoriaActiva,
subcategoriasActivas,
accordionAbierto,
exportarSesion,
eliminarSesionActual,
@@ -337,10 +338,24 @@ onMounted(async () => {
// Cambiar tab
const cambiarTab = (tab: TabCatacion) => {
tabActiva.value = tab
subcategoriaActiva.value = null // Limpiar subcategoría al cambiar de tab
subcategoriasActivas.value = [] // Limpiar subcategorías al cambiar de tab
mostrarMenu.value = false
}
// Toggle subcategoría (selección múltiple)
const toggleSubcategoria = (subcategoria: Subcategoria) => {
if (!subcategoria) return
const index = subcategoriasActivas.value.indexOf(subcategoria)
if (index > -1) {
// Ya está seleccionada, removerla
subcategoriasActivas.value = subcategoriasActivas.value.filter(s => s !== subcategoria)
} else {
// No está seleccionada, agregarla
subcategoriasActivas.value = [...subcategoriasActivas.value, subcategoria]
}
}
// Formatear fecha
const formatearFecha = (fecha: string): string => {
const date = new Date(fecha)