[Dashboard] Add visualization by value to dashboard (#69898) (#70322)

* Plugging in DashboardStart dependency

* Create embeddable by reference and navigate back to dashboard

* Trying to feature flag the new flow

* Feature flagging new visualize flow

* Removing unnecessary console statement

* Fixing typescript errors

* Adding a functional test for new functionality

* Adding a functional test for new functionality

* Fixing test name

* Changing test name

* Moving functional test to a separate folder

* Trying to fix the config file

* Adding an index file

* Remove falsly included file

* Adding aggs and params to vis input

* Serializing vis before passing it as an input

* Incorporating new state transfer logic

* Remove dashboardStart as a dependency

* Trying to get the test to run

* Remove unused import

* Readding spaces

* Fixing type errors

* Incorporating new changes
# Conflicts:
#	scripts/functional_tests.js
#	tasks/function_test_groups.js
This commit is contained in:
Maja Grubic 2020-06-30 17:00:38 +01:00 committed by GitHub
parent 9d0ee6a42e
commit 95da850ab6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
15 changed files with 870 additions and 16 deletions

View file

@ -25,4 +25,5 @@ require('@kbn/test').runTestsCli([
require.resolve('../test/interpreter_functional/config.ts'),
require.resolve('../test/ui_capabilities/newsfeed_err/config.ts'),
require.resolve('../test/examples/config.js'),
require.resolve('../test/new_visualize_flow/config.js'),
]);

View file

@ -58,7 +58,6 @@ import {
isErrorEmbeddable,
openAddPanelFlyout,
ViewMode,
SavedObjectEmbeddableInput,
ContainerOutput,
EmbeddableInput,
} from '../../../embeddable/public';
@ -432,14 +431,16 @@ export class DashboardAppController {
.getIncomingEmbeddablePackage();
if (incomingState) {
if ('id' in incomingState) {
container.addNewEmbeddable<SavedObjectEmbeddableInput>(incomingState.type, {
container.addNewEmbeddable<EmbeddableInput>(incomingState.type, {
savedObjectId: incomingState.id,
});
} else if ('input' in incomingState) {
container.addNewEmbeddable<EmbeddableInput>(
incomingState.type,
incomingState.input
);
const input = incomingState.input;
delete input.id;
const explicitInput = {
savedVis: input,
};
container.addNewEmbeddable<EmbeddableInput>(incomingState.type, explicitInput);
}
}
}

View file

@ -30,7 +30,7 @@ import {
import { DisabledLabEmbeddable } from './disabled_lab_embeddable';
import { VisualizeEmbeddable, VisualizeInput, VisualizeOutput } from './visualize_embeddable';
import { VISUALIZE_EMBEDDABLE_TYPE } from './constants';
import { Vis } from '../vis';
import { SerializedVis, Vis } from '../vis';
import {
getCapabilities,
getTypes,
@ -124,13 +124,20 @@ export class VisualizeEmbeddableFactory
}
}
public async create() {
public async create(input: VisualizeInput & { savedVis?: SerializedVis }, parent?: IContainer) {
// TODO: This is a bit of a hack to preserve the original functionality. Ideally we will clean this up
// to allow for in place creation of visualizations without having to navigate away to a new URL.
showNewVisModal({
originatingApp: await this.getCurrentAppId(),
outsideVisualizeApp: true,
});
return undefined;
if (input.savedVis) {
const visState = input.savedVis;
const vis = new Vis(visState.type, visState);
await vis.setState(visState);
return createVisEmbeddableFromObject(this.deps)(vis, input, parent);
} else {
showNewVisModal({
originatingApp: await this.getCurrentAppId(),
outsideVisualizeApp: true,
});
return undefined;
}
}
}

View file

@ -0,0 +1,26 @@
/*
* 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 { schema, TypeOf } from '@kbn/config-schema';
export const configSchema = schema.object({
showNewVisualizeFlow: schema.boolean({ defaultValue: false }),
});
export type ConfigSchema = TypeOf<typeof configSchema>;

View file

@ -44,6 +44,7 @@ import { SharePluginStart } from 'src/plugins/share/public';
import { SavedObjectsStart, SavedObject } from 'src/plugins/saved_objects/public';
import { EmbeddableStart } from 'src/plugins/embeddable/public';
import { KibanaLegacyStart } from 'src/plugins/kibana_legacy/public';
import { ConfigSchema } from '../../config';
export type PureVisState = SavedVisState;
@ -110,6 +111,7 @@ export interface VisualizeServices extends CoreStart {
createVisEmbeddableFromObject: VisualizationsStart['__LEGACY']['createVisEmbeddableFromObject'];
restorePreviousUrl: () => void;
scopedHistory: ScopedHistory;
featureFlagConfig: ConfigSchema;
}
export interface SavedVisInstance {

View file

@ -21,6 +21,7 @@ import React from 'react';
import { i18n } from '@kbn/i18n';
import { TopNavMenuData } from 'src/plugins/navigation/public';
import uuid from 'uuid';
import { VISUALIZE_EMBEDDABLE_TYPE } from '../../../../visualizations/public';
import {
showSaveModal,
@ -33,7 +34,6 @@ import { unhashUrl } from '../../../../kibana_utils/public';
import { SavedVisInstance, VisualizeServices, VisualizeAppStateContainer } from '../types';
import { VisualizeConstants } from '../visualize_constants';
import { getEditBreadcrumbs } from './breadcrumbs';
interface TopNavConfigParams {
hasUnsavedChanges: boolean;
setHasUnsavedChanges: (value: boolean) => void;
@ -66,6 +66,7 @@ export const getTopNavConfig = (
toastNotifications,
visualizeCapabilities,
i18n: { Context: I18nContext },
featureFlagConfig,
}: VisualizeServices
) => {
/**
@ -234,6 +235,19 @@ export const getTopNavConfig = (
return response;
};
const createVisReference = () => {
if (!originatingApp) {
return;
}
const input = {
...vis.serialize(),
id: uuid.v4(),
};
embeddable.getStateTransfer().navigateToWithEmbeddablePackage(originatingApp, {
state: { input, type: VISUALIZE_EMBEDDABLE_TYPE },
});
};
const saveModal = (
<SavedObjectSaveModalOrigin
documentInfo={savedVis}
@ -243,7 +257,11 @@ export const getTopNavConfig = (
originatingApp={originatingApp}
/>
);
showSaveModal(saveModal, I18nContext);
if (originatingApp === 'dashboards' && featureFlagConfig.showNewVisualizeFlow) {
createVisReference();
} else {
showSaveModal(saveModal, I18nContext);
}
},
},
]

View file

@ -60,6 +60,10 @@ export interface VisualizePluginSetupDependencies {
data: DataPublicPluginSetup;
}
export interface FeatureFlagConfig {
showNewVisualizeFlow: boolean;
}
export class VisualizePlugin
implements
Plugin<void, void, VisualizePluginSetupDependencies, VisualizePluginStartDependencies> {
@ -165,6 +169,7 @@ export class VisualizePlugin
savedObjectsPublic: pluginsStart.savedObjects,
scopedHistory: params.history,
restorePreviousUrl,
featureFlagConfig: this.initializerContext.config.get<FeatureFlagConfig>(),
};
params.element.classList.add('visAppWrapper');

View file

@ -17,8 +17,17 @@
* under the License.
*/
import { PluginInitializerContext } from 'kibana/server';
import { PluginInitializerContext, PluginConfigDescriptor } from 'kibana/server';
import { VisualizeServerPlugin } from './plugin';
import { ConfigSchema, configSchema } from '../config';
export const config: PluginConfigDescriptor<ConfigSchema> = {
exposeToBrowser: {
showNewVisualizeFlow: true,
},
schema: configSchema,
};
export const plugin = (initContext: PluginInitializerContext) =>
new VisualizeServerPlugin(initContext);

View file

@ -45,6 +45,8 @@ export function getFunctionalTestGroupRunConfigs({ kibanaInstallDir } = {}) {
'test/functional/config.js',
'--config',
'test/ui_capabilities/newsfeed_err/config.ts',
'--config',
'test/new_visualize_flow/config.js',
// '--config', 'test/functional/config.firefox.js',
'--bail',
'--debug',

View file

@ -139,5 +139,31 @@ export function DashboardVisualizationProvider({ getService, getPageObjects }: F
redirectToOrigin: true,
});
}
async createAndEmbedMetric(name: string) {
log.debug(`createAndEmbedMetric(${name})`);
const inViewMode = await PageObjects.dashboard.getIsInViewMode();
if (inViewMode) {
await PageObjects.dashboard.switchToEditMode();
}
await this.ensureNewVisualizationDialogIsShowing();
await PageObjects.visualize.clickMetric();
await find.clickByCssSelector('li.euiListGroupItem:nth-of-type(2)');
await testSubjects.exists('visualizeSaveButton');
await testSubjects.click('visualizeSaveButton');
}
async createAndEmbedMarkdown({ name, markdown }: { name: string; markdown: string }) {
log.debug(`createAndEmbedMarkdown(${markdown})`);
const inViewMode = await PageObjects.dashboard.getIsInViewMode();
if (inViewMode) {
await PageObjects.dashboard.switchToEditMode();
}
await this.ensureNewVisualizationDialogIsShowing();
await PageObjects.visualize.clickMarkdownWidget();
await PageObjects.visEditor.setMarkdownTxt(markdown);
await PageObjects.visEditor.clickGo();
await testSubjects.click('visualizeSaveButton');
}
})();
}

