@grafana/ui
Version:
Grafana Components Library
1 lines • 11.2 kB
Source Map (JSON)
{"version":3,"file":"CodeEditor.mjs","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":[],"mappings":"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"}