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 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 interface BaseLearningContentBlock { readonly type: string; readonly id: string; readonly value: { description: string; url: string; text?: string; }; } export interface AssignmentBlock extends BaseLearningContentBlock { readonly type: "assignment"; } export interface BookBlock extends BaseLearningContentBlock { readonly type: "book"; } export interface DocumentBlock extends BaseLearningContentBlock { readonly type: "document"; } export interface ExerciseBlock extends BaseLearningContentBlock { readonly type: "exercise"; } export interface MediaLibraryBlock extends BaseLearningContentBlock { readonly type: "media_library"; } export interface OnlineTrainingBlock extends BaseLearningContentBlock { readonly type: "online_training"; } export interface ResourceBlock extends BaseLearningContentBlock { readonly type: "resource"; } export interface TestBlock extends BaseLearningContentBlock { readonly type: "test"; } export interface VideoBlock extends BaseLearningContentBlock { readonly type: "video"; } export interface LearningModuleBlock extends BaseLearningContentBlock { readonly type: "learningmodule"; } export interface PlaceholderBlock extends BaseLearningContentBlock { readonly type: "placeholder"; } export type LearningContentBlock = | AssignmentBlock | BookBlock | DocumentBlock | ExerciseBlock | MediaLibraryBlock | OnlineTrainingBlock | ResourceBlock | TestBlock | VideoBlock | LearningModuleBlock | PlaceholderBlock; export type LearningContentType = LearningContentBlock["type"]; export interface LearningContent extends BaseCourseWagtailPage { readonly type: "learnpath.LearningContent"; minutes: number; contents: LearningContentBlock[]; parentCircle: Circle; parentLearningSequence?: LearningSequence; parentLearningUnit?: LearningUnit; nextLearningContent?: LearningContent; previousLearningContent?: LearningContent; } export interface LearningUnitPerformanceCriteria extends BaseCourseWagtailPage { readonly type: "competence.PerformanceCriteria"; readonly competence_id: string; parentLearningSequence?: LearningSequence; parentLearningUnit?: LearningUnit; } export interface LearningUnit extends BaseCourseWagtailPage { readonly 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 type: "learnpath.LearningSequence"; icon: string; learningUnits: LearningUnit[]; minutes: number; } export type CircleChild = LearningContent | LearningUnit | LearningSequence; export interface WagtailLearningPath extends BaseCourseWagtailPage { readonly 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 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 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: 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 { 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 type: "media_library.MediaLibraryPage"; readonly course: Course; readonly children: MediaCategoryPage[]; } export interface PerformanceCriteria extends BaseCourseWagtailPage { readonly type: "competence.PerformanceCriteria"; readonly competence_id: string; readonly circle: CircleLight; readonly course_category: CourseCategory; readonly learning_unit: BaseCourseWagtailPage; } export interface CompetencePage extends BaseCourseWagtailPage { readonly type: "competence.CompetencePage"; readonly competence_id: string; readonly children: PerformanceCriteria[]; } export interface CompetenceProfilePage extends BaseCourseWagtailPage { readonly type: "competence.CompetenceProfilePage"; readonly course: Course; readonly circles: CircleLight[]; readonly children: CompetencePage[]; } // dropdown export interface DropdownListItem { title: string; icon: Component; 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; } 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; competence_url: string; course_url: string; media_library_url: string; additional_json_data: unknown; experts: CircleExpert[]; documents: CircleDocument[]; } 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; name: string; learningSequence: { id: number; name: string; }; }