Feat: Implementar asignación rápida de puntajes con botón de nube cáustica
All checks were successful
build-and-deploy / build-and-deploy (push) Successful in 1m8s

- Crear ModalAsignacionRapida.vue con lógica de distribución por múltiplos de 8
  - Input numérico (8-80) para puntaje total deseado
  - Cálculo automático del múltiplo de 8 más cercano
  - Si múltiplo < valor: permite seleccionar categorías que sobresalen (+1)
  - Si múltiplo > valor: permite seleccionar categorías que palidecen (-1)
  - Si múltiplo = valor: asignación directa sin ajustes

- Crear BotonNubeCaustica.vue con diseño especial
  - Forma de nube usando SVG path
  - Animación de patrones de luz cáustica con gradientes animados
  - Efectos de brillo y ondas al hacer hover
  - Icono de rayo mágico con animación sparkle

- Integrar funcionalidad en FormularioMuestra.vue
  - Ubicar botón en esquina superior izquierda de sección Descriptiva/Afectiva
  - Aplicar puntajes calculados a todas las categorías descriptivas
  - Actualizar puntaje final automáticamente

- Corregir comentario: "Suma de valores descriptivos" (era "afectivos")
This commit is contained in:
2025-10-19 00:56:20 -06:00
parent 23e94fca2f
commit f6dc2c3bce
3 changed files with 531 additions and 1 deletions

View File

@@ -70,6 +70,11 @@
<!-- Tab 2: Descriptiva/Afectiva (todos los sliders incluyendo impresión global) -->
<div v-if="tabActiva === 'descriptiva-afectiva'" class="tab-content cata-fade-in">
<!-- Botón de asignación rápida -->
<div class="flex justify-start mb-4">
<CataBotonNubeCaustica @click="modalAsignacionRapida = true" />
</div>
<!-- Sliders de Fragancia -->
<div v-if="mostrarFraganciaSlider" class="form-section">
<div class="flex items-center justify-between mb-2">
@@ -796,11 +801,18 @@
<span class="text-3xl font-bold cata-text">{{ muestra.puntajeFinal }}</span>
</div>
<p class="text-xs cata-text opacity-60 mt-1">
Suma de valores afectivos
Suma de valores descriptivos
</p>
</div>
</div>
</div>
<!-- Modal de Asignación Rápida -->
<CataModalAsignacionRapida
v-model="modalAsignacionRapida"
:muestra="muestra"
@aplicar="aplicarAsignacionRapida"
/>
</div>
</template>
@@ -937,6 +949,17 @@ const mostrarImpresionGlobalAfectiva = computed(() => deberMostrarSlider('afecti
// Estado local para otras notas
const otrasNotasLocal = ref(props.muestra.otrasNotas)
// Estado del modal de asignación rápida
const modalAsignacionRapida = ref(false)
// Aplicar asignación rápida de puntajes
const aplicarAsignacionRapida = async (puntajes: Record<string, number>) => {
// Aplicar cada puntaje a su categoría correspondiente
for (const [categoria, puntaje] of Object.entries(puntajes)) {
await actualizarIntensidad(categoria as keyof Muestra['intensidades'], 'descriptiva', puntaje)
}
}
// Actualizar intensidad
const actualizarIntensidad = async (
parametro: keyof Muestra['intensidades'],