diff --git a/app/docker/views/images/build/buildimage.html b/app/docker/views/images/build/buildimage.html
index 36c006347..2e28f78ee 100644
--- a/app/docker/views/images/build/buildimage.html
+++ b/app/docker/views/images/build/buildimage.html
@@ -87,7 +87,7 @@
diff --git a/app/kubernetes/views/deploy/deploy.html b/app/kubernetes/views/deploy/deploy.html
index a79e3a991..196f57b70 100644
--- a/app/kubernetes/views/deploy/deploy.html
+++ b/app/kubernetes/views/deploy/deploy.html
@@ -184,7 +184,7 @@
diff --git a/app/portainer/react/components/index.ts b/app/portainer/react/components/index.ts
index 5256a0130..8d64dcf54 100644
--- a/app/portainer/react/components/index.ts
+++ b/app/portainer/react/components/index.ts
@@ -189,6 +189,7 @@ export const componentsModule = angular
'id',
'placeholder',
'yaml',
+ 'dockerFile',
'readonly',
'onChange',
'value',
diff --git a/app/react/components/CodeEditor.module.css b/app/react/components/CodeEditor.module.css
index c183000b5..f9cc51ed5 100644
--- a/app/react/components/CodeEditor.module.css
+++ b/app/react/components/CodeEditor.module.css
@@ -4,6 +4,8 @@
--text-cm-string-color: var(--red-3);
--text-cm-number-color: var(--green-1);
--text-cm-keyword-color: var(--ui-blue-dark-9);
+ --text-cm-comment-color: var(--ui-orange-6);
+ --text-cm-variable-name-color: var(--ui-green-8);
--text-codemirror-color: var(--black-color);
--bg-codemirror-color: var(--white-color);
--bg-codemirror-gutters-color: var(--grey-17);
diff --git a/app/react/components/CodeEditor.tsx b/app/react/components/CodeEditor.tsx
index 08fb66b82..f59e5899e 100644
--- a/app/react/components/CodeEditor.tsx
+++ b/app/react/components/CodeEditor.tsx
@@ -1,6 +1,7 @@
import CodeMirror from '@uiw/react-codemirror';
import { StreamLanguage, LanguageSupport } from '@codemirror/language';
import { yaml } from '@codemirror/legacy-modes/mode/yaml';
+import { dockerFile } from '@codemirror/legacy-modes/mode/dockerfile';
import { useMemo } from 'react';
import { createTheme } from '@uiw/codemirror-themes';
import { tags as highlightTags } from '@lezer/highlight';
@@ -12,6 +13,7 @@ interface Props {
id: string;
placeholder?: string;
yaml?: boolean;
+ dockerFile?: boolean;
readonly?: boolean;
onChange: (value: string) => void;
value: string;
@@ -37,10 +39,18 @@ const theme = createTheme({
},
{ tag: highlightTags.number, color: 'var(--text-cm-number-color)' },
{ tag: highlightTags.keyword, color: 'var(--text-cm-keyword-color)' },
+ { tag: highlightTags.comment, color: 'var(--text-cm-comment-color)' },
+ {
+ tag: highlightTags.variableName,
+ color: 'var(--text-cm-variable-name-color)',
+ },
],
});
const yamlLanguage = new LanguageSupport(StreamLanguage.define(yaml));
+const dockerFileLanguage = new LanguageSupport(
+ StreamLanguage.define(dockerFile)
+);
export function CodeEditor({
id,
@@ -50,8 +60,18 @@ export function CodeEditor({
value,
height = '500px',
yaml: isYaml,
+ dockerFile: isDockerFile,
}: Props) {
- const extensions = useMemo(() => (isYaml ? [yamlLanguage] : []), [isYaml]);
+ const extensions = useMemo(() => {
+ const extensions = [];
+ if (isYaml) {
+ extensions.push(yamlLanguage);
+ }
+ if (isDockerFile) {
+ extensions.push(dockerFileLanguage);
+ }
+ return extensions;
+ }, [isYaml, isDockerFile]);
return (
<>
@@ -67,6 +87,7 @@ export function CodeEditor({
height={height}
basicSetup={{
highlightSelectionMatches: false,
+ autocompletion: false,
}}
/>
>