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
13 changes: 9 additions & 4 deletions docs/spec.md
Original file line number Diff line number Diff line change
Expand Up @@ -145,10 +145,15 @@ type Spec = ArraySpec | BooleanSpec | NumberSpec | ObjectSpec | StringSpec;

#### MonacoParams

| Property | Type | Required | Description |
| :------- | :------- | :------: | :--------------------------- |
| language | `string` | yes | Syntax highlighting language |
| fontSize | `string` | | Font size |
| Property | Type | Required | Description |
| :--------------------- | :------- | :------: | :--------------------------- |
| language | `string` | yes | Syntax highlighting language |
| fontSize | `string` | | Font size |
| headerIconSize | `number` | | Size of the header icon |
| headerIconIndent | `number` | | Indent of the header icon |
| headerTitleVariant | `string` | | Variant of the header title |
| headerDialogButtonSize | `string` | | Size of the dialog button |
| headerDialogIconSize | `number` | | Size of the dialog icon |

#### OneOfParams

Expand Down
13 changes: 8 additions & 5 deletions docs/styles.md
Original file line number Diff line number Diff line change
Expand Up @@ -393,11 +393,14 @@ Variables for the Checkbox Group View component:

Variables for the Monaco Input View component:

| Variable | Default Value | Description |
| :--------------------------------------- | :-----------: | :----------------------------- |
| `--df-monaco-base-view-width` | `550px` | Width of the Monaco input view |
| `--df-monaco-view-dialog-footer-padding` | `16px` | Padding of the dialog footer |
| `--df-monaco-view-dialog-header-height` | `48px` | Height of the dialog header |
| Variable | Default Value | Description |
| :--------------------------------------- | :-----------: | :------------------------------- |
| `--df-monaco-base-view-width` | `550px` | Width of the Monaco input view |
| `--df-monaco-base-view-height` | `354px` | Height of the Monaco base view |
| `--df-monaco-view-dialog-footer-padding` | `16px` | Padding of the dialog footer |
| `--df-monaco-view-dialog-header-height` | `48px` | Height of the dialog header |
| `--df-monaco-view-dialog-width` | `966px` | Width of the Monaco view dialog |
| `--df-monaco-view-dialog-height` | `804px` | Height of the Monaco view dialog |

---

Expand Down
7 changes: 6 additions & 1 deletion src/lib/core/types/specs.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type {AlertProps, LabelProps} from '@gravity-ui/uikit';
import type {AlertProps, ButtonSize, LabelProps, TextProps} from '@gravity-ui/uikit';
import type {ColorTextBaseProps} from '@gravity-ui/uikit/build/esm/components/Text/colorText/colorText';

import type {ReadAsMethod, SpecTypes} from '../constants';
Expand Down Expand Up @@ -164,6 +164,11 @@ export interface StringSpec<
monacoParams?: {
language?: string;
fontSize?: number;
headerIconSize?: number;
headerIconIndent?: number;
headerTitleVariant?: TextProps['variant'];
headerDialogButtonSize?: ButtonSize;
headerDialogIconSize?: number;
};
hideValues?: string[];
placeholder?: string;
Expand Down
5 changes: 5 additions & 0 deletions src/lib/kit/components/Inputs/MonacoInput/MonacoHeader.scss
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,9 @@
align-items: center;
background-color: var(--g-color-base-float-hover);
box-sizing: border-box;

&__title {
display: flex;
align-items: center;
}
}
27 changes: 19 additions & 8 deletions src/lib/kit/components/Inputs/MonacoInput/MonacoHeader.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import React from 'react';

import {File} from '@gravity-ui/icons';
import {Icon, Text} from '@gravity-ui/uikit';
import {Icon, Text, type TextProps} from '@gravity-ui/uikit';

import {block} from '../../../utils';

Expand All @@ -10,16 +10,27 @@ import './MonacoHeader.scss';
const b = block('monaco-header');

interface MonacoHeaderProps {
language?: string;
editButton?: React.ReactNode;
language: string;
dialogButton?: React.ReactNode;
headerIconSize: number;
headerIconIndent: number;
headerTitleVariant: TextProps['variant'];
}

