first commit

This commit is contained in:
2026-01-29 21:08:01 +01:00
commit 4e4dfe66c6
28 changed files with 2509 additions and 0 deletions

152
views/calendar/form.php Normal file
View File

@@ -0,0 +1,152 @@
<?php
$pageTitle = (isset($event) ? 'Edycja' : 'Nowe') . ' wydarzenie - System 2FA';
$bodyClass = 'bg-light';
$extraHead = '<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">'
. '<link rel="stylesheet" href="/public/css/calendar.css">';
ob_start();
?>
<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
<div class="container-fluid">
<a class="navbar-brand" href="/panel">
<i class="fas fa-shield-alt"></i> System 2FA
</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav me-auto">
<li class="nav-item">
<a class="nav-link" href="/pulpit">
<i class="fas fa-home"></i> Pulpit
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/notatnik">
<i class="fas fa-sticky-note"></i> Notatnik
</a>
</li>
<li class="nav-item">
<a class="nav-link active" href="/kalendarz">
<i class="fas fa-calendar-alt"></i> Kalendarz
</a>
</li>
</ul>
<ul class="navbar-nav">
<li class="nav-item">
<span class="nav-link text-white">
<i class="fas fa-user"></i> <?php echo htmlspecialchars($_SESSION['username']); ?>
</span>
</li>
<li class="nav-item">
<a class="nav-link" href="/wyloguj-sie">
<i class="fas fa-sign-out-alt"></i> Wyloguj
</a>
</li>
</ul>
</div>
</div>
</nav>
<div class="container mt-4">
<div class="row justify-content-center">
<div class="col-lg-8">
<div class="card shadow">
<div class="card-header bg-primary text-white">
<h4 class="mb-0">
<i class="fas fa-calendar-plus"></i> <?php echo isset($event) ? 'Edycja wydarzenia' : 'Nowe wydarzenie'; ?>
</h4>
</div>
<div class="card-body">
<?php if (isset($_SESSION['error'])): ?>
<div class="alert alert-danger alert-dismissible fade show" role="alert">
<i class="fas fa-exclamation-circle"></i> <?php echo htmlspecialchars($_SESSION['error']); unset($_SESSION['error']); ?>
<button type="button" class="btn-close" data-bs-dismiss="alert"></button>
</div>
<?php endif; ?>
<form method="POST" action="/wydarzenie/zapisz">
<?php if (isset($event)): ?>
<input type="hidden" name="event_id" value="<?php echo $event['id']; ?>">
<?php endif; ?>
<input type="hidden" name="return_month" value="<?php echo htmlspecialchars($returnMonth); ?>">
<div class="mb-3">
<label for="title" class="form-label">
<i class="fas fa-heading"></i> Tytuł wydarzenia *
</label>
<input type="text"
class="form-control form-control-lg"
id="title"
name="title"
placeholder="Wpisz tytuł wydarzenia..."
value="<?php echo isset($event) ? htmlspecialchars($event['title']) : ''; ?>"
required
autofocus>
</div>
<div class="mb-3">
<label for="event_date" class="form-label">
<i class="fas fa-calendar-day"></i> Data wydarzenia *
</label>
<input type="date"
class="form-control"
id="event_date"
name="event_date"
value="<?php echo htmlspecialchars($defaultDate); ?>"
required>
</div>
<div class="mb-3">
<label for="content" class="form-label">
<i class="fas fa-align-left"></i> Treść wydarzenia
</label>
<textarea class="form-control"
id="content"
name="content"
rows="8"
placeholder="Wpisz treść wydarzenia..."><?php echo isset($event) ? htmlspecialchars($event['content']) : ''; ?></textarea>
<small class="form-text text-muted">
<i class="fas fa-info-circle"></i> Pole opcjonalne
</small>
</div>
<div class="d-flex justify-content-between align-items-center">
<a href="/kalendarz?month=<?php echo htmlspecialchars($returnMonth); ?>&date=<?php echo htmlspecialchars($defaultDate); ?>" class="btn btn-secondary">
<i class="fas fa-arrow-left"></i> Powrót do kalendarza
</a>
<button type="submit" class="btn btn-primary btn-lg">
<i class="fas fa-save"></i> Zapisz wydarzenie
</button>
</div>
</form>
</div>
<?php if (isset($event)): ?>
<div class="card-footer text-muted small">
<div class="row">
<div class="col-md-6">
<i class="fas fa-calendar-plus"></i> Utworzono:
<?php
$date = new DateTime($event['created_at']);
echo $date->format('d.m.Y H:i');
?>
</div>
<div class="col-md-6 text-md-end">
<i class="fas fa-calendar-check"></i> Zaktualizowano:
<?php
$date = new DateTime($event['updated_at']);
echo $date->format('d.m.Y H:i');
?>
</div>
</div>
</div>
<?php endif; ?>
</div>
</div>
</div>
</div>
<?php
$content = ob_get_clean();
require __DIR__ . '/../layout.php';
?>

