Skip to content

[Due for payment 2026-11-02] [$175] [CFI][FE 5/7] Payment history: Activity list with the active user count #101832

Open

Description

@melvin-bot

Sub-task of [CFI] Add a "View payment history" page with historical billing receipts and monthly user activity.

Goal

The details page has an Activity section listing the members who were billed that month, with the total count shown under the Activity header.

Scope

  • Available for every row, including Failed months. This is a deliberate improvement over Classic, where Failed rows show only "View activity" and Cleared rows show only "View receipt".
  • The total count goes under the Activity header — never next to the billed amount. See the note in FE 2/7 for why.
  • The billed members come from the per-policy actor list on the purchase message (message.billablePolicies[*].actorList, already declared as a comma-separated email string in src/types/onyx/PurchaseList.ts). Dedupe across policies — the same person can be billed under more than one workspace.
  • Make the list searchable. These lists run to hundreds of emails on large accounts, and the mock included a search field.
  • Copy in every src/languages/*.ts locale. Use the "active users" wording here; the Collect-plan "members" variant is FE 7/7.

Acceptance criteria

  • Activity is reachable from every row, Failed and Cleared included.
  • The total count matches the number of deduped, billed members for that month.
  • Searching filters the list.
  • A month with no billed members renders an empty state rather than a blank section.
  • Renders correctly wide and narrow.

Depends on

FE 4/7, and a backend decision that needs confirming before this is built: whether the actor list ships with the table payload or is fetched when the details page opens. The actor list is the bulk of the payload and it is large for long-lived, high-headcount accounts, so the split is being decided in the backend issue. Check the agreed contract first.

Easy to get wrong

  • Counting the raw comma-separated string length per policy and summing it, which double-counts anyone billed under multiple workspaces.
  • Rendering hundreds of rows without a virtualised list.
Upwork Automation - Do Not Edit
Issue OwnerCurrent Issue Owner: @nkdengineer

Activity

  1. self-assigned this
    on Sep 25, 2026
  2. dukenv0307 commented on Oct 1, 2026

    @dukenv0307
    Contributor

    Not overdue

  3. 10 remaining items

  4. dukenv0307 commented on Oct 19, 2026

    @dukenv0307
    Contributor

    @MelvinBot Implement. Here's the parent issue: #101649 and make sure the activity list components are similar to

    Image
  5. MelvinBot commented on Oct 19, 2026

    @MelvinBot
    Contributor

    🤖 Draft PR created: [CFI] Payment history: Activity list with the active user count
    Please mark it as "Ready for review" or ask me to do that for you when it is ready for review.

    The Payment details page now has an Activity section that matches your mock: an Activity label, a "Find an active user" search field, and a rounded card. The card header shows the count (for example, "2 active users"), and each row shows the user's avatar, name, and email.

    • Every month has it, including Failed and Cleared. A month with no billed members shows "No active users this month." instead of a blank section.
    • Deduped. A person billed under two workspaces is counted and listed once.
    • Virtualized and searchable. The page now scrolls as one SelectionList, so long lists only render visible rows. Search filters by name or email.
    • Copy is added in every locale. The Collect-plan "members" variant is left for FE 7/7.
    Things to check
    • Data contract: the list reads purchase.activeUsers, the account IDs that OpenPaymentDetailsPage returns, as declared in PurchaseList.ts by FE 4/7. If the backend sends raw actorList emails instead, only the helper and the item mapping need to change.
    • Testing: typecheck, lint, format, spell check, React Compiler, and the unit tests plus a new UI test (35/35) all passed. I couldn't get browser screenshots: the shared web test session rendered a blank page, and test data couldn't be injected. Please verify the layout on web and native.
    • Fork: I couldn't push to your fork, so the branch is on upstream. Instructions to move it are in the PR comments.

    view run · no recording available

  6. changed the title [-][CFI][FE 5/7] Payment history: Activity list with the active user count[/-] [+][$175] [CFI][FE 5/7] Payment history: Activity list with the active user count[/+] on Oct 21, 2026
  7. melvin-bot commented on Oct 21, 2026

    @melvin-bot
    Author
  8. changed the title [-][$175] [CFI][FE 5/7] Payment history: Activity list with the active user count[/-] [+][Due for payment 2026-11-02] [$175] [CFI][FE 5/7] Payment history: Activity list with the active user count[/+] on Oct 26, 2026
  9. melvin-bot commented on Oct 26, 2026

    @melvin-bot
    Author

    @nkdengineer

    The solution for this issue has been 🚀 deployed to production 🚀 in version 9.5.20-5 and is now subject to a 7-day regression period 📆. Here is the list of pull requests that resolve this issue:

    If no regressions arise, payment will be issued on 2026-11-02. 🎊

    The following checklist (instructions) will need to be completed before the issue can be closed. Please copy/paste the Contributor+ Checklist from here into a new comment on this GH and complete it. If you have the K2 extension, you can simply click: [this button]. If no checklist is needed for this issue, you can click: [no checklist button]

  10. nkdengineer commented on Oct 27, 2026

    @nkdengineer
    Contributor

    Not overdue.

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

Metadata

Metadata

Labels

Type

No type

Projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions