Initial commit
CI / test (push) Canceled after 0s

This commit is contained in:
2026-09-12 22:22:17 +02:00
commit 904d14b64c
314 changed files with 31884 additions and 0 deletions
@@ -0,0 +1,56 @@
{{define "title"}}Garten bearbeiten{{end}}
{{define "main"}}
{{$garden := .Garden}}{{$current := .CurrentUser}}{{$forms := .Form}}
<header class='page-heading'><div><p class='eyebrow'>Garten</p><h2>Garten bearbeiten</h2></div></header>
<div class='settings-layout'>
<aside class='settings-sidebar panel'><nav aria-label='Bearbeitungsbereiche'>
{{if canGarden $garden "garden:update"}}<a href='#garden-general'>Allgemein</a>{{end}}
<a href='#garden-members'>Mitglieder</a>
{{if canGarden $garden "members:write"}}<a href='#garden-invites'>Einladungen</a>{{end}}
{{if canGarden $garden "garden:delete"}}<a href='#garden-role-editor'>Rollen</a><a href='#garden-delete'>Garten löschen</a>{{end}}
</nav></aside>
<div class='settings-content'>
{{if canGarden $garden "garden:update"}}
<section class='panel' id='garden-general'>
<h3>Allgemein</h3>
{{$form := $forms.Garden}}
<form method='POST' action='{{webPath "garden.edit" $garden.ID}}'>{{template "garden_fields" (dict "Form" $form "CSRFToken" .CSRFToken "Images" $.Images "GardenID" $garden.ID)}}<div class='actions'><button type='submit'>Speichern</button><a href='{{webPath "plants" $garden.ID}}'>Abbrechen</a></div></form>
</section>
{{end}}
<section class='panel member-list' id='garden-members'>
<h3>Mitglieder</h3>
{{range .Members}}{{$member := .}}
<article class='member-row'><div><strong>{{.Name}}</strong><br><span>{{.Email}} · {{.Role}}</span></div>
{{if and (canGarden $garden "members:write") (neInt .UserID $current.ID) (neString .Role "owner")}}
<div class='actions'>
<form method='POST' action='{{webPath "garden.member.role" $garden.ID .UserID}}'><input type='hidden' name='csrf_token' value='{{$.CSRFToken}}'><select name='role'>{{range $.GardenRoles}}{{if neString .Name "owner"}}<option value='{{.Name}}' {{if eqString .Name $member.Role}}selected{{end}}>{{.Label}}</option>{{end}}{{end}}</select><button>Rolle speichern</button></form>
<form method='POST' action='{{webPath "garden.member.delete" $garden.ID .UserID}}'><input type='hidden' name='csrf_token' value='{{$.CSRFToken}}'><button class='danger'>Entfernen</button></form>
{{if and (canGarden $garden "garden:delete") (neInt .UserID $current.ID)}}<form method='POST' action='{{webPath "garden.member.transfer" $garden.ID .UserID}}'><input type='hidden' name='csrf_token' value='{{$.CSRFToken}}'><button class='secondary'>Eigentum übertragen</button></form>{{end}}
</div>{{end}}
</article>{{else}}<p>Keine Mitglieder vorhanden.</p>{{end}}
</section>
{{if canGarden $garden "members:write"}}
<section class='panel' id='garden-invites'><h3>Mitglied einladen</h3>{{$invite := $forms.Invite}}<form method='POST' action='{{webPath "garden.invite.new" $garden.ID}}'><input type='hidden' name='csrf_token' value='{{.CSRFToken}}'><label for='email'>E-Mail-Adresse</label><input id='email' name='email' type='email' value='{{$invite.Email}}' required>{{with index $invite.Errors "email"}}<p class='field-error'>{{.}}</p>{{end}}<label for='role'>Rolle</label><select id='role' name='role'>{{range .GardenRoles}}{{if neString .Name "owner"}}<option value='{{.Name}}' {{if eqString .Name $invite.Role}}selected{{end}}>{{.Label}}</option>{{end}}{{end}}</select>{{with index $invite.Errors "role"}}<p class='field-error'>{{.}}</p>{{end}}<button>Einladung senden</button></form></section>
<section class='panel'><h3>Offene Einladungen</h3>{{range .Invites}}<div class='member-row'><span>{{.Email}} · {{.Role}} · bis {{humanDate .ExpiresAt}}</span><form method='POST' action='{{webPath "garden.invite.delete" $garden.ID .ID}}'><input type='hidden' name='csrf_token' value='{{$.CSRFToken}}'><button class='link-button danger-text'>Widerrufen</button></form></div>{{else}}<p>Keine offenen Einladungen.</p>{{end}}</section>
{{end}}
{{if canGarden $garden "garden:delete"}}{{range .RoleEditors}}{{template "role_editor" .}}{{end}}{{end}}
{{if canGarden $garden "garden:delete"}}
<section class='panel danger-panel' id='garden-delete'>
<div><h3>Garten löschen</h3><p>Der Garten und alle zugehörigen Inhalte werden dauerhaft gelöscht. Diese Aktion kann nicht rückgängig gemacht werden.</p></div>
<button type='button' class='danger' aria-haspopup='dialog' aria-controls='delete-garden-dialog' data-open-dialog='delete-garden-dialog'>Garten löschen</button>
</section>
<dialog id='delete-garden-dialog' class='confirm-dialog' aria-labelledby='delete-garden-title'>
<form method='POST' action='{{webPath "garden.delete" $garden.ID}}'>
<input type='hidden' name='csrf_token' value='{{.CSRFToken}}'>
<h3 id='delete-garden-title'>„{{$garden.Name}}“ wirklich löschen?</h3>
<p>Alle Pflanzen, Orte, Aufgaben, Tagebucheinträge und Mitgliedschaften dieses Gartens werden unwiderruflich gelöscht.</p>
<div class='actions'><button type='button' class='secondary' data-cancel-dialog>Abbrechen</button><button type='submit' class='danger'>Endgültig löschen</button></div>
</form>
</dialog>
{{end}}
</div></div>
{{end}}