Skip to content

Commit 801390c

Browse files
authored
MenuBase: refactor _updateSelectedItems method (DevExpress#30739) (DevExpress#30747)
1 parent d050826 commit 801390c

File tree

2 files changed

+69
-12
lines changed

2 files changed

+69
-12
lines changed

packages/devextreme/js/__internal/ui/context_menu/menu_base.ts

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -728,7 +728,6 @@ class MenuBase<
728728
this._toggleItemSelection(selectedNode, false);
729729
}
730730
this._toggleItemSelection(node, true);
731-
this._updateSelectedItems();
732731
}
733732
break;
734733
}
@@ -770,24 +769,26 @@ class MenuBase<
770769
return result;
771770
}
772771

773-
_updateSelectedItems(
774-
oldSelection?: Item,
775-
newSelection?: Item | null,
772+
_updateSelectedItems(): void {}
773+
774+
_updateSelectedItem(
775+
addedItem?: Item | null,
776+
removedItem?: Item,
776777
): void {
777-
if (oldSelection || newSelection) {
778-
this._fireSelectionChangeEvent(newSelection, oldSelection);
778+
if (addedItem || removedItem) {
779+
this._fireSelectionChangeEvent(addedItem, removedItem);
779780
}
780781
}
781782

782783
_fireSelectionChangeEvent(
783-
addedSelection: Item | null | undefined,
784-
removedSelection: Item | undefined,
784+
addedItem?: Item | null,
785+
removedItem?: Item,
785786
): void {
786787
this._createActionByOption('onSelectionChanged', {
787788
excludeValidators: ['disabled', 'readOnly'],
788789
})({
789-
addedItems: [addedSelection],
790-
removedItems: [removedSelection],
790+
addedItems: [addedItem],
791+
removedItems: [removedItem],
791792
});
792793
}
793794

@@ -804,7 +805,7 @@ class MenuBase<
804805
this._toggleItemSelection(selectedNode, false);
805806
}
806807
this._toggleItemSelection(node, true);
807-
this._updateSelectedItems(selectedItem, itemData);
808+
this._updateSelectedItem(itemData, selectedItem);
808809
this._setOptionWithoutOptionChange('selectedItem', itemData);
809810
}
810811
}
@@ -816,7 +817,7 @@ class MenuBase<
816817

817818
if (node?.internalFields.selected) {
818819
this._toggleItemSelection(node, false);
819-
this._updateSelectedItems(selectedItem, null);
820+
this._updateSelectedItem(null, selectedItem);
820821
this._setOptionWithoutOptionChange('selectedItem', null);
821822
}
822823
}

packages/devextreme/testing/tests/DevExpress.ui.widgets/menuBase.tests.js

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1031,6 +1031,62 @@ QUnit.module('Selection', () => {
10311031
$item.trigger('dxclick');
10321032
});
10331033

1034+
QUnit.test('onSelectionChanged should have been called with correct arguments', function(assert) {
1035+
const items = [
1036+
{ text: 'item1' },
1037+
{ text: 'item2' },
1038+
];
1039+
const selectionChangedHandler = sinon.stub();
1040+
const menuBase = createMenu({
1041+
items: items,
1042+
selectionMode: 'single',
1043+
selectByClick: true,
1044+
onSelectionChanged: selectionChangedHandler,
1045+
});
1046+
const $items = menuBase.element.find(`.${DX_MENU_ITEM_CLASS}`);
1047+
const $item1 = $items.eq(0);
1048+
const $item2 = $items.eq(1);
1049+
1050+
$item2.trigger('dxclick');
1051+
1052+
assert.strictEqual(selectionChangedHandler.callCount, 1, 'onSelectionChanged was called for the first time');
1053+
assert.deepEqual(selectionChangedHandler.args[0][0].addedItems, [{ text: 'item2', selected: true }], 'onSelectionChanged is called with selected item as added item');
1054+
assert.deepEqual(selectionChangedHandler.args[0][0].removedItems, [null], 'onSelectionChanged first called with null as removed item');
1055+
1056+
$item1.trigger('dxclick');
1057+
1058+
assert.strictEqual(selectionChangedHandler.callCount, 2, 'onSelectionChanged was called for the second time');
1059+
assert.deepEqual(selectionChangedHandler.args[1][0].addedItems, [{ text: 'item1', selected: true }], 'onSelectionChanged is called with selected item as added item');
1060+
assert.deepEqual(selectionChangedHandler.args[1][0].removedItems, [{ text: 'item2', selected: false }], 'onSelectionChanged is called with previously selected item as removed item');
1061+
});
1062+
1063+
QUnit.test('onSelectionChanged should have been called with correct arguments on unselect', function(assert) {
1064+
const items = [
1065+
{ text: 'item1' },
1066+
{ text: 'item2' },
1067+
];
1068+
const selectionChangedHandler = sinon.stub();
1069+
const menuBase = createMenu({
1070+
items: items,
1071+
selectionMode: 'single',
1072+
selectByClick: true,
1073+
onSelectionChanged: selectionChangedHandler,
1074+
});
1075+
const $item = menuBase.element.find(`.${DX_MENU_ITEM_CLASS}`).eq(1);
1076+
1077+
$item.trigger('dxclick');
1078+
1079+
assert.strictEqual(selectionChangedHandler.callCount, 1, 'onSelectionChanged was called for the first time');
1080+
assert.deepEqual(selectionChangedHandler.args[0][0].addedItems, [{ text: 'item2', selected: true }], 'onSelectionChanged was called with selected item as added item');
1081+
assert.deepEqual(selectionChangedHandler.args[0][0].removedItems, [null], 'onSelectionChanged first called with null as removed item');
1082+
1083+
$item.trigger('dxclick');
1084+
1085+
assert.strictEqual(selectionChangedHandler.callCount, 2, 'onSelectionChanged was called for the second time');
1086+
assert.deepEqual(selectionChangedHandler.args[1][0].addedItems, [null], 'onSelectionChanged was called with null as added item');
1087+
assert.deepEqual(selectionChangedHandler.args[1][0].removedItems, [{ text: 'item2', selected: false }], 'onSelectionChanged was called with previously selected item as removed item');
1088+
});
1089+
10341090
QUnit.test('Prevent selection item on click', function(assert) {
10351091
const items = [
10361092
{ text: 'item1' },

0 commit comments

Comments
 (0)