# UPGRADE v8.0 — Fakultas Sains UNCP

Iterasi ini mengirim **3 fitur baru + 4 fix base** yang Anda minta, dengan pendekatan **defensive coding** sehingga **aman dijalankan bahkan tanpa SQL migration** (degradasi gracefully).

---

## 🎁 Fitur Baru (Yang Anda Minta)

### 1. 🗑️ Soft Delete / Sampah
- Setiap delete (berita, agenda, dosen, lab, dll) **TIDAK** hapus permanen — dipindah ke **Sampah**
- Bisa **Pulihkan** atau **Hapus Permanen** dari menu **Sampah** di sidebar
- Auto-hapus setelah **30 hari**
- Berfungsi jika SQL migration sudah dijalankan, **otomatis fallback ke hard delete** kalau belum

### 2. 🔔 Notification Badge — Pesan Masuk
- Sidebar punya menu **Pesan Masuk** dengan **badge merah pulsing** untuk pesan belum dibaca
- Sentralisasi: Kontak (form publik) + Pengaduan + Saran (kategori lain)
- Detail: status workflow (belum dibaca → ditindaklanjuti → selesai), bulk actions, search, filter
- Counter per kategori di header

### 3. 📱 PWA / Manifest — Installable App
- Website **bisa di-install** di HP (Chrome/Edge/Samsung Internet → "Add to Home Screen")
- Setelah install: muncul icon di home screen, buka full-screen tanpa browser bar
- **3 shortcuts** di app launcher: Berita, Daftar Dosen, Kontak
- Offline support terbatas (halaman yg pernah dikunjungi tetap bisa dibuka offline)

---

## 🛠️ Fix Base (4 issue Anda)

| # | Issue | Status |
|---|-------|--------|
| 1 | Sort order tidak otomatis (6 admin form) | ✅ Auto MAX+1, hidden saat tambah, editable saat edit |
| 2 | Mobile nav popup tidak stabil | ✅ `<button>` instead of `<a>`, touch-action, 44px tap target |
| 3a | `admin/profile.php` no auth + no CSRF | ✅ requireAdmin + CSRF + password strength meter |
| 3b | `admin/index.php` no auth check | ✅ requireAdmin di paling atas |
| 4 | 2 file orphan (`news_content.php`, `manage-admin-content.php`) | ✅ Dihapus |

---

## 🚀 Cara Deploy (PENTING — Urutan!)

### 1. Backup DB dulu
```bash
mysqldump -u root fsains_uncp > backup_sebelum_v8.sql
```

### 2. Replace file PHP
Extract `fakultas_sains_v8_patch.zip` → copy file ke installation Anda. **15 file akan ditimpa, 2 file baru.**

### 3. **JALANKAN SQL** (paling penting!)
phpMyAdmin → DB `fsains_uncp` → tab **SQL** → paste isi `database_upgrade_v8.sql` → **Go**

Output sukses:
```
✅ Upgrade v8.0 selesai!
Soft delete diaktifkan di 9 tabel, tabel pesan dibuat, 5 settings ditambah.
```

### 4. Hard refresh browser
**Ctrl + Shift + R** di Chrome / Edge / Firefox.

### 5. Test
- Login admin → cek sidebar ada menu **Pesan Masuk** dan **Sampah**
- Hapus 1 berita → muncul di **Sampah** (bukan hilang permanen)
- Buka website di HP Chrome → tunggu prompt **"Install Fakultas Sains UNCP"**
- Form kontak publik → submit → muncul di admin **Pesan Masuk**
- Tap menu dropdown di mobile → stabil, tidak salah-navigasi

---

## 🛡️ Defensive Coding — Pelajaran dari Kegagalan Sebelumnya

Sebelumnya, code v6/v7 saya crash kalau SQL belum dijalankan. Sekarang:

**1. softDelete helper:** UPDATE kalau kolom ada, DELETE kalau tidak. Tidak akan crash.
```php
function softDelete($conn, $table, $id) {
    if (softDeleteEnabled($conn, $table)) {
        // soft delete
    } else {
        // hard delete (fallback)
    }
}
```

**2. softDeleteFilter:** Return `" AND deleted_at IS NULL"` kalau kolom ada, **return string kosong** kalau tidak.
```php
$q = "SELECT * FROM news WHERE 1 " . softDeleteFilter($conn, 'news') . " ORDER BY ...";
// Kalau kolom belum ada: "SELECT * FROM news WHERE 1  ORDER BY ..." → tetap valid SQL
```

**3. Menu Sampah & Pesan di sidebar:** Hanya muncul kalau tabel/kolom sudah ada. Tidak akan tampil tombol broken.