221
views/calendar/index.php Normal file
View File

@@ -0,0 +1,221 @@
<?php
$pageTitle = 'Kalendarz - System 2FA';
$bodyClass = 'bg-light';
$extraHead = '<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">'
. '<link rel="stylesheet" href="/public/css/calendar.css">';
ob_start();
?>
<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
<div class="container-fluid">
<a class="navbar-brand" href="/panel">
<i class="fas fa-shield-alt"></i> System 2FA
</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav me-auto">
<li class="nav-item">
<a class="nav-link" href="/pulpit">
<i class="fas fa-home"></i> Pulpit
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/notatnik">
<i class="fas fa-sticky-note"></i> Notatnik
</a>
</li>
<li class="nav-item">
<a class="nav-link active" href="/kalendarz">
<i class="fas fa-calendar-alt"></i> Kalendarz
</a>
</li>
</ul>
<ul class="navbar-nav">
<li class="nav-item">
<span class="nav-link text-white">
<i class="fas fa-user"></i> <?php echo htmlspecialchars($_SESSION['username']); ?>
</span>
</li>
<li class="nav-item">
<a class="nav-link" href="/wyloguj-sie">
<i class="fas fa-sign-out-alt"></i> Wyloguj
</a>
</li>
</ul>
</div>
</div>
</nav>
<div class="container mt-4">
<?php if (isset($_SESSION['success'])): ?>
<div class="alert alert-success alert-dismissible fade show" role="alert">
<i class="fas fa-check-circle"></i> <?php echo htmlspecialchars($_SESSION['success']); unset($_SESSION['success']); ?>
<button type="button" class="btn-close" data-bs-dismiss="alert"></button>
</div>
<?php endif; ?>
<?php if (isset($_SESSION['error'])): ?>
<div class="alert alert-danger alert-dismissible fade show" role="alert">
<i class="fas fa-exclamation-circle"></i> <?php echo htmlspecialchars($_SESSION['error']); unset($_SESSION['error']); ?>
<button type="button" class="btn-close" data-bs-dismiss="alert"></button>
</div>
<?php endif; ?>
<div class="d-flex flex-wrap justify-content-between align-items-center mb-3">
<div class="d-flex align-items-center gap-2">
<a class="btn btn-outline-secondary" href="/kalendarz?month=<?php echo $prevMonth; ?>">
<i class="fas fa-chevron-left"></i>
</a>
<h3 class="mb-0 calendar-title"><?php echo htmlspecialchars($monthLabel); ?></h3>
<a class="btn btn-outline-secondary" href="/kalendarz?month=<?php echo $nextMonth; ?>">
<i class="fas fa-chevron-right"></i>
</a>
</div>
<a href="/wydarzenie/nowe?date=<?php echo htmlspecialchars($selectedDate); ?>&month=<?php echo $month; ?>" class="btn btn-primary">
<i class="fas fa-plus"></i> Nowe wydarzenie
</a>
</div>
<div class="calendar-grid">
<div class="calendar-weekday">Pon</div>
<div class="calendar-weekday">Wto</div>
<div class="calendar-weekday">Śro</div>
<div class="calendar-weekday">Czw</div>
<div class="calendar-weekday">Pią</div>
<div class="calendar-weekday">Sob</div>
<div class="calendar-weekday">Ndz</div>
<?php
$dayCounter = 1;
$totalCells = 42; // 6 tygodni
for ($cell = 1; $cell <= $totalCells; $cell++):
$cellDay = $cell - $startWeekday + 1;
$isCurrentMonth = $cellDay >= 1 && $cellDay <= $daysInMonth;
$dateStr = $isCurrentMonth ? $monthDate->format('Y-m') . '-' . str_pad($cellDay, 2, '0', STR_PAD_LEFT) : '';
$isSelected = $isCurrentMonth && $dateStr === $selectedDate;
$eventsForDay = $isCurrentMonth && isset($eventsByDate[$dateStr]) ? $eventsByDate[$dateStr] : [];
?>
<div class="calendar-cell <?php echo $isCurrentMonth ? '' : 'calendar-cell--disabled'; ?> <?php echo $isSelected ? 'calendar-cell--selected' : ''; ?>">
<?php if ($isCurrentMonth): ?>
<a class="calendar-day" href="/kalendarz?month=<?php echo $month; ?>&date=<?php echo $dateStr; ?>">
<?php echo $cellDay; ?>
</a>
<?php if (!empty($eventsForDay)): ?>
<div class="calendar-events">
<?php foreach (array_slice($eventsForDay, 0, 2) as $event): ?>
<div class="calendar-event">
<i class="fas fa-circle"></i>
<?php echo htmlspecialchars($event['title']); ?>
</div>
<?php endforeach; ?>
<?php if (count($eventsForDay) > 2): ?>
<div class="calendar-event calendar-event--more">+<?php echo count($eventsForDay) - 2; ?> więcej</div>
<?php endif; ?>
</div>
<?php endif; ?>
<?php endif; ?>
</div>
<?php endfor; ?>
</div>
<div class="row mt-4">
<div class="col-lg-6">
<div class="card shadow-sm">
<div class="card-header bg-primary text-white">
<i class="fas fa-list"></i> Wydarzenia: <?php echo htmlspecialchars($selectedDate); ?>
</div>
<div class="card-body">
<?php if (empty($eventsForSelected)): ?>
<p class="text-muted mb-0">Brak wydarzeń dla wybranego dnia.</p>
<?php else: ?>
<div class="list-group">
<?php foreach ($eventsForSelected as $event): ?>
<div class="list-group-item list-group-item-action d-flex justify-content-between align-items-start">
<div class="me-3">
<h6 class="mb-1">
<i class="fas fa-calendar-check text-primary"></i>
<?php echo htmlspecialchars($event['title']); ?>
</h6>
<p class="mb-1 small text-muted">
<?php echo nl2br(htmlspecialchars($event['content'] ?? '')); ?>
</p>
</div>
<div class="btn-group">
<a class="btn btn-sm btn-outline-primary" href="/wydarzenie/edytuj?id=<?php echo $event['id']; ?>&month=<?php echo $month; ?>">
<i class="fas fa-edit"></i>
</a>
<button class="btn btn-sm btn-outline-danger" type="button"
onclick="confirmDeleteEvent(<?php echo $event['id']; ?>, '<?php echo htmlspecialchars(addslashes($event['title'])); ?>')">
<i class="fas fa-trash"></i>
</button>
</div>
</div>
<?php endforeach; ?>
</div>
<?php endif; ?>
</div>
</div>
</div>
<div class="col-lg-6 mt-3 mt-lg-0">
<div class="card shadow-sm">
<div class="card-header bg-light">
<i class="fas fa-info-circle"></i> Szybkie akcje
</div>
<div class="card-body">
<p class="mb-2">Dodaj wydarzenie dla wybranego dnia:</p>
<a class="btn btn-primary" href="/wydarzenie/nowe?date=<?php echo htmlspecialchars($selectedDate); ?>&month=<?php echo $month; ?>">
<i class="fas fa-plus"></i> Dodaj wydarzenie
</a>
</div>
</div>
</div>
</div>
</div>
<div class="modal fade" id="deleteEventModal" tabindex="-1" aria-labelledby="deleteEventModalLabel" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered">
<div class="modal-content">
<div class="modal-header bg-danger text-white">
<h5 class="modal-title" id="deleteEventModalLabel">
<i class="fas fa-exclamation-triangle"></i> Potwierdź usunięcie
</h5>
<button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<p>Czy na pewno chcesz usunąć wydarzenie:</p>
<p class="fw-bold" id="eventTitle"></p>
<p class="text-muted small">Tej operacji nie można cofnąć.</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">
<i class="fas fa-times"></i> Anuluj
</button>
<form method="POST" action="/wydarzenie/usun">
<input type="hidden" name="event_id" id="deleteEventId">
<input type="hidden" name="return_month" value="<?php echo $month; ?>">
<input type="hidden" name="return_date" value="<?php echo htmlspecialchars($selectedDate); ?>">
<button type="submit" class="btn btn-danger">
<i class="fas fa-trash"></i> Usuń wydarzenie
</button>
</form>
</div>
</div>
</div>
</div>
<?php
$content = ob_get_clean();
$extraScript = '<script>
function confirmDeleteEvent(eventId, eventTitle) {
document.getElementById("deleteEventId").value = eventId;
document.getElementById("eventTitle").textContent = eventTitle;
const modal = new bootstrap.Modal(document.getElementById("deleteEventModal"));
modal.show();
}
</script>';
require __DIR__ . '/../layout.php';
?>

