Skip to content

Commit f640b05

Browse files
committed
Change plugin setup, use kibana context
1 parent bcf36c6 commit f640b05

File tree

10 files changed

+153
-129
lines changed

10 files changed

+153
-129
lines changed

src/legacy/core_plugins/timelion/public/components/timelion_expression_input.tsx

Lines changed: 53 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -22,34 +22,22 @@ import { EuiFormRow } from '@elastic/eui';
2222
import { i18n } from '@kbn/i18n';
2323
import * as monacoEditor from 'monaco-editor/esm/vs/editor/editor.api';
2424

25-
import { IUiSettingsClient, HttpSetup } from 'kibana/public';
26-
import { CodeEditor, KibanaContextProvider } from '../../../../../plugins/kibana_react/public';
25+
import { CodeEditor, useKibana } from '../../../../../plugins/kibana_react/public';
2726
import { suggest, getSuggestion } from './timelion_expression_input_helpers';
28-
import { ArgValueSuggestions } from '../services/arg_value_suggestions';
2927
import { ITimelionFunction, TimelionFunctionArgs } from '../../common/types';
28+
import { TimelionServices } from '../services/types';
3029

3130
const LANGUAGE_ID = 'timelion_expression';
3231
monacoEditor.languages.register({ id: LANGUAGE_ID });
3332

34-
export interface TimelionExpressionInputDependencies {
35-
argValueSuggestions: ArgValueSuggestions;
36-
http: HttpSetup;
37-
uiSettings: IUiSettingsClient;
38-
}
39-
4033
interface TimelionExpressionInputProps {
4134
value: string;
4235
setValue(value: string): void;
4336
}
4437

