From 3f037586aec89b531a173f918ac593c4db13d688 Mon Sep 17 00:00:00 2001 From: Dan Poltawski Date: Wed, 18 Jan 2017 16:17:30 +0000 Subject: [PATCH] MDL-57697 survery: migrate validation script from yui2 Just a modernisation of the existing yui2 code to AMD/jQuery and away from alert(); --- mod/survey/amd/build/validation.min.js | 1 + mod/survey/amd/src/validation.js | 71 ++++++++++++++++++++++++++ mod/survey/survey.js | 27 ---------- mod/survey/view.php | 17 ++---- 4 files changed, 76 insertions(+), 40 deletions(-) create mode 100644 mod/survey/amd/build/validation.min.js create mode 100644 mod/survey/amd/src/validation.js delete mode 100644 mod/survey/survey.js diff --git a/mod/survey/amd/build/validation.min.js b/mod/survey/amd/build/validation.min.js new file mode 100644 index 00000000000..004399b74d8 --- /dev/null +++ b/mod/survey/amd/build/validation.min.js @@ -0,0 +1 @@ +define(["jquery","core/str","core/modal_factory","core/notification"],function(a,b,c,d){return{ensureRadiosChosen:function(e,f){var g=b.get_strings([{key:"error",component:"moodle"},{key:"questionsnotanswered",component:"survey"}]).then(function(a){return c.create({type:c.types.CANCEL,title:a[0],body:a[1]})})["catch"](d.exception),h=a("#"+e);h.submit(function(a){var b=!1;return f.forEach(function(a){var c=h.find('input:radio[name="'+a.name+'"]:checked');c.val()==a["default"]&&(b=!0)}),!b||(a.preventDefault(),g.then(function(a){a.show()}),!1)})}}}); \ No newline at end of file diff --git a/mod/survey/amd/src/validation.js b/mod/survey/amd/src/validation.js new file mode 100644 index 00000000000..f04de066643 --- /dev/null +++ b/mod/survey/amd/src/validation.js @@ -0,0 +1,71 @@ +// 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 . + +/** + * Javascript to handle survey validation. + * + * @module mod_survey/validation + * @package mod_survey + * @copyright 2017 Dan Poltawski + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + * @since 3.3 + */ +define(['jquery', 'core/str', 'core/modal_factory', 'core/notification'], function($, Str, ModalFactory, Notification) { + return { + /** + * Prevents form submission until all radio buttons are chosen, displays + * modal error if any choices are missing. + * + * @param {String} formid HTML id of form + * @param {Array} questions + */ + ensureRadiosChosen: function(formid, questions) { + // Prepare modal for display in case of problems. + var modalPromise = Str.get_strings([ + {key: 'error', component: 'moodle'}, + {key: 'questionsnotanswered', component: 'survey'}, + ]).then(function(strings) { + return ModalFactory.create({ + type: ModalFactory.types.CANCEL, + title: strings[0], + body: strings[1], + }); + }).catch(Notification.exception); + + var form = $('#' + formid); + form.submit(function(e) { + var error = false; + questions.forEach(function(question) { + var checkedResponse = form.find('input:radio[name="' + question.name + '"]:checked'); + if (checkedResponse.val() == question.default) { + error = true; + } + }); + + if (error) { + e.preventDefault(); + // Display the modal error. + modalPromise.then(function(modal) { + modal.show(); + return; + }); + return false; + } + + return true; + }); + } + }; +}); diff --git a/mod/survey/survey.js b/mod/survey/survey.js deleted file mode 100644 index 3017570234c..00000000000 --- a/mod/survey/survey.js +++ /dev/null @@ -1,27 +0,0 @@ - -M.mod_survey = {}; - -M.mod_survey.init = function(Y) { - if (document.getElementById('surveyform')) { - var surveyform = document.getElementById('surveyform'); - Y.YUI2.util.Event.addListener('surveyform', "submit", function(e) { - var error = false; - if (document.getElementById('surveyform')) { - var surveyform = document.getElementById('surveyform'); - for (var i=0; i < surveycheck.questions.length; i++) { - var tempquestion = surveycheck.questions[i]; - if (surveyform[tempquestion['question']][tempquestion['default']].checked) { - error = true; - } - } - } - if (error) { - alert(M.util.get_string('questionsnotanswered', 'survey')); - Y.YUI2.util.Event.preventDefault(e); - return false; - } else { - return true; - } - }); - } -}; diff --git a/mod/survey/view.php b/mod/survey/view.php index 7336415a789..139410692dc 100644 --- a/mod/survey/view.php +++ b/mod/survey/view.php @@ -175,20 +175,11 @@ if (!is_enrolled($context)) { exit; } -$checkarray = Array('questions' => Array()); -if (!empty($checklist)) { - foreach ($checklist as $question => $default) { - $checkarray['questions'][] = Array('question' => $question, 'default' => $default); - } +$questions = array(); +foreach ($checklist as $question => $default) { + $questions[] = array('name' => $question, 'default' => $default); } -$PAGE->requires->data_for_js('surveycheck', $checkarray); -$module = array( - 'name' => 'mod_survey', - 'fullpath' => '/mod/survey/survey.js', - 'requires' => array('yui2-event'), -); -$PAGE->requires->string_for_js('questionsnotanswered', 'survey'); -$PAGE->requires->js_init_call('M.mod_survey.init', $checkarray, true, $module); +$PAGE->requires->js_call_amd('mod_survey/validation', 'ensureRadiosChosen', array('surveyform', $questions)); echo '
'; echo '';