Compare commits

..

14 Commits
v_1.7 ... v_1.8

Author SHA1 Message Date
ostertun
a45af73c25 Merge branch 'release/v_1.8' 2020-10-02 01:29:43 +02:00
ostertun
f30eac8aa5 Release v_1.8 2020-10-02 01:27:31 +02:00
ostertun
99b624ff92 Merge branch 'feature/RA-4-notifications-ignore-my-regattas' into develop 2020-10-02 01:24:16 +02:00
ostertun
e74ffa9a70 Merge branch 'feature/RA-19-update-url-on-year-change' into develop 2020-10-02 01:24:11 +02:00
ostertun
cbb398988d Merge branch 'feature/RA-20-update-news-badge' into develop 2020-10-02 01:24:00 +02:00
ostertun
856f6c1d66 RA-#20 Update news badge 2020-10-02 01:23:46 +02:00
ostertun
2ea26408be RA-#3 Trigger inputs after programmatically changed 2020-10-02 00:59:34 +02:00
ostertun
fb1ca6d28e RA-#19 Update URL on year change 2020-10-02 00:49:53 +02:00
ostertun
6a5d06325d RA-#4 Notifications: can select "my regattas" channels only when logged in 2020-10-02 00:13:58 +02:00
ostertun
72ac8df460 Merge branch 'feature/dev_buttons' into develop 2020-10-01 23:36:05 +02:00
ostertun
246231fd0e RA-#8 Fix deleteCache 2020-10-01 23:35:49 +02:00
ostertun
3e533f65fc Added show-console-button to preloader 2020-10-01 23:26:22 +02:00
ostertun
2533c3d66a RA-#16 Updated Dev Buttons 2020-10-01 23:25:48 +02:00
ostertun
cacee5a54a RA-#17 Fix padding of body 2020-10-01 22:46:53 +02:00
11 changed files with 329 additions and 212 deletions

View File

