diff --git a/app/docker/views/images/build/buildimage.html b/app/docker/views/images/build/buildimage.html index f9f9e1662..d6e09e1ad 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/edge/components/edge-job-form/edgeJobForm.html b/app/edge/components/edge-job-form/edgeJobForm.html index 44d86681a..3f5828532 100644 --- a/app/edge/components/edge-job-form/edgeJobForm.html +++ b/app/edge/components/edge-job-form/edgeJobForm.html @@ -145,6 +145,7 @@ placeholder="Define or paste the content of your script file here" on-change="($ctrl.editorUpdate)" value="$ctrl.model.FileContent" + shell="true" > diff --git a/app/kubernetes/views/deploy/deploy.html b/app/kubernetes/views/deploy/deploy.html index 10a0d4d29..111fd6e44 100644 --- a/app/kubernetes/views/deploy/deploy.html +++ b/app/kubernetes/views/deploy/deploy.html @@ -195,7 +195,7 @@
- +
diff --git a/app/portainer/components/code-editor/code-editor.html b/app/portainer/components/code-editor/code-editor.html index 9347d7c8f..08ea4d41c 100644 --- a/app/portainer/components/code-editor/code-editor.html +++ b/app/portainer/components/code-editor/code-editor.html @@ -2,6 +2,8 @@ id="$ctrl.identifier" placeholder="$ctrl.placeholder" yaml="$ctrl.yml" + docker-file="$ctrl.dockerFile" + shell="$ctrl.shell" readonly="$ctrl.readOnly" on-change="($ctrl.handleChange)" value="$ctrl.value" diff --git a/app/portainer/components/code-editor/code-editor.js b/app/portainer/components/code-editor/code-editor.js index a4347a0a6..c20f6e6fb 100644 --- a/app/portainer/components/code-editor/code-editor.js +++ b/app/portainer/components/code-editor/code-editor.js @@ -7,6 +7,8 @@ angular.module('portainer.app').component('codeEditor', { identifier: '@', placeholder: '@', yml: '<', + dockerFile: '<', + shell: '<', readOnly: '<', onChange: '<', value: '<', diff --git a/app/portainer/components/environment-variables-panel/environment-variables-panel.html b/app/portainer/components/environment-variables-panel/environment-variables-panel.html index 0007c8045..6e9720b09 100644 --- a/app/portainer/components/environment-variables-panel/environment-variables-panel.html +++ b/app/portainer/components/environment-variables-panel/environment-variables-panel.html @@ -24,7 +24,7 @@ Switch to simple mode to define variables line by line, or load from .env file
- +
diff --git a/app/portainer/react/components/index.ts b/app/portainer/react/components/index.ts index 5256a0130..c470d3b08 100644 --- a/app/portainer/react/components/index.ts +++ b/app/portainer/react/components/index.ts @@ -189,6 +189,8 @@ export const componentsModule = angular 'id', 'placeholder', 'yaml', + 'dockerFile', + 'shell', '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..7afd5becb 100644 --- a/app/react/components/CodeEditor.tsx +++ b/app/react/components/CodeEditor.tsx @@ -1,6 +1,8 @@ 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 { shell } from '@codemirror/legacy-modes/mode/shell'; import { useMemo } from 'react'; import { createTheme } from '@uiw/codemirror-themes'; import { tags as highlightTags } from '@lezer/highlight'; @@ -12,6 +14,8 @@ interface Props { id: string; placeholder?: string; yaml?: boolean; + dockerFile?: boolean; + shell?: boolean; readonly?: boolean; onChange: (value: string) => void; value: string; @@ -37,10 +41,19 @@ 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) +); +const shellLanguage = new LanguageSupport(StreamLanguage.define(shell)); export function CodeEditor({ id, @@ -50,8 +63,22 @@ export function CodeEditor({ value, height = '500px', yaml: isYaml, + dockerFile: isDockerFile, + shell: isShell, }: Props) { - const extensions = useMemo(() => (isYaml ? [yamlLanguage] : []), [isYaml]); + const extensions = useMemo(() => { + const extensions = []; + if (isYaml) { + extensions.push(yamlLanguage); + } + if (isDockerFile) { + extensions.push(dockerFileLanguage); + } + if (isShell) { + extensions.push(shellLanguage); + } + return extensions; + }, [isYaml, isDockerFile, isShell]); return ( <> @@ -67,6 +94,7 @@ export function CodeEditor({ height={height} basicSetup={{ highlightSelectionMatches: false, + autocompletion: false, }} />