From 991a3eaa6685aaecd83e86aafeafba1f7b53c8eb Mon Sep 17 00:00:00 2001 From: vinix Date: Wed, 3 Dec 2025 16:45:44 +0700 Subject: [PATCH] feat: update quantity handling in DetailSparepart and SparepartCardList components to allow zero values --- .../sparepart/component/DetailSparepart.jsx | 27 ++++++++++++++----- .../sparepart/component/SparepartCardList.jsx | 9 +++---- 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/src/pages/master/sparepart/component/DetailSparepart.jsx b/src/pages/master/sparepart/component/DetailSparepart.jsx index b58ab26..3a13fc0 100644 --- a/src/pages/master/sparepart/component/DetailSparepart.jsx +++ b/src/pages/master/sparepart/component/DetailSparepart.jsx @@ -226,10 +226,8 @@ const DetailSparepart = (props) => { payload.sparepart_merk = formData.sparepart_merk; } // sparepart_qty disimpan sebagai angka kuantitas - // Untuk menghindari error validasi, jika qty 0, kita tetap kirim 1 ke backend tapi statusnya "Not Available" const qty = parseInt(formData.sparepart_qty) || 0; - const actualQty = qty > 0 ? qty : 1; // Kirim minimal 1 ke backend - payload.sparepart_qty = actualQty; + payload.sparepart_qty = qty; // sparepart_stok ditentukan otomatis berdasarkan qty sebenarnya payload.sparepart_stok = qty > 0 ? 'Available' : 'Not Available'; @@ -292,7 +290,9 @@ const DetailSparepart = (props) => { const fileName = props.selectedData.sparepart_foto.split('/').pop(); const token = localStorage.getItem('token'); const baseURL = import.meta.env.VITE_API_SERVER || ''; - const fullUrl = `${baseURL}/file-uploads/images/${encodeURIComponent(fileName)}${token ? `?token=${encodeURIComponent(token)}` : ''}`; + const fullUrl = `${baseURL}/file-uploads/images/${encodeURIComponent(fileName)}${ + token ? `?token=${encodeURIComponent(token)}` : '' + }`; setFileList([ { @@ -508,6 +508,7 @@ const DetailSparepart = (props) => { placeholder="Enter quantity" readOnly={props.readOnly} type="number" + min="0" /> @@ -524,13 +525,20 @@ const DetailSparepart = (props) => { Status 0 ? 'Available' : 'Not Available'} + value={ + parseInt(formData.sparepart_qty) > 0 + ? 'Available' + : 'Not Available' + } readOnly={true} placeholder="Auto calculated" style={{ backgroundColor: '#f5f5f5', cursor: 'not-allowed', - color: parseInt(formData.sparepart_qty) > 0 ? '#52c41a' : '#ff4d4f' + color: + parseInt(formData.sparepart_qty) > 0 + ? '#52c41a' + : '#ff4d4f', }} /> @@ -576,7 +584,12 @@ const DetailSparepart = (props) => { )} - + preview diff --git a/src/pages/master/sparepart/component/SparepartCardList.jsx b/src/pages/master/sparepart/component/SparepartCardList.jsx index d97d7f6..663d548 100644 --- a/src/pages/master/sparepart/component/SparepartCardList.jsx +++ b/src/pages/master/sparepart/component/SparepartCardList.jsx @@ -46,13 +46,10 @@ const SparepartCardList = ({ setLoadingQuantities((prev) => ({ ...prev, [item.sparepart_id]: true })); - // sparepart_qty disimpan sebagai angka kuantitas - // sparepart_stok ditentukan otomatis berdasarkan qty - // Untuk menghindari error validasi, jika newQty 0, kita tetap kirim 1 ke backend tapi statusnya "Not Available" - const actualQty = newQty > 0 ? newQty : 1; // Kirim minimal 1 ke backend + // sparepart_qty disimpan sebagai angka kuantitas (update boleh 0 sesuai validasi update schema) const payload = { - sparepart_qty: actualQty, - sparepart_stok: newQty > 0 ? 'Available' : 'Not Available', // Otomatis tentukan status berdasarkan newQty asli + sparepart_qty: newQty, + sparepart_stok: newQty > 0 ? 'Available' : 'Not Available', // Otomatis tentukan status }; // Hanya tambahkan field jika nilainya tidak kosong untuk menghindari validasi error