**4. Form kontak submit:** Pakai `@$conn->prepare(...)` — kalau tabel pesan belum ada, skip silently, tetap kirim email.

**Hasilnya: Kalau Anda lupa jalankan SQL migration, website TIDAK CRASH. Hanya fitur baru yang non-aktif.**

---

## 📦 File yang Berubah (16 file PHP + 3 file baru)

### Yang Diubah (13)
```
admin/agenda.php                       (sort_order + softDeleteFilter)
admin/dosen-delete.php                 (softDelete adapter, preserve files saat soft)
admin/hero-slides.php                  (sort_order + softDelete + filter)
admin/index.php                        (requireAdmin)
admin/laboratorium.php                 (sort_order + softDeleteFilter + softDelete inline)
admin/layanan-mahasiswa.php            (sort_order + softDeleteFilter + softDelete inline)
admin/news-management.php              (softDeleteFilter)
admin/pimpinan.php                     (sort_order + softDeleteFilter + softDelete inline preserve foto)
admin/profile.php                      (auth + CSRF + password meter — REWRITE)
admin/quick-info.php                   (sort_order + softDeleteFilter + softDelete inline)
admin/quick-services.php               (softDeleteFilter)
admin/delete.php                       (softDelete adapter)
admin/delete-quick.php                 (softDelete adapter)
admin/includes/admin_layout.php        (sidebar: Pesan + Sampah + notif badge)
includes/auth.php                      (auto-load functions.php)
includes/functions.php                 (+3 helper softDelete)
includes/header.php                    (mobile nav button + PWA registration)
pages/kontak.php                       (insert ke tabel pesan)
```

### Baru (4)
```
admin/trash.php                        (UI sampah dengan restore + bulk)
admin/pesan.php                        (inbox dengan workflow + bulk actions)
manifest.php                           (PWA manifest dinamis dari settings)
sw.js                                  (Service Worker untuk offline support)
```

### Dihapus (2)
```
admin/news_content.php                 (orphan, tidak di-reference)
admin/manage-admin-content.php         (orphan, tidak di-reference)
```

### SQL Migration (1)
```
database_upgrade_v8.sql                (idempotent: deleted_at + pesan table + settings)
```

---

## 🐛 Kalau Ada Masalah Setelah Deploy

### Halaman publik blank / partial?
1. Cek browser console (F12) untuk error
2. Cek error log XAMPP/Laragon: `xampp/php/logs/php_error_log`
3. Pastikan SQL migration sudah dijalankan
4. Hard refresh: **Ctrl + Shift + R**

### Menu Sampah / Pesan tidak muncul?
Berarti SQL belum jalan. Buka phpMyAdmin → DB `fsains_uncp` → jalankan `database_upgrade_v8.sql`. Refresh admin page.

### PWA tidak prompt install?
- Chrome perlu kunjungan 1-2x sebelum prompt
- iOS Safari TIDAK prompt otomatis — user manual: Share → Add to Home Screen
- Cek `Settings` → `pwa_enabled` = `1`

### Mobile dropdown masih tidak stabil?
- Hard refresh untuk force load `header.php` baru
- Cek apakah Anda lihat tag `<button class="dropdown-toggle">` di HTML source (bukan `<a class="dropdown-toggle">`)
- Kalau masih `<a>`, file `includes/header.php` belum ter-update

### Foto/CV dosen hilang setelah soft delete?
**Tidak akan hilang** — soft delete preserve files. Restore via menu Sampah akan kembali utuh.

---

## 🎯 Apa yang TIDAK Ada di v8 (Tidak Saya Tambah)

Saya disiplin tidak push fitur ekstra:

- ❌ Theme switcher (warna custom) — versi 5.1 sudah cukup
- ❌ Reading time + progress bar — bisa diatasi v9 kalau diminta
- ❌ Bulk actions berita — bisa replicate pattern dari pesan.php nanti
- ❌ Auto-save draft TinyMCE — defer
- ❌ Onboarding tour — defer
- ❌ Pengaduan/Saran public form — defer (admin inbox sudah support kategori, tinggal buat form-nya)
- ❌ 2FA email OTP — defer
- ❌ Media Library — defer

Kalau Anda mau salah satu di atas di v9, bilang aja — saya kerjakan satu per satu dengan urutan: Anda deploy + test → saya lanjut yang berikutnya.

---

**Versi:** v8.0 "Stable + Soft Delete + Inbox + PWA"
**Tanggal:** 2026-06-01
**Compatibility:** Apply atas baseline v5.1 (yang Anda upload terakhir)
**Status:** Production-ready dengan defensive coding