45-
function TimelionExpressionInput({
46-
argValueSuggestions,
47-
http,
48-
uiSettings,
49-
value,
50-
setValue,
51-
}: TimelionExpressionInputProps & TimelionExpressionInputDependencies) {
38+
function TimelionExpressionInput({ value, setValue }: TimelionExpressionInputProps) {
5239
const functionList = useRef([]);
40+
const kibana = useKibana<TimelionServices>();
5341

5442
const provideCompletionItems = useCallback(
5543
async (model: monacoEditor.editor.ITextModel, position: monacoEditor.Position) => {
@@ -68,7 +56,7 @@ function TimelionExpressionInput({
6856
// it's important to offset the cursor position on 1 point left
6957
// because of PEG parser starts the line with 0, but monaco with 1
7058
position.column - 1,
71-
argValueSuggestions
59+
kibana.services.argValueSuggestions
7260
);
7361

7462
return {
@@ -79,7 +67,7 @@ function TimelionExpressionInput({
7967
: [],
8068
};
8169
},
82-
[argValueSuggestions]
70+
[kibana.services.argValueSuggestions]
8371
);
8472

8573
const provideHover = useCallback(
@@ -90,7 +78,7 @@ function TimelionExpressionInput({
9078
// it's important to offset the cursor position on 1 point left
9179
// because of PEG parser starts the line with 0, but monaco with 1
9280
position.column - 1,
93-
argValueSuggestions
81+
kibana.services.argValueSuggestions
9482
);
9583

9684
return {
@@ -101,59 +89,58 @@ function TimelionExpressionInput({
10189
: [],
10290
};
10391
},
104-
[argValueSuggestions]
92+
[kibana.services.argValueSuggestions]
10593
);
10694

10795
useEffect(() => {
108-
http.get('../api/timelion/functions').then(data => {
109-
functionList.current = data;
110-
});
111-
}, [http]);
96+
if (kibana.services.http) {
97+
kibana.services.http.get('../api/timelion/functions').then(data => {
98+
functionList.current = data;
99+
});
100+
}
101+
}, [kibana.services.http]);
112102

113103
return (
114-
<KibanaContextProvider services={{ uiSettings }}>
115-
<EuiFormRow
116-
className="visEditor__timelionExpressionInput"
117-
fullWidth
118-
label={i18n.translate('timelion.vis.expressionLabel', {
119-
defaultMessage: 'Timelion expression',
120-
})}
121-
>
122-
<div className="timelionExpressionInput__editor">
123-
<CodeEditor
124-
languageId={LANGUAGE_ID}
125-
value={value}
126-
onChange={setValue}
127-
suggestionProvider={{
128-
triggerCharacters: ['.', '(', '=', ':'],
129-
provideCompletionItems,
130-
}}
131-
hoverProvider={{ provideHover }}
132-
options={{
133-
automaticLayout: true,
134-
fixedOverflowWidgets: true,
135-
fontSize: 16,
136-
scrollBeyondLastLine: false,
137-
quickSuggestions: true,
138-
minimap: {
139-
enabled: false,
104+
<EuiFormRow
105+
className="visEditor__timelionExpressionInput"
106+
fullWidth
107+
label={i18n.translate('timelion.vis.expressionLabel', {
108+
defaultMessage: 'Timelion expression',
109+
})}
110+
>
111+
<div className="timelionExpressionInput__editor">
112+
<CodeEditor
113+
languageId={LANGUAGE_ID}
114+
value={value}
115+
onChange={setValue}
116+
suggestionProvider={{
117+
triggerCharacters: ['.', ',', '(', '=', ':'],
118+
provideCompletionItems,
119+
}}
120+
hoverProvider={{ provideHover }}
121+
options={{
122+
automaticLayout: true,
123+
fixedOverflowWidgets: true,
124+
fontSize: 16,
125+
scrollBeyondLastLine: false,
126+
minimap: {
127+
enabled: false,
128+
},
129+
wordBasedSuggestions: false,
130+
wordWrap: 'on',
131+
wrappingIndent: 'indent',
132+
}}
133+
languageConfiguration={{
134+
autoClosingPairs: [
135+
{
136+
open: '(',
137+
close: ')',
140138
},
141-
wordBasedSuggestions: false,
142-
wordWrap: 'on',
143-
wrappingIndent: 'indent',
144-
}}
145-
languageConfiguration={{
146-
autoClosingPairs: [
147-
{
148-
open: '(',
149-
close: ')',
150-
},
151-
],
152-
}}
153-
/>
154-
</div>
155-
</EuiFormRow>
156-
</KibanaContextProvider>
139+
],
140+
}}
141+
/>
142+
</div>
143+
</EuiFormRow>
157144
);
158145
}
159146

src/legacy/core_plugins/timelion/public/components/timelion_expression_input_helpers.ts

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -214,14 +214,20 @@ export function getSuggestion(
214214
suggestion: ITimelionFunction | TimelionFunctionArgs,
215215
type: SUGGESTION_TYPE,
216216
range: monacoEditor.Range
217-
) {
217+
): monacoEditor.languages.CompletionItem {
218218
let kind: monacoEditor.languages.CompletionItemKind =
219219
monacoEditor.languages.CompletionItemKind.Method;
220220
let insertText: string = suggestion.name;
221+
let insertTextRules: monacoEditor.languages.CompletionItem['insertTextRules'];
221222
let detail: string = '';
223+
let command: monacoEditor.languages.CompletionItem['command'];
222224

223225
switch (type) {
224226
case SUGGESTION_TYPE.ARGUMENTS:
227+
command = {
228+
title: 'Trigger Suggestion Dialog',
229+
id: 'editor.action.triggerSuggest',
230+
};
225231
kind = monacoEditor.languages.CompletionItemKind.Property;
226232
insertText = `${insertText}=`;
227233
detail = `${i18n.translate(
@@ -233,7 +239,13 @@ export function getSuggestion(
233239

234240
break;
235241
case SUGGESTION_TYPE.FUNCTIONS:
242+
command = {
243+
title: 'Trigger Suggestion Dialog',
244+
id: 'editor.action.triggerSuggest',
245+
};
236246
kind = monacoEditor.languages.CompletionItemKind.Function;
247+
insertText = `${insertText}($0)`;
248+
insertTextRules = monacoEditor.languages.CompletionItemInsertTextRule.InsertAsSnippet;
237249
detail = `(${
238250
(suggestion as ITimelionFunction).chainable
239251
? i18n.translate('timelion.expressionSuggestions.func.description.chainableHelpText', {
@@ -246,8 +258,17 @@ export function getSuggestion(
246258

247259
break;
248260
case SUGGESTION_TYPE.ARGUMENT_VALUE:
261+
const param = suggestion.name.split(':');
262+
263+
if (param.length === 1 || param[1]) {
264+
insertText = `${param.length === 1 ? insertText : param[1]},`;
265+
}
266+
267+
command = {
268+
title: 'Trigger Suggestion Dialog',
269+
id: 'editor.action.triggerSuggest',
270+
};
249271
kind = monacoEditor.languages.CompletionItemKind.Property;
250-
insertText = suggestion.name.split(':')[1] || suggestion.name;
251272
detail = suggestion.help || '';
252273

253274
break;
@@ -256,13 +277,11 @@ export function getSuggestion(
256277
return {
257278
detail,
258279
insertText,
280+
insertTextRules,
259281
kind,
260282
label: suggestion.name,
261283
documentation: suggestion.help,
262-
command: {
263-
title: 'Trigger Suggestion Dialog',
264-
id: 'editor.action.triggerSuggest',
265-
},
284+
command,
266285
range,
267286
};
268287
}

src/legacy/core_plugins/timelion/public/components/timelion_interval.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,12 @@ const intervalOptions = [
4747
}),
4848
value: '1h',
4949
},
50+
{
51+
label: i18n.translate('timelion.vis.interval.day', {
52+
defaultMessage: '1 day',
53+
}),
54+
value: '1d',
55+
},
5056
{
5157
label: i18n.translate('timelion.vis.interval.week', {
5258
defaultMessage: '1 week',

src/legacy/core_plugins/timelion/public/panels/timechart/schema.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,12 @@ import { generateTicksProvider } from './tick_generator';
3434
const DEBOUNCE_DELAY = 50;
3535

3636
export function timechartFn(dependencies: TimelionVisualizationDependencies) {
37-
const { $rootScope, $compile, uiSettings } = dependencies;
37+
const {
38+
$rootScope,
39+
$compile,
40+
core: { uiSettings },
41+
} = dependencies;
42+
3843
return function() {
3944
return {
4045
help: 'Draw a timeseries chart',

src/legacy/core_plugins/timelion/public/plugin.ts

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,10 @@
1616
* specific language governing permissions and limitations
1717
* under the License.
1818
*/
19-
import {
20-
CoreSetup,
21-
CoreStart,
22-
Plugin,
23-
PluginInitializerContext,
24-
IUiSettingsClient,
25-
HttpSetup,
26-
} from 'kibana/public';
19+
import { CoreSetup, CoreStart, Plugin, PluginInitializerContext } from 'kibana/public';
2720
import { Plugin as ExpressionsPlugin } from 'src/plugins/expressions/public';
2821
import { DataPublicPluginSetup, TimefilterContract } from 'src/plugins/data/public';
22+
import { PluginsStart } from 'ui/new_platform/new_platform';
2923
import { VisualizationsSetup } from '../../visualizations/public/np_ready/public';
3024
import { getTimelionVisualizationConfig } from './timelion_vis_fn';
3125
import { getTimelionVisualization } from './vis';
@@ -35,8 +29,7 @@ import { LegacyDependenciesPlugin, LegacyDependenciesPluginSetup } from './shim'
3529

3630
/** @internal */
3731
export interface TimelionVisualizationDependencies extends LegacyDependenciesPluginSetup {
38-
uiSettings: IUiSettingsClient;
39-
http: HttpSetup;
32+
core: CoreSetup<PluginsStart>;
4033
timelionPanels: Map<string, Panel>;
4134
timefilter: TimefilterContract;
4235
}
@@ -60,14 +53,13 @@ export class TimelionPlugin implements Plugin<Promise<void>, void> {
6053
}
6154

6255
public async setup(
63-
core: CoreSetup,
56+
core: CoreSetup<PluginsStart>,
6457
{ __LEGACY, expressions, visualizations, data }: TimelionPluginSetupDependencies
6558
) {
6659
const timelionPanels: Map<string, Panel> = new Map();
6760

6861
const dependencies: TimelionVisualizationDependencies = {
69-
uiSettings: core.uiSettings,
70-
http: core.http,
62+
core,
7163
timelionPanels,
7264
timefilter: data.query.timefilter.timefilter,
7365
...(await __LEGACY.setup(core, timelionPanels)),
@@ -76,7 +68,7 @@ export class TimelionPlugin implements Plugin<Promise<void>, void> {
7668
this.registerPanels(dependencies);
7769

7870
expressions.registerFunction(() => getTimelionVisualizationConfig(dependencies));
79-
visualizations.types.createBaseVisualization(getTimelionVisualization(dependencies));
71+
visualizations.types.createBaseVisualization(await getTimelionVisualization(dependencies));
8072
}
8173

8274
private registerPanels(dependencies: TimelionVisualizationDependencies) {
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/*
2+
* Licensed to Elasticsearch B.V. under one or more contributor
3+
* license agreements. See the NOTICE file distributed with
4+
* this work for additional information regarding copyright
5+
* ownership. Elasticsearch B.V. licenses this file to you under
6+
* the Apache License, Version 2.0 (the "License"); you may
7+
* not use this file except in compliance with the License.
8+
* You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing,
13+
* software distributed under the License is distributed on an
14+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
* KIND, either express or implied. See the License for the
16+
* specific language governing permissions and limitations
17+
* under the License.
18+
*/
19+
20+
import { ArgValueSuggestions } from './arg_value_suggestions';
21+
22+
export interface TimelionServices {
23+
argValueSuggestions: ArgValueSuggestions;
24+
}
Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,12 @@
1-
.visEditor--timelion{
1+
.visEditor--timelion {
22

33
vis-options-react-wrapper,
44
.visEditorSidebar__options,
55
.visEditorSidebar__timelionOptions,
66
.visEditor__timelionExpressionInput {
7-
@include flex-parent(1, 1, auto, column);
8-
9-
height: 100%;
10-
11-
> * {
12-
flex-shrink: 1;
13-
}
7+
flex: 1 1 auto;
8+
display: flex;
9+
flex-direction: column;
1410
}
1511
}
1612

@@ -21,11 +17,11 @@
2117
}
2218

2319
.timelionExpressionInput__editor {
24-
height: 100%;
25-
padding-top: $euiSize;
26-
2720
@include euiBreakpoint('xs', 's', 'm') {
2821
height: $euiSize * 15;
2922
max-height: $euiSize * 15;
3023
}
24+
25+
height: 100%;
26+
padding-top: $euiSize;
3127
}

0 commit comments

Comments
 (0)