Files
OBE-Mapping/app/templates/form_nilai_komponen.html
T
Power BI Dev 5f615aa7e8 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).
2026-07-22 08:37:54 +07:00

88 lines
3.9 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{% 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 (0100)</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 %}