# 🏫 E-Sekolah Admin System — Single Page Application (SPA)

Sistem Informasi Manajemen Sekolah berbasis web dengan arsitektur **Single Page Application (SPA)** menggunakan framework **CodeIgniter 4** di sisi backend dan interaksi dynamic dynamic renderer berbasis **Vanilla JavaScript Fetch API** di sisi frontend. Sistem ini dirancang untuk meminimalkan *page reload*, menghemat bandwidth server, serta memberikan pengalaman pengguna yang instan dan responsif.

---

## 🚀 Fitur Utama Sistem

### 1. 🔐 Autentikasi & Hak Akses (RBAC)
*   **Secure Authentication**: Proteksi total menggunakan Filter Auth CodeIgniter 4 pada jalur rute internal[cite: 1].
*   **Role Based Access Control**: Pembatasan menu navigasi sidebar dan hak eksekusi API backend berdasarkan peran pengguna (`Administrator`, `Admin`, `Guru`, `Staf`, `User`)[cite: 2, 5, 6].

### 2. 📊 Modul Akademik & Data Master
*   **Data Siswa & Kelas**: Pengelolaan data siswa lengkap dengan fitur cek NISN, pratinjau, serta import/export massal via Excel[cite: 1].
*   **Plotting Rombel Kelas**: Sistem plotting pembagian kelas siswa per tahun ajaran aktif secara dinamis lewat AJAX[cite: 1].
*   **Manajemen SDM**: Master data guru dan staf sekolah terintegrasi[cite: 1, 2].

### 3. 📁 Modul Gudang Berkas Dokumen (Hybrid Storage)
*   **Dual-Input Format**: Pengguna dapat memilih metode pengisian berkas secara fleksibel:
    *   *Link Google Drive*: Menghemat ruang penyimpanan (*storage*) server lokal dengan memanfaatkan cloud Drive.
    *   *Upload File Langsung*: File fisik diunggah langsung ke server lokal dan disimpan di folder `public/uploads/dokumen/`.
*   **Ownership Protection**: Guru dan Staf bisa mengunggah berkas secara mandiri, namun hak mengubah (*update*) dan menghapus (*delete*) dikunci hanya untuk pemilik asli berkas tersebut atau akun Administrator Utama.
*   **Master Kategori Berkas**: Manajemen pengelompokan jenis dokumen (misal: Silabus, RPP, Arsip Surat) khusus untuk level Admin dan Administrator.

### 4. 📰 Modul Publikasi Konten (Berita Sekolah)
*   **Alur Redaksi Ketat**: Setiap berita baru yang ditulis oleh staf/guru otomatis berstatus **Draft**[cite: 5, 6].
*   **Moderasi Editor**: Dilengkapi dengan **Modal Review Statis** di tabel utama[cite: 4]. Admin/Editor dapat mengoreksi isi teks berita menggunakan CKEditor terintegrasi lalu menerbitkannya ke publik (**Publish**) atau menurunkannya kembali[cite: 4, 6].
*   **Jurnalistik Dateline**: Fitur pengisian otomatis keterangan tempat dan sumber media tebal (seperti `E-Sekolah, Makassar -`) di awal paragraf CKEditor saat menulis berita baru[cite: 5].

### 5. ✍️ Modul Gagasan & Opini (Artikel Sekolah)
*   **Alur Kerja Mandiri (Dual-Action Mode)**: Berbeda dengan berita, penulis artikel diberikan kebebasan penuh untuk langsung menerbitkan tulisannya tanpa lewat sensor meja editor.
*   **Dual Button Form Edit**: Pada form edit artikel disediakan dua tombol aksi strategis:
    *   *Simpan Sebagai Draft*: Menyimpan perubahan secara internal tanpa mempublikasikannya (Status `Draft`, `tanggal_publish` bernilai `NULL`).
    *   *Terbitkan Artikel (Publish)*: Menyimpan perubahan sekaligus langsung menayangkannya ke portal publik serta mencatat waktu `tanggal_publish` secara real-time.

---

## 🛠️ Arsitektur Jalur SPA & API Rute (`Routes.php`)

Sistem navigasi SPA ini memisahkan rute menjadi 3 bagian inti di dalam grup filter login[cite: 1]:
1.  **SPA Wrapper (URL Browser)**: Mengarahkan semua klik menu sidebar ke `DashboardController::index` sebagai *layout container base* utama aplikasi[cite: 1].
2.  **SPA Renderer (Partial Views)**: Mengembalikan potongan HTML murni dari masing-masing controller (tanpa me-load layout sidebar/navbar lagi) untuk disuntikkan ke container utama lewat JavaScript[cite: 1].
3.  **API / AJAX Routes (JSON CRUD)**: Grup rute khusus untuk melayani proses pengiriman data (*Store, Update, Delete*) menggunakan format respons JSON[cite: 1].

Struktur ringkas penulisan rute pada `app/Config/Routes.php`[cite: 1]:
```php
$routes->group('', ['filter' => 'auth'], function ($routes) {
    // 1. SPA Wrapper
    $routes->get('berkas', 'DashboardController::index');
    $routes->get('artikel', 'DashboardController::index');

    // 2. SPA Renderer (Partial HTML)
    $routes->get('render/berkas', 'BerkasController::index');
    $routes->get('render/artikel', 'ArtikelController::index');

    // 3. API JSON Data
    $routes->group('api/berkas', function ($routes) {
        $routes->get('list-berkas', 'BerkasController::listBerkas');
        $routes->post('store', 'BerkasController::store');
    });
});


proyek-anda/
└── public/
    └── uploads/
        ├── img/       (Tempat logo sekolah & foto profil)[cite: 2]
        ├── berita/    (Tempat gambar sampul berita)[cite: 4, 6]
        ├── artikel/   (Tempat gambar sampul artikel & opini)
        └── dokumen/   (Tempat penyimpanan file fisik dokumen lokal)