diff --git a/src/composables/api.ts b/src/composables/api.ts index a0b876f55f116a21d79538921866e546fc17a5fc..8846dc0a9ec260c048e44908c14791684219ff1e 100644 --- a/src/composables/api.ts +++ b/src/composables/api.ts @@ -139,9 +139,15 @@ export type UpdateCategory = CreateCategory; export type UpdateRoom = CreateRoom; export type Points = { - points: number; userId: number; - sessionId?: number; + allPoints: { + audioPoints: number; + videoPoints: number; + browserPoints: number; + whiteboardPoints: number; + notePoints: number; + } + totalPoints: number; }; export interface RoomSession { @@ -175,6 +181,12 @@ export type Activity = { timestamp: Date; } +export interface Role { + id: number; + name: string; + description?: string; +} + /** * An object containing async functions to interact with the server API. */ @@ -385,6 +397,10 @@ const api = { async getRoomSessionById(sessionId: string, categoryId: string, roomId: string): Promise<RoomSession> { return await fetch.getOrFail(`/category/${categoryId}/room/${roomId}/sessions/${sessionId}`); }, + + async getRoles(): Promise<Role[]> { + return await fetch.getOrFail('/roles'); + }, } /** diff --git a/src/views/SessionAnalysisView.vue b/src/views/SessionAnalysisView.vue index e22b8131c484b7d8dbbe4dd2fd0d47cd9843934c..5a72b3b3097247c0d456e56782aef0845b397e57 100644 --- a/src/views/SessionAnalysisView.vue +++ b/src/views/SessionAnalysisView.vue @@ -1,12 +1,26 @@ <template> <Layout title="Raum Ãœberblick" :buttons="['account', 'admin']"> - <div> - <h1>Teilnehmer</h1> - <ul> - <li v-for="user in roomSession?.users"> - {{ user.name }} - </li> - </ul> + <div class="container"> + <h1 class="mb-4">Teilnehmer Analyse</h1> + + <div class="row g-3"> + <div v-for="user in roomSession?.users" :key="user.userId" class="col-auto"> + <div class="card square-card"> + <div class="card-header text-center text-primary fw-bold"> + MODERATOR + </div> + <div class="card-body d-flex flex-column align-items-center"> + <h5 class="card-title text-center mb-3">{{ user.name }}</h5> + <div class="card-text text-center w-100"> + <p class="mb-1 text-muted extra-small"><strong>User ID:</strong> {{ user.userId }}</p> + </div> + <div class="card-text text-center w-100"> + <p class="mb-1 text-muted extra-small">{{ userPoints[user.id]?.totalPoints || 'Loading...' }} Punkte</p> + </div> + </div> + </div> + </div> + </div> </div> </Layout> </template> @@ -15,16 +29,66 @@ import { ref, onMounted, Ref } from 'vue'; import { useApi } from '@/composables/api'; import { useRoute } from 'vue-router'; - import { RoomSession } from '@/composables/api'; + import { RoomSession, Points } from '@/composables/api'; import Layout from '@/components/Layout.vue'; + const api = useApi(); const route = useRoute(); - const roomSession: Ref<RoomSession | null> = ref(null); + const roomSession: Ref<RoomSession | null> = ref(null); + const userPoints = ref<Record<number, Points>>({}); + + async function loadUserPoints(userId: number) { + try { + const points = await api.getPointsByUser(userId); + userPoints.value[userId] = points; + } catch (error) { + console.error(`Error loading points for user ${userId}:`, error); + } + } onMounted(async () => { - const response = await useApi().getRoomSessionById(route.query.roomSessionId as string, "0", "0"); + const response = await api.getRoomSessionById(route.query.roomSessionId as string, "0", "0"); roomSession.value = response; + + // Load points for each user + if (response.users) { + for (const user of response.users) { + await loadUserPoints(user.id); + } + } }); +</script> + +<style scoped> +.square-card { + aspect-ratio: 1; + width: 100%; + transition: transform 0.2s; + border: 1px solid rgba(0,0,0,0.125); +} + +.square-card:hover { + transform: translateY(-5px); + box-shadow: 0 4px 8px rgba(0,0,0,0.1); +} + +.card-body { + padding: 1.25rem; +} + +.card-header { + background-color: rgba(13, 110, 253, 0.1); + border-bottom: 1px solid rgba(13, 110, 253, 0.2); + padding: 0.5rem; +} + +.small { + font-size: 0.875rem; +} -</script> \ No newline at end of file +.extra-small { + font-size: 0.75rem; + opacity: 0.7; +} +</style> \ No newline at end of file diff --git a/tsconfig.app.json b/tsconfig.app.json index 59e8014136c31c0846c7ba360503fa67413bbeb7..f61126dec436f102ce79e8989c90c51fb71d377b 100644 --- a/tsconfig.app.json +++ b/tsconfig.app.json @@ -1,6 +1,6 @@ { "extends": "@vue/tsconfig/tsconfig.dom.json", - "include": ["env.d.ts", "src/**/*", "src/**/*.vue"], + "include": ["env.d.ts", "src/**/*.ts", "src/**/*.vue"], "exclude": ["src/**/__tests__/*"], "compilerOptions": { "composite": true,