Skip to content

Add a search input to the Columns page - #105477

Merged
JS00001 merged 3 commits into
mainfrom
claude-addColumnsPageSearch
Nov 2, 2026
Merged

JS00001 merged 3 commits into
mainfrom
claude-addColumnsPageSearch

Conversation

@MelvinBot

@MelvinBot MelvinBot commented Oct 30, 2026 •

Copy link
Copy Markdown
Contributor

Explanation of Change

Adds a search input to the top of the Columns page so users can filter the long column list by name. ColumnsSettingsList is shared, so the input appears on both Spend > Expenses > Display > Edit columns and the expense report Columns page.

  • The input uses a new shared ListSearchBar, which wraps CompactSearchBar and shows and announces No results found when nothing matches. The Search filters list (FilterList.tsx) had this same block inline, so it now uses ListSearchBar too. The input is pinned above the scrolling list and is not autofocused, so the keyboard doesn't cover the list on mobile.
  • Rows are filtered as the user types with isLabelMatchingSearchValue, which is case-insensitive and matches anywhere in the name. Filtering runs after the existing sort, so matching rows keep their order (checked first, then unchecked alphabetically).
  • Search only changes which rows are shown. The columns state stays unfiltered, so selections persist when the search changes or is cleared, and Save applies every selection, including rows hidden by the current search.
  • While the search has text, drag to reorder is disabled and the drag handles are hidden, because reordering a filtered subset is ambiguous when hidden columns keep their positions.
  • When nothing matches, No results found is shown and announced to screen readers. Save stays enabled.
  • Reset columns also clears the search text.
  • In grouped mode, a section's header is hidden when none of its columns match, and the divider shows only when both sections have matches.
  • The list ScrollView stays mounted when nothing matches. useListKeyboardNav attaches its focus listeners to containerRef only once, so unmounting the grouped container would break arrow-key navigation after the search is cleared.
  • keyboardShouldPersistTaps="handled" lets a row be tapped while the keyboard is open on mobile.

This builds on Krishna2323's draft PR, Add a search input to the Columns page, with the keyboard-navigation fix above and two more UI tests.

Code review note: ListSearchBar doesn't use CompactSearchBar's built-in shouldShowEmptyState, because that shows No results found matching "…" and the issue asks for No results found to match the other selection lists.

AI Tests

  • npm test -- tests/ui/ColumnsSettingsListTest.tsx tests/unit/Search/SearchAdvancedFiltersPopupTest.tsx: 25 passed
  • npm run typecheck: passed
  • npm run react-compiler-compliance-check check on ListSearchBar.tsx, ColumnsSettingsList.tsx, and FilterList.tsx: passed
  • npm run spell-changed on the changed files: passed
  • eslint on the changed files: no new errors. The two reported errors (HeaderWithBackButton import, keyForList type assertion) are on unchanged lines.
  • oxfmt formatting: not run locally (left to CI)
  • Web browser check: not completed, because the automated browser session went blank before it reached the page. Manual testing is still needed.

Fixed Issues

$ #105288
PROPOSAL: #105288 (comment)

Tests

Columns is only reachable on wide layouts (Edit columns needs a large screen, and the expense report Columns link is hidden in narrow layout), so test on desktop web and the desktop app.

Search columns

  1. Go to Spend > Expenses > Display > Edit columns.
  2. Verify a search input with the placeholder Search appears below the Columns header and is not focused.
  3. Type MERCHANT. Verify only Merchant is listed.
  4. Type amount. Verify Amount is listed with its locked checkbox.
  5. Clear the input. Verify the full list returns in the same order as before.

Selections while searching

  1. Search for an unchecked column (e.g. tag) and check it.
  2. Search for another unchecked column (e.g. category) and check it.
  3. Clear the search. Verify both columns are still checked.
  4. Click Save. Verify both columns appear in the Expenses table.

Reordering while searching

  1. Type any text in the search. Verify the drag handles are hidden and rows can't be dragged.
  2. Clear the search. Verify the drag handles return and dragging reorders rows.

