Fix: Cambiar accordion de multiple a single con collapsible
All checks were successful
build-and-deploy / build-and-deploy (push) Successful in 1m6s
All checks were successful
build-and-deploy / build-and-deploy (push) Successful in 1m6s
- Cambiar de type='multiple' a type='single' (solo un item abierto a la vez) - Todos los accordions pueden estar cerrados (collapsible: true por defecto) - Actualizar estado accordionAbierto de string[] a string | undefined - Actualizar lógica toggleCollapseAll para modo single - Agregar border-t al content del accordion para mejor separación visual - Actualizar títulos del botón flotante: 'Abrir primera muestra' / 'Cerrar muestra abierta'
This commit is contained in:
@@ -53,7 +53,7 @@ export const useCatacion = () => {
|
|||||||
// Estado de la UI
|
// Estado de la UI
|
||||||
const tabActiva = useState<TabCatacion>('tab-activa', () => 'organoleptica')
|
const tabActiva = useState<TabCatacion>('tab-activa', () => 'organoleptica')
|
||||||
const subcategoriasPorTab = useState<SubcategoriasPorTab>('subcategorias-por-tab', cargarSubcategoriasDesdeStorage)
|
const subcategoriasPorTab = useState<SubcategoriasPorTab>('subcategorias-por-tab', cargarSubcategoriasDesdeStorage)
|
||||||
const accordionAbierto = useState<string[]>('accordion-abierto', () => [])
|
const accordionAbierto = useState<string | undefined>('accordion-abierto', () => undefined)
|
||||||
|
|
||||||
// Computed para obtener las subcategorías de la tab actual
|
// Computed para obtener las subcategorías de la tab actual
|
||||||
const subcategoriasActivas = computed(() => subcategoriasPorTab.value[tabActiva.value])
|
const subcategoriasActivas = computed(() => subcategoriasPorTab.value[tabActiva.value])
|
||||||
@@ -81,7 +81,7 @@ export const useCatacion = () => {
|
|||||||
await guardar(nuevaSesion)
|
await guardar(nuevaSesion)
|
||||||
// Resetear estado de UI
|
// Resetear estado de UI
|
||||||
tabActiva.value = 'organoleptica'
|
tabActiva.value = 'organoleptica'
|
||||||
accordionAbierto.value = []
|
accordionAbierto.value = undefined
|
||||||
return nuevaSesion
|
return nuevaSesion
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error('Error al crear nueva sesión:', err)
|
console.error('Error al crear nueva sesión:', err)
|
||||||
@@ -308,7 +308,7 @@ export const useCatacion = () => {
|
|||||||
try {
|
try {
|
||||||
await eliminar()
|
await eliminar()
|
||||||
tabActiva.value = 'organoleptica'
|
tabActiva.value = 'organoleptica'
|
||||||
accordionAbierto.value = []
|
accordionAbierto.value = undefined
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error('Error al eliminar sesión:', err)
|
console.error('Error al eliminar sesión:', err)
|
||||||
throw err
|
throw err
|
||||||
|
|||||||
@@ -158,12 +158,11 @@
|
|||||||
<div class="muestras-container container mx-auto px-0 sm:px-4 py-4">
|
<div class="muestras-container container mx-auto px-0 sm:px-4 py-4">
|
||||||
<UAccordion
|
<UAccordion
|
||||||
v-model="accordionAbierto"
|
v-model="accordionAbierto"
|
||||||
type="multiple"
|
|
||||||
:items="accordionItems"
|
:items="accordionItems"
|
||||||
:ui="{
|
:ui="{
|
||||||
item: 'border-b border-default',
|
item: 'border-b border-default',
|
||||||
trigger: 'accordion-trigger w-full px-4 py-3 transition-colors',
|
trigger: 'accordion-trigger w-full px-4 py-3 transition-colors',
|
||||||
content: '',
|
content: 'border-t border-default',
|
||||||
}"
|
}"
|
||||||
>
|
>
|
||||||
<!-- Header personalizado con ResumenMuestra -->
|
<!-- Header personalizado con ResumenMuestra -->
|
||||||
@@ -196,7 +195,7 @@
|
|||||||
<button
|
<button
|
||||||
class="floating-action-button cata-button p-2 rounded-full flex items-center justify-center"
|
class="floating-action-button cata-button p-2 rounded-full flex items-center justify-center"
|
||||||
@click="toggleCollapseAll"
|
@click="toggleCollapseAll"
|
||||||
:title="todosColapsados ? 'Expandir todas las muestras' : 'Colapsar todas las muestras'"
|
:title="todosColapsados ? 'Abrir primera muestra' : 'Cerrar muestra abierta'"
|
||||||
>
|
>
|
||||||
<UIcon
|
<UIcon
|
||||||
:name="todosColapsados ? 'i-lucide-maximize-2' : 'i-lucide-minimize-2'"
|
:name="todosColapsados ? 'i-lucide-maximize-2' : 'i-lucide-minimize-2'"
|
||||||
@@ -313,17 +312,17 @@ const obtenerMuestraPorValue = (value: string): Muestra | null => {
|
|||||||
|
|
||||||
// Verificar si todos los acordiones están colapsados
|
// Verificar si todos los acordiones están colapsados
|
||||||
const todosColapsados = computed(() => {
|
const todosColapsados = computed(() => {
|
||||||
return accordionAbierto.value.length === 0
|
return !accordionAbierto.value
|
||||||
})
|
})
|
||||||
|
|
||||||
// Colapsar o expandir todos los acordiones
|
// Colapsar o expandir el primer accordion
|
||||||
const toggleCollapseAll = () => {
|
const toggleCollapseAll = () => {
|
||||||
if (todosColapsados.value) {
|
if (todosColapsados.value) {
|
||||||
// Expandir todos: agregar todos los values
|
// Abrir el primero
|
||||||
accordionAbierto.value = accordionItems.value.map(item => item.value)
|
accordionAbierto.value = accordionItems.value[0]?.value
|
||||||
} else {
|
} else {
|
||||||
// Colapsar todos: vaciar el array
|
// Cerrar todo
|
||||||
accordionAbierto.value = []
|
accordionAbierto.value = undefined
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user