feat(rust): Admin → Rust servers page and the next wipe on the web (phase 16)
All checks were successful
PR Checks / client-build (pull_request) Successful in 26s
PR Checks / frozen-manifest (pull_request) Successful in 49s
PR Checks / server-tests (pull_request) Successful in 7m49s

The module had no page for its own server rows: they were written only
through PUT /admin/rust/servers/:id, and the README described an
"Admin → Rust" server form that did not exist. D133 (org lead) builds it:
add, edit, test and delete a server, with the D130 wipe schedule in the
same form. The token stays write-only and an edit sends the stored
protocol back rather than re-stamping the row.

The next wipe shows on the server list and in the server page's header,
in the reader's own clock, marked "rescheduled" for a one-off date.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
This commit is contained in:
2026-09-25 13:26:10 -05:00
parent 0670341198
commit cddba957d3
8 changed files with 450 additions and 11 deletions

View File

@@ -31,7 +31,7 @@ import Online from '../../components/Online.jsx'
import Tabs from '../../components/Tabs.jsx'
import WipeSelect, { ALL_TIME } from '../../components/WipeSelect.jsx'
import Wipes from '../../components/Wipes.jsx'
import { ago, count, day } from '../../lib/format.js'
import { ago, count, day, nextWipe } from '../../lib/format.js'
import api from '../../api.js'
const TABS = [
@@ -188,6 +188,7 @@ function describeWorld(server) {
server.worldSize ? `size ${count(server.worldSize)}` : null,
server.seed ? `seed ${server.seed}` : null,
server.wipedAt ? `wiped ${day(server.wipedAt)}` : null,
nextWipe(server.nextWipe) ? `next wipe ${nextWipe(server.nextWipe)}` : null,
].filter(Boolean)
return parts.length > 0 ? parts.join(' · ') : 'This server has not described itself yet.'

View File

@@ -24,7 +24,7 @@
import { Link } from 'react-router-dom'
import { ErrorState, Loading, PageHeader, PublicLayout, useAsync } from '../../core.js'
import Empty from '../../components/Empty.jsx'
import { ago, count, day } from '../../lib/format.js'
import { ago, count, day, nextWipe } from '../../lib/format.js'
import api from '../../api.js'
/** The "last reported" line, which has three cases and not one. */
@@ -93,6 +93,9 @@ export default function Servers() {
server.level || null,
server.worldSize ? `size ${count(server.worldSize)}` : null,
server.wipedAt ? `wiped ${day(server.wipedAt)}` : null,
// Phase 16 (D131): absent from an older module, and null for a
// server with no schedule — either way the part is left out.
nextWipe(server.nextWipe) ? `next wipe ${nextWipe(server.nextWipe)}` : null,
]
.filter(Boolean)
.join(' · ')}