feat: integrate sparepart management into AddBrandDevice and EditBrandDevice components
This commit is contained in:
@@ -1,115 +1,141 @@
|
||||
import { useState } from 'react';
|
||||
import { useState, useCallback } from 'react';
|
||||
|
||||
export const useSparepartLogic = (sparepartForm) => {
|
||||
const [sparepartFields, setSparepartFields] = useState([
|
||||
{ name: ['sparepart_items', 0], key: 0 }
|
||||
]);
|
||||
const [sparepartTypes, setSparepartTypes] = useState({ 0: 'required' });
|
||||
const [sparepartStatuses, setSparepartStatuses] = useState({ 0: true });
|
||||
|
||||
const handleAddSparepartField = () => {
|
||||
const newKey = Date.now(); // Use timestamp for unique key
|
||||
const newField = { name: ['sparepart_items', newKey], key: newKey };
|
||||
const [sparepartFields, setSparepartFields] = useState([]);
|
||||
const [sparepartTypes, setSparepartTypes] = useState({});
|
||||
const [sparepartStatuses, setSparepartStatuses] = useState({});
|
||||
const [sparepartsToDelete, setSparepartsToDelete] = useState(new Set());
|
||||
|
||||
const handleAddSparepartField = useCallback(() => {
|
||||
const newKey = Date.now();
|
||||
const newField = {
|
||||
key: newKey,
|
||||
name: sparepartFields.length,
|
||||
isCreated: true,
|
||||
};
|
||||
setSparepartFields(prev => [...prev, newField]);
|
||||
setSparepartTypes(prev => ({ ...prev, [newKey]: 'required' }));
|
||||
setSparepartStatuses(prev => ({ ...prev, [newKey]: true }));
|
||||
setSparepartTypes(prev => ({
|
||||
...prev,
|
||||
[newKey]: 'required'
|
||||
}));
|
||||
setSparepartStatuses(prev => ({
|
||||
...prev,
|
||||
[newKey]: true
|
||||
}));
|
||||
}, [sparepartFields.length]);
|
||||
|
||||
// Set default values for the new field
|
||||
setTimeout(() => {
|
||||
sparepartForm.setFieldValue(['sparepart_items', newKey, 'type'], 'required');
|
||||
sparepartForm.setFieldValue(['sparepart_items', newKey, 'quantity'], 1);
|
||||
}, 0);
|
||||
};
|
||||
const handleRemoveSparepartField = useCallback((key) => {
|
||||
setSparepartFields(prev => prev.filter(field => field.key !== key));
|
||||
setSparepartTypes(prev => {
|
||||
const newTypes = { ...prev };
|
||||
delete newTypes[key];
|
||||
return newTypes;
|
||||
});
|
||||
setSparepartStatuses(prev => {
|
||||
const newStatuses = { ...prev };
|
||||
delete newStatuses[key];
|
||||
return newStatuses;
|
||||
});
|
||||
|
||||
// Add to delete list if it's not a new field
|
||||
setSparepartsToDelete(prev => new Set([...prev, key]));
|
||||
}, []);
|
||||
|
||||
const handleRemoveSparepartField = (key) => {
|
||||
if (sparepartFields.length <= 1) {
|
||||
return; // Keep at least one sparepart field
|
||||
const handleSparepartTypeChange = useCallback((key, type) => {
|
||||
setSparepartTypes(prev => ({
|
||||
...prev,
|
||||
[key]: type
|
||||
}));
|
||||
}, []);
|
||||
|
||||
const handleSparepartStatusChange = useCallback((key, status) => {
|
||||
setSparepartStatuses(prev => ({
|
||||
...prev,
|
||||
[key]: status
|
||||
}));
|
||||
}, []);
|
||||
|
||||
const resetSparepartFields = useCallback(() => {
|
||||
setSparepartFields([]);
|
||||
setSparepartTypes({});
|
||||
setSparepartStatuses({});
|
||||
setSparepartsToDelete(new Set());
|
||||
}, []);
|
||||
|
||||
const getSparepartData = useCallback(() => {
|
||||
if (!sparepartForm) return [];
|
||||
|
||||
const values = sparepartForm.getFieldsValue();
|
||||
const data = [];
|
||||
|
||||
sparepartFields.forEach((field, index) => {
|
||||
const fieldData = {
|
||||
sparepart_id: values[`sparepart_id_${field.name}`],
|
||||
sparepart_name: values[`sparepart_name_${field.name}`],
|
||||
sparepart_description: values[`sparepart_description_${field.name}`],
|
||||
status: values[`sparepart_status_${field.name}`],
|
||||
type: sparepartTypes[field.key] || 'required',
|
||||
};
|
||||
|
||||
// Only add if required fields are filled
|
||||
if (fieldData.sparepart_id) {
|
||||
data.push(fieldData);
|
||||
}
|
||||
});
|
||||
|
||||
return data;
|
||||
}, [sparepartForm, sparepartFields, sparepartTypes]);
|
||||
|
||||
const setSparepartsForExistingRecord = useCallback((sparepartData, form) => {
|
||||
resetSparepartFields();
|
||||
|
||||
if (!sparepartData || !Array.isArray(sparepartData)) {
|
||||
return;
|
||||
}
|
||||
|
||||
setSparepartFields(prev => prev.filter(field => field.key !== key));
|
||||
|
||||
// Clean up type and status
|
||||
const newTypes = { ...sparepartTypes };
|
||||
const newStatuses = { ...sparepartStatuses };
|
||||
delete newTypes[key];
|
||||
delete newStatuses[key];
|
||||
|
||||
setSparepartTypes(newTypes);
|
||||
setSparepartStatuses(newStatuses);
|
||||
};
|
||||
|
||||
const handleSparepartTypeChange = (key, value) => {
|
||||
setSparepartTypes(prev => ({ ...prev, [key]: value }));
|
||||
};
|
||||
|
||||
const handleSparepartStatusChange = (key, value) => {
|
||||
setSparepartStatuses(prev => ({ ...prev, [key]: value }));
|
||||
};
|
||||
|
||||
const resetSparepartFields = () => {
|
||||
setSparepartFields([{ name: ['sparepart_items', 0], key: 0 }]);
|
||||
setSparepartTypes({ 0: 'required' });
|
||||
setSparepartStatuses({ 0: true });
|
||||
|
||||
// Reset form values
|
||||
sparepartForm.resetFields();
|
||||
sparepartForm.setFieldsValue({
|
||||
sparepart_status_0: true,
|
||||
sparepart_type_0: 'required',
|
||||
});
|
||||
};
|
||||
|
||||
const getSparepartData = () => {
|
||||
const values = sparepartForm.getFieldsValue();
|
||||
return sparepartFields.map(field => {
|
||||
const key = field.key;
|
||||
const sparepartPath = field.name.join(',');
|
||||
const sparepart = values[sparepartPath];
|
||||
|
||||
return sparepart && sparepart.name && sparepart.name.trim() !== '' ? {
|
||||
name: sparepart.name || '',
|
||||
description: sparepart.description || '',
|
||||
is_active: sparepart.status !== false,
|
||||
} : null;
|
||||
}).filter(Boolean);
|
||||
};
|
||||
|
||||
const setSparepartForExistingRecord = (spareparts, form) => {
|
||||
if (!spareparts || spareparts.length === 0) return;
|
||||
|
||||
const newFields = spareparts.map((sparepart, index) => ({
|
||||
name: ['sparepart_items', sparepart.id || index],
|
||||
key: sparepart.id || index
|
||||
const newFields = sparepartData.map((sp, index) => ({
|
||||
key: sp.brand_sparepart_id || sp.sparepart_id || `existing-${index}`,
|
||||
name: index,
|
||||
isCreated: false,
|
||||
}));
|
||||
|
||||
setSparepartFields(newFields);
|
||||
|
||||
// Set sparepart values
|
||||
const formValues = {};
|
||||
Object.keys(spareparts).forEach(index => {
|
||||
const key = spareparts[index].id || index;
|
||||
const sparepart = spareparts[index];
|
||||
formValues[`sparepart_items,${key}`] = {
|
||||
name: sparepart.name || '',
|
||||
description: sparepart.description || '',
|
||||
status: sparepart.is_active !== false,
|
||||
};
|
||||
});
|
||||
// Set form values for existing spareparts
|
||||
setTimeout(() => {
|
||||
const formValues = {};
|
||||
sparepartData.forEach((sp, index) => {
|
||||
const sparepartId = sp.brand_sparepart_id || sp.sparepart_id || sp.sparepart_name;
|
||||
formValues[`sparepart_id_${index}`] = sparepartId;
|
||||
formValues[`sparepart_status_${index}`] = sp.is_active ?? sp.status ?? true;
|
||||
formValues[`sparepart_description_${index}`] = sp.brand_sparepart_description || sp.description || sp.sparepart_name;
|
||||
|
||||
form.setFieldsValue(formValues);
|
||||
};
|
||||
setSparepartTypes(prev => ({
|
||||
...prev,
|
||||
[sp.brand_sparepart_id || sp.sparepart_id || `existing-${index}`]: sp.type || sp.sparepart_type || 'required'
|
||||
}));
|
||||
|
||||
setSparepartStatuses(prev => ({
|
||||
...prev,
|
||||
[sp.brand_sparepart_id || sp.sparepart_id || `existing-${index}`]: sp.is_active ?? sp.status ?? true
|
||||
}));
|
||||
});
|
||||
|
||||
form.setFieldsValue(formValues);
|
||||
}, 0);
|
||||
}, [resetSparepartFields]);
|
||||
|
||||
return {
|
||||
sparepartFields,
|
||||
sparepartTypes,
|
||||
sparepartStatuses,
|
||||
sparepartsToDelete,
|
||||
handleAddSparepartField,
|
||||
handleRemoveSparepartField,
|
||||
handleSparepartTypeChange,
|
||||
handleSparepartStatusChange,
|
||||
resetSparepartFields,
|
||||
getSparepartData,
|
||||
setSparepartForExistingRecord,
|
||||
setSparepartsForExistingRecord,
|
||||
};
|
||||
};
|
||||
Reference in New Issue
Block a user