From 546506cf59bc041e538477d124dfe1392eb63f52 Mon Sep 17 00:00:00 2001 From: Laurent <58115082+naaturel@users.noreply.github.com> Date: Sat, 22 Mar 2025 09:50:04 +0100 Subject: [PATCH] Add attendance graph --- front/package-lock.json | 19 +++++++++ front/package.json | 1 + front/src/components/AttendanceGraph.vue | 51 ++++++++++++++++++++++++ front/src/helpers/DateHelper.ts | 5 +++ front/src/models/Event.ts | 19 +++++++-- front/src/views/EventView.vue | 24 +++++------ 6 files changed, 103 insertions(+), 16 deletions(-) create mode 100644 front/src/components/AttendanceGraph.vue diff --git a/front/package-lock.json b/front/package-lock.json index e2ad2fb..e7f05cf 100644 --- a/front/package-lock.json +++ b/front/package-lock.json @@ -8,6 +8,7 @@ "name": "letsmeet", "version": "0.0.0", "dependencies": { + "chart.js": "^4.4.8", "express-requests-logger": "^4.0.2", "pinia": "^3.0.1", "vite-plugin-svgr": "^4.3.0", @@ -1367,6 +1368,12 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@kurkle/color": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz", + "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==", + "license": "MIT" + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -3173,6 +3180,18 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/chart.js": { + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.8.tgz", + "integrity": "sha512-IkGZlVpXP+83QpMm4uxEiGqSI7jFizwVtF3+n5Pc3k7sMO+tkd0qxh2OzLhenM0K80xtmAONWGBn082EiBQSDA==", + "license": "MIT", + "dependencies": { + "@kurkle/color": "^0.3.0" + }, + "engines": { + "pnpm": ">=8" + } + }, "node_modules/check-error": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", diff --git a/front/package.json b/front/package.json index 9354712..1dfddd1 100644 --- a/front/package.json +++ b/front/package.json @@ -13,6 +13,7 @@ "lint": "eslint . --fix" }, "dependencies": { + "chart.js": "^4.4.8", "express-requests-logger": "^4.0.2", "pinia": "^3.0.1", "vite-plugin-svgr": "^4.3.0", diff --git a/front/src/components/AttendanceGraph.vue b/front/src/components/AttendanceGraph.vue new file mode 100644 index 0000000..6cd8749 --- /dev/null +++ b/front/src/components/AttendanceGraph.vue @@ -0,0 +1,51 @@ + + + + + + + + + diff --git a/front/src/helpers/DateHelper.ts b/front/src/helpers/DateHelper.ts index f53de8a..e6c538c 100644 --- a/front/src/helpers/DateHelper.ts +++ b/front/src/helpers/DateHelper.ts @@ -4,4 +4,9 @@ export abstract class DateHelper { return new Date(timestamp); } + public static formatDate(timestamp : number) : string{ + let date = DateHelper.toDate(timestamp); + return `${date.getDate()}-${date.getMonth() + 1}-${date.getFullYear()}`; + } + } diff --git a/front/src/models/Event.ts b/front/src/models/Event.ts index 1937e65..0ff1e12 100644 --- a/front/src/models/Event.ts +++ b/front/src/models/Event.ts @@ -1,15 +1,16 @@ import type {Attendee, AttendeeState} from "@/models/Attendee.ts"; +import {DateHelper} from "@/helpers/DateHelper.ts"; export class Event { private name: string; private token: string; - private dates: Map; + private attendances: Map; public constructor(name: string, token: string, dates : Map) { this.name = name; this.token = token; - this.dates = dates; + this.attendances = dates; } public getName() : string { @@ -20,8 +21,18 @@ export class Event { return this.token; } - public getDates() : Map { - return this.dates; + public getAttendances() : Map { + return this.attendances; + } + + public getDates() : {dates : string[], attendances : number[]}{ + let dates = []; + let attendances = []; + for (let [date, attendees] of this.attendances.entries()) { + dates.push(DateHelper.formatDate(date)) + attendances.push(attendees.length) + } + return {dates : dates, attendances : attendances}; } } diff --git a/front/src/views/EventView.vue b/front/src/views/EventView.vue index 1438fd5..b41e2dc 100644 --- a/front/src/views/EventView.vue +++ b/front/src/views/EventView.vue @@ -5,6 +5,7 @@ import {useRoute} from "vue-router"; import {DateHelper} from "@/helpers/DateHelper.ts"; import {Event} from "@/models/Event.ts"; import ErrorBlock from "@/components/ErrorBlock.vue"; +import AttendanceGraph from "@/components/AttendanceGraph.vue"; const route = useRoute(); const store = eventCreationStore(); @@ -25,38 +26,37 @@ function extractToken() : string { return Array.isArray(route.params.token) ? route.params.token[0] : route.params.token; } -function formatDate(timestamp : number) : String{ - let date = DateHelper.toDate(timestamp); - return `${date.getDate()}-${date.getMonth() + 1}-${date.getFullYear()}`; -} + + This event does not exist - - Name : {{ event.getName() }} - - {{formatDate(date)}} - - {{attendee.getName()}} - - + + + +