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 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
@@ -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)){
|
||||||
|
|||||||
Reference in new issue
Block a user