X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=js%2Findex.js;h=649e44c359f421a16bb182682fa8c2bbb81ecfe2;hb=ade10194c01dcf4a71fc92f055d5dc53ac555e0e;hp=944a51b2a548b796465e981ffbc168f96a4863b9;hpb=7a00c4090c05f7c5f9d9b1b49bcf749b90f95c06;p=westcastle.git diff --git a/js/index.js b/js/index.js index 944a51b..649e44c 100644 --- a/js/index.js +++ b/js/index.js @@ -21,7 +21,7 @@ new Vue({

Absents

- + @@ -46,57 +46,49 @@ new Vue({ }, }, 'my-ranking': { - props: ['players'], - data: function() { - return { - sortMethod: "score", - }; - }, + props: ['players','sortByScore','rankPeople'], template: `
{{ p.prenom }} {{ p.nom }}
- - + + - - + + - +
Rang JoueurScorePdTPointsMini-pts
{{ i+1 }}
{{ p.rank }} {{ p.prenom }} {{ p.nom }}{{ p.score }} {{ p.pdt }}{{ p.session }}
`, computed: { sortedPlayers: function() { - let sortFunc = this.sortMethod == "score" - ? this.sortByScore - : this.sortByPdt; - return this.players - .map( p => { return p; }) //to not alter original array - .sort(sortFunc); - }, - }, - methods: { - sortByScore: function(a,b) { - return b.score - a.score; - }, - sortByPdt: function(a,b) { - return b.pdt - a.pdt; + let res = this.rankPeople(); + // Add rank information (taking care of ex-aequos) + let rank = 1; + for (let i=0; i
-

Table {{ index+1 }}

- - - - - - + +
{{ players[i].prenom }} {{ players[i].nom }}{{ pdts[index][j] }}
  {{ players[i].prenom }} {{ players[i].nom }}{{ sessions[index][j] }}
@@ -128,8 +116,10 @@ new Vue({
- - + +
{{ players[tables[currentIndex][i]].prenom }} {{ players[tables[currentIndex][i]].nom }} + {{ players[tables[currentIndex][i]].prenom }} {{ players[tables[currentIndex][i]].nom }} +
@@ -144,7 +134,7 @@ new Vue({ // Simple case first: 4 by 4 let tables = []; let currentTable = []; - let ordering = _.shuffle(_.range(this.players.length)); //TODO: take scores into account? + let ordering = _.shuffle(_.range(this.players.length)); for (let i=0; i { + if (t.length < 4) + t.push(0); //index of "Toto", ghost player + }); this.tables = tables; - this.scores = tables.map( t => { return []; }); //empty scores this.pdts = tables.map( t => { return []; }); //empty pdts + this.sessions = tables.map( t => { return []; }); //empty sessions }, shuffle: function() { this.doPairings(); }, showScoreForm: function(table,index) { - if (this.scores[index].length > 0) + if (this.pdts[index].length > 0) return; //already scored - this.scores[index] = _.times(table.length, _.constant(0)); this.pdts[index] = _.times(table.length, _.constant(0)); + this.sessions[index] = _.times(table.length, _.constant(0)); this.currentIndex = index; }, setScore: function() { - let sortedPdts = this.pdts[this.currentIndex] + let sortedSessions = this.sessions[this.currentIndex] .map( (s,i) => { return {value:s, index:i}; }) .sort( (a,b) => { return parseInt(b.value) - parseInt(a.value); }); - let scores = [4, 2, 1, 0]; //TODO: biased for 3-players tables. TODO: ex-aequos ?! + let pdts = [4, 2, 1, 0]; //TODO: ex-aequos ?! for (let i=0; i { return Object.assign({}, p); }) //deep (enough) copy - .sort( (a,b) => { return b.score - a.score; }); + .sort(this.sortByScore); xhr.send("players="+encodeURIComponent(JSON.stringify(orderedPlayers))); }, }, @@ -230,14 +226,32 @@ new Vue({ { let players = JSON.parse(xhr.responseText); players.forEach( p => { - p.score = !!p.score ? parseInt(p.score) : 0; p.pdt = !!p.pdt ? parseInt(p.pdt) : 0; + p.session = !!p.session ? parseInt(p.session) : 0; p.available = !!p.available ? p.available : 1; //use integer for fputcsv PHP func }); + players.unshift({ //add ghost 4th player for 3-players tables + prenom: "Toto", + nom: "", + pdt: 0, + session: 0, + available: 0, + }); self.players = players; } }; xhr.open("GET", "scripts/rw_players.php", true); xhr.send(null); }, + methods: { + rankPeople: function() { + return this.players + .slice(1) //discard Toto + .map( p => { return Object.assign({}, p); }) //to not alter original array + .sort(this.sortByScore); + }, + sortByScore: function(a,b) { + return b.pdt - a.pdt + (Math.atan(b.session - a.session) / (Math.PI/2)) / 2; + }, + }, });