Add debounce option to search.

This commit is contained in:
Lars Jung 2015-05-09 01:18:56 +02:00
parent a9f6f157fa
commit 570599c19d
4 changed files with 36 additions and 26 deletions

View file

@ -20,4 +20,10 @@
display: inline-block;
}
}
&.pending {
input {
color: @col-text-disabled-black;
}
}
}

View file

@ -1,7 +1,8 @@
modulejs.define('ext/search', ['_', '$', 'core/event', 'core/location', 'core/resource', 'core/server', 'core/settings', 'model/item', 'view/view'], function (_, $, event, location, resource, server, allsettings, Item, view) {
var settings = _.extend({
enabled: false
enabled: false,
debounceTime: 300
}, allsettings.search);
var template =
'<div id="search" class="tool">' +
@ -27,6 +28,8 @@ modulejs.define('ext/search', ['_', '$', 'core/event', 'core/location', 'core/re
return;
}
$search.addClass('pending');
server.request({
action: 'get',
search: {
@ -35,11 +38,11 @@ modulejs.define('ext/search', ['_', '$', 'core/event', 'core/location', 'core/re
}
}, function (response) {
var items = _.map(response.search, function (e) {
$search.removeClass('pending');
view.setItems('search', _.map(response.search, function (item) {
return Item.get(e);
});
view.setItems('search', items);
return Item.get(item);
}));
});
}
@ -102,7 +105,7 @@ modulejs.define('ext/search', ['_', '$', 'core/event', 'core/location', 'core/re
$input = $search.find('input');
$search.on('click', 'img', toggle);
$input.on('keyup', _.debounce(update, 500, {trailing: true}));
$input.on('keyup', _.debounce(update, settings.debounceTime, {trailing: true}));
event.sub('location.changed', reset);
}

View file

@ -144,41 +144,39 @@ modulejs.define('ext/select', ['_', '$', 'core/event', 'core/resource', 'core/se
.one('mouseup', selectionEnd);
}
function initItem(item) {
if (item.$view) {
$(template)
.appendTo(item.$view.find('a'))
.on('click', function (ev) {
function onSelectorClick(ev) {
ev.stopImmediatePropagation();
ev.preventDefault();
item.$view.toggleClass('selected');
$(ev.target).closest('.item').toggleClass('selected');
publish();
});
}
function addCheckbox(item) {
if (item.$view && !item.isCurrentParentFolder()) {
$(template)
.on('click', onSelectorClick)
.appendTo(item.$view.find('a'));
}
}
function onViewChanged(added, removed) {
var selectionChanged = false;
if (settings.checkboxes) {
_.each(added, initItem);
_.each(added, addCheckbox);
}
_.each(removed, function (item) {
if (item.$view && item.$view.hasClass('selected')) {
if (item.$view) {
item.$view.removeClass('selected');
selectionChanged = true;
}
});
if (selectionChanged) {
publish();
}
}
function init() {

View file

@ -269,9 +269,12 @@ Options
Searches will be treated as JavaScript regular expressions
if you prefix them with "re:".
- debounceTime: number, debounce wait time in milliseconds
*/
"search": {
"enabled": true
"enabled": true,
"debounceTime": 300
},
/*