144
views/dashboard.php Normal file
View File

@@ -0,0 +1,144 @@
<?php
$pageTitle = 'Panel - System 2FA';
$bodyClass = 'bg-light';
$extraHead = '<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">';
ob_start();
?>
<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
<div class="container-fluid">
<a class="navbar-brand" href="/panel">
<i class="fas fa-shield-alt"></i> System 2FA
</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav me-auto">
<li class="nav-item">
<a class="nav-link active" href="/pulpit">
<i class="fas fa-home"></i> Pulpit
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/notatnik">
<i class="fas fa-sticky-note"></i> Notatnik
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/kalendarz">
<i class="fas fa-calendar-alt"></i> Kalendarz
</a>
</li>
</ul>
<ul class="navbar-nav">
<li class="nav-item">
<span class="nav-link text-white">
<i class="fas fa-user"></i> <?php echo htmlspecialchars($_SESSION['username']); ?>
</span>
</li>
<li class="nav-item">
<a class="nav-link" href="/wyloguj-sie">
<i class="fas fa-sign-out-alt"></i> Wyloguj
</a>
</li>
</ul>
</div>
</div>
</nav>
<div class="container mt-4">
<div class="row justify-content-center">
<div class="col-lg-10">
<div class="card shadow-lg">
<div class="card-header bg-primary text-white">
<h4 class="mb-0">
<i class="fas fa-home"></i> Panel główny
</h4>
</div>
<div class="card-body">
<div class="alert alert-success" role="alert">
<h4 class="alert-heading">
<i class="fas fa-user-check"></i> Witaj, <?php echo htmlspecialchars($user['username']); ?>! 🎉
</h4>
<p>Pomyślnie zalogowałeś się do systemu z uwierzytelnianiem dwuskładnikowym.</p>
<hr>
<p class="mb-0">
<i class="fas fa-calendar-alt"></i> <strong>Data rejestracji:</strong>
<?php echo date('d.m.Y H:i', strtotime($user['created_at'])); ?>
</p>
</div>
<h5 class="mt-4 mb-3"><i class="fas fa-th-large"></i> Szybki dostęp</h5>
<div class="row">
<div class="col-md-4 mb-3">
<a href="/notatnik" class="text-decoration-none">
<div class="card bg-gradient-info text-white h-100 hover-shadow">
<div class="card-body text-center py-4">
<i class="fas fa-sticky-note fa-3x mb-3"></i>
<h5 class="card-title">Notatnik</h5>
<p class="card-text">Zarządzaj swoimi notatkami</p>
</div>
</div>
</a>
</div>
<div class="col-md-4 mb-3">
<a href="/pulpit" class="text-decoration-none">
<div class="card bg-gradient-success text-white h-100 hover-shadow">
<div class="card-body text-center py-4">
<i class="fas fa-home fa-3x mb-3"></i>
<h5 class="card-title">Pulpit</h5>
<p class="card-text">Strona główna panelu</p>
</div>
</div>
</a>
</div>
<div class="col-md-4 mb-3">
<a href="/kalendarz" class="text-decoration-none">
<div class="card bg-primary text-white h-100 hover-shadow">
<div class="card-body text-center py-4">
<i class="fas fa-calendar-alt fa-3x mb-3"></i>
<h5 class="card-title">Kalendarz</h5>
<p class="card-text">Wydarzenia w tym tygodniu: <strong><?php echo (int)$eventsThisWeek; ?></strong></p>
</div>
</div>
</a>
</div>
</div>
<h5 class="mt-4 mb-3"><i class="fas fa-info-circle"></i> Bezpieczeństwo</h5>
<div class="row">
<div class="col-md-6 mb-3">
<div class="card bg-light h-100">
<div class="card-body">
<h6 class="card-title">
<i class="fas fa-check-circle text-success"></i> Bezpieczne logowanie
</h6>
<p class="card-text small">Twoje konto jest chronione uwierzytelnianiem dwuskładnikowym</p>
</div>
</div>
</div>
<div class="col-md-6 mb-3">
<div class="card bg-light h-100">
<div class="card-body">
<h6 class="card-title">
<i class="fas fa-lock text-primary"></i> Sesja aktywna
</h6>
<p class="card-text small">Twoja sesja jest bezpiecznie zarządzana przez system</p>
</div>
</div>
</div>
</div>
</div>
<div class="card-footer text-muted text-center">
<small>System logowania dwuskładnikowego - Demo</small>
</div>
</div>
</div>
</div>
</div>
<?php
$content = ob_get_clean();
require __DIR__ . '/layout.php';
?>

