{"version":3,"file":"CodeEditor.cjs","sources":["../../../../src/components/Monaco/CodeEditor.tsx"],"sourcesContent":["import { css, cx } 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/ThemeContext';\nimport { Themeable2 } from '../../types/theme';\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 = cx(getStyles(theme).container, this.props.containerStyles);\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\n/**\n * Monaco Code editor.\n *\n * https://developers.grafana.com/ui/latest/index.html?path=/docs/inputs-codeeditor--docs\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      overflow: 'hidden',\n    }),\n  };\n};\n"],"names":["PureComponent","monacoLanguageRegistry","registerSuggestions","cx","jsx","selectors","ReactMonacoEditorLazy","withTheme2","css"],"mappings":"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"}