Add search frontend extension, plus refactorings to make it work.

This commit is contained in:
Lars Jung 2015-05-08 22:09:12 +02:00
parent 7f687e0a84
commit c35abad20a
17 changed files with 275 additions and 115 deletions

View file

@ -0,0 +1,111 @@
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
}, allsettings.search);
var template =
'<div id="search" class="tool">' +
'<img src="' + resource.image('search') + '" alt="search"/>' +
'<input type="text" value="" placeholder="search"/>' +
'</div>';
var inputIsVisible = false;
var prevPattern = '';
var $search;
var $input;
function search(pattern) {
pattern = pattern || '';
if (pattern === prevPattern) {
return;
}
prevPattern = pattern;
if (!pattern) {
view.setLocation();
return;
}
server.request({
action: 'get',
search: {
href: location.getAbsHref(),
pattern: pattern
}
}, function (response) {
var items = _.map(response.search, function (e) {
return Item.get(e);
});
view.setItems('search', items);
});
}
function escapeRegExp(sequence) {
return sequence.replace(/[\-\[\]{}()*+?.,\\$\^|#\s]/g, '\\$&');
}
function parseInput(sequence) {
if (sequence.substr(0, 3) === 're:') {
return sequence.substr(3);
}
return escapeRegExp(sequence);
// sequence = $.map($.trim(sequence).split(/\s+/), function (part) {
// return _.map(part.split(''), function (character) {
// return escapeRegExp(character);
// }).join('.*?');
// }).join('|');
// return sequence;
}
function update() {
if (inputIsVisible) {
$search.addClass('active');
$input.focus();
search(parseInput($input.val()));
} else {
search();
$search.removeClass('active');
}
}
function toggle() {
inputIsVisible = !inputIsVisible;
update();
}
function reset() {
inputIsVisible = false;
$input.val('');
update();
}
function init() {
if (!settings.enabled) {
return;
}
$search = $(template).appendTo('#toolbar');
$input = $search.find('input');
$search.on('click', 'img', toggle);
$input.on('keyup', _.debounce(update, 500, {trailing: true}));
event.sub('location.changed', reset);
}
init();
});