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 = ``; 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();