[Dashboard] Filter out experimental visualizations when labs setting is disabled (#136332)

* Filter out experimental vis if labs disabled

* Remove duplicated file

* Add functional tests
This commit is contained in:
Hannah Mudge 2022-07-18 09:42:36 -06:00 committed by GitHub
parent 5a3f515e36
commit 11f7ace59f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 36 additions and 171 deletions

View file

@ -46,6 +46,7 @@ export const EditorMenu = ({ dashboardContainer, createNewVisType }: Props) => {
useKibana<DashboardAppServices>().services;
const IS_DARK_THEME = uiSettings.get('theme:darkMode');
const LABS_ENABLED = uiSettings.get('visualize:enableLabs');
const trackUiMetric = usageCollection?.reportUiCounter.bind(
usageCollection,
@ -75,7 +76,9 @@ export const EditorMenu = ({ dashboardContainer, createNewVisType }: Props) => {
}
return 0;
})
.filter(({ hidden }: BaseVisType) => !hidden);
.filter(
({ hidden, stage }: BaseVisType) => !(hidden || (!LABS_ENABLED && stage === 'experimental'))
);
const promotedVisTypes = getVisTypesByGroup(VisGroups.PROMOTED);
const aggsBasedVisTypes = getVisTypesByGroup(VisGroups.AGGBASED);

View file

@ -227,7 +227,11 @@ const ToolsGroup = ({ visType, onVisTypeSelected, showExperimental }: VisCardPro
<EuiFlexItem>
<EuiFlexGroup gutterSize="s" alignItems="center" responsive={false}>
<EuiFlexItem grow={false}>
<EuiLink data-test-subj={`visType-${visType.name}`} onClick={onClick}>
<EuiLink
data-test-subj={`visType-${visType.name}`}
data-vis-stage={visType.stage}
onClick={onClick}
>
{'titleInWizard' in visType && visType.titleInWizard
? visType.titleInWizard
: visType.title}

View file

@ -18,6 +18,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
const browser = getService('browser');
const kibanaServer = getService('kibanaServer');
const dashboardAddPanel = getService('dashboardAddPanel');
const testSubjects = getService('testSubjects');
describe('create and add embeddables', () => {
before(async () => {
@ -133,6 +134,18 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
describe('visualize:enableLabs advanced setting', () => {
const LAB_VIS_NAME = 'Rendering Test: input control';
let experimentalTypes: string[] = [];
before(async () => {
// get the data-test-subj values for all experimental visualizations for later tests
await PageObjects.visualize.gotoVisualizationLandingPage();
await PageObjects.visualize.clickNewVisualization();
const experimentalTypeWrappers = await PageObjects.visualize.getExperimentalTypeLinks();
experimentalTypes = await Promise.all(
experimentalTypeWrappers.map((element) => element.getAttribute('data-test-subj'))
);
});
it('should display lab visualizations in add panel', async () => {
await PageObjects.common.navigateToApp('dashboard');
await PageObjects.dashboard.clickNewDashboard();
@ -141,6 +154,13 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
expect(exists).to.be(true);
});
it('should display lab visualizations in editor menu', async () => {
await dashboardAddPanel.clickEditorMenuButton();
for (const dataTestSubj of experimentalTypes) {
await testSubjects.existOrFail(dataTestSubj);
}
});
describe('is false', () => {
before(async () => {
await PageObjects.header.clickStackManagement();
@ -157,6 +177,13 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
expect(exists).to.be(false);
});
it('should not display lab visualizations in editor menu', async () => {
await dashboardAddPanel.clickEditorMenuButton();
for (const dataTestSubj of experimentalTypes) {
expect(await testSubjects.exists(dataTestSubj)).to.be(false);
}
});
after(async () => {
await PageObjects.header.clickStackManagement();
await PageObjects.settings.clickKibanaSettings();

View file

@ -1,169 +0,0 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0 and the Server Side Public License, v 1; you may not use this file except
* in compliance with, at your election, the Elastic License 2.0 or the Server
* Side Public License, v 1.
*/
import expect from '@kbn/expect';
import { VisualizeConstants } from '@kbn/visualizations-plugin/common/constants';
import { VISUALIZE_ENABLE_LABS_SETTING } from '@kbn/visualizations-plugin/common/constants';
import { FtrProviderContext } from '../../../ftr_provider_context';
export default function ({ getService, getPageObjects }: FtrProviderContext) {
const retry = getService('retry');
const PageObjects = getPageObjects(['dashboard', 'header', 'visualize', 'settings', 'common']);
const browser = getService('browser');
const kibanaServer = getService('kibanaServer');
const dashboardAddPanel = getService('dashboardAddPanel');
describe('create and add embeddables', () => {
before(async () => {
await kibanaServer.savedObjects.cleanStandardList();
await kibanaServer.importExport.load(
'test/functional/fixtures/kbn_archiver/dashboard/current/kibana'
);
await kibanaServer.uiSettings.replace({
defaultIndex: '0bf35f60-3dc9-11e8-8660-4d65aa086b3c',
});
});
it('ensure toolbar popover closes on add', async () => {
await PageObjects.common.navigateToApp('dashboard');
await PageObjects.dashboard.clickNewDashboard();
await PageObjects.dashboard.switchToEditMode();
await dashboardAddPanel.clickEditorMenuButton();
await dashboardAddPanel.clickAddNewEmbeddableLink('LOG_STREAM_EMBEDDABLE');
await dashboardAddPanel.expectEditorMenuClosed();
});
after(async () => {
await kibanaServer.savedObjects.cleanStandardList();
});
describe('add new visualization link', () => {
before(async () => {
await PageObjects.common.navigateToApp('dashboard');
await PageObjects.dashboard.preserveCrossAppState();
await PageObjects.dashboard.loadSavedDashboard('few panels');
});
it('adds new visualization via the top nav link', async () => {
const originalPanelCount = await PageObjects.dashboard.getPanelCount();
await PageObjects.dashboard.switchToEditMode();
await dashboardAddPanel.clickEditorMenuButton();
await dashboardAddPanel.clickAggBasedVisualizations();
await PageObjects.visualize.clickAreaChart();
await PageObjects.visualize.clickNewSearch();
await PageObjects.visualize.saveVisualizationExpectSuccess(
'visualization from top nav add new panel',
{ redirectToOrigin: true }
);
await retry.try(async () => {
const panelCount = await PageObjects.dashboard.getPanelCount();
expect(panelCount).to.eql(originalPanelCount + 1);
});
await PageObjects.dashboard.waitForRenderComplete();
});
it('adds a new visualization', async () => {
const originalPanelCount = await PageObjects.dashboard.getPanelCount();
await dashboardAddPanel.clickEditorMenuButton();
await dashboardAddPanel.clickAggBasedVisualizations();
await PageObjects.visualize.clickAreaChart();
await PageObjects.visualize.clickNewSearch();
await PageObjects.visualize.saveVisualizationExpectSuccess(
'visualization from add new link',
{ redirectToOrigin: true }
);
await retry.try(async () => {
const panelCount = await PageObjects.dashboard.getPanelCount();
expect(panelCount).to.eql(originalPanelCount + 1);
});
await PageObjects.dashboard.waitForRenderComplete();
});
it('adds a new timelion visualization', async () => {
// adding this case, as the timelion agg-based viz doesn't need the `clickNewSearch()` step
const originalPanelCount = await PageObjects.dashboard.getPanelCount();
await dashboardAddPanel.clickEditorMenuButton();
await dashboardAddPanel.clickAggBasedVisualizations();
await PageObjects.visualize.clickTimelion();
await PageObjects.visualize.saveVisualizationExpectSuccess(
'timelion visualization from add new link',
{ redirectToOrigin: true }
);
await retry.try(async () => {
const panelCount = await PageObjects.dashboard.getPanelCount();
expect(panelCount).to.eql(originalPanelCount + 1);
});
await PageObjects.dashboard.waitForRenderComplete();
});
it('adds a markdown visualization via the quick button', async () => {
const originalPanelCount = await PageObjects.dashboard.getPanelCount();
await dashboardAddPanel.clickMarkdownQuickButton();
await PageObjects.visualize.saveVisualizationExpectSuccess(
'visualization from markdown quick button',
{ redirectToOrigin: true }
);
await retry.try(async () => {
const panelCount = await PageObjects.dashboard.getPanelCount();
expect(panelCount).to.eql(originalPanelCount + 1);
});
await PageObjects.dashboard.waitForRenderComplete();
});
it('saves the listing page instead of the visualization to the app link', async () => {
await PageObjects.header.clickVisualize(true);
const currentUrl = await browser.getCurrentUrl();
expect(currentUrl).not.to.contain(VisualizeConstants.EDIT_PATH);
});
after(async () => {
await PageObjects.header.clickDashboard();
});
});
describe('visualize:enableLabs advanced setting', () => {
const LAB_VIS_NAME = 'Rendering Test: input control';
it('should display lab visualizations in add panel', async () => {
await PageObjects.common.navigateToApp('dashboard');
await PageObjects.dashboard.clickNewDashboard();
const exists = await dashboardAddPanel.panelAddLinkExists(LAB_VIS_NAME);
await dashboardAddPanel.closeAddPanel();
expect(exists).to.be(true);
});
describe('is false', () => {
before(async () => {
await PageObjects.header.clickStackManagement();
await PageObjects.settings.clickKibanaSettings();
await PageObjects.settings.toggleAdvancedSettingCheckbox(VISUALIZE_ENABLE_LABS_SETTING);
});
it('should not display lab visualizations in add panel', async () => {
await PageObjects.common.navigateToApp('dashboard');
await PageObjects.dashboard.clickNewDashboard();
const exists = await dashboardAddPanel.panelAddLinkExists(LAB_VIS_NAME);
await dashboardAddPanel.closeAddPanel();
expect(exists).to.be(false);
});
after(async () => {
await PageObjects.header.clickStackManagement();
await PageObjects.settings.clickKibanaSettings();
await PageObjects.settings.clearAdvancedSettings(VISUALIZE_ENABLE_LABS_SETTING);
await PageObjects.header.clickDashboard();
});
});
});
});
}