MIF_E31230302/resources/views/admin/profile/index.blade.php

202 lines
10 KiB
PHP

@extends('layouts.admin')
@section('title', 'Pengaturan Profil Admin')
@section('content')
<div class="container-fluid">
<!-- Header Halaman -->
<div class="d-flex align-items-center justify-content-between mb-4">
<div>
<h4 class="fw-bold mb-1"><i class="fas fa-id-card text-primary me-2"></i>Pengaturan Profil</h4>
<p class="text-muted small mb-0">Kelola informasi akun dan kata sandi Anda.</p>
</div>
<a href="{{ route('admin.dashboard') }}" class="btn btn-outline-secondary rounded-3 px-3">
<i class="fas fa-arrow-left me-1"></i> Kembali ke Dashboard
</a>
</div>
@if (session('status') === 'profile-updated')
<div class="alert alert-success alert-dismissible fade show rounded-3 border-0 shadow-sm mb-4" role="alert">
<i class="fas fa-check-circle me-1"></i> Profil berhasil diperbarui!
<button type="button" class="btn-close" data-bs-dismiss="alert"></button>
</div>
@endif
@if (session('status') === 'password-updated')
<div class="alert alert-success alert-dismissible fade show rounded-3 border-0 shadow-sm mb-4" role="alert">
<i class="fas fa-check-circle me-1"></i> Kata sandi berhasil diubah!
<button type="button" class="btn-close" data-bs-dismiss="alert"></button>
</div>
@endif
<div class="row g-4">
<!-- Kolom Kiri: Form Ubah Nama & Email -->
<div class="col-lg-7">
<div class="card border-0 shadow-sm rounded-4 mb-4">
<div class="card-body p-4">
<h5 class="fw-bold mb-1"><i class="fas fa-user-edit text-primary me-2"></i>Informasi Akun</h5>
<p class="text-muted small mb-4">Ubah nama dan email Anda di sini.</p>
<form action="{{ route('profile.update') }}" method="POST">
@csrf
@method('PATCH')
<div class="mb-3">
<label class="form-label fw-semibold">Nama Lengkap</label>
<input type="text" name="name" class="form-control rounded-3 @error('name') is-invalid @enderror" value="{{ old('name', auth()->user()->name) }}" required>
@error('name')
<div class="invalid-feedback">{{ $message }}</div>
@enderror
</div>
<div class="mb-4">
<label class="form-label fw-semibold">Alamat Email</label>
<input type="email" name="email" class="form-control rounded-3 @error('email') is-invalid @enderror" value="{{ old('email', auth()->user()->email) }}" required>
@error('email')
<div class="invalid-feedback">{{ $message }}</div>
@enderror
</div>
<div class="text-end">
<button type="submit" class="btn btn-primary rounded-3 px-4">
<i class="fas fa-save me-1"></i> Simpan Profil
</button>
</div>
</form>
</div>
</div>
<!-- Form Ganti Password -->
<div class="card border-0 shadow-sm rounded-4">
<div class="card-body p-4">
<h5 class="fw-bold mb-1"><i class="fas fa-key text-warning me-2"></i>Ganti Kata Sandi</h5>
<p class="text-muted small mb-4">Gunakan kata sandi yang aman demi keamanan akun.</p>
<form action="{{ route('profile.password.update') }}" method="POST">
@csrf
@method('PUT')
<!-- Kata Sandi Saat Ini -->
<div class="mb-3">
<label class="form-label fw-semibold">Kata Sandi Saat Ini</label>
<div class="input-group">
<input type="password" name="current_password" id="current_password" class="form-control rounded-start-3 @error('current_password') is-invalid @enderror" required>
<button class="btn btn-outline-secondary rounded-end-3" type="button" onclick="togglePasswordVisibility('current_password', 'icon_current_password')">
<i class="fas fa-eye" id="icon_current_password"></i>
</button>
@error('current_password')
<div class="invalid-feedback d-block">{{ $message }}</div>
@enderror
</div>
</div>
<!-- Kata Sandi Baru -->
<div class="mb-2">
<label class="form-label fw-semibold">Kata Sandi Baru</label>
<div class="input-group">
<input type="password" name="password" id="new_password" class="form-control rounded-start-3 @error('password') is-invalid @enderror" onkeyup="checkPasswordStrength(this.value)" required>
<button class="btn btn-outline-secondary rounded-end-3" type="button" onclick="togglePasswordVisibility('new_password', 'icon_new_password')">
<i class="fas fa-eye" id="icon_new_password"></i>
</button>
@error('password')
<div class="invalid-feedback d-block">{{ $message }}</div>
@enderror
</div>
</div>
<!-- Checklist Syarat Kata Sandi Kuat -->
<div class="p-3 bg-light rounded-3 mb-3 border">
<p class="fw-semibold small text-muted mb-2">Syarat Kata Sandi Kuat:</p>
<div class="row g-2 small">
<div class="col-6" id="req-length"><i class="fas fa-times-circle text-danger me-1"></i> Minimal 8 Karakter</div>
<div class="col-6" id="req-uppercase"><i class="fas fa-times-circle text-danger me-1"></i> Huruf Besar (A-Z)</div>
<div class="col-6" id="req-number"><i class="fas fa-times-circle text-danger me-1"></i> Mengandung Angka (0-9)</div>
<div class="col-6" id="req-symbol"><i class="fas fa-times-circle text-danger me-1"></i> Simbol (@$!%*?&)</div>
</div>
</div>
<!-- Konfirmasi Kata Sandi Baru -->
<div class="mb-4">
<label class="form-label fw-semibold">Konfirmasi Kata Sandi Baru</label>
<div class="input-group">
<input type="password" name="password_confirmation" id="password_confirmation" class="form-control rounded-start-3" required>
<button class="btn btn-outline-secondary rounded-end-3" type="button" onclick="togglePasswordVisibility('password_confirmation', 'icon_password_confirmation')">
<i class="fas fa-eye" id="icon_password_confirmation"></i>
</button>
</div>
</div>
<div class="text-end">
<button type="submit" class="btn btn-warning text-white rounded-3 px-4">
<i class="fas fa-lock me-1"></i> Ubah Kata Sandi
</button>
</div>
</form>
</div>
</div>
</div>
<!-- Kolom Kanan: Card Ringkasan Profil -->
<div class="col-lg-5">
<div class="card border-0 shadow-sm rounded-4 text-center p-4">
<div class="card-body">
<div class="bg-primary-subtle text-primary rounded-circle d-inline-flex align-items-center justify-content-center mb-3" style="width: 80px; height: 80px;">
<i class="fas fa-user-circle fs-1"></i>
</div>
<h5 class="fw-bold mb-1">{{ auth()->user()->name }}</h5>
<p class="text-muted small mb-3">{{ auth()->user()->email }}</p>
<span class="badge bg-primary px-3 py-2 rounded-pill fs-6 fw-semibold mb-4">
<i class="fas fa-shield-alt me-1"></i> ADMIN / GURU BK
</span>
<hr class="my-3">
<div class="text-start text-muted small">
<p class="mb-1"><i class="fas fa-calendar-alt me-2 text-primary"></i> Terdaftar Pada:</p>
<p class="fw-semibold text-dark mb-0">{{ \Carbon\Carbon::parse(auth()->user()->created_at)->translatedFormat('d F Y') }}</p>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Script Toggle Password & Checklist Realtime -->
<script>
function togglePasswordVisibility(inputId, iconId) {
const inputField = document.getElementById(inputId);
const icon = document.getElementById(iconId);
if (inputField.type === "password") {
inputField.type = "text";
icon.classList.remove("fa-eye");
icon.classList.add("fa-eye-slash");
} else {
inputField.type = "password";
icon.classList.remove("fa-eye-slash");
icon.classList.add("fa-eye");
}
}
function checkPasswordStrength(password) {
const rules = [
{ id: 'req-length', valid: password.length >= 8 },
{ id: 'req-uppercase', valid: /[A-Z]/.test(password) },
{ id: 'req-number', valid: /[0-9]/.test(password) },
{ id: 'req-symbol', valid: /[@$!%*?&]/.test(password) }
];
rules.forEach(rule => {
const element = document.getElementById(rule.id);
if (rule.valid) {
element.className = "col-6 text-success fw-semibold";
element.querySelector('i').className = "fas fa-check-circle text-success me-1";
} else {
element.className = "col-6 text-muted";
element.querySelector('i').className = "fas fa-times-circle text-danger me-1";
}
});
}
</script>
@endsection