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 {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<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){
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<VoteViewAttr>){
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<MainVoteViewAttr>{
async persistTeams(): Promise<void>{
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<MainVoteViewAttr>){
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);
+1 -1
View File
@@ -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<void> {
const kv = await Deno.openKv();
for(const ballot of ballots){
for(const question of Object.keys(ballot.scores)){