diff --git a/client/src/components/ui/ItPersonRow.vue b/client/src/components/ui/ItPersonRow.vue
index 5e09c321..5ab36d42 100644
--- a/client/src/components/ui/ItPersonRow.vue
+++ b/client/src/components/ui/ItPersonRow.vue
@@ -1,6 +1,6 @@
@@ -10,7 +10,7 @@ const props = defineProps<{
class="py-4 leading-[45px] border-t border-gray-500 flex flex-row justify-between"
>
diff --git a/client/src/pages/cockpit/CockpitPage.vue b/client/src/pages/cockpit/CockpitIndexPage.vue
similarity index 89%
rename from client/src/pages/cockpit/CockpitPage.vue
rename to client/src/pages/cockpit/CockpitIndexPage.vue
index db1e1e27..b212d437 100644
--- a/client/src/pages/cockpit/CockpitPage.vue
+++ b/client/src/pages/cockpit/CockpitIndexPage.vue
@@ -1,10 +1,13 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/client/src/pages/competence/CompetenceParentPage.vue b/client/src/pages/competence/CompetenceParentPage.vue
index 78051812..ff4dab2c 100644
--- a/client/src/pages/competence/CompetenceParentPage.vue
+++ b/client/src/pages/competence/CompetenceParentPage.vue
@@ -12,7 +12,7 @@ const props = defineProps<{
const competenceStore = useCompetenceStore();
onMounted(async () => {
- log.debug("CompetencesView mounted", props.courseSlug);
+ log.debug("CompetenceParentPage mounted", props.courseSlug);
try {
const competencePageSlug = props.courseSlug + "-competence";
diff --git a/client/src/router/index.ts b/client/src/router/index.ts
index a61031c1..14e3f583 100644
--- a/client/src/router/index.ts
+++ b/client/src/router/index.ts
@@ -98,8 +98,14 @@ const router = createRouter({
},
{
path: "/course/:courseSlug/cockpit",
- component: () => import("../pages/cockpit/CockpitPage.vue"),
props: true,
+ component: () => import("@/pages/cockpit/CockpitParentPage.vue"),
+ children: [
+ {
+ path: "",
+ component: () => import("@/pages/cockpit/CockpitIndexPage.vue"),
+ },
+ ],
},
{
path: "/shop",
diff --git a/client/src/stores/cockpit.ts b/client/src/stores/cockpit.ts
new file mode 100644
index 00000000..45c80af1
--- /dev/null
+++ b/client/src/stores/cockpit.ts
@@ -0,0 +1,34 @@
+import { itGetCached } from "@/fetchHelpers";
+import type { CourseSessionUser } from "@/types";
+import log from "loglevel";
+
+import { defineStore } from "pinia";
+
+export type CockpitStoreState = {
+ courseSessionUsers: CourseSessionUser[] | undefined;
+};
+
+export const useCockpitStore = defineStore({
+ id: "cockpit",
+ state: () => {
+ return {
+ courseSessionUsers: undefined,
+ } as CockpitStoreState;
+ },
+ getters: {},
+ actions: {
+ async loadCourseSessionUsers(courseSlug: string, reload = false) {
+ log.debug("loadCockpitData called");
+ this.courseSessionUsers = await itGetCached(
+ `/api/course/sessions/${courseSlug}/users/`,
+ {
+ reload: reload,
+ }
+ );
+ if (!this.courseSessionUsers) {
+ throw `No courseSessionUsers data found for user`;
+ }
+ return this.courseSessionUsers;
+ },
+ },
+});
diff --git a/client/src/types.ts b/client/src/types.ts
index 78928b91..67eb034e 100644
--- a/client/src/types.ts
+++ b/client/src/types.ts
@@ -326,3 +326,13 @@ export interface CourseSession {
additional_json_data: unknown;
experts: CircleExpert[];
}
+
+export interface CourseSessionUser {
+ session_title: string;
+ user_id: number;
+ first_name: string;
+ last_name: string;
+ email: string;
+ avatar_url: string;
+ role: "MEMBER" | "EXPERT" | "TUTOR";
+}
diff --git a/server/vbv_lernwelt/course/views.py b/server/vbv_lernwelt/course/views.py
index a047cfce..0b12650d 100644
--- a/server/vbv_lernwelt/course/views.py
+++ b/server/vbv_lernwelt/course/views.py
@@ -132,6 +132,7 @@ def get_course_session_users(request, course_slug):
"last_name": csu.user.last_name,
"email": csu.user.email,
"avatar_url": csu.user.avatar_url,
+ "role": csu.role,
}
for csu in qs
]