From a88c8356c2aec2f7568618e8424a880ee763d6af Mon Sep 17 00:00:00 2001 From: ostertun Date: Wed, 3 Aug 2022 12:31:38 +0200 Subject: [PATCH] crew ranking --- client/scripts/database.js | 65 +++++++++++++++++++++++++++++--------- server/content/rank.php | 3 +- server/scripts/rank.js | 23 +++++++++++--- 3 files changed, 70 insertions(+), 21 deletions(-) diff --git a/client/scripts/database.js b/client/scripts/database.js index acd44f8..0b09fdb 100644 --- a/client/scripts/database.js +++ b/client/scripts/database.js @@ -258,7 +258,7 @@ function dbGetResultCalculated(regatta) { }); } -function dbGetRanking(minDate, maxDate, maxAge, ageStrict, altM = 9, ageCrew = false) { +function dbGetRanking(minDate, maxDate, maxAge, ageStrict, altM = 9, ageCrew = false, personMode = 0) { return new Promise(async function(resolve) { var rankNoResults = []; @@ -288,6 +288,7 @@ function dbGetRanking(minDate, maxDate, maxAge, ageStrict, altM = 9, ageCrew = f // regatta has to have rlf if (regatta.rlf == 0) continue; + // get results var results = await dbGetDataIndex('results', 'regatta', regatta.id); if (results.length <= 0) { if (regatta.dateTo <= getToday()) { @@ -339,8 +340,10 @@ function dbGetRanking(minDate, maxDate, maxAge, ageStrict, altM = 9, ageCrew = f // check if crew is youth if ((maxAge != false) && ageCrew) { var crew = result.crew.split(','); + crew.push(result.steuermann); var okay = true; - for (var c in crew) { + for (var ci in crew) { + var c = crew[ci]; if ((c == '') || !(c in sailorIds)) continue; var sailor = sailors[sailorIds[c]]; if (((sailor.year != null) && (sailor.year < (formatDate('Y', date) - maxAge))) || @@ -352,18 +355,42 @@ function dbGetRanking(minDate, maxDate, maxAge, ageStrict, altM = 9, ageCrew = f if (!okay) continue; } - sailors[sailorIds[result.steuermann]].regattas[regatta.id] = { - regatta: regatta.id, - boat: result.boat, - crew: result.crew, - place: result.place, - fb: fb, - rlp: result.rlp, - used: 0, - m: m - }; - for (var j = 0; j < m; j ++) { - sailors[sailorIds[result.steuermann]].tmp_rlp.push([regatta.id, result.rlp]); + if (personMode == 0 || personMode == 2) { // add to helmsman + sailors[sailorIds[result.steuermann]].regattas[regatta.id] = { + regatta: regatta.id, + boat: result.boat, + helm: result.steuermann, + crew: result.crew, + place: result.place, + fb: fb, + rlp: result.rlp, + used: 0, + m: m + }; + for (var j = 0; j < m; j ++) { + sailors[sailorIds[result.steuermann]].tmp_rlp.push([regatta.id, result.rlp]); + } + } + if (personMode == 1 || personMode == 2) { // add to crew + var crew = result.crew.split(','); + for (var ci in crew) { + var c = crew[ci]; + if ((c == '') || !(c in sailorIds)) continue; + sailors[sailorIds[c]].regattas[regatta.id] = { + regatta: regatta.id, + boat: result.boat, + helm: result.steuermann, + crew: result.crew, + place: result.place, + fb: fb, + rlp: result.rlp, + used: 0, + m: m + }; + for (var j = 0; j < m; j ++) { + sailors[sailorIds[c]].tmp_rlp.push([regatta.id, result.rlp]); + } + } } } } @@ -411,8 +438,16 @@ function dbGetRanking(minDate, maxDate, maxAge, ageStrict, altM = 9, ageCrew = f return b.rlp - a.rlp; }); + var lastPoints = 0; + var lastRank = 1; for (var i = 0; i < sailors.length; i ++) { - sailors[i].rank = (i + 1); + if (lastPoints == sailors[i].rlp) { + sailors[i].rank = lastRank; + } else { + sailors[i].rank = (i + 1); + lastRank = (i + 1); + lastPoints = sailors[i].rlp; + } } resolve([sailors, rankNoResults]); diff --git a/server/content/rank.php b/server/content/rank.php index 76527ff..4932a1e 100644 --- a/server/content/rank.php +++ b/server/content/rank.php @@ -15,7 +15,8 @@ $content .= $tpl->load('input', ['html-id' => 'input-maxage', 'placeholder' => 'max. Alter (leer = nicht prüfen)', 'type' => 'number']); $content .= $tpl->load('checkbox', ['html-id' => 'input-agestrict', 'placeholder' => 'unb. Jahrgänge ausschließen']); $content .= $tpl->load('checkbox', ['html-id' => 'input-agecrew', 'placeholder' => 'Crew auch prüfen']); - $content .= $tpl->load('button', ['Anzeigen', '#', 'html-id' => 'button-show']); + $content .= $tpl->load('select', ['html-id' => 'select-personmode', 'placeholder' => 'nach', 'css-class' => 'mt-3 mb-0']); + $content .= $tpl->load('button', ['Anzeigen', '#', 'html-id' => 'button-show', 'css-class' => 'mt-3']); $sp['output'] .= $tpl->load('card', [$content]); diff --git a/server/scripts/rank.js b/server/scripts/rank.js index 813bac6..42ca383 100644 --- a/server/scripts/rank.js +++ b/server/scripts/rank.js @@ -83,6 +83,7 @@ async function onRankingClicked(id) { // ZEILE 5... var crew = entry.crew.split(','); + crew.unshift(entry.helm); for (var c in crew) { var cr = await dbGetData('sailors', crew[c]); if (cr != null) { @@ -234,6 +235,8 @@ function selectChange(callSiteScript = true) { break; } + var personMode = $('#select-personmode').val(); + console.log('[rank] setting', from, to, altm, maxage, agestrict, agecrew); $('#input-from').val(from); $('#input-to').val(to); @@ -243,7 +246,7 @@ function selectChange(callSiteScript = true) { $('#input-agecrew').prop('checked', agecrew); if (callSiteScript && (typeof siteScript === 'function')) { - history.replaceState(null, '', '?year=' + year + '&type=' + type); + history.replaceState(null, '', '?year=' + year + '&type=' + type + '&pm=' + personMode); showLoader(); siteScript(); } @@ -258,7 +261,7 @@ function buttonShowPressed() { if ($('#input-maxage').val() != '') additional += '&maxage=' + $('#input-maxage').val(); if ($('#input-agestrict').prop('checked')) additional += '&agestrict=on'; if ($('#input-agecrew').prop('checked')) additional += '&agecrew=on'; - history.replaceState(null, '', '?year=user&from=' + $('#input-from').val() + "&to=" + $('#input-to').val() + "&altm=" + $('#input-altm').val() + additional) + history.replaceState(null, '', '?year=user&from=' + $('#input-from').val() + "&to=" + $('#input-to').val() + "&altm=" + $('#input-altm').val() + "&pm=" + $('#select-personmode').val() + additional) showLoader(); siteScript(); } @@ -268,8 +271,10 @@ function initSelects() { return new Promise(async function(resolve) { var year = findGetParameter('year'); var type = findGetParameter('type'); + var personMode = parseInt(findGetParameter('pm')); if (year === null) year = new Date().getFullYear(); if (type === null) type = 'year'; + if (isNaN(personMode) || personMode < 0 || personMode > 2) personMode = 0; var years = await dbGetData('years'); years.sort(function (a, b) { @@ -309,6 +314,12 @@ function initSelects() { $('#input-agecrew').prop('checked', agecrew !== null); } + options = ''; + options += ''; + options += ''; + $('#select-personmode').html(options); + $('#select-personmode').val(personMode); + await selectChange(false); resolve(); @@ -346,6 +357,7 @@ var siteScript = async function() { await initSelects(); $('#select-year').change(selectChange); $('#select-type').change(selectChange); + $('#select-personmode').change(selectChange); $('#button-show').click(buttonShowPressed); $('#input-search').on('input', drawList); } @@ -356,8 +368,9 @@ var siteScript = async function() { var maxage = $('#input-maxage').val(); if (maxage == '') maxage = false; else maxage = parseInt(maxage); var agestrict = $('#input-agestrict').prop('checked'); var agecrew = $('#input-agecrew').prop('checked'); - console.log('[rank] rank params:', minDate, maxDate, altm, maxage, agestrict, agecrew); - var dbRanking = await dbGetRanking(minDate, maxDate, maxage, agestrict, altm, agecrew); + var personMode = $('#select-personmode').val(); + console.log('[rank] rank params:', minDate, maxDate, altm, maxage, agestrict, agecrew, personMode); + var dbRanking = await dbGetRanking(minDate, maxDate, maxage, agestrict, altm, agecrew, personMode); ranking = dbRanking[0]; lastRanking = null; // TODO: also for quali ranks @@ -366,7 +379,7 @@ var siteScript = async function() { var lYear = parseInt($('#select-year').val()) - 1; var lMinDate = parseDate((lYear - 1) + '-12-01'); var lMaxDate = parseDate(lYear + '-11-30'); - var lDbRanking = (await dbGetRanking(lMinDate, lMaxDate, maxage, agestrict, altm, agecrew))[0]; + var lDbRanking = (await dbGetRanking(lMinDate, lMaxDate, maxage, agestrict, altm, agecrew, personMode))[0]; for (var i in lDbRanking) { lastRanking[lDbRanking[i].id] = lDbRanking[i].rank; }