From f0e54a20d8150ef7536b305df845ddb532e151d5 Mon Sep 17 00:00:00 2001 From: Onni Tammi Date: Mon, 18 Aug 2025 14:30:22 +0300 Subject: [PATCH] Retain submitted input in acceptPost exercises Fixes #1475 --- exercise/static/exercise/chapter.js | 48 +++++++++++++++++++---------- 1 file changed, 31 insertions(+), 17 deletions(-) diff --git a/exercise/static/exercise/chapter.js b/exercise/static/exercise/chapter.js index 480ddd8d2..54f439020 100644 --- a/exercise/static/exercise/chapter.js +++ b/exercise/static/exercise/chapter.js @@ -184,7 +184,7 @@ response_selector: '.exercise-response', navigation_selector: 'ul.nav a[class!="dropdown-toggle"]', dropdown_selector: 'ul.nav .dropdown-toggle', - last_submission_selector: 'ul.nav ul.dropdown-menu li:first-child a', + last_submission_selector: 'ul.navbar-nav ul.dropdown-menu li:first-child a', // For active elements: active_element_attr: "data-aplus-active-element", interactive_code_attr: "data-aplus-interactive-code", @@ -377,8 +377,12 @@ .done(function(data) { exercise.hideLoader(); exercise.update($(data)); + const hasTextarea = exercise.element.find('textarea').length > 0; + const hasFieldset = exercise.element.find('fieldset').length > 0; if (exercise.active_element) { exercise.loadLastSubmission($(data)); + } else if (hasTextarea && !hasFieldset) { // Identify acceptPost exercises + exercise.loadLastSubmission($(data), true); } else { exercise.renderMath(); if (!onlyThis) exercise.chapter.nextExercise(); @@ -849,7 +853,7 @@ } }, - loadLastSubmission: function(input) { + loadLastSubmission: function(input, fillInputs = false) { var link = input.find(this.settings.last_submission_selector); var exercise = this; if (link.length > 0) { @@ -857,7 +861,7 @@ if (url && url !== "#") { var data_type = "html"; - if (exercise.active_element) { + if (exercise.active_element || fillInputs) { // Active element input values are retrieved from the API, so // we must extract the submission number from the submission url var submission = url.match(/submissions\/\d+/)[0].split('/')[1]; @@ -875,20 +879,30 @@ if (!exercise.active_element) { const responseElement = exercise.element.find(exercise.settings.response_selector); - // Remove only the exercise content, not the alerts above it - responseElement.children().not('.alert').remove(); - responseElement.append( - $(data).filter(exercise.settings.exercise_selector).contents() - ); - exercise.dom_element.dispatchEvent( - new CustomEvent("aplus:exercise-loaded", - {bubbles: true, detail: {type: exercise.exercise_type}})); - // TODO: remove magic constant (variable defined in group.js) - responseElement.removeClass('group-augmented'); - exercise.bindFormEvents(exercise.element); - exercise.dom_element.dispatchEvent( - new CustomEvent("aplus:exercise-ready", - {bubbles: true, detail: {type: exercise.exercise_type}})); + if (!fillInputs) { + // Remove only the exercise content, not the alerts above it + responseElement.children().not('.alert').remove(); + responseElement.append( + $(data).filter(exercise.settings.exercise_selector).contents() + ); + exercise.dom_element.dispatchEvent( + new CustomEvent("aplus:exercise-loaded", + {bubbles: true, detail: {type: exercise.exercise_type}})); + // TODO: remove magic constant (variable defined in group.js) + responseElement.removeClass('group-augmented'); + exercise.bindFormEvents(exercise.element); + exercise.dom_element.dispatchEvent( + new CustomEvent("aplus:exercise-ready", + {bubbles: true, detail: {type: exercise.exercise_type}})); + } else { + // Fill textareas with last submission inputs + const lastInputs = data.submission_data.map((x) => x[1]); + const textareas = responseElement.find('textarea'); + textareas.each(function(index) { + $(this).val(lastInputs[index]); + }); + } + } else { // Update the output box values exercise.updateOutput(data.feedback);