Sindbad~EG File Manager
<?php
require_once '../config/config.php';
require_once '../classes/MemberAuth.php';
// Check if member is logged in
if (!MemberAuth::isMemberLoggedIn()) {
redirect('../login.php');
}
$pageTitle = "Member Directory - " . APP_NAME;
$db = Database::getInstance()->getConnection();
// Get current member data
$currentMember = MemberAuth::getCurrentMember();
if (!$currentMember) {
redirect('../login.php');
}
// Get member's location details
$stmt = $db->prepare("
SELECT m.area_id, m.district_id, m.assembly_id,
a.area_name, d.district_name, ass.assembly_name
FROM members m
LEFT JOIN areas a ON m.area_id = a.id
LEFT JOIN districts d ON m.district_id = d.id
LEFT JOIN assemblies ass ON m.assembly_id = ass.id
WHERE m.id = :member_id
");
$stmt->execute(['member_id' => $currentMember['member_id']]);
$memberLocation = $stmt->fetch(PDO::FETCH_ASSOC);
// Handle search
$search = $_GET['search'] ?? '';
$members = [];
if (!empty($search)) {
// Build query based on member's location
$query = "
SELECT m.id, m.membershipcard_id, m.title, m.first_name, m.middle_name, m.last_name,
m.phone, m.email, m.member_type, m.gender,
a.area_name, d.district_name, ass.assembly_name
FROM members m
LEFT JOIN areas a ON m.area_id = a.id
LEFT JOIN districts d ON m.district_id = d.id
LEFT JOIN assemblies ass ON m.assembly_id = ass.id
WHERE m.is_active = 1
";
$params = [];
// Apply location-based filter
if ($memberLocation['assembly_id']) {
// Assembly level: Only show members from same assembly
$query .= " AND m.assembly_id = :assembly_id";
$params['assembly_id'] = $memberLocation['assembly_id'];
} elseif ($memberLocation['district_id']) {
// District level: Show members from same district
$query .= " AND m.district_id = :district_id";
$params['district_id'] = $memberLocation['district_id'];
} elseif ($memberLocation['area_id']) {
// Area level: Show members from same area
$query .= " AND m.area_id = :area_id";
$params['area_id'] = $memberLocation['area_id'];
}
// Add search conditions
$query .= " AND (
m.first_name LIKE :search1 OR
m.middle_name LIKE :search2 OR
m.last_name LIKE :search3 OR
m.membershipcard_id LIKE :search4 OR
m.phone LIKE :search5 OR
m.email LIKE :search6 OR
CONCAT(m.first_name, ' ', m.middle_name, ' ', m.last_name) LIKE :search7 OR
CONCAT(m.first_name, ' ', m.last_name) LIKE :search8
)";
$searchTerm = "%{$search}%";
for ($i = 1; $i <= 8; $i++) {
$params["search{$i}"] = $searchTerm;
}
$query .= " ORDER BY m.last_name, m.first_name LIMIT 50";
$stmt = $db->prepare($query);
$stmt->execute($params);
$members = $stmt->fetchAll(PDO::FETCH_ASSOC);
}
// Get settings for theme colors
$stmt = $db->query("SELECT * FROM general_settings ORDER BY id DESC LIMIT 1");
$settings = $stmt->fetch();
$settings = array_merge([
'site_title' => APP_NAME,
'theme_primary_color' => '#3B82F6',
'theme_secondary_color' => '#10B981'
], $settings ?: []);
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title><?php echo $pageTitle; ?></title>
<script src="https://cdn.tailwindcss.com"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css">
<style>
:root {
--primary-color: <?php echo $settings['theme_primary_color']; ?>;
--secondary-color: <?php echo $settings['theme_secondary_color']; ?>;
}
.bg-primary { background-color: var(--primary-color); }
.bg-secondary { background-color: var(--secondary-color); }
.text-primary { color: var(--primary-color); }
.border-primary { border-color: var(--primary-color); }
.gradient-bg { background: linear-gradient(135deg, #1E40AF 0%, #9333EA 50%, #F97316 100%); }
.card-hover { transition: all 0.3s ease; }
.card-hover:hover { transform: translateY(-2px); box-shadow: 0 10px 20px -5px rgba(0,0,0,0.1); }
</style>
</head>
<body class="bg-gray-50">
<!-- Member Portal Header -->
<header class="bg-white shadow-lg sticky top-0 z-50">
<div class="container mx-auto px-4">
<div class="flex items-center justify-between h-16">
<div class="flex items-center space-x-3">
<div class="w-10 h-10 rounded-xl flex items-center justify-center gradient-bg">
<i class="fas fa-church text-white"></i>
</div>
<div>
<h1 class="text-lg font-bold text-gray-800"><?php echo htmlspecialchars($settings['site_title']); ?></h1>
<p class="text-xs text-gray-500">Member Portal</p>
</div>
</div>
<nav class="hidden md:flex items-center space-x-6">
<a href="dashboard.php" class="text-gray-700 hover:text-blue-600 transition">
<i class="fas fa-home mr-1"></i>Dashboard
</a>
<a href="directory.php" class="text-blue-600 font-medium border-b-2 border-blue-600 pb-1">
<i class="fas fa-address-book mr-1"></i>Directory
</a>
<a href="profile.php" class="text-gray-700 hover:text-blue-600 transition">
<i class="fas fa-user mr-1"></i>Profile
</a>
</nav>
<div class="flex items-center space-x-3">
<a href="../logout.php?member=1" class="text-gray-600 hover:text-red-600 transition">
<i class="fas fa-sign-out-alt mr-1"></i>Logout
</a>
</div>
</div>
</div>
</header>
<div class="container mx-auto px-4 py-8">
<div class="max-w-6xl mx-auto">
<!-- Header Section -->
<div class="mb-8">
<div class="gradient-bg rounded-xl shadow-lg p-8 text-white">
<div class="flex flex-col md:flex-row md:items-center md:justify-between">
<div>
<h1 class="text-3xl font-bold mb-2">Member Directory</h1>
<p class="text-blue-100">
Search members in your <?php
if ($memberLocation['assembly_id']) {
echo 'assembly: ' . htmlspecialchars($memberLocation['assembly_name']);
} elseif ($memberLocation['district_id']) {
echo 'district: ' . htmlspecialchars($memberLocation['district_name']);
} elseif ($memberLocation['area_id']) {
echo 'area: ' . htmlspecialchars($memberLocation['area_name']);
}
?>
</p>
</div>
<div class="mt-4 md:mt-0">
<a href="dashboard.php" class="bg-white text-primary px-6 py-3 rounded-lg font-semibold hover:bg-blue-50 transition-all duration-300 shadow-md inline-flex items-center">
<i class="fas fa-arrow-left mr-2"></i>
Back to Dashboard
</a>
</div>
</div>
</div>
</div>
<!-- Search Box -->
<div class="bg-white rounded-xl shadow-lg p-6 mb-8">
<form method="GET" action="" class="flex flex-col md:flex-row gap-4">
<div class="flex-1">
<input type="text"
name="search"
value="<?= htmlspecialchars($search) ?>"
placeholder="Search by name, membership ID, phone, or email..."
class="w-full px-6 py-4 border-2 border-gray-200 rounded-lg focus:ring-2 focus:ring-primary focus:border-primary text-lg">
</div>
<button type="submit" class="gradient-bg text-white px-8 py-4 rounded-lg font-semibold hover:shadow-lg transition-all duration-300 inline-flex items-center justify-center">
<i class="fas fa-search mr-2"></i>
Search
</button>
</form>
</div>
<!-- Search Results -->
<?php if (!empty($search)): ?>
<?php if (count($members) > 0): ?>
<div class="bg-white rounded-xl shadow-lg p-6">
<div class="flex items-center justify-between mb-6">
<h2 class="text-xl font-bold text-gray-800">
<i class="fas fa-users mr-2 text-blue-500"></i>
Search Results (<?= count($members) ?>)
</h2>
</div>
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
<?php foreach ($members as $member): ?>
<div class="border border-gray-200 rounded-lg p-6 card-hover">
<div class="flex items-start space-x-4">
<div class="w-16 h-16 rounded-full bg-gradient-to-br from-blue-500 to-purple-600 flex items-center justify-center text-white text-xl font-bold flex-shrink-0">
<?= strtoupper(substr($member['first_name'], 0, 1) . substr($member['last_name'], 0, 1)) ?>
</div>
<div class="flex-1 min-w-0">
<h3 class="font-bold text-gray-800 text-lg mb-1 truncate">
<?= htmlspecialchars(trim(($member['title'] ?? '') . ' ' . $member['first_name'] . ' ' . ($member['middle_name'] ?? '') . ' ' . $member['last_name'])) ?>
</h3>
<p class="text-sm text-gray-600 mb-2">
<i class="fas fa-id-card mr-1 text-blue-500"></i>
<?= htmlspecialchars($member['membershipcard_id'] ?? 'N/A') ?>
</p>
<div class="space-y-1 text-sm">
<?php if (!empty($member['phone'])): ?>
<p class="text-gray-700">
<i class="fas fa-phone mr-1 text-green-500"></i>
<a href="tel:<?= htmlspecialchars($member['phone']) ?>" class="hover:text-blue-600">
<?= htmlspecialchars($member['phone']) ?>
</a>
</p>
<?php endif; ?>
<?php if (!empty($member['email'])): ?>
<p class="text-gray-700 truncate">
<i class="fas fa-envelope mr-1 text-orange-500"></i>
<a href="mailto:<?= htmlspecialchars($member['email']) ?>" class="hover:text-blue-600">
<?= htmlspecialchars($member['email']) ?>
</a>
</p>
<?php endif; ?>
<p class="text-gray-600">
<i class="fas fa-map-marker-alt mr-1 text-red-500"></i>
<?= htmlspecialchars($member['assembly_name'] ?? $member['district_name'] ?? $member['area_name'] ?? 'N/A') ?>
</p>
<p class="text-xs text-gray-500 mt-2">
<span class="inline-flex items-center px-2 py-1 rounded-full bg-blue-100 text-blue-800">
<?= htmlspecialchars($member['member_type'] ?? 'Member') ?>
</span>
</p>
</div>
</div>
</div>
</div>
<?php endforeach; ?>
</div>
</div>
<?php else: ?>
<div class="bg-white rounded-xl shadow-lg p-12 text-center">
<div class="text-gray-400 mb-4">
<i class="fas fa-search text-6xl"></i>
</div>
<h3 class="text-2xl font-bold text-gray-800 mb-3">No Members Found</h3>
<p class="text-gray-600">
No members found matching "<?= htmlspecialchars($search) ?>" in your location.
</p>
</div>
<?php endif; ?>
<?php else: ?>
<div class="bg-white rounded-xl shadow-lg p-12 text-center">
<div class="text-gray-400 mb-4">
<i class="fas fa-address-book text-6xl"></i>
</div>
<h3 class="text-2xl font-bold text-gray-800 mb-3">Search for Members</h3>
<p class="text-gray-600 mb-6">
Use the search bar above to find members by name, membership ID, phone, or email.<br>
You can only see members from your
<?php
if ($memberLocation['assembly_id']) {
echo 'assembly';
} elseif ($memberLocation['district_id']) {
echo 'district';
} elseif ($memberLocation['area_id']) {
echo 'area';
}
?>.
</p>
</div>
<?php endif; ?>
</div>
</div>
<footer class="bg-white border-t border-gray-200 mt-12">
<div class="container mx-auto px-4 py-6">
<p class="text-center text-gray-600 text-sm">
© <?php echo date('Y'); ?> <?php echo htmlspecialchars($settings['site_title']); ?>. All rights reserved.
</p>
</div>
</footer>
<?php
// Include Chat Hub Widget (Admin Chat + AI Chatbot)
if (file_exists(__DIR__ . '/../includes/chat-hub-widget.php')) {
include '../includes/chat-hub-widget.php';
}
?>
</body>
</html>
Sindbad File Manager Version 1.0, Coded By Sindbad EG ~ The Terrorists