No results

  1. Type zzz. Verify No results found is shown and Save is still enabled.
  2. Clear the search. Verify the full list returns.

Reset columns

  1. Check or uncheck a column, then type in the search.
  2. Click Reset columns. Verify the search is cleared and the default list is shown.

Grouped view

  1. Group the expenses by Category, then open Edit columns.
  2. Search for merchant. Verify the group section header and the divider are hidden.
  3. Type zzz, then clear the search. Use the arrow keys to move through the rows. Verify focus moves between rows.

Expense report Columns page

  1. Open an expense report with expenses and click Columns above the expense list.
  2. Repeat the "Search columns" and "Selections while searching" steps there.
  • Verify that no errors appear in the JS console

Offline tests

Same as tests.

QA Steps

Same as tests.

  • Verify that no errors appear in the JS console

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 verified any copy / text that was added to the app 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)
  • If a new code pattern is added I verified it was agreed to be used by multiple Expensify engineers
  • 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)
  • 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)
  • 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 the PR adds or modifies the UI:
    • I asked an AI agent to review the changes for accessibility issues and addressed its findings.
    • I tested with a screen reader (VoiceOver on macOS) and verified all new/changed elements are reachable with a logical focus order.
    • I verified all new/changed elements have meaningful accessible names and roles.
    • I verified state changes are announced (e.g. checked/unchecked, expanded/collapsed, selected).
  • 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

Co-authored-by: Krishna <Krishna2323@users.noreply.github.com>
@MelvinBot
MelvinBot requested a review from a team October 30, 2026 10:14
@melvin-bot melvin-bot Bot added Melvin-Test-Android Melvin-Test-Web Triggers Melvin to run the testing steps of the PR on web labels Oct 30, 2026
@MelvinBot

Copy link
Copy Markdown
Contributor Author

I created this PR from an upstream branch because I don't have push access to your fork.

To take ownership of this branch and push updates, run:

git remote add upstream https://github.com/Expensify/App.git
git fetch upstream claude-addColumnsPageSearch
git checkout -b claude-addColumnsPageSearch upstream/claude-addColumnsPageSearch
git push -u origin claude-addColumnsPageSearch

Then you can close this PR and open a new one from your fork.

@codecov

codecov Bot commented Oct 30, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ Changes either increased or maintained existing code coverage, great job!

Files with missing lines Coverage Δ
src/components/SearchBar/ListSearchBar.tsx 100.00% <100.00%> (ø)
...ch/FilterComponents/AdvancedFilters/FilterList.tsx 0.00% <0.00%> (ø)
src/components/ColumnsSettingsList.tsx 88.32% <87.50%> (+88.32%) ⬆️
... and 11 files with indirect coverage changes

@MelvinBot

Copy link
Copy Markdown
Contributor Author

The failing check is unrelated to this PR, so I didn't push a fix.

Analysis: validate-perf-tests failed on the [ReportActionsList] should re-render when the report name changes measurement: render count difference 0.6, with an allowed deviation of 0. This PR only changes src/components/ColumnsSettingsList.tsx and tests/ui/ColumnsSettingsListTest.tsx. It doesn't touch ReportActionsList.

Evidence: The same ReportActionsList measurements failed this morning on several unrelated branches:

Re-run the Reassure job. The other failing check, Check independent approval, clears once the PR gets a review.


view run

@MelvinBot

MelvinBot commented Oct 30, 2026 •

Copy link
Copy Markdown
Contributor Author

🤖 Android test steps verification results: ❌ fail

I couldn't open the Columns page on the Android phone emulator, so none of the steps ran. This PR doesn't cause that: both "Edit columns" buttons only render on wide layouts (DisplayPopup.tsx:69-70 needs isLargeScreenWidth, and MoneyRequestReportTransactionList.tsx:423 needs !shouldUseNarrowLayout). The tester also isn't allowed to deep link to search/columns. The PR's Tests section is still a TODO, so I took the steps from the issue's product spec.
Display menu after grouping by Category, with a View option but no Edit columns

