From 07ee788cb05a948c2472e982d4ee884cef0d5995 Mon Sep 17 00:00:00 2001 From: Alexey Antonov Date: Thu, 18 Jul 2019 14:27:31 +0300 Subject: [PATCH] Use embeddable v2 - fix regression of #39126 (#41221) * Use embeddable v2 - fix regression of #39126 * fix PR comment --- .../public/visualize/embeddable/index.ts | 1 - .../visualize_embeddable_factory.tsx | 22 ++++++----- src/legacy/ui/public/registry/_registry.js | 38 ++++++++++++++----- 3 files changed, 41 insertions(+), 20 deletions(-) diff --git a/src/legacy/core_plugins/kibana/public/visualize/embeddable/index.ts b/src/legacy/core_plugins/kibana/public/visualize/embeddable/index.ts index a1cd31eebef205..d7c0205891ec57 100644 --- a/src/legacy/core_plugins/kibana/public/visualize/embeddable/index.ts +++ b/src/legacy/core_plugins/kibana/public/visualize/embeddable/index.ts @@ -18,5 +18,4 @@ */ export { DisabledLabEmbeddable } from './disabled_lab_embeddable'; export { VisualizeEmbeddable, VisualizeInput } from './visualize_embeddable'; -export { VisualizeEmbeddableFactory } from './visualize_embeddable_factory'; export { VISUALIZE_EMBEDDABLE_TYPE } from './constants'; diff --git a/src/legacy/core_plugins/kibana/public/visualize/embeddable/visualize_embeddable_factory.tsx b/src/legacy/core_plugins/kibana/public/visualize/embeddable/visualize_embeddable_factory.tsx index 809f5ae84c4825..67054ba46e79c3 100644 --- a/src/legacy/core_plugins/kibana/public/visualize/embeddable/visualize_embeddable_factory.tsx +++ b/src/legacy/core_plugins/kibana/public/visualize/embeddable/visualize_embeddable_factory.tsx @@ -78,10 +78,17 @@ export class VisualizeEmbeddableFactory extends EmbeddableFactory< VisualizeEmbeddable | DisabledLabEmbeddable, VisualizationAttributes > { - private visTypes?: VisTypesRegistry; public readonly type = VISUALIZE_EMBEDDABLE_TYPE; - constructor() { + static async createVisualizeEmbeddableFactory(): Promise { + const $injector = await chrome.dangerouslyGetActiveInjector(); + const Private = $injector.get('Private'); + const visTypes = Private(VisTypesRegistryProvider); + + return new VisualizeEmbeddableFactory(visTypes); + } + + constructor(private visTypes: VisTypesRegistry) { super({ savedObjectMetaData: { name: i18n.translate('kbn.visualize.savedObjectName', { defaultMessage: 'Visualization' }), @@ -117,7 +124,6 @@ export class VisualizeEmbeddableFactory extends EmbeddableFactory< }, }, }); - this.initializeVisTypes(); } public isEditable() { @@ -130,12 +136,6 @@ export class VisualizeEmbeddableFactory extends EmbeddableFactory< }); } - public async initializeVisTypes() { - const $injector = await chrome.dangerouslyGetActiveInjector(); - const Private = $injector.get('Private'); - this.visTypes = Private(VisTypesRegistryProvider); - } - public async createFromSavedObject( savedObjectId: string, input: Partial & { id: string }, @@ -188,4 +188,6 @@ export class VisualizeEmbeddableFactory extends EmbeddableFactory< } } -embeddableFactories.set(VISUALIZE_EMBEDDABLE_TYPE, new VisualizeEmbeddableFactory()); +VisualizeEmbeddableFactory.createVisualizeEmbeddableFactory().then(embeddableFactory => { + embeddableFactories.set(VISUALIZE_EMBEDDABLE_TYPE, embeddableFactory); +}); diff --git a/src/legacy/ui/public/registry/_registry.js b/src/legacy/ui/public/registry/_registry.js index f7124fd1b71459..40b78e7e20c582 100644 --- a/src/legacy/ui/public/registry/_registry.js +++ b/src/legacy/ui/public/registry/_registry.js @@ -19,6 +19,7 @@ import _ from 'lodash'; import { IndexedArray } from '../indexed_array'; + const notPropsOptNames = IndexedArray.OPT_NAMES.concat('constructor', 'invokeProviders'); /** @@ -78,6 +79,10 @@ export function uiRegistry(spec) { const props = _.omit(spec, notPropsOptNames); const providers = []; + let isInstantiated = false; + let getInvokedProviders; + let modules; + /** * This is the Private module that will be instantiated by * @@ -87,17 +92,21 @@ export function uiRegistry(spec) { * defines how things will be indexed. */ const registry = function (Private, $injector) { - // call the registered providers to get their values - iaOpts.initialSet = invokeProviders - ? $injector.invoke(invokeProviders, undefined, { providers }) - : providers.map(Private); + getInvokedProviders = function (newProviders) { + let set = invokeProviders + ? $injector.invoke(invokeProviders, undefined, { providers: newProviders }) + : newProviders.map(Private); - if (filter && _.isFunction(filter)) { - iaOpts.initialSet = iaOpts.initialSet.filter(item => filter(item)); - } + if (filter && _.isFunction(filter)) { + set = set.filter(item => filter(item)); + } + + return set; + }; + + iaOpts.initialSet = getInvokedProviders(providers); - // index all of the modules - let modules = new IndexedArray(iaOpts); + modules = new IndexedArray(iaOpts); // mixin other props _.assign(modules, props); @@ -107,6 +116,8 @@ export function uiRegistry(spec) { modules = $injector.invoke(constructor, modules) || modules; } + isInstantiated = true; + return modules; }; @@ -114,6 +125,15 @@ export function uiRegistry(spec) { registry.register = function (privateModule) { providers.push(privateModule); + + if (isInstantiated) { + const [provider] = getInvokedProviders([privateModule]); + + if (provider) { + modules.push(provider); + } + } + return registry; };