diff --git a/src/legacy/core_plugins/kibana/index.js b/src/legacy/core_plugins/kibana/index.js index 682a39a516e11..89104fe51e549 100644 --- a/src/legacy/core_plugins/kibana/index.js +++ b/src/legacy/core_plugins/kibana/index.js @@ -65,7 +65,6 @@ export default function(kibana) { 'plugins/kibana/visualize/legacy', 'plugins/kibana/dashboard/legacy', ], - savedObjectTypes: ['plugins/kibana/dashboard/saved_dashboard/saved_dashboard_register'], app: { id: 'kibana', title: 'Kibana', diff --git a/src/legacy/core_plugins/kibana/public/dashboard/__tests__/saved_dashboards.js b/src/legacy/core_plugins/kibana/public/dashboard/__tests__/saved_dashboards.js deleted file mode 100644 index b387467189385..0000000000000 --- a/src/legacy/core_plugins/kibana/public/dashboard/__tests__/saved_dashboards.js +++ /dev/null @@ -1,36 +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 ngMock from 'ng_mock'; -import expect from '@kbn/expect'; - -describe('SavedDashboards Service', function() { - let savedDashboardLoader; - - beforeEach(ngMock.module('kibana')); - beforeEach( - ngMock.inject(function(savedDashboards) { - savedDashboardLoader = savedDashboards; - }) - ); - - it('delete returns a native promise', function() { - expect(savedDashboardLoader.delete(['1', '2'])).to.be.a(Promise); - }); -}); diff --git a/src/legacy/core_plugins/kibana/public/dashboard/index.ts b/src/legacy/core_plugins/kibana/public/dashboard/index.ts index 4a8decab6b00e..d0157882689d3 100644 --- a/src/legacy/core_plugins/kibana/public/dashboard/index.ts +++ b/src/legacy/core_plugins/kibana/public/dashboard/index.ts @@ -21,6 +21,7 @@ import { PluginInitializerContext } from 'kibana/public'; import { DashboardPlugin } from './plugin'; export * from './np_ready/dashboard_constants'; +export { createSavedDashboardLoader } from './saved_dashboard/saved_dashboards'; // Core will be looking for this when loading our plugin in the new platform export const plugin = (context: PluginInitializerContext) => { diff --git a/src/legacy/core_plugins/kibana/public/dashboard/legacy.ts b/src/legacy/core_plugins/kibana/public/dashboard/legacy.ts index 068a8378f936a..acbc4c4b6c47f 100644 --- a/src/legacy/core_plugins/kibana/public/dashboard/legacy.ts +++ b/src/legacy/core_plugins/kibana/public/dashboard/legacy.ts @@ -22,7 +22,6 @@ import { npSetup, npStart, legacyChrome } from './legacy_imports'; import { LegacyAngularInjectedDependencies } from './plugin'; import { start as data } from '../../../data/public/legacy'; import { start as embeddables } from '../../../embeddable_api/public/np_ready/public/legacy'; -import './saved_dashboard/saved_dashboard_register'; import './dashboard_config'; import { plugin } from './index'; diff --git a/src/legacy/core_plugins/kibana/public/dashboard/saved_dashboard/saved_dashboard_register.ts b/src/legacy/core_plugins/kibana/public/dashboard/saved_dashboard/saved_dashboard_register.ts deleted file mode 100644 index b9ea49ca4fd44..0000000000000 --- a/src/legacy/core_plugins/kibana/public/dashboard/saved_dashboard/saved_dashboard_register.ts +++ /dev/null @@ -1,46 +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 { i18n } from '@kbn/i18n'; -import { npStart } from 'ui/new_platform'; -// @ts-ignore -import { uiModules } from 'ui/modules'; -// @ts-ignore -import { savedObjectManagementRegistry } from '../../management/saved_object_registry'; -import { createSavedDashboardLoader } from './saved_dashboards'; - -const module = uiModules.get('app/dashboard'); - -// Register this service with the saved object registry so it can be -// edited by the object editor. -savedObjectManagementRegistry.register({ - service: 'savedDashboards', - title: i18n.translate('kbn.dashboard.savedDashboardsTitle', { - defaultMessage: 'dashboards', - }), -}); - -// this is no longer used in the conroller, but just here for savedObjectManagementRegistry -module.service('savedDashboards', () => - createSavedDashboardLoader({ - savedObjectsClient: npStart.core.savedObjects.client, - indexPatterns: npStart.plugins.data.indexPatterns, - chrome: npStart.core.chrome, - overlays: npStart.core.overlays, - }) -); diff --git a/src/legacy/core_plugins/kibana/public/discover/build_services.ts b/src/legacy/core_plugins/kibana/public/discover/build_services.ts index 1fb8b4abb21c4..bc2436ecdf5ea 100644 --- a/src/legacy/core_plugins/kibana/public/discover/build_services.ts +++ b/src/legacy/core_plugins/kibana/public/discover/build_services.ts @@ -30,7 +30,7 @@ import { IndexPatternsContract, DataPublicPluginStart, } from 'src/plugins/data/public'; -import { createSavedSearchesService } from './saved_searches'; +import { createSavedSearchesLoader } from './saved_searches'; import { DiscoverStartPlugins } from './plugin'; import { EuiUtilsStart } from '../../../../../plugins/eui_utils/public'; import { SharePluginStart } from '../../../../../plugins/share/public'; @@ -68,7 +68,7 @@ export async function buildServices( chrome: core.chrome, overlays: core.overlays, }; - const savedObjectService = createSavedSearchesService(services); + const savedObjectService = createSavedSearchesLoader(services); return { addBasePath: core.http.basePath.prepend, capabilities: core.application.capabilities, diff --git a/src/legacy/core_plugins/kibana/public/discover/index.ts b/src/legacy/core_plugins/kibana/public/discover/index.ts index d851cb96a18c4..33b2ad4bf8171 100644 --- a/src/legacy/core_plugins/kibana/public/discover/index.ts +++ b/src/legacy/core_plugins/kibana/public/discover/index.ts @@ -20,7 +20,7 @@ import { PluginInitializerContext } from 'kibana/public'; import { DiscoverPlugin } from './plugin'; -export { createSavedSearchesService } from './saved_searches/saved_searches'; +export { createSavedSearchesLoader } from './saved_searches/saved_searches'; // Core will be looking for this when loading our plugin in the new platform export const plugin = (context: PluginInitializerContext) => { diff --git a/src/legacy/core_plugins/kibana/public/discover/saved_searches/index.ts b/src/legacy/core_plugins/kibana/public/discover/saved_searches/index.ts index 1dd99025b4b70..24832df308a3e 100644 --- a/src/legacy/core_plugins/kibana/public/discover/saved_searches/index.ts +++ b/src/legacy/core_plugins/kibana/public/discover/saved_searches/index.ts @@ -18,4 +18,3 @@ */ export * from './saved_searches'; -import './saved_searches_register'; diff --git a/src/legacy/core_plugins/kibana/public/discover/saved_searches/saved_searches.ts b/src/legacy/core_plugins/kibana/public/discover/saved_searches/saved_searches.ts index abd3d46820c18..0b34652461026 100644 --- a/src/legacy/core_plugins/kibana/public/discover/saved_searches/saved_searches.ts +++ b/src/legacy/core_plugins/kibana/public/discover/saved_searches/saved_searches.ts @@ -20,7 +20,7 @@ import { SavedObjectLoader } from 'ui/saved_objects'; import { SavedObjectKibanaServices } from 'ui/saved_objects/types'; import { createSavedSearchClass } from './_saved_search'; -export function createSavedSearchesService(services: SavedObjectKibanaServices) { +export function createSavedSearchesLoader(services: SavedObjectKibanaServices) { const SavedSearchClass = createSavedSearchClass(services); const savedSearchLoader = new SavedObjectLoader( SavedSearchClass, diff --git a/src/legacy/core_plugins/kibana/public/discover/saved_searches/saved_searches_register.ts b/src/legacy/core_plugins/kibana/public/discover/saved_searches/saved_searches_register.ts deleted file mode 100644 index ab7894fd5e730..0000000000000 --- a/src/legacy/core_plugins/kibana/public/discover/saved_searches/saved_searches_register.ts +++ /dev/null @@ -1,43 +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 { npStart } from 'ui/new_platform'; -// @ts-ignore -import { uiModules } from 'ui/modules'; -// @ts-ignore -import { savedObjectManagementRegistry } from '../../management/saved_object_registry'; - -import { createSavedSearchesService } from './saved_searches'; - -// this is needed for saved object management -// Register this service with the saved object registry so it can be -// edited by the object editor. -savedObjectManagementRegistry.register({ - service: 'savedSearches', - title: 'searches', -}); -const services = { - savedObjectsClient: npStart.core.savedObjects.client, - indexPatterns: npStart.plugins.data.indexPatterns, - chrome: npStart.core.chrome, - overlays: npStart.core.overlays, -}; -const savedSearches = createSavedSearchesService(services); - -const module = uiModules.get('discover/saved_searches'); -module.service('savedSearches', () => savedSearches); diff --git a/src/legacy/core_plugins/kibana/public/management/saved_object_registry.js b/src/legacy/core_plugins/kibana/public/management/saved_object_registry.js deleted file mode 100644 index 978459dea7c2d..0000000000000 --- a/src/legacy/core_plugins/kibana/public/management/saved_object_registry.js +++ /dev/null @@ -1,32 +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 _ from 'lodash'; -const registry = []; -export const savedObjectManagementRegistry = { - register: function(service) { - registry.push(service); - }, - all: function() { - return registry; - }, - get: function(id) { - return _.find(registry, { service: id }); - }, -}; diff --git a/src/legacy/core_plugins/kibana/public/management/saved_object_registry.ts b/src/legacy/core_plugins/kibana/public/management/saved_object_registry.ts new file mode 100644 index 0000000000000..0a6ac20502669 --- /dev/null +++ b/src/legacy/core_plugins/kibana/public/management/saved_object_registry.ts @@ -0,0 +1,80 @@ +/* + * 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 _ from 'lodash'; +import { i18n } from '@kbn/i18n'; +import { npStart } from 'ui/new_platform'; +import { SavedObjectLoader } from 'ui/saved_objects'; +import { createSavedDashboardLoader } from '../dashboard'; +import { createSavedSearchesLoader } from '../discover'; +import { TypesService, createSavedVisLoader } from '../../../visualizations/public'; + +/** + * This registry is used for the editing mode of Saved Searches, Visualizations, + * Dashboard and Time Lion saved objects. + */ +interface SavedObjectRegistryEntry { + id: string; + service: SavedObjectLoader; + title: string; +} + +const registry: SavedObjectRegistryEntry[] = []; + +export const savedObjectManagementRegistry = { + register: (service: SavedObjectRegistryEntry) => { + registry.push(service); + }, + all: () => { + return registry; + }, + get: (id: string) => { + return _.find(registry, { id }); + }, +}; + +const services = { + savedObjectsClient: npStart.core.savedObjects.client, + indexPatterns: npStart.plugins.data.indexPatterns, + chrome: npStart.core.chrome, + overlays: npStart.core.overlays, +}; + +savedObjectManagementRegistry.register({ + id: 'savedVisualizations', + service: createSavedVisLoader({ + ...services, + ...{ visualizationTypes: new TypesService().start() }, + }), + title: 'visualizations', +}); + +savedObjectManagementRegistry.register({ + id: 'savedDashboards', + service: createSavedDashboardLoader(services), + title: i18n.translate('kbn.dashboard.savedDashboardsTitle', { + defaultMessage: 'dashboards', + }), +}); + +savedObjectManagementRegistry.register({ + id: 'savedSearches', + service: createSavedSearchesLoader(services), + title: 'searches', +}); diff --git a/src/legacy/core_plugins/kibana/public/management/sections/objects/_objects.js b/src/legacy/core_plugins/kibana/public/management/sections/objects/_objects.js index c9698f6e1f48b..c16e4cb00c2bd 100644 --- a/src/legacy/core_plugins/kibana/public/management/sections/objects/_objects.js +++ b/src/legacy/core_plugins/kibana/public/management/sections/objects/_objects.js @@ -41,7 +41,7 @@ function updateObjectsTable($scope, $injector) { const confirmModalPromise = $injector.get('confirmModalPromise'); const savedObjectsClient = npStart.core.savedObjects.client; - const services = savedObjectManagementRegistry.all().map(obj => $injector.get(obj.service)); + const services = savedObjectManagementRegistry.all().map(obj => obj.service); const uiCapabilites = npStart.core.application.capabilities; $scope.$$postDigest(() => { diff --git a/src/legacy/core_plugins/kibana/public/management/sections/objects/_view.js b/src/legacy/core_plugins/kibana/public/management/sections/objects/_view.js index 540f25c63a861..3205e28fe2314 100644 --- a/src/legacy/core_plugins/kibana/public/management/sections/objects/_view.js +++ b/src/legacy/core_plugins/kibana/public/management/sections/objects/_view.js @@ -49,17 +49,9 @@ uiModules .directive('kbnManagementObjectsView', function(kbnIndex, confirmModal) { return { restrict: 'E', - controller: function( - $scope, - $injector, - $routeParams, - $location, - $window, - $rootScope, - uiCapabilities - ) { + controller: function($scope, $routeParams, $location, $window, $rootScope, uiCapabilities) { const serviceObj = savedObjectManagementRegistry.get($routeParams.service); - const service = $injector.get(serviceObj.service); + const service = serviceObj.service; const savedObjectsClient = npStart.core.savedObjects.client; /** @@ -184,6 +176,7 @@ uiModules return orderIndex > -1 ? orderIndex : Infinity; }); }); + $scope.$digest(); }) .catch(error => fatalError(error, location)); diff --git a/src/legacy/core_plugins/kibana/public/management/sections/objects/breadcrumbs.js b/src/legacy/core_plugins/kibana/public/management/sections/objects/breadcrumbs.js index 49e57a7c40b16..e9082bfeb680d 100644 --- a/src/legacy/core_plugins/kibana/public/management/sections/objects/breadcrumbs.js +++ b/src/legacy/core_plugins/kibana/public/management/sections/objects/breadcrumbs.js @@ -34,9 +34,9 @@ export function getIndexBreadcrumbs() { ]; } -export function getViewBreadcrumbs($routeParams, $injector) { +export function getViewBreadcrumbs($routeParams) { const serviceObj = savedObjectManagementRegistry.get($routeParams.service); - const service = $injector.get(serviceObj.service); + const { service } = serviceObj; return [ ...getIndexBreadcrumbs(), diff --git a/src/legacy/core_plugins/kibana/public/visualize/index.ts b/src/legacy/core_plugins/kibana/public/visualize/index.ts index a39779792b83a..e7170836cf749 100644 --- a/src/legacy/core_plugins/kibana/public/visualize/index.ts +++ b/src/legacy/core_plugins/kibana/public/visualize/index.ts @@ -22,8 +22,7 @@ import { VisualizePlugin } from './plugin'; export * from './np_ready/visualize_constants'; export { showNewVisModal } from './np_ready/wizard'; - -export { createSavedVisLoader } from './saved_visualizations/saved_visualizations'; +export { VisualizeConstants, createVisualizeEditUrl } from './np_ready/visualize_constants'; // Core will be looking for this when loading our plugin in the new platform export const plugin = (context: PluginInitializerContext) => { diff --git a/src/legacy/core_plugins/kibana/public/visualize/np_ready/editor/editor.js b/src/legacy/core_plugins/kibana/public/visualize/np_ready/editor/editor.js index 261e3331e4796..2a4fdeb4e4016 100644 --- a/src/legacy/core_plugins/kibana/public/visualize/np_ready/editor/editor.js +++ b/src/legacy/core_plugins/kibana/public/visualize/np_ready/editor/editor.js @@ -21,7 +21,6 @@ import angular from 'angular'; import _ from 'lodash'; import { Subscription } from 'rxjs'; import { i18n } from '@kbn/i18n'; -import '../../saved_visualizations/saved_visualizations'; import React from 'react'; import { FormattedMessage } from '@kbn/i18n/react'; diff --git a/src/legacy/core_plugins/kibana/public/visualize/plugin.ts b/src/legacy/core_plugins/kibana/public/visualize/plugin.ts index 998fd2e2d9161..26c6691a3613f 100644 --- a/src/legacy/core_plugins/kibana/public/visualize/plugin.ts +++ b/src/legacy/core_plugins/kibana/public/visualize/plugin.ts @@ -27,9 +27,6 @@ import { SavedObjectsClientContract, } from 'kibana/public'; -// @ts-ignore -import { uiModules } from 'ui/modules'; - import { Storage } from '../../../../../plugins/kibana_utils/public'; import { DataPublicPluginStart } from '../../../../../plugins/data/public'; import { IEmbeddableStart } from '../../../../../plugins/embeddable/public'; @@ -44,9 +41,6 @@ import { HomePublicPluginSetup, } from '../../../../../plugins/home/public'; import { UsageCollectionSetup } from '../../../../../plugins/usage_collection/public'; -import { createSavedVisLoader } from './saved_visualizations/saved_visualizations'; -// @ts-ignore -import { savedObjectManagementRegistry } from '../management/saved_object_registry'; import { Chrome } from './legacy_imports'; export interface VisualizePluginStartDependencies { @@ -97,13 +91,6 @@ export class VisualizePlugin implements Plugin { share, } = this.startDependencies; - const savedVisualizations = createSavedVisLoader({ - savedObjectsClient, - indexPatterns: data.indexPatterns, - chrome: contextCore.chrome, - overlays: contextCore.overlays, - visualizations, - }); const deps: VisualizeKibanaServices = { ...__LEGACY, addBasePath: contextCore.http.basePath.prepend, @@ -116,7 +103,7 @@ export class VisualizePlugin implements Plugin { localStorage: new Storage(localStorage), navigation, savedObjectsClient, - savedVisualizations, + savedVisualizations: visualizations.getSavedVisualizationsLoader(), savedQueryService: data.query.savedQueries, share, toastNotifications: contextCore.notifications.toasts, @@ -158,21 +145,5 @@ export class VisualizePlugin implements Plugin { share, visualizations, }; - - const savedVisualizations = createSavedVisLoader({ - savedObjectsClient: core.savedObjects.client, - indexPatterns: data.indexPatterns, - chrome: core.chrome, - overlays: core.overlays, - visualizations, - }); - - // TODO: remove once savedobjectregistry is refactored - savedObjectManagementRegistry.register({ - service: 'savedVisualizations', - title: 'visualizations', - }); - - uiModules.get('app/visualize').service('savedVisualizations', () => savedVisualizations); } } diff --git a/src/legacy/core_plugins/timelion/public/app.js b/src/legacy/core_plugins/timelion/public/app.js index 084e497761e43..e9f8e3496acf4 100644 --- a/src/legacy/core_plugins/timelion/public/app.js +++ b/src/legacy/core_plugins/timelion/public/app.js @@ -43,7 +43,7 @@ import '../../data/public/legacy'; import './services/saved_sheet_register'; import rootTemplate from 'plugins/timelion/index.html'; -import { createSavedVisLoader } from '../../kibana/public/visualize'; +import { createSavedVisLoader, TypesService } from '../../visualizations/public'; require('plugins/timelion/directives/cells/cells'); require('plugins/timelion/directives/fixed_element'); @@ -131,6 +131,7 @@ app.controller('timelion', function( indexPatterns: npStart.plugins.data.indexPatterns, chrome: npStart.core.chrome, overlays: npStart.core.overlays, + visualizationTypes: new TypesService().start(), }); const timezone = Private(timezoneProvider)(); diff --git a/src/legacy/core_plugins/timelion/public/services/saved_sheets.ts b/src/legacy/core_plugins/timelion/public/services/saved_sheets.ts index df3898e3410dd..074431bf28da8 100644 --- a/src/legacy/core_plugins/timelion/public/services/saved_sheets.ts +++ b/src/legacy/core_plugins/timelion/public/services/saved_sheets.ts @@ -19,20 +19,11 @@ import { npStart } from 'ui/new_platform'; import { SavedObjectLoader } from 'ui/saved_objects'; // @ts-ignore -import { savedObjectManagementRegistry } from 'plugins/kibana/management/saved_object_registry'; -// @ts-ignore import { uiModules } from 'ui/modules'; import { createSavedSheetClass } from './_saved_sheet'; const module = uiModules.get('app/sheet'); -// Register this service with the saved object registry so it can be -// edited by the object editor. -savedObjectManagementRegistry.register({ - service: 'savedSheets', - title: 'sheets', -}); - const savedObjectsClient = npStart.core.savedObjects.client; const services = { savedObjectsClient, diff --git a/src/legacy/core_plugins/visualizations/public/embeddable/visualize_embeddable_factory.tsx b/src/legacy/core_plugins/visualizations/public/embeddable/visualize_embeddable_factory.tsx index 3f29f97afee48..e5836c1372068 100644 --- a/src/legacy/core_plugins/visualizations/public/embeddable/visualize_embeddable_factory.tsx +++ b/src/legacy/core_plugins/visualizations/public/embeddable/visualize_embeddable_factory.tsx @@ -18,17 +18,14 @@ */ import { i18n } from '@kbn/i18n'; - -import chrome from 'ui/chrome'; - -import { SavedObjectAttributes } from 'kibana/server'; +import { SavedObjectAttributes } from 'kibana/public'; import { EmbeddableFactory, ErrorEmbeddable, Container, EmbeddableOutput, } from '../../../../../plugins/embeddable/public'; -import { showNewVisModal } from '../../../kibana/public/visualize/np_ready/wizard/show_new_vis'; +import { showNewVisModal } from '../../../kibana/public/visualize'; import { SavedVisualizations } from '../../../kibana/public/visualize/np_ready/types'; import { DisabledLabEmbeddable } from './disabled_lab_embeddable'; import { getIndexPattern } from './get_index_pattern'; @@ -61,11 +58,7 @@ export class VisualizeEmbeddableFactory extends EmbeddableFactory< > { public readonly type = VISUALIZE_EMBEDDABLE_TYPE; - static async createVisualizeEmbeddableFactory(): Promise { - return new VisualizeEmbeddableFactory(); - } - - constructor() { + constructor(private getSavedVisualizationsLoader: () => SavedVisualizations) { super({ savedObjectMetaData: { name: i18n.translate('visualizations.savedObjectName', { defaultMessage: 'Visualization' }), @@ -111,8 +104,7 @@ export class VisualizeEmbeddableFactory extends EmbeddableFactory< input: Partial & { id: string }, parent?: Container ): Promise { - const $injector = await chrome.dangerouslyGetActiveInjector(); - const savedVisualizations = $injector.get('savedVisualizations'); + const savedVisualizations = this.getSavedVisualizationsLoader(); try { const visId = savedObject.id as string; @@ -151,13 +143,10 @@ export class VisualizeEmbeddableFactory extends EmbeddableFactory< input: Partial & { id: string }, parent?: Container ): Promise { - const $injector = await chrome.dangerouslyGetActiveInjector(); - const savedVisualizations = $injector.get('savedVisualizations'); + const savedVisualizations = this.getSavedVisualizationsLoader(); try { - const visId = savedObjectId; - - const savedObject = await savedVisualizations.get(visId); + const savedObject = await savedVisualizations.get(savedObjectId); return this.createFromObject(savedObject, input, parent); } catch (e) { console.error(e); // eslint-disable-line no-console diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/index.ts b/src/legacy/core_plugins/visualizations/public/np_ready/public/index.ts index 29ff812b95473..4dffcb8ce995e 100644 --- a/src/legacy/core_plugins/visualizations/public/np_ready/public/index.ts +++ b/src/legacy/core_plugins/visualizations/public/np_ready/public/index.ts @@ -45,6 +45,7 @@ export function plugin(initializerContext: PluginInitializerContext) { /** @public static code */ export { Vis, VisParams, VisState } from './vis'; export * from './filters'; +export { TypesService } from './types/types_service'; export { Status } from './legacy/update_status'; export { buildPipeline, buildVislibDimensions, SchemaConfig } from './legacy/build_pipeline'; @@ -54,3 +55,4 @@ export { updateOldState } from './legacy/vis_update_state'; export { calculateObjectHash } from './legacy/calculate_object_hash'; // @ts-ignore export { createFiltersFromEvent } from './filters/vis_filters'; +export { createSavedVisLoader } from '../../saved_visualizations/saved_visualizations'; diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/mocks.ts b/src/legacy/core_plugins/visualizations/public/np_ready/public/mocks.ts index 2fa85d86a794e..4c1783408708a 100644 --- a/src/legacy/core_plugins/visualizations/public/np_ready/public/mocks.ts +++ b/src/legacy/core_plugins/visualizations/public/np_ready/public/mocks.ts @@ -48,6 +48,7 @@ const createStartContract = (): VisualizationsStart => ({ all: jest.fn(), getAliases: jest.fn(), }, + getSavedVisualizationsLoader: jest.fn(), }); const createInstance = async () => { diff --git a/src/legacy/core_plugins/visualizations/public/np_ready/public/plugin.ts b/src/legacy/core_plugins/visualizations/public/np_ready/public/plugin.ts index cfd22f88167c5..01059044b98c2 100644 --- a/src/legacy/core_plugins/visualizations/public/np_ready/public/plugin.ts +++ b/src/legacy/core_plugins/visualizations/public/np_ready/public/plugin.ts @@ -38,6 +38,11 @@ import { visualization as visualizationFunction } from './expressions/visualizat import { visualization as visualizationRenderer } from './expressions/visualization_renderer'; import { DataPublicPluginStart } from '../../../../../../plugins/data/public'; import { UsageCollectionSetup } from '../../../../../../plugins/usage_collection/public'; +import { + createSavedVisLoader, + SavedObjectKibanaServicesWithVisualizations, +} from '../../saved_visualizations'; +import { SavedVisualizations } from '../../../../kibana/public/visualize/np_ready/types'; /** * Interface for this plugin's returned setup/start contracts. * @@ -47,9 +52,9 @@ export interface VisualizationsSetup { types: TypesSetup; } -// eslint-disable-next-line @typescript-eslint/no-empty-interface export interface VisualizationsStart { types: TypesStart; + getSavedVisualizationsLoader: () => SavedVisualizations; } export interface VisualizationsSetupDeps { @@ -79,6 +84,8 @@ export class VisualizationsPlugin VisualizationsStartDeps > { private readonly types: TypesService = new TypesService(); + private savedVisualizations?: SavedVisualizations; + private savedVisualizationDependencies?: SavedObjectKibanaServicesWithVisualizations; constructor(initializerContext: PluginInitializerContext) {} @@ -92,7 +99,7 @@ export class VisualizationsPlugin expressions.registerFunction(visualizationFunction); expressions.registerRenderer(visualizationRenderer); - const embeddableFactory = new VisualizeEmbeddableFactory(); + const embeddableFactory = new VisualizeEmbeddableFactory(this.getSavedVisualizationsLoader); embeddable.registerEmbeddableFactory(VISUALIZE_EMBEDDABLE_TYPE, embeddableFactory); return { @@ -110,12 +117,28 @@ export class VisualizationsPlugin setIndexPatterns(data.indexPatterns); setFilterManager(data.query.filterManager); + this.savedVisualizationDependencies = { + savedObjectsClient: core.savedObjects.client, + indexPatterns: data.indexPatterns, + chrome: core.chrome, + overlays: core.overlays, + visualizationTypes: types, + }; + return { types, + getSavedVisualizationsLoader: () => this.getSavedVisualizationsLoader(), }; } public stop() { this.types.stop(); } + + private getSavedVisualizationsLoader = () => { + if (!this.savedVisualizations) { + this.savedVisualizations = createSavedVisLoader(this.savedVisualizationDependencies!); + } + return this.savedVisualizations; + }; } diff --git a/src/legacy/core_plugins/kibana/public/visualize/saved_visualizations/_saved_vis.ts b/src/legacy/core_plugins/visualizations/public/saved_visualizations/_saved_vis.ts similarity index 92% rename from src/legacy/core_plugins/kibana/public/visualize/saved_visualizations/_saved_vis.ts rename to src/legacy/core_plugins/visualizations/public/saved_visualizations/_saved_vis.ts index a0a6f8ea1c8a2..b501c8b68484f 100644 --- a/src/legacy/core_plugins/kibana/public/visualize/saved_visualizations/_saved_vis.ts +++ b/src/legacy/core_plugins/visualizations/public/saved_visualizations/_saved_vis.ts @@ -28,13 +28,13 @@ import { Vis } from 'ui/vis'; import { SavedObject, SavedObjectKibanaServices } from 'ui/saved_objects/types'; import { createSavedObjectClass } from 'ui/saved_objects/saved_object'; -import { updateOldState } from '../../../../visualizations/public'; +import { updateOldState } from '../index'; import { extractReferences, injectReferences } from './saved_visualization_references'; -import { IIndexPattern } from '../../../../../../plugins/data/public'; -import { VisSavedObject } from '../legacy_imports'; +import { IIndexPattern } from '../../../../../plugins/data/public'; +import { VisSavedObject } from '../embeddable/visualize_embeddable'; -import { createSavedSearchesService } from '../../discover'; -import { VisualizeConstants } from '../np_ready/visualize_constants'; +import { createSavedSearchesLoader } from '../../../kibana/public/discover'; +import { VisualizeConstants } from '../../../kibana/public/visualize'; async function _afterEsResp(savedVis: VisSavedObject, services: any) { await _getLinkedSavedSearch(savedVis, services); @@ -56,7 +56,7 @@ async function _getLinkedSavedSearch(savedVis: VisSavedObject, services: any) { savedVis.savedSearch.destroy(); delete savedVis.savedSearch; } - const savedSearches = createSavedSearchesService(services); + const savedSearches = createSavedSearchesLoader(services); if (linkedSearch) { savedVis.savedSearch = await savedSearches.get(savedVis.savedSearchId!); diff --git a/src/legacy/core_plugins/kibana/public/visualize/saved_visualizations/find_list_items.js b/src/legacy/core_plugins/visualizations/public/saved_visualizations/find_list_items.js similarity index 100% rename from src/legacy/core_plugins/kibana/public/visualize/saved_visualizations/find_list_items.js rename to src/legacy/core_plugins/visualizations/public/saved_visualizations/find_list_items.js diff --git a/src/legacy/core_plugins/kibana/public/visualize/saved_visualizations/find_list_items.test.js b/src/legacy/core_plugins/visualizations/public/saved_visualizations/find_list_items.test.js similarity index 100% rename from src/legacy/core_plugins/kibana/public/visualize/saved_visualizations/find_list_items.test.js rename to src/legacy/core_plugins/visualizations/public/saved_visualizations/find_list_items.test.js diff --git a/src/legacy/core_plugins/kibana/public/visualize/saved_visualizations/index.ts b/src/legacy/core_plugins/visualizations/public/saved_visualizations/index.ts similarity index 95% rename from src/legacy/core_plugins/kibana/public/visualize/saved_visualizations/index.ts rename to src/legacy/core_plugins/visualizations/public/saved_visualizations/index.ts index 62bf106adc0d0..cba68feca81f7 100644 --- a/src/legacy/core_plugins/kibana/public/visualize/saved_visualizations/index.ts +++ b/src/legacy/core_plugins/visualizations/public/saved_visualizations/index.ts @@ -17,4 +17,4 @@ * under the License. */ -import './saved_visualizations'; +export * from './saved_visualizations'; diff --git a/src/legacy/core_plugins/kibana/public/visualize/saved_visualizations/saved_visualization_references.test.ts b/src/legacy/core_plugins/visualizations/public/saved_visualizations/saved_visualization_references.test.ts similarity index 98% rename from src/legacy/core_plugins/kibana/public/visualize/saved_visualizations/saved_visualization_references.test.ts rename to src/legacy/core_plugins/visualizations/public/saved_visualizations/saved_visualization_references.test.ts index 98f5458d5eecc..6549b317d1634 100644 --- a/src/legacy/core_plugins/kibana/public/visualize/saved_visualizations/saved_visualization_references.test.ts +++ b/src/legacy/core_plugins/visualizations/public/saved_visualizations/saved_visualization_references.test.ts @@ -18,7 +18,7 @@ */ import { extractReferences, injectReferences } from './saved_visualization_references'; -import { VisSavedObject } from '../../../../visualizations/public/embeddable/visualize_embeddable'; +import { VisSavedObject } from '../embeddable/visualize_embeddable'; describe('extractReferences', () => { test('extracts nothing if savedSearchId is empty', () => { diff --git a/src/legacy/core_plugins/kibana/public/visualize/saved_visualizations/saved_visualization_references.ts b/src/legacy/core_plugins/visualizations/public/saved_visualizations/saved_visualization_references.ts similarity index 96% rename from src/legacy/core_plugins/kibana/public/visualize/saved_visualizations/saved_visualization_references.ts rename to src/legacy/core_plugins/visualizations/public/saved_visualizations/saved_visualization_references.ts index 403e9c5a8172d..330f5e2dacd10 100644 --- a/src/legacy/core_plugins/kibana/public/visualize/saved_visualizations/saved_visualization_references.ts +++ b/src/legacy/core_plugins/visualizations/public/saved_visualizations/saved_visualization_references.ts @@ -16,8 +16,8 @@ * specific language governing permissions and limitations * under the License. */ -import { SavedObjectAttributes, SavedObjectReference } from 'kibana/server'; -import { VisSavedObject } from '../../../../visualizations/public/embeddable/visualize_embeddable'; +import { SavedObjectAttributes, SavedObjectReference } from 'kibana/public'; +import { VisSavedObject } from '../embeddable/visualize_embeddable'; export function extractReferences({ attributes, diff --git a/src/legacy/core_plugins/kibana/public/visualize/saved_visualizations/saved_visualizations.ts b/src/legacy/core_plugins/visualizations/public/saved_visualizations/saved_visualizations.ts similarity index 85% rename from src/legacy/core_plugins/kibana/public/visualize/saved_visualizations/saved_visualizations.ts rename to src/legacy/core_plugins/visualizations/public/saved_visualizations/saved_visualizations.ts index d51fae7428939..4b2a8e27c0208 100644 --- a/src/legacy/core_plugins/kibana/public/visualize/saved_visualizations/saved_visualizations.ts +++ b/src/legacy/core_plugins/visualizations/public/saved_visualizations/saved_visualizations.ts @@ -22,19 +22,19 @@ import { SavedObjectKibanaServices } from 'ui/saved_objects/types'; // @ts-ignore import { findListItems } from './find_list_items'; import { createSavedVisClass } from './_saved_vis'; -import { createVisualizeEditUrl } from '../np_ready/visualize_constants'; -import { VisualizationsStart } from '../../../../visualizations/public/np_ready/public'; +import { createVisualizeEditUrl } from '../../../kibana/public/visualize'; +import { TypesStart } from '../np_ready/public/types'; -interface SavedObjectKibanaServicesWithVisualizations extends SavedObjectKibanaServices { - visualizations: VisualizationsStart; +export interface SavedObjectKibanaServicesWithVisualizations extends SavedObjectKibanaServices { + visualizationTypes: TypesStart; } export function createSavedVisLoader(services: SavedObjectKibanaServicesWithVisualizations) { - const { savedObjectsClient, visualizations } = services; + const { savedObjectsClient, visualizationTypes } = services; class SavedObjectLoaderVisualize extends SavedObjectLoader { mapHitSource = (source: Record, id: string) => { - const visTypes = visualizations.types; + const visTypes = visualizationTypes; source.id = id; source.url = this.urlFor(id); @@ -72,7 +72,7 @@ export function createSavedVisLoader(services: SavedObjectKibanaServicesWithVisu size, mapSavedObjectApiHits: this.mapSavedObjectApiHits.bind(this), savedObjectsClient, - visTypes: visualizations.types.getAliases(), + visTypes: visualizationTypes.getAliases(), }); } } diff --git a/x-pack/legacy/plugins/transform/public/plugin.ts b/x-pack/legacy/plugins/transform/public/plugin.ts index 5d1c39add4ff6..3b02d07b8c150 100644 --- a/x-pack/legacy/plugins/transform/public/plugin.ts +++ b/x-pack/legacy/plugins/transform/public/plugin.ts @@ -4,11 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ import { unmountComponentAtNode } from 'react-dom'; - import { i18n } from '@kbn/i18n'; - -import { SavedSearchLoader } from '../../../../../src/legacy/core_plugins/kibana/public/discover/np_ready/types'; - import { PLUGIN } from '../common/constants'; import { CLIENT_BASE_PATH } from './app/constants'; import { renderReact } from './app/app'; @@ -19,6 +15,7 @@ import { documentationLinksService } from './app/services/documentation'; import { httpService } from './app/services/http'; import { textService } from './app/services/text'; import { uiMetricService } from './app/services/ui_metric'; +import { createSavedSearchesLoader } from '../../../../../src/legacy/core_plugins/kibana/public/discover/saved_searches'; const REACT_ROOT_ID = 'transformReactRoot'; const KBN_MANAGEMENT_SECTION = 'elasticsearch/transform'; @@ -36,12 +33,13 @@ export class Plugin { docTitle, uiSettings, savedObjects, + overlays, } = core; const { management, savedSearches: coreSavedSearches, uiMetric } = plugins; // AppCore/AppPlugins to be passed on as React context const AppDependencies = { - core: { chrome, http, i18n: core.i18n, uiSettings, savedObjects }, + core: { chrome, http, i18n: core.i18n, uiSettings, savedObjects, overlays }, plugins: { management: { sections: management.sections }, savedSearches: coreSavedSearches, @@ -77,12 +75,13 @@ export class Plugin { routing.registerAngularRoute(`${CLIENT_BASE_PATH}/:section?/:subsection?/:view?/:id?`, { template, controllerAs: 'transformController', - controller: ( - $scope: any, - $route: any, - $http: ng.IHttpService, - savedSearches: SavedSearchLoader - ) => { + controller: ($scope: any, $route: any, $http: ng.IHttpService) => { + const savedSearches = createSavedSearchesLoader({ + savedObjectsClient: core.savedObjects.client, + indexPatterns: plugins.data.indexPatterns, + chrome: core.chrome, + overlays: core.overlays, + }); // NOTE: We depend upon Angular's $http service because it's decorated with interceptors, // e.g. to check license status per request. legacyHttp.setClient($http); diff --git a/x-pack/legacy/plugins/transform/public/shim.ts b/x-pack/legacy/plugins/transform/public/shim.ts index d739dd2edddcc..758cc90210579 100644 --- a/x-pack/legacy/plugins/transform/public/shim.ts +++ b/x-pack/legacy/plugins/transform/public/shim.ts @@ -9,16 +9,21 @@ import { npStart } from 'ui/new_platform'; import { management, MANAGEMENT_BREADCRUMB } from 'ui/management'; import routes from 'ui/routes'; import { docTitle } from 'ui/doc_title/doc_title'; +import { CoreStart } from 'kibana/public'; // @ts-ignore: allow traversal to fail on x-pack build import { createUiStatsReporter } from '../../../../../src/legacy/core_plugins/ui_metric/public'; import { SavedSearchLoader } from '../../../../../src/legacy/core_plugins/kibana/public/discover/np_ready/types'; +import { DataPublicPluginStart } from '../../../../../src/plugins/data/public'; 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; +export type AppCore = Pick< + CoreStart, + 'chrome' | 'http' | 'i18n' | 'savedObjects' | 'uiSettings' | 'overlays' +>; export interface AppPlugins { management: { @@ -64,6 +69,7 @@ export interface Plugins extends AppPlugins { uiMetric: { createUiStatsReporter: typeof createUiStatsReporter; }; + data: DataPublicPluginStart; } export function createPublicShim(): { core: Core; plugins: Plugins } { @@ -101,6 +107,7 @@ export function createPublicShim(): { core: Core; plugins: Plugins } { }, }, plugins: { + data: npStart.plugins.data, management: { sections: management, constants: {