Frontend: "Vorbereitungsauftrag"

This commit is contained in:
Daniel Egger 2023-05-19 15:57:31 +02:00
parent 951d9b42e6
commit 9be0ce9d39
27 changed files with 282 additions and 82 deletions

View File

@ -3,7 +3,7 @@
<div v-if="label" class="mb-2 block">{{ label }}</div>
<textarea
:value="modelValue"
class="h-40 w-full border-gray-500"
class="h-40 w-full border-gray-500 placeholder-gray-800 placeholder-opacity-100"
:data-cy="`it-textarea-${cyKey}`"
:disabled="disabled"
:placeholder="placeholder"

View File

@ -15,7 +15,7 @@ import type { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-
const documents = {
"\n mutation SendFeedbackMutation($input: SendFeedbackInput!) {\n send_feedback(input: $input) {\n feedback_response {\n id\n }\n errors {\n field\n messages\n }\n }\n }\n": types.SendFeedbackMutationDocument,
"\n mutation UpsertAssignmentCompletion(\n $assignmentId: ID!\n $courseSessionId: ID!\n $assignmentUserId: ID\n $completionStatus: String!\n $completionDataString: String!\n $evaluationGrade: Float\n $evaluationPoints: Float\n ) {\n upsert_assignment_completion(\n assignment_id: $assignmentId\n course_session_id: $courseSessionId\n assignment_user_id: $assignmentUserId\n completion_status: $completionStatus\n completion_data_string: $completionDataString\n evaluation_grade: $evaluationGrade\n evaluation_points: $evaluationPoints\n ) {\n assignment_completion {\n id\n completion_status\n submitted_at\n evaluation_submitted_at\n evaluation_grade\n evaluation_points\n completion_data\n }\n }\n }\n": types.UpsertAssignmentCompletionDocument,
"\n query assignmentCompletionQuery(\n $assignmentId: ID!\n $courseSessionId: ID!\n $assignmentUserId: ID\n ) {\n assignment(id: $assignmentId) {\n id\n content_type\n evaluation_description\n evaluation_document_url\n evaluation_tasks\n performance_objectives\n starting_position\n tasks\n title\n translation_key\n slug\n }\n assignment_completion(\n assignment_id: $assignmentId\n course_session_id: $courseSessionId\n assignment_user_id: $assignmentUserId\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_grade\n evaluation_points\n completion_data\n }\n }\n": types.AssignmentCompletionQueryDocument,
"\n query assignmentCompletionQuery(\n $assignmentId: ID!\n $courseSessionId: ID!\n $assignmentUserId: ID\n ) {\n assignment(id: $assignmentId) {\n assignment_type\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 }\n assignment_completion(\n assignment_id: $assignmentId\n course_session_id: $courseSessionId\n assignment_user_id: $assignmentUserId\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_grade\n evaluation_points\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,
};
@ -44,7 +44,7 @@ export function graphql(source: "\n mutation UpsertAssignmentCompletion(\n $
/**
* 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 assignmentCompletionQuery(\n $assignmentId: ID!\n $courseSessionId: ID!\n $assignmentUserId: ID\n ) {\n assignment(id: $assignmentId) {\n id\n content_type\n evaluation_description\n evaluation_document_url\n evaluation_tasks\n performance_objectives\n starting_position\n tasks\n title\n translation_key\n slug\n }\n assignment_completion(\n assignment_id: $assignmentId\n course_session_id: $courseSessionId\n assignment_user_id: $assignmentUserId\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_grade\n evaluation_points\n completion_data\n }\n }\n"): (typeof documents)["\n query assignmentCompletionQuery(\n $assignmentId: ID!\n $courseSessionId: ID!\n $assignmentUserId: ID\n ) {\n assignment(id: $assignmentId) {\n id\n content_type\n evaluation_description\n evaluation_document_url\n evaluation_tasks\n performance_objectives\n starting_position\n tasks\n title\n translation_key\n slug\n }\n assignment_completion(\n assignment_id: $assignmentId\n course_session_id: $courseSessionId\n assignment_user_id: $assignmentUserId\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_grade\n evaluation_points\n completion_data\n }\n }\n"];
export function graphql(source: "\n query assignmentCompletionQuery(\n $assignmentId: ID!\n $courseSessionId: ID!\n $assignmentUserId: ID\n ) {\n assignment(id: $assignmentId) {\n assignment_type\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 }\n assignment_completion(\n assignment_id: $assignmentId\n course_session_id: $courseSessionId\n assignment_user_id: $assignmentUserId\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_grade\n evaluation_points\n completion_data\n }\n }\n"): (typeof documents)["\n query assignmentCompletionQuery(\n $assignmentId: ID!\n $courseSessionId: ID!\n $assignmentUserId: ID\n ) {\n assignment(id: $assignmentId) {\n assignment_type\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 }\n assignment_completion(\n assignment_id: $assignmentId\n course_session_id: $courseSessionId\n assignment_user_id: $assignmentUserId\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_grade\n evaluation_points\n completion_data\n }\n }\n"];
/**
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
*/

View File

@ -34,6 +34,16 @@ export type Scalars = {
JSONString: any;
};
/** An enumeration. */
export enum AssignmentAssignmentAssignmentTypeChoices {
/** CASEWORK */
Casework = 'CASEWORK',
/** PREP_ASSIGNMENT */
PrepAssignment = 'PREP_ASSIGNMENT',
/** REFLECTION */
Reflection = 'REFLECTION'
}
/** An enumeration. */
export enum AssignmentAssignmentCompletionCompletionStatusChoices {
/** EVALUATION_IN_PROGRESS */
@ -70,6 +80,7 @@ export type AssignmentCompletionType = {
export type AssignmentType = CoursePageInterface & {
__typename?: 'AssignmentType';
assignment_type: AssignmentAssignmentAssignmentTypeChoices;
content_type?: Maybe<Scalars['String']>;
/** Zeitaufwand als Text */
effort_required: Scalars['String'];
@ -80,11 +91,11 @@ export type AssignmentType = CoursePageInterface & {
evaluation_tasks?: Maybe<Scalars['JSONStreamField']>;
frontend_url?: Maybe<Scalars['String']>;
id?: Maybe<Scalars['ID']>;
/** Erläuterung der Ausgangslage */
intro_text: Scalars['String'];
live?: Maybe<Scalars['Boolean']>;
performance_objectives?: Maybe<Scalars['JSONStreamField']>;
slug?: Maybe<Scalars['String']>;
/** Erläuterung der Ausgangslage */
starting_position: Scalars['String'];
tasks?: Maybe<Scalars['JSONStreamField']>;
title?: Maybe<Scalars['String']>;
translation_key?: Maybe<Scalars['String']>;
@ -273,7 +284,7 @@ export type AssignmentCompletionQueryQueryVariables = Exact<{
}>;
export type AssignmentCompletionQueryQuery = { __typename?: 'Query', assignment?: { __typename?: 'AssignmentType', id?: string | null, content_type?: string | null, evaluation_description: string, evaluation_document_url: string, evaluation_tasks?: any | null, performance_objectives?: any | null, starting_position: string, tasks?: any | null, title?: string | null, translation_key?: string | null, slug?: string | null } | null, assignment_completion?: { __typename?: 'AssignmentCompletionType', id: string, completion_status: AssignmentAssignmentCompletionCompletionStatusChoices, submitted_at?: any | null, evaluation_submitted_at?: any | null, evaluation_grade?: number | null, evaluation_points?: number | null, completion_data?: any | null, evaluation_user?: { __typename?: 'UserType', id: string } | null, assignment_user: { __typename?: 'UserType', id: string } } | null };
export type AssignmentCompletionQueryQuery = { __typename?: 'Query', assignment?: { __typename?: 'AssignmentType', assignment_type: AssignmentAssignmentAssignmentTypeChoices, content_type?: string | null, effort_required: string, evaluation_description: string, evaluation_document_url: string, evaluation_tasks?: any | null, id?: string | null, intro_text: string, performance_objectives?: any | null, slug?: string | null, tasks?: any | null, title?: string | null, translation_key?: string | null } | null, assignment_completion?: { __typename?: 'AssignmentCompletionType', id: string, completion_status: AssignmentAssignmentCompletionCompletionStatusChoices, submitted_at?: any | null, evaluation_submitted_at?: any | null, evaluation_grade?: number | null, evaluation_points?: number | null, completion_data?: any | null, evaluation_user?: { __typename?: 'UserType', id: string } | null, assignment_user: { __typename?: 'UserType', id: string } } | null };
export type CourseQueryQueryVariables = Exact<{
courseId: Scalars['Int'];
@ -285,5 +296,5 @@ export type CourseQueryQuery = { __typename?: 'Query', course?: { __typename?: '
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":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"SendFeedbackInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"send_feedback"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"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":"errors"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"field"}},{"kind":"Field","name":{"kind":"Name","value":"messages"}}]}}]}}]}}]} as unknown as DocumentNode<SendFeedbackMutationMutation, SendFeedbackMutationMutationVariables>;
export const UpsertAssignmentCompletionDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"UpsertAssignmentCompletion"},"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":"assignmentUserId"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"completionStatus"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"completionDataString"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"evaluationGrade"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Float"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"evaluationPoints"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Float"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"upsert_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":"completion_status"},"value":{"kind":"Variable","name":{"kind":"Name","value":"completionStatus"}}},{"kind":"Argument","name":{"kind":"Name","value":"completion_data_string"},"value":{"kind":"Variable","name":{"kind":"Name","value":"completionDataString"}}},{"kind":"Argument","name":{"kind":"Name","value":"evaluation_grade"},"value":{"kind":"Variable","name":{"kind":"Name","value":"evaluationGrade"}}},{"kind":"Argument","name":{"kind":"Name","value":"evaluation_points"},"value":{"kind":"Variable","name":{"kind":"Name","value":"evaluationPoints"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"assignment_completion"},"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_grade"}},{"kind":"Field","name":{"kind":"Name","value":"evaluation_points"}},{"kind":"Field","name":{"kind":"Name","value":"completion_data"}}]}}]}}]}}]} as unknown as DocumentNode<UpsertAssignmentCompletionMutation, UpsertAssignmentCompletionMutationVariables>;
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":"assignmentUserId"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}],"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":"id"}},{"kind":"Field","name":{"kind":"Name","value":"content_type"}},{"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":"performance_objectives"}},{"kind":"Field","name":{"kind":"Name","value":"starting_position"}},{"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":"slug"}}]}},{"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"}}}],"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_grade"}},{"kind":"Field","name":{"kind":"Name","value":"evaluation_points"}},{"kind":"Field","name":{"kind":"Name","value":"completion_data"}}]}}]}}]} as unknown as DocumentNode<AssignmentCompletionQueryQuery, AssignmentCompletionQueryQueryVariables>;
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":"assignmentUserId"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}],"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":"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":"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"}}}],"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_grade"}},{"kind":"Field","name":{"kind":"Name","value":"evaluation_points"}},{"kind":"Field","name":{"kind":"Name","value":"completion_data"}}]}}]}}]} as unknown as DocumentNode<AssignmentCompletionQueryQuery, AssignmentCompletionQueryQueryVariables>;
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<CourseQueryQuery, CourseQueryQueryVariables>;

