Compare commits

..

69 Commits

Author SHA1 Message Date
ostertun
357449c1c6 Merge branch 'hotfix/update_subscription' 2020-10-09 12:59:35 +02:00
ostertun
de70522850 gitflow-hotfix-stash: update_subscription 2020-10-09 12:59:20 +02:00
ostertun
cf5f71d14e Merge branch 'hotfix/hide_preloader_console_button' 2020-10-08 12:56:42 +02:00
ostertun
34b47e40ab gitflow-hotfix-stash: hide_preloader_console_button 2020-10-08 12:56:19 +02:00
ostertun
32ea581437 Merge branch 'release/v_1.10.3' 2020-10-08 12:48:12 +02:00
ostertun
16ccbca2af Release v_1.10.3 2020-10-08 12:47:53 +02:00
ostertun
3fd9beae1e Add last sync info 2020-10-06 00:21:23 +02:00
ostertun
01d0ae96f9 Fix no-db warning 2020-10-05 23:55:20 +02:00
ostertun
c211817f78 Added no-db warning 2020-10-05 23:52:09 +02:00
ostertun
9ff0b96837 Merge branch 'release/v_1.10.2' 2020-10-05 20:32:21 +02:00
ostertun
7a3413b339 Merge branch 'release/v_1.10.2' into develop 2020-10-05 20:32:21 +02:00
ostertun
72ff731694 Release v_1.10.2 2020-10-05 20:32:10 +02:00
ostertun
3959b208b5 Added go2url site 2020-10-05 20:19:57 +02:00
ostertun
7b500bf67d Merge branch 'release/v_1.10' 2020-10-05 17:45:03 +02:00
ostertun
5c8c9db1de Merge branch 'release/v_1.10' into develop 2020-10-05 17:45:02 +02:00
ostertun
fa526b11a8 Release v_1.10 2020-10-05 17:44:43 +02:00
ostertun
2dc2225263 Focus search input on show sailor selector 2020-10-05 17:38:00 +02:00
ostertun
fcf9dc9a20 Fixes 2020-10-05 17:35:10 +02:00
ostertun
203c2534eb Merge branch 'develop' into feature/RA-22-add-sites 2020-10-05 17:31:12 +02:00
ostertun
730dd9112f Add planning_edit 2020-10-05 17:19:24 +02:00
ostertun
13ceef37d9 Merge branch 'hotfix/regattas_range' 2020-10-05 14:49:24 +02:00
ostertun
54852f4383 Merge branch 'hotfix/regattas_range' into develop 2020-10-05 14:49:23 +02:00
ostertun
8808d12bf1 gitflow-hotfix-stash: regattas_range 2020-10-05 14:49:00 +02:00
ostertun
c6d5450b0e Merge branch 'hotfix/fix_db_sync_log' 2020-10-05 14:35:22 +02:00
ostertun
15cbe15651 Merge branch 'hotfix/fix_db_sync_log' into develop 2020-10-05 14:35:21 +02:00
ostertun
cb8a1817ae gitflow-hotfix-stash: fix_db_sync_log 2020-10-05 14:34:56 +02:00
ostertun
acf51ea71c Merge branch 'release/v_1.9' 2020-10-05 13:59:22 +02:00
ostertun
be98511957 Merge branch 'release/v_1.9' into develop 2020-10-05 13:59:22 +02:00
ostertun
65608cdd5a Release v_1.9 2020-10-05 13:58:26 +02:00
ostertun
d0996fa0c3 Merge branch 'feature/RA-22-add-sites' into develop 2020-10-05 13:57:09 +02:00
ostertun
c9a90eb77c RA-#22 Show info on preloader while first sync 2020-10-05 13:56:47 +02:00
ostertun
754cb6f77d Added edit button to planning 2020-10-05 13:37:31 +02:00
ostertun
5e926f3e75 Add share button on own planning 2020-10-05 13:09:24 +02:00
ostertun
138071769c Added planning_list 2020-10-05 12:57:17 +02:00
ostertun
26d9d83ba2 Added planning_view 2020-10-05 12:26:33 +02:00
ostertun
eaa08ba301 Custom log function => log current time 2020-10-05 11:53:54 +02:00
ostertun
760c05286e RA-#22 Added planning incl setState 2020-10-02 19:26:03 +02:00
ostertun
3f676141d7 Merge branch 'feature/RA-13-dont-show-install-request-window-w' into develop 2020-10-02 17:42:39 +02:00
ostertun
ae9bf02c49 RA-#13 Dont show install promt when welcome banner active 2020-10-02 17:42:33 +02:00
ostertun
c2a482bba1 Fix RA-#10 background color of mobileConsole 2020-10-02 17:19:59 +02:00
ostertun
06266b788d Merge branch 'feature/RA-21-news-mark-unread-news-and-add-pagi' into develop 2020-10-02 14:24:11 +02:00
ostertun
3db5ae1723 RA-#21 News: mark unread and add pagination 2020-10-02 14:24:00 +02:00
ostertun
a45af73c25 Merge branch 'release/v_1.8' 2020-10-02 01:29:43 +02:00
ostertun
b784733b69 Merge branch 'release/v_1.8' into develop 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
ostertun
274aa85cf7 Merge branch 'release/v_1.7' 2020-10-01 03:21:20 +02:00
ostertun
4317e4fe87 Release v_1.7
Prepare github repo
small fixes
2020-10-01 03:19:42 +02:00
Timon Ostertun
b7dec825ca Update issue templates 2020-10-01 03:00:38 +02:00
Timon Ostertun
6ca6a79dc3 Update issue templates 2020-10-01 02:59:12 +02:00
Timon Ostertun
d1e5d753b4 Create README.md 2020-10-01 01:03:41 +02:00
Timon Ostertun
7afacc3fff Update issue templates 2020-09-30 23:56:51 +02:00
Timon Ostertun
77ea57d643 RA-#1 Notifications: Badge Icon 2020-09-30 23:24:24 +02:00
Timon Ostertun
a72c462483 RA-#4 Registration open icon is red when deadline expired 2020-09-30 22:46:20 +02:00
Timon Ostertun
b739e6cc4e RA-#7 Fix serviceWorker 2020-09-30 22:45:43 +02:00
Timon Ostertun
eb47cdf016 RA-#7 Removed unnecessary files from cache 2020-09-30 22:25:59 +02:00
Timon Ostertun
12c1a614bb Fix #5 serviceWorker DB access
serviceWorker openes DB only when needed and closes it directly
2020-09-30 16:46:10 +02:00
Timon Ostertun
0fb1bb0462 Added mobile console 2020-09-30 14:36:07 +02:00
37 changed files with 4345 additions and 1093 deletions

View File

@@ -0,0 +1,20 @@
---
name: "[DE] Feature-Anfrage"
about: Schlage eine Idee für dieses Projekt vor
title: ''
labels: enhancement
assignees: ''
---
**Bezieht sich Deine Feature-Anfrage auf ein Problem? Bitte beschreiben.**
Eine klare und präzise Beschreibung des Problems. Z.B. Ich bin immer frustriert, wenn [...]
**Beschreibe die gewünschte Lösung**
Eine klare und präzise Beschreibung dessen, was passieren soll.
**Beschreibe Alternativen, die Du in Betracht gezogen hast**
Eine klare und präzise Beschreibung aller alternativen Lösungen oder Funktionen, die Du in Betracht gezogen hast.
**Zusätzlicher Kontext**
Füge hier weitere Kontexte oder Screenshots zur Feature-Anfrage hinzu.

View File

@@ -0,0 +1,38 @@
---
name: "[DE] Fehlerbericht"
about: Erstelle einen Bericht, um uns zu helfen, die App zu verbessern
title: ''
labels: bug
assignees: ''
---
**Beschreibe den Fehler**
Eine klare und präzise Beschreibung des Fehlers.
**Reproduzierung**
Schritte zum Reproduzieren des Fehlers:
1. Gehe zu '...'
2. Klicke auf '....'
3. Scrolle nach unten zu '....'
4. Sieh den Fehler
**Erwartetes Verhalten**
Eine klare und präzise Beschreibung dessen, was Du erwartet hattest.
**Screenshots**
Füge gegebenenfalls Screenshots hinzu, um Dein Problem zu erklären.
**Desktop (bitte verfolständige die folgenden Informationen):**
- Betriebssystem: [z.B. Windows 10]
- Browser [z.B. chrome, safari]
- Version [z.B. 2.14]
**Smartphone (bitte verfolständige die folgenden Informationen):**
- Gerät: [z.B. iPhone 6]
- Betriebssystem: [z.B. iOS 8.1]
- Browser [z.B. stock browser, safari]
- Version [z.B. 2.14]
**Zusätzlicher Kontext**
Füge hier einen anderen Kontext zum Problem hinzu.

View File

@@ -0,0 +1,38 @@
---
name: "[EN] Bug report"
about: Create a report to help us improve
title: ''
labels: bug
assignees: ''
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Desktop (please complete the following information):**
- OS: [e.g. Windows 10]
- Browser [e.g. chrome, safari]
- Version [e.g. 2.14]
**Smartphone (please complete the following information):**
- Device: [e.g. iPhone 6]
- OS: [e.g. iOS 8.1]
- Browser [e.g. stock browser, safari]
- Version [e.g. 2.14]
**Additional context**
Add any other context about the problem here.

View File

@@ -0,0 +1,20 @@
---
name: "[EN] Feature request"
about: Suggest an idea for this project
title: ''
labels: enhancement
assignees: ''
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.

11
README.md Normal file
View File