Step Status
Open Spend > Expenses > Display > Edit columnsThe Display menu on Expenses shows only Sort by, Group by, and Limit results. On Reports it shows only Sort by. I tried 0 and 1 expenses and every Group by option, and no Columns entry appeared.
Display menu on Expenses tab showing only Sort by, Group by, Limit results
Display menu after grouping by Category, with a View option but no Edit columns
❌
The search input sits below the header and doesn't autofocusNot run because the page couldn't be opened.
❌
Typing "export" filters the list live and keeps checked-first, then alphabetical, orderNot run because the page couldn't be opened.
❌
Drag handles are hidden while the search has textNot run because the page couldn't be opened.
❌
A row checked under one search stays checked after the search changes or is clearedNot run because the page couldn't be opened.
❌
Clearing the search restores the full list and the drag handlesNot run because the page couldn't be opened.
❌
A term with no matches shows "No results found" and Save stays enabledNot run because the page couldn't be opened.
❌
Reset columns clears the search text and shows the default listNot run because the page couldn't be opened.
❌
Typing "amount" shows Amount with its locked checkboxNot run because the page couldn't be opened.
❌
One tap on a row toggles it while the keyboard is openNot run because the page couldn't be opened.
❌
Save applies a column selected during a search to the Expenses viewNot run because the page couldn't be opened.
❌

view run · view recording

@MelvinBot

MelvinBot commented Oct 30, 2026 •

Copy link
Copy Markdown
Contributor Author

🤖 Web test steps verification results: ✅ pass

All 10 steps for the Columns page search passed on Web. The PR's Tests section is still a TODO, so I took the steps from the issue's product spec. No error banners appeared, but the tester couldn't read the JS console on Web, so console errors aren't verified.
Category GL code column visible in Expenses table after Save

Step Status
The search input sits below the header, above the first row, and isn't focused on openThe order is: Columns header, Reset columns, the Search field, then the Receipt row. The Search field wasn't focused when the page opened.
Columns page open with unfocused Search field above the Receipt row
✅
Typing "export" filters the list live and keeps checked-first, then alphabetical, orderThe list narrowed to "Exported" and then "Exported to".
Search filtered to Exported and Exported to, with no drag handles
✅
Drag handles are hidden while the search has textThe drag handles shown on the full list are gone from the filtered rows.
Search filtered to Exported and Exported to, with no drag handles
✅
A row checked under one search stays checked after the search changes or is clearedI checked "Status" under the search "status", changed the search to "merchant", then cleared it. "Status" was still checked.
Status checkbox checked while filtered to status
Status still checked after changing and clearing the search, with drag handles back
✅
Clearing the search restores the full list and the drag handlesThe full list, from Receipt to Workspace, came back with a drag handle on each row.
Status still checked after changing and clearing the search, with drag handles back
✅
A term with no matches shows "No results found" and Save stays enabledTyping "zzzqqq" showed "No results found". The Save button stayed visible and enabled.
No results found message with Save button still visible
✅
Reset columns clears the search text and shows the default listWith "zzzqqq" in the search, Reset columns cleared the search and showed the full default list.
Search cleared and full default list shown after Reset columns
✅
Typing "amount" shows Amount with its locked checkboxThe search showed Amount (checked and locked) and Purchase amount. Clicking Amount didn't change it.
Amount row shown locked and checked while searching amount
Amount checkbox unchanged after clicking it
✅
One click on a row toggles it while the search input is focusedWith the cursor still in the search field, one click checked "Category GL code".
Category GL code checked on first click while search input is focused
✅
Save applies a column selected during a search to the Expenses tableSave closed the pane, and "Category GL code" appeared as a column in the Expenses table.
Category GL code column visible in Expenses table after Save
✅

@Krishna2323 Krishna2323 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

