From 55c50f6f7fccb933fc65b9843c96d5ac25139aeb Mon Sep 17 00:00:00 2001 From: vinix Date: Thu, 27 Nov 2025 16:58:27 +0700 Subject: [PATCH] Refactor code structure for improved readability and maintainability --- public/assets/defaultSparepartImg.jpg | Bin 0 -> 17274 bytes .../sparepart/component/DetailSparepart.jsx | 40 ++++++++---- .../sparepart/component/SparepartCardList.jsx | 58 +++++++++++------- 3 files changed, 64 insertions(+), 34 deletions(-) create mode 100644 public/assets/defaultSparepartImg.jpg diff --git a/public/assets/defaultSparepartImg.jpg b/public/assets/defaultSparepartImg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4cf1f7cdeede7693ad76ea3bd317fe24ef3d7fcc GIT binary patch literal 17274 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 FHvz>qVbA~o literal 0 HcmV?d00001 diff --git a/src/pages/master/sparepart/component/DetailSparepart.jsx b/src/pages/master/sparepart/component/DetailSparepart.jsx index 91b4a3c..1d3db2e 100644 --- a/src/pages/master/sparepart/component/DetailSparepart.jsx +++ b/src/pages/master/sparepart/component/DetailSparepart.jsx @@ -193,26 +193,38 @@ const DetailSparepart = (props) => { // Gunakan URL gambar yang sebelumnya jika ada, atau kosongkan imageUrl = formData.sparepart_foto || ''; } - } else if (fileList.length === 0 && formData.sparepart_id) { - imageUrl = ''; + } else if (fileList.length === 0) { + // Jika tidak ada file di fileList (termasuk saat user menghapus file), gunakan gambar default + imageUrl = '/assets/defaultSparepartImg.jpg'; } - // Kirim semua field yang dianggap required oleh API, bahkan jika kosong + // Payload hanya berisi field yang tidak kosong untuk menghindari error validasi const payload = { sparepart_name: formData.sparepart_name, // Wajib - sparepart_description: formData.sparepart_description || '', // Diperlukan oleh API - sparepart_model: formData.sparepart_model || '', // Diperlukan oleh API - sparepart_item_type: formData.sparepart_item_type || '', // Diperlukan oleh API - sparepart_unit: formData.sparepart_unit || '', // Diperlukan oleh API - sparepart_merk: formData.sparepart_merk || '', // Diperlukan oleh API }; - // Tambahkan field-field yang tidak dianggap required jika ada nilainya + // Tambahkan field-field secara kondisional hanya jika nilainya tidak kosong + if (formData.sparepart_description && formData.sparepart_description.trim() !== '') { + payload.sparepart_description = formData.sparepart_description; + } + if (formData.sparepart_model && formData.sparepart_model.trim() !== '') { + payload.sparepart_model = formData.sparepart_model; + } + if (formData.sparepart_item_type && formData.sparepart_item_type.trim() !== '') { + payload.sparepart_item_type = formData.sparepart_item_type; + } + if (formData.sparepart_unit && formData.sparepart_unit.trim() !== '') { + payload.sparepart_unit = formData.sparepart_unit; + } + if (formData.sparepart_merk && formData.sparepart_merk.trim() !== '') { + payload.sparepart_merk = formData.sparepart_merk; + } if (formData.sparepart_stok && formData.sparepart_stok.trim() !== '') { payload.sparepart_stok = formData.sparepart_stok.toString(); } else { payload.sparepart_stok = '0'; // Set default value jika tidak diisi } + // Sertakan sparepart_foto hanya jika nilainya tidak kosong, agar tidak memicu validasi if (imageUrl && imageUrl.trim() !== '') { payload.sparepart_foto = imageUrl; } @@ -267,12 +279,18 @@ const DetailSparepart = (props) => { if (props.selectedData) { setFormData(props.selectedData); if (props.selectedData.sparepart_foto) { + // Buat URL lengkap dengan token untuk file yang sudah ada + 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)}` : ''}`; + setFileList([ { uid: '-1', - name: props.selectedData.sparepart_foto.split('/').pop(), + name: fileName, status: 'done', - url: props.selectedData.sparepart_foto, + url: fullUrl, }, ]); } else { diff --git a/src/pages/master/sparepart/component/SparepartCardList.jsx b/src/pages/master/sparepart/component/SparepartCardList.jsx index f632e70..97313f0 100644 --- a/src/pages/master/sparepart/component/SparepartCardList.jsx +++ b/src/pages/master/sparepart/component/SparepartCardList.jsx @@ -139,12 +139,10 @@ const SparepartCardList = ({ style={{ backgroundColor: '#f0f0f0', width: '100%', - padding: '8px', + paddingTop: '100%', /* Ini membuat tinggi sama dengan lebar (aspect ratio 1:1) */ + position: 'relative', borderRadius: '4px', - display: 'flex', - alignItems: 'center', - justifyContent: 'center', - aspectRatio: '1 / 1', + overflow: 'hidden', }} > {(() => { @@ -156,30 +154,44 @@ const SparepartCardList = ({ } else { // Gunakan format file URL seperti di brandDevice const fileName = item.sparepart_foto.split('/').pop(); - // Gunakan API getFileUrl untuk mendapatkan URL yang benar - const token = localStorage.getItem('token'); - const baseURL = import.meta.env.VITE_API_SERVER || ''; - imgSrc = `${baseURL}/file-uploads/images/${encodeURIComponent(fileName)}${token ? `?token=${encodeURIComponent(token)}` : ''}`; + + // Jika filename adalah default file, gunakan dari public assets + if (fileName === 'defaultSparepartImg.jpg') { + imgSrc = `/assets/defaultSparepartImg.jpg`; + } else { + // Gunakan API getFileUrl untuk mendapatkan URL yang benar untuk file upload + const token = localStorage.getItem('token'); + const baseURL = import.meta.env.VITE_API_SERVER || ''; + imgSrc = `${baseURL}/file-uploads/images/${encodeURIComponent(fileName)}${token ? `?token=${encodeURIComponent(token)}` : ''}`; + } } console.log('Image path being constructed:', imgSrc); } else { imgSrc = 'https://via.placeholder.com/150'; } return ( - {item[header]} { - console.error('Image failed to load:', imgSrc); - e.target.src = 'https://via.placeholder.com/150'; - }} - onLoad={() => console.log('Image loaded successfully:', imgSrc)} - /> +
+ {item[header]} { + console.error('Image failed to load:', imgSrc); + e.target.src = 'https://via.placeholder.com/150'; + }} + onLoad={() => console.log('Image loaded successfully:', imgSrc)} + /> +
); })()}