Commit Graph
14 Commits
Author SHA1 Message Date
Novy San87 d0d1dd74c2 Poles Kalender Pelanggaran di dashboard premium
- Header: icon chip gradient + badge statistik 'X pelanggaran' bulan berjalan
- Tombol 'Hari Ini' (kembali ke bulan sekarang) + navigasi prev/next di
  pill glass, hover efek
- Sel tanggal: lebih tinggi, hari ini = gradient biru + ring + label 'Hari Ini',
  hover lift; tanggal luar bulan lebih redup
- Badge jumlah: gradient + glow shadow senada (biru/oranye/merah), hover scale
- Legend jadi pill gradient + teks '1/2/3+ pelanggaran', footer interaktif
- JS: method currentMonth() + computed monthTotal
2026-08-03 17:51:41 +07:00
Novy San87 ffebf61322 Toggle Ambang SP: switch ala iOS dengan glow warna level
- Ukuran standar iOS (w-11 h-6, knob 20px) — konsisten dgn toggle halaman lain
- Knob bergeser penuh dengan transisi halus; track gradient warna level + glow
  saat aktif, slate + inset shadow saat nonaktif
- Reaktif via Alpine (x-model) — track & glow berubah langsung saat di-toggle
2026-08-03 17:44:17 +07:00
Novy San87 652422c3eb Poles UI/UX modul Ambang SP premium
- Kartu threshold: strip gradient warna di atas, icon chip gradient, badge
  poin (≥ X poin), label Nonaktif, toggle & hapus di kanan, hover lift
- Field: label uppercase tracking, suffix 'poin' di input Min Poin
- Modal tambah: header gradient biru-indigo, color picker + 8 preset swatch
  interaktif (Alpine), preview warna terpilih
- Info card jadi 'Tangga SP' dinamis mengikuti data threshold asli (bukan
  hardcoded), lengkap status nonaktif
- Empty state & tombol simpan pakai sistem btn-primary
- 2 smoke test baru render halaman (31 test total)
2026-08-03 17:38:48 +07:00
Novy San87 151a66639b Poles UI/UX premium: fondasi global
- Font Plus Jakarta Sans (Google Fonts) menggantikan font sistem default
- Sidebar: brand area gradient + nama sekolah, nav aktif jadi pill gradient
  biru-indigo + chevron, label grup lebih elegan, footer badge NOCTKJ.net
- Topbar: sticky + backdrop-blur glass
- Background utama: gradient halus slate → biru samar
- Kartu standar premium (.card) + tombol (.btn-primary/.btn-outline) + input
  seragam di CSS; kartu utama halaman diseragamkan rounded-2xl
- Border global diselaraskan ke palet slate; scrollbar & seleksi teks premium
- Verifikasi: 29 test / 99 assertion, blade cache OK, vite build OK
2026-08-03 14:27:03 +07:00
Novy San87 279ef07ae2 Sederhanakan ambang SP: hapus kolom max_points
- max_points tidak pernah dipakai logika penerbitan SP (trigger hanya baca
  min_points: level dgn ambang tertinggi <= total poin siswa)
- Migrasi drop kolom; model, MasterDataController, ResetController (seeder)
  dibersihkan; form Ambang SP & form tambah cukup satu angka (Min Poin)
- Dashboard Ambang SP: batas atas level dihitung dari min_points level
  berikutnya (level terakhir = tak terbatas), urutan dijamin orderBy min_points
- Test: 29 passed / 99 assertion
2026-08-03 14:22:44 +07:00
Novy San87 e815bd28d5 Admin dikecualikan dari aturan 1 akun 1 sesi
- LoginController: admin tidak ditolak saat login kedua (multi-sesi boleh)
- Middleware SingleSession: admin tidak ditendang walau sesi ≠ token aktif
- Alasan: admin terkunci = tidak ada yang bisa Paksa Logout akun lain
- 2 test baru (login kedua admin diterima; middleware tidak menendang admin)
2026-08-03 14:13:09 +07:00
Novy San87 8e625f86e0 Sesi login: lifetime 5 menit + sesi kadaluarsa dianggap mati
- SESSION_LIFETIME=5 di .env (sebelumnya 120 menit idle)
- User::sessionTokenIsAlive() kini cek umur sesi (file mtime / DB last_activity)
  vs masa hidup, bukan sekadar ada/tidaknya file — user yang sesinya habis
  langsung bisa login lagi tanpa nunggu GC atau Paksa Logout
- 2 test baru (sesi kadaluarsa → boleh login; sesi fresh → tetap terkunci)
2026-08-03 14:11:00 +07:00
Novy San87 58ffd06625 fix: presensi - filter tanggal-kelas live, urutan tanggal di depan, pembersihan data yatim 2026-08-02 20:57:14 +07:00
Novy San87 6e256661dd feat: Face ID (scan, register, liveness) + role baru KS/Waka/Ketua Tim + notifikasi WA ortu + scoping wali kelas + error pages premium 2026-08-02 20:57:11 +07:00
Novy San87 0a5f471854 fix: default presensi 'belum', perbesar tombol rekap & bulk H/S/I/A/T
- Default status per jam dari 'hadir' jadi 'belum' (abu-abu '—')
- Tambah validasi skip 'belum' saat simpan
- Tombol bulk H/S/I/A/T diperbesar (w-8 h-8, border-2)
- Tombol Rekap Presensi diubah ke gradien violet-indigo
- Gradien tombol Lanjutkan & Simpan konsisten
2026-07-28 12:37:43 +07:00
Novy San87 fb5e349ae6 feat: add Open Graph meta tags for social preview 2026-07-23 11:59:12 +07:00
Novy San87 9e1b5c34e5 feat: rekap presensi harian, mingguan, bulanan + export excel
- Add 3 jenis rekap presensi (harian/mingguan/bulanan) per kelas
- Weekly recap: tabel H,S,I,A per hari + kolom TOTAL
- Alpha proporsional: A = jam_alpha / total_jam
- Pemisah border antar hari dan kolom TOTAL
- Export Excel rekap mingguan (.xlsx)
- Fix max_input_vars PHP limit (1000→5000)
- Fix Carbon date object issue di groupBy
2026-07-23 11:11:28 +07:00
Novy San87 9c741f13f7 feat: dynamic role-based permission system
- Add permissions & role_permissions tables with migration
- Add PermissionMiddleware for route-level access control
- Add CheckRole middleware for role-based fallback
- Add PermissionController with UI (Settings > Hak Akses Role)
- Add @canPermission Blade directive for view-level checks
- Convert all routes to use dynamic permission middleware
- Add canPermission() method to User model
- All access rights configurable via admin UI
2026-07-23 06:49:28 +07:00
Novy San87 23f124e8d5 feat: realtime notifications, fix broadcasting, add notifications page
- Fix: broadcasting.php config (was missing, broadcast failed)
- Fix: Echo class global scope (window.EchoClass)
- Fix: Nginx WebSocket proxy for Reverb
- Fix: Firewall port 8087 opened
- Fix: Duplicate event listener cleanup
- Fix: Mark as read functionality
- Add: CreateViolationNotification listener
- Add: Notifications index page with pagination
- Add: Timezone Asia/Jakarta support
- Add: Real-time badge across all pages
- Remove: toOthers() so recorder also gets notification
- Update: .env.example with new variables
2026-07-22 08:35:10 +07:00