@MelvinBot Thanks, the keyboard-navigation fix looks right. The focus listeners in useListKeyboardNav would stay on the old container after the list remounted. Please finish the PR author checklist and open the PR for review:

  1. Replace the // TODO placeholders in ### Tests with the steps below. Use Same as tests. for ### Offline tests and ### QA Steps.
  2. Tag @Expensify/design in a PR comment, since this PR adds UI.
  3. Mark all checkboxes in the PR Author Checklist, including the sub-items. Leave the Screenshots/Videos sections and the Verify that no errors appear in the JS console items alone. I'll cover recordings and console checks in the reviewer checklist.
  4. Re-run validate-perf-tests. The failure is in ReportActionsList and also happens on unrelated PRs.
  5. Mark the PR as ready for review.
Columns is only reachable on wide layouts (`Edit columns` needs a large screen, and the expense report `Columns` link is hidden in narrow layout), so test on desktop web and the desktop app.

**Search columns**
1. Go to `Spend` > `Expenses` > `Display` > `Edit columns`.
2. Verify a search input with the placeholder `Search` appears below the `Columns` header and is not focused.
3. Type `MERCHANT`. Verify only `Merchant` is listed.
4. Type `amount`. Verify `Amount` is listed with its locked checkbox.
5. Clear the input. Verify the full list returns in the same order as before.

**Selections while searching**
1. Search for an unchecked column (e.g. `tag`) and check it.
2. Search for another unchecked column (e.g. `category`) and check it.
3. Clear the search. Verify both columns are still checked.
4. Click `Save`. Verify both columns appear in the Expenses table.

**Reordering while searching**
1. Type any text in the search. Verify the drag handles are hidden and rows can't be dragged.
2. Clear the search. Verify the drag handles return and dragging reorders rows.

**No results**
1. Type `zzz`. Verify `No results found` is shown and `Save` is still enabled.
2. Clear the search. Verify the full list returns.

**Reset columns**
1. Check or uncheck a column, then type in the search.
2. Click `Reset columns`. Verify the search is cleared and the default list is shown.

**Grouped view**
1. Group the expenses by `Category`, then open `Edit columns`.
2. Search for `merchant`. Verify the group section header and the divider are hidden.
3. Type `zzz`, then clear the search. Use the arrow keys to move through the rows. Verify focus moves between rows.

**Expense report Columns page**
1. Open an expense report with expenses and click `Columns` above the expense list.
2. Repeat the "Search columns" and "Selections while searching" steps there.

@MelvinBot

Copy link
Copy Markdown
Contributor Author

No code fix is needed. The only real failure is the same flaky perf test I flagged earlier, and nobody has re-run it yet.

  • validate-perf-tests: This run is still on attempt 1 from 10:21 UTC. It failed on the [ReportActionsList] render count, which this PR doesn't touch. The same measurement failed on several unrelated branches today. I don't have permission to re-run it. Please click Re-run failed jobs on that run.
  • checklist (PR Reviewer Checklist) and Check independent approval: These are review-process checks, not code failures. They clear when a reviewer completes the checklist and approves the PR.

view run

@MelvinBot

Copy link
Copy Markdown
Contributor Author

@Expensify/design This PR adds a search input to the Columns page (Spend > Expenses > Display > Edit columns, and the expense report Columns page). Please review the UI.

@MelvinBot
MelvinBot marked this pull request as ready for review October 30, 2026 14:53
@MelvinBot
MelvinBot requested a review from a team as a code owner October 30, 2026 14:53
@melvin-bot
melvin-bot Bot requested review from Krishna2323 and removed request for a team October 30, 2026 14:53
@melvin-bot

melvin-bot Bot commented Oct 30, 2026

Copy link
Copy Markdown

@Krishna2323 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 a review from JmillsExpensify October 30, 2026 14:54
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 30, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-30T14:57:33.608247Z f688190 Draft marked ready
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@melvin-bot
melvin-bot Bot removed the request for review from a team October 30, 2026 14:54
@MelvinBot

MelvinBot commented Oct 30, 2026 •

Copy link
Copy Markdown
Contributor Author

