# UPGRADE v4 — Fakultas Sains UNCP

Dokumentasi perubahan dari **v3 → v4**.

> Pastikan **v2** dan **v3** sudah di-deploy sebelum memasang v4.

---

## 🎯 Ringkasan Perubahan v4

### Bug Fixes
- ✅ **Mobile nav dropdown** — saat tap menu parent dengan submenu, submenu sekarang membuka (bukan menutup mobile nav)
- ✅ **Auto-increment sort_order** di Kelola Menu Nav — tidak perlu input angka manual
- ✅ **Icon Picker visual** — tidak perlu hafal kode FontAwesome lagi (modal dengan ~100 icon terkategorisasi + pencarian Bahasa Indonesia)
- ✅ **Role-Based Access Control** nyata — Super Admin vs Admin biasa punya akses berbeda

### Fitur Baru
- 🆕 **Layanan Mahasiswa** — halaman publik dengan 4 tab (Penalaran, Kesejahteraan, Kewirausahaan, Prestasi) + admin CRUD
- 🆕 **PHPMailer integration** untuk form kontak (kirim email + fallback ke WhatsApp)
- 🆕 **Activity Log** — audit trail semua aktivitas admin (login, create, update, delete, reorder)
- 🆕 **Drag-and-drop reorder** di Hero Slides, Quick Info, Pimpinan, Laboratorium, Agenda, dan Layanan Mahasiswa

---

## 📦 Langkah Deploy

### 1. Backup database & file

```bash
mysqldump -u root fsains_uncp > backup_pre_v4.sql
zip -r backup_pre_v4_files.zip C:/xampp/htdocs/fakultas_sains
```

### 2. Replace seluruh folder dengan isi `fakultas_sains_v4.zip`

Pastikan folder `upload/` lama dan `assets/images/` lama tidak hilang.

### 3. Run database upgrade

Buka phpMyAdmin → pilih database `fsains_uncp` → tab SQL → tempel isi
`database_upgrade_v4.sql` → Go.

Atau via CLI:

```bash
mysql -u root fsains_uncp < database_upgrade_v4.sql
```

### 4. Konfigurasi SMTP (untuk form kontak)

Login sebagai **Super Admin** → menu **Pengaturan Web** → scroll ke bagian SMTP:

| Setting | Contoh nilai (Gmail) |
|---------|----------------------|
| `smtp_host` | `smtp.gmail.com` |
| `smtp_port` | `587` |
| `smtp_username` | `noreply.fsains@gmail.com` |
| `smtp_password` | `xxxx xxxx xxxx xxxx` (App Password Gmail) |
| `smtp_secure` | `tls` |
| `smtp_from_email` | `noreply.fsains@gmail.com` |
| `smtp_from_name` | `Fakultas Sains UNCP` |
| `contact_to_email` | `info@fsains-uncp.ac.id` (email tujuan form kontak) |

