Frontend (v1.0.95)

Ordenamiento consistente de preguntas (App.jsx):

Las preguntas ahora se ordenan por el campo order antes de agruparse por sección
Esto asegura que el orden se mantenga exactamente como está en el backend
Ordenamiento de secciones (App.jsx):

Las secciones se ordenan por el order mínimo de sus preguntas
Garantiza que las secciones aparezcan en orden lógico y consistente
Mejora en drag-and-drop (App.jsx):

Al reordenar, ahora se ordenan las preguntas por order antes de calcular nuevas posiciones
Los nuevos valores de order se asignan correctamente preservando el orden relativo
Funciona correctamente con una sola sección y con subpreguntas
Ordenamiento en modo inspección (App.jsx):

getVisibleQuestions() ahora ordena las preguntas visibles por su campo order
Mantiene el orden correcto durante la ejecución de inspecciones
Backend (v1.0.92)
No se requirieron cambios en el backend (ya estaba ordenando correctamente con order_by(models.Question.order))
This commit is contained in:
2025-12-02 15:50:22 -03:00
parent 7f50bfd8c6
commit de5f09a351
4 changed files with 34 additions and 19 deletions

View File

@@ -1,7 +1,7 @@
{
"name": "checklist-frontend",
"private": true,
"version": "1.0.94",
"version": "1.0.95",
"type": "module",
"scripts": {
"dev": "vite",

View File

@@ -1,6 +1,6 @@
// Service Worker para PWA con detección de actualizaciones
// IMPORTANTE: Actualizar esta versión cada vez que se despliegue una nueva versión
const CACHE_NAME = 'ayutec-v1.0.94';
const CACHE_NAME = 'ayutec-v1.0.95';
const urlsToCache = [
'/',
'/index.html'

View File

@@ -1459,10 +1459,11 @@ function QuestionsManagerModal({ checklist, onClose }) {
// Solo subpreguntas del mismo padre
questionsList = questions.filter(q =>
q.parent_question_id === draggedQuestion.parent_question_id
)
).sort((a, b) => a.order - b.order) // Ordenar por order actual
} else {
// Solo preguntas padre (sin parent_question_id)
questionsList = questions.filter(q => !q.parent_question_id)
.sort((a, b) => a.order - b.order) // Ordenar por order actual
}
const draggedIndex = questionsList.findIndex(q => q.id === draggedQuestion.id)
@@ -1473,10 +1474,11 @@ function QuestionsManagerModal({ checklist, onClose }) {
const [movedQuestion] = newList.splice(draggedIndex, 1)
newList.splice(targetIndex, 0, movedQuestion)
// Preparar datos para el backend (solo las preguntas afectadas)
// Preparar datos para el backend usando los valores de 'order' originales
// Esto mantiene el orden relativo correcto con respecto a otras preguntas
const reorderData = newList.map((q, index) => ({
question_id: q.id,
new_order: index
new_order: questionsList[index].order // Usar el order de la posición correspondiente
}))
try {
@@ -1506,7 +1508,11 @@ function QuestionsManagerModal({ checklist, onClose }) {
setDragOverQuestion(null)
}
const questionsBySection = questions.reduce((acc, q) => {
// Primero ordenar todas las preguntas por el campo 'order' para mantener el orden del backend
const sortedQuestions = [...questions].sort((a, b) => a.order - b.order)
// Luego agrupar por sección manteniendo el orden
const questionsBySection = sortedQuestions.reduce((acc, q) => {
const section = q.section || 'Sin sección'
if (!acc[section]) acc[section] = []
acc[section].push(q)
@@ -1867,7 +1873,14 @@ function QuestionsManagerModal({ checklist, onClose }) {
</div>
) : (
<div className="space-y-6">
{Object.entries(questionsBySection).map(([section, sectionQuestions]) => (
{Object.entries(questionsBySection)
.sort(([, questionsA], [, questionsB]) => {
// Ordenar secciones por el 'order' mínimo de sus preguntas
const minOrderA = Math.min(...questionsA.map(q => q.order))
const minOrderB = Math.min(...questionsB.map(q => q.order))
return minOrderA - minOrderB
})
.map(([section, sectionQuestions]) => (
<div key={section} className="border border-gray-200 rounded-lg overflow-hidden">
<div className="bg-gray-100 px-4 py-3">
<h3 className="font-semibold text-gray-900">{section}</h3>
@@ -4333,17 +4346,19 @@ function InspectionModal({ checklist, existingInspection, user, onClose, onCompl
// Get visible questions based on conditional logic
const getVisibleQuestions = () => {
return questions.filter(q => {
// If no parent, always visible
if (!q.parent_question_id) return true
// Check parent answer
const parentAnswer = answers[q.parent_question_id]
if (!parentAnswer) return false
// Show if parent answer matches trigger
return parentAnswer.value === q.show_if_answer
})
return questions
.filter(q => {
// If no parent, always visible
if (!q.parent_question_id) return true
// Check parent answer
const parentAnswer = answers[q.parent_question_id]
if (!parentAnswer) return false
// Show if parent answer matches trigger
return parentAnswer.value === q.show_if_answer
})
.sort((a, b) => a.order - b.order) // Mantener orden del backend
}
// Move to signatures step