From b54b1d8cae944b60420b4418eb91a2d2c1a53fe5 Mon Sep 17 00:00:00 2001 From: Joseph Abbey Date: Thu, 25 Jan 2024 13:40:02 +0000 Subject: [PATCH] Add autocomplete for entity names in templates --- web/main.js | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/web/main.js b/web/main.js index 1ce6ed3..2e9d7a1 100644 --- a/web/main.js +++ b/web/main.js @@ -397,7 +397,15 @@ function toast({ text, color }) { return t; } -let entities, devices, areas, services, schema; +/** @type {Awaited>} */ +let entities; +/** @type {Awaited>} */ +let devices; +/** @type {Awaited>} */ +let areas; +/** @type {Awaited>} */ +let services; +let schema; async function loadSchema() { [entities, devices, areas, services, schema] = await Promise.all([ get_entities(), @@ -624,6 +632,52 @@ require(['vs/editor/editor.main'], async () => { ).then((r) => r.json()) ); + monaco.languages.registerCompletionItemProvider('json', { + triggerCharacters: ['.'], + provideCompletionItems: function (model, position) { + // find out if we are completing a property in the 'dependencies' object. + var textUntilPosition = model.getValueInRange({ + startLineNumber: 1, + startColumn: 1, + endLineNumber: position.lineNumber, + endColumn: position.column, + }); + var match = /"content"\s*:\s*"[^"]*[^\w]?\w+\.[^.\s{}()[\]'"]*$/.test( + textUntilPosition + ); + if (!match) { + return { suggestions: [] }; + } + var word = model.getWordUntilPosition(position); + let i = word.word.length - 1; + while (word.word[i] != '.') { + i--; + } + do { + i--; + } while ( + i >= 0 && + word.word[i].toUpperCase() != word.word[i].toLowerCase() + ); + i++; + var range = { + startLineNumber: position.lineNumber, + endLineNumber: position.lineNumber, + startColumn: word.startColumn + i, + endColumn: word.endColumn, + }; + return { + suggestions: Object.entries(entities).map(([entity, name]) => ({ + label: entity, + kind: monaco.languages.CompletionItemKind.Variable, + documentation: name, + insertText: entity, + range, + })), + }; + }, + }); + const editor = monaco.editor.create(document.getElementById('container'), { model: model, theme: 'mocha',