diff --git a/app-backend/src/controllers/shift.controller.js b/app-backend/src/controllers/shift.controller.js index 02716c9ef..56cfb0646 100644 --- a/app-backend/src/controllers/shift.controller.js +++ b/app-backend/src/controllers/shift.controller.js @@ -347,7 +347,7 @@ export const updateShift = async (req, res) => { } const updates = {}; - const { title, date, startTime, endTime, payRate, urgency, field, location, description, requirements } = req.body; + const { title, date, startTime, endTime, payRate, urgency, field, location, description, requirements, status } = req.body; if (title !== undefined) { if (typeof title !== 'string' || title.trim().length < 3) { @@ -433,11 +433,11 @@ export const updateShift = async (req, res) => { updates.location = loc; } if (status !== undefined) { - const allowedStatuses = ['draft', 'open']; + const allowedStatuses = ['draft', 'open', 'applied', 'assigned', 'completed']; if (!allowedStatuses.includes(status)) { return res.status(400).json({ - message: 'Invalid status. Allowed: draft, open' + message: 'Invalid status. Allowed: draft, open, applied, assigned, completed' }); } @@ -451,7 +451,10 @@ export const updateShift = async (req, res) => { // allowed transitions const allowedTransitions = { draft: ['open'], - open: ['draft'], + open: ['draft', 'applied', 'assigned'], + applied: ['open', 'assigned'], + assigned: ['completed', 'open'], + completed: [], }; if (!allowedTransitions[current]?.includes(status)) { diff --git a/app-frontend/employer-panel/src/pages/ManageShift.js b/app-frontend/employer-panel/src/pages/ManageShift.js index 2646dae4e..878966e14 100644 --- a/app-frontend/employer-panel/src/pages/ManageShift.js +++ b/app-frontend/employer-panel/src/pages/ManageShift.js @@ -10,6 +10,14 @@ const statusDisplayMap = { open: 'Open', }; +// Map display status back to backend status +const displayToBackendStatusMap = { + 'Completed': 'completed', + 'In Progress': 'assigned', + 'Pending': 'applied', + 'Open': 'open', +}; + const Filter = Object.freeze({ All: 'All', Completed: 'Completed', @@ -63,7 +71,6 @@ const ManageShift = () => { const [saving, setSaving] = useState(false); const [feedback, setFeedback] = useState(''); const [formErrors, setFormErrors] = useState({}); - const [optimisticSnapshot, setOptimisticSnapshot] = useState(null); const [activeTab, setActiveTab] = useState(TABS.DETAILS); const [applicantAction, setApplicantAction] = useState({}); const itemsPerPage = 9; @@ -316,12 +323,8 @@ const ManageShift = () => { ...(detailForm.field?.trim() ? { field: detailForm.field.trim() } : {}), urgency: detailForm.urgency, ...(hasLocation ? { location: cleanedLocation } : {}), + status: displayToBackendStatusMap[detailForm.status] || detailForm.status, }; - setOptimisticSnapshot({ shifts, selectedShift }); - const optimistic = { ...selectedShift, ...payload, status: detailForm.status }; - setShifts((prev) => - prev.map((s) => (s.id === selectedShift.id ? { ...s, ...optimistic } : s)) - ); const { data } = await http.patch(`/shifts/${selectedShift.id}`, payload); const updated = normalizeShift(data.shift || { ...selectedShift, ...payload }); const updatedWithUiStatus = { ...updated, status: detailForm.status }; @@ -348,10 +351,6 @@ const ManageShift = () => { } catch (err) { const message = err?.response?.data?.message || 'Failed to update shift'; setFeedback(message); - if (optimisticSnapshot) { - setShifts(optimisticSnapshot.shifts); - setSelectedShift(optimisticSnapshot.selectedShift); - } } finally { setSaving(false); }