**Catatan Gmail:** Anda harus pakai [App Password](https://myaccount.google.com/apppasswords), bukan password Gmail biasa. Aktifkan 2-Step Verification dulu.

### 5. (Opsional) Install PHPMailer untuk email yang lebih reliable

Sistem mendukung 2 mode:

**Mode A — PHPMailer via Composer (recommended):**
```bash
cd C:/xampp/htdocs/fakultas_sains
composer require phpmailer/phpmailer
```

**Mode B — PHPMailer manual:**

Download dari https://github.com/PHPMailer/PHPMailer/releases, copy folder `src/`
ke `includes/PHPMailer/` (3 file: `PHPMailer.php`, `SMTP.php`, `Exception.php`).

**Mode C — Tanpa PHPMailer:**

Sistem akan otomatis fallback ke fungsi `mail()` PHP standar.
Jika `mail()` tidak berfungsi (umumnya di XAMPP lokal), form kontak akan
fallback lagi ke redirect WhatsApp. Jadi form selalu berfungsi.

---

## 👥 Role Permissions

| Modul | Super Admin | Admin biasa |
|-------|:-----------:|:-----------:|
| Dashboard | ✅ | ✅ |
| **Kelola Berita** | ✅ | ✅ |
| **Agenda & Kegiatan** | ✅ | ✅ |
| Hero Slideshow | ✅ | ❌ |
| Quick Info Bar | ✅ | ❌ |
| Pimpinan | ✅ | ❌ |
| Laboratorium | ✅ | ❌ |
| Informasi Akademik | ✅ | ❌ |
| Layanan Mahasiswa | ✅ | ❌ |
| Pengaturan Web | ✅ | ❌ |
| Kelola Menu Nav | ✅ | ❌ |
| Kelola Admin | ✅ | ❌ |
| Activity Log | ✅ | ❌ |

> Set role admin baru lewat **Kelola Admin** → field "role" pilih `super` atau `admin`.

---

## 🎨 Icon Picker — Cara Pakai

Di form yang punya field icon (Quick Info, Laboratorium, Agenda, Layanan Mahasiswa):

1. Klik tombol **"Pilih Icon"** di samping input icon
2. Modal galeri muncul dengan 8 kategori (Akademik, Sains, Orang, Dokumen, Keuangan, Teknologi, Komunikasi, Lainnya)
3. Klik ikon yang diinginkan, atau ketik kata kunci Bahasa Indonesia di kolom pencarian (mis. "buku", "labu kimia", "tabung")
4. Ikon terpilih akan terisi otomatis di field input

---

## 🖱️ Drag-and-Drop Reorder

Di halaman admin (Hero, Quick Info, Pimpinan, Lab, Agenda, Layanan Mahasiswa):

1. Hover ke icon **grip** (titik enam) di sisi kiri tiap item
2. Klik dan tahan → drag ke posisi yang diinginkan
3. Lepas → urutan tersimpan otomatis ke database (tanpa reload)

> Field "Urutan" manual di form **tetap berfungsi** sebagai backup, tapi
> umumnya tidak perlu diisi karena drag-and-drop lebih intuitif.

---

## 📊 Activity Log

Akses via sidebar **Activity Log** (Super Admin only).

Yang dicatat:
- Login berhasil & login gagal (dengan IP)
- Tambah / edit / hapus berita
- Update settings (dengan daftar key yang berubah)
- Hapus item (hero slide, pimpinan, lab, agenda, dll)
- Reorder via drag-and-drop

Filter tersedia: User, Aksi, Range Tanggal.

---

## 🐛 Bug Fixes — Catatan Teknis

### Mobile Nav (header.php)
Sebelumnya: tap parent dropdown di mobile menutup seluruh nav menu.
Solusi: pakai `stopImmediatePropagation()` + selector `.nav-menu a:not(.dropdown-toggle)` agar handler "close menu on link click" tidak fire pada parent dropdown.

### Menu Auto-Increment (add-menu.php)
Sebelumnya: input `sort_order` manual (default 0 → semua menu di posisi yang sama).
Solusi: query `SELECT COALESCE(MAX(sort_order), 0) + 1` di-scope per `parent_id`, menu baru otomatis di posisi paling akhir.

---

## 📁 File Baru di v4

```
admin/
  api/
    reorder.php                ← AJAX endpoint untuk drag-and-drop
  includes/
    icon-picker.php            ← Reusable icon picker component
  activity-log.php             ← Audit trail viewer
  layanan-mahasiswa.php        ← Admin CRUD Layanan Mahasiswa

pages/
  layanan-mahasiswa.php        ← Halaman publik 4-tab

database_upgrade_v4.sql        ← Schema baru: layanan_mahasiswa, activity_log, SMTP settings
UPGRADE_v4.md                  ← Dokumen ini
```

## 📁 File yang Diubah di v4

```
admin/
  add-menu.php          ← auto-increment sort_order
  add.php               ← logActivity
  edit.php              ← logActivity
  delete.php            ← rewrite dengan auth + CSRF + logActivity
  hero-slides.php       ← drag-and-drop, logActivity
  quick-info.php        ← icon picker, drag-and-drop, logActivity
  pimpinan.php          ← drag-and-drop, logActivity
  laboratorium.php      ← icon picker, drag-and-drop, logActivity
  agenda.php            ← icon picker, drag-and-drop, logActivity
  settings.php          ← logActivity
  login.php             ← logActivity (login & login_failed)
  manage-admin.php      ← requireSuperAdmin helper
  news-management.php   ← CSRF token di link delete
  includes/admin_layout.php  ← sidebar role-aware, support icon picker & sortable

includes/
  header.php            ← fix mobile nav
  auth.php              ← requireSuperAdmin, isSuperAdmin, logActivity

pages/
  kontak.php            ← PHPMailer integration
```

---

## ✅ Checklist Verifikasi Setelah Deploy

- [ ] Login admin masih bisa
- [ ] Test mobile nav: tap menu parent dengan submenu → submenu terbuka, mobile menu tetap terbuka
- [ ] Tambah menu nav baru → sort_order otomatis
- [ ] Test icon picker di Quick Info → modal muncul, search "buku" → buku icon tampil
- [ ] Test drag-and-drop di halaman Agenda → urut ulang dan refresh → urutan tersimpan
- [ ] Login sebagai admin biasa (role='admin') → sidebar hanya tampilkan Berita + Agenda
- [ ] Buka halaman `/pages/layanan-mahasiswa.php` → 4 tab dengan data seed muncul
- [ ] Buka Activity Log sebagai super admin → log login sebelumnya tercatat
- [ ] Test form kontak → email terkirim (jika SMTP dikonfigurasi) ATAU redirect ke WhatsApp

---

## 🔒 Catatan Keamanan v4

- Semua CRUD super-admin sekarang dilindungi `requireSuperAdmin()`
- `delete.php` (hapus berita) sekarang butuh CSRF token (sebelumnya tidak)
- Endpoint AJAX `/admin/api/reorder.php` butuh CSRF token + whitelist tabel
- Activity log mencatat IP address untuk audit
- SMTP password di settings tidak ter-expose di public

---

**Versi dokumen:** 2026-05-30