View File

@ -97,8 +97,10 @@ enum CoreUserLanguageChoices {
}
type AssignmentType implements CoursePageInterface {
assignment_type: AssignmentAssignmentAssignmentTypeChoices!
"""Erläuterung der Ausgangslage"""
starting_position: String!
intro_text: String!
"""Zeitaufwand als Text"""
effort_required: String!
@ -120,6 +122,18 @@ type AssignmentType implements CoursePageInterface {
performance_objectives: JSONStreamField
}
"""An enumeration."""
enum AssignmentAssignmentAssignmentTypeChoices {
"""CASEWORK"""
CASEWORK
"""PREP_ASSIGNMENT"""
PREP_ASSIGNMENT
"""REFLECTION"""
REFLECTION
}
scalar JSONStreamField
type AssignmentCompletionType {

View File

@ -7,17 +7,19 @@ export const ASSIGNMENT_COMPLETION_QUERY = graphql(`
$assignmentUserId: ID
) {
assignment(id: $assignmentId) {
id
assignment_type
content_type
effort_required
evaluation_description
evaluation_document_url
evaluation_tasks
id
intro_text
performance_objectives
starting_position
slug
tasks
title
translation_key
slug
}
assignment_completion(
assignment_id: $assignmentId

View File

@ -74,7 +74,11 @@ async function startEvaluation() {
</p>
<div>
<button class="btn-primary" data-cy="start-evaluation" @click="startEvaluation()">
<button
class="btn-primary text-large"
data-cy="start-evaluation"
@click="startEvaluation()"
>
<span
v-if="
props.assignmentCompletion.completion_status === 'EVALUATION_IN_PROGRESS'

View File

@ -137,7 +137,7 @@ const evaluationUser = computed(() => {
Uhr
</div>
<div v-else>
<button class="btn-primary" @click="submitEvaluation()">
<button class="btn-primary text-large" @click="submitEvaluation()">
Bewertung freigeben
</button>
</div>
@ -153,7 +153,7 @@ const evaluationUser = computed(() => {
<div v-for="(task, index) in props.assignment.evaluation_tasks" :key="task.id">
<article class="border-t py-4">
<div class="flex flex-row justify-between">
<div class="mb-4">
<div class="mb-4 text-gray-900">
Bewertungskriterium {{ index + 1 }}: {{ task.value.title }}
</div>
<div

View File

@ -66,9 +66,9 @@ const assignmentDetail = computed(() =>
</div>
<div>
<router-link :to="props.assignment.frontend_url" class="link">
<a :href="props.assignment.frontend_url" class="link" target="_blank">
Im Circle anzeigen
</router-link>
</a>
</div>
<div class="mt-4">

View File

@ -44,7 +44,7 @@ onMounted(async () => {
{{ props.assignment.title }}
</div>
<div><ItProgress :status-count="state.progressStatusCount" /></div>
<div>
<div class="text-gray-900" :class="{ 'text-gray-900': showTitle }">
{{ state.progressStatusCount.success || 0 }} von
{{
(state.progressStatusCount.success || 0) +

View File

@ -34,7 +34,7 @@ const assignments = computed(() => {
<div>Geleitete Fallarbeiten</div>
</h3>
<div v-for="assignment in assignments" :key="assignment.id">
<div v-for="assignment in assignments" :key="assignment.id" class="mb-4">
<AssignmentSubmissionProgress
:show-title="true"
:course-session="props.courseSession"

View File

@ -17,30 +17,25 @@ const step = useRouteQuery("step");
<template>
<!-- eslint-disable vue/no-v-html -->
<h3 class="mt-8">{{ $t("assignment.initialSituationTitle") }}</h3>
<p
v-if="props.assignment.starting_position"
v-if="props.assignment.intro_text"
class="default-wagtail-rich-text text-large"
v-html="props.assignment.starting_position"
v-html="props.assignment.intro_text"
></p>
<h3 class="mt-8">{{ $t("assignment.taskDefinitionTitle") }}</h3>
<h3 class="mb-4 mt-8">{{ $t("assignment.taskDefinitionTitle") }}</h3>
<p class="text-large">
{{ $t("assignment.taskDefinition") }}
</p>
<ul>
<li v-for="(task, index) in props.assignment.tasks" :key="task.id">
<button
class="text-large text-left underline"
@click="step = (index + 1).toString()"
>
<li v-for="(task, index) in props.assignment.tasks" :key="task.id" class="py-1">
<button class="text-large link" @click="step = (index + 1).toString()">
- {{ task.value.title }}
</button>
</li>
</ul>
<h3 class="mt-8">{{ $t("assignment.dueDateTitle") }}</h3>
<h3 class="mb-4 mt-8">{{ $t("assignment.dueDateTitle") }}</h3>
<p v-if="props.dueDate" class="text-large">
{{
$t("assignment.dueDateIntroduction", {
@ -53,31 +48,44 @@ const step = useRouteQuery("step");
{{ $t("assignment.dueDateNotSet") }}
</p>
<h3 class="mt-8">{{ $t("assignment.effortTitle") }}</h3>
<p class="text-large">{{ props.assignment.effort_required }}</p>
<div v-if="props.assignment.effort_required">
<h3 class="mb-4 mt-8">{{ $t("assignment.effortTitle") }}</h3>
<p class="text-large">{{ props.assignment.effort_required }}</p>
</div>
<h3 class="mt-8 border-b border-gray-500 pb-2">
{{ $t("assignment.performanceObjectivesTitle") }}
</h3>
<p
v-for="performance_objective in props.assignment.performance_objectives"
:key="performance_objective.id"
class="text-large border-b border-gray-500 py-4"
>
{{ performance_objective.value.text }}
</p>
<div v-if="props.assignment.performance_objectives.length">
<h3 class="mt-8 border-b border-gray-500 pb-4">
{{ $t("assignment.performanceObjectivesTitle") }}
</h3>
<p
v-for="performance_objective in props.assignment.performance_objectives"
:key="performance_objective.id"
class="text-large border-b border-gray-500 py-4"
>
{{ performance_objective.value.text }}
</p>
</div>
<h3 class="mt-8">{{ $t("assignment.assessmentTitle") }}</h3>
<p
v-if="props.assignment.evaluation_description"
class="default-wagtail-rich-text text-large"
v-html="props.assignment.evaluation_description"
></p>
<a
:href="props.assignment.evaluation_document_url"
target="_blank"
class="text-large link"
<div
v-if="
props.assignment.evaluation_description ||
props.assignment.evaluation_document_url
"
>
{{ $t("assignment.showAssessmentDocument") }}
</a>
<h3 class="mb-4 mt-8">{{ $t("assignment.assessmentTitle") }}</h3>
<p
v-if="props.assignment.evaluation_description"
class="default-wagtail-rich-text text-large"
v-html="props.assignment.evaluation_description"
></p>
<p v-if="props.assignment.evaluation_document_url">
<a
:href="props.assignment.evaluation_document_url"
target="_blank"
class="text-large link"
>
{{ $t("assignment.showAssessmentDocument") }}
</a>
</p>
</div>
</template>

View File

@ -7,6 +7,7 @@ import AssignmentIntroductionView from "@/pages/learningPath/learningContentPage
import AssignmentSubmissionView from "@/pages/learningPath/learningContentPage/assignment/AssignmentSubmissionView.vue";
import AssignmentTaskView from "@/pages/learningPath/learningContentPage/assignment/AssignmentTaskView.vue";
import LearningContentMultiLayout from "@/pages/learningPath/learningContentPage/layouts/LearningContentMultiLayout.vue";
import { useCourseSessionsStore } from "@/stores/courseSessions";
import { useUserStore } from "@/stores/user";
import type {
Assignment,
@ -75,6 +76,10 @@ onMounted(async () => {
props.learningContent
);
state.courseSessionAssignmentDetails = useCourseSessionsStore().findAssignmentDetails(
props.learningContent.id
);
// create initial `AssignmentCompletion` first, so that it exists and we don't
// have reactivity problem accessing it.
// noinspection TypeScriptValidateTypes
@ -102,7 +107,12 @@ onMounted(async () => {
});
const numTasks = computed(() => assignment.value?.tasks?.length ?? 0);
const numPages = computed(() => numTasks.value + 2);
const numPages = computed(() => {
if (assignmentType.value === "PREP_ASSIGNMENT") {
return numTasks.value + 1;
}
return numTasks.value + 2;
});
const showPreviousButton = computed(() => stepIndex.value != 0);
const showNextButton = computed(() => stepIndex.value + 1 < numPages.value);
const showExitButton = computed(() => numPages.value === stepIndex.value + 1);
@ -144,17 +154,42 @@ const jumpToTask = (task: AssignmentTask) => {
const getTitle = () => {
if (0 === stepIndex.value) {
return t("general.introduction");
} else if (stepIndex.value === numPages.value - 1) {
} else if (
assignmentType.value === "CASEWORK" &&
stepIndex.value === numPages.value - 1
) {
return t("general.submission");
}
return currentTask?.value?.value.title ?? "Unknown";
};
const assignmentType = computed(() => {
return assignment.value?.assignment_type ?? "CASEWORK";
});
const subTitle = computed(() => {
if (assignment.value) {
let prefix = "Geleitete Fallarbeit";
if (assignmentType.value === "PREP_ASSIGNMENT") {
prefix = "Vorbereitungsauftrag";
}
return `${prefix}: ${assignment.value?.title ?? ""}`;
}
return "";
});
const assignmentUser = computed(() => {
return courseSession.value.users.find(
(user) => user.user_id === Number(userStore.id)
) as CourseSessionUser;
});
const endBadgeText = computed(() => {
if (assignmentType.value === "PREP_ASSIGNMENT") {
return "Aufgaben";
}
return "Abgabe";
});
</script>
<template>
@ -162,7 +197,7 @@ const assignmentUser = computed(() => {
<div class="flex">
<LearningContentMultiLayout
:current-step="stepIndex"
:subtitle="assignment.title ?? ''"
:subtitle="subTitle"
:title="getTitle()"
:learning-content-type="props.learningContent.content_type"
:steps-count="numPages"
@ -173,7 +208,7 @@ const assignmentUser = computed(() => {
:base-url="props.learningContent.frontend_url"
step-query-param="step"
start-badge-text="Einleitung"
end-badge-text="Abgabe"
:end-badge-text="endBadgeText"
close-button-variant="close"
@previous="handleBack()"
@next="handleContinue()"
@ -186,13 +221,13 @@ const assignmentUser = computed(() => {
:assignment="assignment"
></AssignmentIntroductionView>
<AssignmentTaskView
v-if="currentTask"
v-else-if="currentTask"
:task="currentTask"
:assignment-id="props.learningContent.content_assignment_id"
:assignment-completion="assignmentCompletion"
></AssignmentTaskView>
<AssignmentSubmissionView
v-if="stepIndex + 1 === numPages"
v-else-if="assignmentType === 'CASEWORK' && stepIndex + 1 === numPages"
:due-date="dueDate"
:assignment="assignment"
:assignment-completion="assignmentCompletion"

View File

@ -50,7 +50,7 @@ const emit = defineEmits(["previous", "next", "exit"]);
</p>
</div>
<h2 v-if="props.title" class="pb-6 text-3xl" data-cy="lc-title">
<h2 v-if="props.title" class="mb-6 text-3xl" data-cy="lc-title">
{{ props.title }}
</h2>
<ItNavigationProgress
@ -61,7 +61,7 @@ const emit = defineEmits(["previous", "next", "exit"]);
:end-badge-text="props.endBadgeText"
:base-url="props.baseUrl"
:query-param="props.stepQueryParam"
class="overflow-hidden pb-12"
class="mb-8 overflow-hidden"
></ItNavigationProgress>
<slot></slot>
</div>

View File

@ -27,7 +27,9 @@ export function calcAssignmentLearningContents(learningPath?: LearningPath) {
return learningPath.circles.flatMap((circle) => {
const learningContents = circle.flatLearningContents.filter(
(lc) => lc.content_type === "learnpath.LearningContentAssignment"
(lc) =>
lc.content_type === "learnpath.LearningContentAssignment" &&
lc.assignment_type === "CASEWORK"
) as LearningContentAssignment[];
return learningContents.map((lc) => {
return {

View File

@ -48,6 +48,7 @@ export interface LearningContentInterface extends BaseCourseWagtailPage {
export interface LearningContentAssignment extends LearningContentInterface {
readonly content_type: "learnpath.LearningContentAssignment";
readonly content_assignment_id: number;
readonly assignment_type: AssignmentType;
}
export interface LearningContentAttendanceCourse extends LearningContentInterface {
@ -326,9 +327,12 @@ export interface AssignmentEvaluationTask {
};
}
export type AssignmentType = "CASEWORK" | "PREP_ASSIGNMENT" | "REFLECTION";
export interface Assignment extends BaseCourseWagtailPage {
readonly content_type: "assignment.Assignment";
readonly starting_position: string;
readonly assignment_type: AssignmentType;
readonly intro_text: string;
readonly effort_required: string;
readonly performance_objectives: AssignmentPerformanceObjective[];
readonly evaluation_description: string;

View File

@ -11,7 +11,7 @@ export function learningContentTypeData(
): LearningContentIdentifier {
switch (t) {
case "learnpath.LearningContentAssignment":
return { title: "Transferauftrag", icon: "it-icon-lc-assignment" };
return { title: "Geleitete Fallarbeit", icon: "it-icon-lc-assignment" };
case "learnpath.LearningContentAttendanceCourse":
return { title: "Präsenzkurs", icon: "it-icon-lc-training" };
case "learnpath.LearningContentLearningModule":

View File

@ -29,12 +29,18 @@ body {
.default-wagtail-rich-text h3 {
margin-bottom: 1em;
margin-top: 1em;
}
.default-wagtail-rich-text p {
margin-bottom: 0.5em;
}
.default-wagtail-rich-text a {
text-decoration-line: underline;
text-underline-offset: 2px;
}
.default-wagtail-rich-text ul {
list-style-type: disc;
margin-left: 24px;
@ -129,7 +135,7 @@ textarea {
}
.btn-secondary {
@apply inline-block border-2 border-blue-900 bg-white px-4
@apply inline-block border-2 border-blue-900 bg-transparent px-4
py-2 align-middle font-semibold text-blue-900
hover:bg-gray-200
disabled:cursor-not-allowed disabled:opacity-50;

View File

@ -27,13 +27,16 @@ def create_uk_casework(assignment_list_page, course_id=COURSE_UK):
parent=assignment_list_page,
title="Überprüfen einer Motorfahrzeugs-Versicherungspolice",
effort_required="ca. 5 Stunden",
starting_position=replace_whitespace(
intro_text=replace_whitespace(
"""
<h3>Ausgangslage</h3>
<p>
Jemand aus deiner Familie oder aus deinem Freundeskreis möchte sein
Versicherungspolice überprüfen lassen. Diese Person kommt nun mit ihrer Police auf dich zu
und bittet dich als Versicherungsprofi, diese kritisch zu überprüfen und ihr ggf. Anpassungsvorschläge
zu unterbreiten. In diesem Kompetenznachweis kannst du nun dein Wissen und Können im Bereich
der Motorfahrzeugversicherung unter Beweis stellen.
</p>
"""
),
performance_objectives=[
@ -466,7 +469,7 @@ def create_test_assignment(course_id=COURSE_TEST_ID):
parent=assignment_page,
title="Überprüfen einer Motorfahrzeugs-Versicherungspolice",
effort_required="ca. 5 Stunden",
starting_position=replace_whitespace(
intro_text=replace_whitespace(
"""
Jemand aus deiner Familie oder aus deinem Freundeskreis möchte sein
Versicherungspolice überprüfen lassen. Diese Person kommt nun mit ihrer Police auf dich zu
@ -901,7 +904,7 @@ def create_uk_prep_assignment(assignment_list_page, course_id=COURSE_UK):
assignment_type=AssignmentType.PREP_ASSIGNMENT.name,
title="Fahrzeug - Mein erstes Auto",
effort_required="ca. 3 Stunden",
starting_position=replace_whitespace(
intro_text=replace_whitespace(
"""
<h3>Handlungskompetenzen, Arbeitssituationen & Leistungsziele</h3>
<p>
@ -1128,6 +1131,76 @@ def create_uk_prep_assignment(assignment_list_page, course_id=COURSE_UK):
)
)
assignment.tasks.append(
(
"task",
TaskBlockFactory(
title="Aufgaben zum Vorbereitungsauftrag",
content=StreamValue(
TaskContentStreamBlock(),
stream_data=[
(
"explanation",
ExplanationBlockFactory(
text=RichText(
"Schnappt euch euren Vorbereitungsauftrag und setzt euch zu dritt zusammen. Diskutiert miteinander die folgenden Fragen."
)
),
),
(
"user_text_input",
UserTextInputBlockFactory(
text=RichText(
"Wie seid ihr bei der Erstellung der Offerte vorgegangen?"
)
),
),
(
"user_text_input",
UserTextInputBlockFactory(
text=RichText(
"Welches waren die Schwierigkeiten bei der Erstellung der Offerte? Wie hast du die Schwierigkeiten gelöst?"
)
),
),
(
"user_text_input",
UserTextInputBlockFactory(
text=RichText(
"Welche Angaben sind zwingend notwendig, um eine saubere Motorfahrzeugofferte erstellen zu können?"
)
),
),
(
"user_text_input",
UserTextInputBlockFactory(
text=RichText(
"Welche zusätzlichen Deckungen hast du gewählt? Was waren die Überlegungen dazu?"
)
),
),
(
"user_text_input",
UserTextInputBlockFactory(
text=RichText(
"Welche Faktoren/Elemente bestimmen hauptsächlich die Höhe der Prämie?"
)
),
),
(
"user_text_input",
UserTextInputBlockFactory(
text=RichText(
"Wenn ihr mit der Diskussion und dem Vergleich fertig seid, schreibt doch die Prämie eurer eigenen Offerte jeweils auf den Flipchart/Whiteboard/Wandtafel."
)
),
),
],
),
),
)
)
assignment.save()
return assignment

View File

@ -15,7 +15,8 @@ class AssignmentType(DjangoObjectType):
model = Assignment
interfaces = (CoursePageInterface,)
fields = (
"starting_position",
"assignment_type",
"intro_text",
"effort_required",
"evaluation_description",
"evaluation_document_url",

View File

@ -7,7 +7,6 @@ from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
@ -30,7 +29,7 @@ class Migration(migrations.Migration):
),
),
(
"starting_position",
"intro_text",
wagtail.fields.RichTextField(
help_text="Erläuterung der Ausgangslage"
),

View File

@ -119,7 +119,7 @@ AssignmentType = Enum(
class Assignment(CourseBasePage):
serialize_field_names = [
"starting_position",
"intro_text",
"effort_required",
"performance_objectives",
"evaluation_description",
@ -134,7 +134,7 @@ class Assignment(CourseBasePage):
default=AssignmentType.CASEWORK.name,
)
starting_position = RichTextField(
intro_text = RichTextField(
help_text="Erläuterung der Ausgangslage",
features=DEFAULT_RICH_TEXT_FEATURES_WITH_HEADER,
)
@ -182,7 +182,7 @@ class Assignment(CourseBasePage):
content_panels = Page.content_panels + [
FieldPanel("assignment_type"),
FieldPanel("starting_position"),
FieldPanel("intro_text"),
FieldPanel("effort_required"),
FieldPanel("performance_objectives"),
FieldPanel("tasks"),

View File

@ -82,7 +82,7 @@ class PerformanceObjectiveBlockFactory(wagtail_factories.StructBlockFactory):
class AssignmentFactory(wagtail_factories.PageFactory):
title = "Auftrag"
starting_position = replace_whitespace(
intro_text = replace_whitespace(
"""
Jemand aus deiner Familie oder aus deinem Freundeskreis möchte sein
Versicherungspolice überprüfen lassen. Diese Person kommt nun mit ihrer Police auf dich zu

View File

@ -225,10 +225,14 @@ damit du erfolgreich mit deinem Lernpfad (durch-)starten kannst.
),
content_url=f"/course/{lp.get_course().slug}/media/category/{slugify(title)}",
)
LearningContentPlaceholderFactory(
title="Vorbereitungsauftrag",
LearningContentAssignmentFactory(
title="Fahrzeug - Mein erstes Auto",
assignment_type="PREP_ASSIGNMENT",
parent=circle,
)
content_assignment=Assignment.objects.get(
slug__startswith="überbetriebliche-kurse-assignment-fahrzeug-mein-erstes-auto"
),
),
PerformanceCriteriaFactory(
parent=CompetencePage.objects.get(competence_id="X1"),

View File

@ -187,7 +187,14 @@ def create_course_uk_de():
).id,
"submissionDeadlineDateTimeUtc": "2023-06-13T19:00:00Z",
"evaluationDeadlineDateTimeUtc": "2023-06-27T19:00:00Z",
}
},
{
"learningContentId": LearningContentAssignment.objects.get(
slug="überbetriebliche-kurse-lp-circle-fahrzeug-lc-fahrzeug-mein-erstes-auto"
).id,
"submissionDeadlineDateTimeUtc": "2023-06-13T19:00:00Z",
"evaluationDeadlineDateTimeUtc": "2023-06-27T19:00:00Z",
},
],
)

View File

@ -243,10 +243,14 @@ damit du erfolgreich mit deinem Lernpfad (durch-)starten kannst.
),
content_url=f"/course/überbetriebliche-kurse/media/category/{slugify(title)}",
)
LearningContentPlaceholderFactory(
title="Vorbereitungsauftrag",
LearningContentAssignmentFactory(
title="Fahrzeug - Mein erstes Auto",
assignment_type="PREP_ASSIGNMENT",
parent=circle,
)
content_assignment=Assignment.objects.get(
slug__startswith="überbetriebliche-kurse-assignment-fahrzeug-mein-erstes-auto"
),
),
LearningSequenceFactory(title="Training", parent=circle)
LearningUnitFactory(title="Unterlagen", parent=circle)
LearningContentPlaceholderFactory(

View File

@ -0,0 +1,18 @@
# Generated by Django 3.2.13 on 2023-05-19 15:21
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('learnpath', '0002_learningcontentrichtext_text'),
]
operations = [
migrations.AddField(
model_name='learningcontentassignment',
name='assignment_type',
field=models.CharField(choices=[('CASEWORK', 'CASEWORK'), ('PREP_ASSIGNMENT', 'PREP_ASSIGNMENT'), ('REFLECTION', 'REFLECTION')], default='CASEWORK', max_length=50),
),
]

View File

@ -6,6 +6,7 @@ from wagtail.admin.panels import FieldPanel, PageChooserPanel
from wagtail.fields import RichTextField
from wagtail.models import Page
from vbv_lernwelt.assignment.models import AssignmentType
from vbv_lernwelt.core.constants import DEFAULT_RICH_TEXT_FEATURES_WITH_HEADER
from vbv_lernwelt.core.model_utils import find_available_slug
from vbv_lernwelt.course.models import CourseBasePage, CoursePage
@ -322,6 +323,7 @@ class LearningContentRichText(LearningContent):
class LearningContentAssignment(LearningContent):
serialize_field_names = LearningContent.serialize_field_names + [
"content_assignment_id",
"assignment_type",
]
parent_page_types = ["learnpath.Circle"]
subpage_types = []
@ -332,6 +334,12 @@ class LearningContentAssignment(LearningContent):
related_name="+",
)
assignment_type = models.CharField(
max_length=50,
choices=[(tag.name, tag.name) for tag in AssignmentType],
default=AssignmentType.CASEWORK.name,
)
content_panels = [
FieldPanel("title", classname="full title"),
FieldPanel("minutes"),