Rapikan tampilan nilai, ganti NPM->NIM, fitur ganti password, kunci RPS view-only

- Tampilan "Isi Per Komponen Penilaian" diganti dari tombol bertumpuk teks
  jadi tabel (Komponen/Sub-CPMK/Bobot/Status/Aksi) dengan status berupa
  stempel, lebih mudah dipindai.
- Filter pencarian MK (ketik kode/nama) di kotak penugasan dosen /admin.
- Istilah NPM diseragamkan jadi NIM di seluruh aplikasi (label, header,
  template Excel, dokumen portofolio), termasuk migrasi kolom database
  mahasiswa.npm -> nim yang aman (ALTER TABLE RENAME COLUMN, otomatis saat
  startup, tanpa kehilangan data; parser Excel tetap terima file lama
  berheader NPM).
- Fitur ganti password mandiri (/akun): verifikasi password lama, sesi lain
  otomatis keluar setelah berhasil, sesi yang dipakai tetap aktif.
- RPS: dosen RPS+MK kini bisa menyesuaikan redaksi kalimat Sub-CPMK (bagian
  D) untuk MK yang diampu -- kode & kaitan CPMK/CPL tetap dari kurikulum,
  hanya teksnya yang bisa disesuaikan. Penyesuaian otomatis konsisten di
  dropdown mingguan (F), checklist komponen (G), serta unduhan RPS &
  portofolio, tanpa menyentuh data kurikulum induk atau halaman nilai/
  dashboard prodi.
- Form RPS dibungkus <fieldset disabled> untuk dosen tanpa hak edit --
  seluruh field benar-benar terkunci (bukan cuma tombol simpan hilang).
This commit is contained in:
Power BI Dev
2026-07-22 08:37:54 +07:00
parent afb9e72ba2
commit 5f615aa7e8
12 changed files with 199 additions and 87 deletions
+11 -6
View File
@@ -39,13 +39,18 @@
<details style="margin-top:6px">
<summary style="cursor:pointer;color:var(--blue);font-size:13px">Ubah penugasan…</summary>
<form method="post" action="/admin/pengguna/{{ p.id }}/tugas">
<div class="pilih-sub" style="max-height:220px;margin:6px 0">
<input type="text" class="cari-mk" placeholder="Cari kode/nama MK…"
style="width:260px;margin:6px 0 4px;font-size:13px">
<div class="pilih-sub" style="max-height:220px;margin:0 0 6px">
{% for mk in daftar %}
<label><input type="checkbox" name="mk" value="{{ mk.kode }}"
{% if mk.kode in p.mk %}checked{% endif %}> {{ mk.kode }} — {{ mk.nama }}</label>
<input type="text" name="kelas_{{ mk.kode }}" placeholder="kelas (kosong = semua)"
value="{{ p.kelas_map.get(mk.kode, '') }}" style="width:150px;margin:0 0 4px 22px;font-size:12px">
<div class="baris-mk" data-cari="{{ (mk.kode ~ ' ' ~ mk.nama)|lower }}">
<label><input type="checkbox" name="mk" value="{{ mk.kode }}"
{% if mk.kode in p.mk %}checked{% endif %}> {{ mk.kode }} — {{ mk.nama }}</label>
<input type="text" name="kelas_{{ mk.kode }}" placeholder="kelas (kosong = semua)"
value="{{ p.kelas_map.get(mk.kode, '') }}" style="width:150px;margin:0 0 4px 22px;font-size:12px">
</div>
{% endfor %}
<p class="cari-kosong" style="display:none;color:var(--grey);font-size:13px;margin:4px 0">Tidak ada MK yang cocok.</p>
</div>
<button class="tombol garis" type="submit" style="padding:4px 12px;font-size:13px">Simpan Penugasan</button>
</form>
@@ -91,7 +96,7 @@
<h2 class="bagian">C. Daftar Mahasiswa Mengontrak MK — {{ tahun }}</h2>
<p class="keterangan">Unggah satu file Excel berisi seluruh kontrak semester ini
(kolom: NPM, Nama, Kode MK, Kelas — satu baris per kontrak). Impor baru
(kolom: NIM, Nama, Kode MK, Kelas — satu baris per kontrak). Impor baru
<b>menggantikan seluruh daftar</b> tahun ajaran aktif. Daftar ini dipakai untuk
mengisi otomatis template nilai tiap MK.</p>
<div class="aksi-baris" style="border-top:none;padding-top:0;margin-top:8px">