export const MonacoHeader: React.FC<MonacoHeaderProps> = ({language, editButton}) => (
export const MonacoHeader: React.FC<MonacoHeaderProps> = ({
language,
dialogButton,
headerIconSize,
headerIconIndent,
headerTitleVariant,
}) => (
<div className={b()}>
<div>
<Icon data={File} size={18} />
<Text variant="body-3">{language}</Text>
<div className={b('title')}>
<div style={{marginRight: `${headerIconIndent}px`}}>
<Icon data={File} size={headerIconSize} />
</div>
<Text variant={headerTitleVariant}>{language}</Text>
</div>
{editButton ?? null}
{dialogButton ?? null}
</div>
);
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,11 @@
height: var(--df-monaco-input-height, 354px);

&__container {
height: 100%;
height: calc(100% - 2px);
display: flex;
flex-direction: column;
border: 1px solid var(--g-color-line-generic);
box-sizing: content-box;
}

&__editor {
Expand Down
31 changes: 26 additions & 5 deletions src/lib/kit/components/Inputs/MonacoInput/MonacoInputBase.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,15 @@ export const MonacoInputBase: React.FC<MonacoInputBaseProps> = ({

const {monacoParams, disabled, layoutTitle} = spec.viewSpec;

const {language, fontSize} = monacoParams ?? {language: 'plaintext', fontSize: 11};
const {
language = 'plaintext',
fontSize = 11,
headerIconSize = 18,
headerIconIndent = 5,
headerTitleVariant = 'body-2',
headerDialogButtonSize = 'm',
headerDialogIconSize = 16,
} = monacoParams || {};

const [monacoEditorDialog, setMonacoEditorDialog] = React.useState<boolean>(false);

Expand All @@ -45,14 +53,18 @@ export const MonacoInputBase: React.FC<MonacoInputBaseProps> = ({
const dialogButton = React.useMemo(() => {
if (!withoutDialog) {
return (
<Button onClick={() => setMonacoEditorDialog(true)} qa={`${name}-open-dialog`}>
<Icon data={ChevronsExpandUpRight} size={16} />
<Button
size={headerDialogButtonSize}
onClick={() => setMonacoEditorDialog(true)}
qa={`${name}-open-dialog`}
>
<Icon data={ChevronsExpandUpRight} size={headerDialogIconSize} />
</Button>
);
}

return;
}, [withoutDialog, setMonacoEditorDialog, name]);
}, [withoutDialog, setMonacoEditorDialog, name, headerDialogButtonSize, headerDialogIconSize]);

React.useEffect(() => onChange(monacoValue), [monacoValue]);

Expand All @@ -65,7 +77,13 @@ export const MonacoInputBase: React.FC<MonacoInputBaseProps> = ({
return (
<div className={b()}>
<div className={b('container')} data-qa={name}>
<MonacoHeader language={language} editButton={dialogButton} />
<MonacoHeader
language={language}
dialogButton={dialogButton}
headerIconSize={headerIconSize}
headerIconIndent={headerIconIndent}
headerTitleVariant={headerTitleVariant}
/>
<div className={b('editor')}>
<MonacoEditor
language={language}
Expand All @@ -86,6 +104,9 @@ export const MonacoInputBase: React.FC<MonacoInputBaseProps> = ({
onChange={onChange}
onClose={handleMonacoEditorDialogClose}
MonacoComponent={MonacoComponent}
headerIconSize={headerIconSize}
headerIconIndent={headerIconIndent}
headerTitleVariant={headerTitleVariant}
/>
</div>
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,11 @@
}

&__container {
height: 100%;
height: calc(100% - 2px);
display: flex;
flex-direction: column;
border: 1px solid var(--g-color-line-generic);
box-sizing: content-box;
}

&__editor {
Expand Down
17 changes: 14 additions & 3 deletions src/lib/kit/components/Inputs/MonacoInput/MonacoInputDialog.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import React from 'react';

import {Dialog} from '@gravity-ui/uikit';
import {Dialog, type TextProps} from '@gravity-ui/uikit';
import type {MonacoEditorProps} from 'react-monaco-editor/lib/types';

import {useMonaco} from '../../../../core/components/Form/hooks';
Expand All @@ -18,13 +18,16 @@ interface MonacoInputDialogProps {
name: string;
visible: boolean;
value: string;
language?: string;
language: string;
title: string | undefined;
fontSize: number | undefined;
onChange: (value: string) => void;
onClose: () => void;
changeMonacoValue: (value: string) => void;
MonacoComponent?: React.ComponentType<MonacoEditorProps>;
headerIconSize: number;
headerIconIndent: number;
headerTitleVariant: TextProps['variant'];
}

export const MonacoInputDialog: React.FC<MonacoInputDialogProps> = ({
Expand All @@ -38,6 +41,9 @@ export const MonacoInputDialog: React.FC<MonacoInputDialogProps> = ({
changeMonacoValue,
fontSize,
MonacoComponent,
headerIconSize,
headerIconIndent,
headerTitleVariant,
}) => {
const MonacoEditor = useMonaco() || MonacoComponent;

Expand All @@ -57,7 +63,12 @@ export const MonacoInputDialog: React.FC<MonacoInputDialogProps> = ({
<Dialog.Header caption={title} className={b('dialog-header')} />
<Dialog.Body>
<div className={b('container')} data-qa={`${name}-dialog`}>
<MonacoHeader language={language} />
<MonacoHeader
language={language}
headerIconSize={headerIconSize}
headerIconIndent={headerIconIndent}
headerTitleVariant={headerTitleVariant}
/>
<div className={b('editor')}>
<MonacoEditor
language={language}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,18 @@
@import '../../../styles/variables.scss';

.#{$ns}monaco-base-view {
border: 1px solid var(--g-color-line-generic);
width: var(--df-monaco-base-view-width, 550px);
height: var(--df-monaco-base-view-height, 354px);

&__container {
height: calc(100% - 2px);
display: flex;
flex-direction: column;
border: 1px solid var(--g-color-line-generic);
box-sizing: content-box;
}

&__editor {
flex: 1;
}
}
48 changes: 37 additions & 11 deletions src/lib/kit/components/Views/MonacoInputView/MonacoBaseView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,40 +15,66 @@ import './MonacoBaseView.scss';

const b = block('monaco-base-view');

const MonacoBaseView: React.FC<StringViewProps> = ({value, spec}) => {
const MonacoBaseView: React.FC<StringViewProps> = ({value, spec, name}) => {
const {monacoParams, layoutTitle} = spec.viewSpec;
const MonacoEditor = useMonaco();

const {language, fontSize} = monacoParams ?? {language: 'plaintext', fontSize: 12};
const {
language = 'plaintext',
fontSize = 11,
headerIconSize = 18,
headerIconIndent = 5,
headerTitleVariant = 'body-2',
headerDialogButtonSize = 'm',
headerDialogIconSize = 16,
} = monacoParams || {};

const options = useMonacoOptions(fontSize, true);

const [monacoEditorDialog, setMonacoEditorDialog] = React.useState<boolean>(false);

const handleMonacoEditorDialogClose = React.useCallback(() => setMonacoEditorDialog(false), []);

const dialogButton = React.useMemo(() => {
return (
<Button
size={headerDialogButtonSize}
onClick={() => setMonacoEditorDialog(true)}
qa={`${name}-open-dialog`}
>
<Icon data={ChevronsExpandUpRight} size={headerDialogIconSize} />
</Button>
);
}, [setMonacoEditorDialog, name, headerDialogButtonSize, headerDialogIconSize]);

if (!value || !MonacoEditor) {
return null;
}

return (
<div className={b()}>
<MonacoHeader
language={language}
editButton={
<Button onClick={() => setMonacoEditorDialog(true)}>
<Icon data={ChevronsExpandUpRight} size={16}></Icon>
</Button>
}
/>
<MonacoEditor language={language} value={value} height={'250'} options={options} />
<div className={b('container')} data-qa={name}>
<MonacoHeader
language={language}
dialogButton={dialogButton}
headerIconSize={headerIconSize}
headerIconIndent={headerIconIndent}
headerTitleVariant={headerTitleVariant}
/>
<div className={b('editor')}>
<MonacoEditor language={language} value={value} options={options} />
</div>
</div>
<MonacoViewDialog
title={layoutTitle}
fontSize={fontSize}
value={value}
visible={monacoEditorDialog}
language={language}
onClose={handleMonacoEditorDialogClose}
headerIconSize={headerIconSize}
headerIconIndent={headerIconIndent}
headerTitleVariant={headerTitleVariant}
/>
</div>
);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,23 @@
@import '../../../styles/variables.scss';

.#{$ns}monaco-view-dialog {
width: var(--df-monaco-view-dialog-width, 966px);
height: var(--df-monaco-view-dialog-height, 804px);

.g-dialog-footer {
padding: var(--df-monaco-view-dialog-footer-padding, var(--g-spacing-4));
}

&__container {
height: calc(100% - 2px);
display: flex;
flex-direction: column;
border: 1px solid var(--g-color-line-generic);
box-sizing: content-box;
}

&__editor {
flex: 1;
}

&__dialog-header {
Expand Down
Loading