0}
numActiveFilters={activeFilters.length}
- data-test-subj="viewButton"
+ data-test-subj="filterButton"
>
{
- let testBed: MappingsEditorTestBed;
-
/**
* 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();
@@ -34,6 +34,11 @@ describe('Mappings editor: shape datatype', () => {
jest.useRealTimers();
});
+ beforeEach(() => {
+ onChangeHandler = jest.fn();
+ getMappingsEditorData = getMappingsEditorDataFactory(onChangeHandler);
+ });
+
test('initial view and default parameters values', async () => {
const defaultMappings = {
properties: {
@@ -45,7 +50,10 @@ describe('Mappings editor: shape datatype', () => {
const updatedMappings = { ...defaultMappings };
- testBed = setup({ value: defaultMappings, onChange: onChangeHandler });
+ await act(async () => {
+ testBed = setup({ value: defaultMappings, onChange: onChangeHandler });
+ });
+ testBed.component.update();
const {
component,
@@ -53,7 +61,7 @@ describe('Mappings editor: shape datatype', () => {
} = testBed;
// Open the flyout to edit the field
- startEditField('myField');
+ await startEditField('myField');
// Save the field and close the flyout
await updateFieldAndCloseFlyout();
diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/datatypes/text_datatype.test.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/datatypes/text_datatype.test.tsx
index 66989baa2dc67c..1832bedee0143c 100644
--- a/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/datatypes/text_datatype.test.tsx
+++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/datatypes/text_datatype.test.tsx
@@ -9,8 +9,6 @@ import { componentHelpers, MappingsEditorTestBed } from '../helpers';
import { getFieldConfig } from '../../../lib';
const { setup, getMappingsEditorDataFactory } = componentHelpers.mappingsEditor;
-const onChangeHandler = jest.fn();
-const getMappingsEditorData = getMappingsEditorDataFactory(onChangeHandler);
// Parameters automatically added to the text datatype when saved (with the default values)
export const defaultTextParameters = {
@@ -24,14 +22,14 @@ export const defaultTextParameters = {
store: false,
};
-// FLAKY: https://github.com/elastic/kibana/issues/66669
-describe.skip('Mappings editor: text datatype', () => {
- let testBed: MappingsEditorTestBed;
-
+describe('Mappings editor: text 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();
@@ -41,8 +39,9 @@ describe.skip('Mappings editor: text datatype', () => {
jest.useRealTimers();
});
- afterEach(() => {
- onChangeHandler.mockReset();
+ beforeEach(() => {
+ onChangeHandler = jest.fn();
+ getMappingsEditorData = getMappingsEditorDataFactory(onChangeHandler);
});
test('initial view and default parameters values', async () => {
@@ -56,7 +55,10 @@ describe.skip('Mappings editor: text datatype', () => {
const updatedMappings = { ...defaultMappings };
- testBed = setup({ value: defaultMappings, onChange: onChangeHandler });
+ await act(async () => {
+ testBed = setup({ value: defaultMappings, onChange: onChangeHandler });
+ });
+ testBed.component.update();
const {
component,
@@ -64,7 +66,7 @@ describe.skip('Mappings editor: text datatype', () => {
} = testBed;
// Open the flyout to edit the field
- startEditField('myField');
+ await startEditField('myField');
// It should have searchable ("index" param) active by default
const indexFieldConfig = getFieldConfig('index');
@@ -80,7 +82,7 @@ describe.skip('Mappings editor: text datatype', () => {
({ data } = await getMappingsEditorData(component));
expect(data).toEqual(updatedMappings);
- }, 10000);
+ });
test('analyzer parameter: default values', async () => {
const defaultMappings = {
@@ -96,7 +98,10 @@ describe.skip('Mappings editor: text datatype', () => {
},
};
- testBed = setup({ value: defaultMappings, onChange: onChangeHandler });
+ await act(async () => {
+ testBed = setup({ value: defaultMappings, onChange: onChangeHandler });
+ });
+ testBed.component.update();
const {
component,
@@ -113,8 +118,8 @@ describe.skip('Mappings editor: text datatype', () => {
const fieldToEdit = 'myField';
// Start edit and immediately save to have all the default values
- startEditField(fieldToEdit);
- showAdvancedSettings();
+ await startEditField(fieldToEdit);
+ await showAdvancedSettings();
await updateFieldAndCloseFlyout();
expect(exists('mappingsEditorFieldEdit')).toBe(false);
@@ -133,8 +138,8 @@ describe.skip('Mappings editor: text datatype', () => {
expect(data).toEqual(updatedMappings);
// Re-open the edit panel
- startEditField(fieldToEdit);
- showAdvancedSettings();
+ await startEditField(fieldToEdit);
+ await showAdvancedSettings();
// When no analyzer is defined, defaults to "Index default"
let indexAnalyzerValue = find('indexAnalyzer.select').props().value;
@@ -158,9 +163,8 @@ describe.skip('Mappings editor: text datatype', () => {
expect(exists('searchAnalyzer')).toBe(false);
// Uncheck the "Use same analyzer for search" checkbox and make sure the dedicated select appears
- selectCheckBox('useSameAnalyzerForSearchCheckBox.input', false);
- act(() => {
- jest.advanceTimersByTime(1000);
+ await act(async () => {
+ selectCheckBox('useSameAnalyzerForSearchCheckBox.input', false);
});
component.update();
@@ -169,7 +173,6 @@ describe.skip('Mappings editor: text datatype', () => {
let searchAnalyzerValue = find('searchAnalyzer.select').props().value;
expect(searchAnalyzerValue).toEqual('index_default');
- // Change the value of the 3 analyzers
await act(async () => {
// Change the value of the 3 analyzers
setSelectValue('indexAnalyzer.select', 'standard', false);
@@ -195,8 +198,8 @@ describe.skip('Mappings editor: text datatype', () => {
expect(data).toEqual(updatedMappings);
// Re-open the flyout and make sure the select have the correct updated value
- startEditField('myField');
- showAdvancedSettings();
+ await startEditField('myField');
+ await showAdvancedSettings();
isUseSameAnalyzerForSearchChecked = getCheckboxValue('useSameAnalyzerForSearchCheckBox.input');
expect(isUseSameAnalyzerForSearchChecked).toBe(false);
@@ -208,7 +211,7 @@ describe.skip('Mappings editor: text datatype', () => {
expect(indexAnalyzerValue).toBe('standard');
expect(searchAnalyzerValue).toBe('simple');
expect(searchQuoteAnalyzerValue).toBe('whitespace');
- }, 50000);
+ });
test('analyzer parameter: custom analyzer (external plugin)', async () => {
const defaultMappings = {
@@ -234,7 +237,10 @@ describe.skip('Mappings editor: text datatype', () => {
},
};
- testBed = setup({ value: defaultMappings, onChange: onChangeHandler });
+ await act(async () => {
+ testBed = setup({ value: defaultMappings, onChange: onChangeHandler });
+ });
+ testBed.component.update();
const {
find,
@@ -245,8 +251,8 @@ describe.skip('Mappings editor: text datatype', () => {
} = testBed;
const fieldToEdit = 'myField';
- startEditField(fieldToEdit);
- showAdvancedSettings();
+ await startEditField(fieldToEdit);
+ await showAdvancedSettings();
expect(exists('indexAnalyzer-custom')).toBe(true);
expect(exists('searchAnalyzer-custom')).toBe(true);
@@ -301,7 +307,7 @@ describe.skip('Mappings editor: text datatype', () => {
};
expect(data).toEqual(updatedMappings);
- }, 100000);
+ });
test('analyzer parameter: custom analyzer (from index settings)', async () => {
const indexSettings = {
@@ -320,8 +326,6 @@ describe.skip('Mappings editor: text datatype', () => {
const customAnalyzers = Object.keys(indexSettings.analysis.analyzer);
const defaultMappings = {
- _meta: {},
- _source: {},
properties: {
myField: {
type: 'text',
@@ -340,11 +344,14 @@ describe.skip('Mappings editor: text datatype', () => {
},
};
- testBed = setup({
- value: defaultMappings,
- onChange: onChangeHandler,
- indexSettings,
+ await act(async () => {
+ testBed = setup({
+ value: defaultMappings,
+ onChange: onChangeHandler,
+ indexSettings,
+ });
});
+ testBed.component.update();
const {
component,
@@ -354,8 +361,8 @@ describe.skip('Mappings editor: text datatype', () => {
} = testBed;
const fieldToEdit = 'myField';
- startEditField(fieldToEdit);
- showAdvancedSettings();
+ await startEditField(fieldToEdit);
+ await showAdvancedSettings();
// It should have 2 selects
const indexAnalyzerSelects = find('indexAnalyzer.select');
@@ -395,5 +402,5 @@ describe.skip('Mappings editor: text datatype', () => {
};
expect(data).toEqual(updatedMappings);
- }, 50000);
+ });
});
diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/edit_field.test.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/edit_field.test.tsx
index c146c7704911fa..96348178351017 100644
--- a/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/edit_field.test.tsx
+++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/edit_field.test.tsx
@@ -8,10 +8,14 @@ import { act } from 'react-dom/test-utils';
import { componentHelpers, MappingsEditorTestBed } from './helpers';
import { defaultTextParameters, defaultShapeParameters } from './datatypes';
const { setup, getMappingsEditorDataFactory } = componentHelpers.mappingsEditor;
-const onChangeHandler = jest.fn();
-const getMappingsEditorData = getMappingsEditorDataFactory(onChangeHandler);
describe('Mappings editor: edit field', () => {
+ /**
+ * 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(() => {
@@ -22,8 +26,9 @@ describe('Mappings editor: edit field', () => {
jest.useRealTimers();
});
- afterEach(() => {
- onChangeHandler.mockReset();
+ beforeEach(() => {
+ onChangeHandler = jest.fn();
+ getMappingsEditorData = getMappingsEditorDataFactory(onChangeHandler);
});
test('should open a flyout with the correct field to edit', async () => {
@@ -43,7 +48,11 @@ describe('Mappings editor: edit field', () => {
},
};
- testBed = setup({ value: defaultMappings, onChange: onChangeHandler });
+ await act(async () => {
+ testBed = setup({ value: defaultMappings, onChange: onChangeHandler });
+ });
+ testBed.component.update();
+
await testBed.actions.expandAllFieldsAndReturnMetadata();
const {
@@ -51,7 +60,7 @@ describe('Mappings editor: edit field', () => {
actions: { startEditField },
} = testBed;
// Open the flyout to edit the field
- startEditField('user.address.street');
+ await startEditField('user.address.street');
// It should have the correct title
expect(find('mappingsEditorFieldEdit.flyoutTitle').text()).toEqual(`Edit field 'street'`);
@@ -72,7 +81,10 @@ describe('Mappings editor: edit field', () => {
},
};
- testBed = setup({ value: defaultMappings, onChange: onChangeHandler });
+ await act(async () => {
+ testBed = setup({ value: defaultMappings, onChange: onChangeHandler });
+ });
+ testBed.component.update();
const {
find,
@@ -83,19 +95,18 @@ describe('Mappings editor: edit field', () => {
expect(exists('userNameField' as any)).toBe(true);
// Open the flyout, change the field type and save it
- startEditField('userName');
+ await startEditField('userName');
// Change the field type
- find('mappingsEditorFieldEdit.fieldType').simulate('change', [
- { label: 'Shape', value: defaultShapeParameters.type },
- ]);
- act(() => {
- jest.advanceTimersByTime(1000);
+ await act(async () => {
+ find('mappingsEditorFieldEdit.fieldType').simulate('change', [
+ { label: 'Shape', value: defaultShapeParameters.type },
+ ]);
});
await updateFieldAndCloseFlyout();
- const { data } = await getMappingsEditorData(component);
+ ({ data } = await getMappingsEditorData(component));
const updatedMappings = {
...defaultMappings,
@@ -107,5 +118,5 @@ describe('Mappings editor: edit field', () => {
};
expect(data).toEqual(updatedMappings);
- }, 50000);
+ });
});
diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/helpers/mappings_editor.helpers.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/helpers/mappings_editor.helpers.tsx
index a6558b28a12734..2a4af89c46559f 100644
--- a/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/helpers/mappings_editor.helpers.tsx
+++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/helpers/mappings_editor.helpers.tsx
@@ -149,22 +149,28 @@ const createActions = (testBed: TestBed) => {
return { field: find(testSubject as TestSubjects), testSubject };
};
- const addField = (name: string, type: string) => {
- form.setInputValue('nameParameterInput', name);
- find('createFieldForm.fieldType').simulate('change', [
- {
- label: type,
- value: type,
- },
- ]);
- find('createFieldForm.addButton').simulate('click');
+ const addField = async (name: string, type: string) => {
+ await act(async () => {
+ form.setInputValue('nameParameterInput', name);
+ find('createFieldForm.fieldType').simulate('change', [
+ {
+ label: type,
+ value: type,
+ },
+ ]);
+ });
+
+ await act(async () => {
+ find('createFieldForm.addButton').simulate('click');
+ });
+
+ component.update();
};
- const startEditField = (path: string) => {
+ const startEditField = async (path: string) => {
const { testSubject } = getFieldAt(path);
- find(`${testSubject}.editFieldButton` as TestSubjects).simulate('click');
- act(() => {
- jest.advanceTimersByTime(1000);
+ await act(async () => {
+ find(`${testSubject}.editFieldButton` as TestSubjects).simulate('click');
});
component.update();
};
@@ -174,34 +180,33 @@ const createActions = (testBed: TestBed) => {
find('mappingsEditorFieldEdit.editFieldUpdateButton').simulate('click');
});
component.update();
-
- act(() => {
- jest.advanceTimersByTime(1000);
- });
};
- const showAdvancedSettings = () => {
+ const showAdvancedSettings = async () => {
if (find('mappingsEditorFieldEdit.advancedSettings').props().style.display === 'block') {
// Already opened, nothing else to do
return;
}
- find('mappingsEditorFieldEdit.toggleAdvancedSetting').simulate('click');
-
- act(() => {
- jest.advanceTimersByTime(1000);
+ await act(async () => {
+ find('mappingsEditorFieldEdit.toggleAdvancedSetting').simulate('click');
});
+
component.update();
};
- const selectTab = (tab: 'fields' | 'templates' | 'advanced') => {
+ const selectTab = async (tab: 'fields' | 'templates' | 'advanced') => {
const index = ['fields', 'templates', 'advanced'].indexOf(tab);
const tabElement = find('formTab').at(index);
if (tabElement.length === 0) {
throw new Error(`Tab not found: "${tab}"`);
}
- tabElement.simulate('click');
+
+ await act(async () => {
+ tabElement.simulate('click');
+ });
+ component.update();
};
const updateJsonEditor = (testSubject: TestSubjects, value: object) => {
diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/mappings_editor.test.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/mappings_editor.test.tsx
index 0743211a2b7bff..68933ddc9a935d 100644
--- a/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/mappings_editor.test.tsx
+++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/mappings_editor.test.tsx
@@ -8,15 +8,15 @@ import { act } from 'react-dom/test-utils';
import { componentHelpers, MappingsEditorTestBed } from './helpers';
const { setup, getMappingsEditorDataFactory } = componentHelpers.mappingsEditor;
-const onChangeHandler = jest.fn();
-const getMappingsEditorData = getMappingsEditorDataFactory(onChangeHandler);
-// FLAKY: https://github.com/elastic/kibana/issues/66457
-describe.skip('Mappings editor: core', () => {
+describe('Mappings editor: core', () => {
/**
* 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();
@@ -26,8 +26,9 @@ describe.skip('Mappings editor: core', () => {
jest.useRealTimers();
});
- afterEach(() => {
- onChangeHandler.mockReset();
+ beforeEach(() => {
+ onChangeHandler = jest.fn();
+ getMappingsEditorData = getMappingsEditorDataFactory(onChangeHandler);
});
test('default behaviour', async () => {
@@ -42,11 +43,14 @@ describe.skip('Mappings editor: core', () => {
},
};
- const { component } = setup({ value: defaultMappings, onChange: onChangeHandler });
+ await act(async () => {
+ testBed = setup({ value: defaultMappings, onChange: onChangeHandler });
+ });
+
+ const { component } = testBed;
+ component.update();
const expectedMappings = {
- _meta: {}, // Was not defined so an empty object is returned
- _source: {}, // Was not defined so an empty object is returned
...defaultMappings,
properties: {
user: {
@@ -78,8 +82,13 @@ describe.skip('Mappings editor: core', () => {
},
},
};
- const testBed = setup({ onChange: onChangeHandler, value });
- const { exists } = testBed;
+
+ await act(async () => {
+ testBed = setup({ onChange: onChangeHandler, value });
+ });
+
+ const { component, exists } = testBed;
+ component.update();
expect(exists('mappingsEditor')).toBe(true);
expect(exists('mappingTypesDetectedCallout')).toBe(true);
@@ -94,8 +103,12 @@ describe.skip('Mappings editor: core', () => {
},
},
};
- const testBed = setup({ onChange: onChangeHandler, value });
- const { exists } = testBed;
+ await act(async () => {
+ testBed = setup({ onChange: onChangeHandler, value });
+ });
+
+ const { component, exists } = testBed;
+ component.update();
expect(exists('mappingsEditor')).toBe(true);
expect(exists('mappingTypesDetectedCallout')).toBe(false);
@@ -108,10 +121,12 @@ describe.skip('Mappings editor: core', () => {
properties: {},
dynamic_templates: [{ before: 'foo' }],
};
- let testBed: MappingsEditorTestBed;
beforeEach(async () => {
- testBed = setup({ value: defaultMappings, onChange: onChangeHandler });
+ await act(async () => {
+ testBed = setup({ value: defaultMappings, onChange: onChangeHandler });
+ });
+ testBed.component.update();
});
test('should keep the changes when switching tabs', async () => {
@@ -129,10 +144,7 @@ describe.skip('Mappings editor: core', () => {
expect(find('fieldsListItem').length).toEqual(0); // Check that we start with an empty list
const newField = { name: 'John', type: 'text' };
- await act(async () => {
- addField(newField.name, newField.type);
- });
- component.update();
+ await addField(newField.name, newField.type);
expect(find('fieldsListItem').length).toEqual(1);
@@ -142,10 +154,7 @@ describe.skip('Mappings editor: core', () => {
// -------------------------------------
// Navigate to dynamic templates tab
// -------------------------------------
- await act(async () => {
- selectTab('templates');
- });
- component.update();
+ await selectTab('templates');
let templatesValue = getJsonEditorValue('dynamicTemplatesEditor');
expect(templatesValue).toEqual(defaultMappings.dynamic_templates);
@@ -163,10 +172,7 @@ describe.skip('Mappings editor: core', () => {
// ------------------------------------------------------
// Switch to advanced settings tab and make some changes
// ------------------------------------------------------
- await act(async () => {
- selectTab('advanced');
- });
- component.update();
+ await selectTab('advanced');
let isDynamicMappingsEnabled = getToggleValue(
'advancedConfiguration.dynamicMappingsToggle.input'
@@ -194,10 +200,7 @@ describe.skip('Mappings editor: core', () => {
// ----------------------------------------------------------------------------
// Go back to dynamic templates tab and make sure our changes are still there
// ----------------------------------------------------------------------------
- await act(async () => {
- selectTab('templates');
- });
- component.update();
+ await selectTab('templates');
templatesValue = getJsonEditorValue('dynamicTemplatesEditor');
expect(templatesValue).toEqual(updatedValueTemplates);
@@ -205,18 +208,13 @@ describe.skip('Mappings editor: core', () => {
// -----------------------------------------------------------
// Go back to fields and make sure our created field is there
// -----------------------------------------------------------
- await act(async () => {
- selectTab('fields');
- });
- component.update();
+ await selectTab('fields');
+
field = find('fieldsListItem').at(0);
expect(find('fieldName', field).text()).toEqual(newField.name);
// Go back to advanced settings tab make sure dynamic mappings is disabled
- await act(async () => {
- selectTab('advanced');
- });
- component.update();
+ await selectTab('advanced');
isDynamicMappingsEnabled = getToggleValue(
'advancedConfiguration.dynamicMappingsToggle.input'
@@ -231,46 +229,47 @@ describe.skip('Mappings editor: core', () => {
/**
* Note: the "indexSettings" prop will be tested along with the "analyzer" parameter on a text datatype field,
* as it is the only place where it is consumed by the mappings editor.
- *
- * The test that covers it is text_datatype.test.tsx: "analyzer parameter: custom analyzer (from index settings)"
+ * The test that covers it is in the "text_datatype.test.tsx": "analyzer parameter: custom analyzer (from index settings)"
*/
- const defaultMappings: any = {
- dynamic: true,
- numeric_detection: false,
- date_detection: true,
- properties: {
- title: { type: 'text' },
- address: {
- type: 'object',
- properties: {
- street: { type: 'text' },
- city: { type: 'text' },
+ let defaultMappings: any;
+
+ beforeEach(async () => {
+ defaultMappings = {
+ dynamic: true,
+ numeric_detection: false,
+ date_detection: true,
+ properties: {
+ title: { type: 'text' },
+ address: {
+ type: 'object',
+ properties: {
+ street: { type: 'text' },
+ city: { type: 'text' },
+ },
},
},
- },
- dynamic_templates: [{ initial: 'value' }],
- _source: {
- enabled: true,
- includes: ['field1', 'field2'],
- excludes: ['field3'],
- },
- _meta: {
- some: 'metaData',
- },
- _routing: {
- required: false,
- },
- };
-
- let testBed: MappingsEditorTestBed;
+ dynamic_templates: [{ initial: 'value' }],
+ _source: {
+ enabled: true,
+ includes: ['field1', 'field2'],
+ excludes: ['field3'],
+ },
+ _meta: {
+ some: 'metaData',
+ },
+ _routing: {
+ required: false,
+ },
+ };
- beforeEach(async () => {
- testBed = setup({ value: defaultMappings, onChange: onChangeHandler });
+ await act(async () => {
+ testBed = setup({ value: defaultMappings, onChange: onChangeHandler });
+ });
+ testBed.component.update();
});
test('props.value => should prepopulate the editor data', async () => {
const {
- component,
actions: { selectTab, getJsonEditorValue, getComboBoxValue, getToggleValue },
find,
} = testBed;
@@ -285,10 +284,7 @@ describe.skip('Mappings editor: core', () => {
/**
* Dynamic templates
*/
- await act(async () => {
- selectTab('templates');
- });
- component.update();
+ await selectTab('templates');
// Test that dynamic templates JSON is rendered in the templates editor
const templatesValue = getJsonEditorValue('dynamicTemplatesEditor');
@@ -297,10 +293,7 @@ describe.skip('Mappings editor: core', () => {
/**
* Advanced settings
*/
- await act(async () => {
- selectTab('advanced');
- });
- component.update();
+ await selectTab('advanced');
const isDynamicMappingsEnabled = getToggleValue(
'advancedConfiguration.dynamicMappingsToggle.input'
@@ -339,7 +332,14 @@ describe.skip('Mappings editor: core', () => {
/**
* Mapped fields
*/
+ await act(async () => {
+ find('addFieldButton').simulate('click');
+ });
+ component.update();
+
const newField = { name: 'someNewField', type: 'text' };
+ await addField(newField.name, newField.type);
+
updatedMappings = {
...updatedMappings,
properties: {
@@ -348,26 +348,14 @@ describe.skip('Mappings editor: core', () => {
},
};
- await act(async () => {
- find('addFieldButton').simulate('click');
- });
- component.update();
-
- await act(async () => {
- addField(newField.name, newField.type);
- });
- component.update();
-
({ data } = await getMappingsEditorData(component));
+
expect(data).toEqual(updatedMappings);
/**
* Dynamic templates
*/
- await act(async () => {
- await selectTab('templates');
- });
- component.update();
+ await selectTab('templates');
const updatedTemplatesValue = [{ someTemplateProp: 'updated' }];
updatedMappings = {
@@ -385,10 +373,7 @@ describe.skip('Mappings editor: core', () => {
/**
* Advanced settings
*/
- await act(async () => {
- selectTab('advanced');
- });
- component.update();
+ await selectTab('advanced');
// Disbable dynamic mappings
await act(async () => {
diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/analyzer_parameter.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/analyzer_parameter.tsx
index dc52a362008c60..1457c4583aa0e8 100644
--- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/analyzer_parameter.tsx
+++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/analyzer_parameter.tsx
@@ -71,9 +71,8 @@ export const AnalyzerParameter = ({
allowsIndexDefaultOption = true,
'data-test-subj': dataTestSubj,
}: Props) => {
- const indexSettings = useIndexSettings();
+ const { value: indexSettings } = useIndexSettings();
const customAnalyzers = getCustomAnalyzers(indexSettings);
-
const analyzerOptions = allowsIndexDefaultOption
? ANALYZER_OPTIONS
: ANALYZER_OPTIONS_WITHOUT_DEFAULT;
diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/analyzer_parameter_selects.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/analyzer_parameter_selects.tsx
index 17d3ea0909bfbf..c966df82fb5072 100644
--- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/analyzer_parameter_selects.tsx
+++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/analyzer_parameter_selects.tsx
@@ -49,16 +49,17 @@ export const AnalyzerParameterSelects = ({
'data-test-subj': dataTestSubj,
}: Props) => {
const { form } = useForm({ defaultValue: { main: mainDefaultValue, sub: subDefaultValue } });
+ const { subscribe } = form;
useEffect(() => {
- const subscription = form.subscribe((updateData) => {
+ const subscription = subscribe((updateData) => {
const formData = updateData.data.raw;
const value = formData.sub ? formData.sub : formData.main;
onChange(value);
});
return subscription.unsubscribe;
- }, [form, onChange]);
+ }, [subscribe, onChange]);
const getSubOptionsMeta = useCallback(
(mainValue: string) =>
diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/index_settings_context.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/index_settings_context.tsx
index 411193f10b24af..bd84c3a905ec8d 100644
--- a/x-pack/plugins/index_management/public/application/components/mappings_editor/index_settings_context.tsx
+++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/index_settings_context.tsx
@@ -3,23 +3,32 @@
* 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, { createContext, useContext } from 'react';
+import React, { createContext, useContext, useState } from 'react';
import { IndexSettings } from './types';
-const IndexSettingsContext = createContext(undefined);
+const IndexSettingsContext = createContext<
+ { value: IndexSettings; update: (value: IndexSettings) => void } | undefined
+>(undefined);
interface Props {
- indexSettings: IndexSettings | undefined;
children: React.ReactNode;
}
-export const IndexSettingsProvider = ({ indexSettings = {}, children }: Props) => (
- {children}
-);
+export const IndexSettingsProvider = ({ children }: Props) => {
+ const [state, setState] = useState({});
+
+ return (
+
+ {children}
+
+ );
+};
export const useIndexSettings = () => {
const ctx = useContext(IndexSettingsContext);
-
- return ctx === undefined ? {} : ctx;
+ if (ctx === undefined) {
+ throw new Error('useIndexSettings must be used within a ');
+ }
+ return ctx;
};
diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/mappings_editor.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/mappings_editor.tsx
index 39451639bfb864..39c4a2885efa5c 100644
--- a/x-pack/plugins/index_management/public/application/components/mappings_editor/mappings_editor.tsx
+++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/mappings_editor.tsx
@@ -25,7 +25,7 @@ import {
import { extractMappingsDefinition } from './lib';
import { useMappingsState } from './mappings_state_context';
import { useMappingsStateListener } from './use_state_listener';
-import { IndexSettingsProvider } from './index_settings_context';
+import { useIndexSettings } from './index_settings_context';
type TabName = 'fields' | 'advanced' | 'templates';
@@ -94,6 +94,12 @@ export const MappingsEditor = React.memo(({ onChange, value, indexSettings }: Pr
*/
useMappingsStateListener({ onChange, value: parsedDefaultValue });
+ // Update the Index settings context so it is available in the Global flyout
+ const { update: updateIndexSettings } = useIndexSettings();
+ if (indexSettings !== undefined) {
+ updateIndexSettings(indexSettings);
+ }
+
const state = useMappingsState();
const [selectedTab, selectTab] = useState('fields');
@@ -141,43 +147,41 @@ export const MappingsEditor = React.memo(({ onChange, value, indexSettings }: Pr
{multipleMappingsDeclared ? (
) : (
-
-
-
- changeTab('fields')}
- isSelected={selectedTab === 'fields'}
- data-test-subj="formTab"
- >
- {i18n.translate('xpack.idxMgmt.mappingsEditor.fieldsTabLabel', {
- defaultMessage: 'Mapped fields',
- })}
-
- changeTab('templates')}
- isSelected={selectedTab === 'templates'}
- data-test-subj="formTab"
- >
- {i18n.translate('xpack.idxMgmt.mappingsEditor.templatesTabLabel', {
- defaultMessage: 'Dynamic templates',
- })}
-
- changeTab('advanced')}
- isSelected={selectedTab === 'advanced'}
- data-test-subj="formTab"
- >
- {i18n.translate('xpack.idxMgmt.mappingsEditor.advancedTabLabel', {
- defaultMessage: 'Advanced options',
- })}
-
-
-
-
-
- {tabToContentMap[selectedTab]}
-
-
+
+
+ changeTab('fields')}
+ isSelected={selectedTab === 'fields'}
+ data-test-subj="formTab"
+ >
+ {i18n.translate('xpack.idxMgmt.mappingsEditor.fieldsTabLabel', {
+ defaultMessage: 'Mapped fields',
+ })}
+
+ changeTab('templates')}
+ isSelected={selectedTab === 'templates'}
+ data-test-subj="formTab"
+ >
+ {i18n.translate('xpack.idxMgmt.mappingsEditor.templatesTabLabel', {
+ defaultMessage: 'Dynamic templates',
+ })}
+
+ changeTab('advanced')}
+ isSelected={selectedTab === 'advanced'}
+ data-test-subj="formTab"
+ >
+ {i18n.translate('xpack.idxMgmt.mappingsEditor.advancedTabLabel', {
+ defaultMessage: 'Advanced options',
+ })}
+
+
+
+
+
+ {tabToContentMap[selectedTab]}
+
)}