feat: extended profile fields (phone, discord, shirt/hoodie sizes) - Migration 024: add phone, discord_handle, shirt_size, hoodie_size to profiles - Account page: new Contact & Sizing section with phone, discord, size dropdowns - Save profile persists all new fields - Layout server: profile queries include new fields for org members and user - Event team page: member rows show phone, discord, T-shirt and hoodie sizes - EventMemberWithDetails profile type extended - i18n: 8 new keys in EN and ET - svelte-check: 0 errors, vitest: 112/112 passed

This commit is contained in:
AlacrisDevs
2026-02-07 12:53:56 +02:00
parent 1f2484da3d
commit 676468d3ec
7 changed files with 126 additions and 12 deletions

View File

@@ -60,7 +60,7 @@ export interface EventMemberDepartment {
}
export interface EventMemberWithDetails extends EventMember {
profile?: { id: string; email: string; full_name: string | null; avatar_url: string | null };
profile?: { id: string; email: string; full_name: string | null; avatar_url: string | null; phone: string | null; discord_handle: string | null; shirt_size: string | null; hoodie_size: string | null };
event_role?: EventRole;
departments: EventDepartment[];
}
@@ -262,12 +262,12 @@ export async function fetchEventMembers(
// Fetch profiles separately (same pattern as org_members)
const userIds = members.map((m: any) => m.user_id);
const { data: profiles } = await supabase
const { data: profiles } = await (supabase as any)
.from('profiles')
.select('id, email, full_name, avatar_url')
.select('id, email, full_name, avatar_url, phone, discord_handle, shirt_size, hoodie_size')
.in('id', userIds);
const profileMap = Object.fromEntries((profiles ?? []).map(p => [p.id, p]));
const profileMap = Object.fromEntries((profiles ?? []).map((p: any) => [p.id, p]));
// Fetch roles for this event
const { data: roles } = await (supabase as any)