@grafana/ui
Version:
Grafana Components Library
1 lines • 10.9 kB
Source Map (JSON)
{"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":";;;;;;;;;;;;;AAgBA,MAAM,2BAA2B,aAAqB,CAAA;AAAA,EAKpD,YAAY,KAAc,EAAA;AACxB,IAAA,KAAA,CAAM,KAAK,CAAA;AAqCb,IAAA,IAAA,CAAA,kBAAA,GAAqB,MAAM;AACzB,MAAM,MAAA,EAAE,QAAS,EAAA,GAAI,IAAK,CAAA,KAAA;AAE1B,MAAM,MAAA,cAAA,GAAiB,sBAAuB,CAAA,WAAA,CAAY,QAAQ,CAAA;AAElE,MAAA,IAAI,cAAgB,EAAA;AAClB,QAAA,OAAO,eAAe,IAAK,EAAA;AAAA;AAG7B,MAAA,OAAO,QAAQ,OAAQ,EAAA;AAAA,KACzB;AAGA;AAAA,IAAA,IAAA,CAAA,cAAA,GAAiB,MAAM,EAAA;AAEvB,IAAA,IAAA,CAAA,MAAA,GAAS,MAAM;AACb,MAAM,MAAA,EAAE,MAAO,EAAA,GAAI,IAAK,CAAA,KAAA;AACxB,MAAA,IAAI,MAAQ,EAAA;AACV,QAAO,MAAA,CAAA,IAAA,CAAK,gBAAgB,CAAA;AAAA;AAC9B,KACF;AAEA,IAAA,IAAA,CAAA,OAAA,GAAU,MAAM;AACd,MAAM,MAAA,EAAE,OAAQ,EAAA,GAAI,IAAK,CAAA,KAAA;AACzB,MAAA,IAAI,OAAS,EAAA;AACX,QAAQ,OAAA,CAAA,IAAA,CAAK,gBAAgB,CAAA;AAAA;AAC/B,KACF;AAEA,IAAA,IAAA,CAAA,MAAA,GAAS,MAAM;AACb,MAAM,MAAA,EAAE,MAAO,EAAA,GAAI,IAAK,CAAA,KAAA;AACxB,MAAA,IAAI,MAAQ,EAAA;AACV,QAAO,MAAA,CAAA,IAAA,CAAK,gBAAgB,CAAA;AAAA;AAC9B,KACF;AAEA,IAAA,IAAA,CAAA,iBAAA,GAAoB,CAAC,MAAmB,KAAA;AACtC,MAAA,IAAA,CAAK,MAAS,GAAA,MAAA;AAEd,MAAM,MAAA,EAAE,mBAAoB,EAAA,GAAI,IAAK,CAAA,KAAA;AAErC,MAAsB,mBAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,mBAAA,CAAA,MAAA,CAAA;AAAA,KACxB;AAEA,IAAgB,IAAA,CAAA,aAAA,GAAA,CAAC,QAA0B,MAAmB,KAAA;AAvGhE,MAAA,IAAA,EAAA,EAAA,EAAA;AAwGI,MAAA,MAAM,EAAE,cAAgB,EAAA,QAAA,EAAU,QAAU,EAAA,gBAAA,KAAqB,IAAK,CAAA,KAAA;AAEtE,MAAA,IAAA,CAAK,OAAU,GAAA,CAAA,EAAA,GAAA,MAAA,CAAO,QAAS,EAAA,KAAhB,IAAmB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,EAAA;AAClC,MAAK,IAAA,CAAA,cAAA,GAAiB,MAAM,MAAA,CAAO,QAAS,EAAA;AAE5C,MAAI,IAAA,cAAA,IAAkB,KAAK,OAAS,EAAA;AAClC,QAAA,IAAA,CAAK,mBAAmB,mBAAoB,CAAA,MAAA,EAAQ,QAAU,EAAA,cAAA,EAAgB,KAAK,OAAO,CAAA;AAAA;AAI5F,MAAO,MAAA,CAAA,SAAA,CAAU,CAAC,CAAiC,KAAA;AACjD,QAAI,IAAA,CAAA,CAAE,YAAY,MAAO,CAAA,OAAA,CAAQ,SAAS,CAAE,CAAA,OAAA,IAAW,EAAE,OAAU,CAAA,EAAA;AACjE,UAAA,CAAA,CAAE,cAAe,EAAA;AACjB,UAAA,IAAA,CAAK,MAAO,EAAA;AAAA;AACd,OACD,CAAA;AAED,MAAA,IAAI,QAAU,EAAA;AACZ,QAAO,CAAA,EAAA,GAAA,MAAA,CAAA,QAAA,OAAP,IAAmB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,kBAAA,CAAmB,MAAM,QAAS,CAAA,MAAA,CAAO,UAAU,CAAA,CAAA;AAAA;AAGxE,MAAA,IAAI,gBAAkB,EAAA;AACpB,QAAA,gBAAA,CAAiB,QAAQ,MAAM,CAAA;AAAA;AACjC,KACF;AAAA;AAzGA,EAEA,oBAAuB,GAAA;AAzBzB,IAAA,IAAA,EAAA,EAAA,EAAA;AA0BI,IAAA,IAAI,KAAK,gBAAkB,EAAA;AACzB,MAAA,IAAA,CAAK,iBAAiB,OAAQ,EAAA;AAAA;AAGhC,IAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,IAAA,CAAK,OAAM,mBAAX,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,CAAA,EAAA,CAAA;AAAA;AACF,EAEA,mBAAmB,QAAiB,EAAA;AAClC,IAAA,MAAM,EAAE,cAAA,EAAgB,QAAS,EAAA,GAAI,IAAK,CAAA,KAAA;AAE1C,IAAM,MAAA,WAAA,GAAc,SAAS,QAAa,KAAA,QAAA;AAC1C,IAAM,MAAA,iBAAA,GAAoB,SAAS,cAAmB,KAAA,cAAA;AAEtD,IAAA,IAAI,qBAAqB,WAAa,EAAA;AACpC,MAAA,IAAI,KAAK,gBAAkB,EAAA;AACzB,QAAA,IAAA,CAAK,iBAAiB,OAAQ,EAAA;AAAA;AAGhC,MAAI,IAAA,CAAC,KAAK,MAAQ,EAAA;AAChB,QAAA,OAAA,CAAQ,KAAK,gCAAgC,CAAA;AAC7C,QAAA;AAAA;AAGF,MAAI,IAAA,cAAA,IAAkB,KAAK,OAAS,EAAA;AAClC,QAAA,IAAA,CAAK,mBAAmB,mBAAoB,CAAA,IAAA,CAAK,QAAQ,QAAU,EAAA,cAAA,EAAgB,KAAK,OAAO,CAAA;AAAA;AACjG;AAGF,IAAA,IAAI,WAAa,EAAA;AACf,MAAA,IAAA,CAAK,kBAAmB,EAAA;AAAA;AAC1B;AACF,EAyEA,MAAS,GAAA;AAlIX,IAAA,IAAA,EAAA,EAAA,EAAA;AAmII,IAAM,MAAA,EAAE,KAAO,EAAA,QAAA,EAAU,KAAO,EAAA,MAAA,EAAQ,WAAa,EAAA,eAAA,EAAiB,QAAU,EAAA,QAAA,EAAU,aAAc,EAAA,GACtG,IAAK,CAAA,KAAA;AACP,IAAA,MAAM,EAAE,uBAAyB,EAAA,GAAG,iBAAkB,EAAA,GAAI,wCAAiB,EAAC;AAE5E,IAAA,MAAM,KAAQ,GAAA,CAAA,EAAA,GAAA,IAAA,CAAK,KAAM,CAAA,KAAA,KAAX,IAAoB,GAAA,EAAA,GAAA,EAAA;AAClC,IAAM,MAAA,QAAA,GAAW,MAAM,MAAS,GAAA,GAAA;AAEhC,IAAA,MAAM,mBAAkB,EAAK,GAAA,IAAA,CAAA,KAAA,CAAM,oBAAX,IAA8B,GAAA,EAAA,GAAA,SAAA,CAAU,KAAK,CAAE,CAAA,SAAA;AAEvE,IAAA,MAAM,OAAyB,GAAA;AAAA,MAC7B,QAAA,EAAU,WAAW,IAAO,GAAA,KAAA;AAAA,MAC5B,OAAS,EAAA,CAAA;AAAA,MACT,QAAU,EAAA,KAAA;AAAA,MACV,WAAa,EAAA,KAAA;AAAA,MACb,OAAS,EAAA;AAAA,QACP,SAAS,QAAY,IAAA,WAAA;AAAA,QACrB,gBAAkB,EAAA;AAAA,OACpB;AAAA,MAEA,QAAA;AAAA,MACA,mBAAqB,EAAA,CAAA;AAAA,MACrB,oBAAA,EAAsB,CAAI,GAAA,KAAA,CAAM,OAAQ,CAAA,QAAA;AAAA,MACxC,mBAAqB,EAAA,KAAA;AAAA,MACrB,eAAiB,EAAA,IAAA;AAAA,MACjB,OAAS,EAAA;AAAA,QACP,GAAA,EAAK,GAAM,GAAA,KAAA,CAAM,OAAQ,CAAA,QAAA;AAAA,QACzB,MAAA,EAAQ,GAAM,GAAA,KAAA,CAAM,OAAQ,CAAA;AAAA,OAC9B;AAAA,MACA,oBAAsB,EAAA,IAAA;AAAA;AAAA,MAEtB,SAAW,EAAA;AAAA,QACT,yBAAyB,uBAA2B,IAAA,IAAA,GAAA,uBAAA,GAAA;AAAA;AACtD,KACF;AAEA,IAAA,IAAI,CAAC,eAAiB,EAAA;AACpB,MAAA,OAAA,CAAQ,WAAc,GAAA,KAAA;AACtB,MAAA,OAAA,CAAQ,OAAU,GAAA,KAAA;AAClB,MAAA,OAAA,CAAQ,WAAc,GAAA,KAAA;AACtB,MAAA,OAAA,CAAQ,mBAAsB,GAAA,CAAA;AAAA;AAGhC,IACE,uBAAA,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAW,EAAA,eAAA;AAAA,QACX,SAAS,IAAK,CAAA,OAAA;AAAA,QACd,QAAQ,IAAK,CAAA,MAAA;AAAA,QACb,aAAA,EAAa,SAAU,CAAA,UAAA,CAAW,UAAW,CAAA,SAAA;AAAA,QAE7C,QAAA,kBAAA,GAAA;AAAA,UAAC,qBAAA;AAAA,UAAA;AAAA,YACC,KAAA;AAAA,YACA,MAAA;AAAA,YACA,QAAA;AAAA,YACA,KAAA;AAAA,YACA,OAAS,EAAA;AAAA,cACP,GAAG,OAAA;AAAA,cACH,GAAI,gDAAqB;AAAC,aAC5B;AAAA,YACA,aAAa,IAAK,CAAA,iBAAA;AAAA,YAClB,SAAS,IAAK,CAAA,aAAA;AAAA,YACd,gBAAkB,EAAA;AAAA;AAAA;AACpB;AAAA,KACF;AAAA;AAGN;AAEa,MAAA,UAAA,GAAa,WAAW,kBAAkB;AAEvD,MAAM,SAAA,GAAY,CAAC,KAAyB,KAAA;AAC1C,EAAO,OAAA;AAAA,IACL,WAAW,GAAI,CAAA;AAAA,MACb,YAAA,EAAc,KAAM,CAAA,KAAA,CAAM,MAAO,CAAA,OAAA;AAAA,MACjC,MAAQ,EAAA,CAAA,UAAA,EAAa,KAAM,CAAA,UAAA,CAAW,MAAM,WAAW,CAAA;AAAA,KACxD;AAAA,GACH;AACF,CAAA;;;;"}