Preflight: Collection Settings in React, Subscription page (BL-16734)

Draft PR #8487 into master, the bottom of GitHub stack #8498 with #8493 (BL-16733) above it. Reworked so the code that stays after the old dialog is deleted carries nothing for the old dialog; reviewed, tests green; nothing waiting on you.

Ready for review Mergeable into master Bots quiet No decisions waiting Board: ready for your review

What this PR is about

Problem

The new (React) Collection Settings dialog had only a placeholder for its Subscription page, so a subscription code could still be entered only in the old WinForms dialog. Every subscription badge and gated menu item ("this needs a subscription, click to get one") also still opened the old dialog.

What the PR does

  • A real Subscription page, laid out like the card's mockup: the intro above a card holding the code box (Copy/Paste), tier and expiry, branding summary, expiry warnings and the community-subscription invitation. It shares the code box and status line with the old tab; the old tab itself is now a self-contained copy that the cutover (BL-17042) deletes whole.
  • The code saves with the rest of the dialog: a changed code turns OK into Restart and goes through the existing subscription-and-bookshelf rules, before the front/back-matter check because a branding can choose the pack. An unchanged code keeps the collection's own subscription, which a book downloaded for editing relies on.
  • Cancel leaves nothing behind: the page checks a typed code without telling Bloom about it, so the code reaches Bloom only on OK.
  • Every subscription badge and gated menu item opens the new dialog on its Subscription page, directly in the browser (including from the toolbox and page frames). The comic-book ReadMe links ask Bloom's C# side, which opens it the same way. Until the cutover, a badge on one of the old dialog's own tabs does nothing.
  • A badge on one of the new dialog's own pages switches the open dialog to the Subscription page, keeping edits, through Config-R's page handle.

Quality gate

CheckResult
TypeScript typecheckPass
ESLintPass, no errors
Front-end tests (vitest)Pass 1613 passed in 112 files
C# tests (BloomTests)Pass 3839 passed; the one failure is the opt-in Reading App Builder real-build test, failing in this machine's shared RAB build folder (a known local problem, never run by CI; nothing in this PR touches app building)
Repo check: changed e2e spec at the nightly window sizePass: collection-settings-subscription 4/4, against a build with this run's C#
Running BloomPass: the page with no code, an expired code and the Enterprise test code; badges on the Bloom Library and Experimental pages; the book menu's Export to Spreadsheet; the Publish › Apps overlay. Nothing saved.
Integration with baseUp to date with master; mergeable

What changed this run

At your request, the code that will outlive the old dialog was cleaned of everything there only for it: the page owns its markup, the old tab is a self-contained legacy copy, badges no longer fall back to C#, and the code box carries its own styles. Also dropped the lines between the page's pieces. See the commits.

Reviewer outcomes

ReviewerOutcome
Local review (light sub-agent pass)Clean. (A separate adversarial simplification review, which you asked for, drove this run's changes.)
DevinComplete on 846e278d7d. One new finding, that the old dialog's Advanced-tab badge would throw: not an issue (that window has the workspace code, so the badge does nothing, as intended), replied and resolved. Its other items repeat threads already resolved.
CIComplete: pr-automation passed on 846e278d7d.
ReviewablePending with "6 discussions left": the mirrored Devin threads, resolved on GitHub but still open in Reviewable's own bookkeeping. A human-review status, not a check that finishes.
Other review botsNone active on this PR.

Worth knowing

  • The bottom of GitHub stack #8498: #8493 (BL-16733, Front & Back Matter) sits above it, and its agent has been asked to rebase onto this run's commits and run its own preflight.
  • A subscription badge on one of the old dialog's own tabs now does nothing until the cutover. The card's test ideas say so, so testers won't report it.

Nothing waiting on you

No open questions this run.

Next: your own review of the draft PR, then pr-ready-for-human when you are happy with it.