{# Every asset is served by Steward itself: it runs with no outbound network (rule 164). #} {# A form with data-confirm="…" asks in #confirm-dialog below before it submits (#5314). #} {% block head %}{% endblock %}
{% set _p = request.path %}
{% if session.user_id is defined %} {% endif %}
{% if session.user_id is defined %}
Steward
{% endif %} {% if session.user_id and not session.tz %} {% endif %} {% if plugin_failures and session.user_role == 'admin' %}
⚠ {{ plugin_failures | length }} plugin{{ 's' if plugin_failures | length != 1 }} failed to load. View details →
{% endif %} {% if undecryptable_secrets and session.user_role == 'admin' %} {% set _sec_tab = { 'smtp.password': '/settings/notifications/', 'oidc.client_secret': '/settings/auth/', 'ldap.bind_password': '/settings/auth/', 'ansible.ssh_private_key': '/settings/ansible/', 'ansible.become_password': '/settings/ansible/', 'ansible.vault_password': '/settings/ansible/', } %}
⚠ {{ undecryptable_secrets | length }} stored secret{{ 's' if undecryptable_secrets | length != 1 }} can’t be decrypted — the app secret key changed, so {{ 'they' if undecryptable_secrets | length != 1 else 'it' }} must be re-entered: {% for k in undecryptable_secrets -%} {%- if _sec_tab.get(k) %}{{ k }} {%- else %}{{ k }}{% endif %}{% if not loop.last %}, {% endif %} {%- endfor %}.
{% endif %} {% if error %}
{{ error }}
{% endif %} {#- A section's tabs sit above its trail, so they hold still from page to page. #} {% block section_tabs %}{% endblock %} {% block breadcrumb %}{% endblock %} {% block content %}{% endblock %}
{# .app-main #}
{# .app-shell #} {% if session.user_id is defined %} {% endif %} {# Steward's own confirm dialog (#5314): static/confirm.js fills it from the data-confirm attributes of the form being submitted. Cancel has the focus. #}

{% block extra_scripts %}{% endblock %}