diff --git a/packages/grafana-ui/src/components/Monaco/CodeEditor.tsx b/packages/grafana-ui/src/components/Monaco/CodeEditor.tsx index 3efcfba0782..ed5b1b7890d 100644 --- a/packages/grafana-ui/src/components/Monaco/CodeEditor.tsx +++ b/packages/grafana-ui/src/components/Monaco/CodeEditor.tsx @@ -17,6 +17,7 @@ type Props = CodeEditorProps & Themeable2; class UnthemedCodeEditor extends PureComponent { completionCancel?: monacoType.IDisposable; monaco?: Monaco; + modelId?: string; constructor(props: Props) { super(props); @@ -44,8 +45,8 @@ class UnthemedCodeEditor extends PureComponent { return; } - if (getSuggestions) { - this.completionCancel = registerSuggestions(this.monaco, language, getSuggestions); + if (getSuggestions && this.modelId) { + this.completionCancel = registerSuggestions(this.monaco, language, getSuggestions, this.modelId); } } @@ -85,20 +86,21 @@ class UnthemedCodeEditor extends PureComponent { handleBeforeMount = (monaco: Monaco) => { this.monaco = monaco; - const { language, getSuggestions, onBeforeEditorMount } = this.props; - if (getSuggestions) { - this.completionCancel = registerSuggestions(monaco, language, getSuggestions); - } + const { onBeforeEditorMount } = this.props; onBeforeEditorMount?.(monaco); }; handleOnMount = (editor: MonacoEditorType, monaco: Monaco) => { - const { onChange, onEditorDidMount } = this.props; + const { getSuggestions, language, onChange, onEditorDidMount } = this.props; + this.modelId = editor.getModel()?.id; this.getEditorValue = () => editor.getValue(); + if (getSuggestions && this.modelId) { + this.completionCancel = registerSuggestions(monaco, language, getSuggestions, this.modelId); + } // Save when pressing Ctrl+S or Cmd+S editor.onKeyDown((e: monacoType.IKeyboardEvent) => { if (e.keyCode === monaco.KeyCode.KeyS && (e.ctrlKey || e.metaKey)) { diff --git a/packages/grafana-ui/src/components/Monaco/suggestions.ts b/packages/grafana-ui/src/components/Monaco/suggestions.ts index b73b8d4ef25..cb9a78c4a95 100644 --- a/packages/grafana-ui/src/components/Monaco/suggestions.ts +++ b/packages/grafana-ui/src/components/Monaco/suggestions.ts @@ -73,7 +73,8 @@ function mapKinds(monaco: Monaco, sug?: CodeEditorSuggestionItemKind): monacoTyp export function registerSuggestions( monaco: Monaco, language: string, - getSuggestions: CodeEditorSuggestionProvider + getSuggestions: CodeEditorSuggestionProvider, + modelId: string ): monacoType.IDisposable | undefined { if (!language || !getSuggestions) { return undefined; @@ -82,6 +83,11 @@ export function registerSuggestions( triggerCharacters: ['$'], provideCompletionItems: (model, position, context) => { + // only return these suggestions for the specified modelId + // prevents duplicate suggestions when multiple editors are open + if (model.id !== modelId) { + return undefined; + } const range = { startLineNumber: position.lineNumber, endLineNumber: position.lineNumber,