feat: Add comprehensive documentation suite and reorganize project structure
- Created complete documentation in docs/ directory - Added PROJECT_OVERVIEW.md with feature highlights and getting started guide - Added ARCHITECTURE.md with system design and technical details - Added SECURITY.md with comprehensive security implementation guide - Added DEVELOPMENT.md with development workflows and best practices - Added DEPLOYMENT.md with production deployment instructions - Added API.md with complete REST API documentation - Added CONTRIBUTING.md with contribution guidelines - Added CHANGELOG.md with version history and migration notes - Reorganized all documentation files into docs/ directory for better organization - Updated README.md with proper documentation links and quick navigation - Enhanced project structure with professional documentation standards
This commit is contained in:
125
f_modules/m_frontend/m_donations/views/notifications.php
Normal file
125
f_modules/m_frontend/m_donations/views/notifications.php
Normal file
@@ -0,0 +1,125 @@
|
||||
<?php
|
||||
$title = "Donation Notifications";
|
||||
include_once '../../../f_core/header.php';
|
||||
|
||||
use Donations\NotificationHandler;
|
||||
|
||||
$notification_handler = new NotificationHandler();
|
||||
$notifications = $notification_handler->getAllNotifications($streamer_id);
|
||||
$unread_count = $notification_handler->getUnreadCount($streamer_id);
|
||||
?>
|
||||
|
||||
<div class="container mt-4">
|
||||
<div class="d-flex justify-content-between align-items-center mb-4">
|
||||
<h2>Donation Notifications</h2>
|
||||
<?php if ($unread_count > 0): ?>
|
||||
<button type="button" class="btn btn-primary" id="markAllReadBtn">
|
||||
Mark All as Read
|
||||
</button>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
|
||||
<!-- Notifications List -->
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<?php if (empty($notifications)): ?>
|
||||
<div class="text-center py-5">
|
||||
<h5>No notifications yet</h5>
|
||||
<p class="text-muted">You'll see notifications here when you receive donations, achieve goals, or reach milestones.</p>
|
||||
</div>
|
||||
<?php else: ?>
|
||||
<div class="list-group">
|
||||
<?php foreach ($notifications as $notification): ?>
|
||||
<div class="list-group-item <?php echo $notification['is_read'] ? '' : 'list-group-item-primary'; ?>"
|
||||
data-notification-id="<?php echo $notification['notification_id']; ?>">
|
||||
<div class="d-flex justify-content-between align-items-center">
|
||||
<div>
|
||||
<h6 class="mb-1"><?php echo htmlspecialchars($notification['title']); ?></h6>
|
||||
<p class="mb-1"><?php echo htmlspecialchars($notification['message']); ?></p>
|
||||
<small class="text-muted">
|
||||
<?php echo date('M d, Y H:i', strtotime($notification['created_at'])); ?>
|
||||
</small>
|
||||
</div>
|
||||
<?php if (!$notification['is_read']): ?>
|
||||
<button type="button" class="btn btn-sm btn-outline-primary mark-read-btn">
|
||||
Mark as Read
|
||||
</button>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</div>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
// Mark individual notification as read
|
||||
document.querySelectorAll('.mark-read-btn').forEach(button => {
|
||||
button.addEventListener('click', async function() {
|
||||
const notificationId = this.closest('.list-group-item').dataset.notificationId;
|
||||
|
||||
try {
|
||||
const response = await fetch('mark_read.php', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
body: JSON.stringify({
|
||||
notification_ids: [notificationId]
|
||||
})
|
||||
});
|
||||
|
||||
const result = await response.json();
|
||||
|
||||
if (result.success) {
|
||||
this.closest('.list-group-item').classList.remove('list-group-item-primary');
|
||||
this.remove();
|
||||
|
||||
// Update unread count
|
||||
const unreadCount = document.querySelectorAll('.list-group-item-primary').length;
|
||||
if (unreadCount === 0) {
|
||||
document.getElementById('markAllReadBtn')?.remove();
|
||||
}
|
||||
} else {
|
||||
alert(result.error || 'Error marking notification as read. Please try again.');
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Error:', error);
|
||||
alert('Error marking notification as read. Please try again.');
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// Mark all notifications as read
|
||||
const markAllReadBtn = document.getElementById('markAllReadBtn');
|
||||
if (markAllReadBtn) {
|
||||
markAllReadBtn.addEventListener('click', async function() {
|
||||
try {
|
||||
const response = await fetch('mark_all_read.php', {
|
||||
method: 'POST'
|
||||
});
|
||||
|
||||
const result = await response.json();
|
||||
|
||||
if (result.success) {
|
||||
document.querySelectorAll('.list-group-item-primary').forEach(item => {
|
||||
item.classList.remove('list-group-item-primary');
|
||||
});
|
||||
document.querySelectorAll('.mark-read-btn').forEach(btn => btn.remove());
|
||||
this.remove();
|
||||
} else {
|
||||
alert(result.error || 'Error marking notifications as read. Please try again.');
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Error:', error);
|
||||
alert('Error marking notifications as read. Please try again.');
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<?php include_once '../../../f_core/footer.php'; ?>
|
||||
Reference in New Issue
Block a user