5f615aa7e8
- 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).
88 lines
3.9 KiB
HTML
88 lines
3.9 KiB
HTML
{% extends "base.html" %}
|
||
{% block judul %}Nilai {{ komponen.nama }} — {{ peta.nama }} — Informatika UNTAN{% endblock %}
|
||
{% block isi %}
|
||
<div class="nav-baris">
|
||
<div>MK ini: <a href="/rps/{{ peta.kode }}">RPS</a> · <a href="/nilai/{{ peta.kode }}">Input Nilai</a> · <b>{{ komponen.nama }}</b> · <a href="/portofolio/{{ peta.kode }}">Portofolio</a></div>
|
||
</div>
|
||
|
||
<h1>Isi Nilai — {{ komponen.nama }} <span style="color:var(--grey)">({{ peta.nama }})</span></h1>
|
||
|
||
<p class="keterangan">
|
||
Nilai di sini digabung ke Sub-CPMK yang diukur komponen ini:
|
||
{% for s in komponen.subs %}<b>{{ s }}</b>{{ ', ' if not loop.last }}{% endfor %}
|
||
{% if komponen.bobot %}(bobot komponen {{ komponen.bobot }}%){% endif %}.
|
||
{% if komponen.ulang %}
|
||
Komponen ini <b>boleh diisi berkali-kali</b> (mis. beberapa kali kuis sepanjang
|
||
semester) — nilai tiap sesi dirata-rata otomatis per Sub-CPMK. Bila satu Sub-CPMK
|
||
juga diukur komponen lain, hasil akhirnya dirata tertimbang bobot antar-komponen.
|
||
{% else %}
|
||
Komponen ini <b>hanya satu sesi per semester</b> — menyimpan lagi memperbarui
|
||
(menimpa) sesi yang sudah ada, bukan menambah sesi baru.
|
||
{% endif %}
|
||
Jika mahasiswa perlu nilai berbeda antar Sub-CPMK dalam komponen yang sama
|
||
(mis. UTS dengan beberapa kelompok soal), isi lewat
|
||
<a href="/nilai/{{ peta.kode }}">grid per Sub-CPMK</a> di halaman utama nilai, bukan di sini.
|
||
</p>
|
||
|
||
{% if pesan %}<div class="info">{{ pesan }}</div>{% endif %}
|
||
|
||
{% if komponen.ulang and daftar_sesi %}
|
||
<h2 class="bagian">SESI TERSIMPAN</h2>
|
||
<table class="grid" style="max-width:560px">
|
||
<thead><tr><th>Sesi</th><th class="tengah" style="width:120px">Mahasiswa Terisi</th><th style="width:60px"></th></tr></thead>
|
||
<tbody>
|
||
{% for s in daftar_sesi %}
|
||
<tr{% if loop.index0 == edit_id %} style="background:var(--blue-fill)"{% endif %}>
|
||
<td>{{ s.label }}</td>
|
||
<td class="tengah">{{ (s.nilai or {})|length }}</td>
|
||
<td><a href="/nilai/{{ peta.kode }}/komponen/{{ i }}?sesi_id={{ loop.index0 }}">Edit</a></td>
|
||
</tr>
|
||
{% endfor %}
|
||
</tbody>
|
||
</table>
|
||
{% endif %}
|
||
|
||
<h2 class="bagian">{{ 'EDIT SESI' if edit_id < daftar_sesi|length else 'SESI BARU' }} — {{ label_awal }}</h2>
|
||
<form method="post" action="/nilai/{{ peta.kode }}/komponen/{{ i }}">
|
||
<input type="hidden" name="edit_id" value="{{ edit_id }}">
|
||
{% if komponen.ulang %}
|
||
<label style="display:block;margin-bottom:10px">Nama sesi
|
||
<input type="text" name="label" value="{{ label_awal }}" style="display:block;margin-top:4px;max-width:280px">
|
||
</label>
|
||
{% else %}
|
||
<input type="hidden" name="label" value="{{ label_awal }}">
|
||
{% endif %}
|
||
<div class="gulir" style="max-height:480px;overflow-y:auto">
|
||
<table class="grid">
|
||
<thead>
|
||
<tr>
|
||
<th style="width:44px" class="tengah">No.</th>
|
||
<th style="width:112px">NIM</th>
|
||
<th style="min-width:150px">Nama</th>
|
||
<th class="tengah" style="width:140px">Nilai (0–100)</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
{% for m in grid %}
|
||
<tr>
|
||
<td class="tengah">{{ loop.index }}
|
||
<input type="hidden" name="nim_{{ loop.index0 }}" value="{{ m.nim }}">
|
||
<input type="hidden" name="nama_{{ loop.index0 }}" value="{{ m.nama }}"></td>
|
||
<td>{{ m.nim }}</td>
|
||
<td>{{ m.nama }}</td>
|
||
<td class="isian"><input type="number" name="nilai_{{ loop.index0 }}"
|
||
min="0" max="100" step="0.01"
|
||
value="{{ '%g'|format(m.nilai_awal) if m.nilai_awal is not none else '' }}"></td>
|
||
</tr>
|
||
{% endfor %}
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
<div class="aksi-baris">
|
||
<span style="color:var(--grey);font-size:13px">Disimpan atas nama <b>{{ user.nama }}</b></span>
|
||
<span class="spacer"></span>
|
||
<button class="tombol" type="submit">Simpan Sesi Ini</button>
|
||
</div>
|
||
</form>
|
||
{% endblock %}
|