This commit is contained in:
Saufi
2026-06-02 17:35:45 +08:00
commit 4ef99b1f81
148 changed files with 21134 additions and 0 deletions

View File

@@ -0,0 +1,93 @@
@extends('layouts.admin')
@section('title', 'Daftar Pengguna Baru')
@section('content')
<div class="d-flex justify-content-between align-items-center mb-4">
<h4 class="fw-bold mb-0"><i class="bi bi-person-plus me-2 text-primary"></i>Daftar Pengguna Baru</h4>
<a href="{{ route('admin.users.index') }}" class="btn btn-outline-secondary">
<i class="bi bi-arrow-left me-1"></i>Kembali
</a>
</div>
<div class="card">
<div class="card-body">
<form method="POST" action="{{ route('admin.users.store') }}">
@csrf
<div class="row g-3">
<div class="col-md-6">
<label for="name" class="form-label fw-semibold">Nama Penuh <span class="text-danger">*</span></label>
<input type="text" class="form-control @error('name') is-invalid @enderror"
id="name" name="name" value="{{ old('name') }}" required>
@error('name')
<div class="invalid-feedback">{{ $message }}</div>
@enderror
</div>
<div class="col-md-6">
<label for="email" class="form-label fw-semibold">E-mel <span class="text-danger">*</span></label>
<input type="email" class="form-control @error('email') is-invalid @enderror"
id="email" name="email" value="{{ old('email') }}" required>
@error('email')
<div class="invalid-feedback">{{ $message }}</div>
@enderror
</div>
<div class="col-md-6">
<label for="password" class="form-label fw-semibold">Kata Laluan <span class="text-danger">*</span></label>
<input type="password" class="form-control @error('password') is-invalid @enderror"
id="password" name="password" required>
<div class="form-text">Minimum 8 aksara, huruf besar, huruf kecil, dan nombor.</div>
@error('password')
<div class="invalid-feedback">{{ $message }}</div>
@enderror
</div>
<div class="col-md-6">
<label for="password_confirmation" class="form-label fw-semibold">Sahkan Kata Laluan <span class="text-danger">*</span></label>
<input type="password" class="form-control"
id="password_confirmation" name="password_confirmation" required>
</div>
<div class="col-md-6">
<label for="role" class="form-label fw-semibold">Peranan <span class="text-danger">*</span></label>
<select class="form-select @error('role') is-invalid @enderror" id="role" name="role" required>
<option value="user" {{ old('role', 'user') === 'user' ? 'selected' : '' }}>Pengguna Jabatan</option>
<option value="admin" {{ old('role') === 'admin' ? 'selected' : '' }}>Pentadbir</option>
</select>
@error('role')
<div class="invalid-feedback">{{ $message }}</div>
@enderror
</div>
<div class="col-md-6">
<label for="department_id" class="form-label fw-semibold">Jabatan</label>
<select class="form-select @error('department_id') is-invalid @enderror"
id="department_id" name="department_id">
<option value=""> Pilih Jabatan </option>
@foreach($departments as $dept)
<option value="{{ $dept->id }}"
{{ old('department_id') == $dept->id ? 'selected' : '' }}>
{{ $dept->name }}
</option>
@endforeach
</select>
@error('department_id')
<div class="invalid-feedback">{{ $message }}</div>
@enderror
</div>
</div>
<hr class="my-4">
<div class="d-flex gap-2">
<button type="submit" class="btn btn-primary">
<i class="bi bi-person-check me-1"></i>Daftarkan Pengguna
</button>
<a href="{{ route('admin.users.index') }}" class="btn btn-outline-secondary">Batal</a>
</div>
</form>
</div>
</div>
@endsection

View File

@@ -0,0 +1,81 @@
@extends('layouts.admin')
@section('title', 'Kemaskini E-mel Pengguna')
@section('content')
<div class="d-flex justify-content-between align-items-center mb-4">
<h4 class="fw-bold mb-0"><i class="bi bi-pencil me-2 text-primary"></i>Kemaskini E-mel Pengguna</h4>
<a href="{{ route('admin.users.index') }}" class="btn btn-outline-secondary">
<i class="bi bi-arrow-left me-1"></i>Kembali
</a>
</div>
<div class="row">
<div class="col-md-6">
{{-- User Info Card --}}
<div class="card mb-3">
<div class="card-header bg-light fw-semibold">Maklumat Pengguna</div>
<div class="card-body">
<table class="table table-sm mb-0">
<tr>
<td class="text-muted" width="35%">Nama</td>
<td class="fw-semibold">{{ $user->name }}</td>
</tr>
<tr>
<td class="text-muted">E-mel Semasa</td>
<td>{{ $user->email }}</td>
</tr>
<tr>
<td class="text-muted">Jabatan</td>
<td>{{ $user->department?->name ?? '—' }}</td>
</tr>
<tr>
<td class="text-muted">Status</td>
<td>
@if($user->is_active)
<span class="badge bg-success">Aktif</span>
@else
<span class="badge bg-secondary">Dinyahaktif</span>
@endif
</td>
</tr>
</table>
</div>
</div>
{{-- Email Update Form --}}
<div class="card">
<div class="card-header bg-light fw-semibold">Kemaskini E-mel</div>
<div class="card-body">
<form method="POST" action="{{ route('admin.users.update-email', $user) }}">
@csrf @method('PATCH')
<div class="mb-3">
<label for="email" class="form-label fw-semibold">E-mel Baru <span class="text-danger">*</span></label>
<input type="email" class="form-control @error('email') is-invalid @enderror"
id="email" name="email" value="{{ old('email', $user->email) }}" required>
@error('email')
<div class="invalid-feedback">{{ $message }}</div>
@enderror
</div>
<div class="mb-4">
<label for="justification" class="form-label fw-semibold">Justifikasi</label>
<textarea class="form-control" id="justification" name="justification"
rows="3" maxlength="500"
placeholder="Nyatakan sebab perubahan e-mel...">{{ old('justification') }}</textarea>
<div class="form-text">Perubahan ini akan direkod dalam log audit.</div>
</div>
<div class="d-flex gap-2">
<button type="submit" class="btn btn-primary">
<i class="bi bi-envelope-check me-1"></i>Kemaskini E-mel
</button>
<a href="{{ route('admin.users.index') }}" class="btn btn-outline-secondary">Batal</a>
</div>
</form>
</div>
</div>
</div>
</div>
@endsection