22
views/layout.php Normal file
View File

@@ -0,0 +1,22 @@
<!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title><?php echo $pageTitle ?? 'Aplikacja'; ?></title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="/public/css/style.css">
<?php if (isset($extraHead)): ?>
<?php echo $extraHead; ?>
<?php endif; ?>
</head>
<body class="<?php echo $bodyClass ?? 'bg-light'; ?>">
<?php echo $content ?? ''; ?>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
<script src="/public/js/app.js"></script>
<?php if (isset($extraScript)): ?>
<?php echo $extraScript; ?>
<?php endif; ?>
</body>
</html>

63
views/login.php Normal file
View File

@@ -0,0 +1,63 @@
<?php
$pageTitle = 'Logowanie - System 2FA';
$bodyClass = 'bg-gradient-primary';
ob_start();
?>
<div class="container">
<div class="row justify-content-center align-items-center min-vh-100">
<div class="col-xl-10 col-lg-12 col-md-9">
<div class="card o-hidden border-0 shadow-lg my-5">
<div class="card-body p-0">
<div class="row">
<div class="col-lg-6 d-none d-lg-block bg-login-image"></div>
<div class="col-lg-6">
<div class="p-5">
<div class="text-center">
<h1 class="h4 text-gray-900 mb-4">System Logowania 2FA</h1>
</div>
<?php if (isset($_SESSION['error'])): ?>
<div class="alert alert-danger alert-dismissible fade show" role="alert">
<?php
echo htmlspecialchars($_SESSION['error']);
unset($_SESSION['error']);
?>
<button type="button" class="btn-close" data-bs-dismiss="alert"></button>
</div>
<?php endif; ?>
<form class="user" method="POST" action="/uwierzytelnianie">
<div class="form-group mb-3">
<input type="text" class="form-control form-control-user"
id="username" name="username"
placeholder="Login" required autofocus>
</div>
<div class="form-group mb-3">
<input type="password" class="form-control form-control-user"
id="password" name="password"
placeholder="Hasło" required>
</div>
<button type="submit" class="btn btn-primary btn-user btn-block w-100">
Zaloguj się
</button>
</form>
<hr>
<div class="text-center">
<small class="text-muted">
Testowy użytkownik: <strong>projectpro</strong> / <strong>testowehaslo</strong>
</small>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<?php
$content = ob_get_clean();
require __DIR__ . '/layout.php';
?>

