Revert "Submit GUI commands without page navigation"
This reverts commit 0da5377ff2.
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user