benutzer bearbeiten

This commit is contained in:
Simon Martens
2025-05-23 19:27:08 +02:00
parent c44467f229
commit 4bd289669d
13 changed files with 498 additions and 34 deletions

File diff suppressed because one or more lines are too long

View File

@@ -2,29 +2,32 @@
<footer
class="container-normal pb-1.5 text-base text-gray-800 relative"
x-data="{ openusermenu: false }">
<div class="" x-show="openusermenu">
<div
class="absolute right-0 bottom-10 bg-white border border-gray-300 rounded-md shadow mt-2
{{- if .request.user -}}
<div class="" x-show="openusermenu">
<div
class="absolute right-0 bottom-10 bg-white border-gray-300 rounded-md shadow mt-2
[&>a]:no-underline [&>a]:text-gray-700 [&>a]:hover:bg-gray-100 [&>a]:hover:text-gray-900
[&>a]:block [&>a]:px-3 [&>a]:py-2 [&>a]:text-sm [&>a]:rounded-md [&>a]:w-full [&>a]:text-left
[&>a]:block [&>a]:px-3 [&>a]:py-2 [&>a]:text-sm [&>a]:w-full [&>a]:text-left
[&>a]:whitespace-nowrap [&>a]:transition-all [&>a]:duration-200 [&>a]:border-b
[&>a]:last:border-b-0">
<a href="/user/edit" class="">
<i class="ri-user-3-line"></i>
Profil bearbeiten
</a>
{{ if and .request.user (eq .request.user.Role "Admin") }}
<a href="/user/management/access/User?redirectTo={{ .request.fullpath }}" class="">
<i class="ri-group-3-line"></i>
Benutzer einladen
<a href="/user/{{ .request.user.Id }}/edit?redirectTo={{ .request.fullpath }}" class="">
<i class="ri-user-3-line"></i>
Profil bearbeiten
</a>
{{ end }}
<a href="/logout?redirectTo={{ .request.fullpath }}" class="">
<i class="ri-logout-box-line"></i>
Ausloggen
</a>
{{ if and .request.user (eq .request.user.Role "Admin") }}
<a href="/user/management/access/User?redirectTo={{ .request.fullpath }}" class="">
<i class="ri-group-3-line"></i>
Benutzer einladen
</a>
{{ end }}
<a href="/logout?redirectTo={{ .request.fullpath }}" class="">
<i class="ri-logout-box-line"></i>
Ausloggen
</a>
</div>
</div>
</div>
{{- end -}}
<div class="mt-12 pt-3 flex flex-row justify-between">
<div>
@@ -45,7 +48,9 @@
<a href="https://github.com/Theodor-Springmann-Stiftung/musenalm">Code</a>
<span>&middot;</span>
{{ if .request.user }}
<button class="inline-block cursor-pointer" @click="openusermenu = !openusermenu">
<button
class="inline-block cursor-pointer hover:shadow-lg hover:bg-gray-100 px-1"
@click="openusermenu = !openusermenu">
<i class="ri-user-3-line"></i>
{{ if .request.user.Name }}
<b>{{ .request.user.Name }}</b>

View File

