refactor: allow secondary rundowns (#2086)

* refactor: allow secondary rundowns

* ui: move dropdown

* feat: follow loaded

* ui: background edit warning

ui: fix disable radio button

* feat(ui): add loaded sufix in the rundown list

* feat(ui): add direct link to background edit from rundown manager

* fix: better fallback

* fix: default to is isCurrentRundown for nav bar colour

* chore: rename navigate to cuesheet

---------

Co-authored-by: alex-arc <ac@omnivox.dk>
This commit is contained in:
Carlos Valente
2026-06-07 13:33:38 +02:00
committed by GitHub
parent 199dea5df6
commit 0e6d6cd416
33 changed files with 949 additions and 515 deletions
@@ -5,12 +5,33 @@ import { useCallback, useEffect, useMemo } from 'react';
import { sessionScope } from '../../externals';
import { AppMode, sessionKeys } from '../../ontimeConfig';
import { getCuesheetPermissionsPolicy } from './cuesheet.policies';
import type { CuesheetPermissions } from './useTablePermissions';
import { useCuesheetPermissions } from './useTablePermissions';
type CuesheetPolicyOptions = {
// Run mode is only meaningful for the loaded rundown — background rundowns force Edit.
canRunMode: boolean;
};
export function getEffectiveCuesheetMode(
permissions: Pick<CuesheetPermissions, 'canChangeMode'>,
storedMode: AppMode,
{ canRunMode }: CuesheetPolicyOptions,
) {
if (!permissions.canChangeMode) {
return AppMode.Run;
}
return canRunMode ? storedMode : AppMode.Edit;
}
/**
* Applies cuesheet permissions to shared state and exposes the effective mode for the UI.
*/
export function useApplyCuesheetPolicy(preset: URLPreset | undefined): {
export function useApplyCuesheetPolicy(
preset: URLPreset | undefined,
{ canRunMode }: CuesheetPolicyOptions,
): {
cuesheetMode: AppMode;
setCuesheetMode: (mode: AppMode) => void;
} {
@@ -26,16 +47,14 @@ export function useApplyCuesheetPolicy(preset: URLPreset | undefined): {
defaultValue: preset ? AppMode.Run : AppMode.Edit,
});
const cuesheetMode = permissions.canChangeMode ? storedCuesheetMode : AppMode.Run;
const cuesheetMode = getEffectiveCuesheetMode(permissions, storedCuesheetMode, { canRunMode });
const setCuesheetMode = useCallback(
(mode: AppMode) => {
if (!permissions.canChangeMode) {
return;
}
if (!permissions.canChangeMode || !canRunMode) return;
setStoredCuesheetMode(mode);
},
[permissions.canChangeMode, setStoredCuesheetMode],
[canRunMode, permissions.canChangeMode, setStoredCuesheetMode],
);
// Keep the shared permissions store aligned with the active preset policy.