Skip to content

Commit c83f424

Browse files
committed
selectize: add mod_focus_input_after_select plugin
Plugin refocuses text input of a multiselect after an item from the dropdown is selected. Move all selectize plugins to a separate file. Use the plugin in all labels fields.
1 parent 30f1438 commit c83f424

5 files changed

Lines changed: 59 additions & 39 deletions

File tree

‎htdocs/README.rst‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,11 @@ js
133133

134134
Part of Patchwork.
135135

136+
``selectize-plugins.js.``
137+
Extra plugins for selectize.
138+
139+
Part of Patchwork.
140+
136141
``selectize.min.js``
137142
Selectize is the hybrid of a ``textbox`` and ``<select>`` box. It's jQuery
138143
based and it has autocomplete and native-feeling keyboard navigation; useful

‎patchwork/templates/patchwork/partials/filters.html‎

Lines changed: 3 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
{% load static %}
22

33
{{ project_labels|json_script:"project-labels-data" }}
4+
45
<script type="text/javascript">
56
var filterform_displayed = false;
67
function filter_click()
@@ -19,43 +20,6 @@
1920
}
2021
}
2122

22-
Selectize.define('enter_key_submit', function (options) {
23-
var self = this;
24-
25-
this.onKeyDown = (function (e) {
26-
var original = self.onKeyDown;
27-
28-
return function (e) {
29-
var wasOpened = this.isOpen;
30-
original.apply(this, arguments);
31-
32-
if (e.keyCode === 13 &&
33-
(this.$control_input.val() != '' || !wasOpened))
34-
self.trigger('submit');
35-
};
36-
})();
37-
});
38-
39-
// Submit form on shift+enter or ctrl+enter
40-
Selectize.define('mod_enter_key_submit', function (options) {
41-
var self = this;
42-
43-
this.onKeyDown = (function (e) {
44-
var original = self.onKeyDown;
45-
46-
return function (e) {
47-
var wasOpened = this.isOpen;
48-
49-
if (e.keyCode === 13 && (e.shiftKey || e.ctrlKey)) {
50-
self.trigger('submit');
51-
return;
52-
}
53-
54-
original.apply(this, arguments);
55-
};
56-
})();
57-
});
58-
5923
$(document).ready(function() {
6024
$('#submitter_input').selectize({
6125
plugins: ['enter_key_submit'],
@@ -114,8 +78,8 @@
11478
}))
11579
);
11680

117-
$('#labels_input').selectize({
118-
plugins: ['mod_enter_key_submit'],
81+
const labels_selectize = $('#labels_input').selectize({
82+
plugins: ['mod_enter_key_submit', 'mod_focus_input_after_select'],
11983
maxItems: null,
12084
persist: false,
12185
hideSelected: true,

‎patchwork/templates/patchwork/partials/patch-forms.html‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
<script type="text/javascript">
44
$(document).ready(function() {
55
$('.labels-field').selectize({
6+
plugins: ['mod_focus_input_after_select'],
67
maxItems: null,
78
persist: false,
89
hideSelected: true,

‎static/js/selectize-plugins.js‎

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
Selectize.define('enter_key_submit', function (options) {
2+
var self = this;
3+
4+
this.onKeyDown = (function (e) {
5+
var original = self.onKeyDown;
6+
7+
return function (e) {
8+
var wasOpened = this.isOpen;
9+
original.apply(this, arguments);
10+
11+
if (e.keyCode === 13 &&
12+
(this.$control_input.val() != '' || !wasOpened))
13+
self.trigger('submit');
14+
};
15+
})();
16+
});
17+
18+
// Submit form on shift+enter or ctrl+enter
19+
Selectize.define('mod_enter_key_submit', function (options) {
20+
var self = this;
21+
22+
this.onKeyDown = (function (e) {
23+
var original = self.onKeyDown;
24+
25+
return function (e) {
26+
var wasOpened = this.isOpen;
27+
28+
if (e.keyCode === 13 && (e.shiftKey || e.ctrlKey)) {
29+
self.trigger('submit');
30+
return;
31+
}
32+
33+
original.apply(this, arguments);
34+
};
35+
})();
36+
});
37+
38+
// Focus search input after item from dropdown is selected for multiselects
39+
Selectize.define('mod_focus_input_after_select', function (options) {
40+
let prevSelect = this.onOptionSelect.bind(this);
41+
42+
this.onOptionSelect = e => {
43+
// delegateTarget - div with dropdown
44+
// delegateTarget.parentElement - input div created by selectize
45+
// ^ contains selected items and actual <input> control
46+
e.delegateTarget.parentElement.getElementsByTagName('input')[0].focus();
47+
prevSelect(e);
48+
};
49+
});

‎templates/base.html‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
<![endif]-->
2121
<script src="{% static "js/bootstrap.min.js" %}"></script>
2222
<script src="{% static "js/selectize.min.js" %}"></script>
23+
<script src="{% static "js/selectize-plugins.js" %}"></script>
2324
<script src="{% static "js/clipboard.min.js" %}"></script>
2425
<script src="{% static "js/js.cookie.min.js" %}"></script>
2526
<script>

0 commit comments

Comments
 (0)