forked from livegrep/livegrep
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrepo_selector.js
More file actions
91 lines (81 loc) · 3.06 KB
/
repo_selector.js
File metadata and controls
91 lines (81 loc) · 3.06 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
var $ = require('jquery');
var _ = require('underscore');
function init() {
$('#repos').selectpicker({
actionsBox: true,
selectedTextFormat: 'count > 4',
countSelectedText: '({0} repositories)',
noneSelectedText: '(all repositories)',
liveSearch: true,
width: '20em'
});
$('#repos').on('refreshed.bs.select', function () {
var headers = $(this).parent().find('.dropdown-header');
headers.css('cursor', 'pointer');
headers.on('click', function (event) {
event.stopPropagation();
var optgroup = $('#repos optgroup[label="' + $(this).text() + '"]')
var allSelected = !optgroup.children('option:not(:selected)').length;
optgroup.children().prop('selected', !allSelected);
$("#repos").selectpicker('refresh').trigger("change");
});
});
$(window).on('keyup', '.bootstrap-select .bs-searchbox input', function(event) {
var keycode = (event.keyCode ? event.keyCode : event.which);
if(keycode == '13'){
$(this).val("");
$("#repos").selectpicker('refresh');
}
});
$(window).keyup(function (keyevent) {
var code = (keyevent.keyCode ? keyevent.keyCode : keyevent.which);
if (code == 9 && $('.bootstrap-select button:focus').length) {
$("#repos").selectpicker('toggle');
$('.bootstrap-select .bs-searchbox input').focus();
}
});
}
function escapeHtml(str) {
return str.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"');
}
function updateOptions(newOptions) {
// Skip update if the options are the same, to avoid losing selected state.
var currentOptions = [];
$('#repos').find('option').each(function(){
currentOptions.push($(this).attr('value'));
});
if (_.isEqual(currentOptions, newOptions)) {
return;
}
newOptions.sort();
// Build HTML string in one pass instead of creating DOM elements individually.
var html = '';
var currentGroup = null;
for (var i = 0; i < newOptions.length; i++) {
var parts = newOptions[i].split('/');
var group = parts.slice(0, parts.length - 1).join('/') + '/';
var option = parts[parts.length - 1];
var value = group === '/' ? option : group + option;
if (group !== '/' && group !== currentGroup) {
if (currentGroup !== null && currentGroup !== '/') {
html += '</optgroup>';
}
currentGroup = group;
html += '<optgroup label="' + escapeHtml(group) + '">';
}
html += '<option value="' + escapeHtml(value) + '">' + escapeHtml(option) + '</option>';
}
if (currentGroup !== null && currentGroup !== '/') {
html += '</optgroup>';
}
$('#repos').html(html);
$('#repos').selectpicker('refresh');
}
function updateSelected(newSelected) {
$('#repos').selectpicker('val', newSelected);
}
module.exports = {
init: init,
updateOptions: updateOptions,
updateSelected: updateSelected
}