-
-
Portal-Nutzer & Vereine
-
- Alle Konten mit Vereinszuordnungen. Hier kannst du die Portal-Rolle (Zugriff auf
- Admin-Funktionen) und das Tier setzen sowie Nutzer explizit einem Verein mit Rollen
- zuordnen.
-
+
+
+
Nutzer & Vereinsrollen
+
+ {clubOrgMode ? (
+
+ Du verwaltest nur Mitglieder des ausgewählten Vereins und deren Rollen in diesem Verein.
+ Portal-Rollen und andere Vereine sind hier nicht sichtbar.
+
+ ) : (
+
+ Gesamtübersicht aller Konten und Vereinszuordnungen. Portal-Administrator und{' '}
+ Super-Administrator steuern den Zugriff auf die Plattform-Administration; alles Weitere
+ (z. B. Trainer, Vereinsadmin) legst du pro Verein fest. Abonnement/Tier ist derzeit nicht freigeschaltet.
+
+ )}
+
+ {clubOrgMode && managedClubIds.length > 1 ? (
+
+
+
+
+ ) : null}
{loading ? (
Laden…
@@ -136,142 +275,163 @@ function AdminUsersPage() {
{error}
- ) : (
+ ) : clubOrgMode ? (
- {users.map((row) => {
- const tierValue = portalDraft[row.id]?.tier ?? row.tier ?? 'free'
- const tierChoices = [...TIER_OPTIONS]
- if (tierValue && !tierChoices.includes(tierValue)) tierChoices.unshift(tierValue)
- return (
-
-
-
-
- {row.name || '—'} #{row.id}
-
-
{row.email || '—'}
-
- Verifiziert: {row.email_verified ? 'ja' : 'nein'}
-
-
-
+
+
+
+
+ {!clubMembers.length ? (
+
Keine Mitglieder in diesem Verein.
+ ) : (
+ clubMembers.map((m) => (
+
+
-
-
+
+ {m.name || '—'} #{m.profile_id}
+
+
{m.email || '—'}
+
+ Status: {m.status} · Verifiziert: {m.email_verified ? 'ja' : 'nein'}
+
+
+ Rollen: {(m.roles || []).join(', ') || '—'}
+
-
-
-
-
-
+ ))
+ )}
+
+ ) : (
+
+ {platformUsers.map((row) => {
+ const portalRoleChoices = portalRoleSelectOptions(isSuperadminViewer, row.role)
+ return (
+
+
+
+
+ {row.name || '—'} #{row.id}
+
+
{row.email || '—'}
+
+ Verifiziert: {row.email_verified ? 'ja' : 'nein'}
+
+
+
+
+
+
+
+
+
+
+
-
-
Vereinsmitgliedschaften
- {!row.clubs?.length ? (
-
- Keine Zuordnung.
-
- ) : (
-
- {row.clubs.map((c) => (
- -
- {c.name}
- {c.abbreviation ? ` (${c.abbreviation})` : ''} —{' '}
- {(c.roles || []).join(', ') || '—'}
- {c.membership_status === 'inactive' ? (
- (inaktiv)
- ) : null}{' '}
-
-
- ))}
-
- )}
+
+
Vereinsmitgliedschaften
+ {!row.clubs?.length ? (
+
+ Keine Zuordnung.
+
+ ) : (
+
+ {(row.clubs || []).map((c) => (
+ -
+ {c.name}
+ {c.abbreviation ? ` (${c.abbreviation})` : ''} —{' '}
+ {(c.roles || []).join(', ') || '—'}
+ {c.membership_status === 'inactive' ? (
+ (inaktiv)
+ ) : null}{' '}
+
+
+ ))}
+
+ )}
+
-
)
})}
@@ -346,11 +506,7 @@ function AdminUsersPage() {
-
@@ -358,6 +514,77 @@ function AdminUsersPage() {
)}
+ {addMemberOpen && clubOrgMode ? (
+
+
+
Mitglied hinzufügen
+
+ Verein: {selectedClubLabel}
+
+
+
+ setNewMemberProfileId(e.target.value)}
+ placeholder="z. B. 42"
+ />
+
+
+
Rollen
+
+ {CLUB_ROLE_OPTIONS.map((opt) => (
+
+ ))}
+
+
+
+
+ Hinzufügen
+
+ setAddMemberOpen(false)}>
+ Abbrechen
+
+
+
+
+ ) : null}
+
{clubEditModal && (
)
}
-
-export default AdminUsersPage
diff --git a/frontend/src/pages/MediaLibraryPage.jsx b/frontend/src/pages/MediaLibraryPage.jsx
index 8c39e0a..13bf4a9 100644
--- a/frontend/src/pages/MediaLibraryPage.jsx
+++ b/frontend/src/pages/MediaLibraryPage.jsx
@@ -21,7 +21,6 @@ import {
} from 'lucide-react'
import { useAuth } from '../context/AuthContext'
import api from '../utils/api'
-import AdminPageNav from '../components/AdminPageNav'
import { resolveMediaAssetFileUrl } from '../utils/exerciseMediaUrl'
const LC_OPTIONS = [
@@ -234,6 +233,7 @@ export default function MediaLibraryPage() {
const { user } = useAuth()
const isPlatformAdmin = user?.role === 'admin' || user?.role === 'superadmin'
const isSuperadmin = user?.role === 'superadmin'
+ const hasClubOrgAdmin = (user?.clubs || []).some((c) => (c.roles || []).includes('club_admin'))
const archiveVisOptions = useMemo(
() => VIS_OPTIONS.filter((o) => o.value !== 'official' || isSuperadmin),
@@ -538,22 +538,25 @@ export default function MediaLibraryPage() {
return (
- {isPlatformAdmin ?
: null}
-
Medienbibliothek
+ Übersicht
Übungen
- {isPlatformAdmin ? Admin : null}
+ {isPlatformAdmin ? Plattform-Admin : null}
+ {hasClubOrgAdmin || isPlatformAdmin ? (
+ Nutzer & Organisation
+ ) : null}
- Veröffentlichte Medien (Verein/Plattform) und eigene Uploads — „Privat“ steuert nur, wer das Asset in der
- Datenbank sieht; der Ablageordner folgt dem gewählten Verein wie bei „Verein“. Plattform-Admins wählen den
- Zielverein bei privatem Archiv-Upload aktiv. Suche durchsucht Bezeichner, Speicherpfad, Copyright und Tags.
- Bearbeiten über das Menü — Bulk in der unteren Leiste.
+ Offizielle und vereinsfreigegebene Medien sind für alle passenden Nutzer sichtbar. Eigene private Medien
+ kannst du bearbeiten, veröffentlichen oder in den Papierkorb legen; im Papierkorb siehst du als Standardnutzer
+ nur deine eigenen privaten Objekte, als Vereinsadmin zusätzlich den Vereins-Papierkorb. Vereins-Rollen können
+ Vereins-Medien verwalten, aber nicht bis „Offiziell“ anheben — das bleibt dem Superadmin vorbehalten.
+ Plattform-Admins geben beim privaten Upload den Zielverein an (club_id).