aboutsummaryrefslogtreecommitdiff
path: root/web/js
diff options
context:
space:
mode:
Diffstat (limited to 'web/js')
-rw-r--r--web/js/jquery.autoresize.js140
1 files changed, 92 insertions, 48 deletions
diff --git a/web/js/jquery.autoresize.js b/web/js/jquery.autoresize.js
index a54ec5453..4bc0959ae 100644
--- a/web/js/jquery.autoresize.js
+++ b/web/js/jquery.autoresize.js
@@ -1,7 +1,7 @@
/*
- * jQuery.fn.autoResize 1.1
+ * jQuery.fn.autoResize 1.14
* --
- * https://github.com/jamespadolsey/jQuery.fn.autoResize
+ * https://github.com/padolsey/jQuery.fn.autoResize
* --
* This program is free software. It comes without any warranty, to
* the extent permitted by applicable law. You can redistribute it
@@ -11,24 +11,28 @@
(function($){
- var defaults = autoResize.defaults = {
- onResize: function(){},
- animate: {
- duration: 200,
- complete: function(){}
- },
- extraSpace: 0,
- minHeight: 1,
- maxHeight: 500,
- minWidth: 'original',
- maxWidth: 500
- };
+ var uid = 'ar' + +new Date,
+
+ defaults = autoResize.defaults = {
+ onResize: function(){},
+ onBeforeResize: function(){return 123},
+ onAfterResize: function(){return 555},
+ animate: {
+ duration: 200,
+ complete: function(){}
+ },
+ extraSpace: 50,
+ minHeight: 'original',
+ maxHeight: 500,
+ minWidth: 'original',
+ maxWidth: 500
+ };
autoResize.cloneCSSProperties = [
'lineHeight', 'textDecoration', 'letterSpacing',
'fontSize', 'fontFamily', 'fontStyle', 'fontWeight',
'textTransform', 'textAlign', 'direction', 'wordSpacing', 'fontSizeAdjust',
- 'padding'
+ 'paddingTop', 'paddingLeft', 'paddingBottom', 'paddingRight', 'width'
];
autoResize.cloneCSSValues = {
@@ -39,7 +43,14 @@
overflow: 'hidden'
};
- autoResize.resizableFilterSelector = 'textarea,input:not(input[type]),input[type=text],input[type=password]';
+ autoResize.resizableFilterSelector = [
+ 'textarea:not(textarea.' + uid + ')',
+ 'input:not(input[type])',
+ 'input[type=text]',
+ 'input[type=password]',
+ 'input[type=email]',
+ 'input[type=url]'
+ ].join(',');
autoResize.AutoResizer = AutoResizer;
@@ -53,8 +64,12 @@
}
function AutoResizer(el, config) {
+
+ if (el.data('AutoResizer')) {
+ el.data('AutoResizer').destroy();
+ }
- config = this.config = $.extend(autoResize.defaults, config);
+ config = this.config = $.extend({}, autoResize.defaults, config);
this.el = el;
this.nodeName = el[0].nodeName.toLowerCase();
@@ -78,8 +93,14 @@
el.data('AutoResizer', this);
- this.createClone();
- this.injectClone();
+ // Make sure onAfterResize is called upon animation completion
+ config.animate.complete = (function(f){
+ return function() {
+ config.onAfterResize.call(el);
+ return f.apply(this, arguments);
+ };
+ }(config.animate.complete));
+
this.bind();
}
@@ -98,9 +119,14 @@
this.el
.bind('keyup.autoResize', check)
//.bind('keydown.autoResize', check)
- .bind('change.autoResize', check);
+ .bind('change.autoResize', check)
+ .bind('paste.autoResize', function() {
+ setTimeout(function() { check(); }, 0);
+ });
- this.check(null, true);
+ if (!this.el.is(':hidden')) {
+ this.check(null, true);
+ }
},
@@ -111,15 +137,7 @@
createClone: function() {
var el = this.el,
- clone;
-
- if (this.nodeName === 'textarea') {
- clone = el.clone().height('auto');
- } else {
- clone = $('<span/>').width('auto').css({
- whiteSpace: 'nowrap'
- });
- }
+ clone = this.nodeName === 'textarea' ? el.clone() : $('<span/>');
this.clone = clone;
@@ -130,18 +148,36 @@
clone
.removeAttr('name')
.removeAttr('id')
+ .addClass(uid)
.attr('tabIndex', -1)
.css(autoResize.cloneCSSValues);
+ if (this.nodeName === 'textarea') {
+ clone.height('auto');
+ } else {
+ clone.width('auto').css({
+ whiteSpace: 'nowrap'
+ });
+ }
+
},
check: function(e, immediate) {
+ if (!this.clone) {
+ this.createClone();
+ this.injectClone();
+ }
+
var config = this.config,
clone = this.clone,
el = this.el,
value = el.val();
+ // Do nothing if value hasn't changed
+ if (value === this.prevValue) { return true; }
+ this.prevValue = value;
+
if (this.nodeName === 'input') {
clone.text(value);
@@ -159,15 +195,19 @@
(newWidth >= config.minWidth && newWidth <= config.maxWidth)
) {
+ config.onBeforeResize.call(el);
config.onResize.call(el);
el.scrollLeft(0);
- config.animate && !immediate ?
+ if (config.animate && !immediate) {
el.stop(1,1).animate({
width: newWidth
- }, config.animate)
- : el.width(newWidth);
+ }, config.animate);
+ } else {
+ el.width(newWidth);
+ config.onAfterResize.call(el);
+ }
}
@@ -177,9 +217,9 @@
// TEXTAREA
- clone.height(0).val(value).scrollTop(10000);
+ clone.width(el.width()).height(0).val(value).scrollTop(10000);
- var scrollTop = clone[0].scrollTop + config.extraSpace;
+ var scrollTop = clone[0].scrollTop;
// Don't do anything if scrollTop hasen't changed:
if (this.previousScrollTop === scrollTop) {
@@ -188,26 +228,30 @@
this.previousScrollTop = scrollTop;
- if (scrollTop >= config.maxHeight) {
+ if (scrollTop + config.extraSpace >= config.maxHeight) {
el.css('overflowY', '');
- return;
- }
-
- el.css('overflowY', 'hidden');
-
- if (scrollTop < config.minHeight) {
+ scrollTop = config.maxHeight;
+ immediate = true;
+ } else if (scrollTop <= config.minHeight) {
scrollTop = config.minHeight;
+ } else {
+ el.css('overflowY', 'hidden');
+ scrollTop += config.extraSpace;
}
+ config.onBeforeResize.call(el);
config.onResize.call(el);
-
+
// Either animate or directly apply height:
- config.animate && !immediate ?
+ if (config.animate && !immediate) {
el.stop(1,1).animate({
height: scrollTop
- }, config.animate)
- : el.height(scrollTop);
-
+ }, config.animate);
+ } else {
+ el.height(scrollTop);
+ config.onAfterResize.call(el);
+ }
+
},
destroy: function() {
@@ -227,4 +271,4 @@
};
-})(jQuery); \ No newline at end of file
+})(jQuery);