From b0daf75d72303bc54ded557ab113dceb80c19556 Mon Sep 17 00:00:00 2001 From: Julian Waller Date: Mon, 25 Nov 2024 13:59:48 +0000 Subject: [PATCH 1/2] feat: option to disable HOLD & direct play (#32) --- meteor/__mocks__/defaultCollectionObjects.ts | 2 + meteor/server/api/rest/v1/typeConversion.ts | 14 +++++-- meteor/server/api/studio/api.ts | 2 + meteor/server/lib/rest/v1/studios.ts | 3 ++ meteor/server/migration/0_1_0.ts | 2 + meteor/server/migration/X_X_X.ts | 37 +++++++++++++++++++ .../migration/__tests__/migrations.test.ts | 6 +++ .../__tests__/checkPieceContentStatus.test.ts | 4 +- .../checkPieceContentStatus.ts | 4 +- packages/corelib/src/dataModel/Studio.ts | 13 +++++++ .../src/__mocks__/defaultCollectionObjects.ts | 2 + .../src/blueprints/__tests__/config.test.ts | 4 ++ packages/job-worker/src/playout/adlibJobs.ts | 6 +++ packages/job-worker/src/playout/holdJobs.ts | 9 +++++ packages/openapi/api/definitions/studios.yaml | 9 +++++ .../src/__mocks__/defaultCollectionObjects.ts | 2 + packages/webui/src/client/ui/RundownView.tsx | 5 ++- .../src/client/ui/Settings/Studio/Generic.tsx | 28 ++++++++++++++ 18 files changed, 143 insertions(+), 9 deletions(-) diff --git a/meteor/__mocks__/defaultCollectionObjects.ts b/meteor/__mocks__/defaultCollectionObjects.ts index e254257340..4d2cf78382 100644 --- a/meteor/__mocks__/defaultCollectionObjects.ts +++ b/meteor/__mocks__/defaultCollectionObjects.ts @@ -110,6 +110,8 @@ export function defaultStudio(_id: StudioId): DBStudio { mediaPreviewsUrl: '', minimumTakeSpan: DEFAULT_MINIMUM_TAKE_SPAN, fallbackPartDuration: DEFAULT_FALLBACK_PART_DURATION, + allowHold: false, + allowPieceDirectPlay: false, }, _rundownVersionHash: '', routeSetsWithOverrides: wrapDefaultObject({}), diff --git a/meteor/server/api/rest/v1/typeConversion.ts b/meteor/server/api/rest/v1/typeConversion.ts index c6069f4506..f54e436b98 100644 --- a/meteor/server/api/rest/v1/typeConversion.ts +++ b/meteor/server/api/rest/v1/typeConversion.ts @@ -19,7 +19,7 @@ import { StudioId, } from '@sofie-automation/corelib/dist/dataModel/Ids' import { DBStudio, IStudioSettings } from '@sofie-automation/corelib/dist/dataModel/Studio' -import { assertNever, getRandomId, literal } from '@sofie-automation/corelib/dist/lib' +import { assertNever, Complete, getRandomId, literal } from '@sofie-automation/corelib/dist/lib' import { protectString, unprotectString } from '@sofie-automation/corelib/dist/protectedString' import { applyAndValidateOverrides, @@ -333,7 +333,7 @@ export async function studioFrom(apiStudio: APIStudio, existingId?: StudioId): P } } -export async function APIStudioFrom(studio: DBStudio): Promise { +export async function APIStudioFrom(studio: DBStudio): Promise> { const studioSettings = APIStudioSettingsFrom(studio.settings) return { @@ -346,7 +346,7 @@ export async function APIStudioFrom(studio: DBStudio): Promise { } } -export function studioSettingsFrom(apiStudioSettings: APIStudioSettings): IStudioSettings { +export function studioSettingsFrom(apiStudioSettings: APIStudioSettings): Complete { return { frameRate: apiStudioSettings.frameRate, mediaPreviewsUrl: apiStudioSettings.mediaPreviewsUrl, @@ -362,10 +362,13 @@ export function studioSettingsFrom(apiStudioSettings: APIStudioSettings): IStudi enableQuickLoop: apiStudioSettings.enableQuickLoop, forceQuickLoopAutoNext: forceQuickLoopAutoNextFrom(apiStudioSettings.forceQuickLoopAutoNext), fallbackPartDuration: apiStudioSettings.fallbackPartDuration ?? DEFAULT_FALLBACK_PART_DURATION, + allowAdlibTestingSegment: apiStudioSettings.allowAdlibTestingSegment, + allowHold: apiStudioSettings.allowHold ?? true, // Backwards compatible + allowPieceDirectPlay: apiStudioSettings.allowPieceDirectPlay ?? true, // Backwards compatible } } -export function APIStudioSettingsFrom(settings: IStudioSettings): APIStudioSettings { +export function APIStudioSettingsFrom(settings: IStudioSettings): Complete { return { frameRate: settings.frameRate, mediaPreviewsUrl: settings.mediaPreviewsUrl, @@ -381,6 +384,9 @@ export function APIStudioSettingsFrom(settings: IStudioSettings): APIStudioSetti enableQuickLoop: settings.enableQuickLoop, forceQuickLoopAutoNext: APIForceQuickLoopAutoNextFrom(settings.forceQuickLoopAutoNext), fallbackPartDuration: settings.fallbackPartDuration, + allowAdlibTestingSegment: settings.allowAdlibTestingSegment, + allowHold: settings.allowHold, + allowPieceDirectPlay: settings.allowPieceDirectPlay, } } diff --git a/meteor/server/api/studio/api.ts b/meteor/server/api/studio/api.ts index 70e7699f80..a493481564 100644 --- a/meteor/server/api/studio/api.ts +++ b/meteor/server/api/studio/api.ts @@ -48,6 +48,8 @@ export async function insertStudioInner(organizationId: OrganizationId | null, n frameRate: 25, mediaPreviewsUrl: '', minimumTakeSpan: DEFAULT_MINIMUM_TAKE_SPAN, + allowHold: false, + allowPieceDirectPlay: false, }, _rundownVersionHash: '', routeSetsWithOverrides: wrapDefaultObject({}), diff --git a/meteor/server/lib/rest/v1/studios.ts b/meteor/server/lib/rest/v1/studios.ts index 1b67bcfafb..8d39a2f2c4 100644 --- a/meteor/server/lib/rest/v1/studios.ts +++ b/meteor/server/lib/rest/v1/studios.ts @@ -214,4 +214,7 @@ export interface APIStudioSettings { forceQuickLoopAutoNext?: 'disabled' | 'enabled_when_valid_duration' | 'enabled_forcing_min_duration' minimumTakeSpan?: number fallbackPartDuration?: number + allowAdlibTestingSegment?: boolean + allowHold?: boolean + allowPieceDirectPlay?: boolean } diff --git a/meteor/server/migration/0_1_0.ts b/meteor/server/migration/0_1_0.ts index 80247e212b..e65323388a 100644 --- a/meteor/server/migration/0_1_0.ts +++ b/meteor/server/migration/0_1_0.ts @@ -441,6 +441,8 @@ export const addSteps = addMigrationSteps('0.1.0', [ frameRate: 25, mediaPreviewsUrl: '', minimumTakeSpan: DEFAULT_MINIMUM_TAKE_SPAN, + allowHold: false, + allowPieceDirectPlay: false, }, mappingsWithOverrides: wrapDefaultObject({}), blueprintConfigWithOverrides: wrapDefaultObject({}), diff --git a/meteor/server/migration/X_X_X.ts b/meteor/server/migration/X_X_X.ts index 37862b391d..0b7409ea77 100644 --- a/meteor/server/migration/X_X_X.ts +++ b/meteor/server/migration/X_X_X.ts @@ -187,4 +187,41 @@ export const addSteps = addMigrationSteps(CURRENT_SYSTEM_VERSION, [ } }, }, + + { + id: `add studio settings allowHold & allowPieceDirectPlay`, + canBeRunAutomatically: true, + validate: async () => { + const studios = await Studios.findFetchAsync({ + $or: [ + { 'settings.allowHold': { $exists: false } }, + { 'settings.allowPieceDirectPlay': { $exists: false } }, + ], + }) + + if (studios.length > 0) { + return 'studios must have settings.allowHold and settings.allowPieceDirectPlay defined' + } + + return false + }, + migrate: async () => { + const studios = await Studios.findFetchAsync({ + $or: [ + { 'settings.allowHold': { $exists: false } }, + { 'settings.allowPieceDirectPlay': { $exists: false } }, + ], + }) + + for (const studio of studios) { + // Populate the settings to be backwards compatible + await Studios.updateAsync(studio._id, { + $set: { + 'settings.allowHold': true, + 'settings.allowPieceDirectPlay': true, + }, + }) + } + }, + }, ]) diff --git a/meteor/server/migration/__tests__/migrations.test.ts b/meteor/server/migration/__tests__/migrations.test.ts index f4ec9ac82c..a5df23d71c 100644 --- a/meteor/server/migration/__tests__/migrations.test.ts +++ b/meteor/server/migration/__tests__/migrations.test.ts @@ -126,6 +126,8 @@ describe('Migrations', () => { mediaPreviewsUrl: '', frameRate: 25, minimumTakeSpan: DEFAULT_MINIMUM_TAKE_SPAN, + allowHold: true, + allowPieceDirectPlay: true, }, mappingsWithOverrides: wrapDefaultObject({}), blueprintConfigWithOverrides: wrapDefaultObject({}), @@ -164,6 +166,8 @@ describe('Migrations', () => { mediaPreviewsUrl: '', frameRate: 25, minimumTakeSpan: DEFAULT_MINIMUM_TAKE_SPAN, + allowHold: true, + allowPieceDirectPlay: true, }, mappingsWithOverrides: wrapDefaultObject({}), blueprintConfigWithOverrides: wrapDefaultObject({}), @@ -202,6 +206,8 @@ describe('Migrations', () => { mediaPreviewsUrl: '', frameRate: 25, minimumTakeSpan: DEFAULT_MINIMUM_TAKE_SPAN, + allowHold: true, + allowPieceDirectPlay: true, }, mappingsWithOverrides: wrapDefaultObject({}), blueprintConfigWithOverrides: wrapDefaultObject({}), diff --git a/meteor/server/publications/pieceContentStatusUI/__tests__/checkPieceContentStatus.test.ts b/meteor/server/publications/pieceContentStatusUI/__tests__/checkPieceContentStatus.test.ts index f0d34355f5..7ea6300529 100644 --- a/meteor/server/publications/pieceContentStatusUI/__tests__/checkPieceContentStatus.test.ts +++ b/meteor/server/publications/pieceContentStatusUI/__tests__/checkPieceContentStatus.test.ts @@ -85,9 +85,7 @@ describe('lib/mediaObjects', () => { test('getAcceptedFormats', () => { const acceptedFormats = getAcceptedFormats({ supportedMediaFormats: '1920x1080i5000, 1280x720, i5000, i5000tff', - mediaPreviewsUrl: '', frameRate: 25, - minimumTakeSpan: DEFAULT_MINIMUM_TAKE_SPAN, }) expect(acceptedFormats).toEqual([ ['1920', '1080', 'i', '5000', undefined], @@ -170,6 +168,8 @@ describe('lib/mediaObjects', () => { supportedAudioStreams: '4', frameRate: 25, minimumTakeSpan: DEFAULT_MINIMUM_TAKE_SPAN, + allowHold: false, + allowPieceDirectPlay: false, } const mockDefaultStudio = defaultStudio(protectString('studio0')) diff --git a/meteor/server/publications/pieceContentStatusUI/checkPieceContentStatus.ts b/meteor/server/publications/pieceContentStatusUI/checkPieceContentStatus.ts index 987d865031..26445f7126 100644 --- a/meteor/server/publications/pieceContentStatusUI/checkPieceContentStatus.ts +++ b/meteor/server/publications/pieceContentStatusUI/checkPieceContentStatus.ts @@ -135,7 +135,9 @@ export function acceptFormat(format: string, formats: Array>): boo * [undefined, undefined, i, 5000, tff] * ] */ -export function getAcceptedFormats(settings: IStudioSettings | undefined): Array> { +export function getAcceptedFormats( + settings: Pick | undefined +): Array> { const formatsConfigField = settings ? settings.supportedMediaFormats : '' const formatsString: string = (formatsConfigField && formatsConfigField !== '' ? formatsConfigField : '1920x1080i5000') + '' diff --git a/packages/corelib/src/dataModel/Studio.ts b/packages/corelib/src/dataModel/Studio.ts index 78ee077c19..975c544956 100644 --- a/packages/corelib/src/dataModel/Studio.ts +++ b/packages/corelib/src/dataModel/Studio.ts @@ -88,6 +88,19 @@ export interface IStudioSettings { * Default: 3000 */ fallbackPartDuration?: number + + /** + * Whether to allow hold operations for Rundowns in this Studio + * When disabled, any action-triggers that would normally trigger a hold operation will be silently ignored + * This should only block entering hold, to ensure Sofie doesn't get stuck if it somehow gets into hold + */ + allowHold: boolean + + /** + * Whether to allow direct playing of a piece in the rundown + * This behaviour is usally triggered by double-clicking on a piece in the GUI + */ + allowPieceDirectPlay: boolean } export type StudioLight = Omit diff --git a/packages/job-worker/src/__mocks__/defaultCollectionObjects.ts b/packages/job-worker/src/__mocks__/defaultCollectionObjects.ts index 171a929dba..1a8c8df279 100644 --- a/packages/job-worker/src/__mocks__/defaultCollectionObjects.ts +++ b/packages/job-worker/src/__mocks__/defaultCollectionObjects.ts @@ -107,6 +107,8 @@ export function defaultStudio(_id: StudioId): DBStudio { mediaPreviewsUrl: '', minimumTakeSpan: DEFAULT_MINIMUM_TAKE_SPAN, allowAdlibTestingSegment: true, + allowHold: true, + allowPieceDirectPlay: true, }, routeSetsWithOverrides: wrapDefaultObject({}), routeSetExclusivityGroupsWithOverrides: wrapDefaultObject({}), diff --git a/packages/job-worker/src/blueprints/__tests__/config.test.ts b/packages/job-worker/src/blueprints/__tests__/config.test.ts index 2e77bd5dd8..8e58179644 100644 --- a/packages/job-worker/src/blueprints/__tests__/config.test.ts +++ b/packages/job-worker/src/blueprints/__tests__/config.test.ts @@ -15,6 +15,8 @@ describe('Test blueprint config', () => { mediaPreviewsUrl: '', frameRate: 25, minimumTakeSpan: DEFAULT_MINIMUM_TAKE_SPAN, + allowHold: true, + allowPieceDirectPlay: true, }, blueprintConfigWithOverrides: wrapDefaultObject({ sdfsdf: 'one', another: 5 }), }) @@ -38,6 +40,8 @@ describe('Test blueprint config', () => { mediaPreviewsUrl: '', frameRate: 25, minimumTakeSpan: DEFAULT_MINIMUM_TAKE_SPAN, + allowHold: true, + allowPieceDirectPlay: true, }, blueprintConfigWithOverrides: wrapDefaultObject({ sdfsdf: 'one', another: 5 }), }) diff --git a/packages/job-worker/src/playout/adlibJobs.ts b/packages/job-worker/src/playout/adlibJobs.ts index 1a07ceedbc..25fc2e0d55 100644 --- a/packages/job-worker/src/playout/adlibJobs.ts +++ b/packages/job-worker/src/playout/adlibJobs.ts @@ -35,6 +35,12 @@ import { PlayoutPieceInstanceModel } from './model/PlayoutPieceInstanceModel' * Play an existing Piece in the Rundown as an AdLib */ export async function handleTakePieceAsAdlibNow(context: JobContext, data: TakePieceAsAdlibNowProps): Promise { + if (!context.studio.settings.allowPieceDirectPlay) { + // Piece direct play isn't allowed, making this a noop + logger.debug(`Piece direct play isn't allowed, skipping`) + return + } + return runJobWithPlayoutModel( context, data, diff --git a/packages/job-worker/src/playout/holdJobs.ts b/packages/job-worker/src/playout/holdJobs.ts index ab00c41738..3c88aca6a6 100644 --- a/packages/job-worker/src/playout/holdJobs.ts +++ b/packages/job-worker/src/playout/holdJobs.ts @@ -5,11 +5,18 @@ import { ActivateHoldProps, DeactivateHoldProps } from '@sofie-automation/coreli import { JobContext } from '../jobs' import { runJobWithPlayoutModel } from './lock' import { updateTimeline } from './timeline/generate' +import { logger } from '../logging' /** * Activate Hold */ export async function handleActivateHold(context: JobContext, data: ActivateHoldProps): Promise { + if (!context.studio.settings.allowHold) { + // Hold isn't allowed, making this a noop + logger.debug(`Hold isn't allowed, skipping`) + return + } + return runJobWithPlayoutModel( context, data, @@ -59,6 +66,8 @@ export async function handleActivateHold(context: JobContext, data: ActivateHold * Deactivate Hold */ export async function handleDeactivateHold(context: JobContext, data: DeactivateHoldProps): Promise { + // This should be possible even when hold is not allowed, as it is a way to get out of a stuck state + return runJobWithPlayoutModel( context, data, diff --git a/packages/openapi/api/definitions/studios.yaml b/packages/openapi/api/definitions/studios.yaml index 03cffacca0..2c27bbd1cb 100644 --- a/packages/openapi/api/definitions/studios.yaml +++ b/packages/openapi/api/definitions/studios.yaml @@ -546,6 +546,15 @@ components: fallbackPartDuration: type: number description: The duration to apply on too short Parts Within QuickLoop when forceQuickLoopAutoNext is set to `enabled_forcing_min_duration` + allowAdlibTestingSegment: + type: boolean + description: Whether to allow adlib testing mode, before a Part is playing in a Playlist + allowHold: + type: boolean + description: Whether to allow hold operations for Rundowns in this Studio + allowPieceDirectPlay: + type: boolean + description: Whether to allow direct playing of a piece in the rundown required: - frameRate diff --git a/packages/webui/src/__mocks__/defaultCollectionObjects.ts b/packages/webui/src/__mocks__/defaultCollectionObjects.ts index 99dfea69b7..a4c10d70ac 100644 --- a/packages/webui/src/__mocks__/defaultCollectionObjects.ts +++ b/packages/webui/src/__mocks__/defaultCollectionObjects.ts @@ -105,6 +105,8 @@ export function defaultStudio(_id: StudioId): DBStudio { frameRate: 25, mediaPreviewsUrl: '', minimumTakeSpan: DEFAULT_MINIMUM_TAKE_SPAN, + allowHold: true, + allowPieceDirectPlay: true, }, _rundownVersionHash: '', routeSetsWithOverrides: wrapDefaultObject({}), diff --git a/packages/webui/src/client/ui/RundownView.tsx b/packages/webui/src/client/ui/RundownView.tsx index fa83c0b877..a1688deaf3 100644 --- a/packages/webui/src/client/ui/RundownView.tsx +++ b/packages/webui/src/client/ui/RundownView.tsx @@ -1034,7 +1034,7 @@ const RundownHeader = withTranslation()( {this.props.playlist.activationId ? ( this.take(e)}>{t('Take')} ) : null} - {this.props.playlist.activationId ? ( + {this.props.studio.settings.allowHold && this.props.playlist.activationId ? ( this.hold(e)}>{t('Hold')} ) : null} {!( @@ -2213,7 +2213,8 @@ const RundownViewContent = translateWithTracker + + + + ) From ea2cae16a5cf82ca01161cd7688d28bd5ac9c70d Mon Sep 17 00:00:00 2001 From: Kasper Olsson Hans Date: Wed, 20 Nov 2024 18:38:44 +0100 Subject: [PATCH 2/2] feat: option to disable/enable buckets (#36) --- meteor/__mocks__/defaultCollectionObjects.ts | 1 + meteor/server/api/rest/v1/typeConversion.ts | 2 ++ meteor/server/api/studio/api.ts | 1 + meteor/server/lib/rest/v1/studios.ts | 1 + meteor/server/migration/0_1_0.ts | 1 + .../server/migration/__tests__/migrations.test.ts | 3 +++ .../__tests__/checkPieceContentStatus.test.ts | 1 + packages/corelib/src/dataModel/Studio.ts | 5 +++++ .../src/__mocks__/defaultCollectionObjects.ts | 1 + .../src/blueprints/__tests__/config.test.ts | 2 ++ .../src/__mocks__/defaultCollectionObjects.ts | 1 + packages/webui/src/client/ui/RundownView.tsx | 3 ++- .../src/client/ui/Settings/Studio/Generic.tsx | 14 ++++++++++++++ 13 files changed, 35 insertions(+), 1 deletion(-) diff --git a/meteor/__mocks__/defaultCollectionObjects.ts b/meteor/__mocks__/defaultCollectionObjects.ts index 4d2cf78382..1d43c273ae 100644 --- a/meteor/__mocks__/defaultCollectionObjects.ts +++ b/meteor/__mocks__/defaultCollectionObjects.ts @@ -112,6 +112,7 @@ export function defaultStudio(_id: StudioId): DBStudio { fallbackPartDuration: DEFAULT_FALLBACK_PART_DURATION, allowHold: false, allowPieceDirectPlay: false, + enableBuckets: false, }, _rundownVersionHash: '', routeSetsWithOverrides: wrapDefaultObject({}), diff --git a/meteor/server/api/rest/v1/typeConversion.ts b/meteor/server/api/rest/v1/typeConversion.ts index f54e436b98..75a38a37b2 100644 --- a/meteor/server/api/rest/v1/typeConversion.ts +++ b/meteor/server/api/rest/v1/typeConversion.ts @@ -365,6 +365,7 @@ export function studioSettingsFrom(apiStudioSettings: APIStudioSettings): Comple allowAdlibTestingSegment: apiStudioSettings.allowAdlibTestingSegment, allowHold: apiStudioSettings.allowHold ?? true, // Backwards compatible allowPieceDirectPlay: apiStudioSettings.allowPieceDirectPlay ?? true, // Backwards compatible + enableBuckets: apiStudioSettings.enableBuckets ?? true, // Backwards compatible } } @@ -387,6 +388,7 @@ export function APIStudioSettingsFrom(settings: IStudioSettings): Complete { minimumTakeSpan: DEFAULT_MINIMUM_TAKE_SPAN, allowHold: true, allowPieceDirectPlay: true, + enableBuckets: true, }, mappingsWithOverrides: wrapDefaultObject({}), blueprintConfigWithOverrides: wrapDefaultObject({}), @@ -168,6 +169,7 @@ describe('Migrations', () => { minimumTakeSpan: DEFAULT_MINIMUM_TAKE_SPAN, allowHold: true, allowPieceDirectPlay: true, + enableBuckets: true, }, mappingsWithOverrides: wrapDefaultObject({}), blueprintConfigWithOverrides: wrapDefaultObject({}), @@ -208,6 +210,7 @@ describe('Migrations', () => { minimumTakeSpan: DEFAULT_MINIMUM_TAKE_SPAN, allowHold: true, allowPieceDirectPlay: true, + enableBuckets: true, }, mappingsWithOverrides: wrapDefaultObject({}), blueprintConfigWithOverrides: wrapDefaultObject({}), diff --git a/meteor/server/publications/pieceContentStatusUI/__tests__/checkPieceContentStatus.test.ts b/meteor/server/publications/pieceContentStatusUI/__tests__/checkPieceContentStatus.test.ts index 7ea6300529..e9ab3d763b 100644 --- a/meteor/server/publications/pieceContentStatusUI/__tests__/checkPieceContentStatus.test.ts +++ b/meteor/server/publications/pieceContentStatusUI/__tests__/checkPieceContentStatus.test.ts @@ -170,6 +170,7 @@ describe('lib/mediaObjects', () => { minimumTakeSpan: DEFAULT_MINIMUM_TAKE_SPAN, allowHold: false, allowPieceDirectPlay: false, + enableBuckets: false, } const mockDefaultStudio = defaultStudio(protectString('studio0')) diff --git a/packages/corelib/src/dataModel/Studio.ts b/packages/corelib/src/dataModel/Studio.ts index 975c544956..ba6d7233d2 100644 --- a/packages/corelib/src/dataModel/Studio.ts +++ b/packages/corelib/src/dataModel/Studio.ts @@ -101,6 +101,11 @@ export interface IStudioSettings { * This behaviour is usally triggered by double-clicking on a piece in the GUI */ allowPieceDirectPlay: boolean + + /** + * Enable buckets - the default behavior is to have buckets. + */ + enableBuckets: boolean } export type StudioLight = Omit diff --git a/packages/job-worker/src/__mocks__/defaultCollectionObjects.ts b/packages/job-worker/src/__mocks__/defaultCollectionObjects.ts index 1a8c8df279..5f75d707f4 100644 --- a/packages/job-worker/src/__mocks__/defaultCollectionObjects.ts +++ b/packages/job-worker/src/__mocks__/defaultCollectionObjects.ts @@ -109,6 +109,7 @@ export function defaultStudio(_id: StudioId): DBStudio { allowAdlibTestingSegment: true, allowHold: true, allowPieceDirectPlay: true, + enableBuckets: true, }, routeSetsWithOverrides: wrapDefaultObject({}), routeSetExclusivityGroupsWithOverrides: wrapDefaultObject({}), diff --git a/packages/job-worker/src/blueprints/__tests__/config.test.ts b/packages/job-worker/src/blueprints/__tests__/config.test.ts index 8e58179644..c46b7a2fba 100644 --- a/packages/job-worker/src/blueprints/__tests__/config.test.ts +++ b/packages/job-worker/src/blueprints/__tests__/config.test.ts @@ -17,6 +17,7 @@ describe('Test blueprint config', () => { minimumTakeSpan: DEFAULT_MINIMUM_TAKE_SPAN, allowHold: true, allowPieceDirectPlay: true, + enableBuckets: true, }, blueprintConfigWithOverrides: wrapDefaultObject({ sdfsdf: 'one', another: 5 }), }) @@ -42,6 +43,7 @@ describe('Test blueprint config', () => { minimumTakeSpan: DEFAULT_MINIMUM_TAKE_SPAN, allowHold: true, allowPieceDirectPlay: true, + enableBuckets: true, }, blueprintConfigWithOverrides: wrapDefaultObject({ sdfsdf: 'one', another: 5 }), }) diff --git a/packages/webui/src/__mocks__/defaultCollectionObjects.ts b/packages/webui/src/__mocks__/defaultCollectionObjects.ts index a4c10d70ac..5897618e16 100644 --- a/packages/webui/src/__mocks__/defaultCollectionObjects.ts +++ b/packages/webui/src/__mocks__/defaultCollectionObjects.ts @@ -107,6 +107,7 @@ export function defaultStudio(_id: StudioId): DBStudio { minimumTakeSpan: DEFAULT_MINIMUM_TAKE_SPAN, allowHold: true, allowPieceDirectPlay: true, + enableBuckets: true, }, _rundownVersionHash: '', routeSetsWithOverrides: wrapDefaultObject({}), diff --git a/packages/webui/src/client/ui/RundownView.tsx b/packages/webui/src/client/ui/RundownView.tsx index a1688deaf3..795c04f167 100644 --- a/packages/webui/src/client/ui/RundownView.tsx +++ b/packages/webui/src/client/ui/RundownView.tsx @@ -1436,7 +1436,8 @@ const RundownViewContent = translateWithTracker + +