diff --git a/client/src/colors.json b/client/src/colors.json index f49a11b6..77490890 100644 --- a/client/src/colors.json +++ b/client/src/colors.json @@ -3,6 +3,10 @@ "current": "currentColor", "white": "#ffffff", "black": "#0A0A0A", + "error-red": { + "200": "#FEDADA", + "500": "#DD2424" + }, "blue": { "200": "#D2E0FA", "300": "#B4CCFA", diff --git a/client/src/gql/gql.ts b/client/src/gql/gql.ts index c5616dce..68842432 100644 --- a/client/src/gql/gql.ts +++ b/client/src/gql/gql.ts @@ -19,7 +19,7 @@ const documents = { "\n query attendanceCheckQuery($courseSessionId: ID!) {\n course_session_attendance_course(id: $courseSessionId) {\n id\n attendance_user_list {\n user_id\n status\n }\n }\n }\n": types.AttendanceCheckQueryDocument, "\n query assignmentCompletionQuery(\n $assignmentId: ID!\n $courseSessionId: ID!\n $learningContentId: ID\n $assignmentUserId: UUID\n ) {\n assignment(id: $assignmentId) {\n assignment_type\n needs_expert_evaluation\n max_points\n content_type\n effort_required\n evaluation_description\n evaluation_document_url\n evaluation_tasks\n id\n intro_text\n performance_objectives\n slug\n tasks\n title\n translation_key\n competence_certificate {\n ...CoursePageFields\n }\n }\n assignment_completion(\n assignment_id: $assignmentId\n course_session_id: $courseSessionId\n assignment_user_id: $assignmentUserId\n learning_content_page_id: $learningContentId\n ) {\n id\n completion_status\n submitted_at\n evaluation_submitted_at\n evaluation_user {\n id\n }\n assignment_user {\n id\n }\n evaluation_points\n evaluation_max_points\n evaluation_passed\n completion_data\n }\n }\n": types.AssignmentCompletionQueryDocument, "\n query courseQuery($courseId: Int!) {\n course(id: $courseId) {\n id\n slug\n title\n category_name\n learning_path {\n id\n }\n }\n }\n": types.CourseQueryDocument, - "\n query competenceCertificateQuery($courseSlug: String!, $courseSessionId: ID!) {\n competence_certificate_list(course_slug: $courseSlug) {\n ...CoursePageFields\n competence_certificates {\n ...CoursePageFields\n assignments {\n ...CoursePageFields\n assignment_type\n max_points\n completion(course_session_id: $courseSessionId) {\n id\n completion_status\n submitted_at\n evaluation_points\n }\n learning_content {\n title\n id\n slug\n content_type\n frontend_url\n circle {\n ...CoursePageFields\n }\n }\n }\n }\n }\n }\n": types.CompetenceCertificateQueryDocument, + "\n query competenceCertificateQuery($courseSlug: String!, $courseSessionId: ID!) {\n competence_certificate_list(course_slug: $courseSlug) {\n ...CoursePageFields\n competence_certificates {\n ...CoursePageFields\n assignments {\n ...CoursePageFields\n assignment_type\n max_points\n completion(course_session_id: $courseSessionId) {\n id\n completion_status\n submitted_at\n evaluation_points\n evaluation_max_points\n evaluation_passed\n }\n learning_content {\n title\n id\n slug\n content_type\n frontend_url\n circle {\n ...CoursePageFields\n }\n }\n }\n }\n }\n }\n": types.CompetenceCertificateQueryDocument, "\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, }; @@ -64,7 +64,7 @@ export function graphql(source: "\n query courseQuery($courseId: Int!) {\n c /** * 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 competenceCertificateQuery($courseSlug: String!, $courseSessionId: ID!) {\n competence_certificate_list(course_slug: $courseSlug) {\n ...CoursePageFields\n competence_certificates {\n ...CoursePageFields\n assignments {\n ...CoursePageFields\n assignment_type\n max_points\n completion(course_session_id: $courseSessionId) {\n id\n completion_status\n submitted_at\n evaluation_points\n }\n learning_content {\n title\n id\n slug\n content_type\n frontend_url\n circle {\n ...CoursePageFields\n }\n }\n }\n }\n }\n }\n"): (typeof documents)["\n query competenceCertificateQuery($courseSlug: String!, $courseSessionId: ID!) {\n competence_certificate_list(course_slug: $courseSlug) {\n ...CoursePageFields\n competence_certificates {\n ...CoursePageFields\n assignments {\n ...CoursePageFields\n assignment_type\n max_points\n completion(course_session_id: $courseSessionId) {\n id\n completion_status\n submitted_at\n evaluation_points\n }\n learning_content {\n title\n id\n slug\n content_type\n frontend_url\n circle {\n ...CoursePageFields\n }\n }\n }\n }\n }\n }\n"]; +export function graphql(source: "\n query competenceCertificateQuery($courseSlug: String!, $courseSessionId: ID!) {\n competence_certificate_list(course_slug: $courseSlug) {\n ...CoursePageFields\n competence_certificates {\n ...CoursePageFields\n assignments {\n ...CoursePageFields\n assignment_type\n max_points\n completion(course_session_id: $courseSessionId) {\n id\n completion_status\n submitted_at\n evaluation_points\n evaluation_max_points\n evaluation_passed\n }\n learning_content {\n title\n id\n slug\n content_type\n frontend_url\n circle {\n ...CoursePageFields\n }\n }\n }\n }\n }\n }\n"): (typeof documents)["\n query competenceCertificateQuery($courseSlug: String!, $courseSessionId: ID!) {\n competence_certificate_list(course_slug: $courseSlug) {\n ...CoursePageFields\n competence_certificates {\n ...CoursePageFields\n assignments {\n ...CoursePageFields\n assignment_type\n max_points\n completion(course_session_id: $courseSessionId) {\n id\n completion_status\n submitted_at\n evaluation_points\n evaluation_max_points\n evaluation_passed\n }\n learning_content {\n title\n id\n slug\n content_type\n frontend_url\n circle {\n ...CoursePageFields\n }\n }\n }\n }\n }\n }\n"]; /** * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. */ diff --git a/client/src/gql/graphql.ts b/client/src/gql/graphql.ts index 8ccd1166..1506ba90 100644 --- a/client/src/gql/graphql.ts +++ b/client/src/gql/graphql.ts @@ -755,7 +755,7 @@ export type CompetenceCertificateQueryQueryVariables = Exact<{ export type CompetenceCertificateQueryQuery = { __typename?: 'Query', competence_certificate_list?: ( { __typename?: 'CompetenceCertificateListObjectType', competence_certificates?: Array<( { __typename?: 'CompetenceCertificateObjectType', assignments?: Array<( - { __typename?: 'AssignmentObjectType', assignment_type: AssignmentAssignmentAssignmentTypeChoices, max_points?: number | null, completion?: { __typename?: 'AssignmentCompletionObjectType', id: any, completion_status: AssignmentAssignmentCompletionCompletionStatusChoices, submitted_at?: any | null, evaluation_points?: number | null } | null, learning_content?: { __typename?: 'LearningContentAssignmentObjectType', title?: string | null, id?: string | null, slug?: string | null, content_type?: string | null, frontend_url?: string | null, circle?: ( + { __typename?: 'AssignmentObjectType', assignment_type: AssignmentAssignmentAssignmentTypeChoices, max_points?: number | null, completion?: { __typename?: 'AssignmentCompletionObjectType', id: any, completion_status: AssignmentAssignmentCompletionCompletionStatusChoices, submitted_at?: any | null, evaluation_points?: number | null, evaluation_max_points?: number | null, evaluation_passed?: boolean | null } | null, learning_content?: { __typename?: 'LearningContentAssignmentObjectType', title?: string | null, id?: string | null, slug?: string | null, content_type?: string | null, frontend_url?: string | null, circle?: ( { __typename?: 'CircleObjectType' } & { ' $fragmentRefs'?: { 'CoursePageFieldsCircleObjectTypeFragment': CoursePageFieldsCircleObjectTypeFragment } } ) | null } | { __typename?: 'LearningContentAttendanceCourseObjectType', title?: string | null, id?: string | null, slug?: string | null, content_type?: string | null, frontend_url?: string | null, circle?: ( @@ -809,5 +809,5 @@ export const UpsertAssignmentCompletionDocument = {"kind":"Document","definition export const AttendanceCheckQueryDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"attendanceCheckQuery"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"courseSessionId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"course_session_attendance_course"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"courseSessionId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"attendance_user_list"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"user_id"}},{"kind":"Field","name":{"kind":"Name","value":"status"}}]}}]}}]}}]} as unknown as DocumentNode; export const AssignmentCompletionQueryDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"assignmentCompletionQuery"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"assignmentId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"courseSessionId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"learningContentId"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"assignmentUserId"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"UUID"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"assignment"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"assignmentId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"assignment_type"}},{"kind":"Field","name":{"kind":"Name","value":"needs_expert_evaluation"}},{"kind":"Field","name":{"kind":"Name","value":"max_points"}},{"kind":"Field","name":{"kind":"Name","value":"content_type"}},{"kind":"Field","name":{"kind":"Name","value":"effort_required"}},{"kind":"Field","name":{"kind":"Name","value":"evaluation_description"}},{"kind":"Field","name":{"kind":"Name","value":"evaluation_document_url"}},{"kind":"Field","name":{"kind":"Name","value":"evaluation_tasks"}},{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"intro_text"}},{"kind":"Field","name":{"kind":"Name","value":"performance_objectives"}},{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"tasks"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"translation_key"}},{"kind":"Field","name":{"kind":"Name","value":"competence_certificate"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CoursePageFields"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"assignment_completion"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"assignment_id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"assignmentId"}}},{"kind":"Argument","name":{"kind":"Name","value":"course_session_id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"courseSessionId"}}},{"kind":"Argument","name":{"kind":"Name","value":"assignment_user_id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"assignmentUserId"}}},{"kind":"Argument","name":{"kind":"Name","value":"learning_content_page_id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"learningContentId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"completion_status"}},{"kind":"Field","name":{"kind":"Name","value":"submitted_at"}},{"kind":"Field","name":{"kind":"Name","value":"evaluation_submitted_at"}},{"kind":"Field","name":{"kind":"Name","value":"evaluation_user"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}},{"kind":"Field","name":{"kind":"Name","value":"assignment_user"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}},{"kind":"Field","name":{"kind":"Name","value":"evaluation_points"}},{"kind":"Field","name":{"kind":"Name","value":"evaluation_max_points"}},{"kind":"Field","name":{"kind":"Name","value":"evaluation_passed"}},{"kind":"Field","name":{"kind":"Name","value":"completion_data"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CoursePageFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"CoursePageInterface"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"content_type"}},{"kind":"Field","name":{"kind":"Name","value":"frontend_url"}}]}}]} as unknown as DocumentNode; export const CourseQueryDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"courseQuery"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"courseId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"course"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"courseId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"category_name"}},{"kind":"Field","name":{"kind":"Name","value":"learning_path"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}}]}}]}}]} as unknown as DocumentNode; -export const CompetenceCertificateQueryDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"competenceCertificateQuery"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"courseSlug"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"courseSessionId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"competence_certificate_list"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"course_slug"},"value":{"kind":"Variable","name":{"kind":"Name","value":"courseSlug"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CoursePageFields"}},{"kind":"Field","name":{"kind":"Name","value":"competence_certificates"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CoursePageFields"}},{"kind":"Field","name":{"kind":"Name","value":"assignments"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CoursePageFields"}},{"kind":"Field","name":{"kind":"Name","value":"assignment_type"}},{"kind":"Field","name":{"kind":"Name","value":"max_points"}},{"kind":"Field","name":{"kind":"Name","value":"completion"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"course_session_id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"courseSessionId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"completion_status"}},{"kind":"Field","name":{"kind":"Name","value":"submitted_at"}},{"kind":"Field","name":{"kind":"Name","value":"evaluation_points"}}]}},{"kind":"Field","name":{"kind":"Name","value":"learning_content"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"content_type"}},{"kind":"Field","name":{"kind":"Name","value":"frontend_url"}},{"kind":"Field","name":{"kind":"Name","value":"circle"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CoursePageFields"}}]}}]}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CoursePageFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"CoursePageInterface"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"content_type"}},{"kind":"Field","name":{"kind":"Name","value":"frontend_url"}}]}}]} as unknown as DocumentNode; +export const CompetenceCertificateQueryDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"competenceCertificateQuery"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"courseSlug"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"courseSessionId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"competence_certificate_list"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"course_slug"},"value":{"kind":"Variable","name":{"kind":"Name","value":"courseSlug"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CoursePageFields"}},{"kind":"Field","name":{"kind":"Name","value":"competence_certificates"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CoursePageFields"}},{"kind":"Field","name":{"kind":"Name","value":"assignments"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CoursePageFields"}},{"kind":"Field","name":{"kind":"Name","value":"assignment_type"}},{"kind":"Field","name":{"kind":"Name","value":"max_points"}},{"kind":"Field","name":{"kind":"Name","value":"completion"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"course_session_id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"courseSessionId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"completion_status"}},{"kind":"Field","name":{"kind":"Name","value":"submitted_at"}},{"kind":"Field","name":{"kind":"Name","value":"evaluation_points"}},{"kind":"Field","name":{"kind":"Name","value":"evaluation_max_points"}},{"kind":"Field","name":{"kind":"Name","value":"evaluation_passed"}}]}},{"kind":"Field","name":{"kind":"Name","value":"learning_content"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"content_type"}},{"kind":"Field","name":{"kind":"Name","value":"frontend_url"}},{"kind":"Field","name":{"kind":"Name","value":"circle"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CoursePageFields"}}]}}]}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CoursePageFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"CoursePageInterface"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"content_type"}},{"kind":"Field","name":{"kind":"Name","value":"frontend_url"}}]}}]} as unknown as DocumentNode; export const SendFeedbackMutationDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"SendFeedbackMutation"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"courseSessionId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"learningContentId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"data"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"GenericScalar"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"submitted"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Boolean"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"send_feedback"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"course_session_id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"courseSessionId"}}},{"kind":"Argument","name":{"kind":"Name","value":"learning_content_page_id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"learningContentId"}}},{"kind":"Argument","name":{"kind":"Name","value":"data"},"value":{"kind":"Variable","name":{"kind":"Name","value":"data"}}},{"kind":"Argument","name":{"kind":"Name","value":"submitted"},"value":{"kind":"Variable","name":{"kind":"Name","value":"submitted"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"feedback_response"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"data"}},{"kind":"Field","name":{"kind":"Name","value":"submitted"}}]}},{"kind":"Field","name":{"kind":"Name","value":"errors"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"field"}},{"kind":"Field","name":{"kind":"Name","value":"messages"}}]}}]}}]}}]} as unknown as DocumentNode; \ No newline at end of file diff --git a/client/src/graphql/queries.ts b/client/src/graphql/queries.ts index 7acabe82..4ecc5998 100644 --- a/client/src/graphql/queries.ts +++ b/client/src/graphql/queries.ts @@ -103,6 +103,8 @@ export const COMPETENCE_NAVI_CERTIFICATE_QUERY = graphql(` completion_status submitted_at evaluation_points + evaluation_max_points + evaluation_passed } learning_content { title diff --git a/client/src/pages/cockpit/assignmentEvaluationPage/EvaluationSummary.vue b/client/src/pages/cockpit/assignmentEvaluationPage/EvaluationSummary.vue index d5726d75..ce53b692 100644 --- a/client/src/pages/cockpit/assignmentEvaluationPage/EvaluationSummary.vue +++ b/client/src/pages/cockpit/assignmentEvaluationPage/EvaluationSummary.vue @@ -103,9 +103,22 @@ const evaluationUser = computed(() => {
{{ $t("assignment.von x Punkten", { x: maxPoints }) }} + ({{ + ( + ((props.assignmentCompletion?.evaluation_points ?? 0) / + (props.assignmentCompletion?.evaluation_max_points ?? 1)) * + 100 + ).toFixed(0) + }}%)
+
+ + {{ $t("a.Nicht Bestanden") }} + +
+

{{ $t("assignment.evaluationInstrumentDescriptionText") }}

diff --git a/client/src/pages/cockpit/documentPage/DocumentUploadForm.vue b/client/src/pages/cockpit/documentPage/DocumentUploadForm.vue index 420eea55..1fbe6452 100644 --- a/client/src/pages/cockpit/documentPage/DocumentUploadForm.vue +++ b/client/src/pages/cockpit/documentPage/DocumentUploadForm.vue @@ -92,7 +92,7 @@ function showFileInformation() {

{{ formData.file.name }}

-

{{ $t("circlePage.documents.selectFile") }}

+

{{ $t("circlePage.documents.selectFile") }}

{{ $t("circlePage.documents.maxFileSize") }}

@@ -103,7 +103,7 @@ function showFileInformation() {

{{ $t("circlePage.documents.modalNameInformation") }}

-

{{ $t("circlePage.documents.chooseName") }}

+

{{ $t("circlePage.documents.chooseName") }}

@@ -116,13 +116,13 @@ function showFileInformation() { :items="props.learningSequences" >
-

+

{{ $t("circlePage.documents.chooseLearningSequence") }}

-

+

{{ $t("circlePage.documents.uploadErrorMessage") }}

diff --git a/client/src/pages/competence/CompetenceAssignmentRow.vue b/client/src/pages/competence/CompetenceAssignmentRow.vue index c1acb8ae..bfafef2d 100644 --- a/client/src/pages/competence/CompetenceAssignmentRow.vue +++ b/client/src/pages/competence/CompetenceAssignmentRow.vue @@ -35,6 +35,7 @@ const getIconName = () => { v-if="assignment.learning_content" :href="assignment.frontend_url" class="link" + data-cy="open-learning-content" > {{ $t("general.im circle x anschauen", { @@ -84,6 +85,19 @@ const getIconName = () => {
{{ $t("assignment.von x Punkten", { x: assignment.max_points }) }} + ({{ + ( + ((assignment.completion?.evaluation_points ?? 0) / + (assignment.completion?.evaluation_max_points ?? 1)) * + 100 + ).toFixed(0) + }}%) +
+
+ {{ $t("a.Nicht Bestanden") }}
diff --git a/client/src/pages/learningPath/learningContentPage/blocks/EdoniqTestBlock.vue b/client/src/pages/learningPath/learningContentPage/blocks/EdoniqTestBlock.vue index 103af4ef..6904adad 100644 --- a/client/src/pages/learningPath/learningContentPage/blocks/EdoniqTestBlock.vue +++ b/client/src/pages/learningPath/learningContentPage/blocks/EdoniqTestBlock.vue @@ -150,7 +150,7 @@ async function startTest() {
-
+
{{ $t("edoniqTest.deadlineInPast") }}
@@ -162,7 +162,7 @@ async function startTest() {
-
+
{{ $t("a.Resultat") }}: @@ -173,7 +173,20 @@ async function startTest() { $t("assignment.von x Punkten", { x: assignmentCompletion.evaluation_max_points, }) - }} + }}, + {{ + ( + ((assignmentCompletion.evaluation_points ?? 0) / + (assignmentCompletion.evaluation_max_points ?? 1)) * + 100 + ).toFixed(0) + }}%, + + ({{ $t("a.Bestanden") }}) + + + ({{ $t("a.Nicht Bestanden") }}) +
diff --git a/client/src/types.ts b/client/src/types.ts index dc7afd26..5219e900 100644 --- a/client/src/types.ts +++ b/client/src/types.ts @@ -424,6 +424,8 @@ export interface CompetenceCertificateAssignment extends BaseCourseWagtailPage { completion_status: AssignmentCompletionStatus; evaluation_submitted_at: string | null; evaluation_points: number | null; + evaluation_max_points: number | null; + evaluation_passed: boolean | null; } | null; } diff --git a/cypress/e2e/appointments.cy.js b/cypress/e2e/appointments.cy.js index e3f618f5..cc660032 100644 --- a/cypress/e2e/appointments.cy.js +++ b/cypress/e2e/appointments.cy.js @@ -1,4 +1,4 @@ -import {login} from "./helpers"; +import { login } from "./helpers"; // constants const COURSE_SELECT = "[data-cy=appointments-course-select]"; @@ -19,7 +19,7 @@ describe("appointments.cy.js", () => { cy.get(SESSION_SELECT).should("contain", "Bern"); cy.get(CIRCLE_SELECT).should("contain", "Alle"); - cy.get(".cy-single-due-date").should("have.length", 4); + cy.get(".cy-single-due-date").should("have.length", 5); }); it("can filter by circle", () => { diff --git a/cypress/e2e/assignment/assignmentStudent.cy.js b/cypress/e2e/assignment/assignmentStudent.cy.js index da74d8d9..1a686c55 100644 --- a/cypress/e2e/assignment/assignmentStudent.cy.js +++ b/cypress/e2e/assignment/assignmentStudent.cy.js @@ -111,7 +111,7 @@ describe("assignmentStudent.cy.js", () => { }); }); - it.only("can make complete assignment", () => { + it("can make complete assignment", () => { cy.learningContentMultiLayoutNextStep(); cy.testLearningContentTitle( "Teilaufgabe 1: Beispiel einer Versicherungspolice finden" diff --git a/cypress/e2e/assignment/assignmentTrainer.cy.js b/cypress/e2e/assignment/assignmentTrainer.cy.js index 998e0686..7685dcef 100644 --- a/cypress/e2e/assignment/assignmentTrainer.cy.js +++ b/cypress/e2e/assignment/assignmentTrainer.cy.js @@ -91,7 +91,7 @@ describe("assignmentTrainer.cy.js", () => { }); }); - it.only("can make complete evaluation", () => { + it("can make complete evaluation", () => { cy.visit("/course/test-lehrgang/cockpit"); cy.get( '[data-cy="show-details-btn-test-lehrgang-lp-circle-fahrzeug-lc-überprüfen-einer-motorfahrzeug-versicherungspolice"]' diff --git a/cypress/e2e/competenceNavi/competenceCertificate.cy.js b/cypress/e2e/competenceNavi/competenceCertificate.cy.js index 0bbff9f0..9b679590 100644 --- a/cypress/e2e/competenceNavi/competenceCertificate.cy.js +++ b/cypress/e2e/competenceNavi/competenceCertificate.cy.js @@ -90,7 +90,46 @@ describe("competenceCertificate.cy.js", () => { '[data-cy="assignment-test-lehrgang-assignment-edoniq-wissens-und-verständisfragen-circle-fahrzeug-demo"]' ) .should("contain", "19") - .and("contain", "Bewertung freigegeben"); + .and("contain", "Bewertung freigegeben") + .and("not.contain", "Nicht Bestanden"); + + // it can open learning content page directly + cy.get( + '[data-cy="assignment-test-lehrgang-assignment-edoniq-wissens-und-verständisfragen-circle-fahrzeug-demo"] [data-cy="open-learning-content"]' + ).click(); + cy.get('[data-cy="test-result"]') + .should("contain", "19 von 24 Punkten") + .and("contain", "79%") + .and("contain", "Bestanden"); + }); + + it("check with finished failed edoniq test", () => { + cy.manageCommand( + "cypress_reset --create-assignment-completion --create-edoniq-test-results 10 24" + ); + login("test-student1@example.com", "test"); + + // go to certificate detail page + cy.visit( + "/course/test-lehrgang/competence/certificates/kompetenznachweis-1" + ); + + cy.get( + '[data-cy="assignment-test-lehrgang-assignment-edoniq-wissens-und-verständisfragen-circle-fahrzeug-demo"]' + ) + .should("contain", "10") + .and("contain", "Bewertung freigegeben") + .and("contain", "42%") + .and("contain", "Nicht Bestanden"); + + // it can open learning content page directly + cy.get( + '[data-cy="assignment-test-lehrgang-assignment-edoniq-wissens-und-verständisfragen-circle-fahrzeug-demo"] [data-cy="open-learning-content"]' + ).click(); + cy.get('[data-cy="test-result"]') + .should("contain", "10 von 24 Punkten") + .and("contain", "42%") + .and("contain", "Nicht Bestanden"); }); it("check with finished edoniq test and finished casework", () => { diff --git a/server/vbv_lernwelt/core/management/commands/cypress_reset.py b/server/vbv_lernwelt/core/management/commands/cypress_reset.py index 4d021aab..12fc46b6 100644 --- a/server/vbv_lernwelt/core/management/commands/cypress_reset.py +++ b/server/vbv_lernwelt/core/management/commands/cypress_reset.py @@ -32,6 +32,11 @@ from vbv_lernwelt.notify.models import Notification default=False, help="will create assignment evaluation data for test-student1@example.com", ) +@click.option( + "--assignment-evaluation-scores", + default=None, + help="Provide assignment evaluation scores in the format: 6,6,6,3,3", +) @click.option( "--create-edoniq-test-results", type=(int, int), @@ -47,6 +52,7 @@ from vbv_lernwelt.notify.models import Notification def command( create_assignment_completion, create_assignment_evaluation, + assignment_evaluation_scores, create_edoniq_test_results, create_feedback_responses, ): @@ -68,7 +74,16 @@ def command( user=User.objects.get(id=TEST_STUDENT1_USER_ID), ) if create_assignment_evaluation: - print("create assignment evaulation data for test course") + if not assignment_evaluation_scores: + assignment_evaluation_scores = [6, 6, 6, 3, 3] + else: + assignment_evaluation_scores = tuple( + map(int, assignment_evaluation_scores.split(",")) + ) + print( + "create assignment evaluation data for test course", + assignment_evaluation_scores, + ) create_test_assignment_evaluation_data( assignment=Assignment.objects.get( slug="test-lehrgang-assignment-überprüfen-einer-motorfahrzeugs-versicherungspolice" @@ -76,6 +91,7 @@ def command( course_session=CourseSession.objects.get(id=TEST_COURSE_SESSION_BERN_ID), assignment_user=User.objects.get(id=TEST_STUDENT1_USER_ID), evaluation_user=User.objects.get(id=TEST_TRAINER1_USER_ID), + input_scores=assignment_evaluation_scores, ) user_points, max_points = create_edoniq_test_results diff --git a/server/vbv_lernwelt/core/views.py b/server/vbv_lernwelt/core/views.py index cc04c8e1..08584092 100644 --- a/server/vbv_lernwelt/core/views.py +++ b/server/vbv_lernwelt/core/views.py @@ -135,27 +135,33 @@ def check_rate_limit(request): def cypress_reset_view(request): if not settings.APP_ENVIRONMENT.startswith("prod"): # Checking for the flags in the POST request + options = {} + create_assignment_completion = ( request.data.get("create_assignment_completion") == "true" ) + if create_assignment_completion: + options["create_assignment_completion"] = create_assignment_completion + create_assignment_evaluation = ( request.data.get("create_assignment_evaluation") == "true" ) + if create_assignment_evaluation: + options["create_assignment_evaluation"] = create_assignment_evaluation + # assignment evaluation scores + assignment_evaluation_scores = request.data.get("assignment_evaluation_scores") + if assignment_evaluation_scores: + options["assignment_evaluation_scores"] = assignment_evaluation_scores + create_feedback_responses = ( request.data.get("create_feedback_responses") == "true" ) + if create_feedback_responses: + options["create_feedback_responses"] = create_feedback_responses # edoniq test results edoniq_test_user_points = request.data.get("edoniq_test_user_points") edoniq_test_max_points = request.data.get("edoniq_test_max_points") - - options = {} - if create_assignment_completion: - options["create_assignment_completion"] = create_assignment_completion - if create_assignment_evaluation: - options["create_assignment_evaluation"] = create_assignment_evaluation - if create_feedback_responses: - options["create_feedback_responses"] = create_feedback_responses if bool(edoniq_test_user_points and edoniq_test_max_points): options["create_edoniq_test_results"] = ( int(edoniq_test_user_points), diff --git a/server/vbv_lernwelt/course/creators/test_course.py b/server/vbv_lernwelt/course/creators/test_course.py index 85986b61..04b510bc 100644 --- a/server/vbv_lernwelt/course/creators/test_course.py +++ b/server/vbv_lernwelt/course/creators/test_course.py @@ -252,14 +252,18 @@ def create_test_assignment_submitted_data(assignment, course_session, user): def create_test_assignment_evaluation_data( - assignment, course_session, assignment_user, evaluation_user + assignment, course_session, assignment_user, evaluation_user, input_scores=None ): if assignment and course_session and assignment_user and evaluation_user: subtasks = assignment.get_evaluation_tasks() evaluation_points = 0 for index, evaluation_task in enumerate(subtasks): - evaluation_points += evaluation_task["value"]["max_points"] + task_score = evaluation_task["value"]["max_points"] + if input_scores[index] < len(input_scores): + task_score = input_scores[index] + + evaluation_points += task_score update_assignment_completion( assignment_user=assignment_user, @@ -269,8 +273,8 @@ def create_test_assignment_evaluation_data( completion_data={ evaluation_task["id"]: { "expert_data": { - "points": evaluation_task["value"]["max_points"], - "text": "Gut gemacht!", + "points": task_score, + "text": f"Kriterium {index + 1}: Gut gemacht!", } }, }, diff --git a/server/vbv_lernwelt/templates/admin/index.html b/server/vbv_lernwelt/templates/admin/index.html index a0953118..da2faf49 100644 --- a/server/vbv_lernwelt/templates/admin/index.html +++ b/server/vbv_lernwelt/templates/admin/index.html @@ -55,6 +55,10 @@
+