Skip to content

[Experimental] Left-align all Spend table columns and headers#96781

Draft
MelvinBot wants to merge 2 commits into
mainfrom
claude-leftAlignSpendTableColumns
Draft

[Experimental] Left-align all Spend table columns and headers#96781
MelvinBot wants to merge 2 commits into
mainfrom
claude-leftAlignSpendTableColumns

Conversation

@MelvinBot

Copy link
Copy Markdown
Contributor

Explanation of Change

🧪 Experimental / preview PR requested by dannymcclain — no linked issue.

Left-aligns the text and the column headers for every column in the Spend (Search results) table. Previously some columns were right-aligned (the amount/total columns) and a few were center-aligned (icon/status/action columns), while the rest were left-aligned. This makes the whole table consistently left-aligned so the requester can preview that layout.

What changed:

  • src/styles/utils/index.tsgetReportTableColumnStyles() drives the per-column container alignment for both the header row and the data cells. Removed the alignItemsEnd (right-align) override from the amount columns (TOTAL, TOTAL_AMOUNT, GROUP_TOTAL, ORIGINAL_AMOUNT, TOTAL_PER_ATTENDEE, REIMBURSABLE_TOTAL, NON_REIMBURSABLE_TOTAL, TAX_AMOUNT) and the alignItemsCenter (center) override from the icon/status columns (COMMENTS, RECEIPT, AVATAR, STATUS, GROUP_WITHDRAWAL_STATUS, TYPE, ACTION, EXPORTED_TO). Each now falls through to the default left alignment.
  • src/components/TransactionItemRow/DataCells/TotalCell.tsx and TaxCell.tsx → removed the cell-text textAlignRight so the amount/tax text renders left. In the inline-edit state of the amount cell, switched the input to textAlignLeft and the scroll container to justifyContentStart.
  • src/components/Search/SearchList/ListItem/TotalCell.tsx → removed textAlignRight from the grouped report-row total.

Notes:

  • getReportTableColumnStyles, TransactionItemRow/DataCells/* and the Search TotalCell are shared by the Search/Spend table and the money-request report transaction tables, so those report tables pick up the same left-alignment. This is expected for a consistency preview — flag it if you only want it scoped to Spend.
  • This only touches the wide (desktop) table layout. The narrow/mobile stacked-card layout is unchanged.

Fixed Issues

$
PROPOSAL:

Tests

  • Verify that no errors appear in the JS console

Offline tests

QA Steps

// TODO: These must be filled out, or the issue title must include "[No QA]."

  • 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 followed proper code patterns (see Reviewing the code)
    • 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 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)
  • 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.
  • 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: Danny McClain <dannymcclain@users.noreply.github.com>
@github-actions

Copy link
Copy Markdown
Contributor

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

@MelvinBot

Copy link
Copy Markdown
Contributor Author

I looked into the checks — there's no code failure to fix here. 🎉

The only red check is PR Author Checklist / checklist, and it's failing for two expected reasons, not because of the code:

  • The PR Author Checklist boxes aren't ticked (this is an experimental preview PR, so the template checkboxes were left blank).
  • It couldn't verify engineering membership for the PR author (MelvinBot), so it treats the checklist as incomplete.

Neither is fixable by pushing code — the checklist just needs a human author to tick the boxes (or it can be safely ignored on an experimental preview PR).

Everything that actually validates the change is green: ESLint, TypeScript, Bun tests, all 8 test jobs, knip, Oxfmt, Check for unused styles, Storybook, React Compiler, spellcheck, and all builds pass. The typecheck and perf-test jobs were still finishing their post-steps when I checked, but the real work (the "Type check with TypeScript" step, etc.) already passed — no failures there.

So no push was needed. If you want the Author Checklist to go green, tick the boxes in the PR description; otherwise it's fine to leave as-is for a preview PR.

@github-actions

This comment has been minimized.

@dannymcclain

Copy link
Copy Markdown
Contributor

@MelvinBot the status badges inside the Status column are still centered. Can you investigate and make them left aligned?

@codecov

codecov Bot commented Jul 22, 2026

Copy link
Copy Markdown

Codecov Report

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

Files with missing lines Coverage Δ
...mponents/Search/SearchList/ListItem/StatusCell.tsx 92.30% <ø> (ø)
...omponents/Search/SearchList/ListItem/TotalCell.tsx 100.00% <100.00%> (ø)
...omponents/TransactionItemRow/DataCells/TaxCell.tsx 100.00% <100.00%> (ø)
...ponents/TransactionItemRow/DataCells/TotalCell.tsx 79.03% <100.00%> (ø)
src/styles/utils/index.ts 55.47% <80.00%> (ø)
... and 5 files with indirect coverage changes

Co-authored-by: Danny McClain <dannymcclain@users.noreply.github.com>
@MelvinBot

Copy link
Copy Markdown
Contributor Author

Fixed and pushed. The status badges now left-align in the Status column.

Why they were still centered: the previous change removed the center override from the column container, but the badge was centering itself. The shared Badge component hardcodes alignSelfCenter, and because StatusCell wraps it in a column-direction View, that alignSelf controls the horizontal axis — so the badge stayed centered no matter what the container did.

Fix: StatusCell.tsx now passes badgeStyles={styles.alignSelfStart} to the badge, which overrides the hardcoded alignSelfCenter (it's applied last). Scoped to StatusCell so no other Badge/StatusBadge usage is affected. This covers the Status column in both the grouped report rows and the transaction rows of the wide table.

@MelvinBot

Copy link
Copy Markdown
Contributor Author

Re-checked after the new commit (19c0957a — "Left-align status badge in Status column"), which re-triggered the whole suite. Same result: there's no code failure to fix.

The only red check is PR Author Checklist / checklist, which fails for expected, non-code reasons — the Author Checklist boxes aren't ticked and it can't verify engineering membership for the author (MelvinBot). That's not fixable by a code push; it just needs a human author to tick the boxes (or it can be left as-is on an experimental preview PR).

Everything that validates the code is green — including TypeScript (the new badgeStyles={styles.alignSelfStart} type-checks fine), ESLint, Bun tests, all 8 test jobs, knip, Oxfmt, unused-styles, Storybook, React Compiler, and all builds. The perf-test jobs were still running when I checked, but they compare against baseline and aren't failing.

So no push was needed. Tick the Author Checklist boxes if you want that check green; otherwise it's safe to ignore on a preview PR.

@github-actions

Copy link
Copy Markdown
Contributor

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

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.

2 participants