Corregido Drag & Drop con Validación de Niveles

Cambios v1.0.74
Lógica Implementada:

Preguntas padre solo se pueden reordenar entre sí
Subpreguntas solo se pueden reordenar con otras subpreguntas del mismo padre
No se permite arrastrar una pregunta padre dentro de subpreguntas o viceversa
Validaciones:

 En handleDragOver: Cursor none si intentas arrastrar entre diferentes niveles
 En handleDrop: Mensajes de error claros si intentas mezclar niveles
 Filtrado inteligente: Solo reordena el grupo correcto de preguntas
This commit is contained in:
2025-11-27 16:47:05 -03:00
parent 2d520e03d6
commit ce151631ab
3 changed files with 53 additions and 4 deletions

View File

@@ -1229,6 +1229,25 @@ function QuestionsManagerModal({ checklist, onClose }) {
const handleDragOver = (e, question) => {
e.preventDefault()
// Validar que ambas preguntas sean del mismo nivel (padre-padre o hijo-hijo del mismo padre)
if (draggedQuestion) {
const draggedIsChild = !!draggedQuestion.parent_question_id
const targetIsChild = !!question.parent_question_id
// No permitir mezclar niveles
if (draggedIsChild !== targetIsChild) {
e.dataTransfer.dropEffect = 'none'
return
}
// Si son hijos, deben ser del mismo padre
if (draggedIsChild && draggedQuestion.parent_question_id !== question.parent_question_id) {
e.dataTransfer.dropEffect = 'none'
return
}
}
e.dataTransfer.dropEffect = 'move'
setDragOverQuestion(question)
}
@@ -1245,8 +1264,38 @@ function QuestionsManagerModal({ checklist, onClose }) {
setDragOverQuestion(null)
return
}
// Validar que sean del mismo nivel
const draggedIsChild = !!draggedQuestion.parent_question_id
const targetIsChild = !!targetQuestion.parent_question_id
if (draggedIsChild !== targetIsChild) {
alert('⚠️ Solo puedes reordenar preguntas del mismo nivel')
setDraggedQuestion(null)
setDragOverQuestion(null)
return
}
// Si son hijos, validar que sean del mismo padre
if (draggedIsChild && draggedQuestion.parent_question_id !== targetQuestion.parent_question_id) {
alert('⚠️ Solo puedes reordenar subpreguntas del mismo padre')
setDraggedQuestion(null)
setDragOverQuestion(null)
return
}
const questionsList = Object.values(questionsBySection).flat()
// Filtrar solo las preguntas del mismo nivel/grupo
let questionsList
if (draggedIsChild) {
// Solo subpreguntas del mismo padre
questionsList = questions.filter(q =>
q.parent_question_id === draggedQuestion.parent_question_id
)
} else {
// Solo preguntas padre (sin parent_question_id)
questionsList = questions.filter(q => !q.parent_question_id)
}
const draggedIndex = questionsList.findIndex(q => q.id === draggedQuestion.id)
const targetIndex = questionsList.findIndex(q => q.id === targetQuestion.id)
@@ -1255,7 +1304,7 @@ function QuestionsManagerModal({ checklist, onClose }) {
const [movedQuestion] = newList.splice(draggedIndex, 1)
newList.splice(targetIndex, 0, movedQuestion)
// Preparar datos para el backend
// Preparar datos para el backend (solo las preguntas afectadas)
const reorderData = newList.map((q, index) => ({
question_id: q.id,
new_order: index