-
Notifications
You must be signed in to change notification settings - Fork 8.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Change Role Mappings editor to use CodeEditor #107459
Changes from 1 commit
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -12,25 +12,27 @@ import 'brace/mode/json'; | |
// warnings in the console which adds unnecessary noise to the test output. | ||
import '@kbn/test/target_node/jest/utils/stub_web_worker'; | ||
|
||
import { EuiCodeEditor } from '@elastic/eui'; | ||
import React from 'react'; | ||
import { act } from 'react-dom/test-utils'; | ||
|
||
import { mountWithIntl } from '@kbn/test/jest'; | ||
import { coreMock } from 'src/core/public/mocks'; | ||
import { KibanaContextProvider } from 'src/plugins/kibana_react/public'; | ||
import type { monaco } from '@kbn/monaco'; | ||
import { shallowWithIntl } from '@kbn/test/jest'; | ||
import { CodeEditor } from 'src/plugins/kibana_react/public'; | ||
|
||
import { AllRule, AnyRule, ExceptAllRule, ExceptAnyRule, FieldRule } from '../../model'; | ||
import { JSONRuleEditor } from './json_rule_editor'; | ||
|
||
jest.mock('../../../../../../../../src/plugins/kibana_react/public', () => ({ | ||
...jest.requireActual('../../../../../../../../src/plugins/kibana_react/public'), | ||
useKibana: jest.fn().mockReturnValue({ | ||
services: { docLinks: { links: { apis: { createRoleMapping: 'createRoleMappingLink' } } } }, | ||
}), | ||
})); | ||
|
||
describe('JSONRuleEditor', () => { | ||
const mockChangeEvent = {} as monaco.editor.IModelContentChangedEvent; | ||
const renderView = (props: React.ComponentProps<typeof JSONRuleEditor>) => { | ||
const coreStart = coreMock.createStart(); | ||
return mountWithIntl( | ||
<KibanaContextProvider services={coreStart}> | ||
<JSONRuleEditor {...props} /> | ||
</KibanaContextProvider> | ||
); | ||
return shallowWithIntl(<JSONRuleEditor {...props} />); | ||
}; | ||
Comment on lines
+25
to
36
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Jest uses jsdom to render components, but Monaco requires a canvas. Instead of installing a separate package just to use for this test, I opted for a shallow render which still allows us to exercise these unit test cases. Note that to use a shallow mock this has to be the top level component, so as a result I had to mock |
||
|
||
it('renders an empty rule set', () => { | ||
|
@@ -40,7 +42,8 @@ describe('JSONRuleEditor', () => { | |
expect(props.onChange).not.toHaveBeenCalled(); | ||
expect(props.onValidityChange).not.toHaveBeenCalled(); | ||
|
||
expect(wrapper.find(EuiCodeEditor).props().value).toMatchInlineSnapshot(`"{}"`); | ||
wrapper.update(); | ||
expect(wrapper.find(CodeEditor).props().value).toMatchInlineSnapshot(`"{}"`); | ||
}); | ||
|
||
it('renders a rule set', () => { | ||
|
@@ -58,7 +61,7 @@ describe('JSONRuleEditor', () => { | |
}; | ||
const wrapper = renderView(props); | ||
|
||
const { value } = wrapper.find(EuiCodeEditor).props(); | ||
const { value } = wrapper.find(CodeEditor).props(); | ||
expect(JSON.parse(value as string)).toEqual({ | ||
all: [ | ||
{ | ||
|
@@ -89,7 +92,10 @@ describe('JSONRuleEditor', () => { | |
|
||
const allRule = JSON.stringify(new AllRule().toRaw()); | ||
act(() => { | ||
wrapper.find(EuiCodeEditor).props().onChange!(allRule + ', this makes invalid JSON'); | ||
wrapper.find(CodeEditor).props().onChange!( | ||
allRule + ', this makes invalid JSON', | ||
mockChangeEvent | ||
); | ||
}); | ||
|
||
expect(props.onValidityChange).toHaveBeenCalledTimes(1); | ||
|
@@ -112,7 +118,7 @@ describe('JSONRuleEditor', () => { | |
}); | ||
|
||
act(() => { | ||
wrapper.find(EuiCodeEditor).props().onChange!(invalidRule); | ||
wrapper.find(CodeEditor).props().onChange!(invalidRule, mockChangeEvent); | ||
}); | ||
|
||
expect(props.onValidityChange).toHaveBeenCalledTimes(1); | ||
|
@@ -126,7 +132,10 @@ describe('JSONRuleEditor', () => { | |
|
||
const allRule = JSON.stringify(new AllRule().toRaw()); | ||
act(() => { | ||
wrapper.find(EuiCodeEditor).props().onChange!(allRule + ', this makes invalid JSON'); | ||
wrapper.find(CodeEditor).props().onChange!( | ||
allRule + ', this makes invalid JSON', | ||
mockChangeEvent | ||
); | ||
}); | ||
|
||
expect(props.onValidityChange).toHaveBeenCalledTimes(1); | ||
|
@@ -136,7 +145,7 @@ describe('JSONRuleEditor', () => { | |
props.onValidityChange.mockReset(); | ||
|
||
act(() => { | ||
wrapper.find(EuiCodeEditor).props().onChange!(allRule); | ||
wrapper.find(CodeEditor).props().onChange!(allRule, mockChangeEvent); | ||
}); | ||
|
||
expect(props.onValidityChange).toHaveBeenCalledTimes(1); | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -8,13 +8,14 @@ | |
import 'brace/mode/json'; | ||
import 'brace/theme/github'; | ||
|
||
import { EuiButton, EuiCodeEditor, EuiFormRow, EuiLink, EuiSpacer, EuiText } from '@elastic/eui'; | ||
import { EuiButton, EuiFormRow, EuiLink, EuiSpacer, EuiText } from '@elastic/eui'; | ||
import React, { Fragment, useState } from 'react'; | ||
|
||
import { i18n } from '@kbn/i18n'; | ||
import { FormattedMessage } from '@kbn/i18n/react'; | ||
import { XJsonLang } from '@kbn/monaco'; | ||
|
||
import { useKibana } from '../../../../../../../../src/plugins/kibana_react/public'; | ||
import { CodeEditor, useKibana } from '../../../../../../../../src/plugins/kibana_react/public'; | ||
import type { Rule } from '../../model'; | ||
import { generateRulesFromRaw, RuleBuilderError } from '../../model'; | ||
|
||
|
@@ -76,25 +77,26 @@ export const JSONRuleEditor = (props: Props) => { | |
data-test-subj="roleMappingsJSONEditor" | ||
> | ||
<Fragment> | ||
<EuiCodeEditor | ||
<CodeEditor | ||
aria-label={''} | ||
mode={'json'} | ||
theme="github" | ||
languageId={XJsonLang.ID} | ||
value={rawRules} | ||
onChange={onRulesChange} | ||
width="100%" | ||
height="auto" | ||
minLines={6} | ||
maxLines={30} | ||
isReadOnly={false} | ||
setOptions={{ | ||
showLineNumbers: true, | ||
fullWidth={true} | ||
height="300px" | ||
Comment on lines
-87
to
+89
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This component doesn't support |
||
options={{ | ||
accessibilitySupport: 'off', | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Disabling None of these should be used when editing code. It just causes frustration when typing. Seeing as this is also an optional UI for editing role mappings, I think it's safe to disable |
||
lineNumbers: 'on', | ||
fontSize: 12, | ||
tabSize: 2, | ||
automaticLayout: true, | ||
minimap: { enabled: false }, | ||
overviewRulerBorder: false, | ||
scrollbar: { alwaysConsumeMouseWheel: false }, | ||
scrollBeyondLastLine: false, | ||
wordWrap: 'on', | ||
wrappingIndent: 'indent', | ||
}} | ||
editorProps={{ | ||
$blockScrolling: Infinity, | ||
}} | ||
showGutter={true} | ||
/> | ||
<EuiSpacer size="s" /> | ||
<EuiButton iconType="broom" onClick={reformatRules} size="s"> | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Have you tried using
CodeEditorField
component? It renders the code editor like a form field with the correct border and padding so it looks a lot nicer than the plain Monaco editor.Example here: x-pack/plugins/security/public/management/api_keys/api_keys_grid/create_api_key_flyout.tsx
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nice idea, I'll change it!
Edit: done in 6163ff0
Side by side comparison before/after
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nice, looking much better! :)