From da56acacc8917bfa5ce3098f532e9bc30e82341e Mon Sep 17 00:00:00 2001 From: Sonia Sanz Vivas Date: Thu, 7 Nov 2024 12:09:06 +0100 Subject: [PATCH] Allow empty spaces un Gsub processor (#197815) Closes [#191920](https://github.com/elastic/kibana/issues/191920) ## Summary In the pattern field of the GSUB processor, we were validating that the field is not empty. But for this case we must allow spaces as values. To fix this, I've added a second parameter `trimString` to the `emptyField` validator. If the parameter is set to true by default so the behavior of the validator doesn't change in all the fields that already use it. But when the parameter is set to false, as in this case, the entry value string is not trimmed, so it only validate to false if the field is actually empty. I also added some unit tests to make sure that this new condition doesn't break the validator. https://github.com/user-attachments/assets/049f7424-00c6-4bb2-ab89-2ce158ac4c4e #### Notes In the video it can be seen that a banner flashes when saving. It is a bug that already happened before this one. I've opened [an issue](https://github.com/elastic/kibana/issues/197810) to address it. (cherry picked from commit 2f7f8e34db1fe38cc3a587a753533992398df691) --- .../field_validators/empty_field.test.ts | 48 +++++++++++++++++++ .../helpers/field_validators/empty_field.ts | 6 ++- .../static/validators/string/is_empty.ts | 3 +- .../processor_form/processors/gsub.tsx | 3 +- 4 files changed, 56 insertions(+), 4 deletions(-) create mode 100644 src/plugins/es_ui_shared/static/forms/helpers/field_validators/empty_field.test.ts diff --git a/src/plugins/es_ui_shared/static/forms/helpers/field_validators/empty_field.test.ts b/src/plugins/es_ui_shared/static/forms/helpers/field_validators/empty_field.test.ts new file mode 100644 index 0000000000000..e05f7c86b8a60 --- /dev/null +++ b/src/plugins/es_ui_shared/static/forms/helpers/field_validators/empty_field.test.ts @@ -0,0 +1,48 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { ValidationFuncArg } from '../../hook_form_lib'; +import { emptyField } from './empty_field'; + +describe('emptyField', () => { + const message = 'test error message'; + const code = 'ERR_FIELD_MISSING'; + const path = 'path'; + + const validator = (value: string | any[], trimString?: boolean) => + emptyField(message, trimString)({ value, path } as ValidationFuncArg); + + test('should return Validation function if value is an empty string and trimString is true', () => { + expect(validator('')).toMatchObject({ message, code, path }); + }); + + test('should return Validation function if value is an empty string and trimString is false', () => { + expect(validator('', false)).toMatchObject({ message, code, path }); + }); + + test('should return Validation function if value is a space and trimString is true', () => { + expect(validator(' ')).toMatchObject({ message, code, path }); + }); + + test('should return undefined if value is a space and trimString is false', () => { + expect(validator(' ', false)).toBeUndefined(); + }); + + test('should return undefined if value is a string and is not empty', () => { + expect(validator('not Empty')).toBeUndefined(); + }); + + test('should return undefined if value an array and is not empty', () => { + expect(validator(['not Empty'])).toBeUndefined(); + }); + + test('should return undefined if value an array and is empty', () => { + expect(validator([])).toMatchObject({ message, code, path }); + }); +}); diff --git a/src/plugins/es_ui_shared/static/forms/helpers/field_validators/empty_field.ts b/src/plugins/es_ui_shared/static/forms/helpers/field_validators/empty_field.ts index 3b09e165984d4..9917b273d666c 100644 --- a/src/plugins/es_ui_shared/static/forms/helpers/field_validators/empty_field.ts +++ b/src/plugins/es_ui_shared/static/forms/helpers/field_validators/empty_field.ts @@ -13,12 +13,14 @@ import { isEmptyArray } from '../../../validators/array'; import { ERROR_CODE } from './types'; export const emptyField = - (message: string) => + (message: string, trimString: boolean = true) => (...args: Parameters): ReturnType> => { const [{ value, path }] = args; if (typeof value === 'string') { - return isEmptyString(value) ? { code: 'ERR_FIELD_MISSING', path, message } : undefined; + return isEmptyString(value, trimString) + ? { code: 'ERR_FIELD_MISSING', path, message } + : undefined; } if (Array.isArray(value)) { diff --git a/src/plugins/es_ui_shared/static/validators/string/is_empty.ts b/src/plugins/es_ui_shared/static/validators/string/is_empty.ts index f70cbd36213ed..197d707f5edbf 100644 --- a/src/plugins/es_ui_shared/static/validators/string/is_empty.ts +++ b/src/plugins/es_ui_shared/static/validators/string/is_empty.ts @@ -7,4 +7,5 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -export const isEmptyString = (value: string) => value.trim() === ''; +export const isEmptyString = (value: string, trimString: boolean = true) => + (trimString ? value.trim() : value) === ''; diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/components/processor_form/processors/gsub.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/components/processor_form/processors/gsub.tsx index 7e72848485c11..8e12be6880d00 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/components/processor_form/processors/gsub.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/components/processor_form/processors/gsub.tsx @@ -37,7 +37,8 @@ const fieldsConfig: FieldsConfig = { validator: emptyField( i18n.translate('xpack.ingestPipelines.pipelineEditor.gsubForm.patternRequiredError', { defaultMessage: 'A value is required.', - }) + }), + false ), }, {