const {map, debounce} = require('../lo');
const {dom} = require('../dom');
const server = require('../server');
const event = require('../core/event');
const location = require('../core/location');
const resource = require('../core/resource');
const allsettings = require('../core/settings');
const util = require('../core/util');
const Item = require('../model/item');
const view = require('../view/view');
const settings = Object.assign({
enabled: false,
advanced: false,
debounceTime: 300,
ignorecase: true
}, allsettings.search);
const template =
`
`;
let inputIsVisible = false;
let prevPattern = '';
let $search;
let $input;
const search = pattern => {
pattern = pattern || '';
if (pattern === prevPattern) {
return;
}
prevPattern = pattern;
if (!pattern) {
view.setLocation();
return;
}
$search.addCls('pending');
server.request({
action: 'get',
search: {
href: location.getAbsHref(),
pattern,
ignorecase: settings.ignorecase
}
}).then(response => {
$search.rmCls('pending');
view.setHint('noMatch');
view.setItems(map(response.search, item => Item.get(item)));
});
};
const update = () => {
if (inputIsVisible) {
$search.addCls('active');
$input[0].focus();
search(util.parsePattern($input.val(), settings.advanced));
} else {
search();
$search.rmCls('active');
}
};
const toggle = () => {
inputIsVisible = !inputIsVisible;
update();
};
const reset = () => {
inputIsVisible = false;
$input.val('');
update();
};
const init = () => {
if (!settings.enabled) {
return;
}
$search = dom(template).appTo('#toolbar');
$input = $search.find('input');
$search.find('img').on('click', toggle);
$input.on('keyup', debounce(update, settings.debounceTime));
event.sub('location.changed', reset);
};
init();