Landscape orientation, redesigned web UI, rotation on/off + minutes, weather by city name
- Panel is mounted sideways: render landscape (600x400), rotate to the panel's native portrait orientation right before writing to hardware. - Web UI: card-based layout, dark mode, active nav highlighting, save confirmation toasts, error banners. - Rotation: separate enabled/disabled toggle (off pins to the first screen in the list) and the interval is now in minutes instead of raw seconds. Migrates existing config.json from the old interval_seconds field. - Weather: type a city name instead of hunting down coordinates, resolved via Open-Meteo's free geocoding API. Manual lat/long still available as a fallback.
This commit is contained in:
1 parent
7c197e20a5
commit
61348be674
11 files changed
+393
-104
No files matched your search
+33
-17
@@ -2,24 +2,40 @@
|
||||
{% block content %}
|
||||
<h1>Status</h1>
|
||||
|
||||
<img class="preview" src="{{ url_for('static', filename='preview.png') }}?t={{ status.last_render_at }}" alt="preview">
|
||||
|
||||
<div class="status-grid">
|
||||
<div>Current screen</div><div>{{ status.current_screen or "-" }}</div>
|
||||
<div>Last render</div><div>{{ status.last_render_at or "-" }}</div>
|
||||
<div>Last panel write</div><div>{{ status.last_display_write_at or "-" }}</div>
|
||||
<div>Navidrome priority</div><div>{{ "on" if navidrome_priority else "off" }}</div>
|
||||
<div>Rotation</div><div>{{ rotation.screens | join(" → ") }} (every {{ rotation.interval_seconds }}s)</div>
|
||||
<div class="card">
|
||||
<div class="section-label">Preview</div>
|
||||
<div class="preview-wrap">
|
||||
<img class="preview" src="{{ url_for('static', filename='preview.png') }}?t={{ status.last_render_at }}" alt="preview">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="actions">
|
||||
<form class="inline" method="post" action="{{ url_for('refresh_now') }}">
|
||||
<button type="submit">Refresh now</button>
|
||||
</form>
|
||||
{% for screen_id, screen in screens.items() %}
|
||||
<form class="inline" method="post" action="{{ url_for('switch_now', screen_id=screen_id) }}">
|
||||
<button class="secondary" type="submit">Show {{ screen.display_name }}</button>
|
||||
</form>
|
||||
{% endfor %}
|
||||
<div class="card">
|
||||
<div class="section-label">Overview</div>
|
||||
<dl class="status-grid">
|
||||
<dt>Current screen</dt><dd>{{ status.current_screen or "-" }}</dd>
|
||||
<dt>Last render</dt><dd>{{ status.last_render_at or "-" }}</dd>
|
||||
<dt>Last panel write</dt><dd>{{ status.last_display_write_at or "-" }}</dd>
|
||||
<dt>Navidrome priority</dt>
|
||||
<dd><span class="badge {{ 'on' if navidrome_priority else 'off' }}">{{ "on" if navidrome_priority else "off" }}</span></dd>
|
||||
<dt>Rotation</dt>
|
||||
<dd>
|
||||
<span class="badge {{ 'on' if rotation.enabled else 'off' }}">{{ "on" if rotation.enabled else "off" }}</span>
|
||||
{{ rotation.screens | join(" → ") }} (every {{ rotation.interval_minutes }} min)
|
||||
</dd>
|
||||
</dl>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<div class="section-label">Actions</div>
|
||||
<div class="actions">
|
||||
<form class="inline" method="post" action="{{ url_for('refresh_now') }}">
|
||||
<button type="submit">Refresh now</button>
|
||||
</form>
|
||||
{% for screen_id, screen in screens.items() %}
|
||||
<form class="inline" method="post" action="{{ url_for('switch_now', screen_id=screen_id) }}">
|
||||
<button class="secondary" type="submit">Show {{ screen.display_name }}</button>
|
||||
</form>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
Reference in new issue
Block a user