first commit
This commit is contained in:
152
views/calendar/form.php
Normal file
152
views/calendar/form.php
Normal 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
221
views/calendar/index.php
Normal 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
144
views/dashboard.php
Normal 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
22
views/layout.php
Normal 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
63
views/login.php
Normal 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
147
views/notes/form.php
Normal 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
170
views/notes/index.php
Normal 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
78
views/verify.php
Normal 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';
|
||||
?>
|
||||
Reference in New Issue
Block a user