@@ -161,19 +161,19 @@ function dbGetResultCalculated(regatta) {
return new Promise(async function(resolve) { return new Promise(async function(resolve) {
var results = await dbGetDataIndex('results', 'regatta', regatta.id); var results = await dbGetDataIndex('results', 'regatta', regatta.id);
if (results.length > 0) { if (results.length > 0) {
var gemeldet = results.length; var gemeldet = results.length;
for (id in results) { for (id in results) {
results[id]['finished'] = false; results[id]['finished'] = false;
results[id]['values'] = []; results[id]['values'] = [];
results[id]['values_all'] = []; results[id]['values_all'] = [];
results[id]['texts'] = []; results[id]['texts'] = [];
var copy = []; var copy = [];
for (var i = 0; i < regatta['races']; i ++) { for (var i = 0; i < regatta['races']; i ++) {
var race = results[id]['race' + (i + 1)].replace(',', '.'); var race = results[id]['race' + (i + 1)].replace(',', '.');
if (!isNaN(race)) { if (!isNaN(race)) {
copy[i] = results[id]['values'][i] = parseFloat(race); copy[i] = results[id]['values'][i] = parseFloat(race);
results[id]['texts'][i] = race; results[id]['texts'][i] = race;
@@ -198,7 +198,7 @@ function dbGetResultCalculated(regatta) {
// Unbekannt // Unbekannt
default: results[id]['values'][i] = 0; copy[i] = 0; break; default: results[id]['values'][i] = 0; copy[i] = 0; break;
} }
if (results[id]['values'][i] != 0) { if (results[id]['values'][i] != 0) {
results[id]['texts'][i] = race + ' (' + results[id]['values'][i] + ')'; results[id]['texts'][i] = race + ' (' + results[id]['values'][i] + ')';
} else { } else {
@@ -206,7 +206,7 @@ function dbGetResultCalculated(regatta) {
} }
} }
} }
results[id]['values_all'] = [...results[id]['values']]; results[id]['values_all'] = [...results[id]['values']];
for (var s = 0; s < regatta['streicher']; s ++) { for (var s = 0; s < regatta['streicher']; s ++) {
var max = Math.max(...copy); var max = Math.max(...copy);
@@ -217,7 +217,7 @@ function dbGetResultCalculated(regatta) {
} }
} }
} }
var brutto = 0; var brutto = 0;
var netto = 0; var netto = 0;
for (var i = 0; i < regatta['races']; i ++) { for (var i = 0; i < regatta['races']; i ++) {
@@ -233,11 +233,11 @@ function dbGetResultCalculated(regatta) {
results[id]['brutto'] = brutto; results[id]['brutto'] = brutto;
results[id]['netto'] = netto; results[id]['netto'] = netto;
} }
compareResultsRaceCount = regatta['races']; compareResultsRaceCount = regatta['races'];
results.sort(compareResults); results.sort(compareResults);
var place = 1; var place = 1;
for (id in results) { for (id in results) {
if ((id > 0) && (compareResults(results[id], results[id - 1]) == 0)) { if ((id > 0) && (compareResults(results[id], results[id - 1]) == 0)) {
@@ -247,9 +247,9 @@ function dbGetResultCalculated(regatta) {
} }
place ++; place ++;
} }
resolve(results); resolve(results);
} else { } else {
resolve([]); resolve([]);
} }
@@ -259,26 +259,26 @@ function dbGetResultCalculated(regatta) {
function dbGetRanking(minDate, maxDate, jugend, jugstrict) { function dbGetRanking(minDate, maxDate, jugend, jugstrict) {
return new Promise(async function(resolve) { return new Promise(async function(resolve) {
var rankNoResults = []; var rankNoResults = [];
var sailors = await dbGetData('sailors'); var sailors = await dbGetData('sailors');
var regattas = await dbGetRegattasRange(minDate, maxDate); var regattas = await dbGetRegattasRange(minDate, maxDate);
var sailorIds = {}; var sailorIds = {};
for (s in sailors) { for (s in sailors) {
sailorIds[sailors[s].id] = s; sailorIds[sailors[s].id] = s;
} }
for (var i in sailors) { for (var i in sailors) {
sailors[i].regattas = {}; sailors[i].regattas = {};
sailors[i].tmp_rlp = []; sailors[i].tmp_rlp = [];
} }
for (var i in regattas) { for (var i in regattas) {
var regatta = regattas[i]; var regatta = regattas[i];
// regatta has to be min. 2 days to be ranking regatta // regatta has to be min. 2 days to be ranking regatta
if (regatta.length < 2) continue; if (regatta.length < 2) continue;
var results = await dbGetDataIndex('results', 'regatta', regatta.id); var results = await dbGetDataIndex('results', 'regatta', regatta.id);
if (results.length <= 0) { if (results.length <= 0) {
if (regatta.dateTo <= getToday()) { if (regatta.dateTo <= getToday()) {
@@ -288,7 +288,7 @@ function dbGetRanking(minDate, maxDate, jugend, jugstrict) {
} }
continue; continue;
} }
// in one race there must be at least 10 boats started // in one race there must be at least 10 boats started
var ok = false; var ok = false;
for (var j = 1; j <= regatta.races; j ++) { for (var j = 1; j <= regatta.races; j ++) {
@@ -304,9 +304,9 @@ function dbGetRanking(minDate, maxDate, jugend, jugstrict) {
} }
} }
if (!ok) continue; if (!ok) continue;
var fb = regatta.finishedBoats; var fb = regatta.finishedBoats;
// calc m // calc m
var m; var m;
if (regatta.m > 0) { if (regatta.m > 0) {
@@ -320,16 +320,16 @@ function dbGetRanking(minDate, maxDate, jugend, jugstrict) {
m = 4; m = 4;
} }
} }
// add regatta to each sailor // add regatta to each sailor
for (var r in results) { for (var r in results) {
var result = results[r]; var result = results[r];
if (result.rlp == 0) continue; if (result.rlp == 0) continue;
// check if crew is youth // check if crew is youth
// TODO: not used // TODO: not used
sailors[sailorIds[result.steuermann]].regattas[regatta.id] = { sailors[sailorIds[result.steuermann]].regattas[regatta.id] = {
regatta: regatta.id, regatta: regatta.id,
boat: result.boat, boat: result.boat,
@@ -345,7 +345,7 @@ function dbGetRanking(minDate, maxDate, jugend, jugstrict) {
} }
} }
} }
// remove not german or not youth sailors // remove not german or not youth sailors
for (var i = sailors.length - 1; i >= 0; i --) { for (var i = sailors.length - 1; i >= 0; i --) {
if (sailors[i].german == '0') { if (sailors[i].german == '0') {
@@ -357,13 +357,13 @@ function dbGetRanking(minDate, maxDate, jugend, jugstrict) {
} }
} }
} }
for (var i = sailors.length - 1; i >= 0; i --) { for (var i = sailors.length - 1; i >= 0; i --) {
// sort rlps desc // sort rlps desc
sailors[i].tmp_rlp.sort(function (a,b) { sailors[i].tmp_rlp.sort(function (a,b) {
return b[1] - a[1]; return b[1] - a[1];
}); });
// calc mean rlp // calc mean rlp
var sum = 0; var sum = 0;
var cnt = 0; var cnt = 0;
@@ -383,16 +383,16 @@ function dbGetRanking(minDate, maxDate, jugend, jugstrict) {
sailors.splice(i, 1); sailors.splice(i, 1);
} }
} }
sailors.sort(function (a,b) { sailors.sort(function (a,b) {
if (a.m != b.m) return b.m - a.m; if (a.m != b.m) return b.m - a.m;
return b.rlp - a.rlp; return b.rlp - a.rlp;
}); });
for (var i = 0; i < sailors.length; i ++) { for (var i = 0; i < sailors.length; i ++) {
sailors[i].rank = (i + 1); sailors[i].rank = (i + 1);
} }
resolve([sailors, rankNoResults]); resolve([sailors, rankNoResults]);
}); });
} }
@@ -424,7 +424,7 @@ async function updateSyncStatus() { // TODO
// var now = new Date(); // var now = new Date();
// var diff = Math.round((now - lastSync) / 1000); // var diff = Math.round((now - lastSync) / 1000);
// var txt = ''; // var txt = '';
// //
// if (diff < 30) { // 30 sec // if (diff < 30) { // 30 sec
// txt = 'jetzt'; // txt = 'jetzt';
// } else if (diff < 3600) { // 60 min // } else if (diff < 3600) { // 60 min
@@ -437,7 +437,7 @@ async function updateSyncStatus() { // TODO
// diff = Math.round(diff / 86400); // diff = Math.round(diff / 86400);
// txt = 'vor ' + diff + ' ' + (diff == 1 ? 'Tag' : 'Tagen'); // txt = 'vor ' + diff + ' ' + (diff == 1 ? 'Tag' : 'Tagen');
// } // }
// //
// var btn = '<a href="#" onclick="setLoading(true); sync(); return false;"><i class="fas fa-sync"></i> Sync</a>'; // var btn = '<a href="#" onclick="setLoading(true); sync(); return false;"><i class="fas fa-sync"></i> Sync</a>';
// syncStatus.innerHTML = 'Zuletzt aktualisiert: ' + txt + btn; // syncStatus.innerHTML = 'Zuletzt aktualisiert: ' + txt + btn;
} }
@@ -453,7 +453,7 @@ async function runPageScript() {
} }
}; };
updateSyncStatus(); updateSyncStatus();
if (isLoggedIn()) { if (isLoggedIn()) {
var plannings = await dbGetDataIndex('plannings', 'user', USER_ID); var plannings = await dbGetDataIndex('plannings', 'user', USER_ID);
plannings = plannings.map(function (e) { return e.regatta; }); plannings = plannings.map(function (e) { return e.regatta; });
@@ -471,7 +471,7 @@ async function runPageScript() {
} }
// syncStatus.style.display = 'block'; // syncStatus.style.display = 'block';
} }
if (typeof siteScript === 'function') { if (typeof siteScript === 'function') {
siteScript(); siteScript();
} else { } else {
@@ -482,20 +482,20 @@ async function runPageScript() {
function sync() { function sync() {
if (!canUseLocalDB) return false; if (!canUseLocalDB) return false;
if (syncInProgress > 0) return false; if (syncInProgress > 0) return false;
var now = Math.floor(Date.now() / 1000); var now = Math.floor(Date.now() / 1000);
db.transaction('update_times').objectStore('update_times').getAll().onsuccess = function (event) { db.transaction('update_times').objectStore('update_times').getAll().onsuccess = function (event) {
var localTimes = {}; var localTimes = {};
event.target.result.forEach(function (entry) { event.target.result.forEach(function (entry) {
localTimes[entry['table']] = entry['time']; localTimes[entry['table']] = entry['time'];
}); });
syncInProgress = 11; syncInProgress = 11;
var syncOkay = true; var syncOkay = true;
console.log("Sync Start"); console.log("Sync Start");
$('#i-sync').addClass('fa-spin'); $('#i-sync').addClass('fa-spin');
var interval = window.setInterval(function () { var interval = window.setInterval(function () {
if (syncInProgress <= 0) { if (syncInProgress <= 0) {
window.clearInterval(interval); window.clearInterval(interval);
@@ -507,14 +507,17 @@ function sync() {
setTimeout(function(){ setTimeout(function(){
$('#i-sync').removeClass('fa-spin'); $('#i-sync').removeClass('fa-spin');
}, 500); }, 500);
if (typeof onAfterSync === 'function') {
onAfterSync();
}
runPageScript(); runPageScript();
} }
}, 100); }, 100);
getJSON(QUERY_URL + 'get_update_time', function (code, serverTimes) { getJSON(QUERY_URL + 'get_update_time', function (code, serverTimes) {
if (code == 200) { if (code == 200) {
// CLUBS // CLUBS
if (localTimes['clubs'] < serverTimes['clubs']) { if (localTimes['clubs'] < serverTimes['clubs']) {
getJSON(QUERY_URL + 'get_clubs?changed-after=' + localTimes['clubs'], function (code, data) { getJSON(QUERY_URL + 'get_clubs?changed-after=' + localTimes['clubs'], function (code, data) {
@@ -546,7 +549,7 @@ function sync() {
} else { } else {
syncInProgress --; syncInProgress --;
} }
// BOATS // BOATS
if (localTimes['boats'] < serverTimes['boats']) { if (localTimes['boats'] < serverTimes['boats']) {
getJSON(QUERY_URL + 'get_boats?changed-after=' + localTimes['boats'], function (code, data) { getJSON(QUERY_URL + 'get_boats?changed-after=' + localTimes['boats'], function (code, data) {
@@ -578,7 +581,7 @@ function sync() {
} else { } else {
syncInProgress --; syncInProgress --;
} }
// SAILORS // SAILORS
if (localTimes['sailors'] < serverTimes['sailors']) { if (localTimes['sailors'] < serverTimes['sailors']) {
getJSON(QUERY_URL + 'get_sailors?changed-after=' + localTimes['sailors'], function (code, data) { getJSON(QUERY_URL + 'get_sailors?changed-after=' + localTimes['sailors'], function (code, data) {
@@ -610,7 +613,7 @@ function sync() {
} else { } else {
syncInProgress --; syncInProgress --;
} }
// REGATTAS // REGATTAS
if (localTimes['regattas'] < serverTimes['regattas']) { if (localTimes['regattas'] < serverTimes['regattas']) {
getJSON(QUERY_URL + 'get_regattas?changed-after=' + localTimes['regattas'], function (code, data) { getJSON(QUERY_URL + 'get_regattas?changed-after=' + localTimes['regattas'], function (code, data) {
@@ -643,7 +646,7 @@ function sync() {
osYears.put({ year: y }); osYears.put({ year: y });
} }
} }
var osUpdateTimes = db.transaction('update_times', 'readwrite').objectStore('update_times'); var osUpdateTimes = db.transaction('update_times', 'readwrite').objectStore('update_times');
osUpdateTimes.put({ table: 'regattas', time: serverTimes['regattas'] }); osUpdateTimes.put({ table: 'regattas', time: serverTimes['regattas'] });
syncInProgress --; syncInProgress --;
@@ -658,7 +661,7 @@ function sync() {
} else { } else {
syncInProgress --; syncInProgress --;
} }
// RESULTS // RESULTS
if (localTimes['results'] < serverTimes['results']) { if (localTimes['results'] < serverTimes['results']) {
getJSON(QUERY_URL + 'get_results?changed-after=' + localTimes['results'], function (code, data) { getJSON(QUERY_URL + 'get_results?changed-after=' + localTimes['results'], function (code, data) {
@@ -690,7 +693,7 @@ function sync() {
} else { } else {
syncInProgress --; syncInProgress --;
} }
// PLANNINGS // PLANNINGS
if (localTimes['plannings'] < serverTimes['plannings']) { if (localTimes['plannings'] < serverTimes['plannings']) {
getJSON(QUERY_URL + 'get_plannings?changed-after=' + localTimes['plannings'], function (code, data) { getJSON(QUERY_URL + 'get_plannings?changed-after=' + localTimes['plannings'], function (code, data) {
@@ -722,7 +725,7 @@ function sync() {
} else { } else {
syncInProgress --; syncInProgress --;
} }
if (isLoggedIn()) { if (isLoggedIn()) {
// TRIM_BOATS // TRIM_BOATS
if (localTimes['trim_boats'] < serverTimes['trim_boats']) { if (localTimes['trim_boats'] < serverTimes['trim_boats']) {
@@ -755,7 +758,7 @@ function sync() {
} else { } else {
syncInProgress --; syncInProgress --;
} }
// TRIM_USERS // TRIM_USERS
if (localTimes['trim_users'] < serverTimes['trim_users']) { if (localTimes['trim_users'] < serverTimes['trim_users']) {
getJSON(QUERY_URL + 'get_trim_users?changed-after=' + localTimes['trim_users'], function (code, data) { getJSON(QUERY_URL + 'get_trim_users?changed-after=' + localTimes['trim_users'], function (code, data) {
@@ -787,7 +790,7 @@ function sync() {
} else { } else {
syncInProgress --; syncInProgress --;
} }
// TRIM_TRIMS // TRIM_TRIMS
if (localTimes['trim_trims'] < serverTimes['trim_trims']) { if (localTimes['trim_trims'] < serverTimes['trim_trims']) {
getJSON(QUERY_URL + 'get_trim_trims?changed-after=' + localTimes['trim_trims'], function (code, data) { getJSON(QUERY_URL + 'get_trim_trims?changed-after=' + localTimes['trim_trims'], function (code, data) {
@@ -819,11 +822,11 @@ function sync() {
} else { } else {
syncInProgress --; syncInProgress --;
} }
} else { } else {
syncInProgress -= 3; syncInProgress -= 3;
} }
// NEWS // NEWS
if (localTimes['news'] < serverTimes['news']) { if (localTimes['news'] < serverTimes['news']) {
getJSON(QUERY_URL + 'get_news?changed-after=' + localTimes['news'], function (code, data) { getJSON(QUERY_URL + 'get_news?changed-after=' + localTimes['news'], function (code, data) {
@@ -855,7 +858,7 @@ function sync() {
} else { } else {
syncInProgress --; syncInProgress --;
} }
// USERS // USERS
if (localTimes['users'] < serverTimes['users']) { if (localTimes['users'] < serverTimes['users']) {
getJSON(QUERY_URL + 'get_users?changed-after=' + localTimes['users'], function (code, data) { getJSON(QUERY_URL + 'get_users?changed-after=' + localTimes['users'], function (code, data) {
@@ -887,7 +890,7 @@ function sync() {
} else { } else {
syncInProgress --; syncInProgress --;
} }
} else { } else {
console.log("Something went wrong (HTTP " + code + ")"); console.log("Something went wrong (HTTP " + code + ")");
syncOkay = false; syncOkay = false;
@@ -914,13 +917,13 @@ function initDatabase() {
var request = window.indexedDB.open('regatten_app_db_' + BOATCLASS, DB_VERSION); var request = window.indexedDB.open('regatten_app_db_' + BOATCLASS, DB_VERSION);
request.onerror = function (event) { request.onerror = function (event) {
console.log("Cannot open DB: " + event.target.errorCode); console.log("Cannot open DB: " + event.target.errorCode);
runPageScript(); runPageScript();
}; };
request.onsuccess = function (event) { request.onsuccess = function (event) {
console.log("Database loaded"); console.log("Database loaded");
db = event.target.result; db = event.target.result;
db.onversionchange = function (event) { db.onversionchange = function (event) {
if (syncTimer != null) window.clearInterval(syncTimer); if (syncTimer != null) window.clearInterval(syncTimer);
if (updateSyncStatusTimer != null) window.clearInterval(updateSyncStatusTimer); if (updateSyncStatusTimer != null) window.clearInterval(updateSyncStatusTimer);
@@ -929,15 +932,15 @@ function initDatabase() {
db.close(); db.close();
location.reload; location.reload;
} }
db.onerror = function (event) { db.onerror = function (event) {
console.log("DB Error: " + event.target.errorCode); console.log("DB Error: " + event.target.errorCode);
}; };
canUseLocalDB = true; canUseLocalDB = true;
if (typeof onDatabaseLoaded == 'function') onDatabaseLoaded(); if (typeof onDatabaseLoaded == 'function') onDatabaseLoaded();
db.transaction('update_times').objectStore('update_times').get('last_sync').onsuccess = function (event) { db.transaction('update_times').objectStore('update_times').get('last_sync').onsuccess = function (event) {
var lastSync = event.target.result.time; var lastSync = event.target.result.time;
if (lastSync > 0) { if (lastSync > 0) {
@@ -946,11 +949,11 @@ function initDatabase() {
db.transaction('update_times', 'readwrite').objectStore('update_times').put({ table: 'loggedin', status: isLoggedIn() }); db.transaction('update_times', 'readwrite').objectStore('update_times').put({ table: 'loggedin', status: isLoggedIn() });
} }
}; };
checkSync(); checkSync();
syncTimer = window.setInterval(checkSync, 300000); // 5 min syncTimer = window.setInterval(checkSync, 300000); // 5 min
window.ononline = function () { window.ononline = function () {
checkSync(); checkSync();
} }
@@ -960,9 +963,9 @@ function initDatabase() {
var upgradeTransaction = event.target.transaction; var upgradeTransaction = event.target.transaction;
var oldVersion = event.oldVersion; var oldVersion = event.oldVersion;
var newVersion = event.newVersion; var newVersion = event.newVersion;
console.log("Datenbank Version Upgrade von " + oldVersion + " auf " + newVersion); console.log("Datenbank Version Upgrade von " + oldVersion + " auf " + newVersion);
if ((oldVersion < 1) && (newVersion >= 1)) { if ((oldVersion < 1) && (newVersion >= 1)) {
console.log('to version 1'); console.log('to version 1');
var osClubs = db.createObjectStore('clubs', { keyPath: 'id' }); var osClubs = db.createObjectStore('clubs', { keyPath: 'id' });
@@ -991,7 +994,7 @@ function initDatabase() {
osUpdateTimes.add({ table: 'trim_users', time: 0 }); osUpdateTimes.add({ table: 'trim_users', time: 0 });
osUpdateTimes.add({ table: 'trim_trims', time: 0 }); osUpdateTimes.add({ table: 'trim_trims', time: 0 });
} }
if ((oldVersion < 2) && (newVersion >= 2)) { if ((oldVersion < 2) && (newVersion >= 2)) {
console.log('to version 2'); console.log('to version 2');
var osUsers = db.createObjectStore('users', { keyPath: 'id' }); var osUsers = db.createObjectStore('users', { keyPath: 'id' });
@@ -999,32 +1002,32 @@ function initDatabase() {
var osUpdateTimes = upgradeTransaction.objectStore('update_times'); var osUpdateTimes = upgradeTransaction.objectStore('update_times');
osUpdateTimes.add({ table: 'users', time: 0 }); osUpdateTimes.add({ table: 'users', time: 0 });
} }
if ((oldVersion < 3) && (newVersion >= 3)) { if ((oldVersion < 3) && (newVersion >= 3)) {
console.log('to version 3'); console.log('to version 3');
var osYears = db.createObjectStore('years', { keyPath: 'year' }); var osYears = db.createObjectStore('years', { keyPath: 'year' });
var osUpdateTimes = upgradeTransaction.objectStore('update_times'); var osUpdateTimes = upgradeTransaction.objectStore('update_times');
osUpdateTimes.put({ table: 'regattas', time: 0 }); osUpdateTimes.put({ table: 'regattas', time: 0 });
} }
if ((oldVersion < 4) && (newVersion >= 4)) { if ((oldVersion < 4) && (newVersion >= 4)) {
console.log('to version 4'); console.log('to version 4');
var osUpdateTimes = upgradeTransaction.objectStore('update_times'); var osUpdateTimes = upgradeTransaction.objectStore('update_times');
osUpdateTimes.add({ table: 'loggedin', status: isLoggedIn() }); osUpdateTimes.add({ table: 'loggedin', status: isLoggedIn() });
} }
if ((oldVersion < 5) && (newVersion >= 5)) { if ((oldVersion < 5) && (newVersion >= 5)) {
console.log('to version 5'); console.log('to version 5');
var osPushes = db.createObjectStore('settings', { keyPath: 'key' }); var osPushes = db.createObjectStore('settings', { keyPath: 'key' });
} }
if ((oldVersion < 6) && (newVersion >= 6)) { if ((oldVersion < 6) && (newVersion >= 6)) {
console.log('to version 6'); console.log('to version 6');
var osNews = db.createObjectStore('news', { keyPath: 'id' }); var osNews = db.createObjectStore('news', { keyPath: 'id' });
var osUpdateTimes = upgradeTransaction.objectStore('update_times'); var osUpdateTimes = upgradeTransaction.objectStore('update_times');
osUpdateTimes.add({ table: 'news', time: 0 }); osUpdateTimes.add({ table: 'news', time: 0 });
} }
var osUpdateTimes = upgradeTransaction.objectStore('update_times'); var osUpdateTimes = upgradeTransaction.objectStore('update_times');
osUpdateTimes.put({ table: 'last_sync', time: 0 }); osUpdateTimes.put({ table: 'last_sync', time: 0 });
} }
@@ -1033,8 +1036,7 @@ function initDatabase() {
} }
} }
function resetDb(silent = true) { function resetDb() {
$('#menu-developer').hideMenu();
if (canUseLocalDB) { if (canUseLocalDB) {
showLoader(); showLoader();
var osUpdateTimes = db.transaction('update_times', 'readwrite').objectStore('update_times'); var osUpdateTimes = db.transaction('update_times', 'readwrite').objectStore('update_times');
@@ -1051,11 +1053,6 @@ function resetDb(silent = true) {
osUpdateTimes.put({ table: 'news', time: 0 }); osUpdateTimes.put({ table: 'news', time: 0 });
osUpdateTimes.put({ table: 'users', time: 0 }); osUpdateTimes.put({ table: 'users', time: 0 });
console.log('DB update times reset'); console.log('DB update times reset');
if (!silent)
toastInfo('The database was reset. Please reload or close this tab.<br>At the next visit, a full sync will be performed.');
hideLoader(); hideLoader();
} else {
if (!silent)
toastWarn('Your device does not support storing data locally. All data is fetched directly from our server.<br>As a result, you can not reset your database.');
} }
} }

View File

@@ -27,13 +27,13 @@ function parseDate(string) {
} else { } else {
return null; return null;
} }
if (isNaN(year) || isNaN(month) || isNaN(day)) return null; if (isNaN(year) || isNaN(month) || isNaN(day)) return null;
if (year.toString().length == 2) year = (year < 70 ? 2000 : 1900) + year; if (year.toString().length == 2) year = (year < 70 ? 2000 : 1900) + year;
if ((year < 1970) || (year > 3000)) return null; if ((year < 1970) || (year > 3000)) return null;
if ((month < 1) || (month > 12)) return null; if ((month < 1) || (month > 12)) return null;
if ((day < 1) || (day > 31)) return null; if ((day < 1) || (day > 31)) return null;
var date = new Date(Date.UTC(year, month - 1, day)); var date = new Date(Date.UTC(year, month - 1, day));
return date; return date;
} }
@@ -51,37 +51,37 @@ function formatDate(format, date = null) {
date = new Date(date.valueOf()); date = new Date(date.valueOf());
date.setMinutes(date.getMinutes() + date.getTimezoneOffset()); date.setMinutes(date.getMinutes() + date.getTimezoneOffset());
} }
format = format.replace("M", "%1%"); format = format.replace("M", "%1%");
format = format.replace("F", "%2%"); format = format.replace("F", "%2%");
format = format.replace("D", "%3%"); format = format.replace("D", "%3%");
format = format.replace("l", "%4%"); format = format.replace("l", "%4%");
var tmp = date.getFullYear().toString(); var tmp = date.getFullYear().toString();
var tmp2 = tmp.substr(2); var tmp2 = tmp.substr(2);
format = format.replace("Y", tmp); format = format.replace("Y", tmp);
format = format.replace('y', tmp2); format = format.replace('y', tmp2);
tmp = (date.getMonth() + 1).toString(); tmp = (date.getMonth() + 1).toString();
tmp2 = (tmp.length > 1 ? tmp : ('0' + tmp)); tmp2 = (tmp.length > 1 ? tmp : ('0' + tmp));
format = format.replace('n', tmp); format = format.replace('n', tmp);
format = format.replace('m', tmp2); format = format.replace('m', tmp2);
tmp = date.getDate().toString(); tmp = date.getDate().toString();
tmp2 = (tmp.length > 1 ? tmp : ('0' + tmp)); tmp2 = (tmp.length > 1 ? tmp : ('0' + tmp));
format = format.replace('j', tmp); format = format.replace('j', tmp);
format = format.replace('d', tmp2); format = format.replace('d', tmp2);
tmp = date.getDay(); tmp = date.getDay();
tmp2 = (tmp == 0 ? 7 : tmp); tmp2 = (tmp == 0 ? 7 : tmp);
format = format.replace('w', tmp); format = format.replace('w', tmp);
format = format.replace('N', tmp2); format = format.replace('N', tmp2);
format = format.replace('%1%', strings.months_short[date.getMonth()]); format = format.replace('%1%', strings.months_short[date.getMonth()]);
format = format.replace('%2%', strings.months_long[date.getMonth()]); format = format.replace('%2%', strings.months_long[date.getMonth()]);
format = format.replace('%3%', strings.weekdays_short[date.getDay()]); format = format.replace('%3%', strings.weekdays_short[date.getDay()]);
format = format.replace('%4%', strings.weekdays_long[date.getDay()]); format = format.replace('%4%', strings.weekdays_long[date.getDay()]);
return format; return format;
} }

View File

@@ -345,7 +345,7 @@ var mobileConsole = (function () {
top: 'auto', top: 'auto',
right: 0, right: 0,
width: '100%', width: '100%',
zIndex: 10000, zIndex: 1000000,
padding: 0, padding: 0,
paddingBottom: options.browserinfo.isMobile ? '35px' : '25px', paddingBottom: options.browserinfo.isMobile ? '35px' : '25px',
margin: 0, margin: 0,
@@ -662,7 +662,7 @@ var mobileConsole = (function () {
height: newHeight height: newHeight
}); });
setCSS(document.body, { setCSS(document.body, {
paddingBottom: existingPadding + Math.abs(parseInt(newHeight, 10) + elements.topbar.offsetHeight) + 'px' //paddingBottom: existingPadding + Math.abs(parseInt(newHeight, 10) + elements.topbar.offsetHeight) + 'px'
}); });
elements.buttons.toggler.innerHTML = (elements.base.minimized) ? elements.arrowDown : elements.arrowUp; elements.buttons.toggler.innerHTML = (elements.base.minimized) ? elements.arrowDown : elements.arrowUp;
elements.buttons.toggler.setAttribute('title', (elements.base.minimized) ? 'Minimize console' : 'Maximize console'); elements.buttons.toggler.setAttribute('title', (elements.base.minimized) ? 'Minimize console' : 'Maximize console');
@@ -747,7 +747,7 @@ var mobileConsole = (function () {
}); });
var existingPadding = isNaN(parseInt(document.body.style.paddingBottom, 10)) ? 0 : parseInt(document.body.style.paddingBottom, 10); var existingPadding = isNaN(parseInt(document.body.style.paddingBottom, 10)) ? 0 : parseInt(document.body.style.paddingBottom, 10);
setCSS(document.body, { setCSS(document.body, {
paddingBottom: existingPadding + Math.abs(console.offsetHeight + elements.topbar.offsetHeight) + 'px' //paddingBottom: existingPadding + Math.abs(console.offsetHeight + elements.topbar.offsetHeight) + 'px'
}); });
elements.scrollcontainer.scrollTop = elements.scrollcontainer.scrollHeight; elements.scrollcontainer.scrollTop = elements.scrollcontainer.scrollHeight;
@@ -914,6 +914,7 @@ var mobileConsole = (function () {
while (i--) { while (i--) {
thisLine = lines[i].trim(); thisLine = lines[i].trim();
lineAndColumn = thisLine.match(/(?::)(\d+)(?::)(\d+)/); lineAndColumn = thisLine.match(/(?::)(\d+)(?::)(\d+)/);
if (lineAndColumn === null) continue;
url = urlFromString(thisLine).replace(lineAndColumn[0], '').split('#')[0] || ''; url = urlFromString(thisLine).replace(lineAndColumn[0], '').split('#')[0] || '';
caller = htmlToString(thisLine.replace(urlFromString(thisLine), '').replace(separator, '').replace('at ', '').trim()); caller = htmlToString(thisLine.replace(urlFromString(thisLine), '').replace(separator, '').replace('at ', '').trim());
if (caller === '' || caller === lineAndColumn[0]) { continue; } if (caller === '' || caller === lineAndColumn[0]) { continue; }

View File

@@ -1,9 +1,9 @@
<?php <?php
header('Content-Type: text/javascript'); header('Content-Type: text/javascript');
require_once(__DIR__ . '/../../server/config.php'); require_once(__DIR__ . '/../../server/config.php');
?> ?>
const QUERY_URL = '<?php echo QUERY_URL; ?>'; const QUERY_URL = '<?php echo QUERY_URL; ?>';
@@ -122,8 +122,8 @@ var login = function() {
showLoader(); showLoader();
var username = $('#input-login-username').val(); var username = $('#input-login-username').val();
var password = $('#input-login-password').val(); var password = $('#input-login-password').val();
$('#input-login-username').val(''); $('#input-login-username').val('').trigger('focusin').trigger('focusout');
$('#input-login-password').val(''); $('#input-login-password').val('').trigger('focusin').trigger('focusout');
$.ajax({ $.ajax({
url: QUERY_URL + 'login', url: QUERY_URL + 'login',
method: 'POST', method: 'POST',
@@ -135,7 +135,7 @@ var login = function() {
error: function (xhr, status, error) { error: function (xhr, status, error) {
if (xhr.status == 401) { if (xhr.status == 401) {
toastError('Benutzername oder Passwort falsch'); toastError('Benutzername oder Passwort falsch');
$('#input-login-username').val(username); $('#input-login-username').val(username).trigger('focusin').trigger('focusout');
} else if (xhr.status == 0) { } else if (xhr.status == 0) {
toastError('Du bist momentan offline.<br>Stelle eine Internetverbindung her, um Dich anzumelden'); toastError('Du bist momentan offline.<br>Stelle eine Internetverbindung her, um Dich anzumelden');
$('#menu-login').hideMenu(); $('#menu-login').hideMenu();
@@ -203,7 +203,28 @@ var logout = function() {
}); });
} }
function resetCache() { function deleteDb() {
$('#menu-developer').hideMenu();
if (canUseLocalDB) {
showLoader();
var request = window.indexedDB.deleteDatabase('regatten_app_db_' + BOATCLASS);
request.onerror = function (event) {
console.log('Cannot delete DB: ', event.target.errorCode);
toastError('Beim Löschen der Datenbank ist ein Fehler aufgetreten.<br>Bitte melde diesen Fehler. (Dev-Menu => Problem melden)', 5000);
hideLoader();
}
request.onsuccess = function (event) {
console.log('DB deleted');
toastInfo('Die Datenbank wurde gelöscht. Die Seite lädt in wenigen Sekunden neu und erstellt damit eine neue Datenbank.', 10000);
hideLoader();
setTimeout(function(){ location.reload(); }, 3000);
}
} else {
toastWarn('Dein Gerät unterstützt kein lokales Speichern der Daten. Alle Daten werden direkt vom Server gezogen.<br>Entsprechend kannst Du die Datenbank auch nicht zurücksetzen.', 10000);
}
}
function deleteCache() {
$('#menu-developer').hideMenu(); $('#menu-developer').hideMenu();
navigator.serviceWorker.getRegistrations().then(function (registrations) { navigator.serviceWorker.getRegistrations().then(function (registrations) {
for (let registration of registrations) { for (let registration of registrations) {
@@ -217,7 +238,8 @@ function resetCache() {
return caches.delete(key); return caches.delete(key);
})); }));
}); });
toastInfo('The serviceWorker and the cache were deleted. A new serviceWorker will be generated on the next refresh.'); toastInfo('Der serviceWorker und alle Caches wurden gelöscht. Die Seite lädt in wenigen Sekunden neu und erstellt damit neue Caches.', 10000);
setTimeout(function(){ location.reload(); }, 3000);
} }
var pushesPossible = false; var pushesPossible = false;
@@ -227,10 +249,10 @@ function urlB64ToUint8Array(base64String) {
const base64 = (base64String + padding) const base64 = (base64String + padding)
.replace(/\-/g, '+') .replace(/\-/g, '+')
.replace(/_/g, '/'); .replace(/_/g, '/');
const rawData = window.atob(base64); const rawData = window.atob(base64);
const outputArray = new Uint8Array(rawData.length); const outputArray = new Uint8Array(rawData.length);
for (let i = 0; i < rawData.length; ++i) { for (let i = 0; i < rawData.length; ++i) {
outputArray[i] = rawData.charCodeAt(i); outputArray[i] = rawData.charCodeAt(i);
} }
@@ -317,13 +339,19 @@ async function updatePushSwitches() {
$('#switch-pushes-result-ready-my').prop('checked', await dbSettingsGet('notify_channel_' + BOATCLASS + '_result_ready_my')); $('#switch-pushes-result-ready-my').prop('checked', await dbSettingsGet('notify_channel_' + BOATCLASS + '_result_ready_my'));
$('#switch-pushes-result-ready-all').prop('checked', await dbSettingsGet('notify_channel_' + BOATCLASS + '_result_ready_all')); $('#switch-pushes-result-ready-all').prop('checked', await dbSettingsGet('notify_channel_' + BOATCLASS + '_result_ready_all'));
$('#switch-pushes-meldeschluss').prop('checked', await dbSettingsGet('notify_channel_' + BOATCLASS + '_meldeschluss')); $('#switch-pushes-meldeschluss').prop('checked', await dbSettingsGet('notify_channel_' + BOATCLASS + '_meldeschluss'));
if ($('#switch-pushes').prop('checked')) { if ($('#switch-pushes').prop('checked')) {
$('#p-pushes-info').show(); $('#p-pushes-info').show();
$('.a-switch-pushes-channel').show(); $('.a-switch-pushes-channel-all').show();
$('.a-switch-pushes-channel-my').show();
if (!isLoggedIn()) {
$('.a-switch-pushes-channel-my').find('div').remove();
$('.a-switch-pushes-channel-my').find('.badge').text('nicht angemeldet');
}
} else { } else {
$('#p-pushes-info').hide(); $('#p-pushes-info').hide();
$('.a-switch-pushes-channel').hide(); $('.a-switch-pushes-channel-all').hide();
$('.a-switch-pushes-channel-my').hide();
} }
} }
@@ -355,7 +383,7 @@ function pushesOpenMenu() {
toastWarn('Benachrichtigungen werden von Deinem Browser blockiert.', 5000); toastWarn('Benachrichtigungen werden von Deinem Browser blockiert.', 5000);
return; return;
} }
swRegistration.pushManager.getSubscription().then(function(subscription) { swRegistration.pushManager.getSubscription().then(function(subscription) {
var isSub = (subscription !== null); var isSub = (subscription !== null);
$('#switch-pushes').prop('checked', isSub); $('#switch-pushes').prop('checked', isSub);
@@ -380,11 +408,27 @@ function updatePushBadge() {
}); });
} }
async function updateNewsBadge() {
var newsRead = await dbSettingsGet('news_read_' + BOATCLASS);
if (newsRead === null) dbSettingsSet('news_read_' + BOATCLASS, newsRead = new Date());
var news = await dbGetData('news');
var now = new Date();
var sum = 0;
for (var n in news) {
var newsEntry = news[n];
newsEntry.date = new Date(Date.parse(newsEntry.date));
if (newsEntry.date > now) continue;
if (newsEntry.date < newsRead) continue;
sum ++;
}
updateBadge('more/news', sum);
}
var initRegatten = function() { var initRegatten = function() {
showLoader(); showLoader();
initDatabase(); initDatabase();
if (isLoggedIn()) { if (isLoggedIn()) {
$('.show-loggedin').show(); $('.show-loggedin').show();
$('.show-notloggedin').hide(); $('.show-notloggedin').hide();
@@ -396,10 +440,11 @@ var initRegatten = function() {
$('.show-loggedin').hide(); $('.show-loggedin').hide();
$('.show-notloggedin').show(); $('.show-notloggedin').show();
} }
// Pushes // Pushes
$('#a-switch-pushes').click(pushesSubscribeClicked); $('#a-switch-pushes').click(pushesSubscribeClicked);
$('.a-switch-pushes-channel').click(pushesChannelClicked); $('.a-switch-pushes-channel-all').click(pushesChannelClicked);
$('.a-switch-pushes-channel-my').click(pushesChannelClicked);
} }
var onServiceWorkerLoaded = function() { var onServiceWorkerLoaded = function() {
@@ -414,4 +459,32 @@ var onServiceWorkerLoaded = function() {
var onDatabaseLoaded = function() { var onDatabaseLoaded = function() {
onServiceWorkerLoaded(); onServiceWorkerLoaded();
initPushSettings(); initPushSettings();
updateNewsBadge();
} }
var onAfterSync = function() {
updateNewsBadge();
}
// Add console opener to preloader
var addConsoleOpenerToPreloader = function() {
addConsoleOpenerToPreloader = function(){};
var preloader = document.getElementById('preloader');
var button = document.createElement('a');
button.href = '#';
button.classList = 'btn btn-full rounded-s text-uppercase font-900 shadow-m bg-highlight m-3';
button.style.position = 'fixed';
button.style.bottom = 0;
button.style.left = 0;
button.style.right = 0;
button.innerHTML = 'Show Console';
button.onclick = function(){
mobileConsole.displayConsole();
return false;
}
setTimeout(function(){
preloader.appendChild(button);
}, 5000);
}
addConsoleOpenerToPreloader();

View File

@@ -154,7 +154,7 @@
(meine) bezieht sich auf die Regatten, die in Deiner Saison-Planung sind,<br> (meine) bezieht sich auf die Regatten, die in Deiner Saison-Planung sind,<br>
(alle) informiert Dich &uuml;ber alle Regatten (alle) informiert Dich &uuml;ber alle Regatten
</p> </p>
<a href="#" data-trigger-switch="switch-pushes-news" class="pb-2 a-switch-pushes-channel"> <a href="#" data-trigger-switch="switch-pushes-news" class="pb-2 a-switch-pushes-channel-all">
<i class="fa font-14 fa-newspaper rounded-s bg-highlight color-white"></i> <i class="fa font-14 fa-newspaper rounded-s bg-highlight color-white"></i>
<span>Neuigkeiten</span> <span>Neuigkeiten</span>
<div class="custom-control scale-switch ios-switch"> <div class="custom-control scale-switch ios-switch">
@@ -162,15 +162,16 @@
<label class="custom-control-label" for="switch-pushes-news"></label> <label class="custom-control-label" for="switch-pushes-news"></label>
</div> </div>
</a> </a>
<a href="#" data-trigger-switch="switch-pushes-regatta-changed-my" class="pb-2 a-switch-pushes-channel"> <a href="#" data-trigger-switch="switch-pushes-regatta-changed-my" class="pb-2 a-switch-pushes-channel-my">
<i class="fa font-14 fa-calendar-check rounded-s bg-highlight color-white"></i> <i class="fa font-14 fa-calendar-check rounded-s bg-highlight color-white"></i>
<span>Regatta verschoben (meine)</span> <span>Regatta verschoben (meine)</span>
<span class="badge bg-red2-dark color-white"></span>
<div class="custom-control scale-switch ios-switch"> <div class="custom-control scale-switch ios-switch">
<input type="checkbox" class="ios-input" id="switch-pushes-regatta-changed-my"> <input type="checkbox" class="ios-input" id="switch-pushes-regatta-changed-my">
<label class="custom-control-label" for="switch-pushes-regatta-changed-my"></label> <label class="custom-control-label" for="switch-pushes-regatta-changed-my"></label>
</div> </div>
</a> </a>
<a href="#" data-trigger-switch="switch-pushes-regatta-changed-all" class="pb-2 a-switch-pushes-channel"> <a href="#" data-trigger-switch="switch-pushes-regatta-changed-all" class="pb-2 a-switch-pushes-channel-all">
<i class="fa font-14 fa-calendar-check rounded-s bg-highlight color-white"></i> <i class="fa font-14 fa-calendar-check rounded-s bg-highlight color-white"></i>
<span>Regatta verschoben (alle)</span> <span>Regatta verschoben (alle)</span>
<div class="custom-control scale-switch ios-switch"> <div class="custom-control scale-switch ios-switch">
@@ -178,15 +179,16 @@
<label class="custom-control-label" for="switch-pushes-regatta-changed-all"></label> <label class="custom-control-label" for="switch-pushes-regatta-changed-all"></label>
</div> </div>
</a> </a>
<a href="#" data-trigger-switch="switch-pushes-result-ready-my" class="pb-2 a-switch-pushes-channel"> <a href="#" data-trigger-switch="switch-pushes-result-ready-my" class="pb-2 a-switch-pushes-channel-my">
<i class="fa font-14 fa-poll rounded-s bg-highlight color-white"></i> <i class="fa font-14 fa-poll rounded-s bg-highlight color-white"></i>
<span>Ergebnisse verf&uuml;gbar (meine)</span> <span>Ergebnisse verf&uuml;gbar (meine)</span>
<span class="badge bg-red2-dark color-white"></span>
<div class="custom-control scale-switch ios-switch"> <div class="custom-control scale-switch ios-switch">
<input type="checkbox" class="ios-input" id="switch-pushes-result-ready-my"> <input type="checkbox" class="ios-input" id="switch-pushes-result-ready-my">
<label class="custom-control-label" for="switch-pushes-result-ready-my"></label> <label class="custom-control-label" for="switch-pushes-result-ready-my"></label>
</div> </div>
</a> </a>
<a href="#" data-trigger-switch="switch-pushes-result-ready-all" class="pb-2 a-switch-pushes-channel"> <a href="#" data-trigger-switch="switch-pushes-result-ready-all" class="pb-2 a-switch-pushes-channel-all">
<i class="fa font-14 fa-poll rounded-s bg-highlight color-white"></i> <i class="fa font-14 fa-poll rounded-s bg-highlight color-white"></i>
<span>Ergebnisse verf&uuml;gbar (alle)</span> <span>Ergebnisse verf&uuml;gbar (alle)</span>
<div class="custom-control scale-switch ios-switch"> <div class="custom-control scale-switch ios-switch">
@@ -194,9 +196,10 @@
<label class="custom-control-label" for="switch-pushes-result-ready-all"></label> <label class="custom-control-label" for="switch-pushes-result-ready-all"></label>
</div> </div>
</a> </a>
<a href="#" data-trigger-switch="switch-pushes-meldeschluss" class="pb-2 a-switch-pushes-channel"> <a href="#" data-trigger-switch="switch-pushes-meldeschluss" class="pb-2 a-switch-pushes-channel-my">
<i class="fa font-14 fa-file-signature rounded-s bg-highlight color-white"></i> <i class="fa font-14 fa-file-signature rounded-s bg-highlight color-white"></i>
<span>Melde-Erinnerungen</span> <span>Melde-Erinnerungen</span>
<span class="badge bg-red2-dark color-white"></span>
<div class="custom-control scale-switch ios-switch"> <div class="custom-control scale-switch ios-switch">
<input type="checkbox" class="ios-input" id="switch-pushes-meldeschluss"> <input type="checkbox" class="ios-input" id="switch-pushes-meldeschluss">
<label class="custom-control-label" for="switch-pushes-meldeschluss"></label> <label class="custom-control-label" for="switch-pushes-meldeschluss"></label>
@@ -211,22 +214,22 @@
<div class="divider divider-margins mb-n2"></div> <div class="divider divider-margins mb-n2"></div>
<div class="content"> <div class="content">
<div class="list-group list-custom-small"> <div class="list-group list-custom-small">
<a href="https://info.ostertun.net/regatten/beta"> <a href="https://github.com/ostertun/RegattenApp/wiki">
<i class="fa font-14 fa-info rounded-s bg-highlight color-white"></i> <i class="fa font-14 fa-info rounded-s bg-highlight color-white"></i>
<span>Infos zur BETA</span> <span>App-Wiki</span>
<i class="fa fa-angle-right"></i> <i class="fa fa-angle-right"></i>
</a> </a>
<a href="javascript:resetDb(false);"> <a href="javascript:deleteDb();">
<i class="fa font-14 fa-database rounded-s bg-highlight color-white"></i> <i class="fa font-14 fa-database rounded-s bg-highlight color-white"></i>
<span>Reset Database</span> <span>Reset Database</span>
<i class="fa fa-angle-right"></i> <i class="fa fa-angle-right"></i>
</a> </a>
<a href="javascript:resetCache();"> <a href="javascript:deleteCache();">
<i class="fa font-14 fa-trash-alt rounded-s bg-highlight color-white"></i> <i class="fa font-14 fa-trash-alt rounded-s bg-highlight color-white"></i>
<span>Reset Cache</span> <span>Reset Cache</span>
<i class="fa fa-angle-right"></i> <i class="fa fa-angle-right"></i>
</a> </a>
<a href="https://report.regatten.net/"> <a href="https://github.com/ostertun/RegattenApp/issues">
<i class="fa font-14 fa-bug rounded-s bg-highlight color-white"></i> <i class="fa font-14 fa-bug rounded-s bg-highlight color-white"></i>
<span>Problem melden</span> <span>Problem melden</span>
<i class="fa fa-angle-right"></i> <i class="fa fa-angle-right"></i>

View File

@@ -42,7 +42,7 @@ function addRace() {
var m = parseFloat($('#input-m').val()); var m = parseFloat($('#input-m').val());
var fb = parseFloat($('#input-fb').val()); var fb = parseFloat($('#input-fb').val());
var pl = parseFloat($('#input-pl').val().replace(',', '.')); var pl = parseFloat($('#input-pl').val().replace(',', '.'));
if (isNaN(rlf) || (rlf < 1) || (rlf > 1.6)) { if (isNaN(rlf) || (rlf < 1) || (rlf > 1.6)) {
toastError('RLF ungültig'); toastError('RLF ungültig');
return; return;
@@ -59,7 +59,7 @@ function addRace() {
toastError('pl ungültig'); toastError('pl ungültig');
return; return;
} }
var race = { var race = {
rlf: rlf, rlf: rlf,
m: m, m: m,
@@ -67,12 +67,12 @@ function addRace() {
pl: pl, pl: pl,
rlp: (100 * rlf * ((fb + 1 - pl) / fb)) rlp: (100 * rlf * ((fb + 1 - pl) / fb))
}; };
$('#input-rlf').val(''); $('#input-rlf').val('').trigger('focusin').trigger('focusout');
$('#input-m').val(''); $('#input-m').val('').trigger('focusin').trigger('focusout');
$('#input-fb').val(''); $('#input-fb').val('').trigger('focusin').trigger('focusout');
$('#input-pl').val(''); $('#input-pl').val('').trigger('focusin').trigger('focusout');
races.push(race); races.push(race);
reCalc(); reCalc();
} }
@@ -89,4 +89,4 @@ var siteScript = async function () {
} }
reCalc(); reCalc();
hideLoader(); hideLoader();
} }

View File

@@ -3,12 +3,12 @@ function sendMessage() {
var email = $('#input-email').val(); var email = $('#input-email').val();
var subject = $('#input-subject').val(); var subject = $('#input-subject').val();
var message = $('#input-message').val(); var message = $('#input-message').val();
if ((name == '') || (email == '') || (subject == '') || (message == '')) { if ((name == '') || (email == '') || (subject == '') || (message == '')) {
toastError('Bitte f&uuml;lle alle Felder aus!'); toastError('Bitte f&uuml;lle alle Felder aus!');
return; return;
} }
showLoader(); showLoader();
$.ajax({ $.ajax({
url: QUERY_URL + 'contact', url: QUERY_URL + 'contact',
@@ -31,8 +31,8 @@ function sendMessage() {
}, },
success: function (data, status, xhr) { success: function (data, status, xhr) {
toastOk('Nachricht erfolgreich versandt!'); toastOk('Nachricht erfolgreich versandt!');
$('#input-subject').val(''); $('#input-subject').val('').trigger('focusin').trigger('focusout');
$('#input-message').val(''); $('#input-message').val('').trigger('focusin').trigger('focusout');
hideLoader(); hideLoader();
} }
}); });
@@ -46,4 +46,4 @@ var siteScript = async function () {
} }
$('#button-send').click(sendMessage); $('#button-send').click(sendMessage);
hideLoader(); hideLoader();
} }

View File

@@ -1,25 +1,24 @@
async function onNewsClicked(id) { async function onNewsClicked(id) {
var newsEntry = await dbGetData('news', id); var newsEntry = await dbGetData('news', id);
if (newsEntry == null) return; if (newsEntry == null) return;
$('#menu-news').css('height', '80%'); $('#menu-news').css('height', '80%');
$('#menu-news').css('width', '90%'); $('#menu-news').css('width', '90%');
$('#menu-news').find('.menu-title').find('p').text(newsEntry.title); $('#menu-news').find('.menu-title').find('p').text(newsEntry.title);
$('#menu-news').find('.content').addClass('pb-3'); $('#menu-news').find('.content').addClass('pb-3');
$('#menu-news').find('.content').html(newsEntry.html); $('#menu-news').find('.content').html(newsEntry.html);
$('#menu-news').showMenu(); $('#menu-news').showMenu();
} }
function addCard(newsEntry) { function addCard(newsEntry) {
console.log(newsEntry);
var content = '<h2>' + newsEntry.title + '</h2>'; var content = '<h2>' + newsEntry.title + '</h2>';
content += '<p class="mb-2"><i>' + formatDate('d.m.Y', newsEntry.date) + '</i></p>'; content += '<p class="mb-2"><i>' + formatDate('d.m.Y', newsEntry.date) + '</i></p>';
content += '<p class="mb-0">' + newsEntry.description.replace('\n', '<br>') + '</p>'; content += '<p class="mb-0">' + newsEntry.description.replace('\n', '<br>') + '</p>';
if (newsEntry.html != '') { if (newsEntry.html != '') {
content += '<a class="btn btn-full rounded-s text-uppercase font-900 shadow-m bg-highlight mt-3" href="#" onclick="onNewsClicked(' + newsEntry.id + '); return false;">Mehr lesen</a>'; content += '<a class="btn btn-full rounded-s text-uppercase font-900 shadow-m bg-highlight mt-3" href="#" onclick="onNewsClicked(' + newsEntry.id + '); return false;">Mehr lesen</a>';
} }
$('.page-content').append(cardTemplate.replace('%ID%', 'card-news-' + newsEntry.id).replace('%CONTENT%', content)); $('.page-content').append(cardTemplate.replace('%ID%', 'card-news-' + newsEntry.id).replace('%CONTENT%', content));
} }
@@ -29,16 +28,17 @@ var siteScript = async function() {
news.sort(function (a,b) { news.sort(function (a,b) {
return b.date.localeCompare(a.date); return b.date.localeCompare(a.date);
}); });
var today = getToday(); var now = new Date();
var lastYear = new Date(today); var lastYear = new Date();
lastYear.setFullYear(lastYear.getFullYear() - 1); lastYear.setFullYear(lastYear.getFullYear() - 1);
console.log(today, lastYear);
for (var n in news) { for (var n in news) {
var newsEntry = news[n]; var newsEntry = news[n];
newsEntry.date = parseDate(newsEntry.date.substring(0, 10)); newsEntry.date = new Date(Date.parse(newsEntry.date));
if (newsEntry.date > today) continue; if (newsEntry.date > now) continue;
if (newsEntry.date < lastYear) break; if (newsEntry.date < lastYear) break;
addCard(newsEntry); addCard(newsEntry);
} }
dbSettingsSet('news_read_' + BOATCLASS, now);
updateNewsBadge();
hideLoader(); hideLoader();
} }

View File

@@ -11,7 +11,7 @@ async function onRankingClicked(id) {
} }
} }
if (sailor == null) return; if (sailor == null) return;
$('#menu-rank').find('.menu-title').find('p').text(sailor.name); $('#menu-rank').find('.menu-title').find('p').text(sailor.name);
if (lastRanking != null) { if (lastRanking != null) {
var lastRank; var lastRank;
@@ -25,83 +25,83 @@ async function onRankingClicked(id) {
} else { } else {
$('#menu-item-text').hide(); $('#menu-item-text').hide();
} }
list = ''; list = '';
for (var i in sailor.regattas) { for (var i in sailor.regattas) {
var entry = sailor.regattas[i]; var entry = sailor.regattas[i];
var regatta = entry.regatta; var regatta = entry.regatta;
var boat = await dbGetData('boats', entry.boat); var boat = await dbGetData('boats', entry.boat);
var dateFrom = parseDate(regatta.date); var dateFrom = parseDate(regatta.date);
var dateTo = parseDate(regatta.date); var dateTo = parseDate(regatta.date);
dateTo.setDate(dateTo.getDate() + Math.max(parseInt(regatta.length) - 1, 0)); dateTo.setDate(dateTo.getDate() + Math.max(parseInt(regatta.length) - 1, 0));
list += '<div onclick="onDetailClicked(' + regatta.id + ')">'; list += '<div onclick="onDetailClicked(' + regatta.id + ')">';
// ZEILE 1 // ZEILE 1
list += '<div><b>' + regatta.name + '</b></div>'; list += '<div><b>' + regatta.name + '</b></div>';
// ZEILE 2 // ZEILE 2
list += '<div>'; list += '<div>';
// DATE // DATE
list += '<div>' + formatDate('d.m.Y', dateFrom) + ' - ' + formatDate('d.m.Y', dateTo) + '</div>'; list += '<div>' + formatDate('d.m.Y', dateFrom) + ' - ' + formatDate('d.m.Y', dateTo) + '</div>';
// m // m
list += '<div>m: ' + entry.m + '</div>'; list += '<div>m: ' + entry.m + '</div>';
// rlf // rlf
list += '<div>RLF: ' + parseFloat(regatta.rlf).toFixed(2) + '</div>'; list += '<div>RLF: ' + parseFloat(regatta.rlf).toFixed(2) + '</div>';
list += '</div>'; list += '</div>';
// ZEILE 3 // ZEILE 3
list += '<div>'; list += '<div>';
// Place // Place
list += '<div>Platz ' + entry.place + ' / ' + entry.fb + '</div>'; list += '<div>Platz ' + entry.place + ' / ' + entry.fb + '</div>';
// rlp // rlp
var color; var color;
if (entry.used == 0) { color = 'color-red2-dark'; } if (entry.used == 0) { color = 'color-red2-dark'; }
else if (entry.used == entry.m) { color = 'color-green2-dark'; } else if (entry.used == entry.m) { color = 'color-green2-dark'; }
else { color = 'color-yellow2-dark'; } else { color = 'color-yellow2-dark'; }
list += '<div>Punkte: ' + entry.used + ' x <b class="' + color + '">' + parseFloat(entry.rlp).toFixed(2) + '</b></div>'; list += '<div>Punkte: ' + entry.used + ' x <b class="' + color + '">' + parseFloat(entry.rlp).toFixed(2) + '</b></div>';
list += '</div>'; list += '</div>';
// ZEILE 4 // ZEILE 4
list += '<div>'; list += '<div>';
// Sailnumber // Sailnumber
list += '<div>' + boat.sailnumber + '</div>'; list += '<div>' + boat.sailnumber + '</div>';
// Boatname // Boatname
list += '<div>' + boat.name + '</div>'; list += '<div>' + boat.name + '</div>';
list += '</div>'; list += '</div>';
// ZEILE 5... // ZEILE 5...
var crew = entry.crew.split(','); var crew = entry.crew.split(',');
for (var c in crew) { for (var c in crew) {
var cr = await dbGetData('sailors', crew[c]); var cr = await dbGetData('sailors', crew[c]);
if (cr != null) { if (cr != null) {
list += '<div>'; list += '<div>';
// Name // Name
list += '<div>' + cr.name + '</div>'; list += '<div>' + cr.name + '</div>';
// Year // Year
list += '<div>' + ((cr.year != null) ? ('(' + cr.year + ')') : '') + '</div>'; list += '<div>' + ((cr.year != null) ? ('(' + cr.year + ')') : '') + '</div>';
list += '</div>'; list += '</div>';
} }
} }
list += '</div>'; list += '</div>';
} }
$('#div-details').html(list); $('#div-details').html(list);
$('#menu-rank').showMenu(); $('#menu-rank').showMenu();
$('#menu-rank').scrollTop(0); $('#menu-rank').scrollTop(0);
} }
@@ -111,8 +111,8 @@ async function selectChange(callSiteScript = true) {
var year = parseInt($('#select-year').val()); var year = parseInt($('#select-year').val());
if (type == "user") { if (type == "user") {
$('#select-year').parent().hide(); $('#select-year').parent().hide();
$('#input-from').parent().show(); $('#input-from').trigger('focusin').trigger('focusout').parent().show();
$('#input-to').parent().show(); $('#input-to').trigger('focusin').trigger('focusout').parent().show();
$('#input-jugend').parent().parent().show(); $('#input-jugend').parent().parent().show();
$('#input-jugstrict').parent().parent().show(); $('#input-jugstrict').parent().parent().show();
$('#button-show').show(); $('#button-show').show();
@@ -123,7 +123,7 @@ async function selectChange(callSiteScript = true) {
$('#input-jugend').parent().parent().hide(); $('#input-jugend').parent().parent().hide();
$('#input-jugstrict').parent().parent().hide(); $('#input-jugstrict').parent().parent().hide();
$('#button-show').hide(); $('#button-show').hide();
var from, to, jugend, jugstrict; var from, to, jugend, jugstrict;
switch (type) { switch (type) {
case 'year': case 'year':
@@ -168,14 +168,26 @@ async function selectChange(callSiteScript = true) {
} }
break; break;
} }
$('#input-from').val(from); $('#input-from').val(from);
$('#input-to').val(to); $('#input-to').val(to);
$('#input-jugend').prop('checked', jugend); $('#input-jugend').prop('checked', jugend);
$('#input-jugstrict').prop('checked', jugstrict); $('#input-jugstrict').prop('checked', jugstrict);
if (callSiteScript && (typeof siteScript === 'function')) if (callSiteScript && (typeof siteScript === 'function')) {
history.replaceState(null, '', '?type=' + type + '&year=' + year)
siteScript(); siteScript();
}
}
}
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)
siteScript();
} }
} }
@@ -186,10 +198,23 @@ function initSelects() {
if (year === null) year = new Date().getFullYear(); if (year === null) year = new Date().getFullYear();
$('#select-type').val(type); $('#select-type').val(type);
$('#select-year').html('<option value="' + year + '">' + year + '</option>'); $('#select-year').html('<option value="' + year + '">' + year + '</option>');
$('#select-year').val(year); $('#select-year').val(year);
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);
}
selectChange(false); selectChange(false);
} }
@@ -218,17 +243,17 @@ var siteScript = async function() {
initSelects(); initSelects();
$('#select-type').change(selectChange); $('#select-type').change(selectChange);
$('#select-year').change(selectChange); $('#select-year').change(selectChange);
$('#button-show').click(siteScript); $('#button-show').click(buttonShowPressed);
$('#input-search').on('input', drawList); $('#input-search').on('input', drawList);
} }
var minDate = parseDate($('#input-from').val()); var minDate = parseDate($('#input-from').val());
var maxDate = parseDate($('#input-to').val()); var maxDate = parseDate($('#input-to').val());
var jugend = $('#input-jugend').prop('checked'); var jugend = $('#input-jugend').prop('checked');
var jugstrict = $('#input-jugstrict').prop('checked'); var jugstrict = $('#input-jugstrict').prop('checked');
var dbRanking = await dbGetRanking(minDate, maxDate, jugend, jugstrict); var dbRanking = await dbGetRanking(minDate, maxDate, jugend, jugstrict);
ranking = dbRanking[0]; ranking = dbRanking[0];
lastRanking = null; lastRanking = null;
if (($('#select-type').val() == 'year') || ($('#select-type').val() == 'youth')) { if (($('#select-type').val() == 'year') || ($('#select-type').val() == 'youth')) {
lastRanking = {}; lastRanking = {};
@@ -240,9 +265,9 @@ var siteScript = async function() {
lastRanking[lDbRanking[i].id] = lDbRanking[i].rank; lastRanking[lDbRanking[i].id] = lDbRanking[i].rank;
} }
} }
var selectedYear = $('#select-year').val(); var selectedYear = $('#select-year').val();
var years = await dbGetData('years'); var years = await dbGetData('years');
years.sort(function (a, b) { years.sort(function (a, b) {
if (a['year'] > b['year']) return -1; if (a['year'] > b['year']) return -1;
@@ -256,7 +281,7 @@ var siteScript = async function() {
} }
$('#select-year').html(options); $('#select-year').html(options);
$('#select-year').val(selectedYear); $('#select-year').val(selectedYear);
if (dbRanking[1].length > 0) { if (dbRanking[1].length > 0) {
$('#card-noresults').show(); $('#card-noresults').show();
list = ''; list = '';
@@ -269,18 +294,18 @@ var siteScript = async function() {
} else { } else {
$('#card-noresults').hide(); $('#card-noresults').hide();
} }
var count = ranking.length; var count = ranking.length;
if (count > 0) { if (count > 0) {
$('#input-search').parent().show(); $('#input-search').parent().show();
var dsvEnd = false; var dsvEnd = false;
rows = []; rows = [];
for (id in ranking) { for (id in ranking) {
var entry = ranking[id]; var entry = ranking[id];
for (var i in entry.regattas) { for (var i in entry.regattas) {
entry.regattas[i].regatta = await dbGetData('regattas', entry.regattas[i].regatta); entry.regattas[i].regatta = await dbGetData('regattas', entry.regattas[i].regatta);
} }
@@ -288,26 +313,26 @@ var siteScript = async function() {
entry.regattas.sort(function (a,b) { entry.regattas.sort(function (a,b) {
return a.regatta.date.localeCompare(b.regatta.date); return a.regatta.date.localeCompare(b.regatta.date);
}); });
var club = null; var club = null;
if (entry['club'] != null) if (entry['club'] != null)
club = await dbGetData('clubs', entry['club']); club = await dbGetData('clubs', entry['club']);
var row = { keywords: [], content: '' }; var row = { keywords: [], content: '' };
row.keywords.push(entry['name']); row.keywords.push(entry['name']);
if (entry['year'] != null) row.keywords.push(entry['year']); if (entry['year'] != null) row.keywords.push(entry['year']);
if (club != null) row.keywords.push(club['kurz'], club['name']); if (club != null) row.keywords.push(club['kurz'], club['name']);
if (!dsvEnd && (entry.m < 9)) { if (!dsvEnd && (entry.m < 9)) {
rows.push(null); rows.push(null);
dsvEnd = true; dsvEnd = true;
} }
row.content += '<div onclick="onRankingClicked(' + entry['id'] + ');">'; row.content += '<div onclick="onRankingClicked(' + entry['id'] + ');">';
// ZEILE 1 // ZEILE 1
row.content += '<div>'; row.content += '<div>';
// Rank // Rank
var icon = ''; var icon = '';
if (lastRanking != null) { if (lastRanking != null) {
@@ -321,39 +346,39 @@ var siteScript = async function() {
icon = '<i class="font-16 fas ' + icon + '" style="width: 1.1em; text-align: center;"></i> '; icon = '<i class="font-16 fas ' + icon + '" style="width: 1.1em; text-align: center;"></i> ';
} }
row.content += '<div>' + icon + '<b>' + entry.rank + '.</b></div>'; row.content += '<div>' + icon + '<b>' + entry.rank + '.</b></div>';
// m // m
row.content += '<div>m = ' + entry.m + '</div>'; row.content += '<div>m = ' + entry.m + '</div>';
// rlp // rlp
row.content += '<div>' + entry.rlp.toFixed(3) + '</div>'; row.content += '<div>' + entry.rlp.toFixed(3) + '</div>';
row.content += '</div>'; row.content += '</div>';
// ZEILE 2 // ZEILE 2
row.content += '<div>'; row.content += '<div>';
// Name // Name
row.content += '<div><b>' + entry.name + '</b></div>'; row.content += '<div><b>' + entry.name + '</b></div>';
// Year // Year
row.content += '<div>' + ((entry.year != null) ? ('(' + entry.year + ')') : '') + '</div>'; row.content += '<div>' + ((entry.year != null) ? ('(' + entry.year + ')') : '') + '</div>';
row.content += '</div></div>'; row.content += '</div></div>';
rows.push(row); rows.push(row);
} }
if (!dsvEnd) { if (!dsvEnd) {
rows.push(null); rows.push(null);
} }
drawList(); drawList();
} else { } else {
$('#div-rank').html('Keine Ergebnisse gefunden!'); $('#div-rank').html('Keine Ergebnisse gefunden!');
$('#input-search').parent().hide(); $('#input-search').parent().hide();
} }
hideLoader(); hideLoader();
} }

View File

@@ -1,8 +1,8 @@
function selectChange(callSiteScript = true) { function selectChange(callSiteScript = true) {
var val = $('#select-year').val(); var val = $('#select-year').val();
if (val == "user") { if (val == "user") {
$('#input-from').parent().show(); $('#input-from').trigger('focusin').trigger('focusout').parent().show();
$('#input-to').parent().show(); $('#input-to').trigger('focusin').trigger('focusout').parent().show();
$('#button-show').show(); $('#button-show').show();
} else { } else {
$('#input-from').parent().hide(); $('#input-from').parent().hide();
@@ -12,8 +12,17 @@ function selectChange(callSiteScript = true) {
$('#input-from').val(val + '-01-01'); $('#input-from').val(val + '-01-01');
$('#input-to').val(val + '-12-31'); $('#input-to').val(val + '-12-31');
if (callSiteScript && (typeof siteScript === 'function')) if (callSiteScript && (typeof siteScript === 'function')) {
history.replaceState(null, '', '?year=' + val);
siteScript(); siteScript();
}
}
}
function buttonShowPressed() {
if (typeof siteScript === 'function') {
history.replaceState(null, '', '?year=user&from=' + $('#input-from').val() + "&to=" + $('#input-to').val())
siteScript();
} }
} }
@@ -24,6 +33,15 @@ function initYear() {
$('#select-year').html('<option value="' + year + '">' + year + '</option>'); $('#select-year').html('<option value="' + year + '">' + year + '</option>');
$('#select-year').val(year); $('#select-year').val(year);
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');
}
selectChange(false); selectChange(false);
} }
@@ -50,7 +68,7 @@ var siteScript = async function() {
firstCall = false; firstCall = false;
initYear(); initYear();
$('#select-year').change(selectChange); $('#select-year').change(selectChange);
$('#button-show').click(siteScript); $('#button-show').click(buttonShowPressed);
$('#input-search').on('input', drawList); $('#input-search').on('input', drawList);
} }

View File

@@ -1,5 +1,5 @@
<?php <?php
define('PWA_VERSION', '1.7'); define('PWA_VERSION', '1.8');
?> ?>