Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 55 additions & 0 deletions frontend/src/components/CodeEditor/index.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
import React, { useEffect, useState } from 'react';
import ace from 'ace-builds';
import GeneralCodeEditor, { CodeEditorProps as GeneralCodeEditorProps } from '@cloudscape-design/components/code-editor';

ace.config.set('useWorker', false);

import { Mode } from '@cloudscape-design/global-styles';

import { useAppSelector } from 'hooks';

import { selectSystemMode } from 'App/slice';

import { CODE_EDITOR_I18N_STRINGS } from './constants';

import 'ace-builds/src-noconflict/theme-cloud_editor';
import 'ace-builds/src-noconflict/theme-cloud_editor_dark';
import 'ace-builds/src-noconflict/mode-yaml';
import 'ace-builds/src-noconflict/mode-json';
import 'ace-builds/src-noconflict/ext-language_tools';

export type CodeEditorProps = Omit<GeneralCodeEditorProps, 'ace' | 'onPreferencesChange' | 'themes' | 'preferences'>;

export const CodeEditor: React.FC<CodeEditorProps> = (props) => {
const systemMode = useAppSelector(selectSystemMode) ?? '';

const [codeEditorPreferences, setCodeEditorPreferences] = useState<GeneralCodeEditorProps['preferences']>(() => ({
theme: systemMode === Mode.Dark ? 'cloud_editor_dark' : 'cloud_editor',
}));

useEffect(() => {
if (systemMode === Mode.Dark)
setCodeEditorPreferences({
theme: 'cloud_editor_dark',
});
else
setCodeEditorPreferences({
theme: 'cloud_editor',
});
}, [systemMode]);

const onCodeEditorPreferencesChange: GeneralCodeEditorProps['onPreferencesChange'] = (e) => {
setCodeEditorPreferences(e.detail);
};

return (
<GeneralCodeEditor
i18nStrings={CODE_EDITOR_I18N_STRINGS}
ace={ace}
themes={{ light: [], dark: [] }}
preferences={codeEditorPreferences}
onPreferencesChange={onCodeEditorPreferencesChange}
{...props}
/>
);
};
45 changes: 2 additions & 43 deletions frontend/src/components/form/CodeEditor/index.tsx
Original file line number Diff line number Diff line change
@@ -1,26 +1,11 @@
import React, { useEffect, useState } from 'react';
import React from 'react';
import { Controller, FieldValues } from 'react-hook-form';
import ace from 'ace-builds';
import CodeEditor, { CodeEditorProps } from '@cloudscape-design/components/code-editor';
import FormField from '@cloudscape-design/components/form-field';

import { CODE_EDITOR_I18N_STRINGS } from './constants';
import { CodeEditor } from '../../CodeEditor';

import { FormCodeEditorProps } from './types';

ace.config.set('useWorker', false);

import { Mode } from '@cloudscape-design/global-styles';

import { useAppSelector } from 'hooks';

import { selectSystemMode } from 'App/slice';

import 'ace-builds/src-noconflict/theme-cloud_editor';
import 'ace-builds/src-noconflict/theme-cloud_editor_dark';
import 'ace-builds/src-noconflict/mode-yaml';
import 'ace-builds/src-noconflict/ext-language_tools';