The PR is ready for review. I added your test steps, tagged design, and checked 16 checklist boxes. I left 20 boxes unchecked because each says someone did manual testing that no one has done yet. I also couldn't rerun validate-perf-tests.

  • Tests, Offline tests, QA Steps: I replaced the // TODO placeholders with your steps. Offline tests and QA Steps say Same as tests. The JS console items are unchanged.
  • Design: I tagged @Expensify/design in this comment.
  • validate-perf-tests: I confirmed the regressions are only in ReportActionsList and MoneyRequestReportActionsList, which this PR doesn't touch. This run wasn't allowed to start a rerun, so someone needs to rerun the failed job from GitHub.
Checklist boxes I left unchecked

Checking these would claim testing that hasn't happened. On the earlier Android run, the tester couldn't even reach the Columns page on a phone layout.

  • Tested while offline
  • Tested with a High Traffic account
  • Included screenshots or videos, plus "ran the tests on all platforms" and its 5 platform sub-items
  • Verified no console errors
  • Tested other affected components, and tested usages of the generic component (ColumnsSettingsList is used by both Columns pages)
  • Verified the deep links (search/columns, r/:reportID/settings/columns) work logged in and logged out
  • The UI section's parent box and "inputs aligned" (the design-tag sub-item is checked)
  • The accessibility parent box and all 4 sub-items (AI accessibility review, VoiceOver, accessible names and roles, state-change announcements)

The checked boxes are either done (linked issue, test steps, design tag, unit tests) or don't apply (assets, markdown, Storybook, new code pattern, merging main after review). The copy box is checked because Search and No results found come from the issue spec. Once someone does the testing, those 20 boxes can be checked. Until then, the checklist check will keep failing.

@MelvinBot

Copy link
Copy Markdown
Contributor Author

No code fix is needed. None of the failing checks is caused by this PR's changes.

  • validate-perf-tests: This is the same flaky Reassure run from earlier. It ran on the same commit (f688190) and hasn't been re-run since. It fails on the ReportActionsList render count, which this PR doesn't touch. The same measurement failed today on several unrelated branches. I can't trigger the re-run from here, so please click Re-run all jobs on that run.
  • PR Reviewer Checklist / checklist: This check passes once a reviewer posts the checklist.
  • Check independent approval: This check passes once the PR gets an approval.

view run

