Added better types

This commit is contained in:
didier amyot committed 2023-11-20 07:59:20 -05:00
1 parent 22489242c2
commit b52f76d3bc
2 files changed
+60 -41

No files matched your search

+59 -40
View File
@@ -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 m from "https://esm.sh/mithril@2.2.2"
import {verifyAuth} from "./auth.ts"; import {verifyAuth} from "./auth.ts";
import {Scores, Team} from "./shared.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 = { const scores: Scores = {
readme: 25, readme: 25,
@@ -46,7 +16,49 @@ const teams: Team[] = [
{id: 17165, name: "Les pas-beaux du plateau", scores: {...scores}}, {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<ProgressBarAttr>{
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<ProgressBarAttr>){
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<VoteViewAttr> {
voteFor(team: Team, title: string, key: string, onchange: () => void){ voteFor(team: Team, title: string, key: string, onchange: () => void){
return m("div.columns", return m("div.columns",
@@ -55,10 +67,13 @@ class VoteView {
m(new ProgressBar(), {scores: team.scores, key: key, onchange: onchange}))); m(new ProgressBar(), {scores: team.scores, key: key, onchange: onchange})));
} }
view(vnode){ view(vnode: m.CVnode<VoteViewAttr>){
const teamId = vnode.attrs.teamId; const teamId = vnode.attrs.teamId;
const onchange = vnode.attrs.onchange ?? function(){}; 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 [ return [
this.voteFor(team, "Qualité du README", 'readme', onchange), this.voteFor(team, "Qualité du README", 'readme', onchange),
this.voteFor(team, "Qualité des diagrammes", 'diagrams', 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<MainVoteViewAttr>{
async persistTeams(): Promise<void>{ async persistTeams(): Promise<void>{
const params: RequestInit = { const params: RequestInit = {
@@ -84,12 +103,12 @@ class MainVoteView{
"Content-Type": "application/json", "Content-Type": "application/json",
}, },
body: JSON.stringify(teams) body: JSON.stringify(teams)
} };
const resp = await fetch("/api/v1/vote/kkk", params); const resp = await fetch("/api/v1/vote/kkk", params);
console.log(resp.status) console.log(resp.status)
} }
view(vnode){ view(vnode: m.CVnode<MainVoteViewAttr>){
const name = "Les chacals de laval" const name = "Les chacals de laval"
return m("div.columns.is-centered", return m("div.columns.is-centered",
m("div.column.is-two-thirds", m("div.column.is-two-thirds",
@@ -100,7 +119,7 @@ class MainVoteView{
} }
class MainView{ class MainView{
createTeamRow(team){ createTeamRow(team: Team){
return m('tr', [ return m('tr', [
m('td', m(m.route.Link, {href: `${m.route.get()}vote/${team.id}/`}, team.name)), m('td', m(m.route.Link, {href: `${m.route.get()}vote/${team.id}/`}, team.name)),
m('td', team.scores.readme), m('td', team.scores.readme),
@@ -109,7 +128,7 @@ class MainView{
]) ])
} }
votesTable(teams){ votesTable(teams: Team[]){
return m('table.table.is-striped.is-fullwidth', return m('table.table.is-striped.is-fullwidth',
m('thead', m('thead',
m('tr', ['Équipe', 'Readme', 'Diagrammes', 'Idée'].map(title => m('th', title)))), m('tr', ['Équipe', 'Readme', 'Diagrammes', 'Idée'].map(title => m('th', title)))),
@@ -124,7 +143,7 @@ class MainView{
class PasscodeView{ class PasscodeView{
verifyPasscode(event): void { verifyPasscode(event: Event): void {
let password = event.target.value; let password = event.target.value;
if(verifyAuth(password)){ if(verifyAuth(password)){
window.localStorage.setItem("userId", password); window.localStorage.setItem("userId", password);
+1 -1
View File
@@ -40,7 +40,7 @@ function getUserIndex(userId: string, ballotId: string, questionId: string){
questionId] questionId]
} }
function persistTeams(userId: any, ballots: Team[]) { async function persistTeams(userId: any, ballots: Team[]): Promise<void> {
const kv = await Deno.openKv(); const kv = await Deno.openKv();
for(const ballot of ballots){ for(const ballot of ballots){
for(const question of Object.keys(ballot.scores)){ for(const question of Object.keys(ballot.scores)){