diff --git a/eslint-suppressions.json b/eslint-suppressions.json index 43845407d57..227edc2fd71 100644 --- a/eslint-suppressions.json +++ b/eslint-suppressions.json @@ -833,16 +833,6 @@ "count": 13 } }, - "packages/grafana-ui/src/components/Slider/RangeSlider.story.tsx": { - "no-restricted-syntax": { - "count": 1 - } - }, - "packages/grafana-ui/src/components/Slider/Slider.story.tsx": { - "no-restricted-syntax": { - "count": 1 - } - }, "packages/grafana-ui/src/components/Table/Cells/TableCell.tsx": { "@typescript-eslint/consistent-type-assertions": { "count": 3 diff --git a/packages/grafana-ui/src/components/Slider/RangeSlider.story.tsx b/packages/grafana-ui/src/components/Slider/RangeSlider.story.tsx index d00648bdfbe..eccb916483a 100644 --- a/packages/grafana-ui/src/components/Slider/RangeSlider.story.tsx +++ b/packages/grafana-ui/src/components/Slider/RangeSlider.story.tsx @@ -9,8 +9,6 @@ const meta: Meta = { controls: { exclude: ['tooltipAlwaysVisible'], }, - // TODO fix a11y issue in story and remove this - a11y: { test: 'off' }, }, argTypes: { orientation: { control: { type: 'select', options: ['horizontal', 'vertical'] } }, diff --git a/packages/grafana-ui/src/components/Slider/RangeSlider.tsx b/packages/grafana-ui/src/components/Slider/RangeSlider.tsx index 34b9d403085..794ea5b795f 100644 --- a/packages/grafana-ui/src/components/Slider/RangeSlider.tsx +++ b/packages/grafana-ui/src/components/Slider/RangeSlider.tsx @@ -3,6 +3,8 @@ import { Global } from '@emotion/react'; import Slider, { SliderProps } from 'rc-slider'; import { useCallback } from 'react'; +import { t } from '@grafana/i18n'; + import { useStyles2 } from '../../themes/ThemeContext'; import HandleTooltip from './HandleTooltip'; @@ -44,6 +46,7 @@ export const RangeSlider = ({ const isHorizontal = orientation === 'horizontal'; const styles = useStyles2(getStyles, isHorizontal); + const dragHandleAriaLabel = t('grafana-ui.range-slider.drag-handle-aria-label', 'Use arrow keys to change the value'); const tipHandleRender: SliderProps['handleRender'] = (node, handleProps) => { return ( @@ -73,6 +76,7 @@ export const RangeSlider = ({ vertical={!isHorizontal} reverse={reverse} handleRender={tipHandleRender} + ariaLabelForHandle={dragHandleAriaLabel} /> ); diff --git a/packages/grafana-ui/src/components/Slider/Slider.story.tsx b/packages/grafana-ui/src/components/Slider/Slider.story.tsx index 770038dbc64..207a33ec5fe 100644 --- a/packages/grafana-ui/src/components/Slider/Slider.story.tsx +++ b/packages/grafana-ui/src/components/Slider/Slider.story.tsx @@ -1,4 +1,7 @@ import { StoryFn, Meta } from '@storybook/react'; +import { useId } from 'react'; + +import { Field } from '../Forms/Field'; import { Slider } from './Slider'; @@ -12,8 +15,6 @@ const meta: Meta = { knobs: { disabled: true, }, - // TODO fix a11y issue in story and remove this - a11y: { test: 'off' }, }, argTypes: { orientation: { control: { type: 'select', options: ['horizontal', 'vertical'] } }, @@ -31,17 +32,25 @@ const meta: Meta = { }; export const Basic: StoryFn = (args) => { + const id = useId(); + return (
- + + +
); }; export const WithMarks: StoryFn = (args) => { + const id = useId(); + return (
- + + +
); }; diff --git a/packages/grafana-ui/src/components/Slider/Slider.test.tsx b/packages/grafana-ui/src/components/Slider/Slider.test.tsx index 2723a180b3c..e24ccd7e751 100644 --- a/packages/grafana-ui/src/components/Slider/Slider.test.tsx +++ b/packages/grafana-ui/src/components/Slider/Slider.test.tsx @@ -7,6 +7,7 @@ import { SliderProps } from './types'; const sliderProps: SliderProps = { min: 10, max: 20, + inputId: 'slider-test', }; describe('Slider', () => { diff --git a/packages/grafana-ui/src/components/Slider/Slider.tsx b/packages/grafana-ui/src/components/Slider/Slider.tsx index c677d402dc9..e8c377070bf 100644 --- a/packages/grafana-ui/src/components/Slider/Slider.tsx +++ b/packages/grafana-ui/src/components/Slider/Slider.tsx @@ -3,6 +3,8 @@ import { Global } from '@emotion/react'; import SliderComponent from 'rc-slider'; import { useState, useCallback, ChangeEvent, FocusEvent } from 'react'; +import { t } from '@grafana/i18n'; + import { useStyles2 } from '../../themes/ThemeContext'; import { Input } from '../Input/Input'; @@ -24,11 +26,14 @@ export const Slider = ({ ariaLabelForHandle, marks, included, + inputId, }: SliderProps) => { const isHorizontal = orientation === 'horizontal'; const styles = useStyles2(getStyles, isHorizontal, Boolean(marks)); const SliderWithTooltip = SliderComponent; const [sliderValue, setSliderValue] = useState(value ?? min); + const dragHandleAriaLabel = + ariaLabelForHandle ?? t('grafana-ui.slider.drag-handle-aria-label', 'Use arrow keys to change the value'); const onSliderChange = useCallback( (v: number | number[]) => { @@ -102,7 +107,7 @@ export const Slider = ({ onChangeComplete={handleChangeComplete} vertical={!isHorizontal} reverse={reverse} - ariaLabelForHandle={ariaLabelForHandle} + ariaLabelForHandle={dragHandleAriaLabel} marks={marks} included={included} /> @@ -116,6 +121,7 @@ export const Slider = ({ onBlur={onSliderInputBlur} min={min} max={max} + id={inputId} /> diff --git a/packages/grafana-ui/src/components/Slider/types.ts b/packages/grafana-ui/src/components/Slider/types.ts index 2551ac84937..812a8bed7d7 100644 --- a/packages/grafana-ui/src/components/Slider/types.ts +++ b/packages/grafana-ui/src/components/Slider/types.ts @@ -21,6 +21,7 @@ export interface SliderProps extends CommonSliderProps { onAfterChange?: (value?: number) => void; formatTooltipResult?: (value: number) => number; ariaLabelForHandle?: string; + inputId: string; } export interface RangeSliderProps extends CommonSliderProps { diff --git a/public/locales/en-US/grafana.json b/public/locales/en-US/grafana.json index d976f91085a..ed29beb6afe 100644 --- a/public/locales/en-US/grafana.json +++ b/public/locales/en-US/grafana.json @@ -8697,6 +8697,9 @@ "tooltip-hide": "Hide password", "tooltip-show": "Show password" }, + "range-slider": { + "drag-handle-aria-label": "Use arrow keys to change the value" + }, "row-expander": { "aria-label-expand": "Expand row", "collapse": "Collapse row", @@ -8725,6 +8728,9 @@ "series-color-picker-popover": { "y-axis-usage": "Use right y-axis" }, + "slider": { + "drag-handle-aria-label": "Use arrow keys to change the value" + }, "spinner": { "aria-label": "Loading" },