View file

@ -0,0 +1,157 @@
/*
* 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 { pageObjects } from '../functional/page_objects';
import { services } from '../functional/services';
export default async function ({ readConfigFile }) {
const commonConfig = await readConfigFile(require.resolve('../functional/config.js'));
return {
testFiles: [require.resolve('./dashboard_embedding')],
pageObjects,
services,
servers: commonConfig.get('servers'),
esTestCluster: commonConfig.get('esTestCluster'),
kbnTestServer: {
...commonConfig.get('kbnTestServer'),
serverArgs: [
...commonConfig.get('kbnTestServer.serverArgs'),
'--oss',
'--telemetry.optIn=false',
'--visualize.showNewVisualizeFlow=true',
],
},
uiSettings: {
defaults: {
'accessibility:disableAnimations': true,
'dateFormat:tz': 'UTC',
},
},
apps: {
kibana: {
pathname: '/app/kibana',
},
status_page: {
pathname: '/status',
},
discover: {
pathname: '/app/discover',
hash: '/',
},
context: {
pathname: '/app/discover',
hash: '/context',
},
visualize: {
pathname: '/app/visualize',
hash: '/',
},
dashboard: {
pathname: '/app/dashboards',
hash: '/list',
},
management: {
pathname: '/app/management',
},
console: {
pathname: '/app/dev_tools',
hash: '/console',
},
home: {
pathname: '/app/home',
hash: '/',
},
},
junit: {
reportName: 'Chrome UI Functional Tests',
},
browser: {
type: 'chrome',
},
security: {
roles: {
test_logstash_reader: {
elasticsearch: {
cluster: [],
indices: [
{
names: ['logstash*'],
privileges: ['read', 'view_index_metadata'],
field_security: { grant: ['*'], except: [] },
},
],
run_as: [],
},
kibana: [],
},
//for sample data - can remove but not add sample data
kibana_sample_admin: {
elasticsearch: {
cluster: [],
indices: [
{
names: ['kibana_sample*'],
privileges: ['read', 'view_index_metadata', 'manage', 'create_index', 'index'],
field_security: { grant: ['*'], except: [] },
},
],
run_as: [],
},
kibana: [],
},
long_window_logstash: {
elasticsearch: {
cluster: [],
indices: [
{
names: ['long-window-logstash-*'],
privileges: ['read', 'view_index_metadata'],
field_security: { grant: ['*'], except: [] },
},
],
run_as: [],
},
kibana: [],
},
animals: {
elasticsearch: {
cluster: [],
indices: [
{
names: ['animals-*'],
privileges: ['read', 'view_index_metadata'],
field_security: { grant: ['*'], except: [] },
},
],
run_as: [],
},
kibana: [],
},
},
defaultRoles: ['kibana_admin'],
},
};
}

View file

@ -0,0 +1,83 @@
/*
* 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 expect from '@kbn/expect';
/**
* This tests both that one of each visualization can be added to a dashboard (as opposed to opening an existing
* dashboard with the visualizations already on it), as well as conducts a rough type of snapshot testing by checking
* for various ui components. The downside is these tests are a bit fragile to css changes (though not as fragile as
* actual screenshot snapshot regression testing), and can be difficult to diagnose failures (which visualization
* broke?). The upside is that this offers very good coverage with a minimal time investment.
*/
export default function ({ getService, getPageObjects }) {
const esArchiver = getService('esArchiver');
const kibanaServer = getService('kibanaServer');
const dashboardExpect = getService('dashboardExpect');
const testSubjects = getService('testSubjects');
const dashboardVisualizations = getService('dashboardVisualizations');
const PageObjects = getPageObjects([
'common',
'dashboard',
'header',
'visualize',
'discover',
'timePicker',
]);
describe('Dashboard Embedding', function describeIndexTests() {
before(async () => {
await esArchiver.load('kibana');
await kibanaServer.uiSettings.replace({
defaultIndex: '0bf35f60-3dc9-11e8-8660-4d65aa086b3c',
});
await PageObjects.common.navigateToApp('dashboard');
await PageObjects.dashboard.preserveCrossAppState();
await PageObjects.dashboard.clickNewDashboard();
});
it('adding a metric visualization', async function () {
const originalPanelCount = await PageObjects.dashboard.getPanelCount();
expect(originalPanelCount).to.eql(0);
await testSubjects.exists('addVisualizationButton');
await testSubjects.click('addVisualizationButton');
await dashboardVisualizations.createAndEmbedMetric('Embedding Vis Test');
await PageObjects.dashboard.waitForRenderComplete();
await dashboardExpect.metricValuesExist(['0']);
const panelCount = await PageObjects.dashboard.getPanelCount();
expect(panelCount).to.eql(1);
});
it('adding a markdown', async function () {
const originalPanelCount = await PageObjects.dashboard.getPanelCount();
expect(originalPanelCount).to.eql(1);
await testSubjects.exists('dashboardAddNewPanelButton');
await testSubjects.click('dashboardAddNewPanelButton');
await dashboardVisualizations.createAndEmbedMarkdown({
name: 'Embedding Markdown Test',
markdown: 'Nice to meet you, markdown is my name',
});
await PageObjects.dashboard.waitForRenderComplete();
await dashboardExpect.markdownWithValuesExists(['Nice to meet you, markdown is my name']);
const panelCount = await PageObjects.dashboard.getPanelCount();
expect(panelCount).to.eql(2);
});
});
}

