From f418c08c3108d67ff23a8f80a7766d1f494375e2 Mon Sep 17 00:00:00 2001 From: Mathew May Date: Tue, 5 Nov 2019 10:48:28 +0800 Subject: [PATCH] MDL-66958 core_grade: Add comparison js for grade saves --- .../grader/gradingpanel/comparison.min.js | Bin 0 -> 1351 bytes .../grader/gradingpanel/comparison.min.js.map | Bin 0 -> 5523 bytes .../grades/grader/gradingpanel/comparison.js | 80 ++++++++++++++++++ .../amd/build/local/grades/grader.min.js | Bin 7800 -> 7903 bytes .../amd/build/local/grades/grader.min.js.map | Bin 24867 -> 25061 bytes mod/forum/amd/src/local/grades/grader.js | 3 + 6 files changed, 83 insertions(+) create mode 100644 grade/amd/build/grades/grader/gradingpanel/comparison.min.js create mode 100644 grade/amd/build/grades/grader/gradingpanel/comparison.min.js.map create mode 100644 grade/amd/src/grades/grader/gradingpanel/comparison.js diff --git a/grade/amd/build/grades/grader/gradingpanel/comparison.min.js b/grade/amd/build/grades/grader/gradingpanel/comparison.min.js new file mode 100644 index 0000000000000000000000000000000000000000..b5c2fefd78113e70d403aaaec5b43528c87397dc GIT binary patch literal 1351 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 literal 0 HcmV?d00001 diff --git a/grade/amd/src/grades/grader/gradingpanel/comparison.js b/grade/amd/src/grades/grader/gradingpanel/comparison.js new file mode 100644 index 00000000000..2507d8bd346 --- /dev/null +++ b/grade/amd/src/grades/grader/gradingpanel/comparison.js @@ -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 . + +/** + * 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 + * @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; +}; diff --git a/mod/forum/amd/build/local/grades/grader.min.js b/mod/forum/amd/build/local/grades/grader.min.js index b6cee8666773efc2d94ceaa6b4f2b787c2f0719d..a3857854bf72a8578af411e24d816b48ba2e732d 100644 GIT binary patch delta 1013 zcmZuwL2DaF6lN^jQ6yO@jgnZg6m1j}&)Cz&at_7b4%C)qOC%wLwrOb+$VOVrYwgai zW>=DB$t2KIp_lM3DU=>s+TNNJA9@J%7+OjprS#N74n5?MKTyaeZylVLkjs1@!@T#t z_r5p(zVlezr{vC`EK&Dd-&A(sNthw0N4Nu3@?hGfH)_?cWWDZOV3E=4eB0 z^dq9+tI=m9fG@{pNeI7;?UD|xk9){}96y8SU*j|Bt{60x*|5~o!1R6i{ZRIf7KhTI zN2CWMaffV!7tfJCd=_88Xg^&nHt8lCbWNq%yv1EExyRdF@qmZC!@Io4`|v2kfFJ$@ zgYO^CF<1Ds#TS?%k+@gquSeVy5}DCPC|x&{a1lUD79f)-#V{jO6VvCF9$K#Nn4u+2 z*Wyawm&){T(~@)>2WbYDR$5pJL{kqe85$v02%_{I5k~2|2$;SnOt_JKD_!!)z_)Ned6ty%e{T?e@)LpdU6iCS(GR6@t zeKT|&!$qL-(>5V+Usih>1lZPSw{o+wide?w lI1Rt$KE?PC^Jho}2KfuAHC(PL*4T->|0CZgHMn?c?m6~eLudd1 delta 969 zcmaJxZf^FJMxF*psPY_&dYl=2h~PVIXcg$;cZ2@#HP?wSqpx*3mPh&ZjI~Q z;Ax)WCbziFvpk23EglAAl{W|SjH`4~OvG3eAFfzxptCzE$3;suY)O+-G|9tE(y`G- zJEFzjkag^&G(spUWn>KjUVHs8TorPl5G+&$FJ?qr)zg|{tA?VhJR`UE* z-&G2QyUjf*3l+>Fy)9cs`YZy{=VS$zYFfZm-Qbv(b31*#6RuYKE2fK&VNwoOs@q8z zK2?vB0z4Fapb0LxA#}l6p&4EX7vO<#99EnH_?(Ndg|nB=+av-J*OI$$-%U1~Q_O%O zA8_xN>kfK<>*xmQU%h-R~uFmeuy`jS6&%qt#66gZ0{{|F4et zB2?uGF{fx*6*s8P6*kX1J31J`0DP@$+f8lN?_MKh5H{CB-QVvzyurZKJWvWiW|$@VKbNVvMFi zXc~799jf}csj+eYL*;pa&+s1J%Okvx55kA0cO(tVC-Qia#~Z?a*vtJXn&F*HvShP( zk&S@y=4E^5umarko+JaX?mba1Un}-se3yiNYVjcyn<+-$ M-CQ6;@VxoVUsXRc9RL6T diff --git a/mod/forum/amd/build/local/grades/grader.min.js.map b/mod/forum/amd/build/local/grades/grader.min.js.map index bb34334dc4880b35f7c4cb8b90e363ebcaa4a3d1..464f45d9db6dca0a7a8219aec747a7dc19244a22 100644 GIT binary patch delta 204 zcmZ2{i1F!R#tokAOr=?qz1gK112?C$pJOr7DR**o%yx3uadvd{1`*DNPCAK>j(#9^ zzLSoxqho;+h@Io4vJXN=N2RuWfte>ZO+lT!(oV_N~0h#FEvN6 iur#%(GB`CSHMu0eNJBj>zbIE-Q`0&oZ?m20Q*8iQHO9vYRPfbCS4kQ+{e+RY%0Yj5#3}Fv;LPacjLqS1M cEOkUdc|wz{4H>iW46z@x_bk{5vkErbD?hFnbpQYW diff --git a/mod/forum/amd/src/local/grades/grader.js b/mod/forum/amd/src/local/grades/grader.js index d681414ab5e..c9166db8aac 100644 --- a/mod/forum/amd/src/local/grades/grader.js +++ b/mod/forum/amd/src/local/grades/grader.js @@ -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; -- 2.43.0