diff --git a/app/Http/Controllers/ProdukController.php b/app/Http/Controllers/ProdukController.php index 09b1177..140608a 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/components/BrankasList.vue b/resources/js/components/BrankasList.vue index ffda540..904ea91 100644 --- a/resources/js/components/BrankasList.vue +++ b/resources/js/components/BrankasList.vue @@ -340,40 +340,50 @@ const printQR = () => { Print QR Code - ${selectedItem.value.kode_item}
- QR Code + QR Code
-
${selectedItem.value.kode_item}
-
${selectedItem.value.produk.nama}
-
${selectedItem.value.produk.berat}g
+ ${selectedItem.value.kode_item}
`); printWindow.document.close(); - printWindow.print(); } }; + const handleImageError = (event) => { event.target.style.display = 'none'; }; diff --git a/resources/js/components/CreateItemModal.vue b/resources/js/components/CreateItemModal.vue index fc40955..bd3c622 100644 --- a/resources/js/components/CreateItemModal.vue +++ b/resources/js/components/CreateItemModal.vue @@ -87,7 +87,7 @@ const props = defineProps({ }); // Emits -const emit = defineEmits(['close']); +const emit = defineEmits(['close','itemAdded']); // State const selectedNampan = ref(''); @@ -147,15 +147,17 @@ const createItem = async () => { } const response = await axios.post('/api/item', payload, { - headers: { - Authorization: `Bearer ${localStorage.getItem("token")}`, - }, - });; + headers: { + Authorization: `Bearer ${localStorage.getItem("token")}`, + }, + }); success.value = true; - createdItem.value = response.data.data + createdItem.value = response.data.data; console.log('Item created:', createdItem); + emit('itemAdded'); // 🔔 penting + loadNampanList(); } catch (error) { console.error('Error creating item:', error); @@ -165,6 +167,7 @@ const createItem = async () => { } }; + const addNewItem = () => { success.value = false; selectedNampan.value = ''; diff --git a/resources/js/components/TrayList.vue b/resources/js/components/TrayList.vue index 14404e5..73e138d 100644 --- a/resources/js/components/TrayList.vue +++ b/resources/js/components/TrayList.vue @@ -185,40 +185,57 @@ const printQR = () => { Print QR Code - ${selectedItem.value.kode_item}
- QR Code -
-
${selectedItem.value.kode_item}
-
${selectedItem.value.produk.nama}
-
${selectedItem.value.produk.berat}g
-
+ QR Code +
${selectedItem.value.kode_item}
`); + printWindow.document.close(); - printWindow.print(); + + const img = printWindow.document.getElementById("qr-img"); + img.onload = () => { + printWindow.focus(); + printWindow.print(); + }; } }; + const showDeleteConfirm = ref(false); const confirmDelete = async () => { 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; } }; diff --git a/resources/js/pages/Produk.vue b/resources/js/pages/Produk.vue index 654c66d..2911502 100644 --- a/resources/js/pages/Produk.vue +++ b/resources/js/pages/Produk.vue @@ -1,7 +1,13 @@