diff --git a/backend/src/baserow/contrib/builder/elements/element_types.py b/backend/src/baserow/contrib/builder/elements/element_types.py index 1c386bfd22..b39e68d3c6 100644 --- a/backend/src/baserow/contrib/builder/elements/element_types.py +++ b/backend/src/baserow/contrib/builder/elements/element_types.py @@ -1515,10 +1515,11 @@ def is_valid( """ :param element: The element we're trying to use form data in. :param value: The form data value, which may be invalid. + :param dispatch_context: The context the element is being used in. :return: Whether the value is valid or not for this element. """ - if not value: + if value == "": if element.required: raise ValueError("The value is required") @@ -1919,6 +1920,7 @@ def is_valid( :param element: The choice element. :param value: The choice value we want to validate. + :param dispatch_context: The context this element was dispatched with. :return: The value if it is valid for this element. """ diff --git a/backend/tests/baserow/contrib/builder/elements/test_element_types.py b/backend/tests/baserow/contrib/builder/elements/test_element_types.py index db4c9a7032..69582e5e42 100644 --- a/backend/tests/baserow/contrib/builder/elements/test_element_types.py +++ b/backend/tests/baserow/contrib/builder/elements/test_element_types.py @@ -515,12 +515,16 @@ def test_choice_element_import_export_formula(data_fixture): "required,type,value,result", [ (True, "integer", "", ValueError), + (True, "integer", 0, 0), (True, "integer", 42, 42), + (True, "integer", -42, -42), + (True, "integer", 3.14, 3.14), (True, "integer", "4.2", 4.2), (True, "integer", "4,2", TypeError), (True, "integer", "42", 42), (True, "integer", "horse", TypeError), (False, "integer", "", ""), + (True, "email", "", ValueError), (True, "email", "foo@bar.com", "foo@bar.com"), (True, "email", "foobar.com", ValueError), (False, "email", "", ""), diff --git a/changelog/entries/unreleased/bug/resolved_a_validation_bug_in_the_data_input_element_which_co.json b/changelog/entries/unreleased/bug/resolved_a_validation_bug_in_the_data_input_element_which_co.json new file mode 100644 index 0000000000..1d9d975d4f --- /dev/null +++ b/changelog/entries/unreleased/bug/resolved_a_validation_bug_in_the_data_input_element_which_co.json @@ -0,0 +1,9 @@ +{ + "type": "bug", + "message": "Resolved a validation bug in the data input element which considered '0' an invalid number.", + "issue_origin": "github", + "issue_number": null, + "domain": "builder", + "bullet_points": [], + "created_at": "2025-12-30" +} \ No newline at end of file diff --git a/web-frontend/modules/builder/elementTypes.js b/web-frontend/modules/builder/elementTypes.js index 22704adfbf..c94c07986f 100644 --- a/web-frontend/modules/builder/elementTypes.js +++ b/web-frontend/modules/builder/elementTypes.js @@ -1397,11 +1397,10 @@ export class InputTextElementType extends FormElementType { return 'input_text' } - isValid(element, value, applicationContext) { - if (!value) { + isValid(element, value) { + if (value == null) { return !element.required } - switch (element.validation_type) { case 'integer': return isNumeric(value) diff --git a/web-frontend/test/unit/builder/elementTypes.spec.js b/web-frontend/test/unit/builder/elementTypes.spec.js index 27c7299ef6..6ba4d4246d 100644 --- a/web-frontend/test/unit/builder/elementTypes.spec.js +++ b/web-frontend/test/unit/builder/elementTypes.spec.js @@ -545,14 +545,26 @@ describe('elementTypes tests', () => { }) test('InputTextElementType | required | no value.', () => { const elementType = new InputTextElementType() - expect(elementType.isValid({ required: true }, '')).toBe(false) + expect(elementType.isValid({ required: true }, null)).toBe(false) }) - test('InputTextElementType | required | integer | valid value.', () => { + test('InputTextElementType | required | integer | valid positive value.', () => { const elementType = new InputTextElementType() expect( elementType.isValid({ required: true, validation_type: 'integer' }, 42) ).toBe(true) }) + test('InputTextElementType | required | integer | valid negative value.', () => { + const elementType = new InputTextElementType() + expect( + elementType.isValid({ required: true, validation_type: 'integer' }, -42) + ).toBe(true) + }) + test('InputTextElementType | required | integer | zero value.', () => { + const elementType = new InputTextElementType() + expect( + elementType.isValid({ required: true, validation_type: 'integer' }, 0) + ).toBe(true) + }) test('InputTextElementType | required | integer | invalid value.', () => { const elementType = new InputTextElementType() expect(