feat: add autocomplete to osc arguments

This commit is contained in:
Carlos Valente
2025-02-07 19:38:37 +01:00
committed by Carlos Valente
parent 31799f8fab
commit bac11adeb1
7 changed files with 246 additions and 47 deletions
@@ -0,0 +1,105 @@
import { CustomFields } from 'ontime-types';
const humanConstants = [
'{{human.clock}}',
'{{human.duration}}',
'{{human.expectedEnd}}',
'{{human.runningTimer}}',
'{{human.elapsedTime}}',
'{{human.startedAt}}',
];
const staticAutocompleteOptions = [
'{{clock}}',
'{{timer.addedTime}}',
'{{timer.current}}',
'{{timer.duration}}',
'{{timer.elapsed}}',
'{{timer.expectedFinish}}',
'{{timer.finishedAt}}',
'{{timer.secondaryTimer}}',
'{{timer.startedAt}}',
'{{runtime.selectedEventIndex}}',
'{{runtime.numEvents}}',
'{{runtime.offset}}',
'{{runtime.plannedStart}}',
'{{runtime.plannedEnd}}',
'{{runtime.actualStart}}',
'{{runtime.expectedEnd}}',
'{{currentBlock.block}}',
'{{currentBlock.startedAt}}',
];
const eventStaticPropertiesNow = [
'{{eventNow.id}}',
'{{eventNow.cue}}',
'{{eventNow.title}}',
'{{eventNow.note}}',
'{{eventNow.timeStart}}',
'{{eventNow.timeEnd}}',
'{{eventNow.duration}}',
'{{eventNow.isPublic}}',
'{{eventNow.colour}}',
'{{eventNow.delay}}',
];
const eventStaticPropertiesNext = [
'{{eventNext.id}}',
'{{eventNext.cue}}',
'{{eventNext.title}}',
'{{eventNext.note}}',
'{{eventNext.timeStart}}',
'{{eventNext.timeEnd}}',
'{{eventNext.duration}}',
'{{eventNext.isPublic}}',
'{{eventNext.colour}}',
'{{eventNext.delay}}',
];
/**
* Creates a it of possible autocomplete suggestions
* Based on RuntimeState
* Appends the human readable variants to it
* It is manually kept in sync with the automation parseTemplate functions
*/
export function makeAutoCompleteList(customFields: CustomFields): string[] {
return [
...humanConstants,
...staticAutocompleteOptions,
...eventStaticPropertiesNow,
...Object.entries(customFields).map(([key]) => `{{eventNow.custom.${key}}}`),
...eventStaticPropertiesNext,
...Object.entries(customFields).map(([key]) => `{{eventNext.custom.${key}}}`),
];
}
/**
* Returns the partial string b needed to autocomplete string a
* @example matchRemaining('te', 'test') -> 'st'
* @example matchRemaining('{{', '{{human}}') -> 'man}}'
*/
export function matchRemaining(a: string, b: string) {
if (a === b) {
return '';
}
for (let i = 0; i < b.length; i++) {
const searchString = b.substring(0, i + 1);
if (a.endsWith(searchString)) {
return b.substring(i + 1);
}
}
return '';
}
/**
* Selects the last starting template in a string
*/
export function selectFromLastTemplate(text: string) {
const lastBraceIndex = text.lastIndexOf('{{');
if (lastBraceIndex !== -1) {
return text.slice(lastBraceIndex);
}
return '';
}