Move pre-selected list items to top of list throughout the app#89584
Conversation
|
Hey! I see that you made changes to our Form component. Make sure to update the docs in FORMS.md accordingly. Cheers! |
|
@linhvovan29546 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] |
|
I'm resolving new conflicts |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 3265456246
ℹ️ 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".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Co-authored-by: Copilot <copilot@github.com>
flaviadefaria
left a comment
There was a problem hiding this comment.
From a product standpoint, the fix looks good to me.
|
@marufsharifi Why do we need this change?755e980 This introduces an unnecessary getKey. |
linhvovan29546
left a comment
There was a problem hiding this comment.
Have you checked the previous comment here?
I added it while addressing the previous feedback about duplicated logic between the key/value helpers, and I missed that it’s unnecessary now. Thanks for pointing that out. I’ll simplify this to a single value-based helper and remove the extra abstraction. |
@linhvovan29546 Yes, I checked those previous comments. They should be addressed in this PR. |
linhvovan29546
left a comment
There was a problem hiding this comment.
@marufsharifi I noticed several redundant alias variables for initiallyFocusedItemKey. Could you please clean them up? I haven’t listed all of them in suggested change.
@linhvovan29546 Thanks for catching that. It's fixed now. |
|
@marufsharifi The test failed |
|
@srikarparsi, please feel free to review the code when you get a chance, but please don’t merge the changes yet. I’m still reviewing a few additional edge cases. Thanks! |
|
@srikarparsi, I've finished testing. Please take a look when you get a chance. and merge if no feedback was required. Thanks. |
|
@srikarparsi, gentle bump. thanks |
|
@robertjchen, could you please take a look at this PR; i think are pending your review. thanks. |
|
🚧 @robertjchen has triggered a test Expensify/App build. You can view the workflow run here. |
|
🧪🧪 Use the links below to test this adhoc build on Android, iOS, and Web. Happy testing! 🧪🧪
|
|
🚀 Deployed to staging by https://github.com/robertjchen in version: 9.3.76-0 🚀
|
|
No help site changes are required for this PR. This is a UI bug fix that reorders pre-selected items to the top of selection lists (country pickers, state pickers, value pickers). It does not introduce new features, rename settings, change workflows, or modify any user-facing terminology that would be documented in help site articles. |
|
🚀 Deployed to production by https://github.com/roryabraham in version: 9.3.77-3 🚀
|
|
This PR caused regression: List is not scrolled automatically during arrow key navigation on country select page Steps:
bug.mov |
|
Thanks, @mkhutornyi. This looks like a simple fix. @marufsharifi, could you please prioritize fixing this? |
@linhvovan29546 I will take care of it. thanks. |
Explanation of Change
Fixed Issues
$ #69184
PROPOSAL: #69184 (Comment)
Tests
Note: Below is just an example of one place this issue occurs. There are others, like the country list when adding a personal bank account to the Wallet. This PR fixes the bug on all relevant lists in the app at once.
Offline tests
Same as Tests.
QA Steps
Same as Tests.
// TODO: These must be filled out, or the issue title must include "[No QA]."
PR Author Checklist
### Fixed Issuessection aboveTestssectionOffline stepssectionQA stepssectiontoggleReportand notonIconClick)src/languages/*files and using the translation methodSTYLE.md) were followedAvatar, I verified the components usingAvatarare working as expected)StyleUtils.getBackgroundAndBorderStyle(theme.componentBG))npm run compress-svg)Avataris modified, I verified thatAvataris working as expected in all cases)Designlabel and/or tagged@Expensify/designso the design team can review the changes.ScrollViewcomponent to make it scrollable when more elements are added to the page.mainbranch was merged into this PR after a review, I tested again and verified the outcome was still expected according to theTeststeps.Screenshots/Videos
Android: Native
Record 1:
Screen.Recording.2026-03-30.at.7.24.01.PM.mov
Record 2:
Screen.Recording.2026-03-30.at.7.30.26.PM.mov
Record 3:
Screen.Recording.2026-03-30.at.7.24.55.PM.mov
Record 4:
Screen.Recording.2026-03-30.at.7.25.23.PM.mov
Record 5:
Screen.Recording.2026-03-30.at.7.26.39.PM.mov
Record 6:
Screen.Recording.2026-03-30.at.7.24.19.PM.mov
Record 8:
Screen.Recording.2026-03-30.at.7.27.10.PM.mov
Record 9:
Screen.Recording.2026-03-30.at.7.23.41.PM.mov
Record 10:
Screen.Recording.2026-04-01.at.3.13.33.PM.mov
Record 11:
Screen.Recording.2026-04-01.at.5.02.14.PM.mov
Record 12:
Screen.Recording.2026-04-01.at.5.03.25.PM.mov
Record 13:
Screen.Recording.2026-04-01.at.5.44.40.PM.mov
Record 14:
Screen.Recording.2026-04-01.at.5.45.11.PM.mov
Record 15:
Screen.Recording.2026-04-05.at.2.08.14.PM.mov
Record 16:
Screen.Recording.2026-04-05.at.2.13.16.PM.mov
Record 17:
Screen.Recording.2026-04-05.at.2.13.44.PM.mov
Record 18:
Screen.Recording.2026-04-05.at.2.14.28.PM.mov
Record 19:
Screen.Recording.2026-04-05.at.2.15.09.PM.mov
Record 20:
Screen.Recording.2026-04-05.at.2.17.19.PM.mov
Record 21:
Screen.Recording.2026-04-05.at.2.18.22.PM.mov
Record 22:
Screen.Recording.2026-04-05.at.2.22.26.PM.mov
Android: mWeb Chrome
Record 1:
Screen.Recording.2026-03-30.at.5.01.00.PM.mov
Record 2:
Screen.Recording.2026-03-30.at.5.03.08.PM.mov
Record 3:
Screen.Recording.2026-03-30.at.5.03.39.PM.mov
Record 4:
Screen.Recording.2026-03-30.at.5.13.30.PM.mov
Record 5:
Screen.Recording.2026-03-30.at.5.50.42.PM.mov
Record 6:
Screen.Recording.2026-03-30.at.4.55.18.PM.mov
Record 7:
Screen.Recording.2026-03-30.at.5.46.11.PM.mov
Record 8:
Screen.Recording.2026-03-30.at.4.54.08.PM.mov
Record 9:
Screen.Recording.2026-04-01.at.3.16.46.PM.mov
Record 10:
Screen.Recording.2026-04-01.at.3.17.57.PM.mov
Record 11:
Screen.Recording.2026-04-01.at.4.55.08.PM.mov
Record 12:
Screen.Recording.2026-04-01.at.4.57.46.PM.mov
Record 13:
Screen.Recording.2026-04-01.at.4.55.46.PM.mov
Record 14:
Screen.Recording.2026-04-01.at.4.58.45.PM.mov
Record 15:
Screen.Recording.2026-04-05.at.2.42.49.PM.mov
Record 16:
Screen.Recording.2026-04-05.at.3.02.24.PM.mov
Record 17:
Screen.Recording.2026-04-05.at.3.04.38.PM.mov
Record 18:
Screen.Recording.2026-04-05.at.3.05.12.PM.mov
Record 19:
Screen.Recording.2026-04-05.at.3.05.34.PM.mov
Record 20:
Screen.Recording.2026-04-05.at.3.06.56.PM.mov
Record 21:
Screen.Recording.2026-04-05.at.3.10.56.PM.mov
Record 22:
Screen.Recording.2026-04-05.at.3.11.45.PM.mov
Record 23:
Screen.Recording.2026-04-05.at.3.12.25.PM.mov
iOS: Native
Record 1:
Screen.Recording.2026-03-30.at.6.18.08.PM.mov
Record 2:
Screen.Recording.2026-03-30.at.6.18.31.PM.mov
Record 3:
Screen.Recording.2026-03-30.at.6.19.18.PM.mov
Record 4:
Screen.Recording.2026-03-30.at.6.20.11.PM.mov
Record 5:
Screen.Recording.2026-03-30.at.6.16.51.PM.mov
Record 6:
Screen.Recording.2026-03-30.at.6.20.53.PM.mov
Record 7:
Screen.Recording.2026-03-30.at.6.16.07.PM.mov
Record 8:
Screen.Recording.2026-04-01.at.11.33.09.AM.mov
Record 9:
Screen.Recording.2026-04-01.at.11.34.11.AM.mov
Record 10:
Screen.Recording.2026-04-01.at.11.35.50.AM.mov
Record 11:
Screen.Recording.2026-04-01.at.3.49.36.PM.mov
Record 12:
Screen.Recording.2026-04-01.at.3.53.02.PM.mov
Record 13:
Screen.Recording.2026-04-01.at.4.15.54.PM.mov
Record 14:
Screen.Recording.2026-04-01.at.4.16.47.PM.mov
Record 15:
Screen.Recording.2026-04-05.at.10.18.53.AM.mov
Record 16:
Screen.Recording.2026-04-05.at.11.00.26.AM.mov
Record 17:
Screen.Recording.2026-04-05.at.11.02.02.AM.mov
Record 18:
Screen.Recording.2026-04-05.at.11.02.53.AM.mov
Record 19:
Screen.Recording.2026-04-05.at.11.03.59.AM.mov
Record 20:
Screen.Recording.2026-04-05.at.11.05.48.AM.mov
Record 21:
Screen.Recording.2026-04-05.at.11.16.18.AM.mov
Record 22:
Screen.Recording.2026-04-05.at.12.22.30.PM.mov
iOS: mWeb Safari
Record 1:
Screen.Recording.2026-03-30.at.6.36.12.PM.mov
Record 2:
Screen.Recording.2026-03-30.at.6.36.51.PM.mov
Record 3:
Screen.Recording.2026-03-30.at.6.37.32.PM.mov
Record 4:
Screen.Recording.2026-03-30.at.6.36.33.PM.mov
Record 5:
Screen.Recording.2026-03-30.at.6.37.56.PM.mov
Record 6:
Screen.Recording.2026-03-30.at.6.38.40.PM.mov
Record 7:
Screen.Recording.2026-03-30.at.7.09.25.PM.mov
Record 8:
Screen.Recording.2026-03-30.at.7.14.01.PM.mov
Record 9:
Screen.Recording.2026-04-01.at.11.45.24.AM.mov
Record 10:
Screen.Recording.2026-04-01.at.11.46.41.AM.mov
Record 11:
Screen.Recording.2026-04-01.at.4.24.31.PM.mov
Record 12:
Screen.Recording.2026-04-01.at.4.25.32.PM.mov
Record 13:
Screen.Recording.2026-04-01.at.4.43.59.PM.mov
Record 14:
Screen.Recording.2026-04-05.at.11.53.14.AM.mov
Record 15:
Screen.Recording.2026-04-01.at.4.44.26.PM.mov
Record 16:
Screen.Recording.2026-04-05.at.11.55.14.AM.mov
Record 17:
Screen.Recording.2026-04-05.at.12.07.44.PM.mov
Record 18:
Screen.Recording.2026-04-05.at.12.08.31.PM.mov
Record 19:
Screen.Recording.2026-04-05.at.12.09.00.PM.mov
Record 20:
Screen.Recording.2026-04-05.at.12.09.16.PM.mov
Record 21:
Screen.Recording.2026-04-05.at.12.11.14.PM.mov
Record 22:
Screen.Recording.2026-04-05.at.12.13.37.PM.mov
Record 23:
Screen.Recording.2026-04-05.at.12.14.43.PM.mov
MacOS: Chrome / Safari
Record 1.
workspace.company.cards.add.card.feed.country.step.mov
Record 2.
settings.wallet.add.-.bank.account.account.detaisl.currencly.mov
Record 3.
Settings.Wallet.add.bank.account.bank.information.bank.region.mov
Record 4.
Settings.Wallet.add.bank.account.account.holder.detaisl.mov
Record 5.
create.expense.per.diem.subrate.mov
Record 6.
start.chat.roo.workspace.mov
Record 7.
start.chat.room.who.can.post.mov
Record 8.
only.available.by.route.copy.the.route.from.expensify.cards.mov
Record 9.
stat.chat.room.visibility.mov
Record 10.
expensify.card.issue.card.limit.type.mov
Record 11.
Expensify.card.card.item.Limit.Type.mov
Record 12.
create.expense.per.diem.add.subrate.then.update.that.subrate.mov
Record 13.
settings.profile.address.country.mov
Record 14.
Settings.profile.address.state.mov
Record 15.
Settings.Wallet.Add.bank.account.country.selection.mov
Record 16.
Screencast.From.2026-04-04.08-47-52.mp4
Record 17.
Screencast.From.2026-04-04.09-03-18.mp4
Record 18.
Screencast.From.2026-04-04.09-05-28.mp4
Record 19.
Screencast.From.2026-04-04.09-06-56.mp4
Record 20.
Screencast.From.2026-04-04.09-09-18.mp4
Record 21.
Screencast.From.2026-04-04.09-15-24.mp4
Record 22.
Screencast.From.2026-04-04.10-10-40.mp4
Record 23.
Screencast.From.2026-04-04.10-45-51.mp4
Record 24:
Screencast.From.2026-04-05.07-53-13.mp4