Files
UAS-SIG/ui/petugas_login.html
T
2026-06-03 20:05:50 +07:00

93 lines
4.5 KiB
HTML

<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Login Petugas Lapangan - Dinsos Pontianak</title>
<script src="https://cdn.tailwindcss.com"></script>
<link href="https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;600&display=swap" rel="stylesheet">
<style>body { font-family: 'Poppins', sans-serif; }</style>
</head>
<body class="bg-emerald-50 flex items-center justify-center h-screen p-4">
<div class="bg-white p-8 rounded-3xl shadow-xl w-full max-w-sm border border-emerald-100">
<h2 class="text-2xl font-bold text-gray-800 mb-2">Halo, Petugas!</h2>
<p class="text-gray-500 text-sm mb-8">Silakan masuk untuk mulai melakukan survei lapangan hari ini.</p>
<div class="space-y-4">
<div>
<input type="text" id="input_username" placeholder="Username Petugas" class="w-full p-4 rounded-xl border bg-gray-50 outline-none focus:ring-2 focus:ring-emerald-500 transition-all text-gray-800 text-sm">
</div>
<div>
<input type="password" id="input_password" placeholder="Kata Sandi" class="w-full p-4 rounded-xl border bg-gray-50 outline-none focus:ring-2 focus:ring-emerald-500 transition-all text-gray-800 text-sm">
</div>
<p id="pesan_error" class="text-red-500 text-xs font-semibold px-1 hidden"></p>
<button onclick="eksekusi_login_petugas()" id="btn_submit_login" class="w-full bg-emerald-600 text-white font-bold py-4 rounded-xl hover:bg-emerald-700 transition shadow-md">Masuk ke Survei</button>
</div>
</div>
<script>
// Mengirimkan data otentikasi menuju API backend server
async function eksekusi_login_petugas() {
const username_val = document.getElementById('input_username').value;
const password_val = document.getElementById('input_password').value;
const wadah_error = document.getElementById('pesan_error');
const tombol_login = document.getElementById('btn_submit_login');
// Validasi masukan dasar pada sisi klien sebelum memicu lalu lintas jaringan
if (!username_val || !password_val) {
wadah_error.textContent = 'Kolom username dan kata sandi tidak boleh kosong.';
wadah_error.classList.remove('hidden');
return;
}
wadah_error.classList.add('hidden');
tombol_login.disabled = true;
tombol_login.textContent = 'Memverifikasi...';
try {
/* Baris Kompleks: Melakukan transmisi payload data sensitif terenkripsi via jaringan menggunakan HTTP POST
menuju peladen port 3000, serta menyimpan string token autentikasi ke media penyimpanan lokal peramban
(localStorage) jika validasi kredensial dinyatakan sah oleh server database. */
const http_response = await fetch('http://localhost:3000/api/auth/login-petugas', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
username: username_val,
password: password_val
})
});
const json_result = await http_response.json();
if (!http_response.ok) {
throw new Error(json_result.error || 'Gagal masuk ke dalam sistem.');
}
// Menyimpan identitas sesi token ke memori peramban web klien
localStorage.setItem('token_petugas', json_result.token);
// Mengalihkan fokus antarmuka menuju halaman dasbor manajemen tugas lapangan
window.location.href = 'petugas_dasbor.html';
} catch (error_sistem) {
wadah_error.textContent = error_sistem.message;
wadah_error.classList.remove('hidden');
} finally {
tombol_login.disabled = false;
tombol_login.textContent = 'Masuk ke Survei';
}
}
// Mendukung eksekusi tombol enter saat berada di kolom input kata sandi
document.getElementById('input_password').addEventListener('keypress', function(e) {
if (e.key === 'Enter') {
eksekusi_login_petugas();
}
});
</script>
</body>
</html>