{% extends "base.html" %} {% block title %}{{ t('accounts.title') }} — painfree{% endblock %} {% block body %}

{{ t('accounts.heading') }}

{{ t('accounts.lede') }}

{% if auth_mode != 'basic' %}

{{ t('accounts.other_mode') }}

{% endif %} {# Under a provider, every password here is a credential sign-in refuses. The page already said a new one could not sign in; these already cannot, and saying which is the difference between a warning and a fact. #} {% if inert %}
{{ t('accounts.inert_heading', count=inert | length) }}

{{ t('accounts.inert_body') }}

{% for subject in inert %}{{ subject }} {% endfor %}

{% endif %}

{{ t('accounts.list_heading') }}

{% if accounts %} {# One row per account, and the levers behind a disclosure. Four live forms per account put `Delete` permanently on screen beside `Set password`; a `
` is a real button for a keyboard and needs no script. #} {% for row in accounts %} {# The subject is the key every grant names. It is an identifier: never translated, never reformatted. #} {% endfor %}
{{ t('accounts.account') }}{{ t('api.role') }} {{ t('accounts.password_set') }}{{ t('accounts.status') }}
{{ row.display_name or '—' }}
{{ row.subject }}
{{ row.role.value }} {{ row.password_changed_at | moment }} {% if row.disabled %}{{ t('accounts.suspended') }} {% else %}{{ t('accounts.active') }}{% endif %}
{{ t('accounts.manage') }}
{# A password field with no username beside it is a field a password manager files under the wrong account, and Chrome says so in the console. The view ignores it: the subject is in the path. #}
{# The two that stop somebody signing in, separated from the two that do not, with the reversible one named as reversible. #}
{{ t('accounts.stops_sign_in') }}
{{ t('accounts.delete') }}
{% else %}

{{ t('accounts.none') }}

{% endif %}
{# Under a provider the form is gone rather than disabled: an account made here would be stored, real, and refused at sign-in, because this process accepts one kind of credential and this is not it. The CLI stays open for a deployment preparing to move off the provider. #} {% if auth_mode == 'oidc' %}
{{ t('accounts.provider_owns_these') }}

{{ t('accounts.provider_owns_these_body') }}

{% else %}

{{ t('accounts.add_heading') }}

{% endif %}

{{ t('accounts.lockouts_heading') }}

{{ t('accounts.lockouts_why') }}

{% if lockouts %} {% for row in lockouts %} {% endfor %}
{{ t('accounts.lockout_scope') }}{{ t('accounts.lockout_value') }} {{ t('accounts.failures') }}{{ t('accounts.locked_until') }}
{% if row.scope == 'subject' %}{{ t('accounts.scope_subject') }} {% else %}{{ t('accounts.scope_source') }}{% endif %} {{ row.value }} {{ row.failures }} {% if row.locked() %}{{ row.locked_until | moment }}{% else %}—{% endif %}
{% else %}

{{ t('accounts.no_lockouts') }}

{% endif %}
{% endblock %}