BL-16739 Languages page: preflight

The Languages page of the React Collection Settings dialog is built, reviewed, and covered by an end-to-end test, on Config-R 1.0.0-alpha.32 with the sub-page fix the test found. Nothing needs a decision. One caveat: the full test suites have not run on the latest merge, because they were stopped when the machine ran low on memory.

Draft PR Mergeable Bots: complete No decisions Full suites not rerun after the merge

What this PR is about

Problem

The new React Collection Settings dialog showed a placeholder on its Languages page. The collection's languages, their fonts and their script settings could only be changed in the old WinForms dialog, spread over its Languages tab, the Book Making tab and the Special Script Settings dialog. The reader tools' alphabet and sentence punctuation could only be changed in Reader Setup.

What the PR does

  • A Languages page with a group each for Language 1, 2, 3 and the Sign Language. Each shows its language with Change…, which opens the existing language chooser as a nested dialog; Language 3 and the Sign Language also offer Set… and Remove. Each written language has its Default Font and a More sub-page with the tool font size, line spacing, Asian word breaking and right-to-left.
  • Reader tools, Language 1 only. Its More page edits the reader tools' alphabet and sentence-ending punctuation. On save, just those two values are written into the reader tools' own file in the collection folder, keeping the stages and levels; nothing is written if they didn't change. The fields are locked while Language 1 itself is being changed, and when the file is damaged, so the rest of the settings always save.
  • Page Numbering Style sits at the bottom of the page. Only its place in the dialog's data moved; the collection file is unchanged.
  • Small supporting changes: the settings GET sends the default font for a new Language 3; the language chooser can hand its pick to a callback and is sized properly without a WinForms frame; the reader tools' default settings and alphabet clean-up moved where both callers can use them, unchanged.
  • Config-R moves to 1.0.0-alpha.32 for sillsdev/config-r#31. Before it, any edit on a More page threw the user back to the Languages page, because Config-R reset the focused page whenever the dialog re-rendered, and this dialog re-renders on every edit.
  • An end-to-end journey test (collection-settings-languages.spec.ts): Language 1's font, then on its More page a line spacing and a new alphabet; Restart; then the saved collection, the reader tools' stages, and the reopened dialog.

Quality gate

CheckResult
TypecheckPass at e4d6a05163
LintPass: no errors (the repo has 793 existing warnings)
TypeScript tests (vitest)Pass: 1648 passed in 114 files at 330705a2aa. At e4d6a05163, the collection tests (98) pass; the full run was stopped when the machine ran low on memory.
C# tests (dotnet test)Pass: 3848 passed at 330705a2aa. At e4d6a05163, the 199 collection settings and reader tools tests pass; the full run was stopped when the machine ran low on memory.
Base integrationUp to date with BL-16735-team-collection-settings at 0dc7f2e61c, merged at e4d6a05163. BL-16733's new Front & Back Matter page replaced this branch's badge preview code (the preview now follows the dialog's languages there); the default-caption comment moved to DefaultQrcodeCaption. The PR lists only this card's 22 files.
E2E specs at nightly size (repo check)Pass at the nightly window size on a fresh build of e4d6a05163, with the Front & Back Matter spec alongside (3 tests). Before that it also passed 20 times with alpha.32; two other runs lost their Playwright worker to the known crash in AUTOMATION-DEBT.md ("A Playwright worker occasionally dies"), not a test failure.
Live check in BloomDone on an earlier run (page, More sub-page, nested chooser, font picker alignment, badge preview); this run changed only the Config-R version, which the e2e test exercises

What changed this run

You merged sillsdev/config-r#31; this PR now uses Config-R 1.0.0-alpha.32, with only that package changed in the lockfile. The branch was rebased onto BL-16735 as the stack moved, then merged BL-16735 again for BL-16733's one-GET Front & Back Matter page. Commits.

Reviewer outcomes

ReviewerOutcome
Local review (light, inline)Clean: this run's new code is the version bump and the merge, whose conflicts were resolved by keeping both sides' fields and taking BL-16733's badge preview. Earlier passes found one problem, a damaged reader tools file blocking the dialog, since fixed.
DevinComplete at e4d6a05163, with no new findings. The four it still lists come from earlier commits and are closed: the props type (fixed), the badge preview's language (fixed), uncancelled fetches (not an issue), and the default caption's translation (left as is, with a code comment). No Investigate flags.
GreptileHas not reviewed the current head. Its last review was of the page's code before the squash, which is unchanged since apart from a code comment and the Config-R version. Its two findings on that code, the damaged reader tools file blocking a save (thread) and a component declared with function (thread), are fixed.
CIPR Automation passed. GitHub reports the PR as mergeable.

What remains for the whole dialog

Pages

PageCardPRState
LanguagesBL-16739#8502Draft (this PR)
Team CollectionBL-16735#8500Draft; card In Progress
Front & Back MatterBL-16733#8493Draft; card In Progress
SubscriptionBL-16734#8487Draft; card In Progress
Help buttonBL-17032#8489Merged to master; card Ready For Testing
Bloom LibraryBL-16736#8453Merged; card Ready For Testing
AdvancedBL-16737#8444Merged; card Closed
ExperimentalBL-16738#8443Merged; card Closed

Landing the stack

  • The stack is master ← #8487 (BL-16734) ← #8493 (BL-16733) ← #8500 (BL-16735) ← #8502 (this PR), each holding only its own commits. BL-17032's Help button is on master with @sillsdev/config-r 1.0.0-alpha.30; this PR moves it to alpha.32.
  • The remaining four are drafts. When a PR below moves, the one above it is rebased onto it (the sessions pass the new head up the stack).
  • The PRs below this one stay on Config-R alpha.30, which is fine for them: none of their pages has a sub-page.

Cutover (BL-17042, Ready For Work)

  • Go through the WinForms OK handler line by line, and confirm each rule is in the React save path or dropped on purpose.
  • Remove the old Settings button, the WinForms dialog, ScriptSettingsDialog, the four tab bundles and their vite entries (including the Book Making font and page-numbering controls), DialogBeingEdited and the endpoints only it feeds, and the legacy launch path.
  • Find a new home for AutoUpdateSupportedOnThisPlatform, which the React save path still reads.
  • Mark unused CollectionSettingsDialog.* strings obsolete; drop translate="no" from the new page strings once their wording is settled.
  • Update the help mapping and help pages; add an e2e test that opens the dialog and changes a setting, and update AUTOMATION-DEBT.md; post whole-dialog test ideas on BL-16271.

Known gaps and follow-ups

  • BL-16904 (Ready For Work): the check meant to clear the bookshelf when the subscription changes never fires.
  • A subscription code typed but not yet saved doesn't unlock gated settings on the other pages until after OK.
  • UI Font, Keyboard and Common Name from the mockup stay out: Bloom keeps no data for them.
  • Config-R logs "Cannot update a component while rendering a different component" when a value changes; the dialog defers around it, and the real fix belongs in Config-R.
  • BL-13273 (Config-R sub-page improvements) stays open: separating the page hierarchy from the data is done, and a sub-page now stays showing when the client re-renders; the rest is not done.

Next step

Nothing on this PR needs a decision. The full C# and vitest suites should run once more on e4d6a05163 when the machine has memory to spare; the parts they cover that this merge touched already pass. Then it is ready for your own review.

Send your answers back

Copies your answers as plain text to paste into a Claude session.