diff --git a/x-pack/plugins/index_lifecycle_management/public/application/sections/policy_table/components/policy_table/confirm_delete.js b/x-pack/plugins/index_lifecycle_management/public/application/sections/policy_table/components/confirm_delete.tsx
similarity index 85%
rename from x-pack/plugins/index_lifecycle_management/public/application/sections/policy_table/components/policy_table/confirm_delete.js
rename to x-pack/plugins/index_lifecycle_management/public/application/sections/policy_table/components/confirm_delete.tsx
index 0ecc9cc13ecd0..8d8e5ac2a2472 100644
--- a/x-pack/plugins/index_lifecycle_management/public/application/sections/policy_table/components/policy_table/confirm_delete.js
+++ b/x-pack/plugins/index_lifecycle_management/public/application/sections/policy_table/components/confirm_delete.tsx
@@ -9,11 +9,17 @@ import { i18n } from '@kbn/i18n';
import { FormattedMessage } from '@kbn/i18n/react';
import { EuiOverlayMask, EuiConfirmModal } from '@elastic/eui';
-import { toasts } from '../../../../services/notification';
-import { deletePolicy } from '../../../../services/api';
-import { showApiError } from '../../../../services/api_errors';
+import { PolicyFromES } from '../../../services/policies/types';
+import { toasts } from '../../../services/notification';
+import { showApiError } from '../../../services/api_errors';
+import { deletePolicy } from '../../../services/api';
-export class ConfirmDelete extends Component {
+interface Props {
+ policyToDelete: PolicyFromES;
+ callback: () => void;
+ onCancel: () => void;
+}
+export class ConfirmDelete extends Component {
deletePolicy = async () => {
const { policyToDelete, callback } = this.props;
const policyName = policyToDelete.name;
@@ -61,7 +67,6 @@ export class ConfirmDelete extends Component {
/>
}
buttonColor="danger"
- onClose={onCancel}
>
(
-
-
-
-);
diff --git a/x-pack/plugins/index_lifecycle_management/public/application/sections/policy_table/components/no_match/index.js b/x-pack/plugins/index_lifecycle_management/public/application/sections/policy_table/components/no_match/index.js
deleted file mode 100644
index 63e8cdebd9771..0000000000000
--- a/x-pack/plugins/index_lifecycle_management/public/application/sections/policy_table/components/no_match/index.js
+++ /dev/null
@@ -1,7 +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;
- * you may not use this file except in compliance with the Elastic License.
- */
-
-export { NoMatch } from './components/no_match';
diff --git a/x-pack/plugins/index_lifecycle_management/public/application/sections/policy_table/components/policy_table/policy_table.container.js b/x-pack/plugins/index_lifecycle_management/public/application/sections/policy_table/components/policy_table/policy_table.container.js
deleted file mode 100644
index 8bd78774d2d55..0000000000000
--- a/x-pack/plugins/index_lifecycle_management/public/application/sections/policy_table/components/policy_table/policy_table.container.js
+++ /dev/null
@@ -1,59 +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;
- * you may not use this file except in compliance with the Elastic License.
- */
-
-import { connect } from 'react-redux';
-
-import {
- fetchPolicies,
- policyFilterChanged,
- policyPageChanged,
- policyPageSizeChanged,
- policySortChanged,
-} from '../../../../store/actions';
-
-import {
- getPolicies,
- getPageOfPolicies,
- getPolicyPager,
- getPolicyFilter,
- getPolicySort,
- isPolicyListLoaded,
-} from '../../../../store/selectors';
-
-import { PolicyTable as PresentationComponent } from './policy_table';
-
-const mapDispatchToProps = (dispatch) => {
- return {
- policyFilterChanged: (filter) => {
- dispatch(policyFilterChanged({ filter }));
- },
- policyPageChanged: (pageNumber) => {
- dispatch(policyPageChanged({ pageNumber }));
- },
- policyPageSizeChanged: (pageSize) => {
- dispatch(policyPageSizeChanged({ pageSize }));
- },
- policySortChanged: (sortField, isSortAscending) => {
- dispatch(policySortChanged({ sortField, isSortAscending }));
- },
- fetchPolicies: (withIndices) => {
- dispatch(fetchPolicies(withIndices));
- },
- };
-};
-
-export const PolicyTable = connect(
- (state) => ({
- totalNumberOfPolicies: getPolicies(state).length,
- policies: getPageOfPolicies(state),
- pager: getPolicyPager(state),
- filter: getPolicyFilter(state),
- sortField: getPolicySort(state).sortField,
- isSortAscending: getPolicySort(state).isSortAscending,
- policyListLoaded: isPolicyListLoaded(state),
- }),
- mapDispatchToProps
-)(PresentationComponent);
diff --git a/x-pack/plugins/index_lifecycle_management/public/application/sections/policy_table/components/policy_table/policy_table.js b/x-pack/plugins/index_lifecycle_management/public/application/sections/policy_table/components/policy_table/policy_table.js
deleted file mode 100644
index ec1cdb987f4b3..0000000000000
--- a/x-pack/plugins/index_lifecycle_management/public/application/sections/policy_table/components/policy_table/policy_table.js
+++ /dev/null
@@ -1,530 +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;
- * you may not use this file except in compliance with the Elastic License.
- */
-
-import React, { Component, Fragment } from 'react';
-import moment from 'moment-timezone';
-import { i18n } from '@kbn/i18n';
-import { FormattedMessage } from '@kbn/i18n/react';
-
-import {
- EuiButton,
- EuiButtonEmpty,
- EuiLink,
- EuiEmptyPrompt,
- EuiFieldSearch,
- EuiFlexGroup,
- EuiFlexItem,
- EuiLoadingSpinner,
- EuiPopover,
- EuiContextMenu,
- EuiSpacer,
- EuiTable,
- EuiTableBody,
- EuiTableHeader,
- EuiTableHeaderCell,
- EuiTablePagination,
- EuiTableRow,
- EuiTableRowCell,
- EuiTitle,
- EuiText,
- EuiPageBody,
- EuiPageContent,
- EuiScreenReaderOnly,
-} from '@elastic/eui';
-
-import { RIGHT_ALIGNMENT } from '@elastic/eui/lib/services';
-import { reactRouterNavigate } from '../../../../../../../../../src/plugins/kibana_react/public';
-import { getIndexListUri } from '../../../../../../../index_management/public';
-import { UIM_EDIT_CLICK } from '../../../../constants/ui_metric';
-import { getPolicyPath } from '../../../../services/navigation';
-import { flattenPanelTree } from '../../../../services/flatten_panel_tree';
-import { trackUiMetric } from '../../../../services/ui_metric';
-import { NoMatch } from '../no_match';
-import { ConfirmDelete } from './confirm_delete';
-import { AddPolicyToTemplateConfirmModal } from './add_policy_to_template_confirm_modal';
-
-const COLUMNS = {
- name: {
- label: i18n.translate('xpack.indexLifecycleMgmt.policyTable.headers.nameHeader', {
- defaultMessage: 'Name',
- }),
- width: 200,
- },
- linkedIndices: {
- label: i18n.translate('xpack.indexLifecycleMgmt.policyTable.headers.linkedIndicesHeader', {
- defaultMessage: 'Linked indices',
- }),
- width: 120,
- },
- version: {
- label: i18n.translate('xpack.indexLifecycleMgmt.policyTable.headers.versionHeader', {
- defaultMessage: 'Version',
- }),
- width: 120,
- },
- modified_date: {
- label: i18n.translate('xpack.indexLifecycleMgmt.policyTable.headers.modifiedDateHeader', {
- defaultMessage: 'Modified date',
- }),
- width: 200,
- },
-};
-
-export class PolicyTable extends Component {
- constructor(props) {
- super(props);
-
- this.state = {
- selectedPoliciesMap: {},
- renderConfirmModal: null,
- };
- }
- componentDidMount() {
- this.props.fetchPolicies(true);
- }
- renderEmpty() {
- return (
-
-
-
- }
- body={
-
-
-
-
-
- }
- actions={this.renderCreatePolicyButton()}
- />
- );
- }
- renderDeleteConfirmModal = () => {
- const { policyToDelete } = this.state;
- if (!policyToDelete) {
- return null;
- }
- return (
- this.setState({ renderConfirmModal: null, policyToDelete: null })}
- />
- );
- };
- renderAddPolicyToTemplateConfirmModal = () => {
- const { policyToAddToTemplate } = this.state;
- if (!policyToAddToTemplate) {
- return null;
- }
- return (
- this.setState({ renderConfirmModal: null, policyToAddToTemplate: null })}
- />
- );
- };
- handleDelete = () => {
- this.props.fetchPolicies(true);
- this.setState({ renderDeleteConfirmModal: null, policyToDelete: null });
- };
- onSort = (column) => {
- const { sortField, isSortAscending, policySortChanged } = this.props;
- const newIsSortAscending = sortField === column ? !isSortAscending : true;
- policySortChanged(column, newIsSortAscending);
- };
-
- buildHeader() {
- const { sortField, isSortAscending } = this.props;
- const headers = Object.entries(COLUMNS).map(([fieldName, { label, width }]) => {
- const isSorted = sortField === fieldName;
- return (
- this.onSort(fieldName)}
- isSorted={isSorted}
- isSortAscending={isSortAscending}
- data-test-subj={`policyTableHeaderCell-${fieldName}`}
- className={'policyTable__header--' + fieldName}
- width={width}
- >
- {label}
-
- );
- });
- headers.push(
-
- );
- return headers;
- }
-
- buildRowCell(fieldName, value) {
- if (fieldName === 'name') {
- return (
- /* eslint-disable-next-line @elastic/eui/href-or-on-click */
-
- trackUiMetric('click', UIM_EDIT_CLICK)
- )}
- >
- {value}
-
- );
- } else if (fieldName === 'linkedIndices') {
- return (
-
- {value ? value.length : '0'}
-
- );
- } else if (fieldName === 'modified_date' && value) {
- return moment(value).format('YYYY-MM-DD HH:mm:ss');
- }
- return value;
- }
- renderCreatePolicyButton() {
- return (
-
-
-
- );
- }
- renderConfirmModal() {
- const { renderConfirmModal } = this.state;
- if (renderConfirmModal) {
- return renderConfirmModal();
- } else {
- return null;
- }
- }
- buildActionPanelTree(policy) {
- const hasLinkedIndices = Boolean(policy.linkedIndices && policy.linkedIndices.length);
-
- const viewIndicesLabel = i18n.translate(
- 'xpack.indexLifecycleMgmt.policyTable.viewIndicesButtonText',
- {
- defaultMessage: 'View indices linked to policy',
- }
- );
- const addPolicyToTemplateLabel = i18n.translate(
- 'xpack.indexLifecycleMgmt.policyTable.addPolicyToTemplateButtonText',
- {
- defaultMessage: 'Add policy to index template',
- }
- );
- const deletePolicyLabel = i18n.translate(
- 'xpack.indexLifecycleMgmt.policyTable.deletePolicyButtonText',
- {
- defaultMessage: 'Delete policy',
- }
- );
- const deletePolicyTooltip = hasLinkedIndices
- ? i18n.translate('xpack.indexLifecycleMgmt.policyTable.deletePolicyButtonDisabledTooltip', {
- defaultMessage: 'You cannot delete a policy that is being used by an index',
- })
- : null;
- const items = [];
- if (hasLinkedIndices) {
- items.push({
- name: viewIndicesLabel,
- icon: 'list',
- onClick: () => {
- this.props.navigateToApp('management', {
- path: `/data/index_management${getIndexListUri(`ilm.policy:${policy.name}`, true)}`,
- });
- },
- });
- }
- items.push({
- name: addPolicyToTemplateLabel,
- icon: 'plusInCircle',
- onClick: () =>
- this.setState({
- renderConfirmModal: this.renderAddPolicyToTemplateConfirmModal,
- policyToAddToTemplate: policy,
- }),
- });
- items.push({
- name: deletePolicyLabel,
- disabled: hasLinkedIndices,
- icon: 'trash',
- toolTipContent: deletePolicyTooltip,
- onClick: () =>
- this.setState({
- renderConfirmModal: this.renderDeleteConfirmModal,
- policyToDelete: policy,
- }),
- });
- const panelTree = {
- id: 0,
- title: i18n.translate('xpack.indexLifecycleMgmt.policyTable.policyActionsMenu.panelTitle', {
- defaultMessage: 'Policy options',
- }),
- items,
- };
- return flattenPanelTree(panelTree);
- }
- togglePolicyPopover = (policy) => {
- if (this.isPolicyPopoverOpen(policy)) {
- this.closePolicyPopover(policy);
- } else {
- this.openPolicyPopover(policy);
- }
- };
- isPolicyPopoverOpen = (policy) => {
- return this.state.policyPopover === policy.name;
- };
- closePolicyPopover = (policy) => {
- if (this.isPolicyPopoverOpen(policy)) {
- this.setState({ policyPopover: null });
- }
- };
- openPolicyPopover = (policy) => {
- this.setState({ policyPopover: policy.name });
- };
- buildRowCells(policy) {
- const { name } = policy;
- const cells = Object.entries(COLUMNS).map(([fieldName, { width }]) => {
- const value = policy[fieldName];
-
- if (fieldName === 'name') {
- return (
-
-
- {this.buildRowCell(fieldName, value)}
-
- |
- );
- }
-
- return (
-
- {this.buildRowCell(fieldName, value)}
-
- );
- });
- const button = (
- this.togglePolicyPopover(policy)}
- color="primary"
- >
- {i18n.translate('xpack.indexLifecycleMgmt.policyTable.actionsButtonText', {
- defaultMessage: 'Actions',
- })}
-
- );
- cells.push(
-
-
-
- );
- return cells;
- }
-
- buildRows() {
- const { policies = [] } = this.props;
- return policies.map((policy) => {
- const { name } = policy;
- return {this.buildRowCells(policy)};
- });
- }
-
- renderPager() {
- const { pager, policyPageChanged, policyPageSizeChanged } = this.props;
- return (
-
- );
- }
-
- onItemSelectionChanged = (selectedPolicies) => {
- this.setState({ selectedPolicies });
- };
-
- render() {
- const {
- totalNumberOfPolicies,
- policyFilterChanged,
- filter,
- policyListLoaded,
- policies,
- } = this.props;
- const { selectedPoliciesMap } = this.state;
- const numSelected = Object.keys(selectedPoliciesMap).length;
- let content;
- let tableContent;
- if (totalNumberOfPolicies || !policyListLoaded) {
- if (!policyListLoaded) {
- tableContent = ;
- } else if (totalNumberOfPolicies > 0) {
- tableContent = (
-
-
-
-
-
-
- {this.buildHeader()}
- {this.buildRows()}
-
- );
- } else {
- tableContent = ;
- }
- content = (
-
-
- {numSelected > 0 ? (
-
- this.setState({ showDeleteConfirmation: true })}
- >
-
-
-
- ) : null}
-
- {
- policyFilterChanged(event.target.value);
- }}
- data-test-subj="policyTableFilterInput"
- placeholder={i18n.translate(
- 'xpack.indexLifecycleMgmt.policyTable.systempoliciesSearchInputPlaceholder',
- {
- defaultMessage: 'Search',
- }
- )}
- aria-label={i18n.translate(
- 'xpack.indexLifecycleMgmt.policyTable.systempoliciesSearchInputAriaLabel',
- {
- defaultMessage: 'Search policies',
- }
- )}
- />
-
-
-
- {tableContent}
-
- );
- } else {
- content = this.renderEmpty();
- }
-
- return (
-
-
-
- {this.renderConfirmModal()}
- {totalNumberOfPolicies || !policyListLoaded ? (
-
-
-
-
-
-
-
-
-
- {totalNumberOfPolicies ? (
- {this.renderCreatePolicyButton()}
- ) : null}
-
-
-
-
-
-
-
-
- ) : null}
-
- {content}
-
- {totalNumberOfPolicies && totalNumberOfPolicies > 10 ? this.renderPager() : null}
-
-
-
- );
- }
-}
diff --git a/x-pack/plugins/index_lifecycle_management/public/application/sections/policy_table/components/table_content.tsx b/x-pack/plugins/index_lifecycle_management/public/application/sections/policy_table/components/table_content.tsx
new file mode 100644
index 0000000000000..da36ff4df98f5
--- /dev/null
+++ b/x-pack/plugins/index_lifecycle_management/public/application/sections/policy_table/components/table_content.tsx
@@ -0,0 +1,376 @@
+/*
+ * 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, { ReactElement, useState, Fragment, ReactNode } from 'react';
+import {
+ EuiButtonEmpty,
+ EuiContextMenu,
+ EuiLink,
+ EuiPopover,
+ EuiScreenReaderOnly,
+ EuiSpacer,
+ EuiTable,
+ EuiTableBody,
+ EuiTableHeader,
+ EuiTableHeaderCell,
+ EuiTablePagination,
+ EuiTableRow,
+ EuiTableRowCell,
+ EuiText,
+ Pager,
+ EuiContextMenuPanelDescriptor,
+} from '@elastic/eui';
+
+import { i18n } from '@kbn/i18n';
+import { FormattedMessage } from '@kbn/i18n/react';
+import { RIGHT_ALIGNMENT } from '@elastic/eui/lib/services';
+
+import moment from 'moment';
+import { ApplicationStart } from 'kibana/public';
+import { METRIC_TYPE } from '@kbn/analytics';
+import { RouteComponentProps } from 'react-router-dom';
+import { reactRouterNavigate } from '../../../../../../../../src/plugins/kibana_react/public';
+import { getIndexListUri } from '../../../../../../index_management/public';
+import { PolicyFromES } from '../../../services/policies/types';
+import { getPolicyPath } from '../../../services/navigation';
+import { sortTable } from '../../../services';
+import { trackUiMetric } from '../../../services/ui_metric';
+
+import { UIM_EDIT_CLICK } from '../../../constants';
+import { AddPolicyToTemplateConfirmModal } from './add_policy_to_template_confirm_modal';
+import { ConfirmDelete } from './confirm_delete';
+
+type PolicyProperty = Extract<
+ keyof PolicyFromES,
+ 'version' | 'name' | 'linkedIndices' | 'modified_date'
+>;
+const COLUMNS: Array<[PolicyProperty, { label: string; width: number }]> = [
+ [
+ 'name',
+ {
+ label: i18n.translate('xpack.indexLifecycleMgmt.policyTable.headers.nameHeader', {
+ defaultMessage: 'Name',
+ }),
+ width: 200,
+ },
+ ],
+ [
+ 'linkedIndices',
+ {
+ label: i18n.translate('xpack.indexLifecycleMgmt.policyTable.headers.linkedIndicesHeader', {
+ defaultMessage: 'Linked indices',
+ }),
+ width: 120,
+ },
+ ],
+ [
+ 'version',
+ {
+ label: i18n.translate('xpack.indexLifecycleMgmt.policyTable.headers.versionHeader', {
+ defaultMessage: 'Version',
+ }),
+ width: 120,
+ },
+ ],
+ [
+ 'modified_date',
+ {
+ label: i18n.translate('xpack.indexLifecycleMgmt.policyTable.headers.modifiedDateHeader', {
+ defaultMessage: 'Modified date',
+ }),
+ width: 200,
+ },
+ ],
+];
+
+interface Props {
+ policies: PolicyFromES[];
+ totalNumber: number;
+ navigateToApp: ApplicationStart['navigateToApp'];
+ setConfirmModal: (modal: ReactElement | null) => void;
+ handleDelete: () => void;
+ history: RouteComponentProps['history'];
+}
+export const TableContent: React.FunctionComponent = ({
+ policies,
+ totalNumber,
+ navigateToApp,
+ setConfirmModal,
+ handleDelete,
+ history,
+}) => {
+ const [popoverPolicy, setPopoverPolicy] = useState();
+ const [sort, setSort] = useState<{ sortField: PolicyProperty; isSortAscending: boolean }>({
+ sortField: 'name',
+ isSortAscending: true,
+ });
+ const [pageSize, setPageSize] = useState(10);
+ const [currentPage, setCurrentPage] = useState(0);
+
+ let sortedPolicies = sortTable(policies, sort.sortField, sort.isSortAscending);
+ const pager = new Pager(totalNumber, pageSize, currentPage);
+ const { firstItemIndex, lastItemIndex } = pager;
+ sortedPolicies = sortedPolicies.slice(firstItemIndex, lastItemIndex + 1);
+
+ const isPolicyPopoverOpen = (policyName: string): boolean => popoverPolicy === policyName;
+ const closePolicyPopover = (): void => {
+ setPopoverPolicy('');
+ };
+ const openPolicyPopover = (policyName: string): void => {
+ setPopoverPolicy(policyName);
+ };
+ const togglePolicyPopover = (policyName: string): void => {
+ if (isPolicyPopoverOpen(policyName)) {
+ closePolicyPopover();
+ } else {
+ openPolicyPopover(policyName);
+ }
+ };
+
+ const onSort = (column: PolicyProperty) => {
+ const newIsSortAscending = sort.sortField === column ? !sort.isSortAscending : true;
+ setSort({ sortField: column, isSortAscending: newIsSortAscending });
+ };
+
+ const headers = [];
+ COLUMNS.forEach(([fieldName, { label, width }]) => {
+ const isSorted = sort.sortField === fieldName;
+ headers.push(
+ onSort(fieldName)}
+ isSorted={isSorted}
+ isSortAscending={sort.isSortAscending}
+ data-test-subj={`policyTableHeaderCell-${fieldName}`}
+ className={'policyTable__header--' + fieldName}
+ width={width}
+ >
+ {label}
+
+ );
+ });
+ headers.push(
+
+ );
+
+ const buildActionPanelTree = (policy: PolicyFromES): EuiContextMenuPanelDescriptor[] => {
+ const hasLinkedIndices = Boolean(policy.linkedIndices && policy.linkedIndices.length);
+
+ const viewIndicesLabel = i18n.translate(
+ 'xpack.indexLifecycleMgmt.policyTable.viewIndicesButtonText',
+ {
+ defaultMessage: 'View indices linked to policy',
+ }
+ );
+ const addPolicyToTemplateLabel = i18n.translate(
+ 'xpack.indexLifecycleMgmt.policyTable.addPolicyToTemplateButtonText',
+ {
+ defaultMessage: 'Add policy to index template',
+ }
+ );
+ const deletePolicyLabel = i18n.translate(
+ 'xpack.indexLifecycleMgmt.policyTable.deletePolicyButtonText',
+ {
+ defaultMessage: 'Delete policy',
+ }
+ );
+ const deletePolicyTooltip = hasLinkedIndices
+ ? i18n.translate('xpack.indexLifecycleMgmt.policyTable.deletePolicyButtonDisabledTooltip', {
+ defaultMessage: 'You cannot delete a policy that is being used by an index',
+ })
+ : null;
+ const items = [];
+ if (hasLinkedIndices) {
+ items.push({
+ name: viewIndicesLabel,
+ icon: 'list',
+ onClick: () => {
+ navigateToApp('management', {
+ path: `/data/index_management${getIndexListUri(`ilm.policy:${policy.name}`, true)}`,
+ });
+ },
+ });
+ }
+ items.push({
+ name: addPolicyToTemplateLabel,
+ icon: 'plusInCircle',
+ onClick: () => {
+ setConfirmModal(renderAddPolicyToTemplateConfirmModal(policy));
+ },
+ });
+ items.push({
+ name: deletePolicyLabel,
+ disabled: hasLinkedIndices,
+ icon: 'trash',
+ toolTipContent: deletePolicyTooltip,
+ onClick: () => {
+ setConfirmModal(renderDeleteConfirmModal(policy));
+ },
+ });
+ const panelTree = {
+ id: 0,
+ title: i18n.translate('xpack.indexLifecycleMgmt.policyTable.policyActionsMenu.panelTitle', {
+ defaultMessage: 'Policy options',
+ }),
+ items,
+ };
+ return [panelTree];
+ };
+
+ const renderRowCell = (fieldName: string, value: string | number | string[]): ReactNode => {
+ if (fieldName === 'name') {
+ return (
+
+ trackUiMetric(METRIC_TYPE.CLICK, UIM_EDIT_CLICK)
+ )}
+ >
+ {value}
+
+ );
+ } else if (fieldName === 'linkedIndices') {
+ return (
+
+ {value ? (value as string[]).length : '0'}
+
+ );
+ } else if (fieldName === 'modified_date' && value) {
+ return moment(value).format('YYYY-MM-DD HH:mm:ss');
+ }
+ return value;
+ };
+
+ const renderRowCells = (policy: PolicyFromES): ReactElement[] => {
+ const { name } = policy;
+ const cells = [];
+ COLUMNS.forEach(([fieldName, { width }]) => {
+ const value: any = policy[fieldName];
+
+ if (fieldName === 'name') {
+ cells.push(
+
+
+ {renderRowCell(fieldName, value)}
+
+ |
+ );
+ } else {
+ cells.push(
+
+ {renderRowCell(fieldName, value)}
+
+ );
+ }
+ });
+ const button = (
+ togglePolicyPopover(policy.name)}
+ color="primary"
+ >
+ {i18n.translate('xpack.indexLifecycleMgmt.policyTable.actionsButtonText', {
+ defaultMessage: 'Actions',
+ })}
+
+ );
+ cells.push(
+
+
+
+ );
+ return cells;
+ };
+
+ const rows = sortedPolicies.map((policy) => {
+ const { name } = policy;
+ return {renderRowCells(policy)};
+ });
+
+ const renderAddPolicyToTemplateConfirmModal = (policy: PolicyFromES): ReactElement => {
+ return (
+ setConfirmModal(null)} />
+ );
+ };
+
+ const renderDeleteConfirmModal = (policy: PolicyFromES): ReactElement => {
+ return (
+ {
+ setConfirmModal(null);
+ }}
+ />
+ );
+ };
+
+ const renderPager = (): ReactNode => {
+ return (
+
+ );
+ };
+
+ return (
+
+
+
+
+
+
+
+ {headers}
+ {rows}
+
+
+ {policies.length > 10 ? renderPager() : null}
+
+ );
+};
diff --git a/x-pack/plugins/index_lifecycle_management/public/application/sections/policy_table/index.d.ts b/x-pack/plugins/index_lifecycle_management/public/application/sections/policy_table/index.d.ts
deleted file mode 100644
index fa1b1129523eb..0000000000000
--- a/x-pack/plugins/index_lifecycle_management/public/application/sections/policy_table/index.d.ts
+++ /dev/null
@@ -1,7 +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;
- * you may not use this file except in compliance with the Elastic License.
- */
-
-export declare const PolicyTable: any;
diff --git a/x-pack/plugins/index_lifecycle_management/public/application/sections/policy_table/index.js b/x-pack/plugins/index_lifecycle_management/public/application/sections/policy_table/index.js
deleted file mode 100644
index c4aa32f1f7dc2..0000000000000
--- a/x-pack/plugins/index_lifecycle_management/public/application/sections/policy_table/index.js
+++ /dev/null
@@ -1,7 +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;
- * you may not use this file except in compliance with the Elastic License.
- */
-
-export { PolicyTable } from './components/policy_table';
diff --git a/x-pack/plugins/index_lifecycle_management/public/application/sections/policy_table/components/policy_table/index.js b/x-pack/plugins/index_lifecycle_management/public/application/sections/policy_table/index.ts
similarity index 100%
rename from x-pack/plugins/index_lifecycle_management/public/application/sections/policy_table/components/policy_table/index.js
rename to x-pack/plugins/index_lifecycle_management/public/application/sections/policy_table/index.ts
diff --git a/x-pack/plugins/index_lifecycle_management/public/application/sections/policy_table/policy_table.container.tsx b/x-pack/plugins/index_lifecycle_management/public/application/sections/policy_table/policy_table.container.tsx
new file mode 100644
index 0000000000000..f6471ff2da4d3
--- /dev/null
+++ b/x-pack/plugins/index_lifecycle_management/public/application/sections/policy_table/policy_table.container.tsx
@@ -0,0 +1,75 @@
+/*
+ * 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 { ApplicationStart } from 'kibana/public';
+import { RouteComponentProps } from 'react-router-dom';
+import { EuiButton, EuiEmptyPrompt, EuiLoadingSpinner } from '@elastic/eui';
+import { FormattedMessage } from '@kbn/i18n/react';
+import { PolicyTable as PresentationComponent } from './policy_table';
+import { useLoadPoliciesList } from '../../services/api';
+
+interface Props {
+ navigateToApp: ApplicationStart['navigateToApp'];
+}
+
+export const PolicyTable: React.FunctionComponent = ({
+ navigateToApp,
+ history,
+}) => {
+ const { data: policies, isLoading, error, sendRequest } = useLoadPoliciesList(true);
+
+ if (isLoading) {
+ return (
+ }
+ body={
+
+ }
+ />
+ );
+ }
+ if (error) {
+ const { statusCode, message } = error ? error : { statusCode: '', message: '' };
+ return (
+
+
+
+ }
+ body={
+
+ {message} ({statusCode})
+
+ }
+ actions={
+
+
+
+ }
+ />
+ );
+ }
+
+ return (
+
+ );
+};
diff --git a/x-pack/plugins/index_lifecycle_management/public/application/sections/policy_table/policy_table.tsx b/x-pack/plugins/index_lifecycle_management/public/application/sections/policy_table/policy_table.tsx
new file mode 100644
index 0000000000000..048ab922a65b5
--- /dev/null
+++ b/x-pack/plugins/index_lifecycle_management/public/application/sections/policy_table/policy_table.tsx
@@ -0,0 +1,183 @@
+/*
+ * 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, { Fragment, ReactElement, ReactNode, useState } from 'react';
+import { i18n } from '@kbn/i18n';
+import { FormattedMessage } from '@kbn/i18n/react';
+
+import {
+ EuiButton,
+ EuiEmptyPrompt,
+ EuiFieldSearch,
+ EuiFlexGroup,
+ EuiFlexItem,
+ EuiSpacer,
+ EuiTitle,
+ EuiText,
+ EuiPageBody,
+ EuiPageContent,
+} from '@elastic/eui';
+import { ApplicationStart } from 'kibana/public';
+import { RouteComponentProps } from 'react-router-dom';
+import { reactRouterNavigate } from '../../../../../../../src/plugins/kibana_react/public';
+import { PolicyFromES } from '../../services/policies/types';
+import { filterItems } from '../../services';
+import { TableContent } from './components/table_content';
+
+interface Props {
+ policies: PolicyFromES[];
+ history: RouteComponentProps['history'];
+ navigateToApp: ApplicationStart['navigateToApp'];
+ updatePolicies: () => void;
+}
+
+export const PolicyTable: React.FunctionComponent = ({
+ policies,
+ history,
+ navigateToApp,
+ updatePolicies,
+}) => {
+ const [confirmModal, setConfirmModal] = useState();
+ const [filter, setFilter] = useState('');
+
+ const createPolicyButton = (
+
+
+
+ );
+
+ let content: ReactElement;
+
+ if (policies.length > 0) {
+ const filteredPolicies = filterItems('name', filter, policies);
+ let tableContent: ReactElement;
+ if (filteredPolicies.length > 0) {
+ tableContent = (
+ {
+ updatePolicies();
+ setConfirmModal(null);
+ }}
+ history={history}
+ />
+ );
+ } else {
+ tableContent = (
+
+ );
+ }
+
+ content = (
+
+
+
+ {
+ setFilter(event.target.value);
+ }}
+ data-test-subj="policyTableFilterInput"
+ placeholder={i18n.translate(
+ 'xpack.indexLifecycleMgmt.policyTable.systempoliciesSearchInputPlaceholder',
+ {
+ defaultMessage: 'Search',
+ }
+ )}
+ aria-label={i18n.translate(
+ 'xpack.indexLifecycleMgmt.policyTable.systempoliciesSearchInputAriaLabel',
+ {
+ defaultMessage: 'Search policies',
+ }
+ )}
+ />
+
+
+
+ {tableContent}
+
+ );
+ } else {
+ return (
+
+
+
+
+
+ }
+ body={
+
+
+
+
+
+ }
+ actions={createPolicyButton}
+ />
+
+
+ );
+ }
+
+ return (
+
+
+ {confirmModal}
+
+
+
+
+
+
+
+
+
+ {createPolicyButton}
+
+
+
+
+
+
+
+
+
+ {content}
+
+
+ );
+};
diff --git a/x-pack/plugins/index_lifecycle_management/public/application/services/filter_items.js b/x-pack/plugins/index_lifecycle_management/public/application/services/filter_items.js
deleted file mode 100644
index dcc9036463b82..0000000000000
--- a/x-pack/plugins/index_lifecycle_management/public/application/services/filter_items.js
+++ /dev/null
@@ -1,17 +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;
- * you may not use this file except in compliance with the Elastic License.
- */
-
-export const filterItems = (fields, filter = '', items = []) => {
- const lowerFilter = filter.toLowerCase();
- return items.filter((item) => {
- const actualFields = fields || Object.keys(item);
- const indexOfMatch = actualFields.findIndex((field) => {
- const normalizedField = String(item[field]).toLowerCase();
- return normalizedField.includes(lowerFilter);
- });
- return indexOfMatch !== -1;
- });
-};
diff --git a/x-pack/plugins/index_lifecycle_management/public/application/services/filter_items.ts b/x-pack/plugins/index_lifecycle_management/public/application/services/filter_items.ts
new file mode 100644
index 0000000000000..237ce567707bb
--- /dev/null
+++ b/x-pack/plugins/index_lifecycle_management/public/application/services/filter_items.ts
@@ -0,0 +1,13 @@
+/*
+ * 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 const filterItems = (field: keyof T, filter: string, items: T[] = []): T[] => {
+ const lowerFilter = filter.toLowerCase();
+ return items.filter((item: T) => {
+ const normalizedValue = String(item[field]).toLowerCase();
+ return normalizedValue.includes(lowerFilter);
+ });
+};
diff --git a/x-pack/plugins/index_lifecycle_management/public/application/services/flatten_panel_tree.js b/x-pack/plugins/index_lifecycle_management/public/application/services/flatten_panel_tree.js
deleted file mode 100644
index 2bb3903a6ef45..0000000000000
--- a/x-pack/plugins/index_lifecycle_management/public/application/services/flatten_panel_tree.js
+++ /dev/null
@@ -1,20 +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;
- * you may not use this file except in compliance with the Elastic License.
- */
-
-export const flattenPanelTree = (tree, array = []) => {
- array.push(tree);
-
- if (tree.items) {
- tree.items.forEach((item) => {
- if (item.panel) {
- flattenPanelTree(item.panel, array);
- item.panel = item.panel.id;
- }
- });
- }
-
- return array;
-};
diff --git a/x-pack/plugins/index_lifecycle_management/public/application/services/index.js b/x-pack/plugins/index_lifecycle_management/public/application/services/index.ts
similarity index 100%
rename from x-pack/plugins/index_lifecycle_management/public/application/services/index.js
rename to x-pack/plugins/index_lifecycle_management/public/application/services/index.ts
diff --git a/x-pack/plugins/index_lifecycle_management/public/application/services/policies/types.ts b/x-pack/plugins/index_lifecycle_management/public/application/services/policies/types.ts
index 3d4c73cf4a82c..c191f82cf05cc 100644
--- a/x-pack/plugins/index_lifecycle_management/public/application/services/policies/types.ts
+++ b/x-pack/plugins/index_lifecycle_management/public/application/services/policies/types.ts
@@ -22,6 +22,7 @@ export interface PolicyFromES {
name: string;
policy: SerializedPolicy;
version: number;
+ linkedIndices?: string[];
}
export interface SerializedPhase {
diff --git a/x-pack/plugins/index_lifecycle_management/public/application/services/sort_table.js b/x-pack/plugins/index_lifecycle_management/public/application/services/sort_table.js
deleted file mode 100644
index 1b1446bb735c1..0000000000000
--- a/x-pack/plugins/index_lifecycle_management/public/application/services/sort_table.js
+++ /dev/null
@@ -1,21 +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;
- * you may not use this file except in compliance with the Elastic License.
- */
-
-import { sortBy } from 'lodash';
-
-const stringSort = (fieldName) => (item) => item[fieldName];
-const arraySort = (fieldName) => (item) => (item[fieldName] || []).length;
-
-const sorters = {
- version: stringSort('version'),
- name: stringSort('name'),
- linkedIndices: arraySort('linkedIndices'),
- modified_date: stringSort('modified_date'),
-};
-export const sortTable = (array = [], sortField, isSortAscending) => {
- const sorted = sortBy(array, sorters[sortField]);
- return isSortAscending ? sorted : sorted.reverse();
-};
diff --git a/x-pack/plugins/index_lifecycle_management/public/application/services/sort_table.ts b/x-pack/plugins/index_lifecycle_management/public/application/services/sort_table.ts
new file mode 100644
index 0000000000000..6b41d671b673f
--- /dev/null
+++ b/x-pack/plugins/index_lifecycle_management/public/application/services/sort_table.ts
@@ -0,0 +1,23 @@
+/*
+ * 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 { sortBy } from 'lodash';
+import { PolicyFromES } from './policies/types';
+
+export const sortTable = (
+ array: PolicyFromES[] = [],
+ sortField: Extract,
+ isSortAscending: boolean
+): PolicyFromES[] => {
+ let sorter;
+ if (sortField === 'linkedIndices') {
+ sorter = (item: PolicyFromES) => (item[sortField] || []).length;
+ } else {
+ sorter = (item: PolicyFromES) => item[sortField];
+ }
+ const sorted = sortBy(array, sorter);
+ return isSortAscending ? sorted : sorted.reverse();
+};
diff --git a/x-pack/plugins/index_lifecycle_management/public/application/store/actions/index.js b/x-pack/plugins/index_lifecycle_management/public/application/store/actions/index.js
deleted file mode 100644
index fef79c7782bb0..0000000000000
--- a/x-pack/plugins/index_lifecycle_management/public/application/store/actions/index.js
+++ /dev/null
@@ -1,7 +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;
- * you may not use this file except in compliance with the Elastic License.
- */
-
-export * from './policies';
diff --git a/x-pack/plugins/index_lifecycle_management/public/application/store/actions/policies.js b/x-pack/plugins/index_lifecycle_management/public/application/store/actions/policies.js
deleted file mode 100644
index d47136679604f..0000000000000
--- a/x-pack/plugins/index_lifecycle_management/public/application/store/actions/policies.js
+++ /dev/null
@@ -1,42 +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;
- * you may not use this file except in compliance with the Elastic License.
- */
-
-import { i18n } from '@kbn/i18n';
-import { createAction } from 'redux-actions';
-
-import { showApiError } from '../../services/api_errors';
-import { loadPolicies } from '../../services/api';
-
-export const fetchedPolicies = createAction('FETCHED_POLICIES');
-export const setSelectedPolicy = createAction('SET_SELECTED_POLICY');
-export const unsetSelectedPolicy = createAction('UNSET_SELECTED_POLICY');
-export const setSelectedPolicyName = createAction('SET_SELECTED_POLICY_NAME');
-export const setSaveAsNewPolicy = createAction('SET_SAVE_AS_NEW_POLICY');
-export const policySortChanged = createAction('POLICY_SORT_CHANGED');
-export const policyPageSizeChanged = createAction('POLICY_PAGE_SIZE_CHANGED');
-export const policyPageChanged = createAction('POLICY_PAGE_CHANGED');
-export const policySortDirectionChanged = createAction('POLICY_SORT_DIRECTION_CHANGED');
-export const policyFilterChanged = createAction('POLICY_FILTER_CHANGED');
-
-export const fetchPolicies = (withIndices, callback) => async (dispatch) => {
- let policies;
- try {
- policies = await loadPolicies(withIndices);
- } catch (err) {
- const title = i18n.translate('xpack.indexLifecycleMgmt.editPolicy.loadPolicyErrorMessage', {
- defaultMessage: 'Error loading policies',
- });
- showApiError(err, title);
- return false;
- }
-
- dispatch(fetchedPolicies(policies));
- if (policies.length === 0) {
- dispatch(setSelectedPolicy());
- }
- callback && callback();
- return policies;
-};
diff --git a/x-pack/plugins/index_lifecycle_management/public/application/store/index.d.ts b/x-pack/plugins/index_lifecycle_management/public/application/store/index.d.ts
deleted file mode 100644
index 8617a7045a5c3..0000000000000
--- a/x-pack/plugins/index_lifecycle_management/public/application/store/index.d.ts
+++ /dev/null
@@ -1,7 +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;
- * you may not use this file except in compliance with the Elastic License.
- */
-
-export declare const indexLifecycleManagementStore: any;
diff --git a/x-pack/plugins/index_lifecycle_management/public/application/store/index.js b/x-pack/plugins/index_lifecycle_management/public/application/store/index.js
deleted file mode 100644
index 808eb489bf913..0000000000000
--- a/x-pack/plugins/index_lifecycle_management/public/application/store/index.js
+++ /dev/null
@@ -1,7 +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;
- * you may not use this file except in compliance with the Elastic License.
- */
-
-export { indexLifecycleManagementStore } from './store';
diff --git a/x-pack/plugins/index_lifecycle_management/public/application/store/reducers/index.js b/x-pack/plugins/index_lifecycle_management/public/application/store/reducers/index.js
deleted file mode 100644
index 7fe7134f5f5db..0000000000000
--- a/x-pack/plugins/index_lifecycle_management/public/application/store/reducers/index.js
+++ /dev/null
@@ -1,12 +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;
- * you may not use this file except in compliance with the Elastic License.
- */
-
-import { combineReducers } from 'redux';
-import { policies } from './policies';
-
-export const indexLifecycleManagement = combineReducers({
- policies,
-});
diff --git a/x-pack/plugins/index_lifecycle_management/public/application/store/reducers/policies.js b/x-pack/plugins/index_lifecycle_management/public/application/store/reducers/policies.js
deleted file mode 100644
index ca9d59e295a29..0000000000000
--- a/x-pack/plugins/index_lifecycle_management/public/application/store/reducers/policies.js
+++ /dev/null
@@ -1,76 +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;
- * you may not use this file except in compliance with the Elastic License.
- */
-
-import { handleActions } from 'redux-actions';
-import {
- fetchedPolicies,
- policyFilterChanged,
- policyPageChanged,
- policyPageSizeChanged,
- policySortChanged,
-} from '../actions';
-
-const defaultState = {
- isLoading: false,
- isLoaded: false,
- originalPolicyName: undefined,
- selectedPolicySet: false,
- policies: [],
- sort: {
- sortField: 'name',
- isSortAscending: true,
- },
- pageSize: 10,
- currentPage: 0,
- filter: '',
-};
-
-export const policies = handleActions(
- {
- [fetchedPolicies](state, { payload: policies }) {
- return {
- ...state,
- isLoading: false,
- isLoaded: true,
- policies,
- };
- },
- [policyFilterChanged](state, action) {
- const { filter } = action.payload;
- return {
- ...state,
- filter,
- currentPage: 0,
- };
- },
- [policySortChanged](state, action) {
- const { sortField, isSortAscending } = action.payload;
-
- return {
- ...state,
- sort: {
- sortField,
- isSortAscending,
- },
- };
- },
- [policyPageChanged](state, action) {
- const { pageNumber } = action.payload;
- return {
- ...state,
- currentPage: pageNumber,
- };
- },
- [policyPageSizeChanged](state, action) {
- const { pageSize } = action.payload;
- return {
- ...state,
- pageSize,
- };
- },
- },
- defaultState
-);
diff --git a/x-pack/plugins/index_lifecycle_management/public/application/store/selectors/index.js b/x-pack/plugins/index_lifecycle_management/public/application/store/selectors/index.js
deleted file mode 100644
index fef79c7782bb0..0000000000000
--- a/x-pack/plugins/index_lifecycle_management/public/application/store/selectors/index.js
+++ /dev/null
@@ -1,7 +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;
- * you may not use this file except in compliance with the Elastic License.
- */
-
-export * from './policies';
diff --git a/x-pack/plugins/index_lifecycle_management/public/application/store/selectors/policies.js b/x-pack/plugins/index_lifecycle_management/public/application/store/selectors/policies.js
deleted file mode 100644
index e1c89314a2ec5..0000000000000
--- a/x-pack/plugins/index_lifecycle_management/public/application/store/selectors/policies.js
+++ /dev/null
@@ -1,42 +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;
- * you may not use this file except in compliance with the Elastic License.
- */
-
-import { createSelector } from 'reselect';
-import { Pager } from '@elastic/eui';
-
-import { filterItems, sortTable } from '../../services';
-
-export const getPolicies = (state) => state.policies.policies;
-export const getPolicyFilter = (state) => state.policies.filter;
-export const getPolicySort = (state) => state.policies.sort;
-export const getPolicyCurrentPage = (state) => state.policies.currentPage;
-export const getPolicyPageSize = (state) => state.policies.pageSize;
-export const isPolicyListLoaded = (state) => state.policies.isLoaded;
-
-const getFilteredPolicies = createSelector(getPolicies, getPolicyFilter, (policies, filter) => {
- return filterItems(['name'], filter, policies);
-});
-export const getTotalPolicies = createSelector(getFilteredPolicies, (filteredPolicies) => {
- return filteredPolicies.length;
-});
-export const getPolicyPager = createSelector(
- getPolicyCurrentPage,
- getPolicyPageSize,
- getTotalPolicies,
- (currentPage, pageSize, totalPolicies) => {
- return new Pager(totalPolicies, pageSize, currentPage);
- }
-);
-export const getPageOfPolicies = createSelector(
- getFilteredPolicies,
- getPolicySort,
- getPolicyPager,
- (filteredPolicies, sort, pager) => {
- const sortedPolicies = sortTable(filteredPolicies, sort.sortField, sort.isSortAscending);
- const { firstItemIndex, lastItemIndex } = pager;
- return sortedPolicies.slice(firstItemIndex, lastItemIndex + 1);
- }
-);
diff --git a/x-pack/plugins/index_lifecycle_management/public/application/store/store.js b/x-pack/plugins/index_lifecycle_management/public/application/store/store.js
deleted file mode 100644
index c5774a3da238a..0000000000000
--- a/x-pack/plugins/index_lifecycle_management/public/application/store/store.js
+++ /dev/null
@@ -1,17 +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;
- * you may not use this file except in compliance with the Elastic License.
- */
-
-import { createStore, applyMiddleware, compose } from 'redux';
-import thunk from 'redux-thunk';
-
-import { indexLifecycleManagement } from './reducers/';
-
-export const indexLifecycleManagementStore = (initialState = {}) => {
- const enhancers = [applyMiddleware(thunk)];
-
- window.__REDUX_DEVTOOLS_EXTENSION__ && enhancers.push(window.__REDUX_DEVTOOLS_EXTENSION__());
- return createStore(indexLifecycleManagement, initialState, compose(...enhancers));
-};
diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json
index 07b646df74b9f..ac39991af2a35 100644
--- a/x-pack/plugins/translations/translations/ja-JP.json
+++ b/x-pack/plugins/translations/translations/ja-JP.json
@@ -8126,7 +8126,6 @@
"xpack.indexLifecycleMgmt.editPolicy.learnAboutShardAllocationLink": "シャード割り当ての詳細をご覧ください",
"xpack.indexLifecycleMgmt.editPolicy.learnAboutTimingText": "タイミングの詳細をご覧ください",
"xpack.indexLifecycleMgmt.editPolicy.lifecyclePolicyDescriptionText": "インデックスへのアクティブな書き込みから削除までの、インデックスライフサイクルの 4 つのフェーズを自動化するには、インデックスポリシーを使用します。",
- "xpack.indexLifecycleMgmt.editPolicy.loadPolicyErrorMessage": "ポリシーの読み込み中にエラーが発生しました",
"xpack.indexLifecycleMgmt.editPolicy.maximumAgeMissingError": "最高年齢が必要です。",
"xpack.indexLifecycleMgmt.editPolicy.maximumDocumentsMissingError": "最高ドキュメント数が必要です。",
"xpack.indexLifecycleMgmt.editPolicy.maximumIndexSizeMissingError": "最大インデックスサイズが必要です。",
@@ -8265,7 +8264,6 @@
"xpack.indexLifecycleMgmt.policyTable.addLifecyclePolicyToTemplateConfirmModal.title": "インデックステンプレートにポリシー「{name}」 を追加",
"xpack.indexLifecycleMgmt.policyTable.addPolicyToTemplateButtonText": "インデックステンプレートにポリシーを追加",
"xpack.indexLifecycleMgmt.policyTable.captionText": "以下は {total} 列中 {count, plural, one {# 列} other {# 列}} を含むインデックスライフサイクルポリシー表です。",
- "xpack.indexLifecycleMgmt.policyTable.deletedPoliciesText": "{numSelected} 件の{numSelected, plural, one {ポリシー} other {ポリシー}}が削除されました",
"xpack.indexLifecycleMgmt.policyTable.deletePolicyButtonDisabledTooltip": "インデックスが使用中のポリシーは削除できません",
"xpack.indexLifecycleMgmt.policyTable.deletePolicyButtonText": "ポリシーを削除",
"xpack.indexLifecycleMgmt.policyTable.emptyPrompt.createButtonLabel": "ポリシーを作成",
diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json
index ffd7d0cfb0f87..35e0b492145c2 100644
--- a/x-pack/plugins/translations/translations/zh-CN.json
+++ b/x-pack/plugins/translations/translations/zh-CN.json
@@ -8129,7 +8129,6 @@
"xpack.indexLifecycleMgmt.editPolicy.learnAboutShardAllocationLink": "了解分片分配",
"xpack.indexLifecycleMgmt.editPolicy.learnAboutTimingText": "了解计时",
"xpack.indexLifecycleMgmt.editPolicy.lifecyclePolicyDescriptionText": "使用索引策略自动化索引生命周期的四个阶段,从频繁地写入到索引到删除索引。",
- "xpack.indexLifecycleMgmt.editPolicy.loadPolicyErrorMessage": "加载策略时出错",
"xpack.indexLifecycleMgmt.editPolicy.maximumAgeMissingError": "最大存在时间必填。",
"xpack.indexLifecycleMgmt.editPolicy.maximumDocumentsMissingError": "最大文档数必填。",
"xpack.indexLifecycleMgmt.editPolicy.maximumIndexSizeMissingError": "最大索引大小必填。",
@@ -8268,7 +8267,6 @@
"xpack.indexLifecycleMgmt.policyTable.addLifecyclePolicyToTemplateConfirmModal.title": "将策略 “{name}” 添加到索引模板",
"xpack.indexLifecycleMgmt.policyTable.addPolicyToTemplateButtonText": "将策略添加到索引模板",
"xpack.indexLifecycleMgmt.policyTable.captionText": "下面是包含 {count, plural, one {# 行} other {# 行}}(共 {total} 行)的索引生命周期策略表。",
- "xpack.indexLifecycleMgmt.policyTable.deletedPoliciesText": "已删除 {numSelected} 个{numSelected, plural, one {策略} other {策略}}",
"xpack.indexLifecycleMgmt.policyTable.deletePolicyButtonDisabledTooltip": "您无法删除索引正在使用的策略",
"xpack.indexLifecycleMgmt.policyTable.deletePolicyButtonText": "删除策略",
"xpack.indexLifecycleMgmt.policyTable.emptyPrompt.createButtonLabel": "创建策略",