+
+
+
+
+
-
Server Name
-
{{ server.config.server_name || 'Not set' }}
+
{{ scopeLabel }}
+
{{ fleetTitle }}
-
-
Max Players
-
{{ server.config.max_players ?? 'Not set' }}
-
-
-
World Size
-
{{ server.config.world_size ?? 'Not set' }}
-
-
-
Current Seed
-
{{ server.config.current_seed ?? 'Not set' }}
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ No servers match the current filter.
+
+
+
+
+
+
+
+
+
+
+ Live
+
+
+ {{ f.msg }}
+
+
+
+
+
+
+
+
+
+
{{ w.name }}
+
{{ w.when }}
+
+
{{ w.label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ soloName }}
+ {{ soloStatusLabel }}
+
+
+ {{ soloRegion }} · {{ soloIp }}
+ · up {{ soloUptime }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Live
+
+
+ {{ f.msg }}
+
+
+ >
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ p.name }}
+ {{ p.ver }}
+
+
+
+
+
+
+
+
+
+
+
Thu · 18:00 UTC
+
representative — configure in wipe manager
+
+
+
+
+
+
+
+
+
diff --git a/frontend/src/views/admin/_dashboardMock.ts b/frontend/src/views/admin/_dashboardMock.ts
new file mode 100644
index 0000000..8c16b9b
--- /dev/null
+++ b/frontend/src/views/admin/_dashboardMock.ts
@@ -0,0 +1,159 @@
+/**
+ * Dashboard mock data — representative placeholder pending multi-instance backend.
+ * Current backend is single-server-per-license; the fleet view is a forward-looking
+ * surface that will bind to a multi-instance API. All data here is static and clearly
+ * labeled so it is never confused for real tenant data.
+ *
+ * Per-game fields are isolated by game key — a Dune row NEVER receives a Rust field
+ * like `umod`, and vice-versa. See GAME_FIELDS for the row-field contract.
+ */
+
+// ---------------------------------------------------------------------------
+// Types
+// ---------------------------------------------------------------------------
+
+export type ServerStatus = 'online' | 'offline' | 'starting' | 'wiping' | 'updating'
+export type GameKey = 'rust' | 'dune' | 'conan' | 'soulmask'
+
+export interface MockServer {
+ game: GameKey
+ gameIcon: string
+ name: string
+ region: string
+ map: string
+ version: string
+ status: ServerStatus
+ players: { cur: number; max: number }
+ cpu?: number
+ ram?: number
+ ramSub?: string
+ ip: string
+ // Rust-only
+ umod?: string
+ wipe?: string
+ // Dune-only
+ sietches?: string
+ control?: string
+ // Conan-only
+ clans?: string
+ purge?: string
+ // Soulmask-only
+ tribe?: string
+ mask?: string
+}
+
+export interface MockFeedLine {
+ time: string
+ level: 'cmd' | 'chat' | 'info' | 'warn' | 'error' | 'connect' | 'kill'
+ who?: string
+ msg: string
+}
+
+export interface MockWipe {
+ game: GameKey
+ name: string
+ when: string
+ tone: 'wiping' | 'starting' | 'warn' | 'online'
+ label: string
+}
+
+export interface StatItem {
+ label: string
+ value: string | number
+}
+
+// ---------------------------------------------------------------------------
+// Fleet server roster
+// ---------------------------------------------------------------------------
+
+export const MOCK_SERVERS: MockServer[] = [
+ {
+ game: 'rust', gameIcon: 'box', name: 'Main · 2x Vanilla', region: 'US-East',
+ map: 'Procedural 4500', version: 'v2024.12', status: 'online',
+ players: { cur: 142, max: 200 }, cpu: 41, ram: 68, ramSub: '5.4 / 8 GB',
+ ip: '89.142.0.7:28015', umod: '14', wipe: '2d',
+ },
+ {
+ game: 'rust', gameIcon: 'box', name: '5x Modded · Build', region: 'US-East',
+ map: 'Barren 3000', version: 'v2024.12', status: 'online',
+ players: { cur: 38, max: 100 }, ip: '89.142.0.7:28017', umod: '27', wipe: '2d',
+ },
+ {
+ game: 'rust', gameIcon: 'box', name: 'Hardcore · Solo/Duo', region: 'US-West',
+ map: 'Procedural 3500', version: 'v2024.12', status: 'wiping',
+ players: { cur: 0, max: 80 }, cpu: 8, ram: 30, ramSub: '2.4 / 8 GB',
+ ip: '74.91.3.2:28015', umod: '9', wipe: 'now',
+ },
+ {
+ game: 'dune', gameIcon: 'sun', name: 'Arrakis · Hardcore', region: 'EU-Frankfurt',
+ map: 'Hagga Basin', version: 'v0.9.4', status: 'online',
+ players: { cur: 54, max: 60 }, cpu: 63, ram: 74, ramSub: '11.8 / 16 GB',
+ ip: '51.83.12.4:7777', sietches: '3', control: '62%',
+ },
+ {
+ game: 'dune', gameIcon: 'sun', name: 'Deep Desert · PvP', region: 'EU-Frankfurt',
+ map: 'Deep Desert', version: 'v0.9.4', status: 'starting',
+ players: { cur: 0, max: 40 }, ip: '51.83.12.4:7779', sietches: '0', control: '—',
+ },
+ {
+ game: 'dune', gameIcon: 'sun', name: 'Sietch · Roleplay', region: 'SG-Singapore',
+ map: 'Hagga Basin', version: 'v0.9.4', status: 'offline',
+ players: { cur: 0, max: 50 }, ip: '139.99.4.8:7777', sietches: '5', control: '—',
+ },
+ {
+ game: 'conan', gameIcon: 'swords', name: 'Exiled Lands · PvP-C', region: 'US-East',
+ map: 'Exiled Lands', version: 'v3.0.5', status: 'online',
+ players: { cur: 32, max: 40 }, cpu: 48, ram: 60, ramSub: '9.6 / 16 GB',
+ ip: '89.142.0.7:7777', clans: '7', purge: 'Tier 4',
+ },
+ {
+ game: 'soulmask', gameIcon: 'drama', name: 'Sienna Plateau · PvE', region: 'EU-Frankfurt',
+ map: 'Sienna Plateau', version: 'v1.4', status: 'online',
+ players: { cur: 18, max: 30 }, cpu: 35, ram: 52, ramSub: '8.3 / 16 GB',
+ ip: '51.83.12.4:8777', tribe: '4', mask: 'Jaguar',
+ },
+]
+
+// ---------------------------------------------------------------------------
+// Per-game stat field sets — never share slots across games
+// ---------------------------------------------------------------------------
+
+function pl(s: MockServer): string {
+ return `${s.players.cur} / ${s.players.max}`
+}
+
+export const GAME_FIELDS: Record
StatItem[]> = {
+ rust: (s) => [{ label: 'Players', value: pl(s) }, { label: 'uMod', value: s.umod ?? '—' }, { label: 'Wipe', value: s.wipe ?? '—' }],
+ dune: (s) => [{ label: 'Players', value: pl(s) }, { label: 'Sietches', value: s.sietches ?? '—' }, { label: 'Control', value: s.control ?? '—' }],
+ conan: (s) => [{ label: 'Players', value: pl(s) }, { label: 'Clans', value: s.clans ?? '—' }, { label: 'Purge', value: s.purge ?? '—' }],
+ soulmask: (s) => [{ label: 'Players', value: pl(s) }, { label: 'Tribe', value: s.tribe ?? '—' }, { label: 'Mask', value: s.mask ?? '—' }],
+}
+
+export function buildStats(s: MockServer): StatItem[] {
+ const fn = GAME_FIELDS[s.game] ?? GAME_FIELDS.rust
+ return fn(s)
+}
+
+// ---------------------------------------------------------------------------
+// Live activity feed
+// ---------------------------------------------------------------------------
+
+export const MOCK_FEED: MockFeedLine[] = [
+ { time: '18:42:07', level: 'connect', who: 'ShadowFox', msg: 'connected — 89.142.0.7' },
+ { time: '18:41:55', level: 'cmd', who: 'admin', msg: 'oxide.grant group default kits.use' },
+ { time: '18:41:30', level: 'kill', who: 'ironMaiden', msg: 'was killed by Scorpion (AK-47, 84m)' },
+ { time: '18:40:12', level: 'warn', msg: '5x Modded agent reconnected — telemetry resuming' },
+ { time: '18:39:48', level: 'chat', who: 'BlightWalker:', msg: 'anyone selling sulfur?' },
+ { time: '18:38:02', level: 'info', msg: 'RaidableBases spawned Tier-3 at G14' },
+ { time: '18:36:51', level: 'connect', who: 'Vex', msg: 'connected — 51.83.12.4' },
+]
+
+// ---------------------------------------------------------------------------
+// Upcoming wipes
+// ---------------------------------------------------------------------------
+
+export const MOCK_WIPES: MockWipe[] = [
+ { game: 'rust', name: 'Main · 2x Vanilla', when: 'Thu · 18:00 UTC', tone: 'wiping', label: 'Map + BP' },
+ { game: 'rust', name: '5x Modded · Build', when: 'Thu · 18:00 UTC', tone: 'wiping', label: 'Map only' },
+ { game: 'dune', name: 'Deep Desert · PvP', when: 'Sun · 12:00 UTC', tone: 'starting', label: 'Deep Desert' },
+]