From 1e5081f4a2c285f36c2989f38d415c6bb8d6e21e Mon Sep 17 00:00:00 2001 From: Carlos Valente Date: Mon, 14 Jul 2025 09:08:29 +0200 Subject: [PATCH] fix: parse nested events in rundown --- .../rundown/__mocks__/rundown.mocks.ts | 23 ++++++++++++++++++- .../rundown/__tests__/rundown.parser.test.ts | 21 +++++++++-------- .../src/api-data/rundown/rundown.parser.ts | 4 ++-- 3 files changed, 35 insertions(+), 13 deletions(-) diff --git a/apps/server/src/api-data/rundown/__mocks__/rundown.mocks.ts b/apps/server/src/api-data/rundown/__mocks__/rundown.mocks.ts index 7d40d25d9..80a66a52d 100644 --- a/apps/server/src/api-data/rundown/__mocks__/rundown.mocks.ts +++ b/apps/server/src/api-data/rundown/__mocks__/rundown.mocks.ts @@ -1,4 +1,12 @@ -import { SupportedEntry, OntimeEvent, OntimeDelay, OntimeBlock, Rundown, CustomField } from 'ontime-types'; +import { + SupportedEntry, + OntimeEvent, + OntimeDelay, + OntimeBlock, + Rundown, + CustomField, + OntimeMilestone, +} from 'ontime-types'; import { defaultRundown } from '../../../models/dataModel.js'; @@ -13,6 +21,12 @@ const baseBlock = { entries: [], }; +const baseMilestone = { + type: SupportedEntry.Milestone, + cue: '', + title: '', +}; + /** * Utility to create a Ontime event */ @@ -37,6 +51,13 @@ export function makeOntimeBlock(patch: Partial): OntimeBlock { return { id: 'block', ...baseBlock, ...patch } as OntimeBlock; } +/** + * Utility to create a block event + */ +export function makeOntimeMilestone(patch: Partial): OntimeMilestone { + return { id: 'milestone', ...baseMilestone, ...patch } as OntimeMilestone; +} + /** * Utility to create a rundown object */ diff --git a/apps/server/src/api-data/rundown/__tests__/rundown.parser.test.ts b/apps/server/src/api-data/rundown/__tests__/rundown.parser.test.ts index 93cd12807..1fd17a8d3 100644 --- a/apps/server/src/api-data/rundown/__tests__/rundown.parser.test.ts +++ b/apps/server/src/api-data/rundown/__tests__/rundown.parser.test.ts @@ -1,7 +1,7 @@ import { SupportedEntry, OntimeEvent, OntimeBlock, Rundown, CustomFields } from 'ontime-types'; import { defaultRundown } from '../../../models/dataModel.js'; -import { makeOntimeBlock, makeOntimeEvent } from '../__mocks__/rundown.mocks.js'; +import { makeOntimeBlock, makeOntimeEvent, makeOntimeMilestone } from '../__mocks__/rundown.mocks.js'; import { parseRundowns, parseRundown, handleCustomField, addToCustomAssignment } from '../rundown.parser.js'; @@ -241,7 +241,7 @@ describe('parseRundown()', () => { expect((parsedRundown.entries['21'] as OntimeEvent).custom).not.toHaveProperty('lighting'); }); - it('parses data in blocks', () => { + it('parses data in groups', () => { const rundown = { id: 'test', title: '', @@ -254,20 +254,21 @@ describe('parseRundown()', () => { title: 'block-title', note: 'block-note', colour: 'red', - entries: ['1', '2'], + entries: ['1', '2', '3'], }), - '1': makeOntimeEvent({ id: '1' }), + '1': makeOntimeEvent({ id: '1', parent: 'block' }), + '2': makeOntimeMilestone({ id: '2', parent: 'block' }), }, revision: 1, } as Rundown; const parsedRundown = parseRundown(rundown, {}); - expect(parsedRundown.order.length).toEqual(1); - expect(parsedRundown.entries.block).toMatchObject({ - title: 'block-title', - note: 'block-note', - colour: 'red', - entries: ['1'], + expect(parsedRundown.order).toStrictEqual(['block']); + expect(parsedRundown.flatOrder).toStrictEqual(['block', '1', '2']); + expect(parsedRundown.entries).toMatchObject({ + block: { id: 'block', type: SupportedEntry.Block, entries: ['1', '2'] }, + '1': { id: '1', type: SupportedEntry.Event }, + '2': { id: '2', type: SupportedEntry.Milestone }, }); }); diff --git a/apps/server/src/api-data/rundown/rundown.parser.ts b/apps/server/src/api-data/rundown/rundown.parser.ts index 9b5bf27d5..c04ea7b5c 100644 --- a/apps/server/src/api-data/rundown/rundown.parser.ts +++ b/apps/server/src/api-data/rundown/rundown.parser.ts @@ -127,9 +127,9 @@ export function parseRundown( cleanupCustomFields(newNestedEvent.custom, parsedCustomFields); eventIndex += 1; } else if (isOntimeDelay(nestedEvent)) { - newNestedEvent = { ...delayDef, duration: nestedEvent.duration, id }; + newNestedEvent = { ...delayDef, duration: nestedEvent.duration, id: nestedEventId }; } else if (isOntimeMilestone(nestedEvent)) { - newNestedEvent = createMilestone({ ...nestedEvent, id }); + newNestedEvent = createMilestone({ ...nestedEvent, id: nestedEventId }); cleanupCustomFields(newNestedEvent.custom, parsedCustomFields); }