From a337efc0ac1992bd43ec70a9062afbc15a7f10bb Mon Sep 17 00:00:00 2001 From: Chirag Chhatrala Date: Tue, 4 Mar 2025 14:17:52 +0530 Subject: [PATCH 1/3] Hidden field can never be required. Skip that validation --- api/app/Http/Requests/AnswerFormRequest.php | 2 +- .../form-logic-components/FormBlockLogicEditor.vue | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/api/app/Http/Requests/AnswerFormRequest.php b/api/app/Http/Requests/AnswerFormRequest.php index 6431bbef5..4e1b422bb 100644 --- a/api/app/Http/Requests/AnswerFormRequest.php +++ b/api/app/Http/Requests/AnswerFormRequest.php @@ -87,7 +87,7 @@ public function rules() $data[$field['id']] = isset($tmpop['name']) ? $tmpop['name'] : $data[$field['id']]; } } - if (FormLogicPropertyResolver::isRequired($property, $data)) { + if (FormLogicPropertyResolver::isRequired($property, $data) && (!isset($property['hidden']) || !$property['hidden'])) { $rules[] = 'required'; if ($property['type'] == 'checkbox') { diff --git a/client/components/open/forms/components/form-logic-components/FormBlockLogicEditor.vue b/client/components/open/forms/components/form-logic-components/FormBlockLogicEditor.vue index 628981591..52db524ff 100644 --- a/client/components/open/forms/components/form-logic-components/FormBlockLogicEditor.vue +++ b/client/components/open/forms/components/form-logic-components/FormBlockLogicEditor.vue @@ -57,6 +57,14 @@ @update:model-value="onActionInput" /> + + Date: Thu, 6 Mar 2025 16:04:21 +0530 Subject: [PATCH 2/3] Refactor form logic editor UI with improved text and styling - Replace UAlert with plain text description - Update action description text - Remove help text from select input - Simplify note about hidden field requirements --- .../form-logic-components/FormBlockLogicEditor.vue | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/client/components/open/forms/components/form-logic-components/FormBlockLogicEditor.vue b/client/components/open/forms/components/form-logic-components/FormBlockLogicEditor.vue index 52db524ff..1ab331238 100644 --- a/client/components/open/forms/components/form-logic-components/FormBlockLogicEditor.vue +++ b/client/components/open/forms/components/form-logic-components/FormBlockLogicEditor.vue @@ -45,6 +45,9 @@
2. Actions
+

+ Action(s) triggered when above conditions are true. +

- +

+ Note that hidden fields can never be required. +

Date: Thu, 6 Mar 2025 16:39:00 +0530 Subject: [PATCH 3/3] Add test for form logic field visibility and validation - Implement test case for fields hidden by logic conditions - Update AnswerFormRequest to use new FormLogicPropertyResolver method for hidden field check - Ensure required fields are skipped when hidden by form logic --- api/app/Http/Requests/AnswerFormRequest.php | 5 +- api/tests/Feature/Forms/FormLogicTest.php | 64 +++++++++++++++++++++ 2 files changed, 68 insertions(+), 1 deletion(-) diff --git a/api/app/Http/Requests/AnswerFormRequest.php b/api/app/Http/Requests/AnswerFormRequest.php index 4e1b422bb..cb19bb70d 100644 --- a/api/app/Http/Requests/AnswerFormRequest.php +++ b/api/app/Http/Requests/AnswerFormRequest.php @@ -87,7 +87,10 @@ public function rules() $data[$field['id']] = isset($tmpop['name']) ? $tmpop['name'] : $data[$field['id']]; } } - if (FormLogicPropertyResolver::isRequired($property, $data) && (!isset($property['hidden']) || !$property['hidden'])) { + if ( + FormLogicPropertyResolver::isRequired($property, $data) && + !FormLogicPropertyResolver::isHidden($property, $data) + ) { $rules[] = 'required'; if ($property['type'] == 'checkbox') { diff --git a/api/tests/Feature/Forms/FormLogicTest.php b/api/tests/Feature/Forms/FormLogicTest.php index e87560b72..77a5e6298 100644 --- a/api/tests/Feature/Forms/FormLogicTest.php +++ b/api/tests/Feature/Forms/FormLogicTest.php @@ -543,3 +543,67 @@ 'message' => $validationMessage, ]); }); + +it('skips validation for fields hidden by logic conditions', function () { + $user = $this->actingAsUser(); + $workspace = $this->createUserWorkspace($user); + $form = $this->createForm($user, $workspace, [ + 'properties' => [ + [ + 'id' => 'title', + 'name' => 'Name', + 'type' => 'title', + 'hidden' => false, + 'required' => true, + 'logic' => [ + 'conditions' => [ + 'operatorIdentifier' => 'and', + 'children' => [ + [ + 'identifier' => 'email', + 'value' => [ + 'operator' => 'is_empty', + 'property_meta' => [ + 'id' => 'email_field', + 'type' => 'email', + ], + 'value' => true, + ], + ], + ], + ], + 'actions' => ['hide-block'], + ], + ], + [ + 'id' => 'email_field', + 'name' => 'Email', + 'type' => 'email', + 'hidden' => false, + 'required' => false, + ], + ], + ]); + + // Test when field should be hidden (email is empty) + $formData = ['email_field' => '']; // Empty email + $this->postJson(route('forms.answer', $form->slug), $formData) + ->assertSuccessful() + ->assertJson([ + 'type' => 'success', + 'message' => 'Form submission saved.', + ]); + + // Test when field should be visible (email is not empty) + $formData = ['email_field' => 'test@example.com']; + $this->postJson(route('forms.answer', $form->slug), $formData) + ->assertStatus(422) + ->assertJson([ + 'message' => 'The Name field is required.', + 'errors' => [ + 'title' => [ + 'The Name field is required.', + ], + ], + ]); +});