From b52f76d3bcbe8aca3e26c2b1af193485e383a3f6 Mon Sep 17 00:00:00 2001 From: didier amyot Date: Mon, 20 Nov 2023 07:59:20 -0500 Subject: [PATCH] Added better types --- src/client.ts | 99 ++++++++++++++++++++++++++++++--------------------- src/server.ts | 2 +- 2 files changed, 60 insertions(+), 41 deletions(-) diff --git a/src/client.ts b/src/client.ts index 3fe984a..f89910d 100644 --- a/src/client.ts +++ b/src/client.ts @@ -1,38 +1,8 @@ +// @deno-types="https://esm.sh/@types/mithril@2.2.4" import m from "https://esm.sh/mithril@2.2.2" import {verifyAuth} from "./auth.ts"; import {Scores, Team} from "./shared.ts"; -class ProgressBar { - - closestFivePercent(n: number): number{ - let ret = 0; - let distRet = 101; - for(let i = 0; i < 101; i += 5){ - if(Math.abs(i - n) < distRet) { - ret = i; - distRet = Math.abs(i - n); - } - } - return ret; - } - - computeClickedScored(event: any){ - const total = event.target.clientWidth; - const score = event.x - event.target.offsetLeft; - return this.closestFivePercent(( score / total ) * 100); - } - view({attrs}){ - const onclickFn = (e) => { - attrs.scores[attrs.key] = this.computeClickedScored(e); - attrs.onchange(); - } - const value = attrs.scores[attrs.key]; - return m("progress.progress.is-primary", - {value: value, max: 100, onclick: onclickFn, title: `${value}%`}, - `${value}%`) - } -} - const scores: Scores = { readme: 25, @@ -46,7 +16,49 @@ const teams: Team[] = [ {id: 17165, name: "Les pas-beaux du plateau", scores: {...scores}}, ] -class VoteView { +type ProgressBarAttr = { + key: keyof Scores, + scores: Scores, + onchange: () => void, +} + +class ProgressBar implements m.ClassComponent{ + + closestFivePercent(n: number): number{ + let ret = 0; + let distRet = 101; + for(let i = 0; i < 101; i += 5){ + if(Math.abs(i - n) < distRet) { + ret = i; + distRet = Math.abs(i - n); + } + } + return ret; + } + + computeClickedScored(event: Event){ + const total = event.target.clientWidth; + const score = event.x - event.target.offsetLeft; + return this.closestFivePercent(( score / total ) * 100); + } + view({attrs}: m.CVnode){ + const onclickFn = (e: Event) => { + attrs.scores[attrs.key] = this.computeClickedScored(e); + attrs.onchange(); + } + const value = attrs.scores[attrs.key]; + return m("progress.progress.is-primary", + {value: value, max: 100, onclick: onclickFn, title: `${value}%`}, + `${value}%`) + } +} + +type VoteViewAttr = { + teamId: number, + onchange?: () => void, +}; + +class VoteView implements m.ClassComponent { voteFor(team: Team, title: string, key: string, onchange: () => void){ return m("div.columns", @@ -55,10 +67,13 @@ class VoteView { m(new ProgressBar(), {scores: team.scores, key: key, onchange: onchange}))); } - view(vnode){ + view(vnode: m.CVnode){ const teamId = vnode.attrs.teamId; const onchange = vnode.attrs.onchange ?? function(){}; - const team = teams.find(team => team.id.toString() === teamId); + const team = teams.find(team => team.id.toString() === teamId.toString()); + if(!team){ + return []; + } return [ this.voteFor(team, "Qualité du README", 'readme', onchange), this.voteFor(team, "Qualité des diagrammes", 'diagrams', onchange), @@ -75,7 +90,11 @@ class Submit{ } } -class MainVoteView{ +type MainVoteViewAttr = { + teamId: number, +} + +class MainVoteView implements m.ClassComponent{ async persistTeams(): Promise{ const params: RequestInit = { @@ -84,12 +103,12 @@ class MainVoteView{ "Content-Type": "application/json", }, body: JSON.stringify(teams) - } + }; const resp = await fetch("/api/v1/vote/kkk", params); console.log(resp.status) } - view(vnode){ + view(vnode: m.CVnode){ const name = "Les chacals de laval" return m("div.columns.is-centered", m("div.column.is-two-thirds", @@ -100,7 +119,7 @@ class MainVoteView{ } class MainView{ - createTeamRow(team){ + createTeamRow(team: Team){ return m('tr', [ m('td', m(m.route.Link, {href: `${m.route.get()}vote/${team.id}/`}, team.name)), m('td', team.scores.readme), @@ -109,7 +128,7 @@ class MainView{ ]) } - votesTable(teams){ + votesTable(teams: Team[]){ return m('table.table.is-striped.is-fullwidth', m('thead', m('tr', ['Équipe', 'Readme', 'Diagrammes', 'Idée'].map(title => m('th', title)))), @@ -124,7 +143,7 @@ class MainView{ class PasscodeView{ - verifyPasscode(event): void { + verifyPasscode(event: Event): void { let password = event.target.value; if(verifyAuth(password)){ window.localStorage.setItem("userId", password); diff --git a/src/server.ts b/src/server.ts index a16f5b6..d4c5e3d 100644 --- a/src/server.ts +++ b/src/server.ts @@ -40,7 +40,7 @@ function getUserIndex(userId: string, ballotId: string, questionId: string){ questionId] } -function persistTeams(userId: any, ballots: Team[]) { +async function persistTeams(userId: any, ballots: Team[]): Promise { const kv = await Deno.openKv(); for(const ballot of ballots){ for(const question of Object.keys(ballot.scores)){