fix: delete nested events

This commit is contained in:
Carlos Valente
2025-05-01 11:47:47 +02:00
committed by arc-alex
parent 2c9b6918e6
commit 7cd319a6b3
2 changed files with 43 additions and 8 deletions
@@ -1,4 +1,4 @@
import { CustomFields, OntimeEvent, SupportedEntry, TimeStrategy } from 'ontime-types';
import { CustomFields, OntimeBlock, OntimeEvent, SupportedEntry, TimeStrategy } from 'ontime-types';
import { MILLIS_PER_HOUR, MILLIS_PER_MINUTE, dayInMs } from 'ontime-utils';
import { demoDb } from '../../../models/demoProject.js';
@@ -663,6 +663,28 @@ describe('remove() mutation', () => {
expect(newRundown.order.length).toBe(3);
expect(newRundown.entries[newRundown.order[0]].id).toBe('4');
});
test('deletes a nested event', () => {
const rundown = makeRundown({
order: ['1'],
flatOrder: ['1', '11', '12', '13'],
entries: {
'1': makeOntimeBlock({ id: '1', events: ['11', '12', '13'] }),
'11': makeOntimeEvent({ id: '11', parent: '1' }),
'12': makeOntimeDelay({ id: '12', parent: '1' }),
'13': makeOntimeEvent({ id: '13', parent: '1' }),
},
});
const { newRundown } = remove({ eventIds: ['12'], rundown });
expect(newRundown.order).toStrictEqual(['1']);
expect(newRundown.entries).toMatchObject({
'1': { id: '1' },
'11': { id: '11' },
'13': { id: '13' },
});
expect((newRundown.entries['1'] as OntimeBlock).events).toStrictEqual(['11', '13']);
});
});
describe('edit() mutation', () => {
@@ -114,6 +114,7 @@ export function generate(
let blockStartTime = null;
let blockEndTime = null;
let isFirstLinked = false;
const blockEvents: EntryId[] = [];
// check if the block contains events
for (let i = 0; i < processedEntry.events.length; i++) {
@@ -123,6 +124,8 @@ export function generate(
if (!nestedEntry) {
continue;
}
blockEvents.push(nestedEntry.id);
const { processedData: processedNestedData, processedEntry: processedNestedEntry } = process(
nestedEntry,
processedEntry.id,
@@ -150,7 +153,8 @@ export function generate(
processedEntry.startTime = blockStartTime;
processedEntry.endTime = blockEndTime;
processedEntry.isFirstLinked = isFirstLinked;
processedEntry.numEvents = processedEntry.events.length;
processedEntry.events = blockEvents;
processedEntry.numEvents = blockEvents.length;
}
}
@@ -343,27 +347,36 @@ export function add({ rundown, atIndex, parent, entry }: AddArgs): Required<Muta
type RemoveArgs = MutationParams<{ eventIds: EntryId[] }>;
/**
* Remove entries in a rundown
* It needs to ensure that the parent block is updated
*/
export function remove({ rundown, eventIds }: RemoveArgs): MutatingReturn {
let didMutate = false;
for (let i = 0; i < eventIds.length; i++) {
const entry = rundown.entries[eventIds[i]];
if (isOntimeEvent(entry) && entry.parent) {
if (isOntimeBlock(entry) || !entry.parent) {
// top level events can simply be removed from the order
// the deletion process and the flatOrder are handled globally
rundown.order = rundown.order.filter((id) => id !== eventIds[i]);
} else {
const parentBlock = rundown.entries[entry.parent] as OntimeBlock;
const parentEvents = parentBlock.events.filter((id) => id !== eventIds[i]);
// we call a mutation to the parent event to
// - remove this entry from the events
// - reduce the children count
edit({
rundown,
eventId: entry.parent,
patch: {
events: parentBlock.events.filter((id) => id !== eventIds[i]),
numEvents: parentBlock.events.length - 1,
events: parentEvents,
numEvents: parentEvents.length,
},
});
parentBlock.events = parentBlock.events.filter((id) => id !== entry.id);
} else {
rundown.order = rundown.order.filter((id) => id !== eventIds[i]);
}
didMutate = true;
rundown.flatOrder = rundown.flatOrder.filter((id) => id !== eventIds[i]);
delete rundown.entries[eventIds[i]];
}