mirror of
https://github.com/netbox-community/netbox.git
synced 2024-05-10 07:54:54 +00:00
116 lines
3.0 KiB
JavaScript
116 lines
3.0 KiB
JavaScript
define([
|
|
'jquery',
|
|
'../utils'
|
|
], function ($, Utils) {
|
|
function Search () { }
|
|
|
|
Search.prototype.render = function (decorated) {
|
|
var $rendered = decorated.call(this);
|
|
|
|
var $search = $(
|
|
'<span class="select2-search select2-search--dropdown">' +
|
|
'<input class="select2-search__field" type="search" tabindex="-1"' +
|
|
' autocomplete="off" autocorrect="off" autocapitalize="none"' +
|
|
' spellcheck="false" role="searchbox" aria-autocomplete="list" />' +
|
|
'</span>'
|
|
);
|
|
|
|
this.$searchContainer = $search;
|
|
this.$search = $search.find('input');
|
|
|
|
$rendered.prepend($search);
|
|
|
|
return $rendered;
|
|
};
|
|
|
|
Search.prototype.bind = function (decorated, container, $container) {
|
|
var self = this;
|
|
|
|
var resultsId = container.id + '-results';
|
|
|
|
decorated.call(this, container, $container);
|
|
|
|
this.$search.on('keydown', function (evt) {
|
|
self.trigger('keypress', evt);
|
|
|
|
self._keyUpPrevented = evt.isDefaultPrevented();
|
|
});
|
|
|
|
// Workaround for browsers which do not support the `input` event
|
|
// This will prevent double-triggering of events for browsers which support
|
|
// both the `keyup` and `input` events.
|
|
this.$search.on('input', function (evt) {
|
|
// Unbind the duplicated `keyup` event
|
|
$(this).off('keyup');
|
|
});
|
|
|
|
this.$search.on('keyup input', function (evt) {
|
|
self.handleSearch(evt);
|
|
});
|
|
|
|
container.on('open', function () {
|
|
self.$search.attr('tabindex', 0);
|
|
self.$search.attr('aria-controls', resultsId);
|
|
|
|
self.$search.trigger('focus');
|
|
|
|
window.setTimeout(function () {
|
|
self.$search.trigger('focus');
|
|
}, 0);
|
|
});
|
|
|
|
container.on('close', function () {
|
|
self.$search.attr('tabindex', -1);
|
|
self.$search.removeAttr('aria-controls');
|
|
self.$search.removeAttr('aria-activedescendant');
|
|
|
|
self.$search.val('');
|
|
self.$search.trigger('blur');
|
|
});
|
|
|
|
container.on('focus', function () {
|
|
if (!container.isOpen()) {
|
|
self.$search.trigger('focus');
|
|
}
|
|
});
|
|
|
|
container.on('results:all', function (params) {
|
|
if (params.query.term == null || params.query.term === '') {
|
|
var showSearch = self.showSearch(params);
|
|
|
|
if (showSearch) {
|
|
self.$searchContainer.removeClass('select2-search--hide');
|
|
} else {
|
|
self.$searchContainer.addClass('select2-search--hide');
|
|
}
|
|
}
|
|
});
|
|
|
|
container.on('results:focus', function (params) {
|
|
if (params.data._resultId) {
|
|
self.$search.attr('aria-activedescendant', params.data._resultId);
|
|
} else {
|
|
self.$search.removeAttr('aria-activedescendant');
|
|
}
|
|
});
|
|
};
|
|
|
|
Search.prototype.handleSearch = function (evt) {
|
|
if (!this._keyUpPrevented) {
|
|
var input = this.$search.val();
|
|
|
|
this.trigger('query', {
|
|
term: input
|
|
});
|
|
}
|
|
|
|
this._keyUpPrevented = false;
|
|
};
|
|
|
|
Search.prototype.showSearch = function (_, params) {
|
|
return true;
|
|
};
|
|
|
|
return Search;
|
|
});
|