Skip to content
This repository was archived by the owner on May 20, 2023. It is now read-only.

Commit 22fbad2

Browse files
cissyshinshahan
authored andcommitted
Only focus on the dropdown button in material dropdown select when the focus lands on the overlay placeholder focus elements.
Because in triggersOutsideAny we listen to mouseup instead of mousedown, a focus event is actually dispatched before a mouse event during auto dismiss. This causes the dropdown button in material dropdown select to be focused even after user clicks on a focusable element. Added a constants file in overlay to expose the focusable placeholder class name and some other hardcoded variables. Will reference this file everywhere else in a follow up cl. PiperOrigin-RevId: 199403947
1 parent 402371e commit 22fbad2

File tree

3 files changed

+29
-8
lines changed

3 files changed

+29
-8
lines changed
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
const overlayDefaultContainerId = 'default-acx-overlay-container';
6+
const overlayContainerClassName = 'acx-overlay-container';
7+
const overlayContainerNameAttribute = 'container-name';
8+
const overlayFocusablePlaceholderClassName =
9+
'acx-overlay-focusable-placeholder';

lib/laminate/overlay/module.dart

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import 'dart:html';
66

77
import 'package:angular/angular.dart';
8+
import 'package:angular_components/laminate/overlay/constants.dart';
89
import 'package:angular_components/src/laminate/overlay/overlay_service.dart';
910
import 'package:angular_components/src/laminate/overlay/render/overlay_dom_render_service.dart';
1011
import 'package:angular_components/src/laminate/overlay/render/overlay_style_config.dart';
@@ -31,23 +32,27 @@ HtmlElement getDefaultContainer(
3132
@Optional() @SkipSelf() @Inject(overlayContainerToken) container) {
3233
if (container != null) return container;
3334

34-
var element = parent.querySelector('#default-acx-overlay-container');
35+
var element = parent.querySelector('#$overlayDefaultContainerId');
3536
if (element == null) {
3637
// Add a hidden focusable element before overlay container to prevent screen
3738
// reader from picking up content from a random element when users shift tab
3839
// out of the first visible overlay.
39-
parent.append(new DivElement()..tabIndex = 0);
40+
parent.append(new DivElement()
41+
..tabIndex = 0
42+
..classes.add(overlayFocusablePlaceholderClassName));
4043

4144
element = new DivElement()
42-
..id = 'default-acx-overlay-container'
43-
..classes.add('acx-overlay-container');
45+
..id = overlayDefaultContainerId
46+
..classes.add(overlayContainerClassName);
4447
parent.append(element);
4548

4649
// Add a hidden focusable element after overlay container to ensure there's
4750
// a focusable element when users tab out of the last visible overlay.
48-
parent.append(new DivElement()..tabIndex = 0);
51+
parent.append(new DivElement()
52+
..tabIndex = 0
53+
..classes.add(overlayFocusablePlaceholderClassName));
4954
}
50-
element.attributes['container-name'] = name;
55+
element.attributes[overlayContainerNameAttribute] = name;
5156
return element;
5257
}
5358

lib/material_select/material_dropdown_select.dart

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import 'package:angular_components/dynamic_component/dynamic_component.dart';
1313
import 'package:angular_components/focus/keyboard_only_focus_indicator.dart';
1414
import 'package:angular_components/interfaces/has_disabled.dart';
1515
import 'package:angular_components/laminate/enums/alignment.dart';
16+
import 'package:angular_components/laminate/overlay/constants.dart';
1617
import 'package:angular_components/laminate/popup/popup.dart';
1718
import 'package:angular_components/material_list/material_list.dart';
1819
import 'package:angular_components/material_popup/material_popup.dart';
@@ -474,8 +475,14 @@ class MaterialDropdownSelectComponent extends MaterialSelectBase
474475
}
475476

476477
void onAutoDismissed(Event event) {
477-
if (event is FocusEvent) {
478-
dropdownButton.focus();
478+
if (event is FocusEvent &&
479+
event.target is Element &&
480+
(event.target as Element)
481+
.classes
482+
.contains(overlayFocusablePlaceholderClassName)) {
483+
scheduleMicrotask(() {
484+
dropdownButton.focus();
485+
});
479486
}
480487
}
481488

0 commit comments

Comments
 (0)