Skip to content

Commit 91a9095

Browse files
committed
Fix kartik-v#301: Enhancements to multiple select RTL input and select all toggle
1 parent b3705e8 commit 91a9095

File tree

3 files changed

+49
-20
lines changed

3 files changed

+49
-20
lines changed

CHANGE.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ Change Log: `yii2-widget-select2`
55

66
**Date:** 31-Oct-2019
77

8+
- (enh #301): Enhancements to multiple select RTL input and select all toggle.
9+
- Intelligent filtered select all and unselect all that validates what all to select or unselect based on select2 search filter field typed
10+
- Better styling of RTL multiple input
811
- (enh #300): Add Material Theme.
912
- (enh #299): Add Czech Translations.
1013
- (enh #298, #289): Fix empty options.

src/assets/js/select2-krajee.js

Lines changed: 45 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ var initS2ToggleAll = function () {
1515
}, initS2Unselect = function () {
1616
};
1717
(function (factory) {
18-
"use strict";
18+
'use strict';
1919
if (typeof define === 'function' && define.amd) { // jshint ignore:line
2020
// AMD. Register as an anonymous module.
2121
define(['jquery'], factory); // jshint ignore:line
@@ -30,19 +30,46 @@ var initS2ToggleAll = function () {
3030
}
3131
}
3232
}(function ($) {
33-
"use strict";
33+
'use strict';
3434
initS2ToggleAll = function (id) {
35-
var $el = $('#' + id), togId = '#' + 's2-togall-' + id, $tog = $(togId);
35+
var $el = $('#' + id), togId = '#' + 's2-togall-' + id, $tog = $(togId), listenTogAll;
3636
if (!$el.attr('multiple')) {
3737
return;
3838
}
39+
listenTogAll = function () {
40+
$tog.off('.krajees2').on('click.krajees2', function () {
41+
var isSelect = $tog.hasClass('s2-togall-select'), ev = 'selectall', val;
42+
if (!isSelect) {
43+
ev = 'unselectall';
44+
}
45+
$('#select2-' + id + '-results .select2-results__option[role="option"]').each(function () {
46+
val = $(this).attr('id').split('-').pop();
47+
$el.find('option:not([disabled])[value="' + val + '"]').prop('selected', !!isSelect);
48+
});
49+
$el.select2('close').trigger('krajeeselect2:' + ev).trigger('change');
50+
});
51+
};
3952
$el.on('select2:open.krajees2', function () {
53+
var ev = 'input.krajees2 keyup.krajees2';
4054
if ($tog.parent().attr('id') === 'parent-' + togId || !$el.attr('multiple')) {
4155
return;
4256
}
4357
$('#select2-' + id + '-results').closest('.select2-dropdown').prepend($tog);
4458
$('#parent-' + togId).remove();
45-
}).on('change.krajeeselect2', function () {
59+
$(this).parent().find('.select2-search__field').off(ev).on(ev, function () {
60+
setTimeout(function () {
61+
var opt = '#select2-' + id + '-results .select2-results__option[role="option"]',
62+
sel = opt + '[aria-selected="true"]', len = $(opt).length;
63+
$tog.removeClass('s2-togall-select s2-togall-unselect');
64+
if (len > 0 && $(sel).length === len) {
65+
$tog.addClass('s2-togall-unselect');
66+
} else {
67+
$tog.addClass('s2-togall-select');
68+
}
69+
listenTogAll();
70+
}, 100);
71+
});
72+
}).on('change.krajees2', function () {
4673
if (!$el.attr('multiple')) {
4774
return;
4875
}
@@ -58,33 +85,26 @@ var initS2ToggleAll = function () {
5885
} else {
5986
$tog.addClass('s2-togall-unselect');
6087
}
88+
listenTogAll();
6189
});
62-
$tog.off('.krajees2').on('click.krajees2', function () {
63-
var isSelect = $tog.hasClass('s2-togall-select'), flag = true, ev = 'selectall';
64-
if (!isSelect) {
65-
flag = false;
66-
ev = 'unselectall';
67-
}
68-
$el.find('option:not([disabled])').prop('selected', flag);
69-
$el.select2('close').trigger('krajeeselect2:' + ev).trigger('change');
70-
});
90+
listenTogAll();
7191
};
7292
initS2Change = function ($el) {
7393
$el = $el || $(this);
74-
var $drop = $(".select2-container--open"), cssClasses, i, $src = $el.parents("[class*='has-']");
94+
var $drop = $('.select2-container--open'), cssClasses, i, $src = $el.parents('[class*=\'has-\']');
7595
if ($src.length) {
7696
cssClasses = $src[0].className.split(/\s+/);
7797
for (i = 0; i < cssClasses.length; i++) {
78-
if (cssClasses[i].match("has-")) {
79-
$drop.removeClass("has-success has-error has-warning").addClass(cssClasses[i]);
98+
if (cssClasses[i].match('has-')) {
99+
$drop.removeClass('has-success has-error has-warning').addClass(cssClasses[i]);
80100
}
81101
}
82102
}
83103
};
84104
initS2Unselect = function () {
85105
var $el = $(this), opts = $el.data('select2').options;
86106
opts.set('disabled', true);
87-
setTimeout(function() {
107+
setTimeout(function () {
88108
opts.set('disabled', false);
89109
$el.trigger('krajeeselect2:cleared');
90110
}, 1);
@@ -124,9 +144,9 @@ var initS2ToggleAll = function () {
124144
$el.next(themeCss).removeClass(sizeCss).addClass(sizeCss);
125145
}
126146
if (doReset) {
127-
$el.closest("form").off('.krajees2').on("reset.krajees2", function () {
147+
$el.closest('form').off('.krajees2').on('reset.krajees2', function () {
128148
setTimeout(function () {
129-
$el.trigger("change").trigger("krajeeselect2:reset");
149+
$el.trigger('change').trigger('krajeeselect2:reset');
130150
}, 100);
131151
});
132152
}
@@ -146,5 +166,11 @@ var initS2ToggleAll = function () {
146166
$el.on('change.krajees2', function () {
147167
setTimeout(initS2Change, 500);
148168
}).on('select2:unselecting.krajees2', initS2Unselect);
169+
setTimeout(function () {
170+
if ($el.attr('multiple') && $el.attr('dir') === 'rtl') {
171+
$el.parent().find('.select2-search__field').css({width: '100%', direction: 'rtl'});
172+
$el.parent().find('.select2-search--inline').css({float: 'none'});
173+
}
174+
}, 100);
149175
};
150176
}));

src/assets/js/select2-krajee.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)