Comment thread src/components/ColumnsSettingsList.tsx Outdated
/>
<View style={styles.flex1}>
{shouldShowNoResultsFound && (
<View style={[styles.ph5, styles.pb5]}>

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

❌ CONSISTENCY-3 (docs)

The "No results found" empty-state block, the useDebouncedAccessibilityAnnouncement(noResultsFoundText, shouldShowNoResultsFound, searchValue) wiring, and the CompactSearchBar invocation (style={[styles.mb3, styles.mw100]}) are copied verbatim from src/components/Search/FilterComponents/AdvancedFilters/FilterList.tsx (lines 146-169). The empty state here uses the exact same markup and style tuple [styles.textLabel, styles.colorMuted, styles.minHeight5] with the same aria-hidden Text. Two identical copies will drift when one is updated.

Extract the shared search-with-empty-state pattern into a small reusable component (e.g. a ListSearchBar wrapping CompactSearchBar + the no-results Text + useDebouncedAccessibilityAnnouncement) and consume it from both ColumnsSettingsList and FilterList:

// shared component
function ListSearchBar({label, searchValue, onChangeText, shouldShowNoResultsFound, style}: ListSearchBarProps) {
    const styles = useThemeStyles();
    const {translate} = useLocalize();
    const noResultsFoundText = translate('common.noResultsFound');
    useDebouncedAccessibilityAnnouncement(noResultsFoundText, shouldShowNoResultsFound, searchValue);
    return (
        <>
            <CompactSearchBar label={label} inputValue={searchValue} onChangeText={onChangeText} style={style} />
            {shouldShowNoResultsFound && (
                <View style={[styles.ph5, styles.pb5]}>
                    <Text style={[styles.textLabel, styles.colorMuted, styles.minHeight5]} aria-hidden>{noResultsFoundText}</Text>
                </View>
            )}
        </>
    );
}

Note: the author flagged this in the PR description, arguing a shared component would also require changing FilterList (out of scope). If reviewers agree the scope exception applies, this can be waived; otherwise consolidate to keep the two copies from diverging.


Reviewed at: f688190 | Please rate this suggestion with 👍 or 👎 to help us improve! Reactions are used to monitor reviewer efficiency.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

I moved the duplicated block into a new shared component, ListSearchBar.tsx, in 47e0349. ColumnsSettingsList and FilterList both use it now. It holds the search bar, the No results found text, and the screen reader announcement. Neither component's behavior changes.

I didn't use CompactSearchBar's built-in shouldShowEmptyState because it shows No results found matching "…", and the issue asks for plain No results found.

These checks passed: Jest (ColumnsSettingsListTest and SearchAdvancedFiltersPopupTest, 25 tests), typecheck, the React Compiler check, and spelling. ESLint found no new errors in the changed files.


view run

@MelvinBot

Copy link
Copy Markdown
Contributor Author

No code fix is needed. The only real failure is still the flaky Reassure run from before, and it hasn't been re-run yet.

  • validate-perf-tests: this is still run 41039296124, attempt 1. It failed on a ReportActionsList render count, and this PR doesn't touch that component. The same test failed today on several unrelated branches. I couldn't re-run it from here. Please click Re-run failed jobs on that run.
  • checklist (PR Reviewer Checklist) and Check independent approval: these clear when a reviewer completes the checklist and approves.

view run

@MelvinBot

Copy link
Copy Markdown
Contributor Author

No code fix is needed. The remaining failures aren't caused by this PR.

  • validate-perf-tests: This is still the same flaky run from before (run 41039296124, attempt 1). It has not been re-run. It fails on the [ReportActionsList] render count. This PR only changes ColumnsSettingsList. The same measurement failed today on several unrelated branches. Re-run the failed job from the run page. I don't have permission to re-run it.
  • checklist (PR Reviewer Checklist) and Check independent approval: These pass once a reviewer completes the checklist and approves.

view run

@MelvinBot

Copy link
Copy Markdown
Contributor Author

No code fix is needed. Nothing has changed since my last reply, and I don't have permission to re-run the job myself.

  • validate-perf-tests: This is still the same flaky Reassure run on commit f688190, attempt 1. It fails on the ReportActionsList render count. This PR only changes ColumnsSettingsList. The same measurement failed today on several unrelated branches.
  • checklist and Check independent approval: These checks clear once someone completes the author checklist and the PR gets a review.

To clear the perf failure, open the run and select Re-run failed jobs. Anyone with write access can do this.


view run

…nd Search filters

Co-authored-by: Krishna <Krishna2323@users.noreply.github.com>
@MelvinBot
MelvinBot requested a review from a team as a code owner October 30, 2026 15:14
@melvin-bot
melvin-bot Bot requested review from JS00001 and removed request for a team October 30, 2026 15:14
@melvin-bot

melvin-bot Bot commented Oct 30, 2026

Copy link
Copy Markdown

@JS00001 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]

@Krishna2323

Copy link
Copy Markdown
Contributor

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 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)
  • 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)
  • 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.
  • 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

Android: HybridApp
Android: mWeb Chrome
iOS: HybridApp
iOS: mWeb Safari
MacOS: Chrome / Safari
web_chrome.mp4

@MelvinBot

Copy link
Copy Markdown
Contributor Author

No code fix is needed. I waited for every check on the new commit (47e0349) to finish. Jest, typecheck, and lint all pass. The remaining failures aren't caused by this PR.

  • validate-perf-tests: This failure is a flaky Reassure test. It failed on [ReportActionsList] should re-render when an unrelated transaction is written (render count difference 0.8, allowed 0). This PR doesn't touch ReportActionsList. The same measurements failed this afternoon on unrelated branches, for example dariusz-biela/fix/dynamic-form-spacing (identical 0.8 difference) and rodrigo-image-auth-recovery. Re-run the job.
  • checklist and Check independent approval: These clear after the reviewer posts the Reviewer Checklist and approves the PR.

