mirror of
https://github.com/silverstripe/silverstripe-userforms.git
synced 2024-10-22 17:05:42 +02:00
158 lines
4.7 KiB
Scheme
158 lines
4.7 KiB
Scheme
(function($) {
|
|
$(document).ready(function() {
|
|
var formId = "{$Form.FormName.JS}",
|
|
errorContainerId = "{$ErrorContainerID.JS}",
|
|
errorContainer = $('<fieldset><div><h4></h4><ul></ul></div></fieldset>');
|
|
|
|
var messages = {<% loop $Fields %><% if $ErrorMessage && not $SetsOwnError %><% if $ClassName == 'EditableCheckboxGroupField' %>
|
|
'{$Name.JS}[]': '{$ErrorMessage.JS}'<% if not Last %>,<% end_if %><% else %>
|
|
'{$Name.JS}': '{$ErrorMessage.JS}'<% if not Last %>,<% end_if %><% end_if %><% end_if %><% end_loop %>
|
|
};
|
|
|
|
$(document).on("click", "input.text[data-showcalendar]", function() {
|
|
$(this).ssDatepicker();
|
|
|
|
if($(this).data('datepicker')) {
|
|
$(this).datepicker('show');
|
|
}
|
|
});
|
|
|
|
$("#" + formId).validate({
|
|
ignore: ':hidden',
|
|
errorClass: "required",
|
|
errorElement: "span",
|
|
errorPlacement: function(error, element) {
|
|
error.addClass('message');
|
|
|
|
if(element.is(":radio") || element.parents(".checkboxset").length > 0) {
|
|
error.insertAfter(element.closest("ul"));
|
|
} else {
|
|
error.insertAfter(element);
|
|
}
|
|
|
|
<% if $DisplayErrorMessagesAtTop %>
|
|
applyTopErrorMessage(element, error.html());
|
|
<% end_if %>
|
|
},
|
|
success: function (error) {
|
|
error.remove();
|
|
},
|
|
messages: messages,
|
|
rules: {
|
|
<% loop $Fields %>
|
|
<% if $Validation %><% if ClassName == EditableCheckboxGroupField %>
|
|
'{$Name.JS}[]': {$ValidationJSON.RAW},
|
|
<% else %>
|
|
'{$Name.JS}': {$ValidationJSON.RAW},
|
|
<% end_if %><% end_if %>
|
|
<% end_loop %>
|
|
}
|
|
|
|
/*
|
|
* Conditional options.
|
|
* Using leading commas so we don't get a trailing comma on
|
|
* the last option. Trailing commas can break IE.
|
|
*/
|
|
<% if $EnableLiveValidation %>
|
|
// Enable live validation
|
|
,onfocusout: function (element) { this.element(element); }
|
|
<% end_if %>
|
|
|
|
<% if $DisplayErrorMessagesAtTop %>
|
|
,invalidHandler: function (event, validator) {
|
|
var errorList = $('#' + errorContainerId + ' ul');
|
|
|
|
// Update the error list with errors from the validator.
|
|
// We do this because top messages are not part of the regular
|
|
// error message life cycle, which jquery.validate handles for us.
|
|
errorList.empty();
|
|
|
|
$.each(validator.errorList, function () {
|
|
applyTopErrorMessage($(this.element), this.message);
|
|
});
|
|
}
|
|
,onfocusout: false
|
|
<% end_if %>
|
|
});
|
|
|
|
<% if $HideFieldLabels %>
|
|
// Hide field labels (use HTML5 placeholder instead)
|
|
$("#" + formId + "label.left").each(function() {
|
|
$("#"+$(this).attr("for"))
|
|
.attr("placeholder", $(this).text());
|
|
$(this).remove();
|
|
});
|
|
Placeholders.init();
|
|
<% end_if %>
|
|
|
|
<% if $DisplayErrorMessagesAtTop %>
|
|
/**
|
|
* @applyTopErrorMessage
|
|
* @param {jQuery} input - The jQuery input object which contains the field to validate
|
|
* @param {string} message - The error message to display (html escaped)
|
|
* @desc Update an error message (displayed at the top of the form).
|
|
*/
|
|
function applyTopErrorMessage(input, message) {
|
|
var inputID = input.attr('id'),
|
|
anchor = '#' + inputID,
|
|
elementID = inputID + '-top-error',
|
|
errorContainer = $('#' + errorContainerId),
|
|
messageElement = $('#' + elementID),
|
|
describedBy = input.attr('aria-describedby');
|
|
|
|
// The 'message' param will be an empty string if the field is valid.
|
|
if (!message) {
|
|
// Style issues as fixed if they already exist
|
|
messageElement.addClass('fixed');
|
|
return;
|
|
}
|
|
|
|
messageElement.removeClass('fixed');
|
|
errorContainer.show();
|
|
|
|
if (messageElement.length === 1) {
|
|
// Update the existing error message.
|
|
messageElement.show().find('a').html(message);
|
|
} else {
|
|
// Generate better link to field
|
|
input.closest('.field[id]').each(function(){
|
|
anchor = '#' + $(this).attr('id');
|
|
});
|
|
|
|
// Add a new error message
|
|
messageElement = $('<li><a></a></li>');
|
|
messageElement
|
|
.attr('id', elementID)
|
|
.find('a')
|
|
.attr('href', location.pathname + location.search + anchor)
|
|
.html(message);
|
|
errorContainer
|
|
.find('ul')
|
|
.append(messageElement);
|
|
|
|
// link back to original input via aria
|
|
// Respect existing non-error aria-describedby
|
|
if ( !describedBy ) {
|
|
describedBy = elementID;
|
|
} else if ( !describedBy.match( new RegExp( "\\b" + elementID + "\\b" ) ) ) {
|
|
// Add to end of list if not already present
|
|
describedBy += " " + elementID;
|
|
}
|
|
input.attr( "aria-describedby", describedBy );
|
|
}
|
|
}
|
|
|
|
// Build container
|
|
errorContainer
|
|
.hide()
|
|
.attr('id', errorContainerId)
|
|
.find('h4')
|
|
.text(ss.i18n._t(
|
|
"UserForms.ERROR_CONTAINER_HEADER",
|
|
"Please correct the following errors and try again:"
|
|
));
|
|
$('#' + formId).prepend(errorContainer);
|
|
<% end_if %>
|
|
});
|
|
})(jQuery);
|