<?php
if (empty($_SESSION['user_id'])) {
header('Location: index.php?page=home');
exit;
}
// admin status
$isAdmin = isset($_SESSION['is_admin']) && $_SESSION['is_admin'] == 1;
$msg = '';
$msgType = 'success';
// create plan
if ($isAdmin && $_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'create_plan') {
$fromDate = isset($_POST['from_date']) ? $_POST['from_date'] : '';
$weeks = isset($_POST['weeks']) ? intval($_POST['weeks']) : 0;
if (!empty($fromDate) && $weeks > 0) {
// Insert new plan into the database
$query = "INSERT INTO CINE_Plan (fromDate, weeks) VALUES (?, ?)";
$stmt = $dbc->prepare($query);
$stmt->bind_param('si', $fromDate, $weeks);
if ($stmt->execute()) {
$msg = 'Plan created successfully!';
$msgType = 'success';
} else {
$msg = 'Error creating plan: ' . $stmt->error;
$msgType = 'error';
}
$stmt->close();
} else {
$msg = 'Invalid plan data. Please check your inputs.';
$msgType = 'error';
}
}
$currentDate = time(); // get current time
$lockPeriodSeconds = 7 * 24 * 60 * 60; // 1 week in seconds
// delete plan (with updated lock logic)
if ($isAdmin && $_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'delete_plan') {
$planId = isset($_POST['plan_id']) ? intval($_POST['plan_id']) : 0;
if ($planId > 0) {
// First check if the plan is within the lock period
$planQuery = "SELECT fromDate FROM CINE_Plan WHERE pk_Plan = ?";
$checkStmt = $dbc->prepare($planQuery);
$checkStmt->bind_param('i', $planId);
$checkStmt->execute();
$checkResult = $checkStmt->get_result();
if ($row = $checkResult->fetch_assoc()) {
$planStartTimestamp = strtotime($row['fromDate']);
$lockDate = $planStartTimestamp - $lockPeriodSeconds;
// only lock modifications during the one-week before the start date
if ($currentDate >= $lockDate && $currentDate < $planStartTimestamp) {
$msg = 'Cannot delete plan: Plans cannot be modified within 1 week of their start date.';
$msgType = 'error';
$checkStmt->close();
} else {
$checkStmt->close();
// Delete the plan
$query = "DELETE FROM CINE_Plan WHERE pk_Plan = ?";
$stmt = $dbc->prepare($query);
$stmt->bind_param('i', $planId);
if ($stmt->execute()) {
$msg = 'Plan deleted successfully!';
$msgType = 'success';
} else {
$msg = 'Error deleting plan: ' . $stmt->error;
$msgType = 'error';
}
$stmt->close();
}
} else {
$msg = 'Plan not found.';
$msgType = 'error';
$checkStmt->close();
}
}
}
// toggle active (with updated lock logic)
if ($isAdmin && $_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'toggle_active') {
$planId = isset($_POST['plan_id']) ? intval($_POST['plan_id']) : 0;
$isActive = isset($_POST['is_active']) ? (int)$_POST['is_active'] : 0;
$hasPassed = isset($_POST['has_passed']) ? (int)$_POST['has_passed'] : 0;
if ($planId > 0) {
// First check if the plan is within the lock period
$planQuery = "SELECT fromDate FROM CINE_Plan WHERE pk_Plan = ?";
$checkStmt = $dbc->prepare($planQuery);
$checkStmt->bind_param('i', $planId);
$checkStmt->execute();
$checkResult = $checkStmt->get_result();
if ($row = $checkResult->fetch_assoc()) {
$planStartTimestamp = strtotime($row['fromDate']);
$lockDate = $planStartTimestamp - $lockPeriodSeconds;
// only lock modifications during the one-week before the start date
if ($currentDate >= $lockDate && $currentDate < $planStartTimestamp) {
$msg = 'Cannot modify plan: Plans cannot be modified within 1 week of their start date.';
$msgType = 'error';
$checkStmt->close();
} else {
$checkStmt->close();
// Toggle the active status
$query = "UPDATE CINE_Plan SET isActive = ? WHERE pk_Plan = ?";
$stmt = $dbc->prepare($query);
$stmt->bind_param('ii', $isActive, $planId);
if ($stmt->execute()) {
if ($hasPassed) {
$msg = $isActive
? 'Passed plan made visible again.'
: 'Passed plan hidden.';
} else {
$msg = $isActive
? 'Plan activated successfully!'
: 'Plan deactivated successfully!';
}
$msgType = 'success';
} else {
$msg = 'Error updating plan status: ' . $stmt->error;
$msgType = 'error';
}
$stmt->close();
}
} else {
$msg = 'Plan not found.';
$msgType = 'error';
$checkStmt->close();
}
}
}
// Update the plans query to include isActive field
$plansQuery = "SELECT pk_Plan, fromDate, weeks, isActive FROM CINE_Plan ORDER BY fromDate DESC";
$plansResult = $dbc->query($plansQuery);
$plans = [];
while ($row = $plansResult->fetch_assoc()) {
// Calculate end date based on start date and weeks
$startTimestamp = strtotime($row['fromDate']);
$endTimestamp = strtotime('+' . $row['weeks'] . ' weeks -1 day', $startTimestamp);
// Format dates for display
$formattedStartDate = date('M j, Y', $startTimestamp);
$formattedEndDate = date('M j, Y', $endTimestamp);
// Add to plans array
$plans[] = [
'id' => $row['pk_Plan'],
'formattedStartDate'=> $formattedStartDate,
'formattedEndDate' => $formattedEndDate,
'weeks' => $row['weeks'],
'isActive' => isset($row['isActive']) ? (bool)$row['isActive'] : true
];
}
// Process plans to check if they've passed
foreach ($plans as $key => $plan) {
$startDateTimestamp = strtotime($plan['formattedStartDate']);
$endDateTimestamp = strtotime($plan['formattedEndDate'] . ' 23:59:59');
$hasPassed = $endDateTimestamp < $currentDate;
$lockDate = $startDateTimestamp - $lockPeriodSeconds;
$isLocked = $currentDate >= $lockDate && $currentDate < $startDateTimestamp;
$plans[$key]['hasPassed'] = $hasPassed;
$plans[$key]['isPassed'] = $hasPassed;
$plans[$key]['isLocked'] = $isLocked;
}
$totalPlans = count($plans);
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Calendar Plans - Ciné Le Paris</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0" />
<link rel="stylesheet" href="assets/css/plans.css">
</head>
<body>
<div class="plans-container">
<!-- Header -->
<div class="plans-header">
<div class="plans-title-section">
<h1 class="plans-title">Calendar Plans</h1>
<p class="plans-subtitle">Planning periods for Ciné Le Paris</p>
</div>
<?php if ($isAdmin): ?>
<div class="plans-actions">
<a href="index.php?page=calendar" class="plans-btn plans-btn-secondary">
<span class="material-symbols-outlined">calendar_month</span> Calendar
</a>
<button class="plans-btn plans-btn-primary" id="createPlanBtn">
<span class="material-symbols-outlined">add</span> New Plan
</button>
</div>
<?php endif; ?>
</div>
<!-- Success/Error Message (if any) -->
<?php if ($msg): ?>
<div class="plans-alert plans-alert-<?php echo $msgType; ?>">
<div class="plans-alert-icon">
<span class="material-symbols-outlined">
<?php echo $msgType === 'success' ? 'check_circle' : 'error'; ?>
</span>
</div>
<div class="plans-alert-content">
<?php echo htmlspecialchars($msg); ?>
</div>
</div>
<?php endif; ?>
<!-- Plans Table -->
<?php if (count($plans) > 0): ?>
<div class="plans-card">
<div class="plans-card-header">
<h2 class="plans-card-title">All Plans</h2>
<div class="plans-card-actions">
<label class="plans-toggle-label">
<input type="checkbox" id="showHiddenPlans" class="plans-toggle-checkbox">
<span class="plans-toggle-text">Show hidden plans</span>
</label>
<span class="plans-card-count"><?php echo $totalPlans; ?> plans</span>
</div>
</div>
<div class="plans-table-container">
<table class="plans-table">
<thead>
<tr>
<th>ID</th>
<th>Start Date</th>
<th>End Date</th>
<th>Weeks</th>
<th>Status</th>
<th>Period</th>
<?php if ($isAdmin): ?>
<th>Actions</th>
<?php endif; ?>
</tr>
</thead>
<tbody>
<?php foreach ($plans as $plan): ?>
<tr class="plan-row clickable-row <?php echo $plan['isActive'] ? 'active-row' : ''; ?> <?php echo $plan['hasPassed'] ? 'passed-row' : ''; ?> <?php echo $plan['isLocked'] ? 'locked-row' : ''; ?>" data-plan-id="<?php echo $plan['id']; ?>">
<td><?php echo $plan['id']; ?></td>
<td><?php echo $plan['formattedStartDate']; ?></td>
<td><?php echo $plan['formattedEndDate']; ?></td>
<td><?php echo $plan['weeks']; ?> weeks</td>
<td>
<?php if ($plan['isActive']): ?>
<span class="plans-badge plans-badge-active">
<span class="material-symbols-outlined">check_circle</span> Active
</span>
<?php else: ?>
<span class="plans-badge plans-badge-inactive">
<span class="material-symbols-outlined">cancel</span> Inactive
</span>
<?php endif; ?>
</td>
<td>
<?php if ($plan['hasPassed']): ?>
<span class="plans-badge plans-badge-passed">
<span class="material-symbols-outlined">history</span> Passed
</span>
<?php elseif ($plan['isLocked']): ?>
<span class="plans-badge plans-badge-locked">
<span class="material-symbols-outlined">lock</span> Locked
</span>
<?php else: ?>
<span class="plans-badge plans-badge-current">
<span class="material-symbols-outlined">event_available</span> Current
</span>
<?php endif; ?>
</td>
<td class="plans-actions-cell">
<?php if ($isAdmin): ?>
<?php if (!$plan['isLocked']): ?>
<form method="post" action="" class="plans-action-form">
<input type="hidden" name="action" value="toggle_active">
<input type="hidden" name="plan_id" value="<?php echo $plan['id']; ?>">
<input type="hidden" name="is_active" value="<?php echo $plan['isActive'] ? '0' : '1'; ?>">
<input type="hidden" name="has_passed" value="<?php echo $plan['hasPassed'] ? '1' : '0'; ?>">
<button type="submit" class="plans-btn-icon <?php echo $plan['isActive'] ? 'plans-btn-deactivate' : 'plans-btn-activate'; ?>"
title="<?php echo $plan['isActive'] ? ($plan['hasPassed'] ? 'Hide Passed Plan' : 'Deactivate Plan') : ($plan['hasPassed'] ? 'Show Passed Plan' : 'Activate Plan'); ?>">
<span class="material-symbols-outlined">
<?php echo $plan['isActive'] ? 'toggle_on' : 'toggle_off'; ?>
</span>
</button>
</form>
<form method="post" action="" class="plans-action-form" onsubmit="return confirm('Are you sure you want to delete this plan?');">
<input type="hidden" name="action" value="delete_plan">
<input type="hidden" name="plan_id" value="<?php echo $plan['id']; ?>">
<button type="submit" class="plans-btn-icon plans-btn-delete" title="Delete Plan">
<span class="material-symbols-outlined">delete</span>
</button>
</form>
<?php else: ?>
<span class="plans-btn-icon plans-btn-disabled" title="Cannot modify: Plan is locked (within 1 week of start date)">
<span class="material-symbols-outlined">lock</span>
</span>
<?php endif; ?>
<?php endif; ?>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
</div>
<?php else: ?>
<div class="plans-empty">
<div class="plans-empty-icon">
<span class="material-symbols-outlined">event_busy</span>
</div>
<p class="plans-empty-text">No calendar plans have been created yet.</p>
<?php if ($isAdmin): ?>
<button class="plans-btn plans-btn-primary" id="createEmptyPlanBtn">
<span class="material-symbols-outlined">add</span> Create New Plan
</button>
<?php endif; ?>
</div>
<?php endif; ?>
<!-- Back to Dashboard Button (visible to all users) -->
<div class="plans-footer">
<a href="index.php?page=dashboard" class="plans-btn plans-btn-secondary">
<span class="material-symbols-outlined">dashboard</span> Back to Dashboard
</a>
</div>
</div>
<?php if ($isAdmin): ?>
<!-- Create Plan Modal (admin only) -->
<div class="plans-modal-backdrop" id="createPlanBackdrop"></div>
<div class="plans-modal" id="createPlanModal">
<div class="plans-modal-header">
<h3 class="plans-modal-title">Create New Plan</h3>
<button class="plans-modal-close" id="closeCreatePlanModal">
<span class="material-symbols-outlined">close</span>
</button>
</div>
<div class="plans-modal-body">
<form method="post" action="" id="createPlanForm" class="plans-form">
<input type="hidden" name="action" value="create_plan">
<div class="plans-form-group">
<label class="plans-form-label" for="from_date">Start Date</label>
<input type="date" id="from_date" name="from_date" class="plans-form-control" required>
</div>
<div class="plans-form-group">
<label class="plans-form-label" for="weeks">Number of Weeks</label>
<input type="number" id="weeks" name="weeks" class="plans-form-control" min="1" max="52" value="4" required>
</div>
<div class="plans-form-group">
<label class="plans-form-label" for="end_date_preview">End Date (Preview)</label>
<input type="text" id="end_date_preview" class="plans-form-control" readonly>
</div>
</form>
</div>
<div class="plans-modal-footer">
<button class="plans-btn plans-btn-secondary" id="cancelCreatePlanBtn">Cancel</button>
<button class="plans-btn plans-btn-primary" id="submitCreatePlanBtn">Create Plan</button>
</div>
</div>
<?php endif; ?>
<script>
document.addEventListener('DOMContentLoaded', function() {
<?php if ($isAdmin): ?>
// Elements for Create Plan Modal
const createPlanModal = document.getElementById('createPlanModal');
const createPlanBackdrop = document.getElementById('createPlanBackdrop');
const closeCreatePlanModal = document.getElementById('closeCreatePlanModal');
const cancelCreatePlanBtn = document.getElementById('cancelCreatePlanBtn');
const createPlanBtn = document.getElementById('createPlanBtn');
const createEmptyPlanBtn = document.getElementById('createEmptyPlanBtn');
const submitCreatePlanBtn = document.getElementById('submitCreatePlanBtn');
const fromDateInput = document.getElementById('from_date');
const weeksInput = document.getElementById('weeks');
const endDatePreview = document.getElementById('end_date_preview');
// set def. date
const today = new Date();
const formattedDate = today.toISOString().split('T')[0];
fromDateInput.value = formattedDate;
// Update end date preview
function updateEndDatePreview() {
const startDate = new Date(fromDateInput.value);
const weeks = parseInt(weeksInput.value) || 0;
if (startDate && !isNaN(startDate) && weeks > 0) {
const endDate = new Date(startDate);
endDate.setDate(endDate.getDate() + (weeks * 7) - 1);
const options = { year: 'numeric', month: 'short', day: 'numeric' };
endDatePreview.value = endDate.toLocaleDateString(undefined, options);
} else {
endDatePreview.value = 'Invalid date or weeks';
}
}
// Initialize end date preview
updateEndDatePreview();
// create plan modal
function showCreatePlanModal() {
createPlanModal.style.display = 'block';
createPlanBackdrop.style.display = 'block';
}
// hide create plan
function hideCreatePlanModal() {
createPlanModal.style.display = 'none';
createPlanBackdrop.style.display = 'none';
}
// create plan event listener
createPlanBtn.addEventListener('click', showCreatePlanModal);
if (createEmptyPlanBtn) {
createEmptyPlanBtn.addEventListener('click', showCreatePlanModal);
}
closeCreatePlanModal.addEventListener('click', hideCreatePlanModal);
cancelCreatePlanBtn.addEventListener('click', hideCreatePlanModal);
createPlanBackdrop.addEventListener('click', hideCreatePlanModal);
submitCreatePlanBtn.addEventListener('click', function() {
document.getElementById('createPlanForm').submit();
});
// update end date
fromDateInput.addEventListener('change', updateEndDatePreview);
weeksInput.addEventListener('input', updateEndDatePreview);
<?php endif; ?>
// Show/hide passed plans toggle
const showHiddenPlansCheckbox = document.getElementById('showHiddenPlans');
if (showHiddenPlansCheckbox) {
showHiddenPlansCheckbox.addEventListener('change', function() {
const passedInactiveRows = document.querySelectorAll('.plan-row.passed-row:not(.active-row)');
passedInactiveRows.forEach(row => {
row.style.display = this.checked ? 'table-row' : 'none';
});
});
}
// make clickable to go to volunteer page
document.querySelectorAll('.plan-row').forEach(row => {
row.addEventListener('click', function(e) {
if (e.target.closest('.plans-actions-cell') || e.target.closest('button')) return;
window.location.href = 'index.php?page=volunteer&plan_id=' + this.getAttribute('data-plan-id');
});
});
});
</script>
</body>
</html>