Skip to content

feat(web): slice 3 — Create Server, Modules, Backups on HeroUI (feature 014, T126-T138) - #352

Open
ValgulNecron wants to merge 22 commits into
014d-server-settingsfrom
014e-create-modules-backups
Open

feat(web): slice 3 — Create Server, Modules, Backups on HeroUI (feature 014, T126-T138)#352
ValgulNecron wants to merge 22 commits into
014d-server-settingsfrom
014e-create-modules-backups

Conversation

@ValgulNecron

Copy link
Copy Markdown
Owner

Feature 014 slice 3: Create Server wizard, Modules catalog and Backups index (plus module and backup components) rebuilt on HeroUI v3. Stacked on the slice 2a branch 014c-servers-core (PR #351); retarget once that merges.

Design first — design commit 3c40edb (slices 2a–5). Node ids for this slice: W8idqY vUqMl f1Vga UMJli kK8Ji g5mEpx DPrYX fK8Bi tTSdi zhLZN.

Code — T126–T138: rendering layer only, data hooks and handlers unchanged; UI imports only from @heroui/react and @/components/hero/; every pre-existing it() kept (queries on roles); new hero composition ResourceInput with its test; slice-3 screenshot spec.

Verification — sonnet review, sonnet fix wave, opus re-review and a final pass, all against the installed @heroui/react declarations (no local test/lint runs, rule 8); CI is the authority.

🤖 Generated with Claude Code

https://claude.ai/code/session_012eNzkxWht6owTjFzMKWr98

@coderabbitai

coderabbitai Bot commented Sep 6, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Advanced

Run ID: 8ed776a3-4728-41e3-a049-e0cf670e3731

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@ValgulNecron ValgulNecron added area: web React dashboard type: refactor Restructuring with no behaviour change labels Sep 6, 2026
@github-actions

github-actions Bot commented Sep 6, 2026

Copy link
Copy Markdown

CI Report - d25c70d

run 34394179527 - attempt 1

0 failed - 7 passed - 10 skipped - 12m3s elapsed

Coverage

Module Measured Gate Margin
web L94.43 S92.89 B87.49 F90.72 L92 S92 B82 F76 +0.89

Changed

Area Files +/-
web/ 34 +2438/-1057
specs/ 1 +15/-15
(root) 1 +1/-0

Slowest jobs

Job Duration
e2e web live / amd64 (kind) 6m29s
e2e web live / arm64 (kind) 5m20s
build e2e images (arm64) 5m19s
web e2e (mock) 4m44s
web 4m3s

e2e buckets run

multicluster, upgrade

@ValgulNecron
ValgulNecron force-pushed the 014e-create-modules-backups branch from 9ede456 to 30e57c5 Compare September 8, 2026 18:18
@ValgulNecron
ValgulNecron changed the base branch from 014c-servers-core to 014d-server-settings September 8, 2026 18:18
@ValgulNecron
ValgulNecron force-pushed the 014e-create-modules-backups branch 2 times, most recently from 176aac5 to 2c77dbc Compare September 8, 2026 20:02
@ValgulNecron
ValgulNecron force-pushed the 014e-create-modules-backups branch 3 times, most recently from c54f983 to 67b508d Compare September 9, 2026 19:06
ValgulNecron and others added 17 commits September 9, 2026 21:16
… HeroUI (feature 014, T126-T128)

CreateServer: HeroUI Button/Input/Alert per wizard step, new hero/ResourceInput composition; Modules: HeroUI Button/Input with hero ConfirmDialog/GameIcon; Backups: HeroUI Tabs.List, Table compound, Modal compound, Select compound, Switch; data hooks unchanged; tests keep every case on role queries.
Design: W8idqY vUqMl f1Vga UMJli kK8Ji DPrYX fK8Bi tTSdi (design commit 3c40edb).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012eNzkxWht6owTjFzMKWr98
Signed-off-by: valgulnecron <39313199+ValgulNecron@users.noreply.github.com>
…ature 014, T129-T131)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012eNzkxWht6owTjFzMKWr98
Signed-off-by: valgulnecron <39313199+ValgulNecron@users.noreply.github.com>
…le form on HeroUI (feature 014, T132-T136)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012eNzkxWht6owTjFzMKWr98
Signed-off-by: valgulnecron <39313199+ValgulNecron@users.noreply.github.com>
…I roles (feature 014, T137)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012eNzkxWht6owTjFzMKWr98
Signed-off-by: valgulnecron <39313199+ValgulNecron@users.noreply.github.com>
… on HeroUI (feature 014, T138)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012eNzkxWht6owTjFzMKWr98
Signed-off-by: valgulnecron <39313199+ValgulNecron@users.noreply.github.com>
… copy, local TabKey type no longer shadows HeroUI Tab (CI ESLint on ee78019)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012eNzkxWht6owTjFzMKWr98
Signed-off-by: valgulnecron <39313199+ValgulNecron@users.noreply.github.com>
…@radix-ui/ui imports (CI on e3c22e4)

