MDL-66958 core_grade: Add comparison js for grade saves
[moodle.git] / grade / amd / src / grades / grader / gradingpanel / comparison.js
1 // This file is part of Moodle - http://moodle.org/
2 //
3 // Moodle is free software: you can redistribute it and/or modify
4 // it under the terms of the GNU General Public License as published by
5 // the Free Software Foundation, either version 3 of the License, or
6 // (at your option) any later version.
7 //
8 // Moodle is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 // GNU General Public License for more details.
12 //
13 // You should have received a copy of the GNU General Public License
14 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
16 /**
17  * Compare a given form's values and its previously set data attributes.
18  *
19  * @module     core_grades/grades/grader/gradingpanel/comparison
20  * @package    core_grades
21  * @copyright  2019 Mathew May <mathew.solutions>
22  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23  */
25 export const fillInitialValues = (form) => {
26     Array.prototype.forEach.call(form.elements, (input) => {
27         if (input.type === 'submit' || input.type === 'button') {
28             return;
29         } else if (input.type === 'radio' || input.type === 'checkbox') {
30             input.dataset.initialValue = JSON.stringify(input.checked);
31         } else if (typeof input.value !== 'undefined') {
32             input.dataset.initialValue = JSON.stringify(input.value);
33         } else if (input.type === 'select-one') {
34             Array.prototype.forEach.call(input.options, (option) => {
35                 option.dataset.initialValue = JSON.stringify(option.selected);
36             });
37         }
38    });
39 };
42 /**
43  * Compare the form data with the initial form data from when the form was set up.
44  *
45  * If values have changed, return a truthy value.
46  *
47  * @param {HTMLElement} form
48  * @return {Boolean}
49  */
50 export const compareData = (form) => {
51     const result = Array.prototype.some.call(form.elements, (input) => {
52         if (input.type === 'submit' || input.type === 'button') {
53             return false;
54         } else if (input.type === 'radio' || input.type === 'checkbox') {
55             if (typeof input.dataset.initialValue !== 'undefined') {
56                 return input.dataset.initialValue !== JSON.stringify(input.checked);
57             }
58         } else if (typeof input.value !== 'undefined') {
59             if (typeof input.dataset.initialValue !== 'undefined') {
60                 return input.dataset.initialValue !== JSON.stringify(input.value);
61             }
62         } else if (input.type === 'select-one') {
63             return Array.prototype.some.call(input.options, (option) => {
64                 if (typeof option.dataset.initialValue !== 'undefined') {
65                     return option.dataset.initialValue !== JSON.stringify(option.selected);
66                 }
68                 return false;
69             });
70         }
72         // No value found to check. Assume that there were changes.
73         return true;
74     });
76     // Fill the initial values again as the form may not be reloaded.
77     fillInitialValues(form);
79     return result;
80 };