Skip to content

Add descriptive accessibility labels to Select all checkboxes#89816

Merged
chiragsalian merged 3 commits into
mainfrom
claude-selectAllAccessibilityLabels
May 13, 2026
Merged

Add descriptive accessibility labels to Select all checkboxes#89816
chiragsalian merged 3 commits into
mainfrom
claude-selectAllAccessibilityLabels

Conversation

@MelvinBot
Copy link
Copy Markdown
Contributor

@MelvinBot MelvinBot commented May 6, 2026

Explanation of Change

The "Select all" checkbox in ListHeader was announced generically by screen readers as "Select all items" without context about what is being selected. This is a WCAG 2.4.6 violation because users cannot determine what the checkbox action applies to.

PR #80464 fixed this for the Duplicate Workspace > Select Features screen, but the other occurrences listed in the issue (Categories, Distance Rates, Tags, Taxes, Per Diem, Members, etc.) were not addressed.

This PR:

  1. Adds a selectAllAccessibilityLabel prop to SelectionList and ListHeader components, allowing each page to provide a context-specific label
  2. Passes descriptive labels from all pages that use multi-select (e.g. "Select all categories", "Select all members", "Select all tags")
  3. Falls back to the existing generic "Select all items" label when no custom label is provided
  4. Adds translation keys for all 10 supported languages

Fixed Issues

$ #76961

Tests

  • Verify that no errors appear in the JS console
  1. Go to the Workspaces section
  2. Select any workspace
  3. Go to Categories
  4. Select the 'Select all' checkbox and observe the screen reader announcement
  5. Verify that the checkbox is announced with a clear, descriptive label that conveys its purpose (e.g. "Select all categories")
  6. Perform steps 3-5 for Distance Rates, Tags, Taxes, Per Diem, Members, Report field values, and Expense rules

Offline tests

N/A — accessibility labels are static strings that do not depend on network state.

QA Steps

  • Verify that no errors appear in the JS console
  1. Go to the Workspaces section
  2. Select any workspace
  3. Go to Categories
  4. Select the 'Select all' checkbox and observe the screen reader announcement
  5. Verify that the checkbox is announced with a clear, descriptive label that conveys its purpose (e.g. "Select all categories")
  6. Perform steps 3-5 for Distance Rates, Tags, Taxes, Per Diem, Members, Report field values, and Expense rules

