feat: assignments records
This commit is contained in:
parent
d61c93db09
commit
7c50d709e9
|
|
@ -23,7 +23,7 @@ const documents = {
|
||||||
"\n query courseQuery($slug: String!) {\n course(slug: $slug) {\n id\n title\n slug\n category_name\n action_competences {\n competence_id\n ...CoursePageFields\n performance_criteria {\n competence_id\n learning_unit {\n id\n slug\n evaluate_url\n }\n ...CoursePageFields\n }\n }\n learning_path {\n ...CoursePageFields\n topics {\n is_visible\n ...CoursePageFields\n circles {\n description\n goals\n ...CoursePageFields\n learning_sequences {\n icon\n ...CoursePageFields\n learning_units {\n evaluate_url\n ...CoursePageFields\n performance_criteria {\n ...CoursePageFields\n }\n learning_contents {\n can_user_self_toggle_course_completion\n content_url\n minutes\n description\n ...CoursePageFields\n ... on LearningContentAssignmentObjectType {\n assignment_type\n content_assignment {\n id\n }\n competence_certificate {\n ...CoursePageFields\n }\n }\n ... on LearningContentEdoniqTestObjectType {\n checkbox_text\n has_extended_time_test\n content_assignment {\n id\n }\n competence_certificate {\n ...CoursePageFields\n }\n }\n ... on LearningContentRichTextObjectType {\n text\n }\n }\n }\n }\n }\n }\n }\n }\n }\n": types.CourseQueryDocument,
|
"\n query courseQuery($slug: String!) {\n course(slug: $slug) {\n id\n title\n slug\n category_name\n action_competences {\n competence_id\n ...CoursePageFields\n performance_criteria {\n competence_id\n learning_unit {\n id\n slug\n evaluate_url\n }\n ...CoursePageFields\n }\n }\n learning_path {\n ...CoursePageFields\n topics {\n is_visible\n ...CoursePageFields\n circles {\n description\n goals\n ...CoursePageFields\n learning_sequences {\n icon\n ...CoursePageFields\n learning_units {\n evaluate_url\n ...CoursePageFields\n performance_criteria {\n ...CoursePageFields\n }\n learning_contents {\n can_user_self_toggle_course_completion\n content_url\n minutes\n description\n ...CoursePageFields\n ... on LearningContentAssignmentObjectType {\n assignment_type\n content_assignment {\n id\n }\n competence_certificate {\n ...CoursePageFields\n }\n }\n ... on LearningContentEdoniqTestObjectType {\n checkbox_text\n has_extended_time_test\n content_assignment {\n id\n }\n competence_certificate {\n ...CoursePageFields\n }\n }\n ... on LearningContentRichTextObjectType {\n text\n }\n }\n }\n }\n }\n }\n }\n }\n }\n": types.CourseQueryDocument,
|
||||||
"\n query dashboardConfig {\n dashboard_config {\n id\n slug\n name\n dashboard_type\n }\n }\n": types.DashboardConfigDocument,
|
"\n query dashboardConfig {\n dashboard_config {\n id\n slug\n name\n dashboard_type\n }\n }\n": types.DashboardConfigDocument,
|
||||||
"\n query dashboardProgress($courseId: ID!) {\n course_progress(course_id: $courseId) {\n _id\n course_id\n session_to_continue_id\n competence {\n _id\n total_count\n success_count\n fail_count\n }\n assignment {\n _id\n total_count\n points_max_count\n points_achieved_count\n }\n }\n }\n": types.DashboardProgressDocument,
|
"\n query dashboardProgress($courseId: ID!) {\n course_progress(course_id: $courseId) {\n _id\n course_id\n session_to_continue_id\n competence {\n _id\n total_count\n success_count\n fail_count\n }\n assignment {\n _id\n total_count\n points_max_count\n points_achieved_count\n }\n }\n }\n": types.DashboardProgressDocument,
|
||||||
"\n query courseStatistics($courseId: ID!) {\n course_statistics(course_id: $courseId) {\n _id\n course_id\n course_title\n course_slug\n course_session_properties {\n _id\n sessions {\n id\n name\n }\n generations\n circles {\n id\n name\n experts\n }\n }\n course_session_selection_ids\n course_session_selection_metrics {\n _id\n session_count\n participant_count\n expert_count\n }\n attendance_day_presences {\n _id\n records {\n _id\n course_session_id\n generation\n circle_id\n due_date\n participants_present\n participants_total\n details_url\n }\n summary {\n _id\n days_completed\n participants_present\n }\n }\n feedback_responses {\n _id\n records {\n _id\n course_session_id\n generation\n circle_id\n satisfaction_average\n satisfaction_max\n details_url\n }\n summary {\n _id\n satisfaction_average\n satisfaction_max\n total_responses\n }\n }\n assignments {\n _id\n summary {\n _id\n completed_count\n average_passed\n }\n records {\n _id\n course_session_id\n course_session_assignment_id\n circle_id\n generation\n assignment_title\n assignment_type_translation_key\n details_url\n deadline\n metrics {\n _id\n passed_count\n failed_count\n unranked_count\n ranking_completed\n average_passed\n }\n }\n }\n competences {\n _id\n summary {\n _id\n success_total\n fail_total\n }\n records {\n _id\n course_session_id\n generation\n circle_id\n success_count\n fail_count\n details_url\n }\n }\n }\n }\n": types.CourseStatisticsDocument,
|
"\n query courseStatistics($courseId: ID!) {\n course_statistics(course_id: $courseId) {\n _id\n course_id\n course_title\n course_slug\n course_session_properties {\n _id\n sessions {\n id\n name\n }\n generations\n circles {\n id\n name\n experts\n }\n }\n course_session_selection_ids\n course_session_selection_metrics {\n _id\n session_count\n participant_count\n expert_count\n }\n attendance_day_presences {\n _id\n records {\n _id\n course_session_id\n generation\n circle_id\n due_date\n participants_present\n participants_total\n details_url\n }\n summary {\n _id\n days_completed\n participants_present\n }\n }\n feedback_responses {\n _id\n records {\n _id\n course_session_id\n generation\n circle_id\n satisfaction_average\n satisfaction_max\n details_url\n }\n summary {\n _id\n satisfaction_average\n satisfaction_max\n total_responses\n }\n }\n assignments {\n _id\n summary {\n _id\n completed_count\n average_passed\n }\n records {\n _id\n course_session_id\n course_session_assignment_id\n circle_id\n generation\n assignment_title\n assignment_type_translation_key\n details_url\n deadline\n metrics {\n _id\n passed_count\n failed_count\n unranked_count\n ranking_completed\n average_passed\n }\n }\n }\n competences {\n _id\n summary {\n _id\n success_total\n fail_total\n }\n records {\n _id\n course_session_id\n generation\n circle_id\n title\n success_count\n fail_count\n details_url\n }\n }\n }\n }\n": types.CourseStatisticsDocument,
|
||||||
"\n mutation SendFeedbackMutation(\n $courseSessionId: ID!\n $learningContentId: ID!\n $data: GenericScalar!\n $submitted: Boolean\n ) {\n send_feedback(\n course_session_id: $courseSessionId\n learning_content_page_id: $learningContentId\n data: $data\n submitted: $submitted\n ) {\n feedback_response {\n id\n data\n submitted\n }\n errors {\n field\n messages\n }\n }\n }\n": types.SendFeedbackMutationDocument,
|
"\n mutation SendFeedbackMutation(\n $courseSessionId: ID!\n $learningContentId: ID!\n $data: GenericScalar!\n $submitted: Boolean\n ) {\n send_feedback(\n course_session_id: $courseSessionId\n learning_content_page_id: $learningContentId\n data: $data\n submitted: $submitted\n ) {\n feedback_response {\n id\n data\n submitted\n }\n errors {\n field\n messages\n }\n }\n }\n": types.SendFeedbackMutationDocument,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -84,7 +84,7 @@ export function graphql(source: "\n query dashboardProgress($courseId: ID!) {\n
|
||||||
/**
|
/**
|
||||||
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
|
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
|
||||||
*/
|
*/
|
||||||
export function graphql(source: "\n query courseStatistics($courseId: ID!) {\n course_statistics(course_id: $courseId) {\n _id\n course_id\n course_title\n course_slug\n course_session_properties {\n _id\n sessions {\n id\n name\n }\n generations\n circles {\n id\n name\n experts\n }\n }\n course_session_selection_ids\n course_session_selection_metrics {\n _id\n session_count\n participant_count\n expert_count\n }\n attendance_day_presences {\n _id\n records {\n _id\n course_session_id\n generation\n circle_id\n due_date\n participants_present\n participants_total\n details_url\n }\n summary {\n _id\n days_completed\n participants_present\n }\n }\n feedback_responses {\n _id\n records {\n _id\n course_session_id\n generation\n circle_id\n satisfaction_average\n satisfaction_max\n details_url\n }\n summary {\n _id\n satisfaction_average\n satisfaction_max\n total_responses\n }\n }\n assignments {\n _id\n summary {\n _id\n completed_count\n average_passed\n }\n records {\n _id\n course_session_id\n course_session_assignment_id\n circle_id\n generation\n assignment_title\n assignment_type_translation_key\n details_url\n deadline\n metrics {\n _id\n passed_count\n failed_count\n unranked_count\n ranking_completed\n average_passed\n }\n }\n }\n competences {\n _id\n summary {\n _id\n success_total\n fail_total\n }\n records {\n _id\n course_session_id\n generation\n circle_id\n success_count\n fail_count\n details_url\n }\n }\n }\n }\n"): (typeof documents)["\n query courseStatistics($courseId: ID!) {\n course_statistics(course_id: $courseId) {\n _id\n course_id\n course_title\n course_slug\n course_session_properties {\n _id\n sessions {\n id\n name\n }\n generations\n circles {\n id\n name\n experts\n }\n }\n course_session_selection_ids\n course_session_selection_metrics {\n _id\n session_count\n participant_count\n expert_count\n }\n attendance_day_presences {\n _id\n records {\n _id\n course_session_id\n generation\n circle_id\n due_date\n participants_present\n participants_total\n details_url\n }\n summary {\n _id\n days_completed\n participants_present\n }\n }\n feedback_responses {\n _id\n records {\n _id\n course_session_id\n generation\n circle_id\n satisfaction_average\n satisfaction_max\n details_url\n }\n summary {\n _id\n satisfaction_average\n satisfaction_max\n total_responses\n }\n }\n assignments {\n _id\n summary {\n _id\n completed_count\n average_passed\n }\n records {\n _id\n course_session_id\n course_session_assignment_id\n circle_id\n generation\n assignment_title\n assignment_type_translation_key\n details_url\n deadline\n metrics {\n _id\n passed_count\n failed_count\n unranked_count\n ranking_completed\n average_passed\n }\n }\n }\n competences {\n _id\n summary {\n _id\n success_total\n fail_total\n }\n records {\n _id\n course_session_id\n generation\n circle_id\n success_count\n fail_count\n details_url\n }\n }\n }\n }\n"];
|
export function graphql(source: "\n query courseStatistics($courseId: ID!) {\n course_statistics(course_id: $courseId) {\n _id\n course_id\n course_title\n course_slug\n course_session_properties {\n _id\n sessions {\n id\n name\n }\n generations\n circles {\n id\n name\n experts\n }\n }\n course_session_selection_ids\n course_session_selection_metrics {\n _id\n session_count\n participant_count\n expert_count\n }\n attendance_day_presences {\n _id\n records {\n _id\n course_session_id\n generation\n circle_id\n due_date\n participants_present\n participants_total\n details_url\n }\n summary {\n _id\n days_completed\n participants_present\n }\n }\n feedback_responses {\n _id\n records {\n _id\n course_session_id\n generation\n circle_id\n satisfaction_average\n satisfaction_max\n details_url\n }\n summary {\n _id\n satisfaction_average\n satisfaction_max\n total_responses\n }\n }\n assignments {\n _id\n summary {\n _id\n completed_count\n average_passed\n }\n records {\n _id\n course_session_id\n course_session_assignment_id\n circle_id\n generation\n assignment_title\n assignment_type_translation_key\n details_url\n deadline\n metrics {\n _id\n passed_count\n failed_count\n unranked_count\n ranking_completed\n average_passed\n }\n }\n }\n competences {\n _id\n summary {\n _id\n success_total\n fail_total\n }\n records {\n _id\n course_session_id\n generation\n circle_id\n title\n success_count\n fail_count\n details_url\n }\n }\n }\n }\n"): (typeof documents)["\n query courseStatistics($courseId: ID!) {\n course_statistics(course_id: $courseId) {\n _id\n course_id\n course_title\n course_slug\n course_session_properties {\n _id\n sessions {\n id\n name\n }\n generations\n circles {\n id\n name\n experts\n }\n }\n course_session_selection_ids\n course_session_selection_metrics {\n _id\n session_count\n participant_count\n expert_count\n }\n attendance_day_presences {\n _id\n records {\n _id\n course_session_id\n generation\n circle_id\n due_date\n participants_present\n participants_total\n details_url\n }\n summary {\n _id\n days_completed\n participants_present\n }\n }\n feedback_responses {\n _id\n records {\n _id\n course_session_id\n generation\n circle_id\n satisfaction_average\n satisfaction_max\n details_url\n }\n summary {\n _id\n satisfaction_average\n satisfaction_max\n total_responses\n }\n }\n assignments {\n _id\n summary {\n _id\n completed_count\n average_passed\n }\n records {\n _id\n course_session_id\n course_session_assignment_id\n circle_id\n generation\n assignment_title\n assignment_type_translation_key\n details_url\n deadline\n metrics {\n _id\n passed_count\n failed_count\n unranked_count\n ranking_completed\n average_passed\n }\n }\n }\n competences {\n _id\n summary {\n _id\n success_total\n fail_total\n }\n records {\n _id\n course_session_id\n generation\n circle_id\n title\n success_count\n fail_count\n details_url\n }\n }\n }\n }\n"];
|
||||||
/**
|
/**
|
||||||
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
|
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -109,7 +109,7 @@ type FeedbackStatisticsSummaryType {
|
||||||
|
|
||||||
type AssignmentsStatisticsType {
|
type AssignmentsStatisticsType {
|
||||||
_id: ID!
|
_id: ID!
|
||||||
records: [AssignmentStatisticsRecordType]!
|
records: [AssignmentStatisticsRecordType!]!
|
||||||
summary: AssignmentStatisticsSummaryType!
|
summary: AssignmentStatisticsSummaryType!
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -164,6 +164,7 @@ type CompetenceRecordStatisticsType {
|
||||||
_id: ID!
|
_id: ID!
|
||||||
course_session_id: ID!
|
course_session_id: ID!
|
||||||
generation: String!
|
generation: String!
|
||||||
|
title: String!
|
||||||
circle_id: ID!
|
circle_id: ID!
|
||||||
success_count: Int!
|
success_count: Int!
|
||||||
fail_count: Int!
|
fail_count: Int!
|
||||||
|
|
|
||||||
|
|
@ -404,6 +404,7 @@ export const DASHBOARD_COURSE_STATISTICS = graphql(`
|
||||||
course_session_id
|
course_session_id
|
||||||
generation
|
generation
|
||||||
circle_id
|
circle_id
|
||||||
|
title
|
||||||
success_count
|
success_count
|
||||||
fail_count
|
fail_count
|
||||||
details_url
|
details_url
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,106 @@
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { useDashboardStore } from "@/stores/dashboard";
|
||||||
|
import ItDropdownSelect from "@/components/ui/ItDropdownSelect.vue";
|
||||||
|
import { computed } from "vue";
|
||||||
|
import type {
|
||||||
|
AssignmentCompletionMetricsType,
|
||||||
|
AssignmentStatisticsRecordType,
|
||||||
|
CourseStatisticsType,
|
||||||
|
} from "@/gql/graphql";
|
||||||
|
import StatisticFilterList from "@/components/dashboard/StatisticFilterList.vue";
|
||||||
|
import { useCourseStatistics } from "@/composables";
|
||||||
|
import ItProgress from "@/components/ui/ItProgress.vue";
|
||||||
|
import { getDateString } from "@/components/dueDates/dueDatesUtils";
|
||||||
|
import dayjs from "dayjs";
|
||||||
|
|
||||||
|
const dashboardStore = useDashboardStore();
|
||||||
|
|
||||||
|
const statistics = computed(() => {
|
||||||
|
return dashboardStore.currentDashBoardData as CourseStatisticsType;
|
||||||
|
});
|
||||||
|
|
||||||
|
const { courseSessionName, circleMeta } = useCourseStatistics();
|
||||||
|
|
||||||
|
const assignmentStats = (metrics: AssignmentCompletionMetricsType) => {
|
||||||
|
if (!metrics.ranking_completed) {
|
||||||
|
return {
|
||||||
|
SUCCESS: 0,
|
||||||
|
FAIL: 0,
|
||||||
|
UNKNOWN: 0,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
SUCCESS: metrics.passed_count,
|
||||||
|
FAIL: metrics.failed_count,
|
||||||
|
UNKNOWN: metrics.unranked_count,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
const total = (metrics: AssignmentCompletionMetricsType) => {
|
||||||
|
return metrics.passed_count + metrics.failed_count;
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<main v-if="statistics">
|
||||||
|
<div class="mb-10 flex items-center justify-between">
|
||||||
|
<h3>{{ $t("a.Arbeiten") }}</h3>
|
||||||
|
<ItDropdownSelect
|
||||||
|
:model-value="dashboardStore.currentDashboardConfig"
|
||||||
|
class="mt-4 w-full lg:mt-0 lg:w-96"
|
||||||
|
:items="dashboardStore.dashboardConfigs"
|
||||||
|
@update:model-value="dashboardStore.switchAndLoadDashboardConfig"
|
||||||
|
></ItDropdownSelect>
|
||||||
|
</div>
|
||||||
|
<div v-if="statistics.assignments.records" class="mt-8 bg-white">
|
||||||
|
<StatisticFilterList
|
||||||
|
:course-session-properties="statistics.course_session_properties"
|
||||||
|
:items="statistics.assignments.records"
|
||||||
|
>
|
||||||
|
<template #default="{ item }">
|
||||||
|
<div class="flex justify-between">
|
||||||
|
<div>
|
||||||
|
<h4 class="font-bold">
|
||||||
|
{{ (item as AssignmentStatisticsRecordType).assignment_title }}
|
||||||
|
</h4>
|
||||||
|
<div>
|
||||||
|
Durchführung «{{ courseSessionName(item.course_session_id) }}» - Circle
|
||||||
|
«{{ circleMeta(item.circle_id)?.name }}»
|
||||||
|
</div>
|
||||||
|
<div class="mt-4">
|
||||||
|
Abgabetermin:
|
||||||
|
{{
|
||||||
|
getDateString(
|
||||||
|
dayjs((item as AssignmentStatisticsRecordType).deadline)
|
||||||
|
)
|
||||||
|
}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<div
|
||||||
|
v-if="(item as AssignmentStatisticsRecordType).metrics.ranking_completed"
|
||||||
|
>
|
||||||
|
{{ (item as AssignmentStatisticsRecordType).metrics.passed_count }} von
|
||||||
|
{{ total((item as AssignmentStatisticsRecordType).metrics) }}
|
||||||
|
bestanden
|
||||||
|
</div>
|
||||||
|
<div v-else>Noch nicht bestätigt</div>
|
||||||
|
<ItProgress
|
||||||
|
:status-count="
|
||||||
|
assignmentStats((item as AssignmentStatisticsRecordType).metrics)
|
||||||
|
"
|
||||||
|
></ItProgress>
|
||||||
|
<router-link
|
||||||
|
class="underline"
|
||||||
|
:to="(item as AssignmentStatisticsRecordType).details_url"
|
||||||
|
>
|
||||||
|
{{ $t("a.Details anschauen") }}
|
||||||
|
</router-link>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</StatisticFilterList>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
</template>
|
||||||
|
|
@ -37,7 +37,10 @@ const { courseSessionName, circleMeta } = useCourseStatistics();
|
||||||
<template #default="{ item }">
|
<template #default="{ item }">
|
||||||
<div class="flex justify-between">
|
<div class="flex justify-between">
|
||||||
<div>
|
<div>
|
||||||
<h4 class="font-bold">{{ $t("a.Selbsteinschätzung") }}: TODO</h4>
|
<h4 class="font-bold">
|
||||||
|
{{ $t("a.Selbsteinschätzung") }}:
|
||||||
|
{{ (item as CompetenceRecordStatisticsType).title }}
|
||||||
|
</h4>
|
||||||
<div>
|
<div>
|
||||||
Durchführung «{{ courseSessionName(item.course_session_id) }}» - Circle
|
Durchführung «{{ courseSessionName(item.course_session_id) }}» - Circle
|
||||||
«{{ circleMeta(item.circle_id)?.name }}»
|
«{{ circleMeta(item.circle_id)?.name }}»
|
||||||
|
|
|
||||||
|
|
@ -186,7 +186,7 @@ const router = createRouter({
|
||||||
{
|
{
|
||||||
path: "assignment",
|
path: "assignment",
|
||||||
props: true,
|
props: true,
|
||||||
component: () => import("@/pages/dashboard/statistic/AttendanceList.vue"),
|
component: () => import("@/pages/dashboard/statistic/AssignmentList.vue"),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "competence",
|
path: "competence",
|
||||||
|
|
|
||||||
|
|
@ -46,7 +46,9 @@ class AssignmentStatisticsSummaryType(graphene.ObjectType):
|
||||||
|
|
||||||
class AssignmentsStatisticsType(graphene.ObjectType):
|
class AssignmentsStatisticsType(graphene.ObjectType):
|
||||||
_id = graphene.ID(required=True)
|
_id = graphene.ID(required=True)
|
||||||
records = graphene.List(AssignmentStatisticsRecordType, required=True)
|
records = graphene.List(
|
||||||
|
graphene.NonNull(AssignmentStatisticsRecordType), required=True
|
||||||
|
)
|
||||||
summary = graphene.Field(AssignmentStatisticsSummaryType, required=True)
|
summary = graphene.Field(AssignmentStatisticsSummaryType, required=True)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue