From 1325d9912ce2aa7c2c09ba8dec2463b6fa90f93e Mon Sep 17 00:00:00 2001 From: Daniel Egger Date: Thu, 25 Apr 2024 15:01:45 +0200 Subject: [PATCH] Add region filter to persons page --- .../pages/dashboard/DashboardDueDatesPage.vue | 18 --- .../pages/dashboard/DashboardPersonsPage.vue | 107 ++++++++++++++++-- client/src/services/dashboard.ts | 2 + server/vbv_lernwelt/dashboard/views.py | 56 ++++----- 4 files changed, 127 insertions(+), 56 deletions(-) diff --git a/client/src/pages/dashboard/DashboardDueDatesPage.vue b/client/src/pages/dashboard/DashboardDueDatesPage.vue index 4be29fc4..93cf3ff1 100644 --- a/client/src/pages/dashboard/DashboardDueDatesPage.vue +++ b/client/src/pages/dashboard/DashboardDueDatesPage.vue @@ -172,24 +172,6 @@ const circles = computed(() => { }); const selectedCircle = ref(circles.value[0]); -// async function loadCircleValues() { -// if (selectedCourse.value && selectedCourse.value.slug) { -// const learningPathQuery = useCourseData(selectedCourse.value.slug); -// await learningPathQuery.resultPromise; -// circles.value = [ -// initialItemCircle, -// ...(learningPathQuery.circles.value ?? []).map((circle) => ({ -// id: circle.id, -// name: circle.title, -// })), -// ]; -// } else { -// circles.value = [initialItemCircle]; -// } -// -// selectedCircle.value = circles.value[0]; -// } - const dueDateTypes = computed(() => { const types = _(dashboardDueDates.value) .map((dueDate) => { diff --git a/client/src/pages/dashboard/DashboardPersonsPage.vue b/client/src/pages/dashboard/DashboardPersonsPage.vue index 68c9b363..88167699 100644 --- a/client/src/pages/dashboard/DashboardPersonsPage.vue +++ b/client/src/pages/dashboard/DashboardPersonsPage.vue @@ -25,7 +25,7 @@ const courses = computed(() => { return [ { id: UNFILTERED, - name: t("a.Alle Lehrgänge"), + name: `${t("Lehrgang")}: ${t("a.Alle")}`, }, ..._(dashboardPersons.value) .flatMap((person) => person.course_sessions) @@ -37,11 +37,35 @@ const courses = computed(() => { .value(), ]; }); - const selectedCourse = ref(courses.value[0]); +const regions = computed(() => { + let values = _(dashboardPersons.value) + .flatMap((person) => person.course_sessions) + .map((cs) => { + return Object.assign({}, cs, { name: cs.region, id: cs.region }); + }) + .uniqBy("id") + .orderBy("name") + .value(); + + // filter by selected course + if (selectedCourse.value.id !== UNFILTERED) { + values = values.filter((cs) => cs.course_id === selectedCourse.value.id); + } + + return [ + { + id: UNFILTERED, + name: `${t("Region")}: ${t("a.Alle")}`, + }, + ...values, + ]; +}); +const selectedRegion = ref(regions.value[0]); + const courseSessions = computed(() => { - let sessions = _(dashboardPersons.value) + let values = _(dashboardPersons.value) .flatMap((person) => person.course_sessions) .map((cs) => { return Object.assign({}, cs, { name: cs.session_title, id: cs.id }); @@ -52,20 +76,43 @@ const courseSessions = computed(() => { // filter by selected course if (selectedCourse.value.id !== UNFILTERED) { - sessions = sessions.filter((cs) => cs.course_id === selectedCourse.value.id); + values = values.filter((cs) => cs.course_id === selectedCourse.value.id); + } + // filter by selected region + if (selectedRegion.value.id !== UNFILTERED) { + values = values.filter((cs) => cs.region === selectedRegion.value.id); } return [ { id: UNFILTERED, - name: t("a.AlleDurchführungen"), + name: `${t("Durchführung")}: ${t("a.Alle")}`, }, - ...sessions, + ...values, ]; }); - const selectedSession = ref(courseSessions.value[0]); +const generations = computed(() => { + const values = _(dashboardPersons.value) + .flatMap((person) => person.course_sessions) + .map((cs) => { + return Object.assign({}, cs, { name: cs.generation, id: cs.generation }); + }) + .uniqBy("id") + .orderBy("name") + .value(); + + return [ + { + id: UNFILTERED, + name: `${t("Generation")}: ${t("a.Alle")}`, + }, + ...values, + ]; +}); +const selectedGeneration = ref(generations.value[0]); + const filteredPersons = computed(() => { return _.orderBy( dashboardPersons.value @@ -82,13 +129,33 @@ const filteredPersons = computed(() => { return true; } return person.course_sessions.some((cs) => cs.id === selectedSession.value.id); + }) + .filter((person) => { + if (selectedRegion.value.id === UNFILTERED) { + return true; + } + return person.course_sessions.some( + (cs) => cs.region === selectedRegion.value.id + ); + }) + .filter((person) => { + if (selectedGeneration.value.id === UNFILTERED) { + return true; + } + return person.course_sessions.some( + (cs) => cs.generation === selectedGeneration.value.id + ); }), ["last_name", "first_name"] ); }); const filtersVisible = computed(() => { - return courses.value.length > 2 || courseSessions.value.length > 2; + return ( + courses.value.length > 2 || + courseSessions.value.length > 2 || + regions.value.length > 2 + ); }); function personRoleDisplayValue(personCourseSession: DashboardPersonCourseSessionType) { @@ -111,6 +178,10 @@ function personRoleDisplayValue(personCourseSession: DashboardPersonCourseSessio } watch(selectedCourse, () => { + selectedRegion.value = regions.value[0]; +}); + +watch(selectedRegion, () => { selectedSession.value = courseSessions.value[0]; }); @@ -139,18 +210,34 @@ watch(selectedCourse, () => { + + + +
str: return "LEARNING_MENTOR" +def _create_course_session_dict(course_session_object, my_role, user_role): + return { + "id": str(course_session_object.id), + "session_title": course_session_object.title, + "course_id": str(course_session_object.course.id), + "course_title": course_session_object.course.title, + "course_slug": course_session_object.course.slug, + "region": course_session_object.region, + "generation": course_session_object.generation, + "my_role": my_role, + "user_role": user_role, + "is_uk": course_session_object.course.configuration.is_uk, + "is_vv": course_session_object.course.configuration.is_vv, + } + + @api_view(["GET"]) def get_dashboard_persons(request): def create_user_dict(user_object): @@ -138,19 +154,6 @@ def get_dashboard_persons(request): "avatar_url": user_object.avatar_url, } - def create_course_session_dict(course_session_object, user_role, my_role): - return { - "id": str(course_session_object.id), - "session_title": course_session_object.title, - "course_id": str(course_session_object.course.id), - "course_title": course_session_object.course.title, - "course_slug": course_session_object.course.slug, - "user_role": user_role, - "my_role": my_role, - "is_uk": course_session_object.course.configuration.is_uk, - "is_vv": course_session_object.course.configuration.is_vv, - } - try: course_sessions = get_course_sessions_with_roles_for_user(request.user) @@ -164,7 +167,7 @@ def get_dashboard_persons(request): for csu in course_session_users: person_data = create_user_dict(csu.user) person_data["course_sessions"] = [ - create_course_session_dict(cs, csu.role, my_role) + _create_course_session_dict(cs, my_role, csu.role) ] result_persons[csu.user.id] = person_data @@ -176,8 +179,10 @@ def get_dashboard_persons(request): ).first() for participant in lm.participants.all(): - course_session_entry = create_course_session_dict( - cs, "LEARNING_MENTEE", "LEARNING_MENTOR" + course_session_entry = _create_course_session_dict( + cs, + "LEARNING_MENTOR", + "LEARNING_MENTEE", ) if participant.user.id not in result_persons: @@ -196,8 +201,10 @@ def get_dashboard_persons(request): ).prefetch_related("mentor", "course_session") for mentor_relation in mentor_relation_qs: cs = mentor_relation.course_session - course_session_entry = create_course_session_dict( - cs, "LEARNING_MENTOR", "LEARNING_MENTEE" + course_session_entry = _create_course_session_dict( + cs, + "LEARNING_MENTEE", + "LEARNING_MENTOR", ) if mentor_relation.mentor.id not in result_persons: @@ -257,16 +264,9 @@ def get_dashboard_due_dates(request): if course_session.id == due_date.course_session.id ) if cs: - data["course_session"] = { - "id": str(cs.id), - "session_title": cs.title, - "course_id": str(cs.course.id), - "course_title": cs.course.title, - "course_slug": cs.course.slug, - "my_role": user_role(cs.roles), - "is_uk": cs.course.configuration.is_uk, - "is_vv": cs.course.configuration.is_vv, - } + data["course_session"] = _create_course_session_dict( + cs, my_role=user_role(cs.roles), user_role="" + ) result_due_dates.append(data) return Response(