From 9d4ff992a41efaa080a74814b56e379ca5645a35 Mon Sep 17 00:00:00 2001 From: Josh Wright Date: Mon, 5 Oct 2026 19:25:55 -0400 Subject: [PATCH] Complete workflow navigation and document page groups --- README.md | 22 ++++++++++++++++++--- docs/authentication.md | 2 +- docs/metrics.md | 2 +- src/lib/ui/components/ArtifactDetail.svelte | 4 ++-- src/routes/betas/new/+page.svelte | 10 ++++++++-- src/routes/campaigns/[id]/+page.svelte | 3 ++- 6 files changed, 33 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index b3ae330..8ae1609 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ docker compose up -d --build Open EC and create the first administrator using `EC_SETUP_TOKEN` (at least 32 characters; generate it with `openssl rand -hex 32`). After setup, remove that token from the environment. Administrators can add administrators, operators and -viewers from **Settings → Users**. See [Users and access](docs/authentication.md) +viewers from **Administration → Users**. See [Users and access](docs/authentication.md) for permissions, sessions, password recovery and upgrade instructions. Operator pages and management APIs require login. Enrolled agents authenticate @@ -32,11 +32,11 @@ including SQLite metadata and published game-file storage. including its DLC files. There are no library names or version labels to enter. Each upload becomes the latest files for that game after verification. Uploads work before any host is enrolled. -2. **Hosts → Add Host**: configure a Debian 12/13 amd64 machine and run its +2. **Fleet → Hosts → Add Host**: configure a Debian 12/13 amd64 machine and run its generated enrollment command. The host automatically prepares its Plutainer runtime and the latest T5 and T6 files, when available. The host page shows setup progress. Automatic agent updates are enabled by default. -3. Add the exact Plutonium server keys in **Keys**, or supply missing keys when +3. Add the exact Plutonium server keys in **Administration → Keys**, or supply missing keys when launching. 4. Launch a server or collection. Collection previews show cached capacity estimates; Apply saves the queue and opens its progress page. Provisioning @@ -61,6 +61,22 @@ continue. The host page shows update status and the last check. ## Fleet and operations +The sidebar groups pages into **Fleet**, **Library**, **Operations**, **Analytics**, +and **Administration** (administrators only). On small screens, open the navigation +menu in the header. The account menu contains **My account**, including your +browser's display timezone; keyboard shortcuts are available through **?**. + +**Operations → Overview** combines work that needs attention, running workflows, +and recent results. Related provisioning attempts and host commands stay grouped +under their workflow. Normal waits for empty lobbies remain under **Running**; +successful routine checks remain in **Host operation history**. Full history is +available on each workflow page. + +Server details use **Live**, **Matches**, **Configuration**, **Diagnostics**, and +**History** sections. Hosts use **Overview**, **Servers**, **Setup**, and **Settings**. +Contextual Back links preserve the originating filters and views, while breadcrumbs +show each page's place in the navigation. Existing URLs and server tab links work. + The fleet registry lives in SQLite, independently of host filesystems. Status combines agent container health, fresh game telemetry and agent-local RCON. Unreachable hosts report unknown instance state; they do not trigger duplicate diff --git a/docs/authentication.md b/docs/authentication.md index 490c195..2570047 100644 --- a/docs/authentication.md +++ b/docs/authentication.md @@ -20,7 +20,7 @@ their access checks. HTTPS requirements still apply. See the password. Only the holder of the token can create the first administrator. 4. Remove `EC_SETUP_TOKEN` after setup and restart/recreate the controller. Setup remains closed once any user exists, even if the token is still set. -5. Use **Settings → Users** to create additional accounts. Share temporary +5. Use **Administration → Users** to create additional accounts. Share temporary passwords privately; each user must change theirs on first login. Existing installations become protected on upgrade. Existing game servers and diff --git a/docs/metrics.md b/docs/metrics.md index 18f7957..3dd1c23 100644 --- a/docs/metrics.md +++ b/docs/metrics.md @@ -1,6 +1,6 @@ # Metrics -Metrics is a primary navigation tab at `/metrics` (keyboard shortcut: `g m`). +Metrics is under **Analytics** at `/metrics` (keyboard shortcut: `g m`). Choose the past 24 hours, 7 days, or 30 days. The page refreshes every minute. The overview shows **Time with players** (occupied server-hours divided by known diff --git a/src/lib/ui/components/ArtifactDetail.svelte b/src/lib/ui/components/ArtifactDetail.svelte index dd1732c..3227bd3 100644 --- a/src/lib/ui/components/ArtifactDetail.svelte +++ b/src/lib/ui/components/ArtifactDetail.svelte @@ -291,7 +291,7 @@ {#if scopeComplete}
Scope saved. {scopeComplete.composed ? `Intended configuration may change on ${scopeComplete.count} eligible servers.` : scopeComplete.detached ? `Inventory tracking detached on ${scopeComplete.detached} servers; live files remain.` : `${scopeComplete.count} servers are in the old or new scope.`} Maintenance detects resulting drift and rebuilds eligible servers when automation is enabled. View drift recovery →
{/if} - {#if latestVersion}

Latest {artifactVersionLabel(latestVersion)}

{latestVersion.notes || 'No version notes provided.'}

{#if runningBetaId !== null}{:else if latestVersion.id !== a.current_version_id}{:else}Latest version is promoted{/if}
{/if} + {#if latestVersion}

Latest {artifactVersionLabel(latestVersion)}

{latestVersion.notes || 'No version notes provided.'}

{#if runningBetaId !== null}{:else if latestVersion.id !== a.current_version_id}{:else}Latest version is promoted{/if}
{/if} {#if runningBetaId}
@@ -382,7 +382,7 @@ Promoted {:else} - {#if runningBetaId === null}{/if} + {#if runningBetaId === null}{/if} {/if}
File detailsSHA-256: {v.sha256}Size: {v.size.toLocaleString()} bytes
diff --git a/src/routes/betas/new/+page.svelte b/src/routes/betas/new/+page.svelte index 1f8f76e..aa29d74 100644 --- a/src/routes/betas/new/+page.svelte +++ b/src/routes/betas/new/+page.svelte @@ -1,4 +1,8 @@ New beta | Electric Cherry
- {#snippet actions()}{/snippet} + + + {#if flash}{/if} {#if $fleetError}{/if} {#if notice}

{notice}

{/if} diff --git a/src/routes/campaigns/[id]/+page.svelte b/src/routes/campaigns/[id]/+page.svelte index 13cc394..21b197c 100644 --- a/src/routes/campaigns/[id]/+page.svelte +++ b/src/routes/campaigns/[id]/+page.svelte @@ -33,7 +33,7 @@ interface Detail { deployment: { id: string; action: string; started_at: string; - finished_at: string | null; triggered_by: string | null; + finished_at: string | null; triggered_by: string | null; beta_id?: number | null; }; servers: ServerRow[]; files: FileRow[]; @@ -149,6 +149,7 @@ {#if detail.watchdogIncidentId}

Started by Maintenance · View incident and recovery history

{/if} + {#if detail.deployment.beta_id}

Started from Beta #{detail.deployment.beta_id} · Review its files, checks, and test servers.

{/if} {#if detail.servers.some(server => !server.server_deleted_at && ['held', 'manual'].includes(server.restart_state))}

Apply held changes and restart after the safety checks pass.