Abstaende: Im Template hat das Label 1em Abstand nach unten, das Eingabefeld aber gar keinen, und die Formular-Grids nutzen keinen vertikalen Gutter (gtr-uniform). Dadurch war der Abstand vom Feld zum naechsten Label 0, waehrend Label zu eigenem Feld 1em betrug - das Label wirkte, als gehoere es zum Feld darueber. Jetzt sitzt das Label eng an seinem eigenen Feld (0,5em) und die Felder haben 1,5em Abstand nach unten. Ausserdem stylt main.css die Typen number, date, datetime-local und file gar nicht; diese Felder erschienen als kleine native Kaestchen zwischen den sonst einheitlichen Feldern (z. B. "Listenfenster in Tagen" und "Zeilenhoehe im Ausdruck"). Sie bekommen jetzt dasselbe Aussehen wie die Textfelder. Die Anpassungen liegen in einer eigenen assets/css/app.css, damit main.css als Template-Datei unveraendert bleibt. Nebenbei: .hint-box.error war nirgends definiert, obwohl es die haeufigste Variante ist - Fehlermeldungen erschienen ungefaerbt wie neutrale Hinweise. In faq.php, hinweise.php, namenanpassen.php und stricheintragen.php standen <br>/<br><br> als Abstandsersatz hinter Labels und Feldern; mit den neuen Abstaenden waere daraus doppelter Leerraum geworden. Entfernt, das Layout kommt jetzt aus dem CSS. Anleitung: Neue Seite anleitung.php mit den wichtigsten Funktionen, gegliedert nach Zielgruppe. Die Abschnitte fuer Kassenwart bzw. Administration werden nur eingeblendet, wenn die Rolle sie auch nutzen kann - sonst stuenden dort Hinweise auf Menuepunkte, die es fuer den Nutzer nicht gibt. Verlinkt im Menue unter "Kaffeeliste" und im Smoke-Test abgedeckt. Geprueft: alle 12 Formularseiten rendern fehlerfrei, http-smoke 34/0, role-matrix 55/0, tenant-isolation 12/0, settings-flow 15/0. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
154 lines
4.6 KiB
PHP
154 lines
4.6 KiB
PHP
<?php
|
|
|
|
include "functions.php";
|
|
require_once __DIR__ . "/app/ledger.php";
|
|
require_once __DIR__ . "/app/faq.php";
|
|
require_once __DIR__ . "/app/audit.php";
|
|
app_require_csrf();
|
|
include "header.php";
|
|
include "headerline.php";
|
|
include "nav.php";
|
|
|
|
?>
|
|
|
|
|
|
|
|
<!-- Banner -->
|
|
<section id="banner">
|
|
<div class="content">
|
|
|
|
<?php
|
|
|
|
$pdo = app_db_pdo();
|
|
$saasUser = saas_current_user($pdo);
|
|
$tenantId = 0;
|
|
$hasAccess = false;
|
|
$kannVerwalten = false;
|
|
|
|
if ($saasUser !== null) {
|
|
$tenantId = (int)$saasUser['tenant_id'];
|
|
$hasAccess = true;
|
|
$kannVerwalten = saas_user_has_role(['owner', 'admin'], $saasUser);
|
|
}
|
|
|
|
if (!$hasAccess) {
|
|
echo "<h2>Kein Zugriff</h2>";
|
|
include "footer.php";
|
|
exit;
|
|
}
|
|
|
|
$meldung = null;
|
|
$fehler = null;
|
|
$bearbeitenId = null;
|
|
|
|
if ($kannVerwalten && $_SERVER['REQUEST_METHOD'] === 'POST') {
|
|
$aktion = $_POST['aktion'] ?? '';
|
|
$actorUserId = $saasUser['user_id'] ?? null;
|
|
|
|
if ($aktion === 'anlegen') {
|
|
if (faq_create($pdo, $tenantId, (string)($_POST['question'] ?? ''), (string)($_POST['answer'] ?? ''))) {
|
|
app_audit_log($pdo, $tenantId, $actorUserId, 'faq.created', 'faq_entry', null);
|
|
$meldung = 'Frage wurde hinzugefügt.';
|
|
} else {
|
|
$fehler = 'Bitte Frage und Antwort ausfüllen.';
|
|
}
|
|
} elseif ($aktion === 'bearbeiten') {
|
|
$bearbeitenId = (int)($_POST['id'] ?? 0);
|
|
} elseif ($aktion === 'speichern') {
|
|
$id = (int)($_POST['id'] ?? 0);
|
|
if (faq_update($pdo, $tenantId, $id, (string)($_POST['question'] ?? ''), (string)($_POST['answer'] ?? ''))) {
|
|
app_audit_log($pdo, $tenantId, $actorUserId, 'faq.updated', 'faq_entry', $id);
|
|
$meldung = 'Frage wurde aktualisiert.';
|
|
} else {
|
|
$fehler = 'Bitte Frage und Antwort ausfüllen.';
|
|
$bearbeitenId = $id;
|
|
}
|
|
} elseif ($aktion === 'loeschen') {
|
|
$id = (int)($_POST['id'] ?? 0);
|
|
if (faq_soft_delete($pdo, $tenantId, $id)) {
|
|
app_audit_log($pdo, $tenantId, $actorUserId, 'faq.deleted', 'faq_entry', $id);
|
|
$meldung = 'Frage wurde entfernt.';
|
|
}
|
|
}
|
|
}
|
|
|
|
$eintraege = faq_fetch_all($pdo, $tenantId);
|
|
$bearbeitenEintrag = null;
|
|
if ($bearbeitenId !== null) {
|
|
foreach ($eintraege as $eintrag) {
|
|
if ($eintrag['id'] === $bearbeitenId) {
|
|
$bearbeitenEintrag = $eintrag;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
?>
|
|
|
|
<h2>FAQ - Kaffeeliste</h2>
|
|
|
|
<?php if ($meldung !== null): ?>
|
|
<div class="hint-box success"><p><?php echo saas_html($meldung); ?></p></div>
|
|
<?php endif; ?>
|
|
<?php if ($fehler !== null): ?>
|
|
<div class="hint-box error"><p><?php echo saas_html($fehler); ?></p></div>
|
|
<?php endif; ?>
|
|
|
|
<?php if ($eintraege === []): ?>
|
|
<p>Für dieses Team wurden noch keine Fragen hinterlegt.</p>
|
|
<?php endif; ?>
|
|
|
|
<?php foreach ($eintraege as $eintrag): ?>
|
|
<div class="faq-entry">
|
|
<?php if ($kannVerwalten && $bearbeitenEintrag !== null && $bearbeitenEintrag['id'] === $eintrag['id']): ?>
|
|
<form method="post" action="faq.php">
|
|
<?php echo app_csrf_field(); ?>
|
|
<input type="hidden" name="aktion" value="speichern">
|
|
<input type="hidden" name="id" value="<?php echo (int)$eintrag['id']; ?>">
|
|
<label>Frage:</label>
|
|
<input type="text" name="question" value="<?php echo saas_html($eintrag['question']); ?>" required>
|
|
<label>Antwort:</label>
|
|
<textarea name="answer" required><?php echo saas_html($eintrag['answer']); ?></textarea>
|
|
<button type="submit">Speichern</button>
|
|
<a href="faq.php" class="button">Abbrechen</a>
|
|
</form>
|
|
<?php else: ?>
|
|
<p><b><?php echo saas_html($eintrag['question']); ?></b></p>
|
|
<p><?php echo nl2br(saas_html($eintrag['answer'])); ?></p>
|
|
<?php if ($kannVerwalten): ?>
|
|
<form method="post" action="faq.php" style="display:inline">
|
|
<?php echo app_csrf_field(); ?>
|
|
<input type="hidden" name="aktion" value="bearbeiten">
|
|
<input type="hidden" name="id" value="<?php echo (int)$eintrag['id']; ?>">
|
|
<button type="submit">Bearbeiten</button>
|
|
</form>
|
|
<form method="post" action="faq.php" style="display:inline" onsubmit="return confirm('Diese Frage wirklich entfernen?');">
|
|
<?php echo app_csrf_field(); ?>
|
|
<input type="hidden" name="aktion" value="loeschen">
|
|
<input type="hidden" name="id" value="<?php echo (int)$eintrag['id']; ?>">
|
|
<button type="submit">Entfernen</button>
|
|
</form>
|
|
<?php endif; ?>
|
|
<?php endif; ?>
|
|
</div>
|
|
<br>
|
|
<?php endforeach; ?>
|
|
|
|
<?php if ($kannVerwalten): ?>
|
|
<h3>Neue Frage hinzufügen</h3>
|
|
<form method="post" action="faq.php">
|
|
<?php echo app_csrf_field(); ?>
|
|
<input type="hidden" name="aktion" value="anlegen">
|
|
<label>Frage:</label>
|
|
<input type="text" name="question" required>
|
|
<label>Antwort:</label>
|
|
<textarea name="answer" required></textarea>
|
|
<button type="submit">Frage hinzufügen</button>
|
|
</form>
|
|
<?php endif; ?>
|
|
|
|
</div>
|
|
</section>
|
|
|
|
<?php include "footer.php"; ?>
|