Feat: Reorganizar tabs y permitir selección múltiple de categorías en notas
All checks were successful
build-and-deploy / build-and-deploy (push) Successful in 1m1s

- **Nuevas tabs reorganizadas:**
  - Organoléptica: Selectores de familia de fragancia-aroma y sabor
  - Descriptiva/Afectiva: Todos los sliders de intensidad (incluye impresión global)
  - Defectos: Tazas no uniformes, defectuosas y tipo de defecto
  - Impresión Global: Vista completa con todos los componentes

- **Selector de categorías mejorado:**
  - Permitir selección múltiple de categorías padre
  - Las subcategorías son la unión de las subcategorías de los padres seleccionados
  - Permitir selección múltiple de subcategorías
  - Actualizar resumen visual de selección

- **Tipos actualizados:**
  - NotaSeleccionada ahora usa arrays para categorias y subcategorias
  - TabCatacion actualizado con las nuevas tabs
  - Funciones de actualización modificadas para trabajar con arrays

- **Correcciones TypeScript:**
  - Usar JSON.parse(JSON.stringify()) para crear copias mutables de arrays readonly
  - Resolver incompatibilidades de tipos entre readonly y mutable arrays
This commit is contained in:
2025-10-18 02:57:14 -06:00
parent 1c4f09d9bd
commit 48e0d2f7dc
5 changed files with 481 additions and 181 deletions

View File

@@ -211,14 +211,19 @@ const toggleTheme = () => {
// Definición de tabs
const tabs = [
{
value: 'fragancia-aroma' as TabCatacion,
label: 'Fragancia/Aroma',
value: 'organoleptica' as TabCatacion,
label: 'Organoléptica',
icon: 'i-lucide-flower-2',
},
{
value: 'sabor' as TabCatacion,
label: 'Sabor',
icon: 'i-lucide-coffee',
value: 'descriptiva-afectiva' as TabCatacion,
label: 'Descriptiva/Afectiva',
icon: 'i-lucide-sliders-horizontal',
},
{
value: 'defectos' as TabCatacion,
label: 'Defectos',
icon: 'i-lucide-alert-triangle',
},
{
value: 'impresion-global' as TabCatacion,
@@ -244,7 +249,9 @@ const obtenerMuestraPorValue = (value: string): Muestra | null => {
// Extraer el ID de la muestra del value (formato: "muestra-{id}")
const muestraId = parseInt(value.replace('muestra-', ''))
return sesionActiva.value.muestras.find(m => m.muestraId === muestraId) || null
const muestra = sesionActiva.value.muestras.find(m => m.muestraId === muestraId)
if (!muestra) return null
return JSON.parse(JSON.stringify(muestra)) as Muestra
}
// Inicializar al montar