vbv/client/src/types.ts

545 lines
13 KiB
TypeScript

import type { Circle } from "@/services/circle";
import type { Component } from "vue";
export type CourseCompletionStatus = "unknown" | "fail" | "success";
export interface BaseCourseWagtailPage {
readonly id: number;
readonly title: string;
readonly slug: string;
readonly content_type: string;
readonly translation_key: string;
readonly frontend_url: string;
completion_status?: CourseCompletionStatus;
completion_status_updated_at?: string;
}
export interface CircleLight {
readonly id: number;
readonly title: string;
readonly translation_key: string;
}
export type LearningContent =
| LearningContentAssignment
| LearningContentAttendanceDay
| LearningContentFeedback
| LearningContentLearningModule
| LearningContentMediaLibrary
| LearningContentPlaceholder
| LearningContentRichText
| LearningContentTest
| LearningContentVideo;
export type LearningContentType = LearningContent["content_type"];
export interface LearningContentInterface extends BaseCourseWagtailPage {
readonly content_type: LearningContentType;
readonly minutes: number;
readonly description: string;
readonly content_url: string;
parentCircle: Circle;
parentLearningSequence?: LearningSequence;
parentLearningUnit?: LearningUnit;
nextLearningContent?: LearningContent;
previousLearningContent?: LearningContent;
}
export interface LearningContentAssignment extends LearningContentInterface {
readonly content_type: "learnpath.LearningContentAssignment";
readonly content_assignment_id: number;
}
export interface LearningContentAttendanceDay extends LearningContentInterface {
readonly content_type: "learnpath.LearningContentAttendanceDay";
}
export interface LearningContentFeedback extends LearningContentInterface {
readonly content_type: "learnpath.LearningContentFeedback";
}
export interface LearningContentLearningModule extends LearningContentInterface {
readonly content_type: "learnpath.LearningContentLearningModule";
}
export interface LearningContentMediaLibrary extends LearningContentInterface {
readonly content_type: "learnpath.LearningContentMediaLibrary";
}
export interface LearningContentPlaceholder extends LearningContentInterface {
readonly content_type: "learnpath.LearningContentPlaceholder";
}
export interface LearningContentRichText extends LearningContentInterface {
readonly content_type: "learnpath.LearningContentRichText";
text: string;
}
export interface LearningContentTest extends LearningContentInterface {
readonly content_type: "learnpath.LearningContentTest";
}
export interface LearningContentVideo extends LearningContentInterface {
readonly content_type: "learnpath.LearningContentVideo";
}
export interface LearningUnitPerformanceCriteria extends BaseCourseWagtailPage {
readonly content_type: "competence.PerformanceCriteria";
readonly competence_id: string;
parentLearningSequence?: LearningSequence;
parentLearningUnit?: LearningUnit;
}
export interface LearningUnit extends BaseCourseWagtailPage {
readonly content_type: "learnpath.LearningUnit";
readonly evaluate_url: string;
readonly course_category: CourseCategory;
children: LearningUnitPerformanceCriteria[];
// additional frontend fields
learningContents: LearningContent[];
minutes: number;
parentLearningSequence?: LearningSequence;
parentCircle?: Circle;
last?: boolean;
}
export interface LearningSequence extends BaseCourseWagtailPage {
readonly content_type: "learnpath.LearningSequence";
icon: string;
learningUnits: LearningUnit[];
minutes: number;
}
export type CircleChild = LearningContentInterface | LearningUnit | LearningSequence;
export interface WagtailLearningPath extends BaseCourseWagtailPage {
readonly content_type: "learnpath.LearningPath";
course: Course;
children: LearningPathChild[];
}
export interface CircleGoal {
type: "goal";
value: string;
id: string;
}
export interface CircleJobSituation {
type: "job_situation";
value: string;
id: string;
}
export interface WagtailCircle extends BaseCourseWagtailPage {
readonly content_type: "learnpath.Circle";
readonly description: string;
readonly goal_description: string;
readonly goals: CircleGoal[];
readonly job_situation_description: string;
readonly job_situations: CircleJobSituation[];
readonly children: CircleChild[];
}
export interface Topic extends BaseCourseWagtailPage {
readonly content_type: "learnpath.Topic";
readonly is_visible: boolean;
circles: Circle[];
}
export type LearningPathChild = Topic | WagtailCircle;
export interface CourseCompletion {
id: number;
created_at: string;
updated_at: string;
user: number;
page_key: string;
page_type: string;
page_slug: string;
course_session: number;
completion_status: CourseCompletionStatus;
additional_json_data: unknown;
}
export interface CircleDiagramData {
index: number;
title: string;
icon: string;
startAngle: number;
endAngle: number;
arrowStartAngle: number;
arrowEndAngle: number;
done: boolean;
}
export interface Course {
id: number;
title: string;
category_name: string;
slug: string;
}
export interface CourseCategory {
id: number;
name: string;
general: boolean;
}
export type MediaLibraryContentBlockValue = {
title: string;
description: string;
icon_url: string;
link_display_text: string;
url: string;
open_window: boolean;
};
export interface LearnMediaBlock {
type: "learn_media";
id: string;
value: MediaLibraryContentBlockValue;
}
export interface ExternalLinkBlock {
type: "external_link";
id: string;
value: MediaLibraryContentBlockValue;
}
export interface InternalLinkBlock {
type: "internal_link";
id: string;
value: MediaLibraryContentBlockValue;
}
export interface RelativeLinkBlock {
type: "relative_link";
id: string;
value: MediaLibraryContentBlockValue;
}
export type MediaBlock =
| LearnMediaBlock
| ExternalLinkBlock
| InternalLinkBlock
| RelativeLinkBlock;
export type MediaBlockType = MediaBlock["type"];
export interface MediaContentCollection {
type: "content_collection";
value: {
title: string;
description: string;
contents: MediaBlock[];
};
}
export interface MediaCategoryPage extends BaseCourseWagtailPage {
content_type: "media_library.MediaCategoryPage";
overview_icon: string;
detail_image: string;
introduction_text: string;
description_title: string;
description_text: string;
items: {
type: "item";
value: string;
id: string;
}[];
course_category: CourseCategory;
body: MediaContentCollection[];
}
export interface MediaLibraryPage extends BaseCourseWagtailPage {
readonly content_type: "media_library.MediaLibraryPage";
readonly course: Course;
readonly children: MediaCategoryPage[];
}
export interface AssignmentPerformanceObjective {
readonly type: "performance_objective";
readonly id: string;
readonly value: {
text: string;
};
}
export interface AssignmentTaskBlockExplanation {
readonly type: "explanation";
readonly id: string;
readonly value: {
readonly text: string;
};
}
export interface AssignmentTaskBlockUserConfirmation {
readonly type: "user_confirmation";
readonly id: string;
readonly value: {
readonly text: string;
};
}
export interface AssignmentTaskBlockUserTextInput {
readonly type: "user_text_input";
readonly id: string;
readonly value: {
readonly text?: string;
};
}
export type AssignmentTaskBlock =
| AssignmentTaskBlockExplanation
| AssignmentTaskBlockUserConfirmation
| AssignmentTaskBlockUserTextInput;
export interface AssignmentTask {
readonly type: "task";
readonly id: string;
readonly value: {
title: string;
file_submission_required: boolean;
content: AssignmentTaskBlock[];
};
}
export interface AssignmentEvaluationSubTask {
readonly type: "task";
readonly id: string;
readonly value: {
title: string;
description: string;
points: number;
};
}
export interface AssignmentEvaluationTask {
readonly type: "task";
readonly id: string;
readonly value: {
title: string;
description: string;
max_points: number;
sub_tasks: AssignmentEvaluationSubTask[];
};
}
export interface Assignment extends BaseCourseWagtailPage {
readonly content_type: "assignment.Assignment";
readonly starting_position: string;
readonly effort_required: string;
readonly performance_objectives: AssignmentPerformanceObjective[];
readonly evaluation_description: string;
readonly evaluation_document_url: string;
readonly tasks: AssignmentTask[];
readonly evaluation_tasks: AssignmentEvaluationTask[];
}
export interface PerformanceCriteria extends BaseCourseWagtailPage {
readonly content_type: "competence.PerformanceCriteria";
readonly competence_id: string;
readonly circle: CircleLight;
readonly course_category: CourseCategory;
readonly learning_unit: BaseCourseWagtailPage;
}
export interface CompetencePage extends BaseCourseWagtailPage {
readonly content_type: "competence.CompetencePage";
readonly competence_id: string;
readonly children: PerformanceCriteria[];
}
export interface CompetenceProfilePage extends BaseCourseWagtailPage {
readonly content_type: "competence.CompetenceProfilePage";
readonly course: Course;
readonly circles: CircleLight[];
readonly children: CompetencePage[];
}
// dropdown
export interface DropdownListItem {
title: string;
icon: Component | string;
data: object;
}
export interface DropdownSelectable {
id: number | string;
name: string;
iconName?: string;
}
export interface CircleExpert {
user_id: number;
user_email: string;
user_first_name: string;
user_last_name: string;
circle_id: number;
circle_slug: string;
circle_translation_key: string;
}
export interface CircleDocument {
id: number;
name: string;
file_name: string;
url: string;
course_session: number;
learning_sequence: number;
}
// TODO refactor, when a user can manually create these days
export interface CourseSessionAttendanceDay {
learningContentId: number;
date: string;
startTime: string;
endTime: string;
location: string;
trainer: string;
}
export interface CourseSessionAssignmentDetails {
learningContentId: number;
submissionDeadlineDateTimeUtc: string;
evaluationDeadlineDateTimeUtc: string;
}
export interface CourseSession {
id: number;
created_at: string;
updated_at: string;
course: Course;
title: string;
start_date: string;
end_date: string;
learning_path_url: string;
cockpit_url: string;
competence_url: string;
course_url: string;
media_library_url: string;
attendance_days: CourseSessionAttendanceDay[];
assignment_details_list: CourseSessionAssignmentDetails[];
documents: CircleDocument[];
users: CourseSessionUser[];
}
export type Role = "MEMBER" | "EXPERT" | "TUTOR";
export interface CourseSessionUser {
session_title: string;
user_id: number;
first_name: string;
last_name: string;
email: string;
avatar_url: string;
role: Role;
}
export interface ExpertSessionUser extends CourseSessionUser {
role: "EXPERT";
circles: {
id: number;
title: string;
slug: string;
translation_key: string;
}[];
}
// document upload
export interface DocumentUploadData {
file: File | null;
name: string;
learningSequence: {
id: number;
name: string;
};
}
// notifications
export type NotificationType = "USER_INTERACTION" | "PROGRESS" | "INFORMATION";
export interface Notification {
// given by AbstractNotification model
id: number;
timestamp: string;
unread: boolean;
actor: string | null;
verb: string;
target: string | null;
action_object: string | null;
// given by Notification model
notification_type: NotificationType;
target_url: string | null;
actor_avatar_url: string | null;
course: string | null;
}
export type AssignmentCompletionStatus =
| "unknwown"
| "IN_PROGRESS"
| "SUBMITTED"
| "EVALUATION_IN_PROGRESS"
| "EVALUATION_SUBMITTED";
export interface UserDataText {
text: string;
}
export interface UserDataConfirmation {
confirmation: boolean;
}
export interface ExpertData {
points?: number;
text?: string;
}
export interface AssignmentCompletionData {
// {
// "<user_text_input:uuid>": {"user_data": {"text": "some text from user"}},
// "<user_confirmation:uuid>": {"user_data": {"confirmation": true}},
// }
[key: string]: {
user_data?: UserDataText | UserDataConfirmation;
expert_data?: ExpertData;
};
}
export interface AssignmentCompletion {
id: number;
created_at: string;
updated_at: string;
submitted_at: string;
evaluation_submitted_at: string | null;
assignment_user: number;
assignment: number;
course_session: number;
completion_status: AssignmentCompletionStatus;
evaluation_user: number | null;
completion_data: AssignmentCompletionData;
evaluation_grade: number | null;
}
export type UpsertUserAssignmentCompletion = {
assignment_id: number;
course_session_id: number;
completion_status: AssignmentCompletionStatus;
completion_data: AssignmentCompletionData;
};
export type EvaluationCompletionData = UpsertUserAssignmentCompletion & {
assignment_user_id: number;
evaluation_grade?: number;
evaluation_points?: number;
};
export interface UserAssignmentCompletionStatus {
id: number;
assignment_user_id: number;
completion_status: AssignmentCompletionStatus;
evaluation_grade: number | null;
}