MDL-57697 survery: migrate validation script from yui2

Just a modernisation of the existing yui2 code to AMD/jQuery and away from alert();
This commit is contained in:
Dan Poltawski 2017-01-18 16:17:30 +00:00
parent f99313477d
commit 3f037586ae
4 changed files with 76 additions and 40 deletions

View File

@ -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)})}}});

View File

@ -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 <http://www.gnu.org/licenses/>.
/**
* Javascript to handle survey validation.
*
* @module mod_survey/validation
* @package mod_survey
* @copyright 2017 Dan Poltawski <dan@moodle.com>
* @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;
});
}
};
});

View File

@ -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;
}
});
}
};

View File

@ -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 '<br />';
echo '<input type="submit" class="btn btn-primary" value="'.get_string("clicktocontinue", "survey").'" />';