Anons79 Mini Shell

Directory : /home/aplikasiposinfo/www/panahan.aplikasipos.info/
Upload File :
Current File : /home/aplikasiposinfo/www/panahan.aplikasipos.info/peserta.view.php

<?php
include 'panggil.php';
if($_SESSION['role']  != 'admin') {
    header('Location: kegiatan.view.php');
    exit;
}
// Handle export to Excel
if (isset($_GET['export']) && $_GET['export'] == 'excel') {
    // Set headers untuk download Excel
    header("Content-Type: application/vnd.ms-excel");
    header("Content-Disposition: attachment; filename=data_peserta_" . date('Y-m-d') . ".xls");
    header("Pragma: no-cache");
    header("Expires: 0");
    
    // Ambil data dengan filter yang sama
    $category_id = $_GET['category_id'] ?? '';
    $kegiatan_id = $_GET['kegiatan_id'] ?? '';
    $gender = $_GET['gender'] ?? '';
    $nama = $_GET['nama'] ?? '';
    $club = $_GET['club'] ?? '';

    $query = "SELECT p.*, c.name AS category_name, k.nama_kegiatan
              FROM peserta p 
              LEFT JOIN categories c ON p.category_id = c.id
              LEFT JOIN kegiatan k ON p.kegiatan_id = k.id
              WHERE 1=1";

    $params = [];
    $types = '';

    if (!empty($category_id)) {
        $query .= " AND p.category_id = ?";
        $params[] = $category_id;
        $types .= "i";
    }

    if (!empty($kegiatan_id)) {
        $query .= " AND p.kegiatan_id = ?";
        $params[] = $kegiatan_id;
        $types .= "i";
    }

    if (!empty($gender)) {
        $query .= " AND p.jenis_kelamin = ?";
        $params[] = $gender;
        $types .= "s";
    }

    if (!empty($nama)) {
        $query .= " AND p.nama_peserta LIKE ?";
        $params[] = "%$nama%";
        $types .= "s";
    }

    if (!empty($club)) {
        $query .= " AND p.nama_club LIKE ?";
        $params[] = "%$club%";
        $types .= "s";
    }

    $query .= " ORDER BY p.nama_peserta ASC";

    if (!empty($params)) {
        $stmt = $conn->prepare($query);
        $stmt->bind_param($types, ...$params);
        $stmt->execute();
        $result = $stmt->get_result();
    } else {
        $result = $conn->query($query);
    }

    // Output Excel content
    echo "<table border='1'>";
    echo "<tr>";
    echo "<th>No</th>";
    echo "<th>ID</th>";
    echo "<th>Nama Peserta</th>";
    echo "<th>Kategori</th>";
    echo "<th>Kegiatan</th>";
    echo "<th>Tanggal Lahir</th>";
    echo "<th>Umur</th>";
    echo "<th>Jenis Kelamin</th>";
    echo "<th>Asal Kota</th>";
    echo "<th>Nama Club</th>";
    echo "<th>Sekolah</th>";
    echo "<th>Kelas</th>";
    echo "<th>Nomor HP</th>";
    echo "<th>Status Pembayaran</th>";
    echo "<th>Bukti Pembayaran</th>";
    echo "<th>Tanggal Daftar</th>";
    echo "</tr>";
    
    $no = 1;
    while ($row = $result->fetch_assoc()) {
        // Hitung umur
        $umur = "-";
        if (!empty($row['tanggal_lahir'])) {
            $dob = new DateTime($row['tanggal_lahir']);
            $today = new DateTime();
            $umur = $today->diff($dob)->y . " tahun";
        }
        
        $statusBayar = !empty($row['bukti_pembayaran']) ? 'Sudah Bayar' : 'Belum Bayar';
        
        echo "<tr>";
        echo "<td>" . $no++ . "</td>";
        echo "<td>" . $row['id'] . "</td>";
        echo "<td>" . htmlspecialchars($row['nama_peserta']) . "</td>";
        echo "<td>" . htmlspecialchars($row['category_name'] ?? '-') . "</td>";
        echo "<td>" . htmlspecialchars($row['nama_kegiatan'] ?? '-') . "</td>";
        echo "<td>" . htmlspecialchars($row['tanggal_lahir'] ?? '-') . "</td>";
        echo "<td>" . $umur . "</td>";
        echo "<td>" . htmlspecialchars($row['jenis_kelamin']) . "</td>";
        echo "<td>" . htmlspecialchars($row['asal_kota'] ?? '-') . "</td>";
        echo "<td>" . htmlspecialchars($row['nama_club'] ?? '-') . "</td>";
        echo "<td>" . htmlspecialchars($row['sekolah'] ?? '-') . "</td>";
        echo "<td>" . htmlspecialchars($row['kelas'] ?? '-') . "</td>";
        echo "<td>" . htmlspecialchars($row['nomor_hp'] ?? '-') . "</td>";
        echo "<td>" . $statusBayar . "</td>";
        echo "<td>" . htmlspecialchars($row['bukti_pembayaran'] ?? '-') . "</td>";
        echo "<td>" . htmlspecialchars($row['created_at'] ?? '-') . "</td>";
        echo "</tr>";
    }
    echo "</table>";
    exit();
}

