Skip to content

Feat #207: Gruppenlose Kurs-Mitglieder in DeploymentDetails nachträglich zuweisen - #230

Merged
Gree44 merged 1 commit into
stagingfrom
feat/207-ungrouped-students
Jul 25, 2026
Merged

Feat #207: Gruppenlose Kurs-Mitglieder in DeploymentDetails nachträglich zuweisen#230
Gree44 merged 1 commit into
stagingfrom
feat/207-ungrouped-students

Conversation

@Gree44

@Gree44 Gree44 commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

Closes #207

Problem

Ein Student, der einem Kurs nach einem bereits bestehenden Deployment hinzugefügt wird, landet in keiner Gruppe und sieht das Deployment nicht. Das Backend gewährt Deployment-Sichtbarkeit ausschließlich über GroupMember → CourseGroup → DeploymentInstanceAccess (appstore-backend/src/api/student.py:56-88, staging). Die "Gruppen & Mitglieder"-Karte (CourseGroupsCard) listete bisher nur Mitglieder, die bereits einer Gruppe angehören — gruppenlose Kurs-Mitglieder waren unsichtbar.

Was hinzugefügt wurde

Eine "Ohne Gruppe"-Sektion in CourseGroupsCard (src/pages/DeploymentDetails.tsx):

  • lädt zusätzlich getCourseMembers(courseId) parallel zu den Gruppen-Mitgliedern
  • berechnet die Kurs-Mitglieder, die in keiner Gruppe sind (De-Dup über course_member_id)
  • rendert die Sektion nur, wenn ≥1 gruppenloses Mitglied existiert
  • pro Mitglied: Gruppen-<Select> + "Hinzufügen"-Button → addGroupMembers(courseId, groupId, [courseMemberId]) (bestehender, backend-gestützter POST)
  • Ziel-Dropdown ist auf die in der Karte gelisteten Gruppen des Deployments beschränkt; Hinweistext: "Der Student erhält erst Zugriff, wenn er einer zugewiesenen Gruppe hinzugefügt wird."
  • nach Erfolg: optimistisches Verschieben ins Gruppen-Bucket + Erfolgs-Toast; Fehlerbehandlung (403/404/generisch)

Verifizierte Backend-Routen (staging)

  • GET /api/v1/courses/{course_id}/memberscourses.py:260, liefert CourseMemberResponse[] (id, user_id, course_id, joined_at, left_at) → passt zu getCourseMembers
  • POST /api/v1/courses/{course_id}/groups/{group_id}/memberscourses.py:429, Body GroupMemberAdd = { "member_ids": [...] } (course_member_ids) → passt exakt zu addGroupMembers. Keine Mismatches.

Scope

Die Mitglieder-VERSCHIEBEN-Funktion (PATCH) bleibt out of scope — der Endpoint existiert auf staging nicht.

Verifizierung

  • npm run build grün, eslint 0 errors
  • Visueller Repro (Playwright, vite auf Port 3007, Keycloak-Stub lecturer, gemockte Endpoints): "Ohne Gruppe"-Sektion rendert korrekt; Add-Flow sendet {"member_ids":["cm-3"]}, Mitglied wandert in die gewählte Gruppe, Sektion verschwindet, Erfolgs-Toast erscheint.
  • Cypress-Spec + Fixtures für CI ergänzt (cypress/e2e/detail/detail-issue-207-ungrouped-members.cy.ts).

Hinweis für Produkt

Das Issue war als Frage formuliert ("wie kann es nachbearbeitet werden?"). Bitte bestätigen, dass "gruppenlosen Studenten einer zugewiesenen Gruppe hinzufügen" die gewünschte Lösung ist.

…ich zuweisen

Ein Student, der einem Kurs NACH einem bestehenden Deployment hinzugefügt
wird, landet in keiner Gruppe und sieht das Deployment nicht: das Backend
gewährt Deployment-Sichtbarkeit nur über GroupMember -> CourseGroup ->
DeploymentInstanceAccess. Die "Gruppen & Mitglieder"-Karte (CourseGroupsCard)
zeigte bisher nur Mitglieder, die bereits in einer Gruppe sind.

Neu in CourseGroupsCard:
- laedt zusaetzlich getCourseMembers(courseId) parallel zu den Gruppen-Members
- berechnet die Kurs-Mitglieder, die in KEINER Gruppe sind (De-Dup ueber
  course_member_id) und rendert eine "Ohne Gruppe"-Sektion (nur wenn >=1)
- pro gruppenlosem Mitglied: Gruppen-<Select> + "Hinzufuegen"-Button, der
  addGroupMembers(courseId, groupId, [courseMemberId]) aufruft (bestehender,
  backend-gestuetzter POST)
- Ziel-Dropdown ist auf die bereits in der Karte gelisteten Gruppen des
  Deployments beschraenkt; Hinweistext erklaert, dass Zugriff erst durch
  Zuweisung zu einer zugewiesenen Gruppe entsteht
- nach Erfolg: optimistisches Verschieben ins Gruppen-Bucket + Erfolgs-Toast,
  Fehlerbehandlung (403/404/generisch) analog zur bestehenden Move-Logik

Die Mitglieder-VERSCHIEBEN-Funktion (PATCH) bleibt out of scope -- der
Endpoint existiert auf staging nicht.

Verifiziert: npm run build gruen, eslint 0 errors, plus visueller Playwright-
Repro (Screenshots) fuer die "Ohne Gruppe"-Sektion und den Add-Flow.
Cypress-Spec + Fixtures fuer CI ergaenzt.
@Gree44
Gree44 merged commit e0a0c26 into staging Jul 25, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants