v1.2.0 - Anpassung der Release Notes

This commit is contained in:
Borgal
2025-10-31 22:34:00 +01:00
parent 9782304e61
commit 0b8cc216b4
3 changed files with 403 additions and 216 deletions

215
info.php
View File

@@ -1,215 +0,0 @@
<?php
// 🔐 Sicherheits- und Datenbanklogik zuerst VOR jeglicher HTML-Ausgabe
include('inc/check_login.php');
require_once('inc/db.php');
$is_admin = ($_SESSION['role'] === 'admin');
$message = '';
$message_type = '';
$edit_mode = false;
$edit_release = null;
// --- Nur Admins: Aktionen verarbeiten ---
if ($is_admin) {
// Löschen
if (isset($_GET['action']) && $_GET['action'] === 'delete' && isset($_GET['id'])) {
$id = (int)$_GET['id'];
$stmt = mysqli_prepare($conn, "DELETE FROM releases WHERE id = ?");
mysqli_stmt_bind_param($stmt, "i", $id);
if (mysqli_stmt_execute($stmt)) {
$_SESSION['message'] = "Version erfolgreich gelöscht!";
$_SESSION['message_type'] = 'success';
} else {
$_SESSION['message'] = "Fehler beim Löschen.";
$_SESSION['message_type'] = 'danger';
}
mysqli_stmt_close($stmt);
header("Location: info.php");
exit();
}
// Bearbeiten: Daten laden
if (isset($_GET['action']) && $_GET['action'] === 'edit' && isset($_GET['id'])) {
$id = (int)$_GET['id'];
$stmt = mysqli_prepare($conn, "SELECT id, version, release_date, notes FROM releases WHERE id = ?");
mysqli_stmt_bind_param($stmt, "i", $id);
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
$edit_release = mysqli_fetch_assoc($result);
mysqli_stmt_close($stmt);
$edit_mode = true;
if (!$edit_release) {
$_SESSION['message'] = "Version nicht gefunden.";
$_SESSION['message_type'] = 'warning';
}
}
// Speichern (POST)
if ($_SERVER["REQUEST_METHOD"] === "POST") {
$version = trim($_POST['version'] ?? '');
$date = trim($_POST['date'] ?? '');
$notes = trim($_POST['notes'] ?? '');
$id = !empty($_POST['id']) ? (int)$_POST['id'] : null;
if (empty($version) || empty($date) || empty($notes)) {
$_SESSION['message'] = "Alle Felder sind erforderlich.";
$_SESSION['message_type'] = 'danger';
} elseif (!preg_match('/^v\d+\.\d+\.\d+$/', $version)) {
$_SESSION['message'] = "Ungültiges Versionsformat. Beispiel: v1.4.2";
$_SESSION['message_type'] = 'danger';
} elseif (!strtotime($date)) {
$_SESSION['message'] = "Ungültiges Datum.";
$_SESSION['message_type'] = 'danger';
} else {
if ($id) {
$stmt = mysqli_prepare($conn, "UPDATE releases SET version = ?, release_date = ?, notes = ? WHERE id = ?");
mysqli_stmt_bind_param($stmt, "sssi", $version, $date, $notes, $id);
} else {
$stmt = mysqli_prepare($conn, "INSERT INTO releases (version, release_date, notes) VALUES (?, ?, ?)");
mysqli_stmt_bind_param($stmt, "sss", $version, $date, $notes);
}
if (mysqli_stmt_execute($stmt)) {
$_SESSION['message'] = $id ? "Version aktualisiert!" : "Neue Version hinzugefügt!";
$_SESSION['message_type'] = 'success';
mysqli_stmt_close($stmt);
header("Location: info.php");
exit();
} else {
$_SESSION['message'] = "Fehler beim Speichern.";
$_SESSION['message_type'] = 'danger';
}
mysqli_stmt_close($stmt);
}
}
}
// --- Meldungen aus Session holen (nach Redirects) ---
if (isset($_SESSION['message'])) {
$message = $_SESSION['message'];
$message_type = $_SESSION['message_type'];
unset($_SESSION['message'], $_SESSION['message_type']);
}
// --- Daten für Anzeige laden ---
$releases = [];
$result = mysqli_query($conn, "SELECT id, version, release_date, notes FROM releases ORDER BY release_date DESC, id DESC");
while ($row = mysqli_fetch_assoc($result)) {
$row['notes_array'] = array_filter(array_map('trim', explode("\n", $row['notes'])));
$releases[] = $row;
}
$current_release = $releases[0] ?? null;
// --- Erst JETZT: HTML-Header einbinden ---
require_once('inc/header.php');
?>
<div class="container mt-5 mb-4">
<?php if ($message): ?>
<div class="alert alert-<?= htmlspecialchars($message_type) ?> alert-dismissible fade show" role="alert">
<?= htmlspecialchars($message) ?>
<button type="button" class="btn-close" data-bs-dismiss="alert"></button>
</div>
<?php endif; ?>
<div class="row justify-content-center">
<div class="col-lg-8">
<h2 class="mb-4"> Info & Versionshinweise</h2>
<?php if ($current_release): ?>
<div class="card shadow mb-4">
<div class="card-header bg-primary-subtle text-secondary">
<h4 class="mb-0">Aktuelle Version</h4>
</div>
<div class="card-body">
<p class="h5 mb-0"><?= htmlspecialchars($current_release['version']) ?></p>
<p class="text-muted small mb-0">Veröffentlicht am: <?= date('d.m.Y', strtotime($current_release['release_date'])) ?></p>
</div>
</div>
<?php endif; ?>
<div class="card shadow">
<div class="card-header bg-secondary bg-opacity-50 text-secondary d-flex justify-content-between align-items-center">
<h4 class="mb-0">Release Notes</h4>
<?php if ($is_admin): ?>
<a class="btn btn-sm d-flex align-items-center justify-content-center" data-bs-toggle="collapse" href="#releaseFormCollapse" role="button" aria-expanded="false" aria-controls="releaseFormCollapse">Add
<span class="material-symbols-outlined">add</span>
</a>
<?php endif; ?>
</div>
<div class="card-body">
<?php if ($is_admin): ?>
<div class="collapse <?= $edit_mode ? 'show' : '' ?>" id="releaseFormCollapse">
<div class="card card-body bg-light mb-4">
<h5><?= $edit_mode ? 'Version bearbeiten' : 'Neue Version hinzufügen'; ?></h5>
<form method="POST">
<?php if ($edit_mode): ?>
<input type="hidden" name="id" value="<?= htmlspecialchars($edit_release['id']); ?>">
<?php endif; ?>
<div class="mb-3">
<label class="form-label">Versionsnummer</label>
<input type="text" class="form-control" name="version" value="<?= htmlspecialchars($edit_release['version'] ?? ''); ?>" placeholder="z.B. v1.5.0" required>
<div class="form-text">Format: v1.4.2</div>
</div>
<div class="mb-3">
<label class="form-label">Veröffentlichungsdatum</label>
<input type="date" class="form-control" name="date" value="<?= htmlspecialchars($edit_release['release_date'] ?? date('Y-m-d')); ?>" required>
</div>
<div class="mb-3">
<label class="form-label">Release Notes (ein Punkt pro Zeile)</label>
<textarea class="form-control" name="notes" rows="5" required><?= htmlspecialchars($edit_release['notes'] ?? '') ?></textarea>
</div>
<div class="d-flex gap-2">
<button type="submit" class="btn btn-sm btn-outline-<?= $edit_mode ? 'success' : 'primary'; ?>"><?= $edit_mode ? 'Speichern' : 'Hinzufügen'; ?></button>
<a href="info.php" class="btn btn-sm btn-outline-secondary">Abbrechen</a>
</div>
</form>
</div>
</div>
<?php endif; ?>
<?php if (empty($releases)): ?>
<p class="text-muted">Keine Release Notes vorhanden.</p>
<?php else: ?>
<?php foreach ($releases as $release): ?>
<div class="d-flex align-items-start">
<div class="flex-grow-1">
<h5 class="mt-4 mb-1"><?= htmlspecialchars($release['version']) ?></h5>
<p class="text-muted small mb-3">Veröffentlicht am: <?= date('d.m.Y', strtotime($release['release_date'])) ?></p>
<ul class="mb-4">
<?php foreach ($release['notes_array'] as $note): ?>
<li><?= htmlspecialchars($note) ?></li>
<?php endforeach; ?>
</ul>
</div>
<?php if ($is_admin): ?>
<div class="dropdown ms-3 mt-4">
<a href="#" class="text-secondary" role="button" data-bs-toggle="dropdown" aria-expanded="false">
<span class="material-icons">more_vert</span>
</a>
<ul class="dropdown-menu dropdown-menu-end">
<li>
<a class="dropdown-item d-flex align-items-center" href="info.php?action=edit&id=<?= $release['id'] ?>">
<span class="material-icons me-2">mode_edit_outline</span> Bearbeiten
</a>
</li>
<li>
<a class="dropdown-item d-flex align-items-center text-danger" href="info.php?action=delete&id=<?= $release['id'] ?>" onclick="return confirm('Wirklich löschen?')">
<span class="material-icons me-2">delete_outline</span> Löschen
</a>
</li>
</ul>
</div>
<?php endif; ?>
</div>
<?php endforeach; ?>
<?php endif; ?>
</div>
</div>
</div>
</div>
</div>
<?php include('inc/footer.php'); ?>