Datumsauswahl korrigiert

This commit is contained in:
Klaas 2024-05-26 18:25:15 +02:00
parent 94b50dbd21
commit a866361fda
2 changed files with 100 additions and 61 deletions

54
app.js
View File

@ -5,7 +5,7 @@ const crypto = require('crypto');
const nodemailer = require('nodemailer'); const nodemailer = require('nodemailer');
const { Pool } = require('pg'); const { Pool } = require('pg');
const path = require('path'); const path = require('path');
const moment=require('moment') const moment = require('moment');
require('dotenv').config(); require('dotenv').config();
const app = express(); const app = express();
@ -134,12 +134,7 @@ const getTraining = async (selectedDate) => {
// Funktion zum Laden aller Spiele // Funktion zum Laden aller Spiele
const getAllSpiele = async () => { const getAllSpiele = async () => {
const result = await pool.query(` const result = await pool.query(`
SELECT s.id, s.name, SELECT * FROM spiele ORDER BY name ASC;
COALESCE(EXTRACT(EPOCH FROM (NOW() - MAX(tr.datum))) / 604800, EXTRACT(EPOCH FROM (NOW() - '1970-01-01'::date)) / 604800) AS weeks_since_last
FROM spiele s
LEFT JOIN trainings tr ON s.id = tr.spiel
GROUP BY s.id
ORDER BY weeks_since_last ASC;
`); `);
return result.rows; return result.rows;
}; };
@ -335,8 +330,6 @@ app.get('/profile', requireAuth, (req, res) => {
res.render('profile', { session: req.session}); // Stelle sicher, dass es eine profile.ejs gibt res.render('profile', { session: req.session}); // Stelle sicher, dass es eine profile.ejs gibt
}); });
app.post('/profile', requireAuth, async (req, res) => { app.post('/profile', requireAuth, async (req, res) => {
const { email, password } = req.body; const { email, password } = req.body;
try { try {
@ -355,13 +348,25 @@ app.post('/profile', requireAuth, async (req, res) => {
}); });
app.post('/update-training', async (req, res) => { app.post('/update-training', async (req, res) => {
const { trainingId, type, spielId } = req.body; const { trainingId, type, spielName } = req.body;
let spielId;
const spiel = await pool.query(`SELECT * FROM spiele WHERE name = $1`, [spielName]);
if (spiel.rows.length > 0) {
spielId = spiel.rows[0].id;
console.log('Spiel existiert, die ID ist $1', [ spielId ]);
} else {
const newSpiel = await pool.query('INSERT INTO spiele (name) VALUES ($1) RETURNING id', [spielName]);
spielId = newSpiel.rows[0].id;
console.log('Spiel existiert nicht, wurde mitID $1 angelegt', [ spielId ]);
}
try { try {
if (type === 'spiel') { if (type === 'spiel') {
await pool.query('UPDATE trainings SET spiel = $1 WHERE id = $2', [spielId, trainingId]); await pool.query('UPDATE trainings SET spiel = $1 WHERE id = $2', [ spielId, trainingId ]);
} else if (type === 'aufwaermen') { } else if (type === 'aufwaermen') {
await pool.query('UPDATE trainings SET aufwaermen = $1 WHERE id = $2', [spielId, trainingId]); await pool.query('UPDATE trainings SET aufwaermen = $1 WHERE id = $2', [ spielId, trainingId ]);
} }
res.redirect('/'); res.redirect('/');
} catch (err) { } catch (err) {
@ -395,9 +400,17 @@ app.get('/admin', requireAuth, requireAdmin, async (req, res) => {
// Teilnehmer_innen // Teilnehmer_innen
app.get('/', requireAuth, async (req, res) => { app.get('/', requireAuth, async (req, res) => {
try { try {
const selectedDate = req.query.date; let dateParam = req.query.date;
let selectedDate;
const training = await getTraining(selectedDate);
if (dateParam) {
selectedDate = moment(dateParam, 'DD.MM.YYYY').toDate();
} else {
selectedDate = moment().toDate();
}
const training =await getTraining(selectedDate);
const trainingsResult = await pool.query('SELECT datum FROM trainings ORDER BY datum ASC'); const trainingsResult = await pool.query('SELECT datum FROM trainings ORDER BY datum ASC');
const trainingsDates = trainingsResult.rows.map(tr => ({ const trainingsDates = trainingsResult.rows.map(tr => ({
@ -405,6 +418,12 @@ app.get('/', requireAuth, async (req, res) => {
rawDatum: tr.datum rawDatum: tr.datum
})); }));
// Vorheriges Training ermitteln
const previousTrainingResult = await pool.query('SELECT * FROM trainings WHERE datum < $1 ORDER BY datum DESC LIMIT 1',[ selectedDate ]);
const nextTrainingResult = await pool.query('SELECT * FROM trainings WHERE datum > $1 ORDER BY datum ASC LIMIT 1',[ selectedDate ]);
const previousTraining = previousTrainingResult.rows.length > 0 ? previousTrainingResult.rows[0] : null;
const nextTraining = nextTrainingResult.rows.length > 0 ? nextTrainingResult.rows[0] : null;
if (training) { if (training) {
training.datum = formatDate(training.datum); training.datum = formatDate(training.datum);
} }
@ -422,7 +441,10 @@ app.get('/', requireAuth, async (req, res) => {
spielleiterCandidates, spielleiterCandidates,
aufwaermenCandidates, // Übergeben der Kandidaten für Aufwärmleiter aufwaermenCandidates, // Übergeben der Kandidaten für Aufwärmleiter
spielCandidates, // Übergeben der Spiele spielCandidates, // Übergeben der Spiele
session: req.session session: req.session,
previousTraining,
nextTraining,
moment
}); });
} catch (err) { } catch (err) {
console.error(err); console.error(err);

View File

@ -1,16 +1,16 @@
<%- include('partials/header') %> <%- include('partials/header') %>
<h1>Training <%= training.datum %></h1> <h1>
<h2> <%= training.datum + 7 %> </h2> <div>
<form method="GET" action="/"> <% if (previousTraining) { %>
<label for="training-date">Datum wählen:</label> <a href="/?date=<%= moment(previousTraining.datum).format('DD.MM.YYYY') %>"> &lt; </a>
<select id="training-date" name="date" onchange="this.form.submit()"> <% } %>
<% trainingsDates.forEach(date => { %> Training <%= training.datum %>
<option value="<%= date.rawDatum %>" <%= selectedDate === date.datum ? 'selected' : '' %>> <% if (nextTraining) { %>
<%= date.datum %> <a href="/?date=<%= moment(nextTraining.datum).format('DD.MM.YYYY') %>"> &gt; </a>
</option> <% } %>
<% }) %> </h1>
</select> </div>
</form>
<% if (training) { %> <% if (training) { %>
<h2> Geräte </h2> <h2> Geräte </h2>
<ul> <ul>
@ -20,11 +20,16 @@
<li>Riege 4: <%= training.geraet_riege_4_name %></li> <li>Riege 4: <%= training.geraet_riege_4_name %></li>
<li>Riege 5: <%= training.geraet_riege_5_name %></li> <li>Riege 5: <%= training.geraet_riege_5_name %></li>
</ul> </ul>
Aufwärmen:
<div id="aufwaermen">
<h3>Aufwärmen:</h3>
<% if (training.aufwaermleiter_name) { %> <% if (training.aufwaermleiter_name) { %>
<%= training.aufwaermleiter_name %> <p><strong>Leitung:</strong>
<%= training.aufwaermleiter_name %></p>
<% } else { %> <% } else { %>
<form method="POST" action="/update-leader"> <form method="POST" action="/update-leader">
<p><strong>Leitung:</strong>
<input type="hidden" name="trainingId" value="<%= training.id %>"> <input type="hidden" name="trainingId" value="<%= training.id %>">
<input type="hidden" name="type" value="aufwaermleiter"> <input type="hidden" name="type" value="aufwaermleiter">
<select name="leaderId"> <select name="leaderId">
@ -33,35 +38,36 @@
<% }) %> <% }) %>
</select> </select>
<button type="submit">Speichern</button> <button type="submit">Speichern</button>
</form> </form></p>
<% } %> <% } %>
</br>
<% if (training.aufwaermen_name) { %> <% if (training.aufwaermen_name) { %>
<%= training.aufwaermen_name %> <p><strong>Spiel:</strong>
<%= training.aufwaermen_name %></p>
<% } else { %> <% } else { %>
<form method="POST" action="/update-training"> <form method="POST" action="/update-training">
<p><strong>Spiel:</strong>
<input type="hidden" name="trainingId" value="<%= training.id %>"> <input type="hidden" name="trainingId" value="<%= training.id %>">
<input type="hidden" name="type" value="aufwaermen"> <input type="hidden" name="type" value="aufwaermen">
<select name="spielId"> <datalist id="spiele">
<% aufwaermenCandidates.forEach(candidate => { %> <% aufwaermenCandidates.forEach(candidate => { %>
<option value="<%= candidate.id %>"><%= candidate.name %> (<%= Math.floor(candidate.weeks_since_last) %> Wochen)</option> <option value="<%= candidate.name %>"><%= candidate.name %></option>
<% }) %> <% }) %>
</select> </datalist>
<input list="spiele" id="spielName" name="spielName">
<button type="submit">Speichern</button> <button type="submit">Speichern</button>
</form> </form></p>
<% } %> <% } %>
<form method="POST" action="/add-spiel"> </div>
<input type="hidden" name="trainingId" value="<%= training.id %>"> <div id="spiel">
<input type="hidden" name="type" value="aufwaermen"> <h3>Spiel: </h3>
<input type="text" name="aufwaermenName" placeholder="Neues Aufwärmen">
<button type="submit">Hinzufügen</button>
</form>
Spiel:
<% if (training.spielleiter_name) { %> <% if (training.spielleiter_name) { %>
<%= training.spielleiter_name %> <p><strong>Leitung:</strong>
<%= training.spielleiter_name %></p>
<% } else { %> <% } else { %>
<form method="POST" action="/update-leader"> <form method="POST" action="/update-leader">
<p><strong>Leitung:</strong>
<input type="hidden" name="trainingId" value="<%= training.id %>"> <input type="hidden" name="trainingId" value="<%= training.id %>">
<input type="hidden" name="type" value="spielleiter"> <input type="hidden" name="type" value="spielleiter">
<select name="leaderId"> <select name="leaderId">
@ -70,31 +76,42 @@
<% }) %> <% }) %>
</select> </select>
<button type="submit">Speichern</button> <button type="submit">Speichern</button>
</form> </form></p>
<% } %> <% } %>
</br>
<!-- Für Spiel -->
<% if (training.spiel_name) { %> <% if (training.spiel_name) { %>
<p><strong>Spiel:</strong>
<%= training.spiel_name %> <%= training.spiel_name %>
<% } else { %> <% } else { %>
<form method="POST" action="/update-training"> <form method="POST" action="/update-training">
<p><strong>Spiel:</strong>
<input type="hidden" name="trainingId" value="<%= training.id %>"> <input type="hidden" name="trainingId" value="<%= training.id %>">
<input type="hidden" name="type" value="spiel"> <input type="hidden" name="type" value="spiel">
<select name="spielId"> <datalist id="spiele">
<% spielCandidates.forEach(candidate => { %> <% aufwaermenCandidates.forEach(candidate => { %>
<option value="<%= candidate.id %>"><%= candidate.name %> (<%= Math.floor(candidate.weeks_since_last) %> Wochen)</option> <option value="<%= candidate.name %>"><%= candidate.name %></option>
<% }) %> <% }) %>
</select> </datalist>
<input list="spiele" id="spielName" name="spielName">
<button type="submit">Speichern</button> <button type="submit">Speichern</button>
</form> </form>
<% } %> <% } %>
<form method="POST" action="/add-spiel"> </div>
<input type="hidden" name="trainingId" value="<%= training.id %>">
<input type="hidden" name="type" value="spiel"> <form method="GET" action="/">
<input type="text" name="spielName" placeholder="Neues Spiel"> <label for="training-date">Datum wählen:</label>
<button type="submit">Hinzufügen</button> <select id="training-date" name="date" onchange="this.form.submit()">
</form> <% trainingsDates.forEach(date => { %>
<option value="<%= date.datum %>" <%= selectedDate === date.datum ? 'selected' : '' %>>
<%= date.datum %>
</option>
<% }) %>
</select>
</form>
<% } else { %> <% } else { %>
<p>Kein Training gefunden für das ausgewählte Datum.</p> <p>Kein Training gefunden für das ausgewählte Datum.</p>
<% } %> <% } %>