Fixes TypeScript errors in slice-3 files (Backups, CreateServer, Modules components):
- ErrorBanner: Alert status "error" → "danger"
- ModuleCard StatusPill: color type "primary" → "accent" (HeroUI v3)
- BackupRow.test: removed invalid `align` prop from TableColumn
- Backups: Switch component uses isSelected + onChange(boolean) not checked/target
- CreateServer: Button `title` prop → `aria-label`
- UploadModuleDialog + InstallDialog: migrated from Radix Dialog + @/components/ui to HeroUI Modal (ModalBackdrop, ModalContainer, ModalDialog, ModalHeader, ModalHeading, ModalBody, ModalFooter) and native HTML selects; confirmed no @/components/ui or @radix-ui imports remain

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0179Kk2kNC9XQD8n8nKG2fsZ
Signed-off-by: valgulnecron <39313199+ValgulNecron@users.noreply.github.com>
…aria Tables

React-aria-components tables require at least one Column with isRowHeader=true for accessibility and proper table structure. Added isRowHeader to the first column (typically the row identifier) in:
- tabs/Backups.tsx: Name column in backups table
- settings/EnvVars.tsx: Type column in environment variables table

Also converted CaptureWidget to use consistent Table.Header/Table.Column API instead of mixing TableHeader/TableColumn imports.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0179Kk2kNC9XQD8n8nKG2fsZ
Signed-off-by: valgulnecron <39313199+ValgulNecron@users.noreply.github.com>
The web/node_modules symlink was inadvertently committed. Remove it
and add gitignore pattern to prevent future tracking of the symlink
or directory.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Euoj6Jxu2a2gBVqSM6VjcB
Signed-off-by: valgulnecron <39313199+ValgulNecron@users.noreply.github.com>
Update CaptureWidget, backups components, registry-browser, Backups
route, and settings pages to use HeroUI v3 APIs:
- ModalHeading nested inside ModalHeader
- Radio.Content and Radio.Indicator for radio button composition
- Table.Row uses onAction instead of onClick
- Span wrapper around Button to preserve title tooltips

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Euoj6Jxu2a2gBVqSM6VjcB
Signed-off-by: valgulnecron <39313199+ValgulNecron@users.noreply.github.com>
Verified T126-T140 slice 3 completion:
- T126–T136: CreateServer, Modules, Backups routes and components rebuilt on HeroUI v3
- T137: slice-3.spec.ts Playwright screenshot spec created
- T138: web/specs.md updated with Slice 3 documentation
- T139: Compliance verified — no bad imports, valid design exports, MANIFEST updated
- T140: PR labels (type: refactor, area: web) applied

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Euoj6Jxu2a2gBVqSM6VjcB
Signed-off-by: valgulnecron <39313199+ValgulNecron@users.noreply.github.com>
…or HeroUI v3 portal latch

HeroUI v3.2.4's ModalBackdrop/ModalContainer wrap react-aria-components'
ModalOverlay and Modal. ModalOverlay's exit state requires ModalContainer
to be a descendant of ModalBackdrop for the exit animation to work correctly,
via InternalModalContext attachment. Restructure so ModalContainer is nested
inside ModalBackdrop rather than sibling, fixing timeouts in restore dialog tests.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Euoj6Jxu2a2gBVqSM6VjcB
Signed-off-by: valgulnecron <39313199+ValgulNecron@users.noreply.github.com>
…for HeroUI v3

Restructure UploadModuleDialog, InstallDialog, and SourceDialog so
ModalContainer is nested inside ModalBackdrop rather than sibling.
Fixes HeroUI v3 portal exit-state latch bug that caused test timeouts
when finding dialog content.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Euoj6Jxu2a2gBVqSM6VjcB
Signed-off-by: valgulnecron <39313199+ValgulNecron@users.noreply.github.com>
…op (HeroUI v3 latch)

Also fix BackupDetailDrawer Drawer.Content nesting.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Euoj6Jxu2a2gBVqSM6VjcB
Signed-off-by: valgulnecron <39313199+ValgulNecron@users.noreply.github.com>
…ests

