feat(frontend): invite-based registration UI
Some checks failed
CI / Unit & Component Tests (push) Failing after 2m37s
CI / OCR Service Tests (push) Successful in 32s
CI / OCR Service Tests (pull_request) Successful in 30s
CI / Backend Unit Tests (push) Failing after 2m47s
CI / Unit & Component Tests (pull_request) Failing after 2m29s
CI / Backend Unit Tests (pull_request) Failing after 2m46s
Some checks failed
CI / Unit & Component Tests (push) Failing after 2m37s
CI / OCR Service Tests (push) Successful in 32s
CI / OCR Service Tests (pull_request) Successful in 30s
CI / Backend Unit Tests (push) Failing after 2m47s
CI / Unit & Component Tests (pull_request) Failing after 2m29s
CI / Backend Unit Tests (pull_request) Failing after 2m46s
- Add /register route with invite code prefill, password show/hide - Add /login?registered=1 success banner - Add /admin/invites page: list, create, revoke, copy link - Add Einladungen nav section to admin sidebar (ADMIN_USER perm) - Add invite error codes to errors.ts - Add 48 i18n keys across de/en/es - Update hooks.server.ts to allow public access to invite/register API Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -640,5 +640,53 @@
|
||||
"filter_operator_and": "UND",
|
||||
"filter_operator_or": "ODER",
|
||||
"filter_operator_and_label": "Alle gewählten Schlagworte müssen zutreffen (UND)",
|
||||
"filter_operator_or_label": "Mindestens ein Schlagwort muss zutreffen (ODER)"
|
||||
"filter_operator_or_label": "Mindestens ein Schlagwort muss zutreffen (ODER)",
|
||||
"error_invite_not_found": "Einladungslink nicht gefunden oder ungültig.",
|
||||
"error_invite_exhausted": "Dieser Einladungslink wurde bereits vollständig verwendet.",
|
||||
"error_invite_revoked": "Dieser Einladungslink wurde deaktiviert.",
|
||||
"error_invite_expired": "Dieser Einladungslink ist abgelaufen.",
|
||||
"register_heading": "Konto erstellen",
|
||||
"register_subtext": "Du wurdest eingeladen, dem Familienarchiv beizutreten.",
|
||||
"register_label_first_name": "Vorname",
|
||||
"register_label_last_name": "Nachname",
|
||||
"register_label_email": "E-Mail-Adresse",
|
||||
"register_label_password": "Passwort",
|
||||
"register_prefill_hint": "Von deiner Einladung übernommen – du kannst es ändern",
|
||||
"register_password_show": "Passwort anzeigen",
|
||||
"register_password_hide": "Passwort ausblenden",
|
||||
"register_btn_submit": "Konto erstellen",
|
||||
"register_invalid_code": "Ungültiger Einladungslink",
|
||||
"register_invalid_code_desc": "Dieser Einladungslink ist nicht gültig, wurde bereits verwendet oder ist abgelaufen. Bitte wende dich an den Administrator.",
|
||||
"register_success": "Dein Konto wurde erfolgreich erstellt. Du kannst dich jetzt anmelden.",
|
||||
"login_registered_success": "Dein Konto wurde erfolgreich erstellt. Melde dich jetzt an.",
|
||||
"admin_tab_invites": "Einladungen",
|
||||
"admin_invites_list_title": "Einladungen",
|
||||
"admin_invites_empty": "Keine aktiven Einladungen vorhanden.",
|
||||
"admin_btn_new_invite": "Neue Einladung",
|
||||
"admin_btn_show_all": "Alle anzeigen",
|
||||
"admin_btn_show_active": "Nur aktive",
|
||||
"admin_btn_revoke": "Widerrufen",
|
||||
"admin_btn_copy_link": "Link kopieren",
|
||||
"admin_btn_copied": "Kopiert!",
|
||||
"admin_invite_status_active": "Aktiv",
|
||||
"admin_invite_status_exhausted": "Erschöpft",
|
||||
"admin_invite_status_revoked": "Widerrufen",
|
||||
"admin_invite_status_expired": "Abgelaufen",
|
||||
"admin_invite_col_code": "Code",
|
||||
"admin_invite_col_label": "Bezeichnung",
|
||||
"admin_invite_col_uses": "Verwendungen",
|
||||
"admin_invite_col_expiry": "Ablauf",
|
||||
"admin_invite_col_status": "Status",
|
||||
"admin_invite_col_link": "Link",
|
||||
"admin_invite_unlimited": "∞",
|
||||
"admin_invite_no_expiry": "Kein Ablauf",
|
||||
"admin_new_invite_label": "Bezeichnung (z. B. für wen)",
|
||||
"admin_new_invite_max_uses": "Max. Verwendungen (leer = unbegrenzt)",
|
||||
"admin_new_invite_prefill_first": "Vorname vorausfüllen (optional)",
|
||||
"admin_new_invite_prefill_last": "Nachname vorausfüllen (optional)",
|
||||
"admin_new_invite_prefill_email": "E-Mail vorausfüllen (optional)",
|
||||
"admin_new_invite_expires": "Ablaufdatum (optional)",
|
||||
"admin_invite_created_title": "Einladung erstellt",
|
||||
"admin_invite_created_desc": "Teile diesen Link mit der einzuladenden Person:",
|
||||
"admin_invite_revoke_confirm": "Einladung wirklich widerrufen?"
|
||||
}
|
||||
|
||||
@@ -640,5 +640,53 @@
|
||||
"filter_operator_and": "AND",
|
||||
"filter_operator_or": "OR",
|
||||
"filter_operator_and_label": "All selected tags must match (AND)",
|
||||
"filter_operator_or_label": "At least one tag must match (OR)"
|
||||
"filter_operator_or_label": "At least one tag must match (OR)",
|
||||
"error_invite_not_found": "Invite link not found or invalid.",
|
||||
"error_invite_exhausted": "This invite link has already been fully used.",
|
||||
"error_invite_revoked": "This invite link has been deactivated.",
|
||||
"error_invite_expired": "This invite link has expired.",
|
||||
"register_heading": "Create account",
|
||||
"register_subtext": "You've been invited to join Familienarchiv.",
|
||||
"register_label_first_name": "First name",
|
||||
"register_label_last_name": "Last name",
|
||||
"register_label_email": "Email address",
|
||||
"register_label_password": "Password",
|
||||
"register_prefill_hint": "Pre-filled from your invite – you can change it",
|
||||
"register_password_show": "Show password",
|
||||
"register_password_hide": "Hide password",
|
||||
"register_btn_submit": "Create account",
|
||||
"register_invalid_code": "Invalid invite link",
|
||||
"register_invalid_code_desc": "This invite link is not valid, has already been used, or has expired. Please contact the administrator.",
|
||||
"register_success": "Your account has been created. You can now sign in.",
|
||||
"login_registered_success": "Your account was created successfully. Sign in now.",
|
||||
"admin_tab_invites": "Invites",
|
||||
"admin_invites_list_title": "Invites",
|
||||
"admin_invites_empty": "No active invites.",
|
||||
"admin_btn_new_invite": "New invite",
|
||||
"admin_btn_show_all": "Show all",
|
||||
"admin_btn_show_active": "Active only",
|
||||
"admin_btn_revoke": "Revoke",
|
||||
"admin_btn_copy_link": "Copy link",
|
||||
"admin_btn_copied": "Copied!",
|
||||
"admin_invite_status_active": "Active",
|
||||
"admin_invite_status_exhausted": "Exhausted",
|
||||
"admin_invite_status_revoked": "Revoked",
|
||||
"admin_invite_status_expired": "Expired",
|
||||
"admin_invite_col_code": "Code",
|
||||
"admin_invite_col_label": "Label",
|
||||
"admin_invite_col_uses": "Uses",
|
||||
"admin_invite_col_expiry": "Expiry",
|
||||
"admin_invite_col_status": "Status",
|
||||
"admin_invite_col_link": "Link",
|
||||
"admin_invite_unlimited": "∞",
|
||||
"admin_invite_no_expiry": "No expiry",
|
||||
"admin_new_invite_label": "Label (e.g. who it is for)",
|
||||
"admin_new_invite_max_uses": "Max uses (empty = unlimited)",
|
||||
"admin_new_invite_prefill_first": "Pre-fill first name (optional)",
|
||||
"admin_new_invite_prefill_last": "Pre-fill last name (optional)",
|
||||
"admin_new_invite_prefill_email": "Pre-fill email (optional)",
|
||||
"admin_new_invite_expires": "Expiry date (optional)",
|
||||
"admin_invite_created_title": "Invite created",
|
||||
"admin_invite_created_desc": "Share this link with the person you are inviting:",
|
||||
"admin_invite_revoke_confirm": "Really revoke this invite?"
|
||||
}
|
||||
|
||||
@@ -640,5 +640,53 @@
|
||||
"filter_operator_and": "Y",
|
||||
"filter_operator_or": "O",
|
||||
"filter_operator_and_label": "Todas las etiquetas seleccionadas deben coincidir (Y)",
|
||||
"filter_operator_or_label": "Al menos una etiqueta debe coincidir (O)"
|
||||
"filter_operator_or_label": "Al menos una etiqueta debe coincidir (O)",
|
||||
"error_invite_not_found": "Enlace de invitación no encontrado o inválido.",
|
||||
"error_invite_exhausted": "Este enlace de invitación ya ha sido completamente utilizado.",
|
||||
"error_invite_revoked": "Este enlace de invitación ha sido desactivado.",
|
||||
"error_invite_expired": "Este enlace de invitación ha expirado.",
|
||||
"register_heading": "Crear cuenta",
|
||||
"register_subtext": "Has sido invitado a unirte al Familienarchiv.",
|
||||
"register_label_first_name": "Nombre",
|
||||
"register_label_last_name": "Apellido",
|
||||
"register_label_email": "Correo electrónico",
|
||||
"register_label_password": "Contraseña",
|
||||
"register_prefill_hint": "Completado automáticamente desde tu invitación – puedes cambiarlo",
|
||||
"register_password_show": "Mostrar contraseña",
|
||||
"register_password_hide": "Ocultar contraseña",
|
||||
"register_btn_submit": "Crear cuenta",
|
||||
"register_invalid_code": "Enlace de invitación inválido",
|
||||
"register_invalid_code_desc": "Este enlace de invitación no es válido, ya ha sido utilizado o ha expirado. Contacta al administrador.",
|
||||
"register_success": "Tu cuenta ha sido creada. Ahora puedes iniciar sesión.",
|
||||
"login_registered_success": "Tu cuenta fue creada con éxito. Inicia sesión ahora.",
|
||||
"admin_tab_invites": "Invitaciones",
|
||||
"admin_invites_list_title": "Invitaciones",
|
||||
"admin_invites_empty": "No hay invitaciones activas.",
|
||||
"admin_btn_new_invite": "Nueva invitación",
|
||||
"admin_btn_show_all": "Mostrar todo",
|
||||
"admin_btn_show_active": "Solo activas",
|
||||
"admin_btn_revoke": "Revocar",
|
||||
"admin_btn_copy_link": "Copiar enlace",
|
||||
"admin_btn_copied": "¡Copiado!",
|
||||
"admin_invite_status_active": "Activa",
|
||||
"admin_invite_status_exhausted": "Agotada",
|
||||
"admin_invite_status_revoked": "Revocada",
|
||||
"admin_invite_status_expired": "Expirada",
|
||||
"admin_invite_col_code": "Código",
|
||||
"admin_invite_col_label": "Etiqueta",
|
||||
"admin_invite_col_uses": "Usos",
|
||||
"admin_invite_col_expiry": "Vencimiento",
|
||||
"admin_invite_col_status": "Estado",
|
||||
"admin_invite_col_link": "Enlace",
|
||||
"admin_invite_unlimited": "∞",
|
||||
"admin_invite_no_expiry": "Sin vencimiento",
|
||||
"admin_new_invite_label": "Etiqueta (p. ej. para quién)",
|
||||
"admin_new_invite_max_uses": "Usos máx. (vacío = ilimitado)",
|
||||
"admin_new_invite_prefill_first": "Prellenar nombre (opcional)",
|
||||
"admin_new_invite_prefill_last": "Prellenar apellido (opcional)",
|
||||
"admin_new_invite_prefill_email": "Prellenar correo (opcional)",
|
||||
"admin_new_invite_expires": "Fecha de vencimiento (opcional)",
|
||||
"admin_invite_created_title": "Invitación creada",
|
||||
"admin_invite_created_desc": "Comparte este enlace con la persona invitada:",
|
||||
"admin_invite_revoke_confirm": "¿Realmente revocar esta invitación?"
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user