mirror of
https://github.com/cpvalente/ontime.git
synced 2026-09-10 00:29:41 +00:00
fix: persistence of custom fields (#1078)
This commit is contained in:
@@ -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];
|
||||||
|
|||||||
Reference in New Issue
Block a user