Skip to content

Commit 2298f89

Browse files
authored
Merge branch 'main' into 145a6-readonly-user
2 parents aa32f85 + 9a2d7b9 commit 2298f89

File tree

7 files changed

+80
-10
lines changed

7 files changed

+80
-10
lines changed

api/app/Http/Requests/AnswerFormRequest.php

+7-6
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,14 @@ public function rules()
6363
$property['logic'] = false;
6464
}*/
6565

66-
// For get values instead of Id for select/multi select options
6766
$data = $this->toArray();
67+
68+
// User custom validation
69+
if (!(Str::of($property['type'])->startsWith('nf-')) && isset($property['validation'])) {
70+
$rules[] = (new CustomFieldValidationRule($property['validation'], $data));
71+
}
72+
73+
// For get values instead of Id for select/multi select options
6874
foreach ($selectionFields as $field) {
6975
if (isset($data[$field['id']]) && is_array($data[$field['id']])) {
7076
$data[$field['id']] = array_map(function ($val) use ($field) {
@@ -109,11 +115,6 @@ public function rules()
109115
$rules = array_merge($rules, $this->getPropertyRules($property));
110116
}
111117

112-
// User custom validation
113-
if (!(Str::of($property['type'])->startsWith('nf-')) && isset($property['validation'])) {
114-
$rules[] = (new CustomFieldValidationRule($property['validation'], $data));
115-
}
116-
117118
$this->requestRules[$propertyId] = $rules;
118119
}
119120

api/app/Integrations/Google/Sheets/SpreadsheetManager.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ protected function setHeaders(string $id, array $headers): static
129129

130130
public function buildRow(array $submissionData): array
131131
{
132-
$formatter = (new FormSubmissionFormatter($this->integration->form, $submissionData))->useSignedUrlForFiles()->outputStringsOnly();
132+
$formatter = (new FormSubmissionFormatter($this->integration->form, $submissionData))->useSignedUrlForFiles()->showHiddenFields()->outputStringsOnly();
133133

134134
$fields = $formatter->getFieldsWithValue();
135135

api/app/Integrations/Handlers/DiscordIntegration.php

+6-1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ public static function getValidationRules(?Form $form): array
1515
return [
1616
'discord_webhook_url' => 'required|url|starts_with:https://discord.com/api/webhooks',
1717
'include_submission_data' => 'boolean',
18+
'include_hidden_fields_submission_data' => ['nullable', 'boolean'],
1819
'link_open_form' => 'boolean',
1920
'link_edit_form' => 'boolean',
2021
'views_submissions_count' => 'boolean',
@@ -34,10 +35,14 @@ protected function shouldRun(): bool
3435

3536
protected function getWebhookData(): array
3637
{
38+
$settings = (array) $this->integrationData ?? [];
39+
3740
$formatter = (new FormSubmissionFormatter($this->form, $this->submissionData))->outputStringsOnly();
41+
if (Arr::get($settings, 'include_hidden_fields_submission_data', false)) {
42+
$formatter->showHiddenFields();
43+
}
3844
$formattedData = $formatter->getFieldsWithValue();
3945

40-
$settings = (array) $this->integrationData ?? [];
4146
$externalLinks = [];
4247
if (Arr::get($settings, 'link_open_form', true)) {
4348
$externalLinks[] = '[**🔗 Open Form**](' . $this->form->share_url . ')';

api/app/Integrations/Handlers/SlackIntegration.php

+6-1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ public static function getValidationRules(?Form $form): array
1515
return [
1616
'slack_webhook_url' => 'required|url|starts_with:https://hooks.slack.com/',
1717
'include_submission_data' => 'boolean',
18+
'include_hidden_fields_submission_data' => ['nullable', 'boolean'],
1819
'link_open_form' => 'boolean',
1920
'link_edit_form' => 'boolean',
2021
'views_submissions_count' => 'boolean',
@@ -34,10 +35,14 @@ protected function shouldRun(): bool
3435

3536
protected function getWebhookData(): array
3637
{
38+
$settings = (array) $this->integrationData ?? [];
39+
3740
$formatter = (new FormSubmissionFormatter($this->form, $this->submissionData))->outputStringsOnly();
41+
if (Arr::get($settings, 'include_hidden_fields_submission_data', false)) {
42+
$formatter->showHiddenFields();
43+
}
3844
$formattedData = $formatter->getFieldsWithValue();
3945

40-
$settings = (array) $this->integrationData ?? [];
4146
$externalLinks = [];
4247
if (Arr::get($settings, 'link_open_form', true)) {
4348
$externalLinks[] = '*<' . $this->form->share_url . '|🔗 Open Form>*';

api/tests/Feature/Forms/AnswerFormTest.php

+48
Original file line numberDiff line numberDiff line change
@@ -303,3 +303,51 @@
303303
$this->assertEquals(sizeof($errors), 1);
304304
$response->assertStatus(422);
305305
});
306+
307+
308+
it('executes custom validation before required field validation', function () {
309+
$user = $this->actingAsUser();
310+
$workspace = $this->createUserWorkspace($user);
311+
$form = $this->createForm($user, $workspace);
312+
313+
$emailField = collect($form->properties)->where('name', 'Email')->first();
314+
$condition = [
315+
'actions' => [],
316+
'conditions' => [
317+
'operatorIdentifier' => 'and',
318+
'children' => [
319+
[
320+
'identifier' => $emailField['id'],
321+
'value' => [
322+
'operator' => 'contains',
323+
'property_meta' => [
324+
'id' => $emailField['id'],
325+
'type' => 'email',
326+
],
327+
'value' => '@company.com',
328+
],
329+
],
330+
],
331+
],
332+
];
333+
334+
$submissionData = [];
335+
$validationMessage = 'Must use company email';
336+
$form->properties = collect($form->properties)->map(function ($property) use (&$submissionData, &$condition, &$validationMessage, $emailField) {
337+
if (in_array($property['name'], ['Name'])) {
338+
$property['required'] = true;
339+
$property['validation'] = ['error_conditions' => $condition, 'error_message' => $validationMessage];
340+
$submissionData[$emailField['id']] = 'test@other.com';
341+
}
342+
return $property;
343+
})->toArray();
344+
$form->update();
345+
346+
$formData = FormSubmissionDataFactory::generateSubmissionData($form, $submissionData);
347+
348+
$this->postJson(route('forms.answer', $form->slug), $formData)
349+
->assertStatus(422)
350+
->assertJson([
351+
'message' => $validationMessage,
352+
]);
353+
});

client/components/open/integrations/components/NotificationsMessageActions.vue

+11
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,14 @@
1515
label="Include submission data"
1616
help="With form submission answers"
1717
/>
18+
<toggle-switch-input
19+
v-if="compVal.include_submission_data"
20+
v-model="compVal.include_hidden_fields_submission_data"
21+
name="include_hidden_fields_submission_data"
22+
class="mt-4"
23+
label="Include hidden fields"
24+
help="If enabled then hidden fields will be included in the notification message"
25+
/>
1826
<toggle-switch-input
1927
v-model="compVal.link_open_form"
2028
name="link_open_form"
@@ -85,6 +93,7 @@ export default {
8593
[
8694
"message",
8795
"include_submission_data",
96+
'include_hidden_fields_submission_data',
8897
"link_open_form",
8998
"link_edit_form",
9099
"views_submissions_count",
@@ -93,6 +102,8 @@ export default {
93102
if (this.compVal[keyname] === undefined) {
94103
if (keyname === 'message') {
95104
this.compVal[keyname] = 'New form submission'
105+
} else if (['include_hidden_fields_submission_data'].includes(keyname)) {
106+
this.compVal[keyname] = false
96107
} else {
97108
this.compVal[keyname] = true
98109
}

docs/deployment/local-deployment.mdx

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ Make sure these components are properly installed and configured on your local m
2626
2. Clone the repository and install dependencies:
2727

2828
```bash
29-
git clone git@github.com:JhumanJ/OpnForm.git && cd OpnForm
29+
git clone https://github.com/JhumanJ/opnform && cd OpnForm
3030
cd api && composer install
3131
cd ../client && npm install
3232
```

0 commit comments

Comments
 (0)