Skip to content

Commit 424b31a

Browse files
authored
List: Focus group header after interaction with header if collapsibleGroups: true, skip invisible items
1 parent ca6ab57 commit 424b31a

File tree

3 files changed

+222
-55
lines changed

3 files changed

+222
-55
lines changed

packages/devextreme/js/__internal/ui/collection/m_collection_widget.base.ts

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -388,12 +388,39 @@ const CollectionWidget = Widget.inherit({
388388
this._updateParentActiveDescendant();
389389
},
390390

391+
_getElementClassToSkipRefreshId: noop,
392+
393+
_shouldSkipRefreshId(target) {
394+
const elementClass = this._getElementClassToSkipRefreshId() ?? '';
395+
const shouldSkipRefreshId = $(target).hasClass(elementClass);
396+
397+
return shouldSkipRefreshId;
398+
},
399+
391400
_refreshActiveDescendant($target) {
392-
this.setAria('activedescendant', isDefined(this.option('focusedElement')) ? this.getFocusedItemId() : null, $target);
401+
const { focusedElement } = this.option();
402+
403+
if (isDefined(focusedElement)) {
404+
const shouldSetExistingId = this._shouldSkipRefreshId(focusedElement);
405+
const id = shouldSetExistingId ? $(focusedElement).attr('id') : this.getFocusedItemId();
406+
407+
this.setAria('activedescendant', id, $target);
408+
409+
return;
410+
}
411+
412+
this.setAria('activedescendant', null, $target);
393413
},
394414

395415
_refreshItemId($target, needCleanItemId) {
396-
if (!needCleanItemId && this.option('focusedElement')) {
416+
const { focusedElement } = this.option();
417+
const shouldSkipRefreshId = this._shouldSkipRefreshId($target);
418+
419+
if (shouldSkipRefreshId) {
420+
return;
421+
}
422+
423+
if (!needCleanItemId && focusedElement) {
397424
this.setAria('id', this.getFocusedItemId(), $target);
398425
} else {
399426
this.setAria('id', null, $target);

packages/devextreme/js/__internal/ui/list/m_list.base.ts

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -305,7 +305,7 @@ export const ListBase = CollectionWidget.inherit({
305305

306306
const $listGroup = this._getItemsContainer().children(`.${LIST_GROUP_CLASS}`);
307307

308-
const $items = $listGroup.find(itemAndHeaderSelector).filter(':visible');
308+
const $items = $listGroup.find(itemAndHeaderSelector);
309309

310310
return $items;
311311
},
@@ -314,7 +314,16 @@ export const ListBase = CollectionWidget.inherit({
314314
const { collapsibleGroups } = this.option();
315315

316316
if (collapsibleGroups) {
317-
return this._getItemAndHeaderElements();
317+
const $elements = this._getItemAndHeaderElements();
318+
const $visibleItems = $elements.filter((_, element) => {
319+
if ($(element).hasClass(LIST_GROUP_HEADER_CLASS)) {
320+
return true;
321+
}
322+
323+
return !$(element).closest(`.${LIST_GROUP_CLASS}`).hasClass(LIST_GROUP_COLLAPSED_CLASS);
324+
});
325+
326+
return $visibleItems;
318327
}
319328

320329
return this.callBase($itemElements);
@@ -671,9 +680,9 @@ export const ListBase = CollectionWidget.inherit({
671680
this._collapseGroupHandler($group);
672681

673682
if (focusStateEnabled) {
674-
const listItemElement = getPublicElement($group.find(`.${LIST_ITEM_CLASS}`).eq(0));
683+
const groupHeader = getPublicElement($group.find(`.${LIST_GROUP_HEADER_CLASS}`));
675684

676-
this.option({ focusedElement: listItemElement });
685+
this.option({ focusedElement: groupHeader });
677686
}
678687
};
679688

@@ -833,6 +842,10 @@ export const ListBase = CollectionWidget.inherit({
833842
}
834843
},
835844

845+
_getElementClassToSkipRefreshId() {
846+
return LIST_GROUP_HEADER_CLASS;
847+
},
848+
836849
_attachSwipeEvent($itemElement) {
837850
const endEventName = addNamespace(swipeEventEnd, this.NAME);
838851

0 commit comments

Comments
 (0)