Skip to content

Commit ec1a5bf

Browse files
musalevogtnsebastienlevert
authored
Support narration of the names of selected people in people-picker (#1473)
Co-authored-by: Nicolas Vogt <[email protected]> Co-authored-by: Sébastien Levert <[email protected]>
1 parent d4facaf commit ec1a5bf

File tree

2 files changed

+54
-7
lines changed

2 files changed

+54
-7
lines changed

packages/mgt-components/src/components/mgt-people-picker/mgt-people-picker.ts

Lines changed: 50 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -392,6 +392,7 @@ export class MgtPeoplePicker extends MgtTemplatedComponent {
392392
private _type: PersonType = PersonType.person;
393393
private _groupType: GroupType = GroupType.any;
394394
private _userType: UserType = UserType.any;
395+
private _currentSelectedUser: IDynamicPerson;
395396

396397
private defaultPeople: IDynamicPerson[];
397398

@@ -521,7 +522,12 @@ export class MgtPeoplePicker extends MgtTemplatedComponent {
521522

522523
return html`
523524
<div dir=${this.direction} class=${classMap(inputClasses)} @click=${e => this.focus(e)}>
524-
<div class="selected-list">
525+
<div
526+
aria-expanded="false"
527+
aria-haspopup="listbox"
528+
role="combobox"
529+
class="selected-list"
530+
id="selected-list">
525531
${selectedPeopleTemplate} ${flyoutTemplate}
526532
</div>
527533
</div>
@@ -587,16 +593,30 @@ export class MgtPeoplePicker extends MgtTemplatedComponent {
587593
return null;
588594
}
589595

596+
const inputAriaLabelText = `${
597+
this._currentSelectedUser !== undefined
598+
? this.strings.selected + ' ' + this._currentSelectedUser.displayName + ' '
599+
: ''
600+
} ' people-picker-input'`;
601+
590602
return html`
591603
<div class="${classMap(inputClasses)}">
592604
<input
593605
id="people-picker-input"
594606
class="search-box__input"
595607
type="text"
608+
role="combobox"
596609
placeholder=${placeholder}
610+
aria-placeholder=${placeholder}
597611
label="people-picker-input"
598-
aria-label="people-picker-input"
599-
role="input"
612+
autocomplete="off"
613+
aria-label=${inputAriaLabelText}
614+
aria-autocomplete="list"
615+
aria-controls="suggestions-list"
616+
aria-multiline="false"
617+
aria-owns="suggestions-list"
618+
aria-activedescendant="suggestions-list"
619+
tabindex="0"
600620
@keydown="${this.onUserKeyDown}"
601621
@keyup="${this.onUserKeyUp}"
602622
@blur=${this.lostFocus}
@@ -741,7 +761,7 @@ export class MgtPeoplePicker extends MgtTemplatedComponent {
741761
this.renderTemplate('no-data', null) ||
742762
html`
743763
<div class="message-parent">
744-
<div label="search-error-text" aria-label="We didn't find any matches." class="search-error-text">
764+
<div label="search-error-text" aria-label=${this.strings.noResultsFound} class="search-error-text">
745765
${this.strings.noResultsFound}
746766
</div>
747767
</div>
@@ -760,8 +780,25 @@ export class MgtPeoplePicker extends MgtTemplatedComponent {
760780
protected renderSearchResults(people?: IDynamicPerson[]) {
761781
people = people || this._foundPeople;
762782
let filteredPeople = people.filter(person => person.id);
783+
let firstName = '';
784+
785+
const selectedList = this.renderRoot.querySelector('.selected-list');
786+
let names = '';
787+
for (let i = 0; i < filteredPeople.length; i++) {
788+
names += filteredPeople[i].displayName.toString() + ' ';
789+
}
790+
763791
return html`
764-
<div class="people-list" @mouseenter=${this.handleMouseEnter} @mouseleave=${this.handleMouseLeave}>
792+
<div
793+
id="suggestions-list"
794+
class="people-list"
795+
aria-expanded="true"
796+
role="list"
797+
aria-label="people-picker-input input text ${
798+
this.userInput.length === 0 ? this.strings.inputPlaceholderText : this.userInput
799+
} ${this.strings.suggestedContacts} ${names}"
800+
@mouseenter=${this.handleMouseEnter}
801+
@mouseleave=${this.handleMouseLeave}>
765802
${repeat(
766803
filteredPeople,
767804
person => person.id,
@@ -772,7 +809,13 @@ export class MgtPeoplePicker extends MgtTemplatedComponent {
772809
'list-person': true
773810
};
774811
return html`
775-
<li class="${classMap(listPersonClasses)}" @click="${e => this.onPersonClick(person)}">
812+
<li
813+
role="option"
814+
aria-label=" ${this.strings.suggestedContact} ${person.displayName}"
815+
id="${person.displayName}"
816+
tabindex="0"
817+
class="${classMap(listPersonClasses)}"
818+
@click="${e => this.onPersonClick(person)}">
776819
${this.renderPersonResult(person)}
777820
</li>
778821
`;
@@ -1206,6 +1249,7 @@ export class MgtPeoplePicker extends MgtTemplatedComponent {
12061249
}
12071250

12081251
private onPersonClick(person: IDynamicPerson): void {
1252+
this._currentSelectedUser = person;
12091253
this.addPerson(person);
12101254
this.hideFlyout();
12111255

packages/mgt-components/src/components/mgt-people-picker/strings.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,8 @@
88
export const strings = {
99
inputPlaceholderText: 'Start typing a name',
1010
noResultsFound: `We didn't find any matches.`,
11-
loadingMessage: 'Loading...'
11+
loadingMessage: 'Loading...',
12+
suggestedContact: 'suggested contact',
13+
suggestedContacts: 'suggested contacts',
14+
selected: 'selected'
1215
};

0 commit comments

Comments
 (0)