Sindbad~EG File Manager
<?php
require_once '../../config/config.php';
checkLogin();
$pageTitle = "Ministries & Groups - " . APP_NAME;
$db = Database::getInstance()->getConnection();
$success = '';
$error = '';
// Get user access
$accessLevel = $_SESSION['access_level'] ?? 'assembly';
$userAssemblyId = $_SESSION['assembly_id'] ?? null;
// Handle ministry creation/update
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
try {
if (isset($_POST['create_ministry'])) {
$stmt = $db->prepare("
INSERT INTO ministries (
ministry_name, ministry_type, category_id, description, mission_statement,
area_id, district_id, assembly_id, leader_member_id, founding_date, meeting_schedule, meeting_venue,
contact_person, contact_phone, contact_email, created_by
) VALUES (
:name, :type, :category_id, :description, :mission_statement,
:area_id, :district_id, :assembly_id, :leader_id, :founding_date, :meeting_schedule, :meeting_venue,
:contact_person, :contact_phone, :contact_email, :created_by
)
");
$stmt->execute([
'name' => $_POST['ministry_name'],
'type' => $_POST['ministry_type'],
'category_id' => $_POST['category_id'] ?? null,
'description' => $_POST['description'] ?? null,
'mission_statement' => $_POST['mission_statement'] ?? null,
'area_id' => $_POST['area_id'] ?? null,
'district_id' => $_POST['district_id'] ?? null,
'assembly_id' => $_POST['assembly_id'] ?? $userAssemblyId,
'leader_id' => $_POST['leader_member_id'] ?? null,
'founding_date' => $_POST['founding_date'] ?? null,
'meeting_schedule' => $_POST['meeting_schedule'] ?? null,
'meeting_venue' => $_POST['meeting_venue'] ?? null,
'contact_person' => $_POST['contact_person'] ?? null,
'contact_phone' => $_POST['contact_phone'] ?? null,
'contact_email' => $_POST['contact_email'] ?? null,
'created_by' => $_SESSION['user_id']
]);
$success = "Ministry created successfully!";
}
if (isset($_POST['delete_ministry'])) {
$stmt = $db->prepare("DELETE FROM ministries WHERE id = :id");
$stmt->execute(['id' => $_POST['ministry_id']]);
$success = "Ministry deleted successfully!";
}
} catch (Exception $e) {
$error = "Error: " . $e->getMessage();
}
}
// Get filters
$filterType = $_GET['type'] ?? '';
$filterCategory = $_GET['category'] ?? '';
$filterDistrict = $_GET['district'] ?? '';
$filterAssembly = $_GET['assembly'] ?? '';
// Build query
$query = "
SELECT m.*, mc.category_name, mc.icon, mc.color,
mem.first_name as leader_first_name, mem.last_name as leader_last_name,
asm.assembly_name, d.district_name, a.area_name,
(SELECT COUNT(*) FROM ministry_members mm WHERE mm.ministry_id = m.id AND mm.status = 'active') as member_count
FROM ministries m
LEFT JOIN ministry_categories mc ON m.category_id = mc.id
LEFT JOIN members mem ON m.leader_member_id = mem.id
LEFT JOIN assemblies asm ON m.assembly_id = asm.id
LEFT JOIN districts d ON m.district_id = d.id
LEFT JOIN areas a ON m.area_id = a.id
WHERE m.is_active = 1
";
$params = [];
if (!empty($filterType)) {
$query .= " AND m.ministry_type = :type";
$params['type'] = $filterType;
}
if (!empty($filterCategory)) {
$query .= " AND m.category_id = :category_id";
$params['category_id'] = $filterCategory;
}
if (!empty($filterDistrict)) {
$query .= " AND m.district_id = :district_id";
$params['district_id'] = $filterDistrict;
}
if (!empty($filterAssembly)) {
$query .= " AND m.assembly_id = :assembly_id";
$params['assembly_id'] = $filterAssembly;
} elseif ($accessLevel === 'assembly') {
$query .= " AND m.assembly_id = :assembly_id";
$params['assembly_id'] = $userAssemblyId;
}
$query .= " ORDER BY m.ministry_name";
$stmt = $db->prepare($query);
$stmt->execute($params);
$ministries = $stmt->fetchAll();
// Get categories for filter
$categories = $db->query("SELECT * FROM ministry_categories WHERE is_active = 1 ORDER BY display_order")->fetchAll();
// Get members for leader dropdown
$members = $db->query("SELECT id, first_name, last_name FROM members WHERE is_active = 1 ORDER BY first_name")->fetchAll();
// Get districts and assemblies for filters
$districts = $db->query("SELECT * FROM districts ORDER BY district_name")->fetchAll();
$assemblies = $db->query("SELECT a.*, d.district_name FROM assemblies a LEFT JOIN districts d ON a.district_id = d.id ORDER BY a.assembly_name")->fetchAll();
// Get areas for filter and form
$areas = $db->query("SELECT * FROM areas ORDER BY area_name")->fetchAll();
// Statistics
$stats = [
'total' => count($ministries),
'ministries' => count(array_filter($ministries, fn($m) => $m['ministry_type'] === 'ministry')),
'groups' => count(array_filter($ministries, fn($m) => $m['ministry_type'] === 'group')),
'interventions' => count(array_filter($ministries, fn($m) => $m['ministry_type'] === 'intervention')),
];
include '../../includes/header.php';
?>
<?php include '../../includes/sidebar.php'; ?>
<main class="flex-1 md:ml-64 mt-16">
<div class="container mx-auto px-4 py-8">
<div class="max-w-7xl mx-auto">
<div class="mb-6 flex justify-between items-center">
<div>
<h1 class="text-3xl font-bold text-gray-800">
<i class="fas fa-hands-helping mr-2 text-blue-500"></i>Ministries & Groups
</h1>
<p class="text-gray-600 mt-2">Manage ministries, groups and interventions</p>
</div>
<button onclick="document.getElementById('createModal').classList.remove('hidden')"
class="btn-gradient text-white px-6 py-3 rounded-lg transition">
<i class="fas fa-plus mr-2"></i>Create Ministry/Group
</button>
</div>
<?php if ($success): ?>
<div class="bg-green-100 border border-green-400 text-green-700 px-4 py-3 rounded-lg mb-6">
<i class="fas fa-check-circle mr-2"></i><?php echo $success; ?>
</div>
<?php endif; ?>
<?php if ($error): ?>
<div class="bg-red-100 border border-red-400 text-red-700 px-4 py-3 rounded-lg mb-6">
<i class="fas fa-exclamation-circle mr-2"></i><?php echo $error; ?>
</div>
<?php endif; ?>
<!-- Statistics -->
<div class="grid grid-cols-1 md:grid-cols-4 gap-4 mb-6">
<div class="bg-white rounded-lg shadow p-4 border-l-4 border-blue-500">
<div class="flex items-center justify-between">
<div>
<p class="text-sm text-gray-600">Total</p>
<p class="text-2xl font-bold text-gray-800"><?php echo $stats['total']; ?></p>
</div>
<i class="fas fa-th-large text-3xl text-blue-500"></i>
</div>
</div>
<div class="bg-white rounded-lg shadow p-4 border-l-4 border-green-500">
<div class="flex items-center justify-between">
<div>
<p class="text-sm text-gray-600">Ministries</p>
<p class="text-2xl font-bold text-gray-800"><?php echo $stats['ministries']; ?></p>
</div>
<i class="fas fa-church text-3xl text-green-500"></i>
</div>
</div>
<div class="bg-white rounded-lg shadow p-4 border-l-4 border-purple-500">
<div class="flex items-center justify-between">
<div>
<p class="text-sm text-gray-600">Groups</p>
<p class="text-2xl font-bold text-gray-800"><?php echo $stats['groups']; ?></p>
</div>
<i class="fas fa-users text-3xl text-purple-500"></i>
</div>
</div>
<div class="bg-white rounded-lg shadow p-4 border-l-4 border-orange-500">
<div class="flex items-center justify-between">
<div>
<p class="text-sm text-gray-600">Interventions</p>
<p class="text-2xl font-bold text-gray-800"><?php echo $stats['interventions']; ?></p>
</div>
<i class="fas fa-hands-helping text-3xl text-orange-500"></i>
</div>
</div>
</div>
<!-- Filters -->
<div class="bg-white rounded-lg shadow p-4 mb-6">
<form method="GET" class="grid grid-cols-1 md:grid-cols-5 gap-4">
<select name="type" class="px-4 py-2 border border-gray-300 rounded-lg">
<option value="">All Types</option>
<option value="ministry" <?php echo $filterType === 'ministry' ? 'selected' : ''; ?>>Ministries</option>
<option value="group" <?php echo $filterType === 'group' ? 'selected' : ''; ?>>Groups</option>
<option value="intervention" <?php echo $filterType === 'intervention' ? 'selected' : ''; ?>>Interventions</option>
</select>
<select name="category" class="px-4 py-2 border border-gray-300 rounded-lg">
<option value="">All Categories</option>
<?php foreach ($categories as $cat): ?>
<option value="<?php echo $cat['id']; ?>" <?php echo $filterCategory == $cat['id'] ? 'selected' : ''; ?>>
<?php echo htmlspecialchars($cat['category_name']); ?>
</option>
<?php endforeach; ?>
</select>
<select name="district" id="filterDistrict" class="px-4 py-2 border border-gray-300 rounded-lg">
<option value="">All Districts</option>
<?php foreach ($districts as $dist): ?>
<option value="<?php echo $dist['id']; ?>" <?php echo $filterDistrict == $dist['id'] ? 'selected' : ''; ?>>
<?php echo htmlspecialchars($dist['district_name']); ?>
</option>
<?php endforeach; ?>
</select>
<select name="assembly" id="filterAssembly" class="px-4 py-2 border border-gray-300 rounded-lg">
<option value="">All Assemblies</option>
<?php foreach ($assemblies as $asm): ?>
<option value="<?php echo $asm['id']; ?>"
data-district="<?php echo $asm['district_id']; ?>"
<?php echo $filterAssembly == $asm['id'] ? 'selected' : ''; ?>>
<?php echo htmlspecialchars($asm['assembly_name']); ?>
</option>
<?php endforeach; ?>
</select>
<div class="flex gap-2">
<button type="submit" class="flex-1 bg-blue-500 text-white px-4 py-2 rounded-lg hover:bg-blue-600">
<i class="fas fa-filter mr-2"></i>Filter
</button>
<a href="?" class="bg-gray-200 text-gray-700 px-4 py-2 rounded-lg hover:bg-gray-300 flex items-center">
<i class="fas fa-times"></i>
</a>
</div>
</form>
</div>
<!-- Ministries Grid -->
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
<?php foreach ($ministries as $ministry): ?>
<div class="bg-white rounded-lg shadow-lg hover:shadow-xl transition overflow-hidden">
<div class="p-4" style="background: linear-gradient(135deg, <?php echo $ministry['color'] ?? '#3B82F6'; ?> 0%, #1E40AF 100%);">
<div class="flex items-center justify-between text-white mb-2">
<i class="fas fa-<?php echo $ministry['icon'] ?? 'church'; ?> text-2xl"></i>
<span class="px-3 py-1 bg-white bg-opacity-20 rounded-full text-xs uppercase">
<?php echo ucfirst($ministry['ministry_type']); ?>
</span>
</div>
<h3 class="font-bold text-xl text-white"><?php echo htmlspecialchars($ministry['ministry_name']); ?></h3>
<?php if ($ministry['category_name']): ?>
<p class="text-white text-sm opacity-90 mt-1"><?php echo htmlspecialchars($ministry['category_name']); ?></p>
<?php endif; ?>
</div>
<div class="p-4">
<?php if ($ministry['description']): ?>
<p class="text-gray-600 text-sm mb-3"><?php echo htmlspecialchars(substr($ministry['description'], 0, 100)); ?>...</p>
<?php endif; ?>
<div class="space-y-2 text-sm text-gray-700 mb-4">
<?php if ($ministry['leader_first_name']): ?>
<div class="flex items-center">
<i class="fas fa-user-tie w-5 text-blue-500"></i>
<span><?php echo htmlspecialchars($ministry['leader_first_name'] . ' ' . $ministry['leader_last_name']); ?></span>
</div>
<?php endif; ?>
<div class="flex items-center">
<i class="fas fa-users w-5 text-green-500"></i>
<span><?php echo $ministry['member_count']; ?> Members</span>
</div>
<?php if ($ministry['assembly_name']): ?>
<div class="flex items-center">
<i class="fas fa-church w-5 text-orange-500"></i>
<span><?php echo htmlspecialchars($ministry['assembly_name']); ?>
<?php if ($ministry['district_name']): ?>
<span class="text-gray-500 text-xs"> (<?php echo htmlspecialchars($ministry['district_name']); ?>)</span>
<?php endif; ?>
</span>
</div>
<?php endif; ?>
<?php if ($ministry['area_name']): ?>
<div class="flex items-center">
<i class="fas fa-map-marked-alt w-5 text-indigo-500"></i>
<span><?php echo htmlspecialchars($ministry['area_name']); ?> Area</span>
</div>
<?php endif; ?>
<?php if ($ministry['meeting_schedule']): ?>
<div class="flex items-center">
<i class="fas fa-clock w-5 text-purple-500"></i>
<span><?php echo htmlspecialchars($ministry['meeting_schedule']); ?></span>
</div>
<?php endif; ?>
</div>
<div class="flex justify-between items-center pt-4 border-t border-gray-200">
<a href="executives.php?ministry_id=<?php echo $ministry['id']; ?>"
class="text-blue-600 hover:text-blue-800 text-sm">
<i class="fas fa-user-tie mr-1"></i>Executives
</a>
<div class="flex gap-2">
<button onclick="editMinistry(<?php echo $ministry['id']; ?>)"
class="text-green-600 hover:text-green-800">
<i class="fas fa-edit"></i>
</button>
<form method="POST" class="inline" onsubmit="return confirm('Delete this ministry?')">
<input type="hidden" name="ministry_id" value="<?php echo $ministry['id']; ?>">
<button type="submit" name="delete_ministry"
class="text-red-600 hover:text-red-800">
<i class="fas fa-trash"></i>
</button>
</form>
</div>
</div>
</div>
</div>
<?php endforeach; ?>
</div>
<?php if (empty($ministries)): ?>
<div class="text-center py-12">
<i class="fas fa-hands-helping text-6xl text-gray-300 mb-4"></i>
<p class="text-gray-600">No ministries or groups found</p>
</div>
<?php endif; ?>
</div>
</div>
</main>
<!-- Create Ministry Modal -->
<div id="createModal" class="fixed inset-0 bg-black bg-opacity-50 hidden z-50 overflow-y-auto">
<div class="flex items-center justify-center min-h-screen p-4">
<div class="bg-white rounded-lg max-w-2xl w-full p-6">
<div class="flex justify-between items-center mb-4">
<h3 class="text-lg font-semibold">Create New Ministry/Group</h3>
<button onclick="document.getElementById('createModal').classList.add('hidden')"
class="text-gray-400 hover:text-gray-600">
<i class="fas fa-times"></i>
</button>
</div>
<form method="POST" class="space-y-4">
<div class="grid grid-cols-2 gap-4">
<div class="col-span-2">
<label class="block text-sm font-medium text-gray-700 mb-2">Name*</label>
<input type="text" name="ministry_name" required
class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500">
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-2">Type*</label>
<select name="ministry_type" required
class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500">
<option value="ministry">Ministry</option>
<option value="group">Group</option>
<option value="intervention">Intervention</option>
</select>
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-2">Category</label>
<select name="category_id"
class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500">
<option value="">Select Category</option>
<?php foreach ($categories as $cat): ?>
<option value="<?php echo $cat['id']; ?>">
<?php echo htmlspecialchars($cat['category_name']); ?>
</option>
<?php endforeach; ?>
</select>
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-2">Area (Optional)</label>
<select name="area_id"
class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500">
<option value="">Select Area</option>
<?php foreach ($areas as $area): ?>
<option value="<?php echo $area['id']; ?>">
<?php echo htmlspecialchars($area['area_name']); ?>
</option>
<?php endforeach; ?>
</select>
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-2">District (Optional)</label>
<select name="district_id" id="formDistrict"
class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500">
<option value="">Select District</option>
<?php foreach ($districts as $dist): ?>
<option value="<?php echo $dist['id']; ?>">
<?php echo htmlspecialchars($dist['district_name']); ?>
</option>
<?php endforeach; ?>
</select>
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-2">Assembly*</label>
<select name="assembly_id" id="formAssembly" required
class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500">
<option value="">Select Assembly</option>
<?php foreach ($assemblies as $asm): ?>
<option value="<?php echo $asm['id']; ?>" data-district="<?php echo $asm['district_id']; ?>">
<?php echo htmlspecialchars($asm['assembly_name']); ?>
</option>
<?php endforeach; ?>
</select>
</div>
<div class="col-span-2">
<label class="block text-sm font-medium text-gray-700 mb-2">Description</label>
<textarea name="description" rows="3"
class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500"></textarea>
</div>
<div class="col-span-2">
<label class="block text-sm font-medium text-gray-700 mb-2">Meeting Schedule</label>
<input type="text" name="meeting_schedule" placeholder="e.g., Every Sunday at 3:00 PM"
class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500">
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-2">Contact Person</label>
<input type="text" name="contact_person"
class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500">
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-2">Contact Phone</label>
<input type="tel" name="contact_phone"
class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500">
</div>
</div>
<div class="flex justify-end space-x-3 pt-4">
<button type="button"
onclick="document.getElementById('createModal').classList.add('hidden')"
class="px-4 py-2 text-gray-600 hover:text-gray-800">
Cancel
</button>
<button type="submit" name="create_ministry"
class="bg-blue-500 text-white px-6 py-2 rounded-lg hover:bg-blue-600">
<i class="fas fa-plus mr-2"></i>Create
</button>
</div>
</form>
</div>
</div>
</div>
<script>
// Cascading dropdown for filters - District -> Assembly
const filterDistrict = document.getElementById('filterDistrict');
const filterAssembly = document.getElementById('filterAssembly');
if (filterDistrict && filterAssembly) {
filterDistrict.addEventListener('change', function() {
const selectedDistrict = this.value;
const assemblyOptions = filterAssembly.querySelectorAll('option');
assemblyOptions.forEach(option => {
if (option.value === '') {
option.style.display = '';
return;
}
const optionDistrict = option.getAttribute('data-district');
if (!selectedDistrict || optionDistrict === selectedDistrict) {
option.style.display = '';
} else {
option.style.display = 'none';
}
});
// Reset assembly selection if current selection is not visible
if (filterAssembly.value) {
const currentOption = filterAssembly.querySelector(`option[value="${filterAssembly.value}"]`);
if (currentOption && currentOption.style.display === 'none') {
filterAssembly.value = '';
}
}
});
// Trigger on page load to handle pre-selected values
if (filterDistrict.value) {
filterDistrict.dispatchEvent(new Event('change'));
}
}
// Cascading dropdown for form - District -> Assembly
const formDistrict = document.getElementById('formDistrict');
const formAssembly = document.getElementById('formAssembly');
if (formDistrict && formAssembly) {
formDistrict.addEventListener('change', function() {
const selectedDistrict = this.value;
const assemblyOptions = formAssembly.querySelectorAll('option');
assemblyOptions.forEach(option => {
if (option.value === '') {
option.style.display = '';
return;
}
const optionDistrict = option.getAttribute('data-district');
if (!selectedDistrict || optionDistrict === selectedDistrict) {
option.style.display = '';
} else {
option.style.display = 'none';
}
});
// Reset assembly selection if current selection is not visible
if (formAssembly.value) {
const currentOption = formAssembly.querySelector(`option[value="${formAssembly.value}"]`);
if (currentOption && currentOption.style.display === 'none') {
formAssembly.value = '';
}
}
});
}
</script>
<?php include '../../includes/footer.php'; ?>
Sindbad File Manager Version 1.0, Coded By Sindbad EG ~ The Terrorists