Vendors HTMX 2.0.4 (the prior file was a 1-line stub) and uses it to poll two new partials on a 2s tick while a job is in flight: - /servers/<id>/actions → state badge, filtered action buttons, last-job sentence, live job log (SSE) while a Start/Stop/Reset job is running. When the job is terminal the partial re-renders without hx-trigger and polling stops. - /overlays/<id>/build-status → build state badge, last-build sentence, live job log while a build_overlay job is running. Same terminal-state stop behavior. Server detail restructure: - Editable name moves out of the page body into a Rename modal triggered from a link next to Delete in the page footer. - Compact dl with Port (linked as steam://run/550//+connect <host>:<port>) and Blueprint. - Actions row: state badge + state-filtered buttons (start/stop, reset) + last-job sentence. Drift warning when desired ≠ actual. - Recent Jobs table removed. Overlay detail restructure: - Single panel, dl Type/Scope, no separate Last build row, no Builds section. - Script form gets two compound submits: "Save and build" and "Save, reset and rebuild". Standalone Rebuild/Wipe gone. - Build status state badge + last-build sentence under the editor; action buttons hide while a build is in flight. - Rename modal in the page footer next to Delete. sse.js binds on htmx:load (covers initial document and post-swap inserts) and closes EventSources on htmx:beforeCleanupElement to avoid leaking streams across swaps. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
75 lines
3.2 KiB
HTML
75 lines
3.2 KiB
HTML
{% extends "base.html" %}
|
|
|
|
{% block title %}Server {{ server.name }} | left4me{% endblock %}
|
|
|
|
{% block content %}
|
|
<section class="panel">
|
|
<div class="page-heading">
|
|
<h1>Server: {{ server.name }}</h1>
|
|
</div>
|
|
|
|
<dl class="server-info">
|
|
<div><dt>Port</dt><dd><a href="steam://run/550//+connect%20{{ connect_host }}:{{ server.port }}">{{ server.port }}</a></dd></div>
|
|
<div><dt>Blueprint</dt><dd>{% if blueprint %}<a href="/blueprints/{{ blueprint.id }}">{{ blueprint.name }}</a>{% endif %}</dd></div>
|
|
</dl>
|
|
|
|
<h2 class="section-title">Actions</h2>
|
|
{% include "_server_actions.html" %}
|
|
|
|
<h2 class="section-title">Server Log</h2>
|
|
<pre class="log-stream" data-sse-url="/servers/{{ server.id }}/logs/stream"></pre>
|
|
</section>
|
|
|
|
<div class="page-footer-actions">
|
|
<button type="button" class="danger-outline" data-modal-open="delete-server-modal">Delete server</button>
|
|
<a href="#" class="link-button" data-modal-open="rename-server-modal">Rename</a>
|
|
</div>
|
|
|
|
<dialog id="rename-server-modal" class="modal" aria-labelledby="rename-server-title">
|
|
<div class="modal-header">
|
|
<h2 id="rename-server-title">Rename server</h2>
|
|
<button type="button" class="modal-close" data-modal-close aria-label="Close">×</button>
|
|
</div>
|
|
<div class="modal-body">
|
|
<form method="post" action="/servers/{{ server.id }}" class="inline-save">
|
|
<input type="hidden" name="csrf_token" value="{{ session.get('csrf_token', '') }}">
|
|
<input name="name" value="{{ server.name }}" required autofocus>
|
|
<button type="submit">Save</button>
|
|
</form>
|
|
</div>
|
|
</dialog>
|
|
|
|
<dialog id="reset-server-modal" class="modal" aria-labelledby="reset-server-title">
|
|
<div class="modal-header">
|
|
<h2 id="reset-server-title">Reset server "{{ server.name }}"?</h2>
|
|
<button type="button" class="modal-close" data-modal-close aria-label="Close">×</button>
|
|
</div>
|
|
<div class="modal-body">
|
|
<p>This stops the server and wipes its runtime state (logs, caches, accumulated game state). The blueprint association is preserved; the next start rebuilds from the current blueprint.</p>
|
|
</div>
|
|
<div class="modal-footer">
|
|
<button type="button" class="button-secondary" data-modal-close>Cancel</button>
|
|
<form method="post" action="/servers/{{ server.id }}/reset" class="inline-form">
|
|
<input type="hidden" name="csrf_token" value="{{ session.get('csrf_token', '') }}">
|
|
<button class="danger" type="submit">Reset</button>
|
|
</form>
|
|
</div>
|
|
</dialog>
|
|
|
|
<dialog id="delete-server-modal" class="modal" aria-labelledby="delete-server-title">
|
|
<div class="modal-header">
|
|
<h2 id="delete-server-title">Delete server "{{ server.name }}"?</h2>
|
|
<button type="button" class="modal-close" data-modal-close aria-label="Close">×</button>
|
|
</div>
|
|
<div class="modal-body">
|
|
<p>This stops the server and tears down its runtime files. This cannot be undone.</p>
|
|
</div>
|
|
<div class="modal-footer">
|
|
<button type="button" class="button-secondary" data-modal-close>Cancel</button>
|
|
<form method="post" action="/servers/{{ server.id }}/delete" class="inline-form">
|
|
<input type="hidden" name="csrf_token" value="{{ session.get('csrf_token', '') }}">
|
|
<button class="danger" type="submit">Delete</button>
|
|
</form>
|
|
</div>
|
|
</dialog>
|
|
{% endblock %}
|