mirror of
https://github.com/cpvalente/ontime.git
synced 2026-09-12 01:29:35 +00:00
refactor: generalise event editor
This commit is contained in:
committed by
Carlos Valente
parent
ec823e0095
commit
8116b169b2
@@ -7,7 +7,7 @@ import { handleLinks } from '../../common/utils/linkUtils';
|
|||||||
import { cx } from '../../common/utils/styleUtils';
|
import { cx } from '../../common/utils/styleUtils';
|
||||||
import { Corner } from '../editors/editor-utils/EditorUtils';
|
import { Corner } from '../editors/editor-utils/EditorUtils';
|
||||||
|
|
||||||
import EventEditor from './event-editor/EventEditor';
|
import RundownEventEditor from './event-editor/RundownEventEditor';
|
||||||
import RundownWrapper from './RundownWrapper';
|
import RundownWrapper from './RundownWrapper';
|
||||||
|
|
||||||
import style from './RundownExport.module.scss';
|
import style from './RundownExport.module.scss';
|
||||||
@@ -33,7 +33,7 @@ const RundownExport = () => {
|
|||||||
{!hideSideBar && (
|
{!hideSideBar && (
|
||||||
<div className={style.side}>
|
<div className={style.side}>
|
||||||
<ErrorBoundary>
|
<ErrorBoundary>
|
||||||
<EventEditor />
|
<RundownEventEditor />
|
||||||
</ErrorBoundary>
|
</ErrorBoundary>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -0,0 +1,44 @@
|
|||||||
|
import { useEffect, useState } from 'react';
|
||||||
|
import { isOntimeEvent, OntimeEvent } from 'ontime-types';
|
||||||
|
|
||||||
|
import useRundown from '../../../common/hooks-query/useRundown';
|
||||||
|
|
||||||
|
import EventEditor from './EventEditor';
|
||||||
|
|
||||||
|
import style from './EventEditor.module.scss';
|
||||||
|
|
||||||
|
interface CuesheetEventEditorProps {
|
||||||
|
eventId: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function CuesheetEventEditor(props: CuesheetEventEditorProps) {
|
||||||
|
const { eventId } = props;
|
||||||
|
const { data } = useRundown();
|
||||||
|
const { order, rundown } = data;
|
||||||
|
|
||||||
|
const [event, setEvent] = useState<OntimeEvent | null>(null);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (order.length === 0) {
|
||||||
|
setEvent(null);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const event = rundown[eventId];
|
||||||
|
if (event && isOntimeEvent(event)) {
|
||||||
|
setEvent(event);
|
||||||
|
} else {
|
||||||
|
setEvent(null);
|
||||||
|
}
|
||||||
|
}, [data, eventId, order, rundown]);
|
||||||
|
|
||||||
|
if (!event) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className={style.eventEditor} data-testid='editor-container'>
|
||||||
|
<EventEditor event={event} />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
import { useEffect, useState } from 'react';
|
||||||
|
import { isOntimeEvent, OntimeEvent } from 'ontime-types';
|
||||||
|
|
||||||
|
import useRundown from '../../../common/hooks-query/useRundown';
|
||||||
|
import { useEventSelection } from '../useEventSelection';
|
||||||
|
|
||||||
|
import { EventEditorFooter } from './composite/EventEditorFooter';
|
||||||
|
import EventEditor from './EventEditor';
|
||||||
|
import EventEditorEmpty from './EventEditorEmpty';
|
||||||
|
|
||||||
|
import style from './EventEditor.module.scss';
|
||||||
|
|
||||||
|
export default function RundownEventEditor() {
|
||||||
|
const selectedEvents = useEventSelection((state) => state.selectedEvents);
|
||||||
|
const { data } = useRundown();
|
||||||
|
const { order, rundown } = data;
|
||||||
|
|
||||||
|
const [event, setEvent] = useState<OntimeEvent | null>(null);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (order.length === 0) {
|
||||||
|
setEvent(null);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const selectedEventId = order.find((eventId) => selectedEvents.has(eventId));
|
||||||
|
if (!selectedEventId) {
|
||||||
|
setEvent(null);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const event = rundown[selectedEventId];
|
||||||
|
|
||||||
|
if (event && isOntimeEvent(event)) {
|
||||||
|
setEvent(event);
|
||||||
|
} else {
|
||||||
|
setEvent(null);
|
||||||
|
}
|
||||||
|
}, [order, rundown, selectedEvents]);
|
||||||
|
|
||||||
|
if (!event) {
|
||||||
|
return <EventEditorEmpty />;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className={style.eventEditor} data-testid='editor-container'>
|
||||||
|
<EventEditor event={event} />
|
||||||
|
<EventEditorFooter id={event.id} cue={event.cue} />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
.footer {
|
||||||
|
border-top: 1px solid $white-10;
|
||||||
|
padding-top: 1rem;
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
gap: 0.5rem;
|
||||||
|
}
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
import { memo } from 'react';
|
||||||
|
|
||||||
|
import CopyTag from '../../../../common/components/copy-tag/CopyTag';
|
||||||
|
|
||||||
|
import style from './EventEditorFooter.module.scss';
|
||||||
|
|
||||||
|
interface EventEditorFooterProps {
|
||||||
|
id: string;
|
||||||
|
cue: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const EventEditorFooter = memo(_EventEditorFooter);
|
||||||
|
|
||||||
|
function _EventEditorFooter(props: EventEditorFooterProps) {
|
||||||
|
const { id, cue } = props;
|
||||||
|
|
||||||
|
const loadById = `/ontime/load/id "${id}"`;
|
||||||
|
const loadByCue = `/ontime/load/cue "${cue}"`;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className={style.footer}>
|
||||||
|
<CopyTag copyValue={loadById} label='OSC trigger by ID'>
|
||||||
|
{loadById}
|
||||||
|
</CopyTag>
|
||||||
|
<CopyTag copyValue={loadByCue} label='OSC trigger by cue'>
|
||||||
|
{loadByCue}
|
||||||
|
</CopyTag>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user