WIP: Add supervisor base dashboard

This commit is contained in:
Christian Cueni 2024-04-11 15:09:59 +02:00
parent 77c69f1229
commit 121f7c227a
5 changed files with 84 additions and 3 deletions

View File

@ -8,6 +8,7 @@ import MentorOpenTasksCount from "@/components/dashboard/MentorOpenTasksCount.vu
import MentorMenteeCount from "@/components/dashboard/MentorMenteeCount.vue"; import MentorMenteeCount from "@/components/dashboard/MentorMenteeCount.vue";
import MentorCompetenceSummary from "@/components/dashboard/MentorCompetenceSummary.vue"; import MentorCompetenceSummary from "@/components/dashboard/MentorCompetenceSummary.vue";
import { getLearningPathUrl } from "@/utils/utils"; import { getLearningPathUrl } from "@/utils/utils";
import UkStatistics from "@/components/dashboard/UkStatistics.vue";
const mentorWidgets = [ const mentorWidgets = [
"MentorTasksWidget", "MentorTasksWidget",
@ -135,6 +136,12 @@ function hasActionButton(): boolean {
:course-id="courseConfig.course_id" :course-id="courseConfig.course_id"
></CompetenceSummary> ></CompetenceSummary>
</div> </div>
<div
v-if="hasWidget('UKStatisticsWidget')"
class="flex flex-col flex-wrap gap-x-[60px] border-b border-gray-300 pb-8 last:border-0 md:flex-row"
>
<UkStatistics :course-id="courseConfig.course_id" />
</div>
<div v-if="numberOfMentorWidgets > 0" class="flex flex-col flex-wrap md:flex-row"> <div v-if="numberOfMentorWidgets > 0" class="flex flex-col flex-wrap md:flex-row">
<MentorOpenTasksCount <MentorOpenTasksCount
v-if="hasWidget('MentorTasksWidget')" v-if="hasWidget('MentorTasksWidget')"

View File

@ -0,0 +1,64 @@
<script setup lang="ts">
import { useDashboardStore } from "@/stores/dashboard";
import { computed } from "vue";
import AttendanceSummaryBox from "@/components/dashboard/AttendanceSummaryBox.vue";
import type { CourseStatisticsType } from "@/gql/graphql";
import AssignmentSummaryBox from "@/components/dashboard/AssignmentSummaryBox.vue";
import FeedbackSummaryBox from "@/components/dashboard/FeedbackSummaryBox.vue";
import CompetenceSummaryBox from "@/components/dashboard/CompetenceSummaryBox.vue";
const dashboardStore = useDashboardStore();
const statistics = computed(() => {
return dashboardStore.currentDashBoardData as CourseStatisticsType;
});
const attendanceDayPresences = computed(() => {
return statistics.value.attendance_day_presences.summary;
});
const assigmentSummary = computed(() => {
return statistics.value.assignments.summary;
});
const competenceSummary = computed(() => {
return statistics.value.competences.summary;
});
const feebackSummary = computed(() => {
return statistics.value.feedback_responses.summary;
});
</script>
<template>
<div v-if="statistics" class="space-y-8">
<div
class="flex flex-col flex-wrap justify-between gap-x-5 border-b border-gray-300 pb-8 last:border-0 md:flex-row"
>
<AttendanceSummaryBox
class="flex-grow"
:days-completed="attendanceDayPresences.days_completed"
:avg-participants-present="attendanceDayPresences.participants_present"
/>
<AssignmentSummaryBox
class="flex-grow"
:assignments-completed="assigmentSummary.completed_count"
:avg-passed="assigmentSummary.average_passed"
/>
</div>
<div
class="flex flex-col flex-wrap gap-x-5 border-b border-gray-300 pb-8 align-top last:border-0 md:flex-row"
>
<FeedbackSummaryBox
:feedback-count="feebackSummary.total_responses"
:statisfaction-max="feebackSummary.satisfaction_max"
:statisfaction-avg="feebackSummary.satisfaction_average"
/>
<CompetenceSummaryBox
:fail-count="competenceSummary.fail_total"
:success-count="competenceSummary.success_total"
details-link="/statistic/competence"
/>
</div>
</div>
</template>

View File

@ -34,7 +34,8 @@ export type WidgetType =
| "MentorTasksWidget" | "MentorTasksWidget"
| "MentorPersonWidget" | "MentorPersonWidget"
| "MentorCompetenceWidget" | "MentorCompetenceWidget"
| "CompetenceCertificateWidget"; | "CompetenceCertificateWidget"
| "UKStatisticsWidget";
export type DashboardPersonCourseSessionType = { export type DashboardPersonCourseSessionType = {
id: number; id: number;

View File

@ -233,6 +233,9 @@ class GetDashboardConfig(TestCase):
], ],
) )
# test supervisor
# test expert
class GetMenteeCountTestCase(TestCase): class GetMenteeCountTestCase(TestCase):
def setUp(self): def setUp(self):

View File

@ -29,6 +29,7 @@ class WidgetType(Enum):
MENTOR_PERSON_WIDGET = "MentorPersonWidget" MENTOR_PERSON_WIDGET = "MentorPersonWidget"
MENTOR_COMPETENCE_WIDGET = "MentorCompetenceWidget" MENTOR_COMPETENCE_WIDGET = "MentorCompetenceWidget"
COMPETENCE_CERTIFICATE_WIDGET = "CompetenceCertificateWidget" COMPETENCE_CERTIFICATE_WIDGET = "CompetenceCertificateWidget"
UK_STATISTICS_WIDGET = "UKStatisticsWidget"
class RoleKeyType(Enum): class RoleKeyType(Enum):
@ -241,6 +242,9 @@ def get_widgets_for_course(
if is_uk: if is_uk:
widgets.append(WidgetType.COMPETENCE_CERTIFICATE_WIDGET.value) widgets.append(WidgetType.COMPETENCE_CERTIFICATE_WIDGET.value)
if role_key == RoleKeyType.SUPERVISOR:
widgets.append(WidgetType.UK_STATISTICS_WIDGET.value)
if is_mentor: if is_mentor:
widgets.append(WidgetType.MENTOR_PERSON_WIDGET.value) widgets.append(WidgetType.MENTOR_PERSON_WIDGET.value)
if is_vv: if is_vv:
@ -379,8 +383,10 @@ def get_mentor_open_tasks_count(request, course_id: str):
return Response( return Response(
status=200, status=200,
data={ data={
"open_task_count": _get_mentor_open_tasks_count(course_id, request.user) "open_task_count": _get_mentor_open_tasks_count(
}, # noqa course_id, request.user
) # noqa
},
) )
except PermissionDenied as e: except PermissionDenied as e:
raise e raise e