\
\
@@ -103,7 +105,8 @@
if(e.which !== 1){return;}
e.stopPropagation(); e.preventDefault();
var pointer = $(e.target);
- pointer.addClass('focused');
+ this.pointers.removeClass('last-active');
+ pointer.addClass('focused last-active');
this[(pointer.hasClass('low')?'low':'high') + 'Label'].addClass('focused');
$(document).on('mousemove.slider', $.proxy(this.onDrag, this, pointer));
$(document).on('mouseup.slider', $.proxy(this.onDragEnd, this));
@@ -280,6 +283,7 @@
options = typeof option === 'object' && option;
if (!data) {
$this.data('plugin_' + pluginName, (data = new jRange(this, options)));
+ $(window).resize(function() { data.setValue(data.getValue()); }); // Update slider position when window is resized to keep it in sync with scale
}
// if first argument is a string, call silimarly named function
// this gives flexibility to call functions of the plugin e.g.
@@ -294,4 +298,4 @@
return result || this;
};
-})(jQuery, window, document);
\ No newline at end of file
+})(jQuery, window, document);
diff --git a/library/jRange/jquery.range.less b/library/jRange/jquery.range.less
index 979ed2e1a..cb6e12288 100644
--- a/library/jRange/jquery.range.less
+++ b/library/jRange/jquery.range.less
@@ -73,6 +73,9 @@
cursor: move;
opacity: 1;
z-index: 2;
+ &.last-active{
+ z-index: 3;
+ }
}
.pointer-label {
position: absolute;
diff --git a/library/jquery-textcomplete/jquery.textcomplete.js b/library/jquery-textcomplete/jquery.textcomplete.js
index c8303eaa0..3df84f3b4 100644
--- a/library/jquery-textcomplete/jquery.textcomplete.js
+++ b/library/jquery-textcomplete/jquery.textcomplete.js
@@ -124,9 +124,8 @@ if (typeof jQuery === 'undefined') {
this.views = [];
this.option = $.extend({}, Completer._getDefaults(), option);
-
if (!this.$el.is('input[type=text]') && !this.$el.is('textarea') && !element.isContentEditable && element.contentEditable != 'true') {
- throw new Error('textcomplete must be called on a input[type=text], Textarea or a ContentEditable.');
+ throw new Error('textcomplete must be called on a Textarea or a ContentEditable.');
}
if (element === document.activeElement) {
@@ -414,6 +413,22 @@ if (typeof jQuery === 'undefined') {
setPosition: function (position) {
this.$el.css(this._applyPlacement(position));
+
+ // Make the dropdown fixed if the input is also fixed
+ // This can't be done during init, as textcomplete may be used on multiple elements on the same page
+ // Because the same dropdown is reused behind the scenes, we need to recheck every time the dropdown is showed
+ var position = 'absolute';
+ // Check if input or one of its parents has positioning we need to care about
+ this.$inputEl.add(this.$inputEl.parents()).each(function() {
+ if($(this).css('position') === 'absolute') // The element has absolute positioning, so it's all OK
+ return false;
+ if($(this).css('position') === 'fixed') {
+ position = 'fixed';
+ return false;
+ }
+ });
+ this.$el.css({ position: position }); // Update positioning
+
return this;
},
diff --git a/view/js/autocomplete.js b/view/js/autocomplete.js
index 1c524789d..86847cb35 100644
--- a/view/js/autocomplete.js
+++ b/view/js/autocomplete.js
@@ -3,15 +3,18 @@
*
* require jQuery, jquery.textcomplete
*/
-function contact_search(term, callback, backend_url, type, extra_channels) {
+function contact_search(term, callback, backend_url, type, extra_channels, spinelement) {
+ if(spinelement){
+ $(spinelement).spin('tiny');
+ }
// Check if there is a cached result that contains the same information we would get with a full server-side search
-
var bt = backend_url+type;
if(!(bt in contact_search.cache)) contact_search.cache[bt] = {};
var lterm = term.toLowerCase(); // Ignore case
for(t in contact_search.cache[bt]) {
if(lterm.indexOf(t) >= 0) { // A more broad search has been performed already, so use those results
+ $(spinelement).spin(false);
// Filter old results locally
var matching = contact_search.cache[bt][t].filter(function (x) { return (x.name.toLowerCase().indexOf(lterm) >= 0 || (typeof x.nick !== 'undefined' && x.nick.toLowerCase().indexOf(lterm) >= 0)); }); // Need to check that nick exists because groups don't have one
matching.unshift({taggable:false, text: term, replace: term});
@@ -44,6 +47,7 @@ function contact_search(term, callback, backend_url, type, extra_channels) {
var items = data.items.slice(0);
items.unshift({taggable:false, text: term, replace: term});
callback(items);
+ $(spinelement).spin(false);
},
}).fail(function () {callback([]); }); // Callback must be invoked even if something went wrong.
}
@@ -98,7 +102,7 @@ function submit_form(e) {
contacts = {
match: /(^|\s)(@\!*)([^ \n]+)$/,
index: 3,
- search: function(term, callback) { contact_search(term, callback, backend_url, 'c', extra_channels); },
+ search: function(term, callback) { contact_search(term, callback, backend_url, 'c', extra_channels, spinelement=false); },
replace: editor_replace,
template: contact_format,
}
@@ -125,7 +129,7 @@ function submit_form(e) {
contacts = {
match: /(^@)([^\n]{2,})$/,
index: 2,
- search: function(term, callback) { contact_search(term, callback, backend_url, 'x',[]); },
+ search: function(term, callback) { contact_search(term, callback, backend_url, 'x', [], spinelement='#nav-search-spinner'); },
replace: basic_replace,
template: contact_format,
}
@@ -147,7 +151,7 @@ function submit_form(e) {
contacts = {
match: /(^)([^\n]+)$/,
index: 2,
- search: function(term, callback) { contact_search(term, callback, backend_url, typ,[]); },
+ search: function(term, callback) { contact_search(term, callback, backend_url, typ,[], spinelement=false); },
replace: basic_replace,
template: contact_format,
}
diff --git a/view/theme/redbasic/css/style.css b/view/theme/redbasic/css/style.css
index ce933ba10..c95909085 100644
--- a/view/theme/redbasic/css/style.css
+++ b/view/theme/redbasic/css/style.css
@@ -876,8 +876,8 @@ footer {
nav .acpopup {
top: 49px !important;
- right: 30px !important;
- margin-left: -45px;
+ margin-left: -35px;
+ width: 290px;
}
.profile-clear {