Compare commits
88 Commits
v_1.8
...
error_repo
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0298cefc8b | ||
|
|
15d7060354 | ||
|
|
d38de287dd | ||
|
|
da2beac8d3 | ||
|
|
92a11bcfa5 | ||
|
|
fa4770e12a | ||
|
|
a6f2568753 | ||
|
|
6d0fdea0e8 | ||
|
|
1252c02d7c | ||
|
|
f617fa7923 | ||
|
|
c66dc96598 | ||
|
|
f5d059202e | ||
|
|
5962e1cc90 | ||
|
|
9f3019b4c5 | ||
|
|
326ba4a6bd | ||
|
|
4228ec739d | ||
|
|
a38c48dab4 | ||
|
|
da48e79a36 | ||
|
|
de5abcdfaf | ||
|
|
6b1e35cc14 | ||
|
|
89e24f69b7 | ||
|
|
554b810e85 | ||
|
|
fbd1eaaae8 | ||
|
|
ce42f87227 | ||
|
|
e66f95ff50 | ||
|
|
fcd791ed65 | ||
|
|
439679bbbe | ||
|
|
9a8d6892f2 | ||
|
|
3b71f3d707 | ||
|
|
94c6a42106 | ||
|
|
0c9eb9c013 | ||
|
|
2034e8b659 | ||
|
|
e57bf4a426 | ||
|
|
3c8289d11c | ||
|
|
63de725ebd | ||
|
|
69efb93646 | ||
|
|
6f302d6527 | ||
|
|
bfc2f84f0f | ||
|
|
0660b2b6b3 | ||
|
|
3ee722f6c2 | ||
|
|
0ce58aeacc | ||
|
|
28ba380cca | ||
|
|
357449c1c6 | ||
|
|
e84eaa2562 | ||
|
|
de70522850 | ||
|
|
cf5f71d14e | ||
|
|
775a7bd27a | ||
|
|
34b47e40ab | ||
|
|
32ea581437 | ||
|
|
4106a177f8 | ||
|
|
16ccbca2af | ||
|
|
3fd9beae1e | ||
|
|
01d0ae96f9 | ||
|
|
c211817f78 | ||
|
|
9ff0b96837 | ||
|
|
7a3413b339 | ||
|
|
72ff731694 | ||
|
|
3959b208b5 | ||
|
|
7b500bf67d | ||
|
|
5c8c9db1de | ||
|
|
fa526b11a8 | ||
|
|
2dc2225263 | ||
|
|
fcf9dc9a20 | ||
|
|
203c2534eb | ||
|
|
730dd9112f | ||
|
|
13ceef37d9 | ||
|
|
54852f4383 | ||
|
|
8808d12bf1 | ||
|
|
c6d5450b0e | ||
|
|
15cbe15651 | ||
|
|
cb8a1817ae | ||
|
|
acf51ea71c | ||
|
|
be98511957 | ||
|
|
65608cdd5a | ||
|
|
d0996fa0c3 | ||
|
|
c9a90eb77c | ||
|
|
754cb6f77d | ||
|
|
5e926f3e75 | ||
|
|
138071769c | ||
|
|
26d9d83ba2 | ||
|
|
eaa08ba301 | ||
|
|
760c05286e | ||
|
|
3f676141d7 | ||
|
|
ae9bf02c49 | ||
|
|
c2a482bba1 | ||
|
|
06266b788d | ||
|
|
3db5ae1723 | ||
|
|
b784733b69 |
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -38,6 +38,16 @@ function parseDate(string) {
|
||||
return date;
|
||||
}
|
||||
|
||||
function parseDbTimestamp(string) {
|
||||
var year = string.substr(0, 4);
|
||||
var month = string.substr(5, 2);
|
||||
var day = string.substr(8, 2);
|
||||
var hour = string.substr(11, 2);
|
||||
var minute = string.substr(14, 2);
|
||||
var second = string.substr(17, 2);
|
||||
return new Date(year, month - 1, day, hour, minute, second);
|
||||
}
|
||||
|
||||
function getToday() {
|
||||
var date = new Date();
|
||||
date = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));
|
||||
|
||||
@@ -335,7 +335,7 @@ var mobileConsole = (function () {
|
||||
var elements = {
|
||||
lines: [],
|
||||
acItems: [],
|
||||
base: createElem('div', 'base', {
|
||||
base: createElem('div', 'base page-bg', {
|
||||
boxSizing: 'border-box',
|
||||
position: 'fixed',
|
||||
resize: 'none',
|
||||
@@ -1038,7 +1038,7 @@ var mobileConsole = (function () {
|
||||
function isRepeat(message, method) {
|
||||
return (history.output.prevMsg === message && history.output.prevMethod === method) && (typeof message !== 'object') && (method !== 'trace') && (method !== 'group') && (method !== 'groupCollapsed') && (method !== 'groupEnd');
|
||||
}
|
||||
function newConsole() {
|
||||
function newConsole2() {
|
||||
try {
|
||||
//get arguments, set vars
|
||||
var method = arguments[0], className, isHTMLElement,
|
||||
@@ -1155,6 +1155,8 @@ var mobileConsole = (function () {
|
||||
if (!msgContainer.innerHTML) { return; }
|
||||
leftContainer.appendChild(msgContainer);
|
||||
|
||||
var errorReportEntry = { message: arguments[1].newMessage };
|
||||
|
||||
if (detailTable || stackTable) {
|
||||
setCSS(msgContainer, {cursor : 'pointer'});
|
||||
leftContainer.appendChild(detailTable || stackTable);
|
||||
@@ -1164,8 +1166,18 @@ var mobileConsole = (function () {
|
||||
//populate right side
|
||||
if (stackTrace && typeof stackTrace[stackTrace.length - 1] !== 'undefined') {
|
||||
rightContainer.appendChild(setCSS(getLink(stackTrace[0].url, stackTrace[0].linkText), {color: '#808080'}));
|
||||
errorReportEntry.stack = { caller: stackTrace[0].caller, file: stackTrace[0].url, line: stackTrace[0].line, col: stackTrace[0].col };
|
||||
if ((typeof LINK_PRE !== 'undefined') && (errorReportEntry.stack.file.startsWith(LINK_PRE))) {
|
||||
errorReportEntry.stack.file = errorReportEntry.stack.file.substr(LINK_PRE.length);
|
||||
}
|
||||
var pos = errorReportEntry.stack.file.indexOf('?');
|
||||
if (pos >= 0) {
|
||||
errorReportEntry.stack.file = errorReportEntry.stack.file.substr(0, pos);
|
||||
}
|
||||
}
|
||||
|
||||
if (typeof onConsoleOutput === 'function') onConsoleOutput(errorReportEntry);
|
||||
|
||||
//add to line
|
||||
lineContainer.appendChild(leftContainer);
|
||||
lineContainer.appendChild(rightContainer);
|
||||
@@ -1195,11 +1207,7 @@ var mobileConsole = (function () {
|
||||
}
|
||||
//scroll
|
||||
consoleElement.toggleScroll();
|
||||
//==========================================================
|
||||
//make sure we still call the original method, if applicable (not window.onerror)
|
||||
if (typeof arguments[1].original === 'function') {
|
||||
arguments[1].original.apply(console, arguments[1].originalArguments);
|
||||
}
|
||||
|
||||
} catch (e) {
|
||||
//not logging. why? throw error
|
||||
if (options.browserinfo.isMobile) { alert(e); }
|
||||
@@ -1211,6 +1219,37 @@ var mobileConsole = (function () {
|
||||
}
|
||||
|
||||
}
|
||||
function newConsole() {
|
||||
if (typeof arguments[1].newMessage === 'object') {
|
||||
var args = arguments[1].newMessage.slice();
|
||||
var argString = [];
|
||||
for (var i in args) {
|
||||
if (typeof args[i] === 'object') {
|
||||
if (argString.length > 0) {
|
||||
arguments[1].newMessage = argString.join(' ');
|
||||
newConsole2(...arguments);
|
||||
argString = [];
|
||||
}
|
||||
arguments[1].newMessage = args[i];
|
||||
newConsole2(...arguments);
|
||||
} else {
|
||||
argString.push(args[i]);
|
||||
}
|
||||
}
|
||||
if (argString.length > 0) {
|
||||
arguments[1].newMessage = argString.join(' ');
|
||||
newConsole2(...arguments);
|
||||
argString = [];
|
||||
}
|
||||
} else {
|
||||
newConsole2(...arguments);
|
||||
}
|
||||
//==========================================================
|
||||
//make sure we still call the original method, if applicable (not window.onerror)
|
||||
if (typeof arguments[1].original === 'function') {
|
||||
arguments[1].original.apply(console, arguments[1].originalArguments);
|
||||
}
|
||||
}
|
||||
function interceptConsole(method) {
|
||||
var original = console ? console[method] : missingMethod(), i, stackTraceOrig;
|
||||
if (!console) { console = {}; } //create empty console if we have no console (IE?)
|
||||
@@ -1218,7 +1257,7 @@ var mobileConsole = (function () {
|
||||
var args = Array.prototype.slice.call(arguments);
|
||||
args.original = original;
|
||||
args.originalArguments = arguments;
|
||||
args.newMessage = (method === 'assert') ? [args[0], args[1]] : args[0];
|
||||
//args.newMessage = (method === 'assert') ? [args[0], args[1]] : args[0];
|
||||
//create an Error and get its stack trace and format it
|
||||
try { throw new Error(); } catch (e) { stackTraceOrig = e.stack; }
|
||||
args.newStackTrace = formatStackTrace(args.newStackTrace, stackTraceOrig);
|
||||
@@ -1241,6 +1280,12 @@ var mobileConsole = (function () {
|
||||
return;
|
||||
}
|
||||
//Handle the new console logging
|
||||
args.newMessage = [];
|
||||
var i = 0;
|
||||
while (typeof args[i] !== 'undefined') {
|
||||
args.newMessage.push(args[i]);
|
||||
i ++;
|
||||
}
|
||||
newConsole(method, args);
|
||||
};
|
||||
}
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
<?php
|
||||
|
||||
|
||||
header('Content-Type: text/javascript');
|
||||
|
||||
|
||||
require_once(__DIR__ . '/../../server/version.php');
|
||||
require_once(__DIR__ . '/../../server/config.php');
|
||||
|
||||
|
||||
?>
|
||||
//Loading the Service Worker
|
||||
var swRegistration = null;
|
||||
@@ -16,31 +16,29 @@ if ('serviceWorker' in navigator) {
|
||||
}
|
||||
|
||||
|
||||
$(document).ready(function(){
|
||||
'use strict'
|
||||
|
||||
$(document).ready(function(){
|
||||
'use strict'
|
||||
|
||||
var pwaVersion = '<?php echo PWA_VERSION; ?>'; //must be identical to _manifest.json version. If not it will create update window loop
|
||||
var pwaCookie = true; // if set to false, the PWA prompt will appear even if the user selects "maybe later"
|
||||
var pwaNoCache = false; // always keep the cache clear to serve the freshest possible content
|
||||
|
||||
|
||||
|
||||
|
||||
$('[data-pwa-version]').data('pwa-version', pwaVersion);
|
||||
|
||||
|
||||
|
||||
//Creating Cookie System for PWA Hide
|
||||
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)}
|
||||
|
||||
|
||||
//Enabling dismiss button
|
||||
setTimeout(function(){
|
||||
$('.pwa-dismiss').on('click',function(){
|
||||
console.log('User Closed Add to Home / PWA Prompt')
|
||||
log('[pwa] User Closed Add to Home / PWA Prompt')
|
||||
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');
|
||||
});
|
||||
},1500);
|
||||
|
||||
|
||||
//Detecting Mobile Operating Systems
|
||||
var isMobile = {
|
||||
Android: function() {return navigator.userAgent.match(/Android/i);},
|
||||
@@ -49,37 +47,40 @@ $(document).ready(function(){
|
||||
};
|
||||
var isInWebAppiOS = (window.navigator.standalone == true);
|
||||
var isInWebAppChrome = (window.matchMedia('(display-mode: standalone)').matches);
|
||||
|
||||
//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()) {
|
||||
console.log('Android Detected');
|
||||
log('[pwa] Android Detected');
|
||||
function showInstallPromotion(){
|
||||
if($('#menu-install-pwa-android, .add-to-home').length){
|
||||
console.log('Triggering PWA Menu for Android');
|
||||
log('[pwa] Triggering PWA Menu for Android');
|
||||
if (!readCookie('Sticky_pwa_rejected_install')) {
|
||||
setTimeout(function(){
|
||||
$('.add-to-home').addClass('add-to-home-visible add-to-home-android');
|
||||
$('#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;
|
||||
window.addEventListener('beforeinstallprompt', (e) => {
|
||||
e.preventDefault();
|
||||
deferredPrompt = e;
|
||||
showInstallPromotion();
|
||||
var welcomActive = $('#menu-welcome').hasClass('menu-active');
|
||||
if (welcomActive) {
|
||||
$('#menu-welcome-a-okay').click(showInstallPromotion);
|
||||
} else {
|
||||
showInstallPromotion();
|
||||
}
|
||||
});
|
||||
$('.pwa-install').on('click',function(e){
|
||||
deferredPrompt.prompt();
|
||||
deferredPrompt.userChoice
|
||||
.then((choiceResult) => {
|
||||
if (choiceResult.outcome === 'accepted') {
|
||||
console.log('User accepted the A2HS prompt');
|
||||
log('[pwa] User accepted the A2HS prompt');
|
||||
} else {
|
||||
console.log('User dismissed the A2HS prompt');
|
||||
log('[pwa] User dismissed the A2HS prompt');
|
||||
}
|
||||
deferredPrompt = null;
|
||||
});
|
||||
@@ -87,112 +88,36 @@ $(document).ready(function(){
|
||||
window.addEventListener('appinstalled', (evt) => {
|
||||
$('#menu-install-pwa-android, .menu-hider').removeClass('menu-active')
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (isMobile.iOS()) {
|
||||
if(!isInWebAppiOS){
|
||||
console.log('iOS Detected');
|
||||
log('[pwa] iOS Detected');
|
||||
if($('#menu-install-pwa-ios, .add-to-home').length){
|
||||
if (!readCookie('Sticky_pwa_rejected_install')) {
|
||||
console.log('Triggering PWA / Add to Home Screen Menu for iOS');
|
||||
setTimeout(function(){
|
||||
$('.add-to-home').addClass('add-to-home-visible add-to-home-ios');
|
||||
$('#menu-install-pwa-ios, .menu-hider').addClass('menu-active');
|
||||
},4500);
|
||||
setTimeout(function(){
|
||||
function triggerPwaInstallIos() {
|
||||
log('[pwa] Triggering PWA / Add to Home Screen Menu for iOS');
|
||||
$('.add-to-home').addClass('add-to-home-visible add-to-home-ios');
|
||||
$('#menu-install-pwa-ios, .menu-hider').addClass('menu-active');
|
||||
}
|
||||
var welcomActive = $('#menu-welcome').hasClass('menu-active');
|
||||
if (welcomActive) {
|
||||
$('#menu-welcome-a-okay').click(triggerPwaInstallIos);
|
||||
} else {
|
||||
triggerPwaInstallIos();
|
||||
}
|
||||
},3000);
|
||||
};
|
||||
} else {
|
||||
console.log('The div #menu-install-pwa-ios was not found. Please add this div to show the install window')
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//Creating Update Modal
|
||||
function updateModal(){
|
||||
var body = $('body');
|
||||
var updateModal = $('#menu-update');
|
||||
var mt = new Date();
|
||||
var menuUpdate = mt.getHours() + ":" + mt.getMinutes() + ":" + mt.getSeconds();
|
||||
if(!updateModal.length){
|
||||
body.append('<div id="menu-update"></div>');
|
||||
setTimeout(function(){
|
||||
body.find('#menu-update').load('menu-update.html?ver='+menuUpdate);
|
||||
},250);
|
||||
}
|
||||
};
|
||||
//Update Version in 5 Seconds After New Version Detected
|
||||
function updateButton(){
|
||||
var counter = 3;
|
||||
var interval = setInterval(function() {
|
||||
counter--;
|
||||
console.log(counter);
|
||||
$('.page-update').html('Aktuallisierung in ... '+ counter + ' Sekunden');
|
||||
if (counter == 0) {
|
||||
clearInterval(interval);
|
||||
window.location.reload(true)
|
||||
}
|
||||
}, 1000);
|
||||
caches.delete('workbox-runtime').then(function() {
|
||||
console.log('Content Updated - Cache Removed!');
|
||||
});
|
||||
//localStorage.clear();
|
||||
sessionStorage.clear()
|
||||
caches.keys().then(cacheNames => {
|
||||
cacheNames.forEach(cacheName => {
|
||||
caches.delete(cacheName);
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
//Check Version
|
||||
function check_version(){
|
||||
if($('link[data-pwa-version]').length){
|
||||
function versionCheck(){
|
||||
var dt = new Date();
|
||||
var maniTimeVersion = dt.getHours() + ":" + dt.getMinutes() + ":" + dt.getSeconds();
|
||||
var localVersionNumber = $('link[rel="manifest"]').data('pwa-version');
|
||||
var onlineVersionJSON = "<?php echo SERVER_ADDR; ?>/manifest.json.php?ver=" + maniTimeVersion;
|
||||
var onlineVersionNumber = "Connection Offline. Waiting to Reconect";
|
||||
$.getJSON(onlineVersionJSON, function(onlineData) {onlineVersionNumber = onlineData.version;});
|
||||
setTimeout(function(){
|
||||
//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"){
|
||||
updateModal();
|
||||
console.log('New Version of Content Available. Refreshing. On Desktop Browsers a manual refresh maybe required.')
|
||||
setTimeout(function(){
|
||||
$('body').find('#menu-update').addClass('menu-active');
|
||||
$('.menu-hider').addClass('menu-active-no-click');
|
||||
updateButton();
|
||||
},500);
|
||||
}
|
||||
if(onlineVersionNumber == localVersionNumber){/*No update required. Versions Identical*/}
|
||||
if(onlineVersionNumber === "undefined"){/*Error Checking for Updates*/}
|
||||
if(onlineVersionNumber === "Finding Online Version..."){
|
||||
$('.reloadme').addClass('disabled');
|
||||
$('body').find('#menu-update').removeClass('menu-active');
|
||||
$('.menu-hider').removeClass('menu-active-no-click');
|
||||
}
|
||||
},3000);
|
||||
}
|
||||
//Checking for new version every 60 seconds
|
||||
setInterval(function(){versionCheck()}, 50000);
|
||||
//Initial Load Version Check in 10 Second After Load
|
||||
setTimeout(function(){versionCheck();}, 10000);
|
||||
}
|
||||
}
|
||||
|
||||
if(pwaCookie == false){
|
||||
eraseCookie('Sticky_pwa_rejected_install');
|
||||
}
|
||||
|
||||
//Reload To Clear Button
|
||||
//Reload To Clear Button
|
||||
$('body').on('click', '.page-update, .reloadme', function() {
|
||||
location.reload();
|
||||
});
|
||||
|
||||
//Check for Version Change if Online If not Kill the Function
|
||||
if (navigator.onLine) {check_version();} else {function check_version(){}}
|
||||
|
||||
|
||||
//Adding Offline Alerts
|
||||
var offlineAlerts = $('.offline-message');
|
||||
|
||||
@@ -200,62 +125,34 @@ $(document).ready(function(){
|
||||
$('body').append('<p class="offline-message bg-red2-dark color-white center-text uppercase ultrabold">' + strings['inetMsgOffline'] + '</p>');
|
||||
$('body').append('<p class="online-message bg-green1-dark color-white center-text uppercase ultrabold">' + strings['inetMsgOnline'] + '</p>');
|
||||
}
|
||||
|
||||
|
||||
//Offline Function Show
|
||||
function isOffline(){
|
||||
$('.offline-message').addClass('offline-message-active');
|
||||
$('.online-message').removeClass('online-message-active');
|
||||
setTimeout(function(){$('.offline-message').removeClass('offline-message-active');},2000);
|
||||
}
|
||||
|
||||
|
||||
//Online Function Show
|
||||
function isOnline(){
|
||||
$('.online-message').addClass('online-message-active');
|
||||
$('.offline-message').removeClass('offline-message-active');
|
||||
setTimeout(function(){$('.online-message').removeClass('online-message-active');},2000);
|
||||
}
|
||||
|
||||
$('.simulate-offline').on('click',function(){isOffline();})
|
||||
$('.simulate-online').on('click',function(){isOnline();})
|
||||
|
||||
//Disable links to other pages if offline.
|
||||
//Warning! Enabling offline for iOS can cause issues
|
||||
//To allow offline functionality delete the next 7 lines
|
||||
function returnFalse(){
|
||||
var detectHREF = $(this).attr('href');
|
||||
if(detectHREF.match(/.html/)){
|
||||
isOffline();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//Check if Online / Offline
|
||||
function updateOnlineStatus(event) {
|
||||
var condition = navigator.onLine ? "online" : "offline";
|
||||
isOnline();
|
||||
console.log( 'Connection: Online');
|
||||
$("a").off( "click", returnFalse );
|
||||
log('[pwa] Connection: Online');
|
||||
}
|
||||
function updateOfflineStatus(event) {
|
||||
isOffline();
|
||||
$("a").on( "click", returnFalse );
|
||||
console.log( 'Connection: Offline');
|
||||
log('[pwa] Connection: Offline');
|
||||
}
|
||||
window.addEventListener('online', updateOnlineStatus);
|
||||
window.addEventListener('offline', updateOfflineStatus);
|
||||
|
||||
|
||||
if(pwaNoCache == true){
|
||||
caches.delete('workbox-runtime').then(function() {
|
||||
});
|
||||
localStorage.clear();
|
||||
sessionStorage.clear()
|
||||
caches.keys().then(cacheNames => {
|
||||
cacheNames.forEach(cacheName => {
|
||||
caches.delete(cacheName);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
});
|
||||
|
||||
|
||||
|
||||
});
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
header('Content-Type: text/javascript');
|
||||
|
||||
require_once(__DIR__ . '/../../server/config.php');
|
||||
require_once(__DIR__ . '/../../server/version.php');
|
||||
|
||||
?>
|
||||
|
||||
@@ -13,6 +14,44 @@ const YOUTH_AGE = '<?php echo $_CLASS['youth-age']; ?>';
|
||||
const YOUTH_GERMAN_NAME = '<?php echo $_CLASS['youth-german-name']; ?>';
|
||||
const PUSH_SERVER_KEY = '<?php echo PUSH_SERVER_KEY; ?>';
|
||||
|
||||
var consoleOutput = [];
|
||||
|
||||
function onConsoleOutput(entry) {
|
||||
consoleOutput.push(entry);
|
||||
}
|
||||
|
||||
window.onerror = function(message, source, lineno, colno, errorError) {
|
||||
if (source.startsWith(LINK_PRE)) {
|
||||
source = source.substr(LINK_PRE.length);
|
||||
}
|
||||
var pos = source.indexOf('?');
|
||||
if (pos >= 0) {
|
||||
source = source.substr(0, pos);
|
||||
}
|
||||
consoleOutput.push({
|
||||
message: message,
|
||||
stack: {
|
||||
caller: '',
|
||||
file: source,
|
||||
line: lineno,
|
||||
col: colno
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
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 badges = {
|
||||
@@ -118,6 +157,47 @@ function findGetParameter(parameterName) {
|
||||
return result;
|
||||
}
|
||||
|
||||
var signup = function() {
|
||||
var username = $('#input-signup-username').val();
|
||||
var email = $('#input-signup-email').val();
|
||||
var password = $('#input-signup-password').val();
|
||||
if (username == '') { $('#input-signup-username').focus(); return; }
|
||||
if (email == '') { $('#input-signup-email').focus(); return; }
|
||||
if (password == '') { $('#input-signup-password').focus(); return; }
|
||||
showLoader();
|
||||
$('#input-signup-username').val('').trigger('focusin').trigger('focusout');
|
||||
$('#input-signup-email').val('').trigger('focusin').trigger('focusout');
|
||||
$('#input-signup-password').val('').trigger('focusin').trigger('focusout');
|
||||
$.ajax({
|
||||
url: QUERY_URL + 'signup',
|
||||
method: 'POST',
|
||||
data: {
|
||||
username: username,
|
||||
email: email,
|
||||
password: password
|
||||
},
|
||||
error: function (xhr, status, error) {
|
||||
if (xhr.status == 409) {
|
||||
toastError('Benutzername bereits vergeben');
|
||||
$('#input-signup-email').val(email).trigger('focusin').trigger('focusout');
|
||||
} else if (xhr.status == 0) {
|
||||
toastError('Du bist momentan offline.<br>Stelle eine Internetverbindung her, um Dich anzumelden');
|
||||
$('#menu-signup').hideMenu();
|
||||
} else {
|
||||
log('[app] Signup: unbekannter Fehler', status, error);
|
||||
log(xhr);
|
||||
toastError('Ein unbekannter Fehler ist aufgetreten. Bitte versuche es noch einmal', 5000);
|
||||
}
|
||||
hideLoader();
|
||||
},
|
||||
success: function (data, status, xhr) {
|
||||
$('#input-login-username').val(username);
|
||||
$('#input-login-password').val(password);
|
||||
login();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
var login = function() {
|
||||
showLoader();
|
||||
var username = $('#input-login-username').val();
|
||||
@@ -140,8 +220,8 @@ var login = function() {
|
||||
toastError('Du bist momentan offline.<br>Stelle eine Internetverbindung her, um Dich anzumelden');
|
||||
$('#menu-login').hideMenu();
|
||||
} else {
|
||||
console.log('Login: unbekannter Fehler', status, error);
|
||||
console.log(xhr);
|
||||
log('[app] Login: unbekannter Fehler', status, error);
|
||||
log(xhr);
|
||||
toastError('Ein unbekannter Fehler ist aufgetreten. Bitte versuche es noch einmal', 5000);
|
||||
}
|
||||
hideLoader();
|
||||
@@ -173,7 +253,7 @@ var logout = function() {
|
||||
hash: localStorage.getItem('auth_hash')
|
||||
}
|
||||
if ((auth.id === null) || (auth.hash === null)) {
|
||||
console.log('Not logged in');
|
||||
log('[app] Not logged in');
|
||||
logoutClearStorage();
|
||||
return;
|
||||
}
|
||||
@@ -185,14 +265,14 @@ var logout = function() {
|
||||
},
|
||||
error: function (xhr, status, error) {
|
||||
if (xhr.status == 401) {
|
||||
console.log('Not logged in');
|
||||
log('[app] Not logged in');
|
||||
logoutClearStorage();
|
||||
} else if (xhr.status == 0) {
|
||||
console.log('Could not delete auth from server');
|
||||
log('[app] Could not delete auth from server');
|
||||
logoutClearStorage();
|
||||
} else {
|
||||
console.log('Logout: unbekannter Fehler', status, error);
|
||||
console.log(xhr);
|
||||
log('[app] Logout: unbekannter Fehler', status, error);
|
||||
log(xhr);
|
||||
toastError('Ein unbekannter Fehler ist aufgetreten. Bitte versuche es noch einmal', 5000);
|
||||
hideLoader();
|
||||
}
|
||||
@@ -209,12 +289,12 @@ function deleteDb() {
|
||||
showLoader();
|
||||
var request = window.indexedDB.deleteDatabase('regatten_app_db_' + BOATCLASS);
|
||||
request.onerror = function (event) {
|
||||
console.log('Cannot delete DB: ', event.target.errorCode);
|
||||
log('[app] Cannot delete DB: ', event.target.errorCode);
|
||||
toastError('Beim Löschen der Datenbank ist ein Fehler aufgetreten.<br>Bitte melde diesen Fehler. (Dev-Menu => Problem melden)', 5000);
|
||||
hideLoader();
|
||||
}
|
||||
request.onsuccess = function (event) {
|
||||
console.log('DB deleted');
|
||||
log('[app] 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);
|
||||
@@ -228,13 +308,13 @@ function deleteCache() {
|
||||
$('#menu-developer').hideMenu();
|
||||
navigator.serviceWorker.getRegistrations().then(function (registrations) {
|
||||
for (let registration of registrations) {
|
||||
console.log('Unregister sW:', registration);
|
||||
log('[app] Unregister sW:', registration);
|
||||
registration.unregister();
|
||||
}
|
||||
});
|
||||
caches.keys().then((keyList) => {
|
||||
return Promise.all(keyList.map((key) => {
|
||||
console.log('Cache deleted:', key);
|
||||
log('[app] Cache deleted:', key);
|
||||
return caches.delete(key);
|
||||
}));
|
||||
});
|
||||
@@ -260,7 +340,7 @@ function urlB64ToUint8Array(base64String) {
|
||||
}
|
||||
|
||||
function pushesSubscribe() {
|
||||
console.log('Subscribing');
|
||||
log('[app] Subscribing');
|
||||
const applicationServerKey = urlB64ToUint8Array(PUSH_SERVER_KEY);
|
||||
swRegistration.pushManager.subscribe({
|
||||
userVisibleOnly: true,
|
||||
@@ -272,14 +352,14 @@ function pushesSubscribe() {
|
||||
updatePushBadge();
|
||||
})
|
||||
.catch(function(err) {
|
||||
console.log('Failed to subscribe the user: ', err);
|
||||
log('[app] 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);
|
||||
pushesUnSubscribe(true);
|
||||
});
|
||||
}
|
||||
|
||||
function pushesUnSubscribe(silent = false) {
|
||||
console.log('Unsubscribing');
|
||||
log('[app] Unsubscribing');
|
||||
swRegistration.pushManager.getSubscription()
|
||||
.then(function(subscription) {
|
||||
if (subscription) {
|
||||
@@ -291,7 +371,7 @@ function pushesUnSubscribe(silent = false) {
|
||||
}
|
||||
})
|
||||
.catch(function(error) {
|
||||
console.log('Error unsubscribing', error);
|
||||
log('[app] Error unsubscribing', error);
|
||||
$('#menu-pushes').hideMenu();
|
||||
if (!silent) toastError('Da ist leider etwas schief gelaufen. Bitte versuche es erneut oder wende Dich an unseren Support.', 5000);
|
||||
updatePushBadge();
|
||||
@@ -300,7 +380,7 @@ function pushesUnSubscribe(silent = false) {
|
||||
}
|
||||
|
||||
function pushesUpdateServerSubscription(subscription, enabled) {
|
||||
console.log('updateServer', enabled, subscription);
|
||||
log('[app] updateServer', enabled, subscription);
|
||||
$.ajax({
|
||||
url: QUERY_URL + (enabled ? 'add' : 'remove') + '_subscription',
|
||||
type: 'POST',
|
||||
@@ -393,6 +473,7 @@ function pushesOpenMenu() {
|
||||
}
|
||||
|
||||
function updatePushBadge() {
|
||||
if (typeof onUpdatePushBadge === 'function') onUpdatePushBadge();
|
||||
if (!pushesPossible) return;
|
||||
if (Notification.permission == 'denied') {
|
||||
$('#badge-pushes').removeClass('bg-green2-dark').addClass('bg-red2-dark').text('BLOCKED');
|
||||
@@ -416,7 +497,7 @@ async function updateNewsBadge() {
|
||||
var sum = 0;
|
||||
for (var n in news) {
|
||||
var newsEntry = news[n];
|
||||
newsEntry.date = new Date(Date.parse(newsEntry.date));
|
||||
newsEntry.date = parseDbTimestamp(newsEntry.date);
|
||||
if (newsEntry.date > now) continue;
|
||||
if (newsEntry.date < newsRead) continue;
|
||||
sum ++;
|
||||
@@ -427,8 +508,12 @@ async function updateNewsBadge() {
|
||||
var initRegatten = function() {
|
||||
showLoader();
|
||||
|
||||
log('[app] Initializing DB...');
|
||||
|
||||
initDatabase();
|
||||
|
||||
log('[app] Loading app specific code...');
|
||||
|
||||
if (isLoggedIn()) {
|
||||
$('.show-loggedin').show();
|
||||
$('.show-notloggedin').hide();
|
||||
@@ -448,7 +533,8 @@ var initRegatten = function() {
|
||||
}
|
||||
|
||||
var onServiceWorkerLoaded = function() {
|
||||
if ((swRegistration !== null) && canUseLocalDB) {
|
||||
log('[app] sW loaded');
|
||||
if ((swRegistration !== null) && (swRegistration.pushManager) && canUseLocalDB) {
|
||||
pushesPossible = true;
|
||||
updatePushBadge();
|
||||
} else {
|
||||
@@ -457,6 +543,21 @@ var onServiceWorkerLoaded = function() {
|
||||
}
|
||||
|
||||
var onDatabaseLoaded = function() {
|
||||
log('[app] DB loaded');
|
||||
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();
|
||||
initPushSettings();
|
||||
|
||||
@@ -472,19 +573,39 @@ var addConsoleOpenerToPreloader = function() {
|
||||
addConsoleOpenerToPreloader = function(){};
|
||||
var preloader = document.getElementById('preloader');
|
||||
var button = document.createElement('a');
|
||||
button.id = 'button-show-console';
|
||||
button.href = '#';
|
||||
button.classList = 'btn btn-full rounded-s text-uppercase font-900 shadow-m bg-highlight m-3';
|
||||
button.classList = 'btn rounded-s text-uppercase font-900 shadow-m m-3 bg-red2-dark bg-white';
|
||||
button.style.position = 'fixed';
|
||||
button.style.bottom = 0;
|
||||
button.style.left = 0;
|
||||
button.style.right = 0;
|
||||
button.innerHTML = 'Show Console';
|
||||
button.innerHTML = 'Fehlerbericht senden';
|
||||
button.onclick = function(){
|
||||
mobileConsole.displayConsole();
|
||||
alert('FEHLERBERICHT\nEs wird jetzt ein Fehlerbericht an die Entwickler geschickt.\nBitte stelle sicher, dass Du mit dem Internet verbunden bist und drücke dann auf OK.');
|
||||
$.ajax({
|
||||
url: QUERY_URL + 'error_report',
|
||||
method: 'POST',
|
||||
data: {
|
||||
errors: consoleOutput,
|
||||
device: navigator.userAgent,
|
||||
version: '<?php echo PWA_VERSION; ?>'
|
||||
},
|
||||
error: function (xhr, status, error) {
|
||||
if (xhr.status == 0) {
|
||||
alert('Du bist momentan offline.<br>Stelle eine Internetverbindung her, um den Fehlerbericht zu senden');
|
||||
} else {
|
||||
alert('Beim Senden ist ein unbekannter Fehler aufgetreten. Bitte versuche es noch einmal');
|
||||
}
|
||||
},
|
||||
success: function (data, status, xhr) {
|
||||
alert('Wir leiten Dich jetzt zum erstellten Fehlerbericht um, sodass Du ggf. weitere Informationen ergänzen kannst.');
|
||||
location.href = 'https://github.com/ostertun/RegattenApp/issues/' + data.issueNumber;
|
||||
}
|
||||
});
|
||||
return false;
|
||||
}
|
||||
setTimeout(function(){
|
||||
preloader.appendChild(button);
|
||||
}, 5000);
|
||||
preloader.appendChild(button);
|
||||
$(button).hide();
|
||||
}
|
||||
addConsoleOpenerToPreloader();
|
||||
|
||||
@@ -194,4 +194,4 @@ blockquote {
|
||||
-ms-animation: fa-blink .75s linear infinite;
|
||||
-o-animation: fa-blink .75s linear infinite;
|
||||
animation: fa-blink .75s linear infinite;
|
||||
}
|
||||
}
|
||||
|
||||
13
server/content/go2url.php
Normal file
13
server/content/go2url.php
Normal 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ürze zur gewünschten Website weiter</p>';
|
||||
|
||||
$sp['output'] .= $tpl->load('card', [$content, 'html-id' => 'card-title']);
|
||||
|
||||
$sp['scripts'] .= $scripts->load('go2url');
|
||||
|
||||
?>
|
||||
@@ -1,61 +1,72 @@
|
||||
<?php
|
||||
|
||||
|
||||
$sp['title'] = 'Startseite - Regatten.net ' . $_CLASS['name'];
|
||||
$sp['activenav'] = 1;
|
||||
|
||||
|
||||
// Title
|
||||
$content = "<h1>$_CLASS[name]</h1>";
|
||||
$content .= "<p>$_CLASS[desc]</p>";
|
||||
|
||||
|
||||
$sp['output'] .= $tpl->load('card', [$content]);
|
||||
|
||||
|
||||
// Favorites
|
||||
$content = '<h2>Deine Favoriten</h2>';
|
||||
$thead = '<tr><th>Segler</th><th id="th-ranking">Rangliste</th></tr>';
|
||||
$content .= $tpl->load('table', [$thead, 'html-id' => 'table-favorites', 'css-class' => 'mb-0 mt-3']);
|
||||
$content .= '<div id="div-favorites" class="normal-list mb-0"></div>';
|
||||
$content .= '<p id="p-favorites" class="mt-3">';
|
||||
$content .= 'Du folgst <b>keinen</b> Seglern.<br>';
|
||||
$content .= 'Um jemandem zu folgen, gehe zur <a href="' . LINK_PRE . 'sailors">Segler-Liste</a> und wähle bis zu fünf Segler aus.';
|
||||
$content .= '</p>';
|
||||
|
||||
|
||||
$sp['output'] .= $tpl->load('card', [$content, 'html-id' => 'card-favorites']);
|
||||
|
||||
|
||||
// Planning next
|
||||
$content = '<h2>Deine nächsten Regatten</h2>';
|
||||
$content .= '<div id="div-yournext" class="regattas-list mb-0"></div>';
|
||||
$content .= '<p id="p-yournext" class="mt-3">';
|
||||
$content .= 'Du fährst in den nächsten vier Wochen auf keine Regatta!';
|
||||
$content .= '</p>';
|
||||
|
||||
|
||||
$sp['output'] .= $tpl->load('card', [$content, 'html-id' => 'card-yournext']);
|
||||
|
||||
|
||||
// Not logged in
|
||||
$content = '<h2>Nicht angemeldet</h2>';
|
||||
$content .= '<p class="mt-3">';
|
||||
$content .= 'Um alle Funktionen dieser Seite nutzen zu können, <a href="#" data-menu="menu-login">logge Dich bitte ein</a>.<br>';
|
||||
$content .= 'Solltest Du noch kein Benutzerkonto haben, kannst Du Dich kostenlos <a href="#" data-menu="menu-signup">registrieren</a>.';
|
||||
$content .= '</p>';
|
||||
|
||||
|
||||
$sp['output'] .= $tpl->load('card', [$content, 'html-id' => 'card-notloggedin']);
|
||||
|
||||
|
||||
// Notification Info
|
||||
$content = '<h2 class="color-white">Push-Benachrichtigungen</h2>';
|
||||
$content .= '<p class="mt-3 mb-3 color-white">';
|
||||
$content .= '<b>Bleibe immer auf dem Laufendem!</b><br>';
|
||||
$content .= 'Aktiviere einfach unsere Push-Benachrichtigungen und wir informieren Dich über alle Änderungen.<br>';
|
||||
$content .= 'Du bestimmst natürlich, welche Benachrichtigungen Du bekommen möchtest.';
|
||||
$content .= '</p>';
|
||||
$content .= $tpl->load('button', ['Jetzt aktivieren', '#', 'html-id' => 'button-notifications-activate', 'css-class' => 'bg-green2-dark']);
|
||||
$content .= '<p class="text-center mt-3"><a id="a-notifications-later" class="color-grey2-light text-uppercase font-900">Vielleicht später</a></p>';
|
||||
|
||||
$sp['output'] .= $tpl->load('card', [$content, 'html-id' => 'card-notifications', 'css-class' => 'bg-blue2-dark']);
|
||||
|
||||
// Next
|
||||
$content = '<h2>Nächste Regatten</h2>';
|
||||
$content .= '<div id="div-next" class="regattas-list mb-0"></div>';
|
||||
$content .= '<p id="p-next" class="mt-3">';
|
||||
$content .= 'Keine Regatten in den nächsten zwei Wochen!';
|
||||
$content .= '</p>';
|
||||
|
||||
|
||||
$sp['output'] .= $tpl->load('card', [$content, 'html-id' => 'card-next']);
|
||||
|
||||
|
||||
// Last
|
||||
$content = '<h2>Letzte Regatten</h2>';
|
||||
$content .= '<div id="div-last" class="regattas-list mb-0"></div>';
|
||||
$content .= '<p id="p-last" class="mt-3">';
|
||||
$content .= 'Keine Regatten in den letzten zwei Wochen!';
|
||||
$content .= '</p>';
|
||||
|
||||
|
||||
$sp['output'] .= $tpl->load('card', [$content, 'html-id' => 'card-last']);
|
||||
|
||||
|
||||
// Calendar
|
||||
$content = '<h2>Regatta-Kalender</h2>';
|
||||
$content .= '<p>Du willst alle Regatta-Termine in deinem Kalender, aber nicht alles abtippen?<br>Kein Problem! Abonniere einfach unseren ics-Kalender.</p>';
|
||||
@@ -65,9 +76,9 @@
|
||||
$content .= '</p>';
|
||||
$content .= $tpl->load('button', ['<i class="fas fa-calendar-alt"></i> Regatta-Kalender', 'https://regatten.net/client/calendar/' . BOATCLASS . '/everything.ics', 'css-class' => 'mb-2']);
|
||||
$content .= $tpl->load('button', ['<i class="fas fa-calendar-alt"></i> Kalender für <font class="replace-username"></font>', 'https://regatten.net/client/calendar/' . BOATCLASS . '/user_%USERID%.ics', 'css-class' => 'show-loggedin replace-userid-href']);
|
||||
|
||||
|
||||
$sp['output'] .= $tpl->load('card', [$content]);
|
||||
|
||||
|
||||
// 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']);
|
||||
@@ -78,8 +89,12 @@
|
||||
$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]);
|
||||
|
||||
|
||||
// Favorites Menu
|
||||
$items = $tpl->load('menu/item-icon', ['Nicht mehr folgen', '#', 'html-id' => 'menu-item-unfollow', 'icon' => 'fa-heart', 'css-class' => ' border-0']);
|
||||
$sp['menus'] .= $tpl->load('menu/bottom', [$items, 'html-id' => 'menu-favorite', 'title' => 'Favorit', 'height' => 200]);
|
||||
|
||||
$sp['scripts'] .= $scripts->load('onRegattaClicked');
|
||||
$sp['scripts'] .= $scripts->load('index');
|
||||
|
||||
?>
|
||||
|
||||
?>
|
||||
|
||||
@@ -1,22 +1,28 @@
|
||||
<?php
|
||||
|
||||
|
||||
$sp['title'] = 'News - Regatten.net ' . $_CLASS['name'];
|
||||
$sp['backbutton'] = true;
|
||||
$sp['activenav'] = 5;
|
||||
|
||||
|
||||
// Title
|
||||
$content = "<h1>Neuigkeiten</h1>";
|
||||
$content .= '<p>Aktuelles der letzten zwölf Monate</p>';
|
||||
|
||||
|
||||
$sp['output'] .= $tpl->load('card', [$content]);
|
||||
|
||||
|
||||
$sp['output'] .= '<div id="news-entries"></div>';
|
||||
|
||||
// Pagination
|
||||
$sp['output'] .= $tpl->load('pagination', ['html-id' => 'pagination']);
|
||||
|
||||
// Menu
|
||||
$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 = str_replace("\n", '', $cardTemplate);
|
||||
$cardTemplate = str_replace("\r", '', $cardTemplate);
|
||||
$sp['scripts'] .= "<script>const cardTemplate = '" . $cardTemplate . "';</script>";
|
||||
$sp['scripts'] .= $scripts->load('news');
|
||||
|
||||
?>
|
||||
|
||||
?>
|
||||
|
||||
@@ -1,19 +1,49 @@
|
||||
<?php
|
||||
|
||||
// TODO: Create site
|
||||
|
||||
$sp['title'] = 'Seite noch nicht unterstuuml;tzt - Regatten.net ' . $_CLASS['name'];
|
||||
$sp['backbutton'] = true;
|
||||
|
||||
$content = $tpl->load('error', ['404', 'Seite existiert noch nicht']);
|
||||
$content .= '<p>';
|
||||
$content .= 'Die gesuchte Seite ist leider noch nicht verfügbar.<br>';
|
||||
$content .= 'Wir arbeiten daran, sie schnellstmöglich zur Verfügung zu stellen.<br>';
|
||||
$content .= 'Wie wä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']);
|
||||
|
||||
?>
|
||||
|
||||
$sp['title'] = 'Saison-Planung - Regatten.net ' . $_CLASS['name'];
|
||||
$sp['backbutton'] = 'index';
|
||||
$sp['activenav'] = 5;
|
||||
|
||||
// Title
|
||||
$content = '<h1>Saison-Planung</h1>';
|
||||
$content .= $tpl->load('button', ['<i class="fas fa-list"></i> Saison-Planungen anderer', LINK_PRE . 'planning_list', 'css-class' => 'mt-2 mb-2']);
|
||||
$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> bearbeiten', LINK_PRE . 'planning_edit']);
|
||||
$content .= $tpl->load('select', ['html-id' => 'select-year', 'placeholder' => 'Jahr', 'css-class' => 'mt-3 mb-0']);
|
||||
|
||||
$sp['output'] .= $tpl->load('card', [$content, 'css-class' => 'show-loggedin']);
|
||||
|
||||
// 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');
|
||||
|
||||
?>
|
||||
|
||||
@@ -1,19 +1,31 @@
|
||||
<?php
|
||||
|
||||
// TODO: Create site
|
||||
|
||||
$sp['title'] = 'Seite noch nicht unterstuuml;tzt - Regatten.net ' . $_CLASS['name'];
|
||||
$sp['backbutton'] = true;
|
||||
|
||||
$content = $tpl->load('error', ['404', 'Seite existiert noch nicht']);
|
||||
$content .= '<p>';
|
||||
$content .= 'Die gesuchte Seite ist leider noch nicht verfügbar.<br>';
|
||||
$content .= 'Wir arbeiten daran, sie schnellstmöglich zur Verfügung zu stellen.<br>';
|
||||
$content .= 'Wie wä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']);
|
||||
|
||||
?>
|
||||
|
||||
$sp['title'] = 'Saison-Planung bearbeiten - Regatten.net ' . $_CLASS['name'];
|
||||
$sp['backbutton'] = 'planning';
|
||||
$sp['activenav'] = 5;
|
||||
|
||||
// Title, Inputs
|
||||
$content = "<h1>Saison-Planung bearbeiten</h1>";
|
||||
$content .= $tpl->load('select', ['html-id' => 'select-year', 'placeholder' => 'Jahr', 'css-class' => 'mt-3 mb-0']);
|
||||
|
||||
$sp['output'] .= $tpl->load('card', [$content]);
|
||||
|
||||
// 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');
|
||||
|
||||
?>
|
||||
|
||||
@@ -1,19 +1,27 @@
|
||||
<?php
|
||||
|
||||
// TODO: Create site
|
||||
|
||||
$sp['title'] = 'Seite noch nicht unterstuuml;tzt - Regatten.net ' . $_CLASS['name'];
|
||||
$sp['backbutton'] = true;
|
||||
|
||||
$content = $tpl->load('error', ['404', 'Seite existiert noch nicht']);
|
||||
$content .= '<p>';
|
||||
$content .= 'Die gesuchte Seite ist leider noch nicht verfügbar.<br>';
|
||||
$content .= 'Wir arbeiten daran, sie schnellstmöglich zur Verfügung zu stellen.<br>';
|
||||
$content .= 'Wie wä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']);
|
||||
|
||||
?>
|
||||
|
||||
$sp['title'] = 'Saison-Planungen - Regatten.net ' . $_CLASS['name'];
|
||||
$sp['backbutton'] = 'planning';
|
||||
$sp['activenav'] = 5;
|
||||
|
||||
// Title
|
||||
$content = '<h1>Saison-Planungen</h1>';
|
||||
$content .= $tpl->load('select', ['html-id' => 'select-year', 'placeholder' => 'Jahr', 'css-class' => 'mt-3 mb-0']);
|
||||
|
||||
$sp['output'] .= $tpl->load('card', [$content, 'css-class' => 'show-loggedin']);
|
||||
|
||||
// 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');
|
||||
|
||||
?>
|
||||
|
||||
@@ -1,19 +1,36 @@
|
||||
<?php
|
||||
|
||||
// TODO: Create site
|
||||
|
||||
$sp['title'] = 'Seite noch nicht unterstuuml;tzt - Regatten.net ' . $_CLASS['name'];
|
||||
$sp['backbutton'] = true;
|
||||
|
||||
$content = $tpl->load('error', ['404', 'Seite existiert noch nicht']);
|
||||
$content .= '<p>';
|
||||
$content .= 'Die gesuchte Seite ist leider noch nicht verfügbar.<br>';
|
||||
$content .= 'Wir arbeiten daran, sie schnellstmöglich zur Verfügung zu stellen.<br>';
|
||||
$content .= 'Wie wä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']);
|
||||
|
||||
?>
|
||||
|
||||
$sp['title'] = 'Saison-Planung - Regatten.net ' . $_CLASS['name'];
|
||||
$sp['backbutton'] = 'planning_list';
|
||||
$sp['activenav'] = 5;
|
||||
|
||||
// Title
|
||||
$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> Teilen', '#', 'html-id' => 'button-share']);
|
||||
$content .= $tpl->load('select', ['html-id' => 'select-year', 'placeholder' => 'Jahr', 'css-class' => 'mt-3 mb-0']);
|
||||
|
||||
$sp['output'] .= $tpl->load('card', [$content]);
|
||||
|
||||
// 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');
|
||||
|
||||
?>
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
<?php
|
||||
|
||||
|
||||
$sp['title'] = 'Segler - Regatten.net ' . $_CLASS['name'];
|
||||
$sp['backbutton'] = 'index';
|
||||
$sp['activenav'] = 4;
|
||||
|
||||
|
||||
// Title
|
||||
$content = "<h1>Segler</h1>";
|
||||
|
||||
|
||||
$sp['output'] .= $tpl->load('card', [$content]);
|
||||
|
||||
|
||||
// Info Years
|
||||
$content = '<h2>Jahrgänge</h2>';
|
||||
$content .= '<p>';
|
||||
@@ -17,30 +17,32 @@
|
||||
$content .= 'Klicke dazu einfach auf den entsprechenden Segler und wähle Jahrgang bearbeiten aus.<br>';
|
||||
$content .= 'Vielen Dank für Deine Unterstützung!';
|
||||
$content .= '</p>';
|
||||
|
||||
|
||||
$sp['output'] .= $tpl->load('card', [$content]);
|
||||
|
||||
|
||||
// List
|
||||
$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-list" class="normal-list mb-0"></div>';
|
||||
|
||||
|
||||
$sp['output'] .= $tpl->load('card', [$content, 'html-id' => 'card-list']);
|
||||
|
||||
|
||||
// Pagination
|
||||
$sp['output'] .= $tpl->load('pagination', ['html-id' => 'pagination']);
|
||||
|
||||
|
||||
// Menu
|
||||
$items = $tpl->load('menu/item-icon', ['', '#', 'html-id' => 'menu-item-year', 'icon' => 'fa-edit']);
|
||||
$items = $tpl->load('menu/item-switch', ['Favorit', 'html-id' => 'menu-item-follow', 'icon' => 'fa-heart']);
|
||||
$items .= $tpl->load('menu/item-icon-badge', ['Favorit', '#', 'html-id' => 'menu-item-follow-disabled', 'icon' => 'fa-heart', 'badge-value' => 'MAX REACHED']);
|
||||
$items .= $tpl->load('menu/item-icon', ['', '#', 'html-id' => 'menu-item-year', 'icon' => 'fa-edit']);
|
||||
$items .= $tpl->load('menu/item-icon', ['Vereins-Website', '', 'html-id' => 'menu-item-clubwebsite', 'icon' => 'fa-globe', 'css-class' => 'border-0']);
|
||||
$sp['menus'] .= $tpl->load('menu/bottom', [$items, 'html-id' => 'menu-sailor', 'title' => 'Segler-Details', 'height' => 200]);
|
||||
|
||||
$sp['menus'] .= $tpl->load('menu/bottom', [$items, 'html-id' => 'menu-sailor', 'title' => 'Segler-Details', 'height' => 260]);
|
||||
|
||||
$items = '<p class="mb-2 mt-1" style="line-height: 1.5em;">Bitte trage hier den Jahrgang ein:</p>';
|
||||
$items .= $tpl->load('input', ['html-id' => 'input-edityear', 'placeholder' => 'Jahrgang', 'type' => 'number']);
|
||||
$items .= $tpl->load('button', ['Speichern', '#', 'html-id' => 'button-edityear']);
|
||||
$sp['menus'] .= $tpl->load('menu/bottom', [$items, 'html-id' => 'menu-edityear', 'height' => 240]);
|
||||
|
||||
|
||||
$sp['scripts'] .= $scripts->load('pagination', ['pageChange', 'page', 'pageCount', 'pagination']);
|
||||
$sp['scripts'] .= $scripts->load('sailors');
|
||||
|
||||
?>
|
||||
|
||||
?>
|
||||
|
||||
@@ -1,29 +1,29 @@
|
||||
<div id="menu-share" class="menu menu-box-bottom menu-box-detached rounded-m" data-menu-height="345" data-menu-effect="menu-over">
|
||||
<div class="menu-title mt-n1"><h1>Share the Love</h1><p class="color-highlight">Just Tap the Social Icon. We'll add the Link</p><a href="#" class="close-menu"><i class="fa fa-times"></i></a></div>
|
||||
<div class="menu-title mt-n1"><h1>Seite Teilen</h1><p class="color-highlight">Teile diese Seite mit Deinen Freunden!</p><a href="#" class="close-menu"><i class="fa fa-times"></i></a></div>
|
||||
<div class="content mb-0">
|
||||
<div class="divider mb-0"></div>
|
||||
<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>
|
||||
<span class="font-13">Facebook</span>
|
||||
<i class="fa fa-angle-right"></i>
|
||||
</a>
|
||||
<a href="#" class="shareToTwitter">
|
||||
<a href="#" class="shareToTwitter" target="_blank">
|
||||
<i class="font-18 fab fa-twitter-square color-twitter"></i>
|
||||
<span class="font-13">Twitter</span>
|
||||
<i class="fa fa-angle-right"></i>
|
||||
</a>
|
||||
<a href="#" class="shareToLinkedIn">
|
||||
<a href="#" class="shareToLinkedIn" target="_blank">
|
||||
<i class="font-18 fab fa-linkedin color-linkedin"></i>
|
||||
<span class="font-13">LinkedIn</span>
|
||||
<i class="fa fa-angle-right"></i>
|
||||
</a>
|
||||
<a href="#" class="shareToWhatsApp">
|
||||
<a href="#" class="shareToWhatsApp" target="_blank">
|
||||
<i class="font-18 fab fa-whatsapp-square color-whatsapp"></i>
|
||||
<span class="font-13">WhatsApp</span>
|
||||
<i class="fa fa-angle-right"></i>
|
||||
</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>
|
||||
<span class="font-13">Email</span>
|
||||
<i class="fa fa-angle-right"></i>
|
||||
@@ -92,11 +92,12 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="menu-settings" class="menu menu-box-bottom menu-box-detached rounded-m" data-menu-height="310">
|
||||
<div id="menu-settings" class="menu menu-box-bottom menu-box-detached rounded-m" data-menu-height="260">
|
||||
<div class="menu-title"><h1>Einstellungen</h1><p class="color-highlight"> </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">
|
||||
<div class="list-group list-custom-small">
|
||||
<?php if (false) { /* DARK MODE DISABLED (set menu height to 310) */ ?>
|
||||
<a href="#" data-toggle-theme data-trigger-switch="switch-dark" class="pb-2">
|
||||
<i class="fa font-14 fa-moon rounded-s bg-dark1-dark color-white"></i>
|
||||
<span>Dark Mode</span>
|
||||
@@ -105,6 +106,7 @@
|
||||
<label class="custom-control-label" for="switch-dark"></label>
|
||||
</div>
|
||||
</a>
|
||||
<?php } ?>
|
||||
<a href="#" data-menu="menu-login" class="show-notloggedin">
|
||||
<i class="fa font-14 fa-sign-in-alt rounded-s bg-highlight color-white"></i>
|
||||
<span>Login</span>
|
||||
@@ -243,7 +245,7 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="menu-login" class="menu menu-box-top menu-box-detached rounded-m" data-menu-height="270">
|
||||
<div id="menu-login" class="menu menu-box-top menu-box-detached rounded-m" data-menu-height="320">
|
||||
<div class="content bottom-0">
|
||||
<h1 class="text-center mt-5 font-900">Login</h1>
|
||||
<div class="input-style input-style-2 has-icon input-required">
|
||||
@@ -257,18 +259,29 @@
|
||||
<input id="input-login-password" class="form-control" type="password" placeholder="Passwort" />
|
||||
</div>
|
||||
<a class="btn btn-m mt-2 mb-2 btn-full bg-green2-dark text-uppercase font-900" href="#" onclick="login();">Login</a>
|
||||
<p class="text-center mt-3"><a class="text-uppercase font-900" href="https://regatten.net/reset">Benutzername oder Passwort vergessen</a></p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="menu-signup" class="menu menu-box-modal menu-box-detached rounded-m" data-menu-height="300">
|
||||
<div id="menu-signup" class="menu menu-box-top menu-box-detached rounded-m" data-menu-height="340">
|
||||
<div class="content bottom-0">
|
||||
<h1 class="text-center mt-5 font-900">Registrieren</h1>
|
||||
<p class="text-center">
|
||||
Momentan kannst Du Dich leider nicht in der App registrieren.<br>
|
||||
Das ist aber kein Problem, registriere Dich einfach kostenlos auf unserer Website!
|
||||
</p>
|
||||
<a href="https://regatten.net/de/signup" class="btn btn-center-xl btn-m shadow-xl rounded-s bg-highlight font-900 text-center">Registrieren</a>
|
||||
<p class="text-center font-10 bottom-0">Du kannst Dich danach in dieser App anmelden.</p>
|
||||
<div class="input-style input-style-2 has-icon input-required">
|
||||
<i class="input-icon fa fa-user color-theme"></i>
|
||||
<span class="color-highlight">Benutzername</span>
|
||||
<input id="input-signup-username" class="form-control" type="name" placeholder="Benutzername" />
|
||||
</div>
|
||||
<div class="input-style input-style-2 has-icon input-required">
|
||||
<i class="input-icon fa fa-envelope color-theme"></i>
|
||||
<span class="color-highlight">Email</span>
|
||||
<input id="input-signup-email" class="form-control" type="email" placeholder="Email" />
|
||||
</div>
|
||||
<div class="input-style input-style-2 has-icon input-required">
|
||||
<i class="input-icon fa fa-lock color-theme"></i>
|
||||
<span class="color-highlight">Passwort</span>
|
||||
<input id="input-signup-password" class="form-control" type="password" placeholder="Passwort" />
|
||||
</div>
|
||||
<a class="btn btn-m mt-2 mb-2 btn-full bg-green2-dark text-uppercase font-900" href="#" onclick="signup();">Registrieren</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -291,14 +304,17 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="menu-update">
|
||||
<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ü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 class="text-center mt-5"><i class="fa fa-sync-alt fa-7x color-highlight fa-spin"></i></p>
|
||||
<h1 class="text-center mt-5 font-900">Update Verfügbar</h1>
|
||||
<p class="text-center">
|
||||
Eine neue Version unserer App ist verfügbar. Keine Sorge, Du musst nichts machen. Wir aktuallisieren den Inhalt in wenigen Sekunden.
|
||||
<p>
|
||||
Das Speichern der benötigten Daten wird von Deinem Gerät nicht unterstützt.<br>
|
||||
Da deshalb die Daten jedesmal direkt vom Server geladen werden müssen, kannst Du die App nicht offline nutzen.<br>
|
||||
Das Nachladen kann außerdem gerade bei großen Datenmengen (wie Ranglisten) sehr lange dauern.
|
||||
Wir empfehlen Dir daher, auf diesem Gerät unsere normale Website zu benutzen. Diese ist auch für Mobil-Geräte optimiert.
|
||||
</p>
|
||||
<a href="#" class="page-update btn btn-center-xl btn-m shadow-xl rounded-s bg-highlight font-900 text-center">Update</a>
|
||||
<p class="text-center font-10 bottom-0">Die App wird neu laden und das Update ist abgeschlossen.</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>
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="<?php echo SERVER_ADDR; ?>/client/app/icons/icon-192x192.png">
|
||||
</head>
|
||||
|
||||
<body class="detect-theme" data-background="none" data-highlight="blue2">
|
||||
<body class="theme-light" data-background="none" data-highlight="blue2"><?php /* DARK MODE DISABLED: set class to "detect-theme" */ ?>
|
||||
|
||||
<div id="preloader"><div class="spinner-border color-highlight" role="status"></div></div>
|
||||
|
||||
@@ -27,7 +27,8 @@
|
||||
<?php include(__DIR__ . '/headerfooter.php'); ?>
|
||||
|
||||
<!--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']; ?>
|
||||
</div>
|
||||
<!--end of page content, off canvas elements here-->
|
||||
|
||||
@@ -21,8 +21,8 @@ async function onEditBoatnameClick() {
|
||||
if (xhr.status == 0) {
|
||||
toastError('Du bist momentan offline.<br>Stelle eine Internetverbindung her, um den Bootsnamen zu bearbeiten');
|
||||
} else {
|
||||
console.log('EditBoatname: unbekannter Fehler', status, error);
|
||||
console.log(xhr);
|
||||
log('EditBoatname: unbekannter Fehler', status, error);
|
||||
log(xhr);
|
||||
toastError('Ein unbekannter Fehler ist aufgetreten. Bitte versuche es noch einmal', 5000);
|
||||
}
|
||||
hideLoader();
|
||||
@@ -47,9 +47,9 @@ async function onEditBoatnameClick() {
|
||||
|
||||
async function onListClicked(id) {
|
||||
var boat = await dbGetData('boats', id);
|
||||
|
||||
|
||||
$('#menu-boat').find('.menu-title').find('p').text(boat.sailnumber);
|
||||
|
||||
|
||||
// Edit Boatname
|
||||
$('#button-editboatname').attr('data-boat-id', boat.id);
|
||||
$('#menu-editboatname').find('.menu-title').find('p').text(boat.sailnumber);
|
||||
@@ -63,7 +63,7 @@ async function onListClicked(id) {
|
||||
$('#input-editboatname').val(boat.name);
|
||||
}
|
||||
$('#input-editboatname').trigger('focusin').trigger('focusout');
|
||||
|
||||
|
||||
// club website
|
||||
var clubwebsite = '';
|
||||
if (boat['club'] != null) {
|
||||
@@ -76,7 +76,7 @@ async function onListClicked(id) {
|
||||
} else {
|
||||
$('#menu-item-clubwebsite').hide();
|
||||
}
|
||||
|
||||
|
||||
$('#menu-boat').showMenu();
|
||||
$('#menu-boat').scrollTop(0);
|
||||
}
|
||||
@@ -89,19 +89,19 @@ function pageChange() {
|
||||
async function drawList() {
|
||||
window.setTimeout(function () {
|
||||
var list = '';
|
||||
|
||||
|
||||
if (displayed.length > 0) {
|
||||
var offset = (page - 1) * showCount;
|
||||
var count = (page == pageCount ? (displayed.length % showCount) : showCount);
|
||||
if (count == 0) count = showCount;
|
||||
|
||||
|
||||
for (i = 0; i < count; i ++) {
|
||||
list += displayed[i + offset];
|
||||
}
|
||||
} else {
|
||||
list = '<div><div>Keine Ergebnisse, die der Suche entsprechen</div></div>';
|
||||
}
|
||||
|
||||
|
||||
$('#div-list').html(list);
|
||||
}, 0);
|
||||
}
|
||||
@@ -135,9 +135,9 @@ var siteScript = async function() {
|
||||
$('#menu-item-boatname').click(function(){ $('#menu-boat').hideMenu(); $('#menu-editboatname').showMenu(); });
|
||||
$('#button-editboatname').click(onEditBoatnameClick);
|
||||
}
|
||||
|
||||
|
||||
var results = await dbGetData('boats');
|
||||
|
||||
|
||||
var count = results.length;
|
||||
if (count > 0) {
|
||||
if (count == 1) {
|
||||
@@ -147,51 +147,51 @@ var siteScript = async function() {
|
||||
}
|
||||
$('#div-list').show();
|
||||
$('#input-search').parent().show();
|
||||
|
||||
|
||||
results.sort(function (a, b) {
|
||||
return a.sailnumber.localeCompare(b.sailnumber);
|
||||
});
|
||||
|
||||
|
||||
rows = [];
|
||||
|
||||
|
||||
for (id in results) {
|
||||
var entry = results[id];
|
||||
var club = null;
|
||||
if (entry['club'] != null)
|
||||
club = await dbGetData('clubs', entry['club']);
|
||||
|
||||
|
||||
var row = { keywords: [], content: '' };
|
||||
row.keywords.push(entry['sailnumber']);
|
||||
if (entry['name'] != '') row.keywords.push(entry['name']);
|
||||
if (club != null) row.keywords.push(club['kurz'], club['name']);
|
||||
|
||||
|
||||
row.content += '<div onclick="onListClicked(' + entry['id'] + ');">';
|
||||
|
||||
|
||||
// ZEILE 1
|
||||
// Sailnumber
|
||||
row.content += '<div><b>' + entry['sailnumber'] + '</b></div>';
|
||||
|
||||
|
||||
// ZEILE 2
|
||||
row.content += '<div>';
|
||||
|
||||
|
||||
// Name
|
||||
row.content += '<div>' + entry['name'] + '</div>';
|
||||
|
||||
|
||||
// Club
|
||||
row.content += '<div>' + ((club != null) ? club['kurz'] : '') + '</div>';
|
||||
|
||||
|
||||
row.content += '</div></div>';
|
||||
|
||||
|
||||
rows.push(row);
|
||||
}
|
||||
|
||||
|
||||
reSearch();
|
||||
|
||||
|
||||
} else {
|
||||
$('#p-count').html('Keine Boote gefunden!');
|
||||
$('#div-list').hide();
|
||||
$('#input-search').parent().hide();
|
||||
}
|
||||
|
||||
|
||||
hideLoader();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,8 +23,8 @@ function sendMessage() {
|
||||
if (xhr.status == 0) {
|
||||
toastError('Du bist momentan offline.<br>Stelle eine Internetverbindung her, um eine Nachricht zu versenden');
|
||||
} else {
|
||||
console.log('Contact: unbekannter Fehler', status, error);
|
||||
console.log(xhr);
|
||||
log('Contact: unbekannter Fehler', status, error);
|
||||
log(xhr);
|
||||
toastError('Ein unbekannter Fehler ist aufgetreten. Bitte versuche es noch einmal', 5000);
|
||||
}
|
||||
hideLoader();
|
||||
|
||||
12
server/scripts/go2url.js
Normal file
12
server/scripts/go2url.js
Normal 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ück zur Startseite</a>');
|
||||
} else {
|
||||
showLoader();
|
||||
location.href = url;
|
||||
}
|
||||
}, 2000);
|
||||
}
|
||||
@@ -1,8 +1,84 @@
|
||||
var firstCall = true;
|
||||
var today;
|
||||
var onUpdatePushBadge;
|
||||
|
||||
var onUnfollowClicked = async function() {
|
||||
var id = $('#menu-item-unfollow').attr('data-sailor-id');
|
||||
showLoader();
|
||||
$('#menu-favorite').hideMenu();
|
||||
var auth = {
|
||||
id: localStorage.getItem('auth_id'),
|
||||
hash: localStorage.getItem('auth_hash')
|
||||
}
|
||||
$.ajax({
|
||||
url: QUERY_URL + 'sailor_unfollow',
|
||||
method: 'POST',
|
||||
data: {
|
||||
auth: auth,
|
||||
sailor: id
|
||||
},
|
||||
error: function (xhr, status, error) {
|
||||
if (xhr.status == 0) {
|
||||
toastError('Du bist momentan offline.<br>Stelle eine Internetverbindung her, um Deine Favoriten zu bearbeiten.');
|
||||
} else {
|
||||
log('Unfollow: 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();
|
||||
toastOk('Erfolgreich');
|
||||
hideLoader();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
var onFavoriteClicked = async function(id) {
|
||||
var sailor = await dbGetData('sailors', id);
|
||||
|
||||
$('#menu-favorite').find('.menu-title').find('p').text(sailor.name);
|
||||
|
||||
$('#menu-item-unfollow').attr('data-sailor-id', sailor.id);
|
||||
|
||||
$('#menu-favorite').showMenu();
|
||||
}
|
||||
|
||||
var siteScript = async function() {
|
||||
today = getToday();
|
||||
|
||||
if (firstCall) {
|
||||
firstCall = false;
|
||||
$('#button-notifications-activate').click(function(){
|
||||
$('#menu-pushes').showMenu();
|
||||
});
|
||||
$('#a-notifications-later').click(function(){
|
||||
createCookie('regatten_app_' + BOATCLASS + '_rejected_push', true, 1);
|
||||
$('#card-notifications').hide();
|
||||
});
|
||||
if (readCookie('regatten_app_' + BOATCLASS + '_rejected_push')) {
|
||||
$('#card-notifications').hide();
|
||||
} else {
|
||||
onUpdatePushBadge = function () {
|
||||
if (!pushesPossible || (Notification.permission == 'denied')) {
|
||||
$('#card-notifications').hide();
|
||||
} else {
|
||||
swRegistration.pushManager.getSubscription().then(function(subscription) {
|
||||
var isSub = (subscription !== null);
|
||||
if (isSub) {
|
||||
$('#card-notifications').hide();
|
||||
} else {
|
||||
$('#card-notifications').show();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
onUpdatePushBadge();
|
||||
}
|
||||
$('#menu-item-unfollow').click(onUnfollowClicked);
|
||||
}
|
||||
|
||||
if (isLoggedIn()) {
|
||||
$('#card-notloggedin').hide();
|
||||
|
||||
@@ -18,31 +94,41 @@ var siteScript = async function() {
|
||||
}
|
||||
if (watched.length > 0) {
|
||||
var year = (new Date()).getFullYear();
|
||||
$('#th-ranking').html('Rangliste ' + year);
|
||||
var ranking = (await dbGetRanking(parseDate('01.12.' + (year - 1)), parseDate('30.11.' + year), false, false))[0];
|
||||
tbody = '';
|
||||
var list = '';
|
||||
for (i in watched) {
|
||||
sailor = watched[i];
|
||||
tbody += '<tr><td>' + sailor.name + '</td><td>';
|
||||
var club = null;
|
||||
if (sailor.club != null)
|
||||
club = await dbGetData('clubs', sailor.club);
|
||||
var rank = null;
|
||||
for (r in ranking) {
|
||||
if (ranking[r].id == sailor.id) {
|
||||
rank = ranking[r].rank;
|
||||
rank = ranking[r];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
list += '<div onclick="onFavoriteClicked(' + sailor.id + ');">';
|
||||
list += '<div>';
|
||||
// Name
|
||||
list += '<div><b>' + sailor.name + '</b></div>';
|
||||
list += '</div><div>';
|
||||
if (rank == null) {
|
||||
tbody += '<i>nicht in der Rangliste</i>';
|
||||
list += '<div>Nicht in der Rangliste</div>';
|
||||
} else {
|
||||
tbody += '<b>' + rank + '.</b> Platz';
|
||||
// Rank
|
||||
list += '<div>Platz <b>' + rank.rank + '</b></div>';
|
||||
// rlp
|
||||
list += '<div>' + rank.rlp.toFixed(3) + ' Punkte</div>';
|
||||
}
|
||||
tbody += '</td></tr>';
|
||||
list += '</div></div>';
|
||||
}
|
||||
$('#table-favorites').find('tbody').html(tbody);
|
||||
$('#div-favorites').html(list);
|
||||
$('#p-favorites').hide();
|
||||
$('#table-favorites').show();
|
||||
$('#div-favorites').show();
|
||||
} else {
|
||||
$('#table-favorites').hide();
|
||||
$('#div-favorites').hide();
|
||||
$('#p-favorites').show();
|
||||
}
|
||||
$('#card-favorites').show();
|
||||
@@ -50,7 +136,7 @@ var siteScript = async function() {
|
||||
// Your next
|
||||
var planningsDB = await dbGetDataIndex('plannings', 'user', user.id);
|
||||
var minDate = getToday();
|
||||
minDate.setDate(minDate.getDate() - 1);
|
||||
minDate.setDate(minDate.getDate());
|
||||
var maxDate = getToday();
|
||||
maxDate.setDate(maxDate.getDate() + 28);
|
||||
var regattas = await dbGetRegattasRange(minDate, maxDate);
|
||||
@@ -166,7 +252,7 @@ var siteScript = async function() {
|
||||
|
||||
// Next
|
||||
var minDate = getToday();
|
||||
minDate.setDate(minDate.getDate() - 1);
|
||||
minDate.setDate(minDate.getDate());
|
||||
var maxDate = getToday();
|
||||
maxDate.setDate(maxDate.getDate() + 14);
|
||||
var regattas = await dbGetRegattasRange(minDate, maxDate);
|
||||
@@ -273,12 +359,9 @@ var siteScript = async function() {
|
||||
var maxDate = getToday();
|
||||
maxDate.setDate(maxDate.getDate() - 1);
|
||||
var regattas = await dbGetRegattasRange(minDate, maxDate);
|
||||
var regattaResults = [];
|
||||
for (id in regattas) {
|
||||
var entry = regattas[id];
|
||||
var results = await dbGetDataIndex('results', 'regatta', entry['id']);
|
||||
regattaResults[entry['id']] = (results.length > 0);
|
||||
}
|
||||
regattas.sort(function(a,b){
|
||||
return b.date.localeCompare(a.date);
|
||||
});
|
||||
if (regattas.length > 0) {
|
||||
list = '';
|
||||
for (i in regattas) {
|
||||
@@ -320,7 +403,7 @@ var siteScript = async function() {
|
||||
icons.push('<i class="fas fa-book"></i>');
|
||||
if (regatta['canceled'] == '1') {
|
||||
icons.push('<i class="fas fa-times color-red2-dark"></i>');
|
||||
} else if (regattaResults[regatta['id']]) {
|
||||
} else if (regatta['results'] == '1') {
|
||||
icons.push('<i class="fas fa-poll"></i>');
|
||||
}
|
||||
list += '<div class="color-green2-dark">' + icons.join(' ') + '</div>';
|
||||
|
||||
@@ -1,3 +1,9 @@
|
||||
var firstCall = true;
|
||||
var rows = [];
|
||||
var page = 1;
|
||||
var pageCount = 0;
|
||||
const showCount = 10;
|
||||
|
||||
async function onNewsClicked(id) {
|
||||
var newsEntry = await dbGetData('news', id);
|
||||
if (newsEntry == null) return;
|
||||
@@ -11,33 +17,71 @@ async function onNewsClicked(id) {
|
||||
$('#menu-news').showMenu();
|
||||
}
|
||||
|
||||
function pageChange() {
|
||||
$('h1')[0].scrollIntoView({ behavior: "smooth" });
|
||||
drawList();
|
||||
}
|
||||
|
||||
function addCard(newsEntry) {
|
||||
var content = '<h2>' + newsEntry.title + '</h2>';
|
||||
var badge = '';
|
||||
if (newsEntry.unread) {
|
||||
badge += '<span class="badge bg-highlight color-white p-1">NEW</span> ';
|
||||
}
|
||||
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-0">' + newsEntry.description.replace('\n', '<br>') + '</p>';
|
||||
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>';
|
||||
}
|
||||
|
||||
$('.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() {
|
||||
$('.card-news').remove();
|
||||
if (firstCall) {
|
||||
firstCall = false;
|
||||
initPagination();
|
||||
}
|
||||
rows = [];
|
||||
var news = await dbGetData('news');
|
||||
news.sort(function (a,b) {
|
||||
return b.date.localeCompare(a.date);
|
||||
});
|
||||
var newsRead = await dbSettingsGet('news_read_' + BOATCLASS);
|
||||
var now = new Date();
|
||||
var lastYear = new Date();
|
||||
lastYear.setFullYear(lastYear.getFullYear() - 1);
|
||||
for (var n in news) {
|
||||
var newsEntry = news[n];
|
||||
newsEntry.date = new Date(Date.parse(newsEntry.date));
|
||||
newsEntry.date = parseDbTimestamp(newsEntry.date);
|
||||
if (newsEntry.date > now) continue;
|
||||
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();
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
async function onRegattaClicked(id) {
|
||||
var regatta = await dbGetData('regattas', id);
|
||||
|
||||
|
||||
$('#menu-regatta').find('.menu-title').find('p').text(regatta.name);
|
||||
|
||||
|
||||
var dateTo = parseDate(regatta['date']);
|
||||
dateTo.setDate(dateTo.getDate() + Math.max(parseInt(regatta['length']) - 1, 0));
|
||||
|
||||
|
||||
var plannings = await dbGetDataIndex('plannings', 'regatta', regatta['id']);
|
||||
var planning = null;
|
||||
if (isLoggedIn()) {
|
||||
@@ -16,7 +16,7 @@ async function onRegattaClicked(id) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Your Planning
|
||||
if (planning != null) {
|
||||
$('#menu-item-yourplanning').show();
|
||||
@@ -32,11 +32,26 @@ async function onRegattaClicked(id) {
|
||||
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>'));
|
||||
} else {
|
||||
$('#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
|
||||
if ((plannings.length > 0) && (dateTo >= today)) {
|
||||
$('#menu-item-plannings').show();
|
||||
@@ -44,16 +59,15 @@ async function onRegattaClicked(id) {
|
||||
} else {
|
||||
$('#menu-item-plannings').hide();
|
||||
}
|
||||
|
||||
|
||||
// Results
|
||||
var results = await dbGetDataIndex('results', 'regatta', regatta['id']);
|
||||
if (results.length > 0) {
|
||||
if (regatta['results'] == '1') {
|
||||
$('#menu-item-results').show();
|
||||
$('#menu-item-results').attr('href', LINK_PRE + 'result?regatta=' + regatta['id']);
|
||||
} else {
|
||||
$('#menu-item-results').hide();
|
||||
}
|
||||
|
||||
|
||||
// Bericht
|
||||
if (regatta['bericht'] != '') {
|
||||
$('#menu-item-bericht').show();
|
||||
@@ -62,7 +76,7 @@ async function onRegattaClicked(id) {
|
||||
} else {
|
||||
$('#menu-item-bericht').hide();
|
||||
}
|
||||
|
||||
|
||||
// Info
|
||||
if (regatta['info'] != '') {
|
||||
$('#menu-item-info').show();
|
||||
@@ -71,7 +85,7 @@ async function onRegattaClicked(id) {
|
||||
} else {
|
||||
$('#menu-item-info').hide();
|
||||
}
|
||||
|
||||
|
||||
// Meldung
|
||||
if ((regatta['meldung'] != '') && (dateTo >= today)) {
|
||||
$('#menu-item-meldung').show();
|
||||
@@ -129,7 +143,7 @@ async function onRegattaClicked(id) {
|
||||
} else {
|
||||
$('#menu-item-meldung').hide();
|
||||
}
|
||||
|
||||
|
||||
// off. results
|
||||
if (regatta['oresults'] != '') {
|
||||
$('#menu-item-oresults').show();
|
||||
@@ -138,7 +152,7 @@ async function onRegattaClicked(id) {
|
||||
} else {
|
||||
$('#menu-item-oresults').hide();
|
||||
}
|
||||
|
||||
|
||||
// club website
|
||||
var clubwebsite = '';
|
||||
if (regatta['club'] != null) {
|
||||
@@ -151,7 +165,7 @@ async function onRegattaClicked(id) {
|
||||
} else {
|
||||
$('#menu-item-clubwebsite').hide();
|
||||
}
|
||||
|
||||
|
||||
$('#menu-regatta').showMenu();
|
||||
$('#menu-regatta').scrollTop(0);
|
||||
}
|
||||
}
|
||||
|
||||
307
server/scripts/planning.js
Normal file
307
server/scripts/planning.js
Normal file
@@ -0,0 +1,307 @@
|
||||
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 ä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);
|
||||
showLoader();
|
||||
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 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 (entry['results'] == '1') {
|
||||
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(' ') + '</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();
|
||||
}
|
||||
474
server/scripts/planning_edit.js
Normal file
474
server/scripts/planning_edit.js
Normal file
@@ -0,0 +1,474 @@
|
||||
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 Ä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 Ä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 Ä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 Ä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ü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);
|
||||
showLoader();
|
||||
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();
|
||||
}
|
||||
147
server/scripts/planning_list.js
Normal file
147
server/scripts/planning_list.js
Normal file
@@ -0,0 +1,147 @@
|
||||
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);
|
||||
showLoader();
|
||||
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();
|
||||
}
|
||||
220
server/scripts/planning_view.js
Normal file
220
server/scripts/planning_view.js
Normal file
@@ -0,0 +1,220 @@
|
||||
function selectChange() {
|
||||
var val = $('#select-year').val();
|
||||
|
||||
if (typeof siteScript === 'function') {
|
||||
history.replaceState(null, '', '?year=' + val);
|
||||
showLoader();
|
||||
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();
|
||||
}
|
||||
@@ -175,7 +175,8 @@ async function selectChange(callSiteScript = true) {
|
||||
$('#input-jugstrict').prop('checked', jugstrict);
|
||||
|
||||
if (callSiteScript && (typeof siteScript === 'function')) {
|
||||
history.replaceState(null, '', '?type=' + type + '&year=' + year)
|
||||
history.replaceState(null, '', '?type=' + type + '&year=' + year);
|
||||
showLoader();
|
||||
siteScript();
|
||||
}
|
||||
}
|
||||
@@ -187,6 +188,7 @@ function buttonShowPressed() {
|
||||
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)
|
||||
showLoader();
|
||||
siteScript();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,6 +14,7 @@ function selectChange(callSiteScript = true) {
|
||||
|
||||
if (callSiteScript && (typeof siteScript === 'function')) {
|
||||
history.replaceState(null, '', '?year=' + val);
|
||||
showLoader();
|
||||
siteScript();
|
||||
}
|
||||
}
|
||||
@@ -21,7 +22,8 @@ function selectChange(callSiteScript = true) {
|
||||
|
||||
function buttonShowPressed() {
|
||||
if (typeof siteScript === 'function') {
|
||||
history.replaceState(null, '', '?year=user&from=' + $('#input-from').val() + "&to=" + $('#input-to').val())
|
||||
history.replaceState(null, '', '?year=user&from=' + $('#input-from').val() + "&to=" + $('#input-to').val());
|
||||
showLoader();
|
||||
siteScript();
|
||||
}
|
||||
}
|
||||
@@ -77,12 +79,6 @@ var siteScript = async function() {
|
||||
var minDate = parseDate($('#input-from').val());
|
||||
var maxDate = parseDate($('#input-to').val());
|
||||
var regattas = await dbGetRegattasRange(minDate, maxDate);
|
||||
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 selectedYear = $('#select-year').val();
|
||||
|
||||
@@ -194,7 +190,7 @@ var siteScript = async function() {
|
||||
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']]) {
|
||||
} else if (entry['results'] == '1') {
|
||||
icons.push('<i class="fas fa-poll"></i>');
|
||||
}
|
||||
row.content += '<div class="color-green2-dark">' + icons.join(' ') + '</div>';
|
||||
|
||||
@@ -4,6 +4,40 @@ var displayed = [];
|
||||
var page = 1;
|
||||
var pageCount = 0;
|
||||
const showCount = 25;
|
||||
var followedSailors = [];
|
||||
|
||||
async function onFollowChange() {
|
||||
var id = $('#menu-item-follow').attr('data-sailor-id');
|
||||
showLoader();
|
||||
$('#menu-sailor').hideMenu();
|
||||
var auth = {
|
||||
id: localStorage.getItem('auth_id'),
|
||||
hash: localStorage.getItem('auth_hash')
|
||||
}
|
||||
$.ajax({
|
||||
url: QUERY_URL + ($('#menu-item-follow').prop('checked') ? 'sailor_follow' : 'sailor_unfollow'),
|
||||
method: 'POST',
|
||||
data: {
|
||||
auth: auth,
|
||||
sailor: id
|
||||
},
|
||||
error: function (xhr, status, error) {
|
||||
if (xhr.status == 0) {
|
||||
toastError('Du bist momentan offline.<br>Stelle eine Internetverbindung her, um Deine Favoriten zu bearbeiten.');
|
||||
} else {
|
||||
log('Un/Follow: 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();
|
||||
toastOk('Erfolgreich');
|
||||
hideLoader();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
async function onEditYearClick() {
|
||||
var id = $('#button-edityear').attr('data-sailor-id');
|
||||
@@ -21,8 +55,8 @@ async function onEditYearClick() {
|
||||
if (xhr.status == 0) {
|
||||
toastError('Du bist momentan offline.<br>Stelle eine Internetverbindung her, um den Jahrgang zu bearbeiten');
|
||||
} else {
|
||||
console.log('EditYear: unbekannter Fehler', status, error);
|
||||
console.log(xhr);
|
||||
log('EditYear: unbekannter Fehler', status, error);
|
||||
log(xhr);
|
||||
toastError('Ein unbekannter Fehler ist aufgetreten. Bitte versuche es noch einmal', 5000);
|
||||
}
|
||||
hideLoader();
|
||||
@@ -47,9 +81,29 @@ async function onEditYearClick() {
|
||||
|
||||
async function onListClicked(id) {
|
||||
var sailor = await dbGetData('sailors', id);
|
||||
|
||||
|
||||
$('#menu-sailor').find('.menu-title').find('p').text(sailor.name);
|
||||
|
||||
|
||||
// Follow
|
||||
if (isLoggedIn()) {
|
||||
var found = false;
|
||||
for (var i in followedSailors) {
|
||||
if (followedSailors[i].id == sailor.id) found = true;
|
||||
}
|
||||
if (found || (followedSailors.length < 5)) {
|
||||
$('#menu-item-follow').attr('data-sailor-id', sailor.id);
|
||||
$('#menu-item-follow').prop('checked', found);
|
||||
$('#menu-item-follow').parent().parent().show();
|
||||
$('#menu-item-follow-disabled').hide();
|
||||
} else {
|
||||
$('#menu-item-follow').parent().parent().hide();
|
||||
$('#menu-item-follow-disabled').show();
|
||||
}
|
||||
} else {
|
||||
$('#menu-item-follow').parent().parent().hide();
|
||||
$('#menu-item-follow-disabled').hide();
|
||||
}
|
||||
|
||||
// Edit Year
|
||||
$('#button-edityear').attr('data-sailor-id', sailor.id);
|
||||
$('#menu-edityear').find('.menu-title').find('p').text(sailor.name);
|
||||
@@ -63,7 +117,7 @@ async function onListClicked(id) {
|
||||
$('#input-edityear').val(sailor.year);
|
||||
}
|
||||
$('#input-edityear').trigger('focusin').trigger('focusout');
|
||||
|
||||
|
||||
// club website
|
||||
var clubwebsite = '';
|
||||
if (sailor['club'] != null) {
|
||||
@@ -76,7 +130,7 @@ async function onListClicked(id) {
|
||||
} else {
|
||||
$('#menu-item-clubwebsite').hide();
|
||||
}
|
||||
|
||||
|
||||
$('#menu-sailor').showMenu();
|
||||
$('#menu-sailor').scrollTop(0);
|
||||
}
|
||||
@@ -89,19 +143,19 @@ function pageChange() {
|
||||
async function drawList() {
|
||||
window.setTimeout(function () {
|
||||
var list = '';
|
||||
|
||||
|
||||
if (displayed.length > 0) {
|
||||
var offset = (page - 1) * showCount;
|
||||
var count = (page == pageCount ? (displayed.length % showCount) : showCount);
|
||||
if (count == 0) count = showCount;
|
||||
|
||||
|
||||
for (i = 0; i < count; i ++) {
|
||||
list += displayed[i + offset];
|
||||
}
|
||||
} else {
|
||||
list = '<div><div>Keine Ergebnisse, die der Suche entsprechen</div></div>';
|
||||
}
|
||||
|
||||
|
||||
$('#div-list').html(list);
|
||||
}, 0);
|
||||
}
|
||||
@@ -134,10 +188,23 @@ var siteScript = async function() {
|
||||
$('#input-search').on('input', reSearch);
|
||||
$('#menu-item-year').click(function(){ $('#menu-sailor').hideMenu(); $('#menu-edityear').showMenu(); });
|
||||
$('#button-edityear').click(onEditYearClick);
|
||||
$('#menu-item-follow').parent().parent().click(onFollowChange);
|
||||
$('#menu-item-follow-disabled').click(function(){ $('#menu-sailor').hideMenu(); toastInfo('Du kannst maximal 5 Seglern folgen. Entferne erst einen Segler aus Deinen Favoriten, bevor Du andere aufnimmst.', 5000); });
|
||||
}
|
||||
|
||||
|
||||
if (isLoggedIn()) {
|
||||
var user = await dbGetData('users', USER_ID);
|
||||
followedSailors = [];
|
||||
for (var i = 1; i <= 5; i ++) {
|
||||
sailor_id = user['sailor' + i];
|
||||
if (sailor_id != null) {
|
||||
followedSailors.push(await dbGetData('sailors', sailor_id));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var results = await dbGetData('sailors');
|
||||
|
||||
|
||||
var count = results.length;
|
||||
if (count > 0) {
|
||||
if (count == 1) {
|
||||
@@ -147,51 +214,51 @@ var siteScript = async function() {
|
||||
}
|
||||
$('#div-list').show();
|
||||
$('#input-search').parent().show();
|
||||
|
||||
|
||||
results.sort(function (a, b) {
|
||||
return a.name.localeCompare(b.name);
|
||||
});
|
||||
|
||||
|
||||
rows = [];
|
||||
|
||||
|
||||
for (id in results) {
|
||||
var entry = results[id];
|
||||
var club = null;
|
||||
if (entry['club'] != null)
|
||||
club = await dbGetData('clubs', entry['club']);
|
||||
|
||||
|
||||
var row = { keywords: [], content: '' };
|
||||
row.keywords.push(entry['name']);
|
||||
if (entry['year'] != null) row.keywords.push(entry['year']);
|
||||
if (club != null) row.keywords.push(club['kurz'], club['name']);
|
||||
|
||||
|
||||
row.content += '<div onclick="onListClicked(' + entry['id'] + ');">';
|
||||
|
||||
|
||||
// ZEILE 1
|
||||
// Name
|
||||
row.content += '<div><b>' + entry['name'] + '</b></div>';
|
||||
|
||||
|
||||
// ZEILE 2
|
||||
row.content += '<div>';
|
||||
|
||||
|
||||
// Year
|
||||
row.content += '<div>' + ((entry['year'] != null) ? (entry['year']) : '') + '</div>';
|
||||
|
||||
|
||||
// Club
|
||||
row.content += '<div>' + ((club != null) ? club['kurz'] : '') + '</div>';
|
||||
|
||||
|
||||
row.content += '</div></div>';
|
||||
|
||||
|
||||
rows.push(row);
|
||||
}
|
||||
|
||||
|
||||
reSearch();
|
||||
|
||||
|
||||
} else {
|
||||
$('#p-count').html('Keine Segler gefunden!');
|
||||
$('#div-list').hide();
|
||||
$('#input-search').parent().hide();
|
||||
}
|
||||
|
||||
|
||||
hideLoader();
|
||||
}
|
||||
}
|
||||
|
||||
8
server/templates/menu/item-switch.html
Normal file
8
server/templates/menu/item-switch.html
Normal 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>
|
||||
@@ -1,4 +1,4 @@
|
||||
<nav id="$$html-id;">
|
||||
<nav id="$$html-id;" class="$$css-class;">
|
||||
<ul class="pagination justify-content-center">
|
||||
<li id="$$html-id;-1" class="page-item"><a onclick="onPaginationClick(this)" class="page-link color-black bg-theme rounded-xs shadow-x1 border-0" style="cursor: pointer;">1</a></li>
|
||||
<li id="$$html-id;-2" class="page-item"><a onclick="onPaginationClick(this)" class="page-link color-black bg-theme rounded-xs shadow-x1 border-0" style="cursor: pointer;">2</a></li>
|
||||
@@ -8,4 +8,4 @@
|
||||
<li id="$$html-id;-6" class="page-item"><a onclick="onPaginationClick(this)" class="page-link color-black bg-theme rounded-xs shadow-x1 border-0" style="cursor: pointer;">6</a></li>
|
||||
<li id="$$html-id;-7" class="page-item"><a onclick="onPaginationClick(this)" class="page-link color-black bg-theme rounded-xs shadow-x1 border-0" style="cursor: pointer;">7</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
</nav>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?php
|
||||
|
||||
define('PWA_VERSION', '1.8');
|
||||
define('PWA_VERSION', '1.11h4');
|
||||
|
||||
?>
|
||||
|
||||
@@ -229,14 +229,15 @@ self.addEventListener('push', async function(event) {
|
||||
case 'meldeschluss':
|
||||
if (await dbSettingsGet('notify_channel_<?php echo BOATCLASS; ?>_meldeschluss')) {
|
||||
if (await isMyRegatta(getEntry(data, 'id', ''))) okay = true;
|
||||
// TODO: only if not already registered
|
||||
}
|
||||
break;
|
||||
default:
|
||||
console.log('Unknown channel:', data.channel);
|
||||
console.log('[sW] Unknown channel:', data.channel);
|
||||
break;
|
||||
}
|
||||
if (!okay) {
|
||||
console.log('Notification channel not subscribed');
|
||||
console.log('[sW] Notification channel not subscribed');
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -255,7 +256,7 @@ self.addEventListener('push', async function(event) {
|
||||
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 });
|
||||
var request = os.put({ table: 'last_sync', time: 1 });
|
||||
request.onerror = function (event) {
|
||||
console.log('[sW] Error while saving data to DB:', e);
|
||||
db.close();
|
||||
@@ -267,7 +268,7 @@ self.addEventListener('push', async function(event) {
|
||||
}
|
||||
}
|
||||
|
||||
console.log('Showing notification');
|
||||
console.log('[sW] Showing notification');
|
||||
self.registration.showNotification(data.title, options);
|
||||
break;
|
||||
|
||||
@@ -276,7 +277,7 @@ self.addEventListener('push', async function(event) {
|
||||
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 });
|
||||
var request = os.put({ table: 'last_sync', time: 1 });
|
||||
request.onerror = function (event) {
|
||||
console.log('[sW] Error while saving data to DB:', e);
|
||||
db.close();
|
||||
@@ -310,3 +311,16 @@ self.addEventListener('notificationclick', function(event) {
|
||||
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
|
||||
})
|
||||
);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user