@grafana/ui
Version:
Grafana Components Library
1 lines • 6.36 kB
Source Map (JSON)
{"version":3,"file":"CodeEditor.mjs","sources":["../../../../src/components/CodeMirror/CodeEditor.tsx"],"sourcesContent":["import { acceptCompletion, autocompletion, startCompletion } from '@codemirror/autocomplete';\nimport { EditorState, Prec } from '@codemirror/state';\nimport { keymap } from '@codemirror/view';\nimport { vscodeDark, vscodeLight } from '@uiw/codemirror-theme-vscode';\nimport CodeMirror, { EditorView } from '@uiw/react-codemirror';\nimport { memo, useMemo } from 'react';\n\nimport { t } from '@grafana/i18n';\n\nimport { useTheme2 } from '../../themes/ThemeContext';\nimport { Alert } from '../Alert/Alert';\n\nimport {\n type CodeMirrorCompletionMode,\n type CodeMirrorCompletionSource,\n type CodeMirrorEditorProps,\n type CodeMirrorExtension,\n} from './types';\nimport { useLanguageExtension } from './useLanguageExtension';\n\nconst getCompletionExtensions = (\n sources: readonly CodeMirrorCompletionSource[] | undefined,\n mode: CodeMirrorCompletionMode\n): CodeMirrorExtension[] => {\n if (!sources || sources.length === 0) {\n return [];\n }\n\n if (mode === 'override') {\n return [autocompletion({ override: [...sources] }), autocompleteSpaceKeymap];\n }\n\n // Merge: enable autocompletion and contribute the sources via language data\n // so they're combined with whatever the active language registers.\n return [\n autocompletion(),\n autocompleteSpaceKeymap,\n ...sources.map((source) => EditorState.languageData.of(() => [{ autocomplete: source }])),\n ];\n};\n\nconst getAccessibilityExtensions = (\n ariaLabel: string | undefined,\n ariaLabelledby: string | undefined\n): CodeMirrorExtension[] => {\n if (!ariaLabel && !ariaLabelledby) {\n return [];\n }\n\n return [\n EditorView.contentAttributes.of({\n ...(ariaLabel ? { 'aria-label': ariaLabel } : {}),\n ...(ariaLabelledby ? { 'aria-labelledby': ariaLabelledby } : {}),\n }),\n ];\n};\n\n// Bind Tab to accept completions before the default indent behavior\nconst autocompleteTabKeymap = Prec.highest(\n keymap.of([\n {\n key: 'Tab',\n run: acceptCompletion,\n },\n ])\n);\n\nconst autocompleteSpaceKeymap = Prec.highest(\n keymap.of([\n {\n key: 'Space',\n run: (view) => {\n if (view.state.readOnly) {\n return false;\n }\n\n view.dispatch(view.state.replaceSelection(' '));\n startCompletion(view);\n return true;\n },\n },\n ])\n);\n\nexport const CodeEditor = memo(function CodeEditor({\n value,\n language,\n height = '200px',\n onChange,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledby,\n completionSources,\n completionMode = 'merge',\n extensions: additionalExtensions,\n}: CodeMirrorEditorProps) {\n const theme = useTheme2();\n const { extension: languageExtension, error: languageExtensionError } = useLanguageExtension(language);\n\n const extensions = useMemo(\n () => [\n autocompleteTabKeymap,\n ...getAccessibilityExtensions(ariaLabel, ariaLabelledby),\n ...(languageExtension ? [languageExtension] : []),\n ...getCompletionExtensions(completionSources, completionMode),\n ...(additionalExtensions ?? []),\n ],\n [ariaLabel, ariaLabelledby, languageExtension, completionSources, completionMode, additionalExtensions]\n );\n return (\n <>\n {languageExtensionError && (\n <Alert title={t('grafana-ui.code-mirror.language-load-failed', 'Syntax highlighting failed to load')}>\n {t(\n 'grafana-ui.code-mirror.language-load-failed-description',\n 'The editor will continue without language-specific features.'\n )}\n </Alert>\n )}\n <CodeMirror\n theme={theme.isDark ? vscodeDark : vscodeLight}\n value={value}\n height={height}\n extensions={extensions}\n onChange={onChange}\n />\n </>\n );\n});\n"],"names":["CodeEditor"],"mappings":"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"}