From e4e98e3f980d2b2e1a1a47886bc036bbf6200569 Mon Sep 17 00:00:00 2001 From: timotiabbauftech Date: Fri, 19 Sep 2025 11:14:49 +0700 Subject: [PATCH] [update] validasi duplikat nama produk --- app/Http/Controllers/ProdukController.php | 6 ++++-- resources/js/pages/InputProduk.vue | 24 +++++++++++++---------- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/app/Http/Controllers/ProdukController.php b/app/Http/Controllers/ProdukController.php index 681189a..3385cf6 100644 --- a/app/Http/Controllers/ProdukController.php +++ b/app/Http/Controllers/ProdukController.php @@ -33,7 +33,7 @@ class ProdukController extends Controller $validated = $request->validate( [ - 'nama' => 'required|string|max:100', + 'nama' => 'required|string|max:100|unique:produks,nama', 'id_kategori' => 'required|exists:kategoris,id', 'berat' => 'required|numeric', 'kadar' => 'required|integer', @@ -42,6 +42,7 @@ class ProdukController extends Controller ], [ 'nama.required' => 'Nama produk harus diisi.', + 'nama.unique' => 'Nama produk sudah digunakan.', 'id_kategori' => 'Kategori tidak valid.', 'berat.required' => 'Berat harus diisi.', 'kadar.required' => 'Kadar harus diisi.', @@ -122,7 +123,7 @@ class ProdukController extends Controller $validated = $request->validate( [ - 'nama' => 'required|string|max:100', + 'nama' => 'required|string|max:100|unique:produks,nama,' . $id, 'id_kategori' => 'required|exists:kategoris,id', 'berat' => 'required|numeric', 'kadar' => 'required|integer', @@ -131,6 +132,7 @@ class ProdukController extends Controller ], [ 'nama.required' => 'Nama produk harus diisi.', + 'nama.unique' => 'Nama produk sudah digunakan.', 'id_kategori' => 'Kategori tidak valid.', 'berat.required' => 'Berat harus diisi.', 'kadar.required' => 'Kadar harus diisi', diff --git a/resources/js/pages/InputProduk.vue b/resources/js/pages/InputProduk.vue index 50851a5..86dbbb5 100644 --- a/resources/js/pages/InputProduk.vue +++ b/resources/js/pages/InputProduk.vue @@ -10,7 +10,10 @@
- + +

+ {{ errors.nama[0] }} +

@@ -164,7 +167,7 @@ const uploadedImages = ref([]); const isDragging = ref(false); const uploadError = ref(''); const fileInput = ref(null); - +const errors = ref({}); const openItemModal = ref(false); const createdProduct = ref(null); @@ -350,15 +353,16 @@ const submitForm = async (addItem) => { window.location.href = '/produk?message=Produk berhasil disimpan'; } } catch (error) { - console.error('Submit error:', error); + console.error('Submit error:', error); - if (error.response?.data?.errors) { - const errors = Object.values(error.response.data.errors).flat(); - alert('Error: ' + errors.join(', ')); - } else { - alert('Gagal menyimpan produk: ' + (error.response?.data?.message || error.message)); - } - } finally { + if (error.response?.status === 422 && error.response.data?.errors) { + // 🔥 simpan error validasi dari backend + errors.value = error.response.data.errors; + } else { + uploadError.value = error.response?.data?.message || 'Gagal menyimpan produk'; + } +} + finally { loading.value = false; } };