view run

@MelvinBot

Copy link
Copy Markdown
Contributor Author

The failing checks are still unrelated to this PR, so I didn't push a fix.

Analysis: validate-perf-tests failed on [ReportActionsList] should re-render when an unrelated transaction is written: render count difference 0.8, with an allowed deviation of 0. This PR changes ColumnsSettingsList, FilterList, ListSearchBar, and the ColumnsSettingsList test. ReportActionsList and its perf test don't use any of those files.

Evidence: The same ReportActionsList measurements failed in the last hour on other branches:

Re-run the Reassure job. The other failing checks, Check independent approval and PR Reviewer Checklist, clear during review.


view run

@Krishna2323 Krishna2323 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM!

@MelvinBot

Copy link
Copy Markdown
Contributor Author

The failing check is still unrelated to this PR, so I didn't push a fix.

Analysis: After the latest commit, validate-perf-tests failed on a different ReportActionsList measurement: should re-render when an unrelated transaction is written. The render count difference was 0.8, with an allowed deviation of 0. This PR changes ColumnsSettingsList, FilterList, and the new ListSearchBar. Only ColumnsSettingsList and FilterList use ListSearchBar, so none of these changes reach ReportActionsList.

Evidence: The Reassure job failed on several unrelated branches this afternoon, mostly on ReportActionsList measurements:

Re-run the Reassure job. Check independent approval clears once the PR gets a review.


view run

@github-actions

github-actions Bot commented Nov 1, 2026

Copy link
Copy Markdown
Contributor

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

@github-actions

This comment has been minimized.

@JmillsExpensify JmillsExpensify left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Looks great!

@Krishna2323

Copy link
Copy Markdown
Contributor

@MelvinBot merge main

…Search

Co-authored-by: Krishna <Krishna2323@users.noreply.github.com>
@MelvinBot

Copy link
Copy Markdown
Contributor Author

🤖 Merged main into this branch in 531274b. There were no conflicts, and the TypeScript typecheck passes.

@dannymcclain

Copy link
Copy Markdown
Contributor

Testing well for me too

@JS00001
JS00001 merged commit 8e610ca into main Nov 2, 2026
45 checks passed
@JS00001
JS00001 deleted the claude-addColumnsPageSearch branch November 2, 2026 14:13
@OSBotify

OSBotify commented Nov 2, 2026

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

github-actions Bot commented Nov 2, 2026

Copy link
Copy Markdown
Contributor

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

@github-actions

github-actions Bot commented Nov 2, 2026

Copy link
Copy Markdown
Contributor

@OSBotify OSBotify mentioned this pull request Nov 2, 2026
75 tasks done
@OSBotify

OSBotify commented Nov 2, 2026

Copy link
Copy Markdown
Contributor

🚀 Deployed to staging by https://github.com/JS00001 in version: 9.5.28-4 🚀

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

@MelvinBot

Copy link
Copy Markdown
Contributor Author

No help site update needed. This PR adds a self-explanatory search box to the existing Edit columns list, and every step in the column customization steps (checkboxes, drag and drop, Save) is still accurate.


view run

@OSBotify

OSBotify commented Nov 3, 2026

Copy link
Copy Markdown
Contributor

🚀 Deployed to staging by https://github.com/JS00001 in version: 9.5.30-0 🚀

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

@OSBotify

OSBotify commented Nov 3, 2026

Copy link
Copy Markdown
Contributor

🚀 Deployed to production by https://github.com/blimpich in version: 9.5.30-0 🚀

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

Bundle Size Analysis (Sentry):

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

Labels

Melvin-Test-Android Melvin-Test-Web Triggers Melvin to run the testing steps of the PR on web

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants