Admin Management Components
Verwaltungs-Components fuer User, Social Profiles, Tags, CMS-Seiten, AI Enhancements, Related Channels, Import-Status und Profil-Kategorien.
Admin/Users/Index
User-Verwaltung mit Suche, Admin-Filter, Sortierung und User-Blocking.
Route: /admin/users
View: resources/views/livewire/admin/users/index.blade.php
Location: app/Livewire/Admin/Users/Index.php
Public Properties
| Property | Typ | Default | Beschreibung |
|---|---|---|---|
$q | string | '' | Suche nach Name/E-Mail |
$adminFilter | string | '' | Filter: '', 'admin', 'non-admin' |
$blockedFilter | string | '' | Filter: '', 'blocked' |
$newsletterFilter | string | '' | Filter: '', 'subscribed', 'pending', 'none' |
$sort | string | 'created_at' | Sortierspalte |
$sortDir | string | 'desc' | Sortierrichtung |
$showBlockModal | bool | false | Block-Bestaetigung-Modal |
$showHistoryModal | bool | false | Block-History-Modal |
$blockReason | string | '' | Sperrgrund-Eingabe |
Actions
| Method | Beschreibung |
|---|---|
sortBy(string $column) | Spalte sortieren (toggle asc/desc) |
blockUser(int $id) | User sperren: blocked_at/blocked_by/block_reason setzen, Sessions loeschen, Token invalidieren, UserBlock Audit-Log |
unblockUser(int $id) | Sperre aufheben: blocked_at/blocked_by/block_reason nullen, UserBlock Audit-Log |
showBlockHistory(int $id) | Block-History-Modal oeffnen (alle Block/Unblock-Aktionen) |
Newsletter-Filter
Der Newsletter-Filter ($newsletterFilter) filtert User nach Double-Opt-In-Status:
| Wert | Query | Beschreibung |
|---|---|---|
'subscribed' | whereNotNull('newsletter_opted_in_at') | Bestaetigt ✅ |
'pending' | whereNotNull('newsletter_token')->whereNull('newsletter_opted_in_at') | Ausstehend ⏳ |
'none' | whereNull('newsletter_token')->whereNull('newsletter_opted_in_at') | Kein Newsletter |
In der Tabelle wird der Newsletter-Status als Badge angezeigt. Die Gesamtzahl der Abonnenten wird als $newsletterCount berechnet (User::whereNotNull('newsletter_opted_in_at')->count()).
Berechnete Spalten
Jeder User wird mit Subqueries angereichert:
last_login_at: Letzte Session-Aktivitaet aussessions-Tabelleworkspaces_count: Anzahl Workspaces (withCount)watchers_count: Anzahl Watchers ueber alle Workspaces (Subquery mit JOIN)
Admin-Status wird gegen config('postbox.admin_emails') geprueft (PostgreSQL: LOWER(email) = ANY(...)).
Sicherheit
- Admin-Selbstsperre wird verhindert (
$user->id === auth()->id()) CheckBlockedUser-Middleware sorgt fuer sofortiges Ausloggen gesperrter User- Fortify-Login lehnt gesperrte User mit generischer Fehlermeldung ab
Admin/SocialProfiles/Index
Zentrale Profil-Verwaltung mit Health-Stats, umfangreichen Filtern und Admin-Aktionen.
Route: /admin/social-profiles
View: resources/views/livewire/admin/social-profiles/index.blade.php
Location: app/Livewire/Admin/SocialProfiles/Index.php
Public Properties
| Property | Typ | Default | Beschreibung |
|---|---|---|---|
$q | string | '' | Suche nach Handle, Title, External-ID |
$platform | string | '' | '', 'youtube', 'instagram' |
$usage | string | '' | 'used' (hat Watchers), 'internal' (keine Watchers) |
$tracking | string | '' | 'enabled', 'disabled' |
$apiStatus | string | '' | 'active', 'inactive', 'error', 'unknown' |
$autoDisabled | string | '' | 'yes', 'no' |
$sanitized | string | '' | 'yes', 'no' |
$contactData | string | '' | 'none', 'any', 'approved', 'email', 'url', oder Plattform-Name |
$showDisableModal | bool | false | Disable-Bestaetigungsmodal |
$showPruneModal | bool | false | Prune-Bestaetigungsmodal |
$disableId | int|null | null | Profil-ID fuer Disable |
$pruneId | int|null | null | Profil-ID fuer Prune |
Health-Stats (Computed)
$this->healthStats = [
'total', 'tracking_enabled', 'tracking_disabled',
'sanitized', 'pending_retry', 'archived',
'blocked', 'no_metrics',
'api_active', 'api_error', 'api_inactive',
];
Actions
| Method | Beschreibung |
|---|---|
confirmDisable(int $id) | Disable-Modal oeffnen (prueft Watcher-Referenzen) |
disableTracking() | Tracking deaktivieren (mit Re-Check der Referenzen) |
confirmPrune(int $id) | Prune-Modal oeffnen |
prune() | Profil + Metriken loeschen (nur wenn tracking=false, keine Watchers) |
enableTracking(int $id) | Tracking reaktivieren + Fail-Streak zuruecksetzen |
retryProfile(int $id) | RetryInactiveProfileScrape-Job dispatchen |
applyScorePenalty(int $id) | 25% Score-Penalty setzen |
removeScorePenalty(int $id) | Score-Penalty entfernen |
Prune-Sicherheitslogik
Vor dem Prune wird AdminWorkspaceManager::removeProfileFromAdminWorkspace() aufgerufen, dann der Watcher-Count erneut geladen. Nur Profile ohne Watcher-Referenzen und deaktiviertem Tracking koennen geloescht werden.
Admin/TagManagement/Index
Tag-Verwaltung: Blocken/Entblocken von AI-generierten Tags, Tag-Konsolidierung.
Route: /admin/tag-management
View: resources/views/livewire/admin/tag-management/index.blade.php
Location: app/Livewire/Admin/TagManagement/Index.php
Actions
| Method | Beschreibung |
|---|---|
blockTag(string $tag) | Tag zur Blocklist hinzufuegen |
unblockTag(string $tag) | Tag von Blocklist entfernen |
Geblockte Tags werden in der BlockedTag-Tabelle gespeichert und aus Explore-Tag-Cloud und Browse-Filtern ausgeblendet.
Admin/Pages/Index + Edit
CMS-Seitenverwaltung fuer statische Inhaltsseiten.
Route: /admin/pages, /admin/pages/create, /admin/pages/{page}/edit
Location: app/Livewire/Admin/Pages/Index.php, app/Livewire/Admin/Pages/Edit.php
Pages/Index Actions
| Method | Beschreibung |
|---|---|
confirmDelete(int $id) | Seite zum Loeschen vormerken |
deletePage() | Seite loeschen |
Pages/Edit Properties
| Property | Typ | Beschreibung |
|---|---|---|
$page | Page|null | Existierende Seite (Edit) oder null (Create) |
$title | string | Seitentitel |
$slug | string | URL-Slug |
$content | string | Markdown-Inhalt |
$is_published | bool | Veroeffentlicht-Status |
Admin/AiEnhancements/Index
Uebersicht der AI Detection Ergebnisse (Sprache, Keywords, Kategorie).
Route: /admin/ai-enhancements
View: resources/views/livewire/admin/ai-enhancements/index.blade.php
Location: app/Livewire/Admin/AiEnhancements/Index.php
Zeigt Profile mit AI-generierten Daten (ai_language, ai_keywords, ai_category) und deren Detection-Status. Filter nach Plattform und Detection-Status. Das Detail-Modal enthaelt einen "AI bearbeiten"-Button der den AiFieldEditor oeffnet.
Admin/AiFieldEditor
Admin-only Modal-Component fuer manuelle Korrektur von AI-generierten Feldern.
View: resources/views/livewire/admin/ai-field-editor.blade.php
Location: app/Livewire/Admin/AiFieldEditor.php
Wird via openAiFieldEditor Event geoeffnet und kann auf beliebigen Seiten eingebettet werden (Watcher Show, Public Explorer Show, AI Enhancements).
Public Properties
| Property | Typ | Default | Beschreibung |
|---|---|---|---|
$showModal | bool | false | Modal-Sichtbarkeit |
$profileId | int|null | null | Aktuell bearbeitetes Profil |
$manualCategory | string | '' | Kategorie-Eingabe |
$manualDescription | string | '' | Beschreibungs-Eingabe |
$manualKeywordsInput | string | '' | Keywords (komma-getrennt) |
$overrideCategory | bool | false | Toggle: Kategorie manuell ueberschreiben |
$overrideDescription | bool | false | Toggle: Beschreibung manuell ueberschreiben |
$overrideKeywords | bool | false | Toggle: Keywords manuell ueberschreiben |
Computed Properties
| Property | Return | Beschreibung |
|---|---|---|
profile | SocialProfile|null | Profil mit Images und Editor-Relation |
crossPlatformRelations | array | Cross-Platform-Verknuepfungen (bidirektional, max 10) |
overrideHistory | array | Letzte 10 Audit-Log-Eintraege fuer dieses Profil |
categories | array | Alle 26 verfuegbaren Kategorien |
Actions
| Method | Beschreibung |
|---|---|
openEditor(int $profileId) | Modal oeffnen, Formular mit aktuellen Werten fuellen |
save() | Manual Overrides speichern, Audit-Log schreiben, Explore-Sync |
verifyCrossPlatform(int $relationId) | Cross-Platform-Verknuepfung verifizieren |
unverifyCrossPlatform(int $relationId) | Verifikation aufheben |
propagateToPartner(int $relatedProfileId) | Kategorie + Keywords auf Partner-Profil uebertragen |
Events
| Event | Richtung | Beschreibung |
|---|---|---|
openAiFieldEditor | listen | Oeffnet das Modal fuer eine Profil-ID |
aiFieldsUpdated | dispatch | Signalisiert dass AI-Felder aktualisiert wurden |
show-toast | dispatch | Erfolgs-/Fehlermeldung |
Admin/RelatedChannels/Index
Uebersicht und Verwaltung der Related-Channel-Beziehungen.
Route: /admin/related-channels
View: resources/views/livewire/admin/related-channels/index.blade.php
Location: app/Livewire/Admin/RelatedChannels/Index.php
Zeigt alle berechneten Related-Channel-Paare mit Score, Matching-Methode und Zeitstempel. Filter nach Source-Profil und Status.
Admin/ImportStatus/Index
Dashboard fuer Kontaktlink-Import-Status.
Route: /admin/import-status
View: resources/views/livewire/admin/import-status/index.blade.php
Location: app/Livewire/Admin/ImportStatus/Index.php
Zeigt alle importierbaren Kontaktlinks (YouTube/Instagram) mit Status (pending, completed, failed), Suche und Filtern. Stats-Cards zeigen Gesamtanzahl, Pending, Completed, Failed und verknuepfte Links.
Actions
| Method | Beschreibung |
|---|---|
| Keine | Reine Monitoring-Seite ohne Schreibaktionen |
Admin/ProfileCategories/Index
Verwaltung der AI-basierten Profil-Kategorien fuer Explore.
Route: /admin/profile-categories
View: resources/views/livewire/admin/profile-categories/index.blade.php
Location: app/Livewire/Admin/ProfileCategories/Index.php
Zeigt alle 26 Explore-Kategorien mit Profil-Counts, Coverage-Statistiken und Sync-Aktionen. Kategorien stammen aus ChannelLanguageDetector::CATEGORIES und werden ueber den ExploreCategorySeeder angelegt.
Computed Properties
| Property | Return | Beschreibung |
|---|---|---|
categories | Collection | Alle Kategorien sortiert nach sort_order |
stats | array | Coverage: total_with_ai, total_in_explore, categorized, uncategorized, coverage_pct |
Actions
| Method | Beschreibung |
|---|---|
runSeeder() | Fuehrt den ExploreCategorySeeder aus (erstellt/aktualisiert alle 26 Kategorien) |
runSync() | Fuehrt den ExploreCategoryDetector aus (mappt AI-Kategorien auf Explore-Slugs) |