diff --git a/x-pack/plugins/cross_cluster_replication/public/app/components/follower_index_actions_providers/follower_index_actions_provider.js b/x-pack/plugins/cross_cluster_replication/public/app/components/follower_index_actions_providers/follower_index_actions_provider.js
new file mode 100644
index 0000000000000..df3017ebf92a4
--- /dev/null
+++ b/x-pack/plugins/cross_cluster_replication/public/app/components/follower_index_actions_providers/follower_index_actions_provider.js
@@ -0,0 +1,34 @@
+/*
+ * 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 from 'react';
+
+import { FollowerIndexPauseProvider } from './follower_index_pause_provider';
+import { FollowerIndexResumeProvider } from './follower_index_resume_provider';
+import { FollowerIndexUnfollowProvider } from './follower_index_unfollow_provider';
+
+export const FollowerIndexActionsProvider = (props) => {
+ return (
+
+ {(pauseFollowerIndex) => (
+
+ {(resumeFollowerIndex) => (
+
+ {(unfollowLeaderIndex) => {
+ const { children } = props;
+ return children(() => ({
+ pauseFollowerIndex,
+ resumeFollowerIndex,
+ unfollowLeaderIndex,
+ }));
+ }}
+
+ )}
+
+ )}
+
+ );
+};
diff --git a/x-pack/plugins/cross_cluster_replication/public/app/components/follower_index_pause_provider.js b/x-pack/plugins/cross_cluster_replication/public/app/components/follower_index_actions_providers/follower_index_pause_provider.js
similarity index 95%
rename from x-pack/plugins/cross_cluster_replication/public/app/components/follower_index_pause_provider.js
rename to x-pack/plugins/cross_cluster_replication/public/app/components/follower_index_actions_providers/follower_index_pause_provider.js
index 9c1e8255d069c..7d1168d831631 100644
--- a/x-pack/plugins/cross_cluster_replication/public/app/components/follower_index_pause_provider.js
+++ b/x-pack/plugins/cross_cluster_replication/public/app/components/follower_index_actions_providers/follower_index_pause_provider.js
@@ -11,9 +11,9 @@ import { i18n } from '@kbn/i18n';
import { FormattedMessage } from '@kbn/i18n/react';
import { EuiConfirmModal, EuiOverlayMask } from '@elastic/eui';
-import { pauseFollowerIndex } from '../store/actions';
-import { arrify } from '../../../common/services/utils';
-import { areAllSettingsDefault } from '../services/follower_index_default_settings';
+import { pauseFollowerIndex } from '../../store/actions';
+import { arrify } from '../../../../common/services/utils';
+import { areAllSettingsDefault } from '../../services/follower_index_default_settings';
class FollowerIndexPauseProviderUi extends PureComponent {
static propTypes = {
diff --git a/x-pack/plugins/cross_cluster_replication/public/app/components/follower_index_resume_provider.js b/x-pack/plugins/cross_cluster_replication/public/app/components/follower_index_actions_providers/follower_index_resume_provider.js
similarity index 95%
rename from x-pack/plugins/cross_cluster_replication/public/app/components/follower_index_resume_provider.js
rename to x-pack/plugins/cross_cluster_replication/public/app/components/follower_index_actions_providers/follower_index_resume_provider.js
index 101e3df6bf710..86f8c0447e734 100644
--- a/x-pack/plugins/cross_cluster_replication/public/app/components/follower_index_resume_provider.js
+++ b/x-pack/plugins/cross_cluster_replication/public/app/components/follower_index_actions_providers/follower_index_resume_provider.js
@@ -10,10 +10,10 @@ import { connect } from 'react-redux';
import { i18n } from '@kbn/i18n';
import { FormattedMessage } from '@kbn/i18n/react';
import { EuiConfirmModal, EuiLink, EuiOverlayMask } from '@elastic/eui';
-import { reactRouterNavigate } from '../../../../../../src/plugins/kibana_react/public';
-import { routing } from '../services/routing';
-import { resumeFollowerIndex } from '../store/actions';
-import { arrify } from '../../../common/services/utils';
+import { reactRouterNavigate } from '../../../../../../../src/plugins/kibana_react/public';
+import { routing } from '../../services/routing';
+import { resumeFollowerIndex } from '../../store/actions';
+import { arrify } from '../../../../common/services/utils';
class FollowerIndexResumeProviderUi extends PureComponent {
static propTypes = {
diff --git a/x-pack/plugins/cross_cluster_replication/public/app/components/follower_index_unfollow_provider.js b/x-pack/plugins/cross_cluster_replication/public/app/components/follower_index_actions_providers/follower_index_unfollow_provider.js
similarity index 97%
rename from x-pack/plugins/cross_cluster_replication/public/app/components/follower_index_unfollow_provider.js
rename to x-pack/plugins/cross_cluster_replication/public/app/components/follower_index_actions_providers/follower_index_unfollow_provider.js
index 68b6b970ad90b..f9644aa20c2c2 100644
--- a/x-pack/plugins/cross_cluster_replication/public/app/components/follower_index_unfollow_provider.js
+++ b/x-pack/plugins/cross_cluster_replication/public/app/components/follower_index_actions_providers/follower_index_unfollow_provider.js
@@ -11,8 +11,8 @@ import { i18n } from '@kbn/i18n';
import { FormattedMessage } from '@kbn/i18n/react';
import { EuiConfirmModal, EuiOverlayMask } from '@elastic/eui';
-import { unfollowLeaderIndex } from '../store/actions';
-import { arrify } from '../../../common/services/utils';
+import { unfollowLeaderIndex } from '../../store/actions';
+import { arrify } from '../../../../common/services/utils';
class FollowerIndexUnfollowProviderUi extends PureComponent {
static propTypes = {
diff --git a/x-pack/plugins/cross_cluster_replication/public/app/components/follower_index_actions_providers/index.js b/x-pack/plugins/cross_cluster_replication/public/app/components/follower_index_actions_providers/index.js
new file mode 100644
index 0000000000000..fe1a7d82a56a1
--- /dev/null
+++ b/x-pack/plugins/cross_cluster_replication/public/app/components/follower_index_actions_providers/index.js
@@ -0,0 +1,10 @@
+/*
+ * 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.
+ */
+
+export { FollowerIndexActionsProvider } from './follower_index_actions_provider';
+export { FollowerIndexPauseProvider } from './follower_index_pause_provider';
+export { FollowerIndexResumeProvider } from './follower_index_resume_provider';
+export { FollowerIndexUnfollowProvider } from './follower_index_unfollow_provider';
diff --git a/x-pack/plugins/cross_cluster_replication/public/app/components/index.js b/x-pack/plugins/cross_cluster_replication/public/app/components/index.js
index 6d971bff03981..55609fa85fb11 100644
--- a/x-pack/plugins/cross_cluster_replication/public/app/components/index.js
+++ b/x-pack/plugins/cross_cluster_replication/public/app/components/index.js
@@ -12,9 +12,10 @@ export { AutoFollowPatternForm } from './auto_follow_pattern_form';
export { AutoFollowPatternDeleteProvider } from './auto_follow_pattern_delete_provider';
export { AutoFollowPatternPageTitle } from './auto_follow_pattern_page_title';
export { AutoFollowPatternIndicesPreview } from './auto_follow_pattern_indices_preview';
-export { FollowerIndexPauseProvider } from './follower_index_pause_provider';
-export { FollowerIndexResumeProvider } from './follower_index_resume_provider';
-export { FollowerIndexUnfollowProvider } from './follower_index_unfollow_provider';
+export { FollowerIndexPauseProvider } from './follower_index_actions_providers';
+export { FollowerIndexResumeProvider } from './follower_index_actions_providers';
+export { FollowerIndexUnfollowProvider } from './follower_index_actions_providers';
+export { FollowerIndexActionsProvider } from './follower_index_actions_providers';
export { FollowerIndexForm } from './follower_index_form';
export { FollowerIndexPageTitle } from './follower_index_page_title';
export { FormEntryRow } from './form_entry_row';
diff --git a/x-pack/plugins/cross_cluster_replication/public/app/sections/home/auto_follow_pattern_list/components/auto_follow_pattern_table/auto_follow_pattern_table.js b/x-pack/plugins/cross_cluster_replication/public/app/sections/home/auto_follow_pattern_list/components/auto_follow_pattern_table/auto_follow_pattern_table.js
index 2309dece3f92b..dd5fe6f212808 100644
--- a/x-pack/plugins/cross_cluster_replication/public/app/sections/home/auto_follow_pattern_list/components/auto_follow_pattern_table/auto_follow_pattern_table.js
+++ b/x-pack/plugins/cross_cluster_replication/public/app/sections/home/auto_follow_pattern_list/components/auto_follow_pattern_table/auto_follow_pattern_table.js
@@ -4,7 +4,7 @@
* you may not use this file except in compliance with the Elastic License.
*/
-import React, { PureComponent, Fragment } from 'react';
+import React, { PureComponent } from 'react';
import PropTypes from 'prop-types';
import { i18n } from '@kbn/i18n';
import {
@@ -13,7 +13,6 @@ import {
EuiLoadingKibana,
EuiOverlayMask,
EuiHealth,
- EuiIcon,
} from '@elastic/eui';
import { API_STATUS, UIM_AUTO_FOLLOW_PATTERN_SHOW_DETAILS_CLICK } from '../../../../../constants';
import {
@@ -23,6 +22,33 @@ import {
import { routing } from '../../../../../services/routing';
import { trackUiMetric } from '../../../../../services/track_ui_metric';
+const actionI18nTexts = {
+ pause: i18n.translate(
+ 'xpack.crossClusterReplication.autoFollowPatternList.table.actionPauseDescription',
+ {
+ defaultMessage: 'Pause replication',
+ }
+ ),
+ resume: i18n.translate(
+ 'xpack.crossClusterReplication.autoFollowPatternList.table.actionResumeDescription',
+ {
+ defaultMessage: 'Resume replication',
+ }
+ ),
+ edit: i18n.translate(
+ 'xpack.crossClusterReplication.autoFollowPatternList.table.actionEditDescription',
+ {
+ defaultMessage: 'Edit auto-follow pattern',
+ }
+ ),
+ delete: i18n.translate(
+ 'xpack.crossClusterReplication.autoFollowPatternList.table.actionDeleteDescription',
+ {
+ defaultMessage: 'Delete auto-follow pattern',
+ }
+ ),
+};
+
const getFilteredPatterns = (autoFollowPatterns, queryText) => {
if (queryText) {
const normalizedSearchText = queryText.toLowerCase();
@@ -93,7 +119,7 @@ export class AutoFollowPatternTable extends PureComponent {
});
};
- getTableColumns() {
+ getTableColumns(deleteAutoFollowPattern) {
const { selectAutoFollowPattern } = this.props;
return [
@@ -200,88 +226,34 @@ export class AutoFollowPatternTable extends PureComponent {
),
actions: [
{
- render: ({ name, active }) => {
- const label = active
- ? i18n.translate(
- 'xpack.crossClusterReplication.autoFollowPatternList.table.actionPauseDescription',
- {
- defaultMessage: 'Pause replication',
- }
- )
- : i18n.translate(
- 'xpack.crossClusterReplication.autoFollowPatternList.table.actionResumeDescription',
- {
- defaultMessage: 'Resume replication',
- }
- );
-
- return (
- {
- if (event.stopPropagation) {
- event.stopPropagation();
- }
- if (active) {
- this.props.pauseAutoFollowPattern(name);
- } else {
- this.props.resumeAutoFollowPattern(name);
- }
- }}
- data-test-subj={active ? 'contextMenuPauseButton' : 'contextMenuResumeButton'}
- >
-
- {label}
-
- );
- },
+ name: actionI18nTexts.pause,
+ description: actionI18nTexts.pause,
+ icon: 'pause',
+ onClick: (item) => this.props.pauseAutoFollowPattern(item.name),
+ available: (item) => item.active,
+ 'data-test-subj': 'contextMenuPauseButton',
},
{
- render: ({ name }) => {
- const label = i18n.translate(
- 'xpack.crossClusterReplication.autoFollowPatternList.table.actionEditDescription',
- {
- defaultMessage: 'Edit auto-follow pattern',
- }
- );
-
- return (
- routing.navigate(routing.getAutoFollowPatternPath(name))}
- data-test-subj="contextMenuEditButton"
- >
-
- {label}
-
- );
- },
+ name: actionI18nTexts.resume,
+ description: actionI18nTexts.resume,
+ icon: 'play',
+ onClick: (item) => this.props.resumeAutoFollowPattern(item.name),
+ available: (item) => !item.active,
+ 'data-test-subj': 'contextMenuResumeButton',
},
{
- render: ({ name }) => {
- const label = i18n.translate(
- 'xpack.crossClusterReplication.autoFollowPatternList.table.actionDeleteDescription',
- {
- defaultMessage: 'Delete auto-follow pattern',
- }
- );
-
- return (
-
- {(deleteAutoFollowPattern) => (
- deleteAutoFollowPattern(name)}
- data-test-subj="contextMenuDeleteButton"
- >
-
- {label}
-
- )}
-
- );
- },
+ name: actionI18nTexts.edit,
+ description: actionI18nTexts.edit,
+ icon: 'pencil',
+ onClick: (item) => routing.navigate(routing.getAutoFollowPatternPath(item.name)),
+ 'data-test-subj': 'contextMenuEditButton',
+ },
+ {
+ name: actionI18nTexts.delete,
+ description: actionI18nTexts.delete,
+ icon: 'trash',
+ onClick: (item) => deleteAutoFollowPattern(item.name),
+ 'data-test-subj': 'contextMenuDeleteButton',
},
],
width: '100px',
@@ -339,26 +311,30 @@ export class AutoFollowPatternTable extends PureComponent {
};
return (
-
- ({
- 'data-test-subj': 'row',
- })}
- cellProps={(item, column) => ({
- 'data-test-subj': `cell_${column.field}`,
- })}
- data-test-subj="autoFollowPatternListTable"
- />
- {this.renderLoading()}
-
+
+ {(deleteAutoFollowPattern) => (
+ <>
+ ({
+ 'data-test-subj': 'row',
+ })}
+ cellProps={(item, column) => ({
+ 'data-test-subj': `cell_${column.field}`,
+ })}
+ data-test-subj="autoFollowPatternListTable"
+ />
+ {this.renderLoading()}
+ >
+ )}
+
);
}
}
diff --git a/x-pack/plugins/cross_cluster_replication/public/app/sections/home/follower_indices_list/components/follower_indices_table/follower_indices_table.js b/x-pack/plugins/cross_cluster_replication/public/app/sections/home/follower_indices_list/components/follower_indices_table/follower_indices_table.js
index 0c57b3f7330cf..2ea73e272b24e 100644
--- a/x-pack/plugins/cross_cluster_replication/public/app/sections/home/follower_indices_list/components/follower_indices_table/follower_indices_table.js
+++ b/x-pack/plugins/cross_cluster_replication/public/app/sections/home/follower_indices_list/components/follower_indices_table/follower_indices_table.js
@@ -4,12 +4,11 @@
* you may not use this file except in compliance with the Elastic License.
*/
-import React, { PureComponent, Fragment } from 'react';
+import React, { PureComponent } from 'react';
import PropTypes from 'prop-types';
import { i18n } from '@kbn/i18n';
import { FormattedMessage } from '@kbn/i18n/react';
import {
- EuiIcon,
EuiHealth,
EuiInMemoryTable,
EuiLink,
@@ -17,15 +16,38 @@ import {
EuiOverlayMask,
} from '@elastic/eui';
import { API_STATUS, UIM_FOLLOWER_INDEX_SHOW_DETAILS_CLICK } from '../../../../../constants';
-import {
- FollowerIndexPauseProvider,
- FollowerIndexResumeProvider,
- FollowerIndexUnfollowProvider,
-} from '../../../../../components';
+import { FollowerIndexActionsProvider } from '../../../../../components';
import { routing } from '../../../../../services/routing';
import { trackUiMetric } from '../../../../../services/track_ui_metric';
import { ContextMenu } from '../context_menu';
+const actionI18nTexts = {
+ pause: i18n.translate(
+ 'xpack.crossClusterReplication.followerIndexList.table.actionPauseDescription',
+ {
+ defaultMessage: 'Pause replication',
+ }
+ ),
+ resume: i18n.translate(
+ 'xpack.crossClusterReplication.followerIndexList.table.actionResumeDescription',
+ {
+ defaultMessage: 'Resume replication',
+ }
+ ),
+ edit: i18n.translate(
+ 'xpack.crossClusterReplication.followerIndexList.table.actionEditDescription',
+ {
+ defaultMessage: 'Edit follower index',
+ }
+ ),
+ unfollow: i18n.translate(
+ 'xpack.crossClusterReplication.followerIndexList.table.actionUnfollowDescription',
+ {
+ defaultMessage: 'Unfollow leader index',
+ }
+ ),
+};
+
const getFilteredIndices = (followerIndices, queryText) => {
if (queryText) {
const normalizedSearchText = queryText.toLowerCase();
@@ -101,91 +123,43 @@ export class FollowerIndicesTable extends PureComponent {
routing.navigate(uri);
};
- getTableColumns() {
+ getTableColumns(actionHandlers) {
const { selectFollowerIndex } = this.props;
const actions = [
- /* Pause or resume follower index */
+ /* Pause follower index */
{
- render: (followerIndex) => {
- const { name, isPaused } = followerIndex;
- const label = isPaused
- ? i18n.translate(
- 'xpack.crossClusterReplication.followerIndexList.table.actionResumeDescription',
- {
- defaultMessage: 'Resume replication',
- }
- )
- : i18n.translate(
- 'xpack.crossClusterReplication.followerIndexList.table.actionPauseDescription',
- {
- defaultMessage: 'Pause replication',
- }
- );
-
- return isPaused ? (
-
- {(resumeFollowerIndex) => (
- resumeFollowerIndex(name)} data-test-subj="resumeButton">
-
- {label}
-
- )}
-
- ) : (
-
- {(pauseFollowerIndex) => (
- pauseFollowerIndex(followerIndex)}
- data-test-subj="pauseButton"
- >
-
- {label}
-
- )}
-
- );
- },
+ name: actionI18nTexts.pause,
+ description: actionI18nTexts.pause,
+ icon: 'pause',
+ onClick: (item) => actionHandlers.pauseFollowerIndex(item),
+ available: (item) => !item.isPaused,
+ 'data-test-subj': 'pauseButton',
+ },
+ /* Resume follower index */
+ {
+ name: actionI18nTexts.resume,
+ description: actionI18nTexts.resume,
+ icon: 'play',
+ onClick: (item) => actionHandlers.resumeFollowerIndex(item.name),
+ available: (item) => item.isPaused,
+ 'data-test-subj': 'resumeButton',
},
/* Edit follower index */
{
- render: ({ name }) => {
- const label = i18n.translate(
- 'xpack.crossClusterReplication.followerIndexList.table.actionEditDescription',
- {
- defaultMessage: 'Edit follower index',
- }
- );
-
- return (
- this.editFollowerIndex(name)} data-test-subj="editButton">
-
- {label}
-
- );
- },
+ name: actionI18nTexts.edit,
+ description: actionI18nTexts.edit,
+ onClick: (item) => this.editFollowerIndex(item.name),
+ icon: 'pencil',
+ 'data-test-subj': 'editButton',
},
/* Unfollow leader index */
{
- render: ({ name }) => {
- const label = i18n.translate(
- 'xpack.crossClusterReplication.followerIndexList.table.actionUnfollowDescription',
- {
- defaultMessage: 'Unfollow leader index',
- }
- );
-
- return (
-
- {(unfollowLeaderIndex) => (
- unfollowLeaderIndex(name)} data-test-subj="unfollowButton">
-
- {label}
-
- )}
-
- );
- },
+ name: actionI18nTexts.unfollow,
+ description: actionI18nTexts.unfollow,
+ onClick: (item) => actionHandlers.unfollowLeaderIndex(item.name),
+ icon: 'indexFlush',
+ 'data-test-subj': 'unfollowButton',
},
];
@@ -321,26 +295,33 @@ export class FollowerIndicesTable extends PureComponent {
};
return (
-
- ({
- 'data-test-subj': 'row',
- })}
- cellProps={(item, column) => ({
- 'data-test-subj': `cell-${column.field}`,
- })}
- data-test-subj="followerIndexListTable"
- />
- {this.renderLoading()}
-
+
+ {(getActionHandlers) => {
+ const actionHandlers = getActionHandlers();
+ return (
+ <>
+ ({
+ 'data-test-subj': 'row',
+ })}
+ cellProps={(item, column) => ({
+ 'data-test-subj': `cell-${column.field}`,
+ })}
+ data-test-subj="followerIndexListTable"
+ />
+ {this.renderLoading()}
+ >
+ );
+ }}
+
);
}
}