Gabungkan aplikasi RPS & Portofolio OBE (dashboard jadi bagian aplikasi)

Dashboard pemetaan statis kini dilayani aplikasi di /dashboard
(app/static/dashboard.html). Fitur lengkap Tahap 1-4 + dasbor monitoring,
menu global, filter semester, input nilai langsung, penggabungan nilai
team teaching, tabel bisa urut. Dockerfile berubah dari nginx statis ke
uvicorn/FastAPI: healthcheck, proxy-headers, volume /data (SQLite).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Power BI Dev
2026-07-18 12:05:28 +07:00
parent 3405dc21ff
commit 9be6bd03e3
42 changed files with 11366 additions and 53 deletions
+39
View File
@@ -0,0 +1,39 @@
{% extends "base.html" %}
{% block judul %}{{ 'Penyiapan Awal' if mode == 'setup' else 'Masuk' }} — RPS &amp; Portofolio UNTAN{% endblock %}
{% block isi %}
<div class="login-kotak">
{% if mode == 'setup' %}
<h1>Penyiapan Awal</h1>
<p class="keterangan" style="text-align:center">Belum ada akun. Buat akun
<b>Ketua Program Studi</b> terlebih dahulu — akun ini yang nanti membuat
akun para dosen.</p>
{% else %}
<h1>Masuk</h1>
<p class="keterangan" style="text-align:center">Halaman ini memuat data nilai
mahasiswa — akses memerlukan akun. Hubungi kaprodi bila belum punya.</p>
{% endif %}
{% if pesan %}<div class="peringatan">{{ pesan }}</div>{% endif %}
<form method="post" action="{{ '/setup' if mode == 'setup' else '/login' }}">
{% if mode == 'setup' %}
<label for="nama">Nama lengkap (dengan gelar)</label>
<input type="text" id="nama" name="nama" required autofocus>
<label for="nip">NIP</label>
<input type="text" id="nip" name="nip" autocomplete="username" required>
<p class="keterangan">NIP menjadi username sekaligus password awal.</p>
{% else %}
<label for="nip">NIP</label>
<input type="text" id="nip" name="nip" autocomplete="username" required autofocus>
<label for="password">Password <span style="color:var(--grey);font-weight:normal">(awal: NIP Anda)</span></label>
<input type="password" id="password" name="password"
autocomplete="current-password" required>
{% endif %}
<div class="aksi-baris" style="border-top:none;padding-top:6px">
<button class="tombol" type="submit" style="width:100%">
{{ 'Buat Akun Kaprodi & Masuk' if mode == 'setup' else 'Masuk' }}
</button>
</div>
</form>
</div>
{% endblock %}