From 4fe7625f584a6d2969fa10427e5bc339b943a404 Mon Sep 17 00:00:00 2001
From: Alison Goryachev
Date: Thu, 1 Oct 2020 08:44:29 -0400
Subject: [PATCH] [Mappings editor] Add support for version field type (#78206)
---
.../datatypes/version_datatype.test.tsx | 95 +++++++++++++++++++
.../fields/field_types/index.ts | 2 +
.../fields/field_types/version_type.tsx | 27 ++++++
.../constants/data_types_definition.tsx | 30 ++++++
.../mappings_editor/types/document_fields.ts | 1 +
5 files changed, 155 insertions(+)
create mode 100644 x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/datatypes/version_datatype.test.tsx
create mode 100644 x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/field_types/version_type.tsx
diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/datatypes/version_datatype.test.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/datatypes/version_datatype.test.tsx
new file mode 100644
index 0000000000000..61f67b04ec3cd
--- /dev/null
+++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/datatypes/version_datatype.test.tsx
@@ -0,0 +1,95 @@
+/*
+ * 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 { act } from 'react-dom/test-utils';
+
+import { componentHelpers, MappingsEditorTestBed } from '../helpers';
+
+const { setup, getMappingsEditorDataFactory } = componentHelpers.mappingsEditor;
+
+// Parameters automatically added to the version datatype when saved (with the default values)
+export const defaultVersionParameters = {
+ type: 'version',
+};
+
+describe('Mappings editor: version datatype', () => {
+ /**
+ * Variable to store the mappings data forwarded to the consumer component
+ */
+ let data: any;
+ let onChangeHandler: jest.Mock = jest.fn();
+ let getMappingsEditorData = getMappingsEditorDataFactory(onChangeHandler);
+ let testBed: MappingsEditorTestBed;
+
+ beforeAll(() => {
+ jest.useFakeTimers();
+ });
+
+ afterAll(() => {
+ jest.useRealTimers();
+ });
+
+ beforeEach(() => {
+ onChangeHandler = jest.fn();
+ getMappingsEditorData = getMappingsEditorDataFactory(onChangeHandler);
+ });
+
+ test('supports meta parameter', async () => {
+ const defaultMappings = {
+ properties: {
+ myField: {
+ type: 'version',
+ },
+ },
+ };
+
+ const updatedMappings = { ...defaultMappings };
+
+ const metaParameter = {
+ meta: {
+ my_metadata: 'foobar',
+ },
+ };
+
+ await act(async () => {
+ testBed = setup({ value: defaultMappings, onChange: onChangeHandler });
+ });
+ testBed.component.update();
+
+ const {
+ component,
+ actions: {
+ startEditField,
+ updateFieldAndCloseFlyout,
+ showAdvancedSettings,
+ toggleFormRow,
+ updateJsonEditor,
+ },
+ } = testBed;
+
+ // Open the flyout to edit the field
+ await startEditField('myField');
+ await showAdvancedSettings();
+
+ // Enable the meta parameter and provide a valid object
+ toggleFormRow('metaParameter');
+ await act(async () => {
+ updateJsonEditor('metaParameterEditor', metaParameter.meta);
+ });
+ component.update();
+
+ // Save the field and close the flyout
+ await updateFieldAndCloseFlyout();
+
+ // It should have the default parameters values added, plus metadata
+ updatedMappings.properties.myField = {
+ ...defaultVersionParameters,
+ ...metaParameter,
+ };
+
+ ({ data } = await getMappingsEditorData(component));
+ expect(data).toEqual(updatedMappings);
+ });
+});
diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/field_types/index.ts b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/field_types/index.ts
index 4d36b4dd2578d..d135d1b81419c 100644
--- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/field_types/index.ts
+++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/field_types/index.ts
@@ -34,6 +34,7 @@ import { RankFeatureType } from './rank_feature_type';
import { RuntimeType } from './runtime_type';
import { WildcardType } from './wildcard_type';
import { PointType } from './point_type';
+import { VersionType } from './version_type';
const typeToParametersFormMap: { [key in DataType]?: ComponentType } = {
alias: AliasType,
@@ -64,6 +65,7 @@ const typeToParametersFormMap: { [key in DataType]?: ComponentType } = {
runtime: RuntimeType,
wildcard: WildcardType,
point: PointType,
+ version: VersionType,
};
export const getParametersFormForType = (
diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/field_types/version_type.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/field_types/version_type.tsx
new file mode 100644
index 0000000000000..24ee356c5db77
--- /dev/null
+++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/field_types/version_type.tsx
@@ -0,0 +1,27 @@
+/*
+ * 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 { NormalizedField, Field as FieldType, ParameterName } from '../../../../types';
+import { getFieldConfig } from '../../../../lib';
+import { MetaParameter } from '../../field_parameters';
+import { AdvancedParametersSection } from '../edit_field';
+
+interface Props {
+ field: NormalizedField;
+}
+
+const getDefaultToggleValue = (param: ParameterName, field: FieldType) => {
+ return field[param] !== undefined && field[param] !== getFieldConfig(param).defaultValue;
+};
+
+export const VersionType = ({ field }: Props) => {
+ return (
+
+
+
+ );
+};
diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/data_types_definition.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/data_types_definition.tsx
index 7bcd8f32f1a7d..07ca0a69afefb 100644
--- a/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/data_types_definition.tsx
+++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/data_types_definition.tsx
@@ -860,6 +860,35 @@ export const TYPE_DEFINITION: { [key in DataType]: DataTypeDefinition } = {
),
},
+ version: {
+ label: i18n.translate('xpack.idxMgmt.mappingsEditor.dataType.versionDescription', {
+ defaultMessage: 'Version',
+ }),
+ value: 'version',
+ documentation: {
+ main: '/version.html',
+ },
+ description: () => (
+
+
+ {i18n.translate(
+ 'xpack.idxMgmt.mappingsEditor.dataType.versionLongDescription.keywordTypeLink',
+ {
+ defaultMessage: 'keyword data type',
+ }
+ )}
+
+ ),
+ }}
+ />
+
+ ),
+ },
wildcard: {
label: i18n.translate('xpack.idxMgmt.mappingsEditor.dataType.wildcardDescription', {
defaultMessage: 'Wildcard',
@@ -923,6 +952,7 @@ export const MAIN_TYPES: MainType[] = [
'histogram',
'wildcard',
'point',
+ 'version',
'other',
];
diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/types/document_fields.ts b/x-pack/plugins/index_management/public/application/components/mappings_editor/types/document_fields.ts
index 48282abd1d799..926b4c9d12bee 100644
--- a/x-pack/plugins/index_management/public/application/components/mappings_editor/types/document_fields.ts
+++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/types/document_fields.ts
@@ -64,6 +64,7 @@ export type MainType =
| 'point'
| 'histogram'
| 'constant_keyword'
+ | 'version'
| 'wildcard'
/**
* 'other' is a special type that only exists inside of MappingsEditor as a placeholder