Tambah Analisis Proses Asesmen, Kelompok Capaian, riwayat nilai terstruktur, dan perbaikan bug CPL

- Portofolio: section "Analisis Proses Asesmen" (dropdown tertutup default) —
  distribusi huruf mutu, kelompok capaian (mean ± SD), Sub-CPMK terlemah/terkuat,
  kesenjangan rencana vs realisasi, mahasiswa berisiko, tren lintas tahun ajaran
- Portofolio: Nomor Dokumen & Tanggal Terbit terisi otomatis; placeholder contoh
  di Realisasi Pembelajaran dan Kendala & Tindak Lanjut; tombol "Isi Otomatis"
  merangkai draf Simpulan dari analisis + realisasi + kendala
- Nilai: tabel Kelompok Capaian (Atas/Tengah/Bawah, shading warna) dipindah ke
  dropdown "Detail Tambahan" bersama Skala Poin/Rincian Bobot/Hasil Ketercapaian;
  tabel utama tak lagi ada scroll vertikal internal
- Nilai: riwayat pengisian dicatat terstruktur (waktu, dosen, aksi, komponen),
  tanpa batas 8 entri, dengan ringkasan per komponen + dropdown Log Lengkap —
  mendukung akuntabilitas team teaching
- Fix bug data: seed kurikulum menyimpan 'cpl' CPMK sebagai string tunggal,
  bukan list, sehingga pecah per huruf saat di-join() di tabel Hasil
  Ketercapaian/Rekap (mis. "CPL-03" -> "C, P, L, -, 0, 3"); dinormalisasi di
  db.py (runtime) dan tools/extract_seed.py (agar re-seed berikutnya benar)
- Hover tooltip deskripsi lengkap di kode Sub-CPMK/CPMK/CPL (halaman Nilai
  dan Rekap CPL/CPMK)

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Power BI Dev
2026-08-08 00:09:57 +07:00
parent af369883f3
commit 5d7ab16733
8 changed files with 491 additions and 37 deletions
+3 -3
View File
@@ -30,7 +30,7 @@
<tbody>
{% for c in cpl_urut %}
<tr>
<td class="tengah"><b>{{ c.kode }}</b></td>
<td class="tengah"><b class="kode-hover" title="{{ c.desk }}">{{ c.kode }}</b></td>
<td>{{ c.desk[:130] }}{% if c.desk|length > 130 %}…{% endif %}</td>
<td class="tengah">{% if c.skor is not none %}<b>{{ '%.2f'|format(c.skor) }}</b>{% else %}—{% endif %}</td>
<td class="tengah">
@@ -66,8 +66,8 @@
<tbody>
{% for c in cpmk_urut %}
<tr>
<td class="tengah">{{ c.kode }}</td>
<td class="tengah">{{ c.cpl|join(', ') }}</td>
<td class="tengah"><span class="kode-hover" title="{{ desk_cpmk.get(c.kode, '') }}">{{ c.kode }}</span></td>
<td class="tengah">{% for cp in c.cpl %}<span class="kode-hover" title="{{ desk_cpl.get(cp, '') }}">{{ cp }}</span>{{ ', ' if not loop.last }}{% endfor %}</td>
<td class="tengah">{% if c.skor is not none %}<b>{{ '%.2f'|format(c.skor) }}</b>{% else %}—{% endif %}</td>
<td class="tengah">{{ c.n_setor }}/{{ c.n_pemikul }}</td>
<td>{% if c.mk_terlemah %}{{ nama_mk.get(c.mk_terlemah[0], c.mk_terlemah[0]) }} ({{ '%.1f'|format(c.mk_terlemah[1]) }}){% else %}—{% endif %}</td>