diff --git a/app/Http/Requests/UserFormRequest.php b/app/Http/Requests/UserFormRequest.php index a0d777c..79d8633 100644 --- a/app/Http/Requests/UserFormRequest.php +++ b/app/Http/Requests/UserFormRequest.php @@ -43,6 +43,7 @@ abstract class UserFormRequest extends \Illuminate\Foundation\Http\FormRequest 'use_captcha' => 'boolean', 'slack_webhook_url' => 'url|nullable', 'discord_webhook_url' => 'url|nullable', + 'notification_settings' => 'nullable', // Customization 'theme' => ['required',Rule::in(Form::THEMES)], diff --git a/app/Http/Resources/FormResource.php b/app/Http/Resources/FormResource.php index 49857ad..9cdc44c 100644 --- a/app/Http/Resources/FormResource.php +++ b/app/Http/Resources/FormResource.php @@ -47,6 +47,7 @@ class FormResource extends JsonResource 'notification_emails' => $this->notification_emails, 'slack_webhook_url' => $this->slack_webhook_url, 'discord_webhook_url' => $this->discord_webhook_url, + 'notification_settings' => $this->notification_settings, 'removed_properties' => $this->removed_properties, 'last_edited_human' => $this->updated_at?->diffForHumans(), 'seo_meta' => $this->seo_meta diff --git a/app/Models/Forms/Form.php b/app/Models/Forms/Form.php index c145828..fe2f163 100644 --- a/app/Models/Forms/Form.php +++ b/app/Models/Forms/Form.php @@ -41,6 +41,7 @@ class Form extends Model 'notifications_include_submission', 'slack_webhook_url', 'discord_webhook_url', + 'notification_settings', // integrations 'webhook_url', @@ -83,10 +84,7 @@ class Form extends Model // Security & Privacy 'can_be_indexed', - 'password', - - // Custom SEO - 'seo_meta' + 'password' ]; protected $casts = [ @@ -95,7 +93,8 @@ class Form extends Model 'closes_at' => 'datetime', 'tags' => 'array', 'removed_properties' => 'array', - 'seo_meta' => 'object' + 'seo_meta' => 'object', + 'notification_settings' => 'object' ]; protected $appends = [ diff --git a/app/Service/Forms/Webhooks/DiscordHandler.php b/app/Service/Forms/Webhooks/DiscordHandler.php index 446f217..55ebf2d 100644 --- a/app/Service/Forms/Webhooks/DiscordHandler.php +++ b/app/Service/Forms/Webhooks/DiscordHandler.php @@ -3,7 +3,8 @@ namespace App\Service\Forms\Webhooks; use App\Service\Forms\FormSubmissionFormatter; -use Illuminate\Support\Str; +use Vinkla\Hashids\Facades\Hashids; +use Illuminate\Support\Arr; class DiscordHandler extends AbstractWebhookHandler { @@ -20,58 +21,60 @@ class DiscordHandler extends AbstractWebhookHandler protected function getWebhookData(): array { - $submissionString = ""; - $formatter = (new FormSubmissionFormatter($this->form, $this->data))->outputStringsOnly(); - - foreach ($formatter->getFieldsWithValue() as $field) { - $tmpVal = is_array($field['value']) ? implode(",", $field['value']) : $field['value']; - $submissionString .= "**" . ucfirst($field['name']) . "**: `" . $tmpVal . "`\n"; + $settings = (array) Arr::get((array)$this->form->notification_settings, 'discord', []); + $externalLinks = []; + if(Arr::get($settings, 'link_open_form', true)){ + $externalLinks[] = '[**🔗 Open Form**](' . $this->form->share_url . ')'; + } + if(Arr::get($settings, 'link_edit_form', true)){ + $editFormURL = url('forms/' . $this->form->slug . '/show'); + $externalLinks[] = '[**✍️ Edit Form**](' . $editFormURL . ')'; + } + if (Arr::get($settings, 'link_edit_submission', true) && $this->form->editable_submissions) { + $submissionId = Hashids::encode($this->data['submission_id']); + $externalLinks[] = '[**✍️ ' . $this->form->editable_submissions_button_text . '**](' . $this->form->share_url . '?submission_id=' . $submissionId . ')'; } - $form_name = $this->form->title; - $formURL = url("forms/" . $this->form->slug . "/show/submissions"); + $color = hexdec(str_replace('#', '', $this->form->color)); + $blocks = []; + if(Arr::get($settings, 'include_submission_data', true)){ + $submissionString = ""; + $formatter = (new FormSubmissionFormatter($this->form, $this->data))->outputStringsOnly(); + foreach ($formatter->getFieldsWithValue() as $field) { + $tmpVal = is_array($field['value']) ? implode(",", $field['value']) : $field['value']; + $submissionString .= "**" . ucfirst($field['name']) . "**: " . $tmpVal . "\n"; + } + $blocks[] = [ + "type" => "rich", + "color" => $color, + "description" => $submissionString + ]; + } + if(Arr::get($settings, 'views_submissions_count', true)){ + $countString = '**👀 Views**: ' . (string)$this->form->views_count . " \n"; + $countString .= '**🖊️ Submissions**: ' . (string)$this->form->submissions_count; + $blocks[] = [ + "type" => "rich", + "color" => $color, + "description" => $countString + ]; + } + + if(count($externalLinks) > 0){ + $blocks[] = [ + "type" => "rich", + "color" => $color, + "description" => implode(' - ', $externalLinks) + ]; + } + return [ - "content" => "@here We have received a new submission for **$form_name**", - "username" => config('app.name'), - "avatar_url" => asset('img/logo.png'), - "tts" => false, - "embeds" => [ - [ - "title" => "🔗 Go to $form_name", - - "type" => "rich", - - "description" => $submissionString, - - "url" => $formURL, - - "color" => hexdec(str_replace('#', '', $this->form->color)), - - "footer" => [ - "text" => config('app.name'), - "icon_url" => asset('img/logo.png'), - ], - - "author" => [ - "name" => config('app.name'), - "url" => config('app.url'), - ], - - "fields" => [ - [ - "name" => "Views 👀", - "value" => (string)$this->form->views_count, - "inline" => true - ], - [ - "name" => "Submissions 🖊️", - "value" => (string)$this->form->submissions_count, - "inline" => true - ] - ] - ] - ] + 'content' => 'New submission for your form **' . $this->form->title . '**', + 'tts' => false, + 'username' => config('app.name'), + 'avatar_url' => asset('img/logo.png'), + 'embeds' => $blocks ]; } diff --git a/app/Service/Forms/Webhooks/SlackHandler.php b/app/Service/Forms/Webhooks/SlackHandler.php index 2ed292d..5b2faf6 100644 --- a/app/Service/Forms/Webhooks/SlackHandler.php +++ b/app/Service/Forms/Webhooks/SlackHandler.php @@ -3,8 +3,8 @@ namespace App\Service\Forms\Webhooks; use App\Service\Forms\FormSubmissionFormatter; -use Illuminate\Support\Str; use Vinkla\Hashids\Facades\Hashids; +use Illuminate\Support\Arr; class SlackHandler extends AbstractWebhookHandler { @@ -21,48 +21,70 @@ class SlackHandler extends AbstractWebhookHandler protected function getWebhookData(): array { - $submissionString = ''; - $formatter = (new FormSubmissionFormatter($this->form, $this->data))->outputStringsOnly(); - foreach ($formatter->getFieldsWithValue() as $field) { - $tmpVal = is_array($field['value']) ? implode(',', $field['value']) : $field['value']; - $submissionString .= '>*' . ucfirst($field['name']) . '*: ' . $tmpVal . " \n"; + $settings = (array) Arr::get((array)$this->form->notification_settings, 'slack', []); + $externalLinks = []; + if(Arr::get($settings, 'link_open_form', true)){ + $externalLinks[] = '*<' . $this->form->share_url . '|🔗 Open Form>*'; } - - $formURL = url('forms/' . $this->form->slug); - $editFormURL = url('forms/' . $this->form->slug . '/show'); - $submissionId = Hashids::encode($this->data['submission_id']); - $externalLinks = [ - '*<' . $formURL . '|🔗 Open Form>*', - '*<' . $editFormURL . '|✍️ Edit Form>*' - ]; - if ($this->form->editable_submissions) { + if(Arr::get($settings, 'link_edit_form', true)){ + $editFormURL = url('forms/' . $this->form->slug . '/show'); + $externalLinks[] = '*<' . $editFormURL . '|✍️ Edit Form>*'; + } + if (Arr::get($settings, 'link_edit_submission', true) && $this->form->editable_submissions) { + $submissionId = Hashids::encode($this->data['submission_id']); $externalLinks[] = '*<' . $this->form->share_url . '?submission_id=' . $submissionId . '|✍️ ' . $this->form->editable_submissions_button_text . '>*'; } + $blocks = [ + [ + 'type' => 'section', + 'text' => [ + 'type' => 'mrkdwn', + 'text' => 'New submission for your form *' . $this->form->title . '*', + ] + ] + ]; + + if(Arr::get($settings, 'include_submission_data', true)){ + $submissionString = ''; + $formatter = (new FormSubmissionFormatter($this->form, $this->data))->outputStringsOnly(); + foreach ($formatter->getFieldsWithValue() as $field) { + $tmpVal = is_array($field['value']) ? implode(',', $field['value']) : $field['value']; + $submissionString .= '>*' . ucfirst($field['name']) . '*: ' . $tmpVal . " \n"; + } + $blocks[] = [ + 'type' => 'section', + 'text' => [ + 'type' => 'mrkdwn', + 'text' => $submissionString, + ] + ]; + } + + if(Arr::get($settings, 'views_submissions_count', true)){ + $countString = '*👀 Views*: ' . (string)$this->form->views_count . " \n"; + $countString .= '*🖊️ Submissions*: ' . (string)$this->form->submissions_count; + $blocks[] = [ + 'type' => 'section', + 'text' => [ + 'type' => 'mrkdwn', + 'text' => $countString, + ] + ]; + } + + if(count($externalLinks) > 0){ + $blocks[] = [ + 'type' => 'section', + 'text' => [ + 'type' => 'mrkdwn', + 'text' => implode(' ', $externalLinks), + ] + ]; + } + return [ - 'blocks' => [ - [ - 'type' => 'section', - 'text' => [ - 'type' => 'mrkdwn', - 'text' => 'New submission for your form *<' . $formURL . '|' . $this->form->title . ':>*', - ], - ], - [ - 'type' => 'section', - 'text' => [ - 'type' => 'mrkdwn', - 'text' => $submissionString, - ], - ], - [ - 'type' => 'section', - 'text' => [ - 'type' => 'mrkdwn', - 'text' => implode(' ', $externalLinks), - ], - ], - ], + 'blocks' => $blocks ]; } diff --git a/database/factories/FormFactory.php b/database/factories/FormFactory.php index c7a831e..dab01d3 100644 --- a/database/factories/FormFactory.php +++ b/database/factories/FormFactory.php @@ -84,6 +84,8 @@ class FormFactory extends Factory 'password' => false, 'tags' => [], 'slack_webhook_url' => null, + 'discord_webhook_url' => null, + 'notification_settings' => [], 'editable_submissions_button_text' => 'Edit submission', 'confetti_on_submission' => false, 'seo_meta' => [], diff --git a/database/migrations/2023_08_23_100710_add_notification_settings_to_forms.php b/database/migrations/2023_08_23_100710_add_notification_settings_to_forms.php new file mode 100644 index 0000000..b091f6b --- /dev/null +++ b/database/migrations/2023_08_23_100710_add_notification_settings_to_forms.php @@ -0,0 +1,32 @@ +json('notification_settings')->default('{}')->nullable(true); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('forms', function (Blueprint $table) { + $table->dropColumn('notification_settings'); + }); + } +}; diff --git a/resources/js/components/open/forms/components/form-components/components/FormNotificationsDiscord.vue b/resources/js/components/open/forms/components/form-components/components/FormNotificationsDiscord.vue index f8dc0de..3ebca14 100644 --- a/resources/js/components/open/forms/components/form-components/components/FormNotificationsDiscord.vue +++ b/resources/js/components/open/forms/components/form-components/components/FormNotificationsDiscord.vue @@ -28,23 +28,29 @@ - - - + diff --git a/resources/js/components/open/forms/components/form-components/components/FormNotificationsSlack.vue b/resources/js/components/open/forms/components/form-components/components/FormNotificationsSlack.vue index 2e7cb7e..0de50b8 100644 --- a/resources/js/components/open/forms/components/form-components/components/FormNotificationsSlack.vue +++ b/resources/js/components/open/forms/components/form-components/components/FormNotificationsSlack.vue @@ -28,22 +28,30 @@ - - - +