Skip to content
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

Move ui/value_suggestions ⇒ NP data plugin #45762

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
e22d673
Bind search bar
Sep 25, 2019
0c7eebf
create prewired data components
Sep 25, 2019
41dd2ef
Pass NP data plugin to shim plugin, to access autocomplete
Sep 26, 2019
c4525e9
Use KibanaContextProvider in vis editor and graph
Sep 26, 2019
995bfeb
Use KibanaContextProvider in maps
Sep 26, 2019
1d09108
Use prewirted SearchBar in TopNavMenu
Sep 26, 2019
08fed2f
Use KibanaContextProbider in Lens
Sep 26, 2019
b4ce1f2
Fix appName usage in query bar input
Sep 26, 2019
7e2740c
fixed query bar top row appName
Sep 26, 2019
35d365e
update tests
Sep 26, 2019
4dd148d
fixed bind search bar bug
Sep 26, 2019
4913548
mock SearchBar
Sep 26, 2019
c836679
Removed unnecessary mocks
Sep 26, 2019
65b592e
Delete unused mock
Sep 26, 2019
8dbf164
Fixed exporting of data plugin types
Sep 26, 2019
b4a80f6
Merge remote-tracking branch 'upstream/master' into newplatform/data-…
Sep 26, 2019
1f84606
Updated maps snapshot
Sep 26, 2019
0f60094
Fixed some TS issues
Sep 26, 2019
b7935cd
Merge remote-tracking branch 'upstream/master' into newplatform/data-…
Sep 29, 2019
64b9ec6
Fixed jest tests
Sep 29, 2019
1fe975c
Context adjustments in TSVB
Sep 29, 2019
23ae2e7
componentWillMount
Sep 29, 2019
2eb5425
Merge remote-tracking branch 'upstream/master' into newplatform/data-…
Oct 2, 2019
0ca40af
Code review fixes
Oct 2, 2019
eaac39c
Pass dataTestSubj to query bar input
Oct 2, 2019
cc39f89
Graph data
Oct 2, 2019
89b72c7
- Pass NP data plugin to KibanaReactContext
Oct 2, 2019
b225dc5
- Pass NP data plugin to KibanaReactContext
Oct 2, 2019
d08b938
ts fixes
Oct 2, 2019
fff2186
Added karma getSuggestions fake
Oct 2, 2019
64f4566
Refactored kuery autocomplete tests to jest
Oct 3, 2019
99f67ae
Merge remote-tracking branch 'upstream/master' into newplatform/data-…
Oct 3, 2019
a992310
Filter bar context for directives
Oct 3, 2019
03cd33c
updated snapshot
Oct 3, 2019
dad955f
Merge remote-tracking branch 'upstream/master' into newplatform/data-…
Oct 3, 2019
6fe474c
Merge remote-tracking branch 'upstream/master' into newplatform/data-…
Oct 6, 2019
c719a2b
Merge remote-tracking branch 'upstream/master' into newplatform/data-…
Oct 6, 2019
f226ffa
Merge branch 'newplatform/data-plugin/value-suggesions' of github.com…
Oct 6, 2019
d7e3cd4
fix diffs
Oct 6, 2019
0d983f5
fixed lens test
Oct 6, 2019
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
Original file line number Diff line number Diff line change
Expand Up @@ -31,12 +31,13 @@ import {
import { FormattedMessage, InjectedIntl, injectI18n } from '@kbn/i18n/react';
import classNames from 'classnames';
import React, { useState } from 'react';
import { UiSettingsClientContract } from 'src/core/public';
import { CoreStart } from 'src/core/public';
import { DataPublicPluginStart } from 'src/plugins/data/public';
import { IndexPattern } from '../../index_patterns';
import { FilterEditor } from './filter_editor';
import { FilterItem } from './filter_item';
import { FilterOptions } from './filter_options';
import { useKibana } from '../../../../../../plugins/kibana_react/public';
import { useKibana, KibanaContextProvider } from '../../../../../../plugins/kibana_react/public';

interface Props {
filters: Filter[];
Expand All @@ -45,18 +46,45 @@ interface Props {
indexPatterns: IndexPattern[];
intl: InjectedIntl;

// Only for directives!
uiSettings?: UiSettingsClientContract;
// TODO: Only for filter-bar directive!
uiSettings?: CoreStart['uiSettings'];
docLinks?: CoreStart['docLinks'];
pluginDataStart?: DataPublicPluginStart;
}

function FilterBarUI(props: Props) {
const [isAddFilterPopoverOpen, setIsAddFilterPopoverOpen] = useState(false);
const kibana = useKibana();
let { uiSettings } = kibana.services;

if (!uiSettings) {
// Only for directives!
uiSettings = props.uiSettings;
const uiSettings = kibana.services.uiSettings || props.uiSettings;
if (!uiSettings) return null;

function hasContext() {
return Boolean(kibana.services.uiSettings);
}

function wrapInContextIfMissing(content: JSX.Element) {
// TODO: Relevant only as long as directives are used!
if (!hasContext()) {
if (props.docLinks && props.uiSettings && props.pluginDataStart) {
return (
<KibanaContextProvider
services={{
uiSettings: props.uiSettings,
docLinks: props.docLinks,
data: props.pluginDataStart,
}}
>
{content}
</KibanaContextProvider>
);
} else {
throw new Error(
'Rending filter bar requires providing sufficient context: uiSettings, docLinks and NP data plugin'
);
}
}
return content;
}

function onFiltersUpdated(filters: Filter[]) {
Expand Down Expand Up @@ -100,7 +128,7 @@ function FilterBarUI(props: Props) {
</EuiButtonEmpty>
);

return (
return wrapInContextIfMissing(
<EuiFlexItem grow={false}>
<EuiPopover
id="addFilterPopover"
Expand All @@ -120,7 +148,6 @@ function FilterBarUI(props: Props) {
onSubmit={onAdd}
onCancel={() => setIsAddFilterPopoverOpen(false)}
key={JSON.stringify(newFilter)}
uiSettings={uiSettings!}
/>
</div>
</EuiFlexItem>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@ import { i18n } from '@kbn/i18n';
import { FormattedMessage, InjectedIntl, injectI18n } from '@kbn/i18n/react';
import { get } from 'lodash';
import React, { Component } from 'react';
import { UiSettingsClientContract } from 'src/core/public';
import { Field, IndexPattern } from '../../../index_patterns';
import { GenericComboBox, GenericComboBoxProps } from './generic_combo_box';
import {
Expand All @@ -62,7 +61,6 @@ interface Props {
onSubmit: (filter: Filter) => void;
onCancel: () => void;
intl: InjectedIntl;
uiSettings: UiSettingsClientContract;
}

interface State {
Expand Down Expand Up @@ -343,7 +341,6 @@ class FilterEditorUI extends Component<Props, State> {
value={this.state.params}
onChange={this.onParamsChange}
data-test-subj="phraseValueInput"
uiSettings={this.props.uiSettings}
/>
);
case 'phrases':
Expand All @@ -353,7 +350,6 @@ class FilterEditorUI extends Component<Props, State> {
field={this.state.selectedField}
values={this.state.params}
onChange={this.onParamsChange}
uiSettings={this.props.uiSettings}
/>
);
case 'range':
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,17 @@
*/

import { Component } from 'react';
import { getSuggestions } from 'ui/value_suggestions';
import { UiSettingsClientContract } from 'src/core/public';
import { Field, IndexPattern } from '../../../index_patterns';
import {
withKibana,
KibanaReactContextValue,
} from '../../../../../../../plugins/kibana_react/public';
import { IDataPluginServices } from '../../../types';

export interface PhraseSuggestorProps {
kibana: KibanaReactContextValue<IDataPluginServices>;
indexPattern: IndexPattern;
field?: Field;
uiSettings: UiSettingsClientContract;
}

export interface PhraseSuggestorState {
Expand All @@ -38,10 +41,11 @@ export interface PhraseSuggestorState {
* aggregatable), we pull out the common logic for requesting suggestions into this component
* which both of them extend.
*/
export class PhraseSuggestor<T extends PhraseSuggestorProps> extends Component<
export class PhraseSuggestorUI<T extends PhraseSuggestorProps> extends Component<
T,
PhraseSuggestorState
> {
private services = this.props.kibana.services;
public state: PhraseSuggestorState = {
suggestions: [],
isLoading: false,
Expand All @@ -52,7 +56,7 @@ export class PhraseSuggestor<T extends PhraseSuggestorProps> extends Component<
}

protected isSuggestingValues() {
const shouldSuggestValues = this.props.uiSettings.get('filterEditor:suggestValues');
const shouldSuggestValues = this.services.uiSettings.get('filterEditor:suggestValues');
const { field } = this.props;
return shouldSuggestValues && field && field.aggregatable && field.type === 'string';
}
Expand All @@ -67,7 +71,9 @@ export class PhraseSuggestor<T extends PhraseSuggestorProps> extends Component<
return;
}
this.setState({ isLoading: true });
const suggestions = await getSuggestions(indexPattern.title, field, value);
const suggestions = await this.services.data.getSuggestions(indexPattern.title, field, value);
this.setState({ suggestions, isLoading: false });
}
}

export const PhraseSuggestor = withKibana(PhraseSuggestorUI);
Original file line number Diff line number Diff line change
Expand Up @@ -22,16 +22,17 @@ import { InjectedIntl, injectI18n } from '@kbn/i18n/react';
import { uniq } from 'lodash';
import React from 'react';
import { GenericComboBox, GenericComboBoxProps } from './generic_combo_box';
import { PhraseSuggestor, PhraseSuggestorProps } from './phrase_suggestor';
import { PhraseSuggestorUI, PhraseSuggestorProps } from './phrase_suggestor';
import { ValueInputType } from './value_input_type';
import { withKibana } from '../../../../../../../plugins/kibana_react/public';

interface Props extends PhraseSuggestorProps {
value?: string;
onChange: (value: string | number | boolean) => void;
intl: InjectedIntl;
}

class PhraseValueInputUI extends PhraseSuggestor<Props> {
class PhraseValueInputUI extends PhraseSuggestorUI<Props> {
public render() {
return (
<EuiFormRow
Expand Down Expand Up @@ -87,4 +88,4 @@ function StringComboBox(props: GenericComboBoxProps<string>) {
return GenericComboBox(props);
}

export const PhraseValueInput = injectI18n(PhraseValueInputUI);
export const PhraseValueInput = injectI18n(withKibana(PhraseValueInputUI));
Original file line number Diff line number Diff line change
Expand Up @@ -22,15 +22,16 @@ import { InjectedIntl, injectI18n } from '@kbn/i18n/react';
import { uniq } from 'lodash';
import React from 'react';
import { GenericComboBox, GenericComboBoxProps } from './generic_combo_box';
import { PhraseSuggestor, PhraseSuggestorProps } from './phrase_suggestor';
import { PhraseSuggestorUI, PhraseSuggestorProps } from './phrase_suggestor';
import { withKibana } from '../../../../../../../plugins/kibana_react/public';

interface Props extends PhraseSuggestorProps {
values?: string[];
onChange: (values: string[]) => void;
intl: InjectedIntl;
}

class PhrasesValuesInputUI extends PhraseSuggestor<Props> {
class PhrasesValuesInputUI extends PhraseSuggestorUI<Props> {
public render() {
const { suggestions } = this.state;
const { values, intl, onChange } = this.props;
Expand Down Expand Up @@ -64,4 +65,4 @@ function StringComboBox(props: GenericComboBoxProps<string>) {
return GenericComboBox(props);
}

export const PhrasesValuesInput = injectI18n(PhrasesValuesInputUI);
export const PhrasesValuesInput = injectI18n(withKibana(PhrasesValuesInputUI));
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,6 @@ class FilterItemUI extends Component<Props, State> {
indexPatterns={this.props.indexPatterns}
onSubmit={this.onSubmit}
onCancel={this.closePopover}
uiSettings={this.props.uiSettings}
/>
</div>
),
Expand Down
2 changes: 1 addition & 1 deletion src/legacy/core_plugins/data/public/plugin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -127,10 +127,10 @@ export class DataPlugin
public start(core: CoreStart, { __LEGACY, data }: DataPluginStartDependencies) {
const SearchBar = createSearchBar({
core,
data,
store: __LEGACY.storage,
timefilter: this.setupApi.timefilter,
filterManager: this.setupApi.filter.filterManager,
autocomplete: data.autocomplete,
});

return {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -134,8 +134,8 @@ export class QueryBarInputUI extends Component<Props, State> {
const queryString = this.getQueryString();

const recentSearchSuggestions = this.getRecentSearchSuggestions(queryString);
const autocompleteProvider = this.services.data.autocomplete.getProvider(language);

const autocompleteProvider = this.services.autocomplete.getProvider(language);
if (
!autocompleteProvider ||
!Array.isArray(this.state.indexPatterns) ||
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
import React from 'react';
import { Filter } from '@kbn/es-query';
import { CoreStart } from 'src/core/public';
import { AutocompletePublicPluginStart } from 'src/plugins/data/public';
import { DataPublicPluginStart } from 'src/plugins/data/public';
import { Storage } from '../../../types';
import { KibanaContextProvider } from '../../../../../../../../src/plugins/kibana_react/public';
import { TimefilterSetup } from '../../../timefilter';
Expand All @@ -29,10 +29,10 @@ import { SearchBarOwnProps } from '.';

interface StatefulSearchBarDeps {
core: CoreStart;
data: DataPublicPluginStart;
store: Storage;
timefilter: TimefilterSetup;
filterManager: FilterManager;
autocomplete: AutocompletePublicPluginStart;
}

export type StatetfulSearchBarProps = SearchBarOwnProps & {
Expand All @@ -59,7 +59,7 @@ export function createSearchBar({
store,
timefilter,
filterManager,
autocomplete,
data,
}: StatefulSearchBarDeps) {
// App name should come from the core application service.
// Until it's available, we'll ask the user to provide it for the pre-wired component.
Expand All @@ -71,7 +71,7 @@ export function createSearchBar({
<KibanaContextProvider
services={{
appName: props.appName,
autocomplete,
data,
store,
...core,
}}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,6 @@ export interface SearchBarOwnProps {
showFilterBar?: boolean;
showDatePicker?: boolean;
showAutoRefreshOnly?: boolean;
onRefreshChange?: (options: { isPaused: boolean; refreshInterval: number }) => void;
// Query bar - should be in SearchBarInjectedDeps
query?: Query;
// Show when user has privileges to save
Expand Down
13 changes: 8 additions & 5 deletions src/legacy/core_plugins/data/public/shim/legacy_module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ import { Filter } from '@kbn/es-query';

// @ts-ignore
import { uiModules } from 'ui/modules';
import { npSetup, npStart } from 'ui/new_platform';
import { npStart } from 'ui/new_platform';
import { FilterBar, ApplyFiltersPopover } from '../filter';
import template from './apply_filter_directive.html';

Expand All @@ -49,14 +49,16 @@ export const initLegacyModule = once((): void => {
}

child.setAttribute('ui-settings', 'uiSettings');
child.setAttribute('http', 'http');
child.setAttribute('doc-links', 'docLinks');
child.setAttribute('plugin-data-start', 'pluginDataStart');

// Append helper directive
elem.append(child);

const linkFn = ($scope: any) => {
$scope.uiSettings = npSetup.core.uiSettings;
$scope.http = npSetup.core.http;
$scope.uiSettings = npStart.core.uiSettings;
$scope.docLinks = npStart.core.docLinks;
$scope.pluginDataStart = npStart.plugins.data;
};

return linkFn;
Expand All @@ -66,11 +68,12 @@ export const initLegacyModule = once((): void => {
.directive('filterBarHelper', (reactDirective: any) => {
return reactDirective(wrapInI18nContext(FilterBar), [
['uiSettings', { watchDepth: 'reference' }],
['http', { watchDepth: 'reference' }],
['docLinks', { watchDepth: 'reference' }],
['onFiltersUpdated', { watchDepth: 'reference' }],
['indexPatterns', { watchDepth: 'collection' }],
['filters', { watchDepth: 'collection' }],
['className', { watchDepth: 'reference' }],
['pluginDataStart', { watchDepth: 'reference' }],
]);
})
.directive('applyFiltersPopoverComponent', (reactDirective: any) =>
Expand Down
4 changes: 2 additions & 2 deletions src/legacy/core_plugins/data/public/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
*/

import { UiSettingsClientContract, CoreStart } from 'src/core/public';
import { AutocompletePublicPluginStart } from 'src/plugins/data/public';
import { DataPublicPluginStart } from 'src/plugins/data/public';

export interface Storage {
get: (key: string) => any;
Expand All @@ -34,5 +34,5 @@ export interface IDataPluginServices extends Partial<CoreStart> {
notifications: CoreStart['notifications'];
http: CoreStart['http'];
store: Storage;
autocomplete: AutocompletePublicPluginStart;
data: DataPublicPluginStart;
}
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,7 @@ export class VisEditor extends Component {
services={{
appName: APP_NAME,
store: localStorage,
autocomplete: npStart.plugins.data.autocomplete,
data: npStart.plugins.data,
...npStart.core,
}}
>
Expand Down
4 changes: 3 additions & 1 deletion src/legacy/ui/public/new_platform/new_platform.karma_mock.js
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,9 @@ export const npStart = {
registerRenderer: sinon.fake(),
registerType: sinon.fake(),
},
data: {},
data: {
getSuggestions: sinon.fake(),
},
inspector: {
isAvailable: () => false,
open: () => ({
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ function FilterRow({
services={{
appName: 'filtersAgg',
store: localStorage,
autocomplete: npStart.plugins.data.autocomplete,
data: npStart.plugins.data,
...npStart.core,
}}
>
Expand Down
1 change: 1 addition & 0 deletions src/plugins/data/public/mocks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ const createSetupContract = (): Setup => {
const createStartContract = (): Start => {
const startContract: Start = {
autocomplete: autocompleteMock as Start['autocomplete'],
getSuggestions: jest.fn(),
};
return startContract;
};
Expand Down
Loading