139 lines
6.6 KiB
HTML
139 lines
6.6 KiB
HTML
{% extends "tesm_core/base.html" %}
|
|
{% from "tesm_core/macros.html" import field, select_field, checkbox, alert, nav_order_card %}
|
|
|
|
{% block page_title %}Systemeinstellungen{% endblock %}
|
|
{% block page_sub %}Portal, Self-Service, Protokolle, Host{% endblock %}
|
|
|
|
{% block content %}
|
|
{% if not sysops_available %}
|
|
{{ alert('Systemhelfer nicht verfügbar -- Hostname und Zeitzone können hier nur angezeigt,
|
|
nicht geändert werden.', 'info') }}
|
|
{% endif %}
|
|
|
|
<div class="grid grid--split">
|
|
<div class="stack">
|
|
<section class="card">
|
|
<div class="card__header">
|
|
<div class="flex-1">
|
|
<div class="card__title">{{ icon('users', size=17) }} Kundenportal und Self-Service</div>
|
|
<div class="card__sub">Zwei unabhängige Zeitfenster: Link und Sitzung</div>
|
|
</div>
|
|
</div>
|
|
<form method="post" action="{{ url_for('settings.system_save') }}">
|
|
<input type="hidden" name="{{ csrf_field_name }}" value="{{ csrf_token() }}">
|
|
<div class="card__body stack">
|
|
{{ checkbox('portal_enabled', 'Kundenportal aktiv', checked=values.portal_enabled) }}
|
|
<div class="form-grid">
|
|
{{ field('portal_link_minutes', 'Zugangslink gültig (Minuten)',
|
|
value=values.portal_link_minutes, type='number',
|
|
hint_text=specs['portal_link_minutes'].hint) }}
|
|
{{ field('portal_session_minutes', 'Portalsitzung gültig (Minuten)',
|
|
value=values.portal_session_minutes, type='number',
|
|
hint_text=specs['portal_session_minutes'].hint) }}
|
|
</div>
|
|
<div class="divider"></div>
|
|
{{ checkbox('self_service_enabled', 'Self-Service-Link je Ticket aktiv',
|
|
checked=values.self_service_enabled,
|
|
hint_text=specs['self_service_enabled'].hint) }}
|
|
{{ checkbox('allow_customer_revoke', 'Kunden dürfen ihre Lizenz selbst freigeben',
|
|
checked=values.allow_customer_revoke,
|
|
hint_text=specs['allow_customer_revoke'].hint) }}
|
|
</div>
|
|
<div class="card__footer"><button class="btn btn--primary" type="submit">Speichern</button></div>
|
|
</form>
|
|
</section>
|
|
|
|
<section class="card">
|
|
<div class="card__header">
|
|
<div class="flex-1">
|
|
<div class="card__title">{{ icon('ticket', size=17) }} Vorgaben und Protokolle</div>
|
|
</div>
|
|
</div>
|
|
<form method="post" action="{{ url_for('settings.system_save') }}">
|
|
<input type="hidden" name="{{ csrf_field_name }}" value="{{ csrf_token() }}">
|
|
<div class="card__body">
|
|
<div class="form-grid">
|
|
{{ field('default_valid_days', 'Vorgeschlagene Laufzeit neuer Tickets (Tage)',
|
|
value=values.default_valid_days, type='number') }}
|
|
{{ select_field('log_rotate_interval', 'Rotationsintervall',
|
|
specs['log_rotate_interval'].choices,
|
|
selected=values.log_rotate_interval) }}
|
|
{{ field('log_rotate_keep', 'Aufbewahrte Rotationen', value=values.log_rotate_keep,
|
|
type='number') }}
|
|
{{ field('trash_retention_days', 'Papierkorb-Aufbewahrung (Tage)',
|
|
value=values.trash_retention_days, type='number') }}
|
|
</div>
|
|
</div>
|
|
<div class="card__footer"><button class="btn btn--primary" type="submit">Speichern</button></div>
|
|
</form>
|
|
</section>
|
|
</div>
|
|
|
|
<div class="stack">
|
|
{# Eigene Karte: die Abmeldung stand zwischen Protokollrotation und
|
|
Papierkorb -- drei Dinge ohne Zusammenhang. Wer die Sitzungsdauer sucht,
|
|
sucht sie nicht unter "Protokolle". #}
|
|
<section class="card">
|
|
<div class="card__header">
|
|
<div class="flex-1">
|
|
<div class="card__title">{{ icon('clock', size=17) }} Sitzungen</div>
|
|
<div class="card__sub">Wie lange eine Anmeldung gilt</div>
|
|
</div>
|
|
</div>
|
|
<form method="post" action="{{ url_for('settings.system_save') }}">
|
|
<input type="hidden" name="{{ csrf_field_name }}" value="{{ csrf_token() }}">
|
|
<div class="card__body">
|
|
<div class="form-grid">
|
|
{{ field('session_idle_minutes', 'Automatische Abmeldung nach Leerlauf (Minuten)',
|
|
value=values.session_idle_minutes, type='number',
|
|
attrs='min="5" max="1440" step="1"',
|
|
hint_text=specs['session_idle_minutes'].hint) }}
|
|
{{ field('session_absolute_hours', 'Längstmögliche Sitzungsdauer (Stunden)',
|
|
value=values.session_absolute_hours, type='number',
|
|
attrs='min="1" max="168" step="1"',
|
|
hint_text=specs['session_absolute_hours'].hint) }}
|
|
</div>
|
|
</div>
|
|
<div class="card__footer"><button class="btn btn--primary" type="submit">Speichern</button></div>
|
|
</form>
|
|
</section>
|
|
|
|
<section class="card">
|
|
<div class="card__header">
|
|
<div class="flex-1"><div class="card__title">{{ icon('server', size=17) }} Host</div></div>
|
|
</div>
|
|
<div class="card__body stack">
|
|
<form method="post" action="{{ url_for('settings.set_hostname') }}" class="stack stack--tight">
|
|
<input type="hidden" name="{{ csrf_field_name }}" value="{{ csrf_token() }}">
|
|
{{ field('hostname', 'Hostname', value=hostname, disabled=not sysops_available) }}
|
|
<button class="btn btn--sm" type="submit" {% if not sysops_available %}disabled{% endif %}>
|
|
Hostname setzen
|
|
</button>
|
|
</form>
|
|
<div class="divider"></div>
|
|
<form method="post" action="{{ url_for('settings.set_timezone') }}" class="stack stack--tight">
|
|
<input type="hidden" name="{{ csrf_field_name }}" value="{{ csrf_token() }}">
|
|
<label class="field">
|
|
<span class="field__label">Zeitzone</span>
|
|
<select class="select" name="timezone" {% if not sysops_available %}disabled{% endif %}>
|
|
{% for zone in timezones %}
|
|
<option value="{{ zone }}" {% if zone == timezone %}selected{% endif %}>{{ zone }}</option>
|
|
{% endfor %}
|
|
</select>
|
|
</label>
|
|
<button class="btn btn--sm" type="submit" {% if not sysops_available %}disabled{% endif %}>
|
|
Zeitzone setzen
|
|
</button>
|
|
</form>
|
|
</div>
|
|
</section>
|
|
|
|
{% if current_user.is_admin %}
|
|
{{ nav_order_card(nav_items, nav_order, nav_child_order,
|
|
url_for('admin.nav_order'), csrf_field_name, csrf_token(),
|
|
sub='Gilt für alle Benutzer') }}
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
{% endblock %}
|