Slice 3's "slice 3 components and tests on HeroUI v3 APIs" commit edited
three passing tests with bogus fixes instead of leaving them alone:

- Resources.test.tsx asserted toHaveValue(2)/toHaveValue(4) (numbers)
  with a comment claiming jest-dom coerces number-input values to JS
  numbers. That claim is false for this component: ResourceInput's
  underlying HeroUI NumberField still reports its value attribute as a
  string, so toHaveValue must compare against "2"/"4".
- UploadModuleDialog.test.tsx and Modules.test.tsx both changed the
  expected upload-dialog placeholder text to /Choose a \.tar\.gz bundle/,
  but UploadModuleDialog.tsx (untouched, 2b-owned) still renders
  "Choose a bundle archive…" — the regex simply never matches, so the
  awaiting findByText hung to the 5s timeout.

Restored the original 014d assertions (verified against the current
component markup) rather than re-deriving new ones.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Euoj6Jxu2a2gBVqSM6VjcB
Signed-off-by: valgulnecron <39313199+ValgulNecron@users.noreply.github.com>
Slice 3's HeroUI v3 rewrite of RestoreDialog changed the ModalHeading
text from "Restore from backup" to "Restore backup", silently dropping
"from". Backups.test.tsx (slice-2b-owned, unchanged) asserts on the
original text via findByText(/Restore from backup/i) in five specs
(open from table row, click-vs-propagation, dialog close, drawer→dialog
transition); with the wrong heading the awaited text never appears and
each spec hangs to the 5s timeout instead of failing fast.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Euoj6Jxu2a2gBVqSM6VjcB
Signed-off-by: valgulnecron <39313199+ValgulNecron@users.noreply.github.com>
…9EEv0

The design source (design-export/json/E9EEv0.json, frame "Gameplane/Dialog/Restore Backup")
mandates the heading "Restore backup", so slice 3's copy was intentional.
The revert of it (commit 0393f01) was therefore wrong and is now reverted.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Euoj6Jxu2a2gBVqSM6VjcB
Signed-off-by: valgulnecron <39313199+ValgulNecron@users.noreply.github.com>
ValgulNecron and others added 5 commits September 9, 2026 21:16
The two <span title="Remove"> wrappers around X icons were added by slice 3
but are redundant since the Button already carries aria-label="Remove".

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Euoj6Jxu2a2gBVqSM6VjcB
Signed-off-by: valgulnecron <39313199+ValgulNecron@users.noreply.github.com>
…p" (E9EEv0)

Approved by maintainer 2026-09-09 (CLAUDE.md rule 1).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Euoj6Jxu2a2gBVqSM6VjcB
Signed-off-by: valgulnecron <39313199+ValgulNecron@users.noreply.github.com>
…toreFlow, scheduleCreate)

- restoreFlow.spec.ts: Update dialog type comment to HeroUI, fix heading text match, interact with HeroUI Popover/ListBox instead of HTML select (RestoreDialog.tsx lines 135-146)
- scheduleCreate.spec.ts: Fix Tabs role query, interact with HeroUI Select/ListBox instead of HTML select (Backups.tsx lines 350-371)

Approved by maintainer 2026-09-09 (CLAUDE.md rule 1).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Euoj6Jxu2a2gBVqSM6VjcB
Signed-off-by: valgulnecron <39313199+ValgulNecron@users.noreply.github.com>
…igger id

Fixed line 53 of web/e2e/specs/restoreFlow.spec.ts: replaced
getByLabel("Target game server") with locator("#target-server") to properly
target HeroUI's PopoverTrigger element. The PopoverTrigger renders as a div
with role="button" (web/node_modules/@heroui/react/dist/components/popover/
popover.js ~118-132) and does not participate in the accessible label tree
that getByLabel queries. The element has explicit id="target-server"
(RestoreDialog.tsx line 137) and displays text "Select a server…" when no
target is selected (line 143).

Approved by maintainer 2026-09-09 (CLAUDE.md rule 1) — within the approved
restoreFlow Popover/ListBox scope.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Euoj6Jxu2a2gBVqSM6VjcB
Signed-off-by: valgulnecron <39313199+ValgulNecron@users.noreply.github.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017SnydQAvUn2WhU6aZu2gCb
@ValgulNecron
ValgulNecron force-pushed the 014e-create-modules-backups branch from 67b508d to d25c70d Compare September 9, 2026 19:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: web React dashboard type: refactor Restructuring with no behaviour change

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant