mirror of
https://github.com/cpvalente/ontime.git
synced 2026-09-10 00:29:41 +00:00
list basics
- populate list from events - add - remove
This commit is contained in:
@@ -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>
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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;
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user