@@ -0,0 +1,11 @@
# Regatten.net App
Willkommen im GitHub-Repository unserer neuen Regatten.net App.
Falls sich jemand dafür interessiert, ist hier der gesamte Quellcode unserer neuen App zu finden.
Bitte beachtet, dass diese App einschließlich dem gesamten Quellcode exklusivem Urheberrecht unterliegt. Sie darf also nicht kopiert, verteilt oder verändert werden.
Sollte Interesse an einer Anbindung an unser System bestehen, kontaktiere uns bitte einfach (https://regatten.net/contact)
Der Hauptzweck dieses Repository besteht jedoch darin, Feedback von Euch zu unserer neuen App zu bekommen.
Selbstverständlich könnt Ihr uns auch weiterhin auf anderen Kanälen erreichen, doch für Problem-Meldungen und Verbesserungsvorschläge ist GitHub am besten geeignet.
Wie Du Teil unseres BETA-Programmes wirst, die App installierst und Feedback gibst, erfährst Du in unserem [Wiki](https://github.com/ostertun/RegattenApp/wiki).

View File

@@ -27,6 +27,11 @@ $(window).on('load',function(){
hideLoader(); hideLoader();
}) })
//Generating Cookies
function createCookie(e, t, n) {if (n) {var o = new Date;o.setTime(o.getTime() + n * 365 * 24 * 3600 * 1e3);var r = "; expires=" + o.toGMTString()} else var r = "";document.cookie = e + "=" + t + r + "; path=/"}
function readCookie(e) {for (var t = e + "=", n = document.cookie.split(";"), o = 0; o < n.length; o++) {for (var r = n[o];" " == r.charAt(0);) r = r.substring(1, r.length);if (0 == r.indexOf(t)) return r.substring(t.length, r.length)}return null}
function eraseCookie(e) {createCookie(e, "", -1)}
$(document).ready(function(){ $(document).ready(function(){
'use strict' 'use strict'
@@ -187,11 +192,6 @@ $(document).ready(function(){
return false; return false;
}); });
//Generating Cookies
function createCookie(e, t, n) {if (n) {var o = new Date;o.setTime(o.getTime() + n * 365 * 24 * 3600 * 1e3);var r = "; expires=" + o.toGMTString()} else var r = "";document.cookie = e + "=" + t + r + "; path=/"}
function readCookie(e) {for (var t = e + "=", n = document.cookie.split(";"), o = 0; o < n.length; o++) {for (var r = n[o];" " == r.charAt(0);) r = r.substring(1, r.length);if (0 == r.indexOf(t)) return r.substring(t.length, r.length)}return null}
function eraseCookie(e) {createCookie(e, "", -1)}
//Disabling & Enabling Dark Transitions in Dark Mode to Speed up Performance. //Disabling & Enabling Dark Transitions in Dark Mode to Speed up Performance.
function allowTransitions(){$('body').find('#transitions-remove').remove();} function allowTransitions(){$('body').find('#transitions-remove').remove();}
function removeTransitions(){$('body').append('<style id="transitions-remove">.btn, .header, #footer-bar, .menu-box, .menu-active{transition:all 0ms ease!important;}</style>'); setTimeout(function(){allowTransitions();},10);} function removeTransitions(){$('body').append('<style id="transitions-remove">.btn, .header, #footer-bar, .menu-box, .menu-active{transition:all 0ms ease!important;}</style>'); setTimeout(function(){allowTransitions();},10);}
@@ -733,7 +733,7 @@ $(document).ready(function(){
//Age Verification //Age Verification
var checkAge = $('.check-age'); var checkAge = $('.check-age');
function activate_age_checker(){ function activate_age_checker(){
console.log('active'); log('active');
$(".check-age").on('click',function(){ $(".check-age").on('click',function(){
var dateBirghtDay = $("#date-birth-day").val(); var dateBirghtDay = $("#date-birth-day").val();
var dateBirthMonth = $("#date-birth-month").val(); var dateBirthMonth = $("#date-birth-month").val();
@@ -747,7 +747,7 @@ $(document).ready(function(){
setDate.setFullYear(mydate.getFullYear() + age, dateBirthMonth-1, dateBirghtDay); setDate.setFullYear(mydate.getFullYear() + age, dateBirthMonth-1, dateBirghtDay);
if ((currdate - setDate) > 0){ if ((currdate - setDate) > 0){
console.log("above 18"); log("above 18");
$('#menu-age').removeClass('menu-active') $('#menu-age').removeClass('menu-active')
$('#menu-age-okay').addClass('menu-active'); $('#menu-age-okay').addClass('menu-active');
}else{ }else{
@@ -889,11 +889,11 @@ $(document).ready(function(){
function updateOnlineStatus(event) { function updateOnlineStatus(event) {
var condition = navigator.onLine ? "online" : "offline"; var condition = navigator.onLine ? "online" : "offline";
isOnline(); isOnline();
console.log( 'Connection: Online'); log( 'Connection: Online');
} }
function updateOfflineStatus(event) { function updateOfflineStatus(event) {
isOffline(); isOffline();
console.log( 'Connection: Offline'); log( 'Connection: Offline');
} }
window.addEventListener('online', updateOnlineStatus); window.addEventListener('online', updateOnlineStatus);
window.addEventListener('offline', updateOfflineStatus); window.addEventListener('offline', updateOfflineStatus);
@@ -908,7 +908,7 @@ $(document).ready(function(){
$('.generate-qr-auto').attr('src', qr_api_address+qr_auto_link) $('.generate-qr-auto').attr('src', qr_api_address+qr_auto_link)
$('.generate-qr-button').on('click',function(){ $('.generate-qr-button').on('click',function(){
if($(this).parent().find('.fa').hasClass('fa-exclamation-triangle')){ if($(this).parent().find('.fa').hasClass('fa-exclamation-triangle')){
console.log('Invalid URL'); log('Invalid URL');
} else { } else {
var get_qr_url = $('.generate-qr-input').val(); var get_qr_url = $('.generate-qr-input').val();
if(!get_qr_url == ''){ if(!get_qr_url == ''){
@@ -1238,7 +1238,7 @@ $(document).ready(function(){
//Local Error Message //Local Error Message
if (window.location.protocol === "file:"){$('a').on('mouseover',function(){console.log("You are seeing these errors because your file is on your local computer. For real life simulations please use a Live Server or a Local Server such as AMPPS or WAMPP or simulate a Live Preview using a Code Editor like http://brackets.io (it's 100% free) - PWA functions and AJAX Page Transitions will only work in these scenarios.");});} if (window.location.protocol === "file:"){$('a').on('mouseover',function(){log("You are seeing these errors because your file is on your local computer. For real life simulations please use a Live Server or a Local Server such as AMPPS or WAMPP or simulate a Live Preview using a Code Editor like http://brackets.io (it's 100% free) - PWA functions and AJAX Page Transitions will only work in these scenarios.");});}
//Style Generator //Style Generator

View File

@@ -20,11 +20,11 @@ var getJSON = function(url, callback) {
callback(xhr.status, xhr.response); callback(xhr.status, xhr.response);
}; };
xhr.ontimeout = function () { xhr.ontimeout = function () {
console.log("getJSON: timeout"); log("getJSON: timeout");
callback(0, null); callback(0, null);
} }
xhr.onerror = function () { xhr.onerror = function () {
console.log("getJSON: error"); log("getJSON: error");
callback(0, null); callback(0, null);
} }
if (USER_ID != null) { if (USER_ID != null) {
@@ -76,7 +76,7 @@ function dbGetData(table, id = null) {
if (code == 200) { if (code == 200) {
resolve(data.data); resolve(data.data);
} else { } else {
console.log("Something went wrong (HTTP " + code + ")"); log("Something went wrong (HTTP " + code + ")");
fail(strings.error_network, 5000); fail(strings.error_network, 5000);
resolve([]); resolve([]);
} }
@@ -86,7 +86,7 @@ function dbGetData(table, id = null) {
if (code == 200) { if (code == 200) {
resolve(data.data); resolve(data.data);
} else { } else {
console.log("Something went wrong (HTTP " + code + ")"); log("Something went wrong (HTTP " + code + ")");
fail(strings.error_network, 5000); fail(strings.error_network, 5000);
resolve(null); resolve(null);
} }
@@ -108,7 +108,7 @@ function dbGetDataIndex(table, indexName, value) {
if (code == 200) { if (code == 200) {
resolve(data.data); resolve(data.data);
} else { } else {
console.log("Something went wrong (HTTP " + code + ")"); log("Something went wrong (HTTP " + code + ")");
fail(strings.error_network, 5000); fail(strings.error_network, 5000);
resolve([]); resolve([]);
} }
@@ -417,29 +417,31 @@ function dbSettingsSet(key, value) {
} }
} }
async function updateSyncStatus() { // TODO async function updateSyncStatus() {
// var syncStatus = document.getElementById('syncstatus'); var lastSync = await dbGetData('update_times', 'last_sync');
// var lastSync = await dbGetData('update_times', 'last_sync'); lastSync = new Date(lastSync.time * 1000);
// lastSync = new Date(lastSync.time * 1000); if (lastSync > 0) {
// 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
// diff = Math.round(diff / 60); diff = Math.round(diff / 60);
// txt = 'vor ' + diff + ' ' + (diff == 1 ? 'Minute' : 'Minuten'); txt = 'vor ' + diff + ' ' + (diff == 1 ? 'Minute' : 'Minuten');
// } else if (diff < 86400) { // 24 std } else if (diff < 86400) { // 24 std
// diff = Math.round(diff / 3600); diff = Math.round(diff / 3600);
// txt = 'vor ' + diff + ' ' + (diff == 1 ? 'Stunde' : 'Stunden'); txt = 'vor ' + diff + ' ' + (diff == 1 ? 'Stunde' : 'Stunden');
// } else { } else {
// diff = Math.round(diff / 86400); diff = Math.round(diff / 86400);
// txt = 'vor ' + diff + ' ' + (diff == 1 ? 'Tag' : 'Tagen'); txt = 'vor ' + diff + ' ' + (diff == 1 ? 'Tag' : 'Tagen');
// } }
// } else {
// var btn = '<a href="#" onclick="setLoading(true); sync(); return false;"><i class="fas fa-sync"></i> Sync</a>'; var txt = 'nie';
// syncStatus.innerHTML = 'Zuletzt aktualisiert: ' + txt + btn; }
$('#syncstatus').html('Zuletzt aktualisiert: ' + txt);
} }
async function runPageScript() { async function runPageScript() {
@@ -460,16 +462,14 @@ async function runPageScript() {
dbSettingsSet('myregattas_' + BOATCLASS, plannings); dbSettingsSet('myregattas_' + BOATCLASS, plannings);
} }
} }
if (typeof updateSyncStatusTimer == 'undefined') { // TODO if (typeof updateSyncStatusTimer == 'undefined') {
// var syncStatus = document.getElementById('syncstatus');
if (canUseLocalDB) { if (canUseLocalDB) {
updateSyncStatusTimer = window.setInterval(updateSyncStatus, 10000); updateSyncStatusTimer = window.setInterval(updateSyncStatus, 10000);
} else { } else {
// syncStatus.innerHTML = 'Keine Offline-Nutzung möglich.'; $('#syncstatus').html('Keine Offline-Nutzung möglich.');
$('#i-sync').parent().hide(); $('#i-sync').parent().hide();
updateSyncStatusTimer = null; updateSyncStatusTimer = null;
} }
// syncStatus.style.display = 'block';
} }
if (typeof siteScript === 'function') { if (typeof siteScript === 'function') {
@@ -483,6 +483,7 @@ function sync() {
if (!canUseLocalDB) return false; if (!canUseLocalDB) return false;
if (syncInProgress > 0) return false; if (syncInProgress > 0) return false;
return new Promise(function(resolve) {
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) {
@@ -493,7 +494,7 @@ function sync() {
syncInProgress = 11; syncInProgress = 11;
var syncOkay = true; var syncOkay = true;
console.log("Sync Start"); log("Sync Start");
$('#i-sync').addClass('fa-spin'); $('#i-sync').addClass('fa-spin');
var interval = window.setInterval(function () { var interval = window.setInterval(function () {
@@ -503,12 +504,17 @@ function sync() {
var osUpdateTimes = db.transaction('update_times', 'readwrite').objectStore('update_times'); var osUpdateTimes = db.transaction('update_times', 'readwrite').objectStore('update_times');
osUpdateTimes.put({ table: 'last_sync', time: now }); osUpdateTimes.put({ table: 'last_sync', time: now });
} }
console.log("Sync Stop"); log("Sync Stop");
setTimeout(function(){ setTimeout(function(){
$('#i-sync').removeClass('fa-spin'); $('#i-sync').removeClass('fa-spin');
}, 500); }, 500);
if (typeof onAfterSync === 'function') {
onAfterSync();
}
removeSyncInfoToPreloader();
runPageScript(); runPageScript();
resolve();
} }
}, 100); }, 100);
@@ -520,7 +526,6 @@ function sync() {
getJSON(QUERY_URL + 'get_clubs?changed-after=' + localTimes['clubs'], function (code, data) { getJSON(QUERY_URL + 'get_clubs?changed-after=' + localTimes['clubs'], function (code, data) {
if (code == 200) { if (code == 200) {
var os = db.transaction('clubs', 'readwrite').objectStore('clubs'); var os = db.transaction('clubs', 'readwrite').objectStore('clubs');
console.log(data);
data.data.forEach(function (entry) { data.data.forEach(function (entry) {
os.put(entry); os.put(entry);
}); });
@@ -535,12 +540,14 @@ function sync() {
var osUpdateTimes = db.transaction('update_times', 'readwrite').objectStore('update_times'); var osUpdateTimes = db.transaction('update_times', 'readwrite').objectStore('update_times');
osUpdateTimes.put({ table: 'clubs', time: serverTimes['clubs'] }); osUpdateTimes.put({ table: 'clubs', time: serverTimes['clubs'] });
syncInProgress --; syncInProgress --;
log('clubs synced, remaining:', syncInProgress);
} }
}; };
} else { } else {
console.log("Something went wrong (HTTP " + code + ")"); log("clubs: Something went wrong (HTTP " + code + ")");
syncOkay = false; syncOkay = false;
syncInProgress --; syncInProgress --;
log('clubs failed, remaining:', syncInProgress);
} }
}); });
} else { } else {
@@ -552,7 +559,6 @@ function sync() {
getJSON(QUERY_URL + 'get_boats?changed-after=' + localTimes['boats'], function (code, data) { getJSON(QUERY_URL + 'get_boats?changed-after=' + localTimes['boats'], function (code, data) {
if (code == 200) { if (code == 200) {
var os = db.transaction('boats', 'readwrite').objectStore('boats'); var os = db.transaction('boats', 'readwrite').objectStore('boats');
console.log(data);
data.data.forEach(function (entry) { data.data.forEach(function (entry) {
os.put(entry); os.put(entry);
}); });
@@ -567,12 +573,14 @@ function sync() {
var osUpdateTimes = db.transaction('update_times', 'readwrite').objectStore('update_times'); var osUpdateTimes = db.transaction('update_times', 'readwrite').objectStore('update_times');
osUpdateTimes.put({ table: 'boats', time: serverTimes['boats'] }); osUpdateTimes.put({ table: 'boats', time: serverTimes['boats'] });
syncInProgress --; syncInProgress --;
log('boats synced, remaining:', syncInProgress);
} }
}; };
} else { } else {
console.log("Something went wrong (HTTP " + code + ")"); log("boats: Something went wrong (HTTP " + code + ")");
syncOkay = false; syncOkay = false;
syncInProgress --; syncInProgress --;
log('boats failed, remaining:', syncInProgress);
} }
}); });
} else { } else {
@@ -584,7 +592,6 @@ function sync() {
getJSON(QUERY_URL + 'get_sailors?changed-after=' + localTimes['sailors'], function (code, data) { getJSON(QUERY_URL + 'get_sailors?changed-after=' + localTimes['sailors'], function (code, data) {
if (code == 200) { if (code == 200) {
var os = db.transaction('sailors', 'readwrite').objectStore('sailors'); var os = db.transaction('sailors', 'readwrite').objectStore('sailors');
console.log(data);
data.data.forEach(function (entry) { data.data.forEach(function (entry) {
os.put(entry); os.put(entry);
}); });
@@ -599,12 +606,14 @@ function sync() {
var osUpdateTimes = db.transaction('update_times', 'readwrite').objectStore('update_times'); var osUpdateTimes = db.transaction('update_times', 'readwrite').objectStore('update_times');
osUpdateTimes.put({ table: 'sailors', time: serverTimes['sailors'] }); osUpdateTimes.put({ table: 'sailors', time: serverTimes['sailors'] });
syncInProgress --; syncInProgress --;
log('sailors synced, remaining:', syncInProgress);
} }
}; };
} else { } else {
console.log("Something went wrong (HTTP " + code + ")"); log("sailors: Something went wrong (HTTP " + code + ")");
syncOkay = false; syncOkay = false;
syncInProgress --; syncInProgress --;
log('sailors failed, remaining:', syncInProgress);
} }
}); });
} else { } else {
@@ -616,7 +625,6 @@ function sync() {
getJSON(QUERY_URL + 'get_regattas?changed-after=' + localTimes['regattas'], function (code, data) { getJSON(QUERY_URL + 'get_regattas?changed-after=' + localTimes['regattas'], function (code, data) {
if (code == 200) { if (code == 200) {
var os = db.transaction('regattas', 'readwrite').objectStore('regattas'); var os = db.transaction('regattas', 'readwrite').objectStore('regattas');
console.log(data);
data.data.forEach(function (entry) { data.data.forEach(function (entry) {
os.put(entry); os.put(entry);
}); });
@@ -647,12 +655,14 @@ function sync() {
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 --;
log('regattas synced, remaining:', syncInProgress);
} }
}; };
} else { } else {
console.log("Something went wrong (HTTP " + code + ")"); log("regattas: Something went wrong (HTTP " + code + ")");
syncOkay = false; syncOkay = false;
syncInProgress --; syncInProgress --;
log('regattas failed, remaining:', syncInProgress);
} }
}); });
} else { } else {
@@ -664,7 +674,6 @@ function sync() {
getJSON(QUERY_URL + 'get_results?changed-after=' + localTimes['results'], function (code, data) { getJSON(QUERY_URL + 'get_results?changed-after=' + localTimes['results'], function (code, data) {
if (code == 200) { if (code == 200) {
var os = db.transaction('results', 'readwrite').objectStore('results'); var os = db.transaction('results', 'readwrite').objectStore('results');
console.log(data);
data.data.forEach(function (entry) { data.data.forEach(function (entry) {
os.put(entry); os.put(entry);
}); });
@@ -679,12 +688,14 @@ function sync() {
var osUpdateTimes = db.transaction('update_times', 'readwrite').objectStore('update_times'); var osUpdateTimes = db.transaction('update_times', 'readwrite').objectStore('update_times');
osUpdateTimes.put({ table: 'results', time: serverTimes['results'] }); osUpdateTimes.put({ table: 'results', time: serverTimes['results'] });
syncInProgress --; syncInProgress --;
log('results synced, remaining:', syncInProgress);
} }
}; };
} else { } else {
console.log("Something went wrong (HTTP " + code + ")"); log("results: Something went wrong (HTTP " + code + ")");
syncOkay = false; syncOkay = false;
syncInProgress --; syncInProgress --;
log('results failed, remaining:', syncInProgress);
} }
}); });
} else { } else {
@@ -696,7 +707,6 @@ function sync() {
getJSON(QUERY_URL + 'get_plannings?changed-after=' + localTimes['plannings'], function (code, data) { getJSON(QUERY_URL + 'get_plannings?changed-after=' + localTimes['plannings'], function (code, data) {
if (code == 200) { if (code == 200) {
var os = db.transaction('plannings', 'readwrite').objectStore('plannings'); var os = db.transaction('plannings', 'readwrite').objectStore('plannings');
console.log(data);
data.data.forEach(function (entry) { data.data.forEach(function (entry) {
os.put(entry); os.put(entry);
}); });
@@ -711,12 +721,14 @@ function sync() {
var osUpdateTimes = db.transaction('update_times', 'readwrite').objectStore('update_times'); var osUpdateTimes = db.transaction('update_times', 'readwrite').objectStore('update_times');
osUpdateTimes.put({ table: 'plannings', time: serverTimes['plannings'] }); osUpdateTimes.put({ table: 'plannings', time: serverTimes['plannings'] });
syncInProgress --; syncInProgress --;
log('plannings synced, remaining:', syncInProgress);
} }
}; };
} else { } else {
console.log("Something went wrong (HTTP " + code + ")"); log("plannings: Something went wrong (HTTP " + code + ")");
syncOkay = false; syncOkay = false;
syncInProgress --; syncInProgress --;
log('plannings failed, remaining:', syncInProgress);
} }
}); });
} else { } else {
@@ -729,7 +741,6 @@ function sync() {
getJSON(QUERY_URL + 'get_trim_boats?changed-after=' + localTimes['trim_boats'], function (code, data) { getJSON(QUERY_URL + 'get_trim_boats?changed-after=' + localTimes['trim_boats'], function (code, data) {
if (code == 200) { if (code == 200) {
var os = db.transaction('trim_boats', 'readwrite').objectStore('trim_boats'); var os = db.transaction('trim_boats', 'readwrite').objectStore('trim_boats');
console.log(data);
data.data.forEach(function (entry) { data.data.forEach(function (entry) {
os.put(entry); os.put(entry);
}); });
@@ -744,12 +755,14 @@ function sync() {
var osUpdateTimes = db.transaction('update_times', 'readwrite').objectStore('update_times'); var osUpdateTimes = db.transaction('update_times', 'readwrite').objectStore('update_times');
osUpdateTimes.put({ table: 'trim_boats', time: serverTimes['trim_boats'] }); osUpdateTimes.put({ table: 'trim_boats', time: serverTimes['trim_boats'] });
syncInProgress --; syncInProgress --;
log('trim_boats synced, remaining:', syncInProgress);
} }
}; };
} else { } else {
console.log("Something went wrong (HTTP " + code + ")"); log("trim_boats: Something went wrong (HTTP " + code + ")");
syncOkay = false; syncOkay = false;
syncInProgress --; syncInProgress --;
log('trim_boats failed, remaining:', syncInProgress);
} }
}); });
} else { } else {
@@ -761,7 +774,6 @@ function sync() {
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) {
if (code == 200) { if (code == 200) {
var os = db.transaction('trim_users', 'readwrite').objectStore('trim_users'); var os = db.transaction('trim_users', 'readwrite').objectStore('trim_users');
console.log(data);
data.data.forEach(function (entry) { data.data.forEach(function (entry) {
os.put(entry); os.put(entry);
}); });
@@ -776,12 +788,14 @@ function sync() {
var osUpdateTimes = db.transaction('update_times', 'readwrite').objectStore('update_times'); var osUpdateTimes = db.transaction('update_times', 'readwrite').objectStore('update_times');
osUpdateTimes.put({ table: 'trim_users', time: serverTimes['trim_users'] }); osUpdateTimes.put({ table: 'trim_users', time: serverTimes['trim_users'] });
syncInProgress --; syncInProgress --;
log('trim_users synced, remaining:', syncInProgress);
} }
}; };
} else { } else {
console.log("Something went wrong (HTTP " + code + ")"); log("trim_users: Something went wrong (HTTP " + code + ")");
syncOkay = false; syncOkay = false;
syncInProgress --; syncInProgress --;
log('trim_users failed, remaining:', syncInProgress);
} }
}); });
} else { } else {
@@ -793,7 +807,6 @@ function sync() {
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) {
if (code == 200) { if (code == 200) {
var os = db.transaction('trim_trims', 'readwrite').objectStore('trim_trims'); var os = db.transaction('trim_trims', 'readwrite').objectStore('trim_trims');
console.log(data);
data.data.forEach(function (entry) { data.data.forEach(function (entry) {
os.put(entry); os.put(entry);
}); });
@@ -808,12 +821,14 @@ function sync() {
var osUpdateTimes = db.transaction('update_times', 'readwrite').objectStore('update_times'); var osUpdateTimes = db.transaction('update_times', 'readwrite').objectStore('update_times');
osUpdateTimes.put({ table: 'trim_trims', time: serverTimes['trim_trims'] }); osUpdateTimes.put({ table: 'trim_trims', time: serverTimes['trim_trims'] });
syncInProgress --; syncInProgress --;
log('trim_trims synced, remaining:', syncInProgress);
} }
}; };
} else { } else {
console.log("Something went wrong (HTTP " + code + ")"); log("trim_trims: Something went wrong (HTTP " + code + ")");
syncOkay = false; syncOkay = false;
syncInProgress --; syncInProgress --;
log('trim_trims failed, remaining:', syncInProgress);
} }
}); });
} else { } else {
@@ -829,7 +844,6 @@ function sync() {
getJSON(QUERY_URL + 'get_news?changed-after=' + localTimes['news'], function (code, data) { getJSON(QUERY_URL + 'get_news?changed-after=' + localTimes['news'], function (code, data) {
if (code == 200) { if (code == 200) {
var os = db.transaction('news', 'readwrite').objectStore('news'); var os = db.transaction('news', 'readwrite').objectStore('news');
console.log(data);
data.data.forEach(function (entry) { data.data.forEach(function (entry) {
os.put(entry); os.put(entry);
}); });
@@ -844,12 +858,14 @@ function sync() {
var osUpdateTimes = db.transaction('update_times', 'readwrite').objectStore('update_times'); var osUpdateTimes = db.transaction('update_times', 'readwrite').objectStore('update_times');
osUpdateTimes.put({ table: 'news', time: serverTimes['news'] }); osUpdateTimes.put({ table: 'news', time: serverTimes['news'] });
syncInProgress --; syncInProgress --;
log('news synced, remaining:', syncInProgress);
} }
}; };
} else { } else {
console.log("Something went wrong (HTTP " + code + ")"); log("news: Something went wrong (HTTP " + code + ")");
syncOkay = false; syncOkay = false;
syncInProgress --; syncInProgress --;
log('news failed, remaining:', syncInProgress);
} }
}); });
} else { } else {
@@ -861,7 +877,6 @@ function sync() {
getJSON(QUERY_URL + 'get_users?changed-after=' + localTimes['users'], function (code, data) { getJSON(QUERY_URL + 'get_users?changed-after=' + localTimes['users'], function (code, data) {
if (code == 200) { if (code == 200) {
var os = db.transaction('users', 'readwrite').objectStore('users'); var os = db.transaction('users', 'readwrite').objectStore('users');
console.log(data);
data.data.forEach(function (entry) { data.data.forEach(function (entry) {
os.put(entry); os.put(entry);
}); });
@@ -876,12 +891,14 @@ function sync() {
var osUpdateTimes = db.transaction('update_times', 'readwrite').objectStore('update_times'); var osUpdateTimes = db.transaction('update_times', 'readwrite').objectStore('update_times');
osUpdateTimes.put({ table: 'users', time: serverTimes['users'] }); osUpdateTimes.put({ table: 'users', time: serverTimes['users'] });
syncInProgress --; syncInProgress --;
log('users synced, remaining:', syncInProgress);
} }
}; };
} else { } else {
console.log("Something went wrong (HTTP " + code + ")"); log("users: Something went wrong (HTTP " + code + ")");
syncOkay = false; syncOkay = false;
syncInProgress --; syncInProgress --;
log('users failed, remaining:', syncInProgress);
} }
}); });
} else { } else {
@@ -889,12 +906,13 @@ function sync() {
} }
} else { } else {
console.log("Something went wrong (HTTP " + code + ")"); log("Something went wrong (HTTP " + code + ")");
syncOkay = false; syncOkay = false;
syncInProgress = 0; syncInProgress = 0;
} }
}); });
}; };
});
} }
function checkSync() { function checkSync() {
@@ -913,12 +931,14 @@ function initDatabase() {
if (window.indexedDB) { if (window.indexedDB) {
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); log("Cannot open DB: " + event.target);
if (typeof onDatabaseLoaded == 'function') onDatabaseLoaded();
runPageScript(); runPageScript();
}; };
request.onsuccess = function (event) { request.onsuccess = function (event) {
console.log("Database loaded"); log("Database loaded");
db = event.target.result; db = event.target.result;
db.onversionchange = function (event) { db.onversionchange = function (event) {
@@ -931,7 +951,7 @@ function initDatabase() {
} }
db.onerror = function (event) { db.onerror = function (event) {
console.log("DB Error: " + event.target.errorCode); log("DB Error: " + event.target);
}; };
canUseLocalDB = true; canUseLocalDB = true;
@@ -943,6 +963,7 @@ function initDatabase() {
if (lastSync > 0) { if (lastSync > 0) {
runPageScript(); runPageScript();
} else { } else {
addSyncInfoToPreloader();
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() });
} }
}; };
@@ -961,10 +982,10 @@ function initDatabase() {
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); log("Datenbank Version Upgrade von " + oldVersion + " auf " + newVersion);
if ((oldVersion < 1) && (newVersion >= 1)) { if ((oldVersion < 1) && (newVersion >= 1)) {
console.log('to version 1'); log('to version 1');
var osClubs = db.createObjectStore('clubs', { keyPath: 'id' }); var osClubs = db.createObjectStore('clubs', { keyPath: 'id' });
var osBoats = db.createObjectStore('boats', { keyPath: 'id' }); var osBoats = db.createObjectStore('boats', { keyPath: 'id' });
var osSailors = db.createObjectStore('sailors', { keyPath: 'id' }); var osSailors = db.createObjectStore('sailors', { keyPath: 'id' });
@@ -993,7 +1014,7 @@ function initDatabase() {
} }
if ((oldVersion < 2) && (newVersion >= 2)) { if ((oldVersion < 2) && (newVersion >= 2)) {
console.log('to version 2'); log('to version 2');
var osUsers = db.createObjectStore('users', { keyPath: 'id' }); var osUsers = db.createObjectStore('users', { keyPath: 'id' });
osUsers.createIndex('username', 'username', { unique: true }); osUsers.createIndex('username', 'username', { unique: true });
var osUpdateTimes = upgradeTransaction.objectStore('update_times'); var osUpdateTimes = upgradeTransaction.objectStore('update_times');
@@ -1001,25 +1022,25 @@ function initDatabase() {
} }
if ((oldVersion < 3) && (newVersion >= 3)) { if ((oldVersion < 3) && (newVersion >= 3)) {
console.log('to version 3'); 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'); 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'); 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'); 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 });
@@ -1029,12 +1050,13 @@ function initDatabase() {
osUpdateTimes.put({ table: 'last_sync', time: 0 }); osUpdateTimes.put({ table: 'last_sync', time: 0 });
} }
} else { } else {
if (typeof onDatabaseLoaded == 'function') onDatabaseLoaded();
runPageScript(); runPageScript();
} }
} }
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');
@@ -1050,12 +1072,24 @@ function resetDb(silent = true) {
osUpdateTimes.put({ table: 'trim_trims', time: 0 }); osUpdateTimes.put({ table: 'trim_trims', time: 0 });
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'); 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.');
} }
} }
function addSyncInfoToPreloader() {
var preloader = document.getElementById('preloader');
var div = document.createElement('div');
div.id = 'preloader-sync-info';
div.classList = 'rounded-s shadow-m bg-highlight m-3 p-3';
div.style.position = 'fixed';
div.style.top = 0;
div.style.left = 0;
div.style.right = 0;
div.innerHTML = '<h2 class="color-white">Datenbank SYNC</h2><p class="mb-0 color-white">Um Dir alle n&ouml;tigen Informationen anzeigen zu k&ouml;nnen, m&uuml;ssen wir die Datenbank synchronisieren.<br>Dies kann einen Moment dauern. Bitte habe etwas Geduld. Beim n&auml;chsten &Ouml;ffnen geht es schneller.</p>';
preloader.appendChild(div);
}
function removeSyncInfoToPreloader() {
$('#preloader-sync-info').remove();
}

