From d076baff24b54159666703419e45cb096cb4db18 Mon Sep 17 00:00:00 2001 From: cukiprit Date: Sun, 12 Apr 2026 23:08:46 +0700 Subject: [PATCH] feat: implement form validation, localization, and enhanced input handling across admin modules --- .../Admin/AdminPeminjamanController.php | 2 +- .../Admin/AdminRekomendasiController.php | 8 +- app/Http/Controllers/Admin/BookController.php | 20 +- .../Admin/MasterIndukController.php | 4 +- .../Admin/PengumumanController.php | 4 +- app/Http/Controllers/Admin/UserController.php | 12 +- app/Http/Requests/ProfileUpdateRequest.php | 4 +- lang/id/validation.php | 178 ++++++++++++++++++ resources/views/admin/buku/create.blade.php | 73 ++++--- resources/views/admin/buku/edit.blade.php | 74 ++++---- .../views/admin/peminjaman/create.blade.php | 112 ++++------- .../views/admin/peminjaman/index.blade.php | 4 +- .../views/admin/pengguna/create.blade.php | 73 ++++--- resources/views/admin/pengguna/edit.blade.php | 73 ++++--- .../views/admin/pengguna/index.blade.php | 44 ++--- .../views/admin/pengumuman/create.blade.php | 55 +++--- .../views/admin/pengumuman/edit.blade.php | 60 +++--- .../views/admin/rekomendasi/create.blade.php | 43 ++++- .../views/admin/rekomendasi/edit.blade.php | 43 ++++- .../update-profile-information-form.blade.php | 6 +- 20 files changed, 544 insertions(+), 348 deletions(-) create mode 100644 lang/id/validation.php diff --git a/app/Http/Controllers/Admin/AdminPeminjamanController.php b/app/Http/Controllers/Admin/AdminPeminjamanController.php index 6863c02..ce0188e 100644 --- a/app/Http/Controllers/Admin/AdminPeminjamanController.php +++ b/app/Http/Controllers/Admin/AdminPeminjamanController.php @@ -145,7 +145,7 @@ public function store(Request $request) public function export(Request $request) { $request->validate([ - 'bulan_laporan' => 'nullable|date', + 'bulan_laporan' => 'required|date|before_or_equal:today', ]); $query = Loan::with(['user', 'book'])->orderBy('borrowed_at', 'asc'); diff --git a/app/Http/Controllers/Admin/AdminRekomendasiController.php b/app/Http/Controllers/Admin/AdminRekomendasiController.php index 0ac417e..34f974f 100644 --- a/app/Http/Controllers/Admin/AdminRekomendasiController.php +++ b/app/Http/Controllers/Admin/AdminRekomendasiController.php @@ -58,8 +58,8 @@ public function edit($id) public function store(Request $request) { $validated = $request->validate([ - 'judul' => 'required|string|max:255', - 'kategori' => 'required|string|max:100', + 'judul' => 'required|string|min:3|max:50', + 'kategori' => 'required|string|min:3|max:50', 'youtube_link' => 'required|url', 'deskripsi' => 'required|string', ]); @@ -75,8 +75,8 @@ public function update(Request $request, $id) $rekomendasi = Recommendation::findOrFail($id); $validated = $request->validate([ - 'judul' => 'required|string|max:255', - 'kategori' => 'required|string|max:100', + 'judul' => 'required|string|min:3|max:50', + 'kategori' => 'required|string|min:3|max:50', 'youtube_link' => 'required|url', 'deskripsi' => 'required|string', ]); diff --git a/app/Http/Controllers/Admin/BookController.php b/app/Http/Controllers/Admin/BookController.php index 0c2ac71..e2f0cc6 100644 --- a/app/Http/Controllers/Admin/BookController.php +++ b/app/Http/Controllers/Admin/BookController.php @@ -80,15 +80,15 @@ public function edit($id) public function store(Request $request) { $validated = $request->validate([ - 'judul' => 'required|string|min:3|max:255', - 'penulis' => 'required|string|min:3|max:100', + 'judul' => 'required|string|min:3|max:50', + 'penulis' => 'required|string|min:3|max:50|regex:/^[a-zA-Z\s.,\']+$/', 'category_id' => 'required|exists:categories,id', - 'tahun' => 'required|integer', - 'kode_buku' => 'nullable|string|max:10', + 'tahun' => 'required|integer|min:1900|max:2026', + 'kode_buku' => 'required|numeric|max_digits:10', 'stok' => 'required|integer|min:0|max:99', 'tipe_akses' => 'required|array', - 'cover' => 'nullable|image|mimes:jpeg,png,jpg|max:2048', - 'file_pdf' => 'nullable|mimes:pdf|max:10240', + 'cover' => 'required|image|mimes:jpeg,png,jpg|max:2048', + 'file_pdf' => 'required|mimes:pdf|max:10240', ]); if ($request->hasFile('cover')) { @@ -111,11 +111,11 @@ public function update(Request $request, $id) $buku = Book::findOrFail($id); $validated = $request->validate([ - 'judul' => 'required|string|min:3|max:255', - 'penulis' => 'required|string|min:3|max:100', + 'judul' => 'required|string|min:3|max:50', + 'penulis' => 'required|string|min:3|max:50|regex:/^[a-zA-Z\s.,\']+$/', 'category_id' => 'required|exists:categories,id', - 'tahun' => 'required|integer', - 'kode_buku' => 'nullable|string|max:10', + 'tahun' => 'required|integer|min:1900|max:2026', + 'kode_buku' => 'nullable|numeric|max_digits:10', 'stok' => 'required|integer|min:0|max:99', 'tipe_akses' => 'required|array', 'cover' => 'nullable|image|mimes:jpeg,png,jpg|max:2048', diff --git a/app/Http/Controllers/Admin/MasterIndukController.php b/app/Http/Controllers/Admin/MasterIndukController.php index 365b069..0fc25a0 100644 --- a/app/Http/Controllers/Admin/MasterIndukController.php +++ b/app/Http/Controllers/Admin/MasterIndukController.php @@ -12,9 +12,9 @@ class MasterIndukController extends Controller public function store(Request $request) { $request->validate([ - 'nomor_induk' => 'required|unique:master_induks,nomor_induk', + 'nomor_induk' => 'required|string|max:15|unique:master_induks,nomor_induk', 'role' => 'required|in:siswa,guru', - 'nama_pemilik' => 'required|string', + 'nama_pemilik' => 'required|string|min:3|max:50|regex:/^[a-zA-Z\s.,\']+$/', ]); MasterInduk::create(array_merge($request->all(), ['user_id' => auth()->id()])); diff --git a/app/Http/Controllers/Admin/PengumumanController.php b/app/Http/Controllers/Admin/PengumumanController.php index f931e3b..ff24540 100644 --- a/app/Http/Controllers/Admin/PengumumanController.php +++ b/app/Http/Controllers/Admin/PengumumanController.php @@ -46,7 +46,7 @@ public function edit($id) public function store(Request $request) { $validated = $request->validate([ - 'title' => 'required|string|max:255', + 'title' => 'required|string|min:3|max:50', 'content' => 'required|string', 'type' => 'required|in:info,warning,success,danger', 'icon' => 'nullable|string|max:50', @@ -68,7 +68,7 @@ public function update(Request $request, $id) $pengumuman = Announcement::findOrFail($id); $validated = $request->validate([ - 'title' => 'required|string|max:255', + 'title' => 'required|string|min:3|max:50', 'content' => 'required|string', 'type' => 'required|in:info,warning,success,danger', 'icon' => 'nullable|string|max:50', diff --git a/app/Http/Controllers/Admin/UserController.php b/app/Http/Controllers/Admin/UserController.php index 6d7f814..8564d2c 100644 --- a/app/Http/Controllers/Admin/UserController.php +++ b/app/Http/Controllers/Admin/UserController.php @@ -54,10 +54,10 @@ public function edit($id) public function store(Request $request) { $validated = $request->validate([ - 'nama_lengkap' => 'required|string|max:255', + 'nama_lengkap' => 'required|string|min:3|max:50|regex:/^[a-zA-Z\s.,\']+$/', 'email' => 'required|email|unique:users,email', - 'nomor_induk' => 'required|string|max:50|unique:users,nomor_induk', - 'phone' => 'nullable|string|max:20', + 'nomor_induk' => 'required|string|max:15|unique:users,nomor_induk', + 'phone' => 'nullable|string|min:13|max:16|regex:/^\+?[0-9]+$/', 'role' => 'required|in:siswa,guru,penjaga perpus', 'kelas' => 'nullable|string|max:50', 'golongan' => 'nullable|string|max:50', @@ -88,10 +88,10 @@ public function update(Request $request, $id) $pengguna = User::findOrFail($id); $validated = $request->validate([ - 'nama_lengkap' => 'required|string|max:255', + 'nama_lengkap' => 'required|string|min:3|max:50|regex:/^[a-zA-Z\s.,\']+$/', 'email' => 'required|email|unique:users,email,' . $id, - 'nomor_induk' => 'nullable|string|max:50', - 'phone' => 'nullable|string|max:20', + 'nomor_induk' => 'nullable|string|max:15', + 'phone' => 'nullable|string|min:13|max:16|regex:/^\+?[0-9]+$/', 'role' => 'required|in:siswa,guru,penjaga perpus', 'kelas' => 'nullable|string|max:50', 'golongan' => 'nullable|string|max:50', diff --git a/app/Http/Requests/ProfileUpdateRequest.php b/app/Http/Requests/ProfileUpdateRequest.php index 00b4838..b6bda61 100644 --- a/app/Http/Requests/ProfileUpdateRequest.php +++ b/app/Http/Requests/ProfileUpdateRequest.php @@ -16,7 +16,7 @@ class ProfileUpdateRequest extends FormRequest public function rules(): array { return [ - 'name' => ['required', 'string', 'max:255'], + 'name' => ['required', 'string', 'min:3', 'max:50'], 'email' => [ 'required', 'string', @@ -25,7 +25,7 @@ public function rules(): array 'max:255', Rule::unique(User::class)->ignore($this->user()->id), ], - 'phone' => ['required', 'string', 'max:20'], + 'phone' => ['required', 'numeric', 'digits_between:13,15'], ]; } } diff --git a/lang/id/validation.php b/lang/id/validation.php new file mode 100644 index 0000000..bdda36d --- /dev/null +++ b/lang/id/validation.php @@ -0,0 +1,178 @@ + ':attribute harus diterima.', + 'accepted_if' => ':attribute harus diterima ketika :other adalah :value.', + 'active_url' => ':attribute bukan URL yang valid.', + 'after' => ':attribute harus berisi tanggal setelah :date.', + 'after_or_equal' => ':attribute harus berisi tanggal setelah atau sama dengan :date.', + 'alpha' => ':attribute hanya boleh berisi huruf.', + 'alpha_dash' => ':attribute hanya boleh berisi huruf, angka, strip, dan garis bawah.', + 'alpha_num' => ':attribute hanya boleh berisi huruf dan angka.', + 'array' => ':attribute harus berisi sebuah array.', + 'ascii' => ':attribute hanya boleh berisi karakter alfanumerik dan simbol satu bait.', + 'before' => ':attribute harus berisi tanggal sebelum :date.', + 'before_or_equal' => ':attribute harus berisi tanggal sebelum atau sama dengan :date.', + 'between' => [ + 'array' => ':attribute harus memiliki antara :min dan :max anggota.', + 'file' => ':attribute harus berukuran antara :min dan :max kilobita.', + 'numeric' => ':attribute harus bernilai antara :min dan :max.', + 'string' => ':attribute harus berisi antara :min dan :max karakter.', + ], + 'boolean' => ':attribute harus bernilai true atau false.', + 'can' => ':attribute berisi nilai yang tidak sah.', + 'confirmed' => 'Konfirmasi :attribute tidak cocok.', + 'contains' => ':attribute tidak memiliki nilai yang dibutuhkan.', + 'current_password' => 'Kata sandi salah.', + 'date' => ':attribute bukan tanggal yang valid.', + 'date_equals' => ':attribute harus berisi tanggal yang sama dengan :date.', + 'date_format' => ':attribute tidak cocok dengan format :format.', + 'decimal' => ':attribute harus memiliki :decimal tempat desimal.', + 'declined' => ':attribute harus ditolak.', + 'declined_if' => ':attribute harus ditolak ketika :other adalah :value.', + 'different' => ':attribute dan :other harus berbeda.', + 'digits' => ':attribute harus terdiri dari :digits angka.', + 'digits_between' => ':attribute harus terdiri dari antara :min dan :max angka.', + 'dimensions' => ':attribute tidak memiliki dimensi gambar yang valid.', + 'distinct' => ':attribute memiliki nilai yang duplikat.', + 'doesnt_end_with' => ':attribute tidak boleh diakhiri dengan salah satu dari: :values.', + 'doesnt_start_with' => ':attribute tidak boleh diawali dengan salah satu dari: :values.', + 'email' => ':attribute harus berupa alamat surel yang valid.', + 'ends_with' => ':attribute harus diakhiri dengan salah satu dari: :values.', + 'enum' => ':attribute yang dipilih tidak valid.', + 'exists' => ':attribute yang dipilih tidak valid.', + 'extensions' => ':attribute harus memiliki salah satu ekstensi berikut: :values.', + 'file' => ':attribute harus berupa sebuah berkas.', + 'filled' => ':attribute harus memiliki nilai.', + 'gt' => [ + 'array' => ':attribute harus memiliki lebih dari :value anggota.', + 'file' => ':attribute harus berukuran lebih dari :value kilobita.', + 'numeric' => ':attribute harus bernilai lebih dari :value.', + 'string' => ':attribute harus berisi lebih dari :value karakter.', + ], + 'gte' => [ + 'array' => ':attribute harus memiliki :value anggota atau lebih.', + 'file' => ':attribute harus berukuran lebih dari atau sama dengan :value kilobita.', + 'numeric' => ':attribute harus bernilai lebih dari atau sama dengan :value.', + 'string' => ':attribute harus berisi lebih dari atau sama dengan :value karakter.', + ], + 'hex_color' => ':attribute harus berupa warna heksadesimal yang valid.', + 'image' => ':attribute harus berupa gambar.', + 'in' => ':attribute yang dipilih tidak valid.', + 'in_array' => ':attribute tidak ada di dalam :other.', + 'integer' => ':attribute harus berupa bilangan bulat.', + 'ip' => ':attribute harus berupa alamat IP yang valid.', + 'ipv4' => ':attribute harus berupa alamat IPv4 yang valid.', + 'ipv6' => ':attribute harus berupa alamat IPv6 yang valid.', + 'json' => ':attribute harus berupa string JSON yang valid.', + 'list' => ':attribute harus berupa daftar.', + 'lowercase' => ':attribute harus berupa huruf kecil.', + 'lt' => [ + 'array' => ':attribute harus memiliki kurang dari :value anggota.', + 'file' => ':attribute harus berukuran kurang dari :value kilobita.', + 'numeric' => ':attribute harus bernilai kurang dari :value.', + 'string' => ':attribute harus berisi kurang dari :value karakter.', + ], + 'lte' => [ + 'array' => ':attribute tidak boleh memiliki lebih dari :value anggota.', + 'file' => ':attribute harus berukuran kurang dari atau sama dengan :value kilobita.', + 'numeric' => ':attribute harus bernilai kurang dari atau sama dengan :value.', + 'string' => ':attribute harus berisi kurang dari atau sama dengan :value karakter.', + ], + 'mac_address' => ':attribute harus berupa alamat MAC yang valid.', + 'max' => [ + 'array' => ':attribute maksimal terdiri dari :max anggota.', + 'file' => ':attribute maksimal berukuran :max kilobita.', + 'numeric' => ':attribute maksimal bernilai :max.', + 'string' => ':attribute maksimal berisi :max karakter.', + ], + 'max_digits' => ':attribute tidak boleh memiliki lebih dari :max digit.', + 'mimes' => ':attribute harus berupa berkas berjenis: :values.', + 'mimetypes' => ':attribute harus berupa berkas berjenis: :values.', + 'min' => [ + 'array' => ':attribute minimal terdiri dari :min anggota.', + 'file' => ':attribute minimal berukuran :min kilobita.', + 'numeric' => ':attribute minimal bernilai :min.', + 'string' => ':attribute minimal berisi :min karakter.', + ], + 'min_digits' => ':attribute harus memiliki setidaknya :min digit.', + 'missing' => ':attribute harus tidak ada.', + 'missing_if' => ':attribute harus tidak ada ketika :other adalah :value.', + 'missing_unless' => ':attribute harus tidak ada kecuali :other adalah :value.', + 'missing_with' => ':attribute harus tidak ada ketika :values ada.', + 'missing_with_all' => ':attribute harus tidak ada ketika :values ada.', + 'multiple_of' => ':attribute harus merupakan kelipatan dari :value.', + 'not_in' => ':attribute yang dipilih tidak valid.', + 'not_regex' => 'Format :attribute tidak valid.', + 'numeric' => ':attribute harus berupa angka.', + 'password' => [ + 'letters' => ':attribute harus berisi setidaknya satu huruf.', + 'mixed' => ':attribute harus berisi setidaknya satu huruf besar dan satu huruf kecil.', + 'numbers' => ':attribute harus berisi setidaknya satu angka.', + 'symbols' => ':attribute harus berisi setidaknya satu simbol.', + 'uncompromised' => ':attribute yang diberikan telah muncul dalam kebocoran data. Silakan pilih :attribute yang berbeda.', + ], + 'present' => ':attribute harus ada.', + 'present_if' => ':attribute harus ada ketika :other adalah :value.', + 'present_unless' => ':attribute harus ada kecuali :other adalah :value.', + 'present_with' => ':attribute harus ada ketika :values ada.', + 'present_with_all' => ':attribute harus ada ketika :values ada.', + 'prohibited' => ':attribute dilarang.', + 'prohibited_if' => ':attribute dilarang ketika :other adalah :value.', + 'prohibited_unless' => ':attribute dilarang kecuali :other adalah :value.', + 'prohibits' => ':attribute melarang :other dari ada.', + 'regex' => 'Format :attribute tidak valid.', + 'required' => ':attribute wajib diisi.', + 'required_array_keys' => ':attribute harus memiliki entri untuk: :values.', + 'required_if' => ':attribute wajib diisi ketika :other adalah :value.', + 'required_if_accepted' => ':attribute wajib diisi ketika :other diterima.', + 'required_if_declined' => ':attribute wajib diisi ketika :other ditolak.', + 'required_unless' => ':attribute wajib diisi kecuali :other memiliki nilai :values.', + 'required_with' => ':attribute wajib diisi ketika :values ada.', + 'required_with_all' => ':attribute wajib diisi ketika :values ada.', + 'required_without' => ':attribute wajib diisi ketika :values tidak ada.', + 'required_without_all' => ':attribute wajib diisi ketika tidak ada :values yang ada.', + 'same' => ':attribute dan :other harus sama.', + 'size' => [ + 'array' => ':attribute harus mengandung :size anggota.', + 'file' => ':attribute harus berukuran :size kilobita.', + 'numeric' => ':attribute harus berukuran :size.', + 'string' => ':attribute harus berukuran :size karakter.', + ], + 'starts_with' => ':attribute harus diawali dengan salah satu dari: :values.', + 'string' => ':attribute harus berupa string.', + 'timezone' => ':attribute harus berisi zona waktu yang valid.', + 'unique' => ':attribute sudah ada sebelumnya.', + 'uploaded' => ':attribute gagal diunggah.', + 'uppercase' => ':attribute harus berupa huruf besar.', + 'url' => ':attribute harus berupa URL yang valid.', + 'ulid' => ':attribute harus berupa ULID yang valid.', + 'uuid' => ':attribute harus berupa UUID yang valid.', + + 'custom' => [ + 'attribute-name' => [ + 'rule-name' => 'custom-message', + ], + ], + + 'attributes' => [ + 'judul' => 'Judul Buku', + 'penulis' => 'Penulis', + 'category_id' => 'Kategori', + 'tahun' => 'Tahun Terbit', + 'kode_buku' => 'Kode Buku', + 'stok' => 'Stok', + 'tipe_akses' => 'Tipe Akses', + 'cover' => 'Cover Buku', + 'file_pdf' => 'File PDF', + 'nama_lengkap' => 'Nama Lengkap', + 'nama_pemilik' => 'Nama Pemilik', + 'nomor_induk' => 'Nomor Induk', + 'phone' => 'Nomor Telepon', + 'title' => 'Judul', + 'content' => 'Konten', + 'type' => 'Tipe', + 'icon' => 'Ikon', + 'kategori' => 'Kategori', + ], +]; diff --git a/resources/views/admin/buku/create.blade.php b/resources/views/admin/buku/create.blade.php index c6706e8..df9c64f 100644 --- a/resources/views/admin/buku/create.blade.php +++ b/resources/views/admin/buku/create.blade.php @@ -18,52 +18,59 @@
- + + placeholder="Masukkan judul buku" value="{{ old('judul') }}" required minlength="3" maxlength="50"> @error('judul')
{{ $message }}
@enderror
- + + placeholder="Masukkan nama penulis" value="{{ old('penulis') }}" required minlength="3" maxlength="50" pattern="[a-zA-Z\s.,'\']+"> @error('penulis')
{{ $message }}
@enderror
- - @foreach($categories as $category) - + @endforeach + @error('category_id') +
{{ $message }}
+ @enderror
- - - @for ($year = date('Y'); $year >= 1500; $year--) - + @for ($year = date('Y') + 1; $year >= 1500; $year--) + @endfor + @error('tahun') +
{{ $message }}
+ @enderror
+ value="{{ old('kode_buku') }}" placeholder="Contoh: 330" maxlength="10" + inputmode="numeric" oninput="this.value = this.value.replace(/[^0-9]/g, '')"> @error('kode_buku')
{{ $message }}
@enderror
- - + + @error('stok')
{{ $message }}
@enderror @@ -76,24 +83,33 @@
- +
- +
+ @error('tipe_akses') +
{{ $message }}
+ @enderror
- + + @error('cover') +
{{ $message }}
+ @enderror
- + + @error('file_pdf') +
{{ $message }}
+ @enderror
@@ -113,24 +129,7 @@ @push('scripts') @endpush diff --git a/resources/views/admin/buku/edit.blade.php b/resources/views/admin/buku/edit.blade.php index 7b4f285..91ebd78 100644 --- a/resources/views/admin/buku/edit.blade.php +++ b/resources/views/admin/buku/edit.blade.php @@ -19,46 +19,52 @@
- + + value="{{ old('judul', $buku->judul) }}" required minlength="3" maxlength="50"> @error('judul')
{{ $message }}
@enderror
- + + value="{{ old('penulis', $buku->penulis) }}" required minlength="3" maxlength="50" pattern="[a-zA-Z\s.,'\']+"> @error('penulis')
{{ $message }}
@enderror
- - @foreach($categories as $category) @endforeach + @error('category_id') +
{{ $message }}
+ @enderror
- - + @for ($year = date('Y') + 1; $year >= 1500; $year--) @endfor + @error('tahun') +
{{ $message }}
+ @enderror
- - + + @error('stok')
{{ $message }}
@enderror @@ -76,7 +82,8 @@
+ value="{{ old('kode_buku', $buku->kode_buku) }}" placeholder="Masukkan kode buku" maxlength="10" + inputmode="numeric" oninput="this.value = this.value.replace(/[^0-9]/g, '')"> @error('kode_buku')
{{ $message }}
@enderror @@ -85,29 +92,38 @@
- +
- +
+ @error('tipe_akses') +
{{ $message }}
+ @enderror
- + + @error('cover') +
{{ $message }}
+ @enderror Cover saat ini
- + + @error('file_pdf') +
{{ $message }}
+ @enderror
@@ -124,24 +140,8 @@ class="img-thumbnail mt-2" width="150"> @push('scripts') @endpush diff --git a/resources/views/admin/peminjaman/create.blade.php b/resources/views/admin/peminjaman/create.blade.php index 7f00b22..ab5a3f1 100644 --- a/resources/views/admin/peminjaman/create.blade.php +++ b/resources/views/admin/peminjaman/create.blade.php @@ -9,17 +9,6 @@
@csrf - @if ($errors->any()) - - @endif
@@ -28,25 +17,26 @@
Data Peminjaman
- - @foreach ($groupedUsers as $role => $users) @foreach ($users as $user) - @endforeach @endforeach + @error('peminjam_id')
{{ $message }}
@enderror
@@ -61,12 +51,18 @@
- - + + + @error('tanggal_pinjam')
{{ $message }}
@enderror
- - + + + @error('tanggal_kembali')
{{ $message }}
@enderror
@@ -77,6 +73,12 @@ 0 Buku
+ @error('buku_ids') +
+ {{ $message }} +
+ @enderror +
@@ -145,7 +147,6 @@ create: false, sortField: { field: "text", direction: "asc" }, onChange: function(value) { - // Munculkan Kartu Detail Peminjam saat Dropdown Berubah const selectedOption = this.options[value]; const detailCard = document.getElementById('detailPeminjamCard'); @@ -162,14 +163,14 @@ }); const tglPinjam = flatpickr("#tanggal_pinjam", { - dateFormat: "Y-m-d", altInput: true, altFormat: "d/m/Y", defaultDate: "today", locale: "id", + dateFormat: "Y-m-d", altInput: true, altFormat: "d/m/Y", defaultDate: "{{ old('tanggal_pinjam', date('Y-m-d')) }}", locale: "id", onChange: function(selectedDates, dateStr) { if (selectedDates.length > 0) tglKembali.set("minDate", new Date(selectedDates[0]).fp_incr(1)); } }); const tglKembali = flatpickr("#tanggal_kembali", { - dateFormat: "Y-m-d", altInput: true, altFormat: "d/m/Y", defaultDate: new Date().fp_incr(7), locale: "id", minDate: new Date().fp_incr(1) + dateFormat: "Y-m-d", altInput: true, altFormat: "d/m/Y", defaultDate: "{{ old('tanggal_kembali', date('Y-m-d', strtotime('+7 days'))) }}", locale: "id", minDate: new Date().fp_incr(1) }); const MAX_BOOKS_SISWA = 2; @@ -209,7 +210,6 @@ function renderSelectedBooks() { counterBukuEl.textContent = `${selectedBookIds.size} Buku`; } - // Global function untuk toggle selection window.toggleBookSelection = function(itemElement, id) { const selectEl = document.getElementById('peminjam_id'); if(selectEl.value === "") { @@ -250,7 +250,6 @@ function renderSelectedBooks() { renderSelectedBooks(); } - // Pencarian document.getElementById('searchBuku').addEventListener('keyup', function() { const searchTerm = this.value.toLowerCase(); document.querySelectorAll('.book-option').forEach(el => { @@ -260,55 +259,26 @@ function renderSelectedBooks() { }); }); - document.getElementById('formPeminjaman').addEventListener('submit', function(e) { - e.preventDefault(); - - const peminjam = document.getElementById('peminjam_id').value; - const jumlahBuku = selectedBookIds.size; - - // Validasi - if (!peminjam) { - Toast.fire({ icon: 'warning', title: 'Perhatian', text: 'Pilih peminjam terlebih dahulu!' }); - return; - } - if (jumlahBuku === 0) { - Toast.fire({ icon: 'warning', title: 'Perhatian', text: 'Pilih minimal 1 buku!' }); - return; - } - + document.getElementById('formPeminjaman').addEventListener('submit', function() { modernSwal.fire({ - title: 'Proses Peminjaman?', - text: `Anda akan memproses ${jumlahBuku} buku.`, - icon: 'question', - showCancelButton: true, - confirmButtonText: 'Ya, Proses', - cancelButtonText: 'Batal' - }).then((result) => { - if (result.isConfirmed) { - // Loading - modernSwal.fire({ - title: 'Memproses...', - timer: 1000, - didOpen: () => Swal.showLoading() - }).then(() => { - Toast.fire({ - icon: 'success', - title: 'Berhasil', - text: 'Transaksi peminjaman berhasil disimpan.' - }); - - setTimeout(() => { - window.location.href = "{{ route('admin.peminjaman.index') }}"; - }, 1500); - }); - } + title: 'Memproses...', + allowOutsideClick: false, + didOpen: () => Swal.showLoading() }); }); - document.getElementById('formPeminjaman').reset(); - tomSelect.clear(); - selectedBookIds.clear(); - renderSelectedBooks(); + // Restore old state if any + @if(old('buku_ids')) + @foreach(old('buku_ids') as $oldId) + selectedBookIds.add("{{ $oldId }}"); + const oldItem = document.querySelector(`.book-option[data-book-id="{{ $oldId }}"] .book-item-list`); + if(oldItem) { + oldItem.querySelector('.book-checkbox').checked = true; + oldItem.style.background = 'rgba(var(--bs-primary-rgb), 0.05)'; + } + @endforeach + renderSelectedBooks(); + @endif }); @endpush diff --git a/resources/views/admin/peminjaman/index.blade.php b/resources/views/admin/peminjaman/index.blade.php index 21a8903..9c84f6b 100644 --- a/resources/views/admin/peminjaman/index.blade.php +++ b/resources/views/admin/peminjaman/index.blade.php @@ -10,7 +10,9 @@
Filter Bulan: - + diff --git a/resources/views/admin/pengguna/create.blade.php b/resources/views/admin/pengguna/create.blade.php index 890b678..e6a1a5a 100644 --- a/resources/views/admin/pengguna/create.blade.php +++ b/resources/views/admin/pengguna/create.blade.php @@ -27,44 +27,47 @@ @if($prefilledData) - @else + @endif @error('role')
{{ $message }}
@enderror - @endif
{{-- Bagian Form Dinamis --}} -
+
- + + id="nama_lengkap" name="nama_lengkap" value="{{ old('nama_lengkap', $prefilledData->nama_pemilik ?? '') }}" + {{ $prefilledData ? 'readonly' : '' }} required minlength="3" maxlength="50" pattern="[a-zA-Z\s.,'\']+"> + @error('nama_lengkap') +
{{ $message }}
+ @enderror
- + @if($prefilledData) @endif - + placeholder="Masukkan Nomor Induk" {{ $prefilledData ? 'readonly' : '' }} required maxlength="15"> @error('nomor_induk')
{{ $message }}
@enderror @@ -72,7 +75,7 @@
- + @error('email') @@ -80,22 +83,32 @@ @enderror
- - + + + @error('phone') +
{{ $message }}
+ @enderror
- + + @error('kelas') +
{{ $message }}
+ @enderror
- + + @error('golongan') +
{{ $message }}
+ @enderror
@@ -103,11 +116,11 @@
- +
+ name="password" required minlength="8">
- +
+ name="password_confirmation" required minlength="8"> + @error('password')
{{ $message }}
@enderror +
- +
+ + +
@@ -112,21 +129,23 @@ function toggleFields() { } document.addEventListener('DOMContentLoaded', toggleFields); - document.getElementById('formEditPengguna').addEventListener('submit', function() { - modernSwal.fire({ - title: 'Menyimpan Perubahan...', - allowOutsideClick: false, - didOpen: () => Swal.showLoading() + document.querySelectorAll('.toggle-password').forEach(function(button) { + button.addEventListener('click', function() { + const targetId = this.getAttribute('data-target'); + const input = document.getElementById(targetId); + const icon = document.getElementById('icon-' + targetId); + + if (input.type === 'password') { + input.type = 'text'; + icon.classList.replace('bi-eye', 'bi-eye-slash'); + } else { + input.type = 'password'; + icon.classList.replace('bi-eye-slash', 'bi-eye'); + } }); }); - - Toast.fire({ - icon: 'success', - title: 'Berhasil', - text: '' - }); - + // Form submission listener removed to allow server-side validation @endpush \ No newline at end of file diff --git a/resources/views/admin/pengguna/index.blade.php b/resources/views/admin/pengguna/index.blade.php index 318a0ab..9a03bb3 100644 --- a/resources/views/admin/pengguna/index.blade.php +++ b/resources/views/admin/pengguna/index.blade.php @@ -53,10 +53,10 @@ @endphp @if ($isRegistered) Terdaftar + class="bi bi-check-circle-fill me-1">Terdaftar @else Belum Daftar + class="bi bi-hourglass-split me-1">Belum Daftar @endif @@ -200,7 +200,7 @@ class="form-delete-user" data-nama="{{ $user->name }}">
{{-- MODAL TAMBAH DATA INDUK --}} - @@ -51,25 +56,8 @@ @push('scripts') @endpush diff --git a/resources/views/admin/rekomendasi/create.blade.php b/resources/views/admin/rekomendasi/create.blade.php index 5cc2321..fc56b82 100644 --- a/resources/views/admin/rekomendasi/create.blade.php +++ b/resources/views/admin/rekomendasi/create.blade.php @@ -14,18 +14,41 @@
@csrf -
-
-
-
- +
+ + + @error('judul') +
{{ $message }}
+ @enderror +
+
+ + + @error('kategori') +
{{ $message }}
+ @enderror +
+
+ + + @error('youtube_link') +
{{ $message }}
+ @enderror +
+
+ + + @error('deskripsi') +
{{ $message }}
+ @enderror

-
+
+ +
diff --git a/resources/views/admin/rekomendasi/edit.blade.php b/resources/views/admin/rekomendasi/edit.blade.php index 50b8eaf..b24b9d9 100644 --- a/resources/views/admin/rekomendasi/edit.blade.php +++ b/resources/views/admin/rekomendasi/edit.blade.php @@ -15,18 +15,41 @@
@csrf @method('PUT') -
-
-
-
- +
+ + + @error('judul') +
{{ $message }}
+ @enderror +
+
+ + + @error('kategori') +
{{ $message }}
+ @enderror +
+
+ + + @error('youtube_link') +
{{ $message }}
+ @enderror +
+
+ + + @error('deskripsi') +
{{ $message }}
+ @enderror

-
+
+ +
diff --git a/resources/views/profile/partials/update-profile-information-form.blade.php b/resources/views/profile/partials/update-profile-information-form.blade.php index 64171a8..0c8bc00 100644 --- a/resources/views/profile/partials/update-profile-information-form.blade.php +++ b/resources/views/profile/partials/update-profile-information-form.blade.php @@ -21,7 +21,8 @@
+ value="{{ old('name', $user->name) }}" required autofocus autocomplete="name" + minlength="3" maxlength="50"> @error('name')
{{ $message }}
@enderror @@ -58,7 +59,8 @@ class="form-control @error('email') is-invalid @enderror" value="{{ old('email',
+ value="{{ old('phone', $user->phone) }}" required + minlength="13" maxlength="15" pattern="\d*"> @error('phone')
{{ $message }}
@enderror