Skip to content

Commit

Permalink
Merge pull request #2918 from Akshat55/combobox-label-readaloud
Browse files Browse the repository at this point in the history
fix: allow labels to be read for combobox and hide labels but keep them accessible to screen reader
  • Loading branch information
Akshat55 authored Jun 12, 2024
2 parents 075b069 + 204dc52 commit ab09b91
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 5 deletions.
13 changes: 11 additions & 2 deletions src/combobox/combobox.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,12 @@ import { Observable } from "rxjs";
<label
*ngIf="label"
[for]="id"
[id]="labelId"
class="bx--label"
[ngClass]="{'bx--label--disabled': disabled}">
[ngClass]="{
'bx--label--disabled': disabled,
'bx--visually-hidden': hideLabel
}">
<ng-container *ngIf="!isTemplate(label)">{{label}}</ng-container>
<ng-template *ngIf="isTemplate(label)" [ngTemplateOutlet]="label"></ng-template>
</label>
Expand Down Expand Up @@ -105,7 +109,7 @@ import { Observable } from "rxjs";
[ngClass]="{'bx--text-input--empty': !showClearButton}"
tabindex="0"
[id]="id"
[attr.aria-labelledby]="id"
[attr.aria-labelledby]="labelId"
[attr.aria-expanded]="open"
aria-haspopup="listbox"
[attr.maxlength]="maxLength"
Expand Down Expand Up @@ -253,6 +257,7 @@ export class ComboBox implements OnChanges, AfterViewInit, AfterContentInit, OnD
}
static comboBoxCount = 0;
@Input() id = `dropdown-${ComboBox.comboBoxCount++}`;
@Input() labelId = `dropdown-label-${ComboBox.comboBoxCount++}`;
/**
* List of items to fill the content with.
*
Expand Down Expand Up @@ -298,6 +303,10 @@ export class ComboBox implements OnChanges, AfterViewInit, AfterContentInit, OnD
* Label for the combobox.
*/
@Input() label: string | TemplateRef<any>;
/**
* Hide label while keeping it available for screen readers
*/
@Input() hideLabel = false;
/**
* Sets the optional helper text.
*/
Expand Down
15 changes: 13 additions & 2 deletions src/combobox/combobox.stories.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ const getOptions = (override = {}) => {
warn: boolean("Show the warning state", false),
warnText: text("Text for the warning", "This is a warning"),
label: text("Label", "ComboBox label"),
hideLabel: boolean("Hide label", false),
helperText: text("Helper text", "Optional helper text."),
items: object("items", [
{ content: "one" },
Expand Down Expand Up @@ -131,7 +132,8 @@ class DynamicListComboBox implements AfterViewInit {
[invalidText]="invalidText"
[warn]="warn"
[warnText]="warnText"
[items]="_items">
[items]="_items"
[hideLabel]="hideLabel">
<ibm-dropdown-list></ibm-dropdown-list>
</ibm-combo-box>
selected: {{ sampleForm.get("combobox").value | json }}
Expand All @@ -147,7 +149,8 @@ class DynamicListComboBox implements AfterViewInit {
[invalidText]="invalidText"
[warn]="warn"
[warnText]="warnText"
[items]="_items">
[items]="_items"
[hideLabel]="hideLabel">
<ibm-dropdown-list></ibm-dropdown-list>
</ibm-combo-box>
selected: {{ sampleForm.get("multibox").value | json }}
Expand All @@ -164,6 +167,7 @@ class ReactiveFormsCombobox implements OnInit {
@Input() helperText = "";
@Input() size = "md";
@Input() theme = "dark";
@Input() hideLabel = false;
@Input() set items(newItems) {
if (!isEqual(this._items, newItems)) {
this._items = newItems;
Expand Down Expand Up @@ -290,6 +294,7 @@ storiesOf("Components|Combobox", module)
[warn]="warn"
[warnText]="warnText"
[label]="label"
[hideLabel]="hideLabel"
[helperText]="helperText"
[items]="items"
[theme]="theme"
Expand Down Expand Up @@ -322,6 +327,7 @@ storiesOf("Components|Combobox", module)
[size]="size"
[invalidText]="invalidText"
[label]="label"
[hideLabel]="hideLabel"
[helperText]="helperText"
[items]="items"
[theme]="theme"
Expand All @@ -347,6 +353,7 @@ storiesOf("Components|Combobox", module)
[size]="size"
[invalidText]="invalidText"
[label]="label"
[hideLabel]="hideLabel"
[helperText]="helperText"
[items]="items"
[theme]="theme"
Expand Down Expand Up @@ -382,6 +389,7 @@ storiesOf("Components|Combobox", module)
[invalid]="invalid"
[invalidText]="invalidText"
[label]="label"
[hideLabel]="hideLabel"
[size]="size"
[helperText]="helperText"
[items]="items"
Expand Down Expand Up @@ -421,6 +429,7 @@ storiesOf("Components|Combobox", module)
[invalid]="invalid"
[invalidText]="invalidText"
[label]="label"
[hideLabel]="hideLabel"
[warn]="warn"
[disabled]="disabled"
[size]="size"
Expand Down Expand Up @@ -472,6 +481,7 @@ storiesOf("Components|Combobox", module)
[invalid]="invalid"
[invalidText]="invalidText"
[label]="label"
[hideLabel]="hideLabel"
[helperText]="helperText"
[items]="items"
[theme]="theme"
Expand Down Expand Up @@ -508,6 +518,7 @@ storiesOf("Components|Combobox", module)
[invalid]="invalid"
[invalidText]="invalidText"
[label]="label"
[hideLabel]="hideLabel"
[size]="size"
itemValueKey="content"
[helperText]="helperText"
Expand Down
9 changes: 8 additions & 1 deletion src/dropdown/dropdown.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,10 @@ import { hasScrollableParents } from "carbon-components-angular/utils";
*ngIf="label"
[for]="id"
class="bx--label"
[ngClass]="{'bx--label--disabled': disabled}">
[ngClass]="{
'bx--label--disabled': disabled,
'bx--visually-hidden': hideLabel
}">
<ng-container *ngIf="!isTemplate(label)">{{label}}</ng-container>
<ng-template *ngIf="isTemplate(label)" [ngTemplateOutlet]="label"></ng-template>
</label>
Expand Down Expand Up @@ -176,6 +179,10 @@ export class Dropdown implements OnInit, AfterContentInit, AfterViewInit, OnDest
* Label for the dropdown.
*/
@Input() label: string | TemplateRef<any>;
/**
* Hide label while keeping it available for screen readers
*/
@Input() hideLabel = false;
/**
* Sets the optional helper text.
*/
Expand Down
9 changes: 9 additions & 0 deletions src/dropdown/dropdown.stories.ts
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ const getProps = (overrides = {}) => Object.assign({}, {
warnText: text("Text for the warning", "This is a warning"),
disabled: boolean("disabled", false),
label: text("Label", "Dropdown label"),
hideLabel: boolean("Hide label", false),
helperText: text("Helper text", "Optional helper text."),
items: object("items", [
{ content: "one" },
Expand All @@ -84,6 +85,7 @@ const getProps = (overrides = {}) => Object.assign({}, {
<div style="width: 300px">
<ibm-dropdown
[label]="label"
[hideLabel]="hideLabel"
[helperText]="helperText"
[invalid]="invalid"
[invalidText]="invalidText"
Expand All @@ -109,6 +111,7 @@ class ReactiveFormsStory implements OnInit {

@Input() items = [];
@Input() label = "";
@Input() hideLabel = false;
@Input() helperText = "";
@Input() invalid = false;
@Input() invalidText = "";
Expand Down Expand Up @@ -192,6 +195,7 @@ storiesOf("Components|Dropdown", module)
<div style="width: 300px">
<ibm-dropdown
[label]="label"
[hideLabel]="hideLabel"
[helperText]="helperText"
[size]="size"
[dropUp]="dropUp"
Expand All @@ -215,6 +219,7 @@ storiesOf("Components|Dropdown", module)
<div style="width: 300px">
<ibm-dropdown
[label]="label"
[hideLabel]="hideLabel"
[helperText]="helperText"
[size]="size"
[dropUp]="dropUp"
Expand All @@ -241,6 +246,7 @@ storiesOf("Components|Dropdown", module)
<ibm-dropdown
type="multi"
[label]="label"
[hideLabel]="hideLabel"
[helperText]="helperText"
[size]="size"
[dropUp]="dropUp"
Expand Down Expand Up @@ -272,6 +278,7 @@ storiesOf("Components|Dropdown", module)
<div style="width: 300px">
<ibm-dropdown
[label]="label"
[hideLabel]="hideLabel"
[helperText]="helperText"
[size]="size"
[invalid]="invalid"
Expand Down Expand Up @@ -313,6 +320,7 @@ storiesOf("Components|Dropdown", module)
-->
<app-reactive-forms
[label]="label"
[hideLabel]="hideLabel"
[helperText]="helperText"
[invalid]="invalid"
[invalidText]="invalidText"
Expand Down Expand Up @@ -346,6 +354,7 @@ storiesOf("Components|Dropdown", module)
<div style="width: 300px">
<ibm-dropdown
[label]="label"
[hideLabel]="hideLabel"
[helperText]="helperText"
[invalid]="invalid"
[invalidText]="invalidText"
Expand Down

0 comments on commit ab09b91

Please sign in to comment.