Skip to content

Commit 5d23cf8

Browse files
authored
fix: enable keyboard interactions after cliking on thumb (#33922)
1 parent 156b618 commit 5d23cf8

File tree

5 files changed

+34
-20
lines changed

5 files changed

+34
-20
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"type": "prerelease",
3+
"comment": "fix: enable keyboard interactions after clicking on thumb",
4+
"packageName": "@fluentui/web-components",
5+
"email": "machi@microsoft.com",
6+
"dependentChangeType": "patch"
7+
}

packages/web-components/docs/web-components.api.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3521,16 +3521,16 @@ export class Slider extends FASTElement implements SliderConfiguration {
35213521
// (undocumented)
35223522
handleChange(_: any, propertyName: string): void;
35233523
// (undocumented)
3524-
handlePointerDown: (event: PointerEvent | null) => void;
3525-
handleThumbPointerDown: (event: PointerEvent | null) => void;
3524+
handleKeydown(event: KeyboardEvent): boolean;
3525+
// (undocumented)
3526+
handlePointerDown: (event: PointerEvent | null) => boolean;
3527+
handleThumbPointerDown: (event: PointerEvent | null) => boolean;
35263528
increment(): void;
35273529
initialValue: string;
35283530
// @internal
35293531
protected initialValueChanged(_: string, next: string): void;
35303532
// @internal (undocumented)
35313533
isDragging: boolean;
3532-
// (undocumented)
3533-
keypressHandler: (event: KeyboardEvent) => void;
35343534
get labels(): ReadonlyArray<Node>;
35353535
max: string;
35363536
// (undocumented)

packages/web-components/src/slider/slider.spec.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -712,4 +712,18 @@ test.describe('Slider', () => {
712712
expect(thumbBox.y + thumbBox.height / 2).toBeCloseTo(thumbMoveToY);
713713
});
714714
});
715+
716+
test('should allow keyboard interactions after clicking on the thumb', async ({ fastPage, page }) => {
717+
const { element } = fastPage;
718+
const thumb = element.locator('.thumb-container');
719+
720+
await expect(element).toHaveJSProperty('valueAsNumber', 50);
721+
722+
await thumb.click();
723+
await page.keyboard.press('ArrowRight');
724+
await page.keyboard.press('ArrowRight', { delay: 10 });
725+
await page.keyboard.press('ArrowRight', { delay: 10 });
726+
727+
await expect(element).toHaveJSProperty('valueAsNumber', 53);
728+
});
715729
});

packages/web-components/src/slider/slider.template.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ export function sliderTemplate<T extends Slider>(options: SliderOptions = {}): E
99
<template
1010
tabindex="${x => (x.disabled ? null : 0)}"
1111
@pointerdown="${(x, c) => x.handlePointerDown(c.event as PointerEvent)}"
12+
@keydown="${(x, c) => x.handleKeydown(c.event as KeyboardEvent)}"
1213
>
1314
<div ${ref('track')} part="track-container" class="track" style="${x => x.position}"></div>
1415
<div

packages/web-components/src/slider/slider.ts

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -537,7 +537,6 @@ export class Slider extends FASTElement implements SliderConfiguration {
537537
this.setDisabledSideEffect(this.disabled);
538538
this.updateStepMultiplier();
539539
this.setupTrackConstraints();
540-
this.setupListeners();
541540
this.setupDefaultValue();
542541
this.setSliderPosition();
543542

@@ -554,8 +553,6 @@ export class Slider extends FASTElement implements SliderConfiguration {
554553
public disconnectedCallback(): void {
555554
super.disconnectedCallback();
556555

557-
this.setupListeners(true);
558-
559556
Observable.getNotifier(this).unsubscribe(this, 'max');
560557
Observable.getNotifier(this).unsubscribe(this, 'min');
561558
Observable.getNotifier(this).unsubscribe(this, 'step');
@@ -593,9 +590,9 @@ export class Slider extends FASTElement implements SliderConfiguration {
593590
this.value = decrementedValString;
594591
}
595592

596-
public keypressHandler = (event: KeyboardEvent): void => {
593+
public handleKeydown(event: KeyboardEvent): boolean {
597594
if (this.disabled) {
598-
return;
595+
return true;
599596
}
600597

601598
switch (event.key) {
@@ -628,7 +625,9 @@ export class Slider extends FASTElement implements SliderConfiguration {
628625
}
629626
break;
630627
}
631-
};
628+
629+
return true;
630+
}
632631

633632
/**
634633
* Places the thumb based on the current value
@@ -666,15 +665,6 @@ export class Slider extends FASTElement implements SliderConfiguration {
666665
}
667666
};
668667

669-
private setupListeners = (remove: boolean = false): void => {
670-
//TODO Bug: https://github.com/microsoft/fluentui/issues/30087
671-
this.addEventListener('keydown', this.keypressHandler);
672-
673-
if (remove) {
674-
this.removeEventListener('keydown', this.keypressHandler);
675-
}
676-
};
677-
678668
private get midpoint(): string {
679669
return `${this.convertToConstrainedValue((this.maxAsNumber + this.minAsNumber) / 2)}`;
680670
}
@@ -698,13 +688,14 @@ export class Slider extends FASTElement implements SliderConfiguration {
698688
* Handle mouse moves during a thumb drag operation
699689
* If the event handler is null it removes the events
700690
*/
701-
public handleThumbPointerDown = (event: PointerEvent | null): void => {
691+
public handleThumbPointerDown = (event: PointerEvent | null): boolean => {
702692
const windowFn = event !== null ? window.addEventListener : window.removeEventListener;
703693
windowFn('pointerup', this.handleWindowPointerUp);
704694
windowFn('pointermove', this.handlePointerMove, { passive: true });
705695
windowFn('touchmove', this.handlePointerMove, { passive: true });
706696
windowFn('touchend', this.handleWindowPointerUp);
707697
this.isDragging = event !== null;
698+
return true;
708699
};
709700

710701
/**
@@ -787,6 +778,7 @@ export class Slider extends FASTElement implements SliderConfiguration {
787778
this.value = `${this.calculateNewValue(controlValue)}`;
788779
}
789780
}
781+
return true;
790782
};
791783

792784
private convertToConstrainedValue(value: number): number {

0 commit comments

Comments
 (0)