View file

@ -0,0 +1,490 @@
{
"type": "index",
"value": {
"aliases": {
".kibana": {
}
},
"index": ".kibana_1",
"mappings": {
"_meta": {
"migrationMappingPropertyHashes": {
"application_usage_totals": "c897e4310c5f24b07caaff3db53ae2c1",
"application_usage_transactional": "965839e75f809fefe04f92dc4d99722a",
"config": "ae24d22d5986d04124cc6568f771066f",
"dashboard": "d00f614b29a80360e1190193fd333bab",
"index-pattern": "66eccb05066c5a89924f48a9e9736499",
"kql-telemetry": "d12a98a6f19a2d273696597547e064ee",
"migrationVersion": "4a1746014a75ade3a714e1db5763276f",
"namespace": "2f4316de49999235636386fe51dc06c1",
"namespaces": "2f4316de49999235636386fe51dc06c1",
"query": "11aaeb7f5f7fa5bb43f25e18ce26e7d9",
"references": "7997cf5a56cc02bdc9c93361bde732b0",
"sample-data-telemetry": "7d3cfeb915303c9641c59681967ffeb4",
"search": "181661168bbadd1eff5902361e2a0d5c",
"telemetry": "36a616f7026dfa617d6655df850fe16d",
"timelion-sheet": "9a2a2748877c7a7b582fef201ab1d4cf",
"tsvb-validation-telemetry": "3a37ef6c8700ae6fc97d5c7da00e9215",
"type": "2f4316de49999235636386fe51dc06c1",
"ui-metric": "0d409297dc5ebe1e3a1da691c6ee32e3",
"updated_at": "00da57df13e94e9d98437d13ace4bfe0",
"url": "b675c3be8d76ecf029294d51dc7ec65d",
"visualization": "52d7a13ad68a150c4525b292d23e12cc"
}
},
"dynamic": "strict",
"properties": {
"application_usage_totals": {
"properties": {
"appId": {
"type": "keyword"
},
"minutesOnScreen": {
"type": "float"
},
"numberOfClicks": {
"type": "long"
}
}
},
"application_usage_transactional": {
"properties": {
"appId": {
"type": "keyword"
},
"minutesOnScreen": {
"type": "float"
},
"numberOfClicks": {
"type": "long"
},
"timestamp": {
"type": "date"
}
}
},
"config": {
"dynamic": "true",
"properties": {
"accessibility:disableAnimations": {
"type": "boolean"
},
"buildNum": {
"type": "keyword"
},
"dateFormat:tz": {
"fields": {
"keyword": {
"ignore_above": 256,
"type": "keyword"
}
},
"type": "text"
},
"defaultIndex": {
"fields": {
"keyword": {
"ignore_above": 256,
"type": "keyword"
}
},
"type": "text"
},
"notifications:lifetime:banner": {
"type": "long"
},
"notifications:lifetime:error": {
"type": "long"
},
"notifications:lifetime:info": {
"type": "long"
},
"notifications:lifetime:warning": {
"type": "long"
},
"xPackMonitoring:showBanner": {
"type": "boolean"
}
}
},
"dashboard": {
"properties": {
"description": {
"type": "text"
},
"hits": {
"type": "integer"
},
"kibanaSavedObjectMeta": {
"properties": {
"searchSourceJSON": {
"type": "text"
}
}
},
"optionsJSON": {
"type": "text"
},
"panelsJSON": {
"type": "text"
},
"refreshInterval": {
"properties": {
"display": {
"type": "keyword"
},
"pause": {
"type": "boolean"
},
"section": {
"type": "integer"
},
"value": {
"type": "integer"
}
}
},
"timeFrom": {
"type": "keyword"
},
"timeRestore": {
"type": "boolean"
},
"timeTo": {
"type": "keyword"
},
"title": {
"type": "text"
},
"version": {
"type": "integer"
}
}
},
"index-pattern": {
"properties": {
"fieldFormatMap": {
"type": "text"
},
"fields": {
"type": "text"
},
"intervalName": {
"type": "keyword"
},
"notExpandable": {
"type": "boolean"
},
"sourceFilters": {
"type": "text"
},
"timeFieldName": {
"type": "keyword"
},
"title": {
"type": "text"
},
"type": {
"type": "keyword"
},
"typeMeta": {
"type": "keyword"
}
}
},
"kql-telemetry": {
"properties": {
"optInCount": {
"type": "long"
},
"optOutCount": {
"type": "long"
}
}
},
"migrationVersion": {
"dynamic": "true",
"properties": {
"dashboard": {
"fields": {
"keyword": {
"ignore_above": 256,
"type": "keyword"
}
},
"type": "text"
},
"index-pattern": {
"fields": {
"keyword": {
"ignore_above": 256,
"type": "keyword"
}
},
"type": "text"
},
"search": {
"fields": {
"keyword": {
"ignore_above": 256,
"type": "keyword"
}
},
"type": "text"
},
"visualization": {
"fields": {
"keyword": {
"ignore_above": 256,
"type": "keyword"
}
},
"type": "text"
}
}
},
"namespace": {
"type": "keyword"
},
"namespaces": {
"type": "keyword"
},
"query": {
"properties": {
"description": {
"type": "text"
},
"filters": {
"enabled": false,
"type": "object"
},
"query": {
"properties": {
"language": {
"type": "keyword"
},
"query": {
"index": false,
"type": "keyword"
}
}
},
"timefilter": {
"enabled": false,
"type": "object"
},
"title": {
"type": "text"
}
}
},
"references": {
"properties": {
"id": {
"type": "keyword"
},
"name": {
"type": "keyword"
},
"type": {
"type": "keyword"
}
},
"type": "nested"
},
"sample-data-telemetry": {
"properties": {
"installCount": {
"type": "long"
},
"unInstallCount": {
"type": "long"
}
}
},
"search": {
"properties": {
"columns": {
"type": "keyword"
},
"description": {
"type": "text"
},
"hits": {
"type": "integer"
},
"kibanaSavedObjectMeta": {
"properties": {
"searchSourceJSON": {
"type": "text"
}
}
},
"sort": {
"type": "keyword"
},
"title": {
"type": "text"
},
"version": {
"type": "integer"
}
}
},
"server": {
"properties": {
"uuid": {
"type": "keyword"
}
}
},
"telemetry": {
"properties": {
"allowChangingOptInStatus": {
"type": "boolean"
},
"enabled": {
"type": "boolean"
},
"lastReported": {
"type": "date"
},
"lastVersionChecked": {
"type": "keyword"
},
"reportFailureCount": {
"type": "integer"
},
"reportFailureVersion": {
"type": "keyword"
},
"sendUsageFrom": {
"type": "keyword"
},
"userHasSeenNotice": {
"type": "boolean"
}
}
},
"timelion-sheet": {
"properties": {
"description": {
"type": "text"
},
"hits": {
"type": "integer"
},
"kibanaSavedObjectMeta": {
"properties": {
"searchSourceJSON": {
"type": "text"
}
}
},
"timelion_chart_height": {
"type": "integer"
},
"timelion_columns": {
"type": "integer"
},
"timelion_interval": {
"type": "keyword"
},
"timelion_other_interval": {
"type": "keyword"
},
"timelion_rows": {
"type": "integer"
},
"timelion_sheet": {
"type": "text"
},
"title": {
"type": "text"
},
"version": {
"type": "integer"
}
}
},
"tsvb-validation-telemetry": {
"properties": {
"failedRequests": {
"type": "long"
}
}
},
"type": {
"type": "keyword"
},
"ui-metric": {
"properties": {
"count": {
"type": "integer"
}
}
},
"updated_at": {
"type": "date"
},
"url": {
"properties": {
"accessCount": {
"type": "long"
},
"accessDate": {
"type": "date"
},
"createDate": {
"type": "date"
},
"url": {
"fields": {
"keyword": {
"type": "keyword"
}
},
"type": "text"
}
}
},
"visualization": {
"properties": {
"description": {
"type": "text"
},
"kibanaSavedObjectMeta": {
"properties": {
"searchSourceJSON": {
"type": "text"
}
}
},
"savedSearchRefName": {
"type": "keyword"
},
"title": {
"type": "text"
},
"uiStateJSON": {
"type": "text"
},
"version": {
"type": "integer"
},
"visState": {
"type": "text"
}
}
}
}
},
"settings": {
"index": {
"auto_expand_replicas": "0-1",
"number_of_replicas": "0",
"number_of_shards": "1"
}
}
}
}

View file

@ -0,0 +1,27 @@
/*
* 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 { FtrProviderContext } from '../functional/ftr_provider_context';
// eslint-disable-next-line import/no-default-export
export default function ({ loadTestFile }: FtrProviderContext) {
describe('New Visualize Flow', function () {
this.tags('ciGroup2');
loadTestFile(require.resolve('./dashboard_embedding'));
});
}