h5ai/src/_h5ai/public/js/lib/ext/search.js

95 lines
2.1 KiB
JavaScript

const {jQuery: jq, _: lo} = require('../win');
const event = require('../core/event');
const location = require('../core/location');
const resource = require('../core/resource');
const server = require('../core/server');
const allsettings = require('../core/settings');
const util = require('../core/util');
const Item = require('../model/item');
const view = require('../view/view');
const settings = lo.extend({
enabled: false,
advanced: false,
debounceTime: 300,
ignorecase: true
}, allsettings.search);
const template =
`<div id="search" class="tool">
<img src="${resource.image('search')}" alt="search"/>
<input class="l10n_ph-search" type="text" value=""/>
</div>`;
let inputIsVisible = false;
let prevPattern = '';
let $search;
let $input;
function search(pattern) {
pattern = pattern || '';
if (pattern === prevPattern) {
return;
}
prevPattern = pattern;
if (!pattern) {
view.setLocation();
return;
}
$search.addClass('pending');
server.request({
action: 'get',
search: {
href: location.getAbsHref(),
pattern,
ignorecase: settings.ignorecase
}
}).then(response => {
$search.removeClass('pending');
view.setHint('noMatch');
view.setItems(lo.map(response.search, item => {
return Item.get(item);
}));
});
}
function update() {
if (inputIsVisible) {
$search.addClass('active');
$input.focus();
search(util.parsePattern($input.val(), settings.advanced));
} else {
search();
$search.removeClass('active');
}
}
function toggle() {
inputIsVisible = !inputIsVisible;
update();
}
function reset() {
inputIsVisible = false;
$input.val('');
update();
}
function init() {
if (!settings.enabled) {
return;
}
$search = jq(template).appendTo('#toolbar');
$input = $search.find('input');
$search.on('click', 'img', toggle);
$input.on('keyup', lo.debounce(update, settings.debounceTime, {trailing: true}));
event.sub('location.changed', reset);
}
init();