Added better types
This commit is contained in:
1 parent
22489242c2
commit
b52f76d3bc
2 files changed
+60
-41
No files matched your search
+59
-40
@@ -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
@@ -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)){
|
||||
|
||||
Reference in new issue
Block a user