Commit 538e864e by Alan Boudreault

Implemented XBlocks validation on client side and submit button behavior based on it

parent f11afb76
function AnswerBlock(runtime, element) { function AnswerBlock(runtime, element) {
return { return {
init: function(options) {
// register the child validator
$(':input', element).on('keyup', options.blockValidator);
},
submit: function() { submit: function() {
return $(':input', element).serializeArray();
},
handleSubmit: function(result) {
$(element).find('.message').text((result || {}).error || '');
},
// Returns `true` if the child is valid, else `false`
validate: function() {
var input = $(':input', element), var input = $(':input', element),
input_value = input.val().replace(/^\s+|\s+$/gm,''), input_value = input.val().replace(/^\s+|\s+$/gm,''),
answer_length = input_value.length, answer_length = input_value.length,
data = input.data(); data = input.data();
if (_.isNumber(data.min_characters) && // an answer cannot be empty event if min_characters is 0
(data.min_characters > 0) && if (_.isNumber(data.min_characters)) {
(answer_length < data.min_characters)) { var min_characters = _.max([data.min_characters, 1]);
throw "The answer has a minimum of " + data.min_characters + " characters."; if (answer_length < min_characters) {
return false;
}
} }
return input.serializeArray();
}, return true;
handleSubmit: function(result) {
$(element).find('.message').text((result || {}).error || '');
} }
} }
} }
...@@ -83,27 +83,24 @@ function MentoringBlock(runtime, element) { ...@@ -83,27 +83,24 @@ function MentoringBlock(runtime, element) {
for (var i = 0; i < children.length; i++) { for (var i = 0; i < children.length; i++) {
var child = children[i]; var child = children[i];
if (child.name !== undefined) { if (child.name !== undefined) {
try {
data[child.name] = callIfExists(child, 'submit'); data[child.name] = callIfExists(child, 'submit');
}
catch (error) {
alert(error);
success = false;
}
} }
} }
if (success) { var handlerUrl = runtime.handlerUrl(element, 'submit');
var handlerUrl = runtime.handlerUrl(element, 'submit'); $.post(handlerUrl, JSON.stringify(data)).success(handleSubmitResults);
$.post(handlerUrl, JSON.stringify(data)).success(handleSubmitResults);
}
}); });
// init children (especially mrq blocks) // init children (especially mrq blocks)
var children = getChildren(element); var children = getChildren(element);
var options = {
blockValidator: validateXBlock
};
_.each(children, function(child) { _.each(children, function(child) {
callIfExists(child, 'init'); callIfExists(child, 'init', options);
}); });
validateXBlock();
if (submit_dom.length) { if (submit_dom.length) {
renderProgress(); renderProgress();
} }
...@@ -121,6 +118,31 @@ function MentoringBlock(runtime, element) { ...@@ -121,6 +118,31 @@ function MentoringBlock(runtime, element) {
$.post(handlerUrl, '{}').success(handleRefreshResults); $.post(handlerUrl, '{}').success(handleRefreshResults);
} }
// validate all children
function validateXBlock() {
var submit_dom = $(element).find('.submit .input-main');
var children_are_valid = true;
var data = {};
var children = getChildren(element);
for (var i = 0; i < children.length; i++) {
var child = children[i];
if (child.name !== undefined) {
var child_validation = callIfExists(child, 'validate');
if (_.isBoolean(child_validation)) {
children_are_valid = children_are_valid && child_validation
}
}
}
if (!children_are_valid) {
submit_dom.attr('disabled','disabled');
}
else {
submit_dom.removeAttr("disabled");
}
}
// We need to manually refresh, XBlocks are currently loaded together with the section // We need to manually refresh, XBlocks are currently loaded together with the section
refreshXBlock(element); refreshXBlock(element);
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment