diff --git a/packages/blueprints-integration/src/action.ts b/packages/blueprints-integration/src/action.ts index 2639f7f8ef..be134514be 100644 --- a/packages/blueprints-integration/src/action.ts +++ b/packages/blueprints-integration/src/action.ts @@ -41,6 +41,8 @@ export interface IBlueprintActionManifestDisplay { uniquenessId?: string /** When not playing, display in the UI as playing, and vice versa. Useful for Adlibs that toggle something off when taken */ invertOnAirState?: boolean + /** Hide this adLib from the shelf - it is accessible only through the API */ + hidden?: boolean } export interface IBlueprintActionManifestDisplayContent extends IBlueprintActionManifestDisplay { @@ -99,8 +101,8 @@ export interface IBlueprintActionManifest + /** Schema for the executeAdLib adLibOptions property to allow for customising */ + optionsSchema?: JSONBlob // Potential future properties: // /** Execute the action after userData is changed. If not present ActionExecuteAfterChanged.none is assumed. */ // executeOnUserDataChanged?: ActionExecuteAfterChanged diff --git a/packages/blueprints-integration/src/documents/adlibPiece.ts b/packages/blueprints-integration/src/documents/adlibPiece.ts index 7e515480d9..a01d53f18a 100644 --- a/packages/blueprints-integration/src/documents/adlibPiece.ts +++ b/packages/blueprints-integration/src/documents/adlibPiece.ts @@ -22,6 +22,8 @@ export interface IBlueprintAdLibPiece diff --git a/packages/job-worker/src/blueprints/context/lib.ts b/packages/job-worker/src/blueprints/context/lib.ts index df66dd54fd..90e75267c9 100644 --- a/packages/job-worker/src/blueprints/context/lib.ts +++ b/packages/job-worker/src/blueprints/context/lib.ts @@ -282,6 +282,7 @@ export function convertAdLibPieceToBlueprints(adLib: ReadonlyDeep): nextPieceTags: clone(adLib.nextPieceTags), uniquenessId: adLib.uniquenessId, invertOnAirState: adLib.invertOnAirState, + hidden: adLib.hidden, } return obj diff --git a/packages/live-status-gateway/api/schemas/adLibs.yaml b/packages/live-status-gateway/api/schemas/adLibs.yaml index b69918ae1f..97b90dcf47 100644 --- a/packages/live-status-gateway/api/schemas/adLibs.yaml +++ b/packages/live-status-gateway/api/schemas/adLibs.yaml @@ -92,6 +92,9 @@ $defs: type: string publicData: description: Optional arbitrary data + optionsSchema: + description: JSON schema definition of the adLib properties that can be modified using the adLibOptions property in executeAdLib + type: string required: [id, name, sourceLayer, actionType] examples: - id: 'C6K_yIMuGFUk8X_L9A9_jRT6aq4_' @@ -103,3 +106,4 @@ $defs: tags: ['music_video'] publicData: fileName: MV000123.mxf + optionsSchema: '{"$schema":"https://json-schema.org/draft/2020-12/schema","title":"Play Video Clip","type":"object","properties":{"type":"adlib_action_video_clip","label":{"type":"string"},"clipId":{"type":"string"},"vo":{"type":"boolean"},"target":{"$schema":"https://json-schema.org/draft/2020-12/schema","title":"Object Id","description":"Id of an object sent to Sofie","type":"string"},"duration":{"type":"number","exclusiveMinimum":0},"takeType":{"$schema":"https://json-schema.org/draft/2020-12/schema","title":"AdLib Action Take Type","type":"string","enum":["take_immediate","queue"]},"transition":{"$schema":"https://json-schema.org/draft/2020-12/schema","title":"AdLib Action Transition Type","oneOf":[{"type":"object","properties":{"type":"cut"},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":"mix","duration":{"type":"number","exclusiveMinimum":0,"description":"Duration in ms"}},"required":["type","duration"],"additionalProperties":false},{"type":"object","properties":{"type":"wipe","duration":{"type":"number","exclusiveMinimum":0,"description":"Duration in ms"},"patternId":{"type":"string","description":"Type of wipe to use"}},"required":["type","duration","patternId"],"additionalProperties":false},{"type":"object","properties":{"type":"macro","macroId":{"type":"string","description":"Macro template to recall"}},"required":["type","macroId"],"additionalProperties":false}]}},"required":["type","clipId","vo","target"],"additionalProperties":false}"' diff --git a/packages/live-status-gateway/src/topics/adLibsTopic.ts b/packages/live-status-gateway/src/topics/adLibsTopic.ts index e5de8fd7d4..f3f07b8557 100644 --- a/packages/live-status-gateway/src/topics/adLibsTopic.ts +++ b/packages/live-status-gateway/src/topics/adLibsTopic.ts @@ -54,6 +54,7 @@ interface AdLibStatusBase { actionType: AdLibActionType[] tags?: string[] publicData: unknown + optionsSchema?: any } export class AdLibsTopic @@ -125,6 +126,7 @@ export class AdLibsTopic actionType: triggerModes, tags: action.display.tags, publicData: action.publicData, + optionsSchema: action.userDataManifest.optionsSchema, }, id: unprotectString(action._id), label: name, @@ -193,6 +195,7 @@ export class AdLibsTopic actionType: triggerModes, tags: action.display.tags, publicData: action.publicData, + optionsSchema: action.userDataManifest.optionsSchema, }, id: unprotectString(action._id), label: name, diff --git a/packages/webui/src/client/ui/Shelf/AdLibPanel.tsx b/packages/webui/src/client/ui/Shelf/AdLibPanel.tsx index 7cac019045..85c151635b 100644 --- a/packages/webui/src/client/ui/Shelf/AdLibPanel.tsx +++ b/packages/webui/src/client/ui/Shelf/AdLibPanel.tsx @@ -369,15 +369,25 @@ export function fetchAndFilter(props: IFetchAndFilterProps): AdLibFetchAndFilter // @ts-expect-error deep-property sort: { 'display._rank': 1 }, } - ).map<{ - partId: PartId - piece: AdLibPieceUi - }>((action) => { - return { - partId: action.partId, - piece: actionToAdLibPieceUi(action, sourceLayerLookup, outputLayerLookup), - } - }), + ) + .map<{ + partId: PartId + piece: AdLibPieceUi + hidden: boolean + }>((action) => { + return { + partId: action.partId, + piece: actionToAdLibPieceUi(action, sourceLayerLookup, outputLayerLookup), + hidden: !!action.display.hidden, + } + }) + .filter((adLibPiece) => { + if (!adLibPiece.hidden) + return { + partId: adLibPiece.partId, + piece: adLibPiece.piece, + } + }), 'adLibActions', unorderedRundownIds, partIds @@ -485,6 +495,7 @@ export function fetchAndFilter(props: IFetchAndFilterProps): AdLibFetchAndFilter } ) .fetch() + .filter((action) => !action.display.hidden) .map((action) => actionToAdLibPieceUi(action, sourceLayerLookup, outputLayerLookup)), 'globalAdLibActions', currentRundownId diff --git a/packages/webui/src/client/ui/Shelf/Inspector/ItemRenderers/ActionItemRenderer.tsx b/packages/webui/src/client/ui/Shelf/Inspector/ItemRenderers/ActionItemRenderer.tsx index e6143d4517..e1f745688e 100644 --- a/packages/webui/src/client/ui/Shelf/Inspector/ItemRenderers/ActionItemRenderer.tsx +++ b/packages/webui/src/client/ui/Shelf/Inspector/ItemRenderers/ActionItemRenderer.tsx @@ -227,9 +227,9 @@ export default translateWithTracker((props: IProps) = />
- {action.userDataManifest && action.userDataManifest.editableFields && !targetAction ? ( + {action.userDataManifest && action.userDataManifest.optionsSchema && !targetAction ? ( - ) : action.userDataManifest && action.userDataManifest.editableFields && targetAction ? ( + ) : action.userDataManifest && action.userDataManifest.optionsSchema && targetAction ? ( Editable Fields are not currently supported. ) : null}