147
views/notes/form.php Normal file
View File

@@ -0,0 +1,147 @@
<?php
$pageTitle = (isset($note) ? 'Edycja' : 'Nowa') . ' notatka - System 2FA';
$bodyClass = 'bg-light';
$extraHead = '<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">'
. '<link rel="stylesheet" href="/public/css/notes.css">';
ob_start();
?>
<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
<div class="container-fluid">
<a class="navbar-brand" href="/panel">
<i class="fas fa-shield-alt"></i> System 2FA
</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav me-auto">
<li class="nav-item">
<a class="nav-link" href="/pulpit">
<i class="fas fa-home"></i> Pulpit
</a>
</li>
<li class="nav-item">
<a class="nav-link active" href="/notatnik">
<i class="fas fa-sticky-note"></i> Notatnik
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/kalendarz">
<i class="fas fa-calendar-alt"></i> Kalendarz
</a>
</li>
</ul>
<ul class="navbar-nav">
<li class="nav-item">
<span class="nav-link text-white">
<i class="fas fa-user"></i> <?php echo htmlspecialchars($_SESSION['username']); ?>
</span>
</li>
<li class="nav-item">
<a class="nav-link" href="/wyloguj-sie">
<i class="fas fa-sign-out-alt"></i> Wyloguj
</a>
</li>
</ul>
</div>
</div>
</nav>
<div class="container mt-4">
<div class="row justify-content-center">
<div class="col-lg-8">
<div class="card shadow">
<div class="card-header bg-primary text-white">
<h4 class="mb-0">
<i class="fas fa-<?php echo isset($note) ? 'edit' : 'plus'; ?>"></i>
<?php echo isset($note) ? 'Edycja notatki' : 'Nowa notatka'; ?>
</h4>
</div>
<div class="card-body">
<?php if (isset($_SESSION['error'])): ?>
<div class="alert alert-danger alert-dismissible fade show" role="alert">
<i class="fas fa-exclamation-circle"></i> <?php echo htmlspecialchars($_SESSION['error']); unset($_SESSION['error']); ?>
<button type="button" class="btn-close" data-bs-dismiss="alert"></button>
</div>
<?php endif; ?>
<form method="POST" action="/notatka/zapisz">
<?php if (isset($note)): ?>
<input type="hidden" name="note_id" value="<?php echo $note['id']; ?>">
<?php endif; ?>
<div class="mb-3">
<label for="title" class="form-label">
<i class="fas fa-heading"></i> Tytuł notatki *
</label>
<input type="text"
class="form-control form-control-lg"
id="title"
name="title"
placeholder="Wpisz tytuł notatki..."
value="<?php echo isset($note) ? htmlspecialchars($note['title']) : ''; ?>"
required
autofocus>
</div>
<div class="mb-3">
<label for="content" class="form-label">
<i class="fas fa-align-left"></i> Treść notatki
</label>
<textarea class="form-control"
id="content"
name="content"
rows="12"
placeholder="Wpisz treść notatki..."><?php echo isset($note) ? htmlspecialchars($note['content']) : ''; ?></textarea>
<small class="form-text text-muted">
<i class="fas fa-info-circle"></i> Pole opcjonalne
</small>
</div>
<div class="d-flex justify-content-between align-items-center">
<a href="/notatnik" class="btn btn-secondary">
<i class="fas fa-arrow-left"></i> Powrót do listy
</a>
<button type="submit" class="btn btn-primary btn-lg">
<i class="fas fa-save"></i> Zapisz notatkę
</button>
</div>
</form>
</div>
<?php if (isset($note)): ?>
<div class="card-footer text-muted small">
<div class="row">
<div class="col-md-6">
<i class="fas fa-calendar-plus"></i> Utworzono:
<?php
$date = new DateTime($note['created_at']);
echo $date->format('d.m.Y H:i');
?>
</div>
<div class="col-md-6 text-md-end">
<i class="fas fa-calendar-check"></i> Zaktualizowano:
<?php
$date = new DateTime($note['updated_at']);
echo $date->format('d.m.Y H:i');
?>
</div>
</div>
</div>
<?php endif; ?>
</div>
</div>
</div>
</div>
<?php
$content = ob_get_clean();
$extraScript = '<script>
const textarea = document.getElementById("content");
textarea.addEventListener("input", function() {
this.style.height = "auto";
this.style.height = this.scrollHeight + "px";
});
</script>';
require __DIR__ . '/../layout.php';
?>

