Removing stateful saved object finder (#52166) (#52654)

This commit is contained in:
Joe Reuter 2019-12-11 14:13:41 +01:00 committed by GitHub
parent f283751196
commit 0ce02453ea
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
28 changed files with 196 additions and 202 deletions

View file

@ -35,7 +35,6 @@ import {
AppStateClass as TAppStateClass,
KbnUrl,
SaveOptions,
SavedObjectFinder,
unhashUrl,
} from './legacy_imports';
import { FilterStateManager, IndexPattern } from '../../../data/public';
@ -71,6 +70,10 @@ import { DashboardAppScope } from './dashboard_app';
import { VISUALIZE_EMBEDDABLE_TYPE } from '../visualize/embeddable';
import { convertSavedDashboardPanelToPanelState } from './lib/embeddable_saved_object_converters';
import { RenderDeps } from './application';
import {
SavedObjectFinderProps,
SavedObjectFinderUi,
} from '../../../../../plugins/kibana_react/public';
export interface DashboardAppControllerDependencies extends RenderDeps {
$scope: DashboardAppScope;
@ -115,7 +118,7 @@ export class DashboardAppController {
timefilter: { timefilter },
},
},
core: { notifications, overlays, chrome, injectedMetadata },
core: { notifications, overlays, chrome, injectedMetadata, uiSettings, savedObjects },
}: DashboardAppControllerDependencies) {
new FilterStateManager(globalState, getAppState, filterManager);
const queryFilter = filterManager;
@ -718,6 +721,10 @@ export class DashboardAppController {
};
navActions[TopNavIds.ADD] = () => {
if (dashboardContainer && !isErrorEmbeddable(dashboardContainer)) {
const SavedObjectFinder = (props: SavedObjectFinderProps) => (
<SavedObjectFinderUi {...props} savedObjects={savedObjects} uiSettings={uiSettings} />
);
openAddPanelFlyout({
embeddable: dashboardContainer,
getAllFactories: embeddables.getEmbeddableFactories,

View file

@ -65,4 +65,3 @@ export { stateMonitorFactory, StateMonitor } from 'ui/state_management/state_mon
export { ensureDefaultIndexPattern } from 'ui/legacy_compat';
export { unhashUrl } from '../../../../../plugins/kibana_utils/public';
export { IInjector } from 'ui/chrome';
export { SavedObjectFinder } from 'ui/saved_objects/components/saved_object_finder';

View file

@ -26,7 +26,7 @@ exports[`render 1`] = `
</EuiTitle>
</EuiFlyoutHeader>
<EuiFlyoutBody>
<SavedObjectFinder
<SavedObjectFinderUi
noItemsMessage={
<FormattedMessage
defaultMessage="No matching searches found."
@ -44,6 +44,8 @@ exports[`render 1`] = `
},
]
}
savedObjects={Object {}}
uiSettings={Object {}}
/>
</EuiFlyoutBody>
<EuiFlyoutFooter>

View file

@ -32,11 +32,16 @@ import {
EuiFlyoutBody,
EuiTitle,
} from '@elastic/eui';
import { SavedObjectFinder } from 'ui/saved_objects/components/saved_object_finder';
import { SavedObjectFinderUi } from '../../../../../../../plugins/kibana_react/public';
import { getServices } from '../../kibana_services';
const SEARCH_OBJECT_TYPE = 'search';
export function OpenSearchPanel(props) {
const {
core: { uiSettings, savedObjects },
} = getServices();
return (
<EuiFlyout ownFocus onClose={props.onClose} data-test-subj="loadSearchForm">
<EuiFlyoutHeader hasBorder>
@ -50,7 +55,7 @@ export function OpenSearchPanel(props) {
</EuiTitle>
</EuiFlyoutHeader>
<EuiFlyoutBody>
<SavedObjectFinder
<SavedObjectFinderUi
noItemsMessage={
<FormattedMessage
id="kbn.discover.topNav.openSearchPanel.noSearchesFoundDescription"
@ -70,6 +75,8 @@ export function OpenSearchPanel(props) {
window.location.assign(props.makeUrl(id));
props.onClose();
}}
uiSettings={uiSettings}
savedObjects={savedObjects}
/>
</EuiFlyoutBody>
<EuiFlyoutFooter>

View file

@ -23,7 +23,7 @@ import { shallow } from 'enzyme';
jest.mock('../../kibana_services', () => {
return {
getServices: () => ({
SavedObjectFinder: jest.fn()
core: { uiSettings: {}, savedObjects: {} },
}),
};
});

View file

@ -199,7 +199,8 @@ export class VisualizeEmbeddableFactory extends EmbeddableFactory<
editorParams: ['addToDashboard'],
},
npStart.core.http.basePath.prepend,
npStart.core.uiSettings
npStart.core.uiSettings,
npStart.core.savedObjects
);
}
return undefined;

View file

@ -45,7 +45,6 @@ export { PrivateProvider } from 'ui/private/private';
export { SavedObjectRegistryProvider } from 'ui/saved_objects';
export { SavedObjectSaveModal } from 'ui/saved_objects/components/saved_object_save_modal';
export { SavedObjectFinder } from 'ui/saved_objects/components/saved_object_finder';
export { showSaveModal } from 'ui/saved_objects/show_saved_object_save_modal';
export { subscribeWithScope } from 'ui/utils/subscribe_with_scope';

View file

@ -16,6 +16,7 @@
vis-types-registry="listingController.visTypeRegistry"
add-base-path="listingController.addBasePath"
ui-settings="listingController.uiSettings"
saved-objects="listingController.savedObjects"
></new-vis-modal>
</div>

View file

@ -34,6 +34,7 @@ export function initListingDirective(app) {
['onClose', { watchDepth: 'reference' }],
['addBasePath', { watchDepth: 'reference' }],
['uiSettings', { watchDepth: 'reference' }],
['savedObjects', { watchDepth: 'reference' }],
'isOpen',
])
);
@ -54,7 +55,7 @@ export function VisualizeListingController($injector, createNewVis) {
toastNotifications,
uiSettings,
visualizations,
core: { docLinks },
core: { docLinks, savedObjects },
} = getServices();
const kbnUrl = $injector.get('kbnUrl');
@ -64,6 +65,7 @@ export function VisualizeListingController($injector, createNewVis) {
this.showNewVisModal = false;
this.addBasePath = addBasePath;
this.uiSettings = uiSettings;
this.savedObjects = savedObjects;
this.createNewVis = () => {
this.showNewVisModal = true;

View file

@ -108,6 +108,7 @@ exports[`NewVisModal filter for visualization types should render as expected 1`
}
isOpen={true}
onClose={[Function]}
savedObjects={Object {}}
uiSettings={
Object {
"get": [MockFunction] {
@ -1413,6 +1414,7 @@ exports[`NewVisModal should render as expected 1`] = `
}
isOpen={true}
onClose={[Function]}
savedObjects={Object {}}
uiSettings={
Object {
"get": [MockFunction] {

View file

@ -29,6 +29,7 @@ jest.mock('../legacy_imports', () => ({
}));
import { NewVisModal } from './new_vis_modal';
import { SavedObjectsStart } from 'kibana/public';
describe('NewVisModal', () => {
const defaultVisTypeParams = {
@ -76,6 +77,7 @@ describe('NewVisModal', () => {
visTypesRegistry={visTypes}
addBasePath={addBasePath}
uiSettings={uiSettings}
savedObjects={{} as SavedObjectsStart}
/>
);
expect(wrapper).toMatchSnapshot();
@ -89,6 +91,7 @@ describe('NewVisModal', () => {
visTypesRegistry={visTypes}
addBasePath={addBasePath}
uiSettings={uiSettings}
savedObjects={{} as SavedObjectsStart}
/>
);
expect(wrapper.find('[data-test-subj="visType-vis"]').exists()).toBe(true);
@ -104,6 +107,7 @@ describe('NewVisModal', () => {
visTypesRegistry={visTypes}
addBasePath={addBasePath}
uiSettings={uiSettings}
savedObjects={{} as SavedObjectsStart}
/>
);
const visButton = wrapper.find('button[data-test-subj="visType-vis"]');
@ -121,6 +125,7 @@ describe('NewVisModal', () => {
editorParams={['foo=true', 'bar=42']}
addBasePath={addBasePath}
uiSettings={uiSettings}
savedObjects={{} as SavedObjectsStart}
/>
);
const visButton = wrapper.find('button[data-test-subj="visType-vis"]');
@ -138,6 +143,7 @@ describe('NewVisModal', () => {
visTypesRegistry={visTypes}
addBasePath={addBasePath}
uiSettings={uiSettings}
savedObjects={{} as SavedObjectsStart}
/>
);
const searchBox = wrapper.find('input[data-test-subj="filterVisType"]');
@ -156,6 +162,7 @@ describe('NewVisModal', () => {
visTypesRegistry={visTypes}
addBasePath={addBasePath}
uiSettings={uiSettings}
savedObjects={{} as SavedObjectsStart}
/>
);
expect(wrapper.find('[data-test-subj="visType-visExp"]').exists()).toBe(false);
@ -170,6 +177,7 @@ describe('NewVisModal', () => {
visTypesRegistry={visTypes}
addBasePath={addBasePath}
uiSettings={uiSettings}
savedObjects={{} as SavedObjectsStart}
/>
);
expect(wrapper.find('[data-test-subj="visType-visExp"]').exists()).toBe(true);

View file

@ -22,7 +22,7 @@ import React from 'react';
import { EuiModal, EuiOverlayMask } from '@elastic/eui';
import { i18n } from '@kbn/i18n';
import { IUiSettingsClient } from 'kibana/public';
import { IUiSettingsClient, SavedObjectsStart } from 'kibana/public';
import { VisType } from '../legacy_imports';
import { VisualizeConstants } from '../visualize_constants';
import { createUiStatsReporter, METRIC_TYPE } from '../../../../ui_metric/public';
@ -37,6 +37,7 @@ interface TypeSelectionProps {
editorParams?: string[];
addBasePath: (path: string) => string;
uiSettings: IUiSettingsClient;
savedObjects: SavedObjectsStart;
}
interface TypeSelectionState {
@ -81,7 +82,12 @@ class NewVisModal extends React.Component<TypeSelectionProps, TypeSelectionState
const selectionModal =
this.state.showSearchVisModal && this.state.visType ? (
<EuiModal onClose={this.onCloseModal} className="visNewVisSearchDialog">
<SearchSelection onSearchSelected={this.onSearchSelected} visType={this.state.visType} />
<SearchSelection
onSearchSelected={this.onSearchSelected}
visType={this.state.visType}
uiSettings={this.props.uiSettings}
savedObjects={this.props.savedObjects}
/>
</EuiModal>
) : (
<EuiModal

View file

@ -21,12 +21,16 @@ import { EuiModalBody, EuiModalHeader, EuiModalHeaderTitle } from '@elastic/eui'
import { i18n } from '@kbn/i18n';
import { FormattedMessage } from '@kbn/i18n/react';
import React from 'react';
import { IUiSettingsClient, SavedObjectsStart } from 'kibana/public';
import { SavedObjectFinder, VisType } from '../../legacy_imports';
import { SavedObjectFinderUi } from '../../../../../../../plugins/kibana_react/public';
import { VisType } from '../../legacy_imports';
interface SearchSelectionProps {
onSearchSelected: (searchId: string, searchType: string) => void;
visType: VisType;
uiSettings: IUiSettingsClient;
savedObjects: SavedObjectsStart;
}
export class SearchSelection extends React.Component<SearchSelectionProps> {
@ -50,7 +54,7 @@ export class SearchSelection extends React.Component<SearchSelectionProps> {
</EuiModalHeaderTitle>
</EuiModalHeader>
<EuiModalBody>
<SavedObjectFinder
<SavedObjectFinderUi
key="searchSavedObjectFinder"
onChoose={this.props.onSearchSelected}
showFilter
@ -83,6 +87,8 @@ export class SearchSelection extends React.Component<SearchSelectionProps> {
},
]}
fixedPageSize={this.fixedPageSize}
uiSettings={this.props.uiSettings}
savedObjects={this.props.savedObjects}
/>
</EuiModalBody>
</React.Fragment>

View file

@ -21,7 +21,7 @@ import React from 'react';
import ReactDOM from 'react-dom';
import { I18nProvider } from '@kbn/i18n/react';
import { IUiSettingsClient } from 'kibana/public';
import { IUiSettingsClient, SavedObjectsStart } from 'kibana/public';
import { NewVisModal } from './new_vis_modal';
import { TypesStart } from '../../../../visualizations/public/np_ready/public/types';
@ -33,7 +33,8 @@ export function showNewVisModal(
visTypeRegistry: TypesStart,
{ editorParams = [] }: ShowNewVisModalParams = {},
addBasePath: (path: string) => string,
uiSettings: IUiSettingsClient
uiSettings: IUiSettingsClient,
savedObjects: SavedObjectsStart
) {
const container = document.createElement('div');
const onClose = () => {
@ -51,6 +52,7 @@ export function showNewVisModal(
editorParams={editorParams}
addBasePath={addBasePath}
uiSettings={uiSettings}
savedObjects={savedObjects}
/>
</I18nProvider>
);

View file

@ -1,108 +0,0 @@
/*
* Licensed to Elasticsearch B.V. under one or more contributor
* license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright
* ownership. Elasticsearch B.V. licenses this file to you under
* the Apache License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import React from 'react';
import { npStart } from 'ui/new_platform';
import { IconType } from '@elastic/eui';
import { SavedObjectAttributes } from 'src/core/server';
import { SimpleSavedObject } from 'src/core/public';
import { SavedObjectFinder as SavedObjectFinderNP } from '../../../../../plugins/kibana_react/public';
/**
* DO NOT USE THIS COMPONENT, IT IS DEPRECATED.
* Use the one in `src/plugins/kibana_react` instead.
*/
export interface SavedObjectMetaData<T extends SavedObjectAttributes> {
type: string;
name: string;
getIconForSavedObject(savedObject: SimpleSavedObject<T>): IconType;
getTooltipForSavedObject?(savedObject: SimpleSavedObject<T>): string;
showSavedObject?(savedObject: SimpleSavedObject<T>): boolean;
}
interface BaseSavedObjectFinder {
/**
* @deprecated
*
* Use component in `src/plugins/kibana_react` instead.
*/
onChoose?: (
id: SimpleSavedObject<SavedObjectAttributes>['id'],
type: SimpleSavedObject<SavedObjectAttributes>['type'],
name: string
) => void;
/**
* @deprecated
*
* Use component in `src/plugins/kibana_react` instead.
*/
noItemsMessage?: React.ReactNode;
/**
* @deprecated
*
* Use component in `src/plugins/kibana_react` instead.
*/
savedObjectMetaData: Array<SavedObjectMetaData<SavedObjectAttributes>>;
/**
* @deprecated
*
* Use component in `src/plugins/kibana_react` instead.
*/
showFilter?: boolean;
}
interface SavedObjectFinderFixedPage extends BaseSavedObjectFinder {
/**
* @deprecated
*
* Use component in `src/plugins/kibana_react` instead.
*/
initialPageSize?: undefined;
/**
* @deprecated
*
* Use component in `src/plugins/kibana_react` instead.
*/
fixedPageSize: number;
}
interface SavedObjectFinderInitialPageSize extends BaseSavedObjectFinder {
/**
* @deprecated
*
* Use component in `src/plugins/kibana_react` instead.
*/
initialPageSize?: 5 | 10 | 15 | 25;
/**
* @deprecated
*
* Use component in `src/plugins/kibana_react` instead.
*/
fixedPageSize?: undefined;
}
type SavedObjectFinderProps = SavedObjectFinderFixedPage | SavedObjectFinderInitialPageSize;
export const SavedObjectFinder: React.FC<SavedObjectFinderProps> = props => (
<SavedObjectFinderNP
savedObjects={npStart.core.savedObjects}
uiSettings={npStart.core.uiSettings}
{...props}
/>
);

View file

@ -27,7 +27,7 @@ import { ExpandPanelAction, ReplacePanelAction } from '.';
import { DashboardContainerFactory } from './embeddable/dashboard_container_factory';
import { Start as InspectorStartContract } from '../../../plugins/inspector/public';
import {
SavedObjectFinder as SavedObjectFinderUi,
SavedObjectFinderUi,
SavedObjectFinderProps,
ExitFullScreenButton as ExitFullScreenButtonUi,
ExitFullScreenButtonProps,

View file

@ -35,7 +35,7 @@ import { IconType } from '@elastic/eui';
import { shallow } from 'enzyme';
import React from 'react';
import * as sinon from 'sinon';
import { SavedObjectFinder } from './saved_object_finder';
import { SavedObjectFinderUi as SavedObjectFinder } from './saved_object_finder';
// eslint-disable-next-line
import { coreMock } from '../../../../core/public/mocks';

View file

@ -46,6 +46,7 @@ import { i18n } from '@kbn/i18n';
import { SavedObjectAttributes } from '../../../../core/server';
import { SimpleSavedObject, CoreStart } from '../../../../core/public';
import { useKibana } from '../context';
// TODO the typings for EuiListGroup are incorrect - maxWidth is missing. This can be removed when the types are adjusted
const FixedEuiListGroup = (EuiListGroup as any) as React.FunctionComponent<
@ -104,12 +105,18 @@ interface SavedObjectFinderInitialPageSize extends BaseSavedObjectFinder {
initialPageSize?: 5 | 10 | 15 | 25;
fixedPageSize?: undefined;
}
export type SavedObjectFinderProps = {
export type SavedObjectFinderProps = SavedObjectFinderFixedPage | SavedObjectFinderInitialPageSize;
export type SavedObjectFinderUiProps = {
savedObjects: CoreStart['savedObjects'];
uiSettings: CoreStart['uiSettings'];
} & (SavedObjectFinderFixedPage | SavedObjectFinderInitialPageSize);
} & SavedObjectFinderProps;
class SavedObjectFinder extends React.Component<SavedObjectFinderProps, SavedObjectFinderState> {
class SavedObjectFinderUi extends React.Component<
SavedObjectFinderUiProps,
SavedObjectFinderState
> {
public static propTypes = {
onChoose: PropTypes.func,
noItemsMessage: PropTypes.node,
@ -174,7 +181,7 @@ class SavedObjectFinder extends React.Component<SavedObjectFinderProps, SavedObj
}
}, 300);
constructor(props: SavedObjectFinderProps) {
constructor(props: SavedObjectFinderUiProps) {
super(props);
this.state = {
@ -523,4 +530,15 @@ class SavedObjectFinder extends React.Component<SavedObjectFinderProps, SavedObj
}
}
export { SavedObjectFinder };
const SavedObjectFinder = (props: SavedObjectFinderProps) => {
const { services } = useKibana();
return (
<SavedObjectFinderUi
{...props}
savedObjects={services.savedObject}
uiSettings={services.uiSettings}
/>
);
};
export { SavedObjectFinder, SavedObjectFinderUi };

View file

@ -22,7 +22,6 @@ import 'uiExports/embeddableFactories';
import 'uiExports/embeddableActions';
import { npSetup, npStart } from 'ui/new_platform';
import { SavedObjectFinder } from 'ui/saved_objects/components/saved_object_finder';
import { ExitFullScreenButton } from 'ui/exit_full_screen';
import uiRoutes from 'ui/routes';
// @ts-ignore
@ -39,7 +38,6 @@ export const setup = pluginInstance.setup(npSetup.core, {
embeddable: npSetup.plugins.embeddable,
inspector: npSetup.plugins.inspector,
__LEGACY: {
SavedObjectFinder,
ExitFullScreenButton,
},
});
@ -64,7 +62,6 @@ export const start = pluginInstance.start(npStart.core, {
inspector: npStart.plugins.inspector,
uiActions: npStart.plugins.uiActions,
__LEGACY: {
SavedObjectFinder,
ExitFullScreenButton,
onRenderComplete: (renderCompleteListener: () => void) => {
if (rendered) {

View file

@ -38,6 +38,10 @@ import {
ContactCardEmbeddableFactory,
} from './embeddable_api';
import { App } from './app';
import {
SavedObjectFinderProps,
SavedObjectFinderUi,
} from '../../../../../../../src/plugins/kibana_react/public/saved_objects';
import {
IEmbeddableStart,
IEmbeddableSetup,
@ -47,7 +51,6 @@ export interface SetupDependencies {
embeddable: IEmbeddableSetup;
inspector: InspectorSetupContract;
__LEGACY: {
SavedObjectFinder: React.ComponentType<any>;
ExitFullScreenButton: React.ComponentType<any>;
};
}
@ -57,7 +60,6 @@ interface StartDependencies {
uiActions: IUiActionsStart;
inspector: InspectorStartContract;
__LEGACY: {
SavedObjectFinder: React.ComponentType<any>;
ExitFullScreenButton: React.ComponentType<any>;
onRenderComplete: (onRenderComplete: () => void) => void;
};
@ -99,6 +101,13 @@ export class EmbeddableExplorerPublicPlugin
plugins.__LEGACY.onRenderComplete(() => {
const root = document.getElementById(REACT_ROOT_ID);
const SavedObjectFinder = (props: SavedObjectFinderProps) => (
<SavedObjectFinderUi
{...props}
savedObjects={core.savedObjects}
uiSettings={core.uiSettings}
/>
);
ReactDOM.render(
<App
getActions={plugins.uiActions.getTriggerCompatibleActions}
@ -107,7 +116,7 @@ export class EmbeddableExplorerPublicPlugin
notifications={core.notifications}
overlays={core.overlays}
inspector={plugins.inspector}
SavedObjectFinder={plugins.__LEGACY.SavedObjectFinder}
SavedObjectFinder={SavedObjectFinder}
I18nContext={core.i18n.Context}
/>,
root

View file

@ -16,8 +16,11 @@ import {
} from '../../../../../../src/legacy/core_plugins/embeddable_api/public/np_ready/public';
import { start } from '../../../../../../src/legacy/core_plugins/embeddable_api/public/np_ready/public/legacy';
import { EmbeddableExpression } from '../expression_types/embeddable';
import { SavedObjectFinder } from '../../../../../../src/legacy/ui/public/saved_objects/components/saved_object_finder';
import { RendererStrings } from '../../i18n';
import {
SavedObjectFinderProps,
SavedObjectFinderUi,
} from '../../../../../../src/plugins/kibana_react/public';
const { embeddable: strings } = RendererStrings;
@ -34,6 +37,13 @@ interface Handlers {
}
const renderEmbeddable = (embeddableObject: IEmbeddable, domNode: HTMLElement) => {
const SavedObjectFinder = (props: SavedObjectFinderProps) => (
<SavedObjectFinderUi
{...props}
savedObjects={npStart.core.savedObjects}
uiSettings={npStart.core.uiSettings}
/>
);
return (
<div
className="embeddable"

View file

@ -8,7 +8,7 @@ import React from 'react';
import { EuiFlyout, EuiFlyoutHeader, EuiFlyoutBody, EuiTitle } from '@elastic/eui';
import {
SavedObjectFinder,
SavedObjectFinderUi,
SavedObjectMetaData,
} from '../../../../../../../src/plugins/kibana_react/public/saved_objects'; // eslint-disable-line
import { start } from '../../../../../../../src/legacy/core_plugins/embeddable_api/public/np_ready/public/legacy';
@ -64,7 +64,7 @@ export class AddEmbeddableFlyout extends React.Component<Props> {
</EuiTitle>
</EuiFlyoutHeader>
<EuiFlyoutBody>
<SavedObjectFinder
<SavedObjectFinderUi
onChoose={this.onAddPanel}
savedObjectMetaData={availableSavedObjects}
showFilter={true}

View file

@ -8,7 +8,7 @@ import { i18n } from '@kbn/i18n';
import React from 'react';
import { CoreStart } from 'src/core/public';
import { SavedObjectFinder } from '../../../../../../src/plugins/kibana_react/public';
import { SavedObjectFinderUi } from '../../../../../../src/plugins/kibana_react/public';
import { IndexPatternSavedObject } from '../types';
export interface SourcePickerProps {
@ -25,7 +25,7 @@ export function SourcePicker({
onIndexPatternSelected,
}: SourcePickerProps) {
return (
<SavedObjectFinder
<SavedObjectFinderUi
savedObjects={savedObjects}
uiSettings={uiSettings}
onChoose={(_id, _type, _name, indexPattern) => {

View file

@ -15,7 +15,8 @@ import {
} from '@elastic/eui';
import { i18n } from '@kbn/i18n';
import { FormattedMessage } from '@kbn/i18n/react';
import { SavedObjectFinder } from 'ui/saved_objects/components/saved_object_finder';
import { npStart } from 'ui/new_platform';
import { SavedObjectFinderUi } from '../../../../../../../../../../src/plugins/kibana_react/public';
export interface PageProps {
nextStepPath: string;
@ -46,7 +47,7 @@ export const Page: FC<PageProps> = ({ nextStepPath }) => {
</EuiPageHeaderSection>
</EuiPageHeader>
<EuiPageContent>
<SavedObjectFinder
<SavedObjectFinderUi
key="searchSavedObjectFinder"
onChoose={onObjectSelection}
showFilter
@ -76,6 +77,8 @@ export const Page: FC<PageProps> = ({ nextStepPath }) => {
},
]}
fixedPageSize={RESULTS_PER_PAGE}
uiSettings={npStart.core.uiSettings}
savedObjects={npStart.core.savedObjects}
/>
</EuiPageContent>
</EuiPageBody>

View file

@ -9,7 +9,6 @@ import React, { useEffect, useState } from 'react';
import { createPortalNode, InPortal } from 'react-reverse-portal';
import styled, { css } from 'styled-components';
import { ELASTIC_WEBSITE_URL, DOC_LINK_VERSION } from 'ui/documentation_links';
import { SavedObjectFinder } from 'ui/saved_objects/components/saved_object_finder';
import { EmbeddablePanel } from '../../../../../../../src/legacy/core_plugins/embeddable_api/public/np_ready/public';
import { start } from '../../../../../../../src/legacy/core_plugins/embeddable_api/public/np_ready/public/legacy';
@ -29,6 +28,10 @@ import { MapToolTip } from './map_tool_tip/map_tool_tip';
import * as i18n from './translations';
import { MapEmbeddable, SetQuery } from './types';
import { Query, esFilters } from '../../../../../../../src/plugins/data/public';
import {
SavedObjectFinderProps,
SavedObjectFinderUi,
} from '../../../../../../../src/plugins/kibana_react/public';
interface EmbeddableMapProps {
maintainRatio?: boolean;
@ -176,6 +179,10 @@ export const EmbeddedMapComponent = ({
}
}, [startDate, endDate]);
const SavedObjectFinder = (props: SavedObjectFinderProps) => (
<SavedObjectFinderUi {...props} savedObjects={core.savedObjects} uiSettings={core.uiSettings} />
);
return isError ? null : (
<Embeddable>
<EmbeddableHeader title={i18n.EMBEDDABLE_HEADER_TITLE}>

View file

@ -8,8 +8,8 @@ import { EuiModalBody, EuiModalHeader, EuiModalHeaderTitle } from '@elastic/eui'
import { i18n } from '@kbn/i18n';
import { FormattedMessage } from '@kbn/i18n/react';
import React, { FC } from 'react';
import { SavedObjectFinder } from 'ui/saved_objects/components/saved_object_finder';
import { SavedObjectFinderUi } from '../../../../../../../../../../src/plugins/kibana_react/public';
import { useAppDependencies } from '../../../../app_dependencies';
interface SearchSelectionProps {
onSearchSelected: (searchId: string, searchType: string) => void;
@ -17,56 +17,63 @@ interface SearchSelectionProps {
const fixedPageSize: number = 8;
export const SearchSelection: FC<SearchSelectionProps> = ({ onSearchSelected }) => (
<>
<EuiModalHeader>
<EuiModalHeaderTitle>
<FormattedMessage
id="xpack.transform.newTransform.newTransformTitle"
defaultMessage="New transform"
/>{' '}
/{' '}
<FormattedMessage
id="xpack.transform.newTransform.chooseSourceTitle"
defaultMessage="Choose a source"
export const SearchSelection: FC<SearchSelectionProps> = ({ onSearchSelected }) => {
const {
core: { uiSettings, savedObjects },
} = useAppDependencies();
return (
<>
<EuiModalHeader>
<EuiModalHeaderTitle>
<FormattedMessage
id="xpack.transform.newTransform.newTransformTitle"
defaultMessage="New transform"
/>{' '}
/{' '}
<FormattedMessage
id="xpack.transform.newTransform.chooseSourceTitle"
defaultMessage="Choose a source"
/>
</EuiModalHeaderTitle>
</EuiModalHeader>
<EuiModalBody>
<SavedObjectFinderUi
key="searchSavedObjectFinder"
onChoose={onSearchSelected}
showFilter
noItemsMessage={i18n.translate(
'xpack.transform.newTransform.searchSelection.notFoundLabel',
{
defaultMessage: 'No matching indices or saved searches found.',
}
)}
savedObjectMetaData={[
{
type: 'search',
getIconForSavedObject: () => 'search',
name: i18n.translate(
'xpack.transform.newTransform.searchSelection.savedObjectType.search',
{
defaultMessage: 'Saved search',
}
),
},
{
type: 'index-pattern',
getIconForSavedObject: () => 'indexPatternApp',
name: i18n.translate(
'xpack.transform.newTransform.searchSelection.savedObjectType.indexPattern',
{
defaultMessage: 'Index pattern',
}
),
},
]}
fixedPageSize={fixedPageSize}
uiSettings={uiSettings}
savedObjects={savedObjects}
/>
</EuiModalHeaderTitle>
</EuiModalHeader>
<EuiModalBody>
<SavedObjectFinder
key="searchSavedObjectFinder"
onChoose={onSearchSelected}
showFilter
noItemsMessage={i18n.translate(
'xpack.transform.newTransform.searchSelection.notFoundLabel',
{
defaultMessage: 'No matching indices or saved searches found.',
}
)}
savedObjectMetaData={[
{
type: 'search',
getIconForSavedObject: () => 'search',
name: i18n.translate(
'xpack.transform.newTransform.searchSelection.savedObjectType.search',
{
defaultMessage: 'Saved search',
}
),
},
{
type: 'index-pattern',
getIconForSavedObject: () => 'indexPatternApp',
name: i18n.translate(
'xpack.transform.newTransform.searchSelection.savedObjectType.indexPattern',
{
defaultMessage: 'Index pattern',
}
),
},
]}
fixedPageSize={fixedPageSize}
/>
</EuiModalBody>
</>
);
</EuiModalBody>
</>
);
};

View file

@ -27,12 +27,21 @@ const template = `<kbn-management-app section="${KBN_MANAGEMENT_SECTION}"><div i
export class Plugin {
public start(core: Core, plugins: Plugins): void {
const { http, routing, legacyHttp, chrome, documentation, docTitle } = core;
const {
http,
routing,
legacyHttp,
chrome,
documentation,
docTitle,
uiSettings,
savedObjects,
} = core;
const { management, savedSearches: coreSavedSearches, uiMetric } = plugins;
// AppCore/AppPlugins to be passed on as React context
const AppDependencies = {
core: { chrome, http, i18n: core.i18n },
core: { chrome, http, i18n: core.i18n, uiSettings, savedObjects },
plugins: {
management: { sections: management.sections },
savedSearches: coreSavedSearches,

View file

@ -18,7 +18,7 @@ export type npCore = typeof npStart.core;
// AppCore/AppPlugins is the set of core features/plugins
// we pass on via context/hooks to the app and its components.
export type AppCore = Pick<npCore, 'chrome' | 'http' | 'i18n'>;
export type AppCore = Pick<npCore, 'chrome' | 'http' | 'i18n' | 'savedObjects' | 'uiSettings'>;
export interface AppPlugins {
management: {