{"version":3,"file":"CodeEditor.mjs","sources":["../../../../src/components/Monaco/CodeEditor.tsx"],"sourcesContent":["import { css } from '@emotion/css';\nimport type * as monacoType from 'monaco-editor/esm/vs/editor/editor.api';\nimport { PureComponent } from 'react';\n\nimport { GrafanaTheme2, monacoLanguageRegistry } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport { withTheme2 } from '../../themes';\nimport { Themeable2 } from '../../types';\n\nimport { ReactMonacoEditorLazy } from './ReactMonacoEditorLazy';\nimport { registerSuggestions } from './suggestions';\nimport { CodeEditorProps, Monaco, MonacoEditor as MonacoEditorType, MonacoOptions } from './types';\n\ntype Props = CodeEditorProps & Themeable2;\n\nclass UnthemedCodeEditor extends PureComponent<Props> {\n  completionCancel?: monacoType.IDisposable;\n  monaco?: Monaco;\n  modelId?: string;\n\n  constructor(props: Props) {\n    super(props);\n  }\n\n  componentWillUnmount() {\n    if (this.completionCancel) {\n      this.completionCancel.dispose();\n    }\n\n    this.props.onEditorWillUnmount?.();\n  }\n\n  componentDidUpdate(oldProps: Props) {\n    const { getSuggestions, language } = this.props;\n\n    const newLanguage = oldProps.language !== language;\n    const newGetSuggestions = oldProps.getSuggestions !== getSuggestions;\n\n    if (newGetSuggestions || newLanguage) {\n      if (this.completionCancel) {\n        this.completionCancel.dispose();\n      }\n\n      if (!this.monaco) {\n        console.warn('Monaco instance not loaded yet');\n        return;\n      }\n\n      if (getSuggestions && this.modelId) {\n        this.completionCancel = registerSuggestions(this.monaco, language, getSuggestions, this.modelId);\n      }\n    }\n\n    if (newLanguage) {\n      this.loadCustomLanguage();\n    }\n  }\n\n  loadCustomLanguage = () => {\n    const { language } = this.props;\n\n    const customLanguage = monacoLanguageRegistry.getIfExists(language);\n\n    if (customLanguage) {\n      return customLanguage.init();\n    }\n\n    return Promise.resolve();\n  };\n\n  // This is replaced with a real function when the actual editor mounts\n  getEditorValue = () => '';\n\n  onBlur = () => {\n    const { onBlur } = this.props;\n    if (onBlur) {\n      onBlur(this.getEditorValue());\n    }\n  };\n\n  onFocus = () => {\n    const { onFocus } = this.props;\n    if (onFocus) {\n      onFocus(this.getEditorValue());\n    }\n  };\n\n  onSave = () => {\n    const { onSave } = this.props;\n    if (onSave) {\n      onSave(this.getEditorValue());\n    }\n  };\n\n  handleBeforeMount = (monaco: Monaco) => {\n    this.monaco = monaco;\n\n    const { onBeforeEditorMount } = this.props;\n\n    onBeforeEditorMount?.(monaco);\n  };\n\n  handleOnMount = (editor: MonacoEditorType, monaco: Monaco) => {\n    const { getSuggestions, language, onChange, onEditorDidMount } = this.props;\n\n    this.modelId = editor.getModel()?.id;\n    this.getEditorValue = () => editor.getValue();\n\n    if (getSuggestions && this.modelId) {\n      this.completionCancel = registerSuggestions(monaco, language, getSuggestions, this.modelId);\n    }\n\n    // Save when pressing Ctrl+S or Cmd+S\n    editor.onKeyDown((e: monacoType.IKeyboardEvent) => {\n      if (e.keyCode === monaco.KeyCode.KeyS && (e.ctrlKey || e.metaKey)) {\n        e.preventDefault();\n        this.onSave();\n      }\n    });\n\n    if (onChange) {\n      editor.getModel()?.onDidChangeContent(() => onChange(editor.getValue()));\n    }\n\n    if (onEditorDidMount) {\n      onEditorDidMount(editor, monaco);\n    }\n  };\n\n  render() {\n    const { theme, language, width, height, showMiniMap, showLineNumbers, readOnly, wordWrap, monacoOptions } =\n      this.props;\n    const { alwaysConsumeMouseWheel, ...restMonacoOptions } = monacoOptions ?? {};\n\n    const value = this.props.value ?? '';\n    const longText = value.length > 100;\n\n    const containerStyles = this.props.containerStyles ?? getStyles(theme).container;\n\n    const options: MonacoOptions = {\n      wordWrap: wordWrap ? 'on' : 'off',\n      tabSize: 2,\n      codeLens: false,\n      contextmenu: false,\n      minimap: {\n        enabled: longText && showMiniMap,\n        renderCharacters: false,\n      },\n\n      readOnly,\n      lineNumbersMinChars: 4,\n      lineDecorationsWidth: 1 * theme.spacing.gridSize,\n      overviewRulerBorder: false,\n      automaticLayout: true,\n      padding: {\n        top: 0.5 * theme.spacing.gridSize,\n        bottom: 0.5 * theme.spacing.gridSize,\n      },\n      fixedOverflowWidgets: true, // Ensures suggestions menu is drawn on top\n\n      scrollbar: {\n        alwaysConsumeMouseWheel: alwaysConsumeMouseWheel ?? false,\n      },\n    };\n\n    if (!showLineNumbers) {\n      options.glyphMargin = false;\n      options.folding = false;\n      options.lineNumbers = 'off';\n      options.lineNumbersMinChars = 0;\n    }\n\n    return (\n      <div\n        className={containerStyles}\n        onFocus={this.onFocus}\n        onBlur={this.onBlur}\n        data-testid={selectors.components.CodeEditor.container}\n      >\n        <ReactMonacoEditorLazy\n          width={width}\n          height={height}\n          language={language}\n          value={value}\n          options={{\n            ...options,\n            ...(restMonacoOptions ?? {}),\n          }}\n          beforeMount={this.handleBeforeMount}\n          onMount={this.handleOnMount}\n          keepCurrentModel={true}\n        />\n      </div>\n    );\n  }\n}\n\nexport const CodeEditor = withTheme2(UnthemedCodeEditor);\n\nconst getStyles = (theme: GrafanaTheme2) => {\n  return {\n    container: css({\n      borderRadius: theme.shape.radius.default,\n      border: `1px solid ${theme.components.input.borderColor}`,\n    }),\n  };\n};\n"],"names":[],"mappings":"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"}