diff --git a/src/platform/packages/shared/content-management/tabbed_table_list_view/src/tabbed_table_list_view.tsx b/src/platform/packages/shared/content-management/tabbed_table_list_view/src/tabbed_table_list_view.tsx index f01174aadeff8..1daf87ce90817 100644 --- a/src/platform/packages/shared/content-management/tabbed_table_list_view/src/tabbed_table_list_view.tsx +++ b/src/platform/packages/shared/content-management/tabbed_table_list_view/src/tabbed_table_list_view.tsx @@ -21,6 +21,7 @@ export interface TableListBreadcrumb { export type TableListTabParentProps = Pick, 'onFetchSuccess' | 'setPageDataTestSubject'> & { getBreadcrumbs?: (appId: string) => TableListBreadcrumb[]; + showCreateButton?: boolean; }; export interface TableListTab { @@ -33,12 +34,14 @@ export interface TableListTab, - 'title' | 'description' | 'headingId' | 'children' + 'description' | 'headingId' | 'children' > & { + title?: TableListViewProps['title']; tabs: TableListTab[]; activeTabId: string; changeActiveTab: (id: string) => void; getBreadcrumbs?: TableListTabParentProps['getBreadcrumbs']; + showCreateButton?: boolean; }; export const TabbedTableListView = ({ @@ -50,6 +53,7 @@ export const TabbedTableListView = ({ activeTabId, changeActiveTab, getBreadcrumbs, + showCreateButton, }: TabbedTableListViewProps) => { const [hasInitialFetchReturned, setHasInitialFetchReturned] = useState(false); const [pageDataTestSubject, setPageDataTestSubject] = useState(); @@ -71,17 +75,18 @@ export const TabbedTableListView = ({ onFetchSuccess, setPageDataTestSubject, getBreadcrumbs, + showCreateButton, }); setTableList(newTableList); } loadTableList(); - }, [activeTabId, tabs, getActiveTab, onFetchSuccess, getBreadcrumbs]); + }, [activeTabId, tabs, getActiveTab, onFetchSuccess, getBreadcrumbs, showCreateButton]); return ( {title}} + pageTitle={title ? {title} : undefined} description={description} data-test-subj="top-nav" tabs={tabs.map((tab) => ({ @@ -90,7 +95,9 @@ export const TabbedTableListView = ({ label: tab.title, }))} /> - + {/* Any children passed to the component */} {children} diff --git a/src/platform/plugins/private/event_annotation_listing/public/plugin.ts b/src/platform/plugins/private/event_annotation_listing/public/plugin.ts index 8238cf0c49f0c..fdc6f7c0b759f 100644 --- a/src/platform/plugins/private/event_annotation_listing/public/plugin.ts +++ b/src/platform/plugins/private/event_annotation_listing/public/plugin.ts @@ -8,6 +8,7 @@ */ import type { Plugin, CoreSetup, CoreStart } from '@kbn/core/public'; +import { firstValueFrom } from 'rxjs'; import type { PresentationUtilPluginStart } from '@kbn/presentation-util-plugin/public'; import type { SavedObjectTaggingPluginStart } from '@kbn/saved-objects-tagging-plugin/public'; import { Storage } from '@kbn/kibana-utils-plugin/public'; @@ -101,7 +102,35 @@ export class EventAnnotationListingPlugin }, }; dependencies.visualizations.listingViewRegistry.add(annotationGroupsTabConfig); - dependencies.dashboard.registerListingPageTab(annotationGroupsTabConfig); + dependencies.dashboard.registerListingPageTab({ + ...annotationGroupsTabConfig, + createAction: async () => { + const [coreStart, pluginsStart] = await core.getStartServices(); + const currentApp = await firstValueFrom(coreStart.application.currentAppId$); + if (!currentApp) return; + const stateTransfer = pluginsStart.embeddable.getStateTransfer(); + const breadcrumbs = [ + { + text: stateTransfer.getAppNameFromId(currentApp) ?? currentApp, + href: coreStart.application.getUrlForApp(currentApp), + }, + { + text: tabTitle, + href: coreStart.application.getUrlForApp(currentApp, { + path: window.location.hash, + }), + }, + ]; + await stateTransfer.navigateToEditor('lens', { + path: '', + state: { + originatingApp: currentApp, + originatingPath: window.location.hash, + breadcrumbs, + }, + }); + }, + }); } public start(core: CoreStart, plugins: object): void { diff --git a/src/platform/plugins/shared/dashboard/moon.yml b/src/platform/plugins/shared/dashboard/moon.yml index 7eaa4e1f03342..443503d7c2cd6 100644 --- a/src/platform/plugins/shared/dashboard/moon.yml +++ b/src/platform/plugins/shared/dashboard/moon.yml @@ -127,6 +127,7 @@ dependsOn: - '@kbn/dashboard-navigation-options-components' - '@kbn/dashboard-navigation-options-schema' - '@kbn/as-code-shared-telemetry' + - '@kbn/app-header' tags: - plugin - prod diff --git a/src/platform/plugins/shared/dashboard/public/dashboard_listing/dashboard_listing.test.tsx b/src/platform/plugins/shared/dashboard/public/dashboard_listing/dashboard_listing.test.tsx index 759c443b3b57c..9f9826f740a67 100644 --- a/src/platform/plugins/shared/dashboard/public/dashboard_listing/dashboard_listing.test.tsx +++ b/src/platform/plugins/shared/dashboard/public/dashboard_listing/dashboard_listing.test.tsx @@ -27,6 +27,11 @@ jest.mock('@kbn/content-management-tabbed-table-list-view', () => ({ TabbedTableListView: jest.fn().mockReturnValue(null), })); +jest.mock('@kbn/app-header', () => ({ + __esModule: true, + AppHeader: () => null, +})); + const renderDashboardListing = ( props: Partial = {}, { initialEntries = ['/list'] }: { initialEntries?: string[] } = {} @@ -58,7 +63,6 @@ test('renders TabbedTableListView with correct title and dashboards tab', () => expect(mockTabbedTableListView).toHaveBeenCalledTimes(1); const props = mockTabbedTableListView.mock.calls[0][0]; expect(props).toMatchObject({ - title: 'Dashboards', headingId: 'dashboardListingHeading', }); expect(props.tabs[0]).toMatchObject({ id: 'dashboards', title: 'Dashboards' }); diff --git a/src/platform/plugins/shared/dashboard/public/dashboard_listing/dashboard_listing.tsx b/src/platform/plugins/shared/dashboard/public/dashboard_listing/dashboard_listing.tsx index a80cc30c03ea4..4990a7bc7bc5f 100644 --- a/src/platform/plugins/shared/dashboard/public/dashboard_listing/dashboard_listing.tsx +++ b/src/platform/plugins/shared/dashboard/public/dashboard_listing/dashboard_listing.tsx @@ -17,11 +17,13 @@ import { useExecutionContext } from '@kbn/kibana-react-plugin/public'; import { QueryClientProvider } from '@kbn/react-query'; import type { EmbeddableEditorBreadcrumb } from '@kbn/embeddable-plugin/public'; +import { AppHeader } from '@kbn/app-header'; +import type { AppMenuConfig } from '@kbn/core-chrome-app-menu-components'; import { coreServices } from '../services/kibana_services'; import { dashboardQueryClient } from '../services/dashboard_query_client'; import { DASHBOARD_APP_ID, LANDING_PAGE_PATH } from '../../common/page_bundle_constants'; import { getDashboardListingTabs } from './get_dashboard_listing_tabs'; -import type { DashboardListingProps } from './types'; +import type { DashboardListingProps, DashboardListingTab } from './types'; export const DashboardListing = ({ children, @@ -86,19 +88,64 @@ export const DashboardListing = ({ [tabs, activeTabId] ); + const appMenu: AppMenuConfig = useMemo(() => { + const tabsByIdMap = new Map((tabs as DashboardListingTab[]).map((tab) => [tab.id, tab])); + return { + primaryActionItem: { + id: 'create', + testId: 'dashboardListingCreateButton', + iconType: 'plus', + label: i18n.translate('dashboard.listing.createButtonLabel', { + defaultMessage: 'Create', + }), + popoverWidth: 180, + items: [ + { + id: 'createDashboard', + order: 1, + label: 'Dashboard', + iconType: 'productDashboard', + testId: 'createDashboardButton', + run: () => tabsByIdMap.get('dashboards')?.createAction?.(), + }, + { + id: 'createVisualization', + order: 2, + label: 'Visualization', + iconType: 'chartBarVertical', + testId: 'createVisualizationButton', + run: () => tabsByIdMap.get('visualizations')?.createAction?.(), + }, + { + id: 'createAnnotation', + order: 3, + label: 'Annotation', + iconType: 'flag', + testId: 'createAnnotationButton', + run: () => tabsByIdMap.get('annotations')?.createAction?.(), + }, + ], + }, + }; + }, [tabs]); + return ( {children} - + diff --git a/src/platform/plugins/shared/dashboard/public/dashboard_listing/get_dashboard_listing_tabs.tsx b/src/platform/plugins/shared/dashboard/public/dashboard_listing/get_dashboard_listing_tabs.tsx index 4a764e24ffc52..39215e7df20a6 100644 --- a/src/platform/plugins/shared/dashboard/public/dashboard_listing/get_dashboard_listing_tabs.tsx +++ b/src/platform/plugins/shared/dashboard/public/dashboard_listing/get_dashboard_listing_tabs.tsx @@ -9,10 +9,7 @@ import React, { useMemo } from 'react'; import { i18n } from '@kbn/i18n'; -import type { - TableListTab, - TableListTabParentProps, -} from '@kbn/content-management-tabbed-table-list-view'; +import type { TableListTabParentProps } from '@kbn/content-management-tabbed-table-list-view'; import { TableListViewTable, TableListViewKibanaProvider, @@ -29,7 +26,13 @@ import { } from '../services/kibana_services'; import { DashboardUnsavedListing } from './dashboard_unsaved_listing'; import { useDashboardListingTable } from './hooks/use_dashboard_listing_table'; -import type { DashboardListingProps, DashboardSavedObjectUserContent } from './types'; +import { confirmCreateWithUnsaved } from './confirm_overlays'; +import { getDashboardBackupService } from '../services/dashboard_api_services'; +import type { + DashboardListingProps, + DashboardListingTab, + DashboardSavedObjectUserContent, +} from './types'; type GetDashboardListingTabsParams = Pick< DashboardListingProps, @@ -64,6 +67,7 @@ const DashboardsTabContent = ({ getDashboardUrl, useSessionStorageIntegration, initialFilter, + showCreateDashboardButton: parentProps.showCreateButton, }); const dashboardFavoritesClient = useMemo(() => { @@ -101,7 +105,7 @@ export const getDashboardListingTabs = ({ useSessionStorageIntegration, initialFilter, getTabs, -}: GetDashboardListingTabsParams): TableListTab[] => { +}: GetDashboardListingTabsParams): DashboardListingTab[] => { const commonProps = { goToDashboard, getDashboardUrl, @@ -109,7 +113,7 @@ export const getDashboardListingTabs = ({ initialFilter, }; - const dashboardsTab: TableListTab = { + const dashboardsTab: DashboardListingTab = { title: i18n.translate('dashboard.listing.tabs.dashboards.title', { defaultMessage: 'Dashboards', }), @@ -117,6 +121,16 @@ export const getDashboardListingTabs = ({ getTableList: (parentProps) => ( ), + createAction: () => { + if (useSessionStorageIntegration && getDashboardBackupService().dashboardHasUnsavedEdits()) { + confirmCreateWithUnsaved(() => { + getDashboardBackupService().clearState(); + goToDashboard(); + }, goToDashboard); + return; + } + goToDashboard(); + }, }; // Additional tabs (e.g., visualizations and annotation groups) diff --git a/src/platform/plugins/shared/dashboard/public/dashboard_listing/types.ts b/src/platform/plugins/shared/dashboard/public/dashboard_listing/types.ts index 83d2672643499..6e0834137f31f 100644 --- a/src/platform/plugins/shared/dashboard/public/dashboard_listing/types.ts +++ b/src/platform/plugins/shared/dashboard/public/dashboard_listing/types.ts @@ -14,14 +14,13 @@ import type { SavedObjectAccessControl } from '@kbn/core-saved-objects-common'; import type { TableListTab } from '@kbn/content-management-tabbed-table-list-view'; import type { AppDeepLinkLocations } from '@kbn/core/public'; -/** Tab interface with optional deep link support. */ +/** Tab interface with optional deep link and create action support. */ export type DashboardListingTab = TableListTab & { deepLink?: { - /** Title to display in global search results */ title: string; - /** Where this deep link should be visible. */ visibleIn?: AppDeepLinkLocations[]; }; + createAction?: () => void; }; export type DashboardListingProps = PropsWithChildren<{ diff --git a/src/platform/plugins/shared/dashboard/test/scout/ui/parallel_tests/dashboard_listing_navigation.spec.ts b/src/platform/plugins/shared/dashboard/test/scout/ui/parallel_tests/dashboard_listing_navigation.spec.ts index 33382e7e97ecc..2140c0594edb1 100644 --- a/src/platform/plugins/shared/dashboard/test/scout/ui/parallel_tests/dashboard_listing_navigation.spec.ts +++ b/src/platform/plugins/shared/dashboard/test/scout/ui/parallel_tests/dashboard_listing_navigation.spec.ts @@ -39,7 +39,8 @@ spaceTest.describe( 'clicking create new dashboard button navigates to the editor', async () => { await pageObjects.dashboard.goto(); - await page.testSubj.click('newItemButton'); + await page.testSubj.click('dashboardListingCreateButton'); + await page.testSubj.click('createDashboardButton'); await expect(page.testSubj.locator('dashboardAddTopNavButton')).toBeVisible({ timeout: 20_000, }); @@ -48,7 +49,7 @@ spaceTest.describe( await spaceTest.step('navigating back to listing page from a new dashboard', async () => { await page.goBack(); - await expect(page.testSubj.locator('newItemButton')).toBeVisible(); + await expect(page.testSubj.locator('dashboardListingCreateButton')).toBeVisible(); }); } ); @@ -57,7 +58,8 @@ spaceTest.describe( 'saving a dashboard and returning to the listing page shows it', async ({ page, pageObjects }) => { await pageObjects.dashboard.goto(); - await page.testSubj.click('newItemButton'); + await page.testSubj.click('dashboardListingCreateButton'); + await page.testSubj.click('createDashboardButton'); await expect(page.testSubj.locator('dashboardAddTopNavButton')).toBeVisible({ timeout: 20_000, }); diff --git a/src/platform/plugins/shared/dashboard/tsconfig.json b/src/platform/plugins/shared/dashboard/tsconfig.json index cf9cc5aae0584..7bed11df8bfd8 100644 --- a/src/platform/plugins/shared/dashboard/tsconfig.json +++ b/src/platform/plugins/shared/dashboard/tsconfig.json @@ -123,7 +123,8 @@ "@kbn/dashboard-navigation-options-common", "@kbn/dashboard-navigation-options-components", "@kbn/dashboard-navigation-options-schema", - "@kbn/as-code-shared-telemetry" + "@kbn/as-code-shared-telemetry", + "@kbn/app-header" ], "exclude": [ "target/**/*" diff --git a/src/platform/plugins/shared/visualization_listing/public/components/visualization_table_list.tsx b/src/platform/plugins/shared/visualization_listing/public/components/visualization_table_list.tsx index 7c7bd43c9fc8c..80dab9e600826 100644 --- a/src/platform/plugins/shared/visualization_listing/public/components/visualization_table_list.tsx +++ b/src/platform/plugins/shared/visualization_listing/public/components/visualization_table_list.tsx @@ -60,7 +60,7 @@ export const VisualizationTableList = ({ savedObjectsTagging, parentProps, }: VisualizationTableListProps) => { - const { getBreadcrumbs, onFetchSuccess, setPageDataTestSubject } = parentProps; + const { getBreadcrumbs, onFetchSuccess, setPageDataTestSubject, showCreateButton } = parentProps; const euiThemeContext = useEuiTheme(); const tableStyles = useMemo( () => getVisualizationListingTableStyles(euiThemeContext), @@ -74,14 +74,15 @@ export const VisualizationTableList = ({ const visualizedUserContent = useRef(); const closeNewVisModal = useRef(() => {}); - const createNewVis = useCallback(async () => { - const currentApp = await firstValueFrom(core.application.currentAppId$); - const breadcrumbs = currentApp ? getBreadcrumbs?.(currentApp) : undefined; - closeNewVisModal.current = visualizations.showNewVisModal({ - originatingApp: currentApp, - originatingPath: window.location.hash, - breadcrumbs, - outsideVisualizeApp: currentApp !== VISUALIZE_APP_NAME, + const createNewVis = useCallback(() => { + firstValueFrom(core.application.currentAppId$).then((currentApp) => { + const breadcrumbs = currentApp ? getBreadcrumbs?.(currentApp) : undefined; + closeNewVisModal.current = visualizations.showNewVisModal({ + originatingApp: currentApp, + originatingPath: window.location.hash, + breadcrumbs, + outsideVisualizeApp: currentApp !== VISUALIZE_APP_NAME, + }); }); }, [visualizations, core.application, getBreadcrumbs]); @@ -244,7 +245,7 @@ export const VisualizationTableList = ({ customValidators: contentEditorValidators, }} emptyPrompt={noItemsFragment} - createItem={createNewVis} + createItem={showCreateButton === false ? undefined : createNewVis} customTableColumn={getCustomColumn()} customSortingOptions={getCustomSortingOptions()} initialPageSize={initialPageSize} diff --git a/src/platform/plugins/shared/visualization_listing/public/get_table_list.tsx b/src/platform/plugins/shared/visualization_listing/public/get_table_list.tsx index 8d275f3981e8d..890e9bd5e2b8e 100644 --- a/src/platform/plugins/shared/visualization_listing/public/get_table_list.tsx +++ b/src/platform/plugins/shared/visualization_listing/public/get_table_list.tsx @@ -8,6 +8,7 @@ */ import React from 'react'; +import { firstValueFrom } from 'rxjs'; import { FormattedRelative } from '@kbn/i18n-react'; import { TableListViewKibanaProvider } from '@kbn/content-management-table-list-view-table'; import type { TableListTabParentProps } from '@kbn/content-management-tabbed-table-list-view'; @@ -16,6 +17,7 @@ import type { ContentManagementPublicStart } from '@kbn/content-management-plugi import type { EmbeddableStart } from '@kbn/embeddable-plugin/public'; import type { SavedObjectTaggingOssPluginStart } from '@kbn/saved-objects-tagging-oss-plugin/public'; import type { VisualizationsStart } from '@kbn/visualizations-plugin/public'; +import { VISUALIZE_APP_NAME } from '@kbn/visualizations-common'; import { VisualizationTableList } from './components/visualization_table_list'; export interface VisualizationListingPageServices { @@ -49,3 +51,32 @@ export const getTableList = ( ); }; + +export const showNewVisModalFromDashboard = async ( + coreStart: CoreStart, + pluginsStart: { visualizations: VisualizationsStart; embeddable: EmbeddableStart }, + tabTitle: string +) => { + const currentApp = await firstValueFrom(coreStart.application.currentAppId$); + const breadcrumbs = currentApp + ? [ + { + text: + pluginsStart.embeddable.getStateTransfer().getAppNameFromId(currentApp) ?? currentApp, + href: coreStart.application.getUrlForApp(currentApp), + }, + { + text: tabTitle, + href: coreStart.application.getUrlForApp(currentApp, { + path: window.location.hash, + }), + }, + ] + : undefined; + pluginsStart.visualizations.showNewVisModal({ + originatingApp: currentApp, + originatingPath: window.location.hash, + outsideVisualizeApp: currentApp !== VISUALIZE_APP_NAME, + breadcrumbs, + }); +}; diff --git a/src/platform/plugins/shared/visualization_listing/public/plugin.ts b/src/platform/plugins/shared/visualization_listing/public/plugin.ts index 3c59eccb9a055..b3857adc4d27f 100644 --- a/src/platform/plugins/shared/visualization_listing/public/plugin.ts +++ b/src/platform/plugins/shared/visualization_listing/public/plugin.ts @@ -72,6 +72,11 @@ export class VisualizationListingPlugin }), visibleIn: ['globalSearch'], }, + createAction: async () => { + const [coreStart, pluginsStart] = await core.getStartServices(); + const { showNewVisModalFromDashboard } = await import('./get_table_list'); + showNewVisModalFromDashboard(coreStart, pluginsStart, tabTitle); + }, }; if (dependencies.dashboard) { diff --git a/src/platform/test/accessibility/apps/dashboard.ts b/src/platform/test/accessibility/apps/dashboard.ts index 48f719e5d09fc..5c4ea7e0d266f 100644 --- a/src/platform/test/accessibility/apps/dashboard.ts +++ b/src/platform/test/accessibility/apps/dashboard.ts @@ -142,7 +142,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await listingTable.clickDeleteSelected(); await a11y.testAppSnapshot(); await common.clickConfirmOnModal(); - await listingTable.isShowingEmptyPromptCreateNewButton(); + await dashboard.expectCreateButtonExists(); }); }); } diff --git a/src/platform/test/functional/page_objects/dashboard_page.ts b/src/platform/test/functional/page_objects/dashboard_page.ts index d738eda840d94..f3cad72012a43 100644 --- a/src/platform/test/functional/page_objects/dashboard_page.ts +++ b/src/platform/test/functional/page_objects/dashboard_page.ts @@ -458,7 +458,7 @@ export class DashboardPageObject extends FtrService { await this.common.clickConfirmOnModal(); } } - await this.listingTable.clickNewButton(); + await this.clickCreatePopoverItem('createDashboardButton'); if (expectWarning) { await this.testSubjects.existOrFail('dashboardCreateConfirm'); } @@ -473,8 +473,23 @@ export class DashboardPageObject extends FtrService { await this.waitForRenderComplete(); } + public async clickCreatePopoverItem( + itemTestSubj: 'createDashboardButton' | 'createVisualizationButton' | 'createAnnotationButton' + ) { + await this.testSubjects.click('dashboardListingCreateButton'); + await this.testSubjects.click(itemTestSubj); + } + public async clickCreateDashboardPrompt() { - await this.testSubjects.click('newItemButton'); + await this.clickCreatePopoverItem('createDashboardButton'); + } + + public async expectCreateButtonExists() { + await this.testSubjects.existOrFail('dashboardListingCreateButton'); + } + + public async expectCreateButtonMissing() { + await this.testSubjects.missingOrFail('dashboardListingCreateButton'); } public async getCreateDashboardPromptExists() { diff --git a/x-pack/performance/journeys_e2e/dashboard_listing_page.ts b/x-pack/performance/journeys_e2e/dashboard_listing_page.ts index 792c0300e6910..883f35ca9c067 100644 --- a/x-pack/performance/journeys_e2e/dashboard_listing_page.ts +++ b/x-pack/performance/journeys_e2e/dashboard_listing_page.ts @@ -37,7 +37,8 @@ export const journey = new Journey({ await deletedDashboard.waitFor({ state: 'detached' }); }) .step('Add dashboard', async ({ page, inputDelays }) => { - await page.click(subj('newItemButton')); + await page.click(subj('dashboardListingCreateButton')); + await page.click(subj('createDashboardButton')); await page.click(subj('dashboardInteractiveSaveMenuItem')); await page.type(subj('savedObjectTitle'), `foobar dashboard ${uuidv4()}`, { delay: inputDelays.TYPING, diff --git a/x-pack/platform/test/functional/apps/dashboard/group1/feature_controls/dashboard_security.ts b/x-pack/platform/test/functional/apps/dashboard/group1/feature_controls/dashboard_security.ts index 73643de4672ec..c72e620248a26 100644 --- a/x-pack/platform/test/functional/apps/dashboard/group1/feature_controls/dashboard_security.ts +++ b/x-pack/platform/test/functional/apps/dashboard/group1/feature_controls/dashboard_security.ts @@ -106,7 +106,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await testSubjects.existOrFail('dashboardLandingPage', { timeout: config.get('timeouts.waitFor'), }); - await testSubjects.existOrFail('newItemButton'); + await dashboard.expectCreateButtonExists(); }); it(`doesn't show read-only badge`, async () => { @@ -288,7 +288,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await testSubjects.existOrFail('dashboardLandingPage', { timeout: config.get('timeouts.waitFor'), }); - await testSubjects.missingOrFail('newItemButton'); + await dashboard.expectCreateButtonMissing(); }); it(`shows read-only badge`, async () => { @@ -396,7 +396,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { args: navigationArgs, }); await testSubjects.existOrFail('dashboardLandingPage', { timeout: 10000 }); - await testSubjects.missingOrFail('newItemButton'); + await dashboard.expectCreateButtonMissing(); }); it(`shows read-only badge`, async () => { diff --git a/x-pack/platform/test/functional/apps/dashboard/group1/feature_controls/dashboard_spaces.ts b/x-pack/platform/test/functional/apps/dashboard/group1/feature_controls/dashboard_spaces.ts index c9d000766a882..39883a96d8363 100644 --- a/x-pack/platform/test/functional/apps/dashboard/group1/feature_controls/dashboard_spaces.ts +++ b/x-pack/platform/test/functional/apps/dashboard/group1/feature_controls/dashboard_spaces.ts @@ -61,7 +61,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await testSubjects.existOrFail('dashboardLandingPage', { timeout: config.get('timeouts.waitFor'), }); - await testSubjects.existOrFail('newItemButton'); + await dashboard.expectCreateButtonExists(); }); it(`create new dashboard shows addNew button`, async () => { diff --git a/x-pack/solutions/search/test/serverless/functional/test_suites/default_dataview.ts b/x-pack/solutions/search/test/serverless/functional/test_suites/default_dataview.ts index 42fcc32b0ec67..964b10a259070 100644 --- a/x-pack/solutions/search/test/serverless/functional/test_suites/default_dataview.ts +++ b/x-pack/solutions/search/test/serverless/functional/test_suites/default_dataview.ts @@ -45,7 +45,8 @@ export default function ({ getPageObject, getService }: FtrProviderContext) { await svlCommonNavigation.sidenav.clickLink({ deepLinkId: 'dashboards' }); await testSubjects.existOrFail('~breadcrumb-deepLinkId-dashboards'); await testSubjects.existOrFail('emptyListPrompt'); - await testSubjects.click('newItemButton'); + await testSubjects.click('dashboardListingCreateButton'); + await testSubjects.click('createDashboardButton'); await svlCommonNavigation.breadcrumbs.expectBreadcrumbExists({ text: 'Editing New Dashboard', });