diff --git a/src/actions/bmdashboard/equipmentActions.js b/src/actions/bmdashboard/equipmentActions.js index d6d5550b30b..6266104ee10 100644 --- a/src/actions/bmdashboard/equipmentActions.js +++ b/src/actions/bmdashboard/equipmentActions.js @@ -34,14 +34,14 @@ export const setErrors = payload => { export const fetchEquipmentById = equipmentId => { const url = `${ENDPOINTS.BM_EQUIPMENT_BY_ID(equipmentId)}`; return async dispatch => { - axios - .get(url) - .then(res => { - dispatch(setEquipment(res.data)); - }) - .catch(error => { - dispatch(setErrors(error)); - }); + try { + const response = await axios.get(url); + dispatch(setEquipment(response.data)); + return response.data; + } catch (error) { + dispatch(setErrors(error)); + return { error }; + } }; }; @@ -119,9 +119,7 @@ export const updateEquipment = (equipmentId, updateData) => async (dispatch, get } if (!currentUserId) { - const errorMsg = 'User not authenticated. Please log in.'; - toast.error(errorMsg); - throw new Error(errorMsg); + throw new Error('User not authenticated. Please log in.'); } const statusUpdateData = { @@ -129,6 +127,7 @@ export const updateEquipment = (equipmentId, updateData) => async (dispatch, get lastUsedBy: updateData.lastUsedBy, lastUsedFor: updateData.lastUsedFor, replacementRequired: updateData.replacementRequired, + replacementReason: updateData.replacementReason || '', description: updateData.description || '', notes: updateData.notes || '', createdBy: currentUserId, @@ -137,7 +136,6 @@ export const updateEquipment = (equipmentId, updateData) => async (dispatch, get const res = await axios.put(url, statusUpdateData); dispatch(setEquipment(res.data)); - toast.success('Equipment status updated successfully!'); dispatch(fetchEquipmentById(equipmentId)); return res.data; @@ -157,7 +155,7 @@ export const updateEquipment = (equipmentId, updateData) => async (dispatch, get errorMessage = err.message; } - toast.error(errorMessage); + err.message = errorMessage; throw err; } }; diff --git a/src/components/BMDashboard/Equipment/List/EquipmentsTable.jsx b/src/components/BMDashboard/Equipment/List/EquipmentsTable.jsx index 230b90cecff..ff3a4361c1b 100644 --- a/src/components/BMDashboard/Equipment/List/EquipmentsTable.jsx +++ b/src/components/BMDashboard/Equipment/List/EquipmentsTable.jsx @@ -5,13 +5,14 @@ import { BiPencil } from 'react-icons/bi'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { faSortDown, faSortUp } from '@fortawesome/free-solid-svg-icons'; import ReactTooltip from 'react-tooltip'; -import { Link } from 'react-router-dom'; +import { Link, useHistory } from 'react-router-dom'; import { fetchAllEquipments } from '~/actions/bmdashboard/equipmentActions'; import EquipmentListModal from './EquipmentListModal'; import styles from './Equipments.module.css'; function EquipmentsTable({ equipment, project }) { const dispatch = useDispatch(); + const history = useHistory(); const equipments = useSelector(state => state.bmEquipments.equipmentslist); const [recordType, setRecordType] = useState(null); @@ -181,7 +182,7 @@ function EquipmentsTable({ equipment, project }) { - - - - - )} - {equipmentDetails && ( @@ -466,7 +565,38 @@ export default function UpdateEquipment() { )} -
+ + + +

Last Update Summary

+ {historyState.status === 'loading' && ( +

Loading equipment history…

+ )} + {historyState.status === 'error' && ( +

Equipment history could not be loaded.

+ )} + {historyState.status === 'loaded' && !hasStatusHistory && !hasUsageHistory && ( +

No previous status or usage history.

+ )} + {historyState.status === 'loaded' && (hasStatusHistory || hasUsageHistory) && ( +
+
Last update date
+
+ {latestSummaryUpdate?.date + ? formatHistoryDate(latestSummaryUpdate.date) + : 'Unknown'} +
+
Previous status/condition
+
{latestSummaryUpdate?.condition || 'Unknown'}
+
Last known user
+
{latestSummaryUser || 'Unknown'}
+
+ )} +
+ +
+ + @@ -549,11 +679,11 @@ export default function UpdateEquipment() { className={styles['custom-select']} > - - - - - + {STATUS_OPTIONS.map(option => ( + + ))} @@ -568,7 +698,10 @@ export default function UpdateEquipment() { name="lastUsedBy" id="lastUsedBy" value={lastUsedBy} - onChange={e => setLastUsedBy(e.target.value)} + onChange={e => { + editedHistoryFieldsRef.current.lastUsedBy = true; + setLastUsedBy(e.target.value); + }} required style={selectInputStyle} className={styles['custom-select']} @@ -578,6 +711,14 @@ export default function UpdateEquipment() { + {lastUsedBy && + ![ + 'Jane Doe (Volunteer #1)', + 'Jane Doe (Volunteer #2)', + 'Jane Doe (Volunteer #3)', + 'Jane Doe (Volunteer #4)', + 'other', + ].includes(lastUsedBy) && } {lastUsedBy === 'other' && ( @@ -608,7 +749,10 @@ export default function UpdateEquipment() { name="lastUsedFor" id="lastUsedFor" value={lastUsedFor} - onChange={e => setLastUsedFor(e.target.value)} + onChange={e => { + editedHistoryFieldsRef.current.lastUsedFor = true; + setLastUsedFor(e.target.value); + }} required style={selectInputStyle} className={styles['custom-select']} @@ -618,6 +762,14 @@ export default function UpdateEquipment() { + {lastUsedFor && + ![ + 'Kitchen - tiling', + 'Bathroom - plumbing', + 'Living room - painting', + 'Garden - landscaping', + 'other', + ].includes(lastUsedFor) && } {lastUsedFor === 'other' && ( @@ -652,15 +804,35 @@ export default function UpdateEquipment() { { label: 'No', value: 'no', id: 'replacementRequired-no' }, ]} value={replacementRequired} - onChange={e => setReplacementRequired(e.target.value)} + onChange={e => { + setReplacementRequired(e.target.value); + if (e.target.value !== 'yes') setReplacementReason(''); + }} required darkMode={darkMode} /> + {replacementRequired === 'yes' && ( + + + setReplacementReason(e.target.value)} + required + style={textInputStyle} + /> + + )} +