Skip to content

Add aria-required and aria-multiselectable to accessibilityState on win32 #12046

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 14 commits into from
Aug 23, 2023
Merged
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"type": "prerelease",
"comment": "fix a11yState and add support for aria-required and -multiselectable",
"packageName": "@office-iss/react-native-win32",
"email": "[email protected]",
"dependentChangeType": "patch"
}
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,7 @@ class MultiSelectionExample extends React.Component<{}, IMultiSelectionExampleSt

public render() {
return (
<ViewWin32 accessible accessibilityRole="tablist" accessibilityState={{multiselectable: true}}>
<ViewWin32 accessible accessibilityRole="tablist" aria-required aria-multiselectable>
<SelectionItemComponent
value={1}
color="#aee8fcff"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,8 @@ type ButtonProps = $ReadOnly<{|
'aria-disabled'?: ?boolean,
'aria-expanded'?: ?boolean,
'aria-selected'?: ?boolean,
'aria-multiselectable'?: ?boolean, // Win32
'aria-required'?: ?boolean, // Win32

/**
* [Android] Controlling if a view fires accessibility events and if it is reported to accessibility services.
Expand Down Expand Up @@ -293,6 +295,8 @@ class Button extends React.Component<ButtonProps> {
'aria-disabled': ariaDisabled,
'aria-expanded': ariaExpanded,
'aria-label': ariaLabel,
'aria-multiselectable': ariaMultiselectable, // Win32
'aria-required': ariaRequired, // Win32
'aria-selected': ariaSelected,
importantForAccessibility,
color,
Expand Down Expand Up @@ -327,6 +331,9 @@ class Button extends React.Component<ButtonProps> {
checked: ariaChecked ?? accessibilityState?.checked,
disabled: ariaDisabled ?? accessibilityState?.disabled,
expanded: ariaExpanded ?? accessibilityState?.expanded,
multiselectable:
ariaMultiselectable ?? accessibilityState?.multiselectable, // Win32
required: ariaRequired ?? accessibilityState?.required, // Win32
selected: ariaSelected ?? accessibilityState?.selected,
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,8 @@ type Props = $ReadOnly<{|
'aria-disabled'?: ?boolean,
'aria-expanded'?: ?boolean,
'aria-selected'?: ?boolean,
'aria-multiselectable'?: ?boolean, // Win32
'aria-required'?: ?boolean, // Win32
/**
* A value indicating whether the accessibility elements contained within
* this accessibility element are hidden.
Expand Down Expand Up @@ -257,6 +259,8 @@ function Pressable(props: Props, forwardedRef): React.Node {
'aria-disabled': ariaDisabled,
'aria-expanded': ariaExpanded,
'aria-label': ariaLabel,
'aria-multiselectable': ariaMultiselectable, // Win32
'aria-required': ariaRequired, // Win32
'aria-selected': ariaSelected,
cancelable,
children,
Expand Down Expand Up @@ -297,6 +301,8 @@ function Pressable(props: Props, forwardedRef): React.Node {
checked: ariaChecked ?? accessibilityState?.checked,
disabled: ariaDisabled ?? accessibilityState?.disabled,
expanded: ariaExpanded ?? accessibilityState?.expanded,
multiselectable: ariaMultiselectable ?? accessibilityState?.multiselectable, // Win32
required: ariaRequired ?? accessibilityState?.required, // Win32
selected: ariaSelected ?? accessibilityState?.selected,
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1142,6 +1142,8 @@ function InternalTextInput(props: Props): React.Node {
'aria-disabled': ariaDisabled,
'aria-expanded': ariaExpanded,
'aria-selected': ariaSelected,
'aria-multiselectable': ariaMultiselectable, // Win32
'aria-required': ariaRequired, // Win32
accessibilityState,
id,
tabIndex,
Expand Down Expand Up @@ -1524,13 +1526,18 @@ function InternalTextInput(props: Props): React.Node {
ariaChecked != null ||
ariaDisabled != null ||
ariaExpanded != null ||
ariaMultiselectable != null ||
ariaRequired != null ||
ariaSelected != null
) {
_accessibilityState = {
busy: ariaBusy ?? accessibilityState?.busy,
checked: ariaChecked ?? accessibilityState?.checked,
disabled: ariaDisabled ?? accessibilityState?.disabled,
expanded: ariaExpanded ?? accessibilityState?.expanded,
multiselectable:
ariaMultiselectable ?? accessibilityState?.multiselectable, // Win32
required: ariaRequired ?? accessibilityState?.required, // Win32
selected: ariaSelected ?? accessibilityState?.selected,
};
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,9 @@ const View: React.AbstractComponent<
'aria-labelledby': ariaLabelledBy,
'aria-level': ariaLevel, // Win32
'aria-live': ariaLive,
'aria-multiselectable': ariaMultiselectable, // Win32
'aria-posinset': ariaPosinset, // Win32
'aria-required': ariaRequired, // Win32
'aria-selected': ariaSelected,
'aria-setsize': ariaSetsize, // Win32
'aria-valuemax': ariaValueMax,
Expand All @@ -85,13 +87,18 @@ const View: React.AbstractComponent<
ariaChecked != null ||
ariaDisabled != null ||
ariaExpanded != null ||
ariaMultiselectable != null ||
ariaRequired != null ||
ariaSelected != null
) {
_accessibilityState = {
busy: ariaBusy ?? accessibilityState?.busy,
checked: ariaChecked ?? accessibilityState?.checked,
disabled: ariaDisabled ?? accessibilityState?.disabled,
expanded: ariaExpanded ?? accessibilityState?.expanded,
multiselectable:
ariaMultiselectable ?? accessibilityState?.multiselectable, // Win32
required: ariaRequired ?? accessibilityState?.required, // Win32
selected: ariaSelected ?? accessibilityState?.selected,
};
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,8 @@ export interface AccessibilityProps
'aria-checked'?: boolean | 'mixed' | undefined;
'aria-disabled'?: boolean | undefined;
'aria-expanded'?: boolean | undefined;
'aria-multiselectable'?: boolean | undefined; // Win32
'aria-required'?: boolean | undefined; // Win32
'aria-selected'?: boolean | undefined;

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,8 @@ export type AccessibilityState = {
checked?: ?boolean | 'mixed',
busy?: boolean,
expanded?: boolean,
multiselectable?: boolean, // Win32
required?: boolean, // Win32
...
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -483,6 +483,8 @@ type WindowsViewProps = $ReadOnly<{|
'aria-level'?: ?number,
'aria-controls'?: ?Stringish,
'aria-describedby'?: ?Stringish,
'aria-multiselectable'?: ?boolean,
'aria-required'?: ?boolean,

/**
* Specifies if the control should show System focus visuals
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,8 @@ const BaseImage = (props: ImagePropsType, forwardedRef) => {
'aria-checked': ariaChecked,
'aria-disabled': ariaDisabled,
'aria-expanded': ariaExpanded,
'aria-multiselectable': ariaMultiselectable, // Win32
'aria-required': ariaRequired, // Win32
'aria-selected': ariaSelected,
height,
src,
Expand All @@ -185,6 +187,9 @@ const BaseImage = (props: ImagePropsType, forwardedRef) => {
checked: ariaChecked ?? props.accessibilityState?.checked,
disabled: ariaDisabled ?? props.accessibilityState?.disabled,
expanded: ariaExpanded ?? props.accessibilityState?.expanded,
multiselectable:
ariaMultiselectable ?? props.accessibilityState?.multiselectable, // Win32
required: ariaRequired ?? props.accessibilityState?.required, // Win32
selected: ariaSelected ?? props.accessibilityState?.selected,
};
const accessibilityLabel = props['aria-label'] ?? props.accessibilityLabel;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,9 @@ const Text: React.AbstractComponent<
'aria-expanded': ariaExpanded,
'aria-label': ariaLabel,
'aria-level': ariaLevel, // Win32
'aria-multiselectable': ariaMultiselectable, // Win32
'aria-posinset': ariaPosinset, // Win32
'aria-required': ariaRequired, // Win32
'aria-selected': ariaSelected,
'aria-setsize': ariaSetsize, // Win32
ellipsizeMode,
Expand Down Expand Up @@ -80,13 +82,18 @@ const Text: React.AbstractComponent<
ariaChecked != null ||
ariaDisabled != null ||
ariaExpanded != null ||
ariaMultiselectable != null ||
ariaRequired != null ||
ariaSelected != null
) {
_accessibilityState = {
busy: ariaBusy ?? accessibilityState?.busy,
checked: ariaChecked ?? accessibilityState?.checked,
disabled: ariaDisabled ?? accessibilityState?.disabled,
expanded: ariaExpanded ?? accessibilityState?.expanded,
multiselectable:
ariaMultiselectable ?? accessibilityState?.multiselectable, // Win32
required: ariaRequired ?? accessibilityState?.required, // Win32
selected: ariaSelected ?? accessibilityState?.selected,
};
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,8 @@ export type TextProps = $ReadOnly<{|
'aria-disabled'?: ?boolean,
'aria-expanded'?: ?boolean,
'aria-selected'?: ?boolean,
'aria-multiselectable'?: ?boolean, // Win32
'aria-required'?: ?boolean, // Win32
'aria-controls'?: ?Stringish, // Win32
'aria-describedby'?: ?Stringish, // Win32
'aria-description'?: ?Stringish, // Win32
Expand Down