if(isset($_GET['hapus_peserta'])) {
    $delete_score_board = mysqli_query($conn,'DELETE FROM `peserta` WHERE id ='.$_GET['hapus_peserta']);
    header("Location: peserta.view.php");
}

// --- Ambil kategori untuk dropdown ---
$kategoriResult = $conn->query("SELECT id, name FROM categories ORDER BY name ASC");
$kategoriList = [];
while ($row = $kategoriResult->fetch_assoc()) {
    $kategoriList[] = $row;
}

// --- Ambil kegiatan untuk dropdown ---
$kegiatanResult = $conn->query("SELECT id, nama_kegiatan FROM kegiatan ORDER BY nama_kegiatan ASC");
$kegiatanList = [];
while ($row = $kegiatanResult->fetch_assoc()) {
    $kegiatanList[] = $row;
}

// --- Ambil filter dari GET ---
$category_id = $_GET['category_id'] ?? '';
$kegiatan_id = $_GET['kegiatan_id'] ?? '';
$gender = $_GET['gender'] ?? '';
$nama = $_GET['nama'] ?? '';
$club = $_GET['club'] ?? '';

// --- Query peserta ---
$query = "SELECT p.*, c.name AS category_name, k.nama_kegiatan
          FROM peserta p 
          LEFT JOIN categories c ON p.category_id = c.id
          LEFT JOIN kegiatan k ON p.kegiatan_id = k.id
          WHERE 1=1";

$params = [];
$types = '';

if (!empty($category_id)) {
    $query .= " AND p.category_id = ?";
    $params[] = $category_id;
    $types .= "i";
}

if (!empty($kegiatan_id)) {
    $query .= " AND p.kegiatan_id = ?";
    $params[] = $kegiatan_id;
    $types .= "i";
}

if (!empty($gender)) {
    $query .= " AND p.jenis_kelamin = ?";
    $params[] = $gender;
    $types .= "s";
}

if (!empty($nama)) {
    $query .= " AND p.nama_peserta LIKE ?";
    $params[] = "%$nama%";
    $types .= "s";
}

if (!empty($club)) {
    $query .= " AND p.nama_club LIKE ?";
    $params[] = "%$club%";
    $types .= "s";
}

$query .= " ORDER BY p.nama_peserta ASC";

if (!empty($params)) {
    $stmt = $conn->prepare($query);
    $stmt->bind_param($types, ...$params);
    $stmt->execute();
    $result = $stmt->get_result();
} else {
    $result = $conn->query($query);
}

