Files
Gardomatic/internal/web/templates/pages/admin.tmpl
T
kleiax 904d14b64c
CI / test (push) Canceled after 0s
Initial commit
2026-09-12 22:22:17 +02:00

121 lines
9.5 KiB
Cheetah

{{define "title"}}Administration{{end}}
{{define "main"}}
<header class='page-heading'><div><p class='eyebrow'>Administration</p><h2>Anwendung verwalten</h2></div></header>
<div class='settings-layout'>
{{template "settings_nav" (dict "Kind" "admin")}}
<div class='settings-content'>
{{with .ApplicationSettings}}
<section class='panel' id='lifecycle-settings'>
<h3>Pflanzenlebensdauer</h3>
<p>Ein- und zweijährige Pflanzen können am globalen Stichtag automatisch als entfernt markiert werden. Mehrjährige Pflanzen sowie Pflanzen ohne Pflanzdatum bleiben unverändert.</p>
<form method='POST' action='{{gardenAwarePath (webPath "admin.application-settings") $.Garden}}'>
<input type='hidden' name='csrf_token' value='{{$.CSRFToken}}'>
<label class='checkbox'><input type='checkbox' name='lifecycle_status_enabled' value='true' {{if .LifecycleStatusEnabled}}checked{{end}}> Automatische Statusänderung aktivieren</label>
<div class='form-grid'>
<label for='lifecycle-removal-day'>Tag<input id='lifecycle-removal-day' name='lifecycle_removal_day' type='number' min='1' max='31' value='{{.LifecycleRemovalDay}}' required></label>
<label for='lifecycle-removal-month'>Monat<select id='lifecycle-removal-month' name='lifecycle_removal_month'>{{range months}}<option value='{{.Value}}' {{if eqInt $.ApplicationSettings.LifecycleRemovalMonth .Value}}selected{{end}}>{{.Label}}</option>{{end}}</select></label>
</div>
<label for='lifecycle-timezone'>Zeitzone</label><input id='lifecycle-timezone' name='timezone' value='{{.Timezone}}' required>
<p class='muted'>Als Ausgangspunkt dient „Erworben oder gepflanzt am“. Offene Aufgaben und aktive Standortzuordnungen werden beim Entfernen ebenfalls beendet.</p>
<button type='submit'>Einstellungen speichern</button>
</form>
</section>
{{end}}
<section class='panel' id='mail-settings'>
<h3>Mailversand testen</h3>
<p>Sendet über die aktuell konfigurierte Versandart eine Testmail an eine beliebige gültige E-Mail-Adresse.</p>
<form method='POST' action='{{gardenAwarePath (webPath "admin.test-mail") .Garden}}'>
<input type='hidden' name='csrf_token' value='{{.CSRFToken}}'>
<label for='test-mail-address'>Empfängeradresse</label>
<input id='test-mail-address' name='email' type='email' autocomplete='email' required>
<button type='submit'>Testmail senden</button>
</form>
</section>
<section class='panel' id='environment-settings'>
<h3>Umgebungsvariablen</h3>
<p>Wirksame Konfigurationswerte der API und Webanwendung. Sensible Werte werden ausschließlich maskiert angezeigt.</p>
<div class='environment-list'>
{{range .EnvironmentVariables}}
<div class='environment-row'>
<span class='status'>{{.Component}}</span>
<code>{{.Name}}</code>
<code>{{if .Value}}{{.Value}}{{else}}(leer){{end}}</code>
</div>
{{else}}<p>Keine Umgebungsvariablen verfügbar.</p>{{end}}
</div>
</section>
<section class='panel' id='users-settings'>
<h3>Nutzer und Rechte</h3>
<p>Lade neue Nutzer per E-Mail ein und verwalte anschließend ihre anwendungsweiten Rollen.</p>
<form class='admin-user-invite' method='POST' action='{{gardenAwarePath (webPath "admin.user.invite") .Garden}}'>
<input type='hidden' name='csrf_token' value='{{.CSRFToken}}'>
<label for='invite-user-name'>Name<input id='invite-user-name' name='name' autocomplete='name' required></label>
<label for='invite-user-email'>E-Mail-Adresse<input id='invite-user-email' name='email' type='email' autocomplete='email' required></label>
<button type='submit'>Nutzer einladen</button>
</form>
{{range .AdminUsers}}{{$user := .}}<article class='member-row'><div><strong>{{.Name}}</strong><br><span>{{.Email}}</span></div>
{{if neInt .ID $.CurrentUser.ID}}<div class='admin-user-actions'><form method='POST' action='{{gardenAwarePath (webPath "admin.user.role" .ID) $.Garden}}'><input type='hidden' name='csrf_token' value='{{$.CSRFToken}}'><label for='role-{{.ID}}'>Rolle</label><select id='role-{{.ID}}' name='role'>{{range $.ApplicationRoles}}<option value='{{.Name}}' {{if eqString .Name $user.Role}}selected{{end}}>{{.Label}}</option>{{end}}</select><button>Speichern</button></form><details class='delete-user'><summary>Nutzer löschen</summary><form method='POST' action='{{gardenAwarePath (webPath "admin.user.delete" .ID) $.Garden}}'><input type='hidden' name='csrf_token' value='{{$.CSRFToken}}'><p>Kontodaten anonymisieren und alle Zugriffe entfernen?</p><button type='submit' class='danger'>Endgültig löschen</button></form></details></div>{{else}}<span class='status'>Eigenes Konto · {{.Role}}</span>{{end}}</article>{{else}}<p>Keine Nutzer vorhanden.</p>{{end}}
</section>
{{range .RoleEditors}}{{template "role_editor" .}}{{end}}
<section class='panel admin-categories' id='species-categories'>
<h3>Artenkategorien</h3>
<p>Kategorien stehen anschließend in allen Artenformularen zur Auswahl.</p>
{{range .SpeciesCategories}}
<article class='admin-category-row'>
<form method='POST' action='{{gardenAwarePath (webPath "admin.species-category.edit" .ID) $.Garden}}'>
<input type='hidden' name='csrf_token' value='{{$.CSRFToken}}'>
<label for='category-name-{{.ID}}'>Name</label><input id='category-name-{{.ID}}' name='name' value='{{.Name}}' required>
<label for='category-order-{{.ID}}'>Reihenfolge</label><input id='category-order-{{.ID}}' name='sort_order' type='number' value='{{.SortOrder}}'>
<label for='category-lifecycle-{{.ID}}'>Lebensdauer</label><select id='category-lifecycle-{{.ID}}' name='lifecycle'><option value=''>Nicht festgelegt</option><option value='annual' {{if eqString (stringValue .Lifecycle) "annual"}}selected{{end}}>Einjährig</option><option value='biennial' {{if eqString (stringValue .Lifecycle) "biennial"}}selected{{end}}>Zweijährig</option><option value='perennial' {{if eqString (stringValue .Lifecycle) "perennial"}}selected{{end}}>Mehrjährig</option></select>
<label class='checkbox'><input type='checkbox' name='active' value='true' {{if .Active}}checked{{end}}> Aktiv</label>
<button type='submit'>Speichern</button>
</form>
{{if .Active}}<form method='POST' action='{{gardenAwarePath (webPath "admin.species-category.delete" .ID) $.Garden}}'><input type='hidden' name='csrf_token' value='{{$.CSRFToken}}'><button type='submit' class='link-button danger-text'>Deaktivieren</button></form>{{end}}
</article>
{{else}}<p>Noch keine Kategorien vorhanden.</p>{{end}}
<form class='admin-category-create' method='POST' action='{{gardenAwarePath (webPath "admin.species-category.new") .Garden}}'>
<input type='hidden' name='csrf_token' value='{{.CSRFToken}}'>
<h4>Neue Kategorie</h4>
<label for='new-category-name'>Name</label><input id='new-category-name' name='name' required>
<label for='new-category-order'>Reihenfolge</label><input id='new-category-order' name='sort_order' type='number' value='0'>
<label for='new-category-lifecycle'>Lebensdauer</label><select id='new-category-lifecycle' name='lifecycle'><option value=''>Nicht festgelegt</option><option value='annual'>Einjährig</option><option value='biennial'>Zweijährig</option><option value='perennial'>Mehrjährig</option></select>
<button type='submit'>Kategorie anlegen</button>
</form>
</section>
<section class='panel admin-categories' id='task-priorities'>
<h3>Aufgabenprioritäten</h3>
<p>Diese Prioritäten werden einheitlich für Aufgaben und Aufgabenvorlagen verwendet.</p>
{{range .TaskPriorities}}
<article class='admin-category-row'>
<form method='POST' action='{{gardenAwarePath (webPath "admin.task-priority.edit" .ID) $.Garden}}'>
<input type='hidden' name='csrf_token' value='{{$.CSRFToken}}'>
<label for='priority-name-{{.ID}}'>Name</label><input id='priority-name-{{.ID}}' name='name' value='{{.Name}}' required>
<label for='priority-value-{{.ID}}'>Wert</label><input id='priority-value-{{.ID}}' name='value' type='number' min='-100' max='100' value='{{.Value}}'>
<label for='priority-order-{{.ID}}'>Reihenfolge</label><input id='priority-order-{{.ID}}' name='sort_order' type='number' value='{{.SortOrder}}'>
<label class='checkbox'><input type='checkbox' name='active' value='true' {{if .Active}}checked{{end}}> Aktiv</label>
<button type='submit'>Speichern</button>
</form>
{{if .Active}}<form method='POST' action='{{gardenAwarePath (webPath "admin.task-priority.delete" .ID) $.Garden}}'><input type='hidden' name='csrf_token' value='{{$.CSRFToken}}'><button type='submit' class='link-button danger-text'>Deaktivieren</button></form>{{end}}
</article>
{{else}}<p>Noch keine Prioritäten vorhanden.</p>{{end}}
<form class='admin-category-create' method='POST' action='{{gardenAwarePath (webPath "admin.task-priority.new") .Garden}}'>
<input type='hidden' name='csrf_token' value='{{.CSRFToken}}'>
<h4>Neue Priorität</h4>
<label for='new-priority-name'>Name</label><input id='new-priority-name' name='name' required>
<label for='new-priority-value'>Wert</label><input id='new-priority-value' name='value' type='number' min='-100' max='100' value='0'>
<label for='new-priority-order'>Reihenfolge</label><input id='new-priority-order' name='sort_order' type='number' value='0'>
<button type='submit'>Priorität anlegen</button>
</form>
</section>
</div>
</div>
{{end}}