feat(web): slice 3 — Create Server, Modules, Backups on HeroUI (feature 014, T126-T138) - #352
feat(web): slice 3 — Create Server, Modules, Backups on HeroUI (feature 014, T126-T138)#352ValgulNecron wants to merge 22 commits into
Conversation
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Advanced Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
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. Comment |
CI Report - d25c70drun 34394179527 - attempt 1 0 failed - 7 passed - 10 skipped - 12m3s elapsed Coverage
Changed
Slowest jobs
e2e buckets run
|
9ede456 to
30e57c5
Compare
176aac5 to
2c77dbc
Compare
295ac96 to
e3d82a4
Compare
c54f983 to
67b508d
Compare
… 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>
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
67b508d to
d25c70d
Compare
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/reactand@/components/hero/; every pre-existingit()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/reactdeclarations (no local test/lint runs, rule 8); CI is the authority.🤖 Generated with Claude Code
https://claude.ai/code/session_012eNzkxWht6owTjFzMKWr98