Revert "Submit GUI commands without page navigation"

This reverts commit 0da5377ff2.
This commit is contained in:
2026-08-03 02:18:37 +02:00
parent 0da5377ff2
commit b6030860db
9 changed files with 37 additions and 346 deletions
+7 -35
View File
@@ -1,4 +1,3 @@
import hashlib
import html
import urllib.parse
from pathlib import Path
@@ -20,13 +19,6 @@ def read_static_file(name):
return path.read_bytes()
def static_asset_version(name):
payload = read_static_file(name)
if payload is None:
return "missing"
return hashlib.sha256(payload).hexdigest()[:12]
def action_visual(action, lang):
# Keep GUI visuals tied to action semantics, not to local camera names. New
# action families can add another name_key/kind branch without changing MQTT
@@ -239,39 +231,31 @@ def render_action_control(action, lang, token_query):
if action.auto_off_seconds > 0:
if action.auto_off_at:
timer_markup = (
f'<span class="timer" data-timer data-auto-off-at="{int(action.auto_off_at)}" '
f'data-idle-label="{html.escape(text_for(lang, "timer.auto_off_configured", seconds=action.auto_off_seconds))}" '
f'<span class="timer" data-auto-off-at="{int(action.auto_off_at)}" '
f'data-prefix="{html.escape(text_for(lang, "timer.auto_off"))}" '
f'data-expired-label="{html.escape(text_for(lang, "timer.expired"))}">'
f'{html.escape(text_for(lang, "timer.auto_off"))}</span>'
)
else:
timer_markup = (
f'<span class="timer timer-idle" data-timer '
f'data-idle-label="{html.escape(text_for(lang, "timer.auto_off_configured", seconds=action.auto_off_seconds))}" '
f'data-prefix="{html.escape(text_for(lang, "timer.auto_off"))}" '
f'data-expired-label="{html.escape(text_for(lang, "timer.expired"))}">'
f'<span class="timer timer-idle">'
f'{html.escape(text_for(lang, "timer.auto_off_configured", seconds=action.auto_off_seconds))}'
"</span>"
)
return (
f'<section class="action-control" data-action-id="{html.escape(action.id)}">'
'<section class="action-control">'
'<div class="control-head">'
f"{visual_markup(action, lang)}"
f"<h3>{html.escape(display_name)}</h3>"
"</div>"
'<div class="meta-row">'
f'<span class="chip">{html.escape(platform_label)}</span>'
f'<span class="chip chip-state chip-state-{html.escape(state_value)}" data-state-chip '
f'data-label-on="{html.escape(text_for(lang, "state.on"))}" '
f'data-label-off="{html.escape(text_for(lang, "state.off"))}" '
f'data-label-unknown="{html.escape(text_for(lang, "state.unknown"))}">'
f'<span class="chip chip-state chip-state-{html.escape(state_value)}">'
f"{html.escape(state_label)}</span>"
"</div>"
f"{timer_markup}"
f'<div class="command-row">{render_action_buttons(action, lang, token_query)}</div>'
'<span class="action-status" data-action-status role="status" aria-live="polite"></span>'
f'<code class="action-id">{html.escape(action.id)}</code>'
"</section>"
)
@@ -297,7 +281,7 @@ def render_group_card(group, lang, token_query):
def render_global_action(action, lang, token_query):
return (
f'<article class="global-action" data-action-id="{html.escape(action.id)}">'
'<article class="global-action">'
'<div class="global-main">'
f"{visual_markup(action, lang)}"
'<div>'
@@ -305,10 +289,7 @@ def render_global_action(action, lang, token_query):
f'<code class="action-id">{html.escape(action.id)}</code>'
"</div>"
"</div>"
'<div class="global-controls-wrap">'
f'<div class="global-controls">{render_action_buttons(action, lang, token_query)}</div>'
'<span class="action-status" data-action-status role="status" aria-live="polite"></span>'
"</div>"
"</article>"
)
@@ -327,23 +308,16 @@ def render_action_buttons(action, lang, token_query):
' data-requires-ack="true"'
f' data-ack-message="{html.escape(text_for(lang, "ack.siren_on"))}"'
)
common_attrs = (
f' data-working-label="{html.escape(text_for(lang, "action.working"))}"'
f' data-success-label="{html.escape(text_for(lang, "action.success"))}"'
f' data-failed-label="{html.escape(text_for(lang, "action.failed_generic"))}"'
)
disabled_attrs = ""
disabled_label = text_for(lang, "button.on_blocked_timer")
if command == "on":
common_attrs += f' data-disabled-label="{html.escape(disabled_label)}"'
if command == "on" and getattr(action, "auto_off_at", None):
disabled_label = text_for(lang, "button.on_blocked_timer")
disabled_attrs = (
" disabled"
f' title="{html.escape(disabled_label)}"'
f' aria-label="{html.escape(disabled_label)}"'
)
buttons.append(
f'<form class="command-form" method="post" action="{html.escape(action_url)}"{ack_attrs}{common_attrs}>'
f'<form class="command-form" method="post" action="{html.escape(action_url)}"{ack_attrs}>'
f'<button class="cmd cmd-{html.escape(command)}" type="submit"{disabled_attrs}>'
f"<span>{html.escape(label)}</span>"
"</button></form>"
@@ -403,8 +377,6 @@ def render_page(actions, lang, token_param=None):
language_options=render_language_options(lang),
token_input=token_input,
token_query=html.escape(token_query),
css_version=html.escape(static_asset_version("app.css")),
js_version=html.escape(static_asset_version("app.js")),
global_actions=global_markup,
grid_class=html.escape(grid_class),
cards=cards_markup,