Skip to content

Commit c7ff77e

Browse files
Add descriptive accessibility labels to all Select all checkboxes
The Select all checkbox in ListHeader was announced generically as "Select all items" by screen readers. Add a selectAllAccessibilityLabel prop to SelectionList/ListHeader and pass context-specific labels (e.g. "Select all categories", "Select all members") from each page that uses multi-select, improving WCAG 2.4.6 compliance. Co-authored-by: Rushat Gabhane <rushatgabhane@users.noreply.github.com>
1 parent e72949f commit c7ff77e

25 files changed

Lines changed: 103 additions & 2 deletions

src/components/SelectionList/BaseSelectionList.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ function BaseSelectionList<TItem extends ListItem>({
8282
shouldShowRightCaret = false,
8383
shouldStopPropagation = false,
8484
shouldHeaderBeInsideList = false,
85+
selectAllAccessibilityLabel,
8586
shouldScrollToFocusedIndex = true,
8687
shouldScrollToFocusedIndexOnMount = true,
8788
shouldHighlightInitiallyFocusedItem = false,
@@ -567,6 +568,7 @@ function BaseSelectionList<TItem extends ListItem>({
567568
selectAllTextStyle={style?.listHeaderSelectAllTextStyle}
568569
shouldShowSelectAllButton={!!onSelectAll}
569570
shouldPreventDefaultFocusOnSelectRow={shouldPreventDefaultFocusOnSelectRow}
571+
selectAllAccessibilityLabel={selectAllAccessibilityLabel}
570572
/>
571573
);
572574

src/components/SelectionList/components/ListHeader.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ type ListHeaderProps<TItem extends ListItem> = {
3333

3434
/** Whether to prevent default focus when selecting rows */
3535
shouldPreventDefaultFocusOnSelectRow?: boolean;
36+
37+
/** Custom accessibility label for the select all checkbox, providing context about what is being selected */
38+
selectAllAccessibilityLabel?: string;
3639
};
3740

3841
function ListHeader<TItem extends ListItem>({
@@ -44,6 +47,7 @@ function ListHeader<TItem extends ListItem>({
4447
selectAllTextStyle,
4548
shouldShowSelectAllButton,
4649
shouldPreventDefaultFocusOnSelectRow,
50+
selectAllAccessibilityLabel,
4751
}: ListHeaderProps<TItem>) {
4852
const styles = useThemeStyles();
4953
const {translate} = useLocalize();
@@ -69,7 +73,7 @@ function ListHeader<TItem extends ListItem>({
6973
<View style={[styles.flexRow, styles.alignItemsCenter]}>
7074
<Checkbox
7175
testID="selection-list-select-all-checkbox"
72-
accessibilityLabel={translate('accessibilityHints.selectAllItems')}
76+
accessibilityLabel={selectAllAccessibilityLabel ?? translate('accessibilityHints.selectAllItems')}
7377
isChecked={dataDetails.allSelected}
7478
isIndeterminate={dataDetails.someSelected}
7579
onPress={onSelectAll}
@@ -80,7 +84,7 @@ function ListHeader<TItem extends ListItem>({
8084
<PressableWithFeedback
8185
style={[styles.userSelectNone, styles.flexRow, styles.alignItemsCenter]}
8286
onPress={onSelectAll}
83-
accessibilityLabel={translate('accessibilityHints.selectAllItems')}
87+
accessibilityLabel={selectAllAccessibilityLabel ?? translate('accessibilityHints.selectAllItems')}
8488
sentryLabel={CONST.SENTRY_LABEL.SELECTION_LIST.LIST_HEADER_SELECT_ALL}
8589
accessibilityRole="button"
8690
accessibilityState={{checked: dataDetails.allSelected, disabled: allDisabled}}

src/components/SelectionList/types.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,9 @@ type SelectionListProps<TItem extends ListItem> = Partial<ChildrenProps> &
185185

186186
/** Whether to place customListHeader in the list so it scrolls with data */
187187
shouldHeaderBeInsideList?: boolean;
188+
189+
/** Custom accessibility label for the select all checkbox, providing context about what is being selected */
190+
selectAllAccessibilityLabel?: string;
188191
};
189192

190193
type SelectionListStyle = {

src/languages/de.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8115,6 +8115,14 @@ Fügen Sie weitere Ausgabelimits hinzu, um den Cashflow Ihres Unternehmens zu sc
81158115
selectAllFeatures: 'Alle Funktionen auswählen',
81168116
selectAllTransactions: 'Alle Transaktionen auswählen',
81178117
selectAllItems: 'Alle Einträge auswählen',
8118+
selectAllCategories: 'Alle Kategorien auswählen',
8119+
selectAllDistanceRates: 'Alle Entfernungstarife auswählen',
8120+
selectAllTags: 'Alle Tags auswählen',
8121+
selectAllTaxes: 'Alle Steuern auswählen',
8122+
selectAllPerDiemRates: 'Alle Tagessätze auswählen',
8123+
selectAllMembers: 'Alle Mitglieder auswählen',
8124+
selectAllValues: 'Alle Werte auswählen',
8125+
selectAllRules: 'Alle Regeln auswählen',
81188126
},
81198127
parentReportAction: {
81208128
deletedReport: 'Gelöschter Bericht',

src/languages/en.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8109,6 +8109,14 @@ const translations = {
81098109
selectAllFeatures: 'Select all features',
81108110
selectAllTransactions: 'Select all transactions',
81118111
selectAllItems: 'Select all items',
8112+
selectAllCategories: 'Select all categories',
8113+
selectAllDistanceRates: 'Select all distance rates',
8114+
selectAllTags: 'Select all tags',
8115+
selectAllTaxes: 'Select all taxes',
8116+
selectAllPerDiemRates: 'Select all per diem rates',
8117+
selectAllMembers: 'Select all members',
8118+
selectAllValues: 'Select all values',
8119+
selectAllRules: 'Select all rules',
81128120
},
81138121
parentReportAction: {
81148122
deletedReport: 'Deleted report',

src/languages/es.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8425,6 +8425,14 @@ ${amount} para ${merchant} - ${date}`,
84258425
selectAllFeatures: 'Seleccionar todas las características',
84268426
selectAllItems: 'Seleccionar todos los elementos',
84278427
selectAllTransactions: 'Seleccionar todas las transacciones',
8428+
selectAllCategories: 'Seleccionar todas las categorías',
8429+
selectAllDistanceRates: 'Seleccionar todas las tarifas de distancia',
8430+
selectAllTags: 'Seleccionar todas las etiquetas',
8431+
selectAllTaxes: 'Seleccionar todos los impuestos',
8432+
selectAllPerDiemRates: 'Seleccionar todas las tarifas de viáticos',
8433+
selectAllMembers: 'Seleccionar todos los miembros',
8434+
selectAllValues: 'Seleccionar todos los valores',
8435+
selectAllRules: 'Seleccionar todas las reglas',
84288436
},
84298437
parentReportAction: {
84308438
deletedReport: 'Informe eliminado',

src/languages/fr.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8137,6 +8137,14 @@ Ajoutez davantage de règles de dépenses pour protéger la trésorerie de l’e
81378137
selectAllFeatures: 'Sélectionner toutes les fonctionnalités',
81388138
selectAllTransactions: 'Sélectionner toutes les transactions',
81398139
selectAllItems: 'Sélectionner tous les éléments',
8140+
selectAllCategories: 'Sélectionner toutes les catégories',
8141+
selectAllDistanceRates: 'Sélectionner tous les tarifs de distance',
8142+
selectAllTags: 'Sélectionner toutes les étiquettes',
8143+
selectAllTaxes: 'Sélectionner toutes les taxes',
8144+
selectAllPerDiemRates: 'Sélectionner tous les tarifs de per diem',
8145+
selectAllMembers: 'Sélectionner tous les membres',
8146+
selectAllValues: 'Sélectionner toutes les valeurs',
8147+
selectAllRules: 'Sélectionner toutes les règles',
81408148
},
81418149
parentReportAction: {
81428150
deletedReport: 'Note de frais supprimée',

src/languages/it.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8106,6 +8106,14 @@ Aggiungi altre regole di spesa per proteggere il flusso di cassa aziendale.`,
81068106
selectAllFeatures: 'Seleziona tutte le funzionalità',
81078107
selectAllTransactions: 'Seleziona tutte le transazioni',
81088108
selectAllItems: 'Seleziona tutti gli elementi',
8109+
selectAllCategories: 'Seleziona tutte le categorie',
8110+
selectAllDistanceRates: 'Seleziona tutte le tariffe per distanza',
8111+
selectAllTags: 'Seleziona tutte le etichette',
8112+
selectAllTaxes: 'Seleziona tutte le tasse',
8113+
selectAllPerDiemRates: 'Seleziona tutte le tariffe diarie',
8114+
selectAllMembers: 'Seleziona tutti i membri',
8115+
selectAllValues: 'Seleziona tutti i valori',
8116+
selectAllRules: 'Seleziona tutte le regole',
81098117
},
81108118
parentReportAction: {
81118119
deletedReport: 'Report eliminato',

src/languages/ja.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8007,6 +8007,14 @@ ${reportName}
80078007
selectAllFeatures: 'すべての機能を選択',
80088008
selectAllTransactions: 'すべての取引を選択',
80098009
selectAllItems: 'すべての項目を選択',
8010+
selectAllCategories: 'すべてのカテゴリーを選択',
8011+
selectAllDistanceRates: 'すべての距離料金を選択',
8012+
selectAllTags: 'すべてのタグを選択',
8013+
selectAllTaxes: 'すべての税金を選択',
8014+
selectAllPerDiemRates: 'すべての日当料金を選択',
8015+
selectAllMembers: 'すべてのメンバーを選択',
8016+
selectAllValues: 'すべての値を選択',
8017+
selectAllRules: 'すべてのルールを選択',
80108018
},
80118019
parentReportAction: {
80128020
deletedReport: '削除されたレポート',

src/languages/nl.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8079,6 +8079,14 @@ er bestedingsregels toe om de kasstroom van het bedrijf te beschermen.`,
80798079
selectAllFeatures: 'Selecteer alle functies',
80808080
selectAllTransactions: 'Selecteer alle transacties',
80818081
selectAllItems: 'Alle items selecteren',
8082+
selectAllCategories: 'Alle categorieën selecteren',
8083+
selectAllDistanceRates: 'Alle afstandstarieven selecteren',
8084+
selectAllTags: 'Alle tags selecteren',
8085+
selectAllTaxes: 'Alle belastingen selecteren',
8086+
selectAllPerDiemRates: 'Alle dagvergoedingen selecteren',
8087+
selectAllMembers: 'Alle leden selecteren',
8088+
selectAllValues: 'Alle waarden selecteren',
8089+
selectAllRules: 'Alle regels selecteren',
80828090
},
80838091
parentReportAction: {
80848092
deletedReport: 'Verwijderd rapport',

0 commit comments

Comments
 (0)