fix: persistence of custom fields (#1078)

This commit is contained in:
Carlos Valente
2024-06-15 15:07:20 +02:00
committed by GitHub
parent a15eb0db4c
commit ad0da6def4
4 changed files with 21 additions and 17 deletions
@@ -885,7 +885,7 @@ describe('custom fields', () => {
}; };
const customField = await editCustomField('sound', { label: 'Sound', type: 'string', colour: 'green' }); const customField = await editCustomField('sound', { label: 'Sound', type: 'string', colour: 'green' });
expect(customFieldChangelog).toStrictEqual({}); expect(customFieldChangelog).toStrictEqual(new Map());
expect(customField).toStrictEqual(expected); expect(customField).toStrictEqual(expected);
}); });
@@ -931,9 +931,15 @@ describe('custom fields', () => {
}, },
}; };
// We need to flush all scheduled tasks for the generate function to settle
vi.useFakeTimers();
const customField = await editCustomField('video', { label: 'AV', type: 'string', colour: 'red' }); const customField = await editCustomField('video', { label: 'AV', type: 'string', colour: 'red' });
expect(customField).toStrictEqual(expectedAfter); expect(customField).toStrictEqual(expectedAfter);
expect(customFieldChangelog).toStrictEqual({ video: 'av' }); expect(customFieldChangelog).toStrictEqual(new Map([['video', 'av']]));
await editCustomField('av', { label: 'video' });
vi.runAllTimers();
expect(customFieldChangelog).toStrictEqual(new Map());
vi.useRealTimers();
}); });
}); });
@@ -945,8 +951,8 @@ describe('custom fields', () => {
type: 'string', type: 'string',
colour: 'blue', colour: 'blue',
}, },
av: { video: {
label: 'AV', label: 'video',
type: 'string', type: 'string',
colour: 'red', colour: 'red',
}, },
@@ -96,7 +96,7 @@ describe('handleCustomField()', () => {
label: 'sound', label: 'sound',
}, },
} as CustomFields; } as CustomFields;
const customFieldChangelog = {}; const customFieldChangelog = new Map<string, string>();
// @ts-expect-error -- partial event for testing // @ts-expect-error -- partial event for testing
const event: OntimeEvent = { const event: OntimeEvent = {
@@ -132,9 +132,7 @@ describe('handleCustomField()', () => {
}, },
} as CustomFields; } as CustomFields;
const customFieldChangelog = { const customFieldChangelog = new Map([['sound', 'video']]);
sound: 'video',
};
// @ts-expect-error -- partial event for testing // @ts-expect-error -- partial event for testing
const event: OntimeEvent = { const event: OntimeEvent = {
@@ -170,9 +168,7 @@ describe('handleCustomField()', () => {
}, },
} as CustomFields; } as CustomFields;
const customFieldChangelog = { const customFieldChangelog = new Map([['field1', 'newField1']]);
field1: 'newField1',
};
// @ts-expect-error -- partial event for testing // @ts-expect-error -- partial event for testing
const mutableEvent: OntimeEvent = { const mutableEvent: OntimeEvent = {
@@ -47,7 +47,7 @@ let links: Record<EventID, EventID> = {};
* lighting: lx * lighting: lx
* } * }
*/ */
export const customFieldChangelog = {}; export const customFieldChangelog = new Map<string, string>();
/** /**
* Keep track of which custom fields are used. * Keep track of which custom fields are used.
@@ -141,6 +141,7 @@ export function generate(
} }
isStale = false; isStale = false;
customFieldChangelog.clear();
totalDelay = accumulatedDelay; totalDelay = accumulatedDelay;
if (lastEnd !== null && firstStart !== null) { if (lastEnd !== null && firstStart !== null) {
totalDuration = getTotalDuration(firstStart, lastEnd, daySpan); totalDuration = getTotalDuration(firstStart, lastEnd, daySpan);
@@ -411,6 +412,7 @@ function invalidateIfUsed(label: CustomFieldLabel) {
// schedule a non priority cache update // schedule a non priority cache update
setImmediate(() => { setImmediate(() => {
generate(); generate();
DataProvider.setRundown(persistedRundown);
}); });
} }
@@ -459,7 +461,7 @@ export const editCustomField = async (key: string, newField: Partial<CustomField
} }
const existingField = persistedCustomFields[key]; const existingField = persistedCustomFields[key];
if (existingField.type !== newField.type) { if (newField.type !== undefined && existingField.type !== newField.type) {
throw new Error('Change of field type is not allowed'); throw new Error('Change of field type is not allowed');
} }
@@ -468,7 +470,7 @@ export const editCustomField = async (key: string, newField: Partial<CustomField
if (key !== newKey) { if (key !== newKey) {
delete persistedCustomFields[key]; delete persistedCustomFields[key];
customFieldChangelog[key] = newKey; customFieldChangelog.set(key, newKey);
} }
scheduleCustomFieldPersist(persistedCustomFields); scheduleCustomFieldPersist(persistedCustomFields);
@@ -73,15 +73,15 @@ export function addToCustomAssignment(
*/ */
export function handleCustomField( export function handleCustomField(
customFields: CustomFields, customFields: CustomFields,
customFieldChangelog: Record<string, string>, customFieldChangelog: Map<string, string>,
mutableEvent: OntimeEvent, mutableEvent: OntimeEvent,
assignedCustomFields: Record<string, string[]>, assignedCustomFields: Record<string, string[]>,
) { ) {
for (const field in mutableEvent.custom) { for (const field in mutableEvent.custom) {
// rename the property if it is in the changelog // rename the property if it is in the changelog
if (field in customFieldChangelog) { if (customFieldChangelog.has(field)) {
const oldData = mutableEvent.custom[field]; const oldData = mutableEvent.custom[field];
const newLabel = customFieldChangelog[field]; const newLabel = customFieldChangelog.get(field);
mutableEvent.custom[newLabel] = oldData; mutableEvent.custom[newLabel] = oldData;
delete mutableEvent.custom[field]; delete mutableEvent.custom[field];