diff --git a/admin/admin.css b/admin/admin.css new file mode 100644 index 0000000..30129f9 --- /dev/null +++ b/admin/admin.css @@ -0,0 +1,52 @@ +:root { + --sidebar-width: 260px; + --primary-color: #059669; +} +body { background-color: #f3f4f6; } + +/* Sidebar English / LTR */ +[dir="ltr"] .sidebar { + width: var(--sidebar-width); + height: 100vh; + position: fixed; + left: 0; + top: 0; + background: #111827; + color: #fff; + padding: 1.5rem; + z-index: 1000; +} +[dir="ltr"] .main-content { margin-left: var(--sidebar-width); padding: 2rem; } + +/* Sidebar Arabic / RTL */ +[dir="rtl"] .sidebar { + width: var(--sidebar-width); + height: 100vh; + position: fixed; + right: 0; + top: 0; + background: #111827; + color: #fff; + padding: 1.5rem; + z-index: 1000; +} +[dir="rtl"] .main-content { margin-right: var(--sidebar-width); padding: 2rem; } + +.nav-link { color: #9ca3af; margin-bottom: 0.5rem; border-radius: 8px; } +.nav-link:hover, .nav-link.active { color: #fff; background: #1f2937; } +.nav-link.active { background: var(--primary-color); } +.card { border: none; border-radius: 12px; box-shadow: 0 1px 3px rgba(0,0,0,0.1); } +.stat-card { padding: 1.5rem; } +.stat-icon { font-size: 2rem; color: var(--primary-color); } +.badge-pending { background-color: #fef3c7; color: #92400e; } +.badge-completed { background-color: #d1fae5; color: #065f46; } +.badge-failed { background-color: #fee2e2; color: #991b1b; } +.chart-container { height: 300px; position: relative; } + +.badge-super_admin { background-color: #059669; } +.badge-org_admin { background-color: #3b82f6; } + +/* Arabic font fallback */ +[dir="rtl"] body { + font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; +} diff --git a/admin/audit_logs.php b/admin/audit_logs.php index 94bf156..61b7fea 100644 --- a/admin/audit_logs.php +++ b/admin/audit_logs.php @@ -3,9 +3,16 @@ require_once 'auth.php'; require_once '../db/config.php'; require_login(); +if (!is_super_admin()) { + header('Location: index.php'); + exit; +} + $user = get_user(); $pdo = db(); +$is_rtl = (get_current_lang() === 'ar'); + // Fetch audit logs with user info $logs = $pdo->query(" SELECT l.*, u.email as user_email @@ -16,33 +23,30 @@ $logs = $pdo->query(" ")->fetchAll(); ?> - + - Audit Logs - <?= htmlspecialchars(get_org_name()) ?> Admin + <?= __('audit_logs') ?> - <?= htmlspecialchars(get_org_name()) ?> + + + + + + - +
-

Activity Audit Logs

+

@@ -50,17 +54,17 @@ $logs = $pdo->query(" - - - - + + + + - - + @@ -79,5 +83,6 @@ $logs = $pdo->query(" + \ No newline at end of file diff --git a/admin/auth.php b/admin/auth.php index cc2d02e..635eb37 100644 --- a/admin/auth.php +++ b/admin/auth.php @@ -5,6 +5,7 @@ if (session_status() === PHP_SESSION_NONE) { } require_once __DIR__ . '/../db/config.php'; +require_once __DIR__ . '/i18n.php'; /** * Check if the user is logged in @@ -71,10 +72,13 @@ function get_org_name() { try { $pdo = db(); - $profile = $pdo->query("SELECT name_en FROM org_profile LIMIT 1")->fetch(); - if ($profile && !empty($profile['name_en'])) { - $_SESSION['org_name'] = $profile['name_en']; - return $profile['name_en']; + $profile = $pdo->query("SELECT name_en, name_ar FROM org_profile LIMIT 1")->fetch(); + if ($profile) { + $name = (get_current_lang() === 'ar' && !empty($profile['name_ar'])) ? $profile['name_ar'] : $profile['name_en']; + if (!empty($name)) { + $_SESSION['org_name'] = $name; + return $name; + } } } catch (Exception $e) { } diff --git a/admin/cases.php b/admin/cases.php index d6f37e3..751d578 100644 --- a/admin/cases.php +++ b/admin/cases.php @@ -46,7 +46,7 @@ if (isset($_GET['delete'])) { } // Fetch cases -$cases = $pdo->query("SELECT c.*, cat.name_en as cat_name FROM cases c LEFT JOIN categories cat ON c.category_id = cat.id ORDER BY c.id DESC")->fetchAll(); +$cases = $pdo->query("SELECT c.*, cat.name_en as cat_name_en, cat.name_ar as cat_name_ar FROM cases c LEFT JOIN categories cat ON c.category_id = cat.id ORDER BY c.id DESC")->fetchAll(); $categories = $pdo->query("SELECT * FROM categories")->fetchAll(); // Handle Add/Edit @@ -105,27 +105,26 @@ if (isset($_GET['edit'])) { $stmt->execute([$id]); $edit_case = $stmt->fetch(); } + +$is_rtl = (get_current_lang() === 'ar'); ?> - + - Manage Cases - <?= htmlspecialchars(get_org_name()) ?> Admin + <?= __('Manage Cases') ?> - <?= htmlspecialchars(get_org_name()) ?> - + + + + + + +
-

Manage Categories

+

- Operation successful! +
@@ -90,20 +87,20 @@ if (isset($_GET['edit'])) {
UserActionDetailsDate
- + + @@ -71,7 +75,7 @@ $logs = $pdo->query("
No logs found.
- - + + - - @@ -119,23 +116,23 @@ if (isset($_GET['edit'])) { @@ -150,7 +147,7 @@ if (isset($_GET['edit'])) { document.getElementById('catId').value = ''; document.getElementById('catNameEn').value = ''; document.getElementById('catNameAr').value = ''; - document.getElementById('modalTitle').innerText = 'New Category'; + document.getElementById('modalTitle').innerText = ''; } @@ -158,7 +155,7 @@ if (isset($_GET['edit'])) { document.getElementById('catId').value = ''; document.getElementById('catNameEn').value = ''; document.getElementById('catNameAr').value = ''; - document.getElementById('modalTitle').innerText = 'Edit Category'; + document.getElementById('modalTitle').innerText = ''; catModal.show(); }); diff --git a/admin/donations.php b/admin/donations.php index 5db6838..270c076 100644 --- a/admin/donations.php +++ b/admin/donations.php @@ -6,33 +6,32 @@ require_login(); $user = get_user(); $pdo = db(); +$is_rtl = (get_current_lang() === 'ar'); + // Fetch donations -$donations = $pdo->query("SELECT d.*, c.title_en as case_title, cat.name_en as cat_name +$donations = $pdo->query("SELECT d.*, c.title_en as case_title_en, c.title_ar as case_title_ar, cat.name_en as cat_name_en, cat.name_ar as cat_name_ar FROM donations d JOIN cases c ON d.case_id = c.id LEFT JOIN categories cat ON c.category_id = cat.id ORDER BY d.created_at DESC")->fetchAll(); ?> - + - Donations - <?= htmlspecialchars(get_org_name()) ?> Admin + <?= __('Donations') ?> - <?= htmlspecialchars(get_org_name()) ?> - + + + + + + +
-

Donor CRM

+

@@ -56,30 +53,30 @@ $donors = $pdo->query("
Name (EN/AR)Actions (EN/AR)
+
- - + + +
- - - - - - + + + + + + - - + - + - + diff --git a/admin/financial_summary.php b/admin/financial_summary.php index efa3bec..cce4160 100644 --- a/admin/financial_summary.php +++ b/admin/financial_summary.php @@ -6,8 +6,10 @@ require_login(); $user = get_user(); $pdo = db(); +$is_rtl = (get_current_lang() === 'ar'); + // Fetch Categories for filter -$stmt = $pdo->query("SELECT id, name_en FROM categories ORDER BY name_en ASC"); +$stmt = $pdo->query("SELECT id, name_en, name_ar FROM categories ORDER BY name_en ASC"); $categories = $stmt->fetchAll(); // Filters @@ -66,7 +68,7 @@ if (empty($status_filter)) { } $stmt = $pdo->prepare(" - SELECT c.name_en, SUM(d.amount) as total + SELECT c.name_en, c.name_ar, SUM(d.amount) as total FROM categories c JOIN cases cs ON cs.category_id = c.id JOIN donations d ON d.case_id = cs.id @@ -80,7 +82,7 @@ $category_revenue = $stmt->fetchAll(); $cat_labels = []; $cat_totals = []; foreach ($category_revenue as $row) { - $cat_labels[] = $row['name_en']; + $cat_labels[] = $is_rtl ? ($row['name_ar'] ?: $row['name_en']) : $row['name_en']; $cat_totals[] = (float)$row['total']; } @@ -123,7 +125,7 @@ if (empty($status_filter)) { } $stmt = $pdo->prepare(" - SELECT cs.title_en, SUM(d.amount) as total, cs.goal + SELECT cs.title_en, cs.title_ar, SUM(d.amount) as total, cs.goal FROM cases cs JOIN donations d ON d.case_id = cs.id WHERE $top_where @@ -154,7 +156,7 @@ $stmt = $pdo->prepare(" $stmt->execute($gift_params); $gift_stats = $stmt->fetchAll(); -$gift_labels = ['Regular', 'Gift']; +$gift_labels = [__('Regular'), __('Gift')]; $gift_totals = [0, 0]; foreach ($gift_stats as $row) { if ($row['is_gift']) { @@ -166,23 +168,23 @@ foreach ($gift_stats as $row) { ?> - + - Financial Summary - <?= htmlspecialchars(get_org_name()) ?> Admin + <?= __('Financial Summary') ?> - <?= htmlspecialchars(get_org_name()) ?> - + + + + + + @@ -71,8 +64,8 @@ $recent_donations = $pdo->query("
-

Welcome,

-

Manage your charity activities and donations.

+

,

+

@@ -82,7 +75,7 @@ $recent_donations = $pdo->query("
-
Categories
+
@@ -93,7 +86,7 @@ $recent_donations = $pdo->query("
-
Active Cases
+
@@ -104,8 +97,8 @@ $recent_donations = $pdo->query("
-
Total Donations
-
OMR
+
+
@@ -116,7 +109,7 @@ $recent_donations = $pdo->query("
-
Donation Trends (Last 30 Days)
+
()
@@ -124,11 +117,11 @@ $recent_donations = $pdo->query("
@@ -136,49 +129,41 @@ $recent_donations = $pdo->query("
-
Recent Donations
- View All +
+
Donor NameEmailPhoneDonationsTotal AmountLast Donation
- + + OMR
No donors found with completed payments.
- - - - - + + + + + - + - + + + + + - - - - - - - - - - - +
DonorCaseAmountStatusDate
No recent donations found. + + + +
-
-
-
OMR - - - -
+ diff --git a/admin/settings.php b/admin/settings.php index 5c4b41c..ecf5c09 100644 --- a/admin/settings.php +++ b/admin/settings.php @@ -24,26 +24,26 @@ $settings = []; foreach ($settings_raw as $s) { $settings[$s['setting_key']] = $s['setting_value']; } + +$is_rtl = (get_current_lang() === 'ar'); ?> - + - Gateway Settings - <?= htmlspecialchars(get_org_name()) ?> Admin + <?= __('Gateway Settings') ?> - <?= htmlspecialchars(get_org_name()) ?> - + + + + + +