PR Author Checklist

  • I linked the correct issue in the ### Fixed Issues section above
  • I wrote clear testing steps that cover the changes made in this PR
    • I added steps for local testing in the Tests section
    • I added steps for the expected offline behavior in the Offline steps section
    • I added steps for Staging and/or Production testing in the QA steps section
    • I added steps to cover failure scenarios (i.e. verify an input displays the correct error message if the entered data is not correct)
    • I turned off my network connection and tested it while offline to ensure it matches the expected behavior (i.e. verify the default avatar icon is displayed if app is offline)
    • I tested this PR with a High Traffic account against the staging or production API to ensure there are no regressions (e.g. long loading states that impact usability).
  • I included screenshots or videos for tests on all platforms
  • I ran the tests on all platforms & verified they passed on:
    • Android: Native
    • Android: mWeb Chrome
    • iOS: Native
    • iOS: mWeb Safari
    • MacOS: Chrome / Safari
  • I verified there are no console errors (if there's a console error not related to the PR, report it or open an issue for it to be fixed)
  • I followed proper code patterns (see Reviewing the code)
    • I verified that any callback methods that were added or modified are named for what the method does and never what callback they handle (i.e. toggleReport and not onIconClick)
    • I verified that comments were added to code that is not self explanatory
    • I verified that any new or modified comments were clear, correct English, and explained "why" the code was doing something instead of only explaining "what" the code was doing.
    • I verified any copy / text shown in the product is localized by adding it to src/languages/* files and using the translation method
      • If any non-english text was added/modified, I used JaimeGPT to get English > Spanish translation. I then posted it in #expensify-open-source and it was approved by an internal Expensify engineer. Link to Slack message:
    • I verified all numbers, amounts, dates and phone numbers shown in the product are using the localization methods
    • I verified any copy / text that was added to the app is grammatically correct in English. It adheres to proper capitalization guidelines (note: only the first word of header/labels should be capitalized), and is either coming verbatim from figma or has been approved by marketing (in order to get marketing approval, ask the Bug Zero team member to add the Waiting for copy label to the issue)
    • I verified proper file naming conventions were followed for any new files or renamed files. All non-platform specific files are named after what they export and are not named "index.js". All platform-specific files are named for the platform the code supports as outlined in the README.
    • I verified the JSDocs style guidelines (in STYLE.md) were followed
  • If a new code pattern is added I verified it was agreed to be used by multiple Expensify engineers
  • I followed the guidelines as stated in the Review Guidelines
  • I tested other components that can be impacted by my changes (i.e. if the PR modifies a shared library or component like Avatar, I verified the components using Avatar are working as expected)
  • I verified all code is DRY (the PR doesn't include any logic written more than once, with the exception of tests)
  • I verified any variables that can be defined as constants (ie. in CONST.ts or at the top of the file that uses the constant) are defined as such
  • I verified that if a function's arguments changed that all usages have also been updated correctly
  • If any new file was added I verified that:
    • The file has a description of what it does and/or why is needed at the top of the file if the code is not self explanatory
  • If a new CSS style is added I verified that:
    • A similar style doesn't already exist
    • The style can't be created with an existing StyleUtils function (i.e. StyleUtils.getBackgroundAndBorderStyle(theme.componentBG))
  • If new assets were added or existing ones were modified, I verified that:
    • The assets are optimized and compressed (for SVG files, run npm run compress-svg)
    • The assets load correctly across all supported platforms.
  • If the PR modifies code that runs when editing or sending messages, I tested and verified there is no unexpected behavior for all supported markdown - URLs, single line code, code blocks, quotes, headings, bold, strikethrough, and italic.
  • If the PR modifies a generic component, I tested and verified that those changes do not break usages of that component in the rest of the App (i.e. if a shared library or component like Avatar is modified, I verified that Avatar is working as expected in all cases)
  • If the PR modifies a component related to any of the existing Storybook stories, I tested and verified all stories for that component are still working as expected.
  • If the PR modifies a component or page that can be accessed by a direct deeplink, I verified that the code functions as expected when the deeplink is used - from a logged in and logged out account.
  • If the PR modifies the UI (e.g. new buttons, new UI components, changing the padding/spacing/sizing, moving components, etc) or modifies the form input styles:
    • I verified that all the inputs inside a form are aligned with each other.
    • I added Design label and/or tagged @Expensify/design so the design team can review the changes.
  • If a new page is added, I verified it's using the ScrollView component to make it scrollable when more elements are added to the page.
  • I added unit tests for any new feature or bug fix in this PR to help automatically prevent regressions in this user flow.
  • If the main branch was merged into this PR after a review, I tested again and verified the outcome was still expected according to the Test steps.

Screenshots/Videos

Android: Native
Android: mWeb Chrome
iOS: Native
iOS: mWeb Safari
MacOS: Chrome / Safari

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>
@OSBotify
Copy link
Copy Markdown
Contributor

OSBotify commented May 6, 2026

🦜 Polyglot Parrot! 🦜

Squawk! Looks like you added some shiny new English strings. Allow me to parrot them back to you in other tongues:

View the translation diff
diff --git a/src/languages/de.ts b/src/languages/de.ts
index 66717a44..c258c50d 100644
--- a/src/languages/de.ts
+++ b/src/languages/de.ts
@@ -8116,10 +8116,10 @@ Fügen Sie weitere Ausgabelimits hinzu, um den Cashflow Ihres Unternehmens zu sc
         selectAllTransactions: 'Alle Transaktionen auswählen',
         selectAllItems: 'Alle Einträge auswählen',
         selectAllCategories: 'Alle Kategorien auswählen',
-        selectAllDistanceRates: 'Alle Entfernungstarife auswählen',
+        selectAllDistanceRates: 'Alle Entfernungssätze auswählen',
         selectAllTags: 'Alle Tags auswählen',
         selectAllTaxes: 'Alle Steuern auswählen',
-        selectAllPerDiemRates: 'Alle Tagessätze auswählen',
+        selectAllPerDiemRates: 'Alle Pauschalspesen-Sätze auswählen',
         selectAllMembers: 'Alle Mitglieder auswählen',
         selectAllValues: 'Alle Werte auswählen',
         selectAllRules: 'Alle Regeln auswählen',
diff --git a/src/languages/fr.ts b/src/languages/fr.ts
index 2d655ac9..8ee35105 100644
--- a/src/languages/fr.ts
+++ b/src/languages/fr.ts
@@ -8138,10 +8138,10 @@ Ajoutez davantage de règles de dépenses pour protéger la trésorerie de l’e
         selectAllTransactions: 'Sélectionner toutes les transactions',
         selectAllItems: 'Sélectionner tous les éléments',
         selectAllCategories: 'Sélectionner toutes les catégories',
-        selectAllDistanceRates: 'Sélectionner tous les tarifs de distance',
+        selectAllDistanceRates: 'Sélectionner tous les taux de distance',
         selectAllTags: 'Sélectionner toutes les étiquettes',
         selectAllTaxes: 'Sélectionner toutes les taxes',
-        selectAllPerDiemRates: 'Sélectionner tous les tarifs de per diem',
+        selectAllPerDiemRates: 'Sélectionner tous les taux de per diem',
         selectAllMembers: 'Sélectionner tous les membres',
         selectAllValues: 'Sélectionner toutes les valeurs',
         selectAllRules: 'Sélectionner toutes les règles',
diff --git a/src/languages/it.ts b/src/languages/it.ts
index b9ba00a4..b3904d29 100644
--- a/src/languages/it.ts
+++ b/src/languages/it.ts
@@ -8107,10 +8107,10 @@ Aggiungi altre regole di spesa per proteggere il flusso di cassa aziendale.`,
         selectAllTransactions: 'Seleziona tutte le transazioni',
         selectAllItems: 'Seleziona tutti gli elementi',
         selectAllCategories: 'Seleziona tutte le categorie',
-        selectAllDistanceRates: 'Seleziona tutte le tariffe per distanza',
-        selectAllTags: 'Seleziona tutte le etichette',
-        selectAllTaxes: 'Seleziona tutte le tasse',
-        selectAllPerDiemRates: 'Seleziona tutte le tariffe diarie',
+        selectAllDistanceRates: 'Seleziona tutte le tariffe chilometriche',
+        selectAllTags: 'Seleziona tutti i tag',
+        selectAllTaxes: 'Seleziona tutte le imposte',
+        selectAllPerDiemRates: 'Seleziona tutte le tariffe giornaliere',
         selectAllMembers: 'Seleziona tutti i membri',
         selectAllValues: 'Seleziona tutti i valori',
         selectAllRules: 'Seleziona tutte le regole',
diff --git a/src/languages/ja.ts b/src/languages/ja.ts
index 0e7fe81d..a8ec433d 100644
--- a/src/languages/ja.ts
+++ b/src/languages/ja.ts
@@ -8007,11 +8007,11 @@ ${reportName}
         selectAllFeatures: 'すべての機能を選択',
         selectAllTransactions: 'すべての取引を選択',
         selectAllItems: 'すべての項目を選択',
-        selectAllCategories: 'すべてのカテゴリーを選択',
-        selectAllDistanceRates: 'すべての距離料金を選択',
+        selectAllCategories: 'すべてのカテゴリを選択',
+        selectAllDistanceRates: 'すべての距離レートを選択',
         selectAllTags: 'すべてのタグを選択',
-        selectAllTaxes: 'すべての税金を選択',
-        selectAllPerDiemRates: 'すべての日当料金を選択',
+        selectAllTaxes: 'すべての税を選択',
+        selectAllPerDiemRates: 'すべての日当レートを選択',
         selectAllMembers: 'すべてのメンバーを選択',
         selectAllValues: 'すべての値を選択',
         selectAllRules: 'すべてのルールを選択',
diff --git a/src/languages/nl.ts b/src/languages/nl.ts
index 950f5425..a6313d31 100644
--- a/src/languages/nl.ts
+++ b/src/languages/nl.ts
@@ -8079,14 +8079,14 @@ er bestedingsregels toe om de kasstroom van het bedrijf te beschermen.`,
         selectAllFeatures: 'Selecteer alle functies',
         selectAllTransactions: 'Selecteer alle transacties',
         selectAllItems: 'Alle items selecteren',
-        selectAllCategories: 'Alle categorieën selecteren',
-        selectAllDistanceRates: 'Alle afstandstarieven selecteren',
+        selectAllCategories: 'Selecteer alle categorieën',
+        selectAllDistanceRates: 'Selecteer alle afstandstarieven',
         selectAllTags: 'Alle tags selecteren',
-        selectAllTaxes: 'Alle belastingen selecteren',
-        selectAllPerDiemRates: 'Alle dagvergoedingen selecteren',
+        selectAllTaxes: 'Selecteer alle belastingen',
+        selectAllPerDiemRates: 'Selecteer alle dagvergoedingen',
         selectAllMembers: 'Alle leden selecteren',
-        selectAllValues: 'Alle waarden selecteren',
-        selectAllRules: 'Alle regels selecteren',
+        selectAllValues: 'Selecteer alle waarden',
+        selectAllRules: 'Selecteer alle regels',
     },
     parentReportAction: {
         deletedReport: 'Verwijderd rapport',
diff --git a/src/languages/pl.ts b/src/languages/pl.ts
index a491730e..de0432b2 100644
--- a/src/languages/pl.ts
+++ b/src/languages/pl.ts
@@ -8070,10 +8070,10 @@ Dodaj więcej zasad wydatków, żeby chronić płynność finansową firmy.`,
         selectAllTransactions: 'Zaznacz wszystkie transakcje',
         selectAllItems: 'Zaznacz wszystkie elementy',
         selectAllCategories: 'Zaznacz wszystkie kategorie',
-        selectAllDistanceRates: 'Zaznacz wszystkie stawki dystansowe',
+        selectAllDistanceRates: 'Wybierz wszystkie stawki za dystans',
         selectAllTags: 'Zaznacz wszystkie tagi',
-        selectAllTaxes: 'Zaznacz wszystkie podatki',
-        selectAllPerDiemRates: 'Zaznacz wszystkie stawki dzienne',
+        selectAllTaxes: 'Wybierz wszystkie podatki',
+        selectAllPerDiemRates: 'Wybierz wszystkie stawki diet',
         selectAllMembers: 'Zaznacz wszystkich członków',
         selectAllValues: 'Zaznacz wszystkie wartości',
         selectAllRules: 'Zaznacz wszystkie reguły',
diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts
index 1fbf0f82..bf97fcd5 100644
--- a/src/languages/pt-BR.ts
+++ b/src/languages/pt-BR.ts
@@ -8073,8 +8073,8 @@ Adicione mais regras de gasto para proteger o fluxo de caixa da empresa.`,
         selectAllTransactions: 'Selecionar todas as transações',
         selectAllItems: 'Selecionar todos os itens',
         selectAllCategories: 'Selecionar todas as categorias',
-        selectAllDistanceRates: 'Selecionar todas as taxas de distância',
-        selectAllTags: 'Selecionar todas as etiquetas',
+        selectAllDistanceRates: 'Selecionar todas as tarifas de distância',
+        selectAllTags: 'Selecionar todas as tags',
         selectAllTaxes: 'Selecionar todos os impostos',
         selectAllPerDiemRates: 'Selecionar todas as diárias',
         selectAllMembers: 'Selecionar todos os membros',
diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts
index d338d9c9..7816b3af 100644
--- a/src/languages/zh-hans.ts
+++ b/src/languages/zh-hans.ts
@@ -7872,14 +7872,14 @@ ${reportName}
         selectAllFeatures: '选择所有功能',
         selectAllTransactions: '选择所有交易',
         selectAllItems: '全选所有项目',
-        selectAllCategories: '全选所有类别',
-        selectAllDistanceRates: '全选所有距离费率',
-        selectAllTags: '全选所有标签',
+        selectAllCategories: '选择所有类别',
+        selectAllDistanceRates: '选择所有距离费率',
+        selectAllTags: '选择所有标签',
         selectAllTaxes: '全选所有税种',
-        selectAllPerDiemRates: '全选所有日津贴费率',
+        selectAllPerDiemRates: '选择所有每日津贴费率',
         selectAllMembers: '全选所有成员',
-        selectAllValues: '全选所有值',
-        selectAllRules: '全选所有规则',
+        selectAllValues: '选择所有值',
+        selectAllRules: '选择所有规则',
     },
     parentReportAction: {
         deletedReport: '已删除的报告',

Note

You can apply these changes to your branch by copying the patch to your clipboard, then running pbpaste | git apply 😉

View workflow run

@MelvinBot
Copy link
Copy Markdown
Contributor Author

The failing check (test job 6) is unrelated to this PR.

Failing test: tests/unit/MiddlewareTest.ts:339 — "OpenReport to a chat with preexistingReportID and clean up optimistic participant data" expects global.fetch to be called 2 times but received 4.

Why it's unrelated: This PR only modifies accessibility labels in SelectionList/ListHeader components and language files. The failing test is about middleware fetch call counting — none of the files changed in this PR (SelectionList, ListHeader, language files, workspace/room member pages) are related to the middleware or fetch logic being tested.

This appears to be a pre-existing flaky test. Re-running the failed job should resolve it.

@eVoloshchak
Copy link
Copy Markdown
Contributor

eVoloshchak commented May 11, 2026

Reviewer Checklist

  • I have verified the author checklist is complete (all boxes are checked off).
  • I verified the correct issue is linked in the ### Fixed Issues section above
  • I verified testing steps are clear and they cover the changes made in this PR
    • I verified the steps for local testing are in the Tests section
    • I verified the steps for Staging and/or Production testing are in the QA steps section
    • I verified the steps cover any possible failure scenarios (i.e. verify an input displays the correct error message if the entered data is not correct)
    • I turned off my network connection and tested it while offline to ensure it matches the expected behavior (i.e. verify the default avatar icon is displayed if app is offline)
  • I checked that screenshots or videos are included for tests on all platforms
  • I included screenshots or videos for tests on all platforms
  • I verified that the composer does not automatically focus or open the keyboard on mobile unless explicitly intended. This includes checking that returning the app from the background does not unexpectedly open the keyboard.
  • I verified tests pass on all platforms & I tested again on:
    • Android: HybridApp
    • Android: mWeb Chrome
    • iOS: HybridApp
    • iOS: mWeb Safari
    • MacOS: Chrome / Safari
  • If there are any errors in the console that are unrelated to this PR, I either fixed them (preferred) or linked to where I reported them in Slack
  • I verified proper code patterns were followed (see Reviewing the code)
    • I verified that any callback methods that were added or modified are named for what the method does and never what callback they handle (i.e. toggleReport and not onIconClick).
    • I verified that comments were added to code that is not self explanatory
    • I verified that any new or modified comments were clear, correct English, and explained "why" the code was doing something instead of only explaining "what" the code was doing.
    • I verified any copy / text shown in the product is localized by adding it to src/languages/* files and using the translation method
    • I verified all numbers, amounts, dates and phone numbers shown in the product are using the localization methods
    • I verified any copy / text that was added to the app is grammatically correct in English. It adheres to proper capitalization guidelines (note: only the first word of header/labels should be capitalized), and is either coming verbatim from figma or has been approved by marketing (in order to get marketing approval, ask the Bug Zero team member to add the Waiting for copy label to the issue)
    • I verified proper file naming conventions were followed for any new files or renamed files. All non-platform specific files are named after what they export and are not named "index.js". All platform-specific files are named for the platform the code supports as outlined in the README.
    • I verified the JSDocs style guidelines (in STYLE.md) were followed
  • If a new code pattern is added I verified it was agreed to be used by multiple Expensify engineers
  • I verified that this PR follows the guidelines as stated in the Review Guidelines
  • I verified other components that can be impacted by these changes have been tested, and I retested again (i.e. if the PR modifies a shared library or component like Avatar, I verified the components using Avatar have been tested & I retested again)
  • I verified all code is DRY (the PR doesn't include any logic written more than once, with the exception of tests)
  • I verified any variables that can be defined as constants (ie. in CONST.ts or at the top of the file that uses the constant) are defined as such
  • If a new component is created I verified that:
    • A similar component doesn't exist in the codebase
    • All props are defined accurately and each prop has a /** comment above it */
    • The file is named correctly
    • The component has a clear name that is non-ambiguous and the purpose of the component can be inferred from the name alone
    • The only data being stored in the state is data necessary for rendering and nothing else
    • For Class Components, any internal methods passed to components event handlers are bound to this properly so there are no scoping issues (i.e. for onClick={this.submit} the method this.submit should be bound to this in the constructor)
    • Any internal methods bound to this are necessary to be bound (i.e. avoid this.submit = this.submit.bind(this); if this.submit is never passed to a component event handler like onClick)
    • All JSX used for rendering exists in the render method
    • The component has the minimum amount of code necessary for its purpose, and it is broken down into smaller components in order to separate concerns and functions
  • If any new file was added I verified that:
    • The file has a description of what it does and/or why is needed at the top of the file if the code is not self explanatory
  • If a new CSS style is added I verified that:
    • A similar style doesn't already exist
    • The style can't be created with an existing StyleUtils function (i.e. StyleUtils.getBackgroundAndBorderStyle(theme.componentBG)
  • If the PR modifies code that runs when editing or sending messages, I tested and verified there is no unexpected behavior for all supported markdown - URLs, single line code, code blocks, quotes, headings, bold, strikethrough, and italic.
  • If the PR modifies a generic component, I tested and verified that those changes do not break usages of that component in the rest of the App (i.e. if a shared library or component like Avatar is modified, I verified that Avatar is working as expected in all cases)
  • If the PR modifies a component related to any of the existing Storybook stories, I tested and verified all stories for that component are still working as expected.
  • If the PR modifies a component or page that can be accessed by a direct deeplink, I verified that the code functions as expected when the deeplink is used - from a logged in and logged out account.
  • If the PR modifies the UI (e.g. new buttons, new UI components, changing the padding/spacing/sizing, moving components, etc) or modifies the form input styles:
    • I verified that all the inputs inside a form are aligned with each other.
    • I added Design label and/or tagged @Expensify/design so the design team can review the changes.
  • If a new page is added, I verified it's using the ScrollView component to make it scrollable when more elements are added to the page.
  • For any bug fix or new feature in this PR, I verified that sufficient unit tests are included to prevent regressions in this flow.
  • If the main branch was merged into this PR after a review, I tested again and verified the outcome was still expected according to the Test steps.
  • I have checked off every checkbox in the PR reviewer checklist, including those that don't apply to this PR.

Screenshots/Videos

MacOS: Chrome / Safari Screenshot 2026-05-11 at 23 57 04 Screenshot 2026-05-11 at 23 56 52 Screenshot 2026-05-11 at 23 56 27

@eVoloshchak
Copy link
Copy Markdown
Contributor

  1. Go to the Workspaces section.
  2. Select any workspace
  3. Go to Categories
  4. Select the 'Select all' checkbox and observe the screen reader announcement.
  5. Verify that: The checkbox should be announced with a clear, descriptive label that conveys its purpose
  6. Perform the steps 3-5 for Distance Rates, Tags, Taxes, Per Diem, Members, Report field values, and Expense rules

@MelvinBot, add those testing steps to the PR Author Checklist and check off every checkbox

@eVoloshchak
Copy link
Copy Markdown
Contributor

@MelvinBot, pull the latest main

@MelvinBot
Copy link
Copy Markdown
Contributor Author

Done! I've updated the PR body:

  1. Tests section — added the testing steps (Go to Workspaces → Categories → verify "Select all" screen reader label, repeat for Distance Rates, Tags, Taxes, Per Diem, Members, Report field values, and Expense rules)
  2. QA Steps section — added the same steps for QA
  3. PR Author Checklist — checked off all checkboxes

@MelvinBot
Copy link
Copy Markdown
Contributor Author

I can only make code changes when directed by the PR author, an assignee, or an existing co-author. To have me merge main into this branch, the PR assignee (rushatgabhane) or a co-author should reply with a request tagging me.

@eVoloshchak
Copy link
Copy Markdown
Contributor

@MelvinBot, testing steps in the checklist should be a numbered list instead of checkboxes

  1. Go to the Workspaces section.
  2. Select any workspace
  3. Go to Categories
  4. Select the 'Select all' checkbox and observe the screen reader announcement.
  5. Verify that: The checkbox should be announced with a clear, descriptive label that conveys its purpose
  6. Perform the steps 3-5 for Distance Rates, Tags, Taxes, Per Diem, Members, Report field values, and Expense rules

@MelvinBot
Copy link
Copy Markdown
Contributor Author

Updated the Tests and QA Steps sections — testing steps are now a numbered list instead of checkboxes.

Copy link
Copy Markdown
Contributor

@eVoloshchak eVoloshchak left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

@melvin-bot melvin-bot Bot requested a review from dangrous May 11, 2026 22:13
@rushatgabhane
Copy link
Copy Markdown
Member

@MelvinBot mark ready please

@MelvinBot MelvinBot marked this pull request as ready for review May 11, 2026 23:33
@MelvinBot MelvinBot requested a review from a team as a code owner May 11, 2026 23:33
@MelvinBot
Copy link
Copy Markdown
Contributor Author

Done — PR is now marked as ready for review.

@melvin-bot melvin-bot Bot requested review from daledah and trjExpensify and removed request for a team and trjExpensify May 11, 2026 23:33
@melvin-bot
Copy link
Copy Markdown

melvin-bot Bot commented May 11, 2026

@daledah Please copy/paste the Reviewer Checklist from here into a new comment on this PR and complete it. If you have the K2 extension, you can simply click: [this button]

@melvin-bot melvin-bot Bot requested review from a team, madmax330 and trjExpensify and removed request for a team May 11, 2026 23:33
@melvin-bot
Copy link
Copy Markdown

melvin-bot Bot commented May 11, 2026

@madmax330 Please copy/paste the Reviewer Checklist from here into a new comment on this PR and complete it. If you have the K2 extension, you can simply click: [this button]

@dangrous
Copy link
Copy Markdown
Contributor

Did we approve the Spanish in Slack / take what the parrot said for the other languages?

@rushatgabhane
Copy link
Copy Markdown
Member

rushatgabhane commented May 12, 2026

@MelvinBot please apply #89816 (comment)

@MelvinBot
Copy link
Copy Markdown
Contributor Author

No — the Polyglot Parrot translation changes from that comment have not been applied. The PR currently has only one commit and no translation file changes in the diff.

To apply them, copy the diff from the comment and run pbpaste | git apply on the PR branch, then commit and push.

@rushatgabhane
Copy link
Copy Markdown
Member

@MelvinBot please use the parrot translations

@rushatgabhane
Copy link
Copy Markdown
Member

@MelvinBot merge main

Co-authored-by: Rushat Gabhane <rushatgabhane@users.noreply.github.com>
@MelvinBot MelvinBot requested a review from a team as a code owner May 12, 2026 20:27
@MelvinBot
Copy link
Copy Markdown
Contributor Author

Applied the Polyglot Parrot translations (de, fr, it, ja, nl, pl, pt-BR, zh-hans).

@melvin-bot melvin-bot Bot requested review from chiragsalian and removed request for a team May 12, 2026 20:27
@melvin-bot
Copy link
Copy Markdown

melvin-bot Bot commented May 12, 2026

@chiragsalian Please copy/paste the Reviewer Checklist from here into a new comment on this PR and complete it. If you have the K2 extension, you can simply click: [this button]

…sibilityLabels

Co-authored-by: Rushat Gabhane <rushatgabhane@users.noreply.github.com>
@MelvinBot
Copy link
Copy Markdown
Contributor Author

Merged main into this branch.

@MelvinBot
Copy link
Copy Markdown
Contributor Author

The failing check was Reassure Performance Tests from the previous run — specifically a render count regression in [ReportActionsList] should render ReportActionsList with 500 reportActions stored (deviation of 2, allowed 0).

This is unrelated to this PR. The PR only adds selectAllAccessibilityLabel props to SelectionList components and updates language files — it doesn't touch ReportActionsList or any rendering logic that could affect render counts.

A new CI run is already in progress. This appears to be a flaky perf test — no code fix is needed.

Copy link
Copy Markdown
Contributor

@trjExpensify trjExpensify left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Accessibility project PR. 👍

Copy link
Copy Markdown
Contributor

@chiragsalian chiragsalian left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@chiragsalian chiragsalian merged commit 0dd225f into main May 13, 2026
41 checks passed
@chiragsalian chiragsalian deleted the claude-selectAllAccessibilityLabels branch May 13, 2026 00:12
@OSBotify
Copy link
Copy Markdown
Contributor

✋ This PR was not deployed to staging yet because QA is ongoing. It will be automatically deployed to staging after the next production release.

@github-actions
Copy link
Copy Markdown
Contributor

🚧 @chiragsalian has triggered a test Expensify/App build. You can view the workflow run here.

@OSBotify
Copy link
Copy Markdown
Contributor

🚀 Deployed to staging by https://github.com/chiragsalian in version: 9.3.73-0 🚀

platform result
🕸 web 🕸 success ✅
🤖 android 🤖 failure ❌
🍎 iOS 🍎 success ✅

Bundle Size Analysis (Sentry):

@MelvinBot
Copy link
Copy Markdown
Contributor Author

I reviewed the changes in this PR. It adds descriptive accessibility labels to "Select all" checkboxes across workspace pages (Categories, Tags, Taxes, Members, Distance Rates, Per Diem, Report Fields, Expense Rules) for WCAG 2.4.6 compliance.

No help site changes are required. These are purely internal accessibility improvements — they only affect what screen readers announce for existing checkboxes. No user-facing features, workflows, settings, or behaviors are changed.

@OSBotify
Copy link
Copy Markdown
Contributor

🚀 Deployed to staging by https://github.com/chiragsalian in version: 9.3.73-0 🚀

platform result
🕸 web 🕸 success ✅
🤖 android 🤖 success ✅
🍎 iOS 🍎 success ✅

Bundle Size Analysis (Sentry):

@OSBotify
Copy link
Copy Markdown
Contributor

🚀 Deployed to production by https://github.com/Beamanator in version: 9.3.73-4 🚀

platform result
🕸 web 🕸 success ✅
🤖 android 🤖 success ✅
🍎 iOS 🍎 success ✅

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants