From 760c05286e603556847f0cd4b94d1f792ba2b490 Mon Sep 17 00:00:00 2001 From: ostertun Date: Fri, 2 Oct 2020 19:26:03 +0200 Subject: [PATCH] RA-#22 Added planning incl setState --- client/styles/regatten.css | 2 +- server/content/planning.php | 64 +++-- server/scripts/onRegattaClicked.js | 41 ++-- server/scripts/planning.js | 312 +++++++++++++++++++++++++ server/templates/menu/item-switch.html | 8 + 5 files changed, 395 insertions(+), 32 deletions(-) create mode 100644 server/scripts/planning.js create mode 100644 server/templates/menu/item-switch.html diff --git a/client/styles/regatten.css b/client/styles/regatten.css index 4f22174..951cde7 100644 --- a/client/styles/regatten.css +++ b/client/styles/regatten.css @@ -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; -} \ No newline at end of file +} diff --git a/server/content/planning.php b/server/content/planning.php index 85a23df..657f3db 100644 --- a/server/content/planning.php +++ b/server/content/planning.php @@ -1,19 +1,47 @@ load('error', ['404', 'Seite existiert noch nicht']); - $content .= '

'; - $content .= 'Die gesuchte Seite ist leider noch nicht verfügbar.
'; - $content .= 'Wir arbeiten daran, sie schnellstmöglich zur Verfügung zu stellen.
'; - $content .= 'Wie wäre es mit der Homepage?'; - $content .= '

'; - $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']); - -?> \ No newline at end of file + + $sp['title'] = 'Saison-Planung - Regatten.net ' . $_CLASS['name']; + $sp['backbutton'] = 'index'; + $sp['activenav'] = 5; + + // Title + $content = '

Saison-Planung

'; + $content .= '

Hinweis: Diese Seite kannst nur Du sehen.
Wenn Du Deine Saison-Planung teilen möchtest, klicke hier

'; + $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 = '

Saison-Planung

'; + $content .= '

Um Deine Saison-Planung zu sehen, musst Du angemeldet sein.
Melde Dich hier an oder registriere Dich jetzt kostenlos.

'; + + $sp['output'] .= $tpl->load('card', [$content, 'css-class' => 'show-notloggedin']); + + // Regattas + $content = '

'; + $content .= $tpl->load('input', ['html-id' => 'input-search', 'placeholder' => 'Suche', 'type' => 'text', 'css-class' => 'mt-2']); + $content .= '
'; + + $sp['output'] .= $tpl->load('card', [$content, 'html-id' => 'card-regattas', 'css-class' => 'show-loggedin']); + + // Menu + $items = ''; + $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'); + +?> diff --git a/server/scripts/onRegattaClicked.js b/server/scripts/onRegattaClicked.js index 0c7dd64..af713a4 100644 --- a/server/scripts/onRegattaClicked.js +++ b/server/scripts/onRegattaClicked.js @@ -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('' + status + ''); $('#menu-item-yourplanning').html(crew.join('
')); } 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,7 +59,7 @@ async function onRegattaClicked(id) { } else { $('#menu-item-plannings').hide(); } - + // Results var results = await dbGetDataIndex('results', 'regatta', regatta['id']); if (results.length > 0) { @@ -53,7 +68,7 @@ async function onRegattaClicked(id) { } else { $('#menu-item-results').hide(); } - + // Bericht if (regatta['bericht'] != '') { $('#menu-item-bericht').show(); @@ -62,7 +77,7 @@ async function onRegattaClicked(id) { } else { $('#menu-item-bericht').hide(); } - + // Info if (regatta['info'] != '') { $('#menu-item-info').show(); @@ -71,7 +86,7 @@ async function onRegattaClicked(id) { } else { $('#menu-item-info').hide(); } - + // Meldung if ((regatta['meldung'] != '') && (dateTo >= today)) { $('#menu-item-meldung').show(); @@ -129,7 +144,7 @@ async function onRegattaClicked(id) { } else { $('#menu-item-meldung').hide(); } - + // off. results if (regatta['oresults'] != '') { $('#menu-item-oresults').show(); @@ -138,7 +153,7 @@ async function onRegattaClicked(id) { } else { $('#menu-item-oresults').hide(); } - + // club website var clubwebsite = ''; if (regatta['club'] != null) { @@ -151,7 +166,7 @@ async function onRegattaClicked(id) { } else { $('#menu-item-clubwebsite').hide(); } - + $('#menu-regatta').showMenu(); $('#menu-regatta').scrollTop(0); -} \ No newline at end of file +} diff --git a/server/scripts/planning.js b/server/scripts/planning.js new file mode 100644 index 0000000..a109b34 --- /dev/null +++ b/server/scripts/planning.js @@ -0,0 +1,312 @@ +async function planningSwitchChanged() { + showLoader(); + var id = $('#switch-status-gemeldet').data('regatta'); + var gemeldet = $('#switch-status-gemeldet').prop('checked'); + var bezahlt = $('#switch-status-bezahlt').prop('checked'); + var auth = { + id: localStorage.getItem('auth_id'), + hash: localStorage.getItem('auth_hash') + } + $.ajax({ + url: QUERY_URL + 'planning_set_state', + method: 'POST', + data: { + auth: auth, + regatta: id, + gemeldet: gemeldet, + bezahlt: bezahlt + }, + error: function (xhr, status, error) { + if (xhr.status == 401) { + console.log('authentification failed'); + toastError('Authentifizierung fehlgeschlagen. Versuche es erneut.'); + } else if (xhr.status == 0) { + toastError('Du bist momentan offline.
Stelle eine Internetverbindung her, um den Status zu ändern'); + } else { + console.log('Login: unbekannter Fehler', status, error); + console.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(); + } + }); + console.log(id, gemeldet, bezahlt); + hideLoader(); +} + +async function planningEditStatus(id) { + $('#menu-regatta').hideMenu(); + + var regatta = await dbGetData('regattas', id); + + $('#menu-status').find('.menu-title').find('p').text(regatta.name); + + var plannings = await dbGetDataIndex('plannings', 'regatta', regatta['id']); + var planning = null; + if (isLoggedIn()) { + for (i in plannings) { + if (plannings[i]['user'] == USER_ID) { + planning = plannings[i]; + break; + } + } + } + + if (planning !== null) { + $('#switch-status-gemeldet').data('regatta', id); + $('#switch-status-gemeldet').prop('checked', planning.gemeldet == '1'); + $('#switch-status-bezahlt').prop('checked', planning.bezahlt == '1'); + $('#menu-status').showMenu(); + } +} + +function selectChange() { + var val = $('#select-year').val(); + + if (typeof siteScript === 'function') { + history.replaceState(null, '', '?year=' + val); + siteScript(); + } +} + +function initYear() { + var year = findGetParameter('year'); + if (year === null) year = new Date().getFullYear(); + + $('#select-year').html(''); + $('#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 += '
Heute ist der ' + formatDate('d.m.Y', today) + '
'; + } 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); + } + + today = getToday(); + + var selectedYear = $('#select-year').val(); + var minDate = parseDate(selectedYear + '-01-01'); + var maxDate = parseDate(selectedYear + '-12-31'); + var regattas = await dbGetRegattasRange(minDate, maxDate); + var plannings = await dbGetDataIndex('plannings', 'user', USER_ID); + for (var i = regattas.length - 1; i >= 0; i --) { + var entry = regattas[i]; + var okay = false; + for (p in plannings) { + if (plannings[p].regatta == entry.id) { + regattas[i].planning = plannings[p]; + okay = true; + break; + } + } + if (!okay) { + regattas.splice(i, 1); + } + } + var regattaResults = []; + for (id in regattas) { + var entry = regattas[id]; + var results = await dbGetDataIndex('results', 'regatta', entry['id']); + regattaResults[entry['id']] = (results.length > 0); + } + + var years = await dbGetData('years'); + years.sort(function (a, b) { + if (a['year'] > b['year']) return -1; + if (a['year'] < b['year']) return 1; + return 0; + }); + var options = ''; + for (id in years) { + var year = years[id]['year']; + options += ''; + } + $('#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 += '
'; + + // ZEILE 1 + // Name + row.content += '
' + (entry['canceled'] == 1 ? '' : '') + entry['name'] + (entry['canceled'] == 1 ? '' : '') + '
'; + + // ZEILE 2 + row.content += '
'; + + // Number + row.content += '
' + ((entry['number'] != null) ? ('# ' + entry['number']) : '') + '
'; + + // Club + row.content += '
' + ((club != null) ? club['kurz'] : '') + '
'; + + // Special + row.content += '
' + entry['special'] + '
'; + + // 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(''); + } + if (entry['bericht'] != '') + icons.push(''); + if (entry['canceled'] == '1') { + icons.push(''); + } else if (regattaResults[entry['id']]) { + icons.push(''); + } + if (entry.planning.gemeldet == '1') { + icons.push(''); + } + if (entry.planning.bezahlt == '1') { + icons.push(''); + } + row.content += '
' + icons.join(' ') + '
'; + + row.content += '
'; + + // ZEILE 3 + row.content += '
'; + + // Date + if (entry['length'] < 1) { + if (formatDate('d.m', dateFrom) == '01.01') { + row.content += '
Datum noch unklar
'; + } else { + row.content += '
' + formatDate("d.m.Y", dateFrom) + ' - Datum nicht final
'; + } + } else { + row.content += '
' + formatDate("d.m.Y", dateFrom) + ' - ' + formatDate("d.m.Y", dateTo) + '
'; + } + + // RLF + row.content += '
' + parseFloat(entry['rlf']).toFixed(2) + '
'; + + row.content += '
'; + + 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(); +} diff --git a/server/templates/menu/item-switch.html b/server/templates/menu/item-switch.html new file mode 100644 index 0000000..5a9d966 --- /dev/null +++ b/server/templates/menu/item-switch.html @@ -0,0 +1,8 @@ + + + $$0; +
+ + +
+