Fix tenant event form package selector so it no longer renders empty-value options, handles loading/empty
states, and pulls data from the authenticated /api/v1/tenant/packages endpoint.
(resources/js/admin/pages/EventFormPage.tsx, resources/js/admin/api.ts)
- Harden tenant-admin auth flow: prevent PKCE state loss, scope out StrictMode double-processing, add SPA
routes for /event-admin/login and /event-admin/logout, and tighten token/session clearing semantics (resources/js/admin/auth/{context,tokens}.tsx, resources/js/admin/pages/{AuthCallbackPage,LogoutPage}.tsx,
resources/js/admin/router.tsx, routes/web.php)
This commit is contained in:
@@ -106,6 +106,13 @@ return [
|
||||
'layouts_fallback' => 'Layout-Übersicht öffnen',
|
||||
'token_expiry' => 'Läuft ab am :date',
|
||||
],
|
||||
'analytics' => [
|
||||
'success_total' => 'Erfolgreiche Zugriffe',
|
||||
'failure_total' => 'Fehlgeschlagene Zugriffe',
|
||||
'rate_limited_total' => 'Rate-Limit erreicht',
|
||||
'recent_24h' => 'Aufrufe (24h)',
|
||||
'last_seen_at' => 'Letzte Aktivität: :date',
|
||||
],
|
||||
],
|
||||
|
||||
'legal_pages' => [
|
||||
@@ -329,6 +336,77 @@ return [
|
||||
],
|
||||
],
|
||||
|
||||
'refresh_tokens' => [
|
||||
'menu' => 'Refresh Tokens',
|
||||
'single' => 'Refresh Token',
|
||||
'fields' => [
|
||||
'tenant' => 'Mandant',
|
||||
'client' => 'Client',
|
||||
'status' => 'Status',
|
||||
'revoked_reason' => 'Widerrufsgrund',
|
||||
'created_at' => 'Erstellt',
|
||||
'last_used_at' => 'Zuletzt verwendet',
|
||||
'expires_at' => 'Gültig bis',
|
||||
'ip_address' => 'IP-Adresse',
|
||||
'user_agent' => 'User Agent',
|
||||
'note' => 'Notiz',
|
||||
],
|
||||
'status' => [
|
||||
'active' => 'Aktiv',
|
||||
'revoked' => 'Widerrufen',
|
||||
'expired' => 'Abgelaufen',
|
||||
],
|
||||
'filters' => [
|
||||
'status' => 'Status',
|
||||
'tenant' => 'Mandant',
|
||||
],
|
||||
'actions' => [
|
||||
'revoke' => 'Token widerrufen',
|
||||
],
|
||||
'reasons' => [
|
||||
'manual' => 'Manuell',
|
||||
'operator' => 'Operator-Aktion',
|
||||
'rotated' => 'Automatisch rotiert',
|
||||
'ip_mismatch' => 'IP-Abweichung',
|
||||
'expired' => 'Abgelaufen',
|
||||
'invalid_secret' => 'Ungültiges Secret',
|
||||
'tenant_missing' => 'Mandant entfernt',
|
||||
'max_active_limit' => 'Maximale Anzahl überschritten',
|
||||
],
|
||||
'sections' => [
|
||||
'details' => 'Token-Details',
|
||||
'security' => 'Sicherheitskontext',
|
||||
],
|
||||
'audit' => [
|
||||
'heading' => 'Audit-Log',
|
||||
'event' => 'Ereignis',
|
||||
'events' => [
|
||||
'issued' => 'Ausgestellt',
|
||||
'refresh_attempt' => 'Refresh versucht',
|
||||
'refreshed' => 'Refresh erfolgreich',
|
||||
'client_mismatch' => 'Client stimmt nicht überein',
|
||||
'invalid_secret' => 'Ungültiges Secret',
|
||||
'ip_mismatch' => 'IP-Abweichung',
|
||||
'expired' => 'Abgelaufen',
|
||||
'revoked' => 'Widerrufen',
|
||||
'rotated' => 'Rotiert',
|
||||
'tenant_missing' => 'Mandant fehlt',
|
||||
'max_active_limit' => 'Begrenzung erreicht',
|
||||
],
|
||||
'performed_by' => 'Ausgeführt von',
|
||||
'ip_address' => 'IP-Adresse',
|
||||
'context' => 'Kontext',
|
||||
'performed_at' => 'Zeitpunkt',
|
||||
'empty' => [
|
||||
'heading' => 'Noch keine Einträge',
|
||||
'description' => 'Sobald das Token verwendet wird, erscheinen hier Einträge.',
|
||||
],
|
||||
],
|
||||
'notifications' => [
|
||||
'revoked' => 'Refresh Token wurde widerrufen.',
|
||||
],
|
||||
],
|
||||
|
||||
'shell' => [
|
||||
'tenant_admin_title' => 'Tenant‑Admin',
|
||||
],
|
||||
|
||||
@@ -49,4 +49,11 @@ return [
|
||||
'subject' => 'Neue Kontakt-Anfrage',
|
||||
'body' => 'Kontakt-Anfrage von :name (:email): :message',
|
||||
],
|
||||
];
|
||||
|
||||
'contact_confirmation' => [
|
||||
'subject' => 'Vielen Dank für Ihre Nachricht, :name!',
|
||||
'greeting' => 'Hallo :name,',
|
||||
'body' => 'Vielen Dank für Ihre Nachricht an das Fotospiel-Team. Wir melden uns so schnell wie möglich zurück.',
|
||||
'footer' => 'Viele Grüße<br>Ihr Fotospiel-Team',
|
||||
],
|
||||
];
|
||||
|
||||
@@ -160,4 +160,7 @@ return [
|
||||
'currency' => [
|
||||
'euro' => '€',
|
||||
],
|
||||
'contact' => [
|
||||
'success' => 'Danke! Wir melden uns schnellstmöglich.',
|
||||
],
|
||||
];
|
||||
|
||||
@@ -105,6 +105,13 @@ return [
|
||||
'deprecated_notice' => 'Direct access via slug :slug has been retired. Share the join tokens below or manage QR layouts in the admin app.',
|
||||
'open_admin' => 'Open admin app',
|
||||
],
|
||||
'analytics' => [
|
||||
'success_total' => 'Successful checks',
|
||||
'failure_total' => 'Failures',
|
||||
'rate_limited_total' => 'Rate limited',
|
||||
'recent_24h' => 'Requests (24h)',
|
||||
'last_seen_at' => 'Last activity: :date',
|
||||
],
|
||||
],
|
||||
|
||||
'legal_pages' => [
|
||||
@@ -315,6 +322,77 @@ return [
|
||||
],
|
||||
],
|
||||
|
||||
'refresh_tokens' => [
|
||||
'menu' => 'Refresh tokens',
|
||||
'single' => 'Refresh token',
|
||||
'fields' => [
|
||||
'tenant' => 'Tenant',
|
||||
'client' => 'Client',
|
||||
'status' => 'Status',
|
||||
'revoked_reason' => 'Revoked reason',
|
||||
'created_at' => 'Created',
|
||||
'last_used_at' => 'Last used',
|
||||
'expires_at' => 'Expires at',
|
||||
'ip_address' => 'IP address',
|
||||
'user_agent' => 'User agent',
|
||||
'note' => 'Operator note',
|
||||
],
|
||||
'status' => [
|
||||
'active' => 'Active',
|
||||
'revoked' => 'Revoked',
|
||||
'expired' => 'Expired',
|
||||
],
|
||||
'filters' => [
|
||||
'status' => 'Status',
|
||||
'tenant' => 'Tenant',
|
||||
],
|
||||
'actions' => [
|
||||
'revoke' => 'Revoke token',
|
||||
],
|
||||
'reasons' => [
|
||||
'manual' => 'Manual',
|
||||
'operator' => 'Operator action',
|
||||
'rotated' => 'Rotated (auto)',
|
||||
'ip_mismatch' => 'IP mismatch',
|
||||
'expired' => 'Expired',
|
||||
'invalid_secret' => 'Invalid secret attempt',
|
||||
'tenant_missing' => 'Tenant removed',
|
||||
'max_active_limit' => 'Exceeded active token limit',
|
||||
],
|
||||
'sections' => [
|
||||
'details' => 'Token details',
|
||||
'security' => 'Security context',
|
||||
],
|
||||
'audit' => [
|
||||
'heading' => 'Audit log',
|
||||
'event' => 'Event',
|
||||
'events' => [
|
||||
'issued' => 'Issued',
|
||||
'refresh_attempt' => 'Refresh attempted',
|
||||
'refreshed' => 'Refresh succeeded',
|
||||
'client_mismatch' => 'Client mismatch',
|
||||
'invalid_secret' => 'Invalid secret',
|
||||
'ip_mismatch' => 'IP mismatch',
|
||||
'expired' => 'Expired',
|
||||
'revoked' => 'Revoked',
|
||||
'rotated' => 'Rotated',
|
||||
'tenant_missing' => 'Tenant missing',
|
||||
'max_active_limit' => 'Pruned (active limit)',
|
||||
],
|
||||
'performed_by' => 'Actor',
|
||||
'ip_address' => 'IP address',
|
||||
'context' => 'Context',
|
||||
'performed_at' => 'Timestamp',
|
||||
'empty' => [
|
||||
'heading' => 'No audit entries yet',
|
||||
'description' => 'Token activity will appear here once it is used.',
|
||||
],
|
||||
],
|
||||
'notifications' => [
|
||||
'revoked' => 'Refresh token revoked.',
|
||||
],
|
||||
],
|
||||
|
||||
'shell' => [
|
||||
'tenant_admin_title' => 'Tenant Admin',
|
||||
],
|
||||
|
||||
@@ -49,4 +49,11 @@ return [
|
||||
'subject' => 'New Contact Request',
|
||||
'body' => 'Contact request from :name (:email): :message',
|
||||
],
|
||||
];
|
||||
|
||||
'contact_confirmation' => [
|
||||
'subject' => 'Thank you for reaching out, :name!',
|
||||
'greeting' => 'Hi :name,',
|
||||
'body' => 'Thank you for your message to the Fotospiel team. We will get back to you as soon as possible.',
|
||||
'footer' => 'Best regards,<br>The Fotospiel Team',
|
||||
],
|
||||
];
|
||||
|
||||
@@ -160,4 +160,7 @@ return [
|
||||
'currency' => [
|
||||
'euro' => '€',
|
||||
],
|
||||
'contact' => [
|
||||
'success' => 'Thanks! We will get back to you soon.',
|
||||
],
|
||||
];
|
||||
|
||||
Reference in New Issue
Block a user