diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/components/table_row_actions_nested.tsx b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/components/table_row_actions_nested.tsx
new file mode 100644
index 00000000000000..04f43fabb11857
--- /dev/null
+++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/components/table_row_actions_nested.tsx
@@ -0,0 +1,38 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License;
+ * you may not use this file except in compliance with the Elastic License.
+ */
+
+import React, { useCallback, useState } from 'react';
+import { EuiButtonIcon, EuiContextMenu, EuiPopover } from '@elastic/eui';
+import { i18n } from '@kbn/i18n';
+import { EuiContextMenuProps } from '@elastic/eui/src/components/context_menu/context_menu';
+
+export const TableRowActionsNested = React.memo<{ panels: EuiContextMenuProps['panels'] }>(
+ ({ panels }) => {
+ const [isOpen, setIsOpen] = useState(false);
+ const handleCloseMenu = useCallback(() => setIsOpen(false), [setIsOpen]);
+ const handleToggleMenu = useCallback(() => setIsOpen(!isOpen), [isOpen]);
+
+ return (
+
+ }
+ isOpen={isOpen}
+ closePopover={handleCloseMenu}
+ >
+
+
+ );
+ }
+);
diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/components/table_row_actions.tsx b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/components/table_row_actions.tsx
similarity index 93%
rename from x-pack/plugins/ingest_manager/public/applications/ingest_manager/components/table_row_actions.tsx
rename to x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/components/table_row_actions.tsx
index b355c6ef480035..0a437c81050123 100644
--- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/components/table_row_actions.tsx
+++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/components/table_row_actions.tsx
@@ -23,7 +23,7 @@ export const TableRowActions = React.memo<{ items: EuiContextMenuPanelProps['ite
diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/details_page/components/datasources/datasources_table.tsx b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/details_page/components/datasources/datasources_table.tsx
index 8113ea41891a4b..a0418c5f256c48 100644
--- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/details_page/components/datasources/datasources_table.tsx
+++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/details_page/components/datasources/datasources_table.tsx
@@ -17,7 +17,7 @@ import {
EuiFlexItem,
} from '@elastic/eui';
import { AgentConfig, Datasource } from '../../../../../types';
-import { TableRowActions } from '../../../../../components/table_row_actions';
+import { TableRowActions } from '../../../components/table_row_actions';
import { DangerEuiContextMenuItem } from '../../../components/danger_eui_context_menu_item';
import { useCapabilities, useLink } from '../../../../../hooks';
import { useAgentConfigLink } from '../../hooks/use_details_uri';
diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/list_page/index.tsx b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/list_page/index.tsx
index c47cc65c776eab..3dcc19bc4a5aee 100644
--- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/list_page/index.tsx
+++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/list_page/index.tsx
@@ -40,7 +40,7 @@ import { CreateAgentConfigFlyout } from './components';
import { SearchBar } from '../../../components/search_bar';
import { LinkedAgentCount } from '../components';
import { useAgentConfigLink } from '../details_page/hooks/use_details_uri';
-import { TableRowActions } from '../../../components/table_row_actions';
+import { TableRowActions } from '../components/table_row_actions';
const NO_WRAP_TRUNCATE_STYLE: CSSProperties = Object.freeze({
overflow: 'hidden',
diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/data_stream/list_page/components/data_stream_row_actions.tsx b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/data_stream/list_page/components/data_stream_row_actions.tsx
new file mode 100644
index 00000000000000..a33770fdb605d9
--- /dev/null
+++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/data_stream/list_page/components/data_stream_row_actions.tsx
@@ -0,0 +1,77 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License;
+ * you may not use this file except in compliance with the Elastic License.
+ */
+
+import React, { memo } from 'react';
+
+import { FormattedMessage } from '@kbn/i18n/react';
+import { useKibanaLink } from '../../../../hooks/use_kibana_link';
+import { DataStream } from '../../../../types';
+import { TableRowActionsNested } from '../../../../components/table_row_actions_nested';
+
+export const DataStreamRowActions = memo<{ datastream: DataStream }>(({ datastream }) => {
+ const { dashboards } = datastream;
+ const panels = [];
+ const actionNameSingular = (
+
+ );
+ const actionNamePlural = (
+
+ );
+
+ if (!dashboards || dashboards.length === 0) {
+ panels.push({
+ id: 0,
+ items: [
+ {
+ icon: 'dashboardApp',
+ disabled: true,
+ name: actionNameSingular,
+ },
+ ],
+ });
+ } else if (dashboards.length === 1) {
+ panels.push({
+ id: 0,
+ items: [
+ {
+ icon: 'dashboardApp',
+ href: useKibanaLink(`/dashboard/${dashboards[0].id || ''}`),
+ name: actionNameSingular,
+ },
+ ],
+ });
+ } else {
+ panels.push({
+ id: 0,
+ items: [
+ {
+ icon: 'dashboardApp',
+ panel: 1,
+ name: actionNamePlural,
+ },
+ ],
+ });
+ panels.push({
+ id: 1,
+ title: 'View dashboards',
+ items: dashboards.map(dashboard => {
+ return {
+ icon: 'dashboardApp',
+ href: useKibanaLink(`/dashboard/${dashboard.id || ''}`),
+ name: dashboard.id,
+ };
+ }),
+ });
+ }
+
+ return ;
+});
diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/data_stream/list_page/index.tsx b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/data_stream/list_page/index.tsx
index 30c8e7559a5e8a..cff138c6a16ca0 100644
--- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/data_stream/list_page/index.tsx
+++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/data_stream/list_page/index.tsx
@@ -3,7 +3,7 @@
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/
-import React, { useMemo, memo } from 'react';
+import React, { useMemo } from 'react';
import {
EuiBadge,
EuiButton,
@@ -17,13 +17,11 @@ import {
} from '@elastic/eui';
import { i18n } from '@kbn/i18n';
import { FormattedMessage, FormattedDate } from '@kbn/i18n/react';
-import { EuiContextMenuItem } from '@elastic/eui';
import { DataStream } from '../../../types';
import { WithHeaderLayout } from '../../../layouts';
import { useGetDataStreams, useStartDeps, usePagination } from '../../../hooks';
import { PackageIcon } from '../../../components/package_icon';
-import { TableRowActions } from '../../../components/table_row_actions';
-import { useKibanaLink } from '../../../hooks/use_kibana_link';
+import { DataStreamRowActions } from './components/data_stream_row_actions';
const DataStreamListPageLayout: React.FunctionComponent = ({ children }) => (
(
);
-const DataStreamRowActions = memo<{ datastream: DataStream }>(({ datastream }) => {
- const url = datastream.dashboards.length > 0 ? datastream.dashboards[0].id : '';
- return (
- 0)}
- >
-
- ,
- ]}
- />
- );
-});
-
export const DataStreamListPage: React.FunctionComponent<{}> = () => {
const {
data: { fieldFormats },