diff --git a/packages/grafana-ui/src/components/Monaco/CodeEditor.tsx b/packages/grafana-ui/src/components/Monaco/CodeEditor.tsx index ee203a41fb7..ef5819b74c7 100644 --- a/packages/grafana-ui/src/components/Monaco/CodeEditor.tsx +++ b/packages/grafana-ui/src/components/Monaco/CodeEditor.tsx @@ -95,7 +95,8 @@ class UnthemedCodeEditor extends PureComponent { }; handleOnMount = (editor: MonacoEditorType, monaco: Monaco) => { - const { onEditorDidMount } = this.props; + const { onChange, onEditorDidMount } = this.props; + this.getEditorValue = () => editor.getValue(); editor.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyS, this.onSave); @@ -103,6 +104,7 @@ class UnthemedCodeEditor extends PureComponent { if (onEditorDidMount) { languagePromise.then(() => onEditorDidMount(editor, monaco)); + editor.getModel()?.onDidChangeContent(() => onChange?.(editor.getValue())); } }; diff --git a/packages/grafana-ui/src/components/Monaco/types.ts b/packages/grafana-ui/src/components/Monaco/types.ts index 8e4ef7805c2..7c1c1e7581f 100644 --- a/packages/grafana-ui/src/components/Monaco/types.ts +++ b/packages/grafana-ui/src/components/Monaco/types.ts @@ -42,6 +42,9 @@ export interface CodeEditorProps { /** Handler to be performed when editor is blurred */ onBlur?: CodeEditorChangeHandler; + /** Handler to be performed whenever the text inside the editor changes */ + onChange?: CodeEditorChangeHandler; + /** Handler to be performed when Cmd/Ctrl+S is pressed */ onSave?: CodeEditorChangeHandler; diff --git a/public/app/plugins/datasource/tempo/traceql/TraceQLEditor.tsx b/public/app/plugins/datasource/tempo/traceql/TraceQLEditor.tsx index 548ed623c65..cbded5ced6e 100644 --- a/public/app/plugins/datasource/tempo/traceql/TraceQLEditor.tsx +++ b/public/app/plugins/datasource/tempo/traceql/TraceQLEditor.tsx @@ -22,7 +22,7 @@ interface Props { } export function TraceQLEditor(props: Props) { - const { onRunQuery, placeholder } = props; + const { onChange, onRunQuery, placeholder } = props; const setupAutocompleteFn = useAutocomplete(props.datasource); const theme = useTheme2(); const styles = getStyles(theme, placeholder); @@ -31,7 +31,8 @@ export function TraceQLEditor(props: Props) {