From 12c092f3f37f5c564ee4e786f0fe9f94531e520b Mon Sep 17 00:00:00 2001 From: Laurent <58115082+naaturel@users.noreply.github.com> Date: Wed, 19 Mar 2025 20:38:20 +0100 Subject: [PATCH] W.I.P EventView --- front/src/components/Calendar.vue | 1 - front/src/components/ErrorBlock.vue | 16 ++++++++++ front/src/models/Attendee.ts | 6 ++-- front/src/models/Event.ts | 22 +++++++++++++ front/src/stores/EventStore.ts | 22 ++++++++----- front/src/utils/CutomMap.ts | 8 +++++ front/src/views/ErrorView.vue | 5 +-- front/src/views/EventView.vue | 49 ++++++++++++++++++++--------- 8 files changed, 100 insertions(+), 29 deletions(-) create mode 100644 front/src/components/ErrorBlock.vue create mode 100644 front/src/utils/CutomMap.ts diff --git a/front/src/components/Calendar.vue b/front/src/components/Calendar.vue index 13f6492..c1effa7 100644 --- a/front/src/components/Calendar.vue +++ b/front/src/components/Calendar.vue @@ -4,7 +4,6 @@ import {ref, onMounted, watch} from "vue"; import { datePickerStore } from "@/stores/CalendarStore.ts"; import { Calendar } from "@/models/Calendar.ts"; - import router from "@/router"; const calendar = new Calendar(); const datePicker = datePickerStore(); diff --git a/front/src/components/ErrorBlock.vue b/front/src/components/ErrorBlock.vue new file mode 100644 index 0000000..a5d7d05 --- /dev/null +++ b/front/src/components/ErrorBlock.vue @@ -0,0 +1,16 @@ + + + + + diff --git a/front/src/models/Attendee.ts b/front/src/models/Attendee.ts index b3713e9..54841ac 100644 --- a/front/src/models/Attendee.ts +++ b/front/src/models/Attendee.ts @@ -10,16 +10,16 @@ export class Attendee { this.dates = dates; } - public getName(){ + public getName() : string { return this.name; } - public getDate() : TimeStamp[]{ + public getDates() : TimeStamp[] { return this.dates; } } export interface AttendeeState { - name : String + name : string dates : TimeStampState[] } diff --git a/front/src/models/Event.ts b/front/src/models/Event.ts index 037dc10..69d3f7b 100644 --- a/front/src/models/Event.ts +++ b/front/src/models/Event.ts @@ -1,15 +1,18 @@ import type {Attendee, AttendeeState} from "@/models/Attendee.ts"; +import type {TimeStamp} from "@/models/TimeStamp.ts"; export class Event { private name: string; private token: string; private attendees: Attendee[]; + private groups : Map; public constructor(name: string, token: string, attendees: Attendee[]) { this.name = name; this.token = token; this.attendees = attendees; + this.groups = this.byDates(); } public getName() : string { @@ -24,6 +27,25 @@ export class Event { return this.attendees; } + public getGroups() : Map { return this.groups; } + + private byDates() : Map { + let res : Map = new Map(); + this.attendees.forEach((attendee: Attendee) => { + attendee.getDates().forEach((timeStamp: TimeStamp) => { + let value : number = timeStamp.getValue(); + if(res.has(value)) { + res.get(value)?.push(attendee.getName()); + } else { + res.set(value, []); + res.get(value)?.push(attendee.getName()); + } + }); + }); + + return res; + } + } export interface EventState { diff --git a/front/src/stores/EventStore.ts b/front/src/stores/EventStore.ts index 53687ec..9e5fef5 100644 --- a/front/src/stores/EventStore.ts +++ b/front/src/stores/EventStore.ts @@ -1,10 +1,10 @@ import {defineStore} from 'pinia' import {EventRequests} from "@/requests/EventRequests.ts"; import type {EventDto} from "@/dto/EventDto.ts"; -import type {EventState} from "@/models/Event.ts"; +import {Event, type EventState} from "@/models/Event.ts"; import type {AttendeeDto} from "@/dto/AttendeeDto.ts"; -import type {AttendeeState} from "@/models/Attendee.ts"; -import type {TimeStamp, TimeStampState} from "@/models/TimeStamp.ts"; +import {Attendee, type AttendeeState} from "@/models/Attendee.ts"; +import {TimeStamp, type TimeStampState} from "@/models/TimeStamp.ts"; import type {TimeStampDto} from "@/dto/TimeStampDto.ts"; const requests = new EventRequests(); @@ -19,7 +19,12 @@ export const eventStore = defineStore('eventStore', { }}; }, getters : { - getEvent() { + getEvent(state) : Event { + let attendees : Attendee[] = state.event.attendees.map((a : AttendeeState) => { + let dates: TimeStamp[] = a.dates.map(d => new TimeStamp(new Date(d.value))) + return new Attendee(a.name, dates); + }); + return new Event(state.event.name.toString(), "", attendees); } }, actions: { @@ -30,14 +35,15 @@ export const eventStore = defineStore('eventStore', { this.event.name = data.name; this.event.token = data.token; - this.event.attendees = data.attendees.map((p: AttendeeDto) => ({ - name: p.name, - dates: p.dates.map((date: TimeStampDto) => ({ + this.event.attendees = data.attendees.map((a: AttendeeDto) => ({ + name: a.name, + dates: a.dates.map((date: TimeStampDto) => ({ value: date.timestamp })) as TimeStampState[] })); } catch (error) { - console.error("Unable to fetch. " + error); + console.error(error); + throw new Error("Unable to fetch."); } }, }, diff --git a/front/src/utils/CutomMap.ts b/front/src/utils/CutomMap.ts new file mode 100644 index 0000000..5f5fe80 --- /dev/null +++ b/front/src/utils/CutomMap.ts @@ -0,0 +1,8 @@ +/** + * I hate JavaScript and TypeScript with every single inch of my body + */ +export class CustomMap extends Map { + has(obj: K): boolean { + return false; + } +} diff --git a/front/src/views/ErrorView.vue b/front/src/views/ErrorView.vue index f589bd8..4fcf2d6 100644 --- a/front/src/views/ErrorView.vue +++ b/front/src/views/ErrorView.vue @@ -1,14 +1,15 @@ diff --git a/front/src/views/EventView.vue b/front/src/views/EventView.vue index a45a153..6a44678 100644 --- a/front/src/views/EventView.vue +++ b/front/src/views/EventView.vue @@ -1,25 +1,30 @@