mirror of
https://github.com/silverstripe/silverstripe-comments
synced 2024-10-22 11:05:49 +02:00
3812057b00
When posting a comment on the a page with this module applied, there is an optional input for the commenter to give their URL,presumably their website. However this input currently validates (via JavaScript) to allow URLs only iff they have a protocol. Common use cases when someone is asked for their website in my experience is to then receive a URL without a protocol, confounded in that most web browsers will accept this form and automatically add the http protocol, where a webserver may then redirect to https by default. This means that all the magic happens behind the scenes and most folks don't particularly care to think about protocols when entering web addresses. Yest this input will only validate true and allow comment submission if they do. So now it will allow a protocol-less entry into the URL box.
134 lines
4.3 KiB
JavaScript
Executable File
134 lines
4.3 KiB
JavaScript
Executable File
/**
|
|
* @package comments
|
|
*/
|
|
(function($) {
|
|
// The above closure encapsulates the $ variable away from the global scope
|
|
// and the one below is the `$(document).ready(...)` shorthand.
|
|
$(function() {
|
|
// Override the default URL validator in order to extend it to allow protocol-less URLs
|
|
$.validator.methods.url = function( value, element ) {
|
|
// This line is copied directly from the jQuery.validation source (version 1.19.0)
|
|
// the only change is a single question mark added here ---------v
|
|
return this.optional( element ) || /^(?:(?:(?:https?|ftp):)?\/\/)?(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})).?)(?::\d{2,5})?(?:[/?#]\S*)?$/i.test( value );
|
|
}
|
|
|
|
/**
|
|
* Enable form validation
|
|
*/
|
|
$('.comments-holder-container form').each(function() {
|
|
$(this).validate({
|
|
|
|
// Ignore hidden elements in this form
|
|
ignore: ':hidden',
|
|
|
|
// Use default 'required' for error labels
|
|
errorClass: "required",
|
|
|
|
// Use span instead of labels
|
|
errorElement: "span",
|
|
|
|
// On error, scroll to the invalid element
|
|
invalidHandler : function(form, validator){
|
|
$('html, body').animate({
|
|
scrollTop: $(validator.errorList[0].element).offset().top - 30
|
|
}, 200);
|
|
},
|
|
|
|
// Ensure any new error message has the correct class and placement
|
|
errorPlacement: function(error, element) {
|
|
error
|
|
.addClass('message')
|
|
.insertAfter(element);
|
|
}
|
|
});
|
|
});
|
|
|
|
/**
|
|
* Hide comment reply forms by default (unless visiting via permalink)
|
|
*/
|
|
$(".comment")
|
|
.children('.info')
|
|
.not(window.document.location.hash)
|
|
.nextAll(".comment-replies-container")
|
|
.children(".comment-reply-form-holder")
|
|
.hide();
|
|
|
|
/**
|
|
* Toggle on/off reply form
|
|
*/
|
|
$('.comments-holder').on('click', '.comment-reply-link', function(e) {
|
|
var allForms = $('.comment-reply-form-holder');
|
|
var formID = '#' + $(this).attr('aria-controls');
|
|
var form = $(formID).closest('.comment-reply-form-holder');
|
|
|
|
$(this).attr('aria-expanded', function (i, attr) {
|
|
return attr == 'true' ? 'false' : 'true'
|
|
});
|
|
|
|
// Prevent focus
|
|
e.preventDefault();
|
|
|
|
if(form.is(':visible')) {
|
|
allForms.slideUp();
|
|
} else {
|
|
allForms.not(form).slideUp();
|
|
form.slideDown();
|
|
}
|
|
});
|
|
|
|
/**
|
|
* Clicking one of the metalinks performs the operation via ajax
|
|
* this inclues the spam and approve links
|
|
*/
|
|
$('.comments-holder .comments-list').on('click', 'div.comment-moderation-options a', function(e) {
|
|
e.stopPropagation();
|
|
|
|
var link = $(this);
|
|
if (link.hasClass('delete')) {
|
|
var confirmationMsg = ss.i18n._t('CommentsInterface_singlecomment_ss.DELETE_CONFIRMATION');
|
|
var confirmation = window.confirm(confirmationMsg);
|
|
if (!confirmation) {
|
|
e.preventDefault();
|
|
return false;
|
|
}
|
|
}
|
|
var comment = link.parents('.comment:first');
|
|
|
|
$.ajax({
|
|
url: $(this).attr('href'),
|
|
cache: false,
|
|
success: function(html){
|
|
if(link.hasClass('ham')) {
|
|
// comment has been marked as not spam
|
|
comment.html(html);
|
|
comment.removeClass('spam');
|
|
}
|
|
else if(link.hasClass('approve')) {
|
|
// comment has been approved
|
|
comment.html(html);
|
|
comment.removeClass('unmoderated');
|
|
}
|
|
else if(link.hasClass('delete')) {
|
|
comment.fadeOut(1000, function() {
|
|
comment.remove();
|
|
|
|
if($('.comments-holder .comments-list').children().length === 0) {
|
|
$('.no-comments-yet').show();
|
|
}
|
|
});
|
|
}
|
|
else if(link.hasClass('spam')) {
|
|
comment.html(html).addClass('spam');
|
|
}
|
|
},
|
|
failure: function(html) {
|
|
var errorMsg = ss.i18n._t('CommentsInterface_singlecomment_ss.AJAX_ERROR');
|
|
alert(errorMsg);
|
|
}
|
|
});
|
|
|
|
e.preventDefault();
|
|
});
|
|
});
|
|
})(jQuery);
|