diff --git a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/edit_index_pattern.html b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/edit_index_pattern.html
index fd9715b650ede..0bf7c7f0bdfbe 100644
--- a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/edit_index_pattern.html
+++ b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/edit_index_pattern.html
@@ -6,188 +6,7 @@
role="region"
aria-label="{{::'kbn.management.editIndexPattern.detailsAria' | i18n: { defaultMessage: 'Index pattern details' } }}"
>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{tag.name}}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
diff --git a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/edit_index_pattern.js b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/edit_index_pattern.js
deleted file mode 100644
index 1dd240764de6e..0000000000000
--- a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/edit_index_pattern.js
+++ /dev/null
@@ -1,523 +0,0 @@
-/*
- * Licensed to Elasticsearch B.V. under one or more contributor
- * license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright
- * ownership. Elasticsearch B.V. licenses this file to you under
- * the Apache License, Version 2.0 (the "License"); you may
- * not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import _ from 'lodash';
-import { HashRouter } from 'react-router-dom';
-import { IndexHeader } from './index_header';
-import { CreateEditField } from './create_edit_field';
-import { docTitle } from 'ui/doc_title';
-import { KbnUrlProvider } from 'ui/url';
-import { IndicesEditSectionsProvider } from './edit_sections';
-import { fatalError, toastNotifications } from 'ui/notify';
-import { RegistryFieldFormatEditorsProvider } from 'ui/registry/field_format_editors';
-import uiRoutes from 'ui/routes';
-import { uiModules } from 'ui/modules';
-import template from './edit_index_pattern.html';
-import createEditFieldtemplate from './create_edit_field.html';
-import { fieldWildcardMatcher } from '../../../../../../../../plugins/kibana_utils/public';
-import { subscribeWithScope } from '../../../../../../../../plugins/kibana_legacy/public';
-import React from 'react';
-import { render, unmountComponentAtNode } from 'react-dom';
-import { SourceFiltersTable } from './source_filters_table';
-import { IndexedFieldsTable } from './indexed_fields_table';
-import { ScriptedFieldsTable } from './scripted_fields_table';
-import { i18n } from '@kbn/i18n';
-import { I18nContext } from 'ui/i18n';
-import { npStart } from 'ui/new_platform';
-import {
- getEditBreadcrumbs,
- getEditFieldBreadcrumbs,
- getCreateFieldBreadcrumbs,
-} from '../breadcrumbs';
-import { TAB_INDEXED_FIELDS, TAB_SCRIPTED_FIELDS, TAB_SOURCE_FILTERS } from './constants';
-import { createEditIndexPatternPageStateContainer } from './edit_index_pattern_state_container';
-
-const REACT_SOURCE_FILTERS_DOM_ELEMENT_ID = 'reactSourceFiltersTable';
-const REACT_INDEXED_FIELDS_DOM_ELEMENT_ID = 'reactIndexedFieldsTable';
-const REACT_SCRIPTED_FIELDS_DOM_ELEMENT_ID = 'reactScriptedFieldsTable';
-const REACT_INDEX_HEADER_DOM_ELEMENT_ID = 'reactIndexHeader';
-
-const EDIT_FIELD_PATH = '/management/kibana/index_patterns/{{indexPattern.id}}/field/{{name}}';
-
-function updateSourceFiltersTable($scope) {
- $scope.$$postDigest(() => {
- const node = document.getElementById(REACT_SOURCE_FILTERS_DOM_ELEMENT_ID);
- if (!node) {
- return;
- }
-
- render(
-
- {
- $scope.editSections = $scope.editSectionsProvider(
- $scope.indexPattern,
- $scope.fieldFilter,
- $scope.indexPatternListProvider
- );
- $scope.refreshFilters();
- $scope.$apply();
- }}
- />
- ,
- node
- );
- });
-}
-
-function destroySourceFiltersTable() {
- const node = document.getElementById(REACT_SOURCE_FILTERS_DOM_ELEMENT_ID);
- node && unmountComponentAtNode(node);
-}
-
-function updateScriptedFieldsTable($scope) {
- $scope.$$postDigest(() => {
- const node = document.getElementById(REACT_SCRIPTED_FIELDS_DOM_ELEMENT_ID);
- if (!node) {
- return;
- }
-
- render(
-
- {
- $scope.kbnUrl.changePath(EDIT_FIELD_PATH, field);
- $scope.$apply();
- },
- getRouteHref: (obj, route) => $scope.kbnUrl.getRouteHref(obj, route),
- }}
- onRemoveField={() => {
- $scope.editSections = $scope.editSectionsProvider(
- $scope.indexPattern,
- $scope.fieldFilter,
- $scope.indexPatternListProvider
- );
- $scope.refreshFilters();
- $scope.$apply();
- }}
- />
- ,
- node
- );
- });
-}
-
-function destroyScriptedFieldsTable() {
- const node = document.getElementById(REACT_SCRIPTED_FIELDS_DOM_ELEMENT_ID);
- node && unmountComponentAtNode(node);
-}
-
-function updateIndexedFieldsTable($scope) {
- $scope.$$postDigest(() => {
- const node = document.getElementById(REACT_INDEXED_FIELDS_DOM_ELEMENT_ID);
- if (!node) {
- return;
- }
-
- render(
-
- {
- $scope.kbnUrl.changePath(EDIT_FIELD_PATH, field);
- $scope.$apply();
- },
- getFieldInfo: $scope.getFieldInfo,
- }}
- />
- ,
- node
- );
- });
-}
-
-function destroyIndexedFieldsTable() {
- const node = document.getElementById(REACT_INDEXED_FIELDS_DOM_ELEMENT_ID);
- node && unmountComponentAtNode(node);
-}
-
-function destroyIndexHeader() {
- const node = document.getElementById(REACT_INDEX_HEADER_DOM_ELEMENT_ID);
- node && unmountComponentAtNode(node);
-}
-
-function renderIndexHeader($scope, config) {
- $scope.$$postDigest(() => {
- const node = document.getElementById(REACT_INDEX_HEADER_DOM_ELEMENT_ID);
- if (!node) {
- return;
- }
-
- render(
-
-
- ,
- node
- );
- });
-}
-
-function handleTabChange($scope, newTab) {
- destroyIndexedFieldsTable();
- destroySourceFiltersTable();
- destroyScriptedFieldsTable();
- updateTables($scope, newTab);
-}
-
-function updateTables($scope, currentTab) {
- switch (currentTab) {
- case TAB_SCRIPTED_FIELDS:
- return updateScriptedFieldsTable($scope);
- case TAB_INDEXED_FIELDS:
- return updateIndexedFieldsTable($scope);
- case TAB_SOURCE_FILTERS:
- return updateSourceFiltersTable($scope);
- }
-}
-
-uiRoutes.when('/management/kibana/index_patterns/:indexPatternId', {
- template,
- k7Breadcrumbs: getEditBreadcrumbs,
- resolve: {
- indexPattern: function($route, Promise, redirectWhenMissing) {
- const { indexPatterns } = npStart.plugins.data;
- return Promise.resolve(indexPatterns.get($route.current.params.indexPatternId)).catch(
- redirectWhenMissing('/management/kibana/index_patterns')
- );
- },
- },
-});
-
-uiModules
- .get('apps/management')
- .controller('managementIndexPatternsEdit', function(
- $scope,
- $location,
- $route,
- Promise,
- config,
- Private
- ) {
- const {
- startSyncingState,
- stopSyncingState,
- setCurrentTab,
- getCurrentTab,
- state$,
- } = createEditIndexPatternPageStateContainer({
- useHashedUrl: config.get('state:storeInSessionStorage'),
- defaultTab: TAB_INDEXED_FIELDS,
- });
-
- $scope.getCurrentTab = getCurrentTab;
- $scope.setCurrentTab = setCurrentTab;
-
- const stateChangedSub = subscribeWithScope(
- $scope,
- state$,
- {
- next: ({ tab }) => {
- handleTabChange($scope, tab);
- },
- },
- fatalError
- );
-
- handleTabChange($scope, getCurrentTab()); // setup initial tab depending on initial tab state
-
- startSyncingState(); // starts syncing state between state container and url
-
- const destroyState = () => {
- stateChangedSub.unsubscribe();
- stopSyncingState();
- };
-
- $scope.fieldWildcardMatcher = (...args) =>
- fieldWildcardMatcher(...args, config.get('metaFields'));
- $scope.editSectionsProvider = Private(IndicesEditSectionsProvider);
- $scope.kbnUrl = Private(KbnUrlProvider);
- $scope.indexPattern = $route.current.locals.indexPattern;
- $scope.indexPatternListProvider = npStart.plugins.indexPatternManagement.list;
- $scope.indexPattern.tags = npStart.plugins.indexPatternManagement.list.getIndexPatternTags(
- $scope.indexPattern,
- $scope.indexPattern.id === config.get('defaultIndex')
- );
- $scope.getFieldInfo = npStart.plugins.indexPatternManagement.list.getFieldInfo;
- docTitle.change($scope.indexPattern.title);
-
- const otherPatterns = _.filter($route.current.locals.indexPatterns, pattern => {
- return pattern.id !== $scope.indexPattern.id;
- });
-
- $scope.$watch('indexPattern.fields', function() {
- $scope.editSections = $scope.editSectionsProvider(
- $scope.indexPattern,
- $scope.fieldFilter,
- npStart.plugins.indexPatternManagement.list
- );
- $scope.refreshFilters();
- $scope.fields = $scope.indexPattern.getNonScriptedFields();
- });
-
- $scope.migration = {
- isMigrating: false,
- newTitle: $scope.indexPattern.getIndex(),
- };
- $scope.migrate = async function() {
- $scope.migration.isMigrating = true;
- await $scope.indexPattern.migrate($scope.migration.newTitle);
- $scope.$evalAsync(() => {
- $scope.migration.isMigrating = false;
- });
- };
-
- $scope.refreshFilters = function() {
- const indexedFieldTypes = [];
- const scriptedFieldLanguages = [];
- $scope.indexPattern.fields.forEach(field => {
- if (field.scripted) {
- scriptedFieldLanguages.push(field.lang);
- } else {
- indexedFieldTypes.push(field.type);
- }
- });
-
- $scope.indexedFieldTypes = _.unique(indexedFieldTypes);
- $scope.scriptedFieldLanguages = _.unique(scriptedFieldLanguages);
- };
-
- $scope.changeFilter = function(filter, val) {
- $scope[filter] = val || ''; // null causes filter to check for null explicitly
- };
-
- $scope.$watchCollection('indexPattern.fields', function() {
- $scope.conflictFields = $scope.indexPattern.fields.filter(field => field.type === 'conflict');
- });
-
- $scope.refreshFields = function() {
- const confirmMessage = i18n.translate('kbn.management.editIndexPattern.refreshLabel', {
- defaultMessage: 'This action resets the popularity counter of each field.',
- });
- const confirmModalOptions = {
- confirmButtonText: i18n.translate('kbn.management.editIndexPattern.refreshButton', {
- defaultMessage: 'Refresh',
- }),
- title: i18n.translate('kbn.management.editIndexPattern.refreshHeader', {
- defaultMessage: 'Refresh field list?',
- }),
- };
-
- npStart.core.overlays
- .openConfirm(confirmMessage, confirmModalOptions)
- .then(async isConfirmed => {
- if (isConfirmed) {
- await $scope.indexPattern.init(true);
- $scope.fields = $scope.indexPattern.getNonScriptedFields();
- }
- });
- };
-
- $scope.removePattern = function() {
- function doRemove() {
- if ($scope.indexPattern.id === config.get('defaultIndex')) {
- config.remove('defaultIndex');
-
- if (otherPatterns.length) {
- config.set('defaultIndex', otherPatterns[0].id);
- }
- }
-
- Promise.resolve($scope.indexPattern.destroy())
- .then(function() {
- $location.url('/management/kibana/index_patterns');
- })
- .catch(fatalError);
- }
-
- const confirmModalOptions = {
- confirmButtonText: i18n.translate('kbn.management.editIndexPattern.deleteButton', {
- defaultMessage: 'Delete',
- }),
- title: i18n.translate('kbn.management.editIndexPattern.deleteHeader', {
- defaultMessage: 'Delete index pattern?',
- }),
- };
-
- npStart.core.overlays.openConfirm('', confirmModalOptions).then(isConfirmed => {
- if (isConfirmed) {
- doRemove();
- }
- });
- };
-
- $scope.setDefaultPattern = function() {
- config.set('defaultIndex', $scope.indexPattern.id);
- };
-
- $scope.setIndexPatternsTimeField = function(field) {
- if (field.type !== 'date') {
- const errorMessage = i18n.translate('kbn.management.editIndexPattern.notDateErrorMessage', {
- defaultMessage: 'That field is a {fieldType} not a date.',
- values: { fieldType: field.type },
- });
- toastNotifications.addDanger(errorMessage);
- return;
- }
- $scope.indexPattern.timeFieldName = field.name;
- return $scope.indexPattern.save();
- };
-
- $scope.$watch('fieldFilter', () => {
- $scope.editSections = $scope.editSectionsProvider(
- $scope.indexPattern,
- $scope.fieldFilter,
- npStart.plugins.indexPatternManagement.list
- );
-
- if ($scope.fieldFilter === undefined) {
- return;
- }
-
- updateTables($scope, getCurrentTab());
- });
-
- $scope.$watch('indexedFieldTypeFilter', () => {
- if ($scope.indexedFieldTypeFilter !== undefined && getCurrentTab() === TAB_INDEXED_FIELDS) {
- updateIndexedFieldsTable($scope);
- }
- });
-
- $scope.$watch('scriptedFieldLanguageFilter', () => {
- if (
- $scope.scriptedFieldLanguageFilter !== undefined &&
- getCurrentTab() === TAB_SCRIPTED_FIELDS
- ) {
- updateScriptedFieldsTable($scope);
- }
- });
-
- $scope.$on('$destroy', () => {
- destroyIndexedFieldsTable();
- destroyScriptedFieldsTable();
- destroySourceFiltersTable();
- destroyIndexHeader();
- destroyState();
- });
-
- renderIndexHeader($scope, config);
- });
-
-// routes for create edit field. Will be removed after migartion all component to react.
-const REACT_FIELD_EDITOR_ID = 'reactFieldEditor';
-const renderCreateEditField = ($scope, $route, getConfig, $http, fieldFormatEditors) => {
- $scope.$$postDigest(() => {
- const node = document.getElementById(REACT_FIELD_EDITOR_ID);
- if (!node) {
- return;
- }
-
- render(
-
-
-
-
- ,
- node
- );
- });
-};
-
-const destroyCreateEditField = () => {
- const node = document.getElementById(REACT_FIELD_EDITOR_ID);
- node && unmountComponentAtNode(node);
-};
-
-uiRoutes
- .when('/management/kibana/index_patterns/:indexPatternId/field/:fieldName*', {
- mode: 'edit',
- k7Breadcrumbs: getEditFieldBreadcrumbs,
- })
- .when('/management/kibana/index_patterns/:indexPatternId/create-field/', {
- mode: 'create',
- k7Breadcrumbs: getCreateFieldBreadcrumbs,
- })
- .defaults(/management\/kibana\/index_patterns\/[^\/]+\/(field|create-field)(\/|$)/, {
- template: createEditFieldtemplate,
- mapBreadcrumbs($route, breadcrumbs) {
- const { indexPattern } = $route.current.locals;
- return breadcrumbs.map(crumb => {
- if (crumb.id !== indexPattern.id) {
- return crumb;
- }
-
- return {
- ...crumb,
- display: indexPattern.title,
- };
- });
- },
- resolve: {
- indexPattern: function($route, Promise, redirectWhenMissing) {
- const { indexPatterns } = npStart.plugins.data;
- return Promise.resolve(indexPatterns.get($route.current.params.indexPatternId)).catch(
- redirectWhenMissing('/management/kibana/index_patterns')
- );
- },
- },
- controllerAs: 'fieldSettings',
- controller: function FieldEditorPageController($scope, $route, $http, Private, config) {
- const getConfig = (...args) => config.get(...args);
- const fieldFormatEditors = Private(RegistryFieldFormatEditorsProvider);
-
- renderCreateEditField($scope, $route, getConfig, $http, fieldFormatEditors);
-
- $scope.$on('$destroy', () => {
- destroyCreateEditField();
- });
- },
- });
diff --git a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/edit_index_pattern.tsx b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/edit_index_pattern.tsx
new file mode 100644
index 0000000000000..e869ac84c2db2
--- /dev/null
+++ b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/edit_index_pattern.tsx
@@ -0,0 +1,238 @@
+/*
+ * Licensed to Elasticsearch B.V. under one or more contributor
+ * license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright
+ * ownership. Elasticsearch B.V. licenses this file to you under
+ * the Apache License, Version 2.0 (the "License"); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { filter } from 'lodash';
+import React, { useEffect, useState, useCallback } from 'react';
+import { withRouter, RouteComponentProps } from 'react-router-dom';
+import {
+ EuiFlexGroup,
+ EuiFlexItem,
+ EuiSpacer,
+ EuiBadge,
+ EuiText,
+ EuiLink,
+ EuiIcon,
+ EuiCallOut,
+} from '@elastic/eui';
+import { i18n } from '@kbn/i18n';
+import { FormattedMessage } from '@kbn/i18n/react';
+import { IndexPattern, IndexPatternField } from '../../../../../../../../plugins/data/public';
+import {
+ ChromeDocTitle,
+ NotificationsStart,
+ OverlayStart,
+} from '../../../../../../../../core/public';
+import { IndexPatternManagementStart } from '../../../../../../../../plugins/index_pattern_management/public';
+import { Tabs } from './tabs';
+import { IndexHeader } from './index_header';
+
+interface EditIndexPatternProps extends RouteComponentProps {
+ indexPattern: IndexPattern;
+ indexPatterns: IndexPattern[];
+ config: Record;
+ services: {
+ notifications: NotificationsStart;
+ docTitle: ChromeDocTitle;
+ overlays: OverlayStart;
+ indexPatternManagement: IndexPatternManagementStart;
+ };
+}
+
+const mappingAPILink = i18n.translate(
+ 'kbn.management.editIndexPattern.timeFilterLabel.mappingAPILink',
+ {
+ defaultMessage: 'Mapping API',
+ }
+);
+
+const mappingConflictHeader = i18n.translate(
+ 'kbn.management.editIndexPattern.mappingConflictHeader',
+ {
+ defaultMessage: 'Mapping conflict',
+ }
+);
+
+const confirmMessage = i18n.translate('kbn.management.editIndexPattern.refreshLabel', {
+ defaultMessage: 'This action resets the popularity counter of each field.',
+});
+
+const confirmModalOptionsRefresh = {
+ confirmButtonText: i18n.translate('kbn.management.editIndexPattern.refreshButton', {
+ defaultMessage: 'Refresh',
+ }),
+ title: i18n.translate('kbn.management.editIndexPattern.refreshHeader', {
+ defaultMessage: 'Refresh field list?',
+ }),
+};
+
+const confirmModalOptionsDelete = {
+ confirmButtonText: i18n.translate('kbn.management.editIndexPattern.deleteButton', {
+ defaultMessage: 'Delete',
+ }),
+ title: i18n.translate('kbn.management.editIndexPattern.deleteHeader', {
+ defaultMessage: 'Delete index pattern?',
+ }),
+};
+
+export const EditIndexPattern = withRouter(
+ ({ indexPattern, indexPatterns, config, services, history, location }: EditIndexPatternProps) => {
+ const [fields, setFields] = useState(indexPattern.getNonScriptedFields());
+ const [conflictedFields, setConflictedFields] = useState(
+ indexPattern.fields.filter(field => field.type === 'conflict')
+ );
+ const [defaultIndex, setDefaultIndex] = useState(config.get('defaultIndex'));
+ const [tags, setTags] = useState([]);
+
+ useEffect(() => {
+ setFields(indexPattern.getNonScriptedFields());
+ setConflictedFields(indexPattern.fields.filter(field => field.type === 'conflict'));
+ }, [indexPattern, indexPattern.fields]);
+
+ useEffect(() => {
+ const indexPatternTags =
+ services.indexPatternManagement.list.getIndexPatternTags(
+ indexPattern,
+ indexPattern.id === defaultIndex
+ ) || [];
+ setTags(indexPatternTags);
+ }, [defaultIndex, indexPattern, services.indexPatternManagement.list]);
+
+ const setDefaultPattern = useCallback(() => {
+ config.set('defaultIndex', indexPattern.id);
+ setDefaultIndex(indexPattern.id || '');
+ }, [config, indexPattern.id]);
+
+ const refreshFields = () => {
+ services.overlays
+ .openConfirm(confirmMessage, confirmModalOptionsRefresh)
+ .then(async isConfirmed => {
+ if (isConfirmed) {
+ await indexPattern.init(true);
+ setFields(indexPattern.getNonScriptedFields());
+ }
+ });
+ };
+
+ const removePattern = () => {
+ function doRemove() {
+ if (indexPattern.id === defaultIndex) {
+ config.remove('defaultIndex');
+ const otherPatterns = filter(indexPatterns, pattern => {
+ return pattern.id !== indexPattern.id;
+ });
+
+ if (otherPatterns.length) {
+ config.set('defaultIndex', otherPatterns[0].id);
+ }
+ }
+
+ Promise.resolve(indexPattern.destroy()).then(function() {
+ history.push('/management/kibana/index_patterns');
+ });
+ }
+
+ services.overlays.openConfirm('', confirmModalOptionsDelete).then(isConfirmed => {
+ if (isConfirmed) {
+ doRemove();
+ }
+ });
+ };
+
+ const timeFilterHeader = i18n.translate('kbn.management.editIndexPattern.timeFilterHeader', {
+ defaultMessage: "Time Filter field name: '{timeFieldName}'",
+ values: { timeFieldName: indexPattern.timeFieldName },
+ });
+
+ const mappingConflictLabel = i18n.translate(
+ 'kbn.management.editIndexPattern.mappingConflictLabel',
+ {
+ defaultMessage:
+ '{conflictFieldsLength, plural, one {A field is} other {# fields are}} defined as several types (string, integer, etc) across the indices that match this pattern. You may still be able to use these conflict fields in parts of Kibana, but they will be unavailable for functions that require Kibana to know their type. Correcting this issue will require reindexing your data.',
+ values: { conflictFieldsLength: conflictedFields.length },
+ }
+ );
+
+ services.docTitle.change(indexPattern.title);
+
+ const showTagsSection = Boolean(indexPattern.timeFieldName || (tags && tags.length > 0));
+
+ return (
+
+
+
+
+ {showTagsSection && (
+
+ {Boolean(indexPattern.timeFieldName) && (
+
+ {timeFilterHeader}
+
+ )}
+ {tags.map((tag: any) => (
+
+ {tag.name}
+
+ ))}
+
+ )}
+
+
+
+ {indexPattern.title} }}
+ />{' '}
+
+ {mappingAPILink}
+
+
+
+
+ {conflictedFields.length > 0 && (
+
+ {mappingConflictLabel}
+
+ )}
+
+
+
+
+
+ );
+ }
+);
diff --git a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/edit_index_pattern_state_container.ts b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/edit_index_pattern_state_container.ts
index 473417a7aabd6..5723a596f95d5 100644
--- a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/edit_index_pattern_state_container.ts
+++ b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/edit_index_pattern_state_container.ts
@@ -25,7 +25,7 @@ import {
} from '../../../../../../../../plugins/kibana_utils/public';
interface IEditIndexPatternState {
- tab: string; // TODO: type those 3 tabs with enum, when edit_index_pattern.js migrated to ts
+ tab: string;
}
/**
@@ -38,7 +38,6 @@ export function createEditIndexPatternPageStateContainer({
defaultTab: string;
useHashedUrl: boolean;
}) {
- // until angular is used as shell - use hash history
const history = createHashHistory();
// query param to store app state at
const stateStorageKey = '_a';
@@ -78,12 +77,10 @@ export function createEditIndexPatternPageStateContainer({
// makes sure initial url is the same as initial state (this is not really required)
kbnUrlStateStorage.set(stateStorageKey, stateContainer.getState(), { replace: true });
- // expose api needed for Controller
return {
startSyncingState: start,
stopSyncingState: stop,
setCurrentTab: (newTab: string) => stateContainer.transitions.setTab(newTab),
getCurrentTab: () => stateContainer.selectors.tab(),
- state$: stateContainer.state$,
};
}
diff --git a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/edit_sections.js b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/edit_sections.js
deleted file mode 100644
index f0220b2f798e5..0000000000000
--- a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/edit_sections.js
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Licensed to Elasticsearch B.V. under one or more contributor
- * license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright
- * ownership. Elasticsearch B.V. licenses this file to you under
- * the Apache License, Version 2.0 (the "License"); you may
- * not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import _ from 'lodash';
-import { i18n } from '@kbn/i18n';
-
-function filterBy(items, key, filter) {
- const lowercaseFilter = (filter || '').toLowerCase();
- return items.filter(item => item[key].toLowerCase().includes(lowercaseFilter));
-}
-
-function getCounts(fields, sourceFilters, fieldFilter = '') {
- const fieldCount = _.countBy(filterBy(fields, 'name', fieldFilter), function(field) {
- return field.scripted ? 'scripted' : 'indexed';
- });
-
- _.defaults(fieldCount, {
- indexed: 0,
- scripted: 0,
- sourceFilters: sourceFilters ? filterBy(sourceFilters, 'value', fieldFilter).length : 0,
- });
-
- return fieldCount;
-}
-
-export function IndicesEditSectionsProvider() {
- return function(indexPattern, fieldFilter, indexPatternListProvider) {
- const totalCount = getCounts(indexPattern.fields, indexPattern.sourceFilters);
- const filteredCount = getCounts(indexPattern.fields, indexPattern.sourceFilters, fieldFilter);
-
- const editSections = [];
-
- editSections.push({
- title: i18n.translate('kbn.management.editIndexPattern.tabs.fieldsHeader', {
- defaultMessage: 'Fields',
- }),
- index: 'indexedFields',
- count: filteredCount.indexed,
- totalCount: totalCount.indexed,
- });
-
- if (indexPatternListProvider.areScriptedFieldsEnabled(indexPattern)) {
- editSections.push({
- title: i18n.translate('kbn.management.editIndexPattern.tabs.scriptedHeader', {
- defaultMessage: 'Scripted fields',
- }),
- index: 'scriptedFields',
- count: filteredCount.scripted,
- totalCount: totalCount.scripted,
- });
- }
-
- editSections.push({
- title: i18n.translate('kbn.management.editIndexPattern.tabs.sourceHeader', {
- defaultMessage: 'Source filters',
- }),
- index: 'sourceFilters',
- count: filteredCount.sourceFilters,
- totalCount: totalCount.sourceFilters,
- });
-
- return editSections;
- };
-}
diff --git a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/field_controls.html b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/field_controls.html
deleted file mode 100644
index c14dcd3f3a8d5..0000000000000
--- a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/field_controls.html
+++ /dev/null
@@ -1,19 +0,0 @@
-
diff --git a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/index.js b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/index.js
index 6beaee60b3788..e05aea3678fe2 100644
--- a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/index.js
+++ b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/index.js
@@ -17,4 +17,159 @@
* under the License.
*/
-import './edit_index_pattern';
+import React from 'react';
+import { HashRouter } from 'react-router-dom';
+import { render, unmountComponentAtNode } from 'react-dom';
+import { RegistryFieldFormatEditorsProvider } from 'ui/registry/field_format_editors';
+import uiRoutes from 'ui/routes';
+import { uiModules } from 'ui/modules';
+import { I18nContext } from 'ui/i18n';
+import { npStart } from 'ui/new_platform';
+import template from './edit_index_pattern.html';
+import createEditFieldtemplate from './create_edit_field.html';
+import {
+ getEditBreadcrumbs,
+ getEditFieldBreadcrumbs,
+ getCreateFieldBreadcrumbs,
+} from '../breadcrumbs';
+import { EditIndexPattern } from './edit_index_pattern';
+import { CreateEditField } from './create_edit_field';
+
+const REACT_EDIT_INDEX_PATTERN_DOM_ELEMENT_ID = 'reactEditIndexPattern';
+
+function destroyEditIndexPattern() {
+ const node = document.getElementById(REACT_EDIT_INDEX_PATTERN_DOM_ELEMENT_ID);
+ node && unmountComponentAtNode(node);
+}
+
+function renderEditIndexPattern($scope, config, $route) {
+ $scope.$$postDigest(() => {
+ const node = document.getElementById(REACT_EDIT_INDEX_PATTERN_DOM_ELEMENT_ID);
+ if (!node) {
+ return;
+ }
+
+ render(
+
+
+
+
+ ,
+ node
+ );
+ });
+}
+
+uiRoutes.when('/management/kibana/index_patterns/:indexPatternId', {
+ template,
+ k7Breadcrumbs: getEditBreadcrumbs,
+ resolve: {
+ indexPattern: function($route, Promise, redirectWhenMissing) {
+ const { indexPatterns } = npStart.plugins.data;
+ return Promise.resolve(indexPatterns.get($route.current.params.indexPatternId)).catch(
+ redirectWhenMissing('/management/kibana/index_patterns')
+ );
+ },
+ },
+});
+
+uiModules
+ .get('apps/management')
+ .controller('managementIndexPatternsEdit', function($scope, $route, config) {
+ $scope.$on('$destroy', () => {
+ destroyEditIndexPattern();
+ });
+
+ renderEditIndexPattern($scope, config, $route);
+ });
+
+// routes for create edit field. Will be removed after migartion all component to react.
+const REACT_FIELD_EDITOR_ID = 'reactFieldEditor';
+const renderCreateEditField = ($scope, $route, getConfig, $http, fieldFormatEditors) => {
+ $scope.$$postDigest(() => {
+ const node = document.getElementById(REACT_FIELD_EDITOR_ID);
+ if (!node) {
+ return;
+ }
+
+ render(
+
+
+
+
+ ,
+ node
+ );
+ });
+};
+
+const destroyCreateEditField = () => {
+ const node = document.getElementById(REACT_FIELD_EDITOR_ID);
+ node && unmountComponentAtNode(node);
+};
+
+uiRoutes
+ .when('/management/kibana/index_patterns/:indexPatternId/field/:fieldName*', {
+ mode: 'edit',
+ k7Breadcrumbs: getEditFieldBreadcrumbs,
+ })
+ .when('/management/kibana/index_patterns/:indexPatternId/create-field/', {
+ mode: 'create',
+ k7Breadcrumbs: getCreateFieldBreadcrumbs,
+ })
+ .defaults(/management\/kibana\/index_patterns\/[^\/]+\/(field|create-field)(\/|$)/, {
+ template: createEditFieldtemplate,
+ mapBreadcrumbs($route, breadcrumbs) {
+ const { indexPattern } = $route.current.locals;
+ return breadcrumbs.map(crumb => {
+ if (crumb.id !== indexPattern.id) {
+ return crumb;
+ }
+
+ return {
+ ...crumb,
+ display: indexPattern.title,
+ };
+ });
+ },
+ resolve: {
+ indexPattern: function($route, Promise, redirectWhenMissing) {
+ const { indexPatterns } = npStart.plugins.data;
+ return Promise.resolve(indexPatterns.get($route.current.params.indexPatternId)).catch(
+ redirectWhenMissing('/management/kibana/index_patterns')
+ );
+ },
+ },
+ controllerAs: 'fieldSettings',
+ controller: function FieldEditorPageController($scope, $route, $http, Private, config) {
+ const getConfig = (...args) => config.get(...args);
+ const fieldFormatEditors = Private(RegistryFieldFormatEditorsProvider);
+
+ renderCreateEditField($scope, $route, getConfig, $http, fieldFormatEditors);
+
+ $scope.$on('$destroy', () => {
+ destroyCreateEditField();
+ });
+ },
+ });
diff --git a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/index_header/index_header.tsx b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/index_header/index_header.tsx
index deac85d9a32e9..a06671ef6a470 100644
--- a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/index_header/index_header.tsx
+++ b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/index_header/index_header.tsx
@@ -92,7 +92,7 @@ export function IndexHeader({
diff --git a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/indexed_fields_table.tsx b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/indexed_fields_table.tsx
index 650b7fa8c5b16..3b6da72b01370 100644
--- a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/indexed_fields_table.tsx
+++ b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/indexed_fields_table.tsx
@@ -19,7 +19,11 @@
import React, { Component } from 'react';
import { createSelector } from 'reselect';
-import { IndexPatternField, IIndexPattern } from '../../../../../../../../../plugins/data/public';
+import {
+ IndexPatternField,
+ IIndexPattern,
+ IFieldType,
+} from '../../../../../../../../../plugins/data/public';
import { Table } from './components/table';
import { getFieldFormat } from './lib';
import { IndexedFieldItem } from './types';
@@ -30,8 +34,8 @@ interface IndexedFieldsTableProps {
fieldFilter?: string;
indexedFieldTypeFilter?: string;
helpers: {
- redirectToRoute: (field: IndexedFieldItem) => void;
- getFieldInfo: (indexPattern: IIndexPattern, field: string) => string[];
+ redirectToRoute: Function;
+ getFieldInfo: (indexPattern: IIndexPattern, field: IFieldType) => string[];
};
fieldWildcardMatcher: (filters: any[]) => (val: any) => boolean;
}
@@ -76,7 +80,7 @@ export class IndexedFieldsTable extends Component<
indexPattern: field.indexPattern,
format: getFieldFormat(indexPattern, field.name),
excluded: fieldWildcardMatch ? fieldWildcardMatch(field.name) : false,
- info: helpers.getFieldInfo && helpers.getFieldInfo(indexPattern, field.name),
+ info: helpers.getFieldInfo && helpers.getFieldInfo(indexPattern, field),
};
})) ||
[]
diff --git a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/scripted_fields_table/__snapshots__/scripted_field_table.test.tsx.snap b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/scripted_fields_table/__snapshots__/scripted_field_table.test.tsx.snap
index 569b75c848c52..202b09ddc6066 100644
--- a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/scripted_fields_table/__snapshots__/scripted_field_table.test.tsx.snap
+++ b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/scripted_fields_table/__snapshots__/scripted_field_table.test.tsx.snap
@@ -3,7 +3,7 @@
exports[`ScriptedFieldsTable should filter based on the lang filter 1`] = `
void;
}
@@ -136,14 +136,19 @@ export class ScriptedFieldsTable extends Component<
};
render() {
- const { helpers, indexPattern } = this.props;
+ const { indexPattern } = this.props;
const { fieldToDelete, deprecatedLangsInUse } = this.state;
const items = this.getFilteredItems();
return (
<>
-
+
{
+ indexPattern: IndexPattern;
+ config: Record;
+ fields: IndexPatternField[];
+ services: {
+ indexPatternManagement: IndexPatternManagementStart;
+ };
+}
+
+const filterAriaLabel = i18n.translate('kbn.management.editIndexPattern.fields.filterAria', {
+ defaultMessage: 'Filter',
+});
+
+const filterPlaceholder = i18n.translate(
+ 'kbn.management.editIndexPattern.fields.filterPlaceholder',
+ {
+ defaultMessage: 'Filter',
+ }
+);
+
+export function Tabs({ config, indexPattern, fields, services, history, location }: TabsProps) {
+ const [fieldFilter, setFieldFilter] = useState('');
+ const [indexedFieldTypeFilter, setIndexedFieldTypeFilter] = useState('');
+ const [scriptedFieldLanguageFilter, setScriptedFieldLanguageFilter] = useState('');
+ const [indexedFieldTypes, setIndexedFieldType] = useState([]);
+ const [scriptedFieldLanguages, setScriptedFieldLanguages] = useState([]);
+ const [syncingStateFunc, setSyncingStateFunc] = useState({
+ getCurrentTab: () => TAB_INDEXED_FIELDS,
+ });
+
+ const refreshFilters = useCallback(() => {
+ const tempIndexedFieldTypes: string[] = [];
+ const tempScriptedFieldLanguages: string[] = [];
+ indexPattern.fields.forEach(field => {
+ if (field.scripted) {
+ if (field.lang) {
+ tempScriptedFieldLanguages.push(field.lang);
+ }
+ } else {
+ tempIndexedFieldTypes.push(field.type);
+ }
+ });
+
+ setIndexedFieldType(convertToEuiSelectOption(tempIndexedFieldTypes, 'indexedFiledTypes'));
+ setScriptedFieldLanguages(
+ convertToEuiSelectOption(tempScriptedFieldLanguages, 'scriptedFieldLanguages')
+ );
+ }, [indexPattern]);
+
+ useEffect(() => {
+ refreshFilters();
+ }, [indexPattern, indexPattern.fields, refreshFilters]);
+
+ const fieldWildcardMatcherDecorated = useCallback(
+ (filters: string[]) => fieldWildcardMatcher(filters, config.get('metaFields')),
+ [config]
+ );
+
+ const getFilterSection = useCallback(
+ (type: string) => {
+ return (
+
+
+ setFieldFilter(e.target.value)}
+ data-test-subj="indexPatternFieldFilter"
+ aria-label={filterAriaLabel}
+ />
+
+ {type === TAB_INDEXED_FIELDS && indexedFieldTypes.length > 0 && (
+
+ setIndexedFieldTypeFilter(e.target.value)}
+ data-test-subj="indexedFieldTypeFilterDropdown"
+ />
+
+ )}
+ {type === TAB_SCRIPTED_FIELDS && scriptedFieldLanguages.length > 0 && (
+
+ setScriptedFieldLanguageFilter(e.target.value)}
+ data-test-subj="scriptedFieldLanguageFilterDropdown"
+ />
+
+ )}
+
+ );
+ },
+ [
+ fieldFilter,
+ indexedFieldTypeFilter,
+ indexedFieldTypes,
+ scriptedFieldLanguageFilter,
+ scriptedFieldLanguages,
+ ]
+ );
+
+ const getContent = useCallback(
+ (type: string) => {
+ switch (type) {
+ case TAB_INDEXED_FIELDS:
+ return (
+
+
+ {getFilterSection(type)}
+
+ {
+ history.push(getPath(field));
+ },
+ getFieldInfo: services.indexPatternManagement.list.getFieldInfo,
+ }}
+ />
+
+ );
+ case TAB_SCRIPTED_FIELDS:
+ return (
+
+
+ {getFilterSection(type)}
+
+ {
+ history.push(getPath(field));
+ },
+ }}
+ onRemoveField={refreshFilters}
+ />
+
+ );
+ case TAB_SOURCE_FILTERS:
+ return (
+
+
+ {getFilterSection(type)}
+
+
+
+ );
+ }
+ },
+ [
+ fieldFilter,
+ fieldWildcardMatcherDecorated,
+ fields,
+ getFilterSection,
+ history,
+ indexPattern,
+ indexedFieldTypeFilter,
+ refreshFilters,
+ scriptedFieldLanguageFilter,
+ services.indexPatternManagement.list.getFieldInfo,
+ ]
+ );
+
+ const euiTabs: EuiTabbedContentTab[] = useMemo(
+ () =>
+ getTabs(indexPattern, fieldFilter, services.indexPatternManagement.list).map(
+ (tab: Pick) => {
+ return {
+ ...tab,
+ content: getContent(tab.id),
+ };
+ }
+ ),
+ [fieldFilter, getContent, indexPattern, services.indexPatternManagement.list]
+ );
+
+ const [selectedTabId, setSelectedTabId] = useState(euiTabs[0].id);
+
+ useEffect(() => {
+ const {
+ startSyncingState,
+ stopSyncingState,
+ setCurrentTab,
+ getCurrentTab,
+ } = createEditIndexPatternPageStateContainer({
+ useHashedUrl: config.get('state:storeInSessionStorage'),
+ defaultTab: TAB_INDEXED_FIELDS,
+ });
+
+ startSyncingState();
+ setSyncingStateFunc({
+ setCurrentTab,
+ getCurrentTab,
+ });
+ setSelectedTabId(getCurrentTab());
+
+ return () => {
+ stopSyncingState();
+ };
+ }, [config]);
+
+ return (
+ tab.id === selectedTabId)}
+ onTabClick={tab => {
+ setSelectedTabId(tab.id);
+ syncingStateFunc.setCurrentTab(tab.id);
+ }}
+ />
+ );
+}
diff --git a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/tabs/utils.ts b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/tabs/utils.ts
new file mode 100644
index 0000000000000..bdb1436c37efb
--- /dev/null
+++ b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/tabs/utils.ts
@@ -0,0 +1,146 @@
+/*
+ * Licensed to Elasticsearch B.V. under one or more contributor
+ * license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright
+ * ownership. Elasticsearch B.V. licenses this file to you under
+ * the Apache License, Version 2.0 (the "License"); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { Dictionary, countBy, defaults, unique } from 'lodash';
+import { i18n } from '@kbn/i18n';
+import { IndexPattern, IndexPatternField } from '../../../../../../../../../plugins/data/public';
+import { IndexPatternManagementStart } from '../../../../../../../../../plugins/index_pattern_management/public';
+import { TAB_INDEXED_FIELDS, TAB_SCRIPTED_FIELDS, TAB_SOURCE_FILTERS } from '../constants';
+
+function filterByName(items: IndexPatternField[], filter: string) {
+ const lowercaseFilter = (filter || '').toLowerCase();
+ return items.filter(item => item.name.toLowerCase().includes(lowercaseFilter));
+}
+
+function getCounts(
+ fields: IndexPatternField[],
+ sourceFilters: {
+ excludes: string[];
+ },
+ fieldFilter = ''
+) {
+ const fieldCount = countBy(filterByName(fields, fieldFilter), function(field) {
+ return field.scripted ? 'scripted' : 'indexed';
+ });
+
+ defaults(fieldCount, {
+ indexed: 0,
+ scripted: 0,
+ sourceFilters: sourceFilters.excludes
+ ? sourceFilters.excludes.filter(value =>
+ value.toLowerCase().includes(fieldFilter.toLowerCase())
+ ).length
+ : 0,
+ });
+
+ return fieldCount;
+}
+
+function getTitle(type: string, filteredCount: Dictionary, totalCount: Dictionary) {
+ let title = '';
+ switch (type) {
+ case 'indexed':
+ title = i18n.translate('kbn.management.editIndexPattern.tabs.fieldsHeader', {
+ defaultMessage: 'Fields',
+ });
+ break;
+ case 'scripted':
+ title = i18n.translate('kbn.management.editIndexPattern.tabs.scriptedHeader', {
+ defaultMessage: 'Scripted fields',
+ });
+ break;
+ case 'sourceFilters':
+ title = i18n.translate('kbn.management.editIndexPattern.tabs.sourceHeader', {
+ defaultMessage: 'Source filters',
+ });
+ break;
+ }
+ const count = ` (${
+ filteredCount[type] === totalCount[type]
+ ? filteredCount[type]
+ : filteredCount[type] + ' / ' + totalCount[type]
+ })`;
+ return title + count;
+}
+
+export function getTabs(
+ indexPattern: IndexPattern,
+ fieldFilter: string,
+ indexPatternListProvider: IndexPatternManagementStart['list']
+) {
+ const totalCount = getCounts(indexPattern.fields, indexPattern.getSourceFiltering());
+ const filteredCount = getCounts(
+ indexPattern.fields,
+ indexPattern.getSourceFiltering(),
+ fieldFilter
+ );
+
+ const tabs = [];
+
+ tabs.push({
+ name: getTitle('indexed', filteredCount, totalCount),
+ id: TAB_INDEXED_FIELDS,
+ });
+
+ if (indexPatternListProvider.areScriptedFieldsEnabled(indexPattern)) {
+ tabs.push({
+ name: getTitle('scripted', filteredCount, totalCount),
+ id: TAB_SCRIPTED_FIELDS,
+ });
+ }
+
+ tabs.push({
+ name: getTitle('sourceFilters', filteredCount, totalCount),
+ id: TAB_SOURCE_FILTERS,
+ });
+
+ return tabs;
+}
+
+export function getPath(field: IndexPatternField) {
+ return `/management/kibana/index_patterns/${field.indexPattern?.id}/field/${field.name}`;
+}
+
+const allTypesDropDown = i18n.translate('kbn.management.editIndexPattern.fields.allTypesDropDown', {
+ defaultMessage: 'All field types',
+});
+
+const allLangsDropDown = i18n.translate('kbn.management.editIndexPattern.fields.allLangsDropDown', {
+ defaultMessage: 'All languages',
+});
+
+export function convertToEuiSelectOption(options: string[], type: string) {
+ const euiOptions =
+ options.length > 0
+ ? [
+ {
+ value: '',
+ text: type === 'scriptedFieldLanguages' ? allLangsDropDown : allTypesDropDown,
+ },
+ ]
+ : [];
+ return euiOptions.concat(
+ unique(options).map(option => {
+ return {
+ value: option,
+ text: option,
+ };
+ })
+ );
+}
diff --git a/test/functional/page_objects/settings_page.ts b/test/functional/page_objects/settings_page.ts
index 6dcd017335c85..8864eda3823ef 100644
--- a/test/functional/page_objects/settings_page.ts
+++ b/test/functional/page_objects/settings_page.ts
@@ -206,15 +206,17 @@ export function SettingsPageProvider({ getService, getPageObjects }: FtrProvider
async getFieldsTabCount() {
return retry.try(async () => {
- const text = await testSubjects.getVisibleText('tab-count-indexedFields');
- return text.replace(/\((.*)\)/, '$1');
+ const indexedFieldsTab = await find.byCssSelector('#indexedFields .euiTab__content');
+ const text = await indexedFieldsTab.getVisibleText();
+ return text.split(/[()]/)[1];
});
}
async getScriptedFieldsTabCount() {
return await retry.try(async () => {
- const theText = await testSubjects.getVisibleText('tab-count-scriptedFields');
- return theText.replace(/\((.*)\)/, '$1');
+ const scriptedFieldsTab = await find.byCssSelector('#scriptedFields .euiTab__content');
+ const text = await scriptedFieldsTab.getVisibleText();
+ return text.split(/[()]/)[1];
});
}
@@ -241,13 +243,13 @@ export function SettingsPageProvider({ getService, getPageObjects }: FtrProvider
async setFieldTypeFilter(type: string) {
await find.clickByCssSelector(
- 'select[data-test-subj="indexedFieldTypeFilterDropdown"] > option[label="' + type + '"]'
+ 'select[data-test-subj="indexedFieldTypeFilterDropdown"] > option[value="' + type + '"]'
);
}
async setScriptedFieldLanguageFilter(language: string) {
await find.clickByCssSelector(
- 'select[data-test-subj="scriptedFieldLanguageFilterDropdown"] > option[label="' +
+ 'select[data-test-subj="scriptedFieldLanguageFilterDropdown"] > option[value="' +
language +
'"]'
);
@@ -412,17 +414,17 @@ export function SettingsPageProvider({ getService, getPageObjects }: FtrProvider
async clickFieldsTab() {
log.debug('click Fields tab');
- await testSubjects.click('tab-indexFields');
+ await find.clickByCssSelector('#indexedFields');
}
async clickScriptedFieldsTab() {
log.debug('click Scripted Fields tab');
- await testSubjects.click('tab-scriptedFields');
+ await find.clickByCssSelector('#scriptedFields');
}
async clickSourceFiltersTab() {
log.debug('click Source Filters tab');
- await testSubjects.click('tab-sourceFilters');
+ await find.clickByCssSelector('#sourceFilters');
}
async editScriptedField(name: string) {
diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json
index 921088f113ddd..411d8f4de0bf2 100644
--- a/x-pack/plugins/translations/translations/ja-JP.json
+++ b/x-pack/plugins/translations/translations/ja-JP.json
@@ -2181,10 +2181,8 @@
"kbn.management.createIndexPatternHeader": "{indexPatternName} の作成",
"kbn.management.createIndexPatternLabel": "Kibana は、可視化などを目的に Elasticsearch インデックスからデータを取得するために、インデックスパターンを使用します。",
"kbn.management.editIndexPattern.deleteButton": "削除",
- "kbn.management.editIndexPattern.deleteFieldButton": "削除",
"kbn.management.editIndexPattern.deleteHeader": "インデックスパターンを削除しますか?",
"kbn.management.editIndexPattern.detailsAria": "インデックスパターンの詳細",
- "kbn.management.editIndexPattern.editFieldButton": "編集",
"kbn.management.editIndexPattern.fields.allLangsDropDown": "すべての言語",
"kbn.management.editIndexPattern.fields.allTypesDropDown": "すべてのフィールドタイプ",
"kbn.management.editIndexPattern.fields.filterAria": "フィルター",
@@ -2210,8 +2208,6 @@
"kbn.management.editIndexPattern.fields.table.typeHeader": "タイプ",
"kbn.management.editIndexPattern.mappingConflictHeader": "マッピングの矛盾",
"kbn.management.editIndexPattern.mappingConflictLabel": "{conflictFieldsLength, plural, one {フィールドが} other {# フィールドが}}このパターンと一致するインデックスの間で異なるタイプ (文字列、整数など) に定義されています。これらの矛盾したフィールドは Kibana の一部で使用できますが、Kibana がタイプを把握しなければならない機能には使用できません。この問題を修正するにはデータのレンダリングが必要です。",
- "kbn.management.editIndexPattern.migrate": "移行",
- "kbn.management.editIndexPattern.notDateErrorMessage": "このフィールドは日付ではなく {fieldType} です。",
"kbn.management.editIndexPattern.refreshAria": "フィールドリストを再度読み込みます",
"kbn.management.editIndexPattern.refreshButton": "更新",
"kbn.management.editIndexPattern.refreshHeader": "フィールドリストを更新しますか?",
@@ -2267,8 +2263,6 @@
"kbn.management.editIndexPattern.timeFilterHeader": "時間フィルターフィールド名: {timeFieldName}",
"kbn.management.editIndexPattern.timeFilterLabel.mappingAPILink": "マッピング API",
"kbn.management.editIndexPattern.timeFilterLabel.timeFilterDetail": "このページは {indexPatternTitle} インデックス内のすべてのフィールドと、Elasticsearch に記録された各フィールドのコアタイプを一覧表示します。フィールドタイプを変更するには Elasticsearch を使用します",
- "kbn.management.editIndexPattern.unsupportedTimePatternHeader": "繰り返しのインデックスパターンのサポート終了",
- "kbn.management.editIndexPattern.unsupportedTimePatternLabel": "時間間隔に基づくインデックスパターンがサポートされなくなりました!Kibanaの次のメジャーなバージョンでは、これらのインデックスパターンは動作しなくなります。下に新しいパターンを指定して、このインデックスパターンをワイルドカードパターンに移行してください。",
"kbn.management.editIndexPatternLiveRegionAriaLabel": "インデックスパターン",
"kbn.management.indexPattern.goToPatternButtonLabel": "既存のパターンに移動",
"kbn.management.indexPattern.sectionsHeader": "インデックスパターン",
diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json
index 439a054562587..ea80284a1f30d 100644
--- a/x-pack/plugins/translations/translations/zh-CN.json
+++ b/x-pack/plugins/translations/translations/zh-CN.json
@@ -2182,10 +2182,8 @@
"kbn.management.createIndexPatternHeader": "创建 {indexPatternName}",
"kbn.management.createIndexPatternLabel": "Kibana 使用索引模式从 Elasticsearch 索引中检索数据,以实现诸如可视化等功能。",
"kbn.management.editIndexPattern.deleteButton": "删除",
- "kbn.management.editIndexPattern.deleteFieldButton": "删除",
"kbn.management.editIndexPattern.deleteHeader": "删除索引模式?",
"kbn.management.editIndexPattern.detailsAria": "索引模式详细信息",
- "kbn.management.editIndexPattern.editFieldButton": "编辑",
"kbn.management.editIndexPattern.fields.allLangsDropDown": "所有语言",
"kbn.management.editIndexPattern.fields.allTypesDropDown": "所有字段类型",
"kbn.management.editIndexPattern.fields.filterAria": "筛选",
@@ -2211,8 +2209,6 @@
"kbn.management.editIndexPattern.fields.table.typeHeader": "类型",
"kbn.management.editIndexPattern.mappingConflictHeader": "映射冲突",
"kbn.management.editIndexPattern.mappingConflictLabel": "匹配此模式的各个索引中{conflictFieldsLength, plural, one {一个字段已} other {# 个字段已}}定义为若干类型(字符串、整数等)。您仍能够在 Kibana 的各个部分中使用这些冲突类型,但它们将无法用于需要 Kibana 知道其类型的函数。要解决此问题,需要重新索引您的数据。",
- "kbn.management.editIndexPattern.migrate": "迁移",
- "kbn.management.editIndexPattern.notDateErrorMessage": "该字段是{fieldType},不是日期。",
"kbn.management.editIndexPattern.refreshAria": "重新加载字段列表",
"kbn.management.editIndexPattern.refreshButton": "刷新",
"kbn.management.editIndexPattern.refreshHeader": "刷新字段列表?",
@@ -2268,8 +2264,6 @@
"kbn.management.editIndexPattern.timeFilterHeader": "时间筛选字段名称:{timeFieldName}",
"kbn.management.editIndexPattern.timeFilterLabel.mappingAPILink": "映射 API",
"kbn.management.editIndexPattern.timeFilterLabel.timeFilterDetail": "此页根据 Elasticsearch 的记录列出“{indexPatternTitle}”索引中的每个字段以及字段的关联核心类型。要更改字段类型,请使用 Elasticsearch",
- "kbn.management.editIndexPattern.unsupportedTimePatternHeader": "对重复索引模式的支持已移除",
- "kbn.management.editIndexPattern.unsupportedTimePatternLabel": "对基于时间间隔的索引模式的支持已移除!在 Kibana 下一主要版本中,此索引模式将不再有效。通过在下面指定新模式,将此索引模式迁移到通配符模式。",
"kbn.management.editIndexPatternLiveRegionAriaLabel": "索引模式",
"kbn.management.indexPattern.goToPatternButtonLabel": "前往现有模式",
"kbn.management.indexPattern.sectionsHeader": "索引模式",