diff --git a/docs/setup/settings.asciidoc b/docs/setup/settings.asciidoc index 738f9df6df86..3a3a5fe8195e 100644 --- a/docs/setup/settings.asciidoc +++ b/docs/setup/settings.asciidoc @@ -118,6 +118,9 @@ password that the Kibana server uses to perform maintenance on the Kibana index at startup. Your Kibana users still need to authenticate with Elasticsearch, which is proxied through the Kibana server. +`interpreter.enableInVisualize`:: *Default: true* Enables use of interpreter in +Visualize. + `kibana.defaultAppId:`:: *Default: "discover"* The default application to load. `kibana.index:`:: *Default: ".kibana"* Kibana uses an index in Elasticsearch to diff --git a/src/legacy/core_plugins/interpreter/index.ts b/src/legacy/core_plugins/interpreter/index.ts index 323c7578aa0f..bd637295c91c 100644 --- a/src/legacy/core_plugins/interpreter/index.ts +++ b/src/legacy/core_plugins/interpreter/index.ts @@ -28,7 +28,16 @@ export default function InterpreterPlugin(kibana: any) { require: ['kibana', 'elasticsearch'], publicDir: resolve(__dirname, 'public'), uiExports: { - injectDefaultVars: server => ({ serverBasePath: server.config().get('server.basePath') }), + injectDefaultVars: server => ({ + serverBasePath: server.config().get('server.basePath'), + interpreterConfig: server.config().get('interpreter'), + }), + }, + config: (Joi: any) => { + return Joi.object({ + enabled: Joi.boolean().default(true), + enableInVisualize: Joi.boolean().default(true), + }).default(); }, init, }; diff --git a/src/legacy/core_plugins/tests_bundle/tests_entry_template.js b/src/legacy/core_plugins/tests_bundle/tests_entry_template.js index bed96987ac2b..49e068a78d2b 100644 --- a/src/legacy/core_plugins/tests_bundle/tests_entry_template.js +++ b/src/legacy/core_plugins/tests_bundle/tests_entry_template.js @@ -83,6 +83,9 @@ new CoreSystem({ enabled: true, enableExternalUrls: true }, + interpreterConfig: { + enableInVisualize: true + } }, }, rootDomElement, diff --git a/src/legacy/plugin_discovery/plugin_spec/plugin_spec_options.d.ts b/src/legacy/plugin_discovery/plugin_spec/plugin_spec_options.d.ts index 756f78a90678..66562ba686a0 100644 --- a/src/legacy/plugin_discovery/plugin_spec/plugin_spec_options.d.ts +++ b/src/legacy/plugin_discovery/plugin_spec/plugin_spec_options.d.ts @@ -29,4 +29,5 @@ export interface PluginSpecOptions { publicDir: string; uiExports?: UiExports; init: InitPluginFunction; + config: any; } diff --git a/src/legacy/ui/public/visualize/loader/__tests__/visualize_loader.js b/src/legacy/ui/public/visualize/loader/__tests__/visualize_loader.js index 67daae80ea48..f48e2014385b 100644 --- a/src/legacy/ui/public/visualize/loader/__tests__/visualize_loader.js +++ b/src/legacy/ui/public/visualize/loader/__tests__/visualize_loader.js @@ -41,9 +41,7 @@ import { RequestAdapter } from '../../../inspector/adapters/request'; describe('visualize loader', () => { - const DataLoader = EmbeddedVisualizeHandler.__ENABLE_PIPELINE_DATA_LOADER__ - ? PipelineDataLoader - : VisualizeDataLoader; + let DataLoader; let searchSource; let vis; let $rootScope; @@ -76,12 +74,12 @@ describe('visualize loader', () => { } beforeEach(ngMock.module('kibana', 'kibana/directive')); - beforeEach(ngMock.inject((_$rootScope_, savedVisualizations, Private) => { + beforeEach(ngMock.inject((_$rootScope_, savedVisualizations, interpreterConfig, Private) => { $rootScope = _$rootScope_; searchSource = Private(FixturesStubbedSearchSourceProvider); const indexPattern = Private(FixturesStubbedLogstashIndexPatternProvider); - + DataLoader = interpreterConfig.enableInVisualize ? PipelineDataLoader : VisualizeDataLoader; // Create a new Vis object const Vis = Private(VisProvider); vis = new Vis(indexPattern, { diff --git a/src/legacy/ui/public/visualize/loader/embedded_visualize_handler.ts b/src/legacy/ui/public/visualize/loader/embedded_visualize_handler.ts index 5d1ae2611742..9b346860c632 100644 --- a/src/legacy/ui/public/visualize/loader/embedded_visualize_handler.ts +++ b/src/legacy/ui/public/visualize/loader/embedded_visualize_handler.ts @@ -53,6 +53,7 @@ interface EmbeddedVisualizeHandlerParams extends VisualizeLoaderParams { Private: IPrivate; queryFilter: any; autoFetch?: boolean; + pipelineDataLoader?: boolean; } const RENDER_COMPLETE_EVENT = 'render_complete'; @@ -71,13 +72,13 @@ export class EmbeddedVisualizeHandler { * This should not be used by any plugin. * @ignore */ - public static readonly __ENABLE_PIPELINE_DATA_LOADER__: boolean = false; public readonly data$: Rx.Observable; public readonly inspectorAdapters: Adapters = {}; private vis: Vis; private handlers: any; private loaded: boolean = false; private destroyed: boolean = false; + private pipelineDataLoader: boolean = false; private listeners = new EventEmitter(); private firstRenderComplete: Promise; @@ -117,6 +118,7 @@ export class EmbeddedVisualizeHandler { filters, query, autoFetch = true, + pipelineDataLoader = false, Private, } = params; @@ -131,6 +133,8 @@ export class EmbeddedVisualizeHandler { forceFetch: false, }; + this.pipelineDataLoader = pipelineDataLoader; + // Listen to the first RENDER_COMPLETE_EVENT to resolve this promise this.firstRenderComplete = new Promise(resolve => { this.listeners.once(RENDER_COMPLETE_EVENT, resolve); @@ -171,7 +175,7 @@ export class EmbeddedVisualizeHandler { }); }; - this.dataLoader = EmbeddedVisualizeHandler.__ENABLE_PIPELINE_DATA_LOADER__ + this.dataLoader = pipelineDataLoader ? new PipelineDataLoader(vis) : new VisualizeDataLoader(vis, Private); this.renderCompleteHelper = new RenderCompleteHelper(element); @@ -481,7 +485,7 @@ export class EmbeddedVisualizeHandler { let renderer: any = null; let args: any[] = []; - if (EmbeddedVisualizeHandler.__ENABLE_PIPELINE_DATA_LOADER__) { + if (this.pipelineDataLoader) { renderer = registries.renderers.get(get(response || {}, 'as', 'visualization')); args = [this.element, get(response, 'value', { visType: this.vis.type.name }), this.handlers]; } else { diff --git a/src/legacy/ui/public/visualize/loader/visualize_loader.ts b/src/legacy/ui/public/visualize/loader/visualize_loader.ts index ee08ae3cd85a..24f03a89ae66 100644 --- a/src/legacy/ui/public/visualize/loader/visualize_loader.ts +++ b/src/legacy/ui/public/visualize/loader/visualize_loader.ts @@ -30,7 +30,11 @@ import { EmbeddedVisualizeHandler } from './embedded_visualize_handler'; import { VisSavedObject, VisualizeLoaderParams } from './types'; export class VisualizeLoader { - constructor(private readonly savedVisualizations: any, private readonly Private: IPrivate) {} + constructor( + private readonly savedVisualizations: any, + private readonly pipelineDataLoader: boolean, + private readonly Private: IPrivate + ) {} /** * Renders a saved visualization specified by its id into a DOM element. @@ -135,14 +139,19 @@ export class VisualizeLoader { queryFilter: this.Private(FilterBarQueryFilterProvider), // lets add Private to the params, we'll need to pass it to visualize later Private: this.Private, + pipelineDataLoader: this.pipelineDataLoader, }; return new EmbeddedVisualizeHandler(element, savedObj, handlerParams); } } -function VisualizeLoaderProvider(savedVisualizations: any, Private: IPrivate) { - return new VisualizeLoader(savedVisualizations, Private); +function VisualizeLoaderProvider( + savedVisualizations: any, + interpreterConfig: any, + Private: IPrivate +) { + return new VisualizeLoader(savedVisualizations, interpreterConfig.enableInVisualize, Private); } /**