export const FormCodeEditor = <T extends FieldValues>({
name,
control,
Expand All @@ -34,27 +19,6 @@ export const FormCodeEditor = <T extends FieldValues>({
onChange: onChangeProp,
...props
}: FormCodeEditorProps<T>) => {
const systemMode = useAppSelector(selectSystemMode) ?? '';

const [codeEditorPreferences, setCodeEditorPreferences] = useState<CodeEditorProps['preferences']>(() => ({
theme: systemMode === Mode.Dark ? 'cloud_editor_dark' : 'cloud_editor',
}));

useEffect(() => {
if (systemMode === Mode.Dark)
setCodeEditorPreferences({
theme: 'cloud_editor_dark',
});
else
setCodeEditorPreferences({
theme: 'cloud_editor',
});
}, [systemMode]);

const onCodeEditorPreferencesChange: CodeEditorProps['onPreferencesChange'] = (e) => {
setCodeEditorPreferences(e.detail);
};

return (
<Controller
name={name}
Expand All @@ -74,15 +38,10 @@ export const FormCodeEditor = <T extends FieldValues>({
<CodeEditor
{...fieldRest}
{...props}
i18nStrings={CODE_EDITOR_I18N_STRINGS}
ace={ace}
onChange={(event) => {
onChange(event.detail.value);
onChangeProp?.(event);
}}
themes={{ light: [], dark: [] }}
preferences={codeEditorPreferences}
onPreferencesChange={onCodeEditorPreferencesChange}
/>
</FormField>
);
Expand Down
3 changes: 2 additions & 1 deletion frontend/src/components/form/CodeEditor/types.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import { ControllerProps, FieldValues } from 'react-hook-form';
import { CodeEditorProps } from '@cloudscape-design/components/code-editor';
import { FormFieldProps } from '@cloudscape-design/components/form-field';

import { CodeEditorProps } from '../../CodeEditor';

export type FormCodeEditorProps<T extends FieldValues> = Omit<
CodeEditorProps,
'value' | 'name' | 'i18nStrings' | 'ace' | 'onPreferencesChange' | 'preferences'
Expand Down
2 changes: 2 additions & 0 deletions frontend/src/components/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,8 @@ export type { FormCardsProps } from './form/Cards/types';
export { FormCards } from './form/Cards';
export { Notifications } from './Notifications';
export { ConfirmationDialog } from './ConfirmationDialog';
export { CodeEditor } from './CodeEditor';
export type { CodeEditorProps } from './CodeEditor';
export { FileUploader } from './FileUploader';
export { InfoLink } from './InfoLink';
export { ButtonWithConfirmation } from './ButtonWithConfirmation';
Expand Down
44 changes: 2 additions & 42 deletions frontend/src/pages/Fleets/Details/Inspect/index.tsx
Original file line number Diff line number Diff line change
@@ -1,25 +1,11 @@
import React, { useEffect, useMemo, useState } from 'react';
import React, { useEffect, useMemo } from 'react';
import { useTranslation } from 'react-i18next';
import { useParams } from 'react-router-dom';
import ace from 'ace-builds';
import CodeEditor, { CodeEditorProps } from '@cloudscape-design/components/code-editor';
import { Mode } from '@cloudscape-design/global-styles';

import { Container, Header, Loader } from 'components';
import { CODE_EDITOR_I18N_STRINGS } from 'components/form/CodeEditor/constants';
import { CodeEditor, Container, Header, Loader } from 'components';

import { useAppSelector } from 'hooks';
import { useGetFleetDetailsQuery } from 'services/fleet';

import { selectSystemMode } from 'App/slice';

import 'ace-builds/src-noconflict/theme-cloud_editor';
import 'ace-builds/src-noconflict/theme-cloud_editor_dark';
import 'ace-builds/src-noconflict/mode-json';
import 'ace-builds/src-noconflict/ext-language_tools';

ace.config.set('useWorker', false);

interface AceEditorElement extends HTMLElement {
env?: {
editor?: {
Expand All @@ -34,8 +20,6 @@ export const FleetInspect = () => {
const paramProjectName = params.projectName ?? '';
const paramFleetId = params.fleetId ?? '';

const systemMode = useAppSelector(selectSystemMode) ?? '';

const { data: fleetData, isLoading } = useGetFleetDetailsQuery(
{
projectName: paramProjectName,
Expand All @@ -46,25 +30,6 @@ export const FleetInspect = () => {
},
);

const [codeEditorPreferences, setCodeEditorPreferences] = useState<CodeEditorProps['preferences']>(() => ({
theme: systemMode === Mode.Dark ? 'cloud_editor_dark' : 'cloud_editor',
}));

useEffect(() => {
if (systemMode === Mode.Dark)
setCodeEditorPreferences({
theme: 'cloud_editor_dark',
});
else
setCodeEditorPreferences({
theme: 'cloud_editor',
});
}, [systemMode]);

const onCodeEditorPreferencesChange: CodeEditorProps['onPreferencesChange'] = (e) => {
setCodeEditorPreferences(e.detail);
};

const jsonContent = useMemo(() => {
if (!fleetData) return '';
return JSON.stringify(fleetData, null, 2);
Expand Down Expand Up @@ -98,11 +63,6 @@ export const FleetInspect = () => {
<CodeEditor
value={jsonContent}
language="json"
i18nStrings={CODE_EDITOR_I18N_STRINGS}
ace={ace}
themes={{ light: [], dark: [] }}
preferences={codeEditorPreferences}
onPreferencesChange={onCodeEditorPreferencesChange}
editorContentHeight={600}
onChange={() => {
// Prevent editing - onChange is required but we ignore changes
Expand Down
44 changes: 2 additions & 42 deletions frontend/src/pages/Runs/Details/Inspect/index.tsx
Original file line number Diff line number Diff line change
@@ -1,25 +1,11 @@
import React, { useEffect, useMemo, useState } from 'react';
import React, { useEffect, useMemo } from 'react';
import { useTranslation } from 'react-i18next';
import { useParams } from 'react-router-dom';
import ace from 'ace-builds';
import CodeEditor, { CodeEditorProps } from '@cloudscape-design/components/code-editor';
import { Mode } from '@cloudscape-design/global-styles';

import { Container, Header, Loader } from 'components';
import { CODE_EDITOR_I18N_STRINGS } from 'components/form/CodeEditor/constants';
import { CodeEditor, Container, Header, Loader } from 'components';

import { useAppSelector } from 'hooks';
import { useGetRunQuery } from 'services/run';

import { selectSystemMode } from 'App/slice';

import 'ace-builds/src-noconflict/theme-cloud_editor';
import 'ace-builds/src-noconflict/theme-cloud_editor_dark';
import 'ace-builds/src-noconflict/mode-json';
import 'ace-builds/src-noconflict/ext-language_tools';

ace.config.set('useWorker', false);

interface AceEditorElement extends HTMLElement {
env?: {
editor?: {
Expand All @@ -34,32 +20,11 @@ export const RunInspect = () => {
const paramProjectName = params.projectName ?? '';
const paramRunId = params.runId ?? '';

const systemMode = useAppSelector(selectSystemMode) ?? '';

const { data: runData, isLoading } = useGetRunQuery({
project_name: paramProjectName,
id: paramRunId,
});

const [codeEditorPreferences, setCodeEditorPreferences] = useState<CodeEditorProps['preferences']>(() => ({
theme: systemMode === Mode.Dark ? 'cloud_editor_dark' : 'cloud_editor',
}));

useEffect(() => {
if (systemMode === Mode.Dark)
setCodeEditorPreferences({
theme: 'cloud_editor_dark',
});
else
setCodeEditorPreferences({
theme: 'cloud_editor',
});
}, [systemMode]);

const onCodeEditorPreferencesChange: CodeEditorProps['onPreferencesChange'] = (e) => {
setCodeEditorPreferences(e.detail);
};

const jsonContent = useMemo(() => {
if (!runData) return '';
return JSON.stringify(runData, null, 2);
Expand Down Expand Up @@ -93,11 +58,6 @@ export const RunInspect = () => {
<CodeEditor
value={jsonContent}
language="json"
i18nStrings={CODE_EDITOR_I18N_STRINGS}
ace={ace}
themes={{ light: [], dark: [] }}
preferences={codeEditorPreferences}
onPreferencesChange={onCodeEditorPreferencesChange}
editorContentHeight={600}
onChange={() => {
// Prevent editing - onChange is required but we ignore changes
Expand Down