Skip to content

Commit 0bd2a23

Browse files
authored
MenuBase: refactor _updateSelectedItems method (DevExpress#30739)
1 parent 542d3f6 commit 0bd2a23

File tree

2 files changed

+69
-13
lines changed

2 files changed

+69
-13
lines changed

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

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -737,7 +737,6 @@ class MenuBase<
737737
this._toggleItemSelection(selectedNode, false);
738738
}
739739
this._toggleItemSelection(node, true);
740-
this._updateSelectedItems();
741740
}
742741
break;
743742
}
@@ -779,25 +778,26 @@ class MenuBase<
779778
return result;
780779
}
781780

782-
// @ts-expect-error ts-error
783-
_updateSelectedItems(
784-
oldSelection?: Item,
785-
newSelection?: Item | null,
781+
_updateSelectedItems(): void {}
782+
783+
_updateSelectedItem(
784+
addedItem?: Item | null,
785+
removedItem?: Item,
786786
): void {
787-
if (oldSelection || newSelection) {
788-
this._fireSelectionChangeEvent(newSelection, oldSelection);
787+
if (addedItem || removedItem) {
788+
this._fireSelectionChangeEvent(addedItem, removedItem);
789789
}
790790
}
791791

792792
_fireSelectionChangeEvent(
793-
addedSelection: Item | null | undefined,
794-
removedSelection: Item | undefined,
793+
addedItem?: Item | null,
794+
removedItem?: Item,
795795
): void {
796796
this._createActionByOption('onSelectionChanged', {
797797
excludeValidators: ['disabled', 'readOnly'],
798798
})({
799-
addedItems: [addedSelection],
800-
removedItems: [removedSelection],
799+
addedItems: [addedItem],
800+
removedItems: [removedItem],
801801
});
802802
}
803803

@@ -816,7 +816,7 @@ class MenuBase<
816816
this._toggleItemSelection(selectedNode, false);
817817
}
818818
this._toggleItemSelection(node, true);
819-
this._updateSelectedItems(selectedItem, itemData);
819+
this._updateSelectedItem(itemData, selectedItem);
820820
this._setOptionWithoutOptionChange('selectedItem', itemData);
821821
}
822822
}
@@ -828,7 +828,7 @@ class MenuBase<
828828

829829
if (node?.internalFields.selected) {
830830
this._toggleItemSelection(node, false);
831-
this._updateSelectedItems(selectedItem, null);
831+
this._updateSelectedItem(null, selectedItem);
832832
this._setOptionWithoutOptionChange('selectedItem', null);
833833
}
834834
}

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)