File diff suppressed because it is too large Load Diff

View File

@@ -35,7 +35,7 @@ $(document).ready(function(){
//Enabling dismiss button //Enabling dismiss button
setTimeout(function(){ setTimeout(function(){
$('.pwa-dismiss').on('click',function(){ $('.pwa-dismiss').on('click',function(){
console.log('User Closed Add to Home / PWA Prompt') log('User Closed Add to Home / PWA Prompt')
createCookie('Sticky_pwa_rejected_install', true, 1); createCookie('Sticky_pwa_rejected_install', true, 1);
$('body').find('#menu-install-pwa-android, #menu-install-pwa-ios, .menu-hider').removeClass('menu-active'); $('body').find('#menu-install-pwa-android, #menu-install-pwa-ios, .menu-hider').removeClass('menu-active');
}); });
@@ -52,34 +52,37 @@ $(document).ready(function(){
//Firing PWA prompts for specific versions and when not on home screen. //Firing PWA prompts for specific versions and when not on home screen.
if (isMobile.Android()) { if (isMobile.Android()) {
console.log('Android Detected'); log('Android Detected');
function showInstallPromotion(){ function showInstallPromotion(){
if($('#menu-install-pwa-android, .add-to-home').length){ if($('#menu-install-pwa-android, .add-to-home').length){
console.log('Triggering PWA Menu for Android'); log('Triggering PWA Menu for Android');
if (!readCookie('Sticky_pwa_rejected_install')) { if (!readCookie('Sticky_pwa_rejected_install')) {
setTimeout(function(){ setTimeout(function(){
$('.add-to-home').addClass('add-to-home-visible add-to-home-android'); $('.add-to-home').addClass('add-to-home-visible add-to-home-android');
$('#menu-install-pwa-android, .menu-hider').addClass('menu-active') $('#menu-install-pwa-android, .menu-hider').addClass('menu-active')
},4500); },3000);
} }
} else {
console.log('The div #menu-install-pwa-android was not found. Please add this div to show the install window')
} }
} }
let deferredPrompt; let deferredPrompt;
window.addEventListener('beforeinstallprompt', (e) => { window.addEventListener('beforeinstallprompt', (e) => {
e.preventDefault(); e.preventDefault();
deferredPrompt = e; deferredPrompt = e;
var welcomActive = $('#menu-welcome').hasClass('menu-active');
if (welcomActive) {
$('#menu-welcome-a-okay').click(showInstallPromotion);
} else {
showInstallPromotion(); showInstallPromotion();
}
}); });
$('.pwa-install').on('click',function(e){ $('.pwa-install').on('click',function(e){
deferredPrompt.prompt(); deferredPrompt.prompt();
deferredPrompt.userChoice deferredPrompt.userChoice
.then((choiceResult) => { .then((choiceResult) => {
if (choiceResult.outcome === 'accepted') { if (choiceResult.outcome === 'accepted') {
console.log('User accepted the A2HS prompt'); log('User accepted the A2HS prompt');
} else { } else {
console.log('User dismissed the A2HS prompt'); log('User dismissed the A2HS prompt');
} }
deferredPrompt = null; deferredPrompt = null;
}); });
@@ -91,17 +94,23 @@ $(document).ready(function(){
if (isMobile.iOS()) { if (isMobile.iOS()) {
if(!isInWebAppiOS){ if(!isInWebAppiOS){
console.log('iOS Detected'); log('iOS Detected');
if($('#menu-install-pwa-ios, .add-to-home').length){ if($('#menu-install-pwa-ios, .add-to-home').length){
if (!readCookie('Sticky_pwa_rejected_install')) { if (!readCookie('Sticky_pwa_rejected_install')) {
console.log('Triggering PWA / Add to Home Screen Menu for iOS'); function triggerPwaInstallIos() {
log('Triggering PWA / Add to Home Screen Menu for iOS');
setTimeout(function(){ setTimeout(function(){
$('.add-to-home').addClass('add-to-home-visible add-to-home-ios'); $('.add-to-home').addClass('add-to-home-visible add-to-home-ios');
$('#menu-install-pwa-ios, .menu-hider').addClass('menu-active'); $('#menu-install-pwa-ios, .menu-hider').addClass('menu-active');
},4500); },3000);
}; }
var welcomActive = $('#menu-welcome').hasClass('menu-active');
if (welcomActive) {
$('#menu-welcome-a-okay').click(triggerPwaInstallIos);
} else { } else {
console.log('The div #menu-install-pwa-ios was not found. Please add this div to show the install window') triggerPwaInstallIos();
}
};
} }
} }
} }
@@ -125,7 +134,7 @@ $(document).ready(function(){
var counter = 3; var counter = 3;
var interval = setInterval(function() { var interval = setInterval(function() {
counter--; counter--;
console.log(counter); log(counter);
$('.page-update').html('Aktuallisierung in ... '+ counter + ' Sekunden'); $('.page-update').html('Aktuallisierung in ... '+ counter + ' Sekunden');
if (counter == 0) { if (counter == 0) {
clearInterval(interval); clearInterval(interval);
@@ -133,7 +142,7 @@ $(document).ready(function(){
} }
}, 1000); }, 1000);
caches.delete('workbox-runtime').then(function() { caches.delete('workbox-runtime').then(function() {
console.log('Content Updated - Cache Removed!'); log('Content Updated - Cache Removed!');
}); });
//localStorage.clear(); //localStorage.clear();
sessionStorage.clear() sessionStorage.clear()
@@ -158,7 +167,7 @@ $(document).ready(function(){
//console.log(' Checking PWA Content for updates...\n PWA Server Version: ' + onlineVersionNumber + '\n' + ' PWA Cached Version: ' + localVersionNumber); //console.log(' Checking PWA Content for updates...\n PWA Server Version: ' + onlineVersionNumber + '\n' + ' PWA Cached Version: ' + localVersionNumber);
if(onlineVersionNumber != localVersionNumber && onlineVersionNumber != "Connection Offline. Waiting to Reconect"){ if(onlineVersionNumber != localVersionNumber && onlineVersionNumber != "Connection Offline. Waiting to Reconect"){
updateModal(); updateModal();
console.log('New Version of Content Available. Refreshing. On Desktop Browsers a manual refresh maybe required.') log('New Version of Content Available. Refreshing. On Desktop Browsers a manual refresh maybe required.')
setTimeout(function(){ setTimeout(function(){
$('body').find('#menu-update').addClass('menu-active'); $('body').find('#menu-update').addClass('menu-active');
$('.menu-hider').addClass('menu-active-no-click'); $('.menu-hider').addClass('menu-active-no-click');
@@ -233,13 +242,13 @@ $(document).ready(function(){
function updateOnlineStatus(event) { function updateOnlineStatus(event) {
var condition = navigator.onLine ? "online" : "offline"; var condition = navigator.onLine ? "online" : "offline";
isOnline(); isOnline();
console.log( 'Connection: Online'); log( 'Connection: Online');
$("a").off( "click", returnFalse ); $("a").off( "click", returnFalse );
} }
function updateOfflineStatus(event) { function updateOfflineStatus(event) {
isOffline(); isOffline();
$("a").on( "click", returnFalse ); $("a").on( "click", returnFalse );
console.log( 'Connection: Offline'); log( 'Connection: Offline');
} }
window.addEventListener('online', updateOnlineStatus); window.addEventListener('online', updateOnlineStatus);
window.addEventListener('offline', updateOfflineStatus); window.addEventListener('offline', updateOfflineStatus);

View File

@@ -13,6 +13,19 @@ const YOUTH_AGE = '<?php echo $_CLASS['youth-age']; ?>';
const YOUTH_GERMAN_NAME = '<?php echo $_CLASS['youth-german-name']; ?>'; const YOUTH_GERMAN_NAME = '<?php echo $_CLASS['youth-german-name']; ?>';
const PUSH_SERVER_KEY = '<?php echo PUSH_SERVER_KEY; ?>'; const PUSH_SERVER_KEY = '<?php echo PUSH_SERVER_KEY; ?>';
function log() {
var now = new Date();
var hour = now.getHours().toString();
var min = now.getMinutes().toString();
var sec = now.getSeconds().toString();
var millis = now.getMilliseconds().toString();
hour = (hour.length < 2 ? '0' + hour : hour);
min = (min.length < 2 ? '0' + min : min);
sec = (sec.length < 2 ? '0' + sec : sec);
while (millis.length < 3) millis = '0' + millis;
console.log('[' + hour + ':' + min + ':' + sec + '.' + millis + ']', ...arguments);
}
var randomId = function() { return '_' + Math.random().toString(36).substr(2, 9); } var randomId = function() { return '_' + Math.random().toString(36).substr(2, 9); }
var badges = { var badges = {
@@ -122,8 +135,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,13 +148,13 @@ 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();
} else { } else {
console.log('Login: unbekannter Fehler', status, error); log('Login: unbekannter Fehler', status, error);
console.log(xhr); log(xhr);
toastError('Ein unbekannter Fehler ist aufgetreten. Bitte versuche es noch einmal', 5000); toastError('Ein unbekannter Fehler ist aufgetreten. Bitte versuche es noch einmal', 5000);
} }
hideLoader(); hideLoader();
@@ -173,7 +186,7 @@ var logout = function() {
hash: localStorage.getItem('auth_hash') hash: localStorage.getItem('auth_hash')
} }
if ((auth.id === null) || (auth.hash === null)) { if ((auth.id === null) || (auth.hash === null)) {
console.log('Not logged in'); log('Not logged in');
logoutClearStorage(); logoutClearStorage();
return; return;
} }
@@ -185,14 +198,14 @@ var logout = function() {
}, },
error: function (xhr, status, error) { error: function (xhr, status, error) {
if (xhr.status == 401) { if (xhr.status == 401) {
console.log('Not logged in'); log('Not logged in');
logoutClearStorage(); logoutClearStorage();
} else if (xhr.status == 0) { } else if (xhr.status == 0) {
console.log('Could not delete auth from server'); log('Could not delete auth from server');
logoutClearStorage(); logoutClearStorage();
} else { } else {
console.log('Logout: unbekannter Fehler', status, error); log('Logout: unbekannter Fehler', status, error);
console.log(xhr); log(xhr);
toastError('Ein unbekannter Fehler ist aufgetreten. Bitte versuche es noch einmal', 5000); toastError('Ein unbekannter Fehler ist aufgetreten. Bitte versuche es noch einmal', 5000);
hideLoader(); hideLoader();
} }
@@ -203,21 +216,43 @@ 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) {
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) {
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) {
console.log('Unregister sW:', registration); log('Unregister sW:', registration);
registration.unregister(); registration.unregister();
} }
}); });
caches.keys().then((keyList) => { caches.keys().then((keyList) => {
return Promise.all(keyList.map((key) => { return Promise.all(keyList.map((key) => {
console.log('Cache deleted:', key); log('Cache deleted:', key);
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;
@@ -238,7 +273,7 @@ function urlB64ToUint8Array(base64String) {
} }
function pushesSubscribe() { function pushesSubscribe() {
console.log('Subscribing'); log('Subscribing');
const applicationServerKey = urlB64ToUint8Array(PUSH_SERVER_KEY); const applicationServerKey = urlB64ToUint8Array(PUSH_SERVER_KEY);
swRegistration.pushManager.subscribe({ swRegistration.pushManager.subscribe({
userVisibleOnly: true, userVisibleOnly: true,
@@ -250,14 +285,14 @@ function pushesSubscribe() {
updatePushBadge(); updatePushBadge();
}) })
.catch(function(err) { .catch(function(err) {
console.log('Failed to subscribe the user: ', err); log('Failed to subscribe the user: ', err);
toastError('Da ist leider etwas schief gelaufen. Bitte stelle sicher, dass Du mit dem Internet verbunden bist und versuche es erneut.', 5000); toastError('Da ist leider etwas schief gelaufen. Bitte stelle sicher, dass Du mit dem Internet verbunden bist und versuche es erneut.', 5000);
pushesUnSubscribe(true); pushesUnSubscribe(true);
}); });
} }
function pushesUnSubscribe(silent = false) { function pushesUnSubscribe(silent = false) {
console.log('Unsubscribing'); log('Unsubscribing');
swRegistration.pushManager.getSubscription() swRegistration.pushManager.getSubscription()
.then(function(subscription) { .then(function(subscription) {
if (subscription) { if (subscription) {
@@ -269,7 +304,7 @@ function pushesUnSubscribe(silent = false) {
} }
}) })
.catch(function(error) { .catch(function(error) {
console.log('Error unsubscribing', error); log('Error unsubscribing', error);
$('#menu-pushes').hideMenu(); $('#menu-pushes').hideMenu();
if (!silent) toastError('Da ist leider etwas schief gelaufen. Bitte versuche es erneut oder wende Dich an unseren Support.', 5000); if (!silent) toastError('Da ist leider etwas schief gelaufen. Bitte versuche es erneut oder wende Dich an unseren Support.', 5000);
updatePushBadge(); updatePushBadge();
@@ -278,7 +313,7 @@ function pushesUnSubscribe(silent = false) {
} }
function pushesUpdateServerSubscription(subscription, enabled) { function pushesUpdateServerSubscription(subscription, enabled) {
console.log('updateServer', enabled, subscription); log('updateServer', enabled, subscription);
$.ajax({ $.ajax({
url: QUERY_URL + (enabled ? 'add' : 'remove') + '_subscription', url: QUERY_URL + (enabled ? 'add' : 'remove') + '_subscription',
type: 'POST', type: 'POST',
@@ -320,10 +355,16 @@ async function updatePushSwitches() {
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();
} }
} }
@@ -380,6 +421,22 @@ 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();
@@ -399,7 +456,8 @@ var initRegatten = function() {
// 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() {
@@ -412,6 +470,48 @@ var onServiceWorkerLoaded = function() {
} }
var onDatabaseLoaded = function() { var onDatabaseLoaded = function() {
if (!canUseLocalDB && !$('#menu-welcome').hasClass('menu-active')) {
function NoDbWarningOk() {
createCookie('regatten_nodb_banner', true, 1);
$('#menu-nodb-warning').hideMenu();
}
function showNoDbWarning() {
if (!readCookie('regatten_nodb_banner')) {
$('#menu-nodb-warning').showMenu();
}
}
$('#menu-nodb-warning-okay').click(NoDbWarningOk);
showNoDbWarning();
}
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 rounded-s text-uppercase font-900 shadow-m m-3';
button.style.position = 'fixed';
button.style.bottom = 0;
button.style.right = 0;
button.innerHTML = '&lt;/&gt;';
button.onclick = function(){
alert('CONSOLE OPENED\nDir werden jetzt einige Entwickler-Informationen angezeigt. Du kannst die Console über das X oben rechts wieder schließen.');
mobileConsole.displayConsole();
return false;
}
setTimeout(function(){
preloader.appendChild(button);
}, 5000);
}
addConsoleOpenerToPreloader();

13
server/content/go2url.php Normal file
View File

@@ -0,0 +1,13 @@
<?php
$sp['title'] = 'Umleitung - Regatten.net ' . $_CLASS['name'];
// Title
$content = '<h1>Umleitung</h1>';
$content .= '<p>Wir leiten Dich in K&uuml;rze zur gew&uuml;nschten Website weiter</p>';
$sp['output'] .= $tpl->load('card', [$content, 'html-id' => 'card-title']);
$sp['scripts'] .= $scripts->load('go2url');
?>

View File

@@ -10,9 +10,15 @@
$sp['output'] .= $tpl->load('card', [$content]); $sp['output'] .= $tpl->load('card', [$content]);
$sp['output'] .= '<div id="news-entries"></div>';
// Pagination
$sp['output'] .= $tpl->load('pagination', ['html-id' => 'pagination']);
// Menu // Menu
$sp['menus'] .= $tpl->load('menu/modal', ['html-id' => 'menu-news', 'title' => 'Details']); $sp['menus'] .= $tpl->load('menu/modal', ['html-id' => 'menu-news', 'title' => 'Details']);
$sp['scripts'] .= $scripts->load('pagination', ['pageChange', 'page', 'pageCount', 'pagination']);
$cardTemplate = $tpl->load('card', ['%CONTENT%', 'html-id' => '%ID%', 'css-class' => 'card-news']); $cardTemplate = $tpl->load('card', ['%CONTENT%', 'html-id' => '%ID%', 'css-class' => 'card-news']);
$cardTemplate = str_replace("\n", '', $cardTemplate); $cardTemplate = str_replace("\n", '', $cardTemplate);
$cardTemplate = str_replace("\r", '', $cardTemplate); $cardTemplate = str_replace("\r", '', $cardTemplate);

View File

@@ -1,19 +1,48 @@
<?php <?php
// TODO: Create site $sp['title'] = 'Saison-Planung - Regatten.net ' . $_CLASS['name'];
$sp['backbutton'] = 'index';
$sp['activenav'] = 5;
$sp['title'] = 'Seite noch nicht unterstuuml;tzt - Regatten.net ' . $_CLASS['name']; // Title
$sp['backbutton'] = true; $content = '<h1>Saison-Planung</h1>';
$content .= '<p class="mb-1"><b>Hinweis:</b> Diese Seite kannst nur Du sehen.<br>Wenn Du Deine Saison-Planung teilen möchtest, <a id="a-share-planning">klicke hier</a></p>';
$content .= $tpl->load('button', ['<i class="fas fa-edit"></i>&ensp;bearbeiten', LINK_PRE . 'planning_edit']);
$content .= $tpl->load('select', ['html-id' => 'select-year', 'placeholder' => 'Jahr', 'css-class' => 'mt-3 mb-0']);
$content = $tpl->load('error', ['404', 'Seite existiert noch nicht']); $sp['output'] .= $tpl->load('card', [$content, 'css-class' => 'show-loggedin']);
$content .= '<p>';
$content .= 'Die gesuchte Seite ist leider noch nicht verf&uuml;gbar.<br>';
$content .= 'Wir arbeiten daran, sie schnellstm&ouml;glich zur Verf&uuml;gung zu stellen.<br>';
$content .= 'Wie w&auml;re es mit der Homepage?';
$content .= '</p>';
$content .= $tpl->load('button', ['Zur Startseite', LINK_PRE . 'index', 'css-class' => 'mb-3']);
$content .= $tpl->load('button', ['Kontakt', LINK_PRE . 'contact']);
$sp['output'] = $tpl->load('card', [$content, 'css-class' => 'text-center pt-3']); // Not loggedin
$content = '<h1>Saison-Planung</h1>';
$content .= '<p>Um Deine Saison-Planung zu sehen, musst Du angemeldet sein.<br><a href="#" data-menu="menu-login">Melde Dich hier an</a> oder <a href="#" data-menu="menu-signup">registriere Dich jetzt kostenlos</a>.</p>';
$sp['output'] .= $tpl->load('card', [$content, 'css-class' => 'show-notloggedin']);
// Regattas
$content = '<p id="p-count" class="mb-0"></p>';
$content .= $tpl->load('input', ['html-id' => 'input-search', 'placeholder' => 'Suche', 'type' => 'text', 'css-class' => 'mt-2']);
$content .= '<div id="div-regattas" class="regattas-list mb-0"></div>';
$sp['output'] .= $tpl->load('card', [$content, 'html-id' => 'card-regattas', 'css-class' => 'show-loggedin']);
// Menu
$items = '<p id="menu-item-yourplanning" class="mb-2 mt-1" style="line-height: 1.5em;"></p>';
$items .= $tpl->load('menu/item-icon', ['Status bearbeiten', '#', 'html-id' => 'menu-item-status', 'icon' => 'fa-edit']);
$items .= $tpl->load('menu/item-icon', ['Saison-Planungen', '', 'html-id' => 'menu-item-plannings', 'icon' => 'fa-calendar-alt']);
$items .= $tpl->load('menu/item-icon', ['Ergebnisse', '', 'html-id' => 'menu-item-results', 'icon' => 'fa-poll']);
$items .= $tpl->load('menu/item-icon', ['Bericht', '', 'html-id' => 'menu-item-bericht', 'icon' => 'fa-book']);
$items .= $tpl->load('menu/item-icon', ['Informationen', '', 'html-id' => 'menu-item-info', 'icon' => 'fa-info']);
$items .= $tpl->load('menu/item-icon-badge', ['Meldung', '', 'html-id' => 'menu-item-meldung', 'icon' => 'fa-file-signature', 'badge-id' => 'badge-regatta-meldung']);
$items .= $tpl->load('menu/item-icon', ['offizielle Ergebnisse', '', 'html-id' => 'menu-item-oresults', 'icon' => 'fa-poll']);
$items .= $tpl->load('menu/item-icon', ['Vereins-Website', '', 'html-id' => 'menu-item-clubwebsite', 'icon' => 'fa-globe']);
$sp['menus'] .= $tpl->load('menu/bottom', [$items, 'html-id' => 'menu-regatta', 'title' => 'Regatta-Details', 'height' => 320]);
// Menu Edit status
$items = $tpl->load('menu/item-switch', ['Gemeldet', 'html-id' => 'switch-status-gemeldet', 'icon' => 'fa-file-signature']);
$items .= $tpl->load('menu/item-switch', ['Bezahlt', 'html-id' => 'switch-status-bezahlt', 'icon' => 'fa-euro-sign', 'css-class' => 'border-0']);
$sp['menus'] .= $tpl->load('menu/bottom', [$items, 'html-id' => 'menu-status', 'title' => 'Status bearbeiten', 'height' => 220]);
$sp['scripts'] .= $scripts->load('onRegattaClicked');
$sp['scripts'] .= $scripts->load('planning');
?> ?>

View File

@@ -1,19 +1,31 @@
<?php <?php
// TODO: Create site $sp['title'] = 'Saison-Planung bearbeiten - Regatten.net ' . $_CLASS['name'];
$sp['backbutton'] = 'planning';
$sp['activenav'] = 5;
$sp['title'] = 'Seite noch nicht unterstuuml;tzt - Regatten.net ' . $_CLASS['name']; // Title, Inputs
$sp['backbutton'] = true; $content = "<h1>Saison-Planung bearbeiten</h1>";
$content .= $tpl->load('select', ['html-id' => 'select-year', 'placeholder' => 'Jahr', 'css-class' => 'mt-3 mb-0']);
$content = $tpl->load('error', ['404', 'Seite existiert noch nicht']); $sp['output'] .= $tpl->load('card', [$content]);
$content .= '<p>';
$content .= 'Die gesuchte Seite ist leider noch nicht verf&uuml;gbar.<br>';
$content .= 'Wir arbeiten daran, sie schnellstm&ouml;glich zur Verf&uuml;gung zu stellen.<br>';
$content .= 'Wie w&auml;re es mit der Homepage?';
$content .= '</p>';
$content .= $tpl->load('button', ['Zur Startseite', LINK_PRE . 'index', 'css-class' => 'mb-3']);
$content .= $tpl->load('button', ['Kontakt', LINK_PRE . 'contact']);
$sp['output'] = $tpl->load('card', [$content, 'css-class' => 'text-center pt-3']); // Regattas
$content = '<p id="p-count" class="mb-0"></p>';
$content .= $tpl->load('input', ['html-id' => 'input-search', 'placeholder' => 'Suche', 'type' => 'text', 'css-class' => 'mt-2']);
$content .= '<div id="div-regattas" class="ranking-detail-list mb-0"></div>';
$sp['output'] .= $tpl->load('card', [$content, 'html-id' => 'card-regattas']);
// Menu
$items = $tpl->load('menu/item-switch', ['In die Saison-Planung aufnehmen', 'html-id' => 'switch-planning-include', 'icon' => 'fa-check']);
$items .= $tpl->load('menu/item-simple', ['', '#', 'html-id' => 'item-steuermann']);
$sp['menus'] .= $tpl->load('menu/bottom', [$items, 'html-id' => 'menu-edit', 'title' => 'Regatta bearbeiten', 'height' => 320]);
// Select sailor
$items = $tpl->load('input', ['html-id' => 'input-edit-search', 'placeholder' => 'Suche', 'type' => 'text']);
$sp['menus'] .= $tpl->load('menu/modal', [$items, 'html-id' => 'menu-sailor', 'height' => 500, 'width' => 350]);
$sp['scripts'] .= $scripts->load('planning_edit');
?> ?>

View File

@@ -1,19 +1,27 @@
<?php <?php
// TODO: Create site $sp['title'] = 'Saison-Planungen - Regatten.net ' . $_CLASS['name'];
$sp['backbutton'] = 'planning';
$sp['activenav'] = 5;
$sp['title'] = 'Seite noch nicht unterstuuml;tzt - Regatten.net ' . $_CLASS['name']; // Title
$sp['backbutton'] = true; $content = '<h1>Saison-Planungen</h1>';
$content .= $tpl->load('select', ['html-id' => 'select-year', 'placeholder' => 'Jahr', 'css-class' => 'mt-3 mb-0']);
$content = $tpl->load('error', ['404', 'Seite existiert noch nicht']); $sp['output'] .= $tpl->load('card', [$content, 'css-class' => 'show-loggedin']);
$content .= '<p>';
$content .= 'Die gesuchte Seite ist leider noch nicht verf&uuml;gbar.<br>';
$content .= 'Wir arbeiten daran, sie schnellstm&ouml;glich zur Verf&uuml;gung zu stellen.<br>';
$content .= 'Wie w&auml;re es mit der Homepage?';
$content .= '</p>';
$content .= $tpl->load('button', ['Zur Startseite', LINK_PRE . 'index', 'css-class' => 'mb-3']);
$content .= $tpl->load('button', ['Kontakt', LINK_PRE . 'contact']);
$sp['output'] = $tpl->load('card', [$content, 'css-class' => 'text-center pt-3']); // Not loggedin
$content = '<h1>Saison-Planungen</h1>';
$content .= '<p>Um die Saison-Planungen anderer zu sehen, musst Du angemeldet sein.<br><a href="#" data-menu="menu-login">Melde Dich hier an</a> oder <a href="#" data-menu="menu-signup">registriere Dich jetzt kostenlos</a>.</p>';
$sp['output'] .= $tpl->load('card', [$content, 'css-class' => 'show-notloggedin']);
// Regattas
$content = $tpl->load('input', ['html-id' => 'input-search', 'placeholder' => 'Suche', 'type' => 'text']);
$content .= '<div id="div-users" class="normal-list mb-0"></div>';
$sp['output'] .= $tpl->load('card', [$content, 'html-id' => 'card-regattas', 'css-class' => 'show-loggedin']);
$sp['scripts'] .= $scripts->load('planning_list');
?> ?>

View File

@@ -1,19 +1,36 @@
<?php <?php
// TODO: Create site $sp['title'] = 'Saison-Planung - Regatten.net ' . $_CLASS['name'];
$sp['backbutton'] = 'planning_list';
$sp['activenav'] = 5;
$sp['title'] = 'Seite noch nicht unterstuuml;tzt - Regatten.net ' . $_CLASS['name']; // Title
$sp['backbutton'] = true; $content = '<h1>Saison-Planung</h1>';
$content .= '<p id="p-username" class="mb-1"></p>';
$content .= $tpl->load('button', ['<i class="fas fa-share-alt"></i>&ensp;Teilen', '#', 'html-id' => 'button-share']);
$content .= $tpl->load('select', ['html-id' => 'select-year', 'placeholder' => 'Jahr', 'css-class' => 'mt-3 mb-0']);
$content = $tpl->load('error', ['404', 'Seite existiert noch nicht']); $sp['output'] .= $tpl->load('card', [$content]);
$content .= '<p>';
$content .= 'Die gesuchte Seite ist leider noch nicht verf&uuml;gbar.<br>';
$content .= 'Wir arbeiten daran, sie schnellstm&ouml;glich zur Verf&uuml;gung zu stellen.<br>';
$content .= 'Wie w&auml;re es mit der Homepage?';
$content .= '</p>';
$content .= $tpl->load('button', ['Zur Startseite', LINK_PRE . 'index', 'css-class' => 'mb-3']);
$content .= $tpl->load('button', ['Kontakt', LINK_PRE . 'contact']);
$sp['output'] = $tpl->load('card', [$content, 'css-class' => 'text-center pt-3']); // Regattas
$content = '<p id="p-count" class="mb-0"></p>';
$content .= $tpl->load('input', ['html-id' => 'input-search', 'placeholder' => 'Suche', 'type' => 'text', 'css-class' => 'mt-2']);
$content .= '<div id="div-regattas" class="ranking-detail-list mb-0"></div>';
$sp['output'] .= $tpl->load('card', [$content, 'html-id' => 'card-regattas']);
// Menu
$items = '<p id="menu-item-yourplanning" class="mb-2 mt-1" style="line-height: 1.5em;"></p>';
$items .= $tpl->load('menu/item-icon', ['Saison-Planungen', '', 'html-id' => 'menu-item-plannings', 'icon' => 'fa-calendar-alt']);
$items .= $tpl->load('menu/item-icon', ['Ergebnisse', '', 'html-id' => 'menu-item-results', 'icon' => 'fa-poll']);
$items .= $tpl->load('menu/item-icon', ['Bericht', '', 'html-id' => 'menu-item-bericht', 'icon' => 'fa-book']);
$items .= $tpl->load('menu/item-icon', ['Informationen', '', 'html-id' => 'menu-item-info', 'icon' => 'fa-info']);
$items .= $tpl->load('menu/item-icon-badge', ['Meldung', '', 'html-id' => 'menu-item-meldung', 'icon' => 'fa-file-signature', 'badge-id' => 'badge-regatta-meldung']);
$items .= $tpl->load('menu/item-icon', ['offizielle Ergebnisse', '', 'html-id' => 'menu-item-oresults', 'icon' => 'fa-poll']);
$items .= $tpl->load('menu/item-icon', ['Vereins-Website', '', 'html-id' => 'menu-item-clubwebsite', 'icon' => 'fa-globe']);
$sp['menus'] .= $tpl->load('menu/bottom', [$items, 'html-id' => 'menu-regatta', 'title' => 'Regatta-Details', 'height' => 320]);
$sp['scripts'] .= $scripts->load('onRegattaClicked');
$sp['scripts'] .= $scripts->load('planning_view');
?> ?>

View File

@@ -3,27 +3,27 @@
<div class="content mb-0"> <div class="content mb-0">
<div class="divider mb-0"></div> <div class="divider mb-0"></div>
<div class="list-group list-custom-small list-icon-0"> <div class="list-group list-custom-small list-icon-0">
<a href="#" class="shareToFacebook"> <a href="#" class="shareToFacebook" target="_blank">
<i class="font-18 fab fa-facebook color-facebook"></i> <i class="font-18 fab fa-facebook color-facebook"></i>
<span class="font-13">Facebook</span> <span class="font-13">Facebook</span>
<i class="fa fa-angle-right"></i> <i class="fa fa-angle-right"></i>
</a> </a>
<a href="#" class="shareToTwitter"> <a href="#" class="shareToTwitter" target="_blank">
<i class="font-18 fab fa-twitter-square color-twitter"></i> <i class="font-18 fab fa-twitter-square color-twitter"></i>
<span class="font-13">Twitter</span> <span class="font-13">Twitter</span>
<i class="fa fa-angle-right"></i> <i class="fa fa-angle-right"></i>
</a> </a>
<a href="#" class="shareToLinkedIn"> <a href="#" class="shareToLinkedIn" target="_blank">
<i class="font-18 fab fa-linkedin color-linkedin"></i> <i class="font-18 fab fa-linkedin color-linkedin"></i>
<span class="font-13">LinkedIn</span> <span class="font-13">LinkedIn</span>
<i class="fa fa-angle-right"></i> <i class="fa fa-angle-right"></i>
</a> </a>
<a href="#" class="shareToWhatsApp"> <a href="#" class="shareToWhatsApp" target="_blank">
<i class="font-18 fab fa-whatsapp-square color-whatsapp"></i> <i class="font-18 fab fa-whatsapp-square color-whatsapp"></i>
<span class="font-13">WhatsApp</span> <span class="font-13">WhatsApp</span>
<i class="fa fa-angle-right"></i> <i class="fa fa-angle-right"></i>
</a> </a>
<a href="#" class="shareToMail border-0"> <a href="#" class="shareToMail border-0" target="_blank">
<i class="font-18 fa fa-envelope-square color-mail"></i> <i class="font-18 fa fa-envelope-square color-mail"></i>
<span class="font-13">Email</span> <span class="font-13">Email</span>
<i class="fa fa-angle-right"></i> <i class="fa fa-angle-right"></i>
@@ -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>
@@ -206,31 +209,36 @@
</div> </div>
</div> </div>
<div id="menu-developer" class="menu menu-box-bottom menu-box-detached rounded-m" data-menu-height="310"> <div id="menu-developer" class="menu menu-box-bottom menu-box-detached rounded-m" data-menu-height="360">
<div class="menu-title"><h1>Entwickler-Optionen</h1><p class="color-highlight">Version <?php echo PWA_VERSION; ?></p><a href="#" class="close-menu"><i class="fa fa-times"></i></a></div> <div class="menu-title"><h1>Entwickler-Optionen</h1><p class="color-highlight">Version <?php echo PWA_VERSION; ?></p><a href="#" class="close-menu"><i class="fa fa-times"></i></a></div>
<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/" class="border-0"> <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>
</a> </a>
<a href="#" onclick="mobileConsole.displayConsole(); return false;" class="border-0 menu-close">
<i class="fa font-14 fa-terminal rounded-s bg-highlight color-white"></i>
<span>Console anzeigen</span>
<i class="fa fa-angle-right"></i>
</a>
</div> </div>
</div> </div>
</div> </div>
@@ -283,6 +291,21 @@
</div> </div>
</div> </div>
<div id="menu-nodb-warning" class="menu menu-box-bottom menu-box-detached rounded-m" data-height="500">
<div class="menu-title"><h1>Warnung</h1><p class="color-highlight">Datenbank nicht unterst&uuml;tzt</p><a href="#" class="close-menu"><i class="fa fa-times"></i></a></div>
<div class="divider divider-margins mb-n2"></div>
<div class="content bottom-0">
<p>
Das Speichern der ben&ouml;tigten Daten wird von Deinem Ger&auml;t nicht unterst&uuml;tzt.<br>
Da deshalb die Daten jedesmal direkt vom Server geladen werden m&uuml;ssen, kannst Du die App nicht offline nutzen.<br>
Das Nachladen kann au&szlig;erdem gerade bei gro&szlig;en Datenmengen (wie Ranglisten) sehr lange dauern.
Wir empfehlen Dir daher, auf diesem Ger&auml;t unsere normale Website zu benutzen. Diese ist auch f&uuml;r Mobil-Ger&auml;te optimiert.
</p>
<a class="btn btn-m mt-2 btn-full bg-highlight text-uppercase font-900" href="https://regatten.net/">Zur Website</a>
<a id="menu-nodb-warning-okay" class="btn btn-m mt-2 mb-3 btn-full bg-highlight text-uppercase font-900" href="#">Nicht erneut anzeigen</a>
</div>
</div>
<div id="menu-update"> <div id="menu-update">
<div class="content bottom-0"> <div class="content bottom-0">
<p class="text-center mt-5"><i class="fa fa-sync-alt fa-7x color-highlight fa-spin"></i></p> <p class="text-center mt-5"><i class="fa fa-sync-alt fa-7x color-highlight fa-spin"></i></p>

View File

@@ -2,6 +2,7 @@
<html lang="de"> <html lang="de">
<head> <head>
<script type="text/javascript" src="<?php echo SERVER_ADDR; ?>/client/scripts/mobileconsole.js"></script>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="apple-mobile-web-app-capable" content="yes"> <meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"> <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
@@ -26,7 +27,8 @@
<?php include(__DIR__ . '/headerfooter.php'); ?> <?php include(__DIR__ . '/headerfooter.php'); ?>
<!--start of page content, add your stuff here--> <!--start of page content, add your stuff here-->
<div class="page-content header-clear-medium"> <div class="page-content header-clear">
<div id="syncstatus" class="text-right mr-2 mb-1">Zuletzt aktualisiert: nie</div>
<?php echo $sp['output']; ?> <?php echo $sp['output']; ?>
</div> </div>
<!--end of page content, off canvas elements here--> <!--end of page content, off canvas elements here-->

View File

@@ -21,8 +21,8 @@ async function onEditBoatnameClick() {
if (xhr.status == 0) { if (xhr.status == 0) {
toastError('Du bist momentan offline.<br>Stelle eine Internetverbindung her, um den Bootsnamen zu bearbeiten'); toastError('Du bist momentan offline.<br>Stelle eine Internetverbindung her, um den Bootsnamen zu bearbeiten');
} else { } else {
console.log('EditBoatname: unbekannter Fehler', status, error); log('EditBoatname: unbekannter Fehler', status, error);
console.log(xhr); log(xhr);
toastError('Ein unbekannter Fehler ist aufgetreten. Bitte versuche es noch einmal', 5000); toastError('Ein unbekannter Fehler ist aufgetreten. Bitte versuche es noch einmal', 5000);
} }
hideLoader(); hideLoader();

View File

@@ -68,10 +68,10 @@ function addRace() {
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();

View File

@@ -23,16 +23,16 @@ function sendMessage() {
if (xhr.status == 0) { if (xhr.status == 0) {
toastError('Du bist momentan offline.<br>Stelle eine Internetverbindung her, um eine Nachricht zu versenden'); toastError('Du bist momentan offline.<br>Stelle eine Internetverbindung her, um eine Nachricht zu versenden');
} else { } else {
console.log('Contact: unbekannter Fehler', status, error); log('Contact: unbekannter Fehler', status, error);
console.log(xhr); log(xhr);
toastError('Ein unbekannter Fehler ist aufgetreten. Bitte versuche es noch einmal', 5000); toastError('Ein unbekannter Fehler ist aufgetreten. Bitte versuche es noch einmal', 5000);
} }
hideLoader(); hideLoader();
}, },
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();
} }
}); });

12
server/scripts/go2url.js Normal file
View File

@@ -0,0 +1,12 @@
var siteScript = function() {
hideLoader();
setTimeout(function() {
var url = findGetParameter('url');
if (url === null) {
$('#card-title').find('p').html('Wir konnten Dich leider nicht umleiten.<br><a href="' + LINK_PRE + 'index">Hier kommst Du zur&uuml;ck zur Startseite</a>');
} else {
showLoader();
location.href = url;
}
}, 2000);
}

View File

@@ -50,7 +50,7 @@ var siteScript = async function() {
// Your next // Your next
var planningsDB = await dbGetDataIndex('plannings', 'user', user.id); var planningsDB = await dbGetDataIndex('plannings', 'user', user.id);
var minDate = getToday(); var minDate = getToday();
minDate.setDate(minDate.getDate() - 1); minDate.setDate(minDate.getDate());
var maxDate = getToday(); var maxDate = getToday();
maxDate.setDate(maxDate.getDate() + 28); maxDate.setDate(maxDate.getDate() + 28);
var regattas = await dbGetRegattasRange(minDate, maxDate); var regattas = await dbGetRegattasRange(minDate, maxDate);
@@ -120,8 +120,10 @@ var siteScript = async function() {
ms = parseDate(regatta['meldungSchluss']); ms = parseDate(regatta['meldungSchluss']);
} }
var diff = Math.round((ms - today) / 86400000); var diff = Math.round((ms - today) / 86400000);
if ((ms >= today) && (diff < 7)) { if (ms < today) {
color = ' color-red2-dark'; color = ' color-red2-dark';
} else if (diff < 7) {
color = ' color-yellow2-dark';
} }
} }
} }
@@ -164,7 +166,7 @@ var siteScript = async function() {
// Next // Next
var minDate = getToday(); var minDate = getToday();
minDate.setDate(minDate.getDate() - 1); minDate.setDate(minDate.getDate());
var maxDate = getToday(); var maxDate = getToday();
maxDate.setDate(maxDate.getDate() + 14); maxDate.setDate(maxDate.getDate() + 14);
var regattas = await dbGetRegattasRange(minDate, maxDate); var regattas = await dbGetRegattasRange(minDate, maxDate);
@@ -227,8 +229,10 @@ var siteScript = async function() {
ms = parseDate(regatta['meldungSchluss']); ms = parseDate(regatta['meldungSchluss']);
} }
var diff = Math.round((ms - today) / 86400000); var diff = Math.round((ms - today) / 86400000);
if ((ms >= today) && (diff < 7)) { if (ms < today) {
color = ' color-red2-dark'; color = ' color-red2-dark';
} else if (diff < 7) {
color = ' color-yellow2-dark';
} }
} }
} }

View File

@@ -1,3 +1,9 @@
var firstCall = true;
var rows = [];
var page = 1;
var pageCount = 0;
const showCount = 10;
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;
@@ -11,34 +17,72 @@ async function onNewsClicked(id) {
$('#menu-news').showMenu(); $('#menu-news').showMenu();
} }
function pageChange() {
$('h1')[0].scrollIntoView({ behavior: "smooth" });
drawList();
}
function addCard(newsEntry) { function addCard(newsEntry) {
console.log(newsEntry); var badge = '';
var content = '<h2>' + newsEntry.title + '</h2>'; if (newsEntry.unread) {
badge += '<span class="badge bg-highlight color-white p-1">NEW</span>&ensp;';
}
var content = '<h2>' + badge + 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)); $('#news-entries').append(cardTemplate.replace('%ID%', 'card-news-' + newsEntry.id).replace('%CONTENT%', content));
}
async function drawList() {
$('.card-news').remove();
if (rows.length > 0) {
var offset = (page - 1) * showCount;
var count = (page == pageCount ? (rows.length % showCount) : showCount);
if (count == 0) count = showCount;
for (i = 0; i < count; i ++) {
addCard(rows[i + offset]);
}
}
} }
var siteScript = async function() { var siteScript = async function() {
$('.card-news').remove(); if (firstCall) {
firstCall = false;
initPagination();
}
rows = [];
var news = await dbGetData('news'); var news = await dbGetData('news');
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 newsRead = await dbSettingsGet('news_read_' + BOATCLASS);
var lastYear = new Date(today); var now = new Date();
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); newsEntry.unread = (newsEntry.date > newsRead);
rows.push(newsEntry);
} }
pageCount = Math.ceil(rows.length / showCount);
if ((page < 1) || (page > pageCount)) {
if (page < 1) {
page = 1;
} else {
page = pageCount;
}
}
drawPagination();
drawList();
dbSettingsSet('news_read_' + BOATCLASS, now);
updateNewsBadge();
hideLoader(); hideLoader();
} }

View File

@@ -32,11 +32,26 @@ async function onRegattaClicked(id) {
crew.push(sailor.name); crew.push(sailor.name);
} }
} }
var status = '';
if (planning.gemeldet == '1') status = 'gemeldet';
if (planning.bezahlt == '1') {
if (status != '') status += ' und ';
status += 'bezahlt';
}
if (status != '') crew.push('<font style="font-style:italic;">' + status + '</font>');
$('#menu-item-yourplanning').html(crew.join('<br>')); $('#menu-item-yourplanning').html(crew.join('<br>'));
} else { } else {
$('#menu-item-yourplanning').hide(); $('#menu-item-yourplanning').hide();
} }
// Planning: Edit Status
if ((planning != null) && (typeof planningEditStatus === 'function')) {
$('#menu-item-status').show();
$('#menu-item-status').attr('onclick', 'planningEditStatus(' + regatta['id'] + ')');
} else {
$('#menu-item-status').hide();
}
// Planning // Planning
if ((plannings.length > 0) && (dateTo >= today)) { if ((plannings.length > 0) && (dateTo >= today)) {
$('#menu-item-plannings').show(); $('#menu-item-plannings').show();

312
server/scripts/planning.js Normal file
View File

@@ -0,0 +1,312 @@
async function planningSwitchChanged() {
showLoader();
var id = $('#switch-status-gemeldet').data('regatta');
var gemeldet = $('#switch-status-gemeldet').prop('checked');
var bezahlt = $('#switch-status-bezahlt').prop('checked');
var auth = {
id: localStorage.getItem('auth_id'),
hash: localStorage.getItem('auth_hash')
}
$.ajax({
url: QUERY_URL + 'planning_set_state',
method: 'POST',
data: {
auth: auth,
regatta: id,
gemeldet: gemeldet,
bezahlt: bezahlt
},
error: function (xhr, status, error) {
if (xhr.status == 401) {
log('authentification failed');
toastError('Authentifizierung fehlgeschlagen. Versuche es erneut.');
} else if (xhr.status == 0) {
toastError('Du bist momentan offline.<br>Stelle eine Internetverbindung her, um den Status zu &auml;ndern');
} else {
log('Login: unbekannter Fehler', status, error);
log(xhr);
toastError('Ein unbekannter Fehler ist aufgetreten. Bitte versuche es noch einmal', 5000);
}
$('#menu-status').hideMenu();
hideLoader();
},
success: function (data, status, xhr) {
sync();
hideLoader();
}
});
}
async function planningEditStatus(id) {
$('#menu-regatta').hideMenu();
var regatta = await dbGetData('regattas', id);
$('#menu-status').find('.menu-title').find('p').text(regatta.name);
var plannings = await dbGetDataIndex('plannings', 'regatta', regatta['id']);
var planning = null;
if (isLoggedIn()) {
for (i in plannings) {
if (plannings[i]['user'] == USER_ID) {
planning = plannings[i];
break;
}
}
}
if (planning !== null) {
$('#switch-status-gemeldet').data('regatta', id);
$('#switch-status-gemeldet').prop('checked', planning.gemeldet == '1');
$('#switch-status-bezahlt').prop('checked', planning.bezahlt == '1');
$('#menu-status').showMenu();
}
}
function selectChange() {
var val = $('#select-year').val();
if (typeof siteScript === 'function') {
history.replaceState(null, '', '?year=' + val);
siteScript();
}
}
function initYear() {
var year = findGetParameter('year');
if (year === null) year = new Date().getFullYear();
$('#select-year').html('<option value="' + year + '">' + year + '</option>');
$('#select-year').val(year);
}
var firstCall = true;
var rows = [];
var today;
async function drawList () {
window.setTimeout(function () {
var list = '';
rows.forEach(function (entry) {
if (entry == null) {
list += '<div><div align="center" class="color-highlight"><b>Heute ist der ' + formatDate('d.m.Y', today) + '</b></div></div>';
} else if (search($('#input-search').val(), entry.keywords)) {
list += entry.content;
}
});
$('#div-regattas').html(list);
}, 0);
}
var siteScript = async function() {
if (!isLoggedIn()) {
hideLoader();
return;
}
if (firstCall) {
firstCall = false;
initYear();
$('#select-year').change(selectChange);
$('#input-search').on('input', drawList);
$('#switch-status-gemeldet').parent().parent().click(planningSwitchChanged);
$('#switch-status-bezahlt').parent().parent().click(planningSwitchChanged);
}
$('#a-share-planning').attr('href', LINK_PRE + 'planning_view?user=' + USER_ID);
today = getToday();
var selectedYear = $('#select-year').val();
var minDate = parseDate(selectedYear + '-01-01');
var maxDate = parseDate(selectedYear + '-12-31');
var regattas = await dbGetRegattasRange(minDate, maxDate);
var plannings = await dbGetDataIndex('plannings', 'user', USER_ID);
for (var i = regattas.length - 1; i >= 0; i --) {
var entry = regattas[i];
var okay = false;
for (p in plannings) {
if (plannings[p].regatta == entry.id) {
regattas[i].planning = plannings[p];
okay = true;
break;
}
}
if (!okay) {
regattas.splice(i, 1);
}
}
var regattaResults = [];
for (id in regattas) {
var entry = regattas[id];
var results = await dbGetDataIndex('results', 'regatta', entry['id']);
regattaResults[entry['id']] = (results.length > 0);
}
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 options = '';
for (id in years) {
var year = years[id]['year'];
options += '<option value="' + year + '">' + year + '</option>';
}
$('#select-year').html(options);
$('#select-year').val(selectedYear);
var count = regattas.length;
if (count > 0) {
if (count == 1) {
$('#p-count').html('Es wurde 1 Regatta gefunden!');
} else {
$('#p-count').html('Es wurden ' + count + ' Regatten gefunden!');
}
$('#div-regattas').show();
$('#input-search').parent().show();
var heute = false;
rows = [];
for (id in regattas) {
var entry = regattas[id];
var club = null;
if (entry['club'] != null)
club = await dbGetData('clubs', entry['club']);
if (entry.planning.steuermann !== null) {
entry.planning.steuermann = (await dbGetData('sailors', entry.planning.steuermann)).name;
}
var crewString = entry.planning.crew.split(',');
entry.planning.crew = [];
for (c in crewString) {
var sailor = await dbGetData('sailors', crewString[c]);
if (sailor !== null) {
entry.planning.crew.push(sailor.name);
}
}
var dateFrom = entry['dateFrom'];
var dateTo = entry['dateTo'];
var row = { keywords: [], content: '' };
row.keywords.push(entry['name']);
if (entry['number'] != null) row.keywords.push(entry['number']);
if (club != null) row.keywords.push(club['kurz'], club['name']);
if (entry.planning.steuermann != null) row.keywords.push(entry.planning.steuermann);
for (c in entry.planning.crew) row.keywords.push(entry.planning.crew[c]);
if (!heute && (today <= dateFrom)) {
rows.push(null);
heute = true;
}
row.content += '<div onclick="onRegattaClicked(' + entry['id'] + ');">';
// ZEILE 1
// Name
row.content += '<div><b>' + (entry['canceled'] == 1 ? '<s>' : '') + entry['name'] + (entry['canceled'] == 1 ? '</s>' : '') + '</b></div>';
// ZEILE 2
row.content += '<div>';
// Number
row.content += '<div>' + ((entry['number'] != null) ? ('# ' + entry['number']) : '') + '</div>';
// Club
row.content += '<div>' + ((club != null) ? club['kurz'] : '') + '</div>';
// Special
row.content += '<div>' + entry['special'] + '</div>';
// Icons
var icons = [];
if ((entry['meldung'] != '') && (dateTo >= today) && (entry['meldungOffen'] == '1') && (entry.planning.gemeldet != '1')) {
var color = '';
var planning = null;
if (isLoggedIn()) {
var plannings = await dbGetDataIndex('plannings', 'regatta', entry['id']);
for (id in plannings) {
if (plannings[id]['user'] == USER_ID) {
planning = plannings[id];
break;
}
}
}
if (entry['meldungSchluss'] != null) {
if ((planning == null) || (planning['gemeldet'] == '0')) {
var ms = 0;
if (entry['meldungEarly'] != null) {
ms = parseDate(entry['meldungEarly']);
}
if (ms < today) {
ms = parseDate(entry['meldungSchluss']);
}
var diff = Math.round((ms - today) / 86400000);
if (ms < today) {
color = ' color-red2-dark';
} else if (diff < 7) {
color = ' color-yellow2-dark';
}
}
}
if ((planning != null) && (planning['gemeldet'] == '0')) {
color += ' fa-blink';
}
icons.push('<i class="fas fa-file-signature' + color + '"></i>');
}
if (entry['bericht'] != '')
icons.push('<i class="fas fa-book"></i>');
if (entry['canceled'] == '1') {
icons.push('<i class="fas fa-times color-red2-dark"></i>');
} else if (regattaResults[entry['id']]) {
icons.push('<i class="fas fa-poll"></i>');
}
if (entry.planning.gemeldet == '1') {
icons.push('<i class="fas fa-file-signature color-highlight"></i>');
}
if (entry.planning.bezahlt == '1') {
icons.push('<i class="fas fa-euro-sign color-highlight"></i>');
}
row.content += '<div class="color-green2-dark">' + icons.join('&ensp;') + '</div>';
row.content += '</div>';
// ZEILE 3
row.content += '<div>';
// Date
if (entry['length'] < 1) {
if (formatDate('d.m', dateFrom) == '01.01') {
row.content += '<div><font class="color-red2-dark">Datum noch unklar</font></div>';
} else {
row.content += '<div>' + formatDate("d.m.Y", dateFrom) + ' - <font class="color-red2-dark">Datum nicht final</font></div>';
}
} else {
row.content += '<div>' + formatDate("d.m.Y", dateFrom) + ' - ' + formatDate("d.m.Y", dateTo) + '</div>';
}
// RLF
row.content += '<div>' + parseFloat(entry['rlf']).toFixed(2) + '</div>';
row.content += '</div></div>';
rows.push(row);
}
if (!heute) {
rows.push(null);
}
drawList();
} else {
$('#p-count').html('Du hast noch keine Regatten in Deiner Saison-Planung!');
$('#div-regattas').hide();
$('#input-search').parent().hide();
}
hideLoader();
}

View File

@@ -0,0 +1,473 @@
async function planningSwitchChanged() {
showLoader();
var id = $('#switch-planning-include').data('regatta');
var include = $('#switch-planning-include').prop('checked');
var auth = {
id: localStorage.getItem('auth_id'),
hash: localStorage.getItem('auth_hash')
}
if (include) {
// add to planning
$.ajax({
url: QUERY_URL + 'planning_add',
method: 'POST',
data: {
auth: auth,
regatta: id
},
error: function (xhr, status, error) {
if (xhr.status == 401) {
log('authentification failed');
toastError('Authentifizierung fehlgeschlagen. Versuche es erneut.');
} else if (xhr.status == 0) {
toastError('Du bist momentan offline.<br>Stelle eine Internetverbindung her, um die &Auml;nderungen zu speichern');
} else {
log('planning_add: unbekannter Fehler', status, error);
log(xhr);
toastError('Ein unbekannter Fehler ist aufgetreten. Bitte versuche es noch einmal', 5000);
}
$('#menu-edit').hideMenu();
hideLoader();
},
success: async function (data, status, xhr) {
await sync();
planningEdit(id);
hideLoader();
}
});
} else {
// remove from planning
$.ajax({
url: QUERY_URL + 'planning_remove',
method: 'POST',
data: {
auth: auth,
regatta: id
},
error: function (xhr, status, error) {
if (xhr.status == 401) {
log('authentification failed');
toastError('Authentifizierung fehlgeschlagen. Versuche es erneut.');
} else if (xhr.status == 0) {
toastError('Du bist momentan offline.<br>Stelle eine Internetverbindung her, um die &Auml;nderungen zu speichern');
} else {
log('planning_remove: unbekannter Fehler', status, error);
log(xhr);
toastError('Ein unbekannter Fehler ist aufgetreten. Bitte versuche es noch einmal', 5000);
}
$('#menu-edit').hideMenu();
hideLoader();
},
success: async function (data, status, xhr) {
await sync();
planningEdit(id);
hideLoader();
}
});
}
}
var sailorIsSteuermann;
var sailors = [];
async function sailorSelected(sid) {
$('#menu-sailor').hideMenu();
showLoader();
var rid = $('#switch-planning-include').data('regatta');
var action = (sailorIsSteuermann ? 'planning_set_steuermann' : 'planning_add_crew');
// add sailor
var auth = {
id: localStorage.getItem('auth_id'),
hash: localStorage.getItem('auth_hash')
}
$.ajax({
url: QUERY_URL + action,
method: 'POST',
data: {
auth: auth,
regatta: rid,
sailor: sid
},
error: function (xhr, status, error) {
if (xhr.status == 401) {
log('authentification failed');
toastError('Authentifizierung fehlgeschlagen. Versuche es erneut.');
} else if (xhr.status == 0) {
toastError('Du bist momentan offline.<br>Stelle eine Internetverbindung her, um die &Auml;nderungen zu speichern');
} else {
log(action + ': unbekannter Fehler', status, error);
log(xhr);
toastError('Ein unbekannter Fehler ist aufgetreten. Bitte versuche es noch einmal', 5000);
}
hideLoader();
},
success: async function (data, status, xhr) {
await sync();
planningEdit(rid);
hideLoader();
}
});
}
async function sailorsSearch() {
$('.item-sailor-search').remove();
if (sailorIsSteuermann) {
var item = '<a class="item-sailor-search" onclick="sailorSelected(null)">';
item += '<span style="font-style:italic;">noch unklar</span>';
item += '<i class="fa fa-angle-right"></i>';
item += '</a>';
$('#menu-sailor').find('.content').find('.list-group').append(item);
}
if ($('#input-edit-search').val().length >= 3) {
sailors.forEach(function (entry) {
if (search($('#input-edit-search').val(), entry.keywords)) {
$('#menu-sailor').find('.content').find('.list-group').append(entry.content);
}
});
} else {
var item = '<p class="item-sailor-search">Gib mindestens 3 Zeichen ein</p>';
$('#menu-sailor').find('.content').find('.list-group').append(item);
}
}
async function initSailors() {
sailors = [];
var dbSailors = await dbGetData('sailors');
dbSailors.sort(function(a,b){
return a.name.localeCompare(b.name);
});
for (s in dbSailors) {
var item = '<a class="item-sailor-search" onclick="sailorSelected(' + dbSailors[s].id + ')">';
item += '<span>' + dbSailors[s].name + '</span>';
item += '<i class="fa fa-angle-right"></i>';
item += '</a>';
sailors.push({
keywords: [dbSailors[s].name],
content: item
});
}
}
async function planningChangeCrew(sid = null) {
if (sid !== null) {
showLoader();
var rid = $('#switch-planning-include').data('regatta');
// remove sailor
var auth = {
id: localStorage.getItem('auth_id'),
hash: localStorage.getItem('auth_hash')
}
$.ajax({
url: QUERY_URL + 'planning_remove_crew',
method: 'POST',
data: {
auth: auth,
regatta: rid,
sailor: sid
},
error: function (xhr, status, error) {
if (xhr.status == 401) {
log('authentification failed');
toastError('Authentifizierung fehlgeschlagen. Versuche es erneut.');
} else if (xhr.status == 0) {
toastError('Du bist momentan offline.<br>Stelle eine Internetverbindung her, um die &Auml;nderungen zu speichern');
} else {
log('planning_remove_crew: unbekannter Fehler', status, error);
log(xhr);
toastError('Ein unbekannter Fehler ist aufgetreten. Bitte versuche es noch einmal', 5000);
}
$('#menu-edit').hideMenu();
hideLoader();
},
success: async function (data, status, xhr) {
await sync();
planningEdit(rid);
hideLoader();
}
});
} else {
sailorIsSteuermann = false;
$('#input-edit-search').val('').trigger('focusin').trigger('focusout');
sailorsSearch();
$('#menu-edit').hideMenu();
$('#menu-sailor').find('.menu-title').find('h1').text('Crew hinzufügen');
$('#menu-sailor').showMenu();
$('#input-edit-search').focus();
}
}
async function planningChangeSteuermann() {
sailorIsSteuermann = true;
$('#input-edit-search').val('').trigger('focusin').trigger('focusout');
sailorsSearch();
$('#menu-edit').hideMenu();
$('#menu-sailor').find('.menu-title').find('h1').text('Steuermann/-frau bearbeiten');
$('#menu-sailor').showMenu();
$('#input-edit-search').focus();
}
async function planningEdit(id) {
var regatta = await dbGetData('regattas', id);
$('#menu-edit').find('.menu-title').find('p').text(regatta.name);
var plannings = await dbGetDataIndex('plannings', 'regatta', regatta['id']);
var planning = null;
if (isLoggedIn()) {
for (i in plannings) {
if (plannings[i]['user'] == USER_ID) {
planning = plannings[i];
break;
}
}
}
$('#switch-planning-include').data('regatta', id);
if (planning !== null) {
$('#switch-planning-include').prop('checked', true);
$('#item-steuermann').show();
if (planning.steuermann !== null) {
$('#item-steuermann').find('span').text('Am Steuer: ' + (await dbGetData('sailors', planning.steuermann)).name);
} else {
$('#item-steuermann').find('span').html('Am Steuer: <font style="font-style:italic;">noch unklar</font>');
}
$('.item-crew').remove();
var crew = planning.crew.split(',');
for (c in crew) {
var sailor = await dbGetData('sailors', crew[c]);
if (sailor !== null) {
var item = '<a class="item-crew" onclick="planningChangeCrew(' + sailor.id + ')">';
item += '<span>' + sailor.name + '</span>';
item += '<i class="fa fa-angle-right"></i>';
item += '</a>';
$('#menu-edit').find('.content').find('.list-group').append(item);
}
}
var item = '<a class="item-crew" onclick="planningChangeCrew()">';
item += '<span style="font-style:italic;">Weiteren Segler hinzuf&uuml;gen</span>';
item += '<i class="fa fa-angle-right"></i>';
item += '</a>';
$('#menu-edit').find('.content').find('.list-group').append(item);
} else {
$('#switch-planning-include').prop('checked', false);
$('#item-steuermann').hide();
$('.item-crew').remove();
}
$('#menu-edit').showMenu();
}
function selectChange() {
var val = $('#select-year').val();
if (typeof siteScript === 'function') {
history.replaceState(null, '', '?year=' + val);
siteScript();
}
}
function initYear() {
var year = findGetParameter('year');
if (year === null) year = new Date().getFullYear();
$('#select-year').html('<option value="' + year + '">' + year + '</option>');
$('#select-year').val(year);
}
var firstCall = true;
var rows = [];
var today;
async function drawList () {
window.setTimeout(function () {
var list = '';
rows.forEach(function (entry) {
if (entry == null) {
list += '<div><div align="center" class="color-highlight"><b>Heute ist der ' + formatDate('d.m.Y', today) + '</b></div></div>';
} else if (search($('#input-search').val(), entry.keywords)) {
list += entry.content;
}
});
$('#div-regattas').html(list);
}, 0);
}
var siteScript = async function() {
if (!isLoggedIn()) {
location.href = LINK_PRE + 'planning';
return;
}
if (firstCall) {
firstCall = false;
initYear();
$('#select-year').change(selectChange);
$('#input-search').on('input', drawList);
$('#switch-planning-include').parent().parent().click(planningSwitchChanged);
$('#item-steuermann').click(planningChangeSteuermann);
$('#input-edit-search').on('input', sailorsSearch);
initSailors();
}
today = getToday();
var selectedYear = $('#select-year').val();
var minDate = parseDate(selectedYear + '-01-01');
var maxDate = parseDate(selectedYear + '-12-31');
var regattas = await dbGetRegattasRange(minDate, maxDate);
var plannings = await dbGetDataIndex('plannings', 'user', USER_ID);
for (var i = regattas.length - 1; i >= 0; i --) {
var entry = regattas[i];
var okay = false;
for (p in plannings) {
if (plannings[p].regatta == entry.id) {
regattas[i].planning = plannings[p];
okay = true;
break;
}
}
if (!okay) {
regattas[i].planning = null;
}
}
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 options = '';
for (id in years) {
var year = years[id]['year'];
options += '<option value="' + year + '">' + year + '</option>';
}
$('#select-year').html(options);
$('#select-year').val(selectedYear);
var count = regattas.length;
if (count > 0) {
if (count == 1) {
$('#p-count').html('Es wurde 1 Regatta gefunden!');
} else {
$('#p-count').html('Es wurden ' + count + ' Regatten gefunden!');
}
$('#div-regattas').show();
$('#input-search').parent().show();
var heute = false;
rows = [];
for (id in regattas) {
var entry = regattas[id];
var club = null;
if (entry['club'] != null)
club = await dbGetData('clubs', entry['club']);
if (entry.planning !== null) {
if (entry.planning.steuermann !== null) {
entry.planning.steuermann = (await dbGetData('sailors', entry.planning.steuermann)).name;
}
var crewString = entry.planning.crew.split(',');
entry.planning.crew = [];
for (c in crewString) {
var sailor = await dbGetData('sailors', crewString[c]);
if (sailor !== null) {
entry.planning.crew.push(sailor.name);
}
}
}
var dateFrom = entry['dateFrom'];
var dateTo = entry['dateTo'];
var row = { keywords: [], content: '' };
row.keywords.push(entry['name']);
if (entry['number'] != null) row.keywords.push(entry['number']);
if (club != null) row.keywords.push(club['kurz'], club['name']);
if (!heute && (today <= dateFrom)) {
rows.push(null);
heute = true;
}
if (entry.planning !== null) {
row.content += '<div onclick="planningEdit(' + entry['id'] + ');">';
} else {
row.content += '<div onclick="planningEdit(' + entry['id'] + ');" style="opacity:0.5;">';
}
// ZEILE 1
// Name
row.content += '<div><b>' + (entry['canceled'] == 1 ? '<s>' : '') + entry['name'] + (entry['canceled'] == 1 ? '</s>' : '') + '</b></div>';
// ZEILE 2
row.content += '<div>';
// Number
row.content += '<div>' + ((entry['number'] != null) ? ('# ' + entry['number']) : '') + '</div>';
// Special
row.content += '<div>' + entry['special'] + '</div>';
// Club
row.content += '<div>' + ((club != null) ? club['kurz'] : '') + '</div>';
row.content += '</div>';
// ZEILE 3
row.content += '<div>';
// Date
if (entry['length'] < 1) {
if (formatDate('d.m', dateFrom) == '01.01') {
row.content += '<div><font class="color-red2-dark">Datum noch unklar</font></div>';
} else {
row.content += '<div>' + formatDate("d.m.Y", dateFrom) + ' - <font class="color-red2-dark">Datum nicht final</font></div>';
}
} else {
row.content += '<div>' + formatDate("d.m.Y", dateFrom) + ' - ' + formatDate("d.m.Y", dateTo) + '</div>';
}
// RLF
row.content += '<div>' + parseFloat(entry['rlf']).toFixed(2) + '</div>';
row.content += '</div>';
if (entry.planning !== null) {
// ZEILE 4
row.content += '<div></div>';
// ZEILE 5
row.content += '<div>';
row.content += '<div>' + (entry.planning.steuermann !== null ? entry.planning.steuermann : 'noch unklar') + '</div>';
row.content += '</div>';
// ZEILE 6...
for (var i in entry.planning.crew) {
row.content += '<div>';
row.content += '<div>' + entry.planning.crew[i] + '</div>';
row.content += '</div>';
}
} else {
row.content += '<div>Du planst nicht, hierhin zu fahren</div>';
}
row.content += '</div>';
rows.push(row);
}
if (!heute) {
rows.push(null);
}
drawList();
} else {
$('#p-count').html('Keine Regatten gefunden!');
$('#div-regattas').hide();
$('#input-search').parent().hide();
}
hideLoader();
}

View File

@@ -0,0 +1,146 @@
async function onUserClicked(id) {
var user = await dbGetData('users', id);
if (user !== null) {
location.href = LINK_PRE + 'planning_view?user=' + user.id;
}
}
function selectChange() {
var val = $('#select-year').val();
if (typeof siteScript === 'function') {
history.replaceState(null, '', '?year=' + val);
siteScript();
}
}
function initYear() {
var year = findGetParameter('year');
if (year === null) year = new Date().getFullYear();
$('#select-year').html('<option value="' + year + '">' + year + '</option>');
$('#select-year').val(year);
}
var firstCall = true;
var rows = [];
var today;
async function drawList () {
window.setTimeout(function () {
var list = '';
rows.forEach(function (entry) {
if (search($('#input-search').val(), entry.keywords)) {
list += entry.content;
}
});
$('#div-users').html(list);
}, 0);
}
var siteScript = async function() {
if (!isLoggedIn()) {
hideLoader();
return;
}
if (firstCall) {
firstCall = false;
initYear();
$('#select-year').change(selectChange);
$('#input-search').on('input', drawList);
}
var selectedYear = $('#select-year').val();
var minDate = parseDate(selectedYear + '-01-01');
var maxDate = parseDate(selectedYear + '-12-31');
var regattas = await dbGetRegattasRange(minDate, maxDate);
var plannings = {};
for (var i in regattas) {
var entry = regattas[i];
var planning = await dbGetDataIndex('plannings', 'regatta', entry.id);
for (p in planning) {
if (!(planning[p].user in plannings)) {
plannings[planning[p].user] = {
user: await dbGetData('users', planning[p].user),
regattas: [],
sailors: {}
};
}
plannings[planning[p].user].regattas.push(entry);
var sailor = null;
if (planning[p].steuermann !== null) sailor = await dbGetData('sailors', planning[p].steuermann);
if (sailor !== null) {
if (!(sailor.id in plannings[planning[p].user].sailors)) plannings[planning[p].user].sailors[sailor.id] = sailor.name;
}
var crew = planning[p].crew.split(',');
for (i in crew) {
sailor = await dbGetData('sailors', crew[i]);
if (sailor !== null) {
if (!(sailor.id in plannings[planning[p].user].sailors)) plannings[planning[p].user].sailors[sailor.id] = sailor.name;
}
}
}
}
plannings = Object.values(plannings);
plannings.sort(function(a,b){
return a.user.username.localeCompare(b.user.username);
});
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 options = '';
for (id in years) {
var year = years[id]['year'];
options += '<option value="' + year + '">' + year + '</option>';
}
$('#select-year').html(options);
$('#select-year').val(selectedYear);
var count = plannings.length;
if (count > 0) {
$('#input-search').parent().show();
rows = [];
for (id in plannings) {
var entry = plannings[id];
var row = { keywords: [], content: '' };
row.keywords.push(entry.user.username);
for (i in entry.sailors) {
row.keywords.push(entry.sailors[i]);
}
row.content += '<div onclick="onUserClicked(' + entry.user.id + ');">';
// ZEILE 1
row.content += '<div></div>';
// ZEILE 2
row.content += '<div>';
// Name
row.content += '<div>' + entry.user.username + '</div>';
// Count of regattas
row.content += '<div>' + entry.regattas.length + ' Regatten</div>';
row.content += '</div></div>';
rows.push(row);
}
drawList();
} else {
$('#div-users').html('Es hat noch niemand eine Saison-Planung erstellt');
$('#input-search').parent().hide();
}
hideLoader();
}

View File

@@ -0,0 +1,219 @@
function selectChange() {
var val = $('#select-year').val();
if (typeof siteScript === 'function') {
history.replaceState(null, '', '?year=' + val);
siteScript();
}
}
function initYear() {
var year = findGetParameter('year');
if (year === null) year = new Date().getFullYear();
$('#select-year').html('<option value="' + year + '">' + year + '</option>');
$('#select-year').val(year);
}
var firstCall = true;
var rows = [];
var today;
async function drawList () {
window.setTimeout(function () {
var list = '';
rows.forEach(function (entry) {
if (entry == null) {
list += '<div><div align="center" class="color-highlight"><b>Heute ist der ' + formatDate('d.m.Y', today) + '</b></div></div>';
} else if (search($('#input-search').val(), entry.keywords)) {
list += entry.content;
}
});
$('#div-regattas').html(list);
}, 0);
}
var siteScript = async function() {
var userid = findGetParameter('user');
var user = null;
if (userid !== null) {
user = await dbGetData('users', userid);
}
if (user === null) {
location.href = LINK_PRE + 'planning_list';
return;
}
$('#p-username').text(user.username);
if (isLoggedIn() && (userid == USER_ID)) {
$('#button-share').show();
$('#button-share').click(function(){
$('#menu-share').showMenu();
});
} else {
$('#button-share').hide();
}
if (firstCall) {
firstCall = false;
initYear();
$('#select-year').change(selectChange);
$('#input-search').on('input', drawList);
}
today = getToday();
var selectedYear = $('#select-year').val();
var minDate = parseDate(selectedYear + '-01-01');
var maxDate = parseDate(selectedYear + '-12-31');
var regattas = await dbGetRegattasRange(minDate, maxDate);
var plannings = await dbGetDataIndex('plannings', 'user', user.id);
for (var i = regattas.length - 1; i >= 0; i --) {
var entry = regattas[i];
var okay = false;
for (p in plannings) {
if (plannings[p].regatta == entry.id) {
regattas[i].planning = plannings[p];
okay = true;
break;
}
}
if (!okay) {
regattas.splice(i, 1);
}
}
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 options = '';
for (id in years) {
var year = years[id]['year'];
options += '<option value="' + year + '">' + year + '</option>';
}
$('#select-year').html(options);
$('#select-year').val(selectedYear);
var count = regattas.length;
if (count > 0) {
if (count == 1) {
$('#p-count').html('Es wurde 1 Regatta gefunden!');
} else {
$('#p-count').html('Es wurden ' + count + ' Regatten gefunden!');
}
$('#div-regattas').show();
$('#input-search').parent().show();
var heute = false;
rows = [];
for (id in regattas) {
var entry = regattas[id];
var club = null;
if (entry['club'] != null)
club = await dbGetData('clubs', entry['club']);
if (entry.planning.steuermann !== null) {
entry.planning.steuermann = (await dbGetData('sailors', entry.planning.steuermann)).name;
}
var crewString = entry.planning.crew.split(',');
entry.planning.crew = [];
for (c in crewString) {
var sailor = await dbGetData('sailors', crewString[c]);
if (sailor !== null) {
entry.planning.crew.push(sailor.name);
}
}
var dateFrom = entry['dateFrom'];
var dateTo = entry['dateTo'];
var row = { keywords: [], content: '' };
row.keywords.push(entry['name']);
if (entry['number'] != null) row.keywords.push(entry['number']);
if (club != null) row.keywords.push(club['kurz'], club['name']);
if (entry.planning.steuermann != null) row.keywords.push(entry.planning.steuermann);
for (c in entry.planning.crew) row.keywords.push(entry.planning.crew[c]);
if (!heute && (today <= dateFrom)) {
rows.push(null);
heute = true;
}
row.content += '<div onclick="onRegattaClicked(' + entry['id'] + ');">';
// ZEILE 1
// Name
row.content += '<div><b>' + (entry['canceled'] == 1 ? '<s>' : '') + entry['name'] + (entry['canceled'] == 1 ? '</s>' : '') + '</b></div>';
// ZEILE 2
row.content += '<div>';
// Number
row.content += '<div>' + ((entry['number'] != null) ? ('# ' + entry['number']) : '') + '</div>';
// Special
row.content += '<div>' + entry['special'] + '</div>';
// Club
row.content += '<div>' + ((club != null) ? club['kurz'] : '') + '</div>';
row.content += '</div>';
// ZEILE 3
row.content += '<div>';
// Date
if (entry['length'] < 1) {
if (formatDate('d.m', dateFrom) == '01.01') {
row.content += '<div><font class="color-red2-dark">Datum noch unklar</font></div>';
} else {
row.content += '<div>' + formatDate("d.m.Y", dateFrom) + ' - <font class="color-red2-dark">Datum nicht final</font></div>';
}
} else {
row.content += '<div>' + formatDate("d.m.Y", dateFrom) + ' - ' + formatDate("d.m.Y", dateTo) + '</div>';
}
// RLF
row.content += '<div>' + parseFloat(entry['rlf']).toFixed(2) + '</div>';
row.content += '</div>';
// ZEILE 4
row.content += '<div></div>';
// ZEILE 5
row.content += '<div>';
row.content += '<div>' + (entry.planning.steuermann !== null ? entry.planning.steuermann : 'noch unklar') + '</div>';
row.content += '</div>';
// ZEILE 6...
for (var i in entry.planning.crew) {
row.content += '<div>';
row.content += '<div>' + entry.planning.crew[i] + '</div>';
row.content += '</div>';
}
row.content += '</div>';
rows.push(row);
}
if (!heute) {
rows.push(null);
}
drawList();
} else {
$('#p-count').html(user.username + ' hat noch keine Regatten in seiner/ihrer Saison-Planung!');
$('#div-regattas').hide();
$('#input-search').parent().hide();
}
hideLoader();
}

View File

@@ -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();
@@ -174,7 +174,19 @@ async function selectChange(callSiteScript = true) {
$('#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();
}
}
}
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(); siteScript();
} }
} }
@@ -190,6 +202,19 @@ function initSelects() {
$('#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,7 +243,7 @@ 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);
} }

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,7 +12,16 @@ 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();
}
}
}
function buttonShowPressed() {
if (typeof siteScript === 'function') {
history.replaceState(null, '', '?year=user&from=' + $('#input-from').val() + "&to=" + $('#input-to').val())
siteScript(); 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);
} }
@@ -160,8 +178,10 @@ var siteScript = async function() {
ms = parseDate(entry['meldungSchluss']); ms = parseDate(entry['meldungSchluss']);
} }
var diff = Math.round((ms - today) / 86400000); var diff = Math.round((ms - today) / 86400000);
if ((ms >= today) && (diff < 7)) { if (ms < today) {
color = ' color-red2-dark'; color = ' color-red2-dark';
} else if (diff < 7) {
color = ' color-yellow2-dark';
} }
} }
} }

View File

@@ -21,8 +21,8 @@ async function onEditYearClick() {
if (xhr.status == 0) { if (xhr.status == 0) {
toastError('Du bist momentan offline.<br>Stelle eine Internetverbindung her, um den Jahrgang zu bearbeiten'); toastError('Du bist momentan offline.<br>Stelle eine Internetverbindung her, um den Jahrgang zu bearbeiten');
} else { } else {
console.log('EditYear: unbekannter Fehler', status, error); log('EditYear: unbekannter Fehler', status, error);
console.log(xhr); log(xhr);
toastError('Ein unbekannter Fehler ist aufgetreten. Bitte versuche es noch einmal', 5000); toastError('Ein unbekannter Fehler ist aufgetreten. Bitte versuche es noch einmal', 5000);
} }
hideLoader(); hideLoader();

View File

@@ -0,0 +1,8 @@
<a href="#" data-trigger-switch="$$html-id;" class="pb-2 $$css-class;">
<i class="fa font-14 $$icon; rounded-s bg-highlight color-white"></i>
<span>$$0;</span>
<div class="custom-control scale-switch ios-switch">
<input type="checkbox" class="ios-input" id="$$html-id;">
<label class="custom-control-label" for="$$html-id;"></label>
</div>
</a>

View File

@@ -1,5 +1,5 @@
<?php <?php
define('PWA_VERSION', '1.6'); define('PWA_VERSION', '1.10.3h2');
?> ?>

View File

@@ -56,15 +56,19 @@ workbox.precaching.precacheAndRoute([
'/manifest.json.php', '/manifest.json.php',
]; ];
$dirsToCache = [ $dirsToCache = [
'/client', '/client/app',
'/client/fonts/css',
'/client/fonts/webfonts',
'/client/images',
'/client/scripts',
'/client/styles',
]; ];
function addDir($path) { function addDir($path) {
global $filesToCache; global $filesToCache;
if ($dir = opendir(__DIR__ . $path)) { if ($dir = opendir(__DIR__ . $path)) {
while (($file = readdir($dir)) !== false) { while (($file = readdir($dir)) !== false) {
if ($file == '.') continue; if (substr($file, 0, 1) == '.') continue;
if ($file == '..') continue;
if (is_dir(__DIR__ . $path . '/' . $file)) { if (is_dir(__DIR__ . $path . '/' . $file)) {
addDir($path . '/' . $file); addDir($path . '/' . $file);
} else { } else {
@@ -109,30 +113,41 @@ workbox.routing.registerRoute(
// DB // DB
var db = null; function openDb() {
return new Promise(function(resolve) {
if (indexedDB) { if (indexedDB) {
var request = indexedDB.open('regatten_app_db_<?php echo BOATCLASS; ?>'); var request = indexedDB.open('regatten_app_db_<?php echo BOATCLASS; ?>');
request.onerror = function (e) { request.onerror = function (e) {
console.log('[sW] Cannot open DB:', e.target.errorCode); console.log('[sW] Cannot open DB:', e.targer.errorCode);
resolve(null);
}; };
request.onupgradeneeded = function (e) { request.onupgradeneeded = function (e) {
console.log('[sW] DB does not exist'); console.log('[sW] DB does not exist');
e.target.transaction.abort(); e.target.transaction.abort();
resolve(null);
}; };
request.onsuccess = function (e) { request.onsuccess = function (e) {
console.log('[sW] DB loaded'); console.log('[sW] DB loaded');
db = e.target.result; var db = e.target.result;
db.onerror = function (e) { db.onerror = function (e) {
console.log('[sW] DB Error:', e) console.log('[sW] DB Error:', e);
}
}; };
resolve(db);
}
} else {
resolve(null);
}
});
} }
function dbSettingsGet(key) { function dbSettingsGet(key) {
return new Promise(function(resolve) { return new Promise(async function(resolve) {
if (db != null) { var db = await openDb();
if (db !== null) {
var request = db.transaction('settings').objectStore('settings').get(key); var request = db.transaction('settings').objectStore('settings').get(key);
request.onsuccess = function (event) { request.onsuccess = function (event) {
db.close();
console.log('[sW] DB closed');
resolve(typeof request.result != 'undefined' ? request.result.value : null); resolve(typeof request.result != 'undefined' ? request.result.value : null);
} }
} else { } else {
@@ -141,10 +156,20 @@ function dbSettingsGet(key) {
}); });
} }
function dbSettingsSet(key, value) { async function dbSettingsSet(key, value) {
var db = await openDb();
if (db != null) { if (db != null) {
var os = db.transaction('settings', 'readwrite').objectStore('settings'); var os = db.transaction('settings', 'readwrite').objectStore('settings');
os.put({ key: key, value: value}); var request = os.put({ key: key, value: value});
request.onerror = function (event) {
console.log('[sW] Error while saving data to DB:', e);
db.close();
console.log('[sW] DB closed');
}
request.onsuccess = function (event) {
db.close();
console.log('[sW] DB closed');
}
} }
} }
@@ -204,6 +229,7 @@ self.addEventListener('push', async function(event) {
case 'meldeschluss': case 'meldeschluss':
if (await dbSettingsGet('notify_channel_<?php echo BOATCLASS; ?>_meldeschluss')) { if (await dbSettingsGet('notify_channel_<?php echo BOATCLASS; ?>_meldeschluss')) {
if (await isMyRegatta(getEntry(data, 'id', ''))) okay = true; if (await isMyRegatta(getEntry(data, 'id', ''))) okay = true;
// TODO: only if not already registered
} }
break; break;
default: default:
@@ -219,7 +245,7 @@ self.addEventListener('push', async function(event) {
data: data, data: data,
body: data.body, body: data.body,
icon: getEntry(data, 'icon', '<?php echo SERVER_ADDR; ?>/client/app/icons/icon-512x512.png'), icon: getEntry(data, 'icon', '<?php echo SERVER_ADDR; ?>/client/app/icons/icon-512x512.png'),
badge: '<?php echo SERVER_ADDR; ?>/client/app/icons/icon-96x96.png', badge: '<?php echo SERVER_ADDR; ?>/client/app/icons/badge-128x128.png',
vibrate: [500,100,500] vibrate: [500,100,500]
}; };
if ((image = getEntry(data, 'image', null)) !== null) { if ((image = getEntry(data, 'image', null)) !== null) {
@@ -227,13 +253,50 @@ self.addEventListener('push', async function(event) {
} }
// Force refresh on next app open // Force refresh on next app open
var db = await openDb();
if (db != null) {
var os = db.transaction('update_times', 'readwrite').objectStore('update_times'); var os = db.transaction('update_times', 'readwrite').objectStore('update_times');
os.put({ table: 'last_sync', time: 0 }); var request = os.put({ table: 'last_sync', time: 0 });
request.onerror = function (event) {
console.log('[sW] Error while saving data to DB:', e);
db.close();
console.log('[sW] DB closed');
}
request.onsuccess = function (event) {
db.close();
console.log('[sW] DB closed');
}
}
console.log('Showing notification'); console.log('Showing notification');
self.registration.showNotification(data.title, options); self.registration.showNotification(data.title, options);
break; break;
case 'forcesync':
// Force refresh on next app open
var db = await openDb();
if (db != null) {
var os = db.transaction('update_times', 'readwrite').objectStore('update_times');
var request = os.put({ table: 'last_sync', time: 0 });
request.onerror = function (event) {
console.log('[sW] Error while saving data to DB:', e);
db.close();
console.log('[sW] DB closed');
} }
request.onsuccess = function (event) {
console.log('[sW] Data successfully saved');
db.close();
console.log('[sW] DB closed');
}
}
break;
default:
console.log('[sW] Push type unknown:', data.type);
break;
}
} else {
console.log('[sW] No push type given!');
} }
}); });
@@ -248,3 +311,16 @@ self.addEventListener('notificationclick', function(event) {
clients.openWindow(url) clients.openWindow(url)
); );
}); });
self.addEventListener('pushsubscriptionchange', function(event) {
var formData = new URLSearchParams();
formData.append('old', JSON.stringify(event.oldSubscription));
formData.append('new', JSON.stringify(event.newSubscription));
event.waitUntil(
fetch('<?php echo QUERY_URL; ?>update_subscription', {
method: 'POST',
cache: 'no-cache',
body: formData
})
);
});