Die Einstellungen bekommen Reiter: Profil, Team, Fahrer (nur Teamleitung) und Flag-Typen. /dashboard/teams wandert dorthin. Neu ist die Hauptroute Fahrer - das Verzeichnis des Teams, fuer alle sichtbar und fuer niemanden dort aenderbar. Angelegt, geaendert und mit einem Konto verknuepft wird in den Einstellungen; serverseitig setzen das die neuen Regeln der Collection durch. Ein Fahrer bekommt sein Login entweder aus den vorhandenen Teammitgliedern oder direkt neu angelegt. Die Einladung per E-Mail-Suche entfaellt: Sie konnte nie funktionieren, weil users.listRule nur den eigenen Datensatz freigibt - daher auch die abgeschnittenen IDs in der alten Mitgliederliste. Events zeigen statt eines Status ihr Datum, mit Checkbox fuer mehrtaegig. Gespeichert wird ein Enddatum nur, wenn es sich vom Beginn unterscheidet - es ist damit zugleich das Kennzeichen fuer mehrtaegig statt einer zweiten Wahrheit ueber dieselbe Sache. Listen gruppieren nach laufend, anstehend, ohne Termin und vorbei. Im Kopf teilen sich Name, Design-Umschalter und Logout eine Zeile, das Team-Dropdown sitzt darunter; das Logo passt jetzt in die Leiste, statt beschnitten zu wirken. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014dh9W1i7aLSdPYJzQPid5o
43 lines
1.7 KiB
Svelte
43 lines
1.7 KiB
Svelte
<script lang="ts">
|
|
import { getTeamContext } from '$lib/stores/teams.svelte'
|
|
import { Button } from '@/components/ui/button'
|
|
import * as DropdownMenu from '@/components/ui/dropdown-menu'
|
|
import { ChevronDown, Plus, Users } from 'lucide-svelte'
|
|
import { goto } from '$app/navigation'
|
|
|
|
const teams = getTeamContext()
|
|
</script>
|
|
|
|
<DropdownMenu.Root>
|
|
<DropdownMenu.Trigger>
|
|
{#snippet child({ props })}
|
|
<Button {...props} variant="outline" size="sm" class="gap-2">
|
|
<Users class="h-4 w-4" />
|
|
<span class="font-medium">{teams.active?.name ?? 'Kein Team'}</span>
|
|
<ChevronDown class="h-3 w-3 opacity-50" />
|
|
</Button>
|
|
{/snippet}
|
|
</DropdownMenu.Trigger>
|
|
<DropdownMenu.Content align="end" class="min-w-56">
|
|
<DropdownMenu.Label>Teams wechseln</DropdownMenu.Label>
|
|
{#each teams.records as t}
|
|
{@const isMe = teams.isOwner(t) || teams.isAdmin(t)}
|
|
<DropdownMenu.Item
|
|
onclick={() => teams.setActive(t.id)}
|
|
class={t.id === teams.activeId ? 'bg-accent' : ''}
|
|
>
|
|
<span class="flex-1">{t.name}</span>
|
|
{#if teams.isOwner(t)}
|
|
<span class="text-xs text-muted-foreground">Owner</span>
|
|
{:else if teams.isAdmin(t)}
|
|
<span class="text-xs text-muted-foreground">Admin</span>
|
|
{/if}
|
|
</DropdownMenu.Item>
|
|
{/each}
|
|
<DropdownMenu.Separator />
|
|
<DropdownMenu.Item onclick={() => goto('/dashboard/settings/team')}>
|
|
<Users class="h-4 w-4 mr-2" />
|
|
Teams verwalten
|
|
</DropdownMenu.Item>
|
|
</DropdownMenu.Content>
|
|
</DropdownMenu.Root>
|