From 8e1c1e2210e46dc8bd9521cab0aa43d077989f7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andra=CC=81s=20Pozsgai?= Date: Fri, 22 May 2026 13:25:30 +0200 Subject: [PATCH 1/4] feat: lockView url parameter --- packages/webui/src/client/ui/RundownView.tsx | 6 +++++- .../RundownHeader/RundownContextMenu.tsx | 10 ++++++++-- .../RundownHeader/RundownHeader.scss | 7 ++++++- .../RundownHeader/RundownHeader.tsx | 18 +++++++++++++++--- 4 files changed, 34 insertions(+), 7 deletions(-) diff --git a/packages/webui/src/client/ui/RundownView.tsx b/packages/webui/src/client/ui/RundownView.tsx index f84ed7f11d..35ef8f0da0 100644 --- a/packages/webui/src/client/ui/RundownView.tsx +++ b/packages/webui/src/client/ui/RundownView.tsx @@ -288,6 +288,7 @@ export function RundownView(props: Readonly): JSX.Element { ) const hideRundownHeader = params['hideRundownHeader'] === '1' + const lockView = props.inActiveRundownView && params['lockView'] === '1' return (
): JSX.Element { uiSegmentMap={miniShelfData.uiSegmentMap} miniShelfFilter={miniShelfData.miniShelfFilter} hideRundownHeader={hideRundownHeader} + lockView={lockView} />
) @@ -323,6 +325,7 @@ interface IPropsWithReady extends IProps { subsReady: boolean userPermissions: Readonly hideRundownHeader?: boolean + lockView?: boolean } interface IRundownViewContentSnapshot { @@ -1410,6 +1413,7 @@ const RundownViewContent = translateWithTracker )} @@ -1516,7 +1520,7 @@ const RundownViewContent = translateWithTracker {this.props.userPermissions.studio && ( )} diff --git a/packages/webui/src/client/ui/RundownView/RundownHeader/RundownContextMenu.tsx b/packages/webui/src/client/ui/RundownView/RundownHeader/RundownContextMenu.tsx index 137bad1312..96ad5a138f 100644 --- a/packages/webui/src/client/ui/RundownView/RundownHeader/RundownContextMenu.tsx +++ b/packages/webui/src/client/ui/RundownView/RundownHeader/RundownContextMenu.tsx @@ -26,6 +26,7 @@ interface RundownContextMenuProps { playlist: DBRundownPlaylist studio: UIStudio firstRundown: Rundown | undefined + lockView?: boolean onShow?: () => void onHide?: () => void } @@ -39,6 +40,7 @@ export function RundownContextMenu({ playlist, studio, firstRundown, + lockView, onShow, onHide, }: Readonly): JSX.Element { @@ -133,8 +135,12 @@ export function RundownContextMenu({ })} {t('Store Snapshot')} - - history.push('/')}>{t('Close Rundown')} + {!lockView && ( + <> + + history.push('/')}>{t('Close Rundown')} + + )} ) : ( diff --git a/packages/webui/src/client/ui/RundownView/RundownHeader/RundownHeader.scss b/packages/webui/src/client/ui/RundownView/RundownHeader/RundownHeader.scss index 41ab77e042..0ed5bea210 100644 --- a/packages/webui/src/client/ui/RundownView/RundownHeader/RundownHeader.scss +++ b/packages/webui/src/client/ui/RundownView/RundownHeader/RundownHeader.scss @@ -536,6 +536,11 @@ flex-shrink: 0; transition: opacity 0.2s; + &--placeholder { + visibility: hidden; + pointer-events: none; + } + svg, i { filter: drop-shadow(0 0 0 rgba(255, 255, 255, 0)); @@ -578,7 +583,7 @@ color: #fff; } - .rundown-header__close-btn { + .rundown-header__close-btn:not(.rundown-header__close-btn--placeholder) { opacity: 1; } diff --git a/packages/webui/src/client/ui/RundownView/RundownHeader/RundownHeader.tsx b/packages/webui/src/client/ui/RundownView/RundownHeader/RundownHeader.tsx index dc7414a8d0..bb50b07435 100644 --- a/packages/webui/src/client/ui/RundownView/RundownHeader/RundownHeader.tsx +++ b/packages/webui/src/client/ui/RundownView/RundownHeader/RundownHeader.tsx @@ -27,6 +27,7 @@ interface IRundownHeaderProps { studio: UIStudio firstRundown: Rundown | undefined rundownCount: number + lockView?: boolean } export function RundownHeader({ @@ -35,6 +36,7 @@ export function RundownHeader({ firstRundown, currentRundown, rundownCount, + lockView, }: IRundownHeaderProps): JSX.Element { const { t } = useTranslation() const timingDurations = useTiming() @@ -80,6 +82,7 @@ export function RundownHeader({ playlist={playlist} studio={studio} firstRundown={firstRundown} + lockView={lockView} onShow={() => setIsContextMenuOpen(true)} onHide={() => { setIsMenuOpen(false) @@ -157,9 +160,18 @@ export function RundownHeader({ - - - + {lockView ? ( + + ) : ( + + + + )} From 590a33f34a15549dcad2bead146a2d2464d45199 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andra=CC=81s=20Pozsgai?= Date: Fri, 22 May 2026 13:32:27 +0200 Subject: [PATCH 2/4] feat: display the studio screensaver instead of allowing the user to return to the lobby --- packages/webui/src/client/ui/ActiveRundownView.tsx | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/webui/src/client/ui/ActiveRundownView.tsx b/packages/webui/src/client/ui/ActiveRundownView.tsx index 11b0f9203c..5130978115 100644 --- a/packages/webui/src/client/ui/ActiveRundownView.tsx +++ b/packages/webui/src/client/ui/ActiveRundownView.tsx @@ -1,8 +1,10 @@ -import { NavLink, Route, Switch, useRouteMatch } from 'react-router-dom' +import { NavLink, Route, Switch, useLocation, useRouteMatch } from 'react-router-dom' +import { parse as queryStringParse } from 'query-string' import { useSubscription, useTracker } from '../lib/ReactMeteorData/ReactMeteorData.js' import { Spinner } from '../lib/Spinner.js' import { RundownView } from './RundownView.js' +import { StudioScreenSaver } from './StudioScreenSaver/StudioScreenSaver.js' import { MeteorPubSub } from '@sofie-automation/meteor-lib/dist/api/pubsub' import { UIStudios } from './Collections.js' import type { StudioId } from '@sofie-automation/corelib/dist/dataModel/Ids' @@ -14,6 +16,8 @@ export function ActiveRundownView({ studioId }: Readonly<{ studioId: StudioId }> const { t } = useTranslation() const { path } = useRouteMatch() + const { search } = useLocation() + const lockView = queryStringParse(search)['lockView'] === '1' const studioReady = useSubscription(MeteorPubSub.uiStudio, studioId) const playlistReady = useSubscription(MeteorPubSub.rundownPlaylistForStudio, studioId, true) @@ -48,6 +52,9 @@ export function ActiveRundownView({ studioId }: Readonly<{ studioId: StudioId }> ) } else if (studio) { + if (lockView) { + return + } return } else if (studioId) { return From b7e8af4e751ac09bb30c4c410ae410746b588aa9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andra=CC=81s=20Pozsgai?= Date: Fri, 22 May 2026 13:42:24 +0200 Subject: [PATCH 3/4] fix: lint --- .../client/ui/RundownView/RundownHeader/RundownHeader.tsx | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/webui/src/client/ui/RundownView/RundownHeader/RundownHeader.tsx b/packages/webui/src/client/ui/RundownView/RundownHeader/RundownHeader.tsx index bb50b07435..8f3f5539ec 100644 --- a/packages/webui/src/client/ui/RundownView/RundownHeader/RundownHeader.tsx +++ b/packages/webui/src/client/ui/RundownView/RundownHeader/RundownHeader.tsx @@ -161,10 +161,7 @@ export function RundownHeader({ {lockView ? ( -