Some checks failed
CI / Backend Unit Tests (push) Failing after 3m5s
CI / Unit & Component Tests (pull_request) Failing after 2m26s
CI / OCR Service Tests (pull_request) Successful in 36s
CI / Backend Unit Tests (pull_request) Failing after 2m55s
CI / Unit & Component Tests (push) Failing after 2m49s
CI / OCR Service Tests (push) Successful in 48s
- Login page: email input replaces username field (type=email, name=email) - Login server action: reads email, uses i18n error for missing credentials - AccountSection: email input (type=email) replaces username text field - New user server action: sends email as required field, drops username - UsersListPanel: displays and searches by email instead of username - Admin edit user page: heading and delete confirm use email - Profile page: fullName fallback uses email, drops @username display - app.d.ts: email required on User, username removed - Generated API types: AppUser.email required, username removed; CreateUserRequest.email required, username removed - i18n: login_label_email, login_error_missing_credentials, admin_col_login updated (de/en/es) - errors.ts: MISSING_CREDENTIALS → login_error_missing_credentials Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
101 lines
2.9 KiB
Svelte
101 lines
2.9 KiB
Svelte
<script lang="ts">
|
|
import { m } from '$lib/paraglide/messages.js';
|
|
|
|
let { data } = $props();
|
|
|
|
const fullName = $derived.by(() => {
|
|
const first = data.profileUser.firstName;
|
|
const last = data.profileUser.lastName;
|
|
return first || last ? [first, last].filter(Boolean).join(' ') : data.profileUser.email;
|
|
});
|
|
|
|
const initials = $derived.by(() => {
|
|
const first = data.profileUser.firstName;
|
|
const last = data.profileUser.lastName;
|
|
if (first && last) return `${first[0]}${last[0]}`.toUpperCase();
|
|
if (first) return first[0].toUpperCase();
|
|
if (last) return last[0].toUpperCase();
|
|
return null;
|
|
});
|
|
</script>
|
|
|
|
<div class="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
|
|
<!-- Back link -->
|
|
<a
|
|
href="/"
|
|
class="group mb-4 inline-flex items-center text-xs font-bold tracking-widest text-ink-2 uppercase transition-colors hover:text-ink"
|
|
>
|
|
<svg
|
|
class="mr-2 h-4 w-4 transform transition-transform group-hover:-translate-x-1"
|
|
fill="none"
|
|
viewBox="0 0 24 24"
|
|
stroke="currentColor"
|
|
stroke-width="2"
|
|
>
|
|
<path stroke-linecap="round" stroke-linejoin="round" d="M15 19l-7-7 7-7" />
|
|
</svg>
|
|
Zurück
|
|
</a>
|
|
|
|
<h1 class="mb-6 font-serif text-3xl font-bold text-ink">{m.user_profile_heading()}</h1>
|
|
|
|
<div class="max-w-md">
|
|
<div class="rounded-sm border border-line bg-surface p-6 shadow-sm">
|
|
<!-- Avatar -->
|
|
<div class="mb-5 flex justify-center">
|
|
{#if initials}
|
|
<div
|
|
class="flex h-16 w-16 items-center justify-center rounded-full bg-primary text-primary-fg"
|
|
>
|
|
<span class="font-serif text-xl font-bold">{initials}</span>
|
|
</div>
|
|
{:else}
|
|
<div
|
|
class="flex h-16 w-16 items-center justify-center rounded-full bg-primary text-primary-fg"
|
|
>
|
|
<svg
|
|
class="h-8 w-8"
|
|
fill="none"
|
|
viewBox="0 0 24 24"
|
|
stroke="currentColor"
|
|
stroke-width="1.5"
|
|
>
|
|
<path
|
|
stroke-linecap="round"
|
|
stroke-linejoin="round"
|
|
d="M15.75 6a3.75 3.75 0 11-7.5 0 3.75 3.75 0 017.5 0zM4.501 20.118a7.5 7.5 0 0114.998 0A17.933 17.933 0 0112 21.75c-2.676 0-5.216-.584-7.499-1.632z"
|
|
/>
|
|
</svg>
|
|
</div>
|
|
{/if}
|
|
</div>
|
|
|
|
<!-- Name -->
|
|
<div class="mb-5 text-center">
|
|
<h2 class="font-serif text-xl font-bold text-ink">{fullName}</h2>
|
|
</div>
|
|
|
|
<!-- Field rows -->
|
|
<div class="flex flex-col gap-4">
|
|
{#if data.profileUser.email}
|
|
<div class="flex flex-col gap-0.5">
|
|
<span class="font-sans text-xs font-bold tracking-widest text-ink-3 uppercase"
|
|
>E-Mail</span
|
|
>
|
|
<span class="font-serif text-sm text-ink">{data.profileUser.email}</span>
|
|
</div>
|
|
{/if}
|
|
|
|
{#if data.profileUser.contact}
|
|
<div class="flex flex-col gap-0.5">
|
|
<span class="font-sans text-xs font-bold tracking-widest text-ink-3 uppercase"
|
|
>Kontakt</span
|
|
>
|
|
<span class="font-serif text-sm text-ink">{data.profileUser.contact}</span>
|
|
</div>
|
|
{/if}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|