chore(FilterBar): Filter bar accessibility (#30812)
This commit is contained in:
parent
de8282cea0
commit
5b2f005e80
|
|
@ -608,8 +608,9 @@ const Select = forwardRef(
|
||||||
<StyledHeader headerPosition={headerPosition}>{header}</StyledHeader>
|
<StyledHeader headerPosition={headerPosition}>{header}</StyledHeader>
|
||||||
)}
|
)}
|
||||||
<StyledSelect
|
<StyledSelect
|
||||||
|
id={name}
|
||||||
allowClear={!isLoading && allowClear}
|
allowClear={!isLoading && allowClear}
|
||||||
aria-label={ariaLabel || name}
|
aria-label={ariaLabel}
|
||||||
autoClearSearchValue={autoClearSearchValue}
|
autoClearSearchValue={autoClearSearchValue}
|
||||||
dropdownRender={dropdownRender}
|
dropdownRender={dropdownRender}
|
||||||
filterOption={handleFilterOption}
|
filterOption={handleFilterOption}
|
||||||
|
|
|
||||||
|
|
@ -253,7 +253,10 @@ const FilterControl = ({
|
||||||
const label = useMemo(
|
const label = useMemo(
|
||||||
() => (
|
() => (
|
||||||
<FilterControlTitleBox>
|
<FilterControlTitleBox>
|
||||||
<FilterControlTitle data-test="filter-control-name">
|
<FilterControlTitle
|
||||||
|
id={`filter-name-${filter.id}`}
|
||||||
|
data-test="filter-control-name"
|
||||||
|
>
|
||||||
{name}
|
{name}
|
||||||
</FilterControlTitle>
|
</FilterControlTitle>
|
||||||
{isRequired && <RequiredFieldIndicator />}
|
{isRequired && <RequiredFieldIndicator />}
|
||||||
|
|
@ -315,7 +318,7 @@ const FilterControl = ({
|
||||||
<div>
|
<div>
|
||||||
<FormItem
|
<FormItem
|
||||||
label={label}
|
label={label}
|
||||||
aria-label={name}
|
htmlFor={filter.id}
|
||||||
required={filter?.controlValues?.enableEmptyFilter}
|
required={filter?.controlValues?.enableEmptyFilter}
|
||||||
validateStatus={validateStatus}
|
validateStatus={validateStatus}
|
||||||
>
|
>
|
||||||
|
|
|
||||||
|
|
@ -152,6 +152,7 @@ const getTooltipTitle = (
|
||||||
|
|
||||||
export default function DateFilterLabel(props: DateFilterControlProps) {
|
export default function DateFilterLabel(props: DateFilterControlProps) {
|
||||||
const {
|
const {
|
||||||
|
name,
|
||||||
onChange,
|
onChange,
|
||||||
onOpenPopover = noOp,
|
onOpenPopover = noOp,
|
||||||
onClosePopover = noOp,
|
onClosePopover = noOp,
|
||||||
|
|
@ -384,6 +385,9 @@ export default function DateFilterLabel(props: DateFilterControlProps) {
|
||||||
getPopupContainer={trigger => trigger.parentElement as HTMLElement}
|
getPopupContainer={trigger => trigger.parentElement as HTMLElement}
|
||||||
>
|
>
|
||||||
<DateLabel
|
<DateLabel
|
||||||
|
name={name}
|
||||||
|
aria-labelledby={`filter-name-${props.name}`}
|
||||||
|
aria-describedby={`date-label-${props.name}`}
|
||||||
label={actualTimeRange}
|
label={actualTimeRange}
|
||||||
isActive={show}
|
isActive={show}
|
||||||
isPlaceholder={actualTimeRange === NO_TIME_RANGE}
|
isPlaceholder={actualTimeRange === NO_TIME_RANGE}
|
||||||
|
|
@ -402,6 +406,9 @@ export default function DateFilterLabel(props: DateFilterControlProps) {
|
||||||
getPopupContainer={trigger => trigger.parentElement as HTMLElement}
|
getPopupContainer={trigger => trigger.parentElement as HTMLElement}
|
||||||
>
|
>
|
||||||
<DateLabel
|
<DateLabel
|
||||||
|
name={name}
|
||||||
|
aria-labelledby={`filter-name-${props.name}`}
|
||||||
|
aria-describedby={`date-label-${props.name}`}
|
||||||
onClick={toggleOverlay}
|
onClick={toggleOverlay}
|
||||||
label={actualTimeRange}
|
label={actualTimeRange}
|
||||||
isActive={show}
|
isActive={show}
|
||||||
|
|
|
||||||
|
|
@ -23,6 +23,7 @@ import { css, styled, useTheme, t } from '@superset-ui/core';
|
||||||
import Icons from 'src/components/Icons';
|
import Icons from 'src/components/Icons';
|
||||||
|
|
||||||
export type DateLabelProps = {
|
export type DateLabelProps = {
|
||||||
|
name?: string;
|
||||||
label: ReactNode;
|
label: ReactNode;
|
||||||
isActive?: boolean;
|
isActive?: boolean;
|
||||||
isPlaceholder?: boolean;
|
isPlaceholder?: boolean;
|
||||||
|
|
@ -87,8 +88,12 @@ export const DateLabel = forwardRef(
|
||||||
(props: DateLabelProps, ref: RefObject<HTMLSpanElement>) => {
|
(props: DateLabelProps, ref: RefObject<HTMLSpanElement>) => {
|
||||||
const theme = useTheme();
|
const theme = useTheme();
|
||||||
return (
|
return (
|
||||||
<LabelContainer {...props} tabIndex={0}>
|
<LabelContainer {...props} tabIndex={0} role="button">
|
||||||
<span className="date-label-content" ref={ref}>
|
<span
|
||||||
|
id={`date-label-${props.name}`}
|
||||||
|
className="date-label-content"
|
||||||
|
ref={ref}
|
||||||
|
>
|
||||||
{typeof props.label === 'string' ? t(props.label) : props.label}
|
{typeof props.label === 'string' ? t(props.label) : props.label}
|
||||||
</span>
|
</span>
|
||||||
<Icons.CalendarOutlined
|
<Icons.CalendarOutlined
|
||||||
|
|
|
||||||
|
|
@ -315,7 +315,10 @@ export default function RangeFilterPlugin(props: PluginFilterRangeProps) {
|
||||||
{Number.isNaN(Number(min)) || Number.isNaN(Number(max)) ? (
|
{Number.isNaN(Number(min)) || Number.isNaN(Number(max)) ? (
|
||||||
<h4>{t('Chosen non-numeric column')}</h4>
|
<h4>{t('Chosen non-numeric column')}</h4>
|
||||||
) : (
|
) : (
|
||||||
<StyledFormItem extra={formItemExtra}>
|
<StyledFormItem
|
||||||
|
aria-labelledby={`filter-name-${formData.nativeFilterId}`}
|
||||||
|
extra={formItemExtra}
|
||||||
|
>
|
||||||
<Wrapper
|
<Wrapper
|
||||||
tabIndex={-1}
|
tabIndex={-1}
|
||||||
ref={inputRef}
|
ref={inputRef}
|
||||||
|
|
|
||||||
|
|
@ -293,6 +293,7 @@ export default function PluginFilterSelect(props: PluginFilterSelectProps) {
|
||||||
extra={formItemExtra}
|
extra={formItemExtra}
|
||||||
>
|
>
|
||||||
<Select
|
<Select
|
||||||
|
name={formData.nativeFilterId}
|
||||||
allowClear
|
allowClear
|
||||||
allowNewOptions={!searchAllOptions}
|
allowNewOptions={!searchAllOptions}
|
||||||
allowSelectAll={!searchAllOptions}
|
allowSelectAll={!searchAllOptions}
|
||||||
|
|
|
||||||
|
|
@ -94,7 +94,7 @@ export default function TimeFilterPlugin(props: PluginFilterTimeProps) {
|
||||||
>
|
>
|
||||||
<DateFilterControl
|
<DateFilterControl
|
||||||
value={filterState.value || NO_TIME_RANGE}
|
value={filterState.value || NO_TIME_RANGE}
|
||||||
name="time_range"
|
name={props.formData.nativeFilterId || 'time_range'}
|
||||||
onChange={handleTimeRangeChange}
|
onChange={handleTimeRangeChange}
|
||||||
onOpenPopover={() => setFilterActive(true)}
|
onOpenPopover={() => setFilterActive(true)}
|
||||||
onClosePopover={() => {
|
onClosePopover={() => {
|
||||||
|
|
|
||||||
|
|
@ -111,6 +111,7 @@ export default function PluginFilterTimeColumn(
|
||||||
{...formItemData}
|
{...formItemData}
|
||||||
>
|
>
|
||||||
<Select
|
<Select
|
||||||
|
name={formData.nativeFilterId}
|
||||||
allowClear
|
allowClear
|
||||||
value={value}
|
value={value}
|
||||||
placeholder={placeholderText}
|
placeholder={placeholderText}
|
||||||
|
|
|
||||||
|
|
@ -121,6 +121,7 @@ export default function PluginFilterTimegrain(
|
||||||
{...formItemData}
|
{...formItemData}
|
||||||
>
|
>
|
||||||
<Select
|
<Select
|
||||||
|
name={formData.nativeFilterId}
|
||||||
allowClear
|
allowClear
|
||||||
value={value}
|
value={value}
|
||||||
placeholder={placeholderText}
|
placeholder={placeholderText}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue