5d7ab16733
- 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>
80 lines
3.8 KiB
HTML
80 lines
3.8 KiB
HTML
{% extends "base.html" %}
|
||
{% block judul %}Rekap Ketercapaian CPL/CPMK — Informatika UNTAN{% endblock %}
|
||
{% block isi %}
|
||
<h1>Rekap Ketercapaian CPL & CPMK — {{ hasil.tahun }}</h1>
|
||
<div class="kpi-baris">
|
||
<div><b>{{ hasil.n_mk_setor }}</b> <span>MK sudah setor nilai</span></div>
|
||
<div><b>{{ hasil.ambang|round(0)|int }}</b> <span>ambang ketercapaian</span></div>
|
||
<div><b>{{ 'SKS' if hasil.metode == 'sks' else 'Bagi rata' }}</b> <span>metode antar-MK</span></div>
|
||
<div><b>{{ cpl_urut|selectattr('tercapai')|list|length }}</b> <span>CPL tercapai</span></div>
|
||
<div><b>{{ cpl_urut|rejectattr('skor', 'none')|rejectattr('tercapai')|list|length }}</b> <span>CPL di bawah ambang</span></div>
|
||
</div>
|
||
|
||
{% if hasil.n_mk_setor == 0 %}
|
||
<div class="peringatan">Belum ada MK yang menyetor nilai — seluruh CPL berstatus "belum terukur". Mulai dari halaman <b>Input Nilai</b> tiap MK di beranda.</div>
|
||
{% endif %}
|
||
|
||
<h2 class="bagian">KETERCAPAIAN CPL</h2>
|
||
<p class="keterangan">Kelengkapan bukti = berapa dari seluruh titik ukur (MK × CPMK pemikul) yang sudah menyetor nilai. Skor dari bukti yang belum lengkap harus dibaca hati-hati.</p>
|
||
<div class="gulir">
|
||
<table class="grid">
|
||
<thead>
|
||
<tr>
|
||
<th style="width:80px">CPL</th><th>Deskripsi</th>
|
||
<th class="tengah" style="width:80px">Skor</th>
|
||
<th class="tengah" style="width:130px">Status</th>
|
||
<th class="tengah" style="width:120px">Kelengkapan Bukti</th>
|
||
<th style="width:210px">Penyumbang Terlemah</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
{% for c in cpl_urut %}
|
||
<tr>
|
||
<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">
|
||
{% if c.skor is none %}<span class="stamp stamp-draft">BELUM TERUKUR</span>
|
||
{% elif c.tercapai %}<span class="stamp stamp-ok">TERCAPAI</span>
|
||
{% else %}<span class="stamp stamp-no">DI BAWAH AMBANG</span>{% endif %}
|
||
</td>
|
||
<td class="tengah">{{ c.n_mk_setor }}/{{ c.n_mk_pemikul }} titik ukur{% if c.ada_agregat %}<br><span style="color:var(--red);font-size:11px">ada bukti agregat</span>{% endif %}</td>
|
||
<td>
|
||
{% if c.mk_terlemah %}
|
||
{{ c.cpmk_terlemah }} — {{ nama_mk.get(c.mk_terlemah[0], c.mk_terlemah[0]) }}
|
||
({{ '%.1f'|format(c.mk_terlemah[1]) }})
|
||
{% else %}—{% endif %}
|
||
</td>
|
||
</tr>
|
||
{% endfor %}
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
|
||
<h2 class="bagian">KETERCAPAIAN CPMK (TINGKAT PRODI)</h2>
|
||
<div class="gulir">
|
||
<table class="grid">
|
||
<thead>
|
||
<tr>
|
||
<th style="width:110px">CPMK</th>
|
||
<th style="width:120px">CPL Didukung</th>
|
||
<th class="tengah" style="width:80px">Skor</th>
|
||
<th class="tengah" style="width:130px">MK Setor / Pemikul</th>
|
||
<th style="width:230px">MK Terlemah</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
{% for c in cpmk_urut %}
|
||
<tr>
|
||
<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>
|
||
</tr>
|
||
{% endfor %}
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
{% endblock %}
|