list basics

- populate list from events
- add
- remove
This commit is contained in:
cv
2021-03-26 22:22:10 +01:00
parent 9ec1e76750
commit 263e9e86b4
4 changed files with 110 additions and 31 deletions
+63 -15
View File
@@ -4,36 +4,84 @@ import { useContext } from 'react';
import { EventContext } from '../../../app/context/eventContext'; import { EventContext } from '../../../app/context/eventContext';
import { EventListContext } from '../../../app/context/eventListContext'; import { EventListContext } from '../../../app/context/eventListContext';
import EventListItem from './EventListItem'; import EventListItem from './EventListItem';
import { sortByNumber } from './listUtils'; import { sortByOrderVal } from './listUtils';
import style from './List.module.css'; import style from './List.module.css';
import DelayBlock from './DelayBlock'; import DelayBlock from './DelayBlock';
import BlockBlock from './BlockBlock'; import BlockBlock from './BlockBlock';
import { createEvent } from '@testing-library/dom';
export default function EventList(props) { export default function EventList(props) {
const [events] = useContext(EventListContext); const [events, setEvents] = useContext(EventListContext);
const [, setEvent] = useContext(EventContext); const [event, setEvent] = useContext(EventContext);
console.log('in el', events);
const selected = event?.id || -1;
const createEvent = (startPosition = 0) => {
// make an event
// TODO: Replace this with global def somewhere
// TODO: handle random ids better
let newEvent = {
id: Math.floor(Math.random()*10000000),
order: startPosition + 1,
title: '',
subtitle: '',
presenter: '',
timerStart: '',
timerEnd: '',
clockStarted: null,
timerDuration: 0,
};
// move all items one element down, starting from new position
let newEvents = events.map((e) => {
if (e.order > startPosition) e.order = e.order + 1;
return e;
});
// add an event at the beggining
newEvents = [newEvent, ...events];
// set to state
setEvents(newEvents);
};
const deleteEvent = (position) => {
// ?? SHould i reorder after?
// remove event from array
let filtered = events.filter((e) => e.id !== position);
// set to state
setEvents(filtered);
};
return ( return (
<> <>
<div className={style.headerButtons}> <div className={style.headerButtons}>
<Button size='sm' rightIcon={<AttachmentIcon />}> <Button size='sm' rightIcon={<AttachmentIcon />} disabled>
Upload Upload
</Button> </Button>
<Button size='sm' rightIcon={<DownloadIcon />}> <Button size='sm' rightIcon={<DownloadIcon />} disabled>
Download Download
</Button> </Button>
<IconButton size='sm' icon={<AddIcon />} colorScheme='blue' /> <IconButton
size='sm'
icon={<AddIcon />}
colorScheme='blue'
onClick={() => createEvent()}
/>
</div> </div>
<div className={style.eventContainer}> <div className={style.eventContainer}>
<EventListItem /> {sortByOrderVal(events).map((e) => (
<EventListItem
<EventListItem /> key={e.id}
<DelayBlock /> data={e}
selected={e.id === selected}
<EventListItem /> createEvent={createEvent}
<BlockBlock /> deleteEvent={deleteEvent}
/>
<EventListItem /> ))}
</div> </div>
</> </>
); );
+42 -12
View File
@@ -19,14 +19,30 @@ export default function EventListItem(props) {
const [more, setMore] = useState(false); const [more, setMore] = useState(false);
const [armed, setArmed] = useState(false); const [armed, setArmed] = useState(false);
const { data, selected, ...rest } = props;
return ( return (
<div className={armed ? style.eventRowActive : style.eventRow}> <div className={selected ? style.eventRowActive : style.eventRow}>
<div <div
className={armed ? style.armActive : style.arm} className={armed ? style.armActive : style.arm}
onClick={() => setArmed(!armed)} onClick={() => setArmed(!armed)}
/> />
<div className={style.time}> <div className={style.time}>
<Editable defaultValue='11:20' style={{ textAlign: 'center' }}> <Editable
defaultValue={data.timerStart}
placeholder='--:--'
style={{ textAlign: 'center' }}
>
<EditablePreview />
<EditableInput />
</Editable>
</div>
<div className={style.time}>
<Editable
defaultValue={data.timerEnd}
placeholder='--:--'
style={{ textAlign: 'center' }}
>
<EditablePreview /> <EditablePreview />
<EditableInput /> <EditableInput />
</Editable> </Editable>
@@ -37,31 +53,34 @@ export default function EventListItem(props) {
<div style={{ display: 'block' }}> <div style={{ display: 'block' }}>
<span className={style.detailedTitleUnderlined}>Title</span> <span className={style.detailedTitleUnderlined}>Title</span>
<Editable <Editable
defaultValue='Event Title' defaultValue={data.title}
placeholder='Add title'
style={{ display: 'inline' }} style={{ display: 'inline' }}
> >
<EditablePreview /> <EditablePreview />
<EditableInput style={{width:'15em'}} /> <EditableInput style={{ width: '13em' }} />
</Editable> </Editable>
</div> </div>
<div style={{ display: 'block' }}> <div style={{ display: 'block' }}>
<span className={style.detailedTitleUnderlined}>Subtitle</span> <span className={style.detailedTitleUnderlined}>Subtitle</span>
<Editable <Editable
defaultValue='Event Subtitle' defaultValue={data.subtitle}
placeholder='Add subtitle'
style={{ display: 'inline' }} style={{ display: 'inline' }}
> >
<EditablePreview /> <EditablePreview />
<EditableInput style={{width:'15em'}} /> <EditableInput style={{ width: '13em', minWidth: '13em' }} />
</Editable> </Editable>
</div> </div>
<div style={{ display: 'block' }}> <div style={{ display: 'block' }}>
<span className={style.detailedTitleUnderlined}>Presenter</span> <span className={style.detailedTitleUnderlined}>Presenter</span>
<Editable <Editable
defaultValue='Presenter Name' defaultValue={data.presenter}
placeholder='Add presenter name'
style={{ display: 'inline' }} style={{ display: 'inline' }}
> >
<EditablePreview style={{}} /> <EditablePreview style={{}} />
<EditableInput style={{width:'15em'}} /> <EditableInput style={{ width: '13em' }} />
</Editable> </Editable>
</div> </div>
</div> </div>
@@ -70,11 +89,12 @@ export default function EventListItem(props) {
<div> <div>
<span className={style.detailedTitle}>Title</span> <span className={style.detailedTitle}>Title</span>
<Editable <Editable
defaultValue='Event Title' defaultValue={data.title}
placeholder='Add title'
style={{ display: 'inline' }} style={{ display: 'inline' }}
> >
<EditablePreview /> <EditablePreview />
<EditableInput style={{width:'15em'}} /> <EditableInput style={{ width: '13em' }} />
</Editable> </Editable>
</div> </div>
</div> </div>
@@ -84,8 +104,18 @@ export default function EventListItem(props) {
</div> </div>
</div> </div>
<div className={style.actionOverlay}> <div className={style.actionOverlay}>
<IconButton size='xs' icon={<MinusIcon />} colorScheme='red' /> <IconButton
<IconButton size='xs' icon={<AddIcon />} colorScheme='blue' /> size='xs'
icon={<MinusIcon />}
colorScheme='red'
onClick={() => props.deleteEvent(data.id)}
/>
<IconButton
size='xs'
icon={<AddIcon />}
colorScheme='blue'
onClick={() => props.createEvent(data.order)}
/>
<IconButton size='xs' icon={<TimeIcon />} colorScheme='yellow' /> <IconButton size='xs' icon={<TimeIcon />} colorScheme='yellow' />
<IconButton size='xs' icon={<NotAllowedIcon />} colorScheme='purple' /> <IconButton size='xs' icon={<NotAllowedIcon />} colorScheme='purple' />
</div> </div>
+4 -3
View File
@@ -20,7 +20,7 @@
left: 0; left: 0;
width: 100%; width: 100%;
display: grid; display: grid;
grid-template-columns: 2em 5em 1fr auto; grid-template-columns: auto auto 5em 1fr auto;
gap: 0.5em; gap: 0.5em;
justify-content: center; justify-content: center;
align-content: center; align-content: center;
@@ -38,8 +38,8 @@
.arm, .arm,
.armActive { .armActive {
width: 20px; width: 18px;
height: 20px; height: 18px;
border-radius: 10px; border-radius: 10px;
cursor: pointer; cursor: pointer;
} }
@@ -96,6 +96,7 @@
color: #888; color: #888;
display: inline-block; display: inline-block;
width: 6em; width: 6em;
cursor: default;
} }
.detailedTitleUnderlined { .detailedTitleUnderlined {
+1 -1
View File
@@ -5,7 +5,7 @@ export const sortByDate = (arr) => {
return arr.sort(sorter); return arr.sort(sorter);
}; };
export const sortByNumber = (arr) => { export const sortByOrderVal = (arr) => {
const sorter = (a, b) => { const sorter = (a, b) => {
return a.order - b.order; return a.order - b.order;
}; };