170
views/notes/index.php Normal file
View File

@@ -0,0 +1,170 @@
<?php
$pageTitle = 'Notatnik - System 2FA';
$bodyClass = 'bg-light';
$extraHead = '<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">'
. '<link rel="stylesheet" href="/public/css/notes.css">';
ob_start();
?>
<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
<div class="container-fluid">
<a class="navbar-brand" href="/panel">
<i class="fas fa-shield-alt"></i> System 2FA
</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav me-auto">
<li class="nav-item">
<a class="nav-link" href="/pulpit">
<i class="fas fa-home"></i> Pulpit
</a>
</li>
<li class="nav-item">
<a class="nav-link active" href="/notatnik">
<i class="fas fa-sticky-note"></i> Notatnik
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/kalendarz">
<i class="fas fa-calendar-alt"></i> Kalendarz
</a>
</li>
</ul>
<ul class="navbar-nav">
<li class="nav-item">
<span class="nav-link text-white">
<i class="fas fa-user"></i> <?php echo htmlspecialchars($_SESSION['username']); ?>
</span>
</li>
<li class="nav-item">
<a class="nav-link" href="/wyloguj-sie">
<i class="fas fa-sign-out-alt"></i> Wyloguj
</a>
</li>
</ul>
</div>
</div>
</nav>
<div class="container mt-4">
<?php if (isset($_SESSION['success'])): ?>
<div class="alert alert-success alert-dismissible fade show" role="alert">
<i class="fas fa-check-circle"></i> <?php echo htmlspecialchars($_SESSION['success']); unset($_SESSION['success']); ?>
<button type="button" class="btn-close" data-bs-dismiss="alert"></button>
</div>
<?php endif; ?>
<?php if (isset($_SESSION['error'])): ?>
<div class="alert alert-danger alert-dismissible fade show" role="alert">
<i class="fas fa-exclamation-circle"></i> <?php echo htmlspecialchars($_SESSION['error']); unset($_SESSION['error']); ?>
<button type="button" class="btn-close" data-bs-dismiss="alert"></button>
</div>
<?php endif; ?>
<div class="d-flex justify-content-between align-items-center mb-4">
<h2><i class="fas fa-sticky-note text-primary"></i> Moje Notatki</h2>
<a href="/notatka/nowa" class="btn btn-primary">
<i class="fas fa-plus"></i> Nowa notatka
</a>
</div>
<?php if (empty($notes)): ?>
<div class="text-center py-5">
<i class="fas fa-inbox fa-5x text-muted mb-3"></i>
<h4 class="text-muted">Brak notatek</h4>
<p class="text-muted">Stwórz swoją pierwszą notatkę, aby zacząć!</p>
<a href="/notatka/nowa" class="btn btn-primary btn-lg mt-3">
<i class="fas fa-plus"></i> Dodaj pierwszą notatkę
</a>
</div>
<?php else: ?>
<div class="row">
<?php foreach ($notes as $note): ?>
<div class="col-md-6 col-lg-4 mb-4">
<div class="card note-card h-100 shadow-sm">
<div class="card-body d-flex flex-column">
<h5 class="card-title">
<i class="fas fa-file-alt text-primary"></i>
<?php echo htmlspecialchars($note['title']); ?>
</h5>
<p class="card-text flex-grow-1 note-content">
<?php
$content = htmlspecialchars($note['content'] ?? '');
echo nl2br(mb_substr($content, 0, 150)) . (mb_strlen($content) > 150 ? '...' : '');
?>
</p>
<div class="note-meta text-muted small mb-3">
<i class="fas fa-clock"></i>
<?php
$date = new DateTime($note['updated_at']);
echo $date->format('d.m.Y H:i');
?>
</div>
<div class="btn-group" role="group">
<a href="/notatka/edytuj?id=<?php echo $note['id']; ?>"
class="btn btn-sm btn-outline-primary">
<i class="fas fa-edit"></i> Edytuj
</a>
<button type="button"
class="btn btn-sm btn-outline-danger"
onclick="confirmDelete(<?php echo $note['id']; ?>, '<?php echo htmlspecialchars(addslashes($note['title'])); ?>')">
<i class="fas fa-trash"></i> Usuń
</button>
</div>
</div>
</div>
</div>
<?php endforeach; ?>
</div>
<div class="mt-4 text-center text-muted">
<p>Łącznie notatek: <strong><?php echo $notesCount; ?></strong></p>
</div>
<?php endif; ?>
</div>
<!-- Modal potwierdzenia usunięcia -->
<div class="modal fade" id="deleteModal" tabindex="-1" aria-labelledby="deleteModalLabel" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered">
<div class="modal-content">
<div class="modal-header bg-danger text-white">
<h5 class="modal-title" id="deleteModalLabel">
<i class="fas fa-exclamation-triangle"></i> Potwierdź usunięcie
</h5>
<button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<p>Czy na pewno chcesz usunąć notatkę:</p>
<p class="fw-bold" id="noteTitle"></p>
<p class="text-muted small">Tej operacji nie można cofnąć.</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">
<i class="fas fa-times"></i> Anuluj
</button>
<form method="POST" action="/notatka/usun" id="deleteForm">
<input type="hidden" name="note_id" id="deleteNoteId">
<button type="submit" class="btn btn-danger">
<i class="fas fa-trash"></i> Usuń notatkę
</button>
</form>
</div>
</div>
</div>
</div>
<?php
$content = ob_get_clean();
$extraScript = '<script>
function confirmDelete(noteId, noteTitle) {
document.getElementById("deleteNoteId").value = noteId;
document.getElementById("noteTitle").textContent = noteTitle;
const deleteModal = new bootstrap.Modal(document.getElementById("deleteModal"));
deleteModal.show();
}
</script>';
require __DIR__ . '/../layout.php';
?>

