From dd98867c7eb04803951d8ca8e9c5e943c40202d7 Mon Sep 17 00:00:00 2001 From: cv <34649812+cpvalente@users.noreply.github.com> Date: Sat, 27 Mar 2021 19:16:45 +0100 Subject: [PATCH] CRUD basics --- src/features/editors/list/EventList.jsx | 19 +- src/features/editors/list/EventListItem.jsx | 214 +++++++++++--------- src/features/editors/list/List.module.css | 5 +- 3 files changed, 139 insertions(+), 99 deletions(-) diff --git a/src/features/editors/list/EventList.jsx b/src/features/editors/list/EventList.jsx index dc31b808d..ebe91d014 100644 --- a/src/features/editors/list/EventList.jsx +++ b/src/features/editors/list/EventList.jsx @@ -22,7 +22,7 @@ export default function EventList(props) { // TODO: Replace this with global def somewhere // TODO: handle random ids better let newEvent = { - id: Math.floor(Math.random()*10000000), + id: Math.floor(Math.random() * 10000000), order: startPosition + 1, title: '', subtitle: '', @@ -47,7 +47,7 @@ export default function EventList(props) { }; const deleteEvent = (position) => { - // ?? SHould i reorder after? + // ?? Should i reorder after? // remove event from array let filtered = events.filter((e) => e.id !== position); @@ -56,6 +56,17 @@ export default function EventList(props) { setEvents(filtered); }; + const replaceAt = (array, index, value) => { + const ret = array.slice(0); + ret[index] = value; + return ret; + }; + + const updateData = (itemIndex, data) => { + const newEvents = replaceAt(events, itemIndex, data); + setEvents(newEvents); + }; + return ( <>
@@ -73,13 +84,15 @@ export default function EventList(props) { />
- {sortByOrderVal(events).map((e) => ( + {sortByOrderVal(events).map((e, index) => ( ))}
diff --git a/src/features/editors/list/EventListItem.jsx b/src/features/editors/list/EventListItem.jsx index e6a9ec473..e47ff575b 100644 --- a/src/features/editors/list/EventListItem.jsx +++ b/src/features/editors/list/EventListItem.jsx @@ -12,7 +12,7 @@ import { EditablePreview, EditableInput, } from '@chakra-ui/react'; -import { useState } from 'react'; +import { useEffect, useState } from 'react'; import style from './List.module.css'; export default function EventListItem(props) { @@ -21,104 +21,130 @@ export default function EventListItem(props) { const { data, selected, ...rest } = props; + const updateValues = (field, value) => { + // validate field + if (field in data) { + // create object with new field + const newData = { ...data, [field]: value }; + + // request update in parent + props.updateData(props.index, newData); + } else { + console.log('field error', field); + } + }; + return ( -
-
setArmed(!armed)} - /> -
- - - - -
-
- - - - -
-
- {more ? ( -
-
- Title - - - - +
+
+
setArmed(!armed)} + /> +
+ updateValues('timerStart', v)} + defaultValue={data.timerStart} + placeholder='--:--' + style={{ textAlign: 'center' }} + > + + + +
+
+ updateValues('timerEnd', v)} + defaultValue={data.timerEnd} + placeholder='--:--' + style={{ textAlign: 'center' }} + > + + + +
+
+ {more ? ( +
+
+ Title + updateValues('title', v)} + defaultValue={data.title} + placeholder='Add title' + style={{ display: 'inline' }} + > + + + +
+
+ Subtitle + updateValues('subtitle', v)} + defaultValue={data.subtitle} + placeholder='Add subtitle' + style={{ display: 'inline' }} + > + + + +
+
+ Presenter + updateValues('presenter', v)} + defaultValue={data.presenter} + placeholder='Add presenter name' + style={{ display: 'inline' }} + > + + + +
-
- Subtitle - - - - -
-
- Presenter - - - - + ) : ( +
+
+ Title + updateValues('title', v)} + defaultValue={data.title} + placeholder='Add title' + style={{ display: 'inline' }} + id='title' + > + + + +
+ )} +
setMore(!more)}> + {more ? : }
- ) : ( -
-
- Title - - - - -
-
- )} -
setMore(!more)}> - {more ? : } +
+
+ } + colorScheme='red' + onClick={() => props.deleteEvent(data.id)} + /> + } + colorScheme='blue' + onClick={() => props.createEvent(data.order)} + /> + } colorScheme='yellow' /> + } + colorScheme='purple' + />
-
- } - colorScheme='red' - onClick={() => props.deleteEvent(data.id)} - /> - } - colorScheme='blue' - onClick={() => props.createEvent(data.order)} - /> - } colorScheme='yellow' /> - } colorScheme='purple' /> -
-
+ ); } diff --git a/src/features/editors/list/List.module.css b/src/features/editors/list/List.module.css index c3ad5b549..4932b335a 100644 --- a/src/features/editors/list/List.module.css +++ b/src/features/editors/list/List.module.css @@ -24,8 +24,9 @@ gap: 0.5em; justify-content: center; align-content: center; - align-items: center; + align-items: baseline; border-radius: 8px; + font-size: 15px; } .eventRow { @@ -69,7 +70,7 @@ } .time { - width: 4em; + width: 5em; height: fit-content; }