UI Cleanup - Updated Instrumentation, jQuery and Mixins subtrees.

This commit is contained in:
Taloth Saldono 2015-02-13 22:06:20 +01:00
commit 70bfad4e6a
24 changed files with 716 additions and 490 deletions

View file

@ -2,49 +2,67 @@ var Backbone = require('backbone');
var $ = require('jquery');
var StatusModel = require('../System/StatusModel');
//This module will automatically route all relative links through backbone router rather than
//causing links to reload pages.
var routeBinder = {
bind : function(){
bind : function() {
var self = this;
$(document).on('click', 'a[href]', function(event){
$(document).on('click', 'a[href]', function(event) {
self._handleClick(event);
});
},
_handleClick : function(event){
_handleClick : function(event) {
var $target = $(event.target);
if($target.parents('.nav-tabs').length) {
//check if tab nav
if ($target.parents('.nav-tabs').length) {
return;
}
if($target.hasClass('no-router')) {
if ($target.hasClass('no-router')) {
return;
}
var href = event.target.getAttribute('href');
if(!href && $target.closest('a') && $target.closest('a')[0]) {
if (!href && $target.closest('a') && $target.closest('a')[0]) {
var linkElement = $target.closest('a')[0];
if($(linkElement).hasClass('no-router')) {
if ($(linkElement).hasClass('no-router')) {
return;
}
href = linkElement.getAttribute('href');
}
event.preventDefault();
if(!href) {
if (!href) {
throw 'couldn\'t find route target';
}
if(!href.startsWith('http')) {
if(event.ctrlKey) {
if (!href.startsWith('http')) {
if (event.ctrlKey) {
window.open(href, '_blank');
}
else {
var relativeHref = href.replace(StatusModel.get('urlBase'), '');
Backbone.history.navigate(relativeHref, {trigger : true});
Backbone.history.navigate(relativeHref, { trigger : true });
}
}
else if(href.contains('#')) {
} else if (href.contains('#')) {
//Open in new tab without dereferer (since it doesn't support fragments)
window.open(href, '_blank');
}
else {
} else {
//Open in new tab
window.open('http://www.dereferer.org/?' + encodeURI(href), '_blank');
}
}
};
module.exports = routeBinder;
module.exports = routeBinder;

View file

@ -1,23 +1,21 @@
var $ = require('jquery');
var _ = require('underscore');
$(document).ready(function(){
$(document).ready(function() {
var _window = $(window);
var _scrollButton = $('#scroll-up');
var _scrollHandler = function(){
if(_window.scrollTop() > 100) {
var _scrollHandler = function() {
if (_window.scrollTop() > 100) {
_scrollButton.fadeIn();
}
else {
} else {
_scrollButton.fadeOut();
}
};
$(window).scroll(_.throttle(_scrollHandler, 500));
_scrollButton.click(function(){
$('html, body').animate({scrollTop : 0}, 600);
_scrollButton.click(function() {
$('html, body').animate({ scrollTop : 0 }, 600);
return false;
});
});

View file

@ -1,21 +1,20 @@
module.exports = function(){
module.exports = function() {
var $ = this;
var original = $.ajax;
$.ajax = function(xhr){
$.ajax = function(xhr) {
'use strict';
if(xhr && xhr.data && xhr.type === 'DELETE') {
if(xhr.url.contains('?')) {
if (xhr && xhr.data && xhr.type === 'DELETE') {
if (xhr.url.contains('?')) {
xhr.url += '&';
}
else {
} else {
xhr.url += '?';
}
xhr.url += $.param(xhr.data);
delete xhr.data;
}
if(xhr) {
if (xhr) {
xhr.headers = xhr.headers || {};
xhr.headers['X-Api-Key'] = window.NzbDrone.ApiKey;
}

View file

@ -1,47 +1,60 @@
module.exports = function(){
module.exports = function() {
'use strict';
var $ = this;
$.fn.spinForPromise = function(promise){
$.fn.spinForPromise = function(promise) {
var self = this;
if(!promise || promise.state() !== 'pending') {
if (!promise || promise.state() !== 'pending') {
return this;
}
promise.always(function(){
promise.always(function() {
self.stopSpin();
});
return this.startSpin();
};
$.fn.startSpin = function(){
$.fn.startSpin = function() {
var icon = this.find('i').andSelf('i');
if(!icon || !icon.attr('class')) {
if (!icon || !icon.attr('class')) {
return this;
}
var iconClasses = icon.attr('class').match(/(?:^|\s)icon\-.+?(?:$|\s)/);
if(iconClasses.length === 0) {
if (iconClasses.length === 0) {
return this;
}
var iconClass = $.trim(iconClasses[0]);
this.addClass('disabled');
if(icon.hasClass('icon-can-spin')) {
if (icon.hasClass('icon-can-spin')) {
icon.addClass('icon-spin');
}
else {
} else {
icon.attr('data-idle-icon', iconClass);
icon.removeClass(iconClass);
icon.addClass('icon-nd-spinner');
}
return this;
};
$.fn.stopSpin = function(){
$.fn.stopSpin = function() {
var icon = this.find('i').andSelf('i');
this.removeClass('disabled');
icon.removeClass('icon-spin icon-nd-spinner');
var idleIcon = icon.attr('data-idle-icon');
if(idleIcon) {
if (idleIcon) {
icon.addClass(idleIcon);
}
return this;
};
};

View file

@ -1,74 +1,95 @@
module.exports = function(){
module.exports = function() {
'use strict';
var $ = this;
$.fn.processServerError = function(error){
$.fn.processServerError = function(error) {
var validationName = error.propertyName.toLowerCase();
var errorMessage = this.formatErrorMessage(error);
this.find('.validation-errors').addClass('alert alert-danger').append('<div><i class="icon-exclamation-sign"></i>' + errorMessage + '</div>');
if(!validationName || validationName === '') {
if (!validationName || validationName === '') {
this.addFormError(error);
return this;
}
var input = this.find('[name]').filter(function(){
var input = this.find('[name]').filter(function() {
return this.name.toLowerCase() === validationName;
});
if(input.length === 0) {
input = this.find('[validation-name]').filter(function(){
if (input.length === 0) {
input = this.find('[validation-name]').filter(function() {
return $(this).attr('validation-name').toLowerCase() === validationName;
});
if(input.length === 0) {
//still not found?
if (input.length === 0) {
this.addFormError(error);
console.error('couldn\'t find input for ' + error.propertyName);
return this;
}
}
var formGroup = input.parents('.form-group');
if(formGroup.length === 0) {
if (formGroup.length === 0) {
formGroup = input.parent();
}
else {
} else {
var inputGroup = formGroup.find('.input-group');
if(inputGroup.length === 0) {
if (inputGroup.length === 0) {
formGroup.append('<span class="help-inline validation-error">' + errorMessage + '</span>');
}
else {
inputGroup.parent().append('<span class="help-block validation-error">' + errorMessage + '</span>');
}
}
formGroup.addClass('has-error');
return formGroup.find('.help-inline').text();
};
$.fn.processClientError = function(error){
$.fn.processClientError = function(error) {
};
$.fn.addFormError = function(error){
$.fn.addFormError = function(error) {
var errorMessage = this.formatErrorMessage(error);
if(this.find('.modal-body')) {
if (this.find('.modal-body')) {
this.find('.modal-body').prepend('<div class="alert alert-danger validation-error">' + errorMessage + '</div>');
}
else {
this.prepend('<div class="alert alert-danger validation-error">' + errorMessage + '</div>');
}
};
$.fn.removeAllErrors = function(){
$.fn.removeAllErrors = function() {
this.find('.has-error').removeClass('has-error');
this.find('.error').removeClass('error');
this.find('.validation-errors').removeClass('alert').removeClass('alert-danger').html('');
this.find('.validation-error').remove();
return this.find('.help-inline.error-message').remove();
};
$.fn.formatErrorMessage = function(error){
$.fn.formatErrorMessage = function(error) {
var errorMessage = error.errorMessage;
if(error.infoLink) {
if(error.detailedDescription) {
if (error.infoLink) {
if (error.detailedDescription) {
errorMessage += ' <a class="no-router" target="_blank" href="' + error.infoLink + '"><i class="icon-external-link" title="' + error.detailedDescription + '"></i></a>';
}
else {
} else {
errorMessage += ' <a class="no-router" target="_blank" href="' + error.infoLink + '"><i class="icon-external-link"></i></a>';
}
}
else if(error.detailedDescription) {
} else if (error.detailedDescription) {
errorMessage += ' <i class="icon-nd-form-info" title="' + error.detailedDescription + '"></i>';
}
return errorMessage;
};
};