78
views/verify.php Normal file
View File

@@ -0,0 +1,78 @@
<?php
$pageTitle = 'Weryfikacja 2FA - System 2FA';
$bodyClass = 'bg-gradient-primary';
$extraHead = '<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">';
ob_start();
?>
<div class="container">
<div class="row justify-content-center align-items-center min-vh-100">
<div class="col-xl-10 col-lg-12 col-md-9">
<div class="card o-hidden border-0 shadow-lg my-5">
<div class="card-body p-0">
<div class="row">
<div class="col-lg-6 d-none d-lg-block bg-verify-image"></div>
<div class="col-lg-6">
<div class="p-5">
<div class="text-center">
<h1 class="h4 text-gray-900 mb-2">Weryfikacja dwuskładnikowa</h1>
<p class="mb-4 text-muted">Wprowadź kod weryfikacyjny</p>
</div>
<?php if (isset($_SESSION['error'])): ?>
<div class="alert alert-danger alert-dismissible fade show" role="alert">
<?php
echo htmlspecialchars($_SESSION['error']);
unset($_SESSION['error']);
?>
<button type="button" class="btn-close" data-bs-dismiss="alert"></button>
</div>
<?php endif; ?>
<div class="alert alert-info" role="alert">
<i class="fas fa-info-circle"></i>
<strong>Tryb testowy:</strong> Kod weryfikacyjny znajduje się w konsoli przeglądarki (F12).
</div>
<form class="user" method="POST" action="/weryfikuj-kod">
<div class="form-group mb-3">
<input type="text" class="form-control form-control-user text-center"
id="code" name="code"
placeholder="000000"
maxlength="6"
pattern="[0-9]{6}"
required autofocus>
<small class="form-text text-muted">Wprowadź 6-cyfrowy kod</small>
</div>
<button type="submit" class="btn btn-primary btn-user btn-block w-100">
Zweryfikuj
</button>
</form>
<hr>
<div class="text-center">
<a href="/logowanie" class="small">Powrót do logowania</a>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<?php
$content = ob_get_clean();
$extraScript = '<script>
// Wyświetlanie kodu weryfikacyjnego w konsoli (tylko dla testów)
' . (isset($_SESSION['test_code']) ? "console.log('%c🔐 KOD WERYFIKACYJNY: " . $_SESSION['test_code'] . "', 'background: #222; color: #bada55; font-size: 20px; padding: 10px;');\n console.log('W produkcji kod zostałby wysłany emailem.');" : '') . '
// Auto-focus i formatowanie pola kodu
document.getElementById("code").addEventListener("input", function() {
this.value = this.value.replace(/[^0-9]/g, "");
});
</script>';
require __DIR__ . '/layout.php';
?>