diff --git a/client/src/components/mediaCenter/LinkCard.vue b/client/src/components/mediaCenter/LinkCard.vue
new file mode 100644
index 00000000..287fdb89
--- /dev/null
+++ b/client/src/components/mediaCenter/LinkCard.vue
@@ -0,0 +1,33 @@
+
+
+
+
+
![]()
+
+
{{ title }}
+
{{ description }}
+
+ {{ linkText }}
+
+
+
+
+
+
diff --git a/client/src/components/mediaCenter/MediaLink.vue b/client/src/components/mediaCenter/MediaLink.vue
new file mode 100644
index 00000000..b50bd294
--- /dev/null
+++ b/client/src/components/mediaCenter/MediaLink.vue
@@ -0,0 +1,28 @@
+
+
+
+
+
diff --git a/client/src/components/mediacenter/OverviewCard.vue b/client/src/components/mediaCenter/OverviewCard.vue
similarity index 100%
rename from client/src/components/mediacenter/OverviewCard.vue
rename to client/src/components/mediaCenter/OverviewCard.vue
diff --git a/client/src/components/mediacenter/LinkCard.vue b/client/src/components/mediacenter/LinkCard.vue
deleted file mode 100644
index 8e2fec22..00000000
--- a/client/src/components/mediacenter/LinkCard.vue
+++ /dev/null
@@ -1,42 +0,0 @@
-
-
-
-
-
![]()
-
-
{{title}}
-
{{description}}
-
- {{linkText}}
-
-
-
-
-
-
diff --git a/client/src/components/mediacenter/MediaLink.vue b/client/src/components/mediacenter/MediaLink.vue
deleted file mode 100644
index 9573ae22..00000000
--- a/client/src/components/mediacenter/MediaLink.vue
+++ /dev/null
@@ -1,38 +0,0 @@
-
-
-
-
-
diff --git a/client/src/router/index.ts b/client/src/router/index.ts
index a08c2f43..72a061a6 100644
--- a/client/src/router/index.ts
+++ b/client/src/router/index.ts
@@ -1,7 +1,6 @@
import { createRouter, createWebHistory } from 'vue-router'
import CockpitView from '@/views/CockpitView.vue'
import LoginView from '@/views/LoginView.vue'
-import MediaMainView from '@/views/MediaMainView.vue'
import { redirectToLoginIfRequired, updateLoggedIn } from '@/router/guards'
import { useAppStore } from '@/stores/app'
@@ -26,26 +25,27 @@ const router = createRouter({
component: () => import('@/views/ShopView.vue'),
},
{
- path: '/mediacenter',
- component: () => import('@/views/MediaView.vue'),
+ path: '/mediacenter/:mediaCenterPageSlug',
+ props: true,
+ component: () => import('@/views/MediaCenterView.vue'),
children: [
{
path: 'overview',
- component: () => import('@/views/MediaMainView.vue')
+ component: () => import('@/views/MediaMainView.vue'),
},
{
path: 'handlungsfelder',
- component: () => import('@/views/HandlungsfelderOverview.vue')
+ component: () => import('@/views/HandlungsfelderOverview.vue'),
},
{
path: 'handlungsfeld',
- component: () => import('@/views/Handlungsfeld.vue')
+ component: () => import('@/views/Handlungsfeld.vue'),
},
{
path: 'handlungsfeldlist',
- component: () => import('@/views/MediaList.vue')
+ component: () => import('@/views/MediaList.vue'),
},
- ]
+ ],
},
{
path: '/messages',
diff --git a/client/src/services/circle.ts b/client/src/services/circle.ts
index abb767cb..d1b49001 100644
--- a/client/src/services/circle.ts
+++ b/client/src/services/circle.ts
@@ -7,7 +7,7 @@ import type {
LearningSequence,
LearningUnit,
LearningUnitQuestion,
- LearningWagtailPage,
+ CourseWagtailPage,
} from '@/types'
import type { LearningPath } from '@/services/learningPath'
@@ -109,7 +109,7 @@ export function parseLearningSequences (circle: Circle, children: CircleChild[])
return result;
}
-export class Circle implements LearningWagtailPage {
+export class Circle implements CourseWagtailPage {
readonly type = 'learnpath.Circle';
readonly learningSequences: LearningSequence[];
readonly completed: boolean;
diff --git a/client/src/services/learningPath.ts b/client/src/services/learningPath.ts
index c3b38fa4..2ef20568 100644
--- a/client/src/services/learningPath.ts
+++ b/client/src/services/learningPath.ts
@@ -1,6 +1,6 @@
import * as _ from 'lodash'
-import type { CircleCompletion, LearningContent, LearningPathChild, LearningWagtailPage, Topic } from '@/types'
+import type { CircleCompletion, LearningContent, LearningPathChild, CourseWagtailPage, Topic } from '@/types'
import { Circle } from '@/services/circle'
function getLastCompleted(learningPathKey: string, completionData: CircleCompletion[]) {
@@ -9,7 +9,7 @@ function getLastCompleted(learningPathKey: string, completionData: CircleComplet
})
}
-export class LearningPath implements LearningWagtailPage {
+export class LearningPath implements CourseWagtailPage {
readonly type = 'learnpath.LearningPath'
public topics: Topic[]
public circles: Circle[]
diff --git a/client/src/stores/mediaCenter.ts b/client/src/stores/mediaCenter.ts
new file mode 100644
index 00000000..6797b2d8
--- /dev/null
+++ b/client/src/stores/mediaCenter.ts
@@ -0,0 +1,39 @@
+import { defineStore } from 'pinia'
+import { itGet } from '@/fetchHelpers'
+import type { MediaLibraryPage } from '@/types'
+
+export type MediaCenterStoreState = {
+ mediaCenterPage: MediaLibraryPage | undefined
+ selectedLearningPath: { id: number; name: string }
+ availableLearningPaths: { id: number; name: string }[]
+}
+
+export const useMediaCenterStore = defineStore({
+ id: 'mediaCenter',
+ state: () => {
+ return {
+ mediaCenterPage: undefined,
+ selectedLearningPath: { id: 1, name: 'Alle Lehrgänge' },
+ availableLearningPaths: [
+ { id: 1, name: 'Alle Lehrgänge' },
+ { id: 2, name: 'Versicherungsvermittler/in' },
+ ],
+ } as MediaCenterStoreState
+ },
+ getters: {},
+ actions: {
+ async loadMediaCenterPage(slug: string, reload = false) {
+ if (this.mediaCenterPage && !reload) {
+ return this.mediaCenterPage
+ }
+ const mediaCenterPageData = await itGet(`/api/course/page/${slug}/`)
+
+ if (!mediaCenterPageData) {
+ throw `No mediaCenterPageData found with: ${slug}`
+ }
+
+ this.mediaCenterPage = mediaCenterPageData
+ return this.mediaCenterPage
+ },
+ },
+})
diff --git a/client/src/stores/mediacenter.ts b/client/src/stores/mediacenter.ts
deleted file mode 100644
index 96c67e4b..00000000
--- a/client/src/stores/mediacenter.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-import { defineStore } from 'pinia'
-
-export const useMediaCenterStore = defineStore({
- id: 'mediacenter',
- state: () => {
- return {
- selectedLearningPath: { id: 1, name: 'Alle Lehrgänge' },
- availableLearningPaths: [
- { id: 1, name: 'Alle Lehrgänge' },
- { id: 2, name: 'Versicherungsvermittler/in' }
- ]
- }
- },
- getters: {},
- actions: {},
-})
diff --git a/client/src/types.ts b/client/src/types.ts
index 420c1984..4e320be2 100644
--- a/client/src/types.ts
+++ b/client/src/types.ts
@@ -47,7 +47,7 @@ export interface CircleJobSituation {
id: string;
}
-export interface LearningWagtailPage {
+export interface CourseWagtailPage {
readonly id: number;
readonly title: string;
readonly slug: string;
@@ -55,7 +55,7 @@ export interface LearningWagtailPage {
completed?: boolean;
}
-export interface LearningContent extends LearningWagtailPage {
+export interface LearningContent extends CourseWagtailPage {
type: 'learnpath.LearningContent';
minutes: number;
contents: (LearningContentBlock | VideoBlock | PodcastBlock | DocumentBlock)[];
@@ -66,13 +66,13 @@ export interface LearningContent extends LearningWagtailPage {
previousLearningContent?: LearningContent;
}
-export interface LearningUnitQuestion extends LearningWagtailPage {
+export interface LearningUnitQuestion extends CourseWagtailPage {
type: 'learnpath.LearningUnitQuestion';
parentLearningSequence?: LearningSequence;
parentLearningUnit?: LearningUnit;
}
-export interface LearningUnit extends LearningWagtailPage {
+export interface LearningUnit extends CourseWagtailPage {
type: 'learnpath.LearningUnit';
learningContents: LearningContent[];
minutes: number;
@@ -81,7 +81,7 @@ export interface LearningUnit extends LearningWagtailPage {
last?: boolean;
}
-export interface LearningSequence extends LearningWagtailPage {
+export interface LearningSequence extends CourseWagtailPage {
type: 'learnpath.LearningSequence';
icon: string;
learningUnits: LearningUnit[];
@@ -90,13 +90,13 @@ export interface LearningSequence extends LearningWagtailPage {
export type CircleChild = LearningContent | LearningUnit | LearningSequence | LearningUnitQuestion;
-export interface WagtailCircle extends LearningWagtailPage {
+export interface WagtailCircle extends CourseWagtailPage {
type: 'learnpath.Circle';
children: CircleChild[];
description: string;
}
-export interface Topic extends LearningWagtailPage {
+export interface Topic extends CourseWagtailPage {
type: 'learnpath.Topic';
is_visible: boolean;
circles: Circle[];
@@ -127,3 +127,55 @@ export interface CircleDiagramData {
arrowEndAngle: number
done: boolean
}
+
+
+export interface Course {
+ id: number;
+ name: string;
+ category_name: string;
+}
+
+export interface CourseCategory {
+ id: number;
+ name: string;
+ general: boolean;
+}
+
+export interface MediaDocument {
+ type: "Documents";
+ value: number;
+ id: string;
+}
+
+export interface MediaLink {
+ type: "Links";
+ id: string;
+ value: {
+ title: string;
+ description: string;
+ link_display_text: string;
+ url: string;
+ }
+}
+
+export interface MediaContentCollection {
+ type: "content_collection";
+ value: {
+ title: string;
+ contents: (MediaDocument | MediaLink)[];
+ }
+}
+
+export interface MediaCategoryPage extends CourseWagtailPage {
+ type: 'media_library.MediaCategoryPage';
+ introduction_text: string;
+ description: string;
+ course_category: CourseCategory;
+ body: MediaContentCollection[];
+}
+
+export interface MediaLibraryPage extends CourseWagtailPage {
+ type: 'media_library.MediaLibraryPage';
+ course: Course;
+ children: MediaCategoryPage[];
+}
diff --git a/client/src/views/HandlungsfelderOverview.vue b/client/src/views/HandlungsfelderOverview.vue
index 0361d168..fdf8fc3b 100644
--- a/client/src/views/HandlungsfelderOverview.vue
+++ b/client/src/views/HandlungsfelderOverview.vue
@@ -2,7 +2,7 @@
import * as log from 'loglevel';
import ItDropdownSelect from "@/components/ui/ItDropdownSelect.vue";
import {reactive, ref, watch} from "vue";
-import {useMediaCenterStore} from "@/stores/mediacenter";
+import {useMediaCenterStore} from "@/stores/mediaCenter";
log.debug('HandlungsfelderOverview created');
diff --git a/client/src/views/MediaView.vue b/client/src/views/MediaCenterView.vue
similarity index 52%
rename from client/src/views/MediaView.vue
rename to client/src/views/MediaCenterView.vue
index e2c8584f..d32c7697 100644
--- a/client/src/views/MediaView.vue
+++ b/client/src/views/MediaCenterView.vue
@@ -1,8 +1,25 @@
@@ -22,5 +39,4 @@ log.debug('ShopView created');
-
+
diff --git a/client/src/views/MediaMainView.vue b/client/src/views/MediaMainView.vue
index d9140f86..bd356203 100644
--- a/client/src/views/MediaMainView.vue
+++ b/client/src/views/MediaMainView.vue
@@ -3,7 +3,7 @@ import * as log from 'loglevel';
import OverviewCard from '@/components/mediacenter/OverviewCard.vue';
import ItDropdownSelect from "@/components/ui/ItDropdownSelect.vue";
import {watch, ref} from "vue";
-import {useMediaCenterStore} from "@/stores/mediacenter";
+import {useMediaCenterStore} from "@/stores/mediaCenter";
log.debug('MediaMainView created');