MDL-66958 core_grade: Add comparison js for grade saves

This commit is contained in:
Mathew May 2019-11-05 10:48:28 +08:00
parent 80dcc83400
commit f418c08c31
6 changed files with 88 additions and 2 deletions

View File

@ -0,0 +1,2 @@
define ("core_grades/grades/grader/gradingpanel/comparison",["exports"],function(a){"use strict";Object.defineProperty(a,"__esModule",{value:!0});a.compareData=a.fillInitialValues=void 0;var b=function(a){Array.prototype.forEach.call(a.elements,function(a){if("submit"===a.type||"button"===a.type){}else if("radio"===a.type||"checkbox"===a.type){a.dataset.initialValue=JSON.stringify(a.checked)}else if("undefined"!=typeof a.value){a.dataset.initialValue=JSON.stringify(a.value)}else if("select-one"===a.type){Array.prototype.forEach.call(a.options,function(a){a.dataset.initialValue=JSON.stringify(a.selected)})}})};a.fillInitialValues=b;a.compareData=function compareData(a){var c=Array.prototype.some.call(a.elements,function(a){if("submit"===a.type||"button"===a.type){return!1}else if("radio"===a.type||"checkbox"===a.type){if("undefined"!=typeof a.dataset.initialValue){return a.dataset.initialValue!==JSON.stringify(a.checked)}}else if("undefined"!=typeof a.value){if("undefined"!=typeof a.dataset.initialValue){return a.dataset.initialValue!==JSON.stringify(a.value)}}else if("select-one"===a.type){return Array.prototype.some.call(a.options,function(a){if("undefined"!=typeof a.dataset.initialValue){return a.dataset.initialValue!==JSON.stringify(a.selected)}return!1})}return!0});b(a);return c}});
//# sourceMappingURL=comparison.min.js.map

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,80 @@
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Compare a given form's values and its previously set data attributes.
*
* @module core_grades/grades/grader/gradingpanel/comparison
* @package core_grades
* @copyright 2019 Mathew May <mathew.solutions>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
export const fillInitialValues = (form) => {
Array.prototype.forEach.call(form.elements, (input) => {
if (input.type === 'submit' || input.type === 'button') {
return;
} else if (input.type === 'radio' || input.type === 'checkbox') {
input.dataset.initialValue = JSON.stringify(input.checked);
} else if (typeof input.value !== 'undefined') {
input.dataset.initialValue = JSON.stringify(input.value);
} else if (input.type === 'select-one') {
Array.prototype.forEach.call(input.options, (option) => {
option.dataset.initialValue = JSON.stringify(option.selected);
});
}
});
};
/**
* Compare the form data with the initial form data from when the form was set up.
*
* If values have changed, return a truthy value.
*
* @param {HTMLElement} form
* @return {Boolean}
*/
export const compareData = (form) => {
const result = Array.prototype.some.call(form.elements, (input) => {
if (input.type === 'submit' || input.type === 'button') {
return false;
} else if (input.type === 'radio' || input.type === 'checkbox') {
if (typeof input.dataset.initialValue !== 'undefined') {
return input.dataset.initialValue !== JSON.stringify(input.checked);
}
} else if (typeof input.value !== 'undefined') {
if (typeof input.dataset.initialValue !== 'undefined') {
return input.dataset.initialValue !== JSON.stringify(input.value);
}
} else if (input.type === 'select-one') {
return Array.prototype.some.call(input.options, (option) => {
if (typeof option.dataset.initialValue !== 'undefined') {
return option.dataset.initialValue !== JSON.stringify(option.selected);
}
return false;
});
}
// No value found to check. Assume that there were changes.
return true;
});
// Fill the initial values again as the form may not be reloaded.
fillInitialValues(form);
return result;
};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -31,6 +31,7 @@ import {get_string as getString} from 'core/str';
import {failedUpdate} from 'core_grades/grades/grader/gradingpanel/normalise';
import {addIconToContainerWithPromise} from 'core/loadingicon';
import {debounce} from 'core/utils';
import {fillInitialValues} from 'core_grades/grades/grader/gradingpanel/comparison';
const templateNames = {
grader: {
@ -95,6 +96,8 @@ const getUpdateUserContentFunction = (root, getContentForUser, getGradeForUser)
const panelContainer = root.querySelector(Selectors.regions.gradingPanelContainer);
const panel = panelContainer.querySelector(Selectors.regions.gradingPanel);
Templates.replaceNodeContents(panel, gradingPanelHtml, gradingPanelJS);
fillInitialValues(panel.querySelector('form'));
panelContainer.scrollTop = 0;
firstLoad = false;