$peserta = [];
while ($row = $result->fetch_assoc()) {
    $peserta[] = $row;
}
?>
<!DOCTYPE html>
<html lang="id">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Data Peserta - Turnamen Panahan</title>
    <link href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.2/css/bootstrap.min.css" rel="stylesheet">
    <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
    <style>
        :root {
            --primary-color: #6366f1;
            --secondary-color: #8b5cf6;
            --accent-color: #06b6d4;
            --success-color: #10b981;
            --warning-color: #f59e0b;
            --danger-color: #ef4444;
            --dark-color: #1f2937;
            --light-gray: #f8fafc;
            --medium-gray: #e2e8f0;
            --text-dark: #374151;
            --text-light: #6b7280;
        }

        body { 
            background: linear-gradient(135deg, #f1f5f9 0%, #e2e8f0 100%);
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
            color: var(--text-dark);
            min-height: 100vh;
        }

        .header-card {
            background: linear-gradient(135deg, var(--primary-color) 0%, var(--secondary-color) 100%);
            color: white;
            padding: 3rem 2rem;
            margin-bottom: 2rem;
            border-radius: 20px;
            box-shadow: 0 10px 40px rgba(99, 102, 241, 0.3);
            backdrop-filter: blur(10px);
            position: relative;
            overflow: hidden;
        }

        .header-card::before {
            content: '';
            position: absolute;
            top: -50%;
            right: -50%;
            width: 200%;
            height: 200%;
            background: radial-gradient(circle, rgba(255,255,255,0.1) 0%, transparent 70%);
            animation: shimmer 3s infinite;
        }

        @keyframes shimmer {
            0%, 100% { transform: rotate(0deg); }
            50% { transform: rotate(180deg); }
        }

        .filter-card {
            background: rgba(255, 255, 255, 0.95);
            backdrop-filter: blur(20px);
            border: 1px solid rgba(255, 255, 255, 0.2);
            border-radius: 20px;
            box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);
            padding: 2rem;
            margin-bottom: 2rem;
        }

        .data-table {
            background: rgba(255, 255, 255, 0.95);
            backdrop-filter: blur(20px);
            border: 1px solid rgba(255, 255, 255, 0.2);
            border-radius: 20px;
            box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);
            overflow: hidden;
        }

        .table {
            margin-bottom: 0;
            border-collapse: separate;
            border-spacing: 0;
        }

        .table th {
            background: linear-gradient(135deg, var(--dark-color) 0%, #374151 100%);
            color: white;
            border: none;
            font-weight: 600;
            font-size: 0.875rem;
            padding: 1rem 0.75rem;
            text-transform: uppercase;
            letter-spacing: 0.5px;
            position: sticky;
            top: 0;
            z-index: 10;
        }

        .table th:first-child {
            border-top-left-radius: 20px;
        }

        .table th:last-child {
            border-top-right-radius: 20px;
        }

        .table td {
            padding: 1rem 0.75rem;
            vertical-align: middle;
            font-size: 0.9rem;
            border-bottom: 1px solid var(--medium-gray);
            transition: all 0.3s ease;
        }

        .table tbody tr {
            transition: all 0.3s ease;
        }

        .table tbody tr:hover {
            background: linear-gradient(135deg, rgba(99, 102, 241, 0.05) 0%, rgba(139, 92, 246, 0.05) 100%);
            transform: translateY(-2px);
            box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);
        }

        .table tbody tr:last-child td:first-child {
            border-bottom-left-radius: 20px;
        }

        .table tbody tr:last-child td:last-child {
            border-bottom-right-radius: 20px;
        }

        .badge {
            padding: 0.5rem 0.75rem;
            border-radius: 50px;
            font-weight: 500;
            font-size: 0.75rem;
            text-transform: uppercase;
            letter-spacing: 0.5px;
        }

        .badge-gender {
            font-size: 0.75rem;
        }

        .badge-status {
            font-size: 0.7rem;
        }

        .btn {
            border-radius: 12px;
            font-weight: 500;
            padding: 0.75rem 1.5rem;
            transition: all 0.3s ease;
            text-transform: uppercase;
            letter-spacing: 0.5px;
        }

        .btn-filter {
            background: linear-gradient(135deg, var(--primary-color) 0%, var(--secondary-color) 100%);
            border: none;
            box-shadow: 0 4px 15px rgba(99, 102, 241, 0.3);
        }

        .btn-filter:hover {
            background: linear-gradient(135deg, #5855eb 0%, #7c3aed 100%);
            transform: translateY(-2px);
            box-shadow: 0 6px 20px rgba(99, 102, 241, 0.4);
        }

        .btn-outline-secondary {
            border: 2px solid var(--medium-gray);
            color: var(--text-light);
        }

        .btn-outline-secondary:hover {
            background: var(--medium-gray);
            border-color: var(--medium-gray);
            color: var(--text-dark);
            transform: translateY(-2px);
        }

        .btn-success {
            background: linear-gradient(135deg, var(--success-color) 0%, #059669 100%);
            border: none;
            box-shadow: 0 4px 15px rgba(16, 185, 129, 0.3);
        }

        .btn-success:hover {
            background: linear-gradient(135deg, #059669 0%, #047857 100%);
            transform: translateY(-2px);
            box-shadow: 0 6px 20px rgba(16, 185, 129, 0.4);
        }

        .btn-info {
            background: linear-gradient(135deg, var(--accent-color) 0%, #0891b2 100%);
            border: none;
            box-shadow: 0 4px 15px rgba(6, 182, 212, 0.3);
        }

        .btn-info:hover {
            background: linear-gradient(135deg, #0891b2 0%, #0e7490 100%);
            transform: translateY(-2px);
            box-shadow: 0 6px 20px rgba(6, 182, 212, 0.4);
        }

        .stats-card {
            background: linear-gradient(135deg, rgba(255, 255, 255, 0.9) 0%, rgba(248, 250, 252, 0.9) 100%);
            backdrop-filter: blur(20px);
            border: 1px solid rgba(255, 255, 255, 0.3);
            border-radius: 16px;
            padding: 1.5rem;
            margin-bottom: 1rem;
            box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);
            transition: all 0.3s ease;
            position: relative;
            overflow: hidden;
        }

        .stats-card:hover {
            transform: translateY(-5px);
            box-shadow: 0 8px 30px rgba(0, 0, 0, 0.15);
        }

        .stats-card::before {
            content: '';
            position: absolute;
            top: 0;
            left: 0;
            right: 0;
            height: 4px;
            background: linear-gradient(90deg, var(--primary-color), var(--accent-color), var(--success-color), var(--warning-color));
        }

        .stats-card h4 {
            font-size: 2.5rem;
            font-weight: 700;
            margin: 0;
            background: linear-gradient(135deg, var(--primary-color), var(--secondary-color));
            -webkit-background-clip: text;
            -webkit-text-fill-color: transparent;
            background-clip: text;
        }

        .stats-card small {
            color: var(--text-light);
            font-weight: 500;
            text-transform: uppercase;
            letter-spacing: 1px;
        }

        .form-control, .form-select {
            border: 2px solid var(--medium-gray);
            border-radius: 12px;
            padding: 0.75rem 1rem;
            transition: all 0.3s ease;
            background: rgba(255, 255, 255, 0.8);
        }

        .form-control:focus, .form-select:focus {
            border-color: var(--primary-color);
            box-shadow: 0 0 0 0.2rem rgba(99, 102, 241, 0.25);
            background: white;
        }

        .form-label {
            font-weight: 600;
            color: var(--text-dark);
            margin-bottom: 0.5rem;
        }

        .table-responsive {
            max-height: 70vh;
            border-radius: 20px;
        }

        .small-text {
            font-size: 0.85rem;
        }

        .text-truncate-custom {
            max-width: 150px;
            white-space: nowrap;
            overflow: hidden;
            text-overflow: ellipsis;
        }

        /* Custom scrollbar */
        .table-responsive::-webkit-scrollbar {
            width: 8px;
            height: 8px;
        }

        .table-responsive::-webkit-scrollbar-track {
            background: var(--light-gray);
            border-radius: 10px;
        }

        .table-responsive::-webkit-scrollbar-thumb {
            background: linear-gradient(135deg, var(--primary-color), var(--secondary-color));
            border-radius: 10px;
        }

        .text-info {
            color: var(--accent-color) !important;
        }

        .text-info:hover {
            color: #0891b2 !important;
        }

        /* Modal untuk gambar */
        .modal-body img {
            max-width: 100%;
            height: auto;
            border-radius: 10px;
        }

        /* Animation for loading */
        @keyframes fadeInUp {
            from {
                opacity: 0;
                transform: translateY(30px);
            }
            to {
                opacity: 1;
                transform: translateY(0);
            }
        }

        .data-table {
            animation: fadeInUp 0.6s ease;
        }

        .stats-card:nth-child(1) { animation-delay: 0.1s; }
        .stats-card:nth-child(2) { animation-delay: 0.2s; }
        .stats-card:nth-child(3) { animation-delay: 0.3s; }
        .stats-card:nth-child(4) { animation-delay: 0.4s; }

        .action-buttons {
            margin-bottom: 2rem;
        }

        /* Dark mode support */
        @media (prefers-color-scheme: dark) {
            body {
                background: linear-gradient(135deg, #0f172a 0%, #1e293b 100%);
                color: #e2e8f0;
            }
        }
    </style>
</head>
<body>
<div class="container-fluid py-4">
    <div class="header-card text-center">
        <h1><i class="fas fa-bow-arrow me-3"></i>Data Peserta Turnamen Panahan</h1>
        <p class="mb-0">Sistem Manajemen Peserta Turnamen</p>
    </div>

    <!-- Action Buttons -->
    <div class="action-buttons d-flex justify-content-between align-items-center">
        <div>
            <a href="dashboard.php" class="btn btn-info">
                <i class="fas fa-arrow-left me-2"></i>Kembali ke Dashboard
            </a>
        </div>
        <div>
            <?php
            // Build export URL with current filters
            $exportParams = [];
            if (!empty($category_id)) $exportParams['category_id'] = $category_id;
            if (!empty($kegiatan_id)) $exportParams['kegiatan_id'] = $kegiatan_id;
            if (!empty($gender)) $exportParams['gender'] = $gender;
            if (!empty($nama)) $exportParams['nama'] = $nama;
            if (!empty($club)) $exportParams['club'] = $club;
            $exportParams['export'] = 'excel';
            $exportUrl = '?' . http_build_query($exportParams);
            ?>
            <a href="<?= $exportUrl ?>" class="btn btn-success">
                <i class="fas fa-file-excel me-2"></i>Export Excel
            </a>
        </div>
    </div>

    <!-- Stats Cards -->
    <div class="row mb-4">
        <div class="col-md-3">
            <div class="stats-card text-center text-white">
                <h4><?= count($peserta) ?></h4>
                <small>Total Peserta</small>
            </div>
        </div>
        <div class="col-md-3">
            <div class="stats-card text-center text-white">
                <h4><?= count(array_filter($peserta, fn($p) => $p['jenis_kelamin'] == 'Laki-laki')) ?></h4>
                <small>Laki-laki</small>
            </div>
        </div>
        <div class="col-md-3">
            <div class="stats-card text-center text-white">
                <h4><?= count(array_filter($peserta, fn($p) => $p['jenis_kelamin'] == 'Perempuan')) ?></h4>
                <small>Perempuan</small>
            </div>
        </div>
        <div class="col-md-3">
            <div class="stats-card text-center text-white">
                <h4><?= count(array_filter($peserta, fn($p) => !empty($p['bukti_pembayaran']))) ?></h4>
                <small>Sudah Bayar</small>
            </div>
        </div>
    </div>

    <!-- Form Filter -->
    <div class="filter-card">
        <h5 class="mb-3"><i class="fas fa-filter me-2"></i>Filter Pencarian</h5>
        <form method="get">
            <div class="row g-3">
                <div class="col-md-3">
                    <label class="form-label">Kategori</label>
                    <select class="form-select" name="category_id">
                        <option value="">Semua Kategori</option>
                        <?php foreach ($kategoriList as $kat): ?>
                            <option value="<?= $kat['id'] ?>" <?= $category_id==$kat['id']?'selected':'' ?>>
                                <?= htmlspecialchars($kat['name']) ?>
                            </option>
                        <?php endforeach; ?>
                    </select>
                </div>
                <div class="col-md-3">
                    <label class="form-label">Kegiatan</label>
                    <select class="form-select" name="kegiatan_id">
                        <option value="">Semua Kegiatan</option>
                        <?php foreach ($kegiatanList as $keg): ?>
                            <option value="<?= $keg['id'] ?>" <?= $kegiatan_id==$keg['id']?'selected':'' ?>>
                                <?= htmlspecialchars($keg['nama_kegiatan']) ?>
                            </option>
                        <?php endforeach; ?>
                    </select>
                </div>
                <div class="col-md-2">
                    <label class="form-label">Gender</label>
                    <select class="form-select" name="gender">
                        <option value="">Semua</option>
                        <option value="Laki-laki" <?= $gender=="Laki-laki"?'selected':'' ?>>Laki-laki</option>
                        <option value="Perempuan" <?= $gender=="Perempuan"?'selected':'' ?>>Perempuan</option>
                    </select>
                </div>
                <div class="col-md-2">
                    <label class="form-label">Nama Peserta</label>
                    <input type="text" class="form-control" name="nama" value="<?= htmlspecialchars($nama) ?>" placeholder="Cari nama...">
                </div>
                <div class="col-md-2">
                    <label class="form-label">Club</label>
                    <input type="text" class="form-control" name="club" value="<?= htmlspecialchars($club) ?>" placeholder="Nama club...">
                </div>
            </div>
            <div class="row mt-3">
                <div class="col-md-12 text-end">
                    <button type="submit" class="btn btn-filter btn-primary me-2">
                        <i class="fas fa-search me-2"></i>Cari
                    </button>
                    <a href="?" class="btn btn-outline-secondary">
                        <i class="fas fa-redo me-2"></i>Reset
                    </a>
                </div>
            </div>
        </form>
    </div>

    <!-- Tabel Peserta -->
    <div class="data-table">
        <div class="table-responsive">
            <table class="table table-hover mb-0">
                <thead>
                    <tr>
                        <th style="width: 50px;">No</th>
                        <th>Nama Peserta</th>
                        <th>Kategori</th>
                        <th>Kegiatan</th>
                        <th>Umur</th>
                        <th>Gender</th>
                        <th>Asal Kota</th>
                        <th>Club</th>
                        <th>Sekolah</th>
                        <th>Kelas</th>
                        <th>No. HP</th>
                        <th>Status</th>
                    </tr>
                </thead>
                <tbody>
                <?php if (empty($peserta)): ?>
                    <tr>
                        <td colspan="12" class="text-center text-muted py-4">
                            <i class="fas fa-inbox fa-3x mb-3"></i><br>
                            Tidak ada data peserta yang ditemukan.
                        </td>
                    </tr>
                <?php else: ?>
                    <?php 
                    $no = 1; 
                    foreach ($peserta as $p): 
                        // Hitung umur dari tanggal_lahir
                        $umur = "-";
                        if (!empty($p['tanggal_lahir'])) {
                            $dob = new DateTime($p['tanggal_lahir']);
                            $today = new DateTime();
                            $umur = $today->diff($dob)->y . " tahun";
                        }
                        
                        // Status pembayaran
                        $statusBayar = !empty($p['bukti_pembayaran']) ? 'Sudah Bayar' : 'Belum Bayar';
                        $badgeClass = !empty($p['bukti_pembayaran']) ? 'bg-success' : 'bg-warning text-dark';
                    ?>
                        <tr>
                            <td class="text-center"><?= $no++ ?></td>
                            <td>
                                <strong><?= htmlspecialchars($p['nama_peserta']) ?></strong><br>
                                <small class="text-muted">ID: <?= $p['id'] ?></small>
                            </td>
                            <td>
                                <?php if (!empty($p['category_name'])): ?>
                                    <span class="badge bg-info text-dark"><?= htmlspecialchars($p['category_name']) ?></span>
                                <?php else: ?>
                                    <span class="text-muted small">Belum ditentukan</span>
                                <?php endif; ?>
                            </td>
                            <td>
                                <?php if (!empty($p['nama_kegiatan'])): ?>
                                    <span class="badge bg-primary"><?= htmlspecialchars($p['nama_kegiatan']) ?></span>
                                <?php else: ?>
                                    <span class="text-muted small">Belum ditentukan</span>
                                <?php endif; ?>
                            </td>
                            <td class="small-text"><?= $umur ?></td>
                            <td>
                                <!-- <span class="badge badge-gender <?= $p['jenis_kelamin'] == 'Laki-laki' ? 'bg-primary' : 'bg-danger' ?>">
                                    <i class="fas <?= $p['jenis_kelamin'] == 'Laki-laki' ? 'fa-mars' : 'fa-venus' ?> me-1"></i>
                                    <?= "-" // htmlspecialchars($p['jenis_kelamin']) ?>
                                </span> -->
                            </td>
                            <td class="small-text"><?= htmlspecialchars($p['asal_kota'] ?? '-') ?></td>
                            <td class="small-text text-truncate-custom" title="<?= htmlspecialchars($p['nama_club'] ?? '') ?>">
                                <?= htmlspecialchars($p['nama_club'] ?? '-') ?>
                            </td>
                            <td class="small-text text-truncate-custom" title="<?= htmlspecialchars($p['sekolah'] ?? '') ?>">
                                <?= htmlspecialchars($p['sekolah'] ?? '-') ?>
                            </td>
                            <td class="small-text"><?= htmlspecialchars($p['kelas'] ?? '-') ?></td>
                            <td class="small-text">
                                <?php if (!empty($p['nomor_hp'])): ?>
                                    <a href="tel:<?= $p['nomor_hp'] ?>" class="text-decoration-none">
                                        <i class="fas fa-phone-alt me-1"></i><?= htmlspecialchars($p['nomor_hp']) ?>
                                    </a>
                                <?php else: ?>
                                    -
                                <?php endif; ?>
                            </td>
                            <td>
                                <span class="badge badge-status <?= $badgeClass ?>">
                                    <i class="fas <?= !empty($p['bukti_pembayaran']) ? 'fa-check-circle' : 'fa-clock' ?> me-1"></i>
                                    <?= $statusBayar ?>
                                </span>
                                <?php if (!empty($p['bukti_pembayaran'])): ?>
                                    <br><small class="text-muted">
                                        <a href="#" class="text-info" onclick="showImage('<?= htmlspecialchars($p['bukti_pembayaran']) ?>', '<?= htmlspecialchars($p['nama_peserta']) ?>')">
                                            <i class="fas fa-file-image me-1"></i>Lihat Bukti
                                        </a>
                                        <br>
                                    </small>
                                <?php endif; ?>
                                <a style="color : red; text-decoration : none;" onclick="delete_peserta('peserta.view.php?hapus_peserta=<?=$p['id']?>')">Hapus Data</a>
                            </td>
                        </tr>
                    <?php endforeach; ?>
                <?php endif; ?>
                </tbody>
            </table>
        </div>
    </div>
    
    <?php if (!empty($peserta)): ?>
        <div class="mt-3 text-end">
            <small class="text-muted">Menampilkan <?= count($peserta) ?> peserta</small>
        </div>
    <?php endif; ?>
</div>

<!-- Modal untuk menampilkan gambar -->
<div class="modal fade" id="imageModal" tabindex="-1" aria-labelledby="imageModalLabel" aria-hidden="true">
    <div class="modal-dialog modal-lg modal-dialog-centered">
        <div class="modal-content">
            <div class="modal-header">
                <h5 class="modal-title" id="imageModalLabel">Bukti Pembayaran</h5>
                <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
            </div>
            <div class="modal-body text-center">
                <!-- Content akan dimuat dinamis oleh JavaScript -->
            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">
                    <i class="fas fa-times me-2"></i>Tutup
                </button>
                <a id="downloadImage" href="" download class="btn btn-primary">
                    <i class="fas fa-download me-2"></i>Download
                </a>
            </div>
        </div>
    </div>
</div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.2/js/bootstrap.bundle.min.js"></script>
<script>
// Auto-submit form on select change untuk better UX
document.querySelectorAll('select[name="category_id"], select[name="kegiatan_id"], select[name="gender"]').forEach(function(select) {
    select.addEventListener('change', function() {
        this.form.submit();
    });
});

function delete_peserta(url) {
    if(confirm("Apakah anda yakin akan menghapus data ini?")) {
        window.location.href = url;
    }
}

// Tooltip untuk teks yang terpotong
var tooltipTriggerList = [].slice.call(document.querySelectorAll('[title]'))
var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) {
    return new bootstrap.Tooltip(tooltipTriggerEl)
});

// Function untuk menampilkan gambar dalam modal - diperbaiki berdasarkan contoh code
function showImage(filename, pesertaName) {
    const modal = new bootstrap.Modal(document.getElementById('imageModal'));
    const modalTitle = document.getElementById('imageModalLabel');
    const modalBody = document.querySelector('#imageModal .modal-body');
    const downloadLink = document.getElementById('downloadImage');
    
    // Set title
    modalTitle.textContent = 'Bukti Pembayaran - ' + pesertaName;
    
    // Cek ekstensi file untuk menentukan cara menampilkan
    const fileExtension = filename.toLowerCase().split('.').pop();
    // Path disesuaikan dengan struktur folder uploads biasa
    const imagePath = 'uploads/' + filename;
    
    // Reset modal body
    modalBody.innerHTML = '';
    
    if (['jpg', 'jpeg', 'png', 'gif', 'webp', 'bmp'].includes(fileExtension)) {
        // Tampilkan sebagai gambar
        const img = document.createElement('img');
        img.id = 'modalImage';
        img.className = 'img-fluid';
        img.style.maxWidth = '100%';
        img.style.maxHeight = '500px';
        img.style.borderRadius = '8px';
        img.alt = 'Bukti Pembayaran';
        
        // Error div
        const errorDiv = document.createElement('div');
        errorDiv.id = 'imageError';
        errorDiv.className = 'alert alert-warning mt-3';
        errorDiv.style.display = 'none';
        
        // Info div
        const infoDiv = document.createElement('div');
        infoDiv.className = 'mt-3 p-3 bg-light rounded';
        infoDiv.style.fontSize = '14px';
        infoDiv.innerHTML = `
            <strong>File:</strong> ${filename}<br>
            <strong>Peserta:</strong> ${pesertaName}<br>
            <strong>Path:</strong> ${imagePath}
        `;
        
        // Test loading gambar dengan berbagai kemungkinan path
        const possiblePaths = [
            'uploads/' + filename,           // Path standar
            'uploads/bukti/' + filename,     // Jika ada subfolder bukti
            'uploads/pembayaran/' + filename,// Jika ada subfolder pembayaran
            filename                         // Langsung tanpa folder
        ];
        
        let pathIndex = 0;
        
        function tryNextPath() {
            if (pathIndex >= possiblePaths.length) {
                // Semua path gagal, tampilkan error
                errorDiv.innerHTML = `
                    <i class="fas fa-exclamation-triangle me-2"></i>
                    Gambar tidak dapat dimuat dari semua path yang dicoba.
                    <br><strong>File:</strong> ${filename}
                    <br><strong>Path yang dicoba:</strong>
                    <ul style="text-align: left; margin: 10px 0;">
                        ${possiblePaths.map(path => `<li>${path}</li>`).join('')}
                    </ul>
                    <div class="mt-3">
                        ${possiblePaths.map(path => 
                            `<a href="${path}" target="_blank" class="btn btn-sm btn-outline-primary me-2 mb-2">
                                <i class="fas fa-external-link-alt me-1"></i>Coba: ${path}
                            </a>`
                        ).join('')}
                    </div>
                `;
                errorDiv.style.display = 'block';
                modalBody.appendChild(errorDiv);
                modalBody.appendChild(infoDiv);
                return;
            }
            
            const testImage = new Image();
            const currentPath = possiblePaths[pathIndex];
            
            testImage.onload = function() {
                // Gambar berhasil dimuat
                img.src = currentPath;
                modalBody.appendChild(img);
                modalBody.appendChild(infoDiv);
                
                // Update info dengan path yang berhasil
                infoDiv.innerHTML = `
                    <strong>File:</strong> ${filename}<br>
                    <strong>Peserta:</strong> ${pesertaName}<br>
                    <strong>Path:</strong> ${currentPath} ✅
                `;
                
                // Set download link
                downloadLink.href = currentPath;
                downloadLink.download = 'bukti_pembayaran_' + pesertaName.replace(/[^a-zA-Z0-9]/g, '_') + '.' + fileExtension;
            };
            
            testImage.onerror = function() {
                // Coba path berikutnya
                pathIndex++;
                tryNextPath();
            };
            
            // Mulai test loading
            testImage.src = currentPath;
        }
        
        // Mulai dari path pertama
        tryNextPath();
        
    } else if (fileExtension === 'pdf') {
        // Tampilkan interface untuk PDF
        modalBody.innerHTML = `
            <div class="text-center p-4">
                <div style="font-size: 48px; color: #dc3545; margin-bottom: 20px;">📄</div>
                <h4>File PDF</h4>
                <p class="mb-3 text-muted">File bukti pembayaran dalam format PDF</p>
                <div class="d-flex justify-content-center gap-2">
                    <a href="${imagePath}" target="_blank" class="btn btn-primary">
                        <i class="fas fa-external-link-alt me-1"></i>Buka PDF
                    </a>
                    <a href="${imagePath}" download="${filename}" class="btn btn-success">
                        <i class="fas fa-download me-1"></i>Download
                    </a>
                </div>
                <div class="mt-3 p-3 bg-light rounded text-start" style="font-size: 14px;">
                    <strong>File:</strong> ${filename}<br>
                    <strong>Peserta:</strong> ${pesertaName}
                </div>
            </div>
        `;
        
        // Set download link
        downloadLink.href = imagePath;
        downloadLink.download = filename;
        
    } else {
        // File format tidak didukung
        modalBody.innerHTML = `
            <div class="text-center p-4">
                <div style="font-size: 48px; color: #ffc107; margin-bottom: 20px;">⚠️</div>
                <h4>File tidak dapat ditampilkan</h4>
                <p class="mb-3 text-muted">Format file tidak didukung untuk preview</p>
                <div class="d-flex justify-content-center gap-2">
                    <a href="${imagePath}" target="_blank" class="btn btn-primary">
                        <i class="fas fa-external-link-alt me-1"></i>Buka File
                    </a>
                    <a href="${imagePath}" download="${filename}" class="btn btn-success">
                        <i class="fas fa-download me-1"></i>Download
                    </a>
                </div>
                <div class="mt-3 p-3 bg-light rounded text-start" style="font-size: 14px;">
                    <strong>File:</strong> ${filename}<br>
                    <strong>Peserta:</strong> ${pesertaName}<br>
                    <strong>Format:</strong> ${fileExtension.toUpperCase()}
                </div>
            </div>
        `;
        
        // Set download link
        downloadLink.href = imagePath;
        downloadLink.download = filename;
    }
    
    // Show modal
    modal.show();
}

// Konfirmasi sebelum export Excel
document.querySelector('a[href*="export=excel"]').addEventListener('click', function(e) {
    if (!confirm('Apakah Anda yakin ingin mengexport data ke Excel? Proses ini mungkin membutuhkan waktu beberapa detik.')) {
        e.preventDefault();
    }
});
</script>
</body>
</html>

Anons79 File Manager Version 1.0, Coded By Anons79
Email: [email protected]