W.I.P EventView

This commit is contained in:
Laurent
2025-03-19 20:38:20 +01:00
parent 9cea2c3239
commit 12c092f3f3
8 changed files with 100 additions and 29 deletions

View File

@@ -4,7 +4,6 @@
import {ref, onMounted, watch} from "vue"; import {ref, onMounted, watch} from "vue";
import { datePickerStore } from "@/stores/CalendarStore.ts"; import { datePickerStore } from "@/stores/CalendarStore.ts";
import { Calendar } from "@/models/Calendar.ts"; import { Calendar } from "@/models/Calendar.ts";
import router from "@/router";
const calendar = new Calendar(); const calendar = new Calendar();
const datePicker = datePickerStore(); const datePicker = datePickerStore();

View File

@@ -0,0 +1,16 @@
<script setup lang="ts">
import TextBlock from "@/components/TextBlock.vue";
</script>
<template>
<TextBlock>
<slot></slot>
</TextBlock>
</template>
<style scoped>
.text-block {
border-left: solid 4px red;
}
</style>

View File

@@ -10,16 +10,16 @@ export class Attendee {
this.dates = dates; this.dates = dates;
} }
public getName(){ public getName() : string {
return this.name; return this.name;
} }
public getDate() : TimeStamp[]{ public getDates() : TimeStamp[] {
return this.dates; return this.dates;
} }
} }
export interface AttendeeState { export interface AttendeeState {
name : String name : string
dates : TimeStampState[] dates : TimeStampState[]
} }

View File

@@ -1,15 +1,18 @@
import type {Attendee, AttendeeState} from "@/models/Attendee.ts"; import type {Attendee, AttendeeState} from "@/models/Attendee.ts";
import type {TimeStamp} from "@/models/TimeStamp.ts";
export class Event { export class Event {
private name: string; private name: string;
private token: string; private token: string;
private attendees: Attendee[]; private attendees: Attendee[];
private groups : Map<number, string[]>;
public constructor(name: string, token: string, attendees: Attendee[]) { public constructor(name: string, token: string, attendees: Attendee[]) {
this.name = name; this.name = name;
this.token = token; this.token = token;
this.attendees = attendees; this.attendees = attendees;
this.groups = this.byDates();
} }
public getName() : string { public getName() : string {
@@ -24,6 +27,25 @@ export class Event {
return this.attendees; return this.attendees;
} }
public getGroups() : Map<number, string[]> { return this.groups; }
private byDates() : Map<number, string[]> {
let res : Map<number, string[]> = 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 { export interface EventState {

View File

@@ -1,10 +1,10 @@
import {defineStore} from 'pinia' import {defineStore} from 'pinia'
import {EventRequests} from "@/requests/EventRequests.ts"; import {EventRequests} from "@/requests/EventRequests.ts";
import type {EventDto} from "@/dto/EventDto.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 {AttendeeDto} from "@/dto/AttendeeDto.ts";
import type {AttendeeState} from "@/models/Attendee.ts"; import {Attendee, type AttendeeState} from "@/models/Attendee.ts";
import type {TimeStamp, TimeStampState} from "@/models/TimeStamp.ts"; import {TimeStamp, type TimeStampState} from "@/models/TimeStamp.ts";
import type {TimeStampDto} from "@/dto/TimeStampDto.ts"; import type {TimeStampDto} from "@/dto/TimeStampDto.ts";
const requests = new EventRequests(); const requests = new EventRequests();
@@ -19,7 +19,12 @@ export const eventStore = defineStore('eventStore', {
}}; }};
}, },
getters : { 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: { actions: {
@@ -30,14 +35,15 @@ export const eventStore = defineStore('eventStore', {
this.event.name = data.name; this.event.name = data.name;
this.event.token = data.token; this.event.token = data.token;
this.event.attendees = data.attendees.map((p: AttendeeDto) => ({ this.event.attendees = data.attendees.map((a: AttendeeDto) => ({
name: p.name, name: a.name,
dates: p.dates.map((date: TimeStampDto) => ({ dates: a.dates.map((date: TimeStampDto) => ({
value: date.timestamp value: date.timestamp
})) as TimeStampState[] })) as TimeStampState[]
})); }));
} catch (error) { } catch (error) {
console.error("Unable to fetch. " + error); console.error(error);
throw new Error("Unable to fetch.");
} }
}, },
}, },

View File

@@ -0,0 +1,8 @@
/**
* I hate JavaScript and TypeScript with every single inch of my body
*/
export class CustomMap<K, V> extends Map<K, V> {
has(obj: K): boolean {
return false;
}
}

View File

@@ -1,14 +1,15 @@
<script setup lang="ts"> <script setup lang="ts">
import TextBlock from "@/components/TextBlock.vue"; import TextBlock from "@/components/TextBlock.vue";
import ErrorBlock from "@/components/ErrorBlock.vue";
</script> </script>
<template> <template>
<div class="container"> <div class="container">
<TextBlock> <ErrorBlock>
<h1>Oopsie</h1> <h1>Oopsie</h1>
<p>Something went wrong</p> <p>Something went wrong</p>
</TextBlock> </ErrorBlock>
</div> </div>
</template> </template>

View File

@@ -1,25 +1,30 @@
<script setup lang="ts"> <script setup lang="ts">
import {eventStore} from "@/stores/EventStore.ts"; import {eventStore} from "@/stores/EventStore.ts";
import {onMounted} from "vue"; import {onBeforeMount, ref} from "vue";
import {useRoute} from "vue-router"; import {useRoute} from "vue-router";
import {DateHelper} from "../helpers/DateHelper.ts"; import {DateHelper} from "@/helpers/DateHelper.ts";
import {Event} from "@/models/Event.ts";
import ErrorBlock from "@/components/ErrorBlock.vue";
const route = useRoute(); const route = useRoute();
const store = eventStore(); const store = eventStore();
const token = extractToken(); const token = extractToken();
let event = ref<Event | undefined>();
onMounted(async () => { onBeforeMount(async () => {
await store.fetch(token); try{
await store.fetch(token);
event.value = store.getEvent;
} catch (error){
console.error(error);
event.value = undefined;
}
}) })
function extractToken() : string { function extractToken() : string {
return Array.isArray(route.params.token) ? route.params.token[0] : route.params.token; return Array.isArray(route.params.token) ? route.params.token[0] : route.params.token;
} }
function attendeesByDates(){
}
function formatDate(timestamp : number) : String{ function formatDate(timestamp : number) : String{
let date = DateHelper.toDate(timestamp) let date = DateHelper.toDate(timestamp)
return `${date.getDate()}-${date.getMonth() + 1}-${date.getFullYear()}`; return `${date.getDate()}-${date.getMonth() + 1}-${date.getFullYear()}`;
@@ -28,17 +33,31 @@ function formatDate(timestamp : number) : String{
</script> </script>
<template> <template>
<div class="container">
Name : {{ store.event.name }} <br> <div v-if="!event" class="error-block">
attendees : <ErrorBlock>
<div v-for="(p) in store.event.attendees" > <h1>This event does not exist</h1>
{{ p.name }} </ErrorBlock>
<div v-for="(d) in p.dates">
{{ formatDate(d.value) }}
</div> </div>
<div v-else>
Name : {{ event.getName() }} <br>
<div v-for="(timestamp) in event.getGroups().keys()" >
{{ formatDate(timestamp) }}
<div v-for="(attendee) in event.getGroups().get(timestamp)">
{{ attendee }}
</div>
=================
</div>
</div>
</div> </div>
</template> </template>
<style scoped> <style scoped>
.error-block{
width: 100%;
}
</style> </style>