diff --git a/public/assets/defaultSparepartImg.jpg b/public/assets/defaultSparepartImg.jpg
new file mode 100644
index 0000000..4cf1f7c
Binary files /dev/null and b/public/assets/defaultSparepartImg.jpg differ
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 (
- {
- console.error('Image failed to load:', imgSrc);
- e.target.src = 'https://via.placeholder.com/150';
- }}
- onLoad={() => console.log('Image loaded successfully:', imgSrc)}
- />
+