@@ -0,0 +1,210 @@
{{ $model := . }}
<div class="flex max-w-lg mx-auto !pt-44">
<div class="flex-col w-full">
{{ if $model.redirect_url }}
<a href="{{ $model.redirect_url }}" class="text-gray-700 hover:text-slate-950">
<i class="ri-arrow-left-s-line"></i> Zurück
</a>
{{ else }}
<a href="/" class="text-gray-700 hover:text-slate-950">
<i class="ri-arrow-left-s-line"></i> Startseite
</a>
{{ end }}
<h1 class="text-2xl self-baseline w-full my-6 font-bold">Benutzer bearbeiten</h1>
{{ if $model.success }}
<div
class="text-green-800 text-sm mt-2 rounded bg-green-200 p-2 font-bold border-green-700
border-2 mb-3">
{{ $model.success }}
</div>
{{ end }}
{{ if $model.error }}
<div
class="text-red-800 text-sm mt-2 rounded bg-red-200 p-2 font-bold border-red-700
border-2 mb-3">
{{ $model.error }}
</div>
{{ end }}
<form class="w-full grid grid-cols-3 gap-4" method="POST" x-data="{ openpw: false }">
<div
class="col-span-3 border-2 border-transparent focus-within:border-slate-600 px-2 py-1 pb-1.5
bg-slate-200 focus-within:bg-slate-50 rounded-md transition-all duration-100">
<label for="username" class="text-sm text-gray-700 font-bold">
Name <i class="ri-text"></i>
</label>
<input
type="text"
name="name"
id="name"
class="mt-1 block w-full rounded-md focus:border-none focus:outline-none"
placeholder=""
required
autocomplete="off"
value="{{ $model.user.Name }}"
autofocus />
</div>
<div
class="col-span-3 border-2 border-transparent focus-within:border-slate-600 px-2 py-1 pb-1.5
bg-slate-200 focus-within:bg-slate-50 rounded-md transition-all duration-100">
<label for="username" class="text-sm text-gray-700 font-bold">
E-Mail <i class="ri-at-line"></i>
</label>
<input
type="email"
name="username"
id="username"
autocomplete="off"
class="mt-1 block w-full rounded-md focus:border-none focus:outline-none"
placeholder=""
required
value="{{ $model.user.Email }}" />
</div>
<div
class="col-span-3 border-2 border-transparent focus-within:border-slate-600 px-2 py-1
pb-1.5 bg-slate-200 focus-within:bg-slate-50 rounded-md transition-all duration-100">
<label for="role" class="text-sm text-gray-700 font-bold">
Rolle <i class="ri-user-3-line"></i>
</label>
<select
{{ if not (eq $model.request.user.Role "Admin") -}}
disabled
{{- end }}
name="role"
id="role"
autocomplete="off"
class="mt-1 block w-full rounded-md focus:border-none focus:outline-none
disabled:opacity-50">
<option value="User" {{ if eq $model.user.Role "User" }}selected{{ end }}>
Benutzer
</option>
<option value="Editor" {{ if eq $model.user.Role "Editor" }}selected{{ end }}>
Redakteur
</option>
<option value="Admin" {{ if eq $model.user.Role "Admin" }}selected{{ end }}>
Administrator
</option>
</select>
</div>
<div class="col-span-3">
<div class="flex items-center">
<input type="checkbox" name="openpw" id="openpw" x-model="openpw" class="mr-2" />
<label for="openpw" class="text-sm text-gray-700 font-bold">
Passwort ändern <i class="ri-key-2-line"></i>
</label>
</div>
</div>
{{- if not (eq $model.request.user.Role "Admin") -}}
<div
x-bind:style="!openpw ? 'display:none' : ''"
class="col-span-3 border-2 border-transparent focus-within:border-slate-600 px-2 py-1 pb-1.5
bg-slate-200 focus-within:bg-slate-50 rounded-md transition-all duration-100">
<label for="password_old" class="text-sm text-gray-700 font-bold"> Altes Passwort </label>
<input
x-bind:type="openpw ? 'password' : 'hidden'"
minlength="10"
name="password_old"
id="password_old"
class="mt-1 block w-full rounded-md focus:border-none focus:outline-none"
placeholder=""
required />
</div>
{{- end -}}
<div
x-bind:style="!openpw ? 'display:none' : ''"
class="col-span-3 border-2 border-transparent focus-within:border-slate-600 px-2 py-1 pb-1.5
bg-slate-200 focus-within:bg-slate-50 rounded-md transition-all duration-100">
<label for="password" class="text-sm text-gray-700 font-bold"> Neues Passwort </label>
<input
x-bind:type="openpw ? 'password' : 'hidden'"
minlength="10"
name="password"
id="password"
class="mt-1 block w-full rounded-md focus:border-none focus:outline-none"
placeholder=""
required />
</div>
<div
x-bind:style="!openpw ? 'display:none' : ''"
class="col-span-3 border-2 border-transparent focus-within:border-slate-600 px-2 py-1 pb-1.5
bg-slate-200 focus-within:bg-slate-50 rounded-md transition-all duration-100">
<label for="password_repeat" class="text-sm text-gray-700 font-bold">
Passwort wiederholen
</label>
<input
x-bind:type="openpw ? 'password' : 'hidden'"
minlength="10"
name="password_repeat"
id="password_repeat"
class="mt-1 block w-full rounded-md focus:border-none focus:outline-none"
placeholder=""
required />
</div>
<div class="col-span-1 col-start-2">
<a
href="/user/{{ $model.user.Id }}/edit?redirectTo={{ $model.redirect_url }}"
type="cancel"
class="w-full inline-flex justify-center py-2 px-4 border border-transparent rounded-md text-sm font-medium text-gray-800 bg-stone-200 hover:bg-stone-300 cursor-pointer focus:outline-none
focus:ring-2 focus:ring-offset-2 focus:ring-slate-500 no-underline">
Zurücksetzen
</a>
</div>
<div class="col-span-1 col-start-3">
<input
type="hidden"
name="csrf_nonce"
id="csrf_nonce"
required
value="{{ $model.csrf_nonce }}" />
<input
type="hidden"
name="csrf_token"
id="csrf_token"
required
value="{{ $model.csrf_token }}" />
<button
type="submit"
class="w-full inline-flex justify-center py-2 px-4 border border-transparent rounded-md
shadow-sm text-sm font-medium text-white bg-slate-700 hover:bg-slate-800 cursor-pointer focus:outline-none
focus:ring-2 focus:ring-offset-2 focus:ring-slate-500">
Speichern
</button>
</div>
<!--
<div class="col-span-3">
<a href="/forgot-password" class="text-sm text-slate-600 hover:text-slate-900">
Passwort vergessen?
</a>
</div>
-->
</form>
<div class="col-span-1 mt-8 justify-self-end self-end items-end flex flex-row justify-end">
{{ if not $model.user.Deactivated }}
<button
type="submit"
formmethod="POST"
formaction="/user/{{ $model.user.Id }}/deactivate"
type="button"
class="inline-flex justify-center py-2 px-3 border border-transparent hover:border-red-800
rounded-lg text-sm font-medium text-red-800 bg-red-200 hover:bg-red-300 cursor-pointer
focus:outline-none
focus:ring-2 focus:ring-offset-2 focus:ring-slate-500 no-underline">
<i class="ri-prohibited-2-line mr-1"></i> Deaktivieren
</button>
{{ else }}
<button
type="submit"
formmethod="POST"
formaction="/user/{{ $model.user.Id }}/activate"
type="button"
class="inline-flex justify-center py-2 px-4 border border-transparent hover:border-red-800
rounded-lg text-sm font-medium text-red-800 bg-red-200 hover:bg-red-300 cursor-pointer
focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-slate-500 no-underline">
<i class="ri-restart-line"></i>
</button>
{{ end }}
</div>
</div>
</div>

View File

@@ -82,7 +82,7 @@
<div
class="col-span-3 border-2 border-transparent focus-within:border-slate-600 px-2 py-1 pb-1.5
bg-slate-200 focus-within:bg-slate-50 rounded-md transition-all duration-100">
<label for="password" class="text-sm text-gray-700 font-bold">
<label for="password_repeat" class="text-sm text-gray-700 font-bold">
Passwort wiederholen <i class="ri-key-2-line"></i>
</label>
<input