Update the categories table to use the new styles#90537
Conversation
… into jsenyitko-categories-table
… into jsenyitko-categories-table
… into jsenyitko-categories-table
… into jsenyitko-categories-table
|
@JS00001 a few checks are failing. Please resolve them if you get a chance. I'll start reviewing this very shortly. |
Reviewer Checklist
Screenshots/VideosAndroid: HybridAppandroid_hybrid.mp4Android: mWeb Chromeandroid_mWeb.mp4iOS: HybridAppios_hybrid.mp4iOS: mWeb Safariios_safari.mp4MacOS: Chrome / Safariweb_chrome_2.mp4web_chrome.mp4 |
|
@JS00001 one last thing I just found: Mobile selection mode stays enabled after deleting the last categoryOn In this PR, that hook was removed and we now rely on I think it would be better to:
A simple |
|
@Krishna2323 updated to put the empty state inside of the table.The main goal w/ the table is to not require external logic for managing the state of the table, so I think its best to use this existing logic by not unmounting: |
|
@luacmartins this is ready for your final review :) |
|
✋ This PR was not deployed to staging yet because QA is ongoing. It will be automatically deployed to staging after the next production release. |
|
🚧 @luacmartins 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/luacmartins in version: 9.4.2-0 🚀
Bundle Size Analysis (Sentry): |
|
🤖 Help site review: no documentation changes required. I reviewed the changes in this PR against the help site articles under Why This PR is an internal UI/component refactor — it migrates the Categories table to the shared
If you intended a specific user-facing behavior to be documented that I may have missed, reply with @JS00001, since no help site changes were required, no draft PR was created. Please confirm you agree this PR doesn't alter any documented behavior. If you'd like a docs update for a specific point (e.g., calling out shift‑click range selection), let me know and I'll open a draft PR. |
|
Deploy Blocker #93135 was identified to be related to this PR. |
|
Deploy Blocker #93139 was identified to be related to this PR. |
|
🚀 Deployed to staging by https://github.com/luacmartins in version: 9.4.4-1 🚀
Bundle Size Analysis (Sentry): |
|
I reviewed the changes in this PR against the help site articles under Verdict: One small docs update is needed. This PR is primarily a UI restyle of the workspace Categories table, plus checkbox bulk-selection and shift-click multi-select. Most of that is already covered (or doesn't need coverage):
The one gap: the article enumerates the table's columns as Name, GL Code, and Enabled, but this PR adds an Approver column on the Control plan. I updated that sentence so the column list matches the current UI. 📝 Draft docs PR: #93205 @JS00001, please review the linked help site PR and confirm it reflects the current behavior. Then mark the linked help site PR |
|
🚀 Deployed to production by https://github.com/Julesssss in version: 9.4.4-3 🚀
|
Explanation of Change
Updates the categories table to the new style, and adds support for checkbox's to the table component
Also adds support for shift-clicking checkboxes to select multiple rows at once
Fixed Issues
$ #86206
Tests
Offline tests
N/A
QA Steps
Same as tests
PR Author Checklist
### Fixed Issuessection aboveTestssectionOffline stepssectionQA stepssectioncanBeMissingparam foruseOnyxtoggleReportand 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./** comment above it */thisproperly so there are no scoping issues (i.e. foronClick={this.submit}the methodthis.submitshould be bound tothisin the constructor)thisare necessary to be bound (i.e. avoidthis.submit = this.submit.bind(this);ifthis.submitis never passed to a component event handler likeonClick)Screenshots/Videos
Screen.Recording.2026-05-22.at.9.57.10.AM.mov