Skip to content

Commit 662e367

Browse files
andrii-borysov-mesamdark
authored andcommitted
Fixes #17332: Trigger 'change' for checkboxes in GridView
1 parent fe3ebe2 commit 662e367

File tree

3 files changed

+32
-2
lines changed

3 files changed

+32
-2
lines changed

framework/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ Yii Framework 2 Change Log
1313
- Bug #17341: Allowed callable objects to be set to `\yii\filters\AccessRule::$roleParams` (alexkart)
1414
- Bug #17070: Striped invalid character from fallback file name in `Content-Disposition` header when using `\yii\web\Response::sendFile` (alexkart)
1515
- Bug #16565: Added missing parts of the context message in `\yii\log\Target::collect` (alexkart)
16+
- Bug #17332: Trigger 'change' for checkboxes in GridView (andrii-borysov-me)
1617

1718

1819
2.0.20 June 04, 2019

framework/assets/yii.gridView.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -192,11 +192,11 @@
192192
var inputs = options['class'] ? "input." + options['class'] : "input[name='" + options.name + "']";
193193
var inputsEnabled = "#" + id + " " + inputs + ":enabled";
194194
initEventHandler($grid, 'checkAllRows', 'click.yiiGridView', checkAll, function () {
195-
$grid.find(inputs + ":enabled").prop('checked', this.checked);
195+
$grid.find(inputs + ":enabled").prop('checked', this.checked).change();
196196
});
197197
initEventHandler($grid, 'checkRow', 'click.yiiGridView', inputsEnabled, function () {
198198
var all = $grid.find(inputs).length == $grid.find(inputs + ":checked").length;
199-
$grid.find("input[name='" + options.checkAll + "']").prop('checked', all);
199+
$grid.find("input[name='" + options.checkAll + "']").prop('checked', all).change();
200200
});
201201
},
202202

tests/js/tests/yii.gridView.test.js

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -588,6 +588,16 @@ describe('yii.gridView', function () {
588588
});
589589

590590
describe('with name, multiple and checkAll options, multiple set to true and', function () {
591+
var changedSpy;
592+
593+
before(function () {
594+
changedSpy = sinon.spy();
595+
});
596+
597+
after(function () {
598+
changedSpy.reset();
599+
});
600+
591601
withData({
592602
'nothing else': [{}],
593603
// https://github.com/yiisoft/yii2/pull/11729
@@ -602,44 +612,63 @@ describe('yii.gridView', function () {
602612

603613
assert.equal($gridView.yiiGridView('data').selectionColumn, 'selection[]');
604614

615+
$checkRowCheckboxes
616+
.off('change.yiiGridView') // unbind any subscriptions for clean expectations
617+
.on('change.yiiGridView', changedSpy);
618+
605619
var $checkFirstRowCheckbox = $checkRowCheckboxes.filter('[value="1"]');
606620

607621
// Check all
622+
changedSpy.reset();
608623
click($checkAllCheckbox);
609624
assert.lengthOf($checkRowCheckboxes.filter(':checked'), 3);
610625
assert.isTrue($checkAllCheckbox.prop('checked'));
626+
assert.equal(changedSpy.callCount, 3);
611627

612628
// Uncheck all
629+
changedSpy.reset();
613630
click($checkAllCheckbox);
614631
assert.lengthOf($checkRowCheckboxes.filter(':checked'), 0);
615632
assert.isFalse($checkAllCheckbox.prop('checked'));
633+
assert.equal(changedSpy.callCount, 3);
616634

617635
// Check all manually
636+
changedSpy.reset();
618637
click($checkRowCheckboxes);
619638
assert.lengthOf($checkRowCheckboxes.filter(':checked'), 3);
620639
assert.isTrue($checkAllCheckbox.prop('checked'));
640+
assert.equal(changedSpy.callCount, 3);
621641

622642
// Uncheck all manually
643+
changedSpy.reset();
623644
click($checkRowCheckboxes);
624645
assert.lengthOf($checkRowCheckboxes.filter(':checked'), 0);
625646
assert.isFalse($checkAllCheckbox.prop('checked'));
647+
assert.equal(changedSpy.callCount, 3);
626648

627649
// Check first row
650+
changedSpy.reset();
628651
click($checkFirstRowCheckbox);
629652
assert.isTrue($checkFirstRowCheckbox.prop('checked'));
630653
assert.lengthOf($checkRowCheckboxes.filter(':checked'), 1);
631654
assert.isFalse($checkAllCheckbox.prop('checked'));
655+
assert.equal(changedSpy.callCount, 1);
632656

633657
// Then check all
658+
changedSpy.reset();
634659
click($checkAllCheckbox);
635660
assert.lengthOf($checkRowCheckboxes.filter(':checked'), 3);
636661
assert.isTrue($checkAllCheckbox.prop('checked'));
662+
// "change" should be called 3 times, 1 time per each row, no matter what state it has
663+
assert.equal(changedSpy.callCount, 3);
637664

638665
// Uncheck first row
666+
changedSpy.reset();
639667
click($checkFirstRowCheckbox);
640668
assert.isFalse($checkFirstRowCheckbox.prop('checked'));
641669
assert.lengthOf($checkRowCheckboxes.filter(':checked'), 2);
642670
assert.isFalse($checkAllCheckbox.prop('checked'));
671+
assert.equal(changedSpy.callCount, 1);
643672
});
644673
});
645674
});

0 commit comments

Comments
 (0)