231 lines
9.8 KiB
PHP
231 lines
9.8 KiB
PHP
<?php
|
|
$rootPath = dirname(dirname(__DIR__));
|
|
require_once($rootPath . "/src/config/env.php");
|
|
require_once($rootPath . "/src/config/connection.php");
|
|
require_once($rootPath . "/src/config/functions.php");
|
|
require_once($rootPath . "/header.php");
|
|
checkAdmin();
|
|
checkUserSession();
|
|
|
|
$pageTitle = 'Manage Events';
|
|
$breadcrumbs = [['Home' => 'index']];
|
|
require_once($rootPath . '/components/banner.php');
|
|
|
|
// Fetch all events
|
|
$events_query = "
|
|
SELECT
|
|
event_id, name, type, location, date, image, published
|
|
FROM events
|
|
ORDER BY date DESC
|
|
";
|
|
|
|
$result = $conn->query($events_query);
|
|
$events = [];
|
|
if ($result && $result->num_rows > 0) {
|
|
while ($row = $result->fetch_assoc()) {
|
|
$events[] = $row;
|
|
}
|
|
}
|
|
?>
|
|
|
|
<style>
|
|
.image {
|
|
width: 300px;
|
|
/* Set your desired width */
|
|
height: 250px;
|
|
/* Set your desired height */
|
|
overflow: hidden;
|
|
/* Hide any overflow */
|
|
display: block;
|
|
/* Ensure proper block behavior */
|
|
border-radius: 8px;
|
|
}
|
|
|
|
.image img {
|
|
width: 100%;
|
|
/* Image scales to fill the container */
|
|
height: 100%;
|
|
/* Image scales to fill the container */
|
|
object-fit: cover;
|
|
/* Fills the container while maintaining aspect ratio */
|
|
object-position: center;
|
|
/* Aligns the center of the image with the center of the container */
|
|
display: block;
|
|
/* Prevents inline whitespace issues */
|
|
}
|
|
</style>
|
|
|
|
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
|
|
<script>
|
|
document.addEventListener("DOMContentLoaded", function() {
|
|
const filterInput = document.querySelector('.filter-input');
|
|
const cards = document.querySelectorAll('.destination-item');
|
|
|
|
if (cards.length === 0 && filterInput) {
|
|
filterInput.style.display = "none";
|
|
} else if (filterInput) {
|
|
filterInput.addEventListener("input", function() {
|
|
const filterValue = filterInput.value.trim().toLowerCase();
|
|
cards.forEach(card => {
|
|
const cardText = card.textContent.trim().toLowerCase();
|
|
card.style.display = cardText.includes(filterValue) ? "" : "none";
|
|
});
|
|
});
|
|
}
|
|
});
|
|
</script>
|
|
|
|
<?php
|
|
$pageTitle = 'Manage Events';
|
|
$breadcrumbs = [['Home' => 'index']];
|
|
require_once($rootPath . '/components/banner.php');
|
|
?>
|
|
|
|
<!-- Events Management Area start -->
|
|
<section class="blog-list-page py-100 rel z-1">
|
|
<div class="container">
|
|
<div class="row">
|
|
<div class="col-lg-12">
|
|
<div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 30px;">
|
|
<h2 style="margin: 0;">Manage Events</h2>
|
|
<a href="manage_events" class="theme-btn create-album-btn">
|
|
<i class="far fa-plus"></i> New Event
|
|
</a>
|
|
</div>
|
|
<?php if (isset($_SESSION['message'])): ?>
|
|
<div class="alert alert-warning message-box">
|
|
<?php echo $_SESSION['message']; ?>
|
|
<span class="close-btn" onclick="this.parentElement.style.display='none'">×</span>
|
|
</div>
|
|
<?php unset($_SESSION['message']);
|
|
endif;
|
|
|
|
if (count($events) > 0) {
|
|
echo '<input type="text" class="filter-input" placeholder="Filter events...">';
|
|
echo '<div class="events-container" data-aos="fade-up" data-aos-duration="1500" data-aos-offset="50">';
|
|
|
|
foreach ($events as $event) {
|
|
$eventImagePath = $event['image'] ? htmlspecialchars($event['image']) : 'assets/images/placeholder.jpg';
|
|
$publishStatusBadge = $event['published'] == 1 ? 'PUBLISHED' : 'DRAFT';
|
|
|
|
echo '
|
|
<div class="destination-item style-three bgc-lighter booking" data-aos="fade-up" data-aos-duration="1500" data-aos-offset="50">
|
|
<div class="image" style="width:300px;height:250px;">
|
|
<img src="' . $eventImagePath . '" alt="' . htmlspecialchars($event['name']) . '">
|
|
</div>
|
|
<div class="content" style="width:100%;">
|
|
<div class="destination-header d-flex align-items-start gap-3">
|
|
<div>
|
|
<span class="badge bg-dark mb-1">' . strtoupper($publishStatusBadge) . '</span>
|
|
<h5 class="mb-0">' . htmlspecialchars($event['name']) . '</h5>
|
|
<small class="text-muted">📍 ' . htmlspecialchars($event['location']) . '</small>
|
|
</div>
|
|
</div>
|
|
<p style="margin: 10px 0;">
|
|
<strong>Type:</strong> ' . htmlspecialchars($event['type']) . '<br>
|
|
<strong>Date:</strong> ' . convertDate($event['date']) . '
|
|
</p>
|
|
<div class="destination-footer">
|
|
<div class="btn-group" style="display:flex; justify-content:flex-end; gap:10px;">
|
|
<a href="manage_events?event_id=' . $event['event_id'] . '" data-bs-toggle="tooltip" data-bs-placement="top" title="Edit"><span class="material-icons">edit</span></a>
|
|
<button type="button" class="toggle-publish" data-event-id="' . $event['event_id'] . '" data-bs-toggle="tooltip" data-bs-placement="top" title="' . ($event['published'] == 1 ? 'Unpublish' : 'Publish') . '" style="background:none; border:none; cursor:pointer; color:inherit;"><span class="material-icons">' . ($event['published'] == 1 ? 'cloud_off' : 'cloud_upload') . '</span></button>
|
|
<button type="button" class="delete-event" data-event-id="' . $event['event_id'] . '" data-bs-toggle="tooltip" data-bs-placement="top" title="Delete" style="background:none; border:none; cursor:pointer; color:inherit;"><span class="material-icons">delete</span></button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
';
|
|
}
|
|
|
|
echo '</div>';
|
|
} else {
|
|
echo '<div class="no-events">
|
|
<p>No events found. <a href="manage_events">Create one</a></p>
|
|
</div>';
|
|
}
|
|
?>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
</section>
|
|
<!-- Events Management Area end -->
|
|
|
|
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
|
|
<script>
|
|
const tooltipTriggerList = document.querySelectorAll('[data-bs-toggle="tooltip"]');
|
|
tooltipTriggerList.forEach(el => new bootstrap.Tooltip(el));
|
|
|
|
// Handle publish/unpublish button clicks
|
|
document.querySelectorAll('.toggle-publish').forEach(btn => {
|
|
btn.addEventListener('click', function() {
|
|
const eventId = this.dataset.eventId;
|
|
const currentIcon = this.querySelector('.material-icons').textContent;
|
|
const isPublished = currentIcon === 'cloud_off';
|
|
const action = isPublished ? 'Unpublish' : 'Publish';
|
|
|
|
const formData = new FormData();
|
|
formData.append('event_id', eventId);
|
|
|
|
fetch('toggle_event_published', {
|
|
method: 'POST',
|
|
body: formData
|
|
})
|
|
.then(response => response.json())
|
|
.then(data => {
|
|
if (data.status === 'success') {
|
|
alert(action + ' successful!');
|
|
location.reload();
|
|
} else {
|
|
alert(action + ' failed: ' + data.message);
|
|
}
|
|
})
|
|
.catch(err => {
|
|
console.error('Error:', err);
|
|
alert(action + ' failed due to network error.');
|
|
});
|
|
});
|
|
});
|
|
|
|
// Handle delete button clicks
|
|
document.querySelectorAll('.delete-event').forEach(btn => {
|
|
btn.addEventListener('click', function() {
|
|
if (!confirm('Are you sure you want to delete this event? This action cannot be undone.')) {
|
|
return false;
|
|
}
|
|
|
|
const eventId = this.dataset.eventId;
|
|
const card = this.closest('.destination-item');
|
|
|
|
const formData = new FormData();
|
|
formData.append('event_id', eventId);
|
|
|
|
fetch('delete_event', {
|
|
method: 'POST',
|
|
body: formData
|
|
})
|
|
.then(response => response.json())
|
|
.then(data => {
|
|
if (data.status === 'success') {
|
|
card.style.animation = 'fadeOut 0.3s ease-out';
|
|
setTimeout(() => {
|
|
card.remove();
|
|
if (document.querySelectorAll('.destination-item').length === 0) {
|
|
location.reload();
|
|
}
|
|
}, 300);
|
|
} else {
|
|
alert('Error: ' + data.message);
|
|
}
|
|
})
|
|
.catch(err => {
|
|
console.error('Error:', err);
|
|
alert('Delete failed due to network error.');
|
|
});
|
|
});
|
|
});
|
|
</script>
|
|
|
|
<?php include_once($rootPath . '/components/insta_footer.php'); ?>
|