import React, { useState, useEffect } from 'react'; import { Card, Row, Col, Typography, Tag, Space, Spin, Button, Empty, message } from 'antd'; import { SearchOutlined } from '@ant-design/icons'; import { getAllSparepart } from '../../../../api/sparepart'; import { addSparepartToBrand, removeSparepartFromBrand } from '../../../../api/master-brand'; import CustomSparepartCard from './CustomSparepartCard'; const { Text, Title } = Typography; const SparepartCardSelect = ({ selectedSparepartIds = [], onSparepartChange, isLoading: externalLoading = false, isReadOnly = false, brandId = null }) => { const [spareparts, setSpareparts] = useState([]); const [loading, setLoading] = useState(false); const [searchTerm, setSearchTerm] = useState(''); useEffect(() => { loadSpareparts(); }, []); const loadSpareparts = async () => { setLoading(true); try { const params = new URLSearchParams(); params.set('limit', '1000'); // Get all spareparts const response = await getAllSparepart(params); if (response && (response.statusCode === 200 || response.data)) { const sparepartData = response.data?.data || response.data || []; setSpareparts(sparepartData); } else { // For demo purposes, use mock data if API fails setSpareparts([ { sparepart_id: 1, sparepart_name: 'Compressor Oil Filter', sparepart_description: 'Oil filter for compressor', sparepart_foto: null, sparepart_code: 'SP-001', sparepart_merk: 'Brand A', sparepart_model: 'Model X' }, { sparepart_id: 2, sparepart_name: 'Air Intake Filter', sparepart_description: 'Air intake filter', sparepart_foto: null, sparepart_code: 'SP-002', sparepart_merk: 'Brand B', sparepart_model: 'Model Y' }, { sparepart_id: 3, sparepart_name: 'Cooling Fan Motor', sparepart_description: 'Motor for cooling fan', sparepart_foto: null, sparepart_code: 'SP-003', sparepart_merk: 'Brand C', sparepart_model: 'Model Z' }, ]); } } catch (error) { // Default mock data setSpareparts([ { sparepart_id: 1, sparepart_name: 'Compressor Oil Filter', sparepart_description: 'Oil filter for compressor', sparepart_foto: null, sparepart_code: 'SP-001', sparepart_merk: 'Brand A', sparepart_model: 'Model X' }, { sparepart_id: 2, sparepart_name: 'Air Intake Filter', sparepart_description: 'Air intake filter', sparepart_foto: null, sparepart_code: 'SP-002', sparepart_merk: 'Brand B', sparepart_model: 'Model Y' }, { sparepart_id: 3, sparepart_name: 'Cooling Fan Motor', sparepart_description: 'Motor for cooling fan', sparepart_foto: null, sparepart_code: 'SP-003', sparepart_merk: 'Brand C', sparepart_model: 'Model Z' }, ]); } finally { setLoading(false); } }; const filteredSpareparts = spareparts.filter(sp => sp.sparepart_name.toLowerCase().includes(searchTerm.toLowerCase()) || sp.sparepart_code.toLowerCase().includes(searchTerm.toLowerCase()) || sp.sparepart_merk?.toLowerCase().includes(searchTerm.toLowerCase()) || sp.sparepart_model?.toLowerCase().includes(searchTerm.toLowerCase()) ); const handleSparepartToggle = async (sparepartId) => { if (isReadOnly) return; const isCurrentlySelected = selectedSparepartIds.includes(sparepartId); // If brandId is provided, save immediately to database if (brandId) { try { setLoading(true); if (isCurrentlySelected) { // Remove from database await removeSparepartFromBrand(brandId, sparepartId); message.success('Sparepart removed from brand successfully'); } else { // Add to database await addSparepartToBrand(brandId, sparepartId); message.success('Sparepart added to brand successfully'); } // Update local state const newSelectedIds = isCurrentlySelected ? selectedSparepartIds.filter(id => id !== sparepartId) : [...selectedSparepartIds, sparepartId]; onSparepartChange(newSelectedIds); } catch (error) { message.error(error.message || 'Failed to update sparepart'); } finally { setLoading(false); } } else { // If no brandId (add mode), just update local state const newSelectedIds = isCurrentlySelected ? selectedSparepartIds.filter(id => id !== sparepartId) : [...selectedSparepartIds, sparepartId]; onSparepartChange(newSelectedIds); } }; const isSelected = (sparepartId) => selectedSparepartIds.includes(sparepartId); const combinedLoading = loading || externalLoading; return (
Select Spareparts
setSearchTerm(e.target.value)} style={{ padding: '8px 30px 8px 12px', border: '1px solid #d9d9d9', borderRadius: '6px', width: '100%' }} />
{combinedLoading ? (
) : filteredSpareparts.length === 0 ? ( ) : ( {filteredSpareparts.map(sparepart => ( handleSparepartToggle(sparepart.sparepart_id)} onDelete={() => { // When delete button is clicked, remove from selection const newSelectedIds = selectedSparepartIds.filter(id => id !== sparepart.sparepart_id); onSparepartChange(newSelectedIds); // Also remove from database if brandId exists if (brandId) { removeSparepartFromBrand(brandId, sparepart.sparepart_id) .then(() => message.success('Sparepart removed successfully')) .catch(error => message.error(error.message || 'Failed to remove sparepart')); } }} /> ))} )} {selectedSparepartIds.length > 0 && (
Selected Spareparts: {selectedSparepartIds.map(id => { const sparepart = spareparts.find(sp => sp.sparepart_id === id); return sparepart ? ( {sparepart.sparepart_name} (ID: {id}) ) : ( Sparepart ID: {id} ); })}
)}
); }; export default SparepartCardSelect;