diff --git a/client/scripts/database.js b/client/scripts/database.js index f3fe2a5..acd44f8 100644 --- a/client/scripts/database.js +++ b/client/scripts/database.js @@ -1,4 +1,4 @@ -const DB_VERSION = 7; +const DB_VERSION = 8; const USER_ID = localStorage.getItem('auth_user'); const USER_NAME = localStorage.getItem('auth_username'); @@ -262,6 +262,9 @@ function dbGetRanking(minDate, maxDate, maxAge, ageStrict, altM = 9, ageCrew = f return new Promise(async function(resolve) { var rankNoResults = []; + // TODO: remove / Abwärtskompatibilität + //if (maxAge === true) maxAge = await dbGetClassProp('youth-age'); + var sailors = await dbGetData('sailors'); var regattas = await dbGetRegattasRange(minDate, maxDate); @@ -570,7 +573,7 @@ function sync() { localTimes[entry['table']] = entry['time']; }); - syncInProgress = 12; + syncInProgress = 13; var syncOkay = true; log("[db] Sync Start"); $('#i-sync').addClass('fa-spin'); @@ -618,6 +621,33 @@ function sync() { } }); + // RANKINGS + getJSON(QUERY_URL + 'get_rankings', function (code, data) { + if (code == 200) { + var os = db.transaction('rankings', 'readwrite').objectStore('rankings'); + data.data.forEach(function (entry) { + os.put(entry); + }); + os.openCursor().onsuccess = function (event) { + var cursor = event.target.result; + if (cursor) { + if (!data.keys.includes(parseInt(cursor.key))) { + os.delete(cursor.key); + } + cursor.continue(); + } else { + syncInProgress --; + log('[db] rankings synced, remaining:', syncInProgress); + } + }; + } else { + log("[db] rankings: Something went wrong (HTTP " + code + ")"); + syncOkay = false; + syncInProgress --; + log('[db] rankings failed, remaining:', syncInProgress); + } + }); + // CLUBS if (localTimes['clubs'] < serverTimes['clubs']) { getJSON(QUERY_URL + 'get_clubs?changed-after=' + localTimes['clubs'], function (code, data) { @@ -1155,6 +1185,11 @@ function initDatabase() { var osClass = db.createObjectStore('class', { keyPath: 'key' }); } + if ((oldVersion < 8) && (newVersion >= 8)) { + log('[db] to version 8'); + var osRankings = db.createObjectStore('rankings', { keyPath: 'id' }); + } + // Force resync after db update if (oldVersion >= 1) { var osUpdateTimes = upgradeTransaction.objectStore('update_times'); diff --git a/server/content/rank.php b/server/content/rank.php index 6fcf207..e3bf140 100644 --- a/server/content/rank.php +++ b/server/content/rank.php @@ -7,28 +7,18 @@ // Title, Inputs $content = "
Momentan können wir Dir hier leider nur die Jahresrangliste anzeigen.
';
-$content .= 'Um die anderen Ranglisten zu sehen, besuche bitte unsere Webseite.
Zu folgenden Regatten wurden noch keine Ergebnisse hinterlegt:
'; diff --git a/server/scripts/rank.js b/server/scripts/rank.js index c90e55d..7b7713f 100644 --- a/server/scripts/rank.js +++ b/server/scripts/rank.js @@ -106,38 +106,67 @@ async function onRankingClicked(id) { $('#menu-rank').scrollTop(0); } +var rankings; + async function selectChange(callSiteScript = true) { - var type = $('#select-type').val(); - var year = parseInt($('#select-year').val()); - if (type == "user") { - $('#select-year').parent().hide(); + var year = $('#select-year').val(); + if (year == "user") { + $('#select-type').parent().hide(); $('#input-from').trigger('focusin').trigger('focusout').parent().show(); $('#input-to').trigger('focusin').trigger('focusout').parent().show(); - $('#input-jugend').parent().parent().show(); - $('#input-jugstrict').parent().parent().show(); + $('#input-altm').trigger('focusin').trigger('focusout').parent().show(); + $('#input-maxage').trigger('focusin').trigger('focusout').parent().show(); + $('#input-agestrict').parent().show(); + $('#input-agecrew').parent().show(); $('#button-show').show(); } else { - $('#select-year').parent().show(); + year = parseInt(year); + var type = $('#select-type').val(); + console.log('[rank] selected', year, type); + $('#select-type').parent().show(); $('#input-from').parent().hide(); $('#input-to').parent().hide(); - $('#input-jugend').parent().parent().hide(); - $('#input-jugstrict').parent().parent().hide(); + $('#input-altm').parent().hide(); + $('#input-maxage').parent().hide(); + $('#input-agestrict').parent().hide(); + $('#input-agecrew').parent().hide(); $('#button-show').hide(); - var from, to, jugend, jugstrict; - switch (type) { + var rankingsShow = {}; + var options = ''; + for (var i in rankings) { + if (rankings[i].year_from !== null && rankings[i].year_from > year) continue; + if (rankings[i].year_to !== null && rankings[i].year_to < year) continue; + var alias = rankings[i].alias; + options += ''; + rankingsShow[alias] = rankings[i]; + } + $('#select-type').html(options); + if (!(type in rankingsShow)) { + console.log('[rank] selected type', type, 'not found for year', year, '. Using `year`'); + type = 'year'; + } + $('#select-type').val(type).trigger('focusin').trigger('focusout'); + + var from, to, altm, maxage, agestrict, agecrew; + altm = 9; maxage = false; agestrict = false; agecrew = false; + var r = rankingsShow[type]; + console.log('[rank] type', type, '=>', r); + if (r.max_age !== null) { + maxage = r.max_age; + agestrict = r.age_strict == 1; + agecrew = r.age_crew == 1; + } + if (r.alt_m !== null) { + altm = r.alt_m; + } + switch (r.type) { case 'year': from = (year - 1) + '-12-01'; to = year + '-11-30'; - jugend = jugstrict = false; break; - case 'youth': - from = (year - 1) + '-12-01'; - to = year + '-11-30'; - jugend = jugstrict = true; - break; - case 'idjm': - var youthGermanName = await dbGetClassProp('youth-german-name'); + case 'quali': + // TODO: auslagern in function getRegattaBegin var beginn = null; var regattas = await dbGetData('regattas'); regattas.sort(function(a,b){ return b.date.localeCompare(a.date); }); @@ -147,12 +176,13 @@ async function selectChange(callSiteScript = true) { if ((date < parseDate('01.01.' + year)) || (date > parseDate('31.12.' + year))) { continue; } - if (regatta.name.indexOf(youthGermanName) >= 0) { + if (regatta.name.indexOf(r.quali_search) >= 0) { beginn = ((regatta.meldungSchluss != null) ? parseDate(regatta.meldungSchluss) : date); break; } } - if (beginn != null) { + // END OF TODO + if (beginn !== null) { from = new Date(beginn); from.setFullYear(from.getFullYear() - 1); from.setDate(from.getDate() - 13); @@ -160,23 +190,28 @@ async function selectChange(callSiteScript = true) { to = new Date(beginn); to.setDate(to.getDate() - 14); to = formatDate('Y-m-d', to); - jugend = true; - jugstrict = false; } else { - $('#div-rank').html('Keine ' + youthGermanName + ' gefunden!'); - $('#input-search').parent().hide(); - return; + from = (year - 1) + '-12-01'; + to = year + '-11-30'; + break; // TODO: bessere Fehlermeldung - keine Regatta gefunden } break; + default: // TODO: bessere Fehlermeldung - tritt nur bei Fehlkonfiguration in DB auf + from = (year - 1) + '-12-01'; + to = year + '-11-30'; + break; } + console.log('[rank] setting', from, to, altm, maxage, agestrict, agecrew); $('#input-from').val(from); $('#input-to').val(to); - $('#input-jugend').prop('checked', jugend); - $('#input-jugstrict').prop('checked', jugstrict); + $('#input-altm').val(altm); + $('#input-maxage').val(maxage == false ? '' : maxage); + $('#input-agestrict').prop('checked', agestrict); + $('#input-agecrew').prop('checked', agecrew); if (callSiteScript && (typeof siteScript === 'function')) { - history.replaceState(null, '', '?type=' + type + '&year=' + year); + history.replaceState(null, '', '?year=' + year + '&type=' + type); showLoader(); siteScript(); } @@ -185,40 +220,65 @@ async function selectChange(callSiteScript = true) { function buttonShowPressed() { if (typeof siteScript === 'function') { - var chboxes = ''; - if ($('#input-jugend').prop('checked')) chboxes += '&jugend=on' - if ($('#input-jugstrict').prop('checked')) chboxes += '&jugstrict=on' - history.replaceState(null, '', '?type=user&from=' + $('#input-from').val() + "&to=" + $('#input-to').val() + chboxes) + var additional = ''; + 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) showLoader(); siteScript(); } } function initSelects() { - var type = findGetParameter('type'); - var year = findGetParameter('year'); - if (type === null) type = 'year'; - if (year === null) year = new Date().getFullYear(); + return new Promise(async function(resolve) { + var year = findGetParameter('year'); + var type = findGetParameter('type'); + if (year === null) year = new Date().getFullYear(); + if (type === null) type = 'year'; - $('#select-type').val(type); + var years = await dbGetData('years'); + years.sort(function (a, b) { + if (a['year'] > b['year']) return -1; + if (a['year'] < b['year']) return 1; + return 0; + }); + var yearFound = year == 'user'; + var options = ''; + for (id in years) { + var y = years[id]['year']; + options += ''; + if (year == y) yearFound = true; + } + $('#select-year').html(options); + $('#select-year').val(yearFound ? year : years[0]); - $('#select-year').html(''); - $('#select-year').val(year); + $('#select-type').html(''); + $('#select-type').val(type); - if (type == "user") { - var from = findGetParameter('from'); - var to = findGetParameter('to'); - if (from === null) from = formatDate('Y-m-d') - if (to === null) to = formatDate('Y-m-d') - $('#input-from').val(from).trigger('focusin').trigger('focusout'); - $('#input-to').val(to).trigger('focusin').trigger('focusout'); - var jugend = findGetParameter('jugend'); - var jugstrict = findGetParameter('jugstrict'); - $('#input-jugend').prop('checked', jugend !== null); - $('#input-jugstrict').prop('checked', jugstrict !== null); - } + if (year == "user") { + var from = findGetParameter('from'); + var to = findGetParameter('to'); + if (from === null) from = formatDate('Y-m-d'); + if (to === null) to = formatDate('Y-m-d'); + $('#input-from').val(from).trigger('focusin').trigger('focusout'); + $('#input-to').val(to).trigger('focusin').trigger('focusout'); + var altm = findGetParameter('altm'); + if (altm === null) altm = 9; + $('#input-altm').val(altm).trigger('focusin').trigger('focusout'); + var maxage = findGetParameter('maxage'); + if (maxage === null) maxage = ''; + $('#input-maxage').val(maxage).trigger('focusin').trigger('focusout'); + var agestrict = findGetParameter('agestrict'); + var agecrew = findGetParameter('agecrew'); + $('#input-agestrict').prop('checked', agestrict !== null); + $('#input-agecrew').prop('checked', agecrew !== null); + } - selectChange(false); + selectChange(false); + + resolve(); + }); } var firstCall = true; @@ -231,7 +291,12 @@ async function drawList () { var list = ''; rows.forEach(function (entry) { if (entry == null) { - list += '