diff --git a/client/src/features/editors/list/EventListItem.jsx b/client/src/features/editors/list/EventListItem.jsx index 664835890..e5628b204 100644 --- a/client/src/features/editors/list/EventListItem.jsx +++ b/client/src/features/editors/list/EventListItem.jsx @@ -18,7 +18,7 @@ import { showErrorToast } from '../../../common/helpers/toastManager'; import style from './List.module.css'; export default function EventListItem(props) { - const { data, selected, delay, index, eventsHandler, updateData } = props; + const { data, selected, delay, index, eventsHandler } = props; const [more, setMore] = useState(false); const [timeStart, setTimeStart] = useState(0); @@ -34,10 +34,10 @@ export default function EventListItem(props) { // validate field if (field in data) { // create object with new field - const newData = { ...data, [field]: value }; + const newData = { id: data.id, [field]: value }; // request update in parent - updateData(index, newData); + eventsHandler('patch', newData); } else { showErrorToast('Field Error: ' + field); } diff --git a/server/controllers/eventsController.js b/server/controllers/eventsController.js index 49b55f289..f95fe91b3 100644 --- a/server/controllers/eventsController.js +++ b/server/controllers/eventsController.js @@ -34,53 +34,53 @@ exports.eventsGetById = async (req, res) => { // Returns - exports.eventsPost = async (req, res) => { // TODO: Validate event - if (req.body) { - // ensure structure - let newEvent = {}; - req.body.id = nanoid(10); - - switch (req.body.type) { - case 'event': - newEvent = { ...eventDefs.event, ...req.body }; - break; - case 'delay': - newEvent = { ...eventDefs.delay, ...req.body }; - break; - case 'block': - newEvent = { ...eventDefs.block, ...req.body }; - break; - - default: - res.sendStatus(400); - break; - } - - // Torbjorn: hmmmmmmm, can we look here? - if (newEvent.order <= 0) { - newEvent.order = 0; - // insert at top - events.forEach((e) => { - e.order = e.order + 1; - }); - events = [newEvent, ...events]; - } else if (newEvent.order >= events.length) { - newEvent.order = events.length; - events = [...events, newEvent]; - } else { - let before = events.slice(0, newEvent.order); - let after = events.slice(newEvent.order); - // move all items one element down, starting from new position - after.forEach((e) => { - e.order = e.order + 1; - }); - events = [...before, newEvent, ...after]; - } - console.log('added', events); - res.sendStatus(201); - } else { - console.log('nothing to add', req.body); + if (!req.body) { res.sendStatus(400); + return; } + + // ensure structure + let newEvent = {}; + req.body.id = nanoid(10); + + switch (req.body.type) { + case 'event': + newEvent = { ...eventDefs.event, ...req.body }; + break; + case 'delay': + newEvent = { ...eventDefs.delay, ...req.body }; + break; + case 'block': + newEvent = { ...eventDefs.block, ...req.body }; + break; + + default: + res.sendStatus(400); + break; + } + + // Torbjorn: hmmmmmmm, can we look here? + if (newEvent.order <= 0) { + newEvent.order = 0; + // insert at top + events.forEach((e) => { + e.order = e.order + 1; + }); + events = [newEvent, ...events]; + } else if (newEvent.order >= events.length) { + newEvent.order = events.length; + events = [...events, newEvent]; + } else { + let before = events.slice(0, newEvent.order); + let after = events.slice(newEvent.order); + // move all items one element down, starting from new position + after.forEach((e) => { + e.order = e.order + 1; + }); + events = [...before, newEvent, ...after]; + } + console.log('added', events); + res.sendStatus(201); }; // Create controller for PUT request to '/events/:id' @@ -88,12 +88,40 @@ exports.eventsPost = async (req, res) => { exports.eventsPut = async (req, res) => { const itemIndex = events.findIndex((e) => e.id == req.body.id); - if (!itemIndex) res.sendStatus(400); + // Item with index not found + if (itemIndex === -1) { + res.sendStatus(400); + return; + } + + // Torbjorn: bad syntax? const newEvents = replaceAt(events, itemIndex, req.body); events = [...newEvents]; res.sendStatus(200); }; +// Create controller for PATCH request to '/events/:id' +// Returns - +exports.eventsPatch = async (req, res) => { + const itemIndex = events.findIndex((e) => e.id == req.body.id); + + // Item with index not found + if (itemIndex === -1) { + res.sendStatus(400); + return; + } + + // Get current object + const eventToUpdate = events[itemIndex]; + + // Update and replace + const updatedEvent = { ...eventToUpdate, ...req.body }; + const newEvents = replaceAt(events, itemIndex, updatedEvent); + + events = [...newEvents]; + res.sendStatus(200); +}; + // Create controller for DELETE request to '/events/' // Returns - exports.eventsDelete = async (req, res) => { @@ -103,8 +131,6 @@ exports.eventsDelete = async (req, res) => { const itemIndex = events.findIndex((e) => e.id == req.params.id); - console.log('found at index', itemIndex); - // Torbjorn: this syntax is very bad if (itemIndex === -1) { res.sendStatus(400); diff --git a/server/routes/eventsRouter.js b/server/routes/eventsRouter.js index 15357ea33..11f16b030 100644 --- a/server/routes/eventsRouter.js +++ b/server/routes/eventsRouter.js @@ -19,6 +19,9 @@ router.post('/', eventsController.eventsPost); // create route between controller and '/events/:id' endpoint router.put('/', eventsController.eventsPut); +// create route between controller and '/events/:id' endpoint +router.patch('/', eventsController.eventsPatch); + // create route between controller and '/events/:id' endpoint router.delete('/:id', eventsController.eventsDelete);