Skip to content

Commit d5a5de2

Browse files
fix(material-experimental/mdc-slider): initialize the aria-valuetext … (#22877)
* fix(material-experimental/mdc-slider): initialize the aria-valuetext for slider thumb inputs * The MDC Foundation does not set the aria-valuetext of slider inputs until a value change, so we need to manually initialize it. * fixup! fix(material-experimental/mdc-slider): initialize the aria-valuetext for slider thumb inputs * fix(material-experimental/mdc-slider): reword comment Co-authored-by: Paul Gschwendtner <paulgschwendtner@gmail.com> Co-authored-by: Paul Gschwendtner <paulgschwendtner@gmail.com>
1 parent 4cee3b7 commit d5a5de2

File tree

2 files changed

+35
-0
lines changed

2 files changed

+35
-0
lines changed

src/material-experimental/mdc-slider/slider.spec.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ describe('MDC-based MatSlider' , () => {
7171
expect(inputInstance.value).toBe(0);
7272
expect(sliderInstance.min).toBe(0);
7373
expect(sliderInstance.max).toBe(100);
74+
expect(inputInstance._hostElement.getAttribute('aria-valuetext')).toBe('0');
7475
});
7576

7677
it('should update the value on mousedown', () => {
@@ -126,6 +127,8 @@ describe('MDC-based MatSlider' , () => {
126127
expect(endInputInstance.value).toBe(100);
127128
expect(sliderInstance.min).toBe(0);
128129
expect(sliderInstance.max).toBe(100);
130+
expect(startInputInstance._hostElement.getAttribute('aria-valuetext')).toBe('0');
131+
expect(endInputInstance._hostElement.getAttribute('aria-valuetext')).toBe('100');
129132
});
130133

131134
it('should update the start value on a slide', () => {
@@ -657,6 +660,7 @@ describe('MDC-based MatSlider' , () => {
657660
describe('slider with custom thumb label formatting', () => {
658661
let fixture: ComponentFixture<DiscreteSliderWithDisplayWith>;
659662
let sliderInstance: MatSlider;
663+
let inputInstance: MatSliderThumb;
660664
let valueIndicatorTextElement: Element;
661665

662666
beforeEach(() => {
@@ -667,6 +671,13 @@ describe('MDC-based MatSlider' , () => {
667671
sliderInstance = sliderDebugElement.componentInstance;
668672
valueIndicatorTextElement =
669673
sliderNativeElement.querySelector('.mdc-slider__value-indicator-text')!;
674+
inputInstance = sliderInstance._getInput(Thumb.END);
675+
});
676+
677+
it('should set the aria-valuetext attribute with the given `displayWith` function', () => {
678+
expect(inputInstance._hostElement.getAttribute('aria-valuetext')).toBe('$1');
679+
sliderInstance._setValue(10000, Thumb.END);
680+
expect(inputInstance._hostElement.getAttribute('aria-valuetext')).toBe('$10k');
670681
});
671682

672683
it('should invoke the passed-in `displayWith` function with the value', () => {
@@ -687,12 +698,16 @@ describe('MDC-based MatSlider' , () => {
687698
let sliderInstance: MatSlider;
688699
let startValueIndicatorTextElement: Element;
689700
let endValueIndicatorTextElement: Element;
701+
let startInputInstance: MatSliderThumb;
702+
let endInputInstance: MatSliderThumb;
690703

691704
beforeEach(() => {
692705
fixture = createComponent(DiscreteRangeSliderWithDisplayWith);
693706
fixture.detectChanges();
694707
const sliderDebugElement = fixture.debugElement.query(By.directive(MatSlider))!;
695708
sliderInstance = sliderDebugElement.componentInstance;
709+
startInputInstance = sliderInstance._getInput(Thumb.START);
710+
endInputInstance = sliderInstance._getInput(Thumb.END);
696711

697712
const startThumbElement = sliderInstance._getThumbElement(Thumb.START);
698713
const endThumbElement = sliderInstance._getThumbElement(Thumb.END);
@@ -702,6 +717,15 @@ describe('MDC-based MatSlider' , () => {
702717
endThumbElement.querySelector('.mdc-slider__value-indicator-text')!;
703718
});
704719

720+
it('should set the aria-valuetext attribute with the given `displayWith` function', () => {
721+
expect(startInputInstance._hostElement.getAttribute('aria-valuetext')).toBe('$1');
722+
expect(endInputInstance._hostElement.getAttribute('aria-valuetext')).toBe('$1000k');
723+
sliderInstance._setValue(250000, Thumb.START);
724+
sliderInstance._setValue(810000, Thumb.END);
725+
expect(startInputInstance._hostElement.getAttribute('aria-valuetext')).toBe('$250k');
726+
expect(endInputInstance._hostElement.getAttribute('aria-valuetext')).toBe('$810k');
727+
});
728+
705729
it('should invoke the passed-in `displayWith` function with the start value', () => {
706730
spyOn(sliderInstance, 'displayWith').and.callThrough();
707731
sliderInstance._setValue(1337, Thumb.START);

src/material-experimental/mdc-slider/slider.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,7 @@ export class MatSliderThumb implements AfterViewInit, ControlValueAccessor, OnIn
379379
// By calling this in ngOnInit() we guarantee that the sibling sliders initial value by
380380
// has already been set by the time we reach ngAfterViewInit().
381381
this._initializeInputValueAttribute();
382+
this._initializeAriaValueText();
382383
}
383384

384385
ngAfterViewInit() {
@@ -503,6 +504,16 @@ export class MatSliderThumb implements AfterViewInit, ControlValueAccessor, OnIn
503504
}
504505
}
505506

507+
/**
508+
* Initializes the aria-valuetext attribute.
509+
*
510+
* Must be called AFTER the value attribute is set. This is because the slider's parent
511+
* `displayWith` function is used to set the `aria-valuetext` attribute.
512+
*/
513+
private _initializeAriaValueText(): void {
514+
this._hostElement.setAttribute('aria-valuetext', this._slider.displayWith(this.value));
515+
}
516+
506517
static ngAcceptInputType_value: NumberInput;
507518
}
508519

0 commit comments

Comments
 (0)