the rundown title list should also folow the runown selection

This commit is contained in:
alex-arc
2026-07-26 16:07:13 +02:00
parent 477777552c
commit 535717fa90
3 changed files with 68 additions and 38 deletions
@@ -1,8 +1,9 @@
import { isOntimeEvent, OntimeEvent } from 'ontime-types';
import { useMemo } from 'react'; import { useMemo } from 'react';
import { useRundownSelectionContext } from '../context/RundownSelectionContext'; import { useRundownSelectionContext } from '../context/RundownSelectionContext';
import { useSelectedEventId } from '../hooks/useSocket'; import { useSelectedEventId } from '../hooks/useSocket';
import { getFlatRundownMetadata, getRundownMetadata } from '../utils/rundownMetadata'; import { ExtendedEntry, getFlatRundownMetadata, getRundownMetadata } from '../utils/rundownMetadata';
import { useFlatRundown, useRundown } from './useRundown'; import { useFlatRundown, useRundown } from './useRundown';
export function useContextRundownEditModal() { export function useContextRundownEditModal() {
@@ -42,6 +43,27 @@ export function useContextRundownList() {
); );
} }
export function useContextRundownTitleList() {
'use memo';
const { effectiveRundownId, isLoadedRundown } = useRundownSelectionContext();
const loadedEventId = useSelectedEventId();
const effectiveSelectedEventId = isLoadedRundown ? loadedEventId : null;
const { data: rundown, status } = useRundown(effectiveRundownId);
const flatRundown = useMemo(() => {
const flatData = getFlatRundownMetadata(rundown, effectiveSelectedEventId);
return flatData.filter(isOntimeEvent) as ExtendedEntry<OntimeEvent>[];
}, [effectiveSelectedEventId, rundown]);
return useMemo(
() => ({
flatRundown,
status,
isLoadedRundown,
}),
[status, isLoadedRundown, flatRundown],
);
}
export function useContextRundownTable() { export function useContextRundownTable() {
'use memo'; 'use memo';
const { effectiveRundownId, isLoadedRundown } = useRundownSelectionContext(); const { effectiveRundownId, isLoadedRundown } = useRundownSelectionContext();
+43 -35
View File
@@ -1,5 +1,6 @@
import { lazy } from 'react'; import { lazy } from 'react';
import { RundownSelectionContextProvider } from '../../common/context/RundownSelectionContext';
import TrackingPlaybackBar from '../../features/control/playback/tracking-playback-bar/TrackingPlaybackBar'; import TrackingPlaybackBar from '../../features/control/playback/tracking-playback-bar/TrackingPlaybackBar';
import { AppMode } from '../../ontimeConfig'; import { AppMode } from '../../ontimeConfig';
import TitleList from './title-list/TitleList'; import TitleList from './title-list/TitleList';
@@ -14,44 +15,51 @@ const MessageControl = lazy(() => import('../../features/control/message/Message
export default function Editor() { export default function Editor() {
const { layoutMode } = useEditorLayout(); const { layoutMode } = useEditorLayout();
if (layoutMode === EditorLayoutMode.CONTROL) { switch (layoutMode) {
return ( case EditorLayoutMode.TRACKING: {
<div id='panels' className={styles.panelContainer}> return (
<div className={styles.left}> <div id='panels' className={`${styles.panelContainer} ${styles.panelContainerTracking}`}>
<TimerControl /> <div className={styles.rundownLayout}>
<MessageControl /> <div className={styles.titlesPanel}>
</div> <RundownSelectionContextProvider>
<Rundown /> <TitleList mode={AppMode.Run} />
</div> </RundownSelectionContextProvider>
); </div>
} <div className={styles.rundownPanel}>
<Rundown />
if (layoutMode === EditorLayoutMode.TRACKING) { </div>
return (
<div id='panels' className={`${styles.panelContainer} ${styles.panelContainerTracking}`}>
<div className={styles.rundownLayout}>
<div className={styles.titlesPanel}>
<TitleList mode={AppMode.Run} />
</div> </div>
<div className={styles.rundownPanel}> <TrackingPlaybackBar />
<Rundown /> </div>
);
}
case EditorLayoutMode.PLANNING: {
return (
<div id='panels' className={styles.panelContainer}>
<div className={styles.rundownLayout}>
<div className={styles.titlesPanel}>
<RundownSelectionContextProvider>
<TitleList mode={AppMode.Edit} />
</RundownSelectionContextProvider>
</div>
<div className={styles.rundownPanel}>
<Rundown />
</div>
</div> </div>
</div> </div>
<TrackingPlaybackBar /> );
</div> }
); case EditorLayoutMode.CONTROL:
} default: {
return (
return ( <div id='panels' className={styles.panelContainer}>
<div id='panels' className={styles.panelContainer}> <div className={styles.left}>
<div className={styles.rundownLayout}> <TimerControl />
<div className={styles.titlesPanel}> <MessageControl />
<TitleList mode={AppMode.Edit} /> </div>
</div>
<div className={styles.rundownPanel}>
<Rundown /> <Rundown />
</div> </div>
</div> );
</div> }
); }
} }
@@ -3,7 +3,7 @@ import { useCallback, useEffect, useMemo, useRef } from 'react';
import { Virtuoso, VirtuosoHandle } from 'react-virtuoso'; import { Virtuoso, VirtuosoHandle } from 'react-virtuoso';
import ScrollArea from '../../../common/components/scroll-area/ScrollArea'; import ScrollArea from '../../../common/components/scroll-area/ScrollArea';
import { useRundown } from '../../../common/hooks-query/useRundown'; import { useContextRundownList } from '../../../common/hooks-query/useContextRundown';
import { useSelectedEventId } from '../../../common/hooks/useSocket'; import { useSelectedEventId } from '../../../common/hooks/useSocket';
import { ExtendedEntry, getFlatRundownMetadata } from '../../../common/utils/rundownMetadata'; import { ExtendedEntry, getFlatRundownMetadata } from '../../../common/utils/rundownMetadata';
import { useEventSelection } from '../../../features/rundown/useEventSelection'; import { useEventSelection } from '../../../features/rundown/useEventSelection';
@@ -20,7 +20,7 @@ interface TitleListProps {
} }
export default function TitleList({ mode }: TitleListProps) { export default function TitleList({ mode }: TitleListProps) {
const { data: rundown } = useRundown(null); const { rundown } = useContextRundownList();
const selectedEventId = useSelectedEventId(); const selectedEventId = useSelectedEventId();
const cursor = useEventSelection((state) => state.cursor); const cursor = useEventSelection((state) => state.cursor);