View File

@@ -0,0 +1,125 @@
@extends('layouts.admin')
@section('title', 'Senarai Pengguna')
@section('content')
<div class="d-flex justify-content-between align-items-center mb-4">
<h4 class="fw-bold mb-0"><i class="bi bi-people me-2 text-primary"></i>Senarai Pengguna</h4>
<a href="{{ route('admin.users.create') }}" class="btn btn-primary">
<i class="bi bi-person-plus me-1"></i>Daftar Pengguna Baru
</a>
</div>
{{-- Filter --}}
<div class="card mb-3">
<div class="card-body py-2">
<form method="GET" class="row g-2 align-items-center">
<div class="col-md-4">
<input type="text" class="form-control form-control-sm" name="search"
value="{{ request('search') }}" placeholder="Cari nama atau e-mel...">
</div>
<div class="col-md-3">
<select class="form-select form-select-sm" name="status">
<option value="">Semua Status</option>
<option value="active" {{ request('status') === 'active' ? 'selected' : '' }}>Aktif</option>
<option value="inactive" {{ request('status') === 'inactive' ? 'selected' : '' }}>Dinyahaktif</option>
</select>
</div>
<div class="col-auto">
<button class="btn btn-sm btn-outline-secondary" type="submit">
<i class="bi bi-search me-1"></i>Cari
</button>
<a href="{{ route('admin.users.index') }}" class="btn btn-sm btn-outline-secondary ms-1">Padam Carian</a>
</div>
</form>
</div>
</div>
{{-- Table --}}
<div class="card">
<div class="card-body p-0">
<div class="table-responsive">
<table class="table table-hover mb-0">
<thead class="table-light">
<tr>
<th>Nama</th>
<th>E-mel</th>
<th>Jabatan</th>
<th>Status</th>
<th>Log Masuk Terakhir</th>
<th>Tindakan</th>
</tr>
</thead>
<tbody>
@forelse($users as $user)
<tr>
<td>
<span class="fw-semibold">{{ $user->name }}</span>
</td>
<td>{{ $user->email }}</td>
<td>{{ $user->department?->name ?? '—' }}</td>
<td>
@if($user->is_active)
<span class="badge bg-success">Aktif</span>
@else
<span class="badge bg-secondary">Dinyahaktif</span>
@endif
</td>
<td>
{{ $user->last_login_at?->format('d/m/Y H:i') ?? 'Belum pernah' }}
</td>
<td>
<div class="d-flex gap-1">
<a href="{{ route('admin.users.edit', $user) }}"
class="btn btn-sm btn-outline-primary" title="Edit E-mel">
<i class="bi bi-pencil"></i>
</a>
@if($user->is_active)
<form method="POST" action="{{ route('admin.users.deactivate', $user) }}"
onsubmit="return confirm('Dinyahaktifkan akaun {{ $user->name }}?')">
@csrf @method('PATCH')
<button class="btn btn-sm btn-outline-warning" title="Nyahaktif">
<i class="bi bi-person-x"></i>
</button>
</form>
@else
<form method="POST" action="{{ route('admin.users.activate', $user) }}">
@csrf @method('PATCH')
<button class="btn btn-sm btn-outline-success" title="Aktifkan">
<i class="bi bi-person-check"></i>
</button>
</form>
@endif
@if(! $user->hasUsage())
<form method="POST" action="{{ route('admin.users.destroy', $user) }}"
onsubmit="return confirm('PADAM akaun {{ $user->name }} secara kekal?')">
@csrf @method('DELETE')
<button class="btn btn-sm btn-outline-danger" title="Padam">
<i class="bi bi-trash"></i>
</button>
</form>
@endif
</div>
</td>
</tr>
@empty
<tr>
<td colspan="6" class="text-center text-muted py-4">
<i class="bi bi-inbox fs-4 d-block mb-2"></i>Tiada pengguna ditemui.
</td>
</tr>
@endforelse
</tbody>
</table>
</div>
</div>
@if($users->hasPages())
<div class="card-footer bg-white">
{{ $users->links() }}
</div>
@endif
</div>
@endsection