Version Description
( 2022-09-15 ) =
- New: Forminator Reports to help with tracking performance of forms, polls, and quizzes
- Add: Admin email Macro {admin_email}
- Improvement: Form fields now have a unique ID. This unique ID is also added as data-uid attribute to the form tag, so If you currently have scripts that use field ID's, these will need to be updated now
- Improvement: Convert Zapier integration to Webhook integration
- Improvement: Additional appearance settings for Input Border Radius and Hover Colours
- Improvement: Replace Select placeholder default "null" to "Search"
- Fix: Checkboxes and selects do not save multiple selections separately
- Fix: A float cannot be used as a number if inline validation is disabled
- Fix: The time picker checks on time limits in real-time
- Fix: The checkbox fields aren't showing up as checked
- Fix: Conditions apply when the visibility rules are set to Hidden
- Fix: Validation of email fields is not disabled
- Fix: Safari does not support e-signature
- Fix: Conditions not working for the address field
- Fix: Can't clear date limits for the Datepicker field
- Fix: Error when Site Registration is enabled on the registration form
- Fix: Issue with ACF and file upload field in the registration form
- Fix: Going out of range for the number field when using the up/down arrow keys
- Fix: Selecting a default future date does not show the correct date for specific date formats
- Fix: Visibility conditions don't work when adding the Stripe field and not connecting it
- Fix: A calculation field's 'hidden' setting is overridden if a 'visibility' condition has been set previously and not deleted
- Fix: The PayPal and Stripe fields do not appear in Divi's popup
- Fix: Issue with Stripe 3D secure payment
- Fix: Load form Ajax conflict with SEOpress plugin
- Fix: the e-signature is not saved after submission
- Fix: PayPal displays an error when two different forms with PayPal buttons are added to the same page
- Fix: Max and Min Limits are not working when setting a number field as required
- Fix: Address field does not work with query parameters
- Fix: Stripe field doesn't exist error
- Fix: Values for select fields are not saved when visibility is dependent on a checkbox
- Fix: Error when input field visibility is dependent on a select box
- Fix: Limit validation fails for the Currency field when using some formatting separators
- Fix: Form Email Routing does not work with recipients added from Select or Radio buttons
- Fix: Visibility conditions fail for a Textarea field dependant on Currency and Calculations fields
- Fix: Failing to validate numeric fields in some cases
- Fix: The country flags are broken in the phone field on mobile devices
- Fix: The country code does not appear for the default country
- Fix: Symbols do not work with Stripe metadata
- Fix: Checkbox pre-selected option is removed when its visibility is dependent on another field
- Fix: The year select dropdown displays the current year instead of "Select year" when the Datepicker field type is set to dropdown and the Year Range 'To' filed is set to a future date
- Fix: Stripe field does not work with visibility conditions
- Fix: Removing a custom error message doesn't revert to the default one
- Fix: The pre-populate function only works if the query variable is after the selected option
- Fix: Comma or Separators in Fields cause some problems
- Fix: Stripe Font is not Displaying Correctly
- Fix: Stripe failing with 0 balance form
- Fix: No value is passed when the calculation field is mapped to a custom field and submitted
- Fix: Error when having null values for hidden fields set as required
- Fix: Conflict with Ultimate Member plugin
- Fix: Textarea field label issue with RTL
- Fix: The fields are not prefilled via the URL query when setting the Name field to Multiple
- Fix: Number and Text fields do not display 0 on the front end when 0 is set as the default value
- Fix: Some fields are cut off when adding a Page Break
- Fix: The Select Field requires a placeholder if set as required
- Fix: Names and values of select/radio fields do not sync
- Fix: Recaptcha does not work in Divi's popup
- Fix: Removing spaces before a tag in the Text field description
- Fix: Returning an empty array or WP_Error object in the get_forms() method of the Forminator API
- Fix: HTML Validator posts errors coming from Forminator
- Fix: Upload file issue on mobile applications
- Fix: The description field in HubSpot does not work
- Fix: Fields are missing in email notifications
- Fix: The pagination progress bar and next button disappear from the form
- Fix: Calculation field decimal separator causes an infinite loop in JS
- Fix: Posts are created when the inline validation option is disabled
- Fix: Form is not submitting with Stripe field in the same row with other fields
- Fix: Trello integration does not add cards
- Fix: Browser console error when adding the same form twice on the same page
- Fix: PayPal does not work when Pre-fill Billing Details is disabled
- Fix: Incorrect Country flag showing up in Phone field
- Fix: PayPal module doesn't show up when pagination is enabled
- Fix: Recaptcha and hCaptcha verification fail if Stripe field is hidden
- Fix: Forminator will only add the associated ticket to Hubspot If the contact belongs to a list
- Fix: Quiz ActiveCampaign integration issue
- Fix: Active Campaign integration doesn't show the correct fields
- Fix: Mailchimp submission error with radio type
- Fix: Consent filed label always shows an asterisk even if it is not required
- Fix: The number field in the stripe description create a fatal error
Download this release
Release Info
Developer | Dency |
Plugin | Forminator Payment, Quiz and Contact Form Plugin |
Version | 1.18.1 |
Comparing to | |
See all releases |
Code changes from version 1.17.2 to 1.18.1
- addons/pro/activecampaign/class-forminator-addon-activecampaign-form-settings.php +13 -14
- addons/pro/activecampaign/class-forminator-addon-activecampaign-quiz-settings.php +18 -10
- addons/pro/aweber/class-forminator-addon-aweber-form-hooks.php +10 -6
- addons/pro/hubspot/class-forminator-addon-hubspot-form-hooks.php +14 -12
- addons/pro/hubspot/views/form-settings/create-ticket.php +1 -3
- addons/pro/mailchimp/class-forminator-addon-mailchimp-form-hooks.php +8 -0
- addons/pro/slack/class-forminator-addon-slack.php +38 -7
- addons/pro/trello/class-forminator-addon-trello-form-hooks.php +21 -19
- addons/pro/webhook/assets/icons/webhook.png +0 -0
- addons/pro/webhook/assets/icons/webhook@2x.png +0 -0
- addons/pro/webhook/assets/img/banner.png +0 -0
- addons/pro/webhook/assets/img/banner@2x.png +0 -0
- addons/pro/webhook/assets/img/webhook.png +0 -0
- addons/pro/webhook/assets/img/webhook@2x.png +0 -0
- addons/pro/webhook/class-forminator-addon-webhook-exception.php +9 -0
- addons/pro/webhook/class-forminator-addon-webhook-form-hooks.php +573 -0
- addons/pro/webhook/class-forminator-addon-webhook-form-settings-exception.php +68 -0
- addons/pro/webhook/class-forminator-addon-webhook-form-settings.php +468 -0
- addons/pro/webhook/class-forminator-addon-webhook-poll-hooks.php +411 -0
- addons/pro/webhook/class-forminator-addon-webhook-poll-settings-exception.php +68 -0
- addons/pro/webhook/class-forminator-addon-webhook-poll-settings.php +386 -0
- addons/pro/webhook/class-forminator-addon-webhook-quiz-hooks.php +619 -0
- addons/pro/webhook/class-forminator-addon-webhook-quiz-settings-exception.php +68 -0
- addons/pro/webhook/class-forminator-addon-webhook-quiz-settings.php +434 -0
- addons/pro/webhook/class-forminator-addon-webhook.php +437 -0
- addons/pro/webhook/lib/class-forminator-addon-webhook-wp-api-exception.php +10 -0
- addons/pro/webhook/lib/class-forminator-addon-webhook-wp-api-not-found-exception.php +10 -0
- addons/pro/webhook/lib/class-forminator-addon-webhook-wp-api.php +316 -0
- addons/pro/webhook/views/poll-settings/setup-webhook.php +101 -0
- addons/pro/webhook/views/quiz-settings/setup-webhook.php +101 -0
- addons/pro/webhook/views/settings/setup-connect-success.php +14 -0
- addons/pro/webhook/views/settings/setup-connect.php +86 -0
- addons/pro/webhook/webhook.php +37 -0
- addons/pro/zapier/assets/icons/zapier.png +0 -0
- addons/pro/zapier/assets/icons/zapier@2x.png +0 -0
- addons/pro/zapier/assets/img/banner.png +0 -0
- addons/pro/zapier/assets/img/banner@2x.png +0 -0
- addons/pro/zapier/assets/img/zapier.png +0 -0
- addons/pro/zapier/assets/img/zapier@2x.png +0 -0
- addons/pro/zapier/class-forminator-addon-zapier-exception.php +3 -4
- addons/pro/zapier/class-forminator-addon-zapier-form-hooks.php +3 -531
- addons/pro/zapier/class-forminator-addon-zapier-form-settings-exception.php +3 -61
- addons/pro/zapier/class-forminator-addon-zapier-form-settings.php +3 -480
- addons/pro/zapier/class-forminator-addon-zapier-poll-hooks.php +3 -357
- addons/pro/zapier/class-forminator-addon-zapier-poll-settings-exception.php +3 -62
- addons/pro/zapier/class-forminator-addon-zapier-poll-settings.php +3 -382
- addons/pro/zapier/class-forminator-addon-zapier-quiz-hooks.php +3 -556
- addons/pro/zapier/class-forminator-addon-zapier-quiz-settings-exception.php +3 -61
- addons/pro/zapier/class-forminator-addon-zapier-quiz-settings.php +3 -430
- addons/pro/zapier/class-forminator-addon-zapier.php +4 -423
- addons/pro/zapier/lib/class-forminator-addon-zapier-wp-api-exception.php +3 -4
- addons/pro/zapier/lib/class-forminator-addon-zapier-wp-api-not-found-exception.php +3 -4
- addons/pro/zapier/lib/class-forminator-addon-zapier-wp-api.php +3 -300
- addons/pro/zapier/views/poll-settings/setup-webhook.php +0 -118
- addons/pro/zapier/views/quiz-settings/setup-webhook.php +0 -118
- addons/pro/zapier/views/settings/setup-connect-success.php +0 -13
- addons/pro/zapier/views/settings/setup-connect.php +0 -83
- addons/pro/zapier/zapier.php +3 -33
- admin/abstracts/class-admin-module-edit-page.php +8 -0
- admin/abstracts/class-admin-page.php +64 -0
- admin/classes/class-admin-ajax.php +160 -80
- admin/classes/class-admin.php +293 -447
- admin/classes/class-reports-page.php +460 -0
- admin/locale.php +152 -147
- admin/pages/entries-page.php +2 -63
- admin/pages/reports-page.php +291 -0
- admin/pages/settings-page.php +4 -0
- admin/views/addons/action-button.php +0 -6
- admin/views/addons/addons-list.php +1 -1
- admin/views/common/entries/content.php +1 -1
- admin/views/common/popup/import.php +20 -0
- admin/views/common/reports/chart-content.php +58 -0
- admin/views/common/reports/content-none.php +17 -0
- admin/views/common/reports/content.php +27 -0
- admin/views/common/reports/header.php +11 -0
- admin/views/common/reports/integration-report.php +79 -0
- admin/views/common/reports/report-content.php +100 -0
- admin/views/common/reports/single-report.php +104 -0
- admin/views/common/reports/tab-dashboard.php +84 -0
- admin/views/custom-form/entries/content.php +1 -1
- admin/views/custom-form/popup/import-cf7.php +1 -1
- admin/views/dashboard/content.php +1 -1
- admin/views/dashboard/new-feature-notice.php +17 -19
- admin/views/dashboard/promote-free-plan.php +128 -0
- admin/views/integrations/addon.php +1 -1
- admin/views/quiz/entries/content.php +1 -1
- assets/forminator-ui/CHANGELOG.md +10 -0
- assets/forminator-ui/css/forminator-forms.min.css +0 -1
addons/pro/activecampaign/class-forminator-addon-activecampaign-form-settings.php
CHANGED
@@ -199,7 +199,7 @@ class Forminator_Addon_Activecampaign_Form_Settings extends Forminator_Addon_For
|
|
199 |
$is_submit = ! empty( $submitted_data );
|
200 |
$has_errors = false;
|
201 |
|
202 |
-
$lists
|
203 |
|
204 |
try {
|
205 |
|
@@ -342,8 +342,8 @@ class Forminator_Addon_Activecampaign_Form_Settings extends Forminator_Addon_For
|
|
342 |
'email_fields' => $email_fields,
|
343 |
);
|
344 |
|
345 |
-
$is_submit
|
346 |
-
$has_errors
|
347 |
$custom_fields = array();
|
348 |
|
349 |
$fields = array(
|
@@ -358,23 +358,22 @@ class Forminator_Addon_Activecampaign_Form_Settings extends Forminator_Addon_For
|
|
358 |
|
359 |
try {
|
360 |
|
361 |
-
$ac_api
|
362 |
-
$list_detail = $ac_api->get_list( $list_id );
|
363 |
$lists_request = $ac_api->get_lists();
|
364 |
-
|
365 |
-
|
366 |
-
|
367 |
-
|
|
|
|
|
368 |
}
|
369 |
}
|
370 |
}
|
371 |
|
372 |
-
//get global fields assigned to the form as well as explecit field
|
373 |
-
if ( ! empty( $custom_fields )
|
374 |
foreach ( $custom_fields as $custom_field ) {
|
375 |
-
|
376 |
-
$fields[ $field->id ] = $field->title;
|
377 |
-
}
|
378 |
}
|
379 |
}
|
380 |
|
199 |
$is_submit = ! empty( $submitted_data );
|
200 |
$has_errors = false;
|
201 |
|
202 |
+
$lists = array();
|
203 |
|
204 |
try {
|
205 |
|
342 |
'email_fields' => $email_fields,
|
343 |
);
|
344 |
|
345 |
+
$is_submit = ! empty( $submitted_data );
|
346 |
+
$has_errors = false;
|
347 |
$custom_fields = array();
|
348 |
|
349 |
$fields = array(
|
358 |
|
359 |
try {
|
360 |
|
361 |
+
$ac_api = $this->addon->get_api();
|
|
|
362 |
$lists_request = $ac_api->get_lists();
|
363 |
+
$custom_fields = array();
|
364 |
+
|
365 |
+
foreach ( $lists_request as $list ) {
|
366 |
+
if ( $list_id === $list->id ) {
|
367 |
+
if ( ! empty( $list->fields ) ) {
|
368 |
+
$custom_fields = $list->fields;
|
369 |
}
|
370 |
}
|
371 |
}
|
372 |
|
373 |
+
// get global fields assigned to the form as well as explecit field
|
374 |
+
if ( ! empty( $custom_fields ) ) {
|
375 |
foreach ( $custom_fields as $custom_field ) {
|
376 |
+
$fields[ $custom_field->id ] = $custom_field->title;
|
|
|
|
|
377 |
}
|
378 |
}
|
379 |
|
addons/pro/activecampaign/class-forminator-addon-activecampaign-quiz-settings.php
CHANGED
@@ -340,12 +340,11 @@ class Forminator_Addon_Activecampaign_Quiz_Settings extends Forminator_Addon_Qui
|
|
340 |
if ( 'email' === $form_field['type'] ) {
|
341 |
$email_fields[] = $form_field;
|
342 |
}
|
343 |
-
|
344 |
}
|
345 |
|
346 |
$quiz_questions = $this->get_quiz_fields();
|
347 |
$quiz_fields = array(
|
348 |
-
'quiz-name'
|
349 |
);
|
350 |
foreach ( $quiz_questions as $quiz_question ) {
|
351 |
// collect element ids.
|
@@ -355,10 +354,10 @@ class Forminator_Addon_Activecampaign_Quiz_Settings extends Forminator_Addon_Qui
|
|
355 |
if ( 'knowledge' === $this->quiz->quiz_type ) {
|
356 |
$quiz_fields['correct-answers'] = __( 'Correct Answers', 'forminator' );
|
357 |
$quiz_fields['total-answers'] = __( 'Total Answers', 'forminator' );
|
358 |
-
array_push( $forminator_quiz_element_ids,'quiz-name','correct-answers', 'total-answers' );
|
359 |
} elseif ( 'nowrong' === $this->quiz->quiz_type ) {
|
360 |
$quiz_fields['result-answers'] = __( 'Result Answer', 'forminator' );
|
361 |
-
array_push( $forminator_quiz_element_ids,'quiz-name', 'result-answers' );
|
362 |
}
|
363 |
|
364 |
$forminator_field_element_ids = array_merge( $forminator_field_element_ids, $forminator_quiz_element_ids );
|
@@ -388,13 +387,22 @@ class Forminator_Addon_Activecampaign_Quiz_Settings extends Forminator_Addon_Qui
|
|
388 |
|
389 |
try {
|
390 |
|
391 |
-
$ac_api
|
392 |
-
$
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
393 |
|
394 |
-
//get global fields assigned to the form as well as explecit field
|
395 |
-
if ( ! empty( $
|
396 |
-
foreach ( $
|
397 |
-
$fields[ $
|
398 |
}
|
399 |
}
|
400 |
|
340 |
if ( 'email' === $form_field['type'] ) {
|
341 |
$email_fields[] = $form_field;
|
342 |
}
|
|
|
343 |
}
|
344 |
|
345 |
$quiz_questions = $this->get_quiz_fields();
|
346 |
$quiz_fields = array(
|
347 |
+
'quiz-name' => __( 'Quiz Name', 'forminator' ),
|
348 |
);
|
349 |
foreach ( $quiz_questions as $quiz_question ) {
|
350 |
// collect element ids.
|
354 |
if ( 'knowledge' === $this->quiz->quiz_type ) {
|
355 |
$quiz_fields['correct-answers'] = __( 'Correct Answers', 'forminator' );
|
356 |
$quiz_fields['total-answers'] = __( 'Total Answers', 'forminator' );
|
357 |
+
array_push( $forminator_quiz_element_ids, 'quiz-name', 'correct-answers', 'total-answers' );
|
358 |
} elseif ( 'nowrong' === $this->quiz->quiz_type ) {
|
359 |
$quiz_fields['result-answers'] = __( 'Result Answer', 'forminator' );
|
360 |
+
array_push( $forminator_quiz_element_ids, 'quiz-name', 'result-answers' );
|
361 |
}
|
362 |
|
363 |
$forminator_field_element_ids = array_merge( $forminator_field_element_ids, $forminator_quiz_element_ids );
|
387 |
|
388 |
try {
|
389 |
|
390 |
+
$ac_api = $this->addon->get_api();
|
391 |
+
$lists_request = $ac_api->get_lists();
|
392 |
+
$custom_fields = array();
|
393 |
+
|
394 |
+
foreach ( $lists_request as $list ) {
|
395 |
+
if ( $list_id === $list->id ) {
|
396 |
+
if ( ! empty( $list->fields ) ) {
|
397 |
+
$custom_fields = $list->fields;
|
398 |
+
}
|
399 |
+
}
|
400 |
+
}
|
401 |
|
402 |
+
// get global fields assigned to the form as well as explecit field
|
403 |
+
if ( ! empty( $custom_fields ) ) {
|
404 |
+
foreach ( $custom_fields as $custom_field ) {
|
405 |
+
$fields[ $custom_field->id ] = $custom_field->title;
|
406 |
}
|
407 |
}
|
408 |
|
addons/pro/aweber/class-forminator-addon-aweber-form-hooks.php
CHANGED
@@ -4,7 +4,6 @@
|
|
4 |
* Class Forminator_Addon_Aweber_Form_Hooks
|
5 |
*
|
6 |
* @since 1.0 Aweber Addon
|
7 |
-
*
|
8 |
*/
|
9 |
class Forminator_Addon_Aweber_Form_Hooks extends Forminator_Addon_Form_Hooks_Abstract {
|
10 |
|
@@ -142,7 +141,7 @@ class Forminator_Addon_Aweber_Form_Hooks extends Forminator_Addon_Form_Hooks_Abs
|
|
142 |
$form_settings_instance = $this->form_settings_instance;
|
143 |
$form_settings = $this->form_settings_instance->get_form_settings();
|
144 |
|
145 |
-
//check required fields
|
146 |
try {
|
147 |
$api = $this->addon->get_api();
|
148 |
$args = array();
|
@@ -166,7 +165,7 @@ class Forminator_Addon_Aweber_Form_Hooks extends Forminator_Addon_Form_Hooks_Abs
|
|
166 |
$email = strtolower( trim( $email ) );
|
167 |
$args['email'] = $email;
|
168 |
|
169 |
-
//find existing subscriber first
|
170 |
/**
|
171 |
* Filter arguments to passed on to Find Subscriber AWeber API
|
172 |
*
|
@@ -292,10 +291,15 @@ class Forminator_Addon_Aweber_Form_Hooks extends Forminator_Addon_Form_Hooks_Abs
|
|
292 |
$element_id = str_ireplace( '}', '', $element_id );
|
293 |
|
294 |
if ( isset( $submitted_data[ $element_id ] ) ) {
|
295 |
-
$
|
|
|
|
|
|
|
|
|
|
|
296 |
}
|
297 |
} else {
|
298 |
-
$tags[] =
|
299 |
}
|
300 |
}
|
301 |
|
@@ -712,7 +716,7 @@ class Forminator_Addon_Aweber_Form_Hooks extends Forminator_Addon_Form_Hooks_Abs
|
|
712 |
*
|
713 |
* @param $addon_meta_data
|
714 |
* @param $key
|
715 |
-
* @param string
|
716 |
*
|
717 |
* @return string
|
718 |
*/
|
4 |
* Class Forminator_Addon_Aweber_Form_Hooks
|
5 |
*
|
6 |
* @since 1.0 Aweber Addon
|
|
|
7 |
*/
|
8 |
class Forminator_Addon_Aweber_Form_Hooks extends Forminator_Addon_Form_Hooks_Abstract {
|
9 |
|
141 |
$form_settings_instance = $this->form_settings_instance;
|
142 |
$form_settings = $this->form_settings_instance->get_form_settings();
|
143 |
|
144 |
+
// check required fields
|
145 |
try {
|
146 |
$api = $this->addon->get_api();
|
147 |
$args = array();
|
165 |
$email = strtolower( trim( $email ) );
|
166 |
$args['email'] = $email;
|
167 |
|
168 |
+
// find existing subscriber first
|
169 |
/**
|
170 |
* Filter arguments to passed on to Find Subscriber AWeber API
|
171 |
*
|
291 |
$element_id = str_ireplace( '}', '', $element_id );
|
292 |
|
293 |
if ( isset( $submitted_data[ $element_id ] ) ) {
|
294 |
+
$field_tags = $submitted_data[ $element_id ];
|
295 |
+
$field_tags = explode( ',', $field_tags );
|
296 |
+
|
297 |
+
foreach ( $field_tags as $tag ) {
|
298 |
+
$tags[] = sanitize_title( $tag );
|
299 |
+
}
|
300 |
}
|
301 |
} else {
|
302 |
+
$tags[] = sanitize_title( $tag );
|
303 |
}
|
304 |
}
|
305 |
|
716 |
*
|
717 |
* @param $addon_meta_data
|
718 |
* @param $key
|
719 |
+
* @param string $default
|
720 |
*
|
721 |
* @return string
|
722 |
*/
|
addons/pro/hubspot/class-forminator-addon-hubspot-form-hooks.php
CHANGED
@@ -4,7 +4,6 @@
|
|
4 |
* Class Forminator_Addon_Hubspot_Form_Hooks
|
5 |
*
|
6 |
* @since 1.0 HubSpot Addon
|
7 |
-
*
|
8 |
*/
|
9 |
class Forminator_Addon_Hubspot_Form_Hooks extends Forminator_Addon_Form_Hooks_Abstract {
|
10 |
|
@@ -145,14 +144,14 @@ class Forminator_Addon_Hubspot_Form_Hooks extends Forminator_Addon_Form_Hooks_Ab
|
|
145 |
if ( empty( $connection_settings['name'] ) ) {
|
146 |
$connection_settings['name'] = __( 'HubSpot', 'forminator' );
|
147 |
}
|
148 |
-
//check required fields
|
149 |
try {
|
150 |
$api = $this->addon->get_api();
|
151 |
$args = array();
|
152 |
|
153 |
$list_id = $connection_settings['list_id'];
|
154 |
|
155 |
-
$deafult_fields
|
156 |
$custom_fields_map = array_filter( $connection_settings['custom_fields_map'] );
|
157 |
|
158 |
$fields_map = array_merge( $deafult_fields, $custom_fields_map );
|
@@ -173,10 +172,10 @@ class Forminator_Addon_Hubspot_Form_Hooks extends Forminator_Addon_Form_Hooks_Ab
|
|
173 |
'lastname',
|
174 |
'jobtitle',
|
175 |
);
|
176 |
-
$extra_field
|
177 |
if ( ! empty( $custom_fields_map ) ) {
|
178 |
-
foreach( $custom_fields_map as $custom => $custom_field ) {
|
179 |
-
if( ! empty( $custom ) ) {
|
180 |
$extra_field[] = $custom;
|
181 |
}
|
182 |
}
|
@@ -223,7 +222,7 @@ class Forminator_Addon_Hubspot_Form_Hooks extends Forminator_Addon_Form_Hooks_Ab
|
|
223 |
* @param array $form_settings Displayed Form settings.
|
224 |
* @param Forminator_Addon_Hubspot_Form_Settings $form_settings_instance HubSpot Addon Form Settings instance.
|
225 |
*/
|
226 |
-
$args
|
227 |
'forminator_addon_hubspot_create_contact_args',
|
228 |
$args,
|
229 |
$form_id,
|
@@ -236,9 +235,12 @@ class Forminator_Addon_Hubspot_Form_Hooks extends Forminator_Addon_Form_Hooks_Ab
|
|
236 |
$contact_id = $api->add_update_contact( $args );
|
237 |
// Add contact to contact list.
|
238 |
$toObjectId = null;
|
239 |
-
if ( ! empty( $
|
240 |
$toObjectId = $contact_id;
|
241 |
-
|
|
|
|
|
|
|
242 |
}
|
243 |
|
244 |
$create_ticket = isset( $connection_settings['create_ticket'] ) ? $connection_settings['create_ticket'] : '';
|
@@ -554,7 +556,7 @@ class Forminator_Addon_Hubspot_Form_Hooks extends Forminator_Addon_Form_Hooks_Ab
|
|
554 |
*
|
555 |
* @param $addon_meta_data
|
556 |
* @param $key
|
557 |
-
* @param string
|
558 |
*
|
559 |
* @return string
|
560 |
*/
|
@@ -609,7 +611,7 @@ class Forminator_Addon_Hubspot_Form_Hooks extends Forminator_Addon_Form_Hooks_Ab
|
|
609 |
* @since 1.0 HubSpot Addon
|
610 |
*
|
611 |
* @param Forminator_Form_Entry_Model $entry_model
|
612 |
-
* @param array
|
613 |
*
|
614 |
* @return bool
|
615 |
*/
|
@@ -733,4 +735,4 @@ class Forminator_Addon_Hubspot_Form_Hooks extends Forminator_Addon_Form_Hooks_Ab
|
|
733 |
}
|
734 |
|
735 |
}
|
736 |
-
}
|
4 |
* Class Forminator_Addon_Hubspot_Form_Hooks
|
5 |
*
|
6 |
* @since 1.0 HubSpot Addon
|
|
|
7 |
*/
|
8 |
class Forminator_Addon_Hubspot_Form_Hooks extends Forminator_Addon_Form_Hooks_Abstract {
|
9 |
|
144 |
if ( empty( $connection_settings['name'] ) ) {
|
145 |
$connection_settings['name'] = __( 'HubSpot', 'forminator' );
|
146 |
}
|
147 |
+
// check required fields
|
148 |
try {
|
149 |
$api = $this->addon->get_api();
|
150 |
$args = array();
|
151 |
|
152 |
$list_id = $connection_settings['list_id'];
|
153 |
|
154 |
+
$deafult_fields = $connection_settings['fields_map'];
|
155 |
$custom_fields_map = array_filter( $connection_settings['custom_fields_map'] );
|
156 |
|
157 |
$fields_map = array_merge( $deafult_fields, $custom_fields_map );
|
172 |
'lastname',
|
173 |
'jobtitle',
|
174 |
);
|
175 |
+
$extra_field = array();
|
176 |
if ( ! empty( $custom_fields_map ) ) {
|
177 |
+
foreach ( $custom_fields_map as $custom => $custom_field ) {
|
178 |
+
if ( ! empty( $custom ) ) {
|
179 |
$extra_field[] = $custom;
|
180 |
}
|
181 |
}
|
222 |
* @param array $form_settings Displayed Form settings.
|
223 |
* @param Forminator_Addon_Hubspot_Form_Settings $form_settings_instance HubSpot Addon Form Settings instance.
|
224 |
*/
|
225 |
+
$args = apply_filters(
|
226 |
'forminator_addon_hubspot_create_contact_args',
|
227 |
$args,
|
228 |
$form_id,
|
235 |
$contact_id = $api->add_update_contact( $args );
|
236 |
// Add contact to contact list.
|
237 |
$toObjectId = null;
|
238 |
+
if ( ! empty( $contact_id ) && ! is_object( $contact_id ) && (int) $contact_id > 0 ) {
|
239 |
$toObjectId = $contact_id;
|
240 |
+
|
241 |
+
if ( ! empty( $list_id ) ) {
|
242 |
+
$api->add_to_contact_list( $contact_id, $args['email'], $list_id );
|
243 |
+
}
|
244 |
}
|
245 |
|
246 |
$create_ticket = isset( $connection_settings['create_ticket'] ) ? $connection_settings['create_ticket'] : '';
|
556 |
*
|
557 |
* @param $addon_meta_data
|
558 |
* @param $key
|
559 |
+
* @param string $default
|
560 |
*
|
561 |
* @return string
|
562 |
*/
|
611 |
* @since 1.0 HubSpot Addon
|
612 |
*
|
613 |
* @param Forminator_Form_Entry_Model $entry_model
|
614 |
+
* @param array $addon_meta_data
|
615 |
*
|
616 |
* @return bool
|
617 |
*/
|
735 |
}
|
736 |
|
737 |
}
|
738 |
+
}
|
addons/pro/hubspot/views/form-settings/create-ticket.php
CHANGED
@@ -259,9 +259,7 @@ foreach ( $template_vars as $key => $val ) {
|
|
259 |
id="ticket-description"
|
260 |
class="sui-form-control ticket-text"
|
261 |
aria-labelledby="ticket-description-label"
|
262 |
-
>
|
263 |
-
<?php echo esc_attr( $vars['ticket_description'] ); ?>
|
264 |
-
</textarea>
|
265 |
|
266 |
<select id="select-ticket-description" class="sui-variables select-field">
|
267 |
|
259 |
id="ticket-description"
|
260 |
class="sui-form-control ticket-text"
|
261 |
aria-labelledby="ticket-description-label"
|
262 |
+
><?php echo wp_kses_post( $vars['ticket_description'] ); ?></textarea>
|
|
|
|
|
263 |
|
264 |
<select id="select-ticket-description" class="sui-variables select-field">
|
265 |
|
addons/pro/mailchimp/class-forminator-addon-mailchimp-form-hooks.php
CHANGED
@@ -488,6 +488,14 @@ class Forminator_Addon_Mailchimp_Form_Hooks extends Forminator_Addon_Form_Hooks_
|
|
488 |
continue;
|
489 |
}
|
490 |
$merge_fields[ $item->tag ] = $submitted_data[ $element_id ];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
491 |
}
|
492 |
}
|
493 |
}
|
488 |
continue;
|
489 |
}
|
490 |
$merge_fields[ $item->tag ] = $submitted_data[ $element_id ];
|
491 |
+
if ( in_array( $item->type, array( 'date', 'birthday' ), true ) ) {
|
492 |
+
$time = strtotime( $submitted_data[ $element_id ] );
|
493 |
+
if ( $time ) {
|
494 |
+
$format = 'birthday' === $item->type ? 'm/d' : 'm/d/Y';
|
495 |
+
|
496 |
+
$merge_fields[ $item->tag ] = date( $format, $time ); // phpcs:ignore WordPress.DateTime.RestrictedFunctions.date_date
|
497 |
+
}
|
498 |
+
}
|
499 |
}
|
500 |
}
|
501 |
}
|
addons/pro/slack/class-forminator-addon-slack.php
CHANGED
@@ -429,21 +429,20 @@ final class Forminator_Addon_Slack extends Forminator_Addon_Abstract {
|
|
429 |
$template = forminator_addon_slack_dir() . 'views/settings/wait-authorize.php';
|
430 |
$template_success = forminator_addon_slack_dir() . 'views/settings/success-authorize.php';
|
431 |
$template_error = forminator_addon_slack_dir() . 'views/settings/error-authorize.php';
|
432 |
-
|
433 |
-
$
|
434 |
-
|
435 |
-
$is_poll = true;
|
436 |
|
437 |
$template_params = array(
|
438 |
-
'token' => $
|
439 |
'auth_url' => $this->get_auth_url(),
|
440 |
);
|
441 |
|
442 |
$has_errors = false;
|
443 |
|
444 |
-
if ( $
|
445 |
$buttons['close'] = array(
|
446 |
-
'markup' => self::get_button_markup( esc_html__( 'Close', 'forminator' ), '
|
447 |
);
|
448 |
$is_poll = false;
|
449 |
|
@@ -500,6 +499,12 @@ final class Forminator_Addon_Slack extends Forminator_Addon_Abstract {
|
|
500 |
$client_id = '';
|
501 |
if ( isset( $settings_values ['client_id'] ) ) {
|
502 |
$client_id = $settings_values ['client_id'];
|
|
|
|
|
|
|
|
|
|
|
|
|
503 |
}
|
504 |
|
505 |
/**
|
@@ -525,6 +530,12 @@ final class Forminator_Addon_Slack extends Forminator_Addon_Abstract {
|
|
525 |
$client_secret = '';
|
526 |
if ( isset( $settings_values ['client_secret'] ) ) {
|
527 |
$client_secret = $settings_values ['client_secret'];
|
|
|
|
|
|
|
|
|
|
|
|
|
528 |
}
|
529 |
|
530 |
/**
|
@@ -550,6 +561,12 @@ final class Forminator_Addon_Slack extends Forminator_Addon_Abstract {
|
|
550 |
$token = '';
|
551 |
if ( isset( $settings_values ['token'] ) ) {
|
552 |
$token = $settings_values ['token'];
|
|
|
|
|
|
|
|
|
|
|
|
|
553 |
}
|
554 |
|
555 |
/**
|
@@ -564,6 +581,20 @@ final class Forminator_Addon_Slack extends Forminator_Addon_Abstract {
|
|
564 |
return $token;
|
565 |
}
|
566 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
567 |
/**
|
568 |
* Register a page for redirect url of Slack auth
|
569 |
*
|
429 |
$template = forminator_addon_slack_dir() . 'views/settings/wait-authorize.php';
|
430 |
$template_success = forminator_addon_slack_dir() . 'views/settings/success-authorize.php';
|
431 |
$template_error = forminator_addon_slack_dir() . 'views/settings/error-authorize.php';
|
432 |
+
$buttons = array();
|
433 |
+
$token = $this->get_client_access_token();
|
434 |
+
$is_poll = true;
|
|
|
435 |
|
436 |
$template_params = array(
|
437 |
+
'token' => $token,
|
438 |
'auth_url' => $this->get_auth_url(),
|
439 |
);
|
440 |
|
441 |
$has_errors = false;
|
442 |
|
443 |
+
if ( $token ) {
|
444 |
$buttons['close'] = array(
|
445 |
+
'markup' => self::get_button_markup( esc_html__( 'Close', 'forminator' ), 'forminator-addon-close forminator-integration-popup__close' ),
|
446 |
);
|
447 |
$is_poll = false;
|
448 |
|
499 |
$client_id = '';
|
500 |
if ( isset( $settings_values ['client_id'] ) ) {
|
501 |
$client_id = $settings_values ['client_id'];
|
502 |
+
} else {
|
503 |
+
$settings = $this->get_slack_settings();
|
504 |
+
|
505 |
+
if ( isset( $settings['client_id'] ) ) {
|
506 |
+
$client_id = $settings['client_id'];
|
507 |
+
}
|
508 |
}
|
509 |
|
510 |
/**
|
530 |
$client_secret = '';
|
531 |
if ( isset( $settings_values ['client_secret'] ) ) {
|
532 |
$client_secret = $settings_values ['client_secret'];
|
533 |
+
} else {
|
534 |
+
$settings = $this->get_slack_settings();
|
535 |
+
|
536 |
+
if ( isset( $settings['client_secret'] ) ) {
|
537 |
+
$client_secret = $settings['client_secret'];
|
538 |
+
}
|
539 |
}
|
540 |
|
541 |
/**
|
561 |
$token = '';
|
562 |
if ( isset( $settings_values ['token'] ) ) {
|
563 |
$token = $settings_values ['token'];
|
564 |
+
} else {
|
565 |
+
$settings = $this->get_slack_settings();
|
566 |
+
|
567 |
+
if ( isset( $settings['token'] ) ) {
|
568 |
+
$token = $settings['token'];
|
569 |
+
}
|
570 |
}
|
571 |
|
572 |
/**
|
581 |
return $token;
|
582 |
}
|
583 |
|
584 |
+
/**
|
585 |
+
* Get slack settings while app is being connected
|
586 |
+
*
|
587 |
+
* @since 1.18 Slack Addon
|
588 |
+
*
|
589 |
+
* @return array
|
590 |
+
*/
|
591 |
+
public function get_slack_settings() {
|
592 |
+
$settings = get_option( 'forminator_addon_slack_settings' );
|
593 |
+
$settings = array_shift( array_slice( $settings, 0, 1 ) );
|
594 |
+
|
595 |
+
return $settings;
|
596 |
+
}
|
597 |
+
|
598 |
/**
|
599 |
* Register a page for redirect url of Slack auth
|
600 |
*
|
addons/pro/trello/class-forminator-addon-trello-form-hooks.php
CHANGED
@@ -4,7 +4,6 @@
|
|
4 |
* Class Forminator_Addon_Trello_Form_Hooks
|
5 |
*
|
6 |
* @since 1.0 Trello Addon
|
7 |
-
*
|
8 |
*/
|
9 |
class Forminator_Addon_Trello_Form_Hooks extends Forminator_Addon_Form_Hooks_Abstract {
|
10 |
|
@@ -152,9 +151,9 @@ class Forminator_Addon_Trello_Form_Hooks extends Forminator_Addon_Form_Hooks_Abs
|
|
152 |
* @since 1.0 Trello Addon
|
153 |
*
|
154 |
* @param string $connection_id
|
155 |
-
* @param array
|
156 |
-
* @param array
|
157 |
-
* @param array
|
158 |
*
|
159 |
* @return array `is_sent` true means its success send data to Trello, false otherwise
|
160 |
*/
|
@@ -164,9 +163,9 @@ class Forminator_Addon_Trello_Form_Hooks extends Forminator_Addon_Form_Hooks_Abs
|
|
164 |
|
165 |
$form_id = $this->form_id;
|
166 |
$form_settings_instance = $this->form_settings_instance;
|
167 |
-
$uploads
|
168 |
|
169 |
-
//check required fields
|
170 |
try {
|
171 |
$api = $this->addon->get_api();
|
172 |
$args = array();
|
@@ -247,8 +246,15 @@ class Forminator_Addon_Trello_Form_Hooks extends Forminator_Addon_Form_Hooks_Abs
|
|
247 |
}
|
248 |
|
249 |
if ( isset( $connection_settings['due_date'] ) && ! empty( $connection_settings['due_date'] ) ) {
|
250 |
-
$due_date
|
251 |
-
$
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
252 |
}
|
253 |
|
254 |
if ( isset( $connection_settings['position'] ) ) {
|
@@ -329,7 +335,6 @@ class Forminator_Addon_Trello_Form_Hooks extends Forminator_Addon_Form_Hooks_Abs
|
|
329 |
|
330 |
/**
|
331 |
* Special Replacer `{all_fields}` to markdown with Trello Flavour
|
332 |
-
*
|
333 |
*/
|
334 |
private function all_fields_to_markdown() {
|
335 |
$form_fields = $this->form_settings_instance->get_form_fields();
|
@@ -685,7 +690,7 @@ class Forminator_Addon_Trello_Form_Hooks extends Forminator_Addon_Form_Hooks_Abs
|
|
685 |
*
|
686 |
* @param $addon_meta_data
|
687 |
* @param $key
|
688 |
-
* @param string
|
689 |
*
|
690 |
* @return string
|
691 |
*/
|
@@ -740,7 +745,7 @@ class Forminator_Addon_Trello_Form_Hooks extends Forminator_Addon_Form_Hooks_Abs
|
|
740 |
* @since 1.0 Trello Addon
|
741 |
*
|
742 |
* @param Forminator_Form_Entry_Model $entry_model
|
743 |
-
* @param array
|
744 |
*
|
745 |
* @return bool
|
746 |
*/
|
@@ -828,7 +833,7 @@ class Forminator_Addon_Trello_Form_Hooks extends Forminator_Addon_Form_Hooks_Abs
|
|
828 |
}
|
829 |
}
|
830 |
|
831 |
-
//delete mode!
|
832 |
return true;
|
833 |
|
834 |
} catch ( Forminator_Addon_Trello_Exception $e ) {
|
@@ -914,7 +919,6 @@ class Forminator_Addon_Trello_Form_Hooks extends Forminator_Addon_Form_Hooks_Abs
|
|
914 |
* @param array $addon_meta_datum
|
915 |
* @param int $form_id
|
916 |
* @param Forminator_Addon_Trello_Form_Settings $form_settings_instance Trello Addon Form Settings instance.
|
917 |
-
*
|
918 |
*/
|
919 |
do_action(
|
920 |
'forminator_addon_trello_delete_card',
|
@@ -929,18 +933,17 @@ class Forminator_Addon_Trello_Form_Hooks extends Forminator_Addon_Form_Hooks_Abs
|
|
929 |
|
930 |
/**
|
931 |
* Get uploads to be added as attachments
|
932 |
-
*
|
933 |
*/
|
934 |
private function get_uploads( $fields ) {
|
935 |
-
$uploads =
|
936 |
|
937 |
-
foreach( $fields as $i => $val ) {
|
938 |
if ( 0 === stripos( $val['name'], 'upload-' ) ) {
|
939 |
if ( ! empty( $val['value'] ) ) {
|
940 |
$file_url = $val['value']['file']['file_url'];
|
941 |
|
942 |
if ( is_array( $file_url ) ) {
|
943 |
-
foreach( $file_url as $url ) {
|
944 |
$uploads[] = $url;
|
945 |
}
|
946 |
} else {
|
@@ -955,13 +958,12 @@ class Forminator_Addon_Trello_Form_Hooks extends Forminator_Addon_Form_Hooks_Abs
|
|
955 |
|
956 |
/**
|
957 |
* Add attachments to created card
|
958 |
-
*
|
959 |
*/
|
960 |
private function add_attachments( $api, $uploads ) {
|
961 |
$card_id = $api->get_card_id();
|
962 |
|
963 |
if ( ! empty( $uploads ) ) {
|
964 |
-
foreach( $uploads as $upload ) {
|
965 |
$api->add_attachment( $card_id, $upload );
|
966 |
}
|
967 |
}
|
4 |
* Class Forminator_Addon_Trello_Form_Hooks
|
5 |
*
|
6 |
* @since 1.0 Trello Addon
|
|
|
7 |
*/
|
8 |
class Forminator_Addon_Trello_Form_Hooks extends Forminator_Addon_Form_Hooks_Abstract {
|
9 |
|
151 |
* @since 1.0 Trello Addon
|
152 |
*
|
153 |
* @param string $connection_id
|
154 |
+
* @param array $submitted_data
|
155 |
+
* @param array $connection_settings
|
156 |
+
* @param array $form_entry_fields
|
157 |
*
|
158 |
* @return array `is_sent` true means its success send data to Trello, false otherwise
|
159 |
*/
|
163 |
|
164 |
$form_id = $this->form_id;
|
165 |
$form_settings_instance = $this->form_settings_instance;
|
166 |
+
$uploads = $this->get_uploads( $form_entry_fields );
|
167 |
|
168 |
+
// check required fields
|
169 |
try {
|
170 |
$api = $this->addon->get_api();
|
171 |
$args = array();
|
246 |
}
|
247 |
|
248 |
if ( isset( $connection_settings['due_date'] ) && ! empty( $connection_settings['due_date'] ) ) {
|
249 |
+
$due_date = forminator_addon_replace_custom_vars( $connection_settings['due_date'], $submitted_data, $this->custom_form, $form_entry_fields, false, $entry );
|
250 |
+
if ( false !== strpos( $connection_settings['due_date'], '{' ) ) {
|
251 |
+
$date_field = str_replace( array( '{', '}' ), '', $connection_settings['due_date'] );
|
252 |
+
$date_field_index = array_search( $date_field, array_column( $form_entry_fields, 'name' ) );
|
253 |
+
$date_format = Forminator_Field::get_property( 'date_format', $form_entry_fields[ $date_field_index ]['field_array'] );
|
254 |
+
$due_date = forminator_reformat_date( $due_date, $date_format, 'F j Y' );
|
255 |
+
}
|
256 |
+
|
257 |
+
$args['due'] = $due_date;
|
258 |
}
|
259 |
|
260 |
if ( isset( $connection_settings['position'] ) ) {
|
335 |
|
336 |
/**
|
337 |
* Special Replacer `{all_fields}` to markdown with Trello Flavour
|
|
|
338 |
*/
|
339 |
private function all_fields_to_markdown() {
|
340 |
$form_fields = $this->form_settings_instance->get_form_fields();
|
690 |
*
|
691 |
* @param $addon_meta_data
|
692 |
* @param $key
|
693 |
+
* @param string $default
|
694 |
*
|
695 |
* @return string
|
696 |
*/
|
745 |
* @since 1.0 Trello Addon
|
746 |
*
|
747 |
* @param Forminator_Form_Entry_Model $entry_model
|
748 |
+
* @param array $addon_meta_data
|
749 |
*
|
750 |
* @return bool
|
751 |
*/
|
833 |
}
|
834 |
}
|
835 |
|
836 |
+
// delete mode!
|
837 |
return true;
|
838 |
|
839 |
} catch ( Forminator_Addon_Trello_Exception $e ) {
|
919 |
* @param array $addon_meta_datum
|
920 |
* @param int $form_id
|
921 |
* @param Forminator_Addon_Trello_Form_Settings $form_settings_instance Trello Addon Form Settings instance.
|
|
|
922 |
*/
|
923 |
do_action(
|
924 |
'forminator_addon_trello_delete_card',
|
933 |
|
934 |
/**
|
935 |
* Get uploads to be added as attachments
|
|
|
936 |
*/
|
937 |
private function get_uploads( $fields ) {
|
938 |
+
$uploads = array();
|
939 |
|
940 |
+
foreach ( $fields as $i => $val ) {
|
941 |
if ( 0 === stripos( $val['name'], 'upload-' ) ) {
|
942 |
if ( ! empty( $val['value'] ) ) {
|
943 |
$file_url = $val['value']['file']['file_url'];
|
944 |
|
945 |
if ( is_array( $file_url ) ) {
|
946 |
+
foreach ( $file_url as $url ) {
|
947 |
$uploads[] = $url;
|
948 |
}
|
949 |
} else {
|
958 |
|
959 |
/**
|
960 |
* Add attachments to created card
|
|
|
961 |
*/
|
962 |
private function add_attachments( $api, $uploads ) {
|
963 |
$card_id = $api->get_card_id();
|
964 |
|
965 |
if ( ! empty( $uploads ) ) {
|
966 |
+
foreach ( $uploads as $upload ) {
|
967 |
$api->add_attachment( $card_id, $upload );
|
968 |
}
|
969 |
}
|
addons/pro/webhook/assets/icons/webhook.png
ADDED
Binary file
|
addons/pro/webhook/assets/icons/webhook@2x.png
ADDED
Binary file
|
addons/pro/webhook/assets/img/banner.png
ADDED
Binary file
|
addons/pro/webhook/assets/img/banner@2x.png
ADDED
Binary file
|
addons/pro/webhook/assets/img/webhook.png
ADDED
Binary file
|
addons/pro/webhook/assets/img/webhook@2x.png
ADDED
Binary file
|
addons/pro/webhook/class-forminator-addon-webhook-exception.php
ADDED
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/**
|
4 |
+
* Class Forminator_Addon_Webhook_Exception
|
5 |
+
* Not Required but encouraged
|
6 |
+
*/
|
7 |
+
class Forminator_Addon_Webhook_Exception extends Exception {
|
8 |
+
|
9 |
+
}
|
addons/pro/webhook/class-forminator-addon-webhook-form-hooks.php
ADDED
@@ -0,0 +1,573 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/**
|
4 |
+
* Class Forminator_Addon_Webhook_Form_Hooks
|
5 |
+
*
|
6 |
+
*/
|
7 |
+
class Forminator_Addon_Webhook_Form_Hooks extends Forminator_Addon_Form_Hooks_Abstract {
|
8 |
+
|
9 |
+
/**
|
10 |
+
* Addon instance are auto available form abstract
|
11 |
+
* Its added here for development purpose,
|
12 |
+
* Autocomplete will resolve addon directly to `Webhook` instance instead of the abstract
|
13 |
+
* And its public properties can be exposed
|
14 |
+
*
|
15 |
+
* @var Forminator_Addon_Webhook
|
16 |
+
*/
|
17 |
+
protected $addon;
|
18 |
+
|
19 |
+
/**
|
20 |
+
* Form Settings Instance
|
21 |
+
*
|
22 |
+
* @var Forminator_Addon_Webhook_Form_Settings | null
|
23 |
+
*/
|
24 |
+
protected $form_settings_instance;
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Forminator_Addon_Webhook_Form_Hooks constructor.
|
28 |
+
*
|
29 |
+
* @param Forminator_Addon_Abstract $addon
|
30 |
+
* @param $form_id
|
31 |
+
*
|
32 |
+
* @throws Forminator_Addon_Exception
|
33 |
+
*/
|
34 |
+
public function __construct( Forminator_Addon_Abstract $addon, $form_id ) {
|
35 |
+
parent::__construct( $addon, $form_id );
|
36 |
+
$this->_submit_form_error_message = __( 'Webhook failed to process submitted data. Please check your form and try again', 'forminator' );
|
37 |
+
}
|
38 |
+
|
39 |
+
|
40 |
+
/**
|
41 |
+
* Save status of request sent and received for each connected zap(s)
|
42 |
+
*
|
43 |
+
* @since 1.7 Add $form_entry_fields
|
44 |
+
*
|
45 |
+
* @param array $submitted_data
|
46 |
+
* @param array $form_entry_fields
|
47 |
+
*
|
48 |
+
* @return array
|
49 |
+
*/
|
50 |
+
public function add_entry_fields( $submitted_data, $form_entry_fields = array() ) {
|
51 |
+
|
52 |
+
$form_id = $this->form_id;
|
53 |
+
$form_settings_instance = $this->form_settings_instance;
|
54 |
+
|
55 |
+
/**
|
56 |
+
* Filterwebhook submitted form data to be processed
|
57 |
+
*
|
58 |
+
* @since 1.1
|
59 |
+
*
|
60 |
+
* @param array $submitted_data
|
61 |
+
* @param int $form_id current Form ID.
|
62 |
+
* @param Forminator_Addon_Webhook_Form_Settings $form_settings_instance Webhook Addon Form Settings instance.
|
63 |
+
*/
|
64 |
+
$submitted_data = apply_filters_deprecated(
|
65 |
+
'forminator_addon_zapier_form_submitted_data',
|
66 |
+
array( $submitted_data, $form_id, $form_settings_instance ),
|
67 |
+
'1.18.0',
|
68 |
+
'forminator_addon_webhook_form_submitted_data'
|
69 |
+
);
|
70 |
+
$submitted_data = apply_filters(
|
71 |
+
'forminator_addon_webhook_form_submitted_data',
|
72 |
+
$submitted_data,
|
73 |
+
$form_id,
|
74 |
+
$form_settings_instance
|
75 |
+
);
|
76 |
+
|
77 |
+
forminator_addon_maybe_log( __METHOD__, $submitted_data );
|
78 |
+
|
79 |
+
$addon_setting_values = $form_settings_instance->get_form_settings_values();
|
80 |
+
$form_settings = $form_settings_instance->get_form_settings();
|
81 |
+
|
82 |
+
$data = array();
|
83 |
+
|
84 |
+
/**
|
85 |
+
* Fires before sending data to Webhook URL(s)
|
86 |
+
*
|
87 |
+
* @since 1.1
|
88 |
+
*
|
89 |
+
* @param int $form_id current Form ID.
|
90 |
+
* @param array $submitted_data
|
91 |
+
* @param Forminator_Addon_Webhook_Form_Settings $form_settings_instance Webhook Addon Form Settings instance.
|
92 |
+
*/
|
93 |
+
do_action_deprecated( 'forminator_addon_zapier_before_post_to_webhook', array( $form_id, $submitted_data, $form_settings_instance ), '1.18.0', 'forminator_addon_webhook_before_post_to_webhook' );
|
94 |
+
do_action( 'forminator_addon_webhook_before_post_to_webhook', $form_id, $submitted_data, $form_settings_instance );
|
95 |
+
|
96 |
+
foreach ( $addon_setting_values as $key => $addon_setting_value ) {
|
97 |
+
// save it on entry field, with name `status-$MULTI_ID`, and value is the return result on sending data towebhook.
|
98 |
+
$data[] = array(
|
99 |
+
'name' => 'status-' . $key,
|
100 |
+
'value' => $this->get_status_on_send_data( $key, $submitted_data, $addon_setting_value, $form_settings, $form_entry_fields ),
|
101 |
+
);
|
102 |
+
}
|
103 |
+
|
104 |
+
$entry_fields = $data;
|
105 |
+
/**
|
106 |
+
* Filterwebhook entry fields to be saved to entry model
|
107 |
+
*
|
108 |
+
* @since 1.1
|
109 |
+
*
|
110 |
+
* @param array $entry_fields
|
111 |
+
* @param int $form_id current Form ID.
|
112 |
+
* @param array $submitted_data
|
113 |
+
* @param Forminator_Addon_Webhook_Form_Settings $form_settings_instance Webhook Form Settings instance.
|
114 |
+
*/
|
115 |
+
$data = apply_filters_deprecated(
|
116 |
+
'forminator_addon_zapier_entry_fields',
|
117 |
+
array( $entry_fields, $form_id, $submitted_data, $form_settings_instance ),
|
118 |
+
'1.18.0',
|
119 |
+
'forminator_addon_webhook_entry_fields'
|
120 |
+
);
|
121 |
+
$data = apply_filters(
|
122 |
+
'forminator_addon_webhook_entry_fields',
|
123 |
+
$data,
|
124 |
+
$form_id,
|
125 |
+
$submitted_data,
|
126 |
+
$form_settings_instance
|
127 |
+
);
|
128 |
+
|
129 |
+
return $data;
|
130 |
+
|
131 |
+
}
|
132 |
+
|
133 |
+
/**
|
134 |
+
* Get status on sending data towebhook
|
135 |
+
*
|
136 |
+
* @since 1.7 Add $form_entry_fields arg
|
137 |
+
*
|
138 |
+
* @param $connection_id
|
139 |
+
* @param $submitted_data
|
140 |
+
* @param $connection_settings
|
141 |
+
* @param $form_settings
|
142 |
+
* @param array $form_entry_fields
|
143 |
+
*
|
144 |
+
* @return array `is_sent` true means its success send data towebhook, false otherwise
|
145 |
+
*/
|
146 |
+
private function get_status_on_send_data( $connection_id, $submitted_data, $connection_settings, $form_settings, $form_entry_fields ) {
|
147 |
+
// initialize as null.
|
148 |
+
$webhook_api = null;
|
149 |
+
|
150 |
+
$form_id = $this->form_id;
|
151 |
+
$form_settings_instance = $this->form_settings_instance;
|
152 |
+
|
153 |
+
//check required fields
|
154 |
+
try {
|
155 |
+
if ( ! isset( $connection_settings['webhook_url'] ) ) {
|
156 |
+
throw new Forminator_Addon_Webhook_Exception( __( 'Webhook URL is not properly setup', 'forminator' ) );
|
157 |
+
}
|
158 |
+
|
159 |
+
$endpoint = $connection_settings['webhook_url'];
|
160 |
+
/**
|
161 |
+
* Filter Endpoint Webhook URL to send
|
162 |
+
*
|
163 |
+
* @since 1.1
|
164 |
+
*
|
165 |
+
* @param string $endpoint
|
166 |
+
* @param int $form_id current Form ID.
|
167 |
+
* @param array $connection_settings current connection setting, it contains `name` and `webhook_url`.
|
168 |
+
*/
|
169 |
+
$endpoint = apply_filters_deprecated(
|
170 |
+
'forminator_addon_zapier_endpoint',
|
171 |
+
array( $endpoint, $form_id, $connection_settings ),
|
172 |
+
'1.18.0',
|
173 |
+
'forminator_addon_webhook_endpoint'
|
174 |
+
);
|
175 |
+
$endpoint = apply_filters(
|
176 |
+
'forminator_addon_webhook_endpoint',
|
177 |
+
$endpoint,
|
178 |
+
$form_id,
|
179 |
+
$connection_settings
|
180 |
+
);
|
181 |
+
|
182 |
+
$webhook_api = $this->addon->get_api( $endpoint );
|
183 |
+
|
184 |
+
$args = $submitted_data;
|
185 |
+
|
186 |
+
$args['form-title'] = $form_settings['formName'];
|
187 |
+
$args['entry-time'] = current_time( 'Y-m-d H:i:s' );
|
188 |
+
|
189 |
+
/**
|
190 |
+
* Filter arguments to passed on to Webhook API
|
191 |
+
*
|
192 |
+
* @since 1.1
|
193 |
+
*
|
194 |
+
* @param array $args
|
195 |
+
* @param int $form_id Current Form id.
|
196 |
+
* @param string $connection_id ID of current connection.
|
197 |
+
* @param array $submitted_data
|
198 |
+
* @param array $connection_settings current connection setting, contains `name` and `webhook_url`.
|
199 |
+
* @param array $form_settings Displayed Form settings.
|
200 |
+
* @param Forminator_Addon_Webhook_Form_Settings $form_settings_instance Webhook Form Settings instance.
|
201 |
+
*/
|
202 |
+
$args = apply_filters_deprecated(
|
203 |
+
'forminator_addon_zapier_post_to_webhook_args',
|
204 |
+
array( $args, $form_id, $connection_id, $submitted_data, $connection_settings, $form_settings, $form_settings_instance ),
|
205 |
+
'1.18.0',
|
206 |
+
'forminator_addon_webhook_post_to_webhook_args'
|
207 |
+
);
|
208 |
+
$args = apply_filters(
|
209 |
+
'forminator_addon_webhook_post_to_webhook_args',
|
210 |
+
$args,
|
211 |
+
$form_id,
|
212 |
+
$connection_id,
|
213 |
+
$submitted_data,
|
214 |
+
$connection_settings,
|
215 |
+
$form_settings,
|
216 |
+
$form_settings_instance
|
217 |
+
);
|
218 |
+
|
219 |
+
// replace '-' to '_' in keys because some integrations don't support dashes like tray.io and workato.
|
220 |
+
// don't do it for zapier for backward compatibility.
|
221 |
+
$args = $form_settings_instance::replace_dashes_in_keys( $args, $endpoint );
|
222 |
+
|
223 |
+
$webhook_api->post_( $args );
|
224 |
+
|
225 |
+
forminator_addon_maybe_log( __METHOD__, 'Success Send Data' );
|
226 |
+
|
227 |
+
return array(
|
228 |
+
'is_sent' => true,
|
229 |
+
'connection_name' => $connection_settings['name'],
|
230 |
+
'description' => __( 'Successfully send data to Webhook', 'forminator' ),
|
231 |
+
'data_sent' => $webhook_api->get_last_data_sent(),
|
232 |
+
'data_received' => $webhook_api->get_last_data_received(),
|
233 |
+
'url_request' => $webhook_api->get_last_url_request(),
|
234 |
+
);
|
235 |
+
|
236 |
+
} catch ( Forminator_Addon_Webhook_Exception $e ) {
|
237 |
+
forminator_addon_maybe_log( __METHOD__, 'Failed to Send to Webhook' );
|
238 |
+
|
239 |
+
return array(
|
240 |
+
'is_sent' => false,
|
241 |
+
'description' => $e->getMessage(),
|
242 |
+
'connection_name' => $connection_settings['name'],
|
243 |
+
'data_sent' => ( ( $webhook_api instanceof Forminator_Addon_Webhook_Wp_Api ) ? $webhook_api->get_last_data_sent() : array() ),
|
244 |
+
'data_received' => ( ( $webhook_api instanceof Forminator_Addon_Webhook_Wp_Api ) ? $webhook_api->get_last_data_received() : array() ),
|
245 |
+
'url_request' => ( ( $webhook_api instanceof Forminator_Addon_Webhook_Wp_Api ) ? $webhook_api->get_last_url_request() : '' ),
|
246 |
+
);
|
247 |
+
}
|
248 |
+
}
|
249 |
+
|
250 |
+
/**
|
251 |
+
* It wil add new row on entry table of submission page, with couple of subentries
|
252 |
+
* subentries included are defined in @see Forminator_Addon_Webhook_Form_Hooks::get_additional_entry_item()
|
253 |
+
*
|
254 |
+
* @param Forminator_Form_Entry_Model $entry_model
|
255 |
+
* @param $addon_meta_data
|
256 |
+
*
|
257 |
+
* @return array
|
258 |
+
*/
|
259 |
+
public function on_render_entry( Forminator_Form_Entry_Model $entry_model, $addon_meta_data ) {
|
260 |
+
|
261 |
+
$form_id = $this->form_id;
|
262 |
+
$form_settings_instance = $this->form_settings_instance;
|
263 |
+
|
264 |
+
/**
|
265 |
+
*
|
266 |
+
* Filterwebhook metadata that previously saved on db to be processed
|
267 |
+
*
|
268 |
+
* @since 1.1
|
269 |
+
*
|
270 |
+
* @param array $addon_meta_data
|
271 |
+
* @param int $form_id current Form ID.
|
272 |
+
* @param Forminator_Addon_Webhook_Form_Settings $form_settings_instance Webhook Form Settings instance.
|
273 |
+
*/
|
274 |
+
$addon_meta_data = apply_filters_deprecated(
|
275 |
+
'forminator_addon_zapier_metadata',
|
276 |
+
array( $addon_meta_data, $form_id, $form_settings_instance ),
|
277 |
+
'1.18.0',
|
278 |
+
'forminator_addon_webhook_metadata'
|
279 |
+
);
|
280 |
+
$addon_meta_data = apply_filters(
|
281 |
+
'forminator_addon_webhook_metadata',
|
282 |
+
$addon_meta_data,
|
283 |
+
$form_id,
|
284 |
+
$form_settings_instance
|
285 |
+
);
|
286 |
+
|
287 |
+
$addon_meta_datas = $addon_meta_data;
|
288 |
+
if ( ! isset( $addon_meta_data[0] ) || ! is_array( $addon_meta_data[0] ) ) {
|
289 |
+
return array();
|
290 |
+
}
|
291 |
+
|
292 |
+
$addon_meta_data = $addon_meta_data[0];
|
293 |
+
|
294 |
+
// make sure its `status`, because we only add this.
|
295 |
+
// when its `status` then its single connection (backward compat on dev).
|
296 |
+
// when its status-$MULTI_ID its multiple connection its default behavior.
|
297 |
+
if ( 'status' !== $addon_meta_data['name'] ) {
|
298 |
+
if ( stripos( $addon_meta_data['name'], 'status-' ) === 0 ) {
|
299 |
+
return $this->on_render_entry_multi_connection( $addon_meta_datas );
|
300 |
+
}
|
301 |
+
|
302 |
+
return array();
|
303 |
+
}
|
304 |
+
|
305 |
+
$additional_entry_item = $this->get_additional_entry_item( $addon_meta_data );
|
306 |
+
if ( empty( $additional_entry_item ) ) {
|
307 |
+
return array();
|
308 |
+
}
|
309 |
+
|
310 |
+
return array( $additional_entry_item );
|
311 |
+
|
312 |
+
}
|
313 |
+
|
314 |
+
/**
|
315 |
+
* Loop through addon meta data on multiple zap(s)
|
316 |
+
*
|
317 |
+
* @param $addon_meta_datas
|
318 |
+
*
|
319 |
+
* @return array
|
320 |
+
*/
|
321 |
+
private function on_render_entry_multi_connection( $addon_meta_datas ) {
|
322 |
+
$additional_entry_item = array();
|
323 |
+
foreach ( $addon_meta_datas as $addon_meta_data ) {
|
324 |
+
$additional_entry_item[] = $this->get_additional_entry_item( $addon_meta_data );
|
325 |
+
}
|
326 |
+
|
327 |
+
return $additional_entry_item;
|
328 |
+
|
329 |
+
}
|
330 |
+
|
331 |
+
/**
|
332 |
+
* Format additional entry item as label and value arrays
|
333 |
+
*
|
334 |
+
* - Integration Name : its defined by user when they addingwebhook integration on their form
|
335 |
+
* - Sent To Webhook : will be Yes/No value, that indicates whether sending data towebhook was successful
|
336 |
+
* - Info : Text that are generated by addon when building and sending data towebhook @see Forminator_Addon_Webhook_Form_Hooks::add_entry_fields()
|
337 |
+
* - Below subentries will be added if full log enabled, @see Forminator_Addon_Webhook::is_show_full_log() @see FORMINATOR_ADDON_WEBHOOK_SHOW_FULL_LOG
|
338 |
+
* - API URL : URL that wes requested when sending data towebhook
|
339 |
+
* - Data sent to Webhook : json encoded body request that was sent
|
340 |
+
* - Data received from Webhook : json encoded body response that was received
|
341 |
+
*
|
342 |
+
* @param $addon_meta_data
|
343 |
+
*
|
344 |
+
* @return array
|
345 |
+
*/
|
346 |
+
private function get_additional_entry_item( $addon_meta_data ) {
|
347 |
+
|
348 |
+
if ( ! isset( $addon_meta_data['value'] ) || ! is_array( $addon_meta_data['value'] ) ) {
|
349 |
+
return array();
|
350 |
+
}
|
351 |
+
$status = $addon_meta_data['value'];
|
352 |
+
$additional_entry_item = array(
|
353 |
+
'label' => __( 'Webhook Integration', 'forminator' ),
|
354 |
+
'value' => '',
|
355 |
+
);
|
356 |
+
|
357 |
+
$sub_entries = array();
|
358 |
+
if ( isset( $status['connection_name'] ) ) {
|
359 |
+
$sub_entries[] = array(
|
360 |
+
'label' => __( 'Integration Name', 'forminator' ),
|
361 |
+
'value' => $status['connection_name'],
|
362 |
+
);
|
363 |
+
}
|
364 |
+
|
365 |
+
if ( isset( $status['is_sent'] ) ) {
|
366 |
+
$is_sent = true === $status['is_sent'] ? __( 'Yes', 'forminator' ) : __( 'No', 'forminator' );
|
367 |
+
$sub_entries[] = array(
|
368 |
+
'label' => __( 'Sent To Webhook', 'forminator' ),
|
369 |
+
'value' => $is_sent,
|
370 |
+
);
|
371 |
+
}
|
372 |
+
|
373 |
+
if ( isset( $status['description'] ) ) {
|
374 |
+
$sub_entries[] = array(
|
375 |
+
'label' => __( 'Info', 'forminator' ),
|
376 |
+
'value' => $status['description'],
|
377 |
+
);
|
378 |
+
}
|
379 |
+
|
380 |
+
if ( Forminator_Addon_Webhook::is_show_full_log() ) {
|
381 |
+
// too long to be added on entry data enable this with `define('FORMINATOR_ADDON_WEBHOOK_SHOW_FULL_LOG', true)`.
|
382 |
+
if ( isset( $status['url_request'] ) ) {
|
383 |
+
$sub_entries[] = array(
|
384 |
+
'label' => __( 'API URL', 'forminator' ),
|
385 |
+
'value' => $status['url_request'],
|
386 |
+
);
|
387 |
+
}
|
388 |
+
|
389 |
+
if ( isset( $status['data_sent'] ) ) {
|
390 |
+
$sub_entries[] = array(
|
391 |
+
'label' => __( 'Data sent to Webhook', 'forminator' ),
|
392 |
+
'value' => '<pre class="sui-code-snippet">' . wp_json_encode( $status['data_sent'], JSON_PRETTY_PRINT ) . '</pre>',
|
393 |
+
);
|
394 |
+
}
|
395 |
+
|
396 |
+
if ( isset( $status['data_received'] ) ) {
|
397 |
+
$sub_entries[] = array(
|
398 |
+
'label' => __( 'Data received from Webhook', 'forminator' ),
|
399 |
+
'value' => '<pre class="sui-code-snippet">' . wp_json_encode( $status['data_received'], JSON_PRETTY_PRINT ) . '</pre>',
|
400 |
+
);
|
401 |
+
}
|
402 |
+
}
|
403 |
+
|
404 |
+
$additional_entry_item['sub_entries'] = $sub_entries;
|
405 |
+
|
406 |
+
// return single array.
|
407 |
+
return $additional_entry_item;
|
408 |
+
}
|
409 |
+
|
410 |
+
/**
|
411 |
+
* Webhook will add a column on the title/header row
|
412 |
+
* its called `Webhook Info` which can be translated on forminator lang
|
413 |
+
*
|
414 |
+
* @return array
|
415 |
+
*/
|
416 |
+
public function on_export_render_title_row() {
|
417 |
+
|
418 |
+
$export_headers = array(
|
419 |
+
'info' => __( 'Webhook Info', 'forminator' ),
|
420 |
+
);
|
421 |
+
|
422 |
+
$form_id = $this->form_id;
|
423 |
+
$form_settings_instance = $this->form_settings_instance;
|
424 |
+
|
425 |
+
/**
|
426 |
+
* Filterwebhook headers on export file
|
427 |
+
*
|
428 |
+
* @since 1.1
|
429 |
+
*
|
430 |
+
* @param array $export_headers headers to be displayed on export file.
|
431 |
+
* @param int $form_id current Form ID.
|
432 |
+
* @param Forminator_Addon_Webhook_Form_Settings $form_settings_instance Webhook Form Settings instance.
|
433 |
+
*/
|
434 |
+
$export_headers = apply_filters_deprecated(
|
435 |
+
'forminator_addon_zapier_export_headers',
|
436 |
+
array( $export_headers, $form_id, $form_settings_instance ),
|
437 |
+
'1.18.0',
|
438 |
+
'forminator_addon_webhook_export_headers'
|
439 |
+
);
|
440 |
+
$export_headers = apply_filters(
|
441 |
+
'forminator_addon_webhook_export_headers',
|
442 |
+
$export_headers,
|
443 |
+
$form_id,
|
444 |
+
$form_settings_instance
|
445 |
+
);
|
446 |
+
|
447 |
+
return $export_headers;
|
448 |
+
}
|
449 |
+
|
450 |
+
/**
|
451 |
+
* Webhook will add a column that give user information whether sending data towebhook successfully or not
|
452 |
+
* It will only add one column even its multiple connection, every connection will be separated by comma
|
453 |
+
*
|
454 |
+
* @param Forminator_Form_Entry_Model $entry_model
|
455 |
+
* @param $addon_meta_data
|
456 |
+
*
|
457 |
+
* @return array
|
458 |
+
*/
|
459 |
+
public function on_export_render_entry( Forminator_Form_Entry_Model $entry_model, $addon_meta_data ) {
|
460 |
+
|
461 |
+
$form_id = $this->form_id;
|
462 |
+
$form_settings_instance = $this->form_settings_instance;
|
463 |
+
|
464 |
+
/**
|
465 |
+
*
|
466 |
+
* Filterwebhook metadata that previously saved on db to be processed
|
467 |
+
*
|
468 |
+
* @since 1.1
|
469 |
+
*
|
470 |
+
* @param array $addon_meta_data
|
471 |
+
* @param int $form_id current Form ID.
|
472 |
+
* @param Forminator_Addon_Webhook_Form_Settings $form_settings_instance Webhook Form Settings instance.
|
473 |
+
*/
|
474 |
+
$addon_meta_data = apply_filters_deprecated(
|
475 |
+
'forminator_addon_zapier_metadata',
|
476 |
+
array( $addon_meta_data, $form_id, $form_settings_instance ),
|
477 |
+
'1.18.0',
|
478 |
+
'forminator_addon_webhook_metadata'
|
479 |
+
);
|
480 |
+
$addon_meta_data = apply_filters(
|
481 |
+
'forminator_addon_webhook_metadata',
|
482 |
+
$addon_meta_data,
|
483 |
+
$form_id,
|
484 |
+
$form_settings_instance
|
485 |
+
);
|
486 |
+
|
487 |
+
$export_columns = array(
|
488 |
+
'info' => $this->get_from_addon_meta_data( $addon_meta_data, 'description', '' ),
|
489 |
+
);
|
490 |
+
|
491 |
+
/**
|
492 |
+
* Filterwebhook columns to be displayed on export submissions
|
493 |
+
*
|
494 |
+
* @since 1.1
|
495 |
+
*
|
496 |
+
* @param array $export_columns column to be exported.
|
497 |
+
* @param int $form_id current Form ID.
|
498 |
+
* @param Forminator_Form_Entry_Model $entry_model Form Entry Model.
|
499 |
+
* @param array $addon_meta_data meta data saved by addon on entry fields.
|
500 |
+
* @param Forminator_Addon_Webhook_Form_Settings $form_settings_instance Webhook Form Settings instance.
|
501 |
+
*/
|
502 |
+
$export_columns = apply_filters_deprecated(
|
503 |
+
'forminator_addon_zapier_export_columns',
|
504 |
+
array( $export_columns, $form_id, $entry_model, $addon_meta_data, $form_settings_instance ),
|
505 |
+
'1.18.0',
|
506 |
+
'forminator_addon_webhook_export_columns'
|
507 |
+
);
|
508 |
+
$export_columns = apply_filters(
|
509 |
+
'forminator_addon_webhook_export_columns',
|
510 |
+
$export_columns,
|
511 |
+
$form_id,
|
512 |
+
$entry_model,
|
513 |
+
$addon_meta_data,
|
514 |
+
$form_settings_instance
|
515 |
+
);
|
516 |
+
|
517 |
+
return $export_columns;
|
518 |
+
}
|
519 |
+
|
520 |
+
/**
|
521 |
+
* Get Addon meta data, will be recursive if meta data is multiple because of multiple connection added
|
522 |
+
*
|
523 |
+
* @param $addon_meta_data
|
524 |
+
* @param $key
|
525 |
+
* @param string $default
|
526 |
+
*
|
527 |
+
* @return string
|
528 |
+
*/
|
529 |
+
private function get_from_addon_meta_data( $addon_meta_data, $key, $default = '' ) {
|
530 |
+
$addon_meta_datas = $addon_meta_data;
|
531 |
+
if ( ! isset( $addon_meta_data[0] ) || ! is_array( $addon_meta_data[0] ) ) {
|
532 |
+
return $default;
|
533 |
+
}
|
534 |
+
|
535 |
+
$addon_meta_data = $addon_meta_data[0];
|
536 |
+
|
537 |
+
// make sure its `status`, because we only add this.
|
538 |
+
if ( 'status' !== $addon_meta_data['name'] ) {
|
539 |
+
if ( stripos( $addon_meta_data['name'], 'status-' ) === 0 ) {
|
540 |
+
$meta_data = array();
|
541 |
+
foreach ( $addon_meta_datas as $addon_meta_data ) {
|
542 |
+
// make it like single value so it will be processed like single meta data.
|
543 |
+
$addon_meta_data['name'] = 'status';
|
544 |
+
|
545 |
+
// add it on an array for next recursive process.
|
546 |
+
$meta_data[] = $this->get_from_addon_meta_data( array( $addon_meta_data ), $key, $default );
|
547 |
+
}
|
548 |
+
|
549 |
+
return implode( ', ', $meta_data );
|
550 |
+
}
|
551 |
+
|
552 |
+
return $default;
|
553 |
+
|
554 |
+
}
|
555 |
+
|
556 |
+
if ( ! isset( $addon_meta_data['value'] ) || ! is_array( $addon_meta_data['value'] ) ) {
|
557 |
+
return $default;
|
558 |
+
}
|
559 |
+
$status = $addon_meta_data['value'];
|
560 |
+
if ( isset( $status[ $key ] ) ) {
|
561 |
+
$connection_name = '';
|
562 |
+
if ( 'connection_name' !== $key ) {
|
563 |
+
if ( isset( $status['connection_name'] ) ) {
|
564 |
+
$connection_name = '[' . $status['connection_name'] . '] ';
|
565 |
+
}
|
566 |
+
}
|
567 |
+
|
568 |
+
return $connection_name . $status[ $key ];
|
569 |
+
}
|
570 |
+
|
571 |
+
return $default;
|
572 |
+
}
|
573 |
+
}
|
addons/pro/webhook/class-forminator-addon-webhook-form-settings-exception.php
ADDED
@@ -0,0 +1,68 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/**
|
4 |
+
* Class Forminator_Addon_Webhook_Form_Settings_Exception
|
5 |
+
* Wrapper of Form Settings Webhook Exception
|
6 |
+
*
|
7 |
+
*
|
8 |
+
*/
|
9 |
+
class Forminator_Addon_Webhook_Form_Settings_Exception extends Forminator_Addon_Webhook_Exception {
|
10 |
+
|
11 |
+
/**
|
12 |
+
* Holder of input exceptions
|
13 |
+
*
|
14 |
+
*
|
15 |
+
* @var array
|
16 |
+
*/
|
17 |
+
protected $input_exceptions = array();
|
18 |
+
|
19 |
+
/**
|
20 |
+
* Forminator_Addon_Webhook_Form_Settings_Exception constructor.
|
21 |
+
*
|
22 |
+
* Useful if input_id is needed for later.
|
23 |
+
* If no input_id needed, use @see Forminator_Addon_Webhook_Exception
|
24 |
+
*
|
25 |
+
*
|
26 |
+
*
|
27 |
+
* @param string $message
|
28 |
+
* @param string $input_id
|
29 |
+
*/
|
30 |
+
public function __construct( $message = '', $input_id = '' ) {
|
31 |
+
parent::__construct( $message, 0 );
|
32 |
+
if ( ! empty( $input_id ) ) {
|
33 |
+
$this->add_input_exception( $message, $input_id );
|
34 |
+
}
|
35 |
+
}
|
36 |
+
|
37 |
+
/**
|
38 |
+
* Set exception message for an input
|
39 |
+
*
|
40 |
+
*
|
41 |
+
*
|
42 |
+
* @param $message
|
43 |
+
* @param $input_id
|
44 |
+
*/
|
45 |
+
public function add_input_exception( $message, $input_id ) {
|
46 |
+
$this->input_exceptions[ $input_id ] = $message;
|
47 |
+
}
|
48 |
+
|
49 |
+
/**
|
50 |
+
* Get all input exceptions
|
51 |
+
*
|
52 |
+
*
|
53 |
+
* @return array
|
54 |
+
*/
|
55 |
+
public function get_input_exceptions() {
|
56 |
+
return $this->input_exceptions;
|
57 |
+
}
|
58 |
+
|
59 |
+
/**
|
60 |
+
* Check if there is input_exceptions_is_available
|
61 |
+
*
|
62 |
+
*
|
63 |
+
* @return bool
|
64 |
+
*/
|
65 |
+
public function input_exceptions_is_available() {
|
66 |
+
return count( $this->input_exceptions ) > 0;
|
67 |
+
}
|
68 |
+
}
|
addons/pro/webhook/class-forminator-addon-webhook-form-settings.php
ADDED
@@ -0,0 +1,468 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
require_once dirname( __FILE__ ) . '/class-forminator-addon-webhook-form-settings-exception.php';
|
4 |
+
|
5 |
+
/**
|
6 |
+
* Class Forminator_Addon_Webhook_Form_Settings
|
7 |
+
* Handle how form settings displayed and saved
|
8 |
+
*
|
9 |
+
*
|
10 |
+
*/
|
11 |
+
class Forminator_Addon_Webhook_Form_Settings extends Forminator_Addon_Form_Settings_Abstract {
|
12 |
+
|
13 |
+
/**
|
14 |
+
* @var Forminator_Addon_Webhook
|
15 |
+
*
|
16 |
+
*/
|
17 |
+
protected $addon;
|
18 |
+
|
19 |
+
/**
|
20 |
+
* Forminator_Addon_Webhook_Form_Settings constructor.
|
21 |
+
*
|
22 |
+
*
|
23 |
+
*
|
24 |
+
* @param Forminator_Addon_Abstract $addon
|
25 |
+
* @param $form_id
|
26 |
+
*
|
27 |
+
* @throws Forminator_Addon_Exception
|
28 |
+
*/
|
29 |
+
public function __construct( Forminator_Addon_Abstract $addon, $form_id ) {
|
30 |
+
parent::__construct( $addon, $form_id );
|
31 |
+
|
32 |
+
$this->_update_form_settings_error_message = __(
|
33 |
+
'The update to your settings for this form failed, check the form input and try again.',
|
34 |
+
'forminator'
|
35 |
+
);
|
36 |
+
}
|
37 |
+
|
38 |
+
/**
|
39 |
+
* Webhook Form Settings wizard
|
40 |
+
*
|
41 |
+
*
|
42 |
+
* @return array
|
43 |
+
*/
|
44 |
+
public function form_settings_wizards() {
|
45 |
+
// numerical array steps.
|
46 |
+
return array(
|
47 |
+
// 0
|
48 |
+
array(
|
49 |
+
'callback' => array( $this, 'setup_webhook_url' ),
|
50 |
+
'is_completed' => array( $this, 'setup_webhook_url_is_completed' ),
|
51 |
+
),
|
52 |
+
);
|
53 |
+
}
|
54 |
+
|
55 |
+
/**
|
56 |
+
* Setup webhook url
|
57 |
+
*
|
58 |
+
*
|
59 |
+
*
|
60 |
+
* @param $submitted_data
|
61 |
+
*
|
62 |
+
* @return array
|
63 |
+
*/
|
64 |
+
public function setup_webhook_url( $submitted_data ) {
|
65 |
+
$this->addon_form_settings = $this->get_form_settings_values();
|
66 |
+
|
67 |
+
$multi_id = $this->generate_multi_id();
|
68 |
+
if ( isset( $submitted_data['multi_id'] ) ) {
|
69 |
+
$multi_id = $submitted_data['multi_id'];
|
70 |
+
}
|
71 |
+
|
72 |
+
unset( $submitted_data['multi_id'] );
|
73 |
+
|
74 |
+
$is_submit = ! empty( $submitted_data );
|
75 |
+
|
76 |
+
$current_data = array(
|
77 |
+
'webhook_url' => '',
|
78 |
+
'name' => '',
|
79 |
+
);
|
80 |
+
|
81 |
+
if ( isset( $submitted_data['name'] ) ) {
|
82 |
+
$submitted_data['name'] = sanitize_text_field( $submitted_data['name'] );
|
83 |
+
}
|
84 |
+
forminator_addon_maybe_log( __METHOD__, $submitted_data );
|
85 |
+
|
86 |
+
$notification = array();
|
87 |
+
|
88 |
+
foreach ( $current_data as $key => $value ) {
|
89 |
+
if ( isset( $submitted_data[ $key ] ) ) {
|
90 |
+
$current_data[ $key ] = $submitted_data[ $key ];
|
91 |
+
} elseif ( isset( $this->addon_form_settings[ $multi_id ][ $key ] ) ) {
|
92 |
+
$current_data[ $key ] = $this->addon_form_settings[ $multi_id ][ $key ];
|
93 |
+
}
|
94 |
+
}
|
95 |
+
|
96 |
+
$error_message = '';
|
97 |
+
$input_error_messages = '';
|
98 |
+
|
99 |
+
try {
|
100 |
+
if ( $is_submit ) {
|
101 |
+
$input_exceptions = new Forminator_Addon_Webhook_Form_Settings_Exception();
|
102 |
+
if ( empty( $current_data['name'] ) ) {
|
103 |
+
$input_exceptions->add_input_exception( __( 'Please create a name for this Webhook integration', 'forminator' ), 'name' );
|
104 |
+
}
|
105 |
+
|
106 |
+
$this->validate_and_send_sample( $submitted_data, $input_exceptions );
|
107 |
+
$this->addon_form_settings = array_merge(
|
108 |
+
$this->addon_form_settings,
|
109 |
+
array(
|
110 |
+
$multi_id => array(
|
111 |
+
'webhook_url' => $submitted_data['webhook_url'],
|
112 |
+
'name' => $submitted_data['name'],
|
113 |
+
),
|
114 |
+
)
|
115 |
+
);
|
116 |
+
|
117 |
+
$this->save_form_settings_values( $this->addon_form_settings );
|
118 |
+
$notification = array(
|
119 |
+
'type' => 'success',
|
120 |
+
'text' => '<strong>' . $this->addon->get_title() . ' [' . esc_html( $submitted_data['name'] ) . ']</strong> '
|
121 |
+
. __( 'Successfully connected and sent sample data to your Webhook' ),
|
122 |
+
);
|
123 |
+
}
|
124 |
+
} catch ( Forminator_Addon_Webhook_Form_Settings_Exception $e ) {
|
125 |
+
$input_error_messages = $e->get_input_exceptions();
|
126 |
+
} catch ( Forminator_Addon_Webhook_Exception $e ) {
|
127 |
+
$error_message = '<div role="alert" class="sui-notice sui-notice-red sui-active" style="display: block; text-align: left;" aria-live="assertive">';
|
128 |
+
|
129 |
+
$error_message .= '<div class="sui-notice-content">';
|
130 |
+
|
131 |
+
$error_message .= '<div class="sui-notice-message">';
|
132 |
+
|
133 |
+
$error_message .= '<span class="sui-notice-icon sui-icon-info" aria-hidden="true"></span>';
|
134 |
+
|
135 |
+
$error_message .= '<p>' . $e->getMessage() . '</p>';
|
136 |
+
|
137 |
+
$error_message .= '</div>';
|
138 |
+
|
139 |
+
$error_message .= '</div>';
|
140 |
+
|
141 |
+
$error_message .= '</div>';
|
142 |
+
}
|
143 |
+
|
144 |
+
$buttons = array();
|
145 |
+
if ( $this->setup_webhook_url_is_completed( array( 'multi_id' => $multi_id ) ) ) {
|
146 |
+
$buttons['disconnect']['markup'] = Forminator_Addon_Webhook::get_button_markup(
|
147 |
+
esc_html__( 'Deactivate', 'forminator' ),
|
148 |
+
'sui-button-ghost sui-tooltip sui-tooltip-top-center forminator-addon-form-disconnect',
|
149 |
+
esc_html__( 'Deactivate Webhook from this Form.', 'forminator' )
|
150 |
+
);
|
151 |
+
}
|
152 |
+
|
153 |
+
$buttons['next']['markup'] = '<div class="sui-actions-right">' .
|
154 |
+
Forminator_Addon_Webhook::get_button_markup( esc_html__( 'Save', 'forminator' ), 'sui-button-primary forminator-addon-finish' ) .
|
155 |
+
'</div>';
|
156 |
+
|
157 |
+
$help_message = esc_html__( 'Give your webhook integration a name and add the webhook URL.', 'forminator' );
|
158 |
+
|
159 |
+
return array(
|
160 |
+
'html' => '<div class="forminator-integration-popup__header"><h3 class="sui-box-title sui-lg" id="dialogTitle2">' . __( 'Setup Webhook', 'forminator' ) . '</h3>
|
161 |
+
<p class="sui-description">' . $help_message . '</p>
|
162 |
+
' . $error_message . '</div>
|
163 |
+
<form enctype="multipart/form-data">
|
164 |
+
<div class="sui-form-field ' . ( isset( $input_error_messages['name'] ) ? 'sui-form-field-error' : '' ) . '">
|
165 |
+
<label class="sui-label">' . esc_html__( 'Friendly Name', 'forminator' ) . '</label>
|
166 |
+
<div class="sui-control-with-icon">
|
167 |
+
<input type="text"
|
168 |
+
name="name"
|
169 |
+
placeholder="' . esc_attr__( 'Enter a friendly name E.g. Zapier to Gmail', 'forminator' ) . '"
|
170 |
+
value="' . esc_attr( $current_data['name'] ) . '"
|
171 |
+
class="sui-form-control"
|
172 |
+
/>
|
173 |
+
<i class="sui-icon-web-globe-world" aria-hidden="true"></i>
|
174 |
+
</div>
|
175 |
+
' . ( isset( $input_error_messages['name'] ) ? '<span class="sui-error-message">' . esc_html( $input_error_messages['name'] ) . '</span>' : '' ) . '
|
176 |
+
</div>
|
177 |
+
<div class="sui-form-field ' . ( isset( $input_error_messages['webhook_url'] ) ? 'sui-form-field-error' : '' ) . '">
|
178 |
+
<label class="sui-label">' . esc_html__( 'Webhook URL', 'forminator' ) . '</label>
|
179 |
+
<div class="sui-control-with-icon">
|
180 |
+
<input
|
181 |
+
type="text"
|
182 |
+
name="webhook_url"
|
183 |
+
placeholder="' . esc_attr__( 'Enter your webhook URL', 'forminator' ) . '"
|
184 |
+
value="' . esc_attr( $current_data['webhook_url'] ) . '"
|
185 |
+
class="sui-form-control" />
|
186 |
+
<i class="sui-icon-link" aria-hidden="true"></i>
|
187 |
+
</div>
|
188 |
+
' . ( isset( $input_error_messages['webhook_url'] ) ? '<span class="sui-error-message">' . esc_html( $input_error_messages['webhook_url'] ) . '</span>' : '' ) . '
|
189 |
+
' . ( forminator_is_show_addons_documentation_link() ?
|
190 |
+
'<div class="sui-description">' . sprintf(
|
191 |
+
/* translators: 1: article anchor start, 2: article anchor end. */
|
192 |
+
esc_html__( 'Check %1$sour documentation%2$s for more information on using webhook URLs for your preferred automation tools.', 'forminator' ),
|
193 |
+
'<a href="https://wpmudev.com/blog/zapier-wordpress-form-integrations/" target="_blank">',
|
194 |
+
'</a>'
|
195 |
+
) . '</div>' : '' ) .
|
196 |
+
'</div>
|
197 |
+
<input type="hidden" name="multi_id" value="' . esc_attr( $multi_id ) . '" />
|
198 |
+
</form>',
|
199 |
+
'redirect' => false,
|
200 |
+
'is_close' => ( $is_submit && empty( $error_message ) && empty( $input_error_messages ) ),
|
201 |
+
'buttons' => $buttons,
|
202 |
+
'has_errors' => ( ! empty( $error_message ) || ! empty( $input_error_messages ) ),
|
203 |
+
'notification' => $notification,
|
204 |
+
);
|
205 |
+
|
206 |
+
}
|
207 |
+
|
208 |
+
/**
|
209 |
+
* Sending test sample towebhook URL
|
210 |
+
* Data sent will be used onwebhook to map fields on their zap action
|
211 |
+
*
|
212 |
+
*
|
213 |
+
*
|
214 |
+
* @param $submitted_data
|
215 |
+
* @param Forminator_Addon_Webhook_Form_Settings_Exception $current_input_exception
|
216 |
+
*
|
217 |
+
* @throws Forminator_Addon_Webhook_Form_Settings_Exception
|
218 |
+
* @throws Forminator_Addon_Webhook_Wp_Api_Not_Found_Exception
|
219 |
+
* @throws Forminator_Addon_Webhook_Wp_Api_Exception
|
220 |
+
*/
|
221 |
+
private function validate_and_send_sample( $submitted_data, Forminator_Addon_Webhook_Form_Settings_Exception $current_input_exception ) {
|
222 |
+
$form_id = $this->form_id;
|
223 |
+
if ( ! isset( $submitted_data['webhook_url'] ) ) {
|
224 |
+
$current_input_exception->add_input_exception( __( 'Please put a valid Webhook URL.', 'forminator' ), 'webhook_url' );
|
225 |
+
throw $current_input_exception;
|
226 |
+
}
|
227 |
+
|
228 |
+
// must not be in silent mode.
|
229 |
+
if ( stripos( $submitted_data['webhook_url'], 'silent' ) !== false ) {
|
230 |
+
$current_input_exception->add_input_exception( __( 'Please disable Silent Mode on Webhook URL.', 'forminator' ), 'webhook_url' );
|
231 |
+
throw $current_input_exception;
|
232 |
+
}
|
233 |
+
|
234 |
+
$endpoint = wp_http_validate_url( $submitted_data['webhook_url'] );
|
235 |
+
if ( false === $endpoint ) {
|
236 |
+
$current_input_exception->add_input_exception( __( 'Please put a valid Webhook URL.', 'forminator' ), 'webhook_url' );
|
237 |
+
throw $current_input_exception;
|
238 |
+
}
|
239 |
+
|
240 |
+
if ( $current_input_exception->input_exceptions_is_available() ) {
|
241 |
+
throw $current_input_exception;
|
242 |
+
}
|
243 |
+
|
244 |
+
$connection_settings = $submitted_data;
|
245 |
+
/**
|
246 |
+
* Filter Endpoint Webhook URL to send
|
247 |
+
*
|
248 |
+
* @since 1.1
|
249 |
+
*
|
250 |
+
* @param string $endpoint
|
251 |
+
* @param int $form_id current Form ID.
|
252 |
+
* @param array $connection_settings Submitted data by user, it contains `name` and `webhook_url`.
|
253 |
+
*/
|
254 |
+
$endpoint = apply_filters_deprecated(
|
255 |
+
'forminator_addon_zapier_endpoint',
|
256 |
+
array( $endpoint, $form_id, $connection_settings ),
|
257 |
+
'1.18.0',
|
258 |
+
'forminator_addon_webhook_endpoint'
|
259 |
+
);
|
260 |
+
$endpoint = apply_filters(
|
261 |
+
'forminator_addon_webhook_endpoint',
|
262 |
+
$endpoint,
|
263 |
+
$form_id,
|
264 |
+
$connection_settings
|
265 |
+
);
|
266 |
+
|
267 |
+
forminator_addon_maybe_log( __METHOD__, $endpoint );
|
268 |
+
$api = $this->addon->get_api( $endpoint );
|
269 |
+
|
270 |
+
// build form sample data.
|
271 |
+
$sample_data = $this->build_form_sample_data();
|
272 |
+
$sample_data = self::replace_dashes_in_keys( $sample_data, $endpoint );
|
273 |
+
$sample_data['is_test'] = true;
|
274 |
+
|
275 |
+
/**
|
276 |
+
* Filter sample data to send to Webhook URL
|
277 |
+
*
|
278 |
+
* It fires when user saved Webhook connection on Form Settings Page.
|
279 |
+
* Sample data contains `is_test` key with value `true`,
|
280 |
+
* this key indicating that it wont process trigger on Webhook.
|
281 |
+
*
|
282 |
+
* @since 1.1
|
283 |
+
*
|
284 |
+
* @param array $sample_data
|
285 |
+
* @param int $form_id current Form ID.
|
286 |
+
* @param array $submitted_data Submitted data by user, it contains `name` and `webhook_url`.
|
287 |
+
*/
|
288 |
+
$sample_data = apply_filters_deprecated(
|
289 |
+
'forminator_addon_zapier_sample_data',
|
290 |
+
array( $sample_data, $form_id, $submitted_data ),
|
291 |
+
'1.18.0',
|
292 |
+
'forminator_addon_webhook_sample_data'
|
293 |
+
);
|
294 |
+
$sample_data = apply_filters(
|
295 |
+
'forminator_addon_webhook_sample_data',
|
296 |
+
$sample_data,
|
297 |
+
$form_id,
|
298 |
+
$submitted_data
|
299 |
+
);
|
300 |
+
|
301 |
+
$api->post_( $sample_data );
|
302 |
+
}
|
303 |
+
|
304 |
+
/**
|
305 |
+
* Build seample data form current fields
|
306 |
+
*
|
307 |
+
*
|
308 |
+
*
|
309 |
+
* @return array
|
310 |
+
*/
|
311 |
+
private function build_form_sample_data() {
|
312 |
+
$form_fields = $this->form_fields;
|
313 |
+
|
314 |
+
$sample_data = array();
|
315 |
+
foreach ( $form_fields as $form_field ) {
|
316 |
+
$sample_data[ $form_field['element_id'] ] = $form_field['field_label'];
|
317 |
+
|
318 |
+
if ( 'upload' === $form_field['type'] ) {
|
319 |
+
|
320 |
+
$sample_file_path = '/fake/path';
|
321 |
+
$upload_dir = wp_get_upload_dir();
|
322 |
+
if ( isset( $upload_dir['basedir'] ) ) {
|
323 |
+
$sample_file_path = $upload_dir['basedir'];
|
324 |
+
}
|
325 |
+
|
326 |
+
$sample_data[ $form_field['element_id'] ] = array(
|
327 |
+
'name' => $form_field['field_label'],
|
328 |
+
'type' => 'image/png',
|
329 |
+
'size' => 0,
|
330 |
+
'file_url' => get_home_url(),
|
331 |
+
'file_path' => $sample_file_path,
|
332 |
+
);
|
333 |
+
}
|
334 |
+
}
|
335 |
+
|
336 |
+
//send form title, date
|
337 |
+
$sample_data['form-title'] = $this->form_settings['formName'];
|
338 |
+
$sample_data['entry-time'] = current_time( 'Y-m-d H:i:s' );
|
339 |
+
|
340 |
+
return $sample_data;
|
341 |
+
}
|
342 |
+
|
343 |
+
/**
|
344 |
+
* Check if setup webhook url is completed
|
345 |
+
*
|
346 |
+
*
|
347 |
+
*
|
348 |
+
* @param $submitted_data
|
349 |
+
*
|
350 |
+
* @return bool
|
351 |
+
*/
|
352 |
+
public function setup_webhook_url_is_completed( $submitted_data ) {
|
353 |
+
|
354 |
+
$multi_id = '';
|
355 |
+
if ( isset( $submitted_data['multi_id'] ) ) {
|
356 |
+
$multi_id = $submitted_data['multi_id'];
|
357 |
+
}
|
358 |
+
|
359 |
+
if ( empty( $multi_id ) ) {
|
360 |
+
return false;
|
361 |
+
}
|
362 |
+
|
363 |
+
$name = $this->get_multi_id_form_settings_value( $multi_id, 'name', '' );
|
364 |
+
$name = trim( $name );
|
365 |
+
if ( empty( $name ) ) {
|
366 |
+
return false;
|
367 |
+
}
|
368 |
+
$webhook_url = $this->get_multi_id_form_settings_value( $multi_id, 'webhook_url', '' );
|
369 |
+
$webhook_url = trim( $webhook_url );
|
370 |
+
if ( empty( $webhook_url ) ) {
|
371 |
+
return false;
|
372 |
+
}
|
373 |
+
|
374 |
+
return true;
|
375 |
+
}
|
376 |
+
|
377 |
+
/**
|
378 |
+
* Find one active connection on current form
|
379 |
+
*
|
380 |
+
*
|
381 |
+
*
|
382 |
+
* @return bool|array false on no connection, or settings on available
|
383 |
+
*/
|
384 |
+
public function find_one_active_connection() {
|
385 |
+
$addon_form_settings = $this->get_form_settings_values();
|
386 |
+
|
387 |
+
// backward compat old version.
|
388 |
+
if ( isset( $addon_form_settings['webhook_url'] ) ) {
|
389 |
+
// convert to multi id type.
|
390 |
+
$new_id = $this->generate_multi_id();
|
391 |
+
$addon_form_settings['name'] = $new_id;
|
392 |
+
$this->save_form_settings_values( array( $new_id => $addon_form_settings ) );
|
393 |
+
|
394 |
+
return $this->find_one_active_connection();
|
395 |
+
}
|
396 |
+
|
397 |
+
foreach ( $addon_form_settings as $multi_id => $addon_form_setting ) {
|
398 |
+
if ( true === $this->setup_webhook_url_is_completed( array( 'multi_id' => $multi_id ) ) ) {
|
399 |
+
return $addon_form_setting;
|
400 |
+
}
|
401 |
+
}
|
402 |
+
|
403 |
+
return false;
|
404 |
+
}
|
405 |
+
|
406 |
+
/**
|
407 |
+
* Generate multi id for multiple connection
|
408 |
+
*
|
409 |
+
*
|
410 |
+
* @since 1.2 change method to non static
|
411 |
+
* @return string
|
412 |
+
*/
|
413 |
+
public function generate_multi_id() {
|
414 |
+
return uniqid( 'webhook_', true );
|
415 |
+
}
|
416 |
+
|
417 |
+
|
418 |
+
/**
|
419 |
+
* Override how multi connection displayed
|
420 |
+
*
|
421 |
+
*
|
422 |
+
* @return array
|
423 |
+
*/
|
424 |
+
public function get_multi_ids() {
|
425 |
+
$multi_ids = array();
|
426 |
+
foreach ( $this->get_form_settings_values() as $key => $value ) {
|
427 |
+
$multi_ids[] = array(
|
428 |
+
'id' => $key,
|
429 |
+
// use name that was added by user on creating connection.
|
430 |
+
'label' => isset( $value['name'] ) ? $value['name'] : $key,
|
431 |
+
);
|
432 |
+
}
|
433 |
+
|
434 |
+
return $multi_ids;
|
435 |
+
}
|
436 |
+
|
437 |
+
/**
|
438 |
+
* Disconnect a connection from current form
|
439 |
+
*
|
440 |
+
*
|
441 |
+
*
|
442 |
+
* @param array $submitted_data
|
443 |
+
*/
|
444 |
+
public function disconnect_form( $submitted_data ) {
|
445 |
+
// only execute if multi_id provided on submitted data.
|
446 |
+
if ( isset( $submitted_data['multi_id'] ) && ! empty( $submitted_data['multi_id'] ) ) {
|
447 |
+
$addon_form_settings = $this->get_form_settings_values();
|
448 |
+
unset( $addon_form_settings[ $submitted_data['multi_id'] ] );
|
449 |
+
$this->save_form_settings_values( $addon_form_settings );
|
450 |
+
}
|
451 |
+
}
|
452 |
+
|
453 |
+
/**
|
454 |
+
* Check if multi_id form settings values completed
|
455 |
+
*
|
456 |
+
* @param int $multi_id ID.
|
457 |
+
* @return bool
|
458 |
+
*/
|
459 |
+
public function is_multi_form_settings_complete( $multi_id ) {
|
460 |
+
$data = array( 'multi_id' => $multi_id );
|
461 |
+
|
462 |
+
if ( ! $this->setup_webhook_url_is_completed( $data ) ) {
|
463 |
+
return false;
|
464 |
+
}
|
465 |
+
|
466 |
+
return true;
|
467 |
+
}
|
468 |
+
}
|
addons/pro/webhook/class-forminator-addon-webhook-poll-hooks.php
ADDED
@@ -0,0 +1,411 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/**
|
4 |
+
* Class Forminator_Addon_Webhook_Poll_Hooks
|
5 |
+
*
|
6 |
+
* @since 1.6.1
|
7 |
+
*
|
8 |
+
*/
|
9 |
+
class Forminator_Addon_Webhook_Poll_Hooks extends Forminator_Addon_Poll_Hooks_Abstract {
|
10 |
+
|
11 |
+
/**
|
12 |
+
* Addon instance are auto available form abstract
|
13 |
+
* Its added here for development purpose,
|
14 |
+
* Auto-complete will resolve addon directly to `Webhook` instance instead of the abstract
|
15 |
+
* And its public properties can be exposed
|
16 |
+
*
|
17 |
+
* @since 1.6.1
|
18 |
+
* @var Forminator_Addon_Webhook
|
19 |
+
*/
|
20 |
+
protected $addon;
|
21 |
+
|
22 |
+
/**
|
23 |
+
* Poll Settings Instance
|
24 |
+
*
|
25 |
+
* @since 1.6.1
|
26 |
+
* @var Forminator_Addon_Webhook_Poll_Settings | null
|
27 |
+
*/
|
28 |
+
protected $poll_settings_instance;
|
29 |
+
|
30 |
+
/**
|
31 |
+
* Forminator_Addon_Webhook_Poll_Hooks constructor.
|
32 |
+
*
|
33 |
+
* @since 1.6.1
|
34 |
+
*
|
35 |
+
* @param Forminator_Addon_Abstract $addon
|
36 |
+
* @param $poll_id
|
37 |
+
*
|
38 |
+
* @throws Forminator_Addon_Exception
|
39 |
+
*/
|
40 |
+
public function __construct( Forminator_Addon_Abstract $addon, $poll_id ) {
|
41 |
+
parent::__construct( $addon, $poll_id );
|
42 |
+
$this->_submit_poll_error_message = __( 'Webhook failed to process submitted data. Please check your form and try again', 'forminator' );
|
43 |
+
}
|
44 |
+
|
45 |
+
/**
|
46 |
+
* Save status of request sent and received for each connected zap(s)
|
47 |
+
*
|
48 |
+
* @since 1.6.1
|
49 |
+
*
|
50 |
+
* @param array $submitted_data
|
51 |
+
* @param array $current_entry_fields
|
52 |
+
*
|
53 |
+
* @return array
|
54 |
+
*/
|
55 |
+
public function add_entry_fields( $submitted_data, $current_entry_fields = array() ) {
|
56 |
+
|
57 |
+
$poll_id = $this->poll_id;
|
58 |
+
$poll_settings_instance = $this->poll_settings_instance;
|
59 |
+
|
60 |
+
/**
|
61 |
+
* Filterwebhook submitted form data to be processed
|
62 |
+
*
|
63 |
+
* @since 1.6.1
|
64 |
+
*
|
65 |
+
* @param array $submitted_data
|
66 |
+
* @param int $poll_id current Form ID.
|
67 |
+
* @param Forminator_Addon_Webhook_Form_Settings $poll_settings_instance Webhook Addon Form Settings instance.
|
68 |
+
*/
|
69 |
+
$submitted_data = apply_filters_deprecated(
|
70 |
+
'forminator_addon_zapier_poll_submitted_data',
|
71 |
+
array( $submitted_data, $poll_id, $poll_settings_instance ),
|
72 |
+
'1.18.0',
|
73 |
+
'forminator_addon_webhook_poll_submitted_data'
|
74 |
+
);
|
75 |
+
$submitted_data = apply_filters(
|
76 |
+
'forminator_addon_webhook_poll_submitted_data',
|
77 |
+
$submitted_data,
|
78 |
+
$poll_id,
|
79 |
+
$poll_settings_instance
|
80 |
+
);
|
81 |
+
|
82 |
+
forminator_addon_maybe_log( __METHOD__, $submitted_data );
|
83 |
+
|
84 |
+
$addon_setting_values = $poll_settings_instance->get_poll_settings_values();
|
85 |
+
$poll_settings = $poll_settings_instance->get_poll_settings();
|
86 |
+
|
87 |
+
$data = array();
|
88 |
+
|
89 |
+
/**
|
90 |
+
* Fires before sending data to Webhook URL(s)
|
91 |
+
*
|
92 |
+
* @since 1.6.1
|
93 |
+
*
|
94 |
+
* @param int $poll_id current Poll ID.
|
95 |
+
* @param array $submitted_data
|
96 |
+
* @param Forminator_Addon_Webhook_Poll_Settings $poll_settings_instance Webhook Addon Poll Settings instance.
|
97 |
+
*/
|
98 |
+
do_action_deprecated( 'forminator_addon_zapier_poll_before_post_to_webhook', array( $poll_id, $submitted_data, $poll_settings_instance ), '1.18.0', 'forminator_addon_webhook_poll_before_post_to_webhook' );
|
99 |
+
do_action( 'forminator_addon_webhook_poll_before_post_to_webhook', $poll_id, $submitted_data, $poll_settings_instance );
|
100 |
+
|
101 |
+
foreach ( $addon_setting_values as $key => $addon_setting_value ) {
|
102 |
+
// save it on entry field, with name `status-$MULTI_ID`, and value is the return result on sending data towebhook.
|
103 |
+
$data[] = array(
|
104 |
+
'name' => 'status-' . $key,
|
105 |
+
'value' => $this->get_status_on_send_data( $key, $submitted_data, $addon_setting_value, $poll_settings ),
|
106 |
+
);
|
107 |
+
}
|
108 |
+
|
109 |
+
$entry_fields = $data;
|
110 |
+
/**
|
111 |
+
* Filterwebhook entry fields to be saved to entry model
|
112 |
+
*
|
113 |
+
* @since 1.6.1
|
114 |
+
*
|
115 |
+
* @param array $entry_fields
|
116 |
+
* @param int $poll_id current Poll ID.
|
117 |
+
* @param array $submitted_data
|
118 |
+
* @param Forminator_Addon_Webhook_Poll_Settings $poll_settings_instance Webhook Poll Settings instance.
|
119 |
+
*/
|
120 |
+
$data = apply_filters_deprecated(
|
121 |
+
'forminator_addon_zapier_poll_entry_fields',
|
122 |
+
array( $entry_fields, $poll_id, $submitted_data, $poll_settings_instance ),
|
123 |
+
'1.18.0',
|
124 |
+
'forminator_addon_webhook_poll_entry_fields'
|
125 |
+
);
|
126 |
+
$data = apply_filters(
|
127 |
+
'forminator_addon_webhook_poll_entry_fields',
|
128 |
+
$data,
|
129 |
+
$poll_id,
|
130 |
+
$submitted_data,
|
131 |
+
$poll_settings_instance
|
132 |
+
);
|
133 |
+
|
134 |
+
return $data;
|
135 |
+
|
136 |
+
}
|
137 |
+
|
138 |
+
/**
|
139 |
+
* Get status on sending data towebhook
|
140 |
+
*
|
141 |
+
* @since 1.6.1
|
142 |
+
*
|
143 |
+
* @param $connection_id
|
144 |
+
* @param $submitted_data
|
145 |
+
* @param $connection_settings
|
146 |
+
* @param $poll_settings
|
147 |
+
*
|
148 |
+
* @return array `is_sent` true means its success send data towebhook, false otherwise
|
149 |
+
*/
|
150 |
+
private function get_status_on_send_data( $connection_id, $submitted_data, $connection_settings, $poll_settings ) {
|
151 |
+
// initialize as null.
|
152 |
+
$webhook_api = null;
|
153 |
+
|
154 |
+
$poll_id = $this->poll_id;
|
155 |
+
$poll_settings_instance = $this->poll_settings_instance;
|
156 |
+
|
157 |
+
//check required fields
|
158 |
+
try {
|
159 |
+
if ( ! isset( $connection_settings['webhook_url'] ) ) {
|
160 |
+
throw new Forminator_Addon_Webhook_Exception( __( 'Webhook URL is not properly setup', 'forminator' ) );
|
161 |
+
}
|
162 |
+
|
163 |
+
$endpoint = $connection_settings['webhook_url'];
|
164 |
+
/**
|
165 |
+
* Filter Endpoint Webhook URL to send
|
166 |
+
*
|
167 |
+
* @since 1.6.1
|
168 |
+
*
|
169 |
+
* @param string $endpoint
|
170 |
+
* @param int $poll_id current Form ID.
|
171 |
+
* @param array $connection_settings current connection setting, it contains `name` and `webhook_url`.
|
172 |
+
*/
|
173 |
+
$endpoint = apply_filters_deprecated(
|
174 |
+
'forminator_addon_zapier_poll_endpoint',
|
175 |
+
array( $endpoint, $poll_id, $connection_settings ),
|
176 |
+
'1.18.0',
|
177 |
+
'forminator_addon_webhook_poll_endpoint'
|
178 |
+
);
|
179 |
+
$endpoint = apply_filters(
|
180 |
+
'forminator_addon_webhook_poll_endpoint',
|
181 |
+
$endpoint,
|
182 |
+
$poll_id,
|
183 |
+
$connection_settings
|
184 |
+
);
|
185 |
+
|
186 |
+
$webhook_api = $this->addon->get_api( $endpoint );
|
187 |
+
|
188 |
+
$args = array();
|
189 |
+
$args['poll-name'] = forminator_get_name_from_model( $this->poll );
|
190 |
+
|
191 |
+
$answer_data = isset( $submitted_data[ $this->poll_id ] ) ? $submitted_data[ $this->poll_id ] : '';
|
192 |
+
$extra_field = isset( $submitted_data[ $this->poll_id . '-extra' ] ) ? $submitted_data[ $this->poll_id . '-extra' ] : '';
|
193 |
+
$fields_labels = $this->poll->pluck_fields_array( 'title', 'element_id', '1' );
|
194 |
+
|
195 |
+
$answer = isset( $fields_labels[ $answer_data ] ) ? $fields_labels[ $answer_data ] : $answer_data;
|
196 |
+
$extra = $extra_field;
|
197 |
+
|
198 |
+
$args['vote'] = $answer;
|
199 |
+
$args['vote-extra'] = $extra;
|
200 |
+
$args['results'] = array();
|
201 |
+
|
202 |
+
$fields_array = $this->poll->get_fields_as_array();
|
203 |
+
$map_entries = Forminator_Form_Entry_Model::map_polls_entries( $this->poll_id, $fields_array );
|
204 |
+
|
205 |
+
// append new answer.
|
206 |
+
if ( ! $this->poll->is_prevent_store() ) {
|
207 |
+
$answer_data = isset( $submitted_data[ $this->poll_id ] ) ? $submitted_data[ $this->poll_id ] : '';
|
208 |
+
|
209 |
+
$entries = 0;
|
210 |
+
// exists on map entries.
|
211 |
+
if ( in_array( $answer_data, array_keys( $map_entries ), true ) ) {
|
212 |
+
$entries = $map_entries[ $answer_data ];
|
213 |
+
}
|
214 |
+
|
215 |
+
$entries ++;
|
216 |
+
$map_entries[ $answer_data ] = $entries;
|
217 |
+
|
218 |
+
}
|
219 |
+
|
220 |
+
$fields = $this->poll->get_fields();
|
221 |
+
|
222 |
+
if ( ! is_null( $fields ) ) {
|
223 |
+
foreach ( $fields as $field ) {
|
224 |
+
$label = addslashes( $field->title );
|
225 |
+
|
226 |
+
$slug = isset( $field->slug ) ? $field->slug : sanitize_title( $label );
|
227 |
+
$entries = 0;
|
228 |
+
if ( in_array( $slug, array_keys( $map_entries ), true ) ) {
|
229 |
+
$entries = $map_entries[ $slug ];
|
230 |
+
}
|
231 |
+
$args['results'][ $slug ] = array(
|
232 |
+
'label' => $label,
|
233 |
+
'votes' => $entries,
|
234 |
+
);
|
235 |
+
}
|
236 |
+
}
|
237 |
+
|
238 |
+
/**
|
239 |
+
* Filter arguments to passed on to Webhook API
|
240 |
+
*
|
241 |
+
* @since 1.6.1
|
242 |
+
*
|
243 |
+
* @param array $args
|
244 |
+
* @param int $poll_id Current Poll id.
|
245 |
+
* @param string $connection_id ID of current connection.
|
246 |
+
* @param array $submitted_data
|
247 |
+
* @param array $connection_settings current connection setting, contains `name` and `webhook_url`.
|
248 |
+
* @param array $poll_settings Displayed Poll settings.
|
249 |
+
* @param Forminator_Addon_Webhook_Poll_Settings $poll_settings_instance Webhook Poll Settings instance.
|
250 |
+
*/
|
251 |
+
$args = apply_filters_deprecated(
|
252 |
+
'forminator_addon_zapier_poll_post_to_webhook_args',
|
253 |
+
array( $args, $poll_id, $connection_id, $submitted_data, $connection_settings, $poll_settings, $poll_settings_instance ),
|
254 |
+
'1.18.0',
|
255 |
+
'forminator_addon_webhook_poll_post_to_webhook_args'
|
256 |
+
);
|
257 |
+
$args = apply_filters(
|
258 |
+
'forminator_addon_webhook_poll_post_to_webhook_args',
|
259 |
+
$args,
|
260 |
+
$poll_id,
|
261 |
+
$connection_id,
|
262 |
+
$submitted_data,
|
263 |
+
$connection_settings,
|
264 |
+
$poll_settings,
|
265 |
+
$poll_settings_instance
|
266 |
+
);
|
267 |
+
|
268 |
+
// replace '-' to '_' in keys because some integrations don't support dashes like tray.io and workato.
|
269 |
+
// don't do it for zapier for backward compatibility.
|
270 |
+
$args = $poll_settings_instance::replace_dashes_in_keys( $args, $endpoint );
|
271 |
+
|
272 |
+
$webhook_api->post_( $args );
|
273 |
+
|
274 |
+
forminator_addon_maybe_log( __METHOD__, 'Success Send Data' );
|
275 |
+
|
276 |
+
return array(
|
277 |
+
'is_sent' => true,
|
278 |
+
'connection_name' => $connection_settings['name'],
|
279 |
+
'description' => __( 'Successfully send data to Webhook', 'forminator' ),
|
280 |
+
'data_sent' => $webhook_api->get_last_data_sent(),
|
281 |
+
'data_received' => $webhook_api->get_last_data_received(),
|
282 |
+
'url_request' => $webhook_api->get_last_url_request(),
|
283 |
+
);
|
284 |
+
|
285 |
+
} catch ( Forminator_Addon_Webhook_Exception $e ) {
|
286 |
+
forminator_addon_maybe_log( __METHOD__, 'Failed to Send to Webhook' );
|
287 |
+
|
288 |
+
return array(
|
289 |
+
'is_sent' => false,
|
290 |
+
'description' => $e->getMessage(),
|
291 |
+
'connection_name' => $connection_settings['name'],
|
292 |
+
'data_sent' => ( ( $webhook_api instanceof Forminator_Addon_Webhook_Wp_Api ) ? $webhook_api->get_last_data_sent() : array() ),
|
293 |
+
'data_received' => ( ( $webhook_api instanceof Forminator_Addon_Webhook_Wp_Api ) ? $webhook_api->get_last_data_received() : array() ),
|
294 |
+
'url_request' => ( ( $webhook_api instanceof Forminator_Addon_Webhook_Wp_Api ) ? $webhook_api->get_last_url_request() : '' ),
|
295 |
+
);
|
296 |
+
}
|
297 |
+
}
|
298 |
+
|
299 |
+
/**
|
300 |
+
* Webhook will add a column on the title/header row
|
301 |
+
* its called `Webhook Info` which can be translated on forminator lang
|
302 |
+
*
|
303 |
+
* @since 1.6.1
|
304 |
+
* @return array
|
305 |
+
*/
|
306 |
+
public function on_export_render_title_row() {
|
307 |
+
|
308 |
+
$export_headers = array(
|
309 |
+
'info' => __( 'Webhook Info', 'forminator' ),
|
310 |
+
);
|
311 |
+
|
312 |
+
$poll_id = $this->poll_id;
|
313 |
+
$poll_settings_instance = $this->poll_settings_instance;
|
314 |
+
|
315 |
+
/**
|
316 |
+
* Filterwebhook headers on export file
|
317 |
+
*
|
318 |
+
* @since 1.6.1
|
319 |
+
*
|
320 |
+
* @param array $export_headers headers to be displayed on export file.
|
321 |
+
* @param int $poll_id current Form ID.
|
322 |
+
* @param Forminator_Addon_Webhook_Poll_Settings $poll_settings_instance Webhook Poll Settings instance.
|
323 |
+
*/
|
324 |
+
$export_headers = apply_filters_deprecated(
|
325 |
+
'forminator_addon_zapier_poll_export_headers',
|
326 |
+
array( $export_headers, $poll_id, $poll_settings_instance ),
|
327 |
+
'1.18.0',
|
328 |
+
'forminator_addon_webhook_poll_export_headers'
|
329 |
+
);
|
330 |
+
$export_headers = apply_filters(
|
331 |
+
'forminator_addon_webhook_poll_export_headers',
|
332 |
+
$export_headers,
|
333 |
+
$poll_id,
|
334 |
+
$poll_settings_instance
|
335 |
+
);
|
336 |
+
|
337 |
+
return $export_headers;
|
338 |
+
}
|
339 |
+
|
340 |
+
/**
|
341 |
+
* Webhook will add a column that give user information whether sending data towebhook successfully or not
|
342 |
+
* It will only add one column even its multiple connection, every connection will be separated by comma
|
343 |
+
*
|
344 |
+
* @since 1.6.1
|
345 |
+
*
|
346 |
+
* @param Forminator_Form_Entry_Model $entry_model
|
347 |
+
* @param $addon_meta_data
|
348 |
+
*
|
349 |
+
* @return array
|
350 |
+
*/
|
351 |
+
public function on_export_render_entry( Forminator_Form_Entry_Model $entry_model, $addon_meta_data ) {
|
352 |
+
|
353 |
+
$poll_id = $this->poll_id;
|
354 |
+
$poll_settings_instance = $this->poll_settings_instance;
|
355 |
+
|
356 |
+
/**
|
357 |
+
*
|
358 |
+
* Filterwebhook metadata that previously saved on db to be processed
|
359 |
+
*
|
360 |
+
* @since 1.1
|
361 |
+
*
|
362 |
+
* @param array $addon_meta_data
|
363 |
+
* @param int $poll_id current Poll ID.
|
364 |
+
* @param Forminator_Addon_Webhook_Poll_Settings $poll_settings_instance Webhook Poll Settings instance.
|
365 |
+
*/
|
366 |
+
$addon_meta_data = apply_filters_deprecated(
|
367 |
+
'forminator_addon_zapier_poll_metadata',
|
368 |
+
array( $addon_meta_data, $poll_id, $poll_settings_instance ),
|
369 |
+
'1.18.0',
|
370 |
+
'forminator_addon_webhook_poll_metadata'
|
371 |
+
);
|
372 |
+
$addon_meta_data = apply_filters(
|
373 |
+
'forminator_addon_webhook_poll_metadata',
|
374 |
+
$addon_meta_data,
|
375 |
+
$poll_id,
|
376 |
+
$poll_settings_instance
|
377 |
+
);
|
378 |
+
|
379 |
+
$export_columns = array(
|
380 |
+
'info' => $this->get_from_addon_meta_data( $addon_meta_data, 'description', '' ),
|
381 |
+
);
|
382 |
+
|
383 |
+
/**
|
384 |
+
* Filterwebhook columns to be displayed on export submissions
|
385 |
+
*
|
386 |
+
* @since 1.6.1
|
387 |
+
*
|
388 |
+
* @param array $export_columns column to be exported.
|
389 |
+
* @param int $poll_id current Poll ID.
|
390 |
+
* @param Forminator_Form_Entry_Model $entry_model Form Entry Model.
|
391 |
+
* @param array $addon_meta_data meta data saved by addon on entry fields.
|
392 |
+
* @param Forminator_Addon_Webhook_Poll_Settings $poll_settings_instance Webhook Poll Settings instance.
|
393 |
+
*/
|
394 |
+
$export_columns = apply_filters_deprecated(
|
395 |
+
'forminator_addon_zapier_poll_export_columns',
|
396 |
+
array( $export_columns, $poll_id, $entry_model, $addon_meta_data, $poll_settings_instance ),
|
397 |
+
'1.18.0',
|
398 |
+
'forminator_addon_webhook_poll_export_columns'
|
399 |
+
);
|
400 |
+
$export_columns = apply_filters(
|
401 |
+
'forminator_addon_webhook_poll_export_columns',
|
402 |
+
$export_columns,
|
403 |
+
$poll_id,
|
404 |
+
$entry_model,
|
405 |
+
$addon_meta_data,
|
406 |
+
$poll_settings_instance
|
407 |
+
);
|
408 |
+
|
409 |
+
return $export_columns;
|
410 |
+
}
|
411 |
+
}
|
addons/pro/webhook/class-forminator-addon-webhook-poll-settings-exception.php
ADDED
@@ -0,0 +1,68 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/**
|
4 |
+
* Class Forminator_Addon_Webhook_Poll_Settings_Exception
|
5 |
+
* Wrapper of Poll Settings Webhook Exception
|
6 |
+
*
|
7 |
+
* @since 1.6.1
|
8 |
+
*/
|
9 |
+
class Forminator_Addon_Webhook_Poll_Settings_Exception extends Forminator_Addon_Webhook_Exception {
|
10 |
+
|
11 |
+
/**
|
12 |
+
* Holder of input exceptions
|
13 |
+
*
|
14 |
+
* @since 1.6.1
|
15 |
+
* @var array
|
16 |
+
*/
|
17 |
+
protected $input_exceptions = array();
|
18 |
+
|
19 |
+
/**
|
20 |
+
* Forminator_Addon_Webhook_Poll_Settings_Exception constructor.
|
21 |
+
*
|
22 |
+
* Useful if input_id is needed for later.
|
23 |
+
* If no input_id needed, use @see Forminator_Addon_Webhook_Exception
|
24 |
+
*
|
25 |
+
* @since 1.6.1
|
26 |
+
*
|
27 |
+
* @param string $message
|
28 |
+
* @param string $input_id
|
29 |
+
*/
|
30 |
+
public function __construct( $message = '', $input_id = '' ) {
|
31 |
+
parent::__construct( $message, 0 );
|
32 |
+
if ( ! empty( $input_id ) ) {
|
33 |
+
$this->add_input_exception( $message, $input_id );
|
34 |
+
}
|
35 |
+
}
|
36 |
+
|
37 |
+
/**
|
38 |
+
* Set exception message for an input
|
39 |
+
*
|
40 |
+
* @since 1.6.1
|
41 |
+
*
|
42 |
+
* @param $message
|
43 |
+
* @param $input_id
|
44 |
+
*/
|
45 |
+
public function add_input_exception( $message, $input_id ) {
|
46 |
+
$this->input_exceptions[ $input_id ] = $message;
|
47 |
+
}
|
48 |
+
|
49 |
+
/**
|
50 |
+
* Get all input exceptions
|
51 |
+
*
|
52 |
+
* @since 1.6.1
|
53 |
+
* @return array
|
54 |
+
*/
|
55 |
+
public function get_input_exceptions() {
|
56 |
+
return $this->input_exceptions;
|
57 |
+
}
|
58 |
+
|
59 |
+
/**
|
60 |
+
* Check if there is input_exceptions_is_available
|
61 |
+
*
|
62 |
+
* @since 1.6.1
|
63 |
+
* @return bool
|
64 |
+
*/
|
65 |
+
public function input_exceptions_is_available() {
|
66 |
+
return count( $this->input_exceptions ) > 0;
|
67 |
+
}
|
68 |
+
}
|
addons/pro/webhook/class-forminator-addon-webhook-poll-settings.php
ADDED
@@ -0,0 +1,386 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
require_once dirname( __FILE__ ) . '/class-forminator-addon-webhook-poll-settings-exception.php';
|
4 |
+
|
5 |
+
/**
|
6 |
+
* Class Forminator_Addon_Webhook_Poll_Settings
|
7 |
+
* Handle how poll settings displayed and saved
|
8 |
+
*
|
9 |
+
* @since 1.6.1
|
10 |
+
*/
|
11 |
+
class Forminator_Addon_Webhook_Poll_Settings extends Forminator_Addon_Poll_Settings_Abstract {
|
12 |
+
|
13 |
+
/**
|
14 |
+
* @var Forminator_Addon_Webhook
|
15 |
+
*
|
16 |
+
*/
|
17 |
+
protected $addon;
|
18 |
+
|
19 |
+
/**
|
20 |
+
* Forminator_Addon_Webhook_Form_Settings constructor.
|
21 |
+
*
|
22 |
+
*
|
23 |
+
*
|
24 |
+
* @param Forminator_Addon_Abstract $addon
|
25 |
+
* @param $form_id
|
26 |
+
*
|
27 |
+
* @throws Forminator_Addon_Exception
|
28 |
+
*/
|
29 |
+
public function __construct( Forminator_Addon_Abstract $addon, $form_id ) {
|
30 |
+
parent::__construct( $addon, $form_id );
|
31 |
+
|
32 |
+
$this->_update_poll_settings_error_message = __(
|
33 |
+
'The update to your settings for this poll failed, check the form input and try again.',
|
34 |
+
'forminator'
|
35 |
+
);
|
36 |
+
}
|
37 |
+
|
38 |
+
/**
|
39 |
+
* Webhook Poll Settings wizard
|
40 |
+
*
|
41 |
+
* @since 1.6.1
|
42 |
+
* @return array
|
43 |
+
*/
|
44 |
+
public function poll_settings_wizards() {
|
45 |
+
// numerical array steps.
|
46 |
+
return array(
|
47 |
+
// 0
|
48 |
+
array(
|
49 |
+
'callback' => array( $this, 'setup_webhook_url' ),
|
50 |
+
'is_completed' => array( $this, 'setup_webhook_url_is_completed' ),
|
51 |
+
),
|
52 |
+
);
|
53 |
+
}
|
54 |
+
|
55 |
+
/**
|
56 |
+
* Setup webhook url
|
57 |
+
*
|
58 |
+
*
|
59 |
+
*
|
60 |
+
* @param $submitted_data
|
61 |
+
*
|
62 |
+
* @return array
|
63 |
+
*/
|
64 |
+
public function setup_webhook_url( $submitted_data ) {
|
65 |
+
|
66 |
+
$template = forminator_addon_webhook_dir() . 'views/poll-settings/setup-webhook.php';
|
67 |
+
|
68 |
+
if ( ! isset( $submitted_data['multi_id'] ) ) {
|
69 |
+
return $this->get_force_closed_wizard( __( 'Please pick valid connection', 'forminator' ) );
|
70 |
+
}
|
71 |
+
|
72 |
+
$multi_id = $submitted_data['multi_id'];
|
73 |
+
unset( $submitted_data['multi_id'] );
|
74 |
+
|
75 |
+
$template_params = array(
|
76 |
+
'name' => $this->get_multi_id_poll_settings_value( $multi_id, 'name', '' ),
|
77 |
+
'webhook_url' => $this->get_multi_id_poll_settings_value( $multi_id, 'webhook_url', '' ),
|
78 |
+
'multi_id' => $multi_id,
|
79 |
+
);
|
80 |
+
|
81 |
+
$is_submit = ! empty( $submitted_data );
|
82 |
+
$has_errors = false;
|
83 |
+
$is_close = false;
|
84 |
+
$notification = array();
|
85 |
+
|
86 |
+
if ( $is_submit ) {
|
87 |
+
$name = isset( $submitted_data['name'] ) ? trim( $submitted_data['name'] ) : '';
|
88 |
+
$template_params['name'] = $name;
|
89 |
+
|
90 |
+
$webhook_url = isset( $submitted_data['webhook_url'] ) ? trim( $submitted_data['webhook_url'] ) : '';
|
91 |
+
$template_params['webhook_url'] = $webhook_url;
|
92 |
+
|
93 |
+
try {
|
94 |
+
$input_exceptions = new Forminator_Addon_Webhook_Poll_Settings_Exception();
|
95 |
+
|
96 |
+
if ( empty( $name ) ) {
|
97 |
+
$input_exceptions->add_input_exception( __( 'Please specify integration name.', 'forminator' ), 'name_error' );
|
98 |
+
}
|
99 |
+
|
100 |
+
$this->validate_and_send_sample( $submitted_data, $input_exceptions );
|
101 |
+
|
102 |
+
if ( $input_exceptions->input_exceptions_is_available() ) {
|
103 |
+
throw $input_exceptions;
|
104 |
+
}
|
105 |
+
|
106 |
+
$time_added = $this->get_multi_id_poll_settings_value( $multi_id, 'time_added', time() );
|
107 |
+
$this->save_multi_id_poll_setting_values(
|
108 |
+
$multi_id,
|
109 |
+
array(
|
110 |
+
'name' => $name,
|
111 |
+
'webhook_url' => $webhook_url,
|
112 |
+
'time_added' => $time_added,
|
113 |
+
)
|
114 |
+
);
|
115 |
+
|
116 |
+
$notification = array(
|
117 |
+
'type' => 'success',
|
118 |
+
'text' => '<strong>' . $this->addon->get_title() . '</strong> ' . __( 'Successfully connected and sent sample data to your Webhook', 'forminator' ),
|
119 |
+
);
|
120 |
+
$is_close = true;
|
121 |
+
|
122 |
+
} catch ( Forminator_Addon_Webhook_Poll_Settings_Exception $e ) {
|
123 |
+
$template_params = array_merge( $template_params, $e->get_input_exceptions() );
|
124 |
+
$has_errors = true;
|
125 |
+
} catch ( Forminator_Addon_Webhook_Exception $e ) {
|
126 |
+
$template_params['error_message'] = $e->getMessage();
|
127 |
+
$has_errors = true;
|
128 |
+
}
|
129 |
+
}
|
130 |
+
|
131 |
+
$buttons = array();
|
132 |
+
if ( $this->setup_webhook_url_is_completed( array( 'multi_id' => $multi_id ) ) ) {
|
133 |
+
$buttons['disconnect']['markup'] = Forminator_Addon_Webhook::get_button_markup(
|
134 |
+
esc_html__( 'Deactivate', 'forminator' ),
|
135 |
+
'sui-button-ghost sui-tooltip sui-tooltip-top-center forminator-addon-form-disconnect',
|
136 |
+
esc_html__( 'Deactivate Webhook from this Poll.', 'forminator' )
|
137 |
+
);
|
138 |
+
}
|
139 |
+
|
140 |
+
$buttons['next']['markup'] = '<div class="sui-actions-right">' .
|
141 |
+
Forminator_Addon_Webhook::get_button_markup( esc_html__( 'Save', 'forminator' ), 'sui-button-primary forminator-addon-finish' ) .
|
142 |
+
'</div>';
|
143 |
+
|
144 |
+
return array(
|
145 |
+
'html' => Forminator_Addon_Abstract::get_template( $template, $template_params ),
|
146 |
+
'buttons' => $buttons,
|
147 |
+
'redirect' => false,
|
148 |
+
'has_errors' => $has_errors,
|
149 |
+
'has_back' => false,
|
150 |
+
'is_close' => $is_close,
|
151 |
+
'notification' => $notification,
|
152 |
+
);
|
153 |
+
|
154 |
+
}
|
155 |
+
|
156 |
+
|
157 |
+
/**
|
158 |
+
* Sending test sample towebhook URL
|
159 |
+
* Data sent will be used onwebhook to map fields on their zap action
|
160 |
+
*
|
161 |
+
*
|
162 |
+
*
|
163 |
+
* @param $submitted_data
|
164 |
+
* @param Forminator_Addon_Webhook_Poll_Settings_Exception $current_input_exception
|
165 |
+
*
|
166 |
+
* @throws Forminator_Addon_Webhook_Poll_Settings_Exception
|
167 |
+
* @throws Forminator_Addon_Webhook_Wp_Api_Not_Found_Exception
|
168 |
+
* @throws Forminator_Addon_Webhook_Wp_Api_Exception
|
169 |
+
*/
|
170 |
+
private function validate_and_send_sample( $submitted_data, Forminator_Addon_Webhook_Poll_Settings_Exception $current_input_exception ) {
|
171 |
+
$poll_id = $this->poll_id;
|
172 |
+
if ( ! isset( $submitted_data['webhook_url'] ) ) {
|
173 |
+
$current_input_exception->add_input_exception( __( 'Please put a valid Webhook URL.', 'forminator' ), 'webhook_url_error' );
|
174 |
+
throw $current_input_exception;
|
175 |
+
}
|
176 |
+
|
177 |
+
// must not be in silent mode.
|
178 |
+
if ( stripos( $submitted_data['webhook_url'], 'silent' ) !== false ) {
|
179 |
+
$current_input_exception->add_input_exception( __( 'Please disable Silent Mode on Webhook URL.', 'forminator' ), 'webhook_url_error' );
|
180 |
+
throw $current_input_exception;
|
181 |
+
}
|
182 |
+
|
183 |
+
$endpoint = wp_http_validate_url( $submitted_data['webhook_url'] );
|
184 |
+
if ( false === $endpoint ) {
|
185 |
+
$current_input_exception->add_input_exception( __( 'Please put a valid Webhook URL.', 'forminator' ), 'webhook_url_error' );
|
186 |
+
throw $current_input_exception;
|
187 |
+
}
|
188 |
+
|
189 |
+
if ( $current_input_exception->input_exceptions_is_available() ) {
|
190 |
+
throw $current_input_exception;
|
191 |
+
}
|
192 |
+
|
193 |
+
$connection_settings = $submitted_data;
|
194 |
+
/**
|
195 |
+
* Filter Endpoint Webhook URL to send
|
196 |
+
*
|
197 |
+
* @since 1.6.1
|
198 |
+
*
|
199 |
+
* @param string $endpoint
|
200 |
+
* @param int $poll_id current Form ID.
|
201 |
+
* @param array $connection_settings Submitted data by user, it contains `name` and `webhook_url`.
|
202 |
+
*/
|
203 |
+
$endpoint = apply_filters_deprecated(
|
204 |
+
'forminator_addon_zapier_poll_endpoint',
|
205 |
+
array( $endpoint, $poll_id, $connection_settings ),
|
206 |
+
'1.18.0',
|
207 |
+
'forminator_addon_webhook_poll_endpoint'
|
208 |
+
);
|
209 |
+
$endpoint = apply_filters(
|
210 |
+
'forminator_addon_webhook_poll_endpoint',
|
211 |
+
$endpoint,
|
212 |
+
$poll_id,
|
213 |
+
$connection_settings
|
214 |
+
);
|
215 |
+
|
216 |
+
forminator_addon_maybe_log( __METHOD__, $endpoint );
|
217 |
+
$api = $this->addon->get_api( $endpoint );
|
218 |
+
|
219 |
+
// build form sample data.
|
220 |
+
$sample_data = $this->build_form_sample_data();
|
221 |
+
$sample_data = self::replace_dashes_in_keys( $sample_data, $endpoint );
|
222 |
+
$sample_data['is_test'] = true;
|
223 |
+
|
224 |
+
/**
|
225 |
+
* Filter sample data to send to Webhook URL
|
226 |
+
*
|
227 |
+
* It fires when user saved Webhook connection on Form Settings Page.
|
228 |
+
* Sample data contains `is_test` key with value `true`,
|
229 |
+
* this key indicating that it wont process trigger on Webhook.
|
230 |
+
*
|
231 |
+
* @since 1.6.1
|
232 |
+
*
|
233 |
+
* @param array $sample_data
|
234 |
+
* @param int $poll_id current Form ID.
|
235 |
+
* @param array $submitted_data Submitted data by user, it contains `name` and `webhook_url`.
|
236 |
+
*/
|
237 |
+
$sample_data = apply_filters_deprecated(
|
238 |
+
'forminator_addon_zapier_poll_sample_data',
|
239 |
+
array( $sample_data, $poll_id, $submitted_data ),
|
240 |
+
'1.18.0',
|
241 |
+
'forminator_addon_webhook_poll_sample_data'
|
242 |
+
);
|
243 |
+
$sample_data = apply_filters(
|
244 |
+
'forminator_addon_webhook_poll_sample_data',
|
245 |
+
$sample_data,
|
246 |
+
$poll_id,
|
247 |
+
$submitted_data
|
248 |
+
);
|
249 |
+
|
250 |
+
$api->post_( $sample_data );
|
251 |
+
}
|
252 |
+
|
253 |
+
/**
|
254 |
+
* Build sample data form current fields
|
255 |
+
*
|
256 |
+
* @since 1.6.1
|
257 |
+
*
|
258 |
+
* @return array
|
259 |
+
*/
|
260 |
+
private function build_form_sample_data() {
|
261 |
+
$sample = array();
|
262 |
+
|
263 |
+
$sample['poll-name'] = forminator_get_name_from_model( $this->poll );
|
264 |
+
$sample['vote'] = 'Vote';
|
265 |
+
$sample['vote-extra'] = 'Vote Extra';
|
266 |
+
$sample['results'] = array();
|
267 |
+
|
268 |
+
$fields_array = $this->poll->get_fields_as_array();
|
269 |
+
$map_entries = Forminator_Form_Entry_Model::map_polls_entries( $this->poll_id, $fields_array );
|
270 |
+
$fields = $this->poll->get_fields();
|
271 |
+
|
272 |
+
foreach ( $fields as $field ) {
|
273 |
+
$label = addslashes( $field->title );
|
274 |
+
|
275 |
+
$slug = isset( $field->slug ) ? $field->slug : sanitize_title( $label );
|
276 |
+
$entries = 0;
|
277 |
+
if ( in_array( $slug, array_keys( $map_entries ), true ) ) {
|
278 |
+
$entries = $map_entries[ $slug ];
|
279 |
+
}
|
280 |
+
$sample['results'][ $slug ] = array(
|
281 |
+
'label' => $label,
|
282 |
+
'votes' => $entries,
|
283 |
+
);
|
284 |
+
}
|
285 |
+
|
286 |
+
return $sample;
|
287 |
+
}
|
288 |
+
|
289 |
+
/**
|
290 |
+
* Check if setup webhook url is completed
|
291 |
+
*
|
292 |
+
* @since 1.6.1
|
293 |
+
*
|
294 |
+
* @param $submitted_data
|
295 |
+
*
|
296 |
+
* @return bool
|
297 |
+
*/
|
298 |
+
public function setup_webhook_url_is_completed( $submitted_data ) {
|
299 |
+
$multi_id = '';
|
300 |
+
if ( isset( $submitted_data['multi_id'] ) ) {
|
301 |
+
$multi_id = $submitted_data['multi_id'];
|
302 |
+
}
|
303 |
+
|
304 |
+
if ( empty( $multi_id ) ) {
|
305 |
+
return false;
|
306 |
+
}
|
307 |
+
|
308 |
+
$name = $this->get_multi_id_poll_settings_value( $multi_id, 'name', '' );
|
309 |
+
$name = trim( $name );
|
310 |
+
if ( empty( $name ) ) {
|
311 |
+
return false;
|
312 |
+
}
|
313 |
+
$webhook_url = $this->get_multi_id_poll_settings_value( $multi_id, 'webhook_url', '' );
|
314 |
+
$webhook_url = trim( $webhook_url );
|
315 |
+
if ( empty( $webhook_url ) ) {
|
316 |
+
return false;
|
317 |
+
}
|
318 |
+
|
319 |
+
return true;
|
320 |
+
}
|
321 |
+
|
322 |
+
/**
|
323 |
+
* Generate multi id for multiple connection
|
324 |
+
*
|
325 |
+
* @since 1.6.1
|
326 |
+
* @return string
|
327 |
+
*/
|
328 |
+
public function generate_multi_id() {
|
329 |
+
return uniqid( 'webhook_', true );
|
330 |
+
}
|
331 |
+
|
332 |
+
|
333 |
+
/**
|
334 |
+
* Override how multi connection displayed
|
335 |
+
*
|
336 |
+
* @since 1.6.1
|
337 |
+
* @return array
|
338 |
+
*/
|
339 |
+
public function get_multi_ids() {
|
340 |
+
$multi_ids = array();
|
341 |
+
foreach ( $this->get_poll_settings_values() as $key => $value ) {
|
342 |
+
$multi_ids[] = array(
|
343 |
+
'id' => $key,
|
344 |
+
// use name that was added by user on creating connection.
|
345 |
+
'label' => isset( $value['name'] ) ? $value['name'] : $key,
|
346 |
+
);
|
347 |
+
}
|
348 |
+
|
349 |
+
return $multi_ids;
|
350 |
+
}
|
351 |
+
|
352 |
+
/**
|
353 |
+
* Disconnect a connection from current poll
|
354 |
+
*
|
355 |
+
* @since 1.6.1
|
356 |
+
*
|
357 |
+
* @param array $submitted_data
|
358 |
+
*/
|
359 |
+
public function disconnect_form( $submitted_data ) {
|
360 |
+
// only execute if multi_id provided on submitted data.
|
361 |
+
if ( isset( $submitted_data['multi_id'] ) && ! empty( $submitted_data['multi_id'] ) ) {
|
362 |
+
$addon_poll_settings = $this->get_poll_settings_values();
|
363 |
+
unset( $addon_poll_settings[ $submitted_data['multi_id'] ] );
|
364 |
+
$this->save_poll_settings_values( $addon_poll_settings );
|
365 |
+
}
|
366 |
+
}
|
367 |
+
|
368 |
+
/**
|
369 |
+
* Check if multi_id poll settings values completed
|
370 |
+
*
|
371 |
+
* @since 1.6.1
|
372 |
+
*
|
373 |
+
* @param $multi_id
|
374 |
+
*
|
375 |
+
* @return bool
|
376 |
+
*/
|
377 |
+
public function is_multi_poll_settings_complete( $multi_id ) {
|
378 |
+
$data = array( 'multi_id' => $multi_id );
|
379 |
+
|
380 |
+
if ( ! $this->setup_webhook_url_is_completed( $data ) ) {
|
381 |
+
return false;
|
382 |
+
}
|
383 |
+
|
384 |
+
return true;
|
385 |
+
}
|
386 |
+
}
|
addons/pro/webhook/class-forminator-addon-webhook-quiz-hooks.php
ADDED
@@ -0,0 +1,619 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/**
|
4 |
+
* Class Forminator_Addon_Webhook_Quiz_Hooks
|
5 |
+
*
|
6 |
+
* @since 1.6.2
|
7 |
+
*/
|
8 |
+
class Forminator_Addon_Webhook_Quiz_Hooks extends Forminator_Addon_Quiz_Hooks_Abstract {
|
9 |
+
|
10 |
+
/**
|
11 |
+
* Addon instance are auto available form abstract
|
12 |
+
* Its added here for development purpose,
|
13 |
+
* Auto-complete will resolve addon directly to `Webhook` instance instead of the abstract
|
14 |
+
* And its public properties can be exposed
|
15 |
+
*
|
16 |
+
* @since 1.6.2
|
17 |
+
* @var Forminator_Addon_Webhook
|
18 |
+
*/
|
19 |
+
protected $addon;
|
20 |
+
|
21 |
+
/**
|
22 |
+
* Quiz Settings Instance
|
23 |
+
*
|
24 |
+
* @since 1.6.2
|
25 |
+
* @var Forminator_Addon_Webhook_Quiz_Settings | null
|
26 |
+
*/
|
27 |
+
protected $quiz_settings_instance;
|
28 |
+
|
29 |
+
/**
|
30 |
+
* Forminator_Addon_Webhook_Quiz_Hooks constructor.
|
31 |
+
*
|
32 |
+
* @since 1.6.2
|
33 |
+
*
|
34 |
+
* @param Forminator_Addon_Abstract $addon
|
35 |
+
* @param $quiz_id
|
36 |
+
*
|
37 |
+
* @throws Forminator_Addon_Exception
|
38 |
+
*/
|
39 |
+
public function __construct( Forminator_Addon_Abstract $addon, $quiz_id ) {
|
40 |
+
parent::__construct( $addon, $quiz_id );
|
41 |
+
$this->_submit_quiz_error_message = __( 'Webhook failed to process submitted data. Please check your form and try again', 'forminator' );
|
42 |
+
}
|
43 |
+
|
44 |
+
/**
|
45 |
+
* Save status of request sent and received for each connected zap(s)
|
46 |
+
*
|
47 |
+
* @since 1.6.2
|
48 |
+
*
|
49 |
+
* @param array $submitted_data
|
50 |
+
* @param array $current_entry_fields
|
51 |
+
*
|
52 |
+
* @return array
|
53 |
+
*/
|
54 |
+
public function add_entry_fields( $submitted_data, $current_entry_fields = array() ) {
|
55 |
+
|
56 |
+
$quiz_id = $this->quiz_id;
|
57 |
+
$quiz_settings_instance = $this->quiz_settings_instance;
|
58 |
+
|
59 |
+
/**
|
60 |
+
* Filterwebhook submitted form data to be processed
|
61 |
+
*
|
62 |
+
* @since 1.6.2
|
63 |
+
*
|
64 |
+
* @param array $submitted_data
|
65 |
+
* @param int $quiz_id current Form ID.
|
66 |
+
* @param Forminator_Addon_Webhook_Quiz_Settings $quiz_settings_instance Webhook Addon Quiz Settings instance.
|
67 |
+
*/
|
68 |
+
$submitted_data = apply_filters_deprecated(
|
69 |
+
'forminator_addon_zapier_quiz_submitted_data',
|
70 |
+
array( $submitted_data, $quiz_id, $quiz_settings_instance ),
|
71 |
+
'1.18.0',
|
72 |
+
'forminator_addon_webhook_quiz_submitted_data'
|
73 |
+
);
|
74 |
+
$submitted_data = apply_filters(
|
75 |
+
'forminator_addon_webhook_quiz_submitted_data',
|
76 |
+
$submitted_data,
|
77 |
+
$quiz_id,
|
78 |
+
$quiz_settings_instance
|
79 |
+
);
|
80 |
+
|
81 |
+
forminator_addon_maybe_log( __METHOD__, $submitted_data );
|
82 |
+
|
83 |
+
$addon_setting_values = $quiz_settings_instance->get_quiz_settings_values();
|
84 |
+
$quiz_settings = $quiz_settings_instance->get_quiz_settings();
|
85 |
+
|
86 |
+
$data = array();
|
87 |
+
|
88 |
+
/**
|
89 |
+
* Fires before sending data to Webhook URL(s)
|
90 |
+
*
|
91 |
+
* @since 1.6.2
|
92 |
+
*
|
93 |
+
* @param int $quiz_id current Quiz ID.
|
94 |
+
* @param array $submitted_data
|
95 |
+
* @param Forminator_Addon_Webhook_Quiz_Settings $quiz_settings_instance Webhook Addon Quiz Settings instance.
|
96 |
+
*/
|
97 |
+
do_action_deprecated( 'forminator_addon_zapier_quiz_before_post_to_webhook', array( $quiz_id, $submitted_data, $quiz_settings_instance ), '1.18.0', 'forminator_addon_webhook_quiz_before_post_to_webhook' );
|
98 |
+
do_action( 'forminator_addon_webhook_quiz_before_post_to_webhook', $quiz_id, $submitted_data, $quiz_settings_instance );
|
99 |
+
|
100 |
+
foreach ( $addon_setting_values as $key => $addon_setting_value ) {
|
101 |
+
// save it on entry field, with name `status-$MULTI_ID`, and value is the return result on sending data towebhook.
|
102 |
+
$data[] = array(
|
103 |
+
'name' => 'status-' . $key,
|
104 |
+
'value' => $this->get_status_on_send_data( $key, $submitted_data, $addon_setting_value, $quiz_settings, $current_entry_fields ),
|
105 |
+
);
|
106 |
+
}
|
107 |
+
|
108 |
+
$entry_fields = $data;
|
109 |
+
/**
|
110 |
+
* Filterwebhook entry fields to be saved to entry model
|
111 |
+
*
|
112 |
+
* @since 1.6.2
|
113 |
+
*
|
114 |
+
* @param array $entry_fields
|
115 |
+
* @param int $quiz_id current Quiz ID.
|
116 |
+
* @param array $submitted_data
|
117 |
+
* @param Forminator_Addon_Webhook_Quiz_Settings $quiz_settings_instance Webhook Quiz Settings instance.
|
118 |
+
*/
|
119 |
+
$data = apply_filters_deprecated(
|
120 |
+
'forminator_addon_zapier_quiz_entry_fields',
|
121 |
+
array( $entry_fields, $quiz_id, $submitted_data, $quiz_settings_instance ),
|
122 |
+
'1.18.0',
|
123 |
+
'forminator_addon_webhook_quiz_entry_fields'
|
124 |
+
);
|
125 |
+
$data = apply_filters(
|
126 |
+
'forminator_addon_webhook_quiz_entry_fields',
|
127 |
+
$data,
|
128 |
+
$quiz_id,
|
129 |
+
$submitted_data,
|
130 |
+
$quiz_settings_instance
|
131 |
+
);
|
132 |
+
|
133 |
+
return $data;
|
134 |
+
|
135 |
+
}
|
136 |
+
|
137 |
+
/**
|
138 |
+
* Get status on sending data towebhook
|
139 |
+
*
|
140 |
+
* @since 1.6.2
|
141 |
+
*
|
142 |
+
* @param $connection_id
|
143 |
+
* @param $submitted_data
|
144 |
+
* @param $connection_settings
|
145 |
+
* @param $quiz_settings
|
146 |
+
* @param $current_entry_fields
|
147 |
+
*
|
148 |
+
* @return array `is_sent` true means its success send data towebhook, false otherwise
|
149 |
+
*/
|
150 |
+
private function get_status_on_send_data( $connection_id, $submitted_data, $connection_settings, $quiz_settings, $current_entry_fields ) {
|
151 |
+
// initialize as null.
|
152 |
+
$webhook_api = null;
|
153 |
+
|
154 |
+
$quiz_id = $this->quiz_id;
|
155 |
+
$quiz_settings_instance = $this->quiz_settings_instance;
|
156 |
+
|
157 |
+
// check required fields.
|
158 |
+
try {
|
159 |
+
if ( ! isset( $connection_settings['webhook_url'] ) ) {
|
160 |
+
throw new Forminator_Addon_Webhook_Exception( __( 'Webhook URL is not properly setup', 'forminator' ) );
|
161 |
+
}
|
162 |
+
|
163 |
+
$endpoint = $connection_settings['webhook_url'];
|
164 |
+
/**
|
165 |
+
* Filter Endpoint Webhook URL to send
|
166 |
+
*
|
167 |
+
* @since 1.6.2
|
168 |
+
*
|
169 |
+
* @param string $endpoint
|
170 |
+
* @param int $quiz_id current Form ID.
|
171 |
+
* @param array $connection_settings current connection setting, it contains `name` and `webhook_url`.
|
172 |
+
*/
|
173 |
+
$endpoint = apply_filters_deprecated(
|
174 |
+
'forminator_addon_zapier_quiz_endpoint',
|
175 |
+
array( $endpoint, $quiz_id, $connection_settings ),
|
176 |
+
'1.18.0',
|
177 |
+
'forminator_addon_webhook_quiz_endpoint'
|
178 |
+
);
|
179 |
+
$endpoint = apply_filters(
|
180 |
+
'forminator_addon_webhook_quiz_endpoint',
|
181 |
+
$endpoint,
|
182 |
+
$quiz_id,
|
183 |
+
$connection_settings
|
184 |
+
);
|
185 |
+
|
186 |
+
$webhook_api = $this->addon->get_api( $endpoint );
|
187 |
+
|
188 |
+
$args = $this->build_post_data( $current_entry_fields, $submitted_data );
|
189 |
+
$args = $quiz_settings_instance::replace_dashes_in_keys( $args, $endpoint );
|
190 |
+
|
191 |
+
/**
|
192 |
+
* Filter arguments to passed on to Webhook API
|
193 |
+
*
|
194 |
+
* @since 1.6.2
|
195 |
+
*
|
196 |
+
* @param array $args
|
197 |
+
* @param int $quiz_id Current Quiz id.
|
198 |
+
* @param string $connection_id ID of current connection.
|
199 |
+
* @param array $submitted_data
|
200 |
+
* @param array $connection_settings current connection setting, contains `name` and `webhook_url`.
|
201 |
+
* @param array $quiz_settings Displayed Quiz settings.
|
202 |
+
* @param Forminator_Addon_Webhook_Quiz_Settings $quiz_settings_instance Webhook Quiz Settings instance.
|
203 |
+
*/
|
204 |
+
$args = apply_filters_deprecated(
|
205 |
+
'forminator_addon_zapier_quiz_post_to_webhook_args',
|
206 |
+
array( $args, $quiz_id, $connection_id, $submitted_data, $connection_settings, $quiz_settings, $quiz_settings_instance ),
|
207 |
+
'1.18.0',
|
208 |
+
'forminator_addon_webhook_quiz_post_to_webhook_args'
|
209 |
+
);
|
210 |
+
$args = apply_filters(
|
211 |
+
'forminator_addon_webhook_quiz_post_to_webhook_args',
|
212 |
+
$args,
|
213 |
+
$quiz_id,
|
214 |
+
$connection_id,
|
215 |
+
$submitted_data,
|
216 |
+
$connection_settings,
|
217 |
+
$quiz_settings,
|
218 |
+
$quiz_settings_instance
|
219 |
+
);
|
220 |
+
|
221 |
+
// replace '-' to '_' in keys because some integrations don't support dashes like tray.io and workato.
|
222 |
+
// don't do it for zapier for backward compatibility.
|
223 |
+
$args = $quiz_settings_instance::replace_dashes_in_keys( $args, $endpoint );
|
224 |
+
|
225 |
+
$webhook_api->post_( $args );
|
226 |
+
|
227 |
+
forminator_addon_maybe_log( __METHOD__, 'Success Send Data' );
|
228 |
+
|
229 |
+
return array(
|
230 |
+
'is_sent' => true,
|
231 |
+
'connection_name' => $connection_settings['name'],
|
232 |
+
'description' => __( 'Successfully send data to Webhook', 'forminator' ),
|
233 |
+
'data_sent' => $webhook_api->get_last_data_sent(),
|
234 |
+
'data_received' => $webhook_api->get_last_data_received(),
|
235 |
+
'url_request' => $webhook_api->get_last_url_request(),
|
236 |
+
);
|
237 |
+
|
238 |
+
} catch ( Forminator_Addon_Webhook_Exception $e ) {
|
239 |
+
forminator_addon_maybe_log( __METHOD__, 'Failed to Send to Webhook' );
|
240 |
+
|
241 |
+
return array(
|
242 |
+
'is_sent' => false,
|
243 |
+
'description' => $e->getMessage(),
|
244 |
+
'connection_name' => $connection_settings['name'],
|
245 |
+
'data_sent' => ( ( $webhook_api instanceof Forminator_Addon_Webhook_Wp_Api ) ? $webhook_api->get_last_data_sent() : array() ),
|
246 |
+
'data_received' => ( ( $webhook_api instanceof Forminator_Addon_Webhook_Wp_Api ) ? $webhook_api->get_last_data_received() : array() ),
|
247 |
+
'url_request' => ( ( $webhook_api instanceof Forminator_Addon_Webhook_Wp_Api ) ? $webhook_api->get_last_url_request() : '' ),
|
248 |
+
);
|
249 |
+
}
|
250 |
+
}
|
251 |
+
|
252 |
+
/**
|
253 |
+
* Build sample data form current fields
|
254 |
+
*
|
255 |
+
* @since 1.6.2
|
256 |
+
*
|
257 |
+
* @param array $quiz_entry_fields
|
258 |
+
* @param array $submitted_data
|
259 |
+
*
|
260 |
+
* @return array
|
261 |
+
*/
|
262 |
+
private function build_post_data( $quiz_entry_fields, $submitted_data ) {
|
263 |
+
$sample = array();
|
264 |
+
|
265 |
+
$sample['quiz-name'] = forminator_get_name_from_model( $this->quiz );
|
266 |
+
|
267 |
+
$answers = array();
|
268 |
+
$correct_answers = 0;
|
269 |
+
$total_answers = 0;
|
270 |
+
$nowrong_result = '';
|
271 |
+
$questions = $this->quiz->questions;
|
272 |
+
|
273 |
+
if ( is_array( $quiz_entry_fields ) && isset( $quiz_entry_fields[0] ) ) {
|
274 |
+
$quiz_entry = $quiz_entry_fields[0];
|
275 |
+
if ( isset( $quiz_entry['name'] ) && isset( $quiz_entry['value'] ) && 'entry' === $quiz_entry['name'] ) {
|
276 |
+
if ( is_array( $quiz_entry['value'] ) ) {
|
277 |
+
|
278 |
+
// KNOWLEDGE.
|
279 |
+
if ( 'knowledge' === $this->quiz->quiz_type ) {
|
280 |
+
foreach ( $quiz_entry['value'] as $key => $data ) {
|
281 |
+
$question_id = ( ( isset( $questions[ $key ] ) && isset( $questions[ $key ]['slug'] ) ) ? $questions[ $key ]['slug'] : uniqid() );
|
282 |
+
// bit cleanup.
|
283 |
+
$question_id = str_replace( 'question-', '', $question_id );
|
284 |
+
|
285 |
+
$question = isset( $data['question'] ) ? $data['question'] : '';
|
286 |
+
$answer = isset( $data['answers'] ) ? $data['answers'] : '';
|
287 |
+
$is_correct = isset( $data['isCorrect'] ) ? $data['isCorrect'] : false;
|
288 |
+
|
289 |
+
$answers[ $question_id ] = array(
|
290 |
+
'question' => $question,
|
291 |
+
'answer' => $answer,
|
292 |
+
'is_correct' => $is_correct,
|
293 |
+
);
|
294 |
+
if ( $is_correct ) {
|
295 |
+
$correct_answers ++;
|
296 |
+
}
|
297 |
+
$total_answers ++;
|
298 |
+
}
|
299 |
+
} elseif ( 'nowrong' === $this->quiz->quiz_type ) {
|
300 |
+
if ( isset( $quiz_entry['value'][0] )
|
301 |
+
&& is_array( $quiz_entry['value'][0] )
|
302 |
+
&& isset( $quiz_entry['value'][0]['value'] )
|
303 |
+
&& is_array( $quiz_entry['value'][0]['value'] ) ) {
|
304 |
+
|
305 |
+
$quiz_entry = $quiz_entry['value'][0]['value'];
|
306 |
+
|
307 |
+
$nowrong_result = ( isset( $quiz_entry['result'] ) && isset( $quiz_entry['result']['title'] ) ) ? $quiz_entry['result']['title'] : '';
|
308 |
+
|
309 |
+
$entry_questions = ( isset( $quiz_entry['answers'] ) && is_array( $quiz_entry['answers'] ) ) ? $quiz_entry['answers'] : array();
|
310 |
+
|
311 |
+
foreach ( $entry_questions as $key => $entry_question ) {
|
312 |
+
$question_id = ( ( isset( $questions[ $key ] ) && isset( $questions[ $key ]['slug'] ) ) ? $questions[ $key ]['slug'] : uniqid() );
|
313 |
+
// bit cleanup.
|
314 |
+
$question_id = str_replace( 'question-', '', $question_id );
|
315 |
+
|
316 |
+
$question = isset( $entry_question['question'] ) ? $entry_question['question'] : '';
|
317 |
+
$answer = isset( $entry_question['answer'] ) ? $entry_question['answer'] : '';
|
318 |
+
|
319 |
+
$answers[ $question_id ] = array(
|
320 |
+
'question' => $question,
|
321 |
+
'answer' => $answer,
|
322 |
+
);
|
323 |
+
}
|
324 |
+
}
|
325 |
+
}
|
326 |
+
}
|
327 |
+
}
|
328 |
+
}
|
329 |
+
|
330 |
+
$sample['answers'] = $answers;
|
331 |
+
$result = array();
|
332 |
+
|
333 |
+
if ( 'knowledge' === $this->quiz->quiz_type ) {
|
334 |
+
$result['correct'] = $correct_answers;
|
335 |
+
$result['answers'] = $total_answers;
|
336 |
+
|
337 |
+
} elseif ( 'nowrong' === $this->quiz->quiz_type ) {
|
338 |
+
$result['result'] = $nowrong_result;
|
339 |
+
}
|
340 |
+
|
341 |
+
$sample['result'] = $result;
|
342 |
+
|
343 |
+
$quiz_settings = $this->quiz_settings_instance->get_quiz_settings();
|
344 |
+
|
345 |
+
// Use the following code block only when Leads is active.
|
346 |
+
if ( isset( $quiz_settings['hasLeads'] ) && $quiz_settings['hasLeads'] ) {
|
347 |
+
$addons_fields = $this->quiz_settings_instance->get_form_fields();
|
348 |
+
$quiz_submitted_data = get_addons_lead_form_entry_data( $quiz_settings, $submitted_data, $addons_fields );
|
349 |
+
|
350 |
+
if ( ! empty( $quiz_submitted_data ) ) {
|
351 |
+
foreach ( $quiz_submitted_data as $s => $quiz_submitted ) {
|
352 |
+
$sample[ $s ] = $quiz_submitted;
|
353 |
+
}
|
354 |
+
}
|
355 |
+
}
|
356 |
+
|
357 |
+
return $sample;
|
358 |
+
}
|
359 |
+
|
360 |
+
/**
|
361 |
+
* Webhook will add a column on the title/header row
|
362 |
+
* its called `Webhook Info` which can be translated on forminator lang
|
363 |
+
*
|
364 |
+
* @since 1.6.2
|
365 |
+
* @return array
|
366 |
+
*/
|
367 |
+
public function on_export_render_title_row() {
|
368 |
+
|
369 |
+
$export_headers = array(
|
370 |
+
'info' => __( 'Webhook Info', 'forminator' ),
|
371 |
+
);
|
372 |
+
|
373 |
+
$quiz_id = $this->quiz_id;
|
374 |
+
$quiz_settings_instance = $this->quiz_settings_instance;
|
375 |
+
|
376 |
+
/**
|
377 |
+
* Filterwebhook headers on export file
|
378 |
+
*
|
379 |
+
* @since 1.6.2
|
380 |
+
*
|
381 |
+
* @param array $export_headers headers to be displayed on export file.
|
382 |
+
* @param int $quiz_id current Form ID.
|
383 |
+
* @param Forminator_Addon_Webhook_Quiz_Settings $quiz_settings_instance Webhook Quiz Settings instance.
|
384 |
+
*/
|
385 |
+
$export_headers = apply_filters_deprecated(
|
386 |
+
'forminator_addon_zapier_quiz_export_headers',
|
387 |
+
array( $export_headers, $quiz_id, $quiz_settings_instance ),
|
388 |
+
'1.18.0',
|
389 |
+
'forminator_addon_webhook_quiz_export_headers'
|
390 |
+
);
|
391 |
+
$export_headers = apply_filters(
|
392 |
+
'forminator_addon_webhook_quiz_export_headers',
|
393 |
+
$export_headers,
|
394 |
+
$quiz_id,
|
395 |
+
$quiz_settings_instance
|
396 |
+
);
|
397 |
+
|
398 |
+
return $export_headers;
|
399 |
+
}
|
400 |
+
|
401 |
+
/**
|
402 |
+
* Webhook will add a column that give user information whether sending data towebhook successfully or not
|
403 |
+
* It will only add one column even its multiple connection, every connection will be separated by comma
|
404 |
+
*
|
405 |
+
* @since 1.6.2
|
406 |
+
*
|
407 |
+
* @param Forminator_Form_Entry_Model $entry_model
|
408 |
+
* @param $addon_meta_data
|
409 |
+
*
|
410 |
+
* @return array
|
411 |
+
*/
|
412 |
+
public function on_export_render_entry( Forminator_Form_Entry_Model $entry_model, $addon_meta_data ) {
|
413 |
+
|
414 |
+
$quiz_id = $this->quiz_id;
|
415 |
+
$quiz_settings_instance = $this->quiz_settings_instance;
|
416 |
+
|
417 |
+
/**
|
418 |
+
*
|
419 |
+
* Filterwebhook metadata that previously saved on db to be processed
|
420 |
+
*
|
421 |
+
* @since 1.1
|
422 |
+
*
|
423 |
+
* @param array $addon_meta_data
|
424 |
+
* @param int $quiz_id current Quiz ID.
|
425 |
+
* @param Forminator_Addon_Webhook_Quiz_Settings $quiz_settings_instance Webhook Quiz Settings instance.
|
426 |
+
*/
|
427 |
+
$addon_meta_data = apply_filters_deprecated(
|
428 |
+
'forminator_addon_zapier_quiz_metadata',
|
429 |
+
array( $addon_meta_data, $quiz_id, $quiz_settings_instance ),
|
430 |
+
'1.18.0',
|
431 |
+
'forminator_addon_webhook_quiz_metadata'
|
432 |
+
);
|
433 |
+
$addon_meta_data = apply_filters(
|
434 |
+
'forminator_addon_webhook_quiz_metadata',
|
435 |
+
$addon_meta_data,
|
436 |
+
$quiz_id,
|
437 |
+
$quiz_settings_instance
|
438 |
+
);
|
439 |
+
|
440 |
+
$export_columns = array(
|
441 |
+
'info' => $this->get_from_addon_meta_data( $addon_meta_data, 'description', '' ),
|
442 |
+
);
|
443 |
+
|
444 |
+
/**
|
445 |
+
* Filterwebhook columns to be displayed on export submissions
|
446 |
+
*
|
447 |
+
* @since 1.6.2
|
448 |
+
*
|
449 |
+
* @param array $export_columns column to be exported.
|
450 |
+
* @param int $quiz_id current Quiz ID.
|
451 |
+
* @param Forminator_Form_Entry_Model $entry_model Form Entry Model.
|
452 |
+
* @param array $addon_meta_data meta data saved by addon on entry fields.
|
453 |
+
* @param Forminator_Addon_Webhook_Quiz_Settings $quiz_settings_instance Webhook Quiz Settings instance.
|
454 |
+
*/
|
455 |
+
$export_columns = apply_filters_deprecated(
|
456 |
+
'forminator_addon_zapier_quiz_export_columns',
|
457 |
+
array( $export_columns, $quiz_id, $entry_model, $addon_meta_data, $quiz_settings_instance ),
|
458 |
+
'1.18.0',
|
459 |
+
'forminator_addon_webhook_quiz_export_columns'
|
460 |
+
);
|
461 |
+
$export_columns = apply_filters(
|
462 |
+
'forminator_addon_webhook_quiz_export_columns',
|
463 |
+
$export_columns,
|
464 |
+
$quiz_id,
|
465 |
+
$entry_model,
|
466 |
+
$addon_meta_data,
|
467 |
+
$quiz_settings_instance
|
468 |
+
);
|
469 |
+
|
470 |
+
return $export_columns;
|
471 |
+
}
|
472 |
+
|
473 |
+
/**
|
474 |
+
* It wil add new row on entry table of submission page, with couple of subentries
|
475 |
+
* subentries included are defined in @see Forminator_Addon_Webhook_Quiz_Hooks::get_additional_entry_item()
|
476 |
+
*
|
477 |
+
* @since 1.6.1
|
478 |
+
*
|
479 |
+
* @param Forminator_Form_Entry_Model $entry_model
|
480 |
+
* @param $addon_meta_data
|
481 |
+
*
|
482 |
+
* @return array
|
483 |
+
*/
|
484 |
+
public function on_render_entry( Forminator_Form_Entry_Model $entry_model, $addon_meta_data ) {
|
485 |
+
|
486 |
+
$quiz_id = $this->quiz_id;
|
487 |
+
$quiz_settings_instance = $this->quiz_settings_instance;
|
488 |
+
|
489 |
+
/**
|
490 |
+
*
|
491 |
+
* Filter Webhook metadata that previously saved on db to be processed
|
492 |
+
*
|
493 |
+
* @since 1.6.2
|
494 |
+
*
|
495 |
+
* @param array $addon_meta_data
|
496 |
+
* @param int $quiz_id current Quiz ID.
|
497 |
+
* @param Forminator_Addon_Webhook_Quiz_Settings $quiz_settings_instance Webhook Addon Quiz Settings instance.
|
498 |
+
*/
|
499 |
+
$addon_meta_data = apply_filters_deprecated(
|
500 |
+
'forminator_addon_quiz_zapier_metadata',
|
501 |
+
array( $addon_meta_data, $quiz_id, $quiz_settings_instance ),
|
502 |
+
'1.18.0',
|
503 |
+
'forminator_addon_quiz_webhook_metadata'
|
504 |
+
);
|
505 |
+
$addon_meta_data = apply_filters(
|
506 |
+
'forminator_addon_quiz_webhook_metadata',
|
507 |
+
$addon_meta_data,
|
508 |
+
$quiz_id,
|
509 |
+
$quiz_settings_instance
|
510 |
+
);
|
511 |
+
|
512 |
+
$addon_meta_datas = $addon_meta_data;
|
513 |
+
if ( ! isset( $addon_meta_data[0] ) || ! is_array( $addon_meta_data[0] ) ) {
|
514 |
+
return array();
|
515 |
+
}
|
516 |
+
|
517 |
+
return $this->on_render_entry_multi_connection( $addon_meta_datas );
|
518 |
+
|
519 |
+
}
|
520 |
+
|
521 |
+
/**
|
522 |
+
* Loop through addon meta data on multiple Webhook setup(s)
|
523 |
+
*
|
524 |
+
* @since 1.6.1
|
525 |
+
*
|
526 |
+
* @param $addon_meta_datas
|
527 |
+
*
|
528 |
+
* @return array
|
529 |
+
*/
|
530 |
+
private function on_render_entry_multi_connection( $addon_meta_datas ) {
|
531 |
+
$additional_entry_item = array();
|
532 |
+
foreach ( $addon_meta_datas as $addon_meta_data ) {
|
533 |
+
$additional_entry_item[] = $this->get_additional_entry_item( $addon_meta_data );
|
534 |
+
}
|
535 |
+
|
536 |
+
return $additional_entry_item;
|
537 |
+
|
538 |
+
}
|
539 |
+
|
540 |
+
/**
|
541 |
+
* Format additional entry item as label and value arrays
|
542 |
+
*
|
543 |
+
* - Integration Name : its defined by user when they adding Webhook integration on their quiz
|
544 |
+
* - Sent To Webhook : will be Yes/No value, that indicates whether sending data to Webhook API was successful
|
545 |
+
* - Info : Text that are generated by addon when building and sending data to Webhook @see Forminator_Addon_Webhook_Quiz_Hooks::add_entry_fields()
|
546 |
+
* - Below subentries will be added if full log enabled, @see Forminator_Addon_Webhook::is_show_full_log() @see FORMINATOR_ADDON_WEBHOOK_SHOW_FULL_LOG
|
547 |
+
* - API URL : URL that wes requested when sending data to Webhook
|
548 |
+
* - Data sent to Webhook : encoded body request that was sent
|
549 |
+
* - Data received from Webhook : json encoded body response that was received
|
550 |
+
*
|
551 |
+
* @param $addon_meta_data
|
552 |
+
*
|
553 |
+
* @since 1.6.1
|
554 |
+
* @return array
|
555 |
+
*/
|
556 |
+
private function get_additional_entry_item( $addon_meta_data ) {
|
557 |
+
|
558 |
+
if ( ! isset( $addon_meta_data['value'] ) || ! is_array( $addon_meta_data['value'] ) ) {
|
559 |
+
return array();
|
560 |
+
}
|
561 |
+
$status = $addon_meta_data['value'];
|
562 |
+
$additional_entry_item = array(
|
563 |
+
'label' => __( 'Webhook Integration', 'forminator' ),
|
564 |
+
'value' => '',
|
565 |
+
);
|
566 |
+
|
567 |
+
$sub_entries = array();
|
568 |
+
if ( isset( $status['connection_name'] ) ) {
|
569 |
+
$sub_entries[] = array(
|
570 |
+
'label' => __( 'Integration Name', 'forminator' ),
|
571 |
+
'value' => $status['connection_name'],
|
572 |
+
);
|
573 |
+
}
|
574 |
+
|
575 |
+
if ( isset( $status['is_sent'] ) ) {
|
576 |
+
$is_sent = true === $status['is_sent'] ? __( 'Yes', 'forminator' ) : __( 'No', 'forminator' );
|
577 |
+
$sub_entries[] = array(
|
578 |
+
'label' => __( 'Sent To Webhook', 'forminator' ),
|
579 |
+
'value' => $is_sent,
|
580 |
+
);
|
581 |
+
}
|
582 |
+
|
583 |
+
if ( isset( $status['description'] ) ) {
|
584 |
+
$sub_entries[] = array(
|
585 |
+
'label' => __( 'Info', 'forminator' ),
|
586 |
+
'value' => $status['description'],
|
587 |
+
);
|
588 |
+
}
|
589 |
+
|
590 |
+
if ( Forminator_Addon_Webhook::is_show_full_log() ) {
|
591 |
+
// too long to be added on entry data enable this with `define('FORMINATOR_ADDON_WEBHOOK_SHOW_FULL_LOG', true)`.
|
592 |
+
if ( isset( $status['url_request'] ) ) {
|
593 |
+
$sub_entries[] = array(
|
594 |
+
'label' => __( 'API URL', 'forminator' ),
|
595 |
+
'value' => $status['url_request'],
|
596 |
+
);
|
597 |
+
}
|
598 |
+
|
599 |
+
if ( isset( $status['data_sent'] ) ) {
|
600 |
+
$sub_entries[] = array(
|
601 |
+
'label' => __( 'Data sent to Webhook', 'forminator' ),
|
602 |
+
'value' => '<pre class="sui-code-snippet">' . wp_json_encode( $status['data_sent'], JSON_PRETTY_PRINT ) . '</pre>',
|
603 |
+
);
|
604 |
+
}
|
605 |
+
|
606 |
+
if ( isset( $status['data_received'] ) ) {
|
607 |
+
$sub_entries[] = array(
|
608 |
+
'label' => __( 'Data received from Webhook', 'forminator' ),
|
609 |
+
'value' => '<pre class="sui-code-snippet">' . wp_json_encode( $status['data_received'], JSON_PRETTY_PRINT ) . '</pre>',
|
610 |
+
);
|
611 |
+
}
|
612 |
+
}
|
613 |
+
|
614 |
+
$additional_entry_item['sub_entries'] = $sub_entries;
|
615 |
+
|
616 |
+
// return single array.
|
617 |
+
return $additional_entry_item;
|
618 |
+
}
|
619 |
+
}
|
addons/pro/webhook/class-forminator-addon-webhook-quiz-settings-exception.php
ADDED
@@ -0,0 +1,68 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/**
|
4 |
+
* Class Forminator_Addon_Webhook_Quiz_Settings_Exception
|
5 |
+
* Wrapper of Quiz Settings Webhook Exception
|
6 |
+
*
|
7 |
+
* @since 1.6.2
|
8 |
+
*/
|
9 |
+
class Forminator_Addon_Webhook_Quiz_Settings_Exception extends Forminator_Addon_Webhook_Exception {
|
10 |
+
|
11 |
+
/**
|
12 |
+
* Holder of input exceptions
|
13 |
+
*
|
14 |
+
* @since 1.6.2
|
15 |
+
* @var array
|
16 |
+
*/
|
17 |
+
protected $input_exceptions = array();
|
18 |
+
|
19 |
+
/**
|
20 |
+
* Forminator_Addon_Webhook_Quiz_Settings_Exception constructor.
|
21 |
+
*
|
22 |
+
* Useful if input_id is needed for later.
|
23 |
+
* If no input_id needed, use @see Forminator_Addon_Webhook_Exception
|
24 |
+
*
|
25 |
+
* @since 1.6.2
|
26 |
+
*
|
27 |
+
* @param string $message
|
28 |
+
* @param string $input_id
|
29 |
+
*/
|
30 |
+
public function __construct( $message = '', $input_id = '' ) {
|
31 |
+
parent::__construct( $message, 0 );
|
32 |
+
if ( ! empty( $input_id ) ) {
|
33 |
+
$this->add_input_exception( $message, $input_id );
|
34 |
+
}
|
35 |
+
}
|
36 |
+
|
37 |
+
/**
|
38 |
+
* Set exception message for an input
|
39 |
+
*
|
40 |
+
* @since 1.6.2
|
41 |
+
*
|
42 |
+
* @param $message
|
43 |
+
* @param $input_id
|
44 |
+
*/
|
45 |
+
public function add_input_exception( $message, $input_id ) {
|
46 |
+
$this->input_exceptions[ $input_id ] = $message;
|
47 |
+
}
|
48 |
+
|
49 |
+
/**
|
50 |
+
* Get all input exceptions
|
51 |
+
*
|
52 |
+
* @since 1.6.2
|
53 |
+
* @return array
|
54 |
+
*/
|
55 |
+
public function get_input_exceptions() {
|
56 |
+
return $this->input_exceptions;
|
57 |
+
}
|
58 |
+
|
59 |
+
/**
|
60 |
+
* Check if there is input_exceptions_is_available
|
61 |
+
*
|
62 |
+
* @since 1.6.2
|
63 |
+
* @return bool
|
64 |
+
*/
|
65 |
+
public function input_exceptions_is_available() {
|
66 |
+
return count( $this->input_exceptions ) > 0;
|
67 |
+
}
|
68 |
+
}
|
addons/pro/webhook/class-forminator-addon-webhook-quiz-settings.php
ADDED
@@ -0,0 +1,434 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
require_once dirname( __FILE__ ) . '/class-forminator-addon-webhook-quiz-settings-exception.php';
|
4 |
+
|
5 |
+
/**
|
6 |
+
* Class Forminator_Addon_Webhook_Quiz_Settings
|
7 |
+
* Handle how quiz settings displayed and saved
|
8 |
+
*
|
9 |
+
* @since 1.6.2
|
10 |
+
*/
|
11 |
+
class Forminator_Addon_Webhook_Quiz_Settings extends Forminator_Addon_Quiz_Settings_Abstract {
|
12 |
+
|
13 |
+
/**
|
14 |
+
* @var Forminator_Addon_Webhook
|
15 |
+
*
|
16 |
+
*/
|
17 |
+
protected $addon;
|
18 |
+
|
19 |
+
/**
|
20 |
+
* Forminator_Addon_Webhook_Form_Settings constructor.
|
21 |
+
*
|
22 |
+
*
|
23 |
+
*
|
24 |
+
* @param Forminator_Addon_Abstract $addon
|
25 |
+
* @param $form_id
|
26 |
+
*
|
27 |
+
* @throws Forminator_Addon_Exception
|
28 |
+
*/
|
29 |
+
public function __construct( Forminator_Addon_Abstract $addon, $form_id ) {
|
30 |
+
parent::__construct( $addon, $form_id );
|
31 |
+
|
32 |
+
$this->_update_quiz_settings_error_message = __(
|
33 |
+
'The update to your settings for this quiz failed, check the form input and try again.',
|
34 |
+
'forminator'
|
35 |
+
);
|
36 |
+
}
|
37 |
+
|
38 |
+
/**
|
39 |
+
* Webhook Quiz Settings wizard
|
40 |
+
*
|
41 |
+
* @since 1.6.2
|
42 |
+
* @return array
|
43 |
+
*/
|
44 |
+
public function quiz_settings_wizards() {
|
45 |
+
// numerical array steps.
|
46 |
+
return array(
|
47 |
+
// 0
|
48 |
+
array(
|
49 |
+
'callback' => array( $this, 'setup_webhook_url' ),
|
50 |
+
'is_completed' => array( $this, 'setup_webhook_url_is_completed' ),
|
51 |
+
),
|
52 |
+
);
|
53 |
+
}
|
54 |
+
|
55 |
+
/**
|
56 |
+
* Setup webhook url
|
57 |
+
*
|
58 |
+
*
|
59 |
+
*
|
60 |
+
* @param $submitted_data
|
61 |
+
*
|
62 |
+
* @return array
|
63 |
+
*/
|
64 |
+
public function setup_webhook_url( $submitted_data ) {
|
65 |
+
|
66 |
+
$template = forminator_addon_webhook_dir() . 'views/quiz-settings/setup-webhook.php';
|
67 |
+
|
68 |
+
if ( ! isset( $submitted_data['multi_id'] ) ) {
|
69 |
+
return $this->get_force_closed_wizard( __( 'Please pick valid connection', 'forminator' ) );
|
70 |
+
}
|
71 |
+
|
72 |
+
$multi_id = $submitted_data['multi_id'];
|
73 |
+
unset( $submitted_data['multi_id'] );
|
74 |
+
|
75 |
+
$template_params = array(
|
76 |
+
'name' => $this->get_multi_id_quiz_settings_value( $multi_id, 'name', '' ),
|
77 |
+
'webhook_url' => $this->get_multi_id_quiz_settings_value( $multi_id, 'webhook_url', '' ),
|
78 |
+
'multi_id' => $multi_id,
|
79 |
+
);
|
80 |
+
|
81 |
+
$is_submit = ! empty( $submitted_data );
|
82 |
+
$has_errors = false;
|
83 |
+
$is_close = false;
|
84 |
+
$notification = array();
|
85 |
+
|
86 |
+
if ( $is_submit ) {
|
87 |
+
$name = isset( $submitted_data['name'] ) ? trim( $submitted_data['name'] ) : '';
|
88 |
+
$template_params['name'] = $name;
|
89 |
+
|
90 |
+
$webhook_url = isset( $submitted_data['webhook_url'] ) ? trim( $submitted_data['webhook_url'] ) : '';
|
91 |
+
$template_params['webhook_url'] = $webhook_url;
|
92 |
+
|
93 |
+
try {
|
94 |
+
$input_exceptions = new Forminator_Addon_Webhook_Quiz_Settings_Exception();
|
95 |
+
|
96 |
+
if ( empty( $name ) ) {
|
97 |
+
$input_exceptions->add_input_exception( __( 'Please specify integration name.', 'forminator' ), 'name_error' );
|
98 |
+
}
|
99 |
+
|
100 |
+
$this->validate_and_send_sample( $submitted_data, $input_exceptions );
|
101 |
+
|
102 |
+
if ( $input_exceptions->input_exceptions_is_available() ) {
|
103 |
+
throw $input_exceptions;
|
104 |
+
}
|
105 |
+
|
106 |
+
$time_added = $this->get_multi_id_quiz_settings_value( $multi_id, 'time_added', time() );
|
107 |
+
$this->save_multi_id_quiz_setting_values(
|
108 |
+
$multi_id,
|
109 |
+
array(
|
110 |
+
'name' => $name,
|
111 |
+
'webhook_url' => $webhook_url,
|
112 |
+
'time_added' => $time_added,
|
113 |
+
)
|
114 |
+
);
|
115 |
+
|
116 |
+
$notification = array(
|
117 |
+
'type' => 'success',
|
118 |
+
'text' => '<strong>' . $this->addon->get_title() . '</strong> ' . __( 'Successfully connected and sent sample data to your Webhook', 'forminator' ),
|
119 |
+
);
|
120 |
+
$is_close = true;
|
121 |
+
|
122 |
+
} catch ( Forminator_Addon_Webhook_Quiz_Settings_Exception $e ) {
|
123 |
+
$template_params = array_merge( $template_params, $e->get_input_exceptions() );
|
124 |
+
$has_errors = true;
|
125 |
+
} catch ( Forminator_Addon_Webhook_Exception $e ) {
|
126 |
+
$template_params['error_message'] = $e->getMessage();
|
127 |
+
$has_errors = true;
|
128 |
+
}
|
129 |
+
}
|
130 |
+
|
131 |
+
$buttons = array();
|
132 |
+
if ( $this->setup_webhook_url_is_completed( array( 'multi_id' => $multi_id ) ) ) {
|
133 |
+
$buttons['disconnect']['markup'] = Forminator_Addon_Webhook::get_button_markup(
|
134 |
+
esc_html__( 'Deactivate', 'forminator' ),
|
135 |
+
'sui-button-ghost sui-tooltip sui-tooltip-top-center forminator-addon-form-disconnect',
|
136 |
+
esc_html__( 'Deactivate Webhook from this Quiz.', 'forminator' )
|
137 |
+
);
|
138 |
+
}
|
139 |
+
|
140 |
+
$buttons['next']['markup'] = '<div class="sui-actions-right">' .
|
141 |
+
Forminator_Addon_Webhook::get_button_markup( esc_html__( 'Save', 'forminator' ), 'sui-button-primary forminator-addon-finish' ) .
|
142 |
+
'</div>';
|
143 |
+
|
144 |
+
return array(
|
145 |
+
'html' => Forminator_Addon_Abstract::get_template( $template, $template_params ),
|
146 |
+
'buttons' => $buttons,
|
147 |
+
'redirect' => false,
|
148 |
+
'has_errors' => $has_errors,
|
149 |
+
'has_back' => false,
|
150 |
+
'is_close' => $is_close,
|
151 |
+
'notification' => $notification,
|
152 |
+
);
|
153 |
+
|
154 |
+
}
|
155 |
+
|
156 |
+
|
157 |
+
/**
|
158 |
+
* Sending test sample towebhook URL
|
159 |
+
* Data sent will be used onwebhook to map fields on their zap action
|
160 |
+
*
|
161 |
+
*
|
162 |
+
*
|
163 |
+
* @param $submitted_data
|
164 |
+
* @param Forminator_Addon_Webhook_Quiz_Settings_Exception $current_input_exception
|
165 |
+
*
|
166 |
+
* @throws Forminator_Addon_Webhook_Quiz_Settings_Exception
|
167 |
+
* @throws Forminator_Addon_Webhook_Wp_Api_Not_Found_Exception
|
168 |
+
* @throws Forminator_Addon_Webhook_Wp_Api_Exception
|
169 |
+
*/
|
170 |
+
private function validate_and_send_sample( $submitted_data, Forminator_Addon_Webhook_Quiz_Settings_Exception $current_input_exception ) {
|
171 |
+
$quiz_id = $this->quiz_id;
|
172 |
+
if ( ! isset( $submitted_data['webhook_url'] ) ) {
|
173 |
+
$current_input_exception->add_input_exception( __( 'Please put a valid Webhook URL.', 'forminator' ), 'webhook_url_error' );
|
174 |
+
throw $current_input_exception;
|
175 |
+
}
|
176 |
+
|
177 |
+
// must not be in silent mode.
|
178 |
+
if ( stripos( $submitted_data['webhook_url'], 'silent' ) !== false ) {
|
179 |
+
$current_input_exception->add_input_exception( __( 'Please disable Silent Mode on Webhook URL.', 'forminator' ), 'webhook_url_error' );
|
180 |
+
throw $current_input_exception;
|
181 |
+
}
|
182 |
+
|
183 |
+
$endpoint = wp_http_validate_url( $submitted_data['webhook_url'] );
|
184 |
+
if ( false === $endpoint ) {
|
185 |
+
$current_input_exception->add_input_exception( __( 'Please put a valid Webhook URL.', 'forminator' ), 'webhook_url_error' );
|
186 |
+
throw $current_input_exception;
|
187 |
+
}
|
188 |
+
|
189 |
+
if ( $current_input_exception->input_exceptions_is_available() ) {
|
190 |
+
throw $current_input_exception;
|
191 |
+
}
|
192 |
+
|
193 |
+
$connection_settings = $submitted_data;
|
194 |
+
/**
|
195 |
+
* Filter Endpoint Webhook URL to send
|
196 |
+
*
|
197 |
+
* @since 1.6.2
|
198 |
+
*
|
199 |
+
* @param string $endpoint
|
200 |
+
* @param int $quiz_id current Form ID.
|
201 |
+
* @param array $connection_settings Submitted data by user, it contains `name` and `webhook_url`.
|
202 |
+
*/
|
203 |
+
$endpoint = apply_filters_deprecated(
|
204 |
+
'forminator_addon_zapier_quiz_endpoint',
|
205 |
+
array( $endpoint, $quiz_id, $connection_settings ),
|
206 |
+
'1.18.0',
|
207 |
+
'forminator_addon_webhook_quiz_endpoint'
|
208 |
+
);
|
209 |
+
$endpoint = apply_filters(
|
210 |
+
'forminator_addon_webhook_quiz_endpoint',
|
211 |
+
$endpoint,
|
212 |
+
$quiz_id,
|
213 |
+
$connection_settings
|
214 |
+
);
|
215 |
+
|
216 |
+
forminator_addon_maybe_log( __METHOD__, $endpoint );
|
217 |
+
$api = $this->addon->get_api( $endpoint );
|
218 |
+
|
219 |
+
// build form sample data.
|
220 |
+
$sample_data = $this->build_form_sample_data();
|
221 |
+
$sample_data = self::replace_dashes_in_keys( $sample_data, $endpoint );
|
222 |
+
$sample_data['is_test'] = true;
|
223 |
+
|
224 |
+
/**
|
225 |
+
* Filter sample data to send to Webhook URL
|
226 |
+
*
|
227 |
+
* It fires when user saved Webhook connection on Form Settings Page.
|
228 |
+
* Sample data contains `is_test` key with value `true`,
|
229 |
+
* this key indicating that it wont process trigger on Webhook.
|
230 |
+
*
|
231 |
+
* @since 1.6.2
|
232 |
+
*
|
233 |
+
* @param array $sample_data
|
234 |
+
* @param int $quiz_id current Form ID.
|
235 |
+
* @param array $submitted_data Submitted data by user, it contains `name` and `webhook_url`.
|
236 |
+
*/
|
237 |
+
$sample_data = apply_filters_deprecated(
|
238 |
+
'forminator_addon_zapier_quiz_sample_data',
|
239 |
+
array( $sample_data, $quiz_id, $submitted_data ),
|
240 |
+
'1.18.0',
|
241 |
+
'forminator_addon_webhook_quiz_sample_data'
|
242 |
+
);
|
243 |
+
$sample_data = apply_filters(
|
244 |
+
'forminator_addon_webhook_quiz_sample_data',
|
245 |
+
$sample_data,
|
246 |
+
$quiz_id,
|
247 |
+
$submitted_data
|
248 |
+
);
|
249 |
+
|
250 |
+
$api->post_( $sample_data );
|
251 |
+
}
|
252 |
+
|
253 |
+
/**
|
254 |
+
* Build sample data form current fields
|
255 |
+
*
|
256 |
+
* @since 1.6.2
|
257 |
+
*
|
258 |
+
* @return array
|
259 |
+
*/
|
260 |
+
private function build_form_sample_data() {
|
261 |
+
$sample = array();
|
262 |
+
|
263 |
+
$sample['quiz-name'] = forminator_get_name_from_model( $this->quiz );
|
264 |
+
$answers = array();
|
265 |
+
|
266 |
+
$num_correct = 0;
|
267 |
+
|
268 |
+
$questions = $this->quiz->questions;
|
269 |
+
|
270 |
+
foreach ( $questions as $question ) {
|
271 |
+
$question_title = isset( $question['title'] ) ? $question['title'] : '';
|
272 |
+
$question_id = isset( $question['slug'] ) ? $question['slug'] : uniqid();
|
273 |
+
|
274 |
+
// bit cleanup.
|
275 |
+
$question_id = str_replace( 'question-', '', $question_id );
|
276 |
+
$answer_title = 'Sample Answer';
|
277 |
+
|
278 |
+
$answer = array(
|
279 |
+
'question' => $question_title,
|
280 |
+
'answer' => $answer_title,
|
281 |
+
);
|
282 |
+
|
283 |
+
if ( 'knowledge' === $this->quiz->quiz_type ) {
|
284 |
+
$answer['is_correct'] = wp_rand( 0, 1 ) ? true : false;
|
285 |
+
|
286 |
+
if ( $answer['is_correct'] ) {
|
287 |
+
$num_correct ++;
|
288 |
+
}
|
289 |
+
}
|
290 |
+
|
291 |
+
$answers[ $question_id ] = $answer;
|
292 |
+
}
|
293 |
+
|
294 |
+
$sample['answers'] = $answers;
|
295 |
+
$result = array();
|
296 |
+
|
297 |
+
if ( 'knowledge' === $this->quiz->quiz_type ) {
|
298 |
+
$result['correct'] = $num_correct;
|
299 |
+
$result['answers'] = count( $answers );
|
300 |
+
|
301 |
+
} elseif ( 'nowrong' === $this->quiz->quiz_type ) {
|
302 |
+
$results = $this->quiz->results;
|
303 |
+
$random_result_key = array_rand( $results );
|
304 |
+
$result_title = ( ( isset( $results[ $random_result_key ] ) && isset( $results[ $random_result_key ]['title'] ) ) ? $results[ $random_result_key ]['title'] : '' );
|
305 |
+
$result['result'] = $result_title;
|
306 |
+
}
|
307 |
+
|
308 |
+
$sample['result'] = $result;
|
309 |
+
|
310 |
+
$form_fields = isset( $this->form_fields ) ? $this->form_fields : array();
|
311 |
+
if ( ! empty( $form_fields ) ) {
|
312 |
+
foreach ( $form_fields as $form_field ) {
|
313 |
+
$sample[ $form_field['element_id'] ] = $form_field['field_label'];
|
314 |
+
|
315 |
+
if ( 'upload' === $form_field['type'] ) {
|
316 |
+
|
317 |
+
$sample_file_path = '/fake/path';
|
318 |
+
$upload_dir = wp_get_upload_dir();
|
319 |
+
if ( isset( $upload_dir['basedir'] ) ) {
|
320 |
+
$sample_file_path = $upload_dir['basedir'];
|
321 |
+
}
|
322 |
+
|
323 |
+
$sample[ $form_field['element_id'] ] = array(
|
324 |
+
'name' => $form_field['field_label'],
|
325 |
+
'type' => 'image/png',
|
326 |
+
'size' => 0,
|
327 |
+
'file_url' => get_home_url(),
|
328 |
+
'file_path' => $sample_file_path,
|
329 |
+
);
|
330 |
+
}
|
331 |
+
}
|
332 |
+
}
|
333 |
+
|
334 |
+
return $sample;
|
335 |
+
}
|
336 |
+
|
337 |
+
/**
|
338 |
+
* Check if setup webhook url is completed
|
339 |
+
*
|
340 |
+
* @since 1.6.2
|
341 |
+
*
|
342 |
+
* @param $submitted_data
|
343 |
+
*
|
344 |
+
* @return bool
|
345 |
+
*/
|
346 |
+
public function setup_webhook_url_is_completed( $submitted_data ) {
|
347 |
+
$multi_id = '';
|
348 |
+
if ( isset( $submitted_data['multi_id'] ) ) {
|
349 |
+
$multi_id = $submitted_data['multi_id'];
|
350 |
+
}
|
351 |
+
|
352 |
+
if ( empty( $multi_id ) ) {
|
353 |
+
return false;
|
354 |
+
}
|
355 |
+
|
356 |
+
$name = $this->get_multi_id_quiz_settings_value( $multi_id, 'name', '' );
|
357 |
+
$name = trim( $name );
|
358 |
+
if ( empty( $name ) ) {
|
359 |
+
return false;
|
360 |
+
}
|
361 |
+
$webhook_url = $this->get_multi_id_quiz_settings_value( $multi_id, 'webhook_url', '' );
|
362 |
+
$webhook_url = trim( $webhook_url );
|
363 |
+
if ( empty( $webhook_url ) ) {
|
364 |
+
return false;
|
365 |
+
}
|
366 |
+
|
367 |
+
return true;
|
368 |
+
}
|
369 |
+
|
370 |
+
/**
|
371 |
+
* Generate multi id for multiple connection
|
372 |
+
*
|
373 |
+
* @since 1.6.2
|
374 |
+
* @return string
|
375 |
+
*/
|
376 |
+
public function generate_multi_id() {
|
377 |
+
return uniqid( 'webhook_', true );
|
378 |
+
}
|
379 |
+
|
380 |
+
|
381 |
+
/**
|
382 |
+
* Override how multi connection displayed
|
383 |
+
*
|
384 |
+
* @since 1.6.2
|
385 |
+
* @return array
|
386 |
+
*/
|
387 |
+
public function get_multi_ids() {
|
388 |
+
$multi_ids = array();
|
389 |
+
foreach ( $this->get_quiz_settings_values() as $key => $value ) {
|
390 |
+
$multi_ids[] = array(
|
391 |
+
'id' => $key,
|
392 |
+
// use name that was added by user on creating connection.
|
393 |
+
'label' => isset( $value['name'] ) ? $value['name'] : $key,
|
394 |
+
);
|
395 |
+
}
|
396 |
+
|
397 |
+
return $multi_ids;
|
398 |
+
}
|
399 |
+
|
400 |
+
/**
|
401 |
+
* Disconnect a connection from current quiz
|
402 |
+
*
|
403 |
+
* @since 1.6.2
|
404 |
+
*
|
405 |
+
* @param array $submitted_data
|
406 |
+
*/
|
407 |
+
public function disconnect_form( $submitted_data ) {
|
408 |
+
// only execute if multi_id provided on submitted data.
|
409 |
+
if ( isset( $submitted_data['multi_id'] ) && ! empty( $submitted_data['multi_id'] ) ) {
|
410 |
+
$addon_quiz_settings = $this->get_quiz_settings_values();
|
411 |
+
unset( $addon_quiz_settings[ $submitted_data['multi_id'] ] );
|
412 |
+
$this->save_quiz_settings_values( $addon_quiz_settings );
|
413 |
+
}
|
414 |
+
}
|
415 |
+
|
416 |
+
/**
|
417 |
+
* Check if multi_id quiz settings values completed
|
418 |
+
*
|
419 |
+
* @since 1.6.2
|
420 |
+
*
|
421 |
+
* @param $multi_id
|
422 |
+
*
|
423 |
+
* @return bool
|
424 |
+
*/
|
425 |
+
public function is_multi_quiz_settings_complete( $multi_id ) {
|
426 |
+
$data = array( 'multi_id' => $multi_id );
|
427 |
+
|
428 |
+
if ( ! $this->setup_webhook_url_is_completed( $data ) ) {
|
429 |
+
return false;
|
430 |
+
}
|
431 |
+
|
432 |
+
return true;
|
433 |
+
}
|
434 |
+
}
|
addons/pro/webhook/class-forminator-addon-webhook.php
ADDED
@@ -0,0 +1,437 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
require_once dirname( __FILE__ ) . '/class-forminator-addon-webhook-exception.php';
|
4 |
+
require_once dirname( __FILE__ ) . '/lib/class-forminator-addon-webhook-wp-api.php';
|
5 |
+
|
6 |
+
/**
|
7 |
+
* Class Forminator_Addon_Webhook
|
8 |
+
* Webhook Addon Main Class
|
9 |
+
*
|
10 |
+
*
|
11 |
+
*/
|
12 |
+
final class Forminator_Addon_Webhook extends Forminator_Addon_Abstract {
|
13 |
+
|
14 |
+
/**
|
15 |
+
* @var self|null
|
16 |
+
*/
|
17 |
+
private static $_instance = null;
|
18 |
+
|
19 |
+
protected $_slug = 'webhook';
|
20 |
+
protected $_version = FORMINATOR_ADDON_WEBHOOK_VERSION;
|
21 |
+
protected $_min_forminator_version = '1.1';
|
22 |
+
protected $_short_title = 'Webhook';
|
23 |
+
protected $_title = 'Webhook';
|
24 |
+
protected $_url = 'https://wpmudev.com';
|
25 |
+
protected $_full_path = __FILE__;
|
26 |
+
protected $_documentation = 'https://wpmudev.com/docs/wpmu-dev-plugins/forminator/#zapier';
|
27 |
+
|
28 |
+
protected $_form_settings = 'Forminator_Addon_Webhook_Form_Settings';
|
29 |
+
protected $_form_hooks = 'Forminator_Addon_Webhook_Form_Hooks';
|
30 |
+
|
31 |
+
protected $_poll_settings = 'Forminator_Addon_Webhook_Poll_Settings';
|
32 |
+
protected $_poll_hooks = 'Forminator_Addon_Webhook_Poll_Hooks';
|
33 |
+
|
34 |
+
protected $_quiz_settings = 'Forminator_Addon_Webhook_Quiz_Settings';
|
35 |
+
protected $_quiz_hooks = 'Forminator_Addon_Webhook_Quiz_Hooks';
|
36 |
+
protected $_position = 0;
|
37 |
+
|
38 |
+
/**
|
39 |
+
* Forminator_Addon_Webhook constructor.
|
40 |
+
*
|
41 |
+
*
|
42 |
+
*/
|
43 |
+
public function __construct() {
|
44 |
+
// late init to allow translation.
|
45 |
+
$this->_description = __( 'Get awesome by your form.', 'forminator' );
|
46 |
+
$doc_description = forminator_is_show_addons_documentation_link() ?
|
47 |
+
sprintf(
|
48 |
+
/* translators: 1: article anchor start, 2: article anchor end. */
|
49 |
+
__( ' Check this %1$sarticle%2$s for tips and tricks on using webhooks integration and creating automated workflows.', 'forminator' ),
|
50 |
+
'<a href="https://wpmudev.com/blog/zapier-wordpress-form-integrations/" target="_blank">',
|
51 |
+
'</a>'
|
52 |
+
) : '';
|
53 |
+
$this->_promotion = sprintf(
|
54 |
+
/* translators: 1: Zapier link 2. Closing a tag 3. Integrately link 4. Tray.io link 5. Make.com link 6. Workato link 7. Additional text */
|
55 |
+
__( 'Connect Forminator with automation tools through webhook. You can use this to send submissions to automation apps like %1$sZapier%2$s, %3$sIntegrately%2$s, %4$sTray.io%2$s, %5$sMake%2$s, %6$sWorkato%2$s, and other automation tools that support webhooks. %7$s Happy automation!', 'forminator' ),
|
56 |
+
'<a href="https://zapier.com/" target="_blank">',
|
57 |
+
'</a>',
|
58 |
+
'<a href="https://integrately.com/" target="_blank">',
|
59 |
+
'<a href="https://tray.io/" target="_blank">',
|
60 |
+
'<a href="https://www.make.com/" target="_blank">',
|
61 |
+
'<a href="https://www.workato.com/" target="_blank">',
|
62 |
+
$doc_description
|
63 |
+
);
|
64 |
+
|
65 |
+
$this->_activation_error_message = __( 'Sorry but we failed to activate Webhook Integration, don\'t hesitate to contact us', 'forminator' );
|
66 |
+
$this->_deactivation_error_message = __( 'Sorry but we failed to deactivate Webhook Integration, please try again', 'forminator' );
|
67 |
+
|
68 |
+
$this->_update_settings_error_message = __(
|
69 |
+
'Sorry, we failed to update settings, please check your form and try again',
|
70 |
+
'forminator'
|
71 |
+
);
|
72 |
+
|
73 |
+
$this->_icon = forminator_addon_webhook_assets_url() . 'icons/webhook.png';
|
74 |
+
$this->_icon_x2 = forminator_addon_webhook_assets_url() . 'icons/webhook@2x.png';
|
75 |
+
$this->_image = forminator_addon_webhook_assets_url() . 'img/webhook.png';
|
76 |
+
$this->_image_x2 = forminator_addon_webhook_assets_url() . 'img/webhook@2x.png';
|
77 |
+
$this->_banner = forminator_addon_webhook_assets_url() . 'img/banner.png';
|
78 |
+
$this->_banner_x2 = forminator_addon_webhook_assets_url() . 'img/banner@2x.png';
|
79 |
+
}
|
80 |
+
|
81 |
+
/**
|
82 |
+
* Get Instance
|
83 |
+
*
|
84 |
+
*
|
85 |
+
* @return self|null
|
86 |
+
*/
|
87 |
+
public static function get_instance() {
|
88 |
+
if ( is_null( self::$_instance ) ) {
|
89 |
+
self::$_instance = new self();
|
90 |
+
}
|
91 |
+
|
92 |
+
return self::$_instance;
|
93 |
+
}
|
94 |
+
|
95 |
+
/**
|
96 |
+
* Setting apier Addon
|
97 |
+
*
|
98 |
+
*
|
99 |
+
* @return array
|
100 |
+
*/
|
101 |
+
public function settings_wizards() {
|
102 |
+
return array(
|
103 |
+
array(
|
104 |
+
'callback' => array( $this, 'setup_connect' ),
|
105 |
+
'is_completed' => array( $this, 'is_connected' ),
|
106 |
+
),
|
107 |
+
);
|
108 |
+
}
|
109 |
+
|
110 |
+
/**
|
111 |
+
* Activate Webhook
|
112 |
+
*
|
113 |
+
*
|
114 |
+
*
|
115 |
+
* @param $submitted_data
|
116 |
+
* @param int $form_id
|
117 |
+
*
|
118 |
+
* @return array
|
119 |
+
*/
|
120 |
+
public function setup_connect( $submitted_data, $form_id = 0 ) {
|
121 |
+
$settings_values = $this->get_settings_values();
|
122 |
+
|
123 |
+
$template = forminator_addon_webhook_dir() . 'views/settings/setup-connect.php';
|
124 |
+
$template_success = forminator_addon_webhook_dir() . 'views/settings/setup-connect-success.php';
|
125 |
+
|
126 |
+
$template_params = array(
|
127 |
+
'is_connected' => $this->is_connected(),
|
128 |
+
'error_message' => '',
|
129 |
+
);
|
130 |
+
|
131 |
+
$has_errors = false;
|
132 |
+
$show_success = false;
|
133 |
+
$is_submit = ! empty( $submitted_data );
|
134 |
+
|
135 |
+
foreach ( $template_params as $key => $value ) {
|
136 |
+
if ( isset( $submitted_data[ $key ] ) ) {
|
137 |
+
$template_params[ $key ] = $submitted_data[ $key ];
|
138 |
+
} elseif ( isset( $settings_values[ $key ] ) ) {
|
139 |
+
$template_params[ $key ] = $settings_values[ $key ];
|
140 |
+
}
|
141 |
+
}
|
142 |
+
|
143 |
+
if ( $is_submit ) {
|
144 |
+
$connect = isset( $submitted_data['connect'] ) ? $submitted_data['connect'] : '';
|
145 |
+
|
146 |
+
try {
|
147 |
+
if ( empty( $connect ) ) {
|
148 |
+
throw new Forminator_Addon_Webhook_Exception( __( 'Please Connect Webhook', 'forminator' ) );
|
149 |
+
}
|
150 |
+
|
151 |
+
if ( ! forminator_addon_is_active( $this->_slug ) ) {
|
152 |
+
$activated = Forminator_Addon_Loader::get_instance()->activate_addon( $this->_slug );
|
153 |
+
if ( ! $activated ) {
|
154 |
+
throw new Forminator_Addon_Webhook_Exception( Forminator_Addon_Loader::get_instance()->get_last_error_message() );
|
155 |
+
}
|
156 |
+
}
|
157 |
+
// no form_id its on global settings.
|
158 |
+
if ( empty( $form_id ) ) {
|
159 |
+
$show_success = true;
|
160 |
+
}
|
161 |
+
} catch ( Forminator_Addon_Webhook_Exception $e ) {
|
162 |
+
$template_params['error_message'] = $e->getMessage();
|
163 |
+
$has_errors = true;
|
164 |
+
}
|
165 |
+
}
|
166 |
+
|
167 |
+
if ( $show_success ) {
|
168 |
+
$template = $template_success;
|
169 |
+
}
|
170 |
+
|
171 |
+
$buttons = array();
|
172 |
+
|
173 |
+
if ( $show_success ) {
|
174 |
+
$buttons['close'] = array(
|
175 |
+
'markup' => self::get_button_markup( esc_html__( 'Close', 'forminator' ), 'sui-button-ghost forminator-addon-close forminator-integration-popup__close' ),
|
176 |
+
);
|
177 |
+
} else {
|
178 |
+
if ( $this->is_connected() ) {
|
179 |
+
$buttons['disconnect'] = array(
|
180 |
+
'markup' => self::get_button_markup( esc_html__( 'Disconnect', 'forminator' ), 'sui-button-ghost forminator-addon-disconnect forminator-integration-popup__close' ),
|
181 |
+
);
|
182 |
+
} else {
|
183 |
+
$buttons['submit'] = array(
|
184 |
+
'markup' => self::get_button_markup( esc_html__( 'Activate', 'forminator' ), 'forminator-addon-connect forminator-integration-popup__close' ),
|
185 |
+
);
|
186 |
+
}
|
187 |
+
}
|
188 |
+
|
189 |
+
return array(
|
190 |
+
'html' => self::get_template( $template, $template_params ),
|
191 |
+
'buttons' => $buttons,
|
192 |
+
'redirect' => false,
|
193 |
+
'has_errors' => $has_errors,
|
194 |
+
);
|
195 |
+
}
|
196 |
+
|
197 |
+
/**
|
198 |
+
* Override on is_connected
|
199 |
+
*
|
200 |
+
*
|
201 |
+
* @since 1.1 Disable auto activate
|
202 |
+
*
|
203 |
+
* @return bool
|
204 |
+
*/
|
205 |
+
public function is_connected() {
|
206 |
+
try {
|
207 |
+
// check if its active.
|
208 |
+
if ( ! $this->is_active() ) {
|
209 |
+
throw new Forminator_Addon_Webhook_Exception( __( 'Webhook is not active', 'forminator' ) );
|
210 |
+
}
|
211 |
+
$is_connected = true;
|
212 |
+
} catch ( Forminator_Addon_Webhook_Exception $e ) {
|
213 |
+
$is_connected = false;
|
214 |
+
}
|
215 |
+
|
216 |
+
/**
|
217 |
+
* Filter connected status ofwebhook
|
218 |
+
*
|
219 |
+
* @since 1.1
|
220 |
+
*
|
221 |
+
* @param bool $is_connected
|
222 |
+
*/
|
223 |
+
$is_connected = apply_filters_deprecated( 'forminator_addon_zapier_is_connected', array( $is_connected ), '1.18.0', 'forminator_addon_webhook_is_connected' );
|
224 |
+
$is_connected = apply_filters( 'forminator_addon_webhook_is_connected', $is_connected );
|
225 |
+
|
226 |
+
return $is_connected;
|
227 |
+
}
|
228 |
+
|
229 |
+
/**
|
230 |
+
* Check ifwebhook is connected with current form
|
231 |
+
*
|
232 |
+
* @since 1.0 Webhook Addon
|
233 |
+
*
|
234 |
+
* @param $form_id
|
235 |
+
*
|
236 |
+
* @return bool
|
237 |
+
*/
|
238 |
+
public function is_form_connected( $form_id ) {
|
239 |
+
try {
|
240 |
+
$form_settings_instance = null;
|
241 |
+
if ( ! $this->is_connected() ) {
|
242 |
+
throw new Forminator_Addon_Webhook_Exception( __( 'Webhook is not connected', 'forminator' ) );
|
243 |
+
}
|
244 |
+
|
245 |
+
$form_settings_instance = $this->get_addon_settings( $form_id, 'form' );
|
246 |
+
if ( ! $form_settings_instance instanceof Forminator_Addon_Webhook_Form_Settings ) {
|
247 |
+
throw new Forminator_Addon_Webhook_Exception( __( 'Invalid Form Settings of Webhook', 'forminator' ) );
|
248 |
+
}
|
249 |
+
|
250 |
+
// Mark as active when there is at least one active connection.
|
251 |
+
if ( false === $form_settings_instance->find_one_active_connection() ) {
|
252 |
+
throw new Forminator_Addon_Webhook_Exception( __( 'No active Webhook connection found in this form', 'forminator' ) );
|
253 |
+
}
|
254 |
+
|
255 |
+
$is_form_connected = true;
|
256 |
+
|
257 |
+
} catch ( Forminator_Addon_Webhook_Exception $e ) {
|
258 |
+
$is_form_connected = false;
|
259 |
+
forminator_addon_maybe_log( __METHOD__, $e->getMessage() );
|
260 |
+
}
|
261 |
+
|
262 |
+
/**
|
263 |
+
* Filter connected status ofwebhook with the form
|
264 |
+
*
|
265 |
+
* @since 1.1
|
266 |
+
*
|
267 |
+
* @param bool $is_form_connected
|
268 |
+
* @param int $form_id Current Form ID.
|
269 |
+
* @param Forminator_Addon_Webhook_Form_Settings|null $form_settings_instance Instance of form settings, or null when unavailable.
|
270 |
+
*
|
271 |
+
*/
|
272 |
+
$is_form_connected = apply_filters_deprecated( 'forminator_addon_zapier_is_form_connected', array( $is_form_connected, $form_id, $form_settings_instance ), '1.18.0', 'forminator_addon_webhook_is_form_connected' );
|
273 |
+
$is_form_connected = apply_filters( 'forminator_addon_webhook_is_form_connected', $is_form_connected, $form_id, $form_settings_instance );
|
274 |
+
|
275 |
+
return $is_form_connected;
|
276 |
+
}
|
277 |
+
|
278 |
+
/**
|
279 |
+
* Get Webhook API
|
280 |
+
*
|
281 |
+
*
|
282 |
+
*
|
283 |
+
* @param string $endpoint
|
284 |
+
*
|
285 |
+
* @return Forminator_Addon_Webhook_Wp_Api|null
|
286 |
+
* @throws Forminator_Addon_Webhook_Wp_Api_Exception
|
287 |
+
*/
|
288 |
+
public function get_api( $endpoint ) {
|
289 |
+
return Forminator_Addon_Webhook_Wp_Api::get_instance( $endpoint );
|
290 |
+
}
|
291 |
+
|
292 |
+
/**
|
293 |
+
* Flag show full log on entries
|
294 |
+
*
|
295 |
+
*
|
296 |
+
* @return bool
|
297 |
+
*/
|
298 |
+
public static function is_show_full_log() {
|
299 |
+
if ( defined( 'FORMINATOR_ADDON_WEBHOOK_SHOW_FULL_LOG' ) && FORMINATOR_ADDON_WEBHOOK_SHOW_FULL_LOG ) {
|
300 |
+
return true;
|
301 |
+
}
|
302 |
+
|
303 |
+
return false;
|
304 |
+
}
|
305 |
+
|
306 |
+
/**
|
307 |
+
* Allow multiple connection on one form
|
308 |
+
*
|
309 |
+
*
|
310 |
+
* @return bool
|
311 |
+
*/
|
312 |
+
public function is_allow_multi_on_form() {
|
313 |
+
return true;
|
314 |
+
}
|
315 |
+
|
316 |
+
/**
|
317 |
+
* Flag for check if and addon connected to a poll(poll settings such as list id completed)
|
318 |
+
*
|
319 |
+
* Please apply necessary WordPress hook on the inheritance class
|
320 |
+
*
|
321 |
+
* @since 1.6.1
|
322 |
+
*
|
323 |
+
* @param $poll_id
|
324 |
+
*
|
325 |
+
* @return boolean
|
326 |
+
*/
|
327 |
+
public function is_poll_connected( $poll_id ) {
|
328 |
+
try {
|
329 |
+
$poll_settings_instance = null;
|
330 |
+
if ( ! $this->is_connected() ) {
|
331 |
+
throw new Forminator_Addon_Webhook_Exception( 'Webhook is not connected' );
|
332 |
+
}
|
333 |
+
|
334 |
+
$poll_settings_instance = $this->get_addon_settings( $poll_id, 'poll' );
|
335 |
+
if ( ! $poll_settings_instance instanceof Forminator_Addon_Webhook_Poll_Settings ) {
|
336 |
+
throw new Forminator_Addon_Webhook_Exception( 'Webhook Poll Settings of Trello' );
|
337 |
+
}
|
338 |
+
|
339 |
+
// Mark as active when there is at least one active connection.
|
340 |
+
if ( false === $poll_settings_instance->find_one_active_connection() ) {
|
341 |
+
throw new Forminator_Addon_Webhook_Exception( 'No active Poll connection found in this poll' );
|
342 |
+
}
|
343 |
+
|
344 |
+
$is_poll_connected = true;
|
345 |
+
|
346 |
+
} catch ( Forminator_Addon_Webhook_Exception $e ) {
|
347 |
+
|
348 |
+
$is_poll_connected = false;
|
349 |
+
}
|
350 |
+
|
351 |
+
/**
|
352 |
+
* Filter connected status Webhook with the poll
|
353 |
+
*
|
354 |
+
* @since 1.6.1
|
355 |
+
*
|
356 |
+
* @param bool $is_poll_connected
|
357 |
+
* @param int $poll_id Current Poll ID.
|
358 |
+
* @param Forminator_Addon_Trello_Poll_Settings|null $poll_settings_instance Instance of poll settings, or null when unavailable.
|
359 |
+
*
|
360 |
+
*/
|
361 |
+
$is_poll_connected = apply_filters_deprecated( 'forminator_addon_zapier_is_poll_connected', array( $is_poll_connected, $poll_id, $poll_settings_instance ), '1.18.0', 'forminator_addon_webhook_is_poll_connected' );
|
362 |
+
$is_poll_connected = apply_filters( 'forminator_addon_webhook_is_poll_connected', $is_poll_connected, $poll_id, $poll_settings_instance );
|
363 |
+
|
364 |
+
return $is_poll_connected;
|
365 |
+
}
|
366 |
+
|
367 |
+
/**
|
368 |
+
* Allow multiple connection on one poll
|
369 |
+
*
|
370 |
+
* @since 1.6.1
|
371 |
+
* @return bool
|
372 |
+
*/
|
373 |
+
public function is_allow_multi_on_poll() {
|
374 |
+
return true;
|
375 |
+
}
|
376 |
+
|
377 |
+
/**
|
378 |
+
* Flag for check if and addon connected to a quiz(quiz settings such as list id completed)
|
379 |
+
*
|
380 |
+
* Please apply necessary WordPress hook on the inheritance class
|
381 |
+
*
|
382 |
+
* @since 1.6.2
|
383 |
+
*
|
384 |
+
* @param $quiz_id
|
385 |
+
*
|
386 |
+
* @return boolean
|
387 |
+
*/
|
388 |
+
public function is_quiz_connected( $quiz_id ) {
|
389 |
+
try {
|
390 |
+
$quiz_settings_instance = null;
|
391 |
+
if ( ! $this->is_connected() ) {
|
392 |
+
throw new Forminator_Addon_Webhook_Exception( 'Webhook is not connected' );
|
393 |
+
}
|
394 |
+
|
395 |
+
$quiz_settings_instance = $this->get_addon_settings( $quiz_id, 'quiz' );
|
396 |
+
if ( ! $quiz_settings_instance instanceof Forminator_Addon_Webhook_Quiz_Settings ) {
|
397 |
+
throw new Forminator_Addon_Webhook_Exception( 'Webhook Quiz Settings of Trello' );
|
398 |
+
}
|
399 |
+
|
400 |
+
// Mark as active when there is at least one active connection.
|
401 |
+
if ( false === $quiz_settings_instance->find_one_active_connection() ) {
|
402 |
+
throw new Forminator_Addon_Webhook_Exception( 'No active Webhook connection found in this quiz' );
|
403 |
+
}
|
404 |
+
|
405 |
+
$is_quiz_connected = true;
|
406 |
+
|
407 |
+
} catch ( Forminator_Addon_Webhook_Exception $e ) {
|
408 |
+
|
409 |
+
$is_quiz_connected = false;
|
410 |
+
}
|
411 |
+
|
412 |
+
/**
|
413 |
+
* Filter connected status Webhook with the quiz
|
414 |
+
*
|
415 |
+
* @since 1.6.2
|
416 |
+
*
|
417 |
+
* @param bool $is_quiz_connected
|
418 |
+
* @param int $quiz_id Current Quiz ID.
|
419 |
+
* @param Forminator_Addon_Trello_Quiz_Settings|null $quiz_settings_instance Instance of quiz settings, or null when unavailable.
|
420 |
+
*
|
421 |
+
*/
|
422 |
+
$is_quiz_connected = apply_filters_deprecated( 'forminator_addon_zapier_is_quiz_connected', array( $is_quiz_connected, $quiz_id, $quiz_settings_instance ), '1.18.0', 'forminator_addon_webhook_is_quiz_connected' );
|
423 |
+
$is_quiz_connected = apply_filters( 'forminator_addon_webhook_is_quiz_connected', $is_quiz_connected, $quiz_id, $quiz_settings_instance );
|
424 |
+
|
425 |
+
return $is_quiz_connected;
|
426 |
+
}
|
427 |
+
|
428 |
+
/**
|
429 |
+
* Allow multiple connection on one quiz
|
430 |
+
*
|
431 |
+
* @since 1.6.2
|
432 |
+
* @return bool
|
433 |
+
*/
|
434 |
+
public function is_allow_multi_on_quiz() {
|
435 |
+
return true;
|
436 |
+
}
|
437 |
+
}
|
addons/pro/webhook/lib/class-forminator-addon-webhook-wp-api-exception.php
ADDED
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/**
|
4 |
+
* Class Forminator_Addon_Webhook_Wp_Api_Exception
|
5 |
+
* Exception holder forwebhook wp api
|
6 |
+
*
|
7 |
+
*
|
8 |
+
*/
|
9 |
+
class Forminator_Addon_Webhook_Wp_Api_Exception extends Forminator_Addon_Webhook_Exception {
|
10 |
+
}
|
addons/pro/webhook/lib/class-forminator-addon-webhook-wp-api-not-found-exception.php
ADDED
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/**
|
4 |
+
* Class Forminator_Addon_Webhook_Wp_Api_Not_Found_Exception
|
5 |
+
* Exception holder forwebhook wp api on 404 not found error status
|
6 |
+
*
|
7 |
+
*
|
8 |
+
*/
|
9 |
+
class Forminator_Addon_Webhook_Wp_Api_Not_Found_Exception extends Forminator_Addon_Webhook_Wp_Api_Exception {
|
10 |
+
}
|
addons/pro/webhook/lib/class-forminator-addon-webhook-wp-api.php
ADDED
@@ -0,0 +1,316 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
require_once dirname( __FILE__ ) . '/class-forminator-addon-webhook-wp-api-exception.php';
|
4 |
+
require_once dirname( __FILE__ ) . '/class-forminator-addon-webhook-wp-api-not-found-exception.php';
|
5 |
+
|
6 |
+
/**
|
7 |
+
* Class Forminator_Addon_Webhook_Wp_Api
|
8 |
+
*/
|
9 |
+
class Forminator_Addon_Webhook_Wp_Api {
|
10 |
+
|
11 |
+
/**
|
12 |
+
* Instances ofwebhook api
|
13 |
+
* key is md5(_endpoint)
|
14 |
+
*
|
15 |
+
* @var array
|
16 |
+
*/
|
17 |
+
private static $_instances = array();
|
18 |
+
|
19 |
+
/**
|
20 |
+
* Webhook endpoint of static webhook
|
21 |
+
*
|
22 |
+
* @var string
|
23 |
+
*/
|
24 |
+
private $_endpoint = '';
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Last data sent towebhook
|
28 |
+
*
|
29 |
+
*
|
30 |
+
* @var array
|
31 |
+
*/
|
32 |
+
private $_last_data_sent = array();
|
33 |
+
|
34 |
+
/**
|
35 |
+
* Last data received fromwebhook
|
36 |
+
*
|
37 |
+
*
|
38 |
+
* @var array
|
39 |
+
*/
|
40 |
+
private $_last_data_received = array();
|
41 |
+
|
42 |
+
/**
|
43 |
+
* Last URL requested
|
44 |
+
*
|
45 |
+
*
|
46 |
+
* @var string
|
47 |
+
*/
|
48 |
+
private $_last_url_request = '';
|
49 |
+
|
50 |
+
/**
|
51 |
+
* Forminator_Addon_Webhook_Wp_Api constructor.
|
52 |
+
*
|
53 |
+
*
|
54 |
+
*
|
55 |
+
* @param $_endpoint
|
56 |
+
*
|
57 |
+
* @throws Forminator_Addon_Webhook_Wp_Api_Exception
|
58 |
+
*/
|
59 |
+
public function __construct( $_endpoint ) {
|
60 |
+
global $wpdb;
|
61 |
+
$wpdb->last_error;
|
62 |
+
//prerequisites
|
63 |
+
if ( ! $_endpoint ) {
|
64 |
+
throw new Forminator_Addon_Webhook_Wp_Api_Exception( __( 'Missing required Static Webhook URL', 'forminator' ) );
|
65 |
+
}
|
66 |
+
|
67 |
+
$this->_endpoint = $_endpoint;
|
68 |
+
}
|
69 |
+
|
70 |
+
/**
|
71 |
+
* Get singleton
|
72 |
+
*
|
73 |
+
*
|
74 |
+
*
|
75 |
+
* @param string $_endpoint
|
76 |
+
*
|
77 |
+
* @return Forminator_Addon_Webhook_Wp_Api|null
|
78 |
+
* @throws Forminator_Addon_Webhook_Wp_Api_Exception
|
79 |
+
*/
|
80 |
+
public static function get_instance( $_endpoint ) {
|
81 |
+
if ( ! isset( self::$_instances[ md5( $_endpoint ) ] ) ) {
|
82 |
+
self::$_instances[ md5( $_endpoint ) ] = new self( $_endpoint );
|
83 |
+
}
|
84 |
+
|
85 |
+
return self::$_instances[ md5( $_endpoint ) ];
|
86 |
+
}
|
87 |
+
|
88 |
+
/**
|
89 |
+
* Add custom user agent on request
|
90 |
+
*
|
91 |
+
*
|
92 |
+
*
|
93 |
+
* @param $user_agent
|
94 |
+
*
|
95 |
+
* @return string
|
96 |
+
*/
|
97 |
+
public function filter_user_agent( $user_agent ) {
|
98 |
+
$user_agent .= ' ForminatorWebhook/' . FORMINATOR_ADDON_WEBHOOK_VERSION;
|
99 |
+
|
100 |
+
/**
|
101 |
+
* Filter user agent to be used bywebhook api
|
102 |
+
*
|
103 |
+
* @since 1.1
|
104 |
+
*
|
105 |
+
* @param string $user_agent current user agent.
|
106 |
+
*/
|
107 |
+
$user_agent = apply_filters_deprecated( 'forminator_addon_zapier_api_user_agent', array( $user_agent ), '1.18.0', 'forminator_addon_webhook_api_user_agent' );
|
108 |
+
$user_agent = apply_filters( 'forminator_addon_webhook_api_user_agent', $user_agent );
|
109 |
+
|
110 |
+
return $user_agent;
|
111 |
+
}
|
112 |
+
|
113 |
+
/**
|
114 |
+
* HTTP Request
|
115 |
+
*
|
116 |
+
*
|
117 |
+
*
|
118 |
+
* @param string $verb
|
119 |
+
* @param $path
|
120 |
+
* @param array $args
|
121 |
+
*
|
122 |
+
* @return array|mixed|object
|
123 |
+
* @throws Forminator_Addon_Webhook_Wp_Api_Exception
|
124 |
+
* @throws Forminator_Addon_Webhook_Wp_Api_Not_Found_Exception
|
125 |
+
*/
|
126 |
+
private function request( $verb, $path, $args = array() ) {
|
127 |
+
// Adding extra user agent for wp remote request.
|
128 |
+
add_filter( 'http_headers_useragent', array( $this, 'filter_user_agent' ) );
|
129 |
+
|
130 |
+
$url = trailingslashit( $this->_endpoint ) . $path;
|
131 |
+
$verb = ! empty( $verb ) ? $verb : 'GET';
|
132 |
+
|
133 |
+
/**
|
134 |
+
* Filterwebhook url to be used on sending api request
|
135 |
+
*
|
136 |
+
* @since 1.1
|
137 |
+
*
|
138 |
+
* @param string $url full url with scheme.
|
139 |
+
* @param string $verb `GET` `POST` `PUT` `DELETE` `PATCH`.
|
140 |
+
* @param string $path requested path resource.
|
141 |
+
* @param array $args argument sent to this function.
|
142 |
+
*/
|
143 |
+
$url = apply_filters_deprecated( 'forminator_addon_zapier_api_url', array( $url, $verb, $path, $args ), '1.18.0', 'forminator_addon_webhook_api_url' );
|
144 |
+
$url = apply_filters( 'forminator_addon_webhook_api_url', $url, $verb, $path, $args );
|
145 |
+
|
146 |
+
$this->_last_url_request = $url;
|
147 |
+
|
148 |
+
$headers = array(
|
149 |
+
'Accept' => 'application/json',
|
150 |
+
'Content-Type' => 'application/json',
|
151 |
+
);
|
152 |
+
|
153 |
+
/**
|
154 |
+
* Filterwebhook headers to sent on api request
|
155 |
+
*
|
156 |
+
* @since 1.1
|
157 |
+
*
|
158 |
+
* @param array $headers
|
159 |
+
* @param string $verb `GET` `POST` `PUT` `DELETE` `PATCH`.
|
160 |
+
* @param string $path requested path resource.
|
161 |
+
* @param array $args argument sent to this function.
|
162 |
+
*/
|
163 |
+
$headers = apply_filters_deprecated( 'forminator_addon_zapier_api_request_headers', array( $headers, $verb, $path, $args ), '1.18.0', 'forminator_addon_webhook_api_request_headers' );
|
164 |
+
$headers = apply_filters( 'forminator_addon_webhook_api_request_headers', $headers, $verb, $path, $args );
|
165 |
+
|
166 |
+
$_args = array(
|
167 |
+
'method' => $verb,
|
168 |
+
'headers' => $headers,
|
169 |
+
);
|
170 |
+
|
171 |
+
// X-Hook-Test handler.
|
172 |
+
if ( isset( $args['is_test'] ) ) {
|
173 |
+
if ( true === $args['is_test'] ) {
|
174 |
+
// Add `X-Hook-Test` header to avoid execute task onwebhook.
|
175 |
+
$_args['headers']['X-Hook-Test'] = 'true';
|
176 |
+
}
|
177 |
+
// always unset when exist.
|
178 |
+
unset( $args['is_test'] );
|
179 |
+
}
|
180 |
+
|
181 |
+
$request_data = $args;
|
182 |
+
/**
|
183 |
+
* Filterwebhook request data to be used on sending api request
|
184 |
+
*
|
185 |
+
* @since 1.1
|
186 |
+
*
|
187 |
+
* @param array $request_data it will be `http_build_query`-ed when `GET` or `wp_json_encode`-ed otherwise.
|
188 |
+
* @param string $verb `GET` `POST` `PUT` `DELETE` `PATCH`.
|
189 |
+
* @param string $path requested path resource.
|
190 |
+
*/
|
191 |
+
$args = apply_filters_deprecated( 'forminator_addon_zapier_api_request_data', array( $request_data, $verb, $path ), '1.18.0', 'forminator_addon_webhook_api_request_data' );
|
192 |
+
$args = apply_filters( 'forminator_addon_webhook_api_request_data', $args, $verb, $path );
|
193 |
+
|
194 |
+
if ( 'GET' === $verb ) {
|
195 |
+
$url .= ( '?' . http_build_query( $args ) );
|
196 |
+
} else {
|
197 |
+
$_args['body'] = wp_json_encode( $args );
|
198 |
+
}
|
199 |
+
|
200 |
+
$this->_last_data_sent = $args;
|
201 |
+
|
202 |
+
$res = wp_remote_request( $url, $_args );
|
203 |
+
$wp_response = $res;
|
204 |
+
|
205 |
+
remove_filter( 'http_headers_useragent', array( $this, 'filter_user_agent' ) );
|
206 |
+
|
207 |
+
if ( is_wp_error( $res ) || ! $res ) {
|
208 |
+
forminator_addon_maybe_log( __METHOD__, $res );
|
209 |
+
throw new Forminator_Addon_Webhook_Wp_Api_Exception(
|
210 |
+
__( 'Failed to process request, make sure your Webhook URL is correct and your server has internet connection.', 'forminator' )
|
211 |
+
);
|
212 |
+
}
|
213 |
+
|
214 |
+
if ( isset( $res['response']['code'] ) ) {
|
215 |
+
$status_code = $res['response']['code'];
|
216 |
+
$msg = '';
|
217 |
+
if ( $status_code >= 400 ) {
|
218 |
+
if ( isset( $res['response']['message'] ) ) {
|
219 |
+
$msg = $res['response']['message'];
|
220 |
+
}
|
221 |
+
|
222 |
+
if ( strpos( $url, 'trayapp.io' ) ) {
|
223 |
+
throw new Forminator_Addon_Webhook_Wp_Api_Exception( esc_html__( 'Failed to process request : Enable Tray.io workflow first', 'forminator' ) );
|
224 |
+
}
|
225 |
+
|
226 |
+
if ( 404 === $status_code ) {
|
227 |
+
/* translators: ... */
|
228 |
+
throw new Forminator_Addon_Webhook_Wp_Api_Not_Found_Exception( sprintf( __( 'Failed to process request : %s', 'forminator' ), $msg ) );
|
229 |
+
}
|
230 |
+
/* translators: ... */
|
231 |
+
throw new Forminator_Addon_Webhook_Wp_Api_Exception( sprintf( __( 'Failed to process request : %s', 'forminator' ), $msg ) );
|
232 |
+
}
|
233 |
+
}
|
234 |
+
|
235 |
+
$body = wp_remote_retrieve_body( $res );
|
236 |
+
|
237 |
+
// probably silent mode.
|
238 |
+
if ( ! empty( $body ) ) {
|
239 |
+
$res = json_decode( $body );
|
240 |
+
}
|
241 |
+
|
242 |
+
$response = $res;
|
243 |
+
/**
|
244 |
+
* Filterwebhook api response returned to addon
|
245 |
+
*
|
246 |
+
* @since 1.1
|
247 |
+
*
|
248 |
+
* @param mixed $response original wp remote request response or decoded body if available.
|
249 |
+
* @param string $body original content of http response's body.
|
250 |
+
* @param array|WP_Error $wp_response original wp remote request response.
|
251 |
+
*/
|
252 |
+
$res = apply_filters_deprecated( 'forminator_addon_zapier_api_response', array( $response, $body, $wp_response ), '1.18.0', 'forminator_addon_webhook_api_response' );
|
253 |
+
$res = apply_filters( 'forminator_addon_webhook_api_response', $res, $body, $wp_response );
|
254 |
+
|
255 |
+
$this->_last_data_received = $res;
|
256 |
+
|
257 |
+
forminator_addon_maybe_log( $res );
|
258 |
+
|
259 |
+
return $res;
|
260 |
+
}
|
261 |
+
|
262 |
+
|
263 |
+
/**
|
264 |
+
* Send data to static webhookwebhook URL
|
265 |
+
*
|
266 |
+
*
|
267 |
+
*
|
268 |
+
* @param $args
|
269 |
+
* add `is_test` => true to add `X-Hook-Test: true`
|
270 |
+
*
|
271 |
+
* @return array|mixed|object
|
272 |
+
* @throws Forminator_Addon_Webhook_Wp_Api_Exception
|
273 |
+
* @throws Forminator_Addon_Webhook_Wp_Api_Not_Found_Exception
|
274 |
+
*/
|
275 |
+
public function post_( $args ) {
|
276 |
+
|
277 |
+
return $this->request(
|
278 |
+
'POST',
|
279 |
+
'',
|
280 |
+
$args
|
281 |
+
);
|
282 |
+
}
|
283 |
+
|
284 |
+
/**
|
285 |
+
* Get last data sent
|
286 |
+
*
|
287 |
+
*
|
288 |
+
*
|
289 |
+
* @return array
|
290 |
+
*/
|
291 |
+
public function get_last_data_sent() {
|
292 |
+
return $this->_last_data_sent;
|
293 |
+
}
|
294 |
+
|
295 |
+
/**
|
296 |
+
* Get last data received
|
297 |
+
*
|
298 |
+
*
|
299 |
+
*
|
300 |
+
* @return array
|
301 |
+
*/
|
302 |
+
public function get_last_data_received() {
|
303 |
+
return $this->_last_data_received;
|
304 |
+
}
|
305 |
+
|
306 |
+
/**
|
307 |
+
* Get last data received
|
308 |
+
*
|
309 |
+
*
|
310 |
+
*
|
311 |
+
* @return string
|
312 |
+
*/
|
313 |
+
public function get_last_url_request() {
|
314 |
+
return $this->_last_url_request;
|
315 |
+
}
|
316 |
+
}
|
addons/pro/webhook/views/poll-settings/setup-webhook.php
ADDED
@@ -0,0 +1,101 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
// defaults.
|
3 |
+
$vars = array(
|
4 |
+
'error_message' => '',
|
5 |
+
'name' => '',
|
6 |
+
'name_error' => '',
|
7 |
+
'multi_id' => '',
|
8 |
+
'webhook_url' => '',
|
9 |
+
'webhook_url_error' => '',
|
10 |
+
);
|
11 |
+
/** @var array $template_vars */
|
12 |
+
foreach ( $template_vars as $key => $val ) {
|
13 |
+
$vars[ $key ] = $val;
|
14 |
+
}
|
15 |
+
?>
|
16 |
+
|
17 |
+
<div class="forminator-integration-popup__header">
|
18 |
+
|
19 |
+
<h3 id="forminator-integration-popup__title" class="sui-box-title sui-lg" style="overflow: initial; white-space: normal; text-overflow: initial;">
|
20 |
+
<?php esc_html_e( 'Setup Webhook', 'forminator' ); ?>
|
21 |
+
</h3>
|
22 |
+
|
23 |
+
<p id="forminator-integration-popup__description" class="sui-description">
|
24 |
+
<?php esc_html_e( 'Give your webhook integration a name and add the webhook URL.', 'forminator' ); ?>
|
25 |
+
</p>
|
26 |
+
|
27 |
+
<?php if ( ! empty( $vars['error_message'] ) ) : ?>
|
28 |
+
<div
|
29 |
+
role="alert"
|
30 |
+
class="sui-notice sui-notice-red sui-active"
|
31 |
+
style="display: block; text-align: left;"
|
32 |
+
aria-live="assertive"
|
33 |
+
>
|
34 |
+
|
35 |
+
<div class="sui-notice-content">
|
36 |
+
|
37 |
+
<div class="sui-notice-message">
|
38 |
+
|
39 |
+
<span class="sui-notice-icon sui-icon-info" aria-hidden="true"></span>
|
40 |
+
|
41 |
+
<p><?php echo esc_html( $vars['error_message'] ); ?></p>
|
42 |
+
|
43 |
+
</div>
|
44 |
+
|
45 |
+
</div>
|
46 |
+
|
47 |
+
</div>
|
48 |
+
<?php endif; ?>
|
49 |
+
|
50 |
+
</div>
|
51 |
+
|
52 |
+
<form enctype="multipart/form-data">
|
53 |
+
|
54 |
+
<div class="sui-form-field <?php echo esc_attr( ! empty( $vars['name_error'] ) ? 'sui-form-field-error' : '' ); ?>">
|
55 |
+
<label class="sui-label"><?php esc_html_e( 'Friendly Name', 'forminator' ); ?></label>
|
56 |
+
<div class="sui-control-with-icon">
|
57 |
+
<input type="text"
|
58 |
+
name="name"
|
59 |
+
placeholder="<?php esc_attr_e( 'Enter a friendly name E.g. Zapier to Gmail', 'forminator' ); ?>"
|
60 |
+
value="<?php echo esc_attr( $vars['name'] ); ?>"
|
61 |
+
class="sui-form-control"
|
62 |
+
/>
|
63 |
+
<i class="sui-icon-web-globe-world" aria-hidden="true"></i>
|
64 |
+
</div>
|
65 |
+
<?php if ( ! empty( $vars['name_error'] ) ) : ?>
|
66 |
+
<span class="sui-error-message"><?php echo esc_html( $vars['name_error'] ); ?></span>
|
67 |
+
<?php endif; ?>
|
68 |
+
</div>
|
69 |
+
|
70 |
+
<div class="sui-form-field <?php echo esc_attr( ! empty( $vars['webhook_url_error'] ) ? 'sui-form-field-error' : '' ); ?>" style="margin-bottom: 0;">
|
71 |
+
<label class="sui-label"><?php esc_html_e( 'Webhook URL', 'forminator' ); ?></label>
|
72 |
+
<div class="sui-control-with-icon">
|
73 |
+
<input
|
74 |
+
type="text"
|
75 |
+
name="webhook_url"
|
76 |
+
placeholder="<?php esc_attr_e( 'Enter your webhook URL', 'forminator' ); ?>"
|
77 |
+
value="<?php echo esc_attr( $vars['webhook_url'] ); ?>"
|
78 |
+
class="sui-form-control"/>
|
79 |
+
<i class="sui-icon-link" aria-hidden="true"></i>
|
80 |
+
</div>
|
81 |
+
<?php if ( ! empty( $vars['webhook_url_error'] ) ) : ?>
|
82 |
+
<span class="sui-error-message"><?php echo esc_html( $vars['webhook_url_error'] ); ?></span>
|
83 |
+
<?php endif; ?>
|
84 |
+
|
85 |
+
<?php if ( forminator_is_show_addons_documentation_link() ) : ?>
|
86 |
+
<div class="sui-description">
|
87 |
+
<?php
|
88 |
+
printf(
|
89 |
+
/* translators: 1: article anchor start, 2: article anchor end. */
|
90 |
+
esc_html__( 'Check %1$sour documentation%2$s for more information on using webhook URLs for your preferred automation tools.', 'forminator' ),
|
91 |
+
'<a href="https://wpmudev.com/blog/zapier-wordpress-form-integrations/" target="_blank">',
|
92 |
+
'</a>'
|
93 |
+
);
|
94 |
+
?>
|
95 |
+
</div>
|
96 |
+
<?php endif; ?>
|
97 |
+
</div>
|
98 |
+
|
99 |
+
<input type="hidden" name="multi_id" value="<?php echo esc_attr( $vars['multi_id'] ); ?>">
|
100 |
+
|
101 |
+
</form>
|
addons/pro/webhook/views/quiz-settings/setup-webhook.php
ADDED
@@ -0,0 +1,101 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
// defaults.
|
3 |
+
$vars = array(
|
4 |
+
'error_message' => '',
|
5 |
+
'name' => '',
|
6 |
+
'name_error' => '',
|
7 |
+
'multi_id' => '',
|
8 |
+
'webhook_url' => '',
|
9 |
+
'webhook_url_error' => '',
|
10 |
+
);
|
11 |
+
/** @var array $template_vars */
|
12 |
+
foreach ( $template_vars as $key => $val ) {
|
13 |
+
$vars[ $key ] = $val;
|
14 |
+
}
|
15 |
+
?>
|
16 |
+
|
17 |
+
<div class="forminator-integration-popup__header">
|
18 |
+
|
19 |
+
<h3 id="forminator-integration-popup__title" class="sui-box-title sui-lg" style="overflow: initial; white-space: normal; text-overflow: initial;">
|
20 |
+
<?php esc_html_e( 'Setup Webhook', 'forminator' ); ?>
|
21 |
+
</h3>
|
22 |
+
|
23 |
+
<p id="forminator-integration-popup__description" class="sui-description">
|
24 |
+
<?php esc_html_e( 'Give your webhook integration a name and add the webhook URL.', 'forminator' ); ?>
|
25 |
+
</p>
|
26 |
+
|
27 |
+
<?php if ( ! empty( $vars['error_message'] ) ) : ?>
|
28 |
+
<div
|
29 |
+
role="alert"
|
30 |
+
class="sui-notice sui-notice-red sui-active"
|
31 |
+
style="display: block; text-align: left;"
|
32 |
+
aria-live="assertive"
|
33 |
+
>
|
34 |
+
|
35 |
+
<div class="sui-notice-content">
|
36 |
+
|
37 |
+
<div class="sui-notice-message">
|
38 |
+
|
39 |
+
<span class="sui-notice-icon sui-icon-info" aria-hidden="true"></span>
|
40 |
+
|
41 |
+
<p><?php echo esc_html( $vars['error_message'] ); ?></p>
|
42 |
+
|
43 |
+
</div>
|
44 |
+
|
45 |
+
</div>
|
46 |
+
|
47 |
+
</div>
|
48 |
+
<?php endif; ?>
|
49 |
+
|
50 |
+
</div>
|
51 |
+
|
52 |
+
<form enctype="multipart/form-data">
|
53 |
+
|
54 |
+
<div class="sui-form-field <?php echo esc_attr( ! empty( $vars['name_error'] ) ? 'sui-form-field-error' : '' ); ?>">
|
55 |
+
<label class="sui-label"><?php esc_html_e( 'Friendly Name', 'forminator' ); ?></label>
|
56 |
+
<div class="sui-control-with-icon">
|
57 |
+
<input type="text"
|
58 |
+
name="name"
|
59 |
+
placeholder="<?php esc_attr_e( 'Enter a friendly name E.g. Zapier to Gmail', 'forminator' ); ?>"
|
60 |
+
value="<?php echo esc_attr( $vars['name'] ); ?>"
|
61 |
+
class="sui-form-control"
|
62 |
+
/>
|
63 |
+
<i class="sui-icon-web-globe-world" aria-hidden="true"></i>
|
64 |
+
</div>
|
65 |
+
<?php if ( ! empty( $vars['name_error'] ) ) : ?>
|
66 |
+
<span class="sui-error-message"><?php echo esc_html( $vars['name_error'] ); ?></span>
|
67 |
+
<?php endif; ?>
|
68 |
+
</div>
|
69 |
+
|
70 |
+
<div class="sui-form-field <?php echo esc_attr( ! empty( $vars['webhook_url_error'] ) ? 'sui-form-field-error' : '' ); ?>" style="margin-bottom: 0;">
|
71 |
+
<label class="sui-label"><?php esc_html_e( 'Webhook URL', 'forminator' ); ?></label>
|
72 |
+
<div class="sui-control-with-icon">
|
73 |
+
<input
|
74 |
+
type="text"
|
75 |
+
name="webhook_url"
|
76 |
+
placeholder="<?php esc_attr_e( 'Enter your webhook URL', 'forminator' ); ?>"
|
77 |
+
value="<?php echo esc_attr( $vars['webhook_url'] ); ?>"
|
78 |
+
class="sui-form-control"/>
|
79 |
+
<i class="sui-icon-link" aria-hidden="true"></i>
|
80 |
+
</div>
|
81 |
+
<?php if ( ! empty( $vars['webhook_url_error'] ) ) : ?>
|
82 |
+
<span class="sui-error-message"><?php echo esc_html( $vars['webhook_url_error'] ); ?></span>
|
83 |
+
<?php endif; ?>
|
84 |
+
|
85 |
+
<?php if ( forminator_is_show_addons_documentation_link() ) : ?>
|
86 |
+
<div class="sui-description">
|
87 |
+
<?php
|
88 |
+
printf(
|
89 |
+
/* translators: 1: article anchor start, 2: article anchor end. */
|
90 |
+
esc_html__( 'Check %1$sour documentation%2$s for more information on using webhook URLs for your preferred automation tools.', 'forminator' ),
|
91 |
+
'<a href="https://wpmudev.com/blog/zapier-wordpress-form-integrations/" target="_blank">',
|
92 |
+
'</a>'
|
93 |
+
);
|
94 |
+
?>
|
95 |
+
</div>
|
96 |
+
<?php endif; ?>
|
97 |
+
</div>
|
98 |
+
|
99 |
+
<input type="hidden" name="multi_id" value="<?php echo esc_attr( $vars['multi_id'] ); ?>">
|
100 |
+
|
101 |
+
</form>
|
addons/pro/webhook/views/settings/setup-connect-success.php
ADDED
@@ -0,0 +1,14 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<div class="forminator-integration-popup__header">
|
2 |
+
|
3 |
+
<h3 id="forminator-integration-popup__title" class="sui-box-title sui-lg" style="overflow: initial; white-space: normal; text-overflow: initial;">
|
4 |
+
<?php
|
5 |
+
/* translators: Integration name */
|
6 |
+
echo esc_html( sprintf( __( '%1$s Added', 'forminator' ), 'Webhook' ) );
|
7 |
+
?>
|
8 |
+
</h3>
|
9 |
+
|
10 |
+
</div>
|
11 |
+
|
12 |
+
<p id="forminator-integration-popup__description" class="sui-description" style="text-align: center;">
|
13 |
+
<?php esc_html_e( 'You can now go to your forms and assign them to this integration', 'forminator' ); ?>
|
14 |
+
</p>
|
addons/pro/webhook/views/settings/setup-connect.php
ADDED
@@ -0,0 +1,86 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
// Defaults.
|
3 |
+
$vars = array(
|
4 |
+
'error_message' => '',
|
5 |
+
'is_connected' => false,
|
6 |
+
);
|
7 |
+
|
8 |
+
$activate_description = __( 'Activate Webhook to start using it with your forms, quizzes, and polls.', 'forminator' );
|
9 |
+
|
10 |
+
/** @var array $template_vars */
|
11 |
+
foreach ( $template_vars as $key => $val ) {
|
12 |
+
$vars[ $key ] = $val;
|
13 |
+
} ?>
|
14 |
+
|
15 |
+
<div class="forminator-integration-popup__header">
|
16 |
+
|
17 |
+
<h3 id="forminator-integration-popup__title" class="sui-box-title sui-lg" style="overflow: initial; white-space: normal; text-overflow: initial;">
|
18 |
+
<?php
|
19 |
+
/* translators: ... */
|
20 |
+
echo esc_html( sprintf( __( 'Activate %1$s', 'forminator' ), 'Webhook' ) );
|
21 |
+
?>
|
22 |
+
</h3>
|
23 |
+
|
24 |
+
<?php if ( ! empty( $vars['is_connected'] ) || ! empty( $vars['error_message'] ) ) : ?>
|
25 |
+
<p id="forminator-integration-popup__description" class="sui-description">
|
26 |
+
<?php echo esc_html( $activate_description ); ?>
|
27 |
+
</p>
|
28 |
+
<?php endif; ?>
|
29 |
+
|
30 |
+
</div>
|
31 |
+
|
32 |
+
<?php if ( empty( $vars['is_connected'] ) && empty( $vars['error_message'] ) ) : ?>
|
33 |
+
<p id="forminator-integration-popup__description" class="sui-description" style="margin: 0; text-align: center;">
|
34 |
+
<?php echo esc_html( $activate_description ); ?>
|
35 |
+
</p>
|
36 |
+
<?php endif; ?>
|
37 |
+
|
38 |
+
<?php if ( ! empty( $vars['is_connected'] ) ) : ?>
|
39 |
+
<div
|
40 |
+
role="alert"
|
41 |
+
class="sui-notice sui-notice-green sui-active"
|
42 |
+
style="display: block; text-align: left;"
|
43 |
+
aria-live="assertive"
|
44 |
+
>
|
45 |
+
|
46 |
+
<div class="sui-notice-content">
|
47 |
+
|
48 |
+
<div class="sui-notice-message">
|
49 |
+
|
50 |
+
<span class="sui-notice-icon sui-icon-check-tick" aria-hidden="true"></span>
|
51 |
+
|
52 |
+
<p><?php esc_html_e( 'Webhook is already active.', 'forminator' ); ?></p>
|
53 |
+
|
54 |
+
</div>
|
55 |
+
|
56 |
+
</div>
|
57 |
+
|
58 |
+
</div>
|
59 |
+
<?php endif; ?>
|
60 |
+
|
61 |
+
<?php if ( ! empty( $vars['error_message'] ) ) : ?>
|
62 |
+
<div
|
63 |
+
role="alert"
|
64 |
+
class="sui-notice sui-notice-red sui-active"
|
65 |
+
style="display: block; text-align: left;"
|
66 |
+
aria-live="assertive"
|
67 |
+
>
|
68 |
+
|
69 |
+
<div class="sui-notice-content">
|
70 |
+
|
71 |
+
<div class="sui-notice-message">
|
72 |
+
|
73 |
+
<span class="sui-notice-icon sui-icon-info" aria-hidden="true"></span>
|
74 |
+
|
75 |
+
<p><?php echo esc_html( $vars['error_message'] ); ?></p>
|
76 |
+
|
77 |
+
</div>
|
78 |
+
|
79 |
+
</div>
|
80 |
+
|
81 |
+
</div>
|
82 |
+
<?php endif; ?>
|
83 |
+
|
84 |
+
<form>
|
85 |
+
<input type="hidden" value="1" name="connect">
|
86 |
+
</form>
|
addons/pro/webhook/webhook.php
ADDED
@@ -0,0 +1,37 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/**
|
4 |
+
* Addon Name: Webhook
|
5 |
+
* Version: 1.0
|
6 |
+
* Plugin URI: https://wpmudev.com/
|
7 |
+
* Description: Integrate Forminator Custom Forms with Webhook to execute various action you like
|
8 |
+
* Author: WPMU DEV
|
9 |
+
* Author URI: http://wpmudev.com
|
10 |
+
*/
|
11 |
+
define( 'FORMINATOR_ADDON_WEBHOOK_VERSION', '1.0' );
|
12 |
+
|
13 |
+
function forminator_addon_webhook_url() {
|
14 |
+
return trailingslashit( forminator_plugin_url() . 'addons/pro/webhook' );
|
15 |
+
}
|
16 |
+
|
17 |
+
function forminator_addon_webhook_assets_url() {
|
18 |
+
return trailingslashit( forminator_addon_webhook_url() . 'assets' );
|
19 |
+
}
|
20 |
+
|
21 |
+
function forminator_addon_webhook_dir() {
|
22 |
+
return trailingslashit( dirname( __FILE__ ) );
|
23 |
+
}
|
24 |
+
|
25 |
+
require_once dirname( __FILE__ ) . '/class-forminator-addon-webhook.php';
|
26 |
+
|
27 |
+
require_once dirname( __FILE__ ) . '/class-forminator-addon-webhook-form-settings.php';
|
28 |
+
require_once dirname( __FILE__ ) . '/class-forminator-addon-webhook-form-hooks.php';
|
29 |
+
|
30 |
+
require_once dirname( __FILE__ ) . '/class-forminator-addon-webhook-poll-settings.php';
|
31 |
+
require_once dirname( __FILE__ ) . '/class-forminator-addon-webhook-poll-hooks.php';
|
32 |
+
|
33 |
+
require_once dirname( __FILE__ ) . '/class-forminator-addon-webhook-quiz-settings.php';
|
34 |
+
require_once dirname( __FILE__ ) . '/class-forminator-addon-webhook-quiz-hooks.php';
|
35 |
+
|
36 |
+
// Direct Load.
|
37 |
+
Forminator_Addon_Loader::get_instance()->register( 'Forminator_Addon_Webhook' );
|
addons/pro/zapier/assets/icons/zapier.png
DELETED
Binary file
|
addons/pro/zapier/assets/icons/zapier@2x.png
DELETED
Binary file
|
addons/pro/zapier/assets/img/banner.png
DELETED
Binary file
|
addons/pro/zapier/assets/img/banner@2x.png
DELETED
Binary file
|
addons/pro/zapier/assets/img/zapier.png
DELETED
Binary file
|
addons/pro/zapier/assets/img/zapier@2x.png
DELETED
Binary file
|
addons/pro/zapier/class-forminator-addon-zapier-exception.php
CHANGED
@@ -1,10 +1,9 @@
|
|
1 |
<?php
|
2 |
|
3 |
/**
|
4 |
-
*
|
5 |
-
*
|
6 |
-
*
|
7 |
-
* @since 1.0 Zapier Addon
|
8 |
*/
|
9 |
class Forminator_Addon_Zapier_Exception extends Exception {
|
10 |
|
1 |
<?php
|
2 |
|
3 |
/**
|
4 |
+
* Moved to Webhook integration.
|
5 |
+
* Leave it here to avoid Fatal errors during updating plugin.
|
6 |
+
* Remove zapier folder after several versions.
|
|
|
7 |
*/
|
8 |
class Forminator_Addon_Zapier_Exception extends Exception {
|
9 |
|
addons/pro/zapier/class-forminator-addon-zapier-form-hooks.php
CHANGED
@@ -1,538 +1,10 @@
|
|
1 |
<?php
|
2 |
|
3 |
/**
|
4 |
-
*
|
5 |
-
*
|
6 |
-
*
|
7 |
-
*
|
8 |
*/
|
9 |
class Forminator_Addon_Zapier_Form_Hooks extends Forminator_Addon_Form_Hooks_Abstract {
|
10 |
|
11 |
-
/**
|
12 |
-
* Addon instance are auto available form abstract
|
13 |
-
* Its added here for development purpose,
|
14 |
-
* Autocomplete will resolve addon directly to `Zapier` instance instead of the abstract
|
15 |
-
* And its public properties can be exposed
|
16 |
-
*
|
17 |
-
* @since 1.0 Zapier Addon
|
18 |
-
* @var Forminator_Addon_Zapier
|
19 |
-
*/
|
20 |
-
protected $addon;
|
21 |
-
|
22 |
-
/**
|
23 |
-
* Form Settings Instance
|
24 |
-
*
|
25 |
-
* @since 1.0 Zapier Addon
|
26 |
-
* @var Forminator_Addon_Zapier_Form_Settings | null
|
27 |
-
*/
|
28 |
-
protected $form_settings_instance;
|
29 |
-
|
30 |
-
/**
|
31 |
-
* Forminator_Addon_Zapier_Form_Hooks constructor.
|
32 |
-
*
|
33 |
-
* @since 1.0 Zapier Addon
|
34 |
-
*
|
35 |
-
* @param Forminator_Addon_Abstract $addon
|
36 |
-
* @param $form_id
|
37 |
-
*
|
38 |
-
* @throws Forminator_Addon_Exception
|
39 |
-
*/
|
40 |
-
public function __construct( Forminator_Addon_Abstract $addon, $form_id ) {
|
41 |
-
parent::__construct( $addon, $form_id );
|
42 |
-
$this->_submit_form_error_message = __( 'Zapier failed to process submitted data. Please check your form and try again', 'forminator' );
|
43 |
-
}
|
44 |
-
|
45 |
-
|
46 |
-
/**
|
47 |
-
* Save status of request sent and received for each connected zap(s)
|
48 |
-
*
|
49 |
-
* @since 1.0 Zapier Addon
|
50 |
-
* @since 1.7 Add $form_entry_fields
|
51 |
-
*
|
52 |
-
* @param array $submitted_data
|
53 |
-
* @param array $form_entry_fields
|
54 |
-
*
|
55 |
-
* @return array
|
56 |
-
*/
|
57 |
-
public function add_entry_fields( $submitted_data, $form_entry_fields = array() ) {
|
58 |
-
|
59 |
-
$form_id = $this->form_id;
|
60 |
-
$form_settings_instance = $this->form_settings_instance;
|
61 |
-
|
62 |
-
/**
|
63 |
-
* Filter zapier submitted form data to be processed
|
64 |
-
*
|
65 |
-
* @since 1.1
|
66 |
-
*
|
67 |
-
* @param array $submitted_data
|
68 |
-
* @param int $form_id current Form ID.
|
69 |
-
* @param Forminator_Addon_Zapier_Form_Settings $form_settings_instance Zapier Addon Form Settings instance.
|
70 |
-
*/
|
71 |
-
$submitted_data = apply_filters(
|
72 |
-
'forminator_addon_zapier_form_submitted_data',
|
73 |
-
$submitted_data,
|
74 |
-
$form_id,
|
75 |
-
$form_settings_instance
|
76 |
-
);
|
77 |
-
|
78 |
-
forminator_addon_maybe_log( __METHOD__, $submitted_data );
|
79 |
-
|
80 |
-
$addon_setting_values = $this->form_settings_instance->get_form_settings_values();
|
81 |
-
$form_settings = $this->form_settings_instance->get_form_settings();
|
82 |
-
|
83 |
-
$data = array();
|
84 |
-
|
85 |
-
/**
|
86 |
-
* Fires before sending data to Webhook URL(s)
|
87 |
-
*
|
88 |
-
* @since 1.1
|
89 |
-
*
|
90 |
-
* @param int $form_id current Form ID.
|
91 |
-
* @param array $submitted_data
|
92 |
-
* @param Forminator_Addon_Zapier_Form_Settings $form_settings_instance Zapier Addon Form Settings instance.
|
93 |
-
*/
|
94 |
-
do_action( 'forminator_addon_zapier_before_post_to_webhook', $form_id, $submitted_data, $form_settings_instance );
|
95 |
-
|
96 |
-
foreach ( $addon_setting_values as $key => $addon_setting_value ) {
|
97 |
-
// save it on entry field, with name `status-$MULTI_ID`, and value is the return result on sending data to zapier.
|
98 |
-
$data[] = array(
|
99 |
-
'name' => 'status-' . $key,
|
100 |
-
'value' => $this->get_status_on_send_data( $key, $submitted_data, $addon_setting_value, $form_settings, $form_entry_fields ),
|
101 |
-
);
|
102 |
-
}
|
103 |
-
|
104 |
-
$entry_fields = $data;
|
105 |
-
/**
|
106 |
-
* Filter zapier entry fields to be saved to entry model
|
107 |
-
*
|
108 |
-
* @since 1.1
|
109 |
-
*
|
110 |
-
* @param array $entry_fields
|
111 |
-
* @param int $form_id current Form ID.
|
112 |
-
* @param array $submitted_data
|
113 |
-
* @param Forminator_Addon_Zapier_Form_Settings $form_settings_instance Zapier Form Settings instance.
|
114 |
-
*/
|
115 |
-
$data = apply_filters(
|
116 |
-
'forminator_addon_zapier_entry_fields',
|
117 |
-
$entry_fields,
|
118 |
-
$form_id,
|
119 |
-
$submitted_data,
|
120 |
-
$form_settings_instance
|
121 |
-
);
|
122 |
-
|
123 |
-
return $data;
|
124 |
-
|
125 |
-
}
|
126 |
-
|
127 |
-
/**
|
128 |
-
* Get status on sending data to zapier
|
129 |
-
*
|
130 |
-
* @since 1.0 Zapier Addon
|
131 |
-
* @since 1.7 Add $form_entry_fields arg
|
132 |
-
*
|
133 |
-
* @param $connection_id
|
134 |
-
* @param $submitted_data
|
135 |
-
* @param $connection_settings
|
136 |
-
* @param $form_settings
|
137 |
-
* @param array $form_entry_fields
|
138 |
-
*
|
139 |
-
* @return array `is_sent` true means its success send data to zapier, false otherwise
|
140 |
-
*/
|
141 |
-
private function get_status_on_send_data( $connection_id, $submitted_data, $connection_settings, $form_settings, $form_entry_fields ) {
|
142 |
-
// initialize as null.
|
143 |
-
$zapier_api = null;
|
144 |
-
|
145 |
-
$form_id = $this->form_id;
|
146 |
-
$form_settings_instance = $this->form_settings_instance;
|
147 |
-
|
148 |
-
//check required fields
|
149 |
-
try {
|
150 |
-
if ( ! isset( $connection_settings['webhook_url'] ) ) {
|
151 |
-
throw new Forminator_Addon_Zapier_Exception( __( 'Webhook URL is not properly setup', 'forminator' ) );
|
152 |
-
}
|
153 |
-
|
154 |
-
$endpoint = $connection_settings['webhook_url'];
|
155 |
-
/**
|
156 |
-
* Filter Endpoint Webhook URL to send
|
157 |
-
*
|
158 |
-
* @since 1.1
|
159 |
-
*
|
160 |
-
* @param string $endpoint
|
161 |
-
* @param int $form_id current Form ID.
|
162 |
-
* @param array $connection_settings current connection setting, it contains `name` and `webhook_url`.
|
163 |
-
*/
|
164 |
-
$endpoint = apply_filters(
|
165 |
-
'forminator_addon_zapier_endpoint',
|
166 |
-
$endpoint,
|
167 |
-
$form_id,
|
168 |
-
$connection_settings
|
169 |
-
);
|
170 |
-
|
171 |
-
$zapier_api = $this->addon->get_api( $endpoint );
|
172 |
-
|
173 |
-
$args = $submitted_data;
|
174 |
-
|
175 |
-
$args['form-title'] = $form_settings['formName'];
|
176 |
-
$args['entry-time'] = current_time( 'Y-m-d H:i:s' );
|
177 |
-
|
178 |
-
/**
|
179 |
-
* Filter arguments to passed on to Zapier Webhook API
|
180 |
-
*
|
181 |
-
* @since 1.1
|
182 |
-
*
|
183 |
-
* @param array $args
|
184 |
-
* @param int $form_id Current Form id.
|
185 |
-
* @param string $connection_id ID of current connection.
|
186 |
-
* @param array $submitted_data
|
187 |
-
* @param array $connection_settings current connection setting, contains `name` and `webhook_url`.
|
188 |
-
* @param array $form_settings Displayed Form settings.
|
189 |
-
* @param Forminator_Addon_Zapier_Form_Settings $form_settings_instance Zapier Form Settings instance.
|
190 |
-
*/
|
191 |
-
$args = apply_filters(
|
192 |
-
'forminator_addon_zapier_post_to_webhook_args',
|
193 |
-
$args,
|
194 |
-
$form_id,
|
195 |
-
$connection_id,
|
196 |
-
$submitted_data,
|
197 |
-
$connection_settings,
|
198 |
-
$form_settings,
|
199 |
-
$form_settings_instance
|
200 |
-
);
|
201 |
-
|
202 |
-
$zapier_api->post_( $args );
|
203 |
-
|
204 |
-
forminator_addon_maybe_log( __METHOD__, 'Success Send Data' );
|
205 |
-
|
206 |
-
return array(
|
207 |
-
'is_sent' => true,
|
208 |
-
'connection_name' => $connection_settings['name'],
|
209 |
-
'description' => __( 'Successfully send data to Zapier', 'forminator' ),
|
210 |
-
'data_sent' => $zapier_api->get_last_data_sent(),
|
211 |
-
'data_received' => $zapier_api->get_last_data_received(),
|
212 |
-
'url_request' => $zapier_api->get_last_url_request(),
|
213 |
-
);
|
214 |
-
|
215 |
-
} catch ( Forminator_Addon_Zapier_Exception $e ) {
|
216 |
-
forminator_addon_maybe_log( __METHOD__, 'Failed to Send to Zapier' );
|
217 |
-
|
218 |
-
return array(
|
219 |
-
'is_sent' => false,
|
220 |
-
'description' => $e->getMessage(),
|
221 |
-
'connection_name' => $connection_settings['name'],
|
222 |
-
'data_sent' => ( ( $zapier_api instanceof Forminator_Addon_Zapier_Wp_Api ) ? $zapier_api->get_last_data_sent() : array() ),
|
223 |
-
'data_received' => ( ( $zapier_api instanceof Forminator_Addon_Zapier_Wp_Api ) ? $zapier_api->get_last_data_received() : array() ),
|
224 |
-
'url_request' => ( ( $zapier_api instanceof Forminator_Addon_Zapier_Wp_Api ) ? $zapier_api->get_last_url_request() : '' ),
|
225 |
-
);
|
226 |
-
}
|
227 |
-
}
|
228 |
-
|
229 |
-
/**
|
230 |
-
* It wil add new row on entry table of submission page, with couple of subentries
|
231 |
-
* subentries included are defined in @see Forminator_Addon_Zapier_Form_Hooks::get_additional_entry_item()
|
232 |
-
*
|
233 |
-
* @since 1.0 Zapier Addon
|
234 |
-
*
|
235 |
-
* @param Forminator_Form_Entry_Model $entry_model
|
236 |
-
* @param $addon_meta_data
|
237 |
-
*
|
238 |
-
* @return array
|
239 |
-
*/
|
240 |
-
public function on_render_entry( Forminator_Form_Entry_Model $entry_model, $addon_meta_data ) {
|
241 |
-
|
242 |
-
$form_id = $this->form_id;
|
243 |
-
$form_settings_instance = $this->form_settings_instance;
|
244 |
-
|
245 |
-
/**
|
246 |
-
*
|
247 |
-
* Filter zapier metadata that previously saved on db to be processed
|
248 |
-
*
|
249 |
-
* @since 1.1
|
250 |
-
*
|
251 |
-
* @param array $addon_meta_data
|
252 |
-
* @param int $form_id current Form ID.
|
253 |
-
* @param Forminator_Addon_Zapier_Form_Settings $form_settings_instance Zapier Form Settings instance.
|
254 |
-
*/
|
255 |
-
$addon_meta_data = apply_filters(
|
256 |
-
'forminator_addon_zapier_metadata',
|
257 |
-
$addon_meta_data,
|
258 |
-
$form_id,
|
259 |
-
$form_settings_instance
|
260 |
-
);
|
261 |
-
|
262 |
-
$addon_meta_datas = $addon_meta_data;
|
263 |
-
if ( ! isset( $addon_meta_data[0] ) || ! is_array( $addon_meta_data[0] ) ) {
|
264 |
-
return array();
|
265 |
-
}
|
266 |
-
|
267 |
-
$addon_meta_data = $addon_meta_data[0];
|
268 |
-
|
269 |
-
// make sure its `status`, because we only add this.
|
270 |
-
// when its `status` then its single connection (backward compat on dev).
|
271 |
-
// when its status-$MULTI_ID its multiple connection its default behavior.
|
272 |
-
if ( 'status' !== $addon_meta_data['name'] ) {
|
273 |
-
if ( stripos( $addon_meta_data['name'], 'status-' ) === 0 ) {
|
274 |
-
return $this->on_render_entry_multi_connection( $addon_meta_datas );
|
275 |
-
}
|
276 |
-
|
277 |
-
return array();
|
278 |
-
}
|
279 |
-
|
280 |
-
$additional_entry_item = $this->get_additional_entry_item( $addon_meta_data );
|
281 |
-
if ( empty( $additional_entry_item ) ) {
|
282 |
-
return array();
|
283 |
-
}
|
284 |
-
|
285 |
-
return array( $additional_entry_item );
|
286 |
-
|
287 |
-
}
|
288 |
-
|
289 |
-
/**
|
290 |
-
* Loop through addon meta data on multiple zap(s)
|
291 |
-
*
|
292 |
-
* @since 1.0 Zapier Addon
|
293 |
-
*
|
294 |
-
* @param $addon_meta_datas
|
295 |
-
*
|
296 |
-
* @return array
|
297 |
-
*/
|
298 |
-
private function on_render_entry_multi_connection( $addon_meta_datas ) {
|
299 |
-
$additional_entry_item = array();
|
300 |
-
foreach ( $addon_meta_datas as $addon_meta_data ) {
|
301 |
-
$additional_entry_item[] = $this->get_additional_entry_item( $addon_meta_data );
|
302 |
-
}
|
303 |
-
|
304 |
-
return $additional_entry_item;
|
305 |
-
|
306 |
-
}
|
307 |
-
|
308 |
-
/**
|
309 |
-
* Format additional entry item as label and value arrays
|
310 |
-
*
|
311 |
-
* - Integration Name : its defined by user when they adding zapier integration on their form
|
312 |
-
* - Sent To Zapier : will be Yes/No value, that indicates whether sending data to zapier was successful
|
313 |
-
* - Info : Text that are generated by addon when building and sending data to zapier @see Forminator_Addon_Zapier_Form_Hooks::add_entry_fields()
|
314 |
-
* - Below subentries will be added if full log enabled, @see Forminator_Addon_Zapier::is_show_full_log() @see FORMINATOR_ADDON_ZAPIER_SHOW_FULL_LOG
|
315 |
-
* - API URL : URL that wes requested when sending data to zapier
|
316 |
-
* - Data sent to Zapier : json encoded body request that was sent
|
317 |
-
* - Data received from Zapier : json encoded body response that was received
|
318 |
-
*
|
319 |
-
* @param $addon_meta_data
|
320 |
-
*
|
321 |
-
* @since 1.0 Zapier Addon
|
322 |
-
* @return array
|
323 |
-
*/
|
324 |
-
private function get_additional_entry_item( $addon_meta_data ) {
|
325 |
-
|
326 |
-
if ( ! isset( $addon_meta_data['value'] ) || ! is_array( $addon_meta_data['value'] ) ) {
|
327 |
-
return array();
|
328 |
-
}
|
329 |
-
$status = $addon_meta_data['value'];
|
330 |
-
$additional_entry_item = array(
|
331 |
-
'label' => __( 'Zapier Integration', 'forminator' ),
|
332 |
-
'value' => '',
|
333 |
-
);
|
334 |
-
|
335 |
-
$sub_entries = array();
|
336 |
-
if ( isset( $status['connection_name'] ) ) {
|
337 |
-
$sub_entries[] = array(
|
338 |
-
'label' => __( 'Integration Name', 'forminator' ),
|
339 |
-
'value' => $status['connection_name'],
|
340 |
-
);
|
341 |
-
}
|
342 |
-
|
343 |
-
if ( isset( $status['is_sent'] ) ) {
|
344 |
-
$is_sent = true === $status['is_sent'] ? __( 'Yes', 'forminator' ) : __( 'No', 'forminator' );
|
345 |
-
$sub_entries[] = array(
|
346 |
-
'label' => __( 'Sent To Zapier', 'forminator' ),
|
347 |
-
'value' => $is_sent,
|
348 |
-
);
|
349 |
-
}
|
350 |
-
|
351 |
-
if ( isset( $status['description'] ) ) {
|
352 |
-
$sub_entries[] = array(
|
353 |
-
'label' => __( 'Info', 'forminator' ),
|
354 |
-
'value' => $status['description'],
|
355 |
-
);
|
356 |
-
}
|
357 |
-
|
358 |
-
if ( Forminator_Addon_Zapier::is_show_full_log() ) {
|
359 |
-
// too long to be added on entry data enable this with `define('FORMINATOR_ADDON_ZAPIER_SHOW_FULL_LOG', true)`.
|
360 |
-
if ( isset( $status['url_request'] ) ) {
|
361 |
-
$sub_entries[] = array(
|
362 |
-
'label' => __( 'API URL', 'forminator' ),
|
363 |
-
'value' => $status['url_request'],
|
364 |
-
);
|
365 |
-
}
|
366 |
-
|
367 |
-
if ( isset( $status['data_sent'] ) ) {
|
368 |
-
$sub_entries[] = array(
|
369 |
-
'label' => __( 'Data sent to Zapier', 'forminator' ),
|
370 |
-
'value' => '<pre class="sui-code-snippet">' . wp_json_encode( $status['data_sent'], JSON_PRETTY_PRINT ) . '</pre>',
|
371 |
-
);
|
372 |
-
}
|
373 |
-
|
374 |
-
if ( isset( $status['data_received'] ) ) {
|
375 |
-
$sub_entries[] = array(
|
376 |
-
'label' => __( 'Data received from Zapier', 'forminator' ),
|
377 |
-
'value' => '<pre class="sui-code-snippet">' . wp_json_encode( $status['data_received'], JSON_PRETTY_PRINT ) . '</pre>',
|
378 |
-
);
|
379 |
-
}
|
380 |
-
}
|
381 |
-
|
382 |
-
$additional_entry_item['sub_entries'] = $sub_entries;
|
383 |
-
|
384 |
-
// return single array.
|
385 |
-
return $additional_entry_item;
|
386 |
-
}
|
387 |
-
|
388 |
-
/**
|
389 |
-
* Zapier will add a column on the title/header row
|
390 |
-
* its called `Zapier Info` which can be translated on forminator lang
|
391 |
-
*
|
392 |
-
* @since 1.0 Zapier Addon
|
393 |
-
* @return array
|
394 |
-
*/
|
395 |
-
public function on_export_render_title_row() {
|
396 |
-
|
397 |
-
$export_headers = array(
|
398 |
-
'info' => __( 'Zapier Info', 'forminator' ),
|
399 |
-
);
|
400 |
-
|
401 |
-
$form_id = $this->form_id;
|
402 |
-
$form_settings_instance = $this->form_settings_instance;
|
403 |
-
|
404 |
-
/**
|
405 |
-
* Filter zapier headers on export file
|
406 |
-
*
|
407 |
-
* @since 1.1
|
408 |
-
*
|
409 |
-
* @param array $export_headers headers to be displayed on export file.
|
410 |
-
* @param int $form_id current Form ID.
|
411 |
-
* @param Forminator_Addon_Zapier_Form_Settings $form_settings_instance Zapier Form Settings instance.
|
412 |
-
*/
|
413 |
-
$export_headers = apply_filters(
|
414 |
-
'forminator_addon_zapier_export_headers',
|
415 |
-
$export_headers,
|
416 |
-
$form_id,
|
417 |
-
$form_settings_instance
|
418 |
-
);
|
419 |
-
|
420 |
-
return $export_headers;
|
421 |
-
}
|
422 |
-
|
423 |
-
/**
|
424 |
-
* Zapier will add a column that give user information whether sending data to zapier successfully or not
|
425 |
-
* It will only add one column even its multiple connection, every connection will be separated by comma
|
426 |
-
*
|
427 |
-
* @since 1.0 Zapier Addon
|
428 |
-
*
|
429 |
-
* @param Forminator_Form_Entry_Model $entry_model
|
430 |
-
* @param $addon_meta_data
|
431 |
-
*
|
432 |
-
* @return array
|
433 |
-
*/
|
434 |
-
public function on_export_render_entry( Forminator_Form_Entry_Model $entry_model, $addon_meta_data ) {
|
435 |
-
|
436 |
-
$form_id = $this->form_id;
|
437 |
-
$form_settings_instance = $this->form_settings_instance;
|
438 |
-
|
439 |
-
/**
|
440 |
-
*
|
441 |
-
* Filter zapier metadata that previously saved on db to be processed
|
442 |
-
*
|
443 |
-
* @since 1.1
|
444 |
-
*
|
445 |
-
* @param array $addon_meta_data
|
446 |
-
* @param int $form_id current Form ID.
|
447 |
-
* @param Forminator_Addon_Zapier_Form_Settings $form_settings_instance Zapier Form Settings instance.
|
448 |
-
*/
|
449 |
-
$addon_meta_data = apply_filters(
|
450 |
-
'forminator_addon_zapier_metadata',
|
451 |
-
$addon_meta_data,
|
452 |
-
$form_id,
|
453 |
-
$form_settings_instance
|
454 |
-
);
|
455 |
-
|
456 |
-
$export_columns = array(
|
457 |
-
'info' => $this->get_from_addon_meta_data( $addon_meta_data, 'description', '' ),
|
458 |
-
);
|
459 |
-
|
460 |
-
/**
|
461 |
-
* Filter zapier columns to be displayed on export submissions
|
462 |
-
*
|
463 |
-
* @since 1.1
|
464 |
-
*
|
465 |
-
* @param array $export_columns column to be exported.
|
466 |
-
* @param int $form_id current Form ID.
|
467 |
-
* @param Forminator_Form_Entry_Model $entry_model Form Entry Model.
|
468 |
-
* @param array $addon_meta_data meta data saved by addon on entry fields.
|
469 |
-
* @param Forminator_Addon_Zapier_Form_Settings $form_settings_instance Zapier Form Settings instance.
|
470 |
-
*/
|
471 |
-
$export_columns = apply_filters(
|
472 |
-
'forminator_addon_zapier_export_columns',
|
473 |
-
$export_columns,
|
474 |
-
$form_id,
|
475 |
-
$entry_model,
|
476 |
-
$addon_meta_data,
|
477 |
-
$form_settings_instance
|
478 |
-
);
|
479 |
-
|
480 |
-
return $export_columns;
|
481 |
-
}
|
482 |
-
|
483 |
-
/**
|
484 |
-
* Get Addon meta data, will be recursive if meta data is multiple because of multiple connection added
|
485 |
-
*
|
486 |
-
* @since 1.0 Zapier Addon
|
487 |
-
*
|
488 |
-
* @param $addon_meta_data
|
489 |
-
* @param $key
|
490 |
-
* @param string $default
|
491 |
-
*
|
492 |
-
* @return string
|
493 |
-
*/
|
494 |
-
private function get_from_addon_meta_data( $addon_meta_data, $key, $default = '' ) {
|
495 |
-
$addon_meta_datas = $addon_meta_data;
|
496 |
-
if ( ! isset( $addon_meta_data[0] ) || ! is_array( $addon_meta_data[0] ) ) {
|
497 |
-
return $default;
|
498 |
-
}
|
499 |
-
|
500 |
-
$addon_meta_data = $addon_meta_data[0];
|
501 |
-
|
502 |
-
// make sure its `status`, because we only add this.
|
503 |
-
if ( 'status' !== $addon_meta_data['name'] ) {
|
504 |
-
if ( stripos( $addon_meta_data['name'], 'status-' ) === 0 ) {
|
505 |
-
$meta_data = array();
|
506 |
-
foreach ( $addon_meta_datas as $addon_meta_data ) {
|
507 |
-
// make it like single value so it will be processed like single meta data.
|
508 |
-
$addon_meta_data['name'] = 'status';
|
509 |
-
|
510 |
-
// add it on an array for next recursive process.
|
511 |
-
$meta_data[] = $this->get_from_addon_meta_data( array( $addon_meta_data ), $key, $default );
|
512 |
-
}
|
513 |
-
|
514 |
-
return implode( ', ', $meta_data );
|
515 |
-
}
|
516 |
-
|
517 |
-
return $default;
|
518 |
-
|
519 |
-
}
|
520 |
-
|
521 |
-
if ( ! isset( $addon_meta_data['value'] ) || ! is_array( $addon_meta_data['value'] ) ) {
|
522 |
-
return $default;
|
523 |
-
}
|
524 |
-
$status = $addon_meta_data['value'];
|
525 |
-
if ( isset( $status[ $key ] ) ) {
|
526 |
-
$connection_name = '';
|
527 |
-
if ( 'connection_name' !== $key ) {
|
528 |
-
if ( isset( $status['connection_name'] ) ) {
|
529 |
-
$connection_name = '[' . $status['connection_name'] . '] ';
|
530 |
-
}
|
531 |
-
}
|
532 |
-
|
533 |
-
return $connection_name . $status[ $key ];
|
534 |
-
}
|
535 |
-
|
536 |
-
return $default;
|
537 |
-
}
|
538 |
}
|
1 |
<?php
|
2 |
|
3 |
/**
|
4 |
+
* Moved to Webhook integration.
|
5 |
+
* Leave it here to avoid Fatal errors during updating plugin.
|
6 |
+
* Remove zapier folder after several versions.
|
|
|
7 |
*/
|
8 |
class Forminator_Addon_Zapier_Form_Hooks extends Forminator_Addon_Form_Hooks_Abstract {
|
9 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
10 |
}
|
addons/pro/zapier/class-forminator-addon-zapier-form-settings-exception.php
CHANGED
@@ -1,68 +1,10 @@
|
|
1 |
<?php
|
2 |
|
3 |
/**
|
4 |
-
*
|
5 |
-
*
|
6 |
-
*
|
7 |
-
* @since 1.0 Zapier Addon
|
8 |
*/
|
9 |
class Forminator_Addon_Zapier_Form_Settings_Exception extends Forminator_Addon_Zapier_Exception {
|
10 |
|
11 |
-
/**
|
12 |
-
* Holder of input exceptions
|
13 |
-
*
|
14 |
-
* @since 1.0 Zapier Addon
|
15 |
-
* @var array
|
16 |
-
*/
|
17 |
-
protected $input_exceptions = array();
|
18 |
-
|
19 |
-
/**
|
20 |
-
* Forminator_Addon_Zapier_Form_Settings_Exception constructor.
|
21 |
-
*
|
22 |
-
* Useful if input_id is needed for later.
|
23 |
-
* If no input_id needed, use @see Forminator_Addon_Zapier_Exception
|
24 |
-
*
|
25 |
-
* @since 1.0 Zapier Addon
|
26 |
-
*
|
27 |
-
* @param string $message
|
28 |
-
* @param string $input_id
|
29 |
-
*/
|
30 |
-
public function __construct( $message = '', $input_id = '' ) {
|
31 |
-
parent::__construct( $message, 0 );
|
32 |
-
if ( ! empty( $input_id ) ) {
|
33 |
-
$this->add_input_exception( $message, $input_id );
|
34 |
-
}
|
35 |
-
}
|
36 |
-
|
37 |
-
/**
|
38 |
-
* Set exception message for an input
|
39 |
-
*
|
40 |
-
* @since 1.0 Zapier Addon
|
41 |
-
*
|
42 |
-
* @param $message
|
43 |
-
* @param $input_id
|
44 |
-
*/
|
45 |
-
public function add_input_exception( $message, $input_id ) {
|
46 |
-
$this->input_exceptions[ $input_id ] = $message;
|
47 |
-
}
|
48 |
-
|
49 |
-
/**
|
50 |
-
* Get all input exceptions
|
51 |
-
*
|
52 |
-
* @since 1.0 Zapier Addon
|
53 |
-
* @return array
|
54 |
-
*/
|
55 |
-
public function get_input_exceptions() {
|
56 |
-
return $this->input_exceptions;
|
57 |
-
}
|
58 |
-
|
59 |
-
/**
|
60 |
-
* Check if there is input_exceptions_is_available
|
61 |
-
*
|
62 |
-
* @since 1.0 Zapier Addon
|
63 |
-
* @return bool
|
64 |
-
*/
|
65 |
-
public function input_exceptions_is_available() {
|
66 |
-
return count( $this->input_exceptions ) > 0;
|
67 |
-
}
|
68 |
}
|
1 |
<?php
|
2 |
|
3 |
/**
|
4 |
+
* Moved to Webhook integration.
|
5 |
+
* Leave it here to avoid Fatal errors during updating plugin.
|
6 |
+
* Remove zapier folder after several versions.
|
|
|
7 |
*/
|
8 |
class Forminator_Addon_Zapier_Form_Settings_Exception extends Forminator_Addon_Zapier_Exception {
|
9 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
10 |
}
|
addons/pro/zapier/class-forminator-addon-zapier-form-settings.php
CHANGED
@@ -1,487 +1,10 @@
|
|
1 |
<?php
|
2 |
|
3 |
-
require_once dirname( __FILE__ ) . '/class-forminator-addon-zapier-form-settings-exception.php';
|
4 |
-
|
5 |
/**
|
6 |
-
*
|
7 |
-
*
|
8 |
-
*
|
9 |
-
* @since 1.0 Zapier Addon
|
10 |
*/
|
11 |
class Forminator_Addon_Zapier_Form_Settings extends Forminator_Addon_Form_Settings_Abstract {
|
12 |
|
13 |
-
/**
|
14 |
-
* @var Forminator_Addon_Zapier
|
15 |
-
* @since 1.0 Zapier Addon
|
16 |
-
*/
|
17 |
-
protected $addon;
|
18 |
-
|
19 |
-
/**
|
20 |
-
* Create Zap URL
|
21 |
-
*
|
22 |
-
* @since 1.0 Zapier Addon
|
23 |
-
* @var string
|
24 |
-
*/
|
25 |
-
private $new_zap_url = 'https://zapier.com/app/editor/';
|
26 |
-
|
27 |
-
/**
|
28 |
-
* Forminator_Addon_Zapier_Form_Settings constructor.
|
29 |
-
*
|
30 |
-
* @since 1.0 Zapier Addon
|
31 |
-
*
|
32 |
-
* @param Forminator_Addon_Abstract $addon
|
33 |
-
* @param $form_id
|
34 |
-
*
|
35 |
-
* @throws Forminator_Addon_Exception
|
36 |
-
*/
|
37 |
-
public function __construct( Forminator_Addon_Abstract $addon, $form_id ) {
|
38 |
-
parent::__construct( $addon, $form_id );
|
39 |
-
|
40 |
-
$this->_update_form_settings_error_message = __(
|
41 |
-
'The update to your settings for this form failed, check the form input and try again.',
|
42 |
-
'forminator'
|
43 |
-
);
|
44 |
-
}
|
45 |
-
|
46 |
-
/**
|
47 |
-
* Zapier Form Settings wizard
|
48 |
-
*
|
49 |
-
* @since 1.0 Zapier Addon
|
50 |
-
* @return array
|
51 |
-
*/
|
52 |
-
public function form_settings_wizards() {
|
53 |
-
// numerical array steps.
|
54 |
-
return array(
|
55 |
-
// 0
|
56 |
-
array(
|
57 |
-
'callback' => array( $this, 'setup_webhook_url' ),
|
58 |
-
'is_completed' => array( $this, 'setup_webhook_url_is_completed' ),
|
59 |
-
),
|
60 |
-
);
|
61 |
-
}
|
62 |
-
|
63 |
-
/**
|
64 |
-
* Setup webhook url
|
65 |
-
*
|
66 |
-
* @since 1.0 Zapier Addon
|
67 |
-
*
|
68 |
-
* @param $submitted_data
|
69 |
-
*
|
70 |
-
* @return array
|
71 |
-
*/
|
72 |
-
public function setup_webhook_url( $submitted_data ) {
|
73 |
-
$this->addon_form_settings = $this->get_form_settings_values();
|
74 |
-
|
75 |
-
$multi_id = $this->generate_multi_id();
|
76 |
-
if ( isset( $submitted_data['multi_id'] ) ) {
|
77 |
-
$multi_id = $submitted_data['multi_id'];
|
78 |
-
}
|
79 |
-
|
80 |
-
unset( $submitted_data['multi_id'] );
|
81 |
-
|
82 |
-
$is_submit = ! empty( $submitted_data );
|
83 |
-
|
84 |
-
$current_data = array(
|
85 |
-
'webhook_url' => '',
|
86 |
-
'name' => '',
|
87 |
-
);
|
88 |
-
|
89 |
-
if ( isset( $submitted_data['name'] ) ) {
|
90 |
-
$submitted_data['name'] = sanitize_text_field( $submitted_data['name'] );
|
91 |
-
}
|
92 |
-
forminator_addon_maybe_log( __METHOD__, $submitted_data );
|
93 |
-
|
94 |
-
$notification = array();
|
95 |
-
|
96 |
-
foreach ( $current_data as $key => $value ) {
|
97 |
-
if ( isset( $submitted_data[ $key ] ) ) {
|
98 |
-
$current_data[ $key ] = $submitted_data[ $key ];
|
99 |
-
} elseif ( isset( $this->addon_form_settings[ $multi_id ][ $key ] ) ) {
|
100 |
-
$current_data[ $key ] = $this->addon_form_settings[ $multi_id ][ $key ];
|
101 |
-
}
|
102 |
-
}
|
103 |
-
|
104 |
-
$error_message = '';
|
105 |
-
$input_error_messages = '';
|
106 |
-
|
107 |
-
try {
|
108 |
-
if ( $is_submit ) {
|
109 |
-
$input_exceptions = new Forminator_Addon_Zapier_Form_Settings_Exception();
|
110 |
-
if ( empty( $current_data['name'] ) ) {
|
111 |
-
$input_exceptions->add_input_exception( __( 'Please create a name for this Zapier integration', 'forminator' ), 'name' );
|
112 |
-
}
|
113 |
-
|
114 |
-
$this->validate_and_send_sample( $submitted_data, $input_exceptions );
|
115 |
-
$this->addon_form_settings = array_merge(
|
116 |
-
$this->addon_form_settings,
|
117 |
-
array(
|
118 |
-
$multi_id => array(
|
119 |
-
'webhook_url' => $submitted_data['webhook_url'],
|
120 |
-
'name' => $submitted_data['name'],
|
121 |
-
),
|
122 |
-
)
|
123 |
-
);
|
124 |
-
|
125 |
-
$this->save_form_settings_values( $this->addon_form_settings );
|
126 |
-
$notification = array(
|
127 |
-
'type' => 'success',
|
128 |
-
'text' => '<strong>' . $this->addon->get_title() . ' [' . esc_html( $submitted_data['name'] ) . ']</strong> '
|
129 |
-
. __( 'Successfully connected and sent sample data to your ZAP' ),
|
130 |
-
);
|
131 |
-
}
|
132 |
-
} catch ( Forminator_Addon_Zapier_Form_Settings_Exception $e ) {
|
133 |
-
$input_error_messages = $e->get_input_exceptions();
|
134 |
-
} catch ( Forminator_Addon_Zapier_Exception $e ) {
|
135 |
-
$error_message = '<div role="alert" class="sui-notice sui-notice-red sui-active" style="display: block; text-align: left;" aria-live="assertive">';
|
136 |
-
|
137 |
-
$error_message .= '<div class="sui-notice-content">';
|
138 |
-
|
139 |
-
$error_message .= '<div class="sui-notice-message">';
|
140 |
-
|
141 |
-
$error_message .= '<span class="sui-notice-icon sui-icon-info" aria-hidden="true"></span>';
|
142 |
-
|
143 |
-
$error_message .= '<p>' . $e->getMessage() . '</p>';
|
144 |
-
|
145 |
-
$error_message .= '</div>';
|
146 |
-
|
147 |
-
$error_message .= '</div>';
|
148 |
-
|
149 |
-
$error_message .= '</div>';
|
150 |
-
}
|
151 |
-
|
152 |
-
$buttons = array();
|
153 |
-
if ( $this->setup_webhook_url_is_completed( array( 'multi_id' => $multi_id ) ) ) {
|
154 |
-
$buttons['disconnect']['markup'] = Forminator_Addon_Zapier::get_button_markup(
|
155 |
-
esc_html__( 'Deactivate', 'forminator' ),
|
156 |
-
'sui-button-ghost sui-tooltip sui-tooltip-top-center forminator-addon-form-disconnect',
|
157 |
-
esc_html__( 'Deactivate Zapier from this Form.', 'forminator' )
|
158 |
-
);
|
159 |
-
}
|
160 |
-
|
161 |
-
$buttons['next']['markup'] = '<div class="sui-actions-right">' .
|
162 |
-
Forminator_Addon_Zapier::get_button_markup( esc_html__( 'Save', 'forminator' ), 'sui-button-primary forminator-addon-finish' ) .
|
163 |
-
'</div>';
|
164 |
-
|
165 |
-
$help_message = esc_html__( 'Put your ZAP Webhook URL below.', 'forminator' );
|
166 |
-
|
167 |
-
$notice_message = sprintf(
|
168 |
-
/* translators: ... */
|
169 |
-
__( 'Please go %1$shere%2$s if you do not have any ZAP created. Remember to choose %3$s as Trigger App.', 'forminator' ),
|
170 |
-
'<a href="' . $this->new_zap_url . '" target="_blank">',
|
171 |
-
'</a>',
|
172 |
-
'<strong>Webhooks by Zapier</strong>'
|
173 |
-
);
|
174 |
-
|
175 |
-
return array(
|
176 |
-
'html' => '<div class="forminator-integration-popup__header"><h3 class="sui-box-title sui-lg" id="dialogTitle2">' . __( 'Setup Webhook', 'forminator' ) . '</h3>
|
177 |
-
<p class="sui-description">' . $help_message . '</p>
|
178 |
-
' . $error_message . '</div>
|
179 |
-
<form enctype="multipart/form-data">
|
180 |
-
<div class="sui-form-field ' . ( isset( $input_error_messages['name'] ) ? 'sui-form-field-error' : '' ) . '">
|
181 |
-
<label class="sui-label">' . esc_html__( 'Zapier Integration Name', 'forminator' ) . '</label>
|
182 |
-
<div class="sui-control-with-icon">
|
183 |
-
<input type="text"
|
184 |
-
name="name"
|
185 |
-
placeholder="' . esc_attr__( 'Friendly Name', 'forminator' ) . '"
|
186 |
-
value="' . esc_attr( $current_data['name'] ) . '"
|
187 |
-
class="sui-form-control"
|
188 |
-
/>
|
189 |
-
<i class="sui-icon-web-globe-world" aria-hidden="true"></i>
|
190 |
-
</div>
|
191 |
-
' . ( isset( $input_error_messages['name'] ) ? '<span class="sui-error-message">' . esc_html( $input_error_messages['name'] ) . '</span>' : '' ) . '
|
192 |
-
</div>
|
193 |
-
<div class="sui-form-field ' . ( isset( $input_error_messages['webhook_url'] ) ? 'sui-form-field-error' : '' ) . '">
|
194 |
-
<label class="sui-label">' . esc_html__( 'Webhook URL', 'forminator' ) . '</label>
|
195 |
-
<div class="sui-control-with-icon">
|
196 |
-
<input
|
197 |
-
type="text"
|
198 |
-
name="webhook_url"
|
199 |
-
placeholder="' . esc_attr__( 'Webhook URL', 'forminator' ) . '"
|
200 |
-
value="' . esc_attr( $current_data['webhook_url'] ) . '"
|
201 |
-
class="sui-form-control" />
|
202 |
-
<i class="sui-icon-link" aria-hidden="true"></i>
|
203 |
-
</div>
|
204 |
-
' . ( isset( $input_error_messages['webhook_url'] ) ? '<span class="sui-error-message">' . esc_html( $input_error_messages['webhook_url'] ) . '</span>' : '' ) . '
|
205 |
-
</div>
|
206 |
-
<input type="hidden" name="multi_id" value="' . esc_attr( $multi_id ) . '" />
|
207 |
-
</form>
|
208 |
-
<div role="alert" class="sui-notice sui-notice-red sui-active" style="display: block; text-align: left;" aria-live="assertive">
|
209 |
-
|
210 |
-
<div class="sui-notice-content">
|
211 |
-
|
212 |
-
<div class="sui-notice-message">
|
213 |
-
|
214 |
-
<span class="sui-notice-icon sui-icon-info" aria-hidden="true"></span>
|
215 |
-
|
216 |
-
<p>' . $notice_message . '</p>
|
217 |
-
|
218 |
-
</div>
|
219 |
-
|
220 |
-
</div>
|
221 |
-
|
222 |
-
</div>',
|
223 |
-
'redirect' => false,
|
224 |
-
'is_close' => ( $is_submit && empty( $error_message ) && empty( $input_error_messages ) ),
|
225 |
-
'buttons' => $buttons,
|
226 |
-
'has_errors' => ( ! empty( $error_message ) || ! empty( $input_error_messages ) ),
|
227 |
-
'notification' => $notification,
|
228 |
-
);
|
229 |
-
|
230 |
-
}
|
231 |
-
|
232 |
-
|
233 |
-
/**
|
234 |
-
* Sending test sample to zapier webhook URL
|
235 |
-
* Data sent will be used on zapier to map fields on their zap action
|
236 |
-
*
|
237 |
-
* @since 1.0 Zapier Addon
|
238 |
-
*
|
239 |
-
* @param $submitted_data
|
240 |
-
* @param Forminator_Addon_Zapier_Form_Settings_Exception $current_input_exception
|
241 |
-
*
|
242 |
-
* @throws Forminator_Addon_Zapier_Form_Settings_Exception
|
243 |
-
* @throws Forminator_Addon_Zapier_Wp_Api_Not_Found_Exception
|
244 |
-
* @throws Forminator_Addon_Zapier_Wp_Api_Exception
|
245 |
-
*/
|
246 |
-
private function validate_and_send_sample( $submitted_data, Forminator_Addon_Zapier_Form_Settings_Exception $current_input_exception ) {
|
247 |
-
$form_id = $this->form_id;
|
248 |
-
if ( ! isset( $submitted_data['webhook_url'] ) ) {
|
249 |
-
$current_input_exception->add_input_exception( __( 'Please put a valid Webhook URL.', 'forminator' ), 'webhook_url' );
|
250 |
-
throw $current_input_exception;
|
251 |
-
}
|
252 |
-
|
253 |
-
// must be this prefix.
|
254 |
-
if ( stripos( $submitted_data['webhook_url'], 'https://hooks.zapier.com/' ) !== 0 ) {
|
255 |
-
$current_input_exception->add_input_exception( __( 'Please put a valid Webhook URL.', 'forminator' ), 'webhook_url' );
|
256 |
-
throw $current_input_exception;
|
257 |
-
}
|
258 |
-
|
259 |
-
// must not be in silent mode.
|
260 |
-
if ( stripos( $submitted_data['webhook_url'], 'silent' ) !== false ) {
|
261 |
-
$current_input_exception->add_input_exception( __( 'Please disable Silent Mode on Webhook URL.', 'forminator' ), 'webhook_url' );
|
262 |
-
throw $current_input_exception;
|
263 |
-
}
|
264 |
-
|
265 |
-
$endpoint = wp_http_validate_url( $submitted_data['webhook_url'] );
|
266 |
-
if ( false === $endpoint ) {
|
267 |
-
$current_input_exception->add_input_exception( __( 'Please put a valid Webhook URL.', 'forminator' ), 'webhook_url' );
|
268 |
-
throw $current_input_exception;
|
269 |
-
}
|
270 |
-
|
271 |
-
if ( $current_input_exception->input_exceptions_is_available() ) {
|
272 |
-
throw $current_input_exception;
|
273 |
-
}
|
274 |
-
|
275 |
-
$connection_settings = $submitted_data;
|
276 |
-
/**
|
277 |
-
* Filter Endpoint Webhook URL to send
|
278 |
-
*
|
279 |
-
* @since 1.1
|
280 |
-
*
|
281 |
-
* @param string $endpoint
|
282 |
-
* @param int $form_id current Form ID.
|
283 |
-
* @param array $connection_settings Submitted data by user, it contains `name` and `webhook_url`.
|
284 |
-
*/
|
285 |
-
$endpoint = apply_filters(
|
286 |
-
'forminator_addon_zapier_endpoint',
|
287 |
-
$endpoint,
|
288 |
-
$form_id,
|
289 |
-
$connection_settings
|
290 |
-
);
|
291 |
-
|
292 |
-
forminator_addon_maybe_log( __METHOD__, $endpoint );
|
293 |
-
$api = $this->addon->get_api( $endpoint );
|
294 |
-
|
295 |
-
// build form sample data.
|
296 |
-
$sample_data = $this->build_form_sample_data();
|
297 |
-
$sample_data['is_test'] = true;
|
298 |
-
|
299 |
-
/**
|
300 |
-
* Filter sample data to send to Zapier Webhook URL
|
301 |
-
*
|
302 |
-
* It fires when user saved Zapier connection on Form Settings Page.
|
303 |
-
* Sample data contains `is_test` key with value `true`,
|
304 |
-
* this key indicating that it wont process trigger on Zapier.
|
305 |
-
*
|
306 |
-
* @since 1.1
|
307 |
-
*
|
308 |
-
* @param array $sample_data
|
309 |
-
* @param int $form_id current Form ID.
|
310 |
-
* @param array $submitted_data Submitted data by user, it contains `name` and `webhook_url`.
|
311 |
-
*/
|
312 |
-
$sample_data = apply_filters(
|
313 |
-
'forminator_addon_zapier_sample_data',
|
314 |
-
$sample_data,
|
315 |
-
$form_id,
|
316 |
-
$submitted_data
|
317 |
-
);
|
318 |
-
|
319 |
-
$api->post_( $sample_data );
|
320 |
-
}
|
321 |
-
|
322 |
-
/**
|
323 |
-
* Build seample data form current fields
|
324 |
-
*
|
325 |
-
* @since 1.0 Zapier Addon
|
326 |
-
*
|
327 |
-
* @return array
|
328 |
-
*/
|
329 |
-
private function build_form_sample_data() {
|
330 |
-
$form_fields = $this->form_fields;
|
331 |
-
|
332 |
-
$sample_data = array();
|
333 |
-
foreach ( $form_fields as $form_field ) {
|
334 |
-
$sample_data[ $form_field['element_id'] ] = $form_field['field_label'];
|
335 |
-
|
336 |
-
if ( 'upload' === $form_field['type'] ) {
|
337 |
-
|
338 |
-
$sample_file_path = '/fake/path';
|
339 |
-
$upload_dir = wp_get_upload_dir();
|
340 |
-
if ( isset( $upload_dir['basedir'] ) ) {
|
341 |
-
$sample_file_path = $upload_dir['basedir'];
|
342 |
-
}
|
343 |
-
|
344 |
-
$sample_data[ $form_field['element_id'] ] = array(
|
345 |
-
'name' => $form_field['field_label'],
|
346 |
-
'type' => 'image/png',
|
347 |
-
'size' => 0,
|
348 |
-
'file_url' => get_home_url(),
|
349 |
-
'file_path' => $sample_file_path,
|
350 |
-
);
|
351 |
-
}
|
352 |
-
}
|
353 |
-
|
354 |
-
//send form title, date
|
355 |
-
$sample_data['form-title'] = $this->form_settings['formName'];
|
356 |
-
$sample_data['entry-time'] = current_time( 'Y-m-d H:i:s' );
|
357 |
-
|
358 |
-
// wrap in array as zapier best practices.
|
359 |
-
return array( $sample_data );
|
360 |
-
}
|
361 |
-
|
362 |
-
/**
|
363 |
-
* Check if setup webhook url is completed
|
364 |
-
*
|
365 |
-
* @since 1.0 Zapier Addon
|
366 |
-
*
|
367 |
-
* @param $submitted_data
|
368 |
-
*
|
369 |
-
* @return bool
|
370 |
-
*/
|
371 |
-
public function setup_webhook_url_is_completed( $submitted_data ) {
|
372 |
-
|
373 |
-
$multi_id = '';
|
374 |
-
if ( isset( $submitted_data['multi_id'] ) ) {
|
375 |
-
$multi_id = $submitted_data['multi_id'];
|
376 |
-
}
|
377 |
-
|
378 |
-
if ( empty( $multi_id ) ) {
|
379 |
-
return false;
|
380 |
-
}
|
381 |
-
|
382 |
-
$name = $this->get_multi_id_form_settings_value( $multi_id, 'name', '' );
|
383 |
-
$name = trim( $name );
|
384 |
-
if ( empty( $name ) ) {
|
385 |
-
return false;
|
386 |
-
}
|
387 |
-
$webhook_url = $this->get_multi_id_form_settings_value( $multi_id, 'webhook_url', '' );
|
388 |
-
$webhook_url = trim( $webhook_url );
|
389 |
-
if ( empty( $webhook_url ) ) {
|
390 |
-
return false;
|
391 |
-
}
|
392 |
-
|
393 |
-
return true;
|
394 |
-
}
|
395 |
-
|
396 |
-
/**
|
397 |
-
* Find one active connection on current form
|
398 |
-
*
|
399 |
-
* @since 1.0 Zapier Addon
|
400 |
-
*
|
401 |
-
* @return bool|array false on no connection, or settings on available
|
402 |
-
*/
|
403 |
-
public function find_one_active_connection() {
|
404 |
-
$addon_form_settings = $this->get_form_settings_values();
|
405 |
-
|
406 |
-
// backward compat old version.
|
407 |
-
if ( isset( $addon_form_settings['webhook_url'] ) ) {
|
408 |
-
// convert to multi id type.
|
409 |
-
$new_id = $this->generate_multi_id();
|
410 |
-
$addon_form_settings['name'] = $new_id;
|
411 |
-
$this->save_form_settings_values( array( $new_id => $addon_form_settings ) );
|
412 |
-
|
413 |
-
return $this->find_one_active_connection();
|
414 |
-
}
|
415 |
-
|
416 |
-
foreach ( $addon_form_settings as $multi_id => $addon_form_setting ) {
|
417 |
-
if ( true === $this->setup_webhook_url_is_completed( array( 'multi_id' => $multi_id ) ) ) {
|
418 |
-
return $addon_form_setting;
|
419 |
-
}
|
420 |
-
}
|
421 |
-
|
422 |
-
return false;
|
423 |
-
}
|
424 |
-
|
425 |
-
/**
|
426 |
-
* Generate multi id for multiple connection
|
427 |
-
*
|
428 |
-
* @since 1.0 Zapier Addon
|
429 |
-
* @since 1.2 change method to non static
|
430 |
-
* @return string
|
431 |
-
*/
|
432 |
-
public function generate_multi_id() {
|
433 |
-
return uniqid( 'zapier_', true );
|
434 |
-
}
|
435 |
-
|
436 |
-
|
437 |
-
/**
|
438 |
-
* Override how multi connection displayed
|
439 |
-
*
|
440 |
-
* @since 1.0 Zapier Addon
|
441 |
-
* @return array
|
442 |
-
*/
|
443 |
-
public function get_multi_ids() {
|
444 |
-
$multi_ids = array();
|
445 |
-
foreach ( $this->get_form_settings_values() as $key => $value ) {
|
446 |
-
$multi_ids[] = array(
|
447 |
-
'id' => $key,
|
448 |
-
// use name that was added by user on creating connection.
|
449 |
-
'label' => isset( $value['name'] ) ? $value['name'] : $key,
|
450 |
-
);
|
451 |
-
}
|
452 |
-
|
453 |
-
return $multi_ids;
|
454 |
-
}
|
455 |
-
|
456 |
-
/**
|
457 |
-
* Disconnect a connection from current form
|
458 |
-
*
|
459 |
-
* @since 1.0 Zapier Addon
|
460 |
-
*
|
461 |
-
* @param array $submitted_data
|
462 |
-
*/
|
463 |
-
public function disconnect_form( $submitted_data ) {
|
464 |
-
// only execute if multi_id provided on submitted data.
|
465 |
-
if ( isset( $submitted_data['multi_id'] ) && ! empty( $submitted_data['multi_id'] ) ) {
|
466 |
-
$addon_form_settings = $this->get_form_settings_values();
|
467 |
-
unset( $addon_form_settings[ $submitted_data['multi_id'] ] );
|
468 |
-
$this->save_form_settings_values( $addon_form_settings );
|
469 |
-
}
|
470 |
-
}
|
471 |
-
|
472 |
-
/**
|
473 |
-
* Check if multi_id form settings values completed
|
474 |
-
*
|
475 |
-
* @param int $multi_id ID.
|
476 |
-
* @return bool
|
477 |
-
*/
|
478 |
-
public function is_multi_form_settings_complete( $multi_id ) {
|
479 |
-
$data = array( 'multi_id' => $multi_id );
|
480 |
-
|
481 |
-
if ( ! $this->setup_webhook_url_is_completed( $data ) ) {
|
482 |
-
return false;
|
483 |
-
}
|
484 |
-
|
485 |
-
return true;
|
486 |
-
}
|
487 |
}
|
1 |
<?php
|
2 |
|
|
|
|
|
3 |
/**
|
4 |
+
* Moved to Webhook integration.
|
5 |
+
* Leave it here to avoid Fatal errors during updating plugin.
|
6 |
+
* Remove zapier folder after several versions.
|
|
|
7 |
*/
|
8 |
class Forminator_Addon_Zapier_Form_Settings extends Forminator_Addon_Form_Settings_Abstract {
|
9 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
10 |
}
|
addons/pro/zapier/class-forminator-addon-zapier-poll-hooks.php
CHANGED
@@ -1,364 +1,10 @@
|
|
1 |
<?php
|
2 |
|
3 |
/**
|
4 |
-
*
|
5 |
-
*
|
6 |
-
*
|
7 |
-
*
|
8 |
*/
|
9 |
class Forminator_Addon_Zapier_Poll_Hooks extends Forminator_Addon_Poll_Hooks_Abstract {
|
10 |
|
11 |
-
/**
|
12 |
-
* Addon instance are auto available form abstract
|
13 |
-
* Its added here for development purpose,
|
14 |
-
* Auto-complete will resolve addon directly to `Zapier` instance instead of the abstract
|
15 |
-
* And its public properties can be exposed
|
16 |
-
*
|
17 |
-
* @since 1.6.1
|
18 |
-
* @var Forminator_Addon_Zapier
|
19 |
-
*/
|
20 |
-
protected $addon;
|
21 |
-
|
22 |
-
/**
|
23 |
-
* Poll Settings Instance
|
24 |
-
*
|
25 |
-
* @since 1.6.1
|
26 |
-
* @var Forminator_Addon_Zapier_Poll_Settings | null
|
27 |
-
*/
|
28 |
-
protected $poll_settings_instance;
|
29 |
-
|
30 |
-
/**
|
31 |
-
* Forminator_Addon_Zapier_Poll_Hooks constructor.
|
32 |
-
*
|
33 |
-
* @since 1.6.1
|
34 |
-
*
|
35 |
-
* @param Forminator_Addon_Abstract $addon
|
36 |
-
* @param $poll_id
|
37 |
-
*
|
38 |
-
* @throws Forminator_Addon_Exception
|
39 |
-
*/
|
40 |
-
public function __construct( Forminator_Addon_Abstract $addon, $poll_id ) {
|
41 |
-
parent::__construct( $addon, $poll_id );
|
42 |
-
$this->_submit_poll_error_message = __( 'Zapier failed to process submitted data. Please check your form and try again', 'forminator' );
|
43 |
-
}
|
44 |
-
|
45 |
-
/**
|
46 |
-
* Save status of request sent and received for each connected zap(s)
|
47 |
-
*
|
48 |
-
* @since 1.6.1
|
49 |
-
*
|
50 |
-
* @param array $submitted_data
|
51 |
-
* @param array $current_entry_fields
|
52 |
-
*
|
53 |
-
* @return array
|
54 |
-
*/
|
55 |
-
public function add_entry_fields( $submitted_data, $current_entry_fields = array() ) {
|
56 |
-
|
57 |
-
$poll_id = $this->poll_id;
|
58 |
-
$poll_settings_instance = $this->poll_settings_instance;
|
59 |
-
|
60 |
-
/**
|
61 |
-
* Filter zapier submitted form data to be processed
|
62 |
-
*
|
63 |
-
* @since 1.6.1
|
64 |
-
*
|
65 |
-
* @param array $submitted_data
|
66 |
-
* @param int $poll_id current Form ID.
|
67 |
-
* @param Forminator_Addon_Zapier_Form_Settings $poll_settings_instance Zapier Addon Form Settings instance.
|
68 |
-
*/
|
69 |
-
$submitted_data = apply_filters(
|
70 |
-
'forminator_addon_zapier_poll_submitted_data',
|
71 |
-
$submitted_data,
|
72 |
-
$poll_id,
|
73 |
-
$poll_settings_instance
|
74 |
-
);
|
75 |
-
|
76 |
-
forminator_addon_maybe_log( __METHOD__, $submitted_data );
|
77 |
-
|
78 |
-
$addon_setting_values = $this->poll_settings_instance->get_poll_settings_values();
|
79 |
-
$poll_settings = $this->poll_settings_instance->get_poll_settings();
|
80 |
-
|
81 |
-
$data = array();
|
82 |
-
|
83 |
-
/**
|
84 |
-
* Fires before sending data to Webhook URL(s)
|
85 |
-
*
|
86 |
-
* @since 1.6.1
|
87 |
-
*
|
88 |
-
* @param int $poll_id current Poll ID.
|
89 |
-
* @param array $submitted_data
|
90 |
-
* @param Forminator_Addon_Zapier_Poll_Settings $poll_settings_instance Zapier Addon Poll Settings instance.
|
91 |
-
*/
|
92 |
-
do_action( 'forminator_addon_zapier_poll_before_post_to_webhook', $poll_id, $submitted_data, $poll_settings_instance );
|
93 |
-
|
94 |
-
foreach ( $addon_setting_values as $key => $addon_setting_value ) {
|
95 |
-
// save it on entry field, with name `status-$MULTI_ID`, and value is the return result on sending data to zapier.
|
96 |
-
$data[] = array(
|
97 |
-
'name' => 'status-' . $key,
|
98 |
-
'value' => $this->get_status_on_send_data( $key, $submitted_data, $addon_setting_value, $poll_settings ),
|
99 |
-
);
|
100 |
-
}
|
101 |
-
|
102 |
-
$entry_fields = $data;
|
103 |
-
/**
|
104 |
-
* Filter zapier entry fields to be saved to entry model
|
105 |
-
*
|
106 |
-
* @since 1.6.1
|
107 |
-
*
|
108 |
-
* @param array $entry_fields
|
109 |
-
* @param int $poll_id current Poll ID.
|
110 |
-
* @param array $submitted_data
|
111 |
-
* @param Forminator_Addon_Zapier_Poll_Settings $poll_settings_instance Zapier Poll Settings instance.
|
112 |
-
*/
|
113 |
-
$data = apply_filters(
|
114 |
-
'forminator_addon_zapier_poll_entry_fields',
|
115 |
-
$entry_fields,
|
116 |
-
$poll_id,
|
117 |
-
$submitted_data,
|
118 |
-
$poll_settings_instance
|
119 |
-
);
|
120 |
-
|
121 |
-
return $data;
|
122 |
-
|
123 |
-
}
|
124 |
-
|
125 |
-
/**
|
126 |
-
* Get status on sending data to zapier
|
127 |
-
*
|
128 |
-
* @since 1.6.1
|
129 |
-
*
|
130 |
-
* @param $connection_id
|
131 |
-
* @param $submitted_data
|
132 |
-
* @param $connection_settings
|
133 |
-
* @param $poll_settings
|
134 |
-
*
|
135 |
-
* @return array `is_sent` true means its success send data to zapier, false otherwise
|
136 |
-
*/
|
137 |
-
private function get_status_on_send_data( $connection_id, $submitted_data, $connection_settings, $poll_settings ) {
|
138 |
-
// initialize as null.
|
139 |
-
$zapier_api = null;
|
140 |
-
|
141 |
-
$poll_id = $this->poll_id;
|
142 |
-
$poll_settings_instance = $this->poll_settings_instance;
|
143 |
-
|
144 |
-
//check required fields
|
145 |
-
try {
|
146 |
-
if ( ! isset( $connection_settings['webhook_url'] ) ) {
|
147 |
-
throw new Forminator_Addon_Zapier_Exception( __( 'Webhook URL is not properly setup', 'forminator' ) );
|
148 |
-
}
|
149 |
-
|
150 |
-
$endpoint = $connection_settings['webhook_url'];
|
151 |
-
/**
|
152 |
-
* Filter Endpoint Webhook URL to send
|
153 |
-
*
|
154 |
-
* @since 1.6.1
|
155 |
-
*
|
156 |
-
* @param string $endpoint
|
157 |
-
* @param int $poll_id current Form ID.
|
158 |
-
* @param array $connection_settings current connection setting, it contains `name` and `webhook_url`.
|
159 |
-
*/
|
160 |
-
$endpoint = apply_filters(
|
161 |
-
'forminator_addon_zapier_poll_endpoint',
|
162 |
-
$endpoint,
|
163 |
-
$poll_id,
|
164 |
-
$connection_settings
|
165 |
-
);
|
166 |
-
|
167 |
-
$zapier_api = $this->addon->get_api( $endpoint );
|
168 |
-
|
169 |
-
$args = array();
|
170 |
-
$args['poll-name'] = forminator_get_name_from_model( $this->poll );
|
171 |
-
|
172 |
-
$answer_data = isset( $submitted_data[ $this->poll_id ] ) ? $submitted_data[ $this->poll_id ] : '';
|
173 |
-
$extra_field = isset( $submitted_data[ $this->poll_id . '-extra' ] ) ? $submitted_data[ $this->poll_id . '-extra' ] : '';
|
174 |
-
$fields_labels = $this->poll->pluck_fields_array( 'title', 'element_id', '1' );
|
175 |
-
|
176 |
-
$answer = isset( $fields_labels[ $answer_data ] ) ? $fields_labels[ $answer_data ] : $answer_data;
|
177 |
-
$extra = $extra_field;
|
178 |
-
|
179 |
-
$args['vote'] = $answer;
|
180 |
-
$args['vote-extra'] = $extra;
|
181 |
-
$args['results'] = array();
|
182 |
-
|
183 |
-
$fields_array = $this->poll->get_fields_as_array();
|
184 |
-
$map_entries = Forminator_Form_Entry_Model::map_polls_entries( $this->poll_id, $fields_array );
|
185 |
-
|
186 |
-
// append new answer.
|
187 |
-
if ( ! $this->poll->is_prevent_store() ) {
|
188 |
-
$answer_data = isset( $submitted_data[ $this->poll_id ] ) ? $submitted_data[ $this->poll_id ] : '';
|
189 |
-
|
190 |
-
$entries = 0;
|
191 |
-
// exists on map entries.
|
192 |
-
if ( in_array( $answer_data, array_keys( $map_entries ), true ) ) {
|
193 |
-
$entries = $map_entries[ $answer_data ];
|
194 |
-
}
|
195 |
-
|
196 |
-
$entries ++;
|
197 |
-
$map_entries[ $answer_data ] = $entries;
|
198 |
-
|
199 |
-
}
|
200 |
-
|
201 |
-
$fields = $this->poll->get_fields();
|
202 |
-
|
203 |
-
if ( ! is_null( $fields ) ) {
|
204 |
-
foreach ( $fields as $field ) {
|
205 |
-
$label = addslashes( $field->title );
|
206 |
-
|
207 |
-
$slug = isset( $field->slug ) ? $field->slug : sanitize_title( $label );
|
208 |
-
$entries = 0;
|
209 |
-
if ( in_array( $slug, array_keys( $map_entries ), true ) ) {
|
210 |
-
$entries = $map_entries[ $slug ];
|
211 |
-
}
|
212 |
-
$args['results'][ $slug ] = array(
|
213 |
-
'label' => $label,
|
214 |
-
'votes' => $entries,
|
215 |
-
);
|
216 |
-
}
|
217 |
-
}
|
218 |
-
|
219 |
-
/**
|
220 |
-
* Filter arguments to passed on to Zapier Webhook API
|
221 |
-
*
|
222 |
-
* @since 1.6.1
|
223 |
-
*
|
224 |
-
* @param array $args
|
225 |
-
* @param int $poll_id Current Poll id.
|
226 |
-
* @param string $connection_id ID of current connection.
|
227 |
-
* @param array $submitted_data
|
228 |
-
* @param array $connection_settings current connection setting, contains `name` and `webhook_url`.
|
229 |
-
* @param array $poll_settings Displayed Poll settings.
|
230 |
-
* @param Forminator_Addon_Zapier_Poll_Settings $poll_settings_instance Zapier Poll Settings instance.
|
231 |
-
*/
|
232 |
-
$args = apply_filters(
|
233 |
-
'forminator_addon_zapier_poll_post_to_webhook_args',
|
234 |
-
$args,
|
235 |
-
$poll_id,
|
236 |
-
$connection_id,
|
237 |
-
$submitted_data,
|
238 |
-
$connection_settings,
|
239 |
-
$poll_settings,
|
240 |
-
$poll_settings_instance
|
241 |
-
);
|
242 |
-
|
243 |
-
$zapier_api->post_( $args );
|
244 |
-
|
245 |
-
forminator_addon_maybe_log( __METHOD__, 'Success Send Data' );
|
246 |
-
|
247 |
-
return array(
|
248 |
-
'is_sent' => true,
|
249 |
-
'connection_name' => $connection_settings['name'],
|
250 |
-
'description' => __( 'Successfully send data to Zapier', 'forminator' ),
|
251 |
-
'data_sent' => $zapier_api->get_last_data_sent(),
|
252 |
-
'data_received' => $zapier_api->get_last_data_received(),
|
253 |
-
'url_request' => $zapier_api->get_last_url_request(),
|
254 |
-
);
|
255 |
-
|
256 |
-
} catch ( Forminator_Addon_Zapier_Exception $e ) {
|
257 |
-
forminator_addon_maybe_log( __METHOD__, 'Failed to Send to Zapier' );
|
258 |
-
|
259 |
-
return array(
|
260 |
-
'is_sent' => false,
|
261 |
-
'description' => $e->getMessage(),
|
262 |
-
'connection_name' => $connection_settings['name'],
|
263 |
-
'data_sent' => ( ( $zapier_api instanceof Forminator_Addon_Zapier_Wp_Api ) ? $zapier_api->get_last_data_sent() : array() ),
|
264 |
-
'data_received' => ( ( $zapier_api instanceof Forminator_Addon_Zapier_Wp_Api ) ? $zapier_api->get_last_data_received() : array() ),
|
265 |
-
'url_request' => ( ( $zapier_api instanceof Forminator_Addon_Zapier_Wp_Api ) ? $zapier_api->get_last_url_request() : '' ),
|
266 |
-
);
|
267 |
-
}
|
268 |
-
}
|
269 |
-
|
270 |
-
/**
|
271 |
-
* Zapier will add a column on the title/header row
|
272 |
-
* its called `Zapier Info` which can be translated on forminator lang
|
273 |
-
*
|
274 |
-
* @since 1.6.1
|
275 |
-
* @return array
|
276 |
-
*/
|
277 |
-
public function on_export_render_title_row() {
|
278 |
-
|
279 |
-
$export_headers = array(
|
280 |
-
'info' => __( 'Zapier Info', 'forminator' ),
|
281 |
-
);
|
282 |
-
|
283 |
-
$poll_id = $this->poll_id;
|
284 |
-
$poll_settings_instance = $this->poll_settings_instance;
|
285 |
-
|
286 |
-
/**
|
287 |
-
* Filter zapier headers on export file
|
288 |
-
*
|
289 |
-
* @since 1.6.1
|
290 |
-
*
|
291 |
-
* @param array $export_headers headers to be displayed on export file.
|
292 |
-
* @param int $poll_id current Form ID.
|
293 |
-
* @param Forminator_Addon_Zapier_Poll_Settings $poll_settings_instance Zapier Poll Settings instance.
|
294 |
-
*/
|
295 |
-
$export_headers = apply_filters(
|
296 |
-
'forminator_addon_zapier_poll_export_headers',
|
297 |
-
$export_headers,
|
298 |
-
$poll_id,
|
299 |
-
$poll_settings_instance
|
300 |
-
);
|
301 |
-
|
302 |
-
return $export_headers;
|
303 |
-
}
|
304 |
-
|
305 |
-
/**
|
306 |
-
* Zapier will add a column that give user information whether sending data to zapier successfully or not
|
307 |
-
* It will only add one column even its multiple connection, every connection will be separated by comma
|
308 |
-
*
|
309 |
-
* @since 1.6.1
|
310 |
-
*
|
311 |
-
* @param Forminator_Form_Entry_Model $entry_model
|
312 |
-
* @param $addon_meta_data
|
313 |
-
*
|
314 |
-
* @return array
|
315 |
-
*/
|
316 |
-
public function on_export_render_entry( Forminator_Form_Entry_Model $entry_model, $addon_meta_data ) {
|
317 |
-
|
318 |
-
$poll_id = $this->poll_id;
|
319 |
-
$poll_settings_instance = $this->poll_settings_instance;
|
320 |
-
|
321 |
-
/**
|
322 |
-
*
|
323 |
-
* Filter zapier metadata that previously saved on db to be processed
|
324 |
-
*
|
325 |
-
* @since 1.1
|
326 |
-
*
|
327 |
-
* @param array $addon_meta_data
|
328 |
-
* @param int $poll_id current Poll ID.
|
329 |
-
* @param Forminator_Addon_Zapier_Poll_Settings $poll_settings_instance Zapier Poll Settings instance.
|
330 |
-
*/
|
331 |
-
$addon_meta_data = apply_filters(
|
332 |
-
'forminator_addon_zapier_poll_metadata',
|
333 |
-
$addon_meta_data,
|
334 |
-
$poll_id,
|
335 |
-
$poll_settings_instance
|
336 |
-
);
|
337 |
-
|
338 |
-
$export_columns = array(
|
339 |
-
'info' => $this->get_from_addon_meta_data( $addon_meta_data, 'description', '' ),
|
340 |
-
);
|
341 |
-
|
342 |
-
/**
|
343 |
-
* Filter zapier columns to be displayed on export submissions
|
344 |
-
*
|
345 |
-
* @since 1.6.1
|
346 |
-
*
|
347 |
-
* @param array $export_columns column to be exported.
|
348 |
-
* @param int $poll_id current Poll ID.
|
349 |
-
* @param Forminator_Form_Entry_Model $entry_model Form Entry Model.
|
350 |
-
* @param array $addon_meta_data meta data saved by addon on entry fields.
|
351 |
-
* @param Forminator_Addon_Zapier_Poll_Settings $poll_settings_instance Zapier Poll Settings instance.
|
352 |
-
*/
|
353 |
-
$export_columns = apply_filters(
|
354 |
-
'forminator_addon_zapier_poll_export_columns',
|
355 |
-
$export_columns,
|
356 |
-
$poll_id,
|
357 |
-
$entry_model,
|
358 |
-
$addon_meta_data,
|
359 |
-
$poll_settings_instance
|
360 |
-
);
|
361 |
-
|
362 |
-
return $export_columns;
|
363 |
-
}
|
364 |
}
|
1 |
<?php
|
2 |
|
3 |
/**
|
4 |
+
* Moved to Webhook integration.
|
5 |
+
* Leave it here to avoid Fatal errors during updating plugin.
|
6 |
+
* Remove zapier folder after several versions.
|
|
|
7 |
*/
|
8 |
class Forminator_Addon_Zapier_Poll_Hooks extends Forminator_Addon_Poll_Hooks_Abstract {
|
9 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
10 |
}
|
addons/pro/zapier/class-forminator-addon-zapier-poll-settings-exception.php
CHANGED
@@ -1,68 +1,9 @@
|
|
1 |
<?php
|
2 |
|
3 |
/**
|
4 |
-
*
|
5 |
-
*
|
6 |
-
*
|
7 |
-
* @since 1.6.1
|
8 |
*/
|
9 |
class Forminator_Addon_Zapier_Poll_Settings_Exception extends Forminator_Addon_Zapier_Exception {
|
10 |
-
|
11 |
-
/**
|
12 |
-
* Holder of input exceptions
|
13 |
-
*
|
14 |
-
* @since 1.6.1
|
15 |
-
* @var array
|
16 |
-
*/
|
17 |
-
protected $input_exceptions = array();
|
18 |
-
|
19 |
-
/**
|
20 |
-
* Forminator_Addon_Zapier_Poll_Settings_Exception constructor.
|
21 |
-
*
|
22 |
-
* Useful if input_id is needed for later.
|
23 |
-
* If no input_id needed, use @see Forminator_Addon_Zapier_Exception
|
24 |
-
*
|
25 |
-
* @since 1.6.1
|
26 |
-
*
|
27 |
-
* @param string $message
|
28 |
-
* @param string $input_id
|
29 |
-
*/
|
30 |
-
public function __construct( $message = '', $input_id = '' ) {
|
31 |
-
parent::__construct( $message, 0 );
|
32 |
-
if ( ! empty( $input_id ) ) {
|
33 |
-
$this->add_input_exception( $message, $input_id );
|
34 |
-
}
|
35 |
-
}
|
36 |
-
|
37 |
-
/**
|
38 |
-
* Set exception message for an input
|
39 |
-
*
|
40 |
-
* @since 1.6.1
|
41 |
-
*
|
42 |
-
* @param $message
|
43 |
-
* @param $input_id
|
44 |
-
*/
|
45 |
-
public function add_input_exception( $message, $input_id ) {
|
46 |
-
$this->input_exceptions[ $input_id ] = $message;
|
47 |
-
}
|
48 |
-
|
49 |
-
/**
|
50 |
-
* Get all input exceptions
|
51 |
-
*
|
52 |
-
* @since 1.6.1
|
53 |
-
* @return array
|
54 |
-
*/
|
55 |
-
public function get_input_exceptions() {
|
56 |
-
return $this->input_exceptions;
|
57 |
-
}
|
58 |
-
|
59 |
-
/**
|
60 |
-
* Check if there is input_exceptions_is_available
|
61 |
-
*
|
62 |
-
* @since 1.6.1
|
63 |
-
* @return bool
|
64 |
-
*/
|
65 |
-
public function input_exceptions_is_available() {
|
66 |
-
return count( $this->input_exceptions ) > 0;
|
67 |
-
}
|
68 |
}
|
1 |
<?php
|
2 |
|
3 |
/**
|
4 |
+
* Moved to Webhook integration.
|
5 |
+
* Leave it here to avoid Fatal errors during updating plugin.
|
6 |
+
* Remove zapier folder after several versions.
|
|
|
7 |
*/
|
8 |
class Forminator_Addon_Zapier_Poll_Settings_Exception extends Forminator_Addon_Zapier_Exception {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
9 |
}
|
addons/pro/zapier/class-forminator-addon-zapier-poll-settings.php
CHANGED
@@ -1,389 +1,10 @@
|
|
1 |
<?php
|
2 |
|
3 |
-
require_once dirname( __FILE__ ) . '/class-forminator-addon-zapier-poll-settings-exception.php';
|
4 |
-
|
5 |
/**
|
6 |
-
*
|
7 |
-
*
|
8 |
-
*
|
9 |
-
* @since 1.6.1
|
10 |
*/
|
11 |
class Forminator_Addon_Zapier_Poll_Settings extends Forminator_Addon_Poll_Settings_Abstract {
|
12 |
|
13 |
-
/**
|
14 |
-
* @var Forminator_Addon_Zapier
|
15 |
-
* @since 1.0 Zapier Addon
|
16 |
-
*/
|
17 |
-
protected $addon;
|
18 |
-
|
19 |
-
/**
|
20 |
-
* Create Zap URL
|
21 |
-
*
|
22 |
-
* @since 1.0 Zapier Addon
|
23 |
-
* @var string
|
24 |
-
*/
|
25 |
-
private $new_zap_url = 'https://zapier.com/app/editor/';
|
26 |
-
|
27 |
-
/**
|
28 |
-
* Forminator_Addon_Zapier_Form_Settings constructor.
|
29 |
-
*
|
30 |
-
* @since 1.0 Zapier Addon
|
31 |
-
*
|
32 |
-
* @param Forminator_Addon_Abstract $addon
|
33 |
-
* @param $form_id
|
34 |
-
*
|
35 |
-
* @throws Forminator_Addon_Exception
|
36 |
-
*/
|
37 |
-
public function __construct( Forminator_Addon_Abstract $addon, $form_id ) {
|
38 |
-
parent::__construct( $addon, $form_id );
|
39 |
-
|
40 |
-
$this->_update_poll_settings_error_message = __(
|
41 |
-
'The update to your settings for this poll failed, check the form input and try again.',
|
42 |
-
'forminator'
|
43 |
-
);
|
44 |
-
}
|
45 |
-
|
46 |
-
/**
|
47 |
-
* Zapier Poll Settings wizard
|
48 |
-
*
|
49 |
-
* @since 1.6.1
|
50 |
-
* @return array
|
51 |
-
*/
|
52 |
-
public function poll_settings_wizards() {
|
53 |
-
// numerical array steps.
|
54 |
-
return array(
|
55 |
-
// 0
|
56 |
-
array(
|
57 |
-
'callback' => array( $this, 'setup_webhook_url' ),
|
58 |
-
'is_completed' => array( $this, 'setup_webhook_url_is_completed' ),
|
59 |
-
),
|
60 |
-
);
|
61 |
-
}
|
62 |
-
|
63 |
-
/**
|
64 |
-
* Setup webhook url
|
65 |
-
*
|
66 |
-
* @since 1.0 Zapier Addon
|
67 |
-
*
|
68 |
-
* @param $submitted_data
|
69 |
-
*
|
70 |
-
* @return array
|
71 |
-
*/
|
72 |
-
public function setup_webhook_url( $submitted_data ) {
|
73 |
-
|
74 |
-
$template = forminator_addon_zapier_dir() . 'views/poll-settings/setup-webhook.php';
|
75 |
-
|
76 |
-
if ( ! isset( $submitted_data['multi_id'] ) ) {
|
77 |
-
return $this->get_force_closed_wizard( __( 'Please pick valid connection', 'forminator' ) );
|
78 |
-
}
|
79 |
-
|
80 |
-
$multi_id = $submitted_data['multi_id'];
|
81 |
-
unset( $submitted_data['multi_id'] );
|
82 |
-
|
83 |
-
$template_params = array(
|
84 |
-
'new_zap_url' => $this->new_zap_url,
|
85 |
-
'name' => $this->get_multi_id_poll_settings_value( $multi_id, 'name', '' ),
|
86 |
-
'webhook_url' => $this->get_multi_id_poll_settings_value( $multi_id, 'webhook_url', '' ),
|
87 |
-
'multi_id' => $multi_id,
|
88 |
-
);
|
89 |
-
|
90 |
-
$is_submit = ! empty( $submitted_data );
|
91 |
-
$has_errors = false;
|
92 |
-
$is_close = false;
|
93 |
-
$notification = array();
|
94 |
-
|
95 |
-
if ( $is_submit ) {
|
96 |
-
$name = isset( $submitted_data['name'] ) ? trim( $submitted_data['name'] ) : '';
|
97 |
-
$template_params['name'] = $name;
|
98 |
-
|
99 |
-
$webhook_url = isset( $submitted_data['webhook_url'] ) ? trim( $submitted_data['webhook_url'] ) : '';
|
100 |
-
$template_params['webhook_url'] = $webhook_url;
|
101 |
-
|
102 |
-
try {
|
103 |
-
$input_exceptions = new Forminator_Addon_Zapier_Poll_Settings_Exception();
|
104 |
-
|
105 |
-
if ( empty( $name ) ) {
|
106 |
-
$input_exceptions->add_input_exception( __( 'Please specify integration name.', 'forminator' ), 'name_error' );
|
107 |
-
}
|
108 |
-
|
109 |
-
$this->validate_and_send_sample( $submitted_data, $input_exceptions );
|
110 |
-
|
111 |
-
if ( $input_exceptions->input_exceptions_is_available() ) {
|
112 |
-
throw $input_exceptions;
|
113 |
-
}
|
114 |
-
|
115 |
-
$time_added = $this->get_multi_id_poll_settings_value( $multi_id, 'time_added', time() );
|
116 |
-
$this->save_multi_id_poll_setting_values(
|
117 |
-
$multi_id,
|
118 |
-
array(
|
119 |
-
'name' => $name,
|
120 |
-
'webhook_url' => $webhook_url,
|
121 |
-
'time_added' => $time_added,
|
122 |
-
)
|
123 |
-
);
|
124 |
-
|
125 |
-
$notification = array(
|
126 |
-
'type' => 'success',
|
127 |
-
'text' => '<strong>' . $this->addon->get_title() . '</strong> ' . __( 'Successfully connected and sent sample data to your ZAP', 'forminator' ),
|
128 |
-
);
|
129 |
-
$is_close = true;
|
130 |
-
|
131 |
-
} catch ( Forminator_Addon_Zapier_Poll_Settings_Exception $e ) {
|
132 |
-
$template_params = array_merge( $template_params, $e->get_input_exceptions() );
|
133 |
-
$has_errors = true;
|
134 |
-
} catch ( Forminator_Addon_Zapier_Exception $e ) {
|
135 |
-
$template_params['error_message'] = $e->getMessage();
|
136 |
-
$has_errors = true;
|
137 |
-
}
|
138 |
-
}
|
139 |
-
|
140 |
-
$buttons = array();
|
141 |
-
if ( $this->setup_webhook_url_is_completed( array( 'multi_id' => $multi_id ) ) ) {
|
142 |
-
$buttons['disconnect']['markup'] = Forminator_Addon_Zapier::get_button_markup(
|
143 |
-
esc_html__( 'Deactivate', 'forminator' ),
|
144 |
-
'sui-button-ghost sui-tooltip sui-tooltip-top-center forminator-addon-form-disconnect',
|
145 |
-
esc_html__( 'Deactivate Zapier from this Poll.', 'forminator' )
|
146 |
-
);
|
147 |
-
}
|
148 |
-
|
149 |
-
$buttons['next']['markup'] = '<div class="sui-actions-right">' .
|
150 |
-
Forminator_Addon_Zapier::get_button_markup( esc_html__( 'Save', 'forminator' ), 'sui-button-primary forminator-addon-finish' ) .
|
151 |
-
'</div>';
|
152 |
-
|
153 |
-
return array(
|
154 |
-
'html' => Forminator_Addon_Abstract::get_template( $template, $template_params ),
|
155 |
-
'buttons' => $buttons,
|
156 |
-
'redirect' => false,
|
157 |
-
'has_errors' => $has_errors,
|
158 |
-
'has_back' => false,
|
159 |
-
'is_close' => $is_close,
|
160 |
-
'notification' => $notification,
|
161 |
-
);
|
162 |
-
|
163 |
-
}
|
164 |
-
|
165 |
-
|
166 |
-
/**
|
167 |
-
* Sending test sample to zapier webhook URL
|
168 |
-
* Data sent will be used on zapier to map fields on their zap action
|
169 |
-
*
|
170 |
-
* @since 1.0 Zapier Addon
|
171 |
-
*
|
172 |
-
* @param $submitted_data
|
173 |
-
* @param Forminator_Addon_Zapier_Poll_Settings_Exception $current_input_exception
|
174 |
-
*
|
175 |
-
* @throws Forminator_Addon_Zapier_Poll_Settings_Exception
|
176 |
-
* @throws Forminator_Addon_Zapier_Wp_Api_Not_Found_Exception
|
177 |
-
* @throws Forminator_Addon_Zapier_Wp_Api_Exception
|
178 |
-
*/
|
179 |
-
private function validate_and_send_sample( $submitted_data, Forminator_Addon_Zapier_Poll_Settings_Exception $current_input_exception ) {
|
180 |
-
$poll_id = $this->poll_id;
|
181 |
-
if ( ! isset( $submitted_data['webhook_url'] ) ) {
|
182 |
-
$current_input_exception->add_input_exception( __( 'Please put a valid Webhook URL.', 'forminator' ), 'webhook_url_error' );
|
183 |
-
throw $current_input_exception;
|
184 |
-
}
|
185 |
-
|
186 |
-
// must be this prefix.
|
187 |
-
if ( stripos( $submitted_data['webhook_url'], 'https://hooks.zapier.com/' ) !== 0 ) {
|
188 |
-
$current_input_exception->add_input_exception( __( 'Please put a valid Webhook URL.', 'forminator' ), 'webhook_url_error' );
|
189 |
-
throw $current_input_exception;
|
190 |
-
}
|
191 |
-
|
192 |
-
// must not be in silent mode.
|
193 |
-
if ( stripos( $submitted_data['webhook_url'], 'silent' ) !== false ) {
|
194 |
-
$current_input_exception->add_input_exception( __( 'Please disable Silent Mode on Webhook URL.', 'forminator' ), 'webhook_url_error' );
|
195 |
-
throw $current_input_exception;
|
196 |
-
}
|
197 |
-
|
198 |
-
$endpoint = wp_http_validate_url( $submitted_data['webhook_url'] );
|
199 |
-
if ( false === $endpoint ) {
|
200 |
-
$current_input_exception->add_input_exception( __( 'Please put a valid Webhook URL.', 'forminator' ), 'webhook_url_error' );
|
201 |
-
throw $current_input_exception;
|
202 |
-
}
|
203 |
-
|
204 |
-
if ( $current_input_exception->input_exceptions_is_available() ) {
|
205 |
-
throw $current_input_exception;
|
206 |
-
}
|
207 |
-
|
208 |
-
$connection_settings = $submitted_data;
|
209 |
-
/**
|
210 |
-
* Filter Endpoint Webhook URL to send
|
211 |
-
*
|
212 |
-
* @since 1.6.1
|
213 |
-
*
|
214 |
-
* @param string $endpoint
|
215 |
-
* @param int $poll_id current Form ID.
|
216 |
-
* @param array $connection_settings Submitted data by user, it contains `name` and `webhook_url`.
|
217 |
-
*/
|
218 |
-
$endpoint = apply_filters(
|
219 |
-
'forminator_addon_zapier_poll_endpoint',
|
220 |
-
$endpoint,
|
221 |
-
$poll_id,
|
222 |
-
$connection_settings
|
223 |
-
);
|
224 |
-
|
225 |
-
forminator_addon_maybe_log( __METHOD__, $endpoint );
|
226 |
-
$api = $this->addon->get_api( $endpoint );
|
227 |
-
|
228 |
-
// build form sample data.
|
229 |
-
$sample_data = $this->build_form_sample_data();
|
230 |
-
$sample_data['is_test'] = true;
|
231 |
-
|
232 |
-
/**
|
233 |
-
* Filter sample data to send to Zapier Webhook URL
|
234 |
-
*
|
235 |
-
* It fires when user saved Zapier connection on Form Settings Page.
|
236 |
-
* Sample data contains `is_test` key with value `true`,
|
237 |
-
* this key indicating that it wont process trigger on Zapier.
|
238 |
-
*
|
239 |
-
* @since 1.6.1
|
240 |
-
*
|
241 |
-
* @param array $sample_data
|
242 |
-
* @param int $poll_id current Form ID.
|
243 |
-
* @param array $submitted_data Submitted data by user, it contains `name` and `webhook_url`.
|
244 |
-
*/
|
245 |
-
$sample_data = apply_filters(
|
246 |
-
'forminator_addon_zapier_poll_sample_data',
|
247 |
-
$sample_data,
|
248 |
-
$poll_id,
|
249 |
-
$submitted_data
|
250 |
-
);
|
251 |
-
|
252 |
-
$api->post_( $sample_data );
|
253 |
-
}
|
254 |
-
|
255 |
-
/**
|
256 |
-
* Build sample data form current fields
|
257 |
-
*
|
258 |
-
* @since 1.6.1
|
259 |
-
*
|
260 |
-
* @return array
|
261 |
-
*/
|
262 |
-
private function build_form_sample_data() {
|
263 |
-
$sample = array();
|
264 |
-
|
265 |
-
$sample['poll-name'] = forminator_get_name_from_model( $this->poll );
|
266 |
-
$sample['vote'] = 'Vote';
|
267 |
-
$sample['vote-extra'] = 'Vote Extra';
|
268 |
-
$sample['results'] = array();
|
269 |
-
|
270 |
-
$fields_array = $this->poll->get_fields_as_array();
|
271 |
-
$map_entries = Forminator_Form_Entry_Model::map_polls_entries( $this->poll_id, $fields_array );
|
272 |
-
$fields = $this->poll->get_fields();
|
273 |
-
|
274 |
-
foreach ( $fields as $field ) {
|
275 |
-
$label = addslashes( $field->title );
|
276 |
-
|
277 |
-
$slug = isset( $field->slug ) ? $field->slug : sanitize_title( $label );
|
278 |
-
$entries = 0;
|
279 |
-
if ( in_array( $slug, array_keys( $map_entries ), true ) ) {
|
280 |
-
$entries = $map_entries[ $slug ];
|
281 |
-
}
|
282 |
-
$sample['results'][ $slug ] = array(
|
283 |
-
'label' => $label,
|
284 |
-
'votes' => $entries,
|
285 |
-
);
|
286 |
-
}
|
287 |
-
|
288 |
-
// wrap in array as zapier best practices.
|
289 |
-
return array( $sample );
|
290 |
-
}
|
291 |
-
|
292 |
-
/**
|
293 |
-
* Check if setup webhook url is completed
|
294 |
-
*
|
295 |
-
* @since 1.6.1
|
296 |
-
*
|
297 |
-
* @param $submitted_data
|
298 |
-
*
|
299 |
-
* @return bool
|
300 |
-
*/
|
301 |
-
public function setup_webhook_url_is_completed( $submitted_data ) {
|
302 |
-
$multi_id = '';
|
303 |
-
if ( isset( $submitted_data['multi_id'] ) ) {
|
304 |
-
$multi_id = $submitted_data['multi_id'];
|
305 |
-
}
|
306 |
-
|
307 |
-
if ( empty( $multi_id ) ) {
|
308 |
-
return false;
|
309 |
-
}
|
310 |
-
|
311 |
-
$name = $this->get_multi_id_poll_settings_value( $multi_id, 'name', '' );
|
312 |
-
$name = trim( $name );
|
313 |
-
if ( empty( $name ) ) {
|
314 |
-
return false;
|
315 |
-
}
|
316 |
-
$webhook_url = $this->get_multi_id_poll_settings_value( $multi_id, 'webhook_url', '' );
|
317 |
-
$webhook_url = trim( $webhook_url );
|
318 |
-
if ( empty( $webhook_url ) ) {
|
319 |
-
return false;
|
320 |
-
}
|
321 |
-
|
322 |
-
return true;
|
323 |
-
}
|
324 |
-
|
325 |
-
/**
|
326 |
-
* Generate multi id for multiple connection
|
327 |
-
*
|
328 |
-
* @since 1.6.1
|
329 |
-
* @return string
|
330 |
-
*/
|
331 |
-
public function generate_multi_id() {
|
332 |
-
return uniqid( 'zapier_', true );
|
333 |
-
}
|
334 |
-
|
335 |
-
|
336 |
-
/**
|
337 |
-
* Override how multi connection displayed
|
338 |
-
*
|
339 |
-
* @since 1.6.1
|
340 |
-
* @return array
|
341 |
-
*/
|
342 |
-
public function get_multi_ids() {
|
343 |
-
$multi_ids = array();
|
344 |
-
foreach ( $this->get_poll_settings_values() as $key => $value ) {
|
345 |
-
$multi_ids[] = array(
|
346 |
-
'id' => $key,
|
347 |
-
// use name that was added by user on creating connection.
|
348 |
-
'label' => isset( $value['name'] ) ? $value['name'] : $key,
|
349 |
-
);
|
350 |
-
}
|
351 |
-
|
352 |
-
return $multi_ids;
|
353 |
-
}
|
354 |
-
|
355 |
-
/**
|
356 |
-
* Disconnect a connection from current poll
|
357 |
-
*
|
358 |
-
* @since 1.6.1
|
359 |
-
*
|
360 |
-
* @param array $submitted_data
|
361 |
-
*/
|
362 |
-
public function disconnect_form( $submitted_data ) {
|
363 |
-
// only execute if multi_id provided on submitted data.
|
364 |
-
if ( isset( $submitted_data['multi_id'] ) && ! empty( $submitted_data['multi_id'] ) ) {
|
365 |
-
$addon_poll_settings = $this->get_poll_settings_values();
|
366 |
-
unset( $addon_poll_settings[ $submitted_data['multi_id'] ] );
|
367 |
-
$this->save_poll_settings_values( $addon_poll_settings );
|
368 |
-
}
|
369 |
-
}
|
370 |
-
|
371 |
-
/**
|
372 |
-
* Check if multi_id poll settings values completed
|
373 |
-
*
|
374 |
-
* @since 1.6.1
|
375 |
-
*
|
376 |
-
* @param $multi_id
|
377 |
-
*
|
378 |
-
* @return bool
|
379 |
-
*/
|
380 |
-
public function is_multi_poll_settings_complete( $multi_id ) {
|
381 |
-
$data = array( 'multi_id' => $multi_id );
|
382 |
-
|
383 |
-
if ( ! $this->setup_webhook_url_is_completed( $data ) ) {
|
384 |
-
return false;
|
385 |
-
}
|
386 |
-
|
387 |
-
return true;
|
388 |
-
}
|
389 |
}
|
1 |
<?php
|
2 |
|
|
|
|
|
3 |
/**
|
4 |
+
* Moved to Webhook integration.
|
5 |
+
* Leave it here to avoid Fatal errors during updating plugin.
|
6 |
+
* Remove zapier folder after several versions.
|
|
|
7 |
*/
|
8 |
class Forminator_Addon_Zapier_Poll_Settings extends Forminator_Addon_Poll_Settings_Abstract {
|
9 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
10 |
}
|
addons/pro/zapier/class-forminator-addon-zapier-quiz-hooks.php
CHANGED
@@ -1,563 +1,10 @@
|
|
1 |
<?php
|
2 |
|
3 |
/**
|
4 |
-
*
|
5 |
-
*
|
6 |
-
*
|
7 |
-
*
|
8 |
*/
|
9 |
class Forminator_Addon_Zapier_Quiz_Hooks extends Forminator_Addon_Quiz_Hooks_Abstract {
|
10 |
|
11 |
-
/**
|
12 |
-
* Addon instance are auto available form abstract
|
13 |
-
* Its added here for development purpose,
|
14 |
-
* Auto-complete will resolve addon directly to `Zapier` instance instead of the abstract
|
15 |
-
* And its public properties can be exposed
|
16 |
-
*
|
17 |
-
* @since 1.6.2
|
18 |
-
* @var Forminator_Addon_Zapier
|
19 |
-
*/
|
20 |
-
protected $addon;
|
21 |
-
|
22 |
-
/**
|
23 |
-
* Quiz Settings Instance
|
24 |
-
*
|
25 |
-
* @since 1.6.2
|
26 |
-
* @var Forminator_Addon_Zapier_Quiz_Settings | null
|
27 |
-
*/
|
28 |
-
protected $quiz_settings_instance;
|
29 |
-
|
30 |
-
/**
|
31 |
-
* Forminator_Addon_Zapier_Quiz_Hooks constructor.
|
32 |
-
*
|
33 |
-
* @since 1.6.2
|
34 |
-
*
|
35 |
-
* @param Forminator_Addon_Abstract $addon
|
36 |
-
* @param $quiz_id
|
37 |
-
*
|
38 |
-
* @throws Forminator_Addon_Exception
|
39 |
-
*/
|
40 |
-
public function __construct( Forminator_Addon_Abstract $addon, $quiz_id ) {
|
41 |
-
parent::__construct( $addon, $quiz_id );
|
42 |
-
$this->_submit_quiz_error_message = __( 'Zapier failed to process submitted data. Please check your form and try again', 'forminator' );
|
43 |
-
}
|
44 |
-
|
45 |
-
/**
|
46 |
-
* Save status of request sent and received for each connected zap(s)
|
47 |
-
*
|
48 |
-
* @since 1.6.2
|
49 |
-
*
|
50 |
-
* @param array $submitted_data
|
51 |
-
* @param array $current_entry_fields
|
52 |
-
*
|
53 |
-
* @return array
|
54 |
-
*/
|
55 |
-
public function add_entry_fields( $submitted_data, $current_entry_fields = array() ) {
|
56 |
-
|
57 |
-
$quiz_id = $this->quiz_id;
|
58 |
-
$quiz_settings_instance = $this->quiz_settings_instance;
|
59 |
-
|
60 |
-
/**
|
61 |
-
* Filter zapier submitted form data to be processed
|
62 |
-
*
|
63 |
-
* @since 1.6.2
|
64 |
-
*
|
65 |
-
* @param array $submitted_data
|
66 |
-
* @param int $quiz_id current Form ID.
|
67 |
-
* @param Forminator_Addon_Zapier_Quiz_Settings $quiz_settings_instance Zapier Addon Quiz Settings instance.
|
68 |
-
*/
|
69 |
-
$submitted_data = apply_filters(
|
70 |
-
'forminator_addon_zapier_quiz_submitted_data',
|
71 |
-
$submitted_data,
|
72 |
-
$quiz_id,
|
73 |
-
$quiz_settings_instance
|
74 |
-
);
|
75 |
-
|
76 |
-
forminator_addon_maybe_log( __METHOD__, $submitted_data );
|
77 |
-
|
78 |
-
$addon_setting_values = $this->quiz_settings_instance->get_quiz_settings_values();
|
79 |
-
$quiz_settings = $this->quiz_settings_instance->get_quiz_settings();
|
80 |
-
|
81 |
-
$data = array();
|
82 |
-
|
83 |
-
/**
|
84 |
-
* Fires before sending data to Webhook URL(s)
|
85 |
-
*
|
86 |
-
* @since 1.6.2
|
87 |
-
*
|
88 |
-
* @param int $quiz_id current Quiz ID.
|
89 |
-
* @param array $submitted_data
|
90 |
-
* @param Forminator_Addon_Zapier_Quiz_Settings $quiz_settings_instance Zapier Addon Quiz Settings instance.
|
91 |
-
*/
|
92 |
-
do_action( 'forminator_addon_zapier_quiz_before_post_to_webhook', $quiz_id, $submitted_data, $quiz_settings_instance );
|
93 |
-
|
94 |
-
foreach ( $addon_setting_values as $key => $addon_setting_value ) {
|
95 |
-
// save it on entry field, with name `status-$MULTI_ID`, and value is the return result on sending data to zapier.
|
96 |
-
$data[] = array(
|
97 |
-
'name' => 'status-' . $key,
|
98 |
-
'value' => $this->get_status_on_send_data( $key, $submitted_data, $addon_setting_value, $quiz_settings, $current_entry_fields ),
|
99 |
-
);
|
100 |
-
}
|
101 |
-
|
102 |
-
$entry_fields = $data;
|
103 |
-
/**
|
104 |
-
* Filter zapier entry fields to be saved to entry model
|
105 |
-
*
|
106 |
-
* @since 1.6.2
|
107 |
-
*
|
108 |
-
* @param array $entry_fields
|
109 |
-
* @param int $quiz_id current Quiz ID.
|
110 |
-
* @param array $submitted_data
|
111 |
-
* @param Forminator_Addon_Zapier_Quiz_Settings $quiz_settings_instance Zapier Quiz Settings instance.
|
112 |
-
*/
|
113 |
-
$data = apply_filters(
|
114 |
-
'forminator_addon_zapier_quiz_entry_fields',
|
115 |
-
$entry_fields,
|
116 |
-
$quiz_id,
|
117 |
-
$submitted_data,
|
118 |
-
$quiz_settings_instance
|
119 |
-
);
|
120 |
-
|
121 |
-
return $data;
|
122 |
-
|
123 |
-
}
|
124 |
-
|
125 |
-
/**
|
126 |
-
* Get status on sending data to zapier
|
127 |
-
*
|
128 |
-
* @since 1.6.2
|
129 |
-
*
|
130 |
-
* @param $connection_id
|
131 |
-
* @param $submitted_data
|
132 |
-
* @param $connection_settings
|
133 |
-
* @param $quiz_settings
|
134 |
-
* @param $current_entry_fields
|
135 |
-
*
|
136 |
-
* @return array `is_sent` true means its success send data to zapier, false otherwise
|
137 |
-
*/
|
138 |
-
private function get_status_on_send_data( $connection_id, $submitted_data, $connection_settings, $quiz_settings, $current_entry_fields ) {
|
139 |
-
// initialize as null.
|
140 |
-
$zapier_api = null;
|
141 |
-
|
142 |
-
$quiz_id = $this->quiz_id;
|
143 |
-
$quiz_settings_instance = $this->quiz_settings_instance;
|
144 |
-
|
145 |
-
//check required fields
|
146 |
-
try {
|
147 |
-
if ( ! isset( $connection_settings['webhook_url'] ) ) {
|
148 |
-
throw new Forminator_Addon_Zapier_Exception( __( 'Webhook URL is not properly setup', 'forminator' ) );
|
149 |
-
}
|
150 |
-
|
151 |
-
$endpoint = $connection_settings['webhook_url'];
|
152 |
-
/**
|
153 |
-
* Filter Endpoint Webhook URL to send
|
154 |
-
*
|
155 |
-
* @since 1.6.2
|
156 |
-
*
|
157 |
-
* @param string $endpoint
|
158 |
-
* @param int $quiz_id current Form ID.
|
159 |
-
* @param array $connection_settings current connection setting, it contains `name` and `webhook_url`.
|
160 |
-
*/
|
161 |
-
$endpoint = apply_filters(
|
162 |
-
'forminator_addon_zapier_quiz_endpoint',
|
163 |
-
$endpoint,
|
164 |
-
$quiz_id,
|
165 |
-
$connection_settings
|
166 |
-
);
|
167 |
-
|
168 |
-
$zapier_api = $this->addon->get_api( $endpoint );
|
169 |
-
|
170 |
-
$args = $this->build_post_data( $current_entry_fields, $submitted_data );
|
171 |
-
|
172 |
-
/**
|
173 |
-
* Filter arguments to passed on to Zapier Webhook API
|
174 |
-
*
|
175 |
-
* @since 1.6.2
|
176 |
-
*
|
177 |
-
* @param array $args
|
178 |
-
* @param int $quiz_id Current Quiz id.
|
179 |
-
* @param string $connection_id ID of current connection.
|
180 |
-
* @param array $submitted_data
|
181 |
-
* @param array $connection_settings current connection setting, contains `name` and `webhook_url`.
|
182 |
-
* @param array $quiz_settings Displayed Quiz settings.
|
183 |
-
* @param Forminator_Addon_Zapier_Quiz_Settings $quiz_settings_instance Zapier Quiz Settings instance.
|
184 |
-
*/
|
185 |
-
$args = apply_filters(
|
186 |
-
'forminator_addon_zapier_quiz_post_to_webhook_args',
|
187 |
-
$args,
|
188 |
-
$quiz_id,
|
189 |
-
$connection_id,
|
190 |
-
$submitted_data,
|
191 |
-
$connection_settings,
|
192 |
-
$quiz_settings,
|
193 |
-
$quiz_settings_instance
|
194 |
-
);
|
195 |
-
|
196 |
-
$zapier_api->post_( $args );
|
197 |
-
|
198 |
-
forminator_addon_maybe_log( __METHOD__, 'Success Send Data' );
|
199 |
-
|
200 |
-
return array(
|
201 |
-
'is_sent' => true,
|
202 |
-
'connection_name' => $connection_settings['name'],
|
203 |
-
'description' => __( 'Successfully send data to Zapier', 'forminator' ),
|
204 |
-
'data_sent' => $zapier_api->get_last_data_sent(),
|
205 |
-
'data_received' => $zapier_api->get_last_data_received(),
|
206 |
-
'url_request' => $zapier_api->get_last_url_request(),
|
207 |
-
);
|
208 |
-
|
209 |
-
} catch ( Forminator_Addon_Zapier_Exception $e ) {
|
210 |
-
forminator_addon_maybe_log( __METHOD__, 'Failed to Send to Zapier' );
|
211 |
-
|
212 |
-
return array(
|
213 |
-
'is_sent' => false,
|
214 |
-
'description' => $e->getMessage(),
|
215 |
-
'connection_name' => $connection_settings['name'],
|
216 |
-
'data_sent' => ( ( $zapier_api instanceof Forminator_Addon_Zapier_Wp_Api ) ? $zapier_api->get_last_data_sent() : array() ),
|
217 |
-
'data_received' => ( ( $zapier_api instanceof Forminator_Addon_Zapier_Wp_Api ) ? $zapier_api->get_last_data_received() : array() ),
|
218 |
-
'url_request' => ( ( $zapier_api instanceof Forminator_Addon_Zapier_Wp_Api ) ? $zapier_api->get_last_url_request() : '' ),
|
219 |
-
);
|
220 |
-
}
|
221 |
-
}
|
222 |
-
|
223 |
-
/**
|
224 |
-
* Build sample data form current fields
|
225 |
-
*
|
226 |
-
* @since 1.6.2
|
227 |
-
*
|
228 |
-
* @param array $quiz_entry_fields
|
229 |
-
* @param array $submitted_data
|
230 |
-
*
|
231 |
-
* @return array
|
232 |
-
*/
|
233 |
-
private function build_post_data( $quiz_entry_fields, $submitted_data ) {
|
234 |
-
$sample = array();
|
235 |
-
|
236 |
-
$sample['quiz-name'] = forminator_get_name_from_model( $this->quiz );
|
237 |
-
|
238 |
-
$answers = array();
|
239 |
-
$correct_answers = 0;
|
240 |
-
$total_answers = 0;
|
241 |
-
$nowrong_result = '';
|
242 |
-
$questions = $this->quiz->questions;
|
243 |
-
|
244 |
-
if ( is_array( $quiz_entry_fields ) && isset( $quiz_entry_fields[0] ) ) {
|
245 |
-
$quiz_entry = $quiz_entry_fields[0];
|
246 |
-
if ( isset( $quiz_entry['name'] ) && isset( $quiz_entry['value'] ) && 'entry' === $quiz_entry['name'] ) {
|
247 |
-
if ( is_array( $quiz_entry['value'] ) ) {
|
248 |
-
|
249 |
-
// KNOWLEDGE.
|
250 |
-
if ( 'knowledge' === $this->quiz->quiz_type ) {
|
251 |
-
foreach ( $quiz_entry['value'] as $key => $data ) {
|
252 |
-
$question_id = ( ( isset( $questions[ $key ] ) && isset( $questions[ $key ]['slug'] ) ) ? $questions[ $key ]['slug'] : uniqid() );
|
253 |
-
// bit cleanup.
|
254 |
-
$question_id = str_replace( 'question-', '', $question_id );
|
255 |
-
|
256 |
-
$question = isset( $data['question'] ) ? $data['question'] : '';
|
257 |
-
$answer = isset( $data['answer'] ) ? $data['answer'] : '';
|
258 |
-
$is_correct = isset( $data['isCorrect'] ) ? $data['isCorrect'] : false;
|
259 |
-
|
260 |
-
$answers[ $question_id ] = array(
|
261 |
-
'question' => $question,
|
262 |
-
'answer' => $answer,
|
263 |
-
'is_correct' => $is_correct,
|
264 |
-
);
|
265 |
-
if ( $is_correct ) {
|
266 |
-
$correct_answers ++;
|
267 |
-
}
|
268 |
-
$total_answers ++;
|
269 |
-
}
|
270 |
-
} elseif ( 'nowrong' === $this->quiz->quiz_type ) {
|
271 |
-
if ( isset( $quiz_entry['value'][0] )
|
272 |
-
&& is_array( $quiz_entry['value'][0] )
|
273 |
-
&& isset( $quiz_entry['value'][0]['value'] )
|
274 |
-
&& is_array( $quiz_entry['value'][0]['value'] ) ) {
|
275 |
-
|
276 |
-
$quiz_entry = $quiz_entry['value'][0]['value'];
|
277 |
-
|
278 |
-
$nowrong_result = ( isset( $quiz_entry['result'] ) && isset( $quiz_entry['result']['title'] ) ) ? $quiz_entry['result']['title'] : '';
|
279 |
-
|
280 |
-
$entry_questions = ( isset( $quiz_entry['answers'] ) && is_array( $quiz_entry['answers'] ) ) ? $quiz_entry['answers'] : array();
|
281 |
-
|
282 |
-
foreach ( $entry_questions as $key => $entry_question ) {
|
283 |
-
$question_id = ( ( isset( $questions[ $key ] ) && isset( $questions[ $key ]['slug'] ) ) ? $questions[ $key ]['slug'] : uniqid() );
|
284 |
-
// bit cleanup.
|
285 |
-
$question_id = str_replace( 'question-', '', $question_id );
|
286 |
-
|
287 |
-
$question = isset( $entry_question['question'] ) ? $entry_question['question'] : '';
|
288 |
-
$answer = isset( $entry_question['answer'] ) ? $entry_question['answer'] : '';
|
289 |
-
|
290 |
-
$answers[ $question_id ] = array(
|
291 |
-
'question' => $question,
|
292 |
-
'answer' => $answer,
|
293 |
-
);
|
294 |
-
}
|
295 |
-
}
|
296 |
-
}
|
297 |
-
}
|
298 |
-
}
|
299 |
-
}
|
300 |
-
|
301 |
-
$sample['answers'] = $answers;
|
302 |
-
$result = array();
|
303 |
-
|
304 |
-
if ( 'knowledge' === $this->quiz->quiz_type ) {
|
305 |
-
$result['correct'] = $correct_answers;
|
306 |
-
$result['answers'] = $total_answers;
|
307 |
-
|
308 |
-
} elseif ( 'nowrong' === $this->quiz->quiz_type ) {
|
309 |
-
$result['result'] = $nowrong_result;
|
310 |
-
}
|
311 |
-
|
312 |
-
$sample['result'] = $result;
|
313 |
-
|
314 |
-
$quiz_settings = $this->quiz_settings_instance->get_quiz_settings();
|
315 |
-
$addons_fields = $this->quiz_settings_instance->get_form_fields();
|
316 |
-
$quiz_submitted_data = get_addons_lead_form_entry_data( $quiz_settings, $submitted_data, $addons_fields );
|
317 |
-
|
318 |
-
if ( ! empty( $quiz_submitted_data ) ) {
|
319 |
-
foreach ( $quiz_submitted_data as $s => $quiz_submitted ) {
|
320 |
-
$sample[ $s ] = $quiz_submitted;
|
321 |
-
}
|
322 |
-
}
|
323 |
-
|
324 |
-
// wrap in array as zapier best practices.
|
325 |
-
return array( $sample );
|
326 |
-
}
|
327 |
-
|
328 |
-
/**
|
329 |
-
* Zapier will add a column on the title/header row
|
330 |
-
* its called `Zapier Info` which can be translated on forminator lang
|
331 |
-
*
|
332 |
-
* @since 1.6.2
|
333 |
-
* @return array
|
334 |
-
*/
|
335 |
-
public function on_export_render_title_row() {
|
336 |
-
|
337 |
-
$export_headers = array(
|
338 |
-
'info' => __( 'Zapier Info', 'forminator' ),
|
339 |
-
);
|
340 |
-
|
341 |
-
$quiz_id = $this->quiz_id;
|
342 |
-
$quiz_settings_instance = $this->quiz_settings_instance;
|
343 |
-
|
344 |
-
/**
|
345 |
-
* Filter zapier headers on export file
|
346 |
-
*
|
347 |
-
* @since 1.6.2
|
348 |
-
*
|
349 |
-
* @param array $export_headers headers to be displayed on export file.
|
350 |
-
* @param int $quiz_id current Form ID.
|
351 |
-
* @param Forminator_Addon_Zapier_Quiz_Settings $quiz_settings_instance Zapier Quiz Settings instance.
|
352 |
-
*/
|
353 |
-
$export_headers = apply_filters(
|
354 |
-
'forminator_addon_zapier_quiz_export_headers',
|
355 |
-
$export_headers,
|
356 |
-
$quiz_id,
|
357 |
-
$quiz_settings_instance
|
358 |
-
);
|
359 |
-
|
360 |
-
return $export_headers;
|
361 |
-
}
|
362 |
-
|
363 |
-
/**
|
364 |
-
* Zapier will add a column that give user information whether sending data to zapier successfully or not
|
365 |
-
* It will only add one column even its multiple connection, every connection will be separated by comma
|
366 |
-
*
|
367 |
-
* @since 1.6.2
|
368 |
-
*
|
369 |
-
* @param Forminator_Form_Entry_Model $entry_model
|
370 |
-
* @param $addon_meta_data
|
371 |
-
*
|
372 |
-
* @return array
|
373 |
-
*/
|
374 |
-
public function on_export_render_entry( Forminator_Form_Entry_Model $entry_model, $addon_meta_data ) {
|
375 |
-
|
376 |
-
$quiz_id = $this->quiz_id;
|
377 |
-
$quiz_settings_instance = $this->quiz_settings_instance;
|
378 |
-
|
379 |
-
/**
|
380 |
-
*
|
381 |
-
* Filter zapier metadata that previously saved on db to be processed
|
382 |
-
*
|
383 |
-
* @since 1.1
|
384 |
-
*
|
385 |
-
* @param array $addon_meta_data
|
386 |
-
* @param int $quiz_id current Quiz ID.
|
387 |
-
* @param Forminator_Addon_Zapier_Quiz_Settings $quiz_settings_instance Zapier Quiz Settings instance.
|
388 |
-
*/
|
389 |
-
$addon_meta_data = apply_filters(
|
390 |
-
'forminator_addon_zapier_quiz_metadata',
|
391 |
-
$addon_meta_data,
|
392 |
-
$quiz_id,
|
393 |
-
$quiz_settings_instance
|
394 |
-
);
|
395 |
-
|
396 |
-
$export_columns = array(
|
397 |
-
'info' => $this->get_from_addon_meta_data( $addon_meta_data, 'description', '' ),
|
398 |
-
);
|
399 |
-
|
400 |
-
/**
|
401 |
-
* Filter zapier columns to be displayed on export submissions
|
402 |
-
*
|
403 |
-
* @since 1.6.2
|
404 |
-
*
|
405 |
-
* @param array $export_columns column to be exported.
|
406 |
-
* @param int $quiz_id current Quiz ID.
|
407 |
-
* @param Forminator_Form_Entry_Model $entry_model Form Entry Model.
|
408 |
-
* @param array $addon_meta_data meta data saved by addon on entry fields.
|
409 |
-
* @param Forminator_Addon_Zapier_Quiz_Settings $quiz_settings_instance Zapier Quiz Settings instance.
|
410 |
-
*/
|
411 |
-
$export_columns = apply_filters(
|
412 |
-
'forminator_addon_zapier_quiz_export_columns',
|
413 |
-
$export_columns,
|
414 |
-
$quiz_id,
|
415 |
-
$entry_model,
|
416 |
-
$addon_meta_data,
|
417 |
-
$quiz_settings_instance
|
418 |
-
);
|
419 |
-
|
420 |
-
return $export_columns;
|
421 |
-
}
|
422 |
-
|
423 |
-
/**
|
424 |
-
* It wil add new row on entry table of submission page, with couple of subentries
|
425 |
-
* subentries included are defined in @see Forminator_Addon_Zapier_Quiz_Hooks::get_additional_entry_item()
|
426 |
-
*
|
427 |
-
* @since 1.6.1
|
428 |
-
*
|
429 |
-
* @param Forminator_Form_Entry_Model $entry_model
|
430 |
-
* @param $addon_meta_data
|
431 |
-
*
|
432 |
-
* @return array
|
433 |
-
*/
|
434 |
-
public function on_render_entry( Forminator_Form_Entry_Model $entry_model, $addon_meta_data ) {
|
435 |
-
|
436 |
-
$quiz_id = $this->quiz_id;
|
437 |
-
$quiz_settings_instance = $this->quiz_settings_instance;
|
438 |
-
|
439 |
-
/**
|
440 |
-
*
|
441 |
-
* Filter Zapier metadata that previously saved on db to be processed
|
442 |
-
*
|
443 |
-
* @since 1.6.2
|
444 |
-
*
|
445 |
-
* @param array $addon_meta_data
|
446 |
-
* @param int $quiz_id current Quiz ID.
|
447 |
-
* @param Forminator_Addon_Zapier_Quiz_Settings $quiz_settings_instance Zapier Addon Quiz Settings instance.
|
448 |
-
*/
|
449 |
-
$addon_meta_data = apply_filters(
|
450 |
-
'forminator_addon_quiz_zapier_metadata',
|
451 |
-
$addon_meta_data,
|
452 |
-
$quiz_id,
|
453 |
-
$quiz_settings_instance
|
454 |
-
);
|
455 |
-
|
456 |
-
$addon_meta_datas = $addon_meta_data;
|
457 |
-
if ( ! isset( $addon_meta_data[0] ) || ! is_array( $addon_meta_data[0] ) ) {
|
458 |
-
return array();
|
459 |
-
}
|
460 |
-
|
461 |
-
return $this->on_render_entry_multi_connection( $addon_meta_datas );
|
462 |
-
|
463 |
-
}
|
464 |
-
|
465 |
-
/**
|
466 |
-
* Loop through addon meta data on multiple Zapier setup(s)
|
467 |
-
*
|
468 |
-
* @since 1.6.1
|
469 |
-
*
|
470 |
-
* @param $addon_meta_datas
|
471 |
-
*
|
472 |
-
* @return array
|
473 |
-
*/
|
474 |
-
private function on_render_entry_multi_connection( $addon_meta_datas ) {
|
475 |
-
$additional_entry_item = array();
|
476 |
-
foreach ( $addon_meta_datas as $addon_meta_data ) {
|
477 |
-
$additional_entry_item[] = $this->get_additional_entry_item( $addon_meta_data );
|
478 |
-
}
|
479 |
-
|
480 |
-
return $additional_entry_item;
|
481 |
-
|
482 |
-
}
|
483 |
-
|
484 |
-
/**
|
485 |
-
* Format additional entry item as label and value arrays
|
486 |
-
*
|
487 |
-
* - Integration Name : its defined by user when they adding Zapier integration on their quiz
|
488 |
-
* - Sent To Zapier : will be Yes/No value, that indicates whether sending data to Zapier API was successful
|
489 |
-
* - Info : Text that are generated by addon when building and sending data to Zapier @see Forminator_Addon_Zapier_Quiz_Hooks::add_entry_fields()
|
490 |
-
* - Below subentries will be added if full log enabled, @see Forminator_Addon_Zapier::is_show_full_log() @see FORMINATOR_ADDON_ZAPIER_SHOW_FULL_LOG
|
491 |
-
* - API URL : URL that wes requested when sending data to Zapier
|
492 |
-
* - Data sent to Zapier : encoded body request that was sent
|
493 |
-
* - Data received from Zapier : json encoded body response that was received
|
494 |
-
*
|
495 |
-
* @param $addon_meta_data
|
496 |
-
*
|
497 |
-
* @since 1.6.1
|
498 |
-
* @return array
|
499 |
-
*/
|
500 |
-
private function get_additional_entry_item( $addon_meta_data ) {
|
501 |
-
|
502 |
-
if ( ! isset( $addon_meta_data['value'] ) || ! is_array( $addon_meta_data['value'] ) ) {
|
503 |
-
return array();
|
504 |
-
}
|
505 |
-
$status = $addon_meta_data['value'];
|
506 |
-
$additional_entry_item = array(
|
507 |
-
'label' => __( 'Zapier Integration', 'forminator' ),
|
508 |
-
'value' => '',
|
509 |
-
);
|
510 |
-
|
511 |
-
$sub_entries = array();
|
512 |
-
if ( isset( $status['connection_name'] ) ) {
|
513 |
-
$sub_entries[] = array(
|
514 |
-
'label' => __( 'Integration Name', 'forminator' ),
|
515 |
-
'value' => $status['connection_name'],
|
516 |
-
);
|
517 |
-
}
|
518 |
-
|
519 |
-
if ( isset( $status['is_sent'] ) ) {
|
520 |
-
$is_sent = true === $status['is_sent'] ? __( 'Yes', 'forminator' ) : __( 'No', 'forminator' );
|
521 |
-
$sub_entries[] = array(
|
522 |
-
'label' => __( 'Sent To Zapier', 'forminator' ),
|
523 |
-
'value' => $is_sent,
|
524 |
-
);
|
525 |
-
}
|
526 |
-
|
527 |
-
if ( isset( $status['description'] ) ) {
|
528 |
-
$sub_entries[] = array(
|
529 |
-
'label' => __( 'Info', 'forminator' ),
|
530 |
-
'value' => $status['description'],
|
531 |
-
);
|
532 |
-
}
|
533 |
-
|
534 |
-
if ( Forminator_Addon_Zapier::is_show_full_log() ) {
|
535 |
-
// too long to be added on entry data enable this with `define('FORMINATOR_ADDON_ZAPIER_SHOW_FULL_LOG', true)`.
|
536 |
-
if ( isset( $status['url_request'] ) ) {
|
537 |
-
$sub_entries[] = array(
|
538 |
-
'label' => __( 'API URL', 'forminator' ),
|
539 |
-
'value' => $status['url_request'],
|
540 |
-
);
|
541 |
-
}
|
542 |
-
|
543 |
-
if ( isset( $status['data_sent'] ) ) {
|
544 |
-
$sub_entries[] = array(
|
545 |
-
'label' => __( 'Data sent to Zapier', 'forminator' ),
|
546 |
-
'value' => '<pre class="sui-code-snippet">' . wp_json_encode( $status['data_sent'], JSON_PRETTY_PRINT ) . '</pre>',
|
547 |
-
);
|
548 |
-
}
|
549 |
-
|
550 |
-
if ( isset( $status['data_received'] ) ) {
|
551 |
-
$sub_entries[] = array(
|
552 |
-
'label' => __( 'Data received from Zapier', 'forminator' ),
|
553 |
-
'value' => '<pre class="sui-code-snippet">' . wp_json_encode( $status['data_received'], JSON_PRETTY_PRINT ) . '</pre>',
|
554 |
-
);
|
555 |
-
}
|
556 |
-
}
|
557 |
-
|
558 |
-
$additional_entry_item['sub_entries'] = $sub_entries;
|
559 |
-
|
560 |
-
// return single array.
|
561 |
-
return $additional_entry_item;
|
562 |
-
}
|
563 |
}
|
1 |
<?php
|
2 |
|
3 |
/**
|
4 |
+
* Moved to Webhook integration.
|
5 |
+
* Leave it here to avoid Fatal errors during updating plugin.
|
6 |
+
* Remove zapier folder after several versions.
|
|
|
7 |
*/
|
8 |
class Forminator_Addon_Zapier_Quiz_Hooks extends Forminator_Addon_Quiz_Hooks_Abstract {
|
9 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
10 |
}
|
addons/pro/zapier/class-forminator-addon-zapier-quiz-settings-exception.php
CHANGED
@@ -1,68 +1,10 @@
|
|
1 |
<?php
|
2 |
|
3 |
/**
|
4 |
-
*
|
5 |
-
*
|
6 |
-
*
|
7 |
-
* @since 1.6.2
|
8 |
*/
|
9 |
class Forminator_Addon_Zapier_Quiz_Settings_Exception extends Forminator_Addon_Zapier_Exception {
|
10 |
|
11 |
-
/**
|
12 |
-
* Holder of input exceptions
|
13 |
-
*
|
14 |
-
* @since 1.6.2
|
15 |
-
* @var array
|
16 |
-
*/
|
17 |
-
protected $input_exceptions = array();
|
18 |
-
|
19 |
-
/**
|
20 |
-
* Forminator_Addon_Zapier_Quiz_Settings_Exception constructor.
|
21 |
-
*
|
22 |
-
* Useful if input_id is needed for later.
|
23 |
-
* If no input_id needed, use @see Forminator_Addon_Zapier_Exception
|
24 |
-
*
|
25 |
-
* @since 1.6.2
|
26 |
-
*
|
27 |
-
* @param string $message
|
28 |
-
* @param string $input_id
|
29 |
-
*/
|
30 |
-
public function __construct( $message = '', $input_id = '' ) {
|
31 |
-
parent::__construct( $message, 0 );
|
32 |
-
if ( ! empty( $input_id ) ) {
|
33 |
-
$this->add_input_exception( $message, $input_id );
|
34 |
-
}
|
35 |
-
}
|
36 |
-
|
37 |
-
/**
|
38 |
-
* Set exception message for an input
|
39 |
-
*
|
40 |
-
* @since 1.6.2
|
41 |
-
*
|
42 |
-
* @param $message
|
43 |
-
* @param $input_id
|
44 |
-
*/
|
45 |
-
public function add_input_exception( $message, $input_id ) {
|
46 |
-
$this->input_exceptions[ $input_id ] = $message;
|
47 |
-
}
|
48 |
-
|
49 |
-
/**
|
50 |
-
* Get all input exceptions
|
51 |
-
*
|
52 |
-
* @since 1.6.2
|
53 |
-
* @return array
|
54 |
-
*/
|
55 |
-
public function get_input_exceptions() {
|
56 |
-
return $this->input_exceptions;
|
57 |
-
}
|
58 |
-
|
59 |
-
/**
|
60 |
-
* Check if there is input_exceptions_is_available
|
61 |
-
*
|
62 |
-
* @since 1.6.2
|
63 |
-
* @return bool
|
64 |
-
*/
|
65 |
-
public function input_exceptions_is_available() {
|
66 |
-
return count( $this->input_exceptions ) > 0;
|
67 |
-
}
|
68 |
}
|
1 |
<?php
|
2 |
|
3 |
/**
|
4 |
+
* Moved to Webhook integration.
|
5 |
+
* Leave it here to avoid Fatal errors during updating plugin.
|
6 |
+
* Remove zapier folder after several versions.
|
|
|
7 |
*/
|
8 |
class Forminator_Addon_Zapier_Quiz_Settings_Exception extends Forminator_Addon_Zapier_Exception {
|
9 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
10 |
}
|
addons/pro/zapier/class-forminator-addon-zapier-quiz-settings.php
CHANGED
@@ -1,437 +1,10 @@
|
|
1 |
<?php
|
2 |
|
3 |
-
require_once dirname( __FILE__ ) . '/class-forminator-addon-zapier-quiz-settings-exception.php';
|
4 |
-
|
5 |
/**
|
6 |
-
*
|
7 |
-
*
|
8 |
-
*
|
9 |
-
* @since 1.6.2
|
10 |
*/
|
11 |
class Forminator_Addon_Zapier_Quiz_Settings extends Forminator_Addon_Quiz_Settings_Abstract {
|
12 |
|
13 |
-
/**
|
14 |
-
* @var Forminator_Addon_Zapier
|
15 |
-
* @since 1.0 Zapier Addon
|
16 |
-
*/
|
17 |
-
protected $addon;
|
18 |
-
|
19 |
-
/**
|
20 |
-
* Create Zap URL
|
21 |
-
*
|
22 |
-
* @since 1.0 Zapier Addon
|
23 |
-
* @var string
|
24 |
-
*/
|
25 |
-
private $new_zap_url = 'https://zapier.com/app/editor/';
|
26 |
-
|
27 |
-
/**
|
28 |
-
* Forminator_Addon_Zapier_Form_Settings constructor.
|
29 |
-
*
|
30 |
-
* @since 1.0 Zapier Addon
|
31 |
-
*
|
32 |
-
* @param Forminator_Addon_Abstract $addon
|
33 |
-
* @param $form_id
|
34 |
-
*
|
35 |
-
* @throws Forminator_Addon_Exception
|
36 |
-
*/
|
37 |
-
public function __construct( Forminator_Addon_Abstract $addon, $form_id ) {
|
38 |
-
parent::__construct( $addon, $form_id );
|
39 |
-
|
40 |
-
$this->_update_quiz_settings_error_message = __(
|
41 |
-
'The update to your settings for this quiz failed, check the form input and try again.',
|
42 |
-
'forminator'
|
43 |
-
);
|
44 |
-
}
|
45 |
-
|
46 |
-
/**
|
47 |
-
* Zapier Quiz Settings wizard
|
48 |
-
*
|
49 |
-
* @since 1.6.2
|
50 |
-
* @return array
|
51 |
-
*/
|
52 |
-
public function quiz_settings_wizards() {
|
53 |
-
// numerical array steps.
|
54 |
-
return array(
|
55 |
-
// 0
|
56 |
-
array(
|
57 |
-
'callback' => array( $this, 'setup_webhook_url' ),
|
58 |
-
'is_completed' => array( $this, 'setup_webhook_url_is_completed' ),
|
59 |
-
),
|
60 |
-
);
|
61 |
-
}
|
62 |
-
|
63 |
-
/**
|
64 |
-
* Setup webhook url
|
65 |
-
*
|
66 |
-
* @since 1.0 Zapier Addon
|
67 |
-
*
|
68 |
-
* @param $submitted_data
|
69 |
-
*
|
70 |
-
* @return array
|
71 |
-
*/
|
72 |
-
public function setup_webhook_url( $submitted_data ) {
|
73 |
-
|
74 |
-
$template = forminator_addon_zapier_dir() . 'views/quiz-settings/setup-webhook.php';
|
75 |
-
|
76 |
-
if ( ! isset( $submitted_data['multi_id'] ) ) {
|
77 |
-
return $this->get_force_closed_wizard( __( 'Please pick valid connection', 'forminator' ) );
|
78 |
-
}
|
79 |
-
|
80 |
-
$multi_id = $submitted_data['multi_id'];
|
81 |
-
unset( $submitted_data['multi_id'] );
|
82 |
-
|
83 |
-
$template_params = array(
|
84 |
-
'new_zap_url' => $this->new_zap_url,
|
85 |
-
'name' => $this->get_multi_id_quiz_settings_value( $multi_id, 'name', '' ),
|
86 |
-
'webhook_url' => $this->get_multi_id_quiz_settings_value( $multi_id, 'webhook_url', '' ),
|
87 |
-
'multi_id' => $multi_id,
|
88 |
-
);
|
89 |
-
|
90 |
-
$is_submit = ! empty( $submitted_data );
|
91 |
-
$has_errors = false;
|
92 |
-
$is_close = false;
|
93 |
-
$notification = array();
|
94 |
-
|
95 |
-
if ( $is_submit ) {
|
96 |
-
$name = isset( $submitted_data['name'] ) ? trim( $submitted_data['name'] ) : '';
|
97 |
-
$template_params['name'] = $name;
|
98 |
-
|
99 |
-
$webhook_url = isset( $submitted_data['webhook_url'] ) ? trim( $submitted_data['webhook_url'] ) : '';
|
100 |
-
$template_params['webhook_url'] = $webhook_url;
|
101 |
-
|
102 |
-
try {
|
103 |
-
$input_exceptions = new Forminator_Addon_Zapier_Quiz_Settings_Exception();
|
104 |
-
|
105 |
-
if ( empty( $name ) ) {
|
106 |
-
$input_exceptions->add_input_exception( __( 'Please specify integration name.', 'forminator' ), 'name_error' );
|
107 |
-
}
|
108 |
-
|
109 |
-
$this->validate_and_send_sample( $submitted_data, $input_exceptions );
|
110 |
-
|
111 |
-
if ( $input_exceptions->input_exceptions_is_available() ) {
|
112 |
-
throw $input_exceptions;
|
113 |
-
}
|
114 |
-
|
115 |
-
$time_added = $this->get_multi_id_quiz_settings_value( $multi_id, 'time_added', time() );
|
116 |
-
$this->save_multi_id_quiz_setting_values(
|
117 |
-
$multi_id,
|
118 |
-
array(
|
119 |
-
'name' => $name,
|
120 |
-
'webhook_url' => $webhook_url,
|
121 |
-
'time_added' => $time_added,
|
122 |
-
)
|
123 |
-
);
|
124 |
-
|
125 |
-
$notification = array(
|
126 |
-
'type' => 'success',
|
127 |
-
'text' => '<strong>' . $this->addon->get_title() . '</strong> ' . __( 'Successfully connected and sent sample data to your ZAP', 'forminator' ),
|
128 |
-
);
|
129 |
-
$is_close = true;
|
130 |
-
|
131 |
-
} catch ( Forminator_Addon_Zapier_Quiz_Settings_Exception $e ) {
|
132 |
-
$template_params = array_merge( $template_params, $e->get_input_exceptions() );
|
133 |
-
$has_errors = true;
|
134 |
-
} catch ( Forminator_Addon_Zapier_Exception $e ) {
|
135 |
-
$template_params['error_message'] = $e->getMessage();
|
136 |
-
$has_errors = true;
|
137 |
-
}
|
138 |
-
}
|
139 |
-
|
140 |
-
$buttons = array();
|
141 |
-
if ( $this->setup_webhook_url_is_completed( array( 'multi_id' => $multi_id ) ) ) {
|
142 |
-
$buttons['disconnect']['markup'] = Forminator_Addon_Zapier::get_button_markup(
|
143 |
-
esc_html__( 'Deactivate', 'forminator' ),
|
144 |
-
'sui-button-ghost sui-tooltip sui-tooltip-top-center forminator-addon-form-disconnect',
|
145 |
-
esc_html__( 'Deactivate Zapier from this Quiz.', 'forminator' )
|
146 |
-
);
|
147 |
-
}
|
148 |
-
|
149 |
-
$buttons['next']['markup'] = '<div class="sui-actions-right">' .
|
150 |
-
Forminator_Addon_Zapier::get_button_markup( esc_html__( 'Save', 'forminator' ), 'sui-button-primary forminator-addon-finish' ) .
|
151 |
-
'</div>';
|
152 |
-
|
153 |
-
return array(
|
154 |
-
'html' => Forminator_Addon_Abstract::get_template( $template, $template_params ),
|
155 |
-
'buttons' => $buttons,
|
156 |
-
'redirect' => false,
|
157 |
-
'has_errors' => $has_errors,
|
158 |
-
'has_back' => false,
|
159 |
-
'is_close' => $is_close,
|
160 |
-
'notification' => $notification,
|
161 |
-
);
|
162 |
-
|
163 |
-
}
|
164 |
-
|
165 |
-
|
166 |
-
/**
|
167 |
-
* Sending test sample to zapier webhook URL
|
168 |
-
* Data sent will be used on zapier to map fields on their zap action
|
169 |
-
*
|
170 |
-
* @since 1.0 Zapier Addon
|
171 |
-
*
|
172 |
-
* @param $submitted_data
|
173 |
-
* @param Forminator_Addon_Zapier_Quiz_Settings_Exception $current_input_exception
|
174 |
-
*
|
175 |
-
* @throws Forminator_Addon_Zapier_Quiz_Settings_Exception
|
176 |
-
* @throws Forminator_Addon_Zapier_Wp_Api_Not_Found_Exception
|
177 |
-
* @throws Forminator_Addon_Zapier_Wp_Api_Exception
|
178 |
-
*/
|
179 |
-
private function validate_and_send_sample( $submitted_data, Forminator_Addon_Zapier_Quiz_Settings_Exception $current_input_exception ) {
|
180 |
-
$quiz_id = $this->quiz_id;
|
181 |
-
if ( ! isset( $submitted_data['webhook_url'] ) ) {
|
182 |
-
$current_input_exception->add_input_exception( __( 'Please put a valid Webhook URL.', 'forminator' ), 'webhook_url_error' );
|
183 |
-
throw $current_input_exception;
|
184 |
-
}
|
185 |
-
|
186 |
-
// must be this prefix.
|
187 |
-
if ( stripos( $submitted_data['webhook_url'], 'https://hooks.zapier.com/' ) !== 0 ) {
|
188 |
-
$current_input_exception->add_input_exception( __( 'Please put a valid Webhook URL.', 'forminator' ), 'webhook_url_error' );
|
189 |
-
throw $current_input_exception;
|
190 |
-
}
|
191 |
-
|
192 |
-
// must not be in silent mode.
|
193 |
-
if ( stripos( $submitted_data['webhook_url'], 'silent' ) !== false ) {
|
194 |
-
$current_input_exception->add_input_exception( __( 'Please disable Silent Mode on Webhook URL.', 'forminator' ), 'webhook_url_error' );
|
195 |
-
throw $current_input_exception;
|
196 |
-
}
|
197 |
-
|
198 |
-
$endpoint = wp_http_validate_url( $submitted_data['webhook_url'] );
|
199 |
-
if ( false === $endpoint ) {
|
200 |
-
$current_input_exception->add_input_exception( __( 'Please put a valid Webhook URL.', 'forminator' ), 'webhook_url_error' );
|
201 |
-
throw $current_input_exception;
|
202 |
-
}
|
203 |
-
|
204 |
-
if ( $current_input_exception->input_exceptions_is_available() ) {
|
205 |
-
throw $current_input_exception;
|
206 |
-
}
|
207 |
-
|
208 |
-
$connection_settings = $submitted_data;
|
209 |
-
/**
|
210 |
-
* Filter Endpoint Webhook URL to send
|
211 |
-
*
|
212 |
-
* @since 1.6.2
|
213 |
-
*
|
214 |
-
* @param string $endpoint
|
215 |
-
* @param int $quiz_id current Form ID.
|
216 |
-
* @param array $connection_settings Submitted data by user, it contains `name` and `webhook_url`.
|
217 |
-
*/
|
218 |
-
$endpoint = apply_filters(
|
219 |
-
'forminator_addon_zapier_quiz_endpoint',
|
220 |
-
$endpoint,
|
221 |
-
$quiz_id,
|
222 |
-
$connection_settings
|
223 |
-
);
|
224 |
-
|
225 |
-
forminator_addon_maybe_log( __METHOD__, $endpoint );
|
226 |
-
$api = $this->addon->get_api( $endpoint );
|
227 |
-
|
228 |
-
// build form sample data.
|
229 |
-
$sample_data = $this->build_form_sample_data();
|
230 |
-
$sample_data['is_test'] = true;
|
231 |
-
|
232 |
-
/**
|
233 |
-
* Filter sample data to send to Zapier Webhook URL
|
234 |
-
*
|
235 |
-
* It fires when user saved Zapier connection on Form Settings Page.
|
236 |
-
* Sample data contains `is_test` key with value `true`,
|
237 |
-
* this key indicating that it wont process trigger on Zapier.
|
238 |
-
*
|
239 |
-
* @since 1.6.2
|
240 |
-
*
|
241 |
-
* @param array $sample_data
|
242 |
-
* @param int $quiz_id current Form ID.
|
243 |
-
* @param array $submitted_data Submitted data by user, it contains `name` and `webhook_url`.
|
244 |
-
*/
|
245 |
-
$sample_data = apply_filters(
|
246 |
-
'forminator_addon_zapier_quiz_sample_data',
|
247 |
-
$sample_data,
|
248 |
-
$quiz_id,
|
249 |
-
$submitted_data
|
250 |
-
);
|
251 |
-
|
252 |
-
$api->post_( $sample_data );
|
253 |
-
}
|
254 |
-
|
255 |
-
/**
|
256 |
-
* Build sample data form current fields
|
257 |
-
*
|
258 |
-
* @since 1.6.2
|
259 |
-
*
|
260 |
-
* @return array
|
261 |
-
*/
|
262 |
-
private function build_form_sample_data() {
|
263 |
-
$sample = array();
|
264 |
-
|
265 |
-
$sample['quiz-name'] = forminator_get_name_from_model( $this->quiz );
|
266 |
-
$answers = array();
|
267 |
-
|
268 |
-
$num_correct = 0;
|
269 |
-
|
270 |
-
$questions = $this->quiz->questions;
|
271 |
-
|
272 |
-
foreach ( $questions as $question ) {
|
273 |
-
$question_title = isset( $question['title'] ) ? $question['title'] : '';
|
274 |
-
$question_id = isset( $question['slug'] ) ? $question['slug'] : uniqid();
|
275 |
-
|
276 |
-
// bit cleanup.
|
277 |
-
$question_id = str_replace( 'question-', '', $question_id );
|
278 |
-
$answer_title = 'Sample Answer';
|
279 |
-
|
280 |
-
$answer = array(
|
281 |
-
'question' => $question_title,
|
282 |
-
'answer' => $answer_title,
|
283 |
-
);
|
284 |
-
|
285 |
-
if ( 'knowledge' === $this->quiz->quiz_type ) {
|
286 |
-
$answer['is_correct'] = wp_rand( 0, 1 ) ? true : false;
|
287 |
-
|
288 |
-
if ( $answer['is_correct'] ) {
|
289 |
-
$num_correct ++;
|
290 |
-
}
|
291 |
-
}
|
292 |
-
|
293 |
-
$answers[ $question_id ] = $answer;
|
294 |
-
}
|
295 |
-
|
296 |
-
$sample['answers'] = $answers;
|
297 |
-
$result = array();
|
298 |
-
|
299 |
-
if ( 'knowledge' === $this->quiz->quiz_type ) {
|
300 |
-
$result['correct'] = $num_correct;
|
301 |
-
$result['answers'] = count( $answers );
|
302 |
-
|
303 |
-
} elseif ( 'nowrong' === $this->quiz->quiz_type ) {
|
304 |
-
$results = $this->quiz->results;
|
305 |
-
$random_result_key = array_rand( $results );
|
306 |
-
$result_title = ( ( isset( $results[ $random_result_key ] ) && isset( $results[ $random_result_key ]['title'] ) ) ? $results[ $random_result_key ]['title'] : '' );
|
307 |
-
$result['result'] = $result_title;
|
308 |
-
}
|
309 |
-
|
310 |
-
$sample['result'] = $result;
|
311 |
-
|
312 |
-
$form_fields = isset( $this->form_fields ) ? $this->form_fields : array();
|
313 |
-
if ( ! empty( $form_fields ) ) {
|
314 |
-
foreach ( $form_fields as $form_field ) {
|
315 |
-
$sample[ $form_field['element_id'] ] = $form_field['field_label'];
|
316 |
-
|
317 |
-
if ( 'upload' === $form_field['type'] ) {
|
318 |
-
|
319 |
-
$sample_file_path = '/fake/path';
|
320 |
-
$upload_dir = wp_get_upload_dir();
|
321 |
-
if ( isset( $upload_dir['basedir'] ) ) {
|
322 |
-
$sample_file_path = $upload_dir['basedir'];
|
323 |
-
}
|
324 |
-
|
325 |
-
$sample[ $form_field['element_id'] ] = array(
|
326 |
-
'name' => $form_field['field_label'],
|
327 |
-
'type' => 'image/png',
|
328 |
-
'size' => 0,
|
329 |
-
'file_url' => get_home_url(),
|
330 |
-
'file_path' => $sample_file_path,
|
331 |
-
);
|
332 |
-
}
|
333 |
-
}
|
334 |
-
}
|
335 |
-
|
336 |
-
// wrap in array as zapier best practices.
|
337 |
-
return array( $sample );
|
338 |
-
}
|
339 |
-
|
340 |
-
/**
|
341 |
-
* Check if setup webhook url is completed
|
342 |
-
*
|
343 |
-
* @since 1.6.2
|
344 |
-
*
|
345 |
-
* @param $submitted_data
|
346 |
-
*
|
347 |
-
* @return bool
|
348 |
-
*/
|
349 |
-
public function setup_webhook_url_is_completed( $submitted_data ) {
|
350 |
-
$multi_id = '';
|
351 |
-
if ( isset( $submitted_data['multi_id'] ) ) {
|
352 |
-
$multi_id = $submitted_data['multi_id'];
|
353 |
-
}
|
354 |
-
|
355 |
-
if ( empty( $multi_id ) ) {
|
356 |
-
return false;
|
357 |
-
}
|
358 |
-
|
359 |
-
$name = $this->get_multi_id_quiz_settings_value( $multi_id, 'name', '' );
|
360 |
-
$name = trim( $name );
|
361 |
-
if ( empty( $name ) ) {
|
362 |
-
return false;
|
363 |
-
}
|
364 |
-
$webhook_url = $this->get_multi_id_quiz_settings_value( $multi_id, 'webhook_url', '' );
|
365 |
-
$webhook_url = trim( $webhook_url );
|
366 |
-
if ( empty( $webhook_url ) ) {
|
367 |
-
return false;
|
368 |
-
}
|
369 |
-
|
370 |
-
return true;
|
371 |
-
}
|
372 |
-
|
373 |
-
/**
|
374 |
-
* Generate multi id for multiple connection
|
375 |
-
*
|
376 |
-
* @since 1.6.2
|
377 |
-
* @return string
|
378 |
-
*/
|
379 |
-
public function generate_multi_id() {
|
380 |
-
return uniqid( 'zapier_', true );
|
381 |
-
}
|
382 |
-
|
383 |
-
|
384 |
-
/**
|
385 |
-
* Override how multi connection displayed
|
386 |
-
*
|
387 |
-
* @since 1.6.2
|
388 |
-
* @return array
|
389 |
-
*/
|
390 |
-
public function get_multi_ids() {
|
391 |
-
$multi_ids = array();
|
392 |
-
foreach ( $this->get_quiz_settings_values() as $key => $value ) {
|
393 |
-
$multi_ids[] = array(
|
394 |
-
'id' => $key,
|
395 |
-
// use name that was added by user on creating connection.
|
396 |
-
'label' => isset( $value['name'] ) ? $value['name'] : $key,
|
397 |
-
);
|
398 |
-
}
|
399 |
-
|
400 |
-
return $multi_ids;
|
401 |
-
}
|
402 |
-
|
403 |
-
/**
|
404 |
-
* Disconnect a connection from current quiz
|
405 |
-
*
|
406 |
-
* @since 1.6.2
|
407 |
-
*
|
408 |
-
* @param array $submitted_data
|
409 |
-
*/
|
410 |
-
public function disconnect_form( $submitted_data ) {
|
411 |
-
// only execute if multi_id provided on submitted data.
|
412 |
-
if ( isset( $submitted_data['multi_id'] ) && ! empty( $submitted_data['multi_id'] ) ) {
|
413 |
-
$addon_quiz_settings = $this->get_quiz_settings_values();
|
414 |
-
unset( $addon_quiz_settings[ $submitted_data['multi_id'] ] );
|
415 |
-
$this->save_quiz_settings_values( $addon_quiz_settings );
|
416 |
-
}
|
417 |
-
}
|
418 |
-
|
419 |
-
/**
|
420 |
-
* Check if multi_id quiz settings values completed
|
421 |
-
*
|
422 |
-
* @since 1.6.2
|
423 |
-
*
|
424 |
-
* @param $multi_id
|
425 |
-
*
|
426 |
-
* @return bool
|
427 |
-
*/
|
428 |
-
public function is_multi_quiz_settings_complete( $multi_id ) {
|
429 |
-
$data = array( 'multi_id' => $multi_id );
|
430 |
-
|
431 |
-
if ( ! $this->setup_webhook_url_is_completed( $data ) ) {
|
432 |
-
return false;
|
433 |
-
}
|
434 |
-
|
435 |
-
return true;
|
436 |
-
}
|
437 |
}
|
1 |
<?php
|
2 |
|
|
|
|
|
3 |
/**
|
4 |
+
* Moved to Webhook integration.
|
5 |
+
* Leave it here to avoid Fatal errors during updating plugin.
|
6 |
+
* Remove zapier folder after several versions.
|
|
|
7 |
*/
|
8 |
class Forminator_Addon_Zapier_Quiz_Settings extends Forminator_Addon_Quiz_Settings_Abstract {
|
9 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
10 |
}
|
addons/pro/zapier/class-forminator-addon-zapier.php
CHANGED
@@ -1,429 +1,10 @@
|
|
1 |
<?php
|
2 |
|
3 |
-
require_once dirname( __FILE__ ) . '/class-forminator-addon-zapier-exception.php';
|
4 |
-
require_once dirname( __FILE__ ) . '/lib/class-forminator-addon-zapier-wp-api.php';
|
5 |
-
|
6 |
/**
|
7 |
-
*
|
8 |
-
*
|
9 |
-
*
|
10 |
-
* @since 1.0 Zapier Addon
|
11 |
*/
|
12 |
-
final class Forminator_Addon_Zapier
|
13 |
-
|
14 |
-
/**
|
15 |
-
* @var self|null
|
16 |
-
*/
|
17 |
-
private static $_instance = null;
|
18 |
-
|
19 |
-
protected $_slug = 'zapier';
|
20 |
-
protected $_version = FORMINATOR_ADDON_ZAPIER_VERSION;
|
21 |
-
protected $_min_forminator_version = '1.1';
|
22 |
-
protected $_short_title = 'Zapier';
|
23 |
-
protected $_title = 'Zapier';
|
24 |
-
protected $_url = 'https://wpmudev.com';
|
25 |
-
protected $_full_path = __FILE__;
|
26 |
-
protected $_documentation = 'https://wpmudev.com/docs/wpmu-dev-plugins/forminator/#zapier';
|
27 |
-
|
28 |
-
protected $_form_settings = 'Forminator_Addon_Zapier_Form_Settings';
|
29 |
-
protected $_form_hooks = 'Forminator_Addon_Zapier_Form_Hooks';
|
30 |
-
|
31 |
-
protected $_poll_settings = 'Forminator_Addon_Zapier_Poll_Settings';
|
32 |
-
protected $_poll_hooks = 'Forminator_Addon_Zapier_Poll_Hooks';
|
33 |
-
|
34 |
-
protected $_quiz_settings = 'Forminator_Addon_Zapier_Quiz_Settings';
|
35 |
-
protected $_quiz_hooks = 'Forminator_Addon_Zapier_Quiz_Hooks';
|
36 |
-
protected $_position = 0;
|
37 |
-
|
38 |
-
/**
|
39 |
-
* Forminator_Addon_Zapier constructor.
|
40 |
-
*
|
41 |
-
* @since 1.0 Zapier Addon
|
42 |
-
*/
|
43 |
-
public function __construct() {
|
44 |
-
// late init to allow translation.
|
45 |
-
$this->_description = __( 'Make your form Zap-able', 'forminator' );
|
46 |
-
$doc_description = forminator_is_show_addons_documentation_link() ?
|
47 |
-
sprintf(
|
48 |
-
/* translators: 1: article anchor start, 2: article anchor end. */
|
49 |
-
__( 'Refer to this %1$sarticle%2$s for tips and tricks on using Zapier integration and creating automated workflows.', 'forminator' ),
|
50 |
-
'<a href="https://wpmudev.com/blog/zapier-wordpress-form-integrations/" target="_blank">',
|
51 |
-
'</a>'
|
52 |
-
) : '';
|
53 |
-
$this->_promotion = sprintf(
|
54 |
-
/* translators: ... */
|
55 |
-
__( 'Zapier connects Forminator with %1$s1000+ apps%2$s. You can use it to send your submissions to third party apps not natively supported in Forminator and automate your after-submission workflows. %3$s Happy automating!', 'forminator' ),
|
56 |
-
'<a href="https://zapier.com/apps" target="_blank">',
|
57 |
-
'</a>',
|
58 |
-
$doc_description
|
59 |
-
);
|
60 |
-
|
61 |
-
$this->_activation_error_message = __( 'Sorry but we failed to activate Zapier Integration, don\'t hesitate to contact us', 'forminator' );
|
62 |
-
$this->_deactivation_error_message = __( 'Sorry but we failed to deactivate Zapier Integration, please try again', 'forminator' );
|
63 |
-
|
64 |
-
$this->_update_settings_error_message = __(
|
65 |
-
'Sorry, we failed to update settings, please check your form and try again',
|
66 |
-
'forminator'
|
67 |
-
);
|
68 |
-
|
69 |
-
$this->_icon = forminator_addon_zapier_assets_url() . 'icons/zapier.png';
|
70 |
-
$this->_icon_x2 = forminator_addon_zapier_assets_url() . 'icons/zapier@2x.png';
|
71 |
-
$this->_image = forminator_addon_zapier_assets_url() . 'img/zapier.png';
|
72 |
-
$this->_image_x2 = forminator_addon_zapier_assets_url() . 'img/zapier@2x.png';
|
73 |
-
$this->_banner = forminator_addon_zapier_assets_url() . 'img/banner.png';
|
74 |
-
$this->_banner_x2 = forminator_addon_zapier_assets_url() . 'img/banner@2x.png';
|
75 |
-
}
|
76 |
-
|
77 |
-
/**
|
78 |
-
* Get Instance
|
79 |
-
*
|
80 |
-
* @since 1.0 Zapier Addon
|
81 |
-
* @return self|null
|
82 |
-
*/
|
83 |
-
public static function get_instance() {
|
84 |
-
if ( is_null( self::$_instance ) ) {
|
85 |
-
self::$_instance = new self();
|
86 |
-
}
|
87 |
-
|
88 |
-
return self::$_instance;
|
89 |
-
}
|
90 |
-
|
91 |
-
/**
|
92 |
-
* Setting apier Addon
|
93 |
-
*
|
94 |
-
* @since 1.1 Zapier Addon
|
95 |
-
* @return array
|
96 |
-
*/
|
97 |
-
public function settings_wizards() {
|
98 |
-
return array(
|
99 |
-
array(
|
100 |
-
'callback' => array( $this, 'setup_connect' ),
|
101 |
-
'is_completed' => array( $this, 'is_connected' ),
|
102 |
-
),
|
103 |
-
);
|
104 |
-
}
|
105 |
-
|
106 |
-
/**
|
107 |
-
* Activate Zapier
|
108 |
-
*
|
109 |
-
* @since 1.1 Zapier Addon
|
110 |
-
*
|
111 |
-
* @param $submitted_data
|
112 |
-
* @param int $form_id
|
113 |
-
*
|
114 |
-
* @return array
|
115 |
-
*/
|
116 |
-
public function setup_connect( $submitted_data, $form_id = 0 ) {
|
117 |
-
$settings_values = $this->get_settings_values();
|
118 |
-
|
119 |
-
$template = forminator_addon_zapier_dir() . 'views/settings/setup-connect.php';
|
120 |
-
$template_success = forminator_addon_zapier_dir() . 'views/settings/setup-connect-success.php';
|
121 |
-
|
122 |
-
$template_params = array(
|
123 |
-
'is_connected' => $this->is_connected(),
|
124 |
-
'error_message' => '',
|
125 |
-
);
|
126 |
-
|
127 |
-
$has_errors = false;
|
128 |
-
$show_success = false;
|
129 |
-
$is_submit = ! empty( $submitted_data );
|
130 |
-
|
131 |
-
foreach ( $template_params as $key => $value ) {
|
132 |
-
if ( isset( $submitted_data[ $key ] ) ) {
|
133 |
-
$template_params[ $key ] = $submitted_data[ $key ];
|
134 |
-
} elseif ( isset( $settings_values[ $key ] ) ) {
|
135 |
-
$template_params[ $key ] = $settings_values[ $key ];
|
136 |
-
}
|
137 |
-
}
|
138 |
-
|
139 |
-
if ( $is_submit ) {
|
140 |
-
$connect = isset( $submitted_data['connect'] ) ? $submitted_data['connect'] : '';
|
141 |
-
|
142 |
-
try {
|
143 |
-
if ( empty( $connect ) ) {
|
144 |
-
throw new Forminator_Addon_Zapier_Exception( __( 'Please Connect Zapier', 'forminator' ) );
|
145 |
-
}
|
146 |
-
|
147 |
-
if ( ! forminator_addon_is_active( $this->_slug ) ) {
|
148 |
-
$activated = Forminator_Addon_Loader::get_instance()->activate_addon( $this->_slug );
|
149 |
-
if ( ! $activated ) {
|
150 |
-
throw new Forminator_Addon_Zapier_Exception( Forminator_Addon_Loader::get_instance()->get_last_error_message() );
|
151 |
-
}
|
152 |
-
}
|
153 |
-
// no form_id its on global settings.
|
154 |
-
if ( empty( $form_id ) ) {
|
155 |
-
$show_success = true;
|
156 |
-
}
|
157 |
-
} catch ( Forminator_Addon_Zapier_Exception $e ) {
|
158 |
-
$template_params['error_message'] = $e->getMessage();
|
159 |
-
$has_errors = true;
|
160 |
-
}
|
161 |
-
}
|
162 |
-
|
163 |
-
if ( $show_success ) {
|
164 |
-
$template = $template_success;
|
165 |
-
}
|
166 |
-
|
167 |
-
$buttons = array();
|
168 |
-
|
169 |
-
if ( $show_success ) {
|
170 |
-
$buttons['close'] = array(
|
171 |
-
'markup' => self::get_button_markup( esc_html__( 'Close', 'forminator' ), 'sui-button-ghost forminator-addon-close forminator-integration-popup__close' ),
|
172 |
-
);
|
173 |
-
} else {
|
174 |
-
if ( $this->is_connected() ) {
|
175 |
-
$buttons['disconnect'] = array(
|
176 |
-
'markup' => self::get_button_markup( esc_html__( 'Disconnect', 'forminator' ), 'sui-button-ghost forminator-addon-disconnect forminator-integration-popup__close' ),
|
177 |
-
);
|
178 |
-
} else {
|
179 |
-
$buttons['submit'] = array(
|
180 |
-
'markup' => self::get_button_markup( esc_html__( 'Activate', 'forminator' ), 'forminator-addon-connect forminator-integration-popup__close' ),
|
181 |
-
);
|
182 |
-
}
|
183 |
-
}
|
184 |
-
|
185 |
-
return array(
|
186 |
-
'html' => self::get_template( $template, $template_params ),
|
187 |
-
'buttons' => $buttons,
|
188 |
-
'redirect' => false,
|
189 |
-
'has_errors' => $has_errors,
|
190 |
-
);
|
191 |
-
}
|
192 |
-
|
193 |
-
/**
|
194 |
-
* Override on is_connected
|
195 |
-
*
|
196 |
-
* @since 1.0 Zapier Addon
|
197 |
-
* @since 1.1 Disable auto activate
|
198 |
-
*
|
199 |
-
* @return bool
|
200 |
-
*/
|
201 |
-
public function is_connected() {
|
202 |
-
try {
|
203 |
-
// check if its active.
|
204 |
-
if ( ! $this->is_active() ) {
|
205 |
-
throw new Forminator_Addon_Zapier_Exception( __( 'Zapier is not active', 'forminator' ) );
|
206 |
-
}
|
207 |
-
$is_connected = true;
|
208 |
-
} catch ( Forminator_Addon_Zapier_Exception $e ) {
|
209 |
-
$is_connected = false;
|
210 |
-
}
|
211 |
-
|
212 |
-
/**
|
213 |
-
* Filter connected status of zapier
|
214 |
-
*
|
215 |
-
* @since 1.1
|
216 |
-
*
|
217 |
-
* @param bool $is_connected
|
218 |
-
*/
|
219 |
-
$is_connected = apply_filters( 'forminator_addon_zapier_is_connected', $is_connected );
|
220 |
-
|
221 |
-
return $is_connected;
|
222 |
-
}
|
223 |
-
|
224 |
-
/**
|
225 |
-
* Check if zapier is connected with current form
|
226 |
-
*
|
227 |
-
* @since 1.0 Zapier Addon
|
228 |
-
*
|
229 |
-
* @param $form_id
|
230 |
-
*
|
231 |
-
* @return bool
|
232 |
-
*/
|
233 |
-
public function is_form_connected( $form_id ) {
|
234 |
-
try {
|
235 |
-
$form_settings_instance = null;
|
236 |
-
if ( ! $this->is_connected() ) {
|
237 |
-
throw new Forminator_Addon_Zapier_Exception( __( 'Zapier is not connected', 'forminator' ) );
|
238 |
-
}
|
239 |
-
|
240 |
-
$form_settings_instance = $this->get_addon_settings( $form_id, 'form' );
|
241 |
-
if ( ! $form_settings_instance instanceof Forminator_Addon_Zapier_Form_Settings ) {
|
242 |
-
throw new Forminator_Addon_Zapier_Exception( __( 'Invalid Form Settings of Zapier', 'forminator' ) );
|
243 |
-
}
|
244 |
-
|
245 |
-
// Mark as active when there is at least one active connection.
|
246 |
-
if ( false === $form_settings_instance->find_one_active_connection() ) {
|
247 |
-
throw new Forminator_Addon_Zapier_Exception( __( 'No active Zapier connection found in this form', 'forminator' ) );
|
248 |
-
}
|
249 |
-
|
250 |
-
$is_form_connected = true;
|
251 |
-
|
252 |
-
} catch ( Forminator_Addon_Zapier_Exception $e ) {
|
253 |
-
$is_form_connected = false;
|
254 |
-
forminator_addon_maybe_log( __METHOD__, $e->getMessage() );
|
255 |
-
}
|
256 |
-
|
257 |
-
/**
|
258 |
-
* Filter connected status of zapier with the form
|
259 |
-
*
|
260 |
-
* @since 1.1
|
261 |
-
*
|
262 |
-
* @param bool $is_form_connected
|
263 |
-
* @param int $form_id Current Form ID.
|
264 |
-
* @param Forminator_Addon_Zapier_Form_Settings|null $form_settings_instance Instance of form settings, or null when unavailable.
|
265 |
-
*
|
266 |
-
*/
|
267 |
-
$is_form_connected = apply_filters( 'forminator_addon_zapier_is_form_connected', $is_form_connected, $form_id, $form_settings_instance );
|
268 |
-
|
269 |
-
return $is_form_connected;
|
270 |
-
}
|
271 |
-
|
272 |
-
/**
|
273 |
-
* Get Zapier API
|
274 |
-
*
|
275 |
-
* @since 1.0 Zapier Addon
|
276 |
-
*
|
277 |
-
* @param string $endpoint
|
278 |
-
*
|
279 |
-
* @return Forminator_Addon_Zapier_Wp_Api|null
|
280 |
-
* @throws Forminator_Addon_Zapier_Wp_Api_Exception
|
281 |
-
*/
|
282 |
-
public function get_api( $endpoint ) {
|
283 |
-
return Forminator_Addon_Zapier_Wp_Api::get_instance( $endpoint );
|
284 |
-
}
|
285 |
-
|
286 |
-
/**
|
287 |
-
* Flag show full log on entries
|
288 |
-
*
|
289 |
-
* @since 1.0 Zapier Addon
|
290 |
-
* @return bool
|
291 |
-
*/
|
292 |
-
public static function is_show_full_log() {
|
293 |
-
if ( defined( 'FORMINATOR_ADDON_ZAPIER_SHOW_FULL_LOG' ) && FORMINATOR_ADDON_ZAPIER_SHOW_FULL_LOG ) {
|
294 |
-
return true;
|
295 |
-
}
|
296 |
-
|
297 |
-
return false;
|
298 |
-
}
|
299 |
-
|
300 |
-
/**
|
301 |
-
* Allow multiple connection on one form
|
302 |
-
*
|
303 |
-
* @since 1.0 Zapier Addon
|
304 |
-
* @return bool
|
305 |
-
*/
|
306 |
-
public function is_allow_multi_on_form() {
|
307 |
-
return true;
|
308 |
-
}
|
309 |
-
|
310 |
-
/**
|
311 |
-
* Flag for check if and addon connected to a poll(poll settings such as list id completed)
|
312 |
-
*
|
313 |
-
* Please apply necessary WordPress hook on the inheritance class
|
314 |
-
*
|
315 |
-
* @since 1.6.1
|
316 |
-
*
|
317 |
-
* @param $poll_id
|
318 |
-
*
|
319 |
-
* @return boolean
|
320 |
-
*/
|
321 |
-
public function is_poll_connected( $poll_id ) {
|
322 |
-
try {
|
323 |
-
$poll_settings_instance = null;
|
324 |
-
if ( ! $this->is_connected() ) {
|
325 |
-
throw new Forminator_Addon_Zapier_Exception( 'Zapier is not connected' );
|
326 |
-
}
|
327 |
-
|
328 |
-
$poll_settings_instance = $this->get_addon_settings( $poll_id, 'poll' );
|
329 |
-
if ( ! $poll_settings_instance instanceof Forminator_Addon_Zapier_Poll_Settings ) {
|
330 |
-
throw new Forminator_Addon_Zapier_Exception( 'Zapier Poll Settings of Trello' );
|
331 |
-
}
|
332 |
-
|
333 |
-
// Mark as active when there is at least one active connection.
|
334 |
-
if ( false === $poll_settings_instance->find_one_active_connection() ) {
|
335 |
-
throw new Forminator_Addon_Zapier_Exception( 'No active Poll connection found in this poll' );
|
336 |
-
}
|
337 |
-
|
338 |
-
$is_poll_connected = true;
|
339 |
-
|
340 |
-
} catch ( Forminator_Addon_Zapier_Exception $e ) {
|
341 |
-
|
342 |
-
$is_poll_connected = false;
|
343 |
-
}
|
344 |
-
|
345 |
-
/**
|
346 |
-
* Filter connected status Zapier with the poll
|
347 |
-
*
|
348 |
-
* @since 1.6.1
|
349 |
-
*
|
350 |
-
* @param bool $is_poll_connected
|
351 |
-
* @param int $poll_id Current Poll ID.
|
352 |
-
* @param Forminator_Addon_Trello_Poll_Settings|null $poll_settings_instance Instance of poll settings, or null when unavailable.
|
353 |
-
*
|
354 |
-
*/
|
355 |
-
$is_poll_connected = apply_filters( 'forminator_addon_zapier_is_poll_connected', $is_poll_connected, $poll_id, $poll_settings_instance );
|
356 |
-
|
357 |
-
return $is_poll_connected;
|
358 |
-
}
|
359 |
-
|
360 |
-
/**
|
361 |
-
* Allow multiple connection on one poll
|
362 |
-
*
|
363 |
-
* @since 1.6.1
|
364 |
-
* @return bool
|
365 |
-
*/
|
366 |
-
public function is_allow_multi_on_poll() {
|
367 |
-
return true;
|
368 |
-
}
|
369 |
-
|
370 |
-
/**
|
371 |
-
* Flag for check if and addon connected to a quiz(quiz settings such as list id completed)
|
372 |
-
*
|
373 |
-
* Please apply necessary WordPress hook on the inheritance class
|
374 |
-
*
|
375 |
-
* @since 1.6.2
|
376 |
-
*
|
377 |
-
* @param $quiz_id
|
378 |
-
*
|
379 |
-
* @return boolean
|
380 |
-
*/
|
381 |
-
public function is_quiz_connected( $quiz_id ) {
|
382 |
-
try {
|
383 |
-
$quiz_settings_instance = null;
|
384 |
-
if ( ! $this->is_connected() ) {
|
385 |
-
throw new Forminator_Addon_Zapier_Exception( 'Zapier is not connected' );
|
386 |
-
}
|
387 |
-
|
388 |
-
$quiz_settings_instance = $this->get_addon_settings( $quiz_id, 'quiz' );
|
389 |
-
if ( ! $quiz_settings_instance instanceof Forminator_Addon_Zapier_Quiz_Settings ) {
|
390 |
-
throw new Forminator_Addon_Zapier_Exception( 'Zapier Quiz Settings of Trello' );
|
391 |
-
}
|
392 |
-
|
393 |
-
// Mark as active when there is at least one active connection.
|
394 |
-
if ( false === $quiz_settings_instance->find_one_active_connection() ) {
|
395 |
-
throw new Forminator_Addon_Zapier_Exception( 'No active Zapier connection found in this quiz' );
|
396 |
-
}
|
397 |
-
|
398 |
-
$is_quiz_connected = true;
|
399 |
-
|
400 |
-
} catch ( Forminator_Addon_Zapier_Exception $e ) {
|
401 |
-
|
402 |
-
$is_quiz_connected = false;
|
403 |
-
}
|
404 |
-
|
405 |
-
/**
|
406 |
-
* Filter connected status Zapier with the quiz
|
407 |
-
*
|
408 |
-
* @since 1.6.2
|
409 |
-
*
|
410 |
-
* @param bool $is_quiz_connected
|
411 |
-
* @param int $quiz_id Current Quiz ID.
|
412 |
-
* @param Forminator_Addon_Trello_Quiz_Settings|null $quiz_settings_instance Instance of quiz settings, or null when unavailable.
|
413 |
-
*
|
414 |
-
*/
|
415 |
-
$is_quiz_connected = apply_filters( 'forminator_addon_zapier_is_quiz_connected', $is_quiz_connected, $quiz_id, $quiz_settings_instance );
|
416 |
-
|
417 |
-
return $is_quiz_connected;
|
418 |
-
}
|
419 |
|
420 |
-
/**
|
421 |
-
* Allow multiple connection on one quiz
|
422 |
-
*
|
423 |
-
* @since 1.6.2
|
424 |
-
* @return bool
|
425 |
-
*/
|
426 |
-
public function is_allow_multi_on_quiz() {
|
427 |
-
return true;
|
428 |
-
}
|
429 |
}
|
1 |
<?php
|
2 |
|
|
|
|
|
|
|
3 |
/**
|
4 |
+
* Moved to Webhook integration.
|
5 |
+
* Leave it here to avoid Fatal errors during updating plugin.
|
6 |
+
* Remove zapier folder after several versions.
|
|
|
7 |
*/
|
8 |
+
final class Forminator_Addon_Zapier {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
9 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
10 |
}
|
addons/pro/zapier/lib/class-forminator-addon-zapier-wp-api-exception.php
CHANGED
@@ -1,10 +1,9 @@
|
|
1 |
<?php
|
2 |
|
3 |
/**
|
4 |
-
*
|
5 |
-
*
|
6 |
-
*
|
7 |
-
* @since 1.0 Zapier Addon
|
8 |
*/
|
9 |
class Forminator_Addon_Zapier_Wp_Api_Exception extends Forminator_Addon_Zapier_Exception {
|
10 |
}
|
1 |
<?php
|
2 |
|
3 |
/**
|
4 |
+
* Moved to Webhook integration.
|
5 |
+
* Leave it here to avoid Fatal errors during updating plugin.
|
6 |
+
* Remove zapier folder after several versions.
|
|
|
7 |
*/
|
8 |
class Forminator_Addon_Zapier_Wp_Api_Exception extends Forminator_Addon_Zapier_Exception {
|
9 |
}
|
addons/pro/zapier/lib/class-forminator-addon-zapier-wp-api-not-found-exception.php
CHANGED
@@ -1,10 +1,9 @@
|
|
1 |
<?php
|
2 |
|
3 |
/**
|
4 |
-
*
|
5 |
-
*
|
6 |
-
*
|
7 |
-
* @since 1.0 Zapier Addon
|
8 |
*/
|
9 |
class Forminator_Addon_Zapier_Wp_Api_Not_Found_Exception extends Forminator_Addon_Zapier_Wp_Api_Exception {
|
10 |
}
|
1 |
<?php
|
2 |
|
3 |
/**
|
4 |
+
* Moved to Webhook integration.
|
5 |
+
* Leave it here to avoid Fatal errors during updating plugin.
|
6 |
+
* Remove zapier folder after several versions.
|
|
|
7 |
*/
|
8 |
class Forminator_Addon_Zapier_Wp_Api_Not_Found_Exception extends Forminator_Addon_Zapier_Wp_Api_Exception {
|
9 |
}
|
addons/pro/zapier/lib/class-forminator-addon-zapier-wp-api.php
CHANGED
@@ -1,307 +1,10 @@
|
|
1 |
<?php
|
2 |
|
3 |
-
require_once dirname( __FILE__ ) . '/class-forminator-addon-zapier-wp-api-exception.php';
|
4 |
-
require_once dirname( __FILE__ ) . '/class-forminator-addon-zapier-wp-api-not-found-exception.php';
|
5 |
-
|
6 |
/**
|
7 |
-
*
|
|
|
|
|
8 |
*/
|
9 |
class Forminator_Addon_Zapier_Wp_Api {
|
10 |
|
11 |
-
/**
|
12 |
-
* Instances of zapier api
|
13 |
-
* key is md5(_endpoint)
|
14 |
-
*
|
15 |
-
* @var array
|
16 |
-
*/
|
17 |
-
private static $_instances = array();
|
18 |
-
|
19 |
-
/**
|
20 |
-
* Zapier endpoint of static webhook
|
21 |
-
*
|
22 |
-
* @var string
|
23 |
-
*/
|
24 |
-
private $_endpoint = '';
|
25 |
-
|
26 |
-
/**
|
27 |
-
* Last data sent to zapier
|
28 |
-
*
|
29 |
-
* @since 1.0 Zapier Addon
|
30 |
-
* @var array
|
31 |
-
*/
|
32 |
-
private $_last_data_sent = array();
|
33 |
-
|
34 |
-
/**
|
35 |
-
* Last data received from zapier
|
36 |
-
*
|
37 |
-
* @since 1.0 Zapier Addon
|
38 |
-
* @var array
|
39 |
-
*/
|
40 |
-
private $_last_data_received = array();
|
41 |
-
|
42 |
-
/**
|
43 |
-
* Last URL requested
|
44 |
-
*
|
45 |
-
* @since 1.0 Zapier Addon
|
46 |
-
* @var string
|
47 |
-
*/
|
48 |
-
private $_last_url_request = '';
|
49 |
-
|
50 |
-
/**
|
51 |
-
* Forminator_Addon_Zapier_Wp_Api constructor.
|
52 |
-
*
|
53 |
-
* @since 1.0 Zapier Addon
|
54 |
-
*
|
55 |
-
* @param $_endpoint
|
56 |
-
*
|
57 |
-
* @throws Forminator_Addon_Zapier_Wp_Api_Exception
|
58 |
-
*/
|
59 |
-
public function __construct( $_endpoint ) {
|
60 |
-
global $wpdb;
|
61 |
-
$wpdb->last_error;
|
62 |
-
//prerequisites
|
63 |
-
if ( ! $_endpoint ) {
|
64 |
-
throw new Forminator_Addon_Zapier_Wp_Api_Exception( __( 'Missing required Static Webhook URL', 'forminator' ) );
|
65 |
-
}
|
66 |
-
|
67 |
-
$this->_endpoint = $_endpoint;
|
68 |
-
}
|
69 |
-
|
70 |
-
/**
|
71 |
-
* Get singleton
|
72 |
-
*
|
73 |
-
* @since 1.0 Zapier Addon
|
74 |
-
*
|
75 |
-
* @param string $_endpoint
|
76 |
-
*
|
77 |
-
* @return Forminator_Addon_Zapier_Wp_Api|null
|
78 |
-
* @throws Forminator_Addon_Zapier_Wp_Api_Exception
|
79 |
-
*/
|
80 |
-
public static function get_instance( $_endpoint ) {
|
81 |
-
if ( ! isset( self::$_instances[ md5( $_endpoint ) ] ) ) {
|
82 |
-
self::$_instances[ md5( $_endpoint ) ] = new self( $_endpoint );
|
83 |
-
}
|
84 |
-
|
85 |
-
return self::$_instances[ md5( $_endpoint ) ];
|
86 |
-
}
|
87 |
-
|
88 |
-
/**
|
89 |
-
* Add custom user agent on request
|
90 |
-
*
|
91 |
-
* @since 1.0 Zapier Addon
|
92 |
-
*
|
93 |
-
* @param $user_agent
|
94 |
-
*
|
95 |
-
* @return string
|
96 |
-
*/
|
97 |
-
public function filter_user_agent( $user_agent ) {
|
98 |
-
$user_agent .= ' ForminatorZapier/' . FORMINATOR_ADDON_ZAPIER_VERSION;
|
99 |
-
|
100 |
-
/**
|
101 |
-
* Filter user agent to be used by zapier api
|
102 |
-
*
|
103 |
-
* @since 1.1
|
104 |
-
*
|
105 |
-
* @param string $user_agent current user agent.
|
106 |
-
*/
|
107 |
-
$user_agent = apply_filters( 'forminator_addon_zapier_api_user_agent', $user_agent );
|
108 |
-
|
109 |
-
return $user_agent;
|
110 |
-
}
|
111 |
-
|
112 |
-
/**
|
113 |
-
* HTTP Request
|
114 |
-
*
|
115 |
-
* @since 1.0 Zapier Addon
|
116 |
-
*
|
117 |
-
* @param string $verb
|
118 |
-
* @param $path
|
119 |
-
* @param array $args
|
120 |
-
*
|
121 |
-
* @return array|mixed|object
|
122 |
-
* @throws Forminator_Addon_Zapier_Wp_Api_Exception
|
123 |
-
* @throws Forminator_Addon_Zapier_Wp_Api_Not_Found_Exception
|
124 |
-
*/
|
125 |
-
private function request( $verb, $path, $args = array() ) {
|
126 |
-
// Adding extra user agent for wp remote request.
|
127 |
-
add_filter( 'http_headers_useragent', array( $this, 'filter_user_agent' ) );
|
128 |
-
|
129 |
-
$url = trailingslashit( $this->_endpoint ) . $path;
|
130 |
-
$verb = ! empty( $verb ) ? $verb : 'GET';
|
131 |
-
|
132 |
-
/**
|
133 |
-
* Filter zapier url to be used on sending api request
|
134 |
-
*
|
135 |
-
* @since 1.1
|
136 |
-
*
|
137 |
-
* @param string $url full url with scheme.
|
138 |
-
* @param string $verb `GET` `POST` `PUT` `DELETE` `PATCH`.
|
139 |
-
* @param string $path requested path resource.
|
140 |
-
* @param array $args argument sent to this function.
|
141 |
-
*/
|
142 |
-
$url = apply_filters( 'forminator_addon_zapier_api_url', $url, $verb, $path, $args );
|
143 |
-
|
144 |
-
$this->_last_url_request = $url;
|
145 |
-
|
146 |
-
$headers = array(
|
147 |
-
'Accept' => 'application/json',
|
148 |
-
'Content-Type' => 'application/json',
|
149 |
-
);
|
150 |
-
|
151 |
-
/**
|
152 |
-
* Filter zapier headers to sent on api request
|
153 |
-
*
|
154 |
-
* @since 1.1
|
155 |
-
*
|
156 |
-
* @param array $headers
|
157 |
-
* @param string $verb `GET` `POST` `PUT` `DELETE` `PATCH`.
|
158 |
-
* @param string $path requested path resource.
|
159 |
-
* @param array $args argument sent to this function.
|
160 |
-
*/
|
161 |
-
$headers = apply_filters( 'forminator_addon_zapier_api_request_headers', $headers, $verb, $path, $args );
|
162 |
-
|
163 |
-
$_args = array(
|
164 |
-
'method' => $verb,
|
165 |
-
'headers' => $headers,
|
166 |
-
);
|
167 |
-
|
168 |
-
// X-Hook-Test handler.
|
169 |
-
if ( isset( $args['is_test'] ) ) {
|
170 |
-
if ( true === $args['is_test'] ) {
|
171 |
-
// Add `X-Hook-Test` header to avoid execute task on zapier.
|
172 |
-
$_args['headers']['X-Hook-Test'] = 'true';
|
173 |
-
}
|
174 |
-
// always unset when exist.
|
175 |
-
unset( $args['is_test'] );
|
176 |
-
}
|
177 |
-
|
178 |
-
$request_data = $args;
|
179 |
-
/**
|
180 |
-
* Filter zapier request data to be used on sending api request
|
181 |
-
*
|
182 |
-
* @since 1.1
|
183 |
-
*
|
184 |
-
* @param array $request_data it will be `http_build_query`-ed when `GET` or `wp_json_encode`-ed otherwise.
|
185 |
-
* @param string $verb `GET` `POST` `PUT` `DELETE` `PATCH`.
|
186 |
-
* @param string $path requested path resource.
|
187 |
-
*/
|
188 |
-
$args = apply_filters( 'forminator_addon_zapier_api_request_data', $request_data, $verb, $path );
|
189 |
-
|
190 |
-
if ( 'GET' === $verb ) {
|
191 |
-
$url .= ( '?' . http_build_query( $args ) );
|
192 |
-
} else {
|
193 |
-
$_args['body'] = wp_json_encode( $args );
|
194 |
-
}
|
195 |
-
|
196 |
-
$this->_last_data_sent = $args;
|
197 |
-
|
198 |
-
$res = wp_remote_request( $url, $_args );
|
199 |
-
$wp_response = $res;
|
200 |
-
|
201 |
-
remove_filter( 'http_headers_useragent', array( $this, 'filter_user_agent' ) );
|
202 |
-
|
203 |
-
if ( is_wp_error( $res ) || ! $res ) {
|
204 |
-
forminator_addon_maybe_log( __METHOD__, $res );
|
205 |
-
throw new Forminator_Addon_Zapier_Wp_Api_Exception(
|
206 |
-
__( 'Failed to process request, make sure your Webhook URL is correct and your server has internet connection.', 'forminator' )
|
207 |
-
);
|
208 |
-
}
|
209 |
-
|
210 |
-
if ( isset( $res['response']['code'] ) ) {
|
211 |
-
$status_code = $res['response']['code'];
|
212 |
-
$msg = '';
|
213 |
-
if ( $status_code > 400 ) {
|
214 |
-
if ( isset( $res['response']['message'] ) ) {
|
215 |
-
$msg = $res['response']['message'];
|
216 |
-
}
|
217 |
-
|
218 |
-
if ( 404 === $status_code ) {
|
219 |
-
/* translators: ... */
|
220 |
-
throw new Forminator_Addon_Zapier_Wp_Api_Not_Found_Exception( sprintf( __( 'Failed to process request : %s', 'forminator' ), $msg ) );
|
221 |
-
}
|
222 |
-
/* translators: ... */
|
223 |
-
throw new Forminator_Addon_Zapier_Wp_Api_Exception( sprintf( __( 'Failed to process request : %s', 'forminator' ), $msg ) );
|
224 |
-
}
|
225 |
-
}
|
226 |
-
|
227 |
-
$body = wp_remote_retrieve_body( $res );
|
228 |
-
|
229 |
-
// probably silent mode.
|
230 |
-
if ( ! empty( $body ) ) {
|
231 |
-
$res = json_decode( $body );
|
232 |
-
}
|
233 |
-
|
234 |
-
$response = $res;
|
235 |
-
/**
|
236 |
-
* Filter zapier api response returned to addon
|
237 |
-
*
|
238 |
-
* @since 1.1
|
239 |
-
*
|
240 |
-
* @param mixed $response original wp remote request response or decoded body if available.
|
241 |
-
* @param string $body original content of http response's body.
|
242 |
-
* @param array|WP_Error $wp_response original wp remote request response.
|
243 |
-
*/
|
244 |
-
$res = apply_filters( 'forminator_addon_zapier_api_response', $response, $body, $wp_response );
|
245 |
-
|
246 |
-
$this->_last_data_received = $res;
|
247 |
-
|
248 |
-
forminator_addon_maybe_log( $res );
|
249 |
-
|
250 |
-
return $res;
|
251 |
-
}
|
252 |
-
|
253 |
-
|
254 |
-
/**
|
255 |
-
* Send data to static webhook zapier URL
|
256 |
-
*
|
257 |
-
* @since 1.0 Zapier Addon
|
258 |
-
*
|
259 |
-
* @param $args
|
260 |
-
* add `is_test` => true to add `X-Hook-Test: true`
|
261 |
-
*
|
262 |
-
* @return array|mixed|object
|
263 |
-
* @throws Forminator_Addon_Zapier_Wp_Api_Exception
|
264 |
-
* @throws Forminator_Addon_Zapier_Wp_Api_Not_Found_Exception
|
265 |
-
*/
|
266 |
-
public function post_( $args ) {
|
267 |
-
|
268 |
-
return $this->request(
|
269 |
-
'POST',
|
270 |
-
'',
|
271 |
-
$args
|
272 |
-
);
|
273 |
-
}
|
274 |
-
|
275 |
-
/**
|
276 |
-
* Get last data sent
|
277 |
-
*
|
278 |
-
* @since 1.0 Zapier Addon
|
279 |
-
*
|
280 |
-
* @return array
|
281 |
-
*/
|
282 |
-
public function get_last_data_sent() {
|
283 |
-
return $this->_last_data_sent;
|
284 |
-
}
|
285 |
-
|
286 |
-
/**
|
287 |
-
* Get last data received
|
288 |
-
*
|
289 |
-
* @since 1.0 Zapier Addon
|
290 |
-
*
|
291 |
-
* @return array
|
292 |
-
*/
|
293 |
-
public function get_last_data_received() {
|
294 |
-
return $this->_last_data_received;
|
295 |
-
}
|
296 |
-
|
297 |
-
/**
|
298 |
-
* Get last data received
|
299 |
-
*
|
300 |
-
* @since 1.0 Zapier Addon
|
301 |
-
*
|
302 |
-
* @return string
|
303 |
-
*/
|
304 |
-
public function get_last_url_request() {
|
305 |
-
return $this->_last_url_request;
|
306 |
-
}
|
307 |
}
|
1 |
<?php
|
2 |
|
|
|
|
|
|
|
3 |
/**
|
4 |
+
* Moved to Webhook integration.
|
5 |
+
* Leave it here to avoid Fatal errors during updating plugin.
|
6 |
+
* Remove zapier folder after several versions.
|
7 |
*/
|
8 |
class Forminator_Addon_Zapier_Wp_Api {
|
9 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
10 |
}
|
addons/pro/zapier/views/poll-settings/setup-webhook.php
CHANGED
@@ -1,120 +1,2 @@
|
|
1 |
<?php
|
2 |
-
// defaults.
|
3 |
-
$vars = array(
|
4 |
-
'error_message' => '',
|
5 |
-
'name' => '',
|
6 |
-
'name_error' => '',
|
7 |
-
'multi_id' => '',
|
8 |
-
'new_zap_url' => '',
|
9 |
-
'webhook_url' => '',
|
10 |
-
'webhook_url_error' => '',
|
11 |
-
);
|
12 |
-
/** @var array $template_vars */
|
13 |
-
foreach ( $template_vars as $key => $val ) {
|
14 |
-
$vars[ $key ] = $val;
|
15 |
-
}
|
16 |
-
?>
|
17 |
|
18 |
-
<div class="forminator-integration-popup__header">
|
19 |
-
|
20 |
-
<h3 id="forminator-integration-popup__title" class="sui-box-title sui-lg" style="overflow: initial; white-space: normal; text-overflow: initial;">
|
21 |
-
<?php esc_html_e( 'Setup Webhook', 'forminator' ); ?>
|
22 |
-
</h3>
|
23 |
-
|
24 |
-
<p id="forminator-integration-popup__description" class="sui-description">
|
25 |
-
<?php esc_html_e( 'Put your ZAP Webhook URL below. ', 'forminator' ); ?>
|
26 |
-
</p>
|
27 |
-
|
28 |
-
<?php if ( ! empty( $vars['error_message'] ) ) : ?>
|
29 |
-
<div
|
30 |
-
role="alert"
|
31 |
-
class="sui-notice sui-notice-red sui-active"
|
32 |
-
style="display: block; text-align: left;"
|
33 |
-
aria-live="assertive"
|
34 |
-
>
|
35 |
-
|
36 |
-
<div class="sui-notice-content">
|
37 |
-
|
38 |
-
<div class="sui-notice-message">
|
39 |
-
|
40 |
-
<span class="sui-notice-icon sui-icon-info" aria-hidden="true"></span>
|
41 |
-
|
42 |
-
<p><?php echo esc_html( $vars['error_message'] ); ?></p>
|
43 |
-
|
44 |
-
</div>
|
45 |
-
|
46 |
-
</div>
|
47 |
-
|
48 |
-
</div>
|
49 |
-
<?php endif; ?>
|
50 |
-
|
51 |
-
</div>
|
52 |
-
|
53 |
-
<form enctype="multipart/form-data">
|
54 |
-
|
55 |
-
<div class="sui-form-field <?php echo esc_attr( ! empty( $vars['name_error'] ) ? 'sui-form-field-error' : '' ); ?>">
|
56 |
-
<label class="sui-label"><?php esc_html_e( 'Zapier Integration Name', 'forminator' ); ?></label>
|
57 |
-
<div class="sui-control-with-icon">
|
58 |
-
<input type="text"
|
59 |
-
name="name"
|
60 |
-
placeholder="<?php esc_attr_e( 'Friendly Name', 'forminator' ); ?>"
|
61 |
-
value="<?php echo esc_attr( $vars['name'] ); ?>"
|
62 |
-
class="sui-form-control"
|
63 |
-
/>
|
64 |
-
<i class="sui-icon-web-globe-world" aria-hidden="true"></i>
|
65 |
-
</div>
|
66 |
-
<?php if ( ! empty( $vars['name_error'] ) ) : ?>
|
67 |
-
<span class="sui-error-message"><?php echo esc_html( $vars['name_error'] ); ?></span>
|
68 |
-
<?php endif; ?>
|
69 |
-
</div>
|
70 |
-
|
71 |
-
<div class="sui-form-field <?php echo esc_attr( ! empty( $vars['webhook_url_error'] ) ? 'sui-form-field-error' : '' ); ?>" style="margin-bottom: 0;">
|
72 |
-
<label class="sui-label"><?php esc_html_e( 'Webhook URL', 'forminator' ); ?></label>
|
73 |
-
<div class="sui-control-with-icon">
|
74 |
-
<input
|
75 |
-
type="text"
|
76 |
-
name="webhook_url"
|
77 |
-
placeholder="<?php esc_attr_e( 'Webhook URL', 'forminator' ); ?>"
|
78 |
-
value="<?php echo esc_attr( $vars['webhook_url'] ); ?>"
|
79 |
-
class="sui-form-control"/>
|
80 |
-
<i class="sui-icon-link" aria-hidden="true"></i>
|
81 |
-
</div>
|
82 |
-
<?php if ( ! empty( $vars['webhook_url_error'] ) ) : ?>
|
83 |
-
<span class="sui-error-message"><?php echo esc_html( $vars['webhook_url_error'] ); ?></span>
|
84 |
-
<?php endif; ?>
|
85 |
-
</div>
|
86 |
-
|
87 |
-
<input type="hidden" name="multi_id" value="<?php echo esc_attr( $vars['multi_id'] ); ?>">
|
88 |
-
|
89 |
-
</form>
|
90 |
-
|
91 |
-
<div
|
92 |
-
role="alert"
|
93 |
-
class="sui-notice sui-notice-yellow sui-active"
|
94 |
-
style="display: block; text-align: left;"
|
95 |
-
aria-live="assertive"
|
96 |
-
>
|
97 |
-
|
98 |
-
<div class="sui-notice-content">
|
99 |
-
|
100 |
-
<div class="sui-notice-message">
|
101 |
-
|
102 |
-
<span class="sui-notice-icon sui-icon-info" aria-hidden="true"></span>
|
103 |
-
|
104 |
-
<p>
|
105 |
-
<?php
|
106 |
-
echo sprintf(/* translators: ... */
|
107 |
-
esc_html__( 'Please go %1$shere%2$s if you do not have any ZAP created. Remember to choose %3$sWebhooks by Zapier%4$s as Trigger App.', 'forminator' ),
|
108 |
-
'<a href="' . esc_url( $vars['new_zap_url'] ) . '" target="_blank">',
|
109 |
-
'</a>',
|
110 |
-
'<strong>',
|
111 |
-
'</strong>'
|
112 |
-
);
|
113 |
-
?>
|
114 |
-
</p>
|
115 |
-
|
116 |
-
</div>
|
117 |
-
|
118 |
-
</div>
|
119 |
-
|
120 |
-
</div>
|
1 |
<?php
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
addons/pro/zapier/views/quiz-settings/setup-webhook.php
CHANGED
@@ -1,120 +1,2 @@
|
|
1 |
<?php
|
2 |
-
// defaults.
|
3 |
-
$vars = array(
|
4 |
-
'error_message' => '',
|
5 |
-
'name' => '',
|
6 |
-
'name_error' => '',
|
7 |
-
'multi_id' => '',
|
8 |
-
'new_zap_url' => '',
|
9 |
-
'webhook_url' => '',
|
10 |
-
'webhook_url_error' => '',
|
11 |
-
);
|
12 |
-
/** @var array $template_vars */
|
13 |
-
foreach ( $template_vars as $key => $val ) {
|
14 |
-
$vars[ $key ] = $val;
|
15 |
-
}
|
16 |
-
?>
|
17 |
|
18 |
-
<div class="forminator-integration-popup__header">
|
19 |
-
|
20 |
-
<h3 id="forminator-integration-popup__title" class="sui-box-title sui-lg" style="overflow: initial; white-space: normal; text-overflow: initial;">
|
21 |
-
<?php esc_html_e( 'Setup Webhook', 'forminator' ); ?>
|
22 |
-
</h3>
|
23 |
-
|
24 |
-
<p id="forminator-integration-popup__description" class="sui-description">
|
25 |
-
<?php esc_html_e( 'Put your ZAP Webhook URL below. ', 'forminator' ); ?>
|
26 |
-
</p>
|
27 |
-
|
28 |
-
<?php if ( ! empty( $vars['error_message'] ) ) : ?>
|
29 |
-
<div
|
30 |
-
role="alert"
|
31 |
-
class="sui-notice sui-notice-red sui-active"
|
32 |
-
style="display: block; text-align: left;"
|
33 |
-
aria-live="assertive"
|
34 |
-
>
|
35 |
-
|
36 |
-
<div class="sui-notice-content">
|
37 |
-
|
38 |
-
<div class="sui-notice-message">
|
39 |
-
|
40 |
-
<span class="sui-notice-icon sui-icon-info" aria-hidden="true"></span>
|
41 |
-
|
42 |
-
<p><?php echo esc_html( $vars['error_message'] ); ?></p>
|
43 |
-
|
44 |
-
</div>
|
45 |
-
|
46 |
-
</div>
|
47 |
-
|
48 |
-
</div>
|
49 |
-
<?php endif; ?>
|
50 |
-
|
51 |
-
</div>
|
52 |
-
|
53 |
-
<form enctype="multipart/form-data">
|
54 |
-
|
55 |
-
<div class="sui-form-field <?php echo esc_attr( ! empty( $vars['name_error'] ) ? 'sui-form-field-error' : '' ); ?>">
|
56 |
-
<label class="sui-label"><?php esc_html_e( 'Zapier Integration Name', 'forminator' ); ?></label>
|
57 |
-
<div class="sui-control-with-icon">
|
58 |
-
<input type="text"
|
59 |
-
name="name"
|
60 |
-
placeholder="<?php esc_attr_e( 'Friendly Name', 'forminator' ); ?>"
|
61 |
-
value="<?php echo esc_attr( $vars['name'] ); ?>"
|
62 |
-
class="sui-form-control"
|
63 |
-
/>
|
64 |
-
<i class="sui-icon-web-globe-world" aria-hidden="true"></i>
|
65 |
-
</div>
|
66 |
-
<?php if ( ! empty( $vars['name_error'] ) ) : ?>
|
67 |
-
<span class="sui-error-message"><?php echo esc_html( $vars['name_error'] ); ?></span>
|
68 |
-
<?php endif; ?>
|
69 |
-
</div>
|
70 |
-
|
71 |
-
<div class="sui-form-field <?php echo esc_attr( ! empty( $vars['webhook_url_error'] ) ? 'sui-form-field-error' : '' ); ?>" style="margin-bottom: 0;">
|
72 |
-
<label class="sui-label"><?php esc_html_e( 'Webhook URL', 'forminator' ); ?></label>
|
73 |
-
<div class="sui-control-with-icon">
|
74 |
-
<input
|
75 |
-
type="text"
|
76 |
-
name="webhook_url"
|
77 |
-
placeholder="<?php esc_attr_e( 'Webhook URL', 'forminator' ); ?>"
|
78 |
-
value="<?php echo esc_attr( $vars['webhook_url'] ); ?>"
|
79 |
-
class="sui-form-control"/>
|
80 |
-
<i class="sui-icon-link" aria-hidden="true"></i>
|
81 |
-
</div>
|
82 |
-
<?php if ( ! empty( $vars['webhook_url_error'] ) ) : ?>
|
83 |
-
<span class="sui-error-message"><?php echo esc_html( $vars['webhook_url_error'] ); ?></span>
|
84 |
-
<?php endif; ?>
|
85 |
-
</div>
|
86 |
-
|
87 |
-
<input type="hidden" name="multi_id" value="<?php echo esc_attr( $vars['multi_id'] ); ?>">
|
88 |
-
|
89 |
-
</form>
|
90 |
-
|
91 |
-
<div
|
92 |
-
role="alert"
|
93 |
-
class="sui-notice sui-notice-yellow sui-active"
|
94 |
-
style="display: block; text-align: left;"
|
95 |
-
aria-live="assertive"
|
96 |
-
>
|
97 |
-
|
98 |
-
<div class="sui-notice-content">
|
99 |
-
|
100 |
-
<div class="sui-notice-message">
|
101 |
-
|
102 |
-
<span class="sui-notice-icon sui-icon-info" aria-hidden="true"></span>
|
103 |
-
|
104 |
-
<p>
|
105 |
-
<?php
|
106 |
-
echo sprintf(/* translators: ... */
|
107 |
-
esc_html__( 'Please go %1$shere%2$s if you do not have any ZAP created. Remember to choose %3$sWebhooks by Zapier%4$s as Trigger App.', 'forminator' ),
|
108 |
-
'<a href="' . esc_url( $vars['new_zap_url'] ) . '" target="_blank">',
|
109 |
-
'</a>',
|
110 |
-
'<strong>',
|
111 |
-
'</strong>'
|
112 |
-
);
|
113 |
-
?>
|
114 |
-
</p>
|
115 |
-
|
116 |
-
</div>
|
117 |
-
|
118 |
-
</div>
|
119 |
-
|
120 |
-
</div>
|
1 |
<?php
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
addons/pro/zapier/views/settings/setup-connect-success.php
CHANGED
@@ -1,14 +1 @@
|
|
1 |
-
<div class="forminator-integration-popup__header">
|
2 |
|
3 |
-
<h3 id="forminator-integration-popup__title" class="sui-box-title sui-lg" style="overflow: initial; white-space: normal; text-overflow: initial;">
|
4 |
-
<?php
|
5 |
-
/* translators: ... */
|
6 |
-
echo esc_html( sprintf( __( '%1$s Added', 'forminator' ), 'Zapier' ) );
|
7 |
-
?>
|
8 |
-
</h3>
|
9 |
-
|
10 |
-
</div>
|
11 |
-
|
12 |
-
<p id="forminator-integration-popup__description" class="sui-description" style="text-align: center;">
|
13 |
-
<?php esc_html_e( 'You can now go to your forms and assign them to this integration', 'forminator' ); ?>
|
14 |
-
</p>
|
|
|
1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
addons/pro/zapier/views/settings/setup-connect.php
CHANGED
@@ -1,84 +1 @@
|
|
1 |
<?php
|
2 |
-
// Defaults.
|
3 |
-
$vars = array(
|
4 |
-
'error_message' => '',
|
5 |
-
'is_connected' => false,
|
6 |
-
);
|
7 |
-
|
8 |
-
/** @var array $template_vars */
|
9 |
-
foreach ( $template_vars as $key => $val ) {
|
10 |
-
$vars[ $key ] = $val;
|
11 |
-
} ?>
|
12 |
-
|
13 |
-
<div class="forminator-integration-popup__header">
|
14 |
-
|
15 |
-
<h3 id="forminator-integration-popup__title" class="sui-box-title sui-lg" style="overflow: initial; white-space: normal; text-overflow: initial;">
|
16 |
-
<?php
|
17 |
-
/* translators: ... */
|
18 |
-
echo esc_html( sprintf( __( 'Activate %1$s', 'forminator' ), 'Zapier' ) );
|
19 |
-
?>
|
20 |
-
</h3>
|
21 |
-
|
22 |
-
<?php if ( ! empty( $vars['is_connected'] ) || ! empty( $vars['error_message'] ) ) : ?>
|
23 |
-
<p id="forminator-integration-popup__description" class="sui-description">
|
24 |
-
<?php esc_html_e( 'Activate Zapier to start using it on your forms.', 'forminator' ); ?>
|
25 |
-
</p>
|
26 |
-
<?php endif; ?>
|
27 |
-
|
28 |
-
</div>
|
29 |
-
|
30 |
-
<?php if ( empty( $vars['is_connected'] ) && empty( $vars['error_message'] ) ) : ?>
|
31 |
-
<p id="forminator-integration-popup__description" class="sui-description" style="margin: 0; text-align: center;">
|
32 |
-
<?php esc_html_e( 'Activate Zapier to start using it on your forms.', 'forminator' ); ?>
|
33 |
-
</p>
|
34 |
-
<?php endif; ?>
|
35 |
-
|
36 |
-
<?php if ( ! empty( $vars['is_connected'] ) ) : ?>
|
37 |
-
<div
|
38 |
-
role="alert"
|
39 |
-
class="sui-notice sui-notice-green sui-active"
|
40 |
-
style="display: block; text-align: left;"
|
41 |
-
aria-live="assertive"
|
42 |
-
>
|
43 |
-
|
44 |
-
<div class="sui-notice-content">
|
45 |
-
|
46 |
-
<div class="sui-notice-message">
|
47 |
-
|
48 |
-
<span class="sui-notice-icon sui-icon-check-tick" aria-hidden="true"></span>
|
49 |
-
|
50 |
-
<p><?php esc_html_e( 'Zapier is already active.', 'forminator' ); ?></p>
|
51 |
-
|
52 |
-
</div>
|
53 |
-
|
54 |
-
</div>
|
55 |
-
|
56 |
-
</div>
|
57 |
-
<?php endif; ?>
|
58 |
-
|
59 |
-
<?php if ( ! empty( $vars['error_message'] ) ) : ?>
|
60 |
-
<div
|
61 |
-
role="alert"
|
62 |
-
class="sui-notice sui-notice-red sui-active"
|
63 |
-
style="display: block; text-align: left;"
|
64 |
-
aria-live="assertive"
|
65 |
-
>
|
66 |
-
|
67 |
-
<div class="sui-notice-content">
|
68 |
-
|
69 |
-
<div class="sui-notice-message">
|
70 |
-
|
71 |
-
<span class="sui-notice-icon sui-icon-info" aria-hidden="true"></span>
|
72 |
-
|
73 |
-
<p><?php echo esc_html( $vars['error_message'] ); ?></p>
|
74 |
-
|
75 |
-
</div>
|
76 |
-
|
77 |
-
</div>
|
78 |
-
|
79 |
-
</div>
|
80 |
-
<?php endif; ?>
|
81 |
-
|
82 |
-
<form>
|
83 |
-
<input type="hidden" value="1" name="connect">
|
84 |
-
</form>
|
1 |
<?php
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
addons/pro/zapier/zapier.php
CHANGED
@@ -1,38 +1,8 @@
|
|
1 |
<?php
|
2 |
|
3 |
/**
|
4 |
-
*
|
5 |
-
*
|
6 |
-
*
|
7 |
-
* Description: Integrate Forminator Custom Forms with Zapier to execute various action you like
|
8 |
-
* Author: WPMU DEV
|
9 |
-
* Author URI: http://wpmudev.com
|
10 |
*/
|
11 |
|
12 |
-
define( 'FORMINATOR_ADDON_ZAPIER_VERSION', '1.2' );
|
13 |
-
|
14 |
-
function forminator_addon_zapier_url() {
|
15 |
-
return trailingslashit( forminator_plugin_url() . 'addons/pro/zapier' );
|
16 |
-
}
|
17 |
-
|
18 |
-
function forminator_addon_zapier_assets_url() {
|
19 |
-
return trailingslashit( forminator_addon_zapier_url() . 'assets' );
|
20 |
-
}
|
21 |
-
|
22 |
-
function forminator_addon_zapier_dir() {
|
23 |
-
return trailingslashit( dirname( __FILE__ ) );
|
24 |
-
}
|
25 |
-
|
26 |
-
require_once dirname( __FILE__ ) . '/class-forminator-addon-zapier.php';
|
27 |
-
|
28 |
-
require_once dirname( __FILE__ ) . '/class-forminator-addon-zapier-form-settings.php';
|
29 |
-
require_once dirname( __FILE__ ) . '/class-forminator-addon-zapier-form-hooks.php';
|
30 |
-
|
31 |
-
require_once dirname( __FILE__ ) . '/class-forminator-addon-zapier-poll-settings.php';
|
32 |
-
require_once dirname( __FILE__ ) . '/class-forminator-addon-zapier-poll-hooks.php';
|
33 |
-
|
34 |
-
require_once dirname( __FILE__ ) . '/class-forminator-addon-zapier-quiz-settings.php';
|
35 |
-
require_once dirname( __FILE__ ) . '/class-forminator-addon-zapier-quiz-hooks.php';
|
36 |
-
|
37 |
-
//Direct Load
|
38 |
-
Forminator_Addon_Loader::get_instance()->register( 'Forminator_Addon_Zapier' );
|
1 |
<?php
|
2 |
|
3 |
/**
|
4 |
+
* Moved to Webhook integration.
|
5 |
+
* Leave it here to avoid Fatal errors during updating plugin.
|
6 |
+
* Remove zapier folder after several versions.
|
|
|
|
|
|
|
7 |
*/
|
8 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
admin/abstracts/class-admin-module-edit-page.php
CHANGED
@@ -452,6 +452,14 @@ abstract class Forminator_Admin_Module_Edit_Page extends Forminator_Admin_Page {
|
|
452 |
</li>
|
453 |
<?php endif; ?>
|
454 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
455 |
</ul>
|
456 |
|
457 |
<div class="sui-chartjs <?php echo esc_attr( $opened_chart ); ?> forminator-stats-chart" data-chart-id="<?php echo esc_attr( $module['id'] ); ?>">
|
452 |
</li>
|
453 |
<?php endif; ?>
|
454 |
|
455 |
+
<li>
|
456 |
+
<a href="<?php echo esc_url( admin_url( 'admin.php?page=forminator-reports&form_type=' . $post_type . '&form_id=' . $module['id'] ) ); ?>"
|
457 |
+
class="sui-button sui-button-ghost">
|
458 |
+
<i class="sui-icon-page" aria-hidden="true"></i>
|
459 |
+
<?php esc_html_e( 'view full report', 'forminator' ); ?>
|
460 |
+
</a>
|
461 |
+
</li>
|
462 |
+
|
463 |
</ul>
|
464 |
|
465 |
<div class="sui-chartjs <?php echo esc_attr( $opened_chart ); ?> forminator-stats-chart" data-chart-id="<?php echo esc_attr( $module['id'] ); ?>">
|
admin/abstracts/class-admin-page.php
CHANGED
@@ -578,4 +578,68 @@ abstract class Forminator_Admin_Page {
|
|
578 |
|
579 |
return 'data:image/svg+xml;base64,' . base64_encode( $svg );
|
580 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
581 |
}
|
578 |
|
579 |
return 'data:image/svg+xml;base64,' . base64_encode( $svg );
|
580 |
}
|
581 |
+
|
582 |
+
/**
|
583 |
+
* Forminator modules
|
584 |
+
*/
|
585 |
+
public function populate_modules() {
|
586 |
+
|
587 |
+
$modules[] = array(
|
588 |
+
'name' => __( 'Forms', 'forminator' ),
|
589 |
+
'model' => Forminator_Form_Model::model(),
|
590 |
+
'slug' => 'form',
|
591 |
+
);
|
592 |
+
$modules[] = array(
|
593 |
+
'name' => __( 'Polls', 'forminator' ),
|
594 |
+
'model' => Forminator_Poll_Model::model(),
|
595 |
+
'slug' => 'poll',
|
596 |
+
);
|
597 |
+
$modules[] = array(
|
598 |
+
'name' => __( 'Quizzes', 'forminator' ),
|
599 |
+
'model' => Forminator_Quiz_Model::model(),
|
600 |
+
'slug' => 'quiz',
|
601 |
+
);
|
602 |
+
|
603 |
+
return $modules;
|
604 |
+
}
|
605 |
+
|
606 |
+
/**
|
607 |
+
* Modules form type
|
608 |
+
*
|
609 |
+
* @return array
|
610 |
+
*/
|
611 |
+
public function modules_form_type() {
|
612 |
+
$form_types = array();
|
613 |
+
$modules = $this->populate_modules();
|
614 |
+
foreach ( $modules as $module ) {
|
615 |
+
/** @var Forminator_Base_Form_Model $model */
|
616 |
+
$model = $module['model'];
|
617 |
+
$name = $module['name'];
|
618 |
+
|
619 |
+
$form_types[ $model->get_post_type() ] = $name;
|
620 |
+
}
|
621 |
+
|
622 |
+
return $form_types;
|
623 |
+
}
|
624 |
+
|
625 |
+
/**
|
626 |
+
* Get Form Model if current requested form_id available and matched form_type
|
627 |
+
*
|
628 |
+
* @return bool|Forminator_Base_Form_Model|null
|
629 |
+
*/
|
630 |
+
public function get_form_model() {
|
631 |
+
if ( $this->get_current_form_id() ) {
|
632 |
+
$form_model = forminator_get_model_from_id( $this->get_current_form_id() );
|
633 |
+
if ( ! $form_model instanceof Forminator_Base_Form_Model ) {
|
634 |
+
return null;
|
635 |
+
}
|
636 |
+
if ( $form_model->get_post_type() !== $this->get_current_form_type() ) {
|
637 |
+
return null;
|
638 |
+
}
|
639 |
+
|
640 |
+
return $form_model;
|
641 |
+
}
|
642 |
+
|
643 |
+
return null;
|
644 |
+
}
|
645 |
}
|
admin/classes/class-admin-ajax.php
CHANGED
@@ -90,7 +90,10 @@ class Forminator_Admin_AJAX {
|
|
90 |
add_action( 'wp_ajax_forminator_load_import_quiz_popup', array( $this, 'load_import' ) );
|
91 |
add_action( 'wp_ajax_forminator_save_import_quiz_popup', array( $this, 'save_import' ) );
|
92 |
|
93 |
-
add_action( 'wp_ajax_forminator_save_accessibility_settings_popup', array(
|
|
|
|
|
|
|
94 |
|
95 |
add_action( 'wp_ajax_forminator_save_dashboard_settings_popup', array( $this, 'save_dashboard_settings' ) );
|
96 |
|
@@ -106,6 +109,8 @@ class Forminator_Admin_AJAX {
|
|
106 |
add_action( 'wp_ajax_forminator_dismiss_notification', array( $this, 'dismiss_notice' ) );
|
107 |
add_action( 'wp_ajax_forminator_dismiss_notice', array( $this, 'dismiss_admin_notice' ) );
|
108 |
|
|
|
|
|
109 |
add_action( 'wp_ajax_forminator_later_notification', array( $this, 'later_notice' ) );
|
110 |
|
111 |
add_action( 'wp_ajax_forminator_reset_tracking_data', array( $this, 'reset_tracking_data' ) );
|
@@ -115,10 +120,7 @@ class Forminator_Admin_AJAX {
|
|
115 |
add_action( 'wp_ajax_forminator_apply_appearance_preset', array( $this, 'apply_appearance_preset' ) );
|
116 |
add_action( 'wp_ajax_forminator_delete_appearance_preset', array( $this, 'delete_appearance_preset' ) );
|
117 |
|
118 |
-
add_action( 'wp_ajax_forminator_dismiss_prelaunch_subscriptions', array( $this, 'dismiss_prelaunch_subscriptions_notice' ) );
|
119 |
-
|
120 |
add_action( 'wp_ajax_forminator_module_search', array( $this, 'module_search' ) );
|
121 |
-
add_action( 'wp_ajax_forminator_load_addons_page_details_popup', array( $this, 'addons_page_details' ) );
|
122 |
|
123 |
// Process ajax actions.
|
124 |
$ajax_actions = array(
|
@@ -131,6 +133,8 @@ class Forminator_Admin_AJAX {
|
|
131 |
foreach ( $ajax_actions as $action ) {
|
132 |
add_action( "wp_ajax_$action", array( $this, 'addons_page_actions' ) );
|
133 |
}
|
|
|
|
|
134 |
}
|
135 |
|
136 |
/**
|
@@ -275,7 +279,7 @@ class Forminator_Admin_AJAX {
|
|
275 |
$status = $form_model->status;
|
276 |
}
|
277 |
|
278 |
-
//we need to empty fields cause we will send new data
|
279 |
$form_model->clear_fields();
|
280 |
}
|
281 |
|
@@ -336,7 +340,6 @@ class Forminator_Admin_AJAX {
|
|
336 |
if ( empty( $status ) ) {
|
337 |
$status = Forminator_Form_Model::STATUS_PUBLISH;
|
338 |
}
|
339 |
-
|
340 |
} else {
|
341 |
$form_model = Forminator_Base_Form_Model::get_model( $id );
|
342 |
|
@@ -420,7 +423,7 @@ class Forminator_Admin_AJAX {
|
|
420 |
// Regenerare module css file.
|
421 |
Forminator_Render_Form::regenerate_css_file( $form_id );
|
422 |
|
423 |
-
$count++;
|
424 |
}
|
425 |
}
|
426 |
|
@@ -437,6 +440,7 @@ class Forminator_Admin_AJAX {
|
|
437 |
*
|
438 |
* @param array $settings Current Settings.
|
439 |
* @param array $new_settings New Appearance settings.
|
|
|
440 |
* @return array
|
441 |
*/
|
442 |
private function merge_appearance_settings( $settings, $new_settings ) {
|
@@ -532,7 +536,7 @@ class Forminator_Admin_AJAX {
|
|
532 |
* Save Appearance Preset
|
533 |
*
|
534 |
* @param string $id ID.
|
535 |
-
* @param array
|
536 |
*/
|
537 |
private static function save_preset( $id, $settings ) {
|
538 |
update_option( 'forminator_appearance_preset_' . $id, $settings );
|
@@ -627,9 +631,9 @@ class Forminator_Admin_AJAX {
|
|
627 |
update_option( 'forminator_v3_captcha_key', Forminator_Core::sanitize_text_field( 'v3_captcha_key' ) );
|
628 |
update_option( 'forminator_v3_captcha_secret', Forminator_Core::sanitize_text_field( 'v3_captcha_secret' ) );
|
629 |
|
630 |
-
update_option(
|
631 |
-
update_option(
|
632 |
-
update_option(
|
633 |
// update_option( "forminator_hcaptcha_noconflict", sanitize_text_field( $_POST['hcaptcha_noconflict'] ) );
|
634 |
|
635 |
update_option( 'forminator_captcha_language', Forminator_Core::sanitize_text_field( 'captcha_language' ) );
|
@@ -712,12 +716,12 @@ class Forminator_Admin_AJAX {
|
|
712 |
|
713 |
} else {
|
714 |
$html .= '<div role="alert" class="sui-notice sui-active" style="display: block; text-align: left;" aria-live="assertive">';
|
715 |
-
|
716 |
-
|
717 |
-
|
718 |
-
|
719 |
-
|
720 |
-
|
721 |
$html .= '</div>';
|
722 |
}
|
723 |
|
@@ -736,17 +740,17 @@ class Forminator_Admin_AJAX {
|
|
736 |
|
737 |
// $captcha = sanitize_text_field( $_POST['captcha'] );// phpcs:ignore -- data without nonce verification
|
738 |
|
739 |
-
$hcaptcha_key
|
740 |
$hcaptcha_secret = get_option( 'forminator_hcaptcha_secret', '' );
|
741 |
-
$onload
|
742 |
|
743 |
if ( ! empty( $hcaptcha_key ) && ! empty( $hcaptcha_secret ) ) {
|
744 |
// phpcs:ignore WordPress.WP.EnqueuedResources.NonEnqueuedScript
|
745 |
// recaptchacompat=off seems to fix problems with hcaptcha container loading recaptcha instead of hcaptcha in the admin
|
746 |
-
$html
|
747 |
$html .= '<div class="forminator-hcaptcha h-captcha" data-sitekey="' . esc_attr( $hcaptcha_key ) . '"></div>';
|
748 |
} else {
|
749 |
-
$html
|
750 |
}
|
751 |
|
752 |
wp_send_json_success( $html );
|
@@ -860,7 +864,7 @@ class Forminator_Admin_AJAX {
|
|
860 |
$preview_data = false;
|
861 |
// force -1 for preview.
|
862 |
$form_id = filter_input( INPUT_POST, 'id', FILTER_VALIDATE_INT );
|
863 |
-
$form_id = $form_id ? $form_id : -1;
|
864 |
|
865 |
// Check if preview data set
|
866 |
if ( ! empty( $_POST['data'] ) ) {
|
@@ -967,7 +971,6 @@ class Forminator_Admin_AJAX {
|
|
967 |
* @see get_users()
|
968 |
*
|
969 |
* @since 1.2
|
970 |
-
*
|
971 |
*/
|
972 |
$args = apply_filters( 'forminator_builder_search_emails_args', $args, $search_email );
|
973 |
|
@@ -992,7 +995,6 @@ class Forminator_Admin_AJAX {
|
|
992 |
* @param string $search_email string to search.
|
993 |
*
|
994 |
* @since 1.2
|
995 |
-
*
|
996 |
*/
|
997 |
$data = apply_filters( 'forminator_builder_search_emails_data', $data, $users, $args, $search_email );
|
998 |
|
@@ -1003,15 +1005,14 @@ class Forminator_Admin_AJAX {
|
|
1003 |
* Get superglobal POST data
|
1004 |
*
|
1005 |
* @param string $nonce_action action to validate.
|
1006 |
-
* @param array
|
1007 |
-
*
|
1008 |
-
*
|
1009 |
-
*
|
1010 |
-
*
|
1011 |
*
|
1012 |
* @return array
|
1013 |
* @since 1.1
|
1014 |
-
*
|
1015 |
*/
|
1016 |
protected function get_post_data( $nonce_action = '', $sanitize_callbacks = array() ) {
|
1017 |
// do nonce / caps check when requested.
|
@@ -1191,10 +1192,16 @@ class Forminator_Admin_AJAX {
|
|
1191 |
// Validate nonce
|
1192 |
forminator_validate_ajax( 'forminator_save_import_' . $slug );
|
1193 |
|
1194 |
-
$importable = json_decode( html_entity_decode( wp_unslash( $_POST[
|
1195 |
|
1196 |
$import_data = Forminator_Core::sanitize_array( $importable );
|
1197 |
|
|
|
|
|
|
|
|
|
|
|
|
|
1198 |
// hook custom data here.
|
1199 |
$import_data = apply_filters( 'forminator_' . $slug . '_import_data', $import_data );
|
1200 |
|
@@ -1236,6 +1243,67 @@ class Forminator_Admin_AJAX {
|
|
1236 |
}
|
1237 |
}
|
1238 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1239 |
|
1240 |
/**
|
1241 |
* Get instance of thirdparty importer class
|
@@ -1830,11 +1898,11 @@ class Forminator_Admin_AJAX {
|
|
1830 |
$data['buttons'] = array();
|
1831 |
|
1832 |
$data['buttons']['connect']['markup'] = '<div class="sui-actions-right">' .
|
1833 |
-
|
1834 |
-
|
1835 |
-
|
1836 |
-
|
1837 |
-
|
1838 |
|
1839 |
wp_send_json_success( $data );
|
1840 |
}
|
@@ -1956,11 +2024,11 @@ class Forminator_Admin_AJAX {
|
|
1956 |
$data['buttons'] = array();
|
1957 |
|
1958 |
$data['buttons']['connect']['markup'] = '<div class="sui-actions-right">' .
|
1959 |
-
|
1960 |
-
|
1961 |
-
|
1962 |
-
|
1963 |
-
|
1964 |
|
1965 |
wp_send_json_success( $data );
|
1966 |
}
|
@@ -2025,6 +2093,17 @@ class Forminator_Admin_AJAX {
|
|
2025 |
wp_send_json_success();
|
2026 |
}
|
2027 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2028 |
/**
|
2029 |
* Save general payments settings
|
2030 |
*
|
@@ -2129,23 +2208,6 @@ class Forminator_Admin_AJAX {
|
|
2129 |
}
|
2130 |
}
|
2131 |
|
2132 |
-
/**
|
2133 |
-
* Dismiss Subscriptions Prelaunch notice
|
2134 |
-
*
|
2135 |
-
* @since 1.14.10
|
2136 |
-
*/
|
2137 |
-
public function dismiss_prelaunch_subscriptions_notice() {
|
2138 |
-
forminator_validate_ajax( 'forminator_dismiss_prelaunch_subscriptions' );
|
2139 |
-
|
2140 |
-
$slug = Forminator_Core::sanitize_text_field( 'prop' );
|
2141 |
-
|
2142 |
-
$dismissed_messages = get_user_meta( get_current_user_id(), 'frmt_dismissed_messages', true );
|
2143 |
-
$dismissed_messages = empty( $dismissed_messages ) ? array() : $dismissed_messages;
|
2144 |
-
$dismissed_messages[ $slug ] = true;
|
2145 |
-
|
2146 |
-
update_user_meta( get_current_user_id(), 'frmt_dismissed_messages', $dismissed_messages );
|
2147 |
-
}
|
2148 |
-
|
2149 |
/**
|
2150 |
* Module search for all types
|
2151 |
*
|
@@ -2175,28 +2237,6 @@ class Forminator_Admin_AJAX {
|
|
2175 |
wp_send_json_success( $html );
|
2176 |
}
|
2177 |
|
2178 |
-
/**
|
2179 |
-
* Addons page details
|
2180 |
-
*/
|
2181 |
-
public function addons_page_details() {
|
2182 |
-
// Validate nonce.
|
2183 |
-
forminator_validate_ajax( 'forminator_addons_page_details' );
|
2184 |
-
|
2185 |
-
$pid = filter_input( INPUT_POST, 'id' );
|
2186 |
-
if ( ! $pid ) {
|
2187 |
-
wp_send_json_error();
|
2188 |
-
}
|
2189 |
-
|
2190 |
-
$file = forminator_plugin_dir() . 'admin/views/addons/addon-details.php';
|
2191 |
-
|
2192 |
-
ob_start();
|
2193 |
-
/** @noinspection PhpIncludeInspection */
|
2194 |
-
include $file;
|
2195 |
-
$html = ob_get_clean();
|
2196 |
-
|
2197 |
-
wp_send_json_success( $html );
|
2198 |
-
}
|
2199 |
-
|
2200 |
public function addons_page_actions() {
|
2201 |
// Validate nonce.
|
2202 |
forminator_validate_ajax( 'forminator_popup_addons_actions' );
|
@@ -2218,4 +2258,44 @@ class Forminator_Admin_AJAX {
|
|
2218 |
);
|
2219 |
|
2220 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2221 |
}
|
90 |
add_action( 'wp_ajax_forminator_load_import_quiz_popup', array( $this, 'load_import' ) );
|
91 |
add_action( 'wp_ajax_forminator_save_import_quiz_popup', array( $this, 'save_import' ) );
|
92 |
|
93 |
+
add_action( 'wp_ajax_forminator_save_accessibility_settings_popup', array(
|
94 |
+
$this,
|
95 |
+
'save_accessibility_settings'
|
96 |
+
) );
|
97 |
|
98 |
add_action( 'wp_ajax_forminator_save_dashboard_settings_popup', array( $this, 'save_dashboard_settings' ) );
|
99 |
|
109 |
add_action( 'wp_ajax_forminator_dismiss_notification', array( $this, 'dismiss_notice' ) );
|
110 |
add_action( 'wp_ajax_forminator_dismiss_notice', array( $this, 'dismiss_admin_notice' ) );
|
111 |
|
112 |
+
add_action( 'wp_ajax_forminator_promote_remind_later', array( $this, 'promote_remind_later' ) );
|
113 |
+
|
114 |
add_action( 'wp_ajax_forminator_later_notification', array( $this, 'later_notice' ) );
|
115 |
|
116 |
add_action( 'wp_ajax_forminator_reset_tracking_data', array( $this, 'reset_tracking_data' ) );
|
120 |
add_action( 'wp_ajax_forminator_apply_appearance_preset', array( $this, 'apply_appearance_preset' ) );
|
121 |
add_action( 'wp_ajax_forminator_delete_appearance_preset', array( $this, 'delete_appearance_preset' ) );
|
122 |
|
|
|
|
|
123 |
add_action( 'wp_ajax_forminator_module_search', array( $this, 'module_search' ) );
|
|
|
124 |
|
125 |
// Process ajax actions.
|
126 |
$ajax_actions = array(
|
133 |
foreach ( $ajax_actions as $action ) {
|
134 |
add_action( "wp_ajax_$action", array( $this, 'addons_page_actions' ) );
|
135 |
}
|
136 |
+
|
137 |
+
add_action( 'wp_ajax_forminator_filter_report_data', array( $this, 'filter_report_data' ) );
|
138 |
}
|
139 |
|
140 |
/**
|
279 |
$status = $form_model->status;
|
280 |
}
|
281 |
|
282 |
+
// we need to empty fields cause we will send new data
|
283 |
$form_model->clear_fields();
|
284 |
}
|
285 |
|
340 |
if ( empty( $status ) ) {
|
341 |
$status = Forminator_Form_Model::STATUS_PUBLISH;
|
342 |
}
|
|
|
343 |
} else {
|
344 |
$form_model = Forminator_Base_Form_Model::get_model( $id );
|
345 |
|
423 |
// Regenerare module css file.
|
424 |
Forminator_Render_Form::regenerate_css_file( $form_id );
|
425 |
|
426 |
+
$count ++;
|
427 |
}
|
428 |
}
|
429 |
|
440 |
*
|
441 |
* @param array $settings Current Settings.
|
442 |
* @param array $new_settings New Appearance settings.
|
443 |
+
*
|
444 |
* @return array
|
445 |
*/
|
446 |
private function merge_appearance_settings( $settings, $new_settings ) {
|
536 |
* Save Appearance Preset
|
537 |
*
|
538 |
* @param string $id ID.
|
539 |
+
* @param array $settings Settings.
|
540 |
*/
|
541 |
private static function save_preset( $id, $settings ) {
|
542 |
update_option( 'forminator_appearance_preset_' . $id, $settings );
|
631 |
update_option( 'forminator_v3_captcha_key', Forminator_Core::sanitize_text_field( 'v3_captcha_key' ) );
|
632 |
update_option( 'forminator_v3_captcha_secret', Forminator_Core::sanitize_text_field( 'v3_captcha_secret' ) );
|
633 |
|
634 |
+
update_option( 'forminator_hcaptcha_key', sanitize_text_field( $_POST['hcaptcha_key'] ) );
|
635 |
+
update_option( 'forminator_hcaptcha_secret', sanitize_text_field( $_POST['hcaptcha_secret'] ) );
|
636 |
+
update_option( 'forminator_captcha_tab_saved', sanitize_text_field( $_POST['captcha_tab_saved'] ) );
|
637 |
// update_option( "forminator_hcaptcha_noconflict", sanitize_text_field( $_POST['hcaptcha_noconflict'] ) );
|
638 |
|
639 |
update_option( 'forminator_captcha_language', Forminator_Core::sanitize_text_field( 'captcha_language' ) );
|
716 |
|
717 |
} else {
|
718 |
$html .= '<div role="alert" class="sui-notice sui-active" style="display: block; text-align: left;" aria-live="assertive">';
|
719 |
+
$html .= '<div class="sui-notice-content">';
|
720 |
+
$html .= '<div class="sui-notice-message">';
|
721 |
+
$html .= '<span class="sui-notice-icon sui-icon-info" aria-hidden="true"></span>';
|
722 |
+
$html .= '<p>' . esc_html__( 'You have to first save your credentials to load the reCAPTCHA . ', 'forminator' ) . '</p>';
|
723 |
+
$html .= '</div>';
|
724 |
+
$html .= '</div>';
|
725 |
$html .= '</div>';
|
726 |
}
|
727 |
|
740 |
|
741 |
// $captcha = sanitize_text_field( $_POST['captcha'] );// phpcs:ignore -- data without nonce verification
|
742 |
|
743 |
+
$hcaptcha_key = get_option( 'forminator_hcaptcha_key', '' );
|
744 |
$hcaptcha_secret = get_option( 'forminator_hcaptcha_secret', '' );
|
745 |
+
$onload = 'forminator_render_admin_hcaptcha';
|
746 |
|
747 |
if ( ! empty( $hcaptcha_key ) && ! empty( $hcaptcha_secret ) ) {
|
748 |
// phpcs:ignore WordPress.WP.EnqueuedResources.NonEnqueuedScript
|
749 |
// recaptchacompat=off seems to fix problems with hcaptcha container loading recaptcha instead of hcaptcha in the admin
|
750 |
+
$html = '<script src="https://js.hcaptcha.com/1/api.js?hl=' . $language . '&onload=' . $onload . '&render=explicit&recaptchacompat=off" async defer></script>';
|
751 |
$html .= '<div class="forminator-hcaptcha h-captcha" data-sitekey="' . esc_attr( $hcaptcha_key ) . '"></div>';
|
752 |
} else {
|
753 |
+
$html = '<div class="sui-notice" style="margin: 10px 0;"><p>' . esc_html__( 'Save your API keys to load the hCAPTCHA preview.', 'forminator' ) . '</p></div>';
|
754 |
}
|
755 |
|
756 |
wp_send_json_success( $html );
|
864 |
$preview_data = false;
|
865 |
// force -1 for preview.
|
866 |
$form_id = filter_input( INPUT_POST, 'id', FILTER_VALIDATE_INT );
|
867 |
+
$form_id = $form_id ? $form_id : - 1;
|
868 |
|
869 |
// Check if preview data set
|
870 |
if ( ! empty( $_POST['data'] ) ) {
|
971 |
* @see get_users()
|
972 |
*
|
973 |
* @since 1.2
|
|
|
974 |
*/
|
975 |
$args = apply_filters( 'forminator_builder_search_emails_args', $args, $search_email );
|
976 |
|
995 |
* @param string $search_email string to search.
|
996 |
*
|
997 |
* @since 1.2
|
|
|
998 |
*/
|
999 |
$data = apply_filters( 'forminator_builder_search_emails_data', $data, $users, $args, $search_email );
|
1000 |
|
1005 |
* Get superglobal POST data
|
1006 |
*
|
1007 |
* @param string $nonce_action action to validate.
|
1008 |
+
* @param array $sanitize_callbacks {
|
1009 |
+
* custom sanitize options, its assoc array
|
1010 |
+
* 'field_name_1' => 'function_to_call_1' function will called with `call_user_func_array`,
|
1011 |
+
* 'field_name_2' => 'function_to_call_2',
|
1012 |
+
* }
|
1013 |
*
|
1014 |
* @return array
|
1015 |
* @since 1.1
|
|
|
1016 |
*/
|
1017 |
protected function get_post_data( $nonce_action = '', $sanitize_callbacks = array() ) {
|
1018 |
// do nonce / caps check when requested.
|
1192 |
// Validate nonce
|
1193 |
forminator_validate_ajax( 'forminator_save_import_' . $slug );
|
1194 |
|
1195 |
+
$importable = json_decode( html_entity_decode( wp_unslash( $_POST['importable'] ) ), true );
|
1196 |
|
1197 |
$import_data = Forminator_Core::sanitize_array( $importable );
|
1198 |
|
1199 |
+
// Modify recipients if replace all recipients checkbox has been checked.
|
1200 |
+
$change_recipients = Forminator_Core::sanitize_text_field( 'change_recipients' );
|
1201 |
+
if ( 'checked' === $change_recipients ) {
|
1202 |
+
$import_data = $this->change_recipients( $import_data );
|
1203 |
+
}
|
1204 |
+
|
1205 |
// hook custom data here.
|
1206 |
$import_data = apply_filters( 'forminator_' . $slug . '_import_data', $import_data );
|
1207 |
|
1243 |
}
|
1244 |
}
|
1245 |
|
1246 |
+
/**
|
1247 |
+
* Change the recipients
|
1248 |
+
*
|
1249 |
+
* @since 1.18.0
|
1250 |
+
*
|
1251 |
+
* @param mixed $data imported module data.
|
1252 |
+
*
|
1253 |
+
* @return array $data
|
1254 |
+
*/
|
1255 |
+
public function change_recipients( $data ) {
|
1256 |
+
if ( ! empty( $data['data']['notifications'] ) ) {
|
1257 |
+
$current_user_email = wp_get_current_user()->user_email;
|
1258 |
+
|
1259 |
+
foreach ( $data['data']['notifications'] as $notif_key => $notif ) {
|
1260 |
+
// Modify the recipients.
|
1261 |
+
if ( ! empty( $notif['recipients'] ) ) {
|
1262 |
+
$recipients = $this->apply_user_email( $notif['recipients'], $current_user_email );
|
1263 |
+
$data['data']['notifications'][ $notif_key ]['recipients'] = $recipients;
|
1264 |
+
}
|
1265 |
+
|
1266 |
+
// Modify the routing recipients.
|
1267 |
+
if ( ! empty( $notif['routing'] ) ) {
|
1268 |
+
|
1269 |
+
foreach ( $notif['routing'] as $routing_key => $route ) {
|
1270 |
+
if ( ! empty( $route['email'] ) ) {
|
1271 |
+
$route_emails = $this->apply_user_email( $route['email'], $current_user_email );
|
1272 |
+
$data['data']['notifications'][ $notif_key ]['routing'][ $routing_key ]['email'] = $route_emails;
|
1273 |
+
}
|
1274 |
+
}
|
1275 |
+
}
|
1276 |
+
}
|
1277 |
+
}
|
1278 |
+
|
1279 |
+
return $data;
|
1280 |
+
}
|
1281 |
+
|
1282 |
+
/**
|
1283 |
+
* Apply user emails
|
1284 |
+
*
|
1285 |
+
* @since 1.18.0
|
1286 |
+
*
|
1287 |
+
* @param string $data - Email recipients
|
1288 |
+
* @param string $current_user_email
|
1289 |
+
*
|
1290 |
+
* @return array $recipients
|
1291 |
+
*/
|
1292 |
+
public function apply_user_email( $data, $current_user_email ) {
|
1293 |
+
$recipients = explode( ',', $data );
|
1294 |
+
|
1295 |
+
foreach ( $recipients as $key => $recipient ) {
|
1296 |
+
$recipient = trim( $recipient );
|
1297 |
+
|
1298 |
+
// Will not change recipients that use field tags like {email-1}.
|
1299 |
+
if ( false === strpos( $recipient, '{' ) ) {
|
1300 |
+
$recipients[ $key ] = $current_user_email;
|
1301 |
+
}
|
1302 |
+
}
|
1303 |
+
$recipients = array_unique( $recipients );
|
1304 |
+
|
1305 |
+
return implode( ',', $recipients );
|
1306 |
+
}
|
1307 |
|
1308 |
/**
|
1309 |
* Get instance of thirdparty importer class
|
1898 |
$data['buttons'] = array();
|
1899 |
|
1900 |
$data['buttons']['connect']['markup'] = '<div class="sui-actions-right">' .
|
1901 |
+
'<button class="sui-button forminator-stripe-connect" type="button" data-nonce="' . wp_create_nonce( 'forminator_stripe_settings_modal' ) . '">' .
|
1902 |
+
'<span class="sui-loading-text">' . esc_html__( 'Connect', 'forminator' ) . '</span>' .
|
1903 |
+
'<i class="sui-icon-loader sui-loading" aria-hidden="true"></i>' .
|
1904 |
+
'</button>' .
|
1905 |
+
'</div>';
|
1906 |
|
1907 |
wp_send_json_success( $data );
|
1908 |
}
|
2024 |
$data['buttons'] = array();
|
2025 |
|
2026 |
$data['buttons']['connect']['markup'] = '<div class="sui-actions-right">' .
|
2027 |
+
'<button class="sui-button forminator-paypal-connect" type="button" data-nonce="' . wp_create_nonce( 'forminator_paypal_settings_modal' ) . '">' .
|
2028 |
+
'<span class="sui-loading-text">' . esc_html__( 'Connect', 'forminator' ) . '</span>' .
|
2029 |
+
'<i class="sui-icon-loader sui-loading" aria-hidden="true"></i>' .
|
2030 |
+
'</button>' .
|
2031 |
+
'</div>';
|
2032 |
|
2033 |
wp_send_json_success( $data );
|
2034 |
}
|
2093 |
wp_send_json_success();
|
2094 |
}
|
2095 |
|
2096 |
+
/**
|
2097 |
+
* Promote free plan - Remind me later
|
2098 |
+
*/
|
2099 |
+
public function promote_remind_later() {
|
2100 |
+
forminator_validate_ajax( 'forminator_promote_remind_later' );
|
2101 |
+
|
2102 |
+
set_transient( 'forminator_free_plan_remind_later_' . get_current_user_id(), true, WEEK_IN_SECONDS );
|
2103 |
+
|
2104 |
+
wp_send_json_success();
|
2105 |
+
}
|
2106 |
+
|
2107 |
/**
|
2108 |
* Save general payments settings
|
2109 |
*
|
2208 |
}
|
2209 |
}
|
2210 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2211 |
/**
|
2212 |
* Module search for all types
|
2213 |
*
|
2237 |
wp_send_json_success( $html );
|
2238 |
}
|
2239 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2240 |
public function addons_page_actions() {
|
2241 |
// Validate nonce.
|
2242 |
forminator_validate_ajax( 'forminator_popup_addons_actions' );
|
2258 |
);
|
2259 |
|
2260 |
}
|
2261 |
+
|
2262 |
+
/**
|
2263 |
+
* Filter report data
|
2264 |
+
*
|
2265 |
+
* @return void
|
2266 |
+
*/
|
2267 |
+
public function filter_report_data() {
|
2268 |
+
// Validate nonce.
|
2269 |
+
forminator_validate_ajax( 'forminator_filter_report_data' );
|
2270 |
+
|
2271 |
+
$form_id = filter_input( INPUT_POST, 'form_id', FILTER_VALIDATE_INT );
|
2272 |
+
$form_type = Forminator_Core::sanitize_text_field( 'form_type' );
|
2273 |
+
$start_date = Forminator_Core::sanitize_text_field( 'start_date' );
|
2274 |
+
$end_date = Forminator_Core::sanitize_text_field( 'end_date' );
|
2275 |
+
$range_time = Forminator_Core::sanitize_text_field( 'range_time' );
|
2276 |
+
$range_text = ! empty( $range_time ) ? $range_time : 'Custom';
|
2277 |
+
|
2278 |
+
if ( ! empty( $form_id ) && ! empty( $start_date ) && ! empty( $end_date ) ) {
|
2279 |
+
|
2280 |
+
$admin_report_instance = Forminator_Admin_Report_Page::get_instance();
|
2281 |
+
|
2282 |
+
$reports = $admin_report_instance->forminator_report_data( $form_id, $form_type, $start_date, $end_date, $range_text );
|
2283 |
+
$report_data = $admin_report_instance->forminator_report_array( $reports, $form_id );
|
2284 |
+
$chart_data = $admin_report_instance->forminator_report_chart_data( $form_id, $start_date, $end_date );
|
2285 |
+
if ( isset( $chart_data['submissions'] ) ) {
|
2286 |
+
$chart_data['submissions'] = array_values( $chart_data['submissions'] );
|
2287 |
+
}
|
2288 |
+
|
2289 |
+
if ( ! empty( $report_data ) ) {
|
2290 |
+
$response = array(
|
2291 |
+
'reports' => $report_data,
|
2292 |
+
'chart_data' => $chart_data
|
2293 |
+
);
|
2294 |
+
wp_send_json_success( $response );
|
2295 |
+
}
|
2296 |
+
}
|
2297 |
+
wp_send_json_error(
|
2298 |
+
array( 'message' => __( 'Required field missing', 'forminator' ) )
|
2299 |
+
);
|
2300 |
+
}
|
2301 |
}
|
admin/classes/class-admin.php
CHANGED
@@ -26,12 +26,22 @@ class Forminator_Admin {
|
|
26 |
add_action( 'admin_notices', array( $this, 'show_stripe_updated_notice' ) );
|
27 |
add_action( 'admin_notices', array( $this, 'show_rating_notice' ) );
|
28 |
add_action( 'admin_notices', array( $this, 'show_pro_available_notice' ) );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
29 |
add_action( 'admin_notices', array( $this, 'check_stripe_addon_version' ) );
|
30 |
add_action( 'admin_notices', array( $this, 'show_cf7_importer_notice' ) );
|
31 |
add_action( 'admin_notices', array( $this, 'show_addons_update_notice' ) );
|
32 |
-
// add_action( 'admin_notices', array( $this, 'show_wpmudev_giveaway' ) );
|
33 |
-
//add_action( 'admin_notices', array( $this, 'show_prelaunch_subscriptions_notice' ) );
|
34 |
-
add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_scripts_for_notices' ) );
|
35 |
add_action( 'admin_init', array( $this, 'init_notices' ), 1 );
|
36 |
|
37 |
// Add plugin action links.
|
@@ -55,8 +65,6 @@ class Forminator_Admin {
|
|
55 |
* Triggered when Admin is loaded
|
56 |
*/
|
57 |
do_action( 'forminator_admin_loaded' );
|
58 |
-
|
59 |
-
$this->forminator_in_plugin_update_message();
|
60 |
}
|
61 |
|
62 |
/**
|
@@ -99,136 +107,6 @@ class Forminator_Admin {
|
|
99 |
);
|
100 |
}
|
101 |
|
102 |
-
public function enqueue_scripts_for_notices() {
|
103 |
-
// Hide for Forminator Pro.
|
104 |
-
/* if ( FORMINATOR_PRO ) {
|
105 |
-
return;
|
106 |
-
} */
|
107 |
-
|
108 |
-
// Enable notifications for main site and super admins only.
|
109 |
-
if ( ! is_main_site() || ! current_user_can( 'update_core' ) ) {
|
110 |
-
return;
|
111 |
-
}
|
112 |
-
|
113 |
-
$page = filter_input( INPUT_GET, 'page' );
|
114 |
-
if ( ! $page || false === strpos( $page, 'forminator' ) ) {
|
115 |
-
return;
|
116 |
-
}
|
117 |
-
|
118 |
-
$dismissed_messages = get_user_meta( get_current_user_id(), 'frmt_dismissed_messages', true );
|
119 |
-
|
120 |
-
// Hide if already dismissed.
|
121 |
-
/* if ( isset( $dismissed_messages['forminator_prelaunch_subscriptions_notice_dismissed'] ) &&
|
122 |
-
$dismissed_messages['forminator_prelaunch_subscriptions_notice_dismissed'] ) {
|
123 |
-
return;
|
124 |
-
} */
|
125 |
-
|
126 |
-
$forminator_data = new Forminator_Admin_Data();
|
127 |
-
$forminator_l10n = new Forminator_Admin_L10n();
|
128 |
-
|
129 |
-
// Discount subscription notice
|
130 |
-
/* wp_register_script(
|
131 |
-
'forminator-admin-discount',
|
132 |
-
forminator_plugin_url() . 'build/discount.js',
|
133 |
-
array(
|
134 |
-
'jquery',
|
135 |
-
'wp-color-picker',
|
136 |
-
'react',
|
137 |
-
'react-dom',
|
138 |
-
),
|
139 |
-
FORMINATOR_VERSION,
|
140 |
-
true
|
141 |
-
);
|
142 |
-
|
143 |
-
wp_localize_script( 'forminator-admin-discount', 'forminatorData', $forminator_data->get_options_data() );
|
144 |
-
wp_localize_script( 'forminator-admin-discount', 'forminatorl10n', $forminator_l10n->get_l10n_strings() );
|
145 |
-
|
146 |
-
wp_enqueue_script( 'forminator-admin-discount' ); */
|
147 |
-
|
148 |
-
// Membership Giveaway
|
149 |
-
/* wp_register_script(
|
150 |
-
'forminator-admin-giveaway',
|
151 |
-
forminator_plugin_url() . 'assets/js/giveaway.js',
|
152 |
-
array(
|
153 |
-
'jquery',
|
154 |
-
'wp-color-picker',
|
155 |
-
'react',
|
156 |
-
'react-dom',
|
157 |
-
),
|
158 |
-
FORMINATOR_VERSION,
|
159 |
-
true
|
160 |
-
);
|
161 |
-
|
162 |
-
wp_localize_script( 'forminator-admin-giveaway', 'forminatorData', $forminator_data->get_options_data() );
|
163 |
-
wp_localize_script( 'forminator-admin-giveaway', 'forminatorl10n', $forminator_l10n->get_l10n_strings() );
|
164 |
-
|
165 |
-
wp_enqueue_script( 'forminator-admin-giveaway' ); */
|
166 |
-
}
|
167 |
-
|
168 |
-
/**
|
169 |
-
* Show Prelaunch Subscriptions notice
|
170 |
-
*
|
171 |
-
* @since 1.14.10
|
172 |
-
*/
|
173 |
-
public function show_prelaunch_subscriptions_notice() {
|
174 |
-
$dismissed_messages = get_user_meta( get_current_user_id(), 'frmt_dismissed_messages', true );
|
175 |
-
|
176 |
-
// Hide for Forminator Pro.
|
177 |
-
/* if ( FORMINATOR_PRO ) {
|
178 |
-
return;
|
179 |
-
} */
|
180 |
-
|
181 |
-
// Enable notifications for main site and super admins only.
|
182 |
-
if ( ! is_main_site() || ! current_user_can( 'update_core' ) ) {
|
183 |
-
return;
|
184 |
-
}
|
185 |
-
|
186 |
-
$page = filter_input( INPUT_GET, 'page' );
|
187 |
-
if ( ! $page || false === strpos( $page, 'forminator' ) ) {
|
188 |
-
return;
|
189 |
-
}
|
190 |
-
|
191 |
-
// Hide if already dismissed.
|
192 |
-
/* if ( isset( $dismissed_messages['forminator_prelaunch_subscriptions_notice_dismissed'] ) &&
|
193 |
-
$dismissed_messages['forminator_prelaunch_subscriptions_notice_dismissed'] ) {
|
194 |
-
return;
|
195 |
-
} */
|
196 |
-
|
197 |
-
?>
|
198 |
-
<!-- Load shared module markup -->
|
199 |
-
<div
|
200 |
-
id="app"
|
201 |
-
class="sui-wrap sui-subscription-notice"
|
202 |
-
data-prop="forminator_prelaunch_subscriptions_notice_dismissed"
|
203 |
-
data-nonce="<?php echo esc_attr( wp_create_nonce( 'forminator_dismiss_prelaunch_subscriptions' ) ); ?>"
|
204 |
-
></div>
|
205 |
-
|
206 |
-
<!-- Function to keep notice closed after user clicks on dismiss button -->
|
207 |
-
<script type="text/javascript">
|
208 |
-
( function( $ ) {
|
209 |
-
// Define global FORMI object if it doesn't exist.
|
210 |
-
if ( 'object' !== typeof window.FORMI ) {
|
211 |
-
window.FORMI = {};
|
212 |
-
}
|
213 |
-
|
214 |
-
FORMI.dismissNotice = function() {
|
215 |
-
var $notice = $( '#app' );
|
216 |
-
var ajaxUrl = '<?php echo esc_url( forminator_ajax_url() ); ?>';
|
217 |
-
|
218 |
-
jQuery.post(
|
219 |
-
ajaxUrl,
|
220 |
-
{
|
221 |
-
action: 'forminator_dismiss_prelaunch_subscriptions',
|
222 |
-
prop: $notice.data('prop'),
|
223 |
-
_ajax_nonce: $notice.data('nonce')
|
224 |
-
}
|
225 |
-
);
|
226 |
-
}
|
227 |
-
}( jQuery ) );
|
228 |
-
</script>
|
229 |
-
<?php
|
230 |
-
}
|
231 |
-
|
232 |
/**
|
233 |
* Include required files
|
234 |
*
|
@@ -242,6 +120,7 @@ class Forminator_Admin {
|
|
242 |
include_once forminator_plugin_dir() . 'admin/pages/settings-page.php';
|
243 |
include_once forminator_plugin_dir() . 'admin/pages/upgrade-page.php';
|
244 |
include_once forminator_plugin_dir() . 'admin/pages/addons-page.php';
|
|
|
245 |
|
246 |
// Admin AJAX.
|
247 |
include_once forminator_plugin_dir() . 'admin/classes/class-admin-ajax.php';
|
@@ -270,6 +149,9 @@ class Forminator_Admin {
|
|
270 |
// Admin Addons page.
|
271 |
include_once forminator_plugin_dir() . 'admin/classes/class-addons-page.php';
|
272 |
|
|
|
|
|
|
|
273 |
}
|
274 |
|
275 |
/**
|
@@ -411,28 +293,29 @@ class Forminator_Admin {
|
|
411 |
}
|
412 |
|
413 |
/**
|
414 |
-
*
|
415 |
*
|
416 |
-
* @since 1.
|
417 |
-
*
|
418 |
-
* @return bool
|
419 |
*/
|
420 |
-
public function
|
421 |
-
|
422 |
-
|
423 |
-
if ( count( $forms ) > 0 ) {
|
424 |
-
return true;
|
425 |
-
}
|
426 |
|
427 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
428 |
}
|
429 |
|
430 |
/**
|
431 |
* Check if we have any old Stripe form
|
432 |
*
|
|
|
433 |
* @since 1.9
|
434 |
*
|
435 |
-
* @return bool
|
436 |
*/
|
437 |
public function has_old_stripe_forms() {
|
438 |
$forms = Forminator_Form_Model::model()->get_models_by_field_and_version( 'stripe-1', '1.9-alpha.1' );
|
@@ -461,14 +344,17 @@ class Forminator_Admin {
|
|
461 |
}
|
462 |
|
463 |
// Show the notice only to users who can do something about this and who are members.
|
464 |
-
if ( ! self::user_can_update_plugins() || ! in_array( forminator_membership_status(), array(
|
|
|
|
|
|
|
465 |
return;
|
466 |
}
|
467 |
|
468 |
$url = add_query_arg(
|
469 |
-
|
470 |
-
|
471 |
-
|
472 |
$link = '<a type="button" href="' . esc_url( $url ) . '" target="_self" class="button button-primary">' . esc_html__( 'Upgrade' ) . '</a>';
|
473 |
|
474 |
$username = forminator_get_current_username();
|
@@ -481,10 +367,64 @@ class Forminator_Admin {
|
|
481 |
$message .= '<p>' . $link . '</p>';
|
482 |
|
483 |
echo '<div class="forminator-grouped-notice notice notice-info is-dismissible"'
|
484 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
485 |
. ' data-nonce="' . esc_attr( wp_create_nonce( 'forminator_dismiss_notice' ) ) . '">';
|
486 |
echo wp_kses_post( $message );
|
487 |
echo '</div>';
|
|
|
|
|
|
|
|
|
|
|
|
|
488 |
}
|
489 |
|
490 |
/**
|
@@ -494,7 +434,7 @@ class Forminator_Admin {
|
|
494 |
public function check_stripe_addon_version() {
|
495 |
// Show the notice only if Stripe Addon is active and its version is less than 1.0.4.
|
496 |
if ( ! defined( 'FORMINATOR_STRIPE_ADDON' ) || ! class_exists( 'Forminator_Stripe_Addon' )
|
497 |
-
|
498 |
return;
|
499 |
}
|
500 |
|
@@ -509,8 +449,8 @@ class Forminator_Admin {
|
|
509 |
$message .= '</p>';
|
510 |
|
511 |
echo '<div class="forminator-grouped-notice notice notice-error"'
|
512 |
-
|
513 |
-
|
514 |
echo wp_kses_post( $message );
|
515 |
echo '</div>';
|
516 |
}
|
@@ -519,6 +459,7 @@ class Forminator_Admin {
|
|
519 |
* Check if the given notification was dismissed.
|
520 |
*
|
521 |
* @param string $notification_name Notification slug.
|
|
|
522 |
* @return bool
|
523 |
*/
|
524 |
public static function was_notification_dismissed( $notification_name ) {
|
@@ -527,6 +468,17 @@ class Forminator_Admin {
|
|
527 |
return ( is_array( $dismissed ) && in_array( $notification_name, $dismissed, true ) );
|
528 |
}
|
529 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
530 |
/**
|
531 |
* Check if the current user is able to update plugins
|
532 |
*
|
@@ -555,60 +507,60 @@ class Forminator_Admin {
|
|
555 |
}
|
556 |
|
557 |
?>
|
558 |
-
|
559 |
-
|
560 |
-
|
561 |
-
|
562 |
-
|
563 |
-
|
564 |
-
|
565 |
-
|
566 |
-
|
567 |
-
|
568 |
-
|
569 |
-
|
570 |
-
|
571 |
-
|
572 |
-
|
573 |
-
|
574 |
-
|
575 |
-
|
576 |
-
|
577 |
-
|
578 |
-
|
579 |
-
|
580 |
-
|
581 |
-
|
582 |
-
|
583 |
-
|
584 |
-
|
585 |
-
|
586 |
-
|
587 |
-
|
588 |
-
|
589 |
-
|
590 |
-
|
591 |
-
|
592 |
-
|
593 |
-
|
594 |
-
|
595 |
-
|
596 |
-
|
597 |
-
|
598 |
-
|
599 |
-
|
600 |
-
|
601 |
-
|
602 |
-
|
603 |
-
|
604 |
-
|
605 |
-
|
606 |
-
|
607 |
-
|
608 |
-
|
609 |
-
|
610 |
-
|
611 |
-
|
612 |
<?php
|
613 |
}
|
614 |
|
@@ -629,36 +581,39 @@ class Forminator_Admin {
|
|
629 |
}
|
630 |
?>
|
631 |
|
632 |
-
|
633 |
-
|
634 |
-
|
635 |
-
|
636 |
-
|
637 |
-
|
638 |
-
|
639 |
-
|
640 |
-
|
641 |
-
|
642 |
-
|
643 |
-
|
644 |
-
|
645 |
-
|
646 |
-
|
647 |
-
|
648 |
-
|
649 |
-
|
650 |
-
|
651 |
-
|
652 |
-
|
653 |
-
|
654 |
-
|
655 |
-
|
656 |
-
|
657 |
-
|
658 |
-
|
659 |
-
|
660 |
-
|
661 |
-
|
|
|
|
|
|
|
662 |
<?php
|
663 |
}
|
664 |
|
@@ -688,19 +643,25 @@ class Forminator_Admin {
|
|
688 |
$milestone = ( 10 >= $published_modules ) ? 5 : 10;
|
689 |
?>
|
690 |
|
691 |
-
|
|
|
|
|
692 |
|
693 |
-
|
694 |
|
695 |
-
|
696 |
-
|
|
|
697 |
|
698 |
-
|
|
|
699 |
|
700 |
-
|
701 |
-
|
|
|
|
|
702 |
|
703 |
-
|
704 |
|
705 |
<?php
|
706 |
} else {
|
@@ -711,22 +672,22 @@ class Forminator_Admin {
|
|
711 |
if ( $install_date && current_time( 'timestamp' ) > strtotime( '+7 days', $install_date ) && ! $publish_later && ! $publish_later_dismiss && ! $days_later_dismiss ) {
|
712 |
?>
|
713 |
|
714 |
-
|
715 |
-
|
716 |
-
|
717 |
|
718 |
-
|
719 |
|
720 |
-
|
721 |
-
|
722 |
-
|
723 |
|
724 |
-
|
725 |
-
|
726 |
-
|
727 |
-
|
728 |
|
729 |
-
|
730 |
|
731 |
<?php
|
732 |
}
|
@@ -734,30 +695,30 @@ class Forminator_Admin {
|
|
734 |
|
735 |
?>
|
736 |
|
737 |
-
|
738 |
-
|
739 |
-
|
740 |
-
|
741 |
-
|
742 |
-
|
743 |
-
|
744 |
-
|
745 |
-
|
746 |
-
|
747 |
-
|
748 |
-
|
749 |
-
|
750 |
-
|
751 |
-
|
752 |
-
|
753 |
-
|
754 |
-
|
755 |
-
|
756 |
-
|
757 |
-
|
758 |
-
|
759 |
-
|
760 |
-
|
761 |
|
762 |
<?php
|
763 |
}
|
@@ -765,11 +726,11 @@ class Forminator_Admin {
|
|
765 |
/**
|
766 |
* Show action links on the plugin screen.
|
767 |
*
|
768 |
-
* @since 1.13
|
769 |
-
*
|
770 |
* @param array $links Plugin Action links.
|
771 |
*
|
772 |
* @return mixed
|
|
|
|
|
773 |
*/
|
774 |
public function add_plugin_action_links( $links ) {
|
775 |
// Settings link.
|
@@ -785,7 +746,7 @@ class Forminator_Admin {
|
|
785 |
// Upgrade or Renew links.
|
786 |
if ( ! FORMINATOR_PRO || 'upgrade' === $membership ) {
|
787 |
$action_links['upgrade'] = '<a href="' . forminator_get_link( 'plugin', 'forminator_pluginlist_upgrade' ) . '" aria-label="' . esc_attr( __( 'Upgrade to Forminator Pro', 'forminator' ) ) . '" style="color: #8D00B1;" target="_blank">' . esc_html__( 'Upgrade', 'forminator' ) . '</a>';
|
788 |
-
} elseif ( 'expired' === $membership || 'free' === $membership ) {
|
789 |
$action_links['renew'] = '<a href="' . forminator_get_link( 'plugin', 'forminator_pluginlist_renew' ) . '" aria-label="' . esc_attr( __( 'Upgrade 35% OFF Sale', 'forminator' ) ) . '" style="color: #8D00B1;" target="_blank">' . esc_html__( 'Upgrade 35% OFF Sale', 'forminator' ) . '</a>';
|
790 |
}
|
791 |
|
@@ -795,13 +756,13 @@ class Forminator_Admin {
|
|
795 |
/**
|
796 |
* Show row meta on the plugin screen.
|
797 |
*
|
798 |
-
* @since 1.13
|
799 |
-
*
|
800 |
* @param mixed $links Plugin Row Meta.
|
801 |
* @param mixed $file Plugin Base file.
|
802 |
* @param array $plugin_data Plugin data.
|
803 |
*
|
804 |
* @return array
|
|
|
|
|
805 |
*/
|
806 |
public function plugin_row_meta( $links, $file, $plugin_data ) {
|
807 |
if ( FORMINATOR_PLUGIN_BASENAME === $file ) {
|
@@ -891,169 +852,54 @@ class Forminator_Admin {
|
|
891 |
}
|
892 |
?>
|
893 |
|
894 |
-
|
895 |
-
|
896 |
-
|
|
|
|
|
897 |
<?php echo esc_html__( 'New update available for one or more Add-ons.', 'forminator' ); ?>
|
898 |
-
|
899 |
-
|
900 |
-
|
901 |
<?php esc_html_e( 'A new update is available for one or more of your Forminator Add-ons. Click on the button below to check and update the required Add-on.', 'forminator' ); ?>
|
902 |
-
|
903 |
-
|
904 |
-
|
905 |
-
|
906 |
-
|
907 |
<?php if ( ! $notice_later ) { ?>
|
908 |
-
|
|
|
|
|
|
|
909 |
<?php } ?>
|
910 |
-
|
911 |
-
|
912 |
-
|
913 |
-
|
914 |
-
|
915 |
-
|
916 |
-
|
917 |
-
|
918 |
-
|
919 |
-
|
920 |
-
|
921 |
-
|
922 |
-
|
923 |
-
|
924 |
-
|
925 |
-
|
926 |
-
|
927 |
-
|
928 |
-
|
929 |
-
|
930 |
-
|
931 |
-
|
932 |
-
|
933 |
-
|
934 |
-
|
935 |
-
|
|
|
936 |
<?php
|
937 |
}
|
938 |
-
|
939 |
-
/**
|
940 |
-
* Get apply preset modal HTML
|
941 |
-
*/
|
942 |
-
public static function get_apply_preset_modal() {
|
943 |
-
?>
|
944 |
-
<div class="sui-modal sui-modal-sm sui-modal-alt">
|
945 |
-
<div
|
946 |
-
role="dialog"
|
947 |
-
id="forminator-apply-preset-modal"
|
948 |
-
class="sui-modal-content sui-fade-in"
|
949 |
-
aria-labelledby="forminator-apply-preset-title"
|
950 |
-
aria-describedby="forminator-apply-preset-description"
|
951 |
-
>
|
952 |
-
<div class="sui-box" role="document">
|
953 |
-
<div class="sui-box-header sui-flatten sui-content-center sui-spacing-top--60">
|
954 |
-
<button class="sui-button-icon sui-button-float--right" data-modal-close="">
|
955 |
-
<span class="sui-icon-close sui-md" aria-hidden="true"></span>
|
956 |
-
<span class="sui-screen-reader-text"><?php esc_html_e( 'Close this dialog window.', 'forminator' ); ?></span>
|
957 |
-
</button>
|
958 |
-
|
959 |
-
<h3 class="sui-box-title sui-lg" id="forminator-apply-preset-title"><?php esc_html_e( 'Choose Preset', 'forminator' ); ?></h3>
|
960 |
-
|
961 |
-
<p class="sui-description" id="forminator-apply-preset-description">
|
962 |
-
<?php esc_html_e( 'Select an appearance preset from the list below to apply the appearance to the selected form(s)', 'forminator' ); ?>
|
963 |
-
</p>
|
964 |
-
</div>
|
965 |
-
<div class="sui-box-body sui-box-body-slim">
|
966 |
-
|
967 |
-
<div class="sui-form-field" style="margin-bottom: 10px;">
|
968 |
-
<?php echo Forminator_Settings_Page::get_preset_selectbox(); ?>
|
969 |
-
</div>
|
970 |
-
|
971 |
-
<div class="sui-notice" style="margin-top: 10px;">
|
972 |
-
<div class="sui-notice-content">
|
973 |
-
<div class="sui-notice-message">
|
974 |
-
<span class="sui-notice-icon sui-icon-info sui-md" aria-hidden="true"></span>
|
975 |
-
<p><?php esc_html_e( 'The current appearance configurations will be overwritten for the selected form(s).', 'forminator' ); ?></p>
|
976 |
-
</div>
|
977 |
-
</div>
|
978 |
-
</div>
|
979 |
-
|
980 |
-
</div>
|
981 |
-
|
982 |
-
<div class="sui-box-footer sui-flatten sui-box-footer-center sui-content-center" style="padding-bottom: 40px;">
|
983 |
-
<button id="forminator-apply-preset" class="sui-button sui-button-blue">
|
984 |
-
<span class="sui-button-text-default">
|
985 |
-
<i class="sui-icon-check" aria-hidden="true"></i> <?php esc_html_e( 'Apply Preset', 'forminator' ); ?>
|
986 |
-
</span>
|
987 |
-
<span class="sui-button-text-onload">
|
988 |
-
<i class="sui-icon-loader sui-loading" aria-hidden="true"></i>
|
989 |
-
</span>
|
990 |
-
</button>
|
991 |
-
</div>
|
992 |
-
<?php wp_nonce_field( 'forminator_apply_preset' ); ?>
|
993 |
-
</div>
|
994 |
-
</div>
|
995 |
-
</div>
|
996 |
-
<?php
|
997 |
-
}
|
998 |
-
|
999 |
-
/**
|
1000 |
-
* Forminator plugin update notice
|
1001 |
-
*
|
1002 |
-
* @return void
|
1003 |
-
*/
|
1004 |
-
public function forminator_in_plugin_update_message() {
|
1005 |
-
if ( ! FORMINATOR_PRO ) {
|
1006 |
-
add_action( 'in_plugin_update_message-forminator/forminator.php', array(
|
1007 |
-
$this,
|
1008 |
-
'show_plugin_update_notice'
|
1009 |
-
), 10, 2 );
|
1010 |
-
} else {
|
1011 |
-
add_action(
|
1012 |
-
'load-plugins.php',
|
1013 |
-
function () {
|
1014 |
-
add_action( 'after_plugin_row_forminator/forminator.php', array(
|
1015 |
-
$this,
|
1016 |
-
'show_plugin_update_notice'
|
1017 |
-
), 10, 2 );
|
1018 |
-
},
|
1019 |
-
22
|
1020 |
-
);
|
1021 |
-
}
|
1022 |
-
}
|
1023 |
-
|
1024 |
-
/**
|
1025 |
-
* Show plugin update notice
|
1026 |
-
*
|
1027 |
-
* @param $data
|
1028 |
-
* @param $response
|
1029 |
-
*
|
1030 |
-
* @return void
|
1031 |
-
*/
|
1032 |
-
public function show_plugin_update_notice( $data, $response ) {
|
1033 |
-
$plugin_data = (object) $response;
|
1034 |
-
|
1035 |
-
if ( empty( $plugin_data->update ) || empty( $plugin_data->new_version ) || empty( $plugin_data->plugin ) ) {
|
1036 |
-
return;
|
1037 |
-
}
|
1038 |
-
|
1039 |
-
if ( '1.16.0' === $plugin_data->new_version || '1.16' === $plugin_data->new_version ) {
|
1040 |
-
$notice = '<br/><strong>' . __( 'Upgrade Notice: ', 'forminator' ) . '</strong>';
|
1041 |
-
$notice .= __( 'Forminator is getting a huge performance boost thanks to some form submission improvements.', 'forminator' );
|
1042 |
-
$notice .= '<br/><br/>' . sprintf(
|
1043 |
-
__( 'There\'s an extremely low chance these changes may affect you if any of your forms use a custom action or filter that we\'ve now removed or modified (forms using standard Forminator features won\'t be affected at all). If needed, refer to this list of the %1$sretired actions/filters%2$s, but we\'re confident that %3$s of users should remain unaffected.', 'forminator' ),
|
1044 |
-
'<a href="https://wpmudev.com/docs/api-plugin-development/forminator-api-docs/#modified-or-deprecated-hooks" target="_blank">',
|
1045 |
-
'</a>',
|
1046 |
-
'99%'
|
1047 |
-
);
|
1048 |
-
$notice .= '<br/><br/>' . esc_html__( 'Any problems or issues? Don\'t hesitate to create a support ticket or contact support directly.', 'forminator' );
|
1049 |
-
|
1050 |
-
echo "<script type='text/javascript'>
|
1051 |
-
(function ($) {
|
1052 |
-
$( function (e) {
|
1053 |
-
$( '.wp-list-table tr[data-plugin=\"" . esc_attr( $plugin_data->plugin ) . "\"] .notice-warning' ).append( '" . addslashes( $notice ) . "' ).css('padding-bottom', '10px');
|
1054 |
-
});
|
1055 |
-
})(jQuery);
|
1056 |
-
</script>";
|
1057 |
-
}
|
1058 |
-
}
|
1059 |
}
|
26 |
add_action( 'admin_notices', array( $this, 'show_stripe_updated_notice' ) );
|
27 |
add_action( 'admin_notices', array( $this, 'show_rating_notice' ) );
|
28 |
add_action( 'admin_notices', array( $this, 'show_pro_available_notice' ) );
|
29 |
+
|
30 |
+
// Show Promote free plan notice only for Free version, for admins and if WPMU DEV Dashboard is not activated.
|
31 |
+
if ( ! FORMINATOR_PRO && ! class_exists( 'WPMUDEV_Dashboard' ) && current_user_can( 'manage_options' )
|
32 |
+
// The notice was already dismissed.
|
33 |
+
&& ! self::was_notification_dismissed( 'forminator_promote_free_plan' )
|
34 |
+
// Remind me later was clicked.
|
35 |
+
&& ! self::maybe_remind_later()
|
36 |
+
) {
|
37 |
+
|
38 |
+
add_action( 'admin_notices', array( $this, 'promote_free_plan' ) );
|
39 |
+
add_action( 'admin_enqueue_scripts', array( $this, 'promote_free_plan_scripts' ) );
|
40 |
+
}
|
41 |
+
|
42 |
add_action( 'admin_notices', array( $this, 'check_stripe_addon_version' ) );
|
43 |
add_action( 'admin_notices', array( $this, 'show_cf7_importer_notice' ) );
|
44 |
add_action( 'admin_notices', array( $this, 'show_addons_update_notice' ) );
|
|
|
|
|
|
|
45 |
add_action( 'admin_init', array( $this, 'init_notices' ), 1 );
|
46 |
|
47 |
// Add plugin action links.
|
65 |
* Triggered when Admin is loaded
|
66 |
*/
|
67 |
do_action( 'forminator_admin_loaded' );
|
|
|
|
|
68 |
}
|
69 |
|
70 |
/**
|
107 |
);
|
108 |
}
|
109 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
110 |
/**
|
111 |
* Include required files
|
112 |
*
|
120 |
include_once forminator_plugin_dir() . 'admin/pages/settings-page.php';
|
121 |
include_once forminator_plugin_dir() . 'admin/pages/upgrade-page.php';
|
122 |
include_once forminator_plugin_dir() . 'admin/pages/addons-page.php';
|
123 |
+
include_once forminator_plugin_dir() . 'admin/pages/reports-page.php';
|
124 |
|
125 |
// Admin AJAX.
|
126 |
include_once forminator_plugin_dir() . 'admin/classes/class-admin-ajax.php';
|
149 |
// Admin Addons page.
|
150 |
include_once forminator_plugin_dir() . 'admin/classes/class-addons-page.php';
|
151 |
|
152 |
+
// Admin report page
|
153 |
+
include_once forminator_plugin_dir() . 'admin/classes/class-reports-page.php';
|
154 |
+
|
155 |
}
|
156 |
|
157 |
/**
|
293 |
}
|
294 |
|
295 |
/**
|
296 |
+
* Add Reports page
|
297 |
*
|
298 |
+
* @since 1.18.0
|
|
|
|
|
299 |
*/
|
300 |
+
public function add_reports_page() {
|
301 |
+
add_action( 'admin_menu', array( $this, 'init_reports_page' ) );
|
302 |
+
}
|
|
|
|
|
|
|
303 |
|
304 |
+
/**
|
305 |
+
* Initialize Reports page
|
306 |
+
*
|
307 |
+
* @since 1.18.0
|
308 |
+
*/
|
309 |
+
public function init_reports_page() {
|
310 |
+
$this->pages['forminator-reports'] = new Forminator_Reports_Page( 'forminator-reports', 'common/reports', __( 'Reports', 'forminator' ), __( 'Reports', 'forminator' ), 'forminator' );
|
311 |
}
|
312 |
|
313 |
/**
|
314 |
* Check if we have any old Stripe form
|
315 |
*
|
316 |
+
* @return bool
|
317 |
* @since 1.9
|
318 |
*
|
|
|
319 |
*/
|
320 |
public function has_old_stripe_forms() {
|
321 |
$forms = Forminator_Form_Model::model()->get_models_by_field_and_version( 'stripe-1', '1.9-alpha.1' );
|
344 |
}
|
345 |
|
346 |
// Show the notice only to users who can do something about this and who are members.
|
347 |
+
if ( ! self::user_can_update_plugins() || ! in_array( forminator_membership_status(), array(
|
348 |
+
'full',
|
349 |
+
'upgrade'
|
350 |
+
), true ) ) {
|
351 |
return;
|
352 |
}
|
353 |
|
354 |
$url = add_query_arg(
|
355 |
+
array( 'page' => 'wpmudev-plugins' ),
|
356 |
+
network_admin_url( 'admin.php' )
|
357 |
+
) . '#pid=2097296';
|
358 |
$link = '<a type="button" href="' . esc_url( $url ) . '" target="_self" class="button button-primary">' . esc_html__( 'Upgrade' ) . '</a>';
|
359 |
|
360 |
$username = forminator_get_current_username();
|
367 |
$message .= '<p>' . $link . '</p>';
|
368 |
|
369 |
echo '<div class="forminator-grouped-notice notice notice-info is-dismissible"'
|
370 |
+
. ' data-notice-slug="forminator_pro_is_available"'
|
371 |
+
. ' data-nonce="' . esc_attr( wp_create_nonce( 'forminator_dismiss_notice' ) ) . '">';
|
372 |
+
echo wp_kses_post( $message );
|
373 |
+
echo '</div>';
|
374 |
+
}
|
375 |
+
|
376 |
+
/**
|
377 |
+
* Enqueue scripts for Promote Free Plan notice
|
378 |
+
*/
|
379 |
+
public function promote_free_plan_scripts() {
|
380 |
+
// Show the notice only on WP Dashboard page.
|
381 |
+
$screen = get_current_screen();
|
382 |
+
if ( 'dashboard' !== $screen->id ) {
|
383 |
+
return;
|
384 |
+
}
|
385 |
+
|
386 |
+
$dashboard_object = $this->pages['forminator-dashboard'];
|
387 |
+
$dashboard_object->enqueue_scripts( '' );
|
388 |
+
}
|
389 |
+
|
390 |
+
/**
|
391 |
+
* Displays Promote Free Plan notice
|
392 |
+
*/
|
393 |
+
public function promote_free_plan() {
|
394 |
+
// Show the notice only on WP Dashboard page.
|
395 |
+
$screen = get_current_screen();
|
396 |
+
if ( 'dashboard' !== $screen->id ) {
|
397 |
+
return;
|
398 |
+
}
|
399 |
+
|
400 |
+
$button_1 = '<a href="https://wpmudev.com/register/?free_hub&utm_source=forminator&utm_medium=referral&utm_campaign=wp_admin_free_plan_1" target="_blank" class="button button-primary">'
|
401 |
+
. esc_html__( 'Claim your free gift' )
|
402 |
+
. '</a>';
|
403 |
+
$button_2 = '<button class="button" id="forminator-promote-popup-open">' . esc_html__( 'Find out more' ) . '</button>';
|
404 |
+
$remind = '<a style="margin-left:20px;text-decoration: none;" href="#" id="forminator-promote-remind-later" data-nonce="' . esc_attr( wp_create_nonce( 'forminator_promote_remind_later' ) ) . '">' . esc_html__( 'Remind me later', 'forminator' ) . '</a>';
|
405 |
+
|
406 |
+
$message = '<p><strong>';
|
407 |
+
$message .= esc_html__( 'Managing multiple WP sites for clients? Here’s a free gift to make it easier', 'forminator' );
|
408 |
+
$message .= '</strong></p>';
|
409 |
+
$message .= '<p>';
|
410 |
+
$message .= esc_html__( 'In addition to Forminator, WPMU DEV has everything you need for fast and convenient site management.', 'forminator' );
|
411 |
+
$message .= '</p>';
|
412 |
+
$message .= '<p>';
|
413 |
+
$message .= esc_html__( 'Trusted by over 50K web developers. Completely free to try.', 'forminator' );
|
414 |
+
$message .= '</p>';
|
415 |
+
$message .= '<p>' . $button_1 . ' ' . $button_2 . $remind . '</p>';
|
416 |
+
|
417 |
+
echo '<div class="forminator-grouped-notice notice notice-info is-dismissible"'
|
418 |
+
. ' data-notice-slug="forminator_promote_free_plan"'
|
419 |
. ' data-nonce="' . esc_attr( wp_create_nonce( 'forminator_dismiss_notice' ) ) . '">';
|
420 |
echo wp_kses_post( $message );
|
421 |
echo '</div>';
|
422 |
+
$dashboard_object = $this->pages['forminator-dashboard'];
|
423 |
+
echo '<div class="' . esc_attr( $dashboard_object->get_sui_body_class() ) . '">';
|
424 |
+
echo '<div class="sui-wrap wpmudev-forminator-forminator">';
|
425 |
+
$dashboard_object->template( 'dashboard/promote-free-plan' );
|
426 |
+
echo '</div>';
|
427 |
+
echo '</div>';
|
428 |
}
|
429 |
|
430 |
/**
|
434 |
public function check_stripe_addon_version() {
|
435 |
// Show the notice only if Stripe Addon is active and its version is less than 1.0.4.
|
436 |
if ( ! defined( 'FORMINATOR_STRIPE_ADDON' ) || ! class_exists( 'Forminator_Stripe_Addon' )
|
437 |
+
|| version_compare( FORMINATOR_STRIPE_ADDON, '1.0.4', '>=' ) ) {
|
438 |
return;
|
439 |
}
|
440 |
|
449 |
$message .= '</p>';
|
450 |
|
451 |
echo '<div class="forminator-grouped-notice notice notice-error"'
|
452 |
+
. ' data-notice-slug="forminator_pro_is_available"'
|
453 |
+
. '>';
|
454 |
echo wp_kses_post( $message );
|
455 |
echo '</div>';
|
456 |
}
|
459 |
* Check if the given notification was dismissed.
|
460 |
*
|
461 |
* @param string $notification_name Notification slug.
|
462 |
+
*
|
463 |
* @return bool
|
464 |
*/
|
465 |
public static function was_notification_dismissed( $notification_name ) {
|
468 |
return ( is_array( $dismissed ) && in_array( $notification_name, $dismissed, true ) );
|
469 |
}
|
470 |
|
471 |
+
/**
|
472 |
+
* Return true if Remind me later was clicked
|
473 |
+
*
|
474 |
+
* @return bool
|
475 |
+
*/
|
476 |
+
private static function maybe_remind_later() {
|
477 |
+
$option = get_transient( 'forminator_free_plan_remind_later_' . get_current_user_id() );
|
478 |
+
|
479 |
+
return ! ! $option;
|
480 |
+
}
|
481 |
+
|
482 |
/**
|
483 |
* Check if the current user is able to update plugins
|
484 |
*
|
507 |
}
|
508 |
|
509 |
?>
|
510 |
+
<div class="forminator-notice-cf7 forminator-notice notice notice-info"
|
511 |
+
data-prop="forminator_cf7_notice_dismissed"
|
512 |
+
data-nonce="<?php echo esc_attr( wp_create_nonce( 'forminator_dismiss_notification' ) ); ?>">
|
513 |
+
<p style="color: #1A2432; font-size: 14px; font-weight: bold;"><?php echo esc_html__( 'Forminator - Import your Contact Form 7 forms automatically', 'forminator' ); ?></p>
|
514 |
+
|
515 |
+
<p style="color: #72777C; line-height: 22px;"><?php echo esc_html__( 'We noticed that Contact Form 7 is active on your website. You can use our built-in Contact Form 7 importer to import your existing forms and the relevant plugin settings from Contact Form 7 to Forminator. The importer supports the most widely used add-ons as well.', 'forminator' ); ?></p>
|
516 |
+
|
517 |
+
<p>
|
518 |
+
<a href="<?php echo esc_url( menu_page_url( 'forminator-settings', false ) . '§ion=import' ); ?>"
|
519 |
+
class="button button-primary"><?php esc_html_e( 'Import Contact Form 7 Forms', 'forminator' ); ?></a>
|
520 |
+
<a href="#" class="dismiss-notice"
|
521 |
+
style="margin-left: 10px; text-decoration: none; color: #555; font-weight: 500;"><?php esc_html_e( 'Dismiss', 'forminator' ); ?></a>
|
522 |
+
</p>
|
523 |
+
|
524 |
+
</div>
|
525 |
+
|
526 |
+
<script type="text/javascript">
|
527 |
+
jQuery('.forminator-notice-cf7 .button-primary').on('click', function (e) {
|
528 |
+
e.preventDefault();
|
529 |
+
|
530 |
+
var $self = jQuery(this);
|
531 |
+
var $notice = jQuery(e.currentTarget).closest('.forminator-notice');
|
532 |
+
var ajaxUrl = '<?php echo esc_url( forminator_ajax_url() ); ?>';
|
533 |
+
|
534 |
+
jQuery.post(
|
535 |
+
ajaxUrl,
|
536 |
+
{
|
537 |
+
action: 'forminator_dismiss_notification',
|
538 |
+
prop: $notice.data('prop'),
|
539 |
+
_ajax_nonce: $notice.data('nonce')
|
540 |
+
}
|
541 |
+
).always(function () {
|
542 |
+
location.href = $self.attr('href');
|
543 |
+
});
|
544 |
+
});
|
545 |
+
|
546 |
+
jQuery('.forminator-notice-cf7 .dismiss-notice').on('click', function (e) {
|
547 |
+
e.preventDefault();
|
548 |
+
|
549 |
+
var $notice = jQuery(e.currentTarget).closest('.forminator-notice');
|
550 |
+
var ajaxUrl = '<?php echo esc_url( forminator_ajax_url() ); ?>';
|
551 |
+
|
552 |
+
jQuery.post(
|
553 |
+
ajaxUrl,
|
554 |
+
{
|
555 |
+
action: 'forminator_dismiss_notification',
|
556 |
+
prop: $notice.data('prop'),
|
557 |
+
_ajax_nonce: $notice.data('nonce')
|
558 |
+
}
|
559 |
+
).always(function () {
|
560 |
+
$notice.hide();
|
561 |
+
});
|
562 |
+
});
|
563 |
+
</script>
|
564 |
<?php
|
565 |
}
|
566 |
|
581 |
}
|
582 |
?>
|
583 |
|
584 |
+
<div class="forminator-notice notice notice-warning" data-prop="forminator_stripe_notice_dismissed"
|
585 |
+
data-nonce="<?php echo esc_attr( wp_create_nonce( 'forminator_dismiss_notification' ) ); ?>">
|
586 |
+
|
587 |
+
<p style="color: #72777C; line-height: 22px;"><?php echo wp_kses_post( sprintf( __( 'To make Forminator\'s Stripe field <a href="%s" target="_blank">SCA Compliant</a>, we have replaced the Stripe Checkout modal with Stripe Elements which adds an inline field to collect your customer\'s credit or debit card details. Your existing forms with Stripe field are automatically updated, but we recommend checking them to ensure everything works fine.', 'forminator' ), 'https://stripe.com/gb/guides/strong-customer-authentication' ) ); ?></p>
|
588 |
+
|
589 |
+
<p>
|
590 |
+
<a href="<?php echo esc_url( menu_page_url( 'forminator', false ) . '&show_stripe_dialog=true' ); ?>"
|
591 |
+
class="button button-primary"><?php esc_html_e( 'Learn more', 'forminator' ); ?></a>
|
592 |
+
<a href="#" class="dismiss-notice"
|
593 |
+
style="margin-left: 10px; text-decoration: none; color: #555; font-weight: 500;"><?php esc_html_e( 'Dismiss', 'forminator' ); ?></a>
|
594 |
+
</p>
|
595 |
+
|
596 |
+
</div>
|
597 |
+
|
598 |
+
<script type="text/javascript">
|
599 |
+
jQuery('.forminator-notice .dismiss-notice').on('click', function (e) {
|
600 |
+
e.preventDefault();
|
601 |
+
|
602 |
+
var $notice = jQuery(e.currentTarget).closest('.forminator-notice');
|
603 |
+
var ajaxUrl = '<?php echo esc_url( forminator_ajax_url() ); ?>';
|
604 |
+
|
605 |
+
jQuery.post(
|
606 |
+
ajaxUrl,
|
607 |
+
{
|
608 |
+
action: 'forminator_dismiss_notification',
|
609 |
+
prop: $notice.data('prop'),
|
610 |
+
_ajax_nonce: $notice.data('nonce')
|
611 |
+
}
|
612 |
+
).always(function () {
|
613 |
+
$notice.hide();
|
614 |
+
});
|
615 |
+
});
|
616 |
+
</script>
|
617 |
<?php
|
618 |
}
|
619 |
|
643 |
$milestone = ( 10 >= $published_modules ) ? 5 : 10;
|
644 |
?>
|
645 |
|
646 |
+
<div id="forminator-free-publish-notice"
|
647 |
+
class="forminator-rating-notice notice notice-info fui-wordpress-notice"
|
648 |
+
data-nonce="<?php echo esc_attr( wp_create_nonce( 'forminator_dismiss_notification' ) ); ?>">
|
649 |
|
650 |
+
<p style="color: #72777C; line-height: 22px;"><?php printf( esc_html__( 'Awesome! You\'ve published more than %d modules with Forminator. Hope you are enjoying it so far. We have spent countless hours developing this free plugin for you, and we would really appreciate it if you could drop us a rating on wp.org to help us spread the word and boost our motivation.', 'forminator' ), (int) $milestone ); ?></p>
|
651 |
|
652 |
+
<p>
|
653 |
+
<a type="button" href="#" target="_blank" class="button button-primary button-large"
|
654 |
+
data-prop="forminator_rating_success"><?php esc_html_e( 'Rate Forminator', 'forminator' ); ?></a>
|
655 |
|
656 |
+
<button type="button" class="button button-large" style="margin-left: 11px;"
|
657 |
+
data-prop="<?php echo 10 > $published_modules ? 'forminator_publish_rating_later' : 'forminator_publish_rating_later_dismiss'; ?>"><?php esc_html_e( 'Maybe later', 'forminator' ); ?></button>
|
658 |
|
659 |
+
<a href="#" class="dismiss"
|
660 |
+
style="margin-left: 11px; color: #555; line-height: 16px; font-weight: 500; text-decoration: none;"
|
661 |
+
data-prop="forminator_rating_dismissed"><?php esc_html_e( 'No Thanks', 'forminator' ); ?></a>
|
662 |
+
</p>
|
663 |
|
664 |
+
</div>
|
665 |
|
666 |
<?php
|
667 |
} else {
|
672 |
if ( $install_date && current_time( 'timestamp' ) > strtotime( '+7 days', $install_date ) && ! $publish_later && ! $publish_later_dismiss && ! $days_later_dismiss ) {
|
673 |
?>
|
674 |
|
675 |
+
<div id="forminator-free-usage-notice"
|
676 |
+
class="forminator-rating-notice notice notice-info fui-wordpress-notice"
|
677 |
+
data-nonce="<?php echo esc_attr( wp_create_nonce( 'forminator_dismiss_notification' ) ); ?>">
|
678 |
|
679 |
+
<p style="color: #72777C; line-height: 22px;"><?php esc_html_e( 'Excellent! You\'ve been using Forminator for a while now. Hope you are enjoying it so far. We have spent countless hours developing this free plugin for you, and we would really appreciate it if you could drop us a rating on wp.org to help us spread the word and boost our motivation.', 'forminator' ); ?></p>
|
680 |
|
681 |
+
<p>
|
682 |
+
<a type="button" href="#" target="_blank" class="button button-primary button-large"
|
683 |
+
data-prop="forminator_rating_success"><?php esc_html_e( 'Rate Forminator', 'forminator' ); ?></a>
|
684 |
|
685 |
+
<a href="#" class="dismiss"
|
686 |
+
style="margin-left: 11px; color: #555; line-height: 16px; font-weight: 500; text-decoration: none;"
|
687 |
+
data-prop="forminator_days_rating_later_dismiss"><?php esc_html_e( 'Maybe later', 'forminator' ); ?></a>
|
688 |
+
</p>
|
689 |
|
690 |
+
</div>
|
691 |
|
692 |
<?php
|
693 |
}
|
695 |
|
696 |
?>
|
697 |
|
698 |
+
<script type="text/javascript">
|
699 |
+
jQuery('.forminator-rating-notice a, .forminator-rating-notice button').on('click', function (e) {
|
700 |
+
e.preventDefault();
|
701 |
+
|
702 |
+
var $notice = jQuery(e.currentTarget).closest('.forminator-rating-notice'),
|
703 |
+
prop = jQuery(this).data('prop'),
|
704 |
+
ajaxUrl = '<?php echo esc_url( forminator_ajax_url() ); ?>';
|
705 |
+
|
706 |
+
if ('forminator_rating_success' === prop) {
|
707 |
+
window.open('https://wordpress.org/support/plugin/forminator/reviews/#new-post', '_blank');
|
708 |
+
}
|
709 |
+
|
710 |
+
jQuery.post(
|
711 |
+
ajaxUrl,
|
712 |
+
{
|
713 |
+
action: 'forminator_dismiss_notification',
|
714 |
+
prop: prop,
|
715 |
+
_ajax_nonce: $notice.data('nonce')
|
716 |
+
}
|
717 |
+
).always(function () {
|
718 |
+
$notice.hide();
|
719 |
+
});
|
720 |
+
});
|
721 |
+
</script>
|
722 |
|
723 |
<?php
|
724 |
}
|
726 |
/**
|
727 |
* Show action links on the plugin screen.
|
728 |
*
|
|
|
|
|
729 |
* @param array $links Plugin Action links.
|
730 |
*
|
731 |
* @return mixed
|
732 |
+
* @since 1.13
|
733 |
+
*
|
734 |
*/
|
735 |
public function add_plugin_action_links( $links ) {
|
736 |
// Settings link.
|
746 |
// Upgrade or Renew links.
|
747 |
if ( ! FORMINATOR_PRO || 'upgrade' === $membership ) {
|
748 |
$action_links['upgrade'] = '<a href="' . forminator_get_link( 'plugin', 'forminator_pluginlist_upgrade' ) . '" aria-label="' . esc_attr( __( 'Upgrade to Forminator Pro', 'forminator' ) ) . '" style="color: #8D00B1;" target="_blank">' . esc_html__( 'Upgrade', 'forminator' ) . '</a>';
|
749 |
+
} elseif ( ( 'expired' === $membership || 'free' === $membership ) && ! isset( $_SERVER['WPMUDEV_HOSTED'] ) ) {
|
750 |
$action_links['renew'] = '<a href="' . forminator_get_link( 'plugin', 'forminator_pluginlist_renew' ) . '" aria-label="' . esc_attr( __( 'Upgrade 35% OFF Sale', 'forminator' ) ) . '" style="color: #8D00B1;" target="_blank">' . esc_html__( 'Upgrade 35% OFF Sale', 'forminator' ) . '</a>';
|
751 |
}
|
752 |
|
756 |
/**
|
757 |
* Show row meta on the plugin screen.
|
758 |
*
|
|
|
|
|
759 |
* @param mixed $links Plugin Row Meta.
|
760 |
* @param mixed $file Plugin Base file.
|
761 |
* @param array $plugin_data Plugin data.
|
762 |
*
|
763 |
* @return array
|
764 |
+
* @since 1.13
|
765 |
+
*
|
766 |
*/
|
767 |
public function plugin_row_meta( $links, $file, $plugin_data ) {
|
768 |
if ( FORMINATOR_PLUGIN_BASENAME === $file ) {
|
852 |
}
|
853 |
?>
|
854 |
|
855 |
+
<div id="forminator-addons-update-notice"
|
856 |
+
class="forminator-update-notice notice notice-info fui-wordpress-notice is-dismissible"
|
857 |
+
data-nonce="<?php echo esc_attr( wp_create_nonce( 'forminator_dismiss_notification' ) ); ?>">
|
858 |
+
<p style="color: #72777C; line-height: 22px;">
|
859 |
+
<strong>
|
860 |
<?php echo esc_html__( 'New update available for one or more Add-ons.', 'forminator' ); ?>
|
861 |
+
</strong>
|
862 |
+
</p>
|
863 |
+
<p style="color: #72777C; line-height: 22px;">
|
864 |
<?php esc_html_e( 'A new update is available for one or more of your Forminator Add-ons. Click on the button below to check and update the required Add-on.', 'forminator' ); ?>
|
865 |
+
</p>
|
866 |
+
<p><a type="button"
|
867 |
+
href="<?php echo esc_url( menu_page_url( 'forminator-addons', false ) ); ?>"
|
868 |
+
target="_blank" class="button button-primary button-large"
|
869 |
+
><?php esc_html_e( 'View and Update', 'forminator' ); ?></a>
|
870 |
<?php if ( ! $notice_later ) { ?>
|
871 |
+
<a href="#" class="forminator-notice-dismiss"
|
872 |
+
data-prop="forminator_addons_update_<?php echo esc_attr( $version ); ?>later"
|
873 |
+
style="margin-left: 11px; color: #555; line-height: 16px; font-weight: 500; text-decoration: none;"
|
874 |
+
data-prop-value="<?php echo esc_attr( current_time( 'timestamp' ) ); ?>"><?php esc_html_e( 'Remind me later', 'forminator' ); ?></a>
|
875 |
<?php } ?>
|
876 |
+
</p>
|
877 |
+
<button type="button" class="notice-dismiss forminator-notice-dismiss"
|
878 |
+
data-prop="forminator_addons_update_<?php echo esc_attr( $version ); ?>dismiss">
|
879 |
+
<span class="screen-reader-text"></span>
|
880 |
+
</button>
|
881 |
+
</div>
|
882 |
+
<script type="text/javascript">
|
883 |
+
jQuery('.forminator-update-notice .forminator-notice-dismiss').on('click', function (e) {
|
884 |
+
e.preventDefault();
|
885 |
+
|
886 |
+
var $notice = jQuery(e.currentTarget).closest('.forminator-update-notice'),
|
887 |
+
prop = jQuery(this).data('prop'),
|
888 |
+
value = jQuery(this).data('prop-value'),
|
889 |
+
ajaxUrl = '<?php echo esc_url( forminator_ajax_url() ); ?>';
|
890 |
+
jQuery.post(
|
891 |
+
ajaxUrl,
|
892 |
+
{
|
893 |
+
action: 'forminator_dismiss_notification',
|
894 |
+
prop: prop,
|
895 |
+
value: 'undefined' !== typeof value ? value : '',
|
896 |
+
_ajax_nonce: $notice.data('nonce')
|
897 |
+
}
|
898 |
+
).always(function () {
|
899 |
+
$notice.hide();
|
900 |
+
});
|
901 |
+
});
|
902 |
+
</script>
|
903 |
<?php
|
904 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
905 |
}
|
admin/classes/class-reports-page.php
ADDED
@@ -0,0 +1,460 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
3 |
+
die();
|
4 |
+
}
|
5 |
+
|
6 |
+
/**
|
7 |
+
* Class Forminator_Admin_Report_page
|
8 |
+
*
|
9 |
+
* @since 1.18.0
|
10 |
+
*/
|
11 |
+
class Forminator_Admin_Report_Page {
|
12 |
+
|
13 |
+
/**
|
14 |
+
* Plugin instance
|
15 |
+
*
|
16 |
+
* @since 1.18.0
|
17 |
+
* @access private
|
18 |
+
* @var null
|
19 |
+
*/
|
20 |
+
private static $instance = null;
|
21 |
+
|
22 |
+
/**
|
23 |
+
* Return the plugin instance
|
24 |
+
*
|
25 |
+
* @return Forminator_Admin_Report_page|null
|
26 |
+
*/
|
27 |
+
public static function get_instance() {
|
28 |
+
if ( is_null( self::$instance ) ) {
|
29 |
+
self::$instance = new self();
|
30 |
+
}
|
31 |
+
|
32 |
+
return self::$instance;
|
33 |
+
}
|
34 |
+
|
35 |
+
/**
|
36 |
+
* Get Reports data
|
37 |
+
*
|
38 |
+
* @param $form_id
|
39 |
+
* @param $form_type
|
40 |
+
* @param $start_date
|
41 |
+
* @param $end_date
|
42 |
+
*
|
43 |
+
* @return array
|
44 |
+
*/
|
45 |
+
public function forminator_report_data( $form_id, $form_type, $start_date = '', $end_date = '', $range_type = '' ) {
|
46 |
+
$reports = array();
|
47 |
+
$form_view = Forminator_Form_Views_Model::get_instance();
|
48 |
+
if ( ! empty( $form_id ) ) {
|
49 |
+
$start_date = ! empty( $start_date ) ? $start_date : date_i18n( 'Y-m-01' );
|
50 |
+
$end_date = ! empty( $end_date ) ? $end_date : date_i18n( 'Y-m-t' );
|
51 |
+
$module_slug = $this->get_module_slug( $form_type );
|
52 |
+
$module_time = get_the_date( 'Y-m-d H:i:s', $form_id );
|
53 |
+
$previous_time = ! empty( $range_type ) ? $range_type : 'This Month';
|
54 |
+
$previous_start_date = $this->forminator_previous_time( $previous_time, $start_date, $end_date );
|
55 |
+
$previous_end_date = date( 'Y-m-d', strtotime( '-1 day', strtotime( $start_date ) ) );
|
56 |
+
$reports = array(
|
57 |
+
'start_date' => $start_date,
|
58 |
+
'end_date' => $end_date,
|
59 |
+
'previous_start' => $previous_start_date,
|
60 |
+
'previous_end' => $previous_end_date,
|
61 |
+
'last_entry_time' => forminator_get_latest_entry_time_by_form_id( $form_id ),
|
62 |
+
'average_month' => Forminator_Admin_Report_Page::forminator_montly_average( $module_time ),
|
63 |
+
'previous_entries' => Forminator_Form_Entry_Model::count_report_entries( $form_id, $previous_start_date, $previous_end_date ),
|
64 |
+
'selected_entries' => Forminator_Form_Entry_Model::count_report_entries( $form_id, $start_date, $end_date ),
|
65 |
+
'total_entries' => Forminator_Form_Entry_Model::count_report_entries( $form_id ),
|
66 |
+
'previous_views' => $form_view->count_views( $form_id, $previous_start_date, $previous_end_date ),
|
67 |
+
'selected_views' => $form_view->count_views( $form_id, $start_date, $end_date ),
|
68 |
+
'total_views' => $form_view->count_views( $form_id ),
|
69 |
+
'previous_payment' => 0,
|
70 |
+
'selected_payment' => 0,
|
71 |
+
'stripe_payment' => 0,
|
72 |
+
'paypal_payment' => 0,
|
73 |
+
'integration' => array(),
|
74 |
+
);
|
75 |
+
|
76 |
+
if ( 'quiz' === $module_slug ) {
|
77 |
+
$hasLead = false;
|
78 |
+
$model = Forminator_Base_Form_Model::get_model( $form_id );
|
79 |
+
if ( is_object( $model )
|
80 |
+
&& isset( $model->settings['hasLeads'] )
|
81 |
+
&& $model->settings['hasLeads']
|
82 |
+
) {
|
83 |
+
$hasLead = $model->settings['hasLeads'];
|
84 |
+
$reports['total_leads'] = Forminator_Form_Entry_Model::count_leads( $form_id );
|
85 |
+
$reports['selected_leads'] = Forminator_Form_Entry_Model::count_leads( $form_id, $start_date, $end_date );
|
86 |
+
$reports['previous_leads'] = Forminator_Form_Entry_Model::count_leads( $form_id, $previous_start_date, $previous_end_date );
|
87 |
+
}
|
88 |
+
$reports['has_leads'] = $hasLead;
|
89 |
+
}
|
90 |
+
|
91 |
+
if ( self::has_live_payments( $form_id ) ) {
|
92 |
+
$payment_report = $this->forminator_payment_report_data( $form_id, $start_date, $end_date, $previous_start_date, $previous_end_date );
|
93 |
+
$reports = array_merge( $reports, $payment_report );
|
94 |
+
}
|
95 |
+
|
96 |
+
$connected_addons = forminator_get_addons_instance_connected_with_module( $form_id, $module_slug );
|
97 |
+
if ( ! empty( $connected_addons ) ) {
|
98 |
+
$reports['integration'] = $connected_addons;
|
99 |
+
}
|
100 |
+
forminator_maybe_log( __METHOD__, $start_date, $end_date );
|
101 |
+
}
|
102 |
+
|
103 |
+
return apply_filters( 'forminator_reports_data', $reports );
|
104 |
+
}
|
105 |
+
|
106 |
+
/**
|
107 |
+
* Get montly average
|
108 |
+
*
|
109 |
+
* @param $start_date
|
110 |
+
* @param $month_type
|
111 |
+
*
|
112 |
+
* @return mixed|void
|
113 |
+
*/
|
114 |
+
public static function forminator_montly_average( $start_date ) {
|
115 |
+
$total_month = 0;
|
116 |
+
if ( ! empty( $start_date ) ) {
|
117 |
+
$start_date = strtotime( trim( $start_date ) );
|
118 |
+
$end_date = strtotime( date( 'Y/m/d' ) );
|
119 |
+
$start_year = date( 'Y', $start_date );
|
120 |
+
$end_year = date( 'Y', $end_date );
|
121 |
+
$start_month = date( 'm', $start_date );
|
122 |
+
$end_month = date( 'm', $end_date );
|
123 |
+
$total_month = ( ( $end_year - $start_year ) * 12 ) + ( $end_month - $start_month );
|
124 |
+
}
|
125 |
+
|
126 |
+
return apply_filters( 'forminator_reports_average_month', $total_month );
|
127 |
+
}
|
128 |
+
|
129 |
+
/**
|
130 |
+
* Check payment
|
131 |
+
*
|
132 |
+
* @param $form_id
|
133 |
+
*
|
134 |
+
* @return bool
|
135 |
+
*/
|
136 |
+
public static function has_live_payments( $form_id ) {
|
137 |
+
$model = Forminator_Form_Entry_Model::has_live_payment( $form_id );
|
138 |
+
|
139 |
+
return $model;
|
140 |
+
}
|
141 |
+
|
142 |
+
/**
|
143 |
+
* Get module slug
|
144 |
+
*
|
145 |
+
* @param $form_type
|
146 |
+
*
|
147 |
+
* @return string
|
148 |
+
*/
|
149 |
+
public function get_module_slug( $form_type ) {
|
150 |
+
switch ( $form_type ) {
|
151 |
+
case 'forminator_forms':
|
152 |
+
$slug = 'form';
|
153 |
+
break;
|
154 |
+
case 'forminator_polls':
|
155 |
+
$slug = 'poll';
|
156 |
+
break;
|
157 |
+
case 'forminator_quizzes':
|
158 |
+
$slug = 'quiz';
|
159 |
+
break;
|
160 |
+
default:
|
161 |
+
$slug = '';
|
162 |
+
break;
|
163 |
+
}
|
164 |
+
|
165 |
+
return $slug;
|
166 |
+
}
|
167 |
+
|
168 |
+
/**
|
169 |
+
* Report array
|
170 |
+
*
|
171 |
+
* @param $reports
|
172 |
+
* @param $form_id
|
173 |
+
*
|
174 |
+
* @return array[]
|
175 |
+
*/
|
176 |
+
public function forminator_report_array( $reports, $form_id ) {
|
177 |
+
$report_data = array();
|
178 |
+
if ( ! empty( $reports ) ) {
|
179 |
+
$selected_conversion = 0 < $reports['selected_views']
|
180 |
+
? number_format( ( $reports['selected_entries'] * 100 ) / $reports['selected_views'], 1 )
|
181 |
+
: 0;
|
182 |
+
$previous_conversion = 0 < $reports['previous_views']
|
183 |
+
? number_format( ( $reports['previous_entries'] * 100 ) / $reports['previous_views'], 1 )
|
184 |
+
: 0;
|
185 |
+
$report_data = array(
|
186 |
+
'views' => array(
|
187 |
+
'selected' => intval( $reports['selected_views'] ),
|
188 |
+
'previous' => intval( $reports['previous_views'] ),
|
189 |
+
'increment' => $this->forminator_difference_calculate( $reports['selected_views'], $reports['previous_views'] ),
|
190 |
+
'average' => 0 < $reports['average_month']
|
191 |
+
? round( intval( $reports['total_views'] ) / intval( $reports['average_month'] ) )
|
192 |
+
: '',
|
193 |
+
'difference' => $reports['selected_views'] > $reports['previous_views'] ? 'high' : 'low',
|
194 |
+
),
|
195 |
+
'conversion' => array(
|
196 |
+
'selected' => 0 < $selected_conversion ? floatval( $selected_conversion ) . '%' : 0,
|
197 |
+
'previous' => 0 < $previous_conversion ? floatval( $previous_conversion ) . '%' : 0,
|
198 |
+
'increment' => $this->forminator_difference_calculate( $selected_conversion, $previous_conversion ),
|
199 |
+
'average' => 0 < $reports['average_month']
|
200 |
+
? number_format( floatval( $selected_conversion ) / intval( $reports['average_month'] ), 1 ) . '%'
|
201 |
+
: 0,
|
202 |
+
'difference' => $selected_conversion > $previous_conversion ? 'high' : 'low',
|
203 |
+
),
|
204 |
+
'payment' => array(
|
205 |
+
'selected' => 0 < $reports['selected_payment']
|
206 |
+
? '$' . number_format( $reports['selected_payment'], 2 )
|
207 |
+
: 0,
|
208 |
+
'previous' => 0 < $reports['previous_payment']
|
209 |
+
? '$' . number_format( $reports['previous_payment'], 2 )
|
210 |
+
: 0,
|
211 |
+
'stripe' => 0 < $reports['stripe_payment']
|
212 |
+
? '$' . number_format( $reports['stripe_payment'], 2 )
|
213 |
+
: 0,
|
214 |
+
'paypal' => 0 < $reports['paypal_payment']
|
215 |
+
? '$' . number_format( $reports['paypal_payment'], 2 )
|
216 |
+
: 0,
|
217 |
+
'increment' => 0 < $reports['selected_payment']
|
218 |
+
? round( intval( $reports['previous_payment'] ) ) * 100 / intval( $reports['selected_payment'] ) . '%'
|
219 |
+
: '',
|
220 |
+
'difference' => $reports['selected_payment'] > $reports['previous_payment'] ? 'high' : 'low',
|
221 |
+
),
|
222 |
+
'entries' => array(
|
223 |
+
'selected' => intval( $reports['selected_entries'] ),
|
224 |
+
'previous' => intval( $reports['previous_entries'] ),
|
225 |
+
'increment' => $this->forminator_difference_calculate( $reports['selected_entries'], $reports['previous_entries'] ),
|
226 |
+
'average' => 0 < $reports['average_month']
|
227 |
+
? round( intval( $reports['total_entries'] ) / intval( $reports['average_month'] ) )
|
228 |
+
: '',
|
229 |
+
'difference' => $reports['selected_entries'] > $reports['previous_entries'] ? 'high' : 'low',
|
230 |
+
),
|
231 |
+
);
|
232 |
+
if ( isset( $reports['has_leads'] ) && $reports['has_leads'] ) {
|
233 |
+
$report_data['leads'] = array(
|
234 |
+
'selected' => intval( $reports['selected_leads'] ),
|
235 |
+
'previous' => intval( $reports['previous_leads'] ),
|
236 |
+
'increment' => $this->forminator_difference_calculate( $reports['selected_leads'], $reports['previous_leads'] ),
|
237 |
+
'average' => 0 < $reports['average_month']
|
238 |
+
? round( intval( $reports['total_leads'] ) / intval( $reports['average_month'] ) )
|
239 |
+
: '',
|
240 |
+
'difference' => $reports['selected_leads'] > $reports['previous_leads'] ? 'high' : 'low',
|
241 |
+
);
|
242 |
+
}
|
243 |
+
if ( ! empty( $reports['integration'] ) ) {
|
244 |
+
$integration_data = array();
|
245 |
+
foreach ( $reports['integration'] as $integration ) {
|
246 |
+
$addon_data = $integration->to_array();
|
247 |
+
$slug = $addon_data['slug'];
|
248 |
+
if ( ! empty( $integration->multi_id ) ) {
|
249 |
+
$multi_id = $integration->multi_id;
|
250 |
+
} elseif ( ! empty( $integration->multi_global_id ) ) {
|
251 |
+
$multi_id = $integration->multi_global_id;
|
252 |
+
} else {
|
253 |
+
$multi_id = '';
|
254 |
+
}
|
255 |
+
if ( ! empty( $multi_id ) ) {
|
256 |
+
$meta_key = 'forminator_addon_' . $slug . '_status-' . $multi_id;
|
257 |
+
$previous_send = Forminator_Form_Entry_Model::addons_data( $form_id, $meta_key, $reports['previous_start'], $reports['previous_end'] );
|
258 |
+
$selected_sent = Forminator_Form_Entry_Model::addons_data( $form_id, $meta_key, $reports['start_date'], $reports['end_date'] );
|
259 |
+
|
260 |
+
$integration_data[ $slug ] = array(
|
261 |
+
'title' => $addon_data['title'],
|
262 |
+
'short_title' => $addon_data['short_title'],
|
263 |
+
'image' => $addon_data['image'],
|
264 |
+
'selected' => $selected_sent,
|
265 |
+
'previous' => $previous_send,
|
266 |
+
'increment' => $this->forminator_difference_calculate( $selected_sent, $previous_send ),
|
267 |
+
'difference' => $selected_sent >= $previous_send ? 'high' : 'low',
|
268 |
+
);
|
269 |
+
}
|
270 |
+
}
|
271 |
+
$report_data['integration'] = $integration_data;
|
272 |
+
}
|
273 |
+
}
|
274 |
+
|
275 |
+
return $report_data;
|
276 |
+
}
|
277 |
+
|
278 |
+
/**
|
279 |
+
* Get payment report data
|
280 |
+
*
|
281 |
+
* @param $form_id
|
282 |
+
* @param $start_date
|
283 |
+
* @param $end_date
|
284 |
+
* @param $previous_start
|
285 |
+
* @param $previous_end
|
286 |
+
*
|
287 |
+
* @return array
|
288 |
+
*/
|
289 |
+
public function forminator_payment_report_data( $form_id, $start_date, $end_date, $previous_start, $previous_end ) {
|
290 |
+
$payments = array(
|
291 |
+
'selected_payment' => 0,
|
292 |
+
'previous_payment' => 0,
|
293 |
+
'stripe_payment' => 0,
|
294 |
+
'paypal_payment' => 0
|
295 |
+
);
|
296 |
+
$end_date = $end_date . ' 23:59:00';
|
297 |
+
$payment_data = Forminator_Form_Entry_Model::payment_amount( $form_id, $previous_start, $end_date );
|
298 |
+
if ( ! empty( $payment_data ) ) {
|
299 |
+
foreach ( $payment_data as $data ) {
|
300 |
+
$meta_value = maybe_unserialize( $data->meta_value );
|
301 |
+
if ( $data->date_created >= $start_date && $data->date_created <= $end_date ) {
|
302 |
+
$payments['selected_payment'] += $meta_value['amount'];
|
303 |
+
if ( 'stripe-1' === $data->meta_key ) {
|
304 |
+
$payments['stripe_payment'] += $meta_value['amount'];
|
305 |
+
}
|
306 |
+
if ( 'paypal-1' === $data->meta_key ) {
|
307 |
+
$payments['paypal_payment'] += $meta_value['amount'];
|
308 |
+
}
|
309 |
+
}
|
310 |
+
if ( $data->date_created >= $previous_start && $data->date_created <= $previous_end ) {
|
311 |
+
$payments['previous_payment'] += $meta_value['amount'];
|
312 |
+
}
|
313 |
+
}
|
314 |
+
}
|
315 |
+
|
316 |
+
return $payments;
|
317 |
+
}
|
318 |
+
|
319 |
+
/**
|
320 |
+
* Chart data
|
321 |
+
*
|
322 |
+
* @param $form_id
|
323 |
+
* @param $start_date
|
324 |
+
* @param $end_date
|
325 |
+
*
|
326 |
+
* @return array
|
327 |
+
*/
|
328 |
+
public function forminator_report_chart_data( $form_id, $start_date = '', $end_date = '' ) {
|
329 |
+
$days_array = array();
|
330 |
+
$default_array = array();
|
331 |
+
|
332 |
+
if ( empty( $start_date ) ) {
|
333 |
+
$start_date = date( 'Y-m-01' );
|
334 |
+
}
|
335 |
+
if ( empty( $end_date ) ) {
|
336 |
+
$end_date = date( 'Y-m-t' );
|
337 |
+
}
|
338 |
+
$sdate = strtotime( $start_date );
|
339 |
+
$edate = strtotime( $end_date );
|
340 |
+
|
341 |
+
while ( $sdate <= $edate ) {
|
342 |
+
$default_date = date( 'Y-m-d', $sdate );
|
343 |
+
$days_array[] = date( 'M j, Y', $sdate );
|
344 |
+
$default_array[ $default_date ] = 0;
|
345 |
+
$sdate = strtotime( '+1 day', $sdate );
|
346 |
+
}
|
347 |
+
|
348 |
+
$report_entries = Forminator_Form_Entry_Model::count_report_entries( $form_id, $start_date, $end_date );
|
349 |
+
if ( 0 === $report_entries ) {
|
350 |
+
$submissions_data = $default_array;
|
351 |
+
} else {
|
352 |
+
$submissions = Forminator_Form_Entry_Model::get_form_latest_entries_count_grouped_by_day( $form_id, $start_date, $end_date );
|
353 |
+
$submissions_array = wp_list_pluck( $submissions, 'entries_amount', 'date_created' );
|
354 |
+
$submissions_data = array_merge( $default_array, array_intersect_key( $submissions_array, $default_array ) );
|
355 |
+
}
|
356 |
+
|
357 |
+
$canvas_spacing = max( $submissions_data ) + 8;
|
358 |
+
|
359 |
+
return array(
|
360 |
+
'monthDays' => $days_array,
|
361 |
+
'submissions' => $submissions_data,
|
362 |
+
'canvas_spacing' => intval( $canvas_spacing )
|
363 |
+
);
|
364 |
+
}
|
365 |
+
|
366 |
+
/**
|
367 |
+
* Previous Time
|
368 |
+
*
|
369 |
+
* @param $time
|
370 |
+
* @param $start_date
|
371 |
+
*
|
372 |
+
* @return false|string
|
373 |
+
*/
|
374 |
+
public function forminator_previous_time( $time, $start_date, $end_date ) {
|
375 |
+
switch ( $time ) {
|
376 |
+
case 'Today':
|
377 |
+
$previous_start_date = date( 'Y-m-d', strtotime( '-1 day', strtotime( $start_date ) ) );;
|
378 |
+
break;
|
379 |
+
|
380 |
+
case 'Last 7 Days':
|
381 |
+
$previous_start_date = date( 'Y-m-d', strtotime( '-7 day', strtotime( $start_date ) ) );
|
382 |
+
break;
|
383 |
+
|
384 |
+
case 'This Month':
|
385 |
+
$previous_start_date = date( 'Y-m-d', strtotime( 'first day of last month', strtotime( $start_date ) ) );
|
386 |
+
break;
|
387 |
+
|
388 |
+
case 'Last 30 Days':
|
389 |
+
$previous_start_date = date( 'Y-m-d', strtotime( '-30 day', strtotime( $start_date ) ) );
|
390 |
+
break;
|
391 |
+
|
392 |
+
case 'This Year':
|
393 |
+
$previous_start_date = date( 'Y-m-d', strtotime( 'last year January 1st', strtotime( $start_date ) ) );
|
394 |
+
break;
|
395 |
+
case 'Custom':
|
396 |
+
$datediff = strtotime( $end_date ) - strtotime( $start_date );
|
397 |
+
$total_days = round( $datediff / ( 60 * 60 * 24 ) ) + 1;
|
398 |
+
$previous_days = '-' . $total_days . 'day';
|
399 |
+
$previous_start_date = date( 'Y-m-d', strtotime( $previous_days, strtotime( $start_date ) ) );
|
400 |
+
break;
|
401 |
+
|
402 |
+
default:
|
403 |
+
$previous_start_date = '';
|
404 |
+
}
|
405 |
+
|
406 |
+
return $previous_start_date;
|
407 |
+
}
|
408 |
+
|
409 |
+
/**
|
410 |
+
* Difference_calculate
|
411 |
+
*
|
412 |
+
* @param $selected
|
413 |
+
* @param $previous
|
414 |
+
*
|
415 |
+
* @return float|int
|
416 |
+
*/
|
417 |
+
public function forminator_difference_calculate( $selected, $previous ) {
|
418 |
+
$percent = 0;
|
419 |
+
if ( 0 < $previous && 0 < $selected ) {
|
420 |
+
if ( $previous < $selected ) {
|
421 |
+
// Increase percent
|
422 |
+
$percent_from = $selected - $previous;
|
423 |
+
} else {
|
424 |
+
// Decrease percent
|
425 |
+
$percent_from = $previous - $selected;
|
426 |
+
}
|
427 |
+
$percent_value = ( $percent_from * 100 ) / $previous;
|
428 |
+
$percent = 0 < $percent_value ? round( $percent_from / $previous * 100 ) . '%' : 0;
|
429 |
+
}
|
430 |
+
|
431 |
+
return $percent;
|
432 |
+
}
|
433 |
+
|
434 |
+
/**
|
435 |
+
* Get app link
|
436 |
+
*
|
437 |
+
* @param $module_id
|
438 |
+
* @param $module_type
|
439 |
+
*
|
440 |
+
* @return string|void
|
441 |
+
*/
|
442 |
+
public function get_app_link_module_id( $module_id, $module_type ) {
|
443 |
+
switch ( $module_type ) {
|
444 |
+
case 'forminator_quizzes':
|
445 |
+
$quiz_model = Forminator_Base_Form_Model::get_model( $module_id );
|
446 |
+
$quiz_type = isset( $quiz_model->quiz_type ) ? $quiz_model->quiz_type : '';
|
447 |
+
$wizard_slug = 'forminator-' . $quiz_type . '-wizard';
|
448 |
+
break;
|
449 |
+
case 'forminator_polls':
|
450 |
+
$wizard_slug = 'forminator-poll-wizard';
|
451 |
+
break;
|
452 |
+
default:
|
453 |
+
$wizard_slug = 'forminator-cform-wizard';
|
454 |
+
break;
|
455 |
+
}
|
456 |
+
$wizard_link = admin_url( 'admin.php?page=' . $wizard_slug . '&id=' . $module_id );
|
457 |
+
|
458 |
+
return $wizard_link;
|
459 |
+
}
|
460 |
+
}
|
admin/locale.php
CHANGED
@@ -1,12 +1,12 @@
|
|
1 |
<?php
|
2 |
/* THIS IS A GENERATED FILE. DO NOT EDIT DIRECTLY. */
|
3 |
$forminator_admin_locale = array(
|
4 |
-
"Appearance" => array( null, __("Appearance", "forminator" ), ), // src/form/components/appearance.js:
|
5 |
-
"Apply Preset" => array( null, __("Apply Preset", "forminator" ), ), // src/form/components/appearance.js:
|
6 |
-
"Fields" => array( null, __("Fields", "forminator" ), ), // src/form/components/appearance.js:
|
7 |
-
"Behavior" => array( null, __("Behavior", "forminator" ), ), // src/form/components/appearance.js:
|
8 |
-
"User Registration" => array( null, __("User Registration", "forminator" ), ), // src/form/components/appearance.js:
|
9 |
-
"User Login" => array( null, __("User Login", "forminator" ), ), // src/form/components/appearance.js:
|
10 |
"Colors" => array( null, __("Colors", "forminator" ), ), // src/form/components/appearance/colors.js:212
|
11 |
"Adjust the default color combinations to match your theme styling." => array( null, __("Adjust the default color combinations to match your theme styling.", "forminator" ), ), // src/form/components/appearance/colors.js:213
|
12 |
"Use Default Colors" => array( null, __("Use Default Colors", "forminator" ), ), // src/form/components/appearance/colors.js:227
|
@@ -120,6 +120,12 @@ $forminator_admin_locale = array(
|
|
120 |
"Text" => array( null, __("Text", "forminator" ), ), // src/form/components/appearance/design/basic.js:22
|
121 |
"Button" => array( null, __("Button", "forminator" ), ), // src/form/components/appearance/design/basic.js:25
|
122 |
"You have opted for no stylesheet to be enqueued. The form will inherit styles from your theme's CSS." => array( null, __("You have opted for no stylesheet to be enqueued. The form will inherit styles from your theme's CSS.", "forminator" ), ), // src/form/components/appearance/design/none.js:28
|
|
|
|
|
|
|
|
|
|
|
|
|
123 |
"Fonts" => array( null, __("Fonts", "forminator" ), ), // src/form/components/appearance/fonts.js:147
|
124 |
"By default this form will inherit the fonts your theme uses. You can overwrite these fonts with custom ones from Google Fonts." => array( null, __("By default this form will inherit the fonts your theme uses. You can overwrite these fonts with custom ones from Google Fonts.", "forminator" ), ), // src/form/components/appearance/fonts.js:148
|
125 |
"Use Theme Fonts" => array( null, __("Use Theme Fonts", "forminator" ), ), // src/form/components/appearance/fonts.js:163
|
@@ -149,9 +155,6 @@ $forminator_admin_locale = array(
|
|
149 |
"Choose how much spacing you want between each form field." => array( null, __("Choose how much spacing you want between each form field.", "forminator" ), ), // src/form/components/appearance/form-container.js:65
|
150 |
"Comfortable" => array( null, __("Comfortable", "forminator" ), ), // src/form/components/appearance/form-container.js:69
|
151 |
"Compact" => array( null, __("Compact", "forminator" ), ), // src/form/components/appearance/form-container.js:72
|
152 |
-
"Radius" => array( null, __("Radius", "forminator" ), ), // src/form/components/appearance/form-container/border-custom.js:22
|
153 |
-
"in px" => array( null, __("in px", "forminator" ), ), // src/form/components/appearance/form-container/border-custom.js:23
|
154 |
-
"Thickness" => array( null, __("Thickness", "forminator" ), ), // src/form/components/appearance/form-container/border-custom.js:32
|
155 |
"Style" => array( null, __("Style", "forminator" ), ), // src/form/components/appearance/form-container/border-custom.js:43
|
156 |
"Solid" => array( null, __("Solid", "forminator" ), ), // src/form/components/appearance/form-container/border-custom.js:46
|
157 |
"Dashed" => array( null, __("Dashed", "forminator" ), ), // src/form/components/appearance/form-container/border-custom.js:49
|
@@ -321,7 +324,7 @@ To continue where you left off, click the link below or copy the link to your we
|
|
321 |
"Enter Placeholder" => array( null, __("Enter Placeholder", "forminator" ), ), // src/form/components/fields/address.js:108
|
322 |
"Description (optional)" => array( null, __("Description (optional)", "forminator" ), ), // src/form/components/fields/address.js:123
|
323 |
"Enter description" => array( null, __("Enter description", "forminator" ), ), // src/form/components/fields/address.js:124
|
324 |
-
"At least one field must be enabled" => array( null, __("At least one field must be enabled", "forminator" ), ), // src/form/components/fields/address.js:
|
325 |
"Field Type" => array( null, __("Field Type", "forminator" ), ), // src/form/components/fields/calculation.js:69
|
326 |
"By default, the calculation field is read-only. You can also hide the field if you don't want to show the calculated result on the form." => array( null, __("By default, the calculation field is read-only. You can also hide the field if you don't want to show the calculated result on the form.", "forminator" ), ), // src/form/components/fields/calculation.js:77
|
327 |
"Read-only" => array( null, __("Read-only", "forminator" ), ), // src/form/components/fields/calculation.js:88
|
@@ -483,83 +486,84 @@ To continue where you left off, click the link below or copy the link to your we
|
|
483 |
"Validate Field" => array( null, __("Validate Field", "forminator" ), ), // src/form/components/fields/password.js:192
|
484 |
"Validation message" => array( null, __("Validation message", "forminator" ), ), // src/form/components/fields/password.js:198
|
485 |
"Enter validation message" => array( null, __("Enter validation message", "forminator" ), ), // src/form/components/fields/password.js:200
|
486 |
-
"In %s" => array( null, __("In %s", "forminator" ), ), // src/form/components/fields/paypal.js:
|
487 |
-
"You have not connected your PayPal account with Forminator. Connect your PayPal account {{link}}here{{/link}} and then come back to configure this field." => array( null, __("You have not connected your PayPal account with Forminator. Connect your PayPal account {{link}}here{{/link}} and then come back to configure this field.", "forminator" ), ), // src/form/components/fields/paypal.js:
|
488 |
-
"Mode of payment" => array( null, __("Mode of payment", "forminator" ), ), // src/form/components/fields/paypal.js:
|
489 |
-
"We recommend using sandbox mode to ensure the payments are working as expected and when you are ready to start collecting live payments, switch to the {{strong}}Live{{/strong}} payments mode." => array( null, __("We recommend using sandbox mode to ensure the payments are working as expected and when you are ready to start collecting live payments, switch to the {{strong}}Live{{/strong}} payments mode.", "forminator" ), ), // src/form/components/fields/paypal.js:
|
490 |
-
"Sandbox" => array( null, __("Sandbox", "forminator" ), ), // src/form/components/fields/paypal.js:
|
491 |
-
"Live" => array( null, __("Live", "forminator" ), ), // src/form/components/fields/paypal.js:
|
492 |
-
"Charge currency" => array( null, __("Charge currency", "forminator" ), ), // src/form/components/fields/paypal.js:
|
493 |
-
"It's recommended to charge in your customers' currency to drive more sales and avoid foreign exchange fee to your customers." => array( null, __("It's recommended to charge in your customers' currency to drive more sales and avoid foreign exchange fee to your customers.", "forminator" ), ), // src/form/components/fields/paypal.js:
|
494 |
-
"Payment amount" => array( null, __("Payment amount", "forminator" ), ), // src/form/components/fields/paypal.js:
|
495 |
-
"Fixed" => array( null, __("Fixed", "forminator" ), ), // src/form/components/fields/paypal.js:
|
496 |
-
"Fixed amount" => array( null, __("Fixed amount", "forminator" ), ), // src/form/components/fields/paypal.js:
|
497 |
-
"E.g. 20.00" => array( null, __("E.g. 20.00", "forminator" ), ), // src/form/components/fields/paypal.js:
|
498 |
-
"Enter an amount or choose a form field." => array( null, __("Enter an amount or choose a form field.", "forminator" ), ), // src/form/components/fields/paypal.js:
|
499 |
-
"Variable" => array( null, __("Variable", "forminator" ), ), // src/form/components/fields/paypal.js:
|
500 |
-
"Variable amount" => array( null, __("Variable amount", "forminator" ), ), // src/form/components/fields/paypal.js:
|
501 |
-
"Select field" => array( null, __("Select field", "forminator" ), ), // src/form/components/fields/paypal.js:
|
502 |
-
"A currency field can be used to take user-defined payments such as donations and calculation field can be used to charge a calculated value based on a formula." => array( null, __("A currency field can be used to take user-defined payments such as donations and calculation field can be used to charge a calculated value based on a formula.", "forminator" ), ), // src/form/components/fields/paypal.js:
|
503 |
-
"Choose a label for your PayPal button. Note that PayPal checkout doesn't allow a custom label for the PayPal button. You can only choose from the pre-defined labels." => array( null, __("Choose a label for your PayPal button. Note that PayPal checkout doesn't allow a custom label for the PayPal button. You can only choose from the pre-defined labels.", "forminator" ), ), // src/form/components/fields/paypal.js:
|
504 |
-
"PayPal recommends using the Gold button since it is widely known as their brand color. However, if that does not suit your theme, you can choose a different color." => array( null, __("PayPal recommends using the Gold button since it is widely known as their brand color. However, if that does not suit your theme, you can choose a different color.", "forminator" ), ), // src/form/components/fields/paypal.js:
|
505 |
-
"Gold" => array( null, __("Gold", "forminator" ), ), // src/form/components/fields/paypal.js:
|
506 |
-
"Blue" => array( null, __("Blue", "forminator" ), ), // src/form/components/fields/paypal.js:
|
507 |
-
"Silver" => array( null, __("Silver", "forminator" ), ), // src/form/components/fields/paypal.js:
|
508 |
-
"White" => array( null, __("White", "forminator" ), ), // src/form/components/fields/paypal.js:
|
509 |
-
"Black" => array( null, __("Black", "forminator" ), ), // src/form/components/fields/paypal.js:
|
510 |
-
"Width" => array( null, __("Width", "forminator" ), ), // src/form/components/fields/paypal.js:
|
511 |
-
"E.g. 250" => array( null, __("E.g. 250", "forminator" ), ), // src/form/components/fields/paypal.js:
|
512 |
-
"px" => array( null, __("px", "forminator" ), ), // src/form/components/fields/paypal.js:
|
513 |
-
"Choose the width of PayPal Smart Buttons. It can be anywhere between 150px to 750px. Leave this empty if you want the buttons to take the full width of the form up to the 750px limit." => array( null, __("Choose the width of PayPal Smart Buttons. It can be anywhere between 150px to 750px. Leave this empty if you want the buttons to take the full width of the form up to the 750px limit.", "forminator" ), ), // src/form/components/fields/paypal.js:
|
514 |
-
"Height" => array( null, __("Height", "forminator" ), ), // src/form/components/fields/paypal.js:
|
515 |
-
"Choose the height of PayPal Smart Buttons. It can be anywhere between 25px to 55px" => array( null, __("Choose the height of PayPal Smart Buttons. It can be anywhere between 25px to 55px", "forminator" ), ), // src/form/components/fields/paypal.js:
|
516 |
-
"Shape" => array( null, __("Shape", "forminator" ), ), // src/form/components/fields/paypal.js:
|
517 |
-
"Choose your preferred shape from your PayPal Smart Buttons." => array( null, __("Choose your preferred shape from your PayPal Smart Buttons.", "forminator" ), ), // src/form/components/fields/paypal.js:
|
518 |
-
"Rectangular" => array( null, __("Rectangular", "forminator" ), ), // src/form/components/fields/paypal.js:
|
519 |
-
"Pill" => array( null, __("Pill", "forminator" ), ), // src/form/components/fields/paypal.js:
|
520 |
-
"We recommend the vertical layout as it allows additional payment methods such as Credit Cards. You can read about the layout options {{link}}here{{/link}}." => array( null, __("We recommend the vertical layout as it allows additional payment methods such as Credit Cards. You can read about the layout options {{link}}here{{/link}}.", "forminator" ), ), // src/form/components/fields/paypal.js:
|
521 |
-
"Tagline" => array( null, __("Tagline", "forminator" ), ), // src/form/components/fields/paypal.js:
|
522 |
-
"Choose whether to show the default PayPal tagline {{strong}}\"The safer, easier way to pay\"{{/strong}} below your PayPal button." => array( null, __("Choose whether to show the default PayPal tagline {{strong}}\"The safer, easier way to pay\"{{/strong}} below your PayPal button.", "forminator" ), ), // src/form/components/fields/paypal.js:
|
523 |
-
"Disable Funding Sources" => array( null, __("Disable Funding Sources", "forminator" ), ), // src/form/components/fields/paypal.js:
|
524 |
-
"PayPal automatically adds additional funding sources to the PayPal checkout for visitors from supported countries. However, you can choose to disable funding sources which shouldn't be displayed to visitors." => array( null, __("PayPal automatically adds additional funding sources to the PayPal checkout for visitors from supported countries. However, you can choose to disable funding sources which shouldn't be displayed to visitors.", "forminator" ), ), // src/form/components/fields/paypal.js:
|
525 |
-
"Credit or debit cards" => array( null, __("Credit or debit cards", "forminator" ), ), // src/form/components/fields/paypal.js:
|
526 |
-
"PayPal Credit" => array( null, __("PayPal Credit", "forminator" ), ), // src/form/components/fields/paypal.js:
|
527 |
-
"Bancontact" => array( null, __("Bancontact", "forminator" ), ), // src/form/components/fields/paypal.js:
|
528 |
-
"BLIK" => array( null, __("BLIK", "forminator" ), ), // src/form/components/fields/paypal.js:
|
529 |
-
"eps" => array( null, __("eps", "forminator" ), ), // src/form/components/fields/paypal.js:
|
530 |
-
"giropay" => array( null, __("giropay", "forminator" ), ), // src/form/components/fields/paypal.js:
|
531 |
-
"iDEAL" => array( null, __("iDEAL", "forminator" ), ), // src/form/components/fields/paypal.js:
|
532 |
-
"Mercado Pago" => array( null, __("Mercado Pago", "forminator" ), ), // src/form/components/fields/paypal.js:
|
533 |
-
"MyBank" => array( null, __("MyBank", "forminator" ), ), // src/form/components/fields/paypal.js:
|
534 |
-
"Przelewy24" => array( null, __("Przelewy24", "forminator" ), ), // src/form/components/fields/paypal.js:
|
535 |
-
"SEPA-Lastschrift" => array( null, __("SEPA-Lastschrift", "forminator" ), ), // src/form/components/fields/paypal.js:
|
536 |
-
"Sofort" => array( null, __("Sofort", "forminator" ), ), // src/form/components/fields/paypal.js:
|
537 |
-
"Venmo" => array( null, __("Venmo", "forminator" ), ), // src/form/components/fields/paypal.js:
|
538 |
-
"Disable Card Options" => array( null, __("Disable Card Options", "forminator" ), ), // src/form/components/fields/paypal.js:
|
539 |
-
"PayPal automatically decides the card options that appear in the Smart Payment Buttons based visitors geographic location. However you can permanently disable some cards. Choose the cards which should never display to your visitors." => array( null, __("PayPal automatically decides the card options that appear in the Smart Payment Buttons based visitors geographic location. However you can permanently disable some cards. Choose the cards which should never display to your visitors.", "forminator" ), ), // src/form/components/fields/paypal.js:
|
540 |
-
"Visa" => array( null, __("Visa", "forminator" ), ), // src/form/components/fields/paypal.js:
|
541 |
-
"Mastercard" => array( null, __("Mastercard", "forminator" ), ), // src/form/components/fields/paypal.js:
|
542 |
-
"American Express" => array( null, __("American Express", "forminator" ), ), // src/form/components/fields/paypal.js:
|
543 |
-
"Discover" => array( null, __("Discover", "forminator" ), ), // src/form/components/fields/paypal.js:
|
544 |
-
"JCB" => array( null, __("JCB", "forminator" ), ), // src/form/components/fields/paypal.js:
|
545 |
-
"Elo" => array( null, __("Elo", "forminator" ), ), // src/form/components/fields/paypal.js:
|
546 |
-
"Hiper" => array( null, __("Hiper", "forminator" ), ), // src/form/components/fields/paypal.js:
|
547 |
-
"Pre-fill Billing Details" => array( null, __("Pre-fill Billing Details", "forminator" ), ), // src/form/components/fields/paypal.js:
|
548 |
-
"Pre-fill the payer's billing info collected on your form on the Debit or Credit Card checkout, so the payer doesn't have to enter those details again." => array( null, __("Pre-fill the payer's billing info collected on your form on the Debit or Credit Card checkout, so the payer doesn't have to enter those details again.", "forminator" ), ), // src/form/components/fields/paypal.js:
|
549 |
-
"Enable" => array( null, __("Enable", "forminator" ), ), // src/form/components/fields/paypal.js:
|
550 |
-
"Customer name (optional)" => array( null, __("Customer name (optional)", "forminator" ), ), // src/form/components/fields/paypal.js:
|
551 |
-
"Select a name field" => array( null, __("Select a name field", "forminator" ), ), // src/form/components/fields/paypal.js:
|
552 |
-
"Customer email address (optional)" => array( null, __("Customer email address (optional)", "forminator" ), ), // src/form/components/fields/paypal.js:
|
553 |
-
"Select an email field" => array( null, __("Select an email field", "forminator" ), ), // src/form/components/fields/paypal.js:
|
554 |
-
"Billing address (optional)" => array( null, __("Billing address (optional)", "forminator" ), ), // src/form/components/fields/paypal.js:
|
555 |
-
"Select an address field" => array( null, __("Select an address field", "forminator" ), ), // src/form/components/fields/paypal.js:
|
556 |
-
"
|
557 |
-
"
|
558 |
-
"
|
559 |
-
"
|
560 |
-
"
|
561 |
-
"
|
562 |
-
"
|
|
|
563 |
"Make sure the users fill this field as per the selected validation and warn them when they haven't" => array( null, __("Make sure the users fill this field as per the selected validation and warn them when they haven't", "forminator" ), ), // src/form/components/fields/phone.js:43
|
564 |
"National" => array( null, __("National", "forminator" ), ), // src/form/components/fields/phone.js:62
|
565 |
"Select the country to validate phone number for" => array( null, __("Select the country to validate phone number for", "forminator" ), ), // src/form/components/fields/phone.js:69
|
@@ -596,11 +600,11 @@ To continue where you left off, click the link below or copy the link to your we
|
|
596 |
"Add a border to this section." => array( null, __("Add a border to this section.", "forminator" ), ), // src/form/components/fields/section.js:55
|
597 |
"Signature Filetype" => array( null, __("Signature Filetype", "forminator" ), ), // src/form/components/fields/signature.js:30
|
598 |
"Choose the filetype to save your users' signature in." => array( null, __("Choose the filetype to save your users' signature in.", "forminator" ), ), // src/form/components/fields/signature.js:32
|
599 |
-
"PNG" => array( null, __("PNG", "forminator" ), ), // src/form/components/fields/signature.js:
|
600 |
-
"JPG" => array( null, __("JPG", "forminator" ), ), // src/form/components/fields/signature.js:
|
601 |
-
"Choose the height of your signature field. The default value is 180px." => array( null, __("Choose the height of your signature field. The default value is 180px.", "forminator" ), ), // src/form/components/fields/signature.js:
|
602 |
-
"Stroke Thickness" => array( null, __("Stroke Thickness", "forminator" ), ), // src/form/components/fields/signature.js:
|
603 |
-
"Choose the thickness in pixels for signature strokes. The default value is 2px." => array( null, __("Choose the thickness in pixels for signature strokes. The default value is 2px.", "forminator" ), ), // src/form/components/fields/signature.js:
|
604 |
"Note: Pass comma-separated values for this query parameter to pre-populate multiple options." => array( null, __("Note: Pass comma-separated values for this query parameter to pre-populate multiple options.", "forminator" ), ), // src/form/components/fields/singlevalue.js:32
|
605 |
"Search" => array( null, __("Search", "forminator" ), ), // src/form/components/fields/singlevalue.js:112
|
606 |
"Display the search box in a dropdown" => array( null, __("Display the search box in a dropdown", "forminator" ), ), // src/form/components/fields/singlevalue.js:120
|
@@ -893,26 +897,27 @@ To continue where you left off, click the link below or copy the link to your we
|
|
893 |
"Please fill required fields" => array( null, __("Please fill required fields", "forminator" ), ), // src/form/components/modals/settings.js:149
|
894 |
"Calculation values are required!" => array( null, __("Calculation values are required!", "forminator" ), ), // src/form/components/modals/settings.js:167
|
895 |
"Option labels are required!" => array( null, __("Option labels are required!", "forminator" ), ), // src/form/components/modals/settings.js:176
|
896 |
-
"Please add a placeholder or select a default option." => array( null, __("Please add a placeholder or select a default option.", "forminator" ), ), // src/form/components/modals/settings.js:
|
897 |
-
"
|
898 |
-
"
|
899 |
-
"
|
900 |
-
"
|
901 |
-
"
|
902 |
-
"
|
903 |
-
"Please
|
904 |
-
"Please
|
905 |
-
"
|
906 |
-
"
|
907 |
-
"
|
908 |
-
"Please
|
909 |
-
"Please
|
910 |
-
"Please fix the
|
911 |
-
"Please fix the
|
912 |
-
"
|
913 |
-
"
|
914 |
-
"
|
915 |
-
"
|
|
|
916 |
"Shortcode has been copied successfully." => array( null, __("Shortcode has been copied successfully.", "forminator" ), ), // src/form/components/modals/shortcode.js:22
|
917 |
"Ready to go!" => array( null, __("Ready to go!", "forminator" ), ), // src/form/components/modals/shortcode.js:46
|
918 |
"Your form is now ready to be embedded into a page or template of your choice. Simply copy and paste the shortcode below to display it!" => array( null, __("Your form is now ready to be embedded into a page or template of your choice. Simply copy and paste the shortcode below to display it!", "forminator" ), ), // src/form/components/modals/shortcode.js:50
|
@@ -1056,36 +1061,36 @@ To continue where you left off, click the link below or copy the link to your we
|
|
1056 |
"Font Size" => array( null, __("Font Size", "forminator" ), ), // src/form/components/settings/fonts.js:108
|
1057 |
"Font Weight" => array( null, __("Font Weight", "forminator" ), ), // src/form/components/settings/fonts.js:116
|
1058 |
"Select font weight" => array( null, __("Select font weight", "forminator" ), ), // src/form/components/settings/fonts.js:117
|
1059 |
-
"Start & End date" => array( null, __("Start & End date", "forminator" ), ), // src/form/components/settings/limits.js:
|
1060 |
-
"Choose a start and end date limit for the calendar to restrict the date selection between a specific date range. Note that we will use the timezone set in your {{a}}WordPress Settings{{/a}}." => array( null, __("Choose a start and end date limit for the calendar to restrict the date selection between a specific date range. Note that we will use the timezone set in your {{a}}WordPress Settings{{/a}}.", "forminator" ), ), // src/form/components/settings/limits.js:
|
1061 |
-
"Start Date" => array( null, __("Start Date", "forminator" ), ), // src/form/components/settings/limits.js:
|
1062 |
-
"No limit" => array( null, __("No limit", "forminator" ), ), // src/form/components/settings/limits.js:
|
1063 |
-
"Specific date" => array( null, __("Specific date", "forminator" ), ), // src/form/components/settings/limits.js:
|
1064 |
-
"Date fields" => array( null, __("Date fields", "forminator" ), ), // src/form/components/settings/limits.js:
|
1065 |
-
"Offset (optional)" => array( null, __("Offset (optional)", "forminator" ), ), // src/form/components/settings/limits.js:
|
1066 |
-
"+" => array( null, __("+", "forminator" ), ), // src/form/components/settings/limits.js:
|
1067 |
-
"-" => array( null, __("-", "forminator" ), ), // src/form/components/settings/limits.js:
|
1068 |
-
"days" => array( null, __("days", "forminator" ), ), // src/form/components/settings/limits.js:
|
1069 |
-
"weeks" => array( null, __("weeks", "forminator" ), ), // src/form/components/settings/limits.js:
|
1070 |
-
"months" => array( null, __("months", "forminator" ), ), // src/form/components/settings/limits.js:
|
1071 |
-
"years" => array( null, __("years", "forminator" ), ), // src/form/components/settings/limits.js:
|
1072 |
-
"End Date" => array( null, __("End Date", "forminator" ), ), // src/form/components/settings/limits.js:
|
1073 |
-
"Days of the week" => array( null, __("Days of the week", "forminator" ), ), // src/form/components/settings/limits.js:
|
1074 |
-
"Choose which days of the week should be available on the calendar." => array( null, __("Choose which days of the week should be available on the calendar.", "forminator" ), ), // src/form/components/settings/limits.js:
|
1075 |
-
"All days" => array( null, __("All days", "forminator" ), ), // src/form/components/settings/limits.js:
|
1076 |
-
"Selected days" => array( null, __("Selected days", "forminator" ), ), // src/form/components/settings/limits.js:
|
1077 |
-
"Sunday" => array( null, __("Sunday", "forminator" ), ), // src/form/components/settings/limits.js:
|
1078 |
-
"Wednesday" => array( null, __("Wednesday", "forminator" ), ), // src/form/components/settings/limits.js:
|
1079 |
-
"Saturday" => array( null, __("Saturday", "forminator" ), ), // src/form/components/settings/limits.js:
|
1080 |
-
"Monday" => array( null, __("Monday", "forminator" ), ), // src/form/components/settings/limits.js:
|
1081 |
-
"Thursday" => array( null, __("Thursday", "forminator" ), ), // src/form/components/settings/limits.js:
|
1082 |
-
"Tuesday" => array( null, __("Tuesday", "forminator" ), ), // src/form/components/settings/limits.js:
|
1083 |
-
"Friday" => array( null, __("Friday", "forminator" ), ), // src/form/components/settings/limits.js:
|
1084 |
-
"Disable dates" => array( null, __("Disable dates", "forminator" ), ), // src/form/components/settings/limits.js:
|
1085 |
-
"Use this setting to disable specific dates on the calendar." => array( null, __("Use this setting to disable specific dates on the calendar.", "forminator" ), ), // src/form/components/settings/limits.js:
|
1086 |
-
"Disable date ranges" => array( null, __("Disable date ranges", "forminator" ), ), // src/form/components/settings/limits.js:
|
1087 |
-
"Use this setting to disable specific dates ranges on the calendar." => array( null, __("Use this setting to disable specific dates ranges on the calendar.", "forminator" ), ), // src/form/components/settings/limits.js:
|
1088 |
-
"Choose an error message to be used when visitor enters a date that is disabled." => array( null, __("Choose an error message to be used when visitor enters a date that is disabled.", "forminator" ), ), // src/form/components/settings/limits.js:
|
1089 |
"Select a Field" => array( null, __("Select a Field", "forminator" ), ), // src/form/components/settings/metadata-option.js:78
|
1090 |
"Delete MetaData" => array( null, __("Delete MetaData", "forminator" ), ), // src/form/components/settings/metadata-option.js:97
|
1091 |
"Add Custom Meta" => array( null, __("Add Custom Meta", "forminator" ), ), // src/form/components/settings/metadata-value.js:131
|
@@ -1099,9 +1104,9 @@ To continue where you left off, click the link below or copy the link to your we
|
|
1099 |
"Miss" => array( null, __("Miss", "forminator" ), ), // src/form/components/settings/multi-name.js:62
|
1100 |
"Dr." => array( null, __("Dr.", "forminator" ), ), // src/form/components/settings/multi-name.js:63
|
1101 |
"Prof." => array( null, __("Prof.", "forminator" ), ), // src/form/components/settings/multi-name.js:64
|
1102 |
-
"Delete option" => array( null, __("Delete option", "forminator" ), ), // src/form/components/settings/multi-option.js:
|
1103 |
-
"Toggle" => array( null, __("Toggle", "forminator" ), ), // src/form/components/settings/multi-option.js:
|
1104 |
-
"Submission limit" => array( null, __("Submission limit", "forminator" ), ), // src/form/components/settings/multi-option.js:
|
1105 |
"The File APIs are not fully supported in this browser. You may copy and paste your options on the text area above or switch to a modern browser to use the importer." => array( null, __("The File APIs are not fully supported in this browser. You may copy and paste your options on the text area above or switch to a modern browser to use the importer.", "forminator" ), ), // src/form/components/settings/multi-value.js:154
|
1106 |
"Whoops, only .csv filetype is allowed." => array( null, __("Whoops, only .csv filetype is allowed.", "forminator" ), ), // src/form/components/settings/multi-value.js:187
|
1107 |
"Importing this will replace your current options. Click import to continue." => array( null, __("Importing this will replace your current options. Click import to continue.", "forminator" ), ), // src/form/components/settings/multi-value.js:196
|
@@ -1395,8 +1400,8 @@ To continue where you left off, click the link below or copy the link to your we
|
|
1395 |
"Page/Post URL" => array( null, __("Page/Post URL", "forminator" ), ), // src/quiz/global/components/behaviour/social-sharing/social-enable.js:68
|
1396 |
"Site URL" => array( null, __("Site URL", "forminator" ), ), // src/quiz/global/components/behaviour/social-sharing/social-enable.js:71
|
1397 |
"Want to enhance how the result will look when shared on Social Media? {{link}}SmartCrawl{{/link}} OpenGraph and Twitter Card support lets you choose how your content looks when it's shared on social media." => array( null, __("Want to enhance how the result will look when shared on Social Media? {{link}}SmartCrawl{{/link}} OpenGraph and Twitter Card support lets you choose how your content looks when it's shared on social media.", "forminator" ), ), // src/quiz/global/components/behaviour/social-sharing/social-enable.js:84
|
1398 |
-
"Correct Answer" => array( null, __("Correct Answer", "forminator" ), ), // src/quiz/global/components/builder/answer.js:
|
1399 |
-
"Select Personality" => array( null, __("Select Personality", "forminator" ), ), // src/quiz/global/components/builder/answer.js:
|
1400 |
"Add Question" => array( null, __("Add Question", "forminator" ), ), // src/quiz/global/components/builder/questions.js:102
|
1401 |
"A quiz without questions is not going to be very useful… Add your questions above!" => array( null, __("A quiz without questions is not going to be very useful… Add your questions above!", "forminator" ), ), // src/quiz/global/components/builder/questions.js:108
|
1402 |
"Edit Quiz" => array( null, __("Edit Quiz", "forminator" ), ), // src/quiz/global/components/header.js:13
|
1 |
<?php
|
2 |
/* THIS IS A GENERATED FILE. DO NOT EDIT DIRECTLY. */
|
3 |
$forminator_admin_locale = array(
|
4 |
+
"Appearance" => array( null, __("Appearance", "forminator" ), ), // src/form/components/appearance.js:63
|
5 |
+
"Apply Preset" => array( null, __("Apply Preset", "forminator" ), ), // src/form/components/appearance.js:70
|
6 |
+
"Fields" => array( null, __("Fields", "forminator" ), ), // src/form/components/appearance.js:98
|
7 |
+
"Behavior" => array( null, __("Behavior", "forminator" ), ), // src/form/components/appearance.js:107
|
8 |
+
"User Registration" => array( null, __("User Registration", "forminator" ), ), // src/form/components/appearance.js:115
|
9 |
+
"User Login" => array( null, __("User Login", "forminator" ), ), // src/form/components/appearance.js:123
|
10 |
"Colors" => array( null, __("Colors", "forminator" ), ), // src/form/components/appearance/colors.js:212
|
11 |
"Adjust the default color combinations to match your theme styling." => array( null, __("Adjust the default color combinations to match your theme styling.", "forminator" ), ), // src/form/components/appearance/colors.js:213
|
12 |
"Use Default Colors" => array( null, __("Use Default Colors", "forminator" ), ), // src/form/components/appearance/colors.js:227
|
120 |
"Text" => array( null, __("Text", "forminator" ), ), // src/form/components/appearance/design/basic.js:22
|
121 |
"Button" => array( null, __("Button", "forminator" ), ), // src/form/components/appearance/design/basic.js:25
|
122 |
"You have opted for no stylesheet to be enqueued. The form will inherit styles from your theme's CSS." => array( null, __("You have opted for no stylesheet to be enqueued. The form will inherit styles from your theme's CSS.", "forminator" ), ), // src/form/components/appearance/design/none.js:28
|
123 |
+
"Radius" => array( null, __("Radius", "forminator" ), ), // src/form/components/appearance/field-container/border-custom.js:20
|
124 |
+
"in px" => array( null, __("in px", "forminator" ), ), // src/form/components/appearance/field-container/border-custom.js:21
|
125 |
+
"Thickness" => array( null, __("Thickness", "forminator" ), ), // src/form/components/appearance/field-container/border-custom.js:30
|
126 |
+
"Field Container" => array( null, __("Field Container", "forminator" ), ), // src/form/components/appearance/fields-container.js:14
|
127 |
+
"Customize the field container's border." => array( null, __("Customize the field container's border.", "forminator" ), ), // src/form/components/appearance/fields-container.js:16
|
128 |
+
"Add an border style around the field." => array( null, __("Add an border style around the field.", "forminator" ), ), // src/form/components/appearance/fields-container.js:26
|
129 |
"Fonts" => array( null, __("Fonts", "forminator" ), ), // src/form/components/appearance/fonts.js:147
|
130 |
"By default this form will inherit the fonts your theme uses. You can overwrite these fonts with custom ones from Google Fonts." => array( null, __("By default this form will inherit the fonts your theme uses. You can overwrite these fonts with custom ones from Google Fonts.", "forminator" ), ), // src/form/components/appearance/fonts.js:148
|
131 |
"Use Theme Fonts" => array( null, __("Use Theme Fonts", "forminator" ), ), // src/form/components/appearance/fonts.js:163
|
155 |
"Choose how much spacing you want between each form field." => array( null, __("Choose how much spacing you want between each form field.", "forminator" ), ), // src/form/components/appearance/form-container.js:65
|
156 |
"Comfortable" => array( null, __("Comfortable", "forminator" ), ), // src/form/components/appearance/form-container.js:69
|
157 |
"Compact" => array( null, __("Compact", "forminator" ), ), // src/form/components/appearance/form-container.js:72
|
|
|
|
|
|
|
158 |
"Style" => array( null, __("Style", "forminator" ), ), // src/form/components/appearance/form-container/border-custom.js:43
|
159 |
"Solid" => array( null, __("Solid", "forminator" ), ), // src/form/components/appearance/form-container/border-custom.js:46
|
160 |
"Dashed" => array( null, __("Dashed", "forminator" ), ), // src/form/components/appearance/form-container/border-custom.js:49
|
324 |
"Enter Placeholder" => array( null, __("Enter Placeholder", "forminator" ), ), // src/form/components/fields/address.js:108
|
325 |
"Description (optional)" => array( null, __("Description (optional)", "forminator" ), ), // src/form/components/fields/address.js:123
|
326 |
"Enter description" => array( null, __("Enter description", "forminator" ), ), // src/form/components/fields/address.js:124
|
327 |
+
"At least one field must be enabled" => array( null, __("At least one field must be enabled", "forminator" ), ), // src/form/components/fields/address.js:229
|
328 |
"Field Type" => array( null, __("Field Type", "forminator" ), ), // src/form/components/fields/calculation.js:69
|
329 |
"By default, the calculation field is read-only. You can also hide the field if you don't want to show the calculated result on the form." => array( null, __("By default, the calculation field is read-only. You can also hide the field if you don't want to show the calculated result on the form.", "forminator" ), ), // src/form/components/fields/calculation.js:77
|
330 |
"Read-only" => array( null, __("Read-only", "forminator" ), ), // src/form/components/fields/calculation.js:88
|
486 |
"Validate Field" => array( null, __("Validate Field", "forminator" ), ), // src/form/components/fields/password.js:192
|
487 |
"Validation message" => array( null, __("Validation message", "forminator" ), ), // src/form/components/fields/password.js:198
|
488 |
"Enter validation message" => array( null, __("Enter validation message", "forminator" ), ), // src/form/components/fields/password.js:200
|
489 |
+
"In %s" => array( null, __("In %s", "forminator" ), ), // src/form/components/fields/paypal.js:82
|
490 |
+
"You have not connected your PayPal account with Forminator. Connect your PayPal account {{link}}here{{/link}} and then come back to configure this field." => array( null, __("You have not connected your PayPal account with Forminator. Connect your PayPal account {{link}}here{{/link}} and then come back to configure this field.", "forminator" ), ), // src/form/components/fields/paypal.js:114
|
491 |
+
"Mode of payment" => array( null, __("Mode of payment", "forminator" ), ), // src/form/components/fields/paypal.js:138
|
492 |
+
"We recommend using sandbox mode to ensure the payments are working as expected and when you are ready to start collecting live payments, switch to the {{strong}}Live{{/strong}} payments mode." => array( null, __("We recommend using sandbox mode to ensure the payments are working as expected and when you are ready to start collecting live payments, switch to the {{strong}}Live{{/strong}} payments mode.", "forminator" ), ), // src/form/components/fields/paypal.js:141
|
493 |
+
"Sandbox" => array( null, __("Sandbox", "forminator" ), ), // src/form/components/fields/paypal.js:151
|
494 |
+
"Live" => array( null, __("Live", "forminator" ), ), // src/form/components/fields/paypal.js:152
|
495 |
+
"Charge currency" => array( null, __("Charge currency", "forminator" ), ), // src/form/components/fields/paypal.js:158
|
496 |
+
"It's recommended to charge in your customers' currency to drive more sales and avoid foreign exchange fee to your customers." => array( null, __("It's recommended to charge in your customers' currency to drive more sales and avoid foreign exchange fee to your customers.", "forminator" ), ), // src/form/components/fields/paypal.js:160
|
497 |
+
"Payment amount" => array( null, __("Payment amount", "forminator" ), ), // src/form/components/fields/paypal.js:176
|
498 |
+
"Fixed" => array( null, __("Fixed", "forminator" ), ), // src/form/components/fields/paypal.js:183
|
499 |
+
"Fixed amount" => array( null, __("Fixed amount", "forminator" ), ), // src/form/components/fields/paypal.js:193
|
500 |
+
"E.g. 20.00" => array( null, __("E.g. 20.00", "forminator" ), ), // src/form/components/fields/paypal.js:195
|
501 |
+
"Enter an amount or choose a form field." => array( null, __("Enter an amount or choose a form field.", "forminator" ), ), // src/form/components/fields/paypal.js:197
|
502 |
+
"Variable" => array( null, __("Variable", "forminator" ), ), // src/form/components/fields/paypal.js:206
|
503 |
+
"Variable amount" => array( null, __("Variable amount", "forminator" ), ), // src/form/components/fields/paypal.js:216
|
504 |
+
"Select field" => array( null, __("Select field", "forminator" ), ), // src/form/components/fields/paypal.js:227
|
505 |
+
"A currency field can be used to take user-defined payments such as donations and calculation field can be used to charge a calculated value based on a formula." => array( null, __("A currency field can be used to take user-defined payments such as donations and calculation field can be used to charge a calculated value based on a formula.", "forminator" ), ), // src/form/components/fields/paypal.js:240
|
506 |
+
"Choose a label for your PayPal button. Note that PayPal checkout doesn't allow a custom label for the PayPal button. You can only choose from the pre-defined labels." => array( null, __("Choose a label for your PayPal button. Note that PayPal checkout doesn't allow a custom label for the PayPal button. You can only choose from the pre-defined labels.", "forminator" ), ), // src/form/components/fields/paypal.js:262
|
507 |
+
"PayPal recommends using the Gold button since it is widely known as their brand color. However, if that does not suit your theme, you can choose a different color." => array( null, __("PayPal recommends using the Gold button since it is widely known as their brand color. However, if that does not suit your theme, you can choose a different color.", "forminator" ), ), // src/form/components/fields/paypal.js:281
|
508 |
+
"Gold" => array( null, __("Gold", "forminator" ), ), // src/form/components/fields/paypal.js:287
|
509 |
+
"Blue" => array( null, __("Blue", "forminator" ), ), // src/form/components/fields/paypal.js:288
|
510 |
+
"Silver" => array( null, __("Silver", "forminator" ), ), // src/form/components/fields/paypal.js:289
|
511 |
+
"White" => array( null, __("White", "forminator" ), ), // src/form/components/fields/paypal.js:290
|
512 |
+
"Black" => array( null, __("Black", "forminator" ), ), // src/form/components/fields/paypal.js:291
|
513 |
+
"Width" => array( null, __("Width", "forminator" ), ), // src/form/components/fields/paypal.js:296
|
514 |
+
"E.g. 250" => array( null, __("E.g. 250", "forminator" ), ), // src/form/components/fields/paypal.js:313
|
515 |
+
"px" => array( null, __("px", "forminator" ), ), // src/form/components/fields/paypal.js:319
|
516 |
+
"Choose the width of PayPal Smart Buttons. It can be anywhere between 150px to 750px. Leave this empty if you want the buttons to take the full width of the form up to the 750px limit." => array( null, __("Choose the width of PayPal Smart Buttons. It can be anywhere between 150px to 750px. Leave this empty if you want the buttons to take the full width of the form up to the 750px limit.", "forminator" ), ), // src/form/components/fields/paypal.js:322
|
517 |
+
"Height" => array( null, __("Height", "forminator" ), ), // src/form/components/fields/paypal.js:334
|
518 |
+
"Choose the height of PayPal Smart Buttons. It can be anywhere between 25px to 55px" => array( null, __("Choose the height of PayPal Smart Buttons. It can be anywhere between 25px to 55px", "forminator" ), ), // src/form/components/fields/paypal.js:358
|
519 |
+
"Shape" => array( null, __("Shape", "forminator" ), ), // src/form/components/fields/paypal.js:369
|
520 |
+
"Choose your preferred shape from your PayPal Smart Buttons." => array( null, __("Choose your preferred shape from your PayPal Smart Buttons.", "forminator" ), ), // src/form/components/fields/paypal.js:372
|
521 |
+
"Rectangular" => array( null, __("Rectangular", "forminator" ), ), // src/form/components/fields/paypal.js:377
|
522 |
+
"Pill" => array( null, __("Pill", "forminator" ), ), // src/form/components/fields/paypal.js:378
|
523 |
+
"We recommend the vertical layout as it allows additional payment methods such as Credit Cards. You can read about the layout options {{link}}here{{/link}}." => array( null, __("We recommend the vertical layout as it allows additional payment methods such as Credit Cards. You can read about the layout options {{link}}here{{/link}}.", "forminator" ), ), // src/form/components/fields/paypal.js:388
|
524 |
+
"Tagline" => array( null, __("Tagline", "forminator" ), ), // src/form/components/fields/paypal.js:407
|
525 |
+
"Choose whether to show the default PayPal tagline {{strong}}\"The safer, easier way to pay\"{{/strong}} below your PayPal button." => array( null, __("Choose whether to show the default PayPal tagline {{strong}}\"The safer, easier way to pay\"{{/strong}} below your PayPal button.", "forminator" ), ), // src/form/components/fields/paypal.js:410
|
526 |
+
"Disable Funding Sources" => array( null, __("Disable Funding Sources", "forminator" ), ), // src/form/components/fields/paypal.js:432
|
527 |
+
"PayPal automatically adds additional funding sources to the PayPal checkout for visitors from supported countries. However, you can choose to disable funding sources which shouldn't be displayed to visitors." => array( null, __("PayPal automatically adds additional funding sources to the PayPal checkout for visitors from supported countries. However, you can choose to disable funding sources which shouldn't be displayed to visitors.", "forminator" ), ), // src/form/components/fields/paypal.js:439
|
528 |
+
"Credit or debit cards" => array( null, __("Credit or debit cards", "forminator" ), ), // src/form/components/fields/paypal.js:453
|
529 |
+
"PayPal Credit" => array( null, __("PayPal Credit", "forminator" ), ), // src/form/components/fields/paypal.js:460
|
530 |
+
"Bancontact" => array( null, __("Bancontact", "forminator" ), ), // src/form/components/fields/paypal.js:467
|
531 |
+
"BLIK" => array( null, __("BLIK", "forminator" ), ), // src/form/components/fields/paypal.js:474
|
532 |
+
"eps" => array( null, __("eps", "forminator" ), ), // src/form/components/fields/paypal.js:481
|
533 |
+
"giropay" => array( null, __("giropay", "forminator" ), ), // src/form/components/fields/paypal.js:488
|
534 |
+
"iDEAL" => array( null, __("iDEAL", "forminator" ), ), // src/form/components/fields/paypal.js:495
|
535 |
+
"Mercado Pago" => array( null, __("Mercado Pago", "forminator" ), ), // src/form/components/fields/paypal.js:504
|
536 |
+
"MyBank" => array( null, __("MyBank", "forminator" ), ), // src/form/components/fields/paypal.js:511
|
537 |
+
"Przelewy24" => array( null, __("Przelewy24", "forminator" ), ), // src/form/components/fields/paypal.js:518
|
538 |
+
"SEPA-Lastschrift" => array( null, __("SEPA-Lastschrift", "forminator" ), ), // src/form/components/fields/paypal.js:525
|
539 |
+
"Sofort" => array( null, __("Sofort", "forminator" ), ), // src/form/components/fields/paypal.js:532
|
540 |
+
"Venmo" => array( null, __("Venmo", "forminator" ), ), // src/form/components/fields/paypal.js:539
|
541 |
+
"Disable Card Options" => array( null, __("Disable Card Options", "forminator" ), ), // src/form/components/fields/paypal.js:550
|
542 |
+
"PayPal automatically decides the card options that appear in the Smart Payment Buttons based visitors geographic location. However you can permanently disable some cards. Choose the cards which should never display to your visitors." => array( null, __("PayPal automatically decides the card options that appear in the Smart Payment Buttons based visitors geographic location. However you can permanently disable some cards. Choose the cards which should never display to your visitors.", "forminator" ), ), // src/form/components/fields/paypal.js:557
|
543 |
+
"Visa" => array( null, __("Visa", "forminator" ), ), // src/form/components/fields/paypal.js:571
|
544 |
+
"Mastercard" => array( null, __("Mastercard", "forminator" ), ), // src/form/components/fields/paypal.js:578
|
545 |
+
"American Express" => array( null, __("American Express", "forminator" ), ), // src/form/components/fields/paypal.js:585
|
546 |
+
"Discover" => array( null, __("Discover", "forminator" ), ), // src/form/components/fields/paypal.js:592
|
547 |
+
"JCB" => array( null, __("JCB", "forminator" ), ), // src/form/components/fields/paypal.js:601
|
548 |
+
"Elo" => array( null, __("Elo", "forminator" ), ), // src/form/components/fields/paypal.js:608
|
549 |
+
"Hiper" => array( null, __("Hiper", "forminator" ), ), // src/form/components/fields/paypal.js:615
|
550 |
+
"Pre-fill Billing Details" => array( null, __("Pre-fill Billing Details", "forminator" ), ), // src/form/components/fields/paypal.js:626
|
551 |
+
"Pre-fill the payer's billing info collected on your form on the Debit or Credit Card checkout, so the payer doesn't have to enter those details again." => array( null, __("Pre-fill the payer's billing info collected on your form on the Debit or Credit Card checkout, so the payer doesn't have to enter those details again.", "forminator" ), ), // src/form/components/fields/paypal.js:633
|
552 |
+
"Enable" => array( null, __("Enable", "forminator" ), ), // src/form/components/fields/paypal.js:654
|
553 |
+
"Customer name (optional)" => array( null, __("Customer name (optional)", "forminator" ), ), // src/form/components/fields/paypal.js:661
|
554 |
+
"Select a name field" => array( null, __("Select a name field", "forminator" ), ), // src/form/components/fields/paypal.js:670
|
555 |
+
"Customer email address (optional)" => array( null, __("Customer email address (optional)", "forminator" ), ), // src/form/components/fields/paypal.js:685
|
556 |
+
"Select an email field" => array( null, __("Select an email field", "forminator" ), ), // src/form/components/fields/paypal.js:694
|
557 |
+
"Billing address (optional)" => array( null, __("Billing address (optional)", "forminator" ), ), // src/form/components/fields/paypal.js:712
|
558 |
+
"Select an address field" => array( null, __("Select an address field", "forminator" ), ), // src/form/components/fields/paypal.js:721
|
559 |
+
"Ensure the Country option is enabled and required for {{strong}}%(fieldName)s{{/strong}} to process Paypal’s transaction successfully." => array( null, __("Ensure the Country option is enabled and required for {{strong}}%(fieldName)s{{/strong}} to process Paypal’s transaction successfully.", "forminator" ), ), // src/form/components/fields/paypal.js:750
|
560 |
+
"Disable" => array( null, __("Disable", "forminator" ), ), // src/form/components/fields/paypal.js:777
|
561 |
+
"Shipping Address" => array( null, __("Shipping Address", "forminator" ), ), // src/form/components/fields/paypal.js:787
|
562 |
+
"If you are selling a product that doesn't need to be shipped, you can choose to disable and hide the shipping address fields from the PayPal payment page." => array( null, __("If you are selling a product that doesn't need to be shipped, you can choose to disable and hide the shipping address fields from the PayPal payment page.", "forminator" ), ), // src/form/components/fields/paypal.js:794
|
563 |
+
"By default, PayPal detects the language for the visitors based on their geolocation and browser preferences. It is recommended to pass this parameter only if you need the PayPal buttons to render in the same language as the rest of your site. {{link}}Supported locale codes.{{/link}}" => array( null, __("By default, PayPal detects the language for the visitors based on their geolocation and browser preferences. It is recommended to pass this parameter only if you need the PayPal buttons to render in the same language as the rest of your site. {{link}}Supported locale codes.{{/link}}", "forminator" ), ), // src/form/components/fields/paypal.js:824
|
564 |
+
"Eg. en_US" => array( null, __("Eg. en_US", "forminator" ), ), // src/form/components/fields/paypal.js:843
|
565 |
+
"Debug Mode" => array( null, __("Debug Mode", "forminator" ), ), // src/form/components/fields/paypal.js:853
|
566 |
+
"PayPal debug mode helps troubleshoot any issues. However, it's recommended to disable this in production as it causes a significant increase in the script size and performance decrease." => array( null, __("PayPal debug mode helps troubleshoot any issues. However, it's recommended to disable this in production as it causes a significant increase in the script size and performance decrease.", "forminator" ), ), // src/form/components/fields/paypal.js:860
|
567 |
"Make sure the users fill this field as per the selected validation and warn them when they haven't" => array( null, __("Make sure the users fill this field as per the selected validation and warn them when they haven't", "forminator" ), ), // src/form/components/fields/phone.js:43
|
568 |
"National" => array( null, __("National", "forminator" ), ), // src/form/components/fields/phone.js:62
|
569 |
"Select the country to validate phone number for" => array( null, __("Select the country to validate phone number for", "forminator" ), ), // src/form/components/fields/phone.js:69
|
600 |
"Add a border to this section." => array( null, __("Add a border to this section.", "forminator" ), ), // src/form/components/fields/section.js:55
|
601 |
"Signature Filetype" => array( null, __("Signature Filetype", "forminator" ), ), // src/form/components/fields/signature.js:30
|
602 |
"Choose the filetype to save your users' signature in." => array( null, __("Choose the filetype to save your users' signature in.", "forminator" ), ), // src/form/components/fields/signature.js:32
|
603 |
+
"PNG" => array( null, __("PNG", "forminator" ), ), // src/form/components/fields/signature.js:46
|
604 |
+
"JPG" => array( null, __("JPG", "forminator" ), ), // src/form/components/fields/signature.js:47
|
605 |
+
"Choose the height of your signature field. The default value is 180px." => array( null, __("Choose the height of your signature field. The default value is 180px.", "forminator" ), ), // src/form/components/fields/signature.js:55
|
606 |
+
"Stroke Thickness" => array( null, __("Stroke Thickness", "forminator" ), ), // src/form/components/fields/signature.js:73
|
607 |
+
"Choose the thickness in pixels for signature strokes. The default value is 2px." => array( null, __("Choose the thickness in pixels for signature strokes. The default value is 2px.", "forminator" ), ), // src/form/components/fields/signature.js:75
|
608 |
"Note: Pass comma-separated values for this query parameter to pre-populate multiple options." => array( null, __("Note: Pass comma-separated values for this query parameter to pre-populate multiple options.", "forminator" ), ), // src/form/components/fields/singlevalue.js:32
|
609 |
"Search" => array( null, __("Search", "forminator" ), ), // src/form/components/fields/singlevalue.js:112
|
610 |
"Display the search box in a dropdown" => array( null, __("Display the search box in a dropdown", "forminator" ), ), // src/form/components/fields/singlevalue.js:120
|
897 |
"Please fill required fields" => array( null, __("Please fill required fields", "forminator" ), ), // src/form/components/modals/settings.js:149
|
898 |
"Calculation values are required!" => array( null, __("Calculation values are required!", "forminator" ), ), // src/form/components/modals/settings.js:167
|
899 |
"Option labels are required!" => array( null, __("Option labels are required!", "forminator" ), ), // src/form/components/modals/settings.js:176
|
900 |
+
"Please add a placeholder or select a default option." => array( null, __("Please add a placeholder or select a default option.", "forminator" ), ), // src/form/components/modals/settings.js:189
|
901 |
+
"Please select a default option." => array( null, __("Please select a default option.", "forminator" ), ), // src/form/components/modals/settings.js:194
|
902 |
+
"At least one of Title, Content, or Excerpt must be enabled for post data to be submitted." => array( null, __("At least one of Title, Content, or Excerpt must be enabled for post data to be submitted.", "forminator" ), ), // src/form/components/modals/settings.js:205
|
903 |
+
"Please, connect your Stripe account first!" => array( null, __("Please, connect your Stripe account first!", "forminator" ), ), // src/form/components/modals/settings.js:213
|
904 |
+
"You need at least one payment!" => array( null, __("You need at least one payment!", "forminator" ), ), // src/form/components/modals/settings.js:218
|
905 |
+
"Please select an email address for payment receipt." => array( null, __("Please select an email address for payment receipt.", "forminator" ), ), // src/form/components/modals/settings.js:223
|
906 |
+
"Empty labels are not allowed for meta values!" => array( null, __("Empty labels are not allowed for meta values!", "forminator" ), ), // src/form/components/modals/settings.js:234
|
907 |
+
"Please connect your PayPal account first!" => array( null, __("Please connect your PayPal account first!", "forminator" ), ), // src/form/components/modals/settings.js:247
|
908 |
+
"Please enter PayPal payment amount!" => array( null, __("Please enter PayPal payment amount!", "forminator" ), ), // src/form/components/modals/settings.js:252
|
909 |
+
"Please select PayPal payment variable field!" => array( null, __("Please select PayPal payment variable field!", "forminator" ), ), // src/form/components/modals/settings.js:257
|
910 |
+
"Calculation formula is required!" => array( null, __("Calculation formula is required!", "forminator" ), ), // src/form/components/modals/settings.js:267
|
911 |
+
"Limit Min value should be less than Max value." => array( null, __("Limit Min value should be less than Max value.", "forminator" ), ), // src/form/components/modals/settings.js:275
|
912 |
+
"Please enter API keys." => array( null, __("Please enter API keys.", "forminator" ), ), // src/form/components/modals/settings.js:298
|
913 |
+
"Please select a valid end time limit." => array( null, __("Please select a valid end time limit.", "forminator" ), ), // src/form/components/modals/settings.js:390
|
914 |
+
"Please fix the Default time error." => array( null, __("Please fix the Default time error.", "forminator" ), ), // src/form/components/modals/settings.js:396
|
915 |
+
"Please fix the Start or End time." => array( null, __("Please fix the Start or End time.", "forminator" ), ), // src/form/components/modals/settings.js:410
|
916 |
+
"Please fix the limit Start or End date." => array( null, __("Please fix the limit Start or End date.", "forminator" ), ), // src/form/components/modals/settings.js:545
|
917 |
+
"Calculations" => array( null, __("Calculations", "forminator" ), ), // src/form/components/modals/settings.js:674
|
918 |
+
"Styling" => array( null, __("Styling", "forminator" ), ), // src/form/components/modals/settings.js:694
|
919 |
+
"Customize" => array( null, __("Customize", "forminator" ), ), // src/form/components/modals/settings.js:704
|
920 |
+
"Visibility" => array( null, __("Visibility", "forminator" ), ), // src/form/components/modals/settings.js:714
|
921 |
"Shortcode has been copied successfully." => array( null, __("Shortcode has been copied successfully.", "forminator" ), ), // src/form/components/modals/shortcode.js:22
|
922 |
"Ready to go!" => array( null, __("Ready to go!", "forminator" ), ), // src/form/components/modals/shortcode.js:46
|
923 |
"Your form is now ready to be embedded into a page or template of your choice. Simply copy and paste the shortcode below to display it!" => array( null, __("Your form is now ready to be embedded into a page or template of your choice. Simply copy and paste the shortcode below to display it!", "forminator" ), ), // src/form/components/modals/shortcode.js:50
|
1061 |
"Font Size" => array( null, __("Font Size", "forminator" ), ), // src/form/components/settings/fonts.js:108
|
1062 |
"Font Weight" => array( null, __("Font Weight", "forminator" ), ), // src/form/components/settings/fonts.js:116
|
1063 |
"Select font weight" => array( null, __("Select font weight", "forminator" ), ), // src/form/components/settings/fonts.js:117
|
1064 |
+
"Start & End date" => array( null, __("Start & End date", "forminator" ), ), // src/form/components/settings/limits.js:67
|
1065 |
+
"Choose a start and end date limit for the calendar to restrict the date selection between a specific date range. Note that we will use the timezone set in your {{a}}WordPress Settings{{/a}}." => array( null, __("Choose a start and end date limit for the calendar to restrict the date selection between a specific date range. Note that we will use the timezone set in your {{a}}WordPress Settings{{/a}}.", "forminator" ), ), // src/form/components/settings/limits.js:71
|
1066 |
+
"Start Date" => array( null, __("Start Date", "forminator" ), ), // src/form/components/settings/limits.js:94
|
1067 |
+
"No limit" => array( null, __("No limit", "forminator" ), ), // src/form/components/settings/limits.js:99
|
1068 |
+
"Specific date" => array( null, __("Specific date", "forminator" ), ), // src/form/components/settings/limits.js:100
|
1069 |
+
"Date fields" => array( null, __("Date fields", "forminator" ), ), // src/form/components/settings/limits.js:103
|
1070 |
+
"Offset (optional)" => array( null, __("Offset (optional)", "forminator" ), ), // src/form/components/settings/limits.js:139
|
1071 |
+
"+" => array( null, __("+", "forminator" ), ), // src/form/components/settings/limits.js:153
|
1072 |
+
"-" => array( null, __("-", "forminator" ), ), // src/form/components/settings/limits.js:154
|
1073 |
+
"days" => array( null, __("days", "forminator" ), ), // src/form/components/settings/limits.js:174
|
1074 |
+
"weeks" => array( null, __("weeks", "forminator" ), ), // src/form/components/settings/limits.js:175
|
1075 |
+
"months" => array( null, __("months", "forminator" ), ), // src/form/components/settings/limits.js:176
|
1076 |
+
"years" => array( null, __("years", "forminator" ), ), // src/form/components/settings/limits.js:177
|
1077 |
+
"End Date" => array( null, __("End Date", "forminator" ), ), // src/form/components/settings/limits.js:195
|
1078 |
+
"Days of the week" => array( null, __("Days of the week", "forminator" ), ), // src/form/components/settings/limits.js:293
|
1079 |
+
"Choose which days of the week should be available on the calendar." => array( null, __("Choose which days of the week should be available on the calendar.", "forminator" ), ), // src/form/components/settings/limits.js:297
|
1080 |
+
"All days" => array( null, __("All days", "forminator" ), ), // src/form/components/settings/limits.js:308
|
1081 |
+
"Selected days" => array( null, __("Selected days", "forminator" ), ), // src/form/components/settings/limits.js:314
|
1082 |
+
"Sunday" => array( null, __("Sunday", "forminator" ), ), // src/form/components/settings/limits.js:326
|
1083 |
+
"Wednesday" => array( null, __("Wednesday", "forminator" ), ), // src/form/components/settings/limits.js:334
|
1084 |
+
"Saturday" => array( null, __("Saturday", "forminator" ), ), // src/form/components/settings/limits.js:342
|
1085 |
+
"Monday" => array( null, __("Monday", "forminator" ), ), // src/form/components/settings/limits.js:354
|
1086 |
+
"Thursday" => array( null, __("Thursday", "forminator" ), ), // src/form/components/settings/limits.js:362
|
1087 |
+
"Tuesday" => array( null, __("Tuesday", "forminator" ), ), // src/form/components/settings/limits.js:374
|
1088 |
+
"Friday" => array( null, __("Friday", "forminator" ), ), // src/form/components/settings/limits.js:382
|
1089 |
+
"Disable dates" => array( null, __("Disable dates", "forminator" ), ), // src/form/components/settings/limits.js:400
|
1090 |
+
"Use this setting to disable specific dates on the calendar." => array( null, __("Use this setting to disable specific dates on the calendar.", "forminator" ), ), // src/form/components/settings/limits.js:402
|
1091 |
+
"Disable date ranges" => array( null, __("Disable date ranges", "forminator" ), ), // src/form/components/settings/limits.js:417
|
1092 |
+
"Use this setting to disable specific dates ranges on the calendar." => array( null, __("Use this setting to disable specific dates ranges on the calendar.", "forminator" ), ), // src/form/components/settings/limits.js:419
|
1093 |
+
"Choose an error message to be used when visitor enters a date that is disabled." => array( null, __("Choose an error message to be used when visitor enters a date that is disabled.", "forminator" ), ), // src/form/components/settings/limits.js:436
|
1094 |
"Select a Field" => array( null, __("Select a Field", "forminator" ), ), // src/form/components/settings/metadata-option.js:78
|
1095 |
"Delete MetaData" => array( null, __("Delete MetaData", "forminator" ), ), // src/form/components/settings/metadata-option.js:97
|
1096 |
"Add Custom Meta" => array( null, __("Add Custom Meta", "forminator" ), ), // src/form/components/settings/metadata-value.js:131
|
1104 |
"Miss" => array( null, __("Miss", "forminator" ), ), // src/form/components/settings/multi-name.js:62
|
1105 |
"Dr." => array( null, __("Dr.", "forminator" ), ), // src/form/components/settings/multi-name.js:63
|
1106 |
"Prof." => array( null, __("Prof.", "forminator" ), ), // src/form/components/settings/multi-name.js:64
|
1107 |
+
"Delete option" => array( null, __("Delete option", "forminator" ), ), // src/form/components/settings/multi-option.js:212
|
1108 |
+
"Toggle" => array( null, __("Toggle", "forminator" ), ), // src/form/components/settings/multi-option.js:216
|
1109 |
+
"Submission limit" => array( null, __("Submission limit", "forminator" ), ), // src/form/components/settings/multi-option.js:242
|
1110 |
"The File APIs are not fully supported in this browser. You may copy and paste your options on the text area above or switch to a modern browser to use the importer." => array( null, __("The File APIs are not fully supported in this browser. You may copy and paste your options on the text area above or switch to a modern browser to use the importer.", "forminator" ), ), // src/form/components/settings/multi-value.js:154
|
1111 |
"Whoops, only .csv filetype is allowed." => array( null, __("Whoops, only .csv filetype is allowed.", "forminator" ), ), // src/form/components/settings/multi-value.js:187
|
1112 |
"Importing this will replace your current options. Click import to continue." => array( null, __("Importing this will replace your current options. Click import to continue.", "forminator" ), ), // src/form/components/settings/multi-value.js:196
|
1400 |
"Page/Post URL" => array( null, __("Page/Post URL", "forminator" ), ), // src/quiz/global/components/behaviour/social-sharing/social-enable.js:68
|
1401 |
"Site URL" => array( null, __("Site URL", "forminator" ), ), // src/quiz/global/components/behaviour/social-sharing/social-enable.js:71
|
1402 |
"Want to enhance how the result will look when shared on Social Media? {{link}}SmartCrawl{{/link}} OpenGraph and Twitter Card support lets you choose how your content looks when it's shared on social media." => array( null, __("Want to enhance how the result will look when shared on Social Media? {{link}}SmartCrawl{{/link}} OpenGraph and Twitter Card support lets you choose how your content looks when it's shared on social media.", "forminator" ), ), // src/quiz/global/components/behaviour/social-sharing/social-enable.js:84
|
1403 |
+
"Correct Answer" => array( null, __("Correct Answer", "forminator" ), ), // src/quiz/global/components/builder/answer.js:105
|
1404 |
+
"Select Personality" => array( null, __("Select Personality", "forminator" ), ), // src/quiz/global/components/builder/answer.js:116
|
1405 |
"Add Question" => array( null, __("Add Question", "forminator" ), ), // src/quiz/global/components/builder/questions.js:102
|
1406 |
"A quiz without questions is not going to be very useful… Add your questions above!" => array( null, __("A quiz without questions is not going to be very useful… Add your questions above!", "forminator" ), ), // src/quiz/global/components/builder/questions.js:108
|
1407 |
"Edit Quiz" => array( null, __("Edit Quiz", "forminator" ), ), // src/quiz/global/components/header.js:13
|
admin/pages/entries-page.php
CHANGED
@@ -10,14 +10,6 @@ if ( ! defined( 'ABSPATH' ) ) {
|
|
10 |
*/
|
11 |
class Forminator_Entries_Page extends Forminator_Admin_Page {
|
12 |
|
13 |
-
/**
|
14 |
-
* Available Modules
|
15 |
-
*
|
16 |
-
* @since 1.0.5
|
17 |
-
* @var array
|
18 |
-
*/
|
19 |
-
private $modules = array();
|
20 |
-
|
21 |
/**
|
22 |
* Merged default parameter with superglobal REQUEST
|
23 |
*
|
@@ -42,28 +34,6 @@ class Forminator_Entries_Page extends Forminator_Admin_Page {
|
|
42 |
*/
|
43 |
private $form_model = null;
|
44 |
|
45 |
-
/**
|
46 |
-
* Populating Modules that available on Plugin
|
47 |
-
*
|
48 |
-
* @since 1.0.5
|
49 |
-
*/
|
50 |
-
public function populate_modules() {
|
51 |
-
$modules[] = array(
|
52 |
-
'name' => __( 'Forms', 'forminator' ),
|
53 |
-
'model' => Forminator_Form_Model::model(),
|
54 |
-
);
|
55 |
-
$modules[] = array(
|
56 |
-
'name' => __( 'Polls', 'forminator' ),
|
57 |
-
'model' => Forminator_Poll_Model::model(),
|
58 |
-
);
|
59 |
-
$modules[] = array(
|
60 |
-
'name' => __( 'Quizzes', 'forminator' ),
|
61 |
-
'model' => Forminator_Quiz_Model::model(),
|
62 |
-
);
|
63 |
-
|
64 |
-
$this->modules = apply_filters( 'forminator_entries_page_modules', $modules );
|
65 |
-
}
|
66 |
-
|
67 |
/**
|
68 |
* Populating Current Page Parameters
|
69 |
*
|
@@ -83,7 +53,6 @@ class Forminator_Entries_Page extends Forminator_Admin_Page {
|
|
83 |
*/
|
84 |
public function before_render() {
|
85 |
$this->populate_screen_params();
|
86 |
-
$this->populate_modules();
|
87 |
$this->prepare_entries_page();
|
88 |
$this->enqueue_entries_scripts();
|
89 |
}
|
@@ -96,14 +65,7 @@ class Forminator_Entries_Page extends Forminator_Admin_Page {
|
|
96 |
* @return mixed
|
97 |
*/
|
98 |
public function get_form_types() {
|
99 |
-
$form_types =
|
100 |
-
foreach ( $this->modules as $module ) {
|
101 |
-
/** @var Forminator_Base_Form_Model $model */
|
102 |
-
$model = $module['model'];
|
103 |
-
$name = $module['name'];
|
104 |
-
|
105 |
-
$form_types[ $model->get_post_type() ] = $name;
|
106 |
-
}
|
107 |
|
108 |
return apply_filters( 'forminator_entries_page_modules', $form_types );
|
109 |
}
|
@@ -149,29 +111,6 @@ class Forminator_Entries_Page extends Forminator_Admin_Page {
|
|
149 |
}
|
150 |
}
|
151 |
|
152 |
-
/**
|
153 |
-
* Get Form Model if current requested form_id available and matched form_type
|
154 |
-
*
|
155 |
-
* @since 1.0.5
|
156 |
-
*
|
157 |
-
* @return bool|Forminator_Base_Form_Model|null
|
158 |
-
*/
|
159 |
-
private function get_form_model() {
|
160 |
-
if ( $this->get_current_form_id() ) {
|
161 |
-
$form_model = forminator_get_model_from_id( $this->get_current_form_id() );
|
162 |
-
if ( ! $form_model instanceof Forminator_Base_Form_Model ) {
|
163 |
-
return null;
|
164 |
-
}
|
165 |
-
if ( $form_model->get_post_type() !== $this->get_current_form_type() ) {
|
166 |
-
return null;
|
167 |
-
}
|
168 |
-
|
169 |
-
return $form_model;
|
170 |
-
}
|
171 |
-
|
172 |
-
return null;
|
173 |
-
}
|
174 |
-
|
175 |
/**
|
176 |
* Return rendered entries page
|
177 |
*
|
@@ -184,7 +123,7 @@ class Forminator_Entries_Page extends Forminator_Admin_Page {
|
|
184 |
}
|
185 |
|
186 |
/**
|
187 |
-
*
|
188 |
*
|
189 |
* @since 1.0.5
|
190 |
*/
|
10 |
*/
|
11 |
class Forminator_Entries_Page extends Forminator_Admin_Page {
|
12 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
13 |
/**
|
14 |
* Merged default parameter with superglobal REQUEST
|
15 |
*
|
34 |
*/
|
35 |
private $form_model = null;
|
36 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
37 |
/**
|
38 |
* Populating Current Page Parameters
|
39 |
*
|
53 |
*/
|
54 |
public function before_render() {
|
55 |
$this->populate_screen_params();
|
|
|
56 |
$this->prepare_entries_page();
|
57 |
$this->enqueue_entries_scripts();
|
58 |
}
|
65 |
* @return mixed
|
66 |
*/
|
67 |
public function get_form_types() {
|
68 |
+
$form_types = $this->modules_form_type();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
69 |
|
70 |
return apply_filters( 'forminator_entries_page_modules', $form_types );
|
71 |
}
|
111 |
}
|
112 |
}
|
113 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
114 |
/**
|
115 |
* Return rendered entries page
|
116 |
*
|
123 |
}
|
124 |
|
125 |
/**
|
126 |
+
* Render Form switcher / select based on current form_type
|
127 |
*
|
128 |
* @since 1.0.5
|
129 |
*/
|
admin/pages/reports-page.php
ADDED
@@ -0,0 +1,291 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
3 |
+
die();
|
4 |
+
}
|
5 |
+
|
6 |
+
/**
|
7 |
+
* Class Forminator_Reports_Page
|
8 |
+
*
|
9 |
+
* @since 1.18.0
|
10 |
+
*/
|
11 |
+
class Forminator_Reports_Page extends Forminator_Admin_Page {
|
12 |
+
|
13 |
+
/**
|
14 |
+
* Merged default parameter with superglobal REQUEST
|
15 |
+
*
|
16 |
+
* @since 1.18.0
|
17 |
+
* @var array
|
18 |
+
*/
|
19 |
+
private $screen_params = array();
|
20 |
+
|
21 |
+
/**
|
22 |
+
* Get Form types based on available modules
|
23 |
+
*
|
24 |
+
* @return mixed
|
25 |
+
* @since 1.18.0
|
26 |
+
*
|
27 |
+
*/
|
28 |
+
public function get_form_types() {
|
29 |
+
$form_types = $this->modules_form_type();
|
30 |
+
|
31 |
+
return apply_filters( 'forminator_reports_page_modules', $form_types );
|
32 |
+
}
|
33 |
+
|
34 |
+
/**
|
35 |
+
* Render Form switcher / select based on current form_type
|
36 |
+
*
|
37 |
+
* @since 1.18.0
|
38 |
+
*/
|
39 |
+
public static function render_form_switcher( $form_type = 'forminator_forms', $form_id = 0 ) {
|
40 |
+
$classes = 'sui-select';
|
41 |
+
if ( 0 !== $form_id ) {
|
42 |
+
$classes .= ' sui-select-sm sui-select-inline';
|
43 |
+
}
|
44 |
+
|
45 |
+
$empty_option = __( 'Choose a Form', 'forminator' );
|
46 |
+
$method = 'get_forms';
|
47 |
+
$model = 'Forminator_Form_Model';
|
48 |
+
|
49 |
+
if ( $form_type === Forminator_Poll_Model::model()->get_post_type() ) {
|
50 |
+
$empty_option = __( 'Choose a Poll', 'forminator' );
|
51 |
+
$method = 'get_polls';
|
52 |
+
$model = 'Forminator_Poll_Model';
|
53 |
+
} elseif ( $form_type === Forminator_Quiz_Model::model()->get_post_type() ) {
|
54 |
+
$empty_option = __( 'Choose a Quiz', 'forminator' );
|
55 |
+
$method = 'get_quizzes';
|
56 |
+
$model = 'Forminator_Quiz_Model';
|
57 |
+
}
|
58 |
+
|
59 |
+
echo '<select name="form_id" data-allow-search="1" data-minimum-results-for-search="0" class="' . esc_attr( $classes ) . '" data-search="true" data-search="true" data-placeholder="' . esc_attr( $empty_option ) . '">';
|
60 |
+
echo '<option><option>';
|
61 |
+
|
62 |
+
$forms = Forminator_API::$method( null, 1, 999, $model::STATUS_PUBLISH );
|
63 |
+
$forms = apply_filters( 'forminator_reports_get_forms', $forms, $form_type );
|
64 |
+
|
65 |
+
foreach ( $forms as $form ) {
|
66 |
+
/**@var Forminator_Base_Form_Model $form */
|
67 |
+
$title = ! empty( $form->settings['formName'] ) ? $form->settings['formName'] : $form->raw->post_title;
|
68 |
+
echo '<option value="' . esc_attr( $form->id ) . '" ' . selected( $form->id, $form_id, false ) . '>' . esc_html( $title ) . '</option>';
|
69 |
+
}
|
70 |
+
echo '</select>';
|
71 |
+
}
|
72 |
+
|
73 |
+
/**
|
74 |
+
* Executed Action before render the page
|
75 |
+
*
|
76 |
+
* @since 1.18.0
|
77 |
+
*/
|
78 |
+
public function before_render() {
|
79 |
+
$this->populate_screen_params();
|
80 |
+
$this->prepare_reports_page();
|
81 |
+
$this->enqueue_reports_scripts();
|
82 |
+
}
|
83 |
+
|
84 |
+
/**
|
85 |
+
* Populating Current Page Parameters
|
86 |
+
*
|
87 |
+
* @since 1.18.0
|
88 |
+
*/
|
89 |
+
public function populate_screen_params() {
|
90 |
+
$this->screen_params = array(
|
91 |
+
'form_type' => Forminator_Core::sanitize_text_field( 'form_type', 'forminator_forms' ),
|
92 |
+
'form_id' => Forminator_Core::sanitize_text_field( 'form_id', 0 ),
|
93 |
+
);
|
94 |
+
}
|
95 |
+
|
96 |
+
/**
|
97 |
+
* Prepare Reports Page
|
98 |
+
*
|
99 |
+
* @since 1.18.0
|
100 |
+
*/
|
101 |
+
private function prepare_reports_page() {
|
102 |
+
$this->form_model = $this->get_form_model();
|
103 |
+
// Form not found.
|
104 |
+
if ( ! $this->form_model instanceof Forminator_Base_Form_Model ) {
|
105 |
+
// if form_id available remove it from request, and redirect.
|
106 |
+
if ( $this->get_current_form_id() ) {
|
107 |
+
$url = remove_query_arg( 'form_id' );
|
108 |
+
if ( wp_safe_redirect( $url ) ) {
|
109 |
+
exit;
|
110 |
+
}
|
111 |
+
}
|
112 |
+
}
|
113 |
+
}
|
114 |
+
|
115 |
+
/**
|
116 |
+
* Get current form type
|
117 |
+
*
|
118 |
+
* @return mixed
|
119 |
+
*/
|
120 |
+
public function get_current_form_type() {
|
121 |
+
return $this->screen_params['form_type'];
|
122 |
+
}
|
123 |
+
|
124 |
+
/**
|
125 |
+
* Get current form id
|
126 |
+
*
|
127 |
+
* @return mixed
|
128 |
+
*/
|
129 |
+
public function get_current_form_id() {
|
130 |
+
return $this->screen_params['form_id'];
|
131 |
+
}
|
132 |
+
|
133 |
+
/**
|
134 |
+
* Custom scripts that only used on submissions page
|
135 |
+
*
|
136 |
+
* @since 1.18.0
|
137 |
+
*/
|
138 |
+
public function enqueue_reports_scripts() {
|
139 |
+
|
140 |
+
$this->forminator_daterange_script();
|
141 |
+
|
142 |
+
$this->forminator_report_chart_script();
|
143 |
+
|
144 |
+
add_filter( 'forminator_l10n', array( $this, 'add_l10n' ) );
|
145 |
+
|
146 |
+
}
|
147 |
+
|
148 |
+
/**
|
149 |
+
* Daterange script
|
150 |
+
*/
|
151 |
+
public function forminator_daterange_script() {
|
152 |
+
wp_enqueue_script(
|
153 |
+
'forminator-reports-datepicker-range',
|
154 |
+
forminator_plugin_url() . 'assets/js/library/daterangepicker.min.js',
|
155 |
+
array( 'moment' ),
|
156 |
+
'3.0.3',
|
157 |
+
true
|
158 |
+
);
|
159 |
+
|
160 |
+
$daterangepicker_ranges
|
161 |
+
= sprintf(
|
162 |
+
"
|
163 |
+
var forminator_reports_datepicker_ranges = {
|
164 |
+
'%s': [moment(), moment()],
|
165 |
+
'%s': [moment().subtract(6,'days'), moment()],
|
166 |
+
'%s': [moment().startOf('month'), moment().endOf('month')],
|
167 |
+
'%s': [moment().subtract(29,'days'), moment()],
|
168 |
+
'%s': [moment().startOf('year'), moment().endOf('year')],
|
169 |
+
};",
|
170 |
+
__( 'Today', 'forminator' ),
|
171 |
+
__( 'Last 7 Days', 'forminator' ),
|
172 |
+
__( 'This Month', 'forminator' ),
|
173 |
+
__( 'Last 30 Days', 'forminator' ),
|
174 |
+
__( 'This Year', 'forminator' )
|
175 |
+
);
|
176 |
+
|
177 |
+
/**
|
178 |
+
* Filter ranges to be used on reports date range
|
179 |
+
*
|
180 |
+
* @param string $daterangepicker_ranges
|
181 |
+
*
|
182 |
+
* @since 1.18.0
|
183 |
+
*
|
184 |
+
*/
|
185 |
+
$daterangepicker_ranges = apply_filters( 'forminator_reports_datepicker_ranges', $daterangepicker_ranges );
|
186 |
+
|
187 |
+
wp_add_inline_script( 'forminator-reports-datepicker-range', $daterangepicker_ranges );
|
188 |
+
}
|
189 |
+
|
190 |
+
/**
|
191 |
+
* Chart script
|
192 |
+
*/
|
193 |
+
public function forminator_report_chart_script() {
|
194 |
+
$form_id = $this->get_current_form_id();
|
195 |
+
$chart_data = Forminator_Admin_Report_Page::get_instance()->forminator_report_chart_data( $form_id );
|
196 |
+
|
197 |
+
$chart_vars
|
198 |
+
= sprintf(
|
199 |
+
"
|
200 |
+
var chart_label = '%s',
|
201 |
+
chart_form_id = %d,
|
202 |
+
monthDays = ['%s'],
|
203 |
+
submissions = [%s],
|
204 |
+
canvas_spacing = %s;",
|
205 |
+
__( 'Submissions', 'forminator' ),
|
206 |
+
$form_id,
|
207 |
+
wp_kses_post( implode( "', '", $chart_data['monthDays'] ) ),
|
208 |
+
esc_html( implode( ', ', $chart_data['submissions'] ) ),
|
209 |
+
$chart_data['canvas_spacing']
|
210 |
+
);
|
211 |
+
|
212 |
+
/**
|
213 |
+
* Filter chart vars to be used on reports
|
214 |
+
*
|
215 |
+
* @param string $chart_vars
|
216 |
+
*
|
217 |
+
* @since 1.18.0
|
218 |
+
*
|
219 |
+
*/
|
220 |
+
$chart_vars = apply_filters( 'forminator_reports_chart', $chart_vars );
|
221 |
+
|
222 |
+
wp_add_inline_script( 'forminator-chartjs', $chart_vars );
|
223 |
+
|
224 |
+
return $chart_vars;
|
225 |
+
|
226 |
+
}
|
227 |
+
|
228 |
+
/**
|
229 |
+
* Hook into forminator_l10n
|
230 |
+
*
|
231 |
+
* Allow to modify `daterangepicker` locale
|
232 |
+
*
|
233 |
+
* @param $l10n
|
234 |
+
*
|
235 |
+
* @return mixed
|
236 |
+
*/
|
237 |
+
public function add_l10n( $l10n ) {
|
238 |
+
$daterangepicker_lang = array(
|
239 |
+
'daysOfWeek' => Forminator_Admin_L10n::get_short_days_names(),
|
240 |
+
'monthNames' => Forminator_Admin_L10n::get_months_names(),
|
241 |
+
);
|
242 |
+
|
243 |
+
/**
|
244 |
+
* Filter daterangepicker locale to be used
|
245 |
+
*
|
246 |
+
* @param array $daterangepicker_lang
|
247 |
+
*
|
248 |
+
* @since 1.18.0
|
249 |
+
*
|
250 |
+
*/
|
251 |
+
$daterangepicker_lang = apply_filters( 'forminator_l10n_daterangepicker', $daterangepicker_lang );
|
252 |
+
$l10n['daterangepicker'] = $daterangepicker_lang;
|
253 |
+
|
254 |
+
return $l10n;
|
255 |
+
}
|
256 |
+
|
257 |
+
/**
|
258 |
+
* Override scripts to be loaded
|
259 |
+
*
|
260 |
+
* @param $hook
|
261 |
+
*
|
262 |
+
*/
|
263 |
+
public function enqueue_scripts( $hook ) {
|
264 |
+
parent::enqueue_scripts( $hook );
|
265 |
+
|
266 |
+
wp_enqueue_script(
|
267 |
+
'forminator-chartjs',
|
268 |
+
forminator_plugin_url() . 'assets/js/front/Chart.min.js',
|
269 |
+
array( 'jquery' ),
|
270 |
+
'2.8.0',
|
271 |
+
false
|
272 |
+
);
|
273 |
+
$save_global_color = "if (typeof window !== 'undefined' && typeof window.Color !== 'undefined') {window.notChartColor = window.Color;}";
|
274 |
+
$restore_global_color = "if (typeof window !== 'undefined' && typeof window.notChartColor !== 'undefined') {window.Color = window.notChartColor;}";
|
275 |
+
wp_add_inline_script( 'forminator-chartjs', $save_global_color, 'before' );
|
276 |
+
wp_add_inline_script( 'forminator-chart', $save_global_color, 'before' );
|
277 |
+
wp_add_inline_script( 'forminator-chartjs', $restore_global_color );
|
278 |
+
wp_add_inline_script( 'forminator-chart', $restore_global_color );
|
279 |
+
|
280 |
+
// LOAD: Datalabels plugin for ChartJS.
|
281 |
+
wp_enqueue_script(
|
282 |
+
'chartjs-plugin-datalabels',
|
283 |
+
forminator_plugin_url() . 'assets/js/front/chartjs-plugin-datalabels.min.js',
|
284 |
+
array( 'jquery' ),
|
285 |
+
'0.6.0',
|
286 |
+
false
|
287 |
+
);
|
288 |
+
|
289 |
+
$this->forminator_report_chart_script();
|
290 |
+
}
|
291 |
+
}
|
admin/pages/settings-page.php
CHANGED
@@ -161,6 +161,10 @@ class Forminator_Settings_Page extends Forminator_Admin_Page {
|
|
161 |
'form-border-width',
|
162 |
'form-border-style',
|
163 |
|
|
|
|
|
|
|
|
|
164 |
'fields-style',
|
165 |
|
166 |
'use-custom-css',
|
161 |
'form-border-width',
|
162 |
'form-border-style',
|
163 |
|
164 |
+
'field-border',
|
165 |
+
'field-border-radius',
|
166 |
+
'field-border-width',
|
167 |
+
|
168 |
'fields-style',
|
169 |
|
170 |
'use-custom-css',
|
admin/views/addons/action-button.php
CHANGED
@@ -25,9 +25,6 @@ if ( isset( $compound ) && true === is_bool( $compound ) ) {
|
|
25 |
echo esc_attr( $data ) . '="' . esc_attr( $val ) . '"';
|
26 |
}
|
27 |
}
|
28 |
-
if ( isset( $disabled ) && $disabled ) {
|
29 |
-
echo 'disabled="' . esc_attr( $disabled ) . '"';
|
30 |
-
}
|
31 |
?>
|
32 |
>
|
33 |
|
@@ -60,9 +57,6 @@ if ( isset( $compound ) && true === is_bool( $compound ) ) {
|
|
60 |
echo esc_attr( $data ) . '="' . esc_attr( $val ) . '"';
|
61 |
}
|
62 |
}
|
63 |
-
if ( isset( $disabled ) && $disabled ) {
|
64 |
-
echo 'disabled="' . esc_attr( $disabled ) . '"';
|
65 |
-
}
|
66 |
?>
|
67 |
>
|
68 |
|
25 |
echo esc_attr( $data ) . '="' . esc_attr( $val ) . '"';
|
26 |
}
|
27 |
}
|
|
|
|
|
|
|
28 |
?>
|
29 |
>
|
30 |
|
57 |
echo esc_attr( $data ) . '="' . esc_attr( $val ) . '"';
|
58 |
}
|
59 |
}
|
|
|
|
|
|
|
60 |
?>
|
61 |
>
|
62 |
|
admin/views/addons/addons-list.php
CHANGED
@@ -224,8 +224,8 @@ if ( FORMINATOR_PRO ) {
|
|
224 |
'data-modal-title' => esc_html__( 'Deactivate Add-ons', 'forminator' ),
|
225 |
'data-modal-content' => sprintf( __( 'You are trying to deactivate <strong>%s</strong> which is being used by the following forms. This can break the functionality of the forms. Are you sure you want to proceed?', 'forminator' ), esc_html( $addons->name ) ),
|
226 |
'data-addon-slug' => esc_attr( $addons_slug ),
|
|
|
227 |
),
|
228 |
-
'disabled' => ( $is_network_active ),
|
229 |
)
|
230 |
);
|
231 |
} else {
|
224 |
'data-modal-title' => esc_html__( 'Deactivate Add-ons', 'forminator' ),
|
225 |
'data-modal-content' => sprintf( __( 'You are trying to deactivate <strong>%s</strong> which is being used by the following forms. This can break the functionality of the forms. Are you sure you want to proceed?', 'forminator' ), esc_html( $addons->name ) ),
|
226 |
'data-addon-slug' => esc_attr( $addons_slug ),
|
227 |
+
'data-is_network' => $is_network_active,
|
228 |
),
|
|
|
229 |
)
|
230 |
);
|
231 |
} else {
|
admin/views/common/entries/content.php
CHANGED
@@ -13,7 +13,7 @@ if ( $count > 0 ) {
|
|
13 |
update_option( 'forminator_submissions_form_id', $form_id );
|
14 |
}
|
15 |
|
16 |
-
$form_type = get_option( 'forminator_submissions_form_type' );
|
17 |
$form_id = get_option( 'forminator_submissions_form_id' );
|
18 |
?>
|
19 |
|
13 |
update_option( 'forminator_submissions_form_id', $form_id );
|
14 |
}
|
15 |
|
16 |
+
$form_type = get_option( 'forminator_submissions_form_type', 'forminator_forms' );
|
17 |
$form_id = get_option( 'forminator_submissions_form_id' );
|
18 |
?>
|
19 |
|
admin/views/common/popup/import.php
CHANGED
@@ -22,6 +22,26 @@ $nonce = wp_create_nonce( 'forminator_save_import_' . $slug );
|
|
22 |
|
23 |
</div>
|
24 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
25 |
</div>
|
26 |
|
27 |
<div class="sui-box-footer">
|
22 |
|
23 |
</div>
|
24 |
|
25 |
+
<div class="sui-form-field">
|
26 |
+
|
27 |
+
<label for="change-recipients" class="sui-checkbox">
|
28 |
+
|
29 |
+
<input
|
30 |
+
type="checkbox"
|
31 |
+
id="change-recipients"
|
32 |
+
aria-labelledby="change-recipients-label"
|
33 |
+
name="change_recipients"
|
34 |
+
value="checked"
|
35 |
+
/>
|
36 |
+
|
37 |
+
<span aria-hidden="true"></span>
|
38 |
+
|
39 |
+
<span id="change-recipients-label"><?php esc_html_e( 'Change all recipients in this form to current user email.', 'forminator' ); ?></span>
|
40 |
+
|
41 |
+
</label>
|
42 |
+
|
43 |
+
</div>
|
44 |
+
|
45 |
</div>
|
46 |
|
47 |
<div class="sui-box-footer">
|
admin/views/common/reports/chart-content.php
ADDED
@@ -0,0 +1,58 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
if ( empty( $args['reports'] ) ) {
|
3 |
+
return;
|
4 |
+
}
|
5 |
+
$reports = $args['reports']; ?>
|
6 |
+
<div class="sui-box">
|
7 |
+
<div class="sui-accordion sui-accordion-block">
|
8 |
+
<div class="sui-accordion-item sui-accordion-item--open">
|
9 |
+
<div class="sui-accordion-item-header sui-accordion-item-action">
|
10 |
+
<div class="sui-accordion-item-title">
|
11 |
+
<?php esc_html_e( 'Overview', 'forminator' ); ?>
|
12 |
+
<div class="sui-accordion-item-subtitle forminator-chart-date"><?php printf( __( 'Showing report from %s - %s', 'forminator' ),
|
13 |
+
date( 'F d, Y', strtotime( $args['start_date'] ) ),
|
14 |
+
date( 'F d, Y', strtotime( $args['end_date'] ) )
|
15 |
+
); ?></div>
|
16 |
+
</div>
|
17 |
+
</div>
|
18 |
+
<div class="sui-accordion-item-body forminator-reports-chart">
|
19 |
+
<ul class="sui-accordion-item-data">
|
20 |
+
<li data-col="large">
|
21 |
+
<strong><?php esc_html_e( 'Last Submission', 'forminator' ); ?></strong>
|
22 |
+
<span><?php echo esc_html( $args['last_entry_time'] ); ?></span>
|
23 |
+
</li>
|
24 |
+
<li data-col="small" class="chart-views">
|
25 |
+
<strong><?php esc_html_e( 'Views', 'forminator' ); ?></strong>
|
26 |
+
<span><?php echo intval( $reports['views']['selected'] ); ?></span>
|
27 |
+
</li>
|
28 |
+
<li data-col="small" class="chart-entries">
|
29 |
+
<strong><?php esc_html_e( 'Submissions', 'forminator' ); ?></strong>
|
30 |
+
<span><?php echo intval( $reports['entries']['selected'] ); ?></span>
|
31 |
+
</li>
|
32 |
+
<li data-col="small" class="chart-conversion">
|
33 |
+
<strong><?php esc_html_e( 'Conversion Rate', 'forminator' ); ?></strong>
|
34 |
+
<span><?php echo esc_html( $reports['conversion']['selected'] ); ?></span>
|
35 |
+
</li>
|
36 |
+
</ul>
|
37 |
+
<div class="sui-chartjs sui-chartjs-animated sui-chartjs-loaded forminator-stats-chart"
|
38 |
+
data-chart-id="<?php echo esc_attr( $args['form_id'] ); ?>">
|
39 |
+
<div class="sui-chartjs-message sui-chartjs-message--empty"
|
40 |
+
style="<?php echo 0 < $reports['views'] ? 'display:none;' : ''; ?>">
|
41 |
+
<p><i class="sui-icon-info"
|
42 |
+
aria-hidden="true"></i>
|
43 |
+
<?php esc_html_e( 'No data to display! Please check later.', 'forminator' ); ?>
|
44 |
+
</p>
|
45 |
+
</div>
|
46 |
+
<div class="sui-chartjs-message sui-chartjs-message--loading">
|
47 |
+
<p><span class="sui-icon-loader sui-loading" aria-hidden="true"></span>
|
48 |
+
<?php esc_html_e( 'Loading data...', 'forminator'); ?>
|
49 |
+
</p>
|
50 |
+
</div>
|
51 |
+
<div class="sui-chartjs-canvas">
|
52 |
+
<canvas id="forminator-module-<?php echo esc_attr( $args['form_id'] ); ?>-stats"></canvas>
|
53 |
+
</div>
|
54 |
+
</div>
|
55 |
+
</div>
|
56 |
+
</div>
|
57 |
+
</div>
|
58 |
+
</div>
|
admin/views/common/reports/content-none.php
ADDED
@@ -0,0 +1,17 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<div class="sui-box sui-message">
|
2 |
+
|
3 |
+
<?php if ( forminator_is_show_branding() ) : ?>
|
4 |
+
<img src="<?php echo esc_url( forminator_plugin_url() . 'assets/img/' . $args['image'] ); ?>"
|
5 |
+
srcset="<?php echo esc_url( forminator_plugin_url() . 'assets/img/' . $args['image'] ); ?> 1x,
|
6 |
+
<?php echo esc_url( forminator_plugin_url() . 'assets/img/' . $args['image_x2'] ); ?> 2x"
|
7 |
+
alt="<?php esc_html_e( 'Forminator', 'forminator' ); ?>"
|
8 |
+
class="sui-image"
|
9 |
+
aria-hidden="true"/>
|
10 |
+
<?php endif; ?>
|
11 |
+
|
12 |
+
<div class="sui-message-content">
|
13 |
+
<h2><?php echo esc_html( $args['title'] ); ?></h2>
|
14 |
+
<p><?php echo esc_html( $args['description'] ); ?></p>
|
15 |
+
</div>
|
16 |
+
|
17 |
+
</div>
|
admin/views/common/reports/content.php
ADDED
@@ -0,0 +1,27 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
$section = Forminator_Core::sanitize_text_field( 'section', 'dashboard' );
|
3 |
+
?>
|
4 |
+
<div id="forminator-reports" class="sui-row-with-sidenav">
|
5 |
+
<div class="sui-sidenav">
|
6 |
+
<ul class="sui-vertical-tabs sui-sidenav-hide-md">
|
7 |
+
<li class="sui-vertical-tab <?php echo esc_attr( 'dashboard' === $section ? 'current' : '' ); ?>">
|
8 |
+
<a href="#" data-nav="dashboard"><?php esc_html_e( 'Dashboard', 'forminator' ); ?></a>
|
9 |
+
</li>
|
10 |
+
<li class="sui-vertical-tab <?php echo esc_attr( 'notification' === $section ? 'current' : '' ); ?>">
|
11 |
+
<a data-nav="notification" disabled>
|
12 |
+
<?php esc_html_e( 'Notification', 'forminator' ); ?>
|
13 |
+
<span class="sui-tag sui-tag-blue sui-tag-sm sui-tag-uppercase">Coming Soon</span>
|
14 |
+
</a>
|
15 |
+
</li>
|
16 |
+
</ul>
|
17 |
+
<div class="sui-sidenav-settings">
|
18 |
+
<div class="sui-form-field sui-sidenav-hide-lg">
|
19 |
+
<label class="sui-label"><?php esc_html_e( 'Navigate', 'forminator' ); ?></label>
|
20 |
+
<select id="forminator-sidenav" class="sui-select sui-mobile-nav">
|
21 |
+
<option value="dashboard"><?php esc_html_e( 'Dashboard', 'forminator' ); ?></option>
|
22 |
+
</select>
|
23 |
+
</div>
|
24 |
+
</div>
|
25 |
+
</div>
|
26 |
+
<?php $this->template( 'common/reports/tab-dashboard' ); ?>
|
27 |
+
</div>
|
admin/views/common/reports/header.php
ADDED
@@ -0,0 +1,11 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<header class="sui-header">
|
2 |
+
<h1 class="sui-header-title"><?php esc_html_e( 'Reports', 'forminator' ); ?></h1>
|
3 |
+
|
4 |
+
<div class="sui-actions-right">
|
5 |
+
<?php if ( forminator_is_show_documentation_link() ) : ?>
|
6 |
+
<a href="https://wpmudev.com/docs/wpmu-dev-plugins/forminator/#reports" target="_blank" class="sui-button sui-button-ghost">
|
7 |
+
<i class="sui-icon-academy"></i> <?php esc_html_e( 'View Documentation', 'forminator' ); ?>
|
8 |
+
</a>
|
9 |
+
<?php endif; ?>
|
10 |
+
</div>
|
11 |
+
</header>
|
admin/views/common/reports/integration-report.php
ADDED
@@ -0,0 +1,79 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<div class="sui-box">
|
2 |
+
<div class="sui-box__message sui-box__message--loading">
|
3 |
+
<p><span class="sui-icon-loader sui-loading" aria-hidden="true"></span>
|
4 |
+
<?php esc_html_e( 'Fetching latest data...', 'forminator'); ?>
|
5 |
+
</p>
|
6 |
+
</div>
|
7 |
+
|
8 |
+
<div class="sui-box-header">
|
9 |
+
<h3 class="sui-box-title">
|
10 |
+
<i class="sui-icon-sitemap" aria-hidden="true"></i>
|
11 |
+
<?php esc_html_e( 'Apps', 'forminator' ); ?>
|
12 |
+
</h3>
|
13 |
+
<div class="sui-actions-right">
|
14 |
+
<a href="<?php echo esc_html( $app_link ); ?>"
|
15 |
+
target="_blank">
|
16 |
+
<?php esc_html_e( 'Manage Apps', 'forminator' ); ?>
|
17 |
+
<span class="sui-icon-arrow-right sui-sm" aria-hidden="true"></span>
|
18 |
+
</a>
|
19 |
+
</div>
|
20 |
+
</div>
|
21 |
+
|
22 |
+
<div class="sui-box-body">
|
23 |
+
<p><?php esc_html_e( 'Data sent to third party apps over the selected period.', 'forminator' ); ?></p>
|
24 |
+
<?php if ( empty( $integrations ) ) { ?>
|
25 |
+
<div class="sui-notice">
|
26 |
+
<div class="sui-notice-content">
|
27 |
+
<div class="sui-notice-message">
|
28 |
+
<i aria-hidden="true" class="sui-notice-icon sui-icon-info sui-md"></i>
|
29 |
+
<p><?php printf(
|
30 |
+
__( 'No third-party app connected. %1$sConnect a third-party app%2$s to view data in this report.', 'forminator' ),
|
31 |
+
'<a href="' . admin_url( 'admin.php?page=forminator-integrations' ) . '" target=_blank>',
|
32 |
+
'</a>' ); ?>
|
33 |
+
</p>
|
34 |
+
</div>
|
35 |
+
</div>
|
36 |
+
</div>
|
37 |
+
<?php } ?>
|
38 |
+
</div>
|
39 |
+
<?php if ( ! empty( $integrations ) ) { ?>
|
40 |
+
<table class="sui-table sui-table-flushed fui-table--apps">
|
41 |
+
<thead>
|
42 |
+
<tr>
|
43 |
+
<th><?php esc_html_e( 'Apps', 'forminator' ); ?></th>
|
44 |
+
<th colspan="1" width="25%"><?php esc_html_e( 'Data', 'forminator' ); ?></th>
|
45 |
+
<th colspan="1" width="25%"><?php esc_html_e( 'Previous', 'forminator' ); ?></th>
|
46 |
+
</tr>
|
47 |
+
</thead>
|
48 |
+
|
49 |
+
<tbody>
|
50 |
+
<?php foreach ( $integrations as $key => $integration ) { ?>
|
51 |
+
<tr>
|
52 |
+
<td class="sui-table-item-title">
|
53 |
+
<div class="fui-app--wrapper">
|
54 |
+
<img src="<?php echo esc_html( $integration['image'] ); ?>"
|
55 |
+
alt="<?php echo esc_html( $integration['short_title'] ); ?>" class="sui-image"
|
56 |
+
aria-hidden="true">
|
57 |
+
<span><?php echo esc_html( $integration['title'] ); ?></span>
|
58 |
+
</div>
|
59 |
+
</td>
|
60 |
+
<td colspan="1" width="25%">
|
61 |
+
<strong class="selected-<?php echo esc_html( $key ); ?>"><?php echo absint( $integration['selected'] ); ?></strong>
|
62 |
+
<?php $arrow_color = 'high' === $integration['difference'] ? 'green' : 'red';
|
63 |
+
$arrow_icon = 'high' === $integration['difference'] ? 'up' : 'down'; ?>
|
64 |
+
<span class="fui-trend fui-trend-<?php echo esc_html( $arrow_color ); ?> increment-<?php echo esc_attr( $key ); ?>">
|
65 |
+
<?php if ( $integration['increment'] > 0 ) { ?>
|
66 |
+
<i class="sui-icon-arrow-<?php echo esc_html( $arrow_icon ); ?> sui-sm" aria-hidden="true"></i>
|
67 |
+
<?php echo esc_html( $integration['increment'] );
|
68 |
+
} ?>
|
69 |
+
</span>
|
70 |
+
</td>
|
71 |
+
<td colspan="1" width="25%" class="previous-<?php echo esc_html( $key ); ?>">
|
72 |
+
<?php echo absint( $integration['previous'] ); ?>
|
73 |
+
</td>
|
74 |
+
</tr>
|
75 |
+
<?php } ?>
|
76 |
+
</tbody>
|
77 |
+
</table>
|
78 |
+
<?php } ?>
|
79 |
+
</div>
|
admin/views/common/reports/report-content.php
ADDED
@@ -0,0 +1,100 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
if ( empty( $args['reports'] ) ) {
|
3 |
+
return;
|
4 |
+
}
|
5 |
+
$reports = $args['reports'];
|
6 |
+
$report_data = Forminator_Admin_Report_Page::get_instance()->forminator_report_array( $reports, $args['form_id'] );
|
7 |
+
?>
|
8 |
+
<div class="sui-tab-content">
|
9 |
+
<?php $chart_data = array(
|
10 |
+
'form_id' => $args['form_id'],
|
11 |
+
'last_entry_time' => $reports['last_entry_time'],
|
12 |
+
'start_date' => $reports['start_date'],
|
13 |
+
'end_date' => $reports['end_date'],
|
14 |
+
'reports' => $report_data
|
15 |
+
);
|
16 |
+
$this->template( 'common/reports/chart-content', $chart_data ); ?>
|
17 |
+
<div class="sui-row forminator-reports-box">
|
18 |
+
<div class="sui-col-md-6">
|
19 |
+
<?php
|
20 |
+
// Views box
|
21 |
+
Forminator_Admin_Addons_page::get_instance()->render_template(
|
22 |
+
'admin/views/common/reports/single-report',
|
23 |
+
array(
|
24 |
+
'title' => esc_html__( 'Views', 'forminator' ),
|
25 |
+
'description' => esc_html__( 'Views for the selected period.', 'forminator' ),
|
26 |
+
'data_class' => 'views',
|
27 |
+
'icon' => 'sui-icon-eye',
|
28 |
+
'attrs' => $report_data['views'],
|
29 |
+
)
|
30 |
+
);
|
31 |
+
|
32 |
+
// Conversion rate box
|
33 |
+
Forminator_Admin_Addons_page::get_instance()->render_template(
|
34 |
+
'admin/views/common/reports/single-report',
|
35 |
+
array(
|
36 |
+
'title' => esc_html__( 'Conversion Rate', 'forminator' ),
|
37 |
+
'description' => esc_html__( 'Conversion rate for the selected period.', 'forminator' ),
|
38 |
+
'icon' => 'sui-icon-conversion',
|
39 |
+
'data_class' => 'conversion',
|
40 |
+
'attrs' => $report_data['conversion'],
|
41 |
+
)
|
42 |
+
);
|
43 |
+
|
44 |
+
// Payment box
|
45 |
+
if ( 'forminator_forms' === $args['form_type'] ) {
|
46 |
+
Forminator_Admin_Addons_page::get_instance()->render_template(
|
47 |
+
'admin/views/common/reports/single-report',
|
48 |
+
array(
|
49 |
+
'title' => esc_html__( 'Payments', 'forminator' ),
|
50 |
+
'description' => esc_html__( 'Payments collected over the selected period.', 'forminator' ),
|
51 |
+
'icon' => 'sui-icon-payment',
|
52 |
+
'data_class' => 'payment',
|
53 |
+
'attrs' => $report_data['payment'],
|
54 |
+
'has_payment' => Forminator_Admin_Report_Page::has_live_payments( $args['form_id'] ),
|
55 |
+
)
|
56 |
+
);
|
57 |
+
}
|
58 |
+
// Submission box
|
59 |
+
if ( isset( $report_data['leads'] ) && ! empty( $report_data['leads'] ) ) {
|
60 |
+
Forminator_Admin_Addons_page::get_instance()->render_template(
|
61 |
+
'admin/views/common/reports/single-report',
|
62 |
+
array(
|
63 |
+
'title' => esc_html__( 'Leads', 'forminator' ),
|
64 |
+
'description' => esc_html__( 'Leads generated within the selected period.', 'forminator' ),
|
65 |
+
'icon' => 'sui-icon-clipboard-notes',
|
66 |
+
'data_class' => 'leads',
|
67 |
+
'attrs' => $report_data['leads'],
|
68 |
+
)
|
69 |
+
);
|
70 |
+
} ?>
|
71 |
+
</div>
|
72 |
+
<div class="sui-col-md-6">
|
73 |
+
<?php
|
74 |
+
// Submission box
|
75 |
+
Forminator_Admin_Addons_page::get_instance()->render_template(
|
76 |
+
'admin/views/common/reports/single-report',
|
77 |
+
array(
|
78 |
+
'title' => esc_html__( 'Submissions', 'forminator' ),
|
79 |
+
'description' => esc_html__( 'Submissions for the selected period.', 'forminator' ),
|
80 |
+
'icon' => 'sui-icon-clipboard-notes',
|
81 |
+
'data_class' => 'entries',
|
82 |
+
'title_text' => esc_html__( 'View submissions', 'forminator' ),
|
83 |
+
'title_link' => esc_url( admin_url( 'admin.php?page=forminator-entries&form_type=' . forminator_get_prefix( $args['form_type'], 'post_type' ) . '&form_id=' . $args['form_id'] ) ),
|
84 |
+
'attrs' => $report_data['entries'],
|
85 |
+
)
|
86 |
+
);
|
87 |
+
|
88 |
+
// Integration box
|
89 |
+
Forminator_Admin_Addons_page::get_instance()->render_template(
|
90 |
+
'admin/views/common/reports/integration-report',
|
91 |
+
array(
|
92 |
+
'form_id' => $args['form_id'],
|
93 |
+
'integrations' => ! empty( $report_data['integration'] ) ? $report_data['integration'] : array(),
|
94 |
+
'app_link' => Forminator_Admin_Report_Page::get_instance()->get_app_link_module_id( $args['form_id'], $args['form_type'] )
|
95 |
+
)
|
96 |
+
);
|
97 |
+
?>
|
98 |
+
</div>
|
99 |
+
</div>
|
100 |
+
</div>
|
admin/views/common/reports/single-report.php
ADDED
@@ -0,0 +1,104 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<div class="sui-box">
|
2 |
+
<div class="sui-box__message sui-box__message--loading">
|
3 |
+
<p><span class="sui-icon-loader sui-loading" aria-hidden="true"></span>
|
4 |
+
<?php esc_html_e( 'Fetching latest data...', 'forminator' );?>
|
5 |
+
</p>
|
6 |
+
</div>
|
7 |
+
|
8 |
+
<div class="sui-box-header">
|
9 |
+
<h3 class="sui-box-title">
|
10 |
+
<i class="<?php echo esc_html( $icon ); ?>" aria-hidden="true"></i>
|
11 |
+
<?php echo esc_html( $title ); ?>
|
12 |
+
</h3>
|
13 |
+
<?php if ( isset( $title_link ) ) { ?>
|
14 |
+
<div class="sui-actions-right">
|
15 |
+
<a href="<?php echo esc_url( $title_link ); ?>" target="_blank"
|
16 |
+
class="sui-link-blue"><?php echo esc_html( $title_text ); ?>
|
17 |
+
<span class="sui-icon-arrow-right sui-sm" aria-hidden="true"></span>
|
18 |
+
</a>
|
19 |
+
</div>
|
20 |
+
<?php } ?>
|
21 |
+
</div>
|
22 |
+
|
23 |
+
<div class="sui-box-body">
|
24 |
+
<p><?php echo esc_html( $description ); ?></p>
|
25 |
+
<?php if ( isset( $has_payment ) && ! $has_payment ) { ?>
|
26 |
+
<div class="sui-notice">
|
27 |
+
<div class="sui-notice-content">
|
28 |
+
<div class="sui-notice-message">
|
29 |
+
<i aria-hidden="true" class="sui-notice-icon sui-icon-info sui-md"></i>
|
30 |
+
<p><?php esc_html_e( 'No payment field found. Add a PayPal or a Stripe field to your form to start collecting payments.', 'forminator' ); ?>
|
31 |
+
</p>
|
32 |
+
</div>
|
33 |
+
</div>
|
34 |
+
</div>
|
35 |
+
<?php } ?>
|
36 |
+
</div>
|
37 |
+
<?php if ( ! isset( $has_payment ) || ( isset( $has_payment ) && $has_payment ) ) { ?>
|
38 |
+
<div class="sui-flushed">
|
39 |
+
<table class="sui-table sui-table-flushed report-<?php echo esc_attr( $data_class ); ?>">
|
40 |
+
<tbody>
|
41 |
+
<tr>
|
42 |
+
<td>
|
43 |
+
<div class="fui-table-title">
|
44 |
+
<?php echo esc_html( $title ); ?>
|
45 |
+
</div>
|
46 |
+
<div class="fui-table-content">
|
47 |
+
<san class="selected-<?php echo esc_attr( $data_class ); ?>">
|
48 |
+
<?php echo esc_html( $attrs['selected'] ); ?>
|
49 |
+
</san>
|
50 |
+
<?php
|
51 |
+
$arrow_color = 'high' === $attrs['difference'] ? 'fui-trend-green' : 'fui-trend-red';
|
52 |
+
$arrow_icon = 'high' === $attrs['difference'] ? 'sui-icon-arrow-up' : 'sui-icon-arrow-down'; ?>
|
53 |
+
<span class="fui-trend <?php echo esc_html( $arrow_color ); ?> increment-<?php echo esc_attr( $data_class ); ?>">
|
54 |
+
<?php if ( $attrs['increment'] > 0 ) { ?>
|
55 |
+
<i class="<?php echo esc_html( $arrow_icon ); ?> sui-sm" aria-hidden="true"></i>
|
56 |
+
<?php echo esc_html( $attrs['increment'] );
|
57 |
+
} ?>
|
58 |
+
</span>
|
59 |
+
|
60 |
+
</div>
|
61 |
+
</td>
|
62 |
+
<td>
|
63 |
+
<div class="fui-table-title"><?php esc_html_e( 'previous period', '' ); ?>
|
64 |
+
<button class="sui-button-icon sui-tooltip sui-tooltip-top-center sui-tooltip-constrained sui-tooltip-top-right-mobile"
|
65 |
+
data-tooltip="<?php esc_html_e( 'Displays the statistics for the same previous period you selected.', 'forminator' ); ?>">
|
66 |
+
<span class="sui-icon-info" aria-hidden="true"></span>
|
67 |
+
</button>
|
68 |
+
</div>
|
69 |
+
<div class="fui-table-content previous-<?php echo esc_attr( $data_class ); ?>">
|
70 |
+
<?php echo esc_html( $attrs['previous'] ) ?>
|
71 |
+
</div>
|
72 |
+
</td>
|
73 |
+
</tr>
|
74 |
+
<?php if ( isset( $has_payment ) && $has_payment ) { ?>
|
75 |
+
<tr>
|
76 |
+
<td>
|
77 |
+
<div class="fui-table-title"><?php esc_html_e( 'stripe', 'forminator' ); ?></div>
|
78 |
+
<div class="fui-table-content stripe-report">
|
79 |
+
<?php echo esc_html( $attrs['stripe'] ); ?>
|
80 |
+
</div>
|
81 |
+
</td>
|
82 |
+
<td>
|
83 |
+
<div class="fui-table-title"><?php esc_html_e( 'paypal', 'forminator' ); ?></div>
|
84 |
+
<div class="fui-table-content paypal-report">
|
85 |
+
<?php echo esc_html( $attrs['paypal'] ); ?>
|
86 |
+
</div>
|
87 |
+
</td>
|
88 |
+
</tr>
|
89 |
+
<?php } ?>
|
90 |
+
</tbody>
|
91 |
+
</table>
|
92 |
+
</div>
|
93 |
+
<?php if ( isset( $attrs['average'] ) ) { ?>
|
94 |
+
<div class="sui-box-footer">
|
95 |
+
<strong><?php esc_html_e( 'Monthly average', 'forminator' ); ?></strong>
|
96 |
+
<div class="sui-actions-right">
|
97 |
+
<p class="average-<?php echo esc_attr( $data_class ); ?>">
|
98 |
+
<?php echo esc_html( $attrs['average'] ); ?>
|
99 |
+
</p>
|
100 |
+
</div>
|
101 |
+
</div>
|
102 |
+
<?php }
|
103 |
+
} ?>
|
104 |
+
</div>
|
admin/views/common/reports/tab-dashboard.php
ADDED
@@ -0,0 +1,84 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
$count = forminator_total_forms( 'publish' );
|
3 |
+
if ( $count > 0 ) {
|
4 |
+
$section = Forminator_Core::sanitize_text_field( 'section', 'dashboard' );
|
5 |
+
$nonce = wp_create_nonce( 'forminator_save_dashboard_settings' );
|
6 |
+
$form_id = filter_input( INPUT_GET, 'form_id', FILTER_VALIDATE_INT );
|
7 |
+
$form_type = Forminator_Core::sanitize_text_field( 'form_type' );
|
8 |
+
if ( empty( $form_type ) ) {
|
9 |
+
$form_type = 'forminator_forms';
|
10 |
+
}
|
11 |
+
$reports = Forminator_Admin_Report_Page::get_instance()->forminator_report_data( $form_id, $form_type );
|
12 |
+
?>
|
13 |
+
<div>
|
14 |
+
<div class="sui-box sui-box-sticky" data-nav="dashboard"
|
15 |
+
style="<?php echo esc_attr( 'dashboard' !== $section ? 'display: none;' : '' ); ?>">
|
16 |
+
<div class="fui-entries-bar">
|
17 |
+
<div class="fui-bar-selectors">
|
18 |
+
<form method="get" name="bulk-action-form">
|
19 |
+
<input type="hidden" name="page" value="forminator-reports"/>
|
20 |
+
<select
|
21 |
+
name="form_type"
|
22 |
+
onchange="submit()"
|
23 |
+
class="sui-select sui-select-sm fui-bar-selectors__module"
|
24 |
+
data-placeholder="<?php esc_html_e( 'Type', 'forminator' ); ?>"
|
25 |
+
data-search="false"
|
26 |
+
>
|
27 |
+
<option></option>
|
28 |
+
<?php foreach ( $this->get_form_types() as $post_type => $name ) { ?>
|
29 |
+
<option value="<?php echo esc_attr( $post_type ); ?>" <?php echo selected( $post_type, $form_type ); ?>><?php echo esc_html( $name ); ?></option>
|
30 |
+
<?php } ?>
|
31 |
+
</select>
|
32 |
+
<?php static::render_form_switcher( $form_type, $form_id ); ?>
|
33 |
+
<button class="sui-button sui-button-blue view-reports"
|
34 |
+
onclick="submit()"><?php esc_html_e( 'View Reports', 'forminator' ); ?></button>
|
35 |
+
</form>
|
36 |
+
</div>
|
37 |
+
|
38 |
+
<div class="sui-actions-right">
|
39 |
+
<div class="sui-form-field">
|
40 |
+
<label for="unique-id" id="unique-id--label"
|
41 |
+
class="sui-label"><?php esc_html_e( 'Date range', 'forminator' ); ?></label>
|
42 |
+
|
43 |
+
<div class="sui-control-with-icon">
|
44 |
+
<input type="text"
|
45 |
+
placeholder="<?php esc_html_e( 'Select date range', 'forminator' ); ?>"
|
46 |
+
id="forminator-forms-filter--by-date"
|
47 |
+
name="date_range"
|
48 |
+
autocomplete="off"
|
49 |
+
data-id="<?php echo intval( $form_id ); ?>"
|
50 |
+
data-nonce="<?php echo esc_attr( wp_create_nonce( 'forminator_filter_report_data' ) ); ?>"
|
51 |
+
class="sui-form-control forminator-reports-filter-date"/>
|
52 |
+
<span class="sui-icon-calendar" aria-hidden="true"></span>
|
53 |
+
</div>
|
54 |
+
</div>
|
55 |
+
</div>
|
56 |
+
</div>
|
57 |
+
</div>
|
58 |
+
<?php if ( ! empty( $form_id ) ) {
|
59 |
+
$report_args = array(
|
60 |
+
'form_id' => $form_id,
|
61 |
+
'form_type' => $form_type,
|
62 |
+
'reports' => $reports
|
63 |
+
);
|
64 |
+
$this->template( 'common/reports/report-content', $report_args );
|
65 |
+
} else {
|
66 |
+
$data_arg = array(
|
67 |
+
'title' => 'Almost there!',
|
68 |
+
'description' => esc_html__( 'Select a form, poll, or quiz to view its report.', 'forminator' ),
|
69 |
+
'image' => 'forminator-info.png',
|
70 |
+
'image_x2' => 'forminator-info@2x.png'
|
71 |
+
);
|
72 |
+
$this->template( 'common/reports/content-none', $data_arg );
|
73 |
+
} ?>
|
74 |
+
</div>
|
75 |
+
|
76 |
+
<?php } else {
|
77 |
+
$data_arg = array(
|
78 |
+
'title' => 'Oops! Nothing to show',
|
79 |
+
'description' => esc_html__( 'You haven\'t created any forms, polls, or quizzes yet. When you do, you\'ll be able to view their reports here.', 'forminator' ),
|
80 |
+
'image' => 'forminator-warning.png',
|
81 |
+
'image_x2' => 'forminator-warning@2x.png'
|
82 |
+
);
|
83 |
+
$this->template( 'common/reports/content-none', $data_arg );
|
84 |
+
} ?>
|
admin/views/custom-form/entries/content.php
CHANGED
@@ -388,7 +388,7 @@ if ( $this->total_entries() > 0 ) :
|
|
388 |
} elseif ( 'number' === $detail_item['type'] || 'currency' === $detail_item['type'] || ( 'calculation' === $detail_item['type'] && is_numeric( $detail_item['value'] ) ) ) {
|
389 |
$separator = isset( $detail_item['separator'] ) ? $detail_item['separator'] : '';
|
390 |
$point = isset( $detail_item['point'] ) ? $detail_item['point'] : '';
|
391 |
-
$precision = isset( $detail_item['precision'] ) ? $detail_item['precision'] :
|
392 |
?>
|
393 |
|
394 |
<span class="sui-description" data-inputmask="'alias': 'decimal','rightAlign': false, 'digitsOptional': false, 'groupSeparator': '<?php echo esc_attr( $separator ); ?>', 'radixPoint': '<?php echo esc_attr( $point ); ?>', 'digits': '<?php echo esc_attr( $precision ); ?>'"><?php echo wp_kses_post( $detail_item['value'] ); ?></span>
|
388 |
} elseif ( 'number' === $detail_item['type'] || 'currency' === $detail_item['type'] || ( 'calculation' === $detail_item['type'] && is_numeric( $detail_item['value'] ) ) ) {
|
389 |
$separator = isset( $detail_item['separator'] ) ? $detail_item['separator'] : '';
|
390 |
$point = isset( $detail_item['point'] ) ? $detail_item['point'] : '';
|
391 |
+
$precision = isset( $detail_item['precision'] ) ? $detail_item['precision'] : 2;
|
392 |
?>
|
393 |
|
394 |
<span class="sui-description" data-inputmask="'alias': 'decimal','rightAlign': false, 'digitsOptional': false, 'groupSeparator': '<?php echo esc_attr( $separator ); ?>', 'radixPoint': '<?php echo esc_attr( $point ); ?>', 'digits': '<?php echo esc_attr( $precision ); ?>'"><?php echo wp_kses_post( $detail_item['value'] ); ?></span>
|
admin/views/custom-form/popup/import-cf7.php
CHANGED
@@ -41,7 +41,7 @@ $image_empty2x = forminator_plugin_url() . 'assets/images/forminator-summary@2x.
|
|
41 |
|
42 |
<ol class="fui-dismiss-list">
|
43 |
<li><?php printf( esc_html__( "%1\$s1. Quiz field:%2\$s Forminator doesn't have a built-in quiz field, however, you can enable CAPTCHA and Honeypot protection on your imported forms.", 'forminator' ), '<strong>', '</strong>' ); ?></li>
|
44 |
-
<li><?php printf( esc_html__( "%1\$s2. ConstantContact:%2\$s Forminator doesn't integrate directly with ConstantContact. However, you can use %3\$
|
45 |
<li><?php printf( esc_html__( "%1\$s3. reCAPTCHA v3 integration:%2\$s At this stage, Forminator can't import your existing reCAPTCHA integration. You can set this up manually on your imported forms once they are transferred.", 'forminator' ), '<strong>', '</strong>' ); ?></li>
|
46 |
<li><?php printf( esc_html__( "%1\$s4. Additional settings:%2\$s Forminator doesn't support CF7’s additional form settings.", 'forminator' ), '<strong>', '</strong>' ); ?></li>
|
47 |
<li><?php printf( esc_html__( '%1$s5. Custom field IDs:%2$s Forminator creates a unique ID for each field, and the conditional logic relies on them. However, you can provide a custom CSS class for each field.', 'forminator' ), '<strong>', '</strong>' ); ?></li>
|
41 |
|
42 |
<ol class="fui-dismiss-list">
|
43 |
<li><?php printf( esc_html__( "%1\$s1. Quiz field:%2\$s Forminator doesn't have a built-in quiz field, however, you can enable CAPTCHA and Honeypot protection on your imported forms.", 'forminator' ), '<strong>', '</strong>' ); ?></li>
|
44 |
+
<li><?php printf( esc_html__( "%1\$s2. ConstantContact:%2\$s Forminator doesn't integrate directly with ConstantContact. However, you can use %3\$sWebhook integration%4\$s to send your leads to ConstantContact.", 'forminator' ), '<strong>', '</strong>', '<a href="https://wpmudev.com/blog/zapier-wordpress-form-integrations/" target="_blank">', '</a>' ); ?></li>
|
45 |
<li><?php printf( esc_html__( "%1\$s3. reCAPTCHA v3 integration:%2\$s At this stage, Forminator can't import your existing reCAPTCHA integration. You can set this up manually on your imported forms once they are transferred.", 'forminator' ), '<strong>', '</strong>' ); ?></li>
|
46 |
<li><?php printf( esc_html__( "%1\$s4. Additional settings:%2\$s Forminator doesn't support CF7’s additional form settings.", 'forminator' ), '<strong>', '</strong>' ); ?></li>
|
47 |
<li><?php printf( esc_html__( '%1$s5. Custom field IDs:%2$s Forminator creates a unique ID for each field, and the conditional logic relies on them. However, you can provide a custom CSS class for each field.', 'forminator' ), '<strong>', '</strong>' ); ?></li>
|
admin/views/dashboard/content.php
CHANGED
@@ -27,7 +27,7 @@
|
|
27 |
</div>
|
28 |
|
29 |
<?php
|
30 |
-
$notice_dismissed = get_option( '
|
31 |
$version_upgraded = get_option( 'forminator_version_upgraded', false );
|
32 |
|
33 |
if ( ! $notice_dismissed && $version_upgraded && forminator_is_show_documentation_link() && ! isset( $_GET['createnew'] ) ) {
|
27 |
</div>
|
28 |
|
29 |
<?php
|
30 |
+
$notice_dismissed = get_option( 'forminator_dismiss_feature_1180', false );
|
31 |
$version_upgraded = get_option( 'forminator_version_upgraded', false );
|
32 |
|
33 |
if ( ! $notice_dismissed && $version_upgraded && forminator_is_show_documentation_link() && ! isset( $_GET['createnew'] ) ) {
|
admin/views/dashboard/new-feature-notice.php
CHANGED
@@ -1,7 +1,7 @@
|
|
1 |
<?php
|
2 |
-
$
|
3 |
-
$banner_1x
|
4 |
-
$banner_2x
|
5 |
?>
|
6 |
|
7 |
<div class="sui-modal sui-modal-md">
|
@@ -15,7 +15,7 @@ $banner_2x = forminator_plugin_url() . 'assets/images/Feature_highlight_17@2x
|
|
15 |
aria-labelledby="forminator-new-feature__title"
|
16 |
>
|
17 |
|
18 |
-
<div class="sui-box forminator-feature-modal" data-prop="
|
19 |
|
20 |
<div class="sui-box-header sui-flatten sui-content-center">
|
21 |
|
@@ -29,36 +29,34 @@ $banner_2x = forminator_plugin_url() . 'assets/images/Feature_highlight_17@2x
|
|
29 |
|
30 |
<button class="sui-button-icon sui-button-white sui-button-float--right forminator-dismiss-new-feature" data-modal-close>
|
31 |
<span class="sui-icon-close sui-md" aria-hidden="true"></span>
|
32 |
-
<span class="sui-screen-reader-text"
|
33 |
</button>
|
34 |
|
35 |
-
<h3 class="sui-box-title sui-lg" style="overflow: initial; white-space: initial; text-overflow: initial;"><?php esc_html_e( '
|
36 |
|
37 |
-
<p class="sui-description"
|
|
|
|
|
|
|
38 |
|
39 |
</div>
|
40 |
|
41 |
-
|
42 |
|
43 |
-
<ul>
|
44 |
|
45 |
-
<li style="margin-bottom:
|
46 |
-
<
|
47 |
-
<p class="sui-description"><?php esc_html_e( '
|
48 |
-
</li>
|
49 |
-
|
50 |
-
<li>
|
51 |
-
<p class="sui-description" style="margin-bottom: 5px;"><strong><?php esc_html_e( 'Support for hCaptcha', 'forminator' ); ?></strong></p>
|
52 |
-
<p class="sui-description"><?php esc_html_e( 'In the latest release, you can choose between reCAPTCHA and hCaptcha to stop pesky robots from submitting form data.', 'forminator' ); ?></p>
|
53 |
</li>
|
54 |
|
55 |
</ul>
|
56 |
|
57 |
-
</div
|
58 |
|
59 |
<div class="sui-box-footer sui-flatten sui-content-center">
|
60 |
|
61 |
-
<button class="sui-button forminator-dismiss-new-feature" data-modal-close><?php esc_html_e( '
|
62 |
|
63 |
</div>
|
64 |
|
1 |
<?php
|
2 |
+
$url = add_query_arg( array( 'page' => 'forminator-reports' ) );
|
3 |
+
$banner_1x = forminator_plugin_url() . 'assets/images/new-feature-18.png';
|
4 |
+
$banner_2x = forminator_plugin_url() . 'assets/images/new-feature-18@2x.png';
|
5 |
?>
|
6 |
|
7 |
<div class="sui-modal sui-modal-md">
|
15 |
aria-labelledby="forminator-new-feature__title"
|
16 |
>
|
17 |
|
18 |
+
<div class="sui-box forminator-feature-modal" data-prop="forminator_dismiss_feature_1180" data-nonce="<?php echo esc_attr( wp_create_nonce( 'forminator_dismiss_notification' ) ); ?>">
|
19 |
|
20 |
<div class="sui-box-header sui-flatten sui-content-center">
|
21 |
|
29 |
|
30 |
<button class="sui-button-icon sui-button-white sui-button-float--right forminator-dismiss-new-feature" data-modal-close>
|
31 |
<span class="sui-icon-close sui-md" aria-hidden="true"></span>
|
32 |
+
<span class="sui-screen-reader-text"><?php esc_html_e( 'Close this dialog.', 'forminator' ); ?></span>
|
33 |
</button>
|
34 |
|
35 |
+
<h3 class="sui-box-title sui-lg" style="overflow: initial; white-space: initial; text-overflow: initial;"><?php esc_html_e( 'New! Reports and Automation Webhooks', 'forminator' ); ?></h3>
|
36 |
|
37 |
+
<p class="sui-description">
|
38 |
+
<?php esc_html_e( 'Want to track the performance of your forms, quizzes, and polls? We are happy to introduce Forminator\'s Reports feature! It lets you track the total number of views and submissions, conversion rates, collected payments, and data sent to third-party apps.', 'forminator' ); ?>
|
39 |
+
<a href="<?php echo esc_url( $url ); ?>" target="_blank"><?php esc_html_e( 'View reports.', 'forminator' ); ?></a>
|
40 |
+
</p>
|
41 |
|
42 |
</div>
|
43 |
|
44 |
+
<div class="sui-box-body sui-spacing-top--20">
|
45 |
|
46 |
+
<ul style="margin: 0 0 0 20px; list-style: disc;">
|
47 |
|
48 |
+
<li style="margin-bottom: 0;">
|
49 |
+
<h4 style="margin-bottom: 0;"><?php esc_html_e( 'Webhook integration', 'forminator' ); ?></h4>
|
50 |
+
<p class="sui-description" style="margin-left: -20px;"><?php esc_html_e( 'Now you can integrate automation tools into your forms, quizzes, and polls using webhooks. This allows you to send submission data to any automation tool that supports webhooks.', 'forminator' ); ?></p>
|
|
|
|
|
|
|
|
|
|
|
51 |
</li>
|
52 |
|
53 |
</ul>
|
54 |
|
55 |
+
</div>
|
56 |
|
57 |
<div class="sui-box-footer sui-flatten sui-content-center">
|
58 |
|
59 |
+
<button class="sui-button forminator-dismiss-new-feature" data-modal-close><?php esc_html_e( 'Got it', 'forminator' ); ?></button>
|
60 |
|
61 |
</div>
|
62 |
|
admin/views/dashboard/promote-free-plan.php
ADDED
@@ -0,0 +1,128 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
$banner_1x = forminator_plugin_url() . 'assets/images/promote-free-plan.png';
|
3 |
+
$banner_2x = forminator_plugin_url() . 'assets/images/promote-free-plan@2x.png';
|
4 |
+
?>
|
5 |
+
|
6 |
+
<div class="sui-modal sui-modal-lg">
|
7 |
+
|
8 |
+
<div
|
9 |
+
role="dialog"
|
10 |
+
id="forminator-promote-popup"
|
11 |
+
class="sui-modal-content"
|
12 |
+
aria-live="polite"
|
13 |
+
aria-modal="true"
|
14 |
+
aria-labelledby="forminator-promote-popup__title"
|
15 |
+
>
|
16 |
+
|
17 |
+
<div class="sui-box forminator-promote-modal">
|
18 |
+
|
19 |
+
<div class="sui-box-header sui-flatten sui-content-center">
|
20 |
+
|
21 |
+
<figure class="sui-box-banner" aria-hidden="true" style="margin-bottom: 30px;">
|
22 |
+
<img
|
23 |
+
src="<?php echo esc_url( $banner_1x ); ?>"
|
24 |
+
srcset="<?php echo esc_url( $banner_1x ); ?> 1x, <?php echo esc_url( $banner_2x ); ?> 2x"
|
25 |
+
alt=""
|
26 |
+
/>
|
27 |
+
</figure>
|
28 |
+
|
29 |
+
<button class="sui-button-icon sui-button-white sui-button-float--right" data-modal-close>
|
30 |
+
<span class="sui-icon-close sui-md" aria-hidden="true"></span>
|
31 |
+
<span class="sui-screen-reader-text"><?php esc_html_e( 'Close this dialog.', 'forminator' ); ?></span>
|
32 |
+
</button>
|
33 |
+
|
34 |
+
<h3 class="sui-box-title sui-lg" id="forminator-promote-popup__title" style="overflow: initial; white-space: initial; text-overflow: initial;"><?php esc_html_e( 'Claim your free WPMU DEV gift', 'forminator' ); ?></h3>
|
35 |
+
|
36 |
+
<p class="sui-description"><?php esc_html_e( 'Over 50K web developers use WPMU DEV for fast and convenient site management. Here’s what you get completely free:', 'forminator' ); ?></p>
|
37 |
+
|
38 |
+
</div>
|
39 |
+
|
40 |
+
<div class="sui-box-body" style="padding: 20px 60px 0">
|
41 |
+
|
42 |
+
<ul>
|
43 |
+
|
44 |
+
<li>
|
45 |
+
<span class="sui-icon-check sui-md" aria-hidden="true" style="padding-right: 10px;"></span>
|
46 |
+
<strong><?php esc_html_e( 'The Hub - effortlessly manage unlimited sites from one dashboard', 'forminator' ); ?></strong>
|
47 |
+
<hr style="margin: 10px 0">
|
48 |
+
</li>
|
49 |
+
|
50 |
+
<li>
|
51 |
+
<span class="sui-icon-check sui-md" aria-hidden="true" style="padding-right: 10px;"></span>
|
52 |
+
<strong><?php esc_html_e( 'Uptime monitor - instant downtime alerts and helpful site analytics', 'forminator' ); ?></strong>
|
53 |
+
<hr style="margin: 10px 0">
|
54 |
+
</li>
|
55 |
+
|
56 |
+
<li>
|
57 |
+
<span class="sui-icon-check sui-md" aria-hidden="true" style="padding-right: 10px;"></span>
|
58 |
+
<strong><?php esc_html_e( 'White label reports - custom website health reports for clients', 'forminator' ); ?></strong>
|
59 |
+
<hr style="margin: 10px 0">
|
60 |
+
</li>
|
61 |
+
|
62 |
+
<li>
|
63 |
+
<span class="sui-icon-check sui-md" aria-hidden="true" style="padding-right: 10px;"></span>
|
64 |
+
<strong><?php esc_html_e( 'Client billing - a full payment solution for your business', 'forminator' ); ?></strong>
|
65 |
+
<hr style="margin: 10px 0">
|
66 |
+
</li>
|
67 |
+
|
68 |
+
<li>
|
69 |
+
<span class="sui-icon-check sui-md" aria-hidden="true" style="padding-right: 10px;"></span>
|
70 |
+
<strong><?php esc_html_e( 'Auto updates - schedule safe updates for all your plugins and themes', 'forminator' ); ?></strong>
|
71 |
+
<hr style="margin: 10px 0">
|
72 |
+
</li>
|
73 |
+
|
74 |
+
<li>
|
75 |
+
<span class="sui-icon-check sui-md" aria-hidden="true" style="padding-right: 10px;"></span>
|
76 |
+
<strong><?php esc_html_e( 'Secure site backups - including 1GB free WPMU DEV storage', 'forminator' ); ?></strong>
|
77 |
+
</li>
|
78 |
+
|
79 |
+
</ul>
|
80 |
+
|
81 |
+
</div>
|
82 |
+
|
83 |
+
<div class="sui-box-body sui-content-center" style="padding-top: 0">
|
84 |
+
<strong><?php esc_html_e( 'Plus many more membership perks and benefits!', 'forminator' ); ?></strong>
|
85 |
+
</div>
|
86 |
+
|
87 |
+
<div class="sui-box-footer sui-flatten sui-content-center" style="flex-direction: column; padding-bottom: 50px;">
|
88 |
+
|
89 |
+
<a href="https://wpmudev.com/register/?free_hub&utm_source=forminator&utm_medium=referral&utm_campaign=wp_admin_free_plan_2" target="_blank" class="sui-button sui-button-blue" style="margin-bottom: 10px;">
|
90 |
+
<?php esc_html_e( 'Try the free plan', 'forminator' ); ?>
|
91 |
+
</a>
|
92 |
+
|
93 |
+
<div><p class="sui-description"><?php esc_html_e( 'No credit card required.', 'forminator' ); ?></p></div>
|
94 |
+
</div>
|
95 |
+
|
96 |
+
</div>
|
97 |
+
|
98 |
+
</div>
|
99 |
+
|
100 |
+
</div>
|
101 |
+
|
102 |
+
<script type="text/javascript">
|
103 |
+
// Find out more.
|
104 |
+
jQuery( '#forminator-promote-popup-open' ).on( 'click', function( e ) {
|
105 |
+
SUI.openModal(
|
106 |
+
'forminator-promote-popup',
|
107 |
+
'wpbody-content'
|
108 |
+
);
|
109 |
+
});
|
110 |
+
|
111 |
+
// Remind me later.
|
112 |
+
jQuery( '#forminator-promote-remind-later' ).on( 'click', function( e ) {
|
113 |
+
e.preventDefault();
|
114 |
+
|
115 |
+
var ajaxUrl = '<?php echo esc_url( forminator_ajax_url() ); ?>';
|
116 |
+
var $notice = jQuery( '[data-notice-slug="forminator_promote_free_plan"]' );
|
117 |
+
|
118 |
+
jQuery.post(
|
119 |
+
ajaxUrl,
|
120 |
+
{
|
121 |
+
action: 'forminator_promote_remind_later',
|
122 |
+
_ajax_nonce: jQuery( this ).data('nonce')
|
123 |
+
}
|
124 |
+
).always( function() {
|
125 |
+
$notice.hide();
|
126 |
+
});
|
127 |
+
});
|
128 |
+
</script>
|
admin/views/integrations/addon.php
CHANGED
@@ -77,7 +77,7 @@ if ( ! empty( $show_pro_info ) && $show_pro_info ) {
|
|
77 |
|
78 |
$advertising = false;
|
79 |
|
80 |
-
if ( '
|
81 |
$advertising = true;
|
82 |
}
|
83 |
|
77 |
|
78 |
$advertising = false;
|
79 |
|
80 |
+
if ( 'webhook' === $addon['slug'] ) {
|
81 |
$advertising = true;
|
82 |
}
|
83 |
|
admin/views/quiz/entries/content.php
CHANGED
@@ -1,5 +1,5 @@
|
|
1 |
<?php
|
2 |
-
/** @var
|
3 |
$plugin_path = forminator_plugin_url();
|
4 |
$count = $this->filtered_total_entries();
|
5 |
$entries_per_page = $this->get_per_page();
|
1 |
<?php
|
2 |
+
/** @var Forminator_Quiz_Renderer $this */
|
3 |
$plugin_path = forminator_plugin_url();
|
4 |
$count = $this->filtered_total_entries();
|
5 |
$entries_per_page = $this->get_per_page();
|
assets/forminator-ui/CHANGELOG.md
CHANGED
@@ -1,5 +1,15 @@
|
|
1 |
# Change Log
|
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
## [1.10.3](https://github.com/wpmudev/shared-ui/compare/v1.10.2...v1.10.3) (2022-07-14)
|
4 |
|
5 |
#### 🐛 Bug Fixes
|
1 |
# Change Log
|
2 |
|
3 |
+
## [1.10.4](https://github.com/wpmudev/shared-ui/compare/v1.10.3...v1.10.4) (2022-08-31)
|
4 |
+
|
5 |
+
#### 🐛 Bug Fixes
|
6 |
+
- `forms`
|
7 |
+
- Text field description removes spaces from before a tag. [#34](https://github.com/wpmudev/forminator-ui/pull/34) ([FOR-1739](https://incsub.atlassian.net/browse/FOR-1739)) ([@creador-dev](https://github.com/creador-dev))
|
8 |
+
- Replace select search default "null" placeholder with "Search". [#35](https://github.com/wpmudev/forminator-ui/pull/35) ([FOR-2555](https://incsub.atlassian.net/browse/FOR-2555)) ([@creador-dev](https://github.com/creador-dev))
|
9 |
+
|
10 |
+
#### Committers: 1
|
11 |
+
- Pawan Kumar ([@creador-dev](https://github.com/creador-dev))
|
12 |
+
|
13 |
## [1.10.3](https://github.com/wpmudev/shared-ui/compare/v1.10.2...v1.10.3) (2022-07-14)
|
14 |
|
15 |
#### 🐛 Bug Fixes
|
assets/forminator-ui/css/forminator-forms.min.css
CHANGED
@@ -2,4 +2,4 @@
|
|
2 |
* WPMU DEV Forminator UI
|
3 |
* Copyright 2019 Incsub (https://incsub.com)
|
4 |
* Licensed under GPL v3 (http://www.gnu.org/licenses/gpl-3.0.html)
|
5 |
-
*/.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-accessible,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-accessible,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-accessible,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=bold] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=default] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=default] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=flat] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=material] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=material] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-accessible,.select2-hidden-accessible,.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-corner-all .ui-icon,.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-corner-all .ui-icon,.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-corner-all .ui-icon,.ui-datepicker.forminator-calendar--material .ui-datepicker-header .ui-corner-all .ui-icon{width:1px!important;height:1px!important;overflow:hidden!important;position:absolute!important;white-space:nowrap!important;margin:-1px!important;padding:0!important;border:0!important;clip:rect(0 0 0 0)!important;-webkit-clip-path:inset(50%)!important;clip-path:inset(50%)!important}.select2-container{-webkit-box-sizing:border-box;box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{height:28px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:block;-webkit-box-sizing:border-box;box-sizing:border-box}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container .select2-selection--multiple{min-height:32px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:block;-webkit-box-sizing:border-box;box-sizing:border-box}.select2-container .select2-selection--multiple .select2-selection__rendered{overflow:hidden;display:inline-block;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{margin-top:5px;padding:0;border:none;-webkit-box-sizing:border-box;box-sizing:border-box;font-size:100%}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-container[dir=rtl] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-dropdown{width:100%;display:block;position:absolute;z-index:1051;left:-100000px;border:1px solid #aaa;border-radius:4px;background-color:#fff;-webkit-box-sizing:border-box;box-sizing:border-box}.select2-results{display:block}.select2-results__options{margin:0;padding:0;list-style:none}.select2-results__option{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;padding:6px}.select2-results__option[aria-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{width:100%;padding:4px;-webkit-box-sizing:border-box;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{width:auto;min-width:100%;height:auto;min-height:100%;opacity:0;-khtml-opacity:0;display:block;position:fixed;z-index:99;margin:0;padding:0;border:0;left:0;top:0;background-color:#fff}.select2-container--default .select2-selection--single{border:1px solid #aaa;border-radius:4px;background-color:#fff}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:700}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--default .select2-selection--single .select2-selection__arrow{width:20px;height:26px;position:absolute;top:1px;right:1px}.select2-container--default .select2-selection--single .select2-selection__arrow b{width:0;height:0;position:absolute;top:50%;left:50%;margin-left:-4px;margin-top:-2px;border-width:5px 4px 0 4px;border-style:solid;border-color:#888 transparent transparent transparent}.select2-container--default .select2-selection--multiple{cursor:text;border:1px solid #aaa;border-radius:4px;background-color:#fff}.select2-container--default .select2-selection--multiple .select2-selection__rendered{width:100%;margin:0;padding:0 5px;-webkit-box-sizing:border-box;box-sizing:border-box;list-style:none}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{float:left;margin-top:5px;color:#999}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;margin-top:5px;margin-right:10px;font-weight:700}.select2-container--default .select2-selection--multiple .select2-selection__choice{cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px;border:1px solid #aaa;border-radius:4px;background-color:#e4e4e4}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{cursor:pointer;display:inline-block;margin-right:2px;color:#999;font-weight:700}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{border:none;background:0 0;outline:0;-webkit-box-shadow:none;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#5897fb;color:#fff}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-search--inline,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__placeholder{float:right}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice{margin-right:auto;margin-left:5px}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-right:auto;margin-left:2px}.select2-container--default.select2-container--focus .select2-selection--multiple{border:solid #000 1px;outline:0}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--above .select2-selection--single{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--below .select2-selection--single{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default.select2-container--disabled .select2-selection--single{cursor:default;background-color:#eee}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--disabled .select2-selection--multiple{cursor:default;background-color:#eee}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-gradient(linear,left top,left bottom,color-stop(50%,#fff),to(#eee));background-image:linear-gradient(to bottom,#fff 50%,#eee 100%);background-repeat:repeat-x}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;margin-right:10px;font-weight:700}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;background-color:#ddd;background-image:-webkit-gradient(linear,left top,left bottom,color-stop(50%,#eee),to(#ccc));background-image:linear-gradient(to bottom,#eee 50%,#ccc 100%);background-repeat:repeat-x}.select2-container--classic .select2-selection--single .select2-selection__arrow b{width:0;height:0;position:absolute;top:50%;left:50%;margin-top:-2px;margin-left:-4px;border-width:5px 4px 0 4px;border-style:solid;border-color:#888 transparent transparent transparent}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple{cursor:text;border:1px solid #aaa;border-radius:4px;outline:0;background-color:#fff}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{margin:0;padding:0 5px;list-style:none}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px;border:1px solid #aaa;border-radius:4px;background-color:#e4e4e4}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{cursor:pointer;display:inline-block;margin-right:2px;color:#888;font-weight:700}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;-webkit-box-shadow:none;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__arrow{right:auto;left:1px;border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.select2-container--classic[dir=rtl] .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice{float:right;margin-right:auto;margin-left:5px}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-right:auto;margin-left:2px}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{border:none;background:0 0}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-width:0 4px 5px 4px;border-color:transparent transparent #888 transparent}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),color-stop(50%,#eee));background-image:linear-gradient(to bottom,#fff 0,#eee 50%);background-repeat:repeat-x}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-gradient(linear,left top,left bottom,color-stop(50%,#eee),to(#fff));background-image:linear-gradient(to bottom,#eee 50%,#fff 100%);background-repeat:repeat-x}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material],.forminator-ui.forminator-custom-form[data-design=bold],.forminator-ui.forminator-custom-form[data-design=default],.forminator-ui.forminator-custom-form[data-design=flat],.forminator-ui.forminator-custom-form[data-design=material],.ui-datepicker.forminator-calendar--bold,.ui-datepicker.forminator-calendar--bold *,.ui-datepicker.forminator-calendar--default,.ui-datepicker.forminator-calendar--default *,.ui-datepicker.forminator-calendar--flat,.ui-datepicker.forminator-calendar--flat *,.ui-datepicker.forminator-calendar--material,.ui-datepicker.forminator-calendar--material *{font-variant-ligatures:none;-webkit-font-variant-ligatures:none;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-smoothing:antialiased;-webkit-font-smoothing:antialiased;text-shadow:rgba(0,0,0,.01) 0 0 1px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload>span,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload>span,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload>span,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload>span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox .forminator-checkbox-box:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-loading:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox .forminator-checkbox-box:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-loading:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox .forminator-checkbox-box:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-loading:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox .forminator-checkbox-box:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-loading:before,.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before,.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before,.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before,.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before,.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before,.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before,.ui-datepicker.forminator-calendar--material .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before,.ui-datepicker.forminator-calendar--material .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before{speak:none;line-height:1;font-family:forminator-icons-font!important;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;letter-spacing:0;-webkit-font-feature-settings:"liga" 1;font-feature-settings:"liga" 1;-webkit-font-variant-ligatures:discretionary-ligatures;font-variant-ligatures:discretionary-ligatures;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-accessible,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-accessible,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-accessible,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=bold] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=default] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=default] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=flat] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=material] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=material] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-accessible,.select2-hidden-accessible,.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-corner-all .ui-icon,.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-corner-all .ui-icon,.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-corner-all .ui-icon,.ui-datepicker.forminator-calendar--material .ui-datepicker-header .ui-corner-all .ui-icon{width:1px!important;height:1px!important;overflow:hidden!important;position:absolute!important;white-space:nowrap!important;margin:-1px!important;padding:0!important;border:0!important;clip:rect(0 0 0 0)!important;-webkit-clip-path:inset(50%)!important;clip-path:inset(50%)!important}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes click-animation{0%{-webkit-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1);opacity:.2;-khtml-opacity:.2}50%{-webkit-transform:translate(-50%,-50%) scale(2);transform:translate(-50%,-50%) scale(2);opacity:.1;-khtml-opacity:.1}100%{-webkit-transform:translate(-50%,-50%) scale(0);transform:translate(-50%,-50%) scale(0);opacity:0;-khtml-opacity:0}}@keyframes click-animation{0%{-webkit-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1);opacity:.2;-khtml-opacity:.2}50%{-webkit-transform:translate(-50%,-50%) scale(2);transform:translate(-50%,-50%) scale(2);opacity:.1;-khtml-opacity:.1}100%{-webkit-transform:translate(-50%,-50%) scale(0);transform:translate(-50%,-50%) scale(0);opacity:0;-khtml-opacity:0}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default],.forminator-ui.forminator-custom-form[data-design=default]{width:100%;margin:30px 0;-webkit-box-sizing:border-box;box-sizing:border-box}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-field,.forminator-ui.forminator-custom-form[data-design=default] .forminator-field{margin:0;padding:0;border:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-field:focus,.forminator-ui.forminator-custom-form[data-design=default] .forminator-field:focus{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:first-child,.forminator-ui.forminator-custom-form[data-design=default]:first-child{margin-top:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:last-child,.forminator-ui.forminator-custom-form[data-design=default]:last-child{margin-bottom:0}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small):first-child,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small):first-child{margin-top:0}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small):last-child,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small):last-child{margin-bottom:0}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small).forminator-fields-disabled>.forminator-pagination>*,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small).forminator-fields-disabled>:not(.forminator-response-message):not(.forminator-pagination),.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small).forminator-fields-disabled>.forminator-pagination>*,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small).forminator-fields-disabled>:not(.forminator-response-message):not(.forminator-pagination){opacity:.5;-khtml-opacity:.5;pointer-events:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small).forminator-fields-disabled>.forminator-pagination>* *,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small).forminator-fields-disabled>:not(.forminator-response-message):not(.forminator-pagination) *,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small).forminator-fields-disabled>.forminator-pagination>* *,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small).forminator-fields-disabled>:not(.forminator-response-message):not(.forminator-pagination) *{pointer-events:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row),.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row){cursor:not-allowed}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row) .forminator-col,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row) .forminator-col{opacity:.5;-khtml-opacity:.5}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row) .forminator-col,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row) .forminator-col *,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row) .forminator-col,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row) .forminator-col *{pointer-events:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small).forminator-partial-disabled .forminator-pagination-footer .forminator-button:not(.forminator-button-submit),.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small).forminator-partial-disabled .forminator-pagination-footer .forminator-button:not(.forminator-button-submit){opacity:.5;-khtml-opacity:.5;pointer-events:none}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small),.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small){margin:30px 0}}.forminator-draft-wrap{font-weight:400;font-size:15px}.forminator-draft-wrap .forminator-draft-notice{margin-bottom:30px;padding:15px 22px;border-radius:2px;font-family:inherit;font-size:inherit;font-weight:inherit;color:#333;background-color:#bceee6}.forminator-draft-wrap .forminator-draft-notice.draft-success{background-color:#bceee6;box-shadow:inset 2px 0 0 0 #1abca1;-moz-box-shadow:inset 2px 0 0 0 #1abca1;-webkit-box-shadow:inset 2px 0 0 0 #1abca1}.forminator-draft-wrap .forminator-draft-notice.draft-error{background-color:#f9e4e8;box-shadow:inset 2px 0 0 0 #e04562;-moz-box-shadow:inset 2px 0 0 0 #e04562;-webkit-box-shadow:inset 2px 0 0 0 #e04562}.forminator-draft-wrap .forminator-draft-email-response p:last-of-type{margin-bottom:20px}.forminator-draft-wrap .forminator-copy-field{position:relative;margin-bottom:40px}.forminator-draft-wrap .forminator-copy-field .forminator-draft-link{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;padding:9px 110px 11px 15px;margin:0;background:#eee;border:none;color:#555;text-decoration:underline;outline:0;line-height:20px;font-family:inherit;font-size:inherit;font-weight:inherit;opacity:1}.forminator-draft-wrap .forminator-copy-field button,.forminator-draft-wrap .forminator-copy-field button:hover{width:98px;height:30px;padding:0;position:absolute;top:50%;right:6px;background-color:#666;color:#fff;font-family:inherit;font-style:inherit;font-weight:500;font-size:13px;line-height:22px;border:0;outline:0;-webkit-transform:translateY(-50%);transform:translateY(-50%);cursor:pointer}.forminator-draft-wrap .forminator-copy-field button:hover{background-color:#7b7b7b}.forminator-draft-wrap .forminator-draft-form .forminator-row{margin-bottom:20px}.forminator-draft-wrap .forminator-draft-form .forminator-label{display:block;cursor:default;margin:0 0 5px 0;border:0;line-height:1.7em;font-size:13px;font-family:inherit;font-weight:500;color:#888}.forminator-draft-wrap .forminator-draft-form .forminator-email--field{display:block;width:100%;min-width:unset;max-width:unset;height:auto;min-height:unset;max-height:unset;margin:0;padding:10px;font-size:16px;font-family:inherit;font-weight:400;background-color:#ededed;color:#000;border-width:0;border-style:none;border-radius:0;background-image:unset;line-height:1.3em;-webkit-transition:.2s ease;transition:.2s ease;outline:0}.forminator-draft-wrap .forminator-draft-form .forminator-has_error .forminator-email--field{box-shadow:inset 2px 0 0 0 #e04562;-moz-box-shadow:inset 2px 0 0 0 #e04562;-webkit-box-shadow:inset 2px 0 0 0 #e04562}.forminator-draft-wrap .forminator-draft-form .forminator-has_error .forminator-error-message{display:block;padding:2px 10px;margin:5px 0 0;border-radius:0;line-height:2em;background-color:#f9e4e8;color:#e04562;font-size:12px;font-family:inherit;font-weight:500}.forminator-draft-wrap .forminator-draft-form button.forminator-button-submit{background-color:#289dcc;color:#fff;font-size:14px;font-family:inherit;font-weight:500;outline:0;width:auto;min-width:100px;max-width:unset;height:auto;min-height:unset;max-height:unset;cursor:pointer;display:inline-block;position:relative;margin:0 10px 0 0;padding:10px;border:0;border-radius:0;background-image:unset;line-height:1.45em;text-align:center;-webkit-transition:.2s ease;transition:.2s ease}.forminator-draft-wrap .forminator-draft-form button.forminator-button-submit:hover{background-color:#35aede}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message,.forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message{margin:0 0 20px;padding:15px 20px 15px 22px;border-radius:2px;text-align:left}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message p,.forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message p{margin:0;padding:0;border:0;line-height:1.3em;letter-spacing:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message p:not(:last-child),.forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message p:not(:last-child){margin-bottom:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message:active,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message:hover,.forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message,.forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message:active,.forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message:focus,.forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message:last-child,.forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message:last-child{margin-bottom:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message[aria-hidden=true],.forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message[aria-hidden=true]{display:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-loading,.forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-loading{position:relative;padding-left:46px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-loading:before{content:"◌";position:absolute;top:17px;left:20px;font-size:16px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-show,.forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-show{display:block}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-response-message:last-child,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-response-message:last-child{margin-bottom:0}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-response-message,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-response-message{margin-bottom:30px}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-subtitle,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-title,.forminator-ui.forminator-custom-form[data-design=default] .forminator-subtitle,.forminator-ui.forminator-custom-form[data-design=default] .forminator-title{display:block;margin:0;padding:0;border:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-subtitle:after,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-subtitle:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-title:after,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-title:before,.forminator-ui.forminator-custom-form[data-design=default] .forminator-subtitle:after,.forminator-ui.forminator-custom-form[data-design=default] .forminator-subtitle:before,.forminator-ui.forminator-custom-form[data-design=default] .forminator-title:after,.forminator-ui.forminator-custom-form[data-design=default] .forminator-title:before{content:unset;display:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-title,.forminator-ui.forminator-custom-form[data-design=default] .forminator-title{line-height:1em}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-title+.forminator-subtitle,.forminator-ui.forminator-custom-form[data-design=default] .forminator-title+.forminator-subtitle{margin-top:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-subtitle,.forminator-ui.forminator-custom-form[data-design=default] .forminator-subtitle{line-height:1.4em}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-border,.forminator-ui.forminator-custom-form[data-design=default] .forminator-border{width:100%;min-width:100%;max-width:100%;height:0;min-height:unset;max-height:unset;display:block;margin:20px 0 0;padding:0;border:0;background-image:unset;background-color:transparent}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-border:first-child,.forminator-ui.forminator-custom-form[data-design=default] .forminator-border:first-child{margin-top:0}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-border:first-child,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-border:first-child{margin-top:0}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-border,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-border{margin-top:30px}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-label,.forminator-ui.forminator-custom-form[data-design=default] .forminator-label{cursor:default;display:block;margin:0;border:0;line-height:1.7em}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-label[for],.forminator-ui.forminator-custom-form[data-design=default] .forminator-label[for]{cursor:pointer}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-description,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-error-message,.forminator-ui.forminator-custom-form[data-design=default] .forminator-description,.forminator-ui.forminator-custom-form[data-design=default] .forminator-error-message{margin:5px 0 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-description,.forminator-ui.forminator-custom-form[data-design=default] .forminator-description{display:-webkit-box;display:-ms-flexbox;display:flex;line-height:1.5em}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-description span,.forminator-ui.forminator-custom-form[data-design=default] .forminator-description span{min-width:80px;margin-right:0;margin-left:auto;text-align:right}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-error-message,.forminator-ui.forminator-custom-form[data-design=default] .forminator-error-message{display:none;padding:2px 10px;border-radius:2px;line-height:2em}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-has_error .forminator-error-message,.forminator-ui.forminator-custom-form[data-design=default] .forminator-has_error .forminator-error-message{display:block}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;min-width:unset;max-width:unset;height:auto;min-height:unset;max-height:unset;display:block;margin:0;padding:9px;border-width:1px;border-style:solid;border-radius:2px;background-image:unset;line-height:1.3em;-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input:active,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input:disabled,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input:hover,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input:active,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input:disabled,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input:focus,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input:disabled,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input:disabled{pointer-events:none;border-style:dotted}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input:disabled:-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input:disabled:-moz-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input:disabled::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input:disabled::-moz-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input:disabled:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input:disabled:-ms-input-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input:disabled::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input:disabled::-webkit-input-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-prefix,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-prefix{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-prefix input,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-prefix input{min-width:50px;display:block;-webkit-box-flex:1;-ms-flex:1;flex:1;margin:0;padding:0;border:0;background-image:none;background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-prefix .forminator-prefix,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-prefix .forminator-suffix,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-prefix .forminator-prefix,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-prefix .forminator-suffix{display:block;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-prefix .forminator-prefix,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-prefix .forminator-prefix{margin-right:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-prefix .forminator-suffix,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-prefix .forminator-suffix{margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-textarea,.forminator-ui.forminator-custom-form[data-design=default] .forminator-textarea{width:100%;min-height:140px;resize:vertical;display:block;margin:0;padding:9px;border-width:1px;border-style:solid;border-radius:2px;background-image:unset;line-height:20px;-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-textarea,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-textarea:active,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-textarea:disabled,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-textarea:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-textarea:hover,.forminator-ui.forminator-custom-form[data-design=default] .forminator-textarea,.forminator-ui.forminator-custom-form[data-design=default] .forminator-textarea:active,.forminator-ui.forminator-custom-form[data-design=default] .forminator-textarea:disabled,.forminator-ui.forminator-custom-form[data-design=default] .forminator-textarea:focus,.forminator-ui.forminator-custom-form[data-design=default] .forminator-textarea:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-textarea:disabled,.forminator-ui.forminator-custom-form[data-design=default] .forminator-textarea:disabled{pointer-events:none;border-style:dotted}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-textarea:disabled:-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=default] .forminator-textarea:disabled:-moz-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-textarea:disabled::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=default] .forminator-textarea:disabled::-moz-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-textarea:disabled:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=default] .forminator-textarea:disabled:-ms-input-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-textarea:disabled::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=default] .forminator-textarea:disabled::-webkit-input-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-has_error .tmce-active .forminator-textarea.wp-editor-area,.forminator-ui.forminator-custom-form[data-design=default] .forminator-has_error .tmce-active .forminator-textarea.wp-editor-area{display:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-radio,.forminator-ui.forminator-custom-form[data-design=default] .forminator-radio{cursor:default;pointer-events:none;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:relative;margin:10px 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-radio input:checked+.forminator-radio-bullet:before,.forminator-ui.forminator-custom-form[data-design=default] .forminator-radio input:checked+.forminator-radio-bullet:before{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-radio span,.forminator-ui.forminator-custom-form[data-design=default] .forminator-radio span{cursor:pointer;pointer-events:all;display:block}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-radio .forminator-radio-bullet,.forminator-ui.forminator-custom-form[data-design=default] .forminator-radio .forminator-radio-bullet{width:20px;height:20px;-webkit-box-flex:0;-ms-flex:0 0 20px;flex:0 0 20px;position:relative;border-width:1px;border-style:solid;border-radius:40px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-radio .forminator-radio-bullet:before,.forminator-ui.forminator-custom-form[data-design=default] .forminator-radio .forminator-radio-bullet:before{content:" ";width:10px;height:10px;opacity:0;-khtml-opacity:0;display:block;position:absolute;top:50%;left:50%;border-radius:100%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-radio .forminator-radio-bullet~span,.forminator-ui.forminator-custom-form[data-design=default] .forminator-radio .forminator-radio-bullet~span{margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-radio .forminator-radio-label,.forminator-ui.forminator-custom-form[data-design=default] .forminator-radio .forminator-radio-label{-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;line-height:20px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-radio .forminator-radio-image,.forminator-ui.forminator-custom-form[data-design=default] .forminator-radio .forminator-radio-image{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;padding:3px;border-width:2px;border-style:solid;border-radius:2px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-radio .forminator-radio-image span,.forminator-ui.forminator-custom-form[data-design=default] .forminator-radio .forminator-radio-image span{width:70px;height:70px;background-repeat:no-repeat;background-size:cover;background-position:center}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-radio.forminator-has_image .forminator-radio-image,.forminator-ui.forminator-custom-form[data-design=default] .forminator-radio.forminator-has_image .forminator-radio-image{margin-left:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-radio.forminator-radio-inline,.forminator-ui.forminator-custom-form[data-design=default] .forminator-radio.forminator-radio-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle;margin-right:20px;margin-bottom:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-radio.forminator-radio-inline.forminator-has_image.forminator-has_bullet,.forminator-ui.forminator-custom-form[data-design=default] .forminator-radio.forminator-radio-inline.forminator-has_image.forminator-has_bullet{min-width:80px;padding-top:90px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-radio.forminator-radio-inline.forminator-has_image.forminator-has_bullet .forminator-radio-image,.forminator-ui.forminator-custom-form[data-design=default] .forminator-radio.forminator-radio-inline.forminator-has_image.forminator-has_bullet .forminator-radio-image{position:absolute;top:0;left:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-radio.forminator-radio-inline:last-of-type,.forminator-ui.forminator-custom-form[data-design=default] .forminator-radio.forminator-radio-inline:last-of-type{margin-right:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-radio:not(.forminator-radio-inline),.forminator-ui.forminator-custom-form[data-design=default] .forminator-radio:not(.forminator-radio-inline){margin:20px 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-radio:not(.forminator-radio-inline).forminator-has_image.forminator-has_bullet .forminator-radio-bullet,.forminator-ui.forminator-custom-form[data-design=default] .forminator-radio:not(.forminator-radio-inline).forminator-has_image.forminator-has_bullet .forminator-radio-bullet{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2;margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-radio:not(.forminator-radio-inline).forminator-has_image.forminator-has_bullet .forminator-radio-label,.forminator-ui.forminator-custom-form[data-design=default] .forminator-radio:not(.forminator-radio-inline).forminator-has_image.forminator-has_bullet .forminator-radio-label{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-radio:not(.forminator-radio-inline).forminator-has_image.forminator-has_bullet .forminator-radio-image,.forminator-ui.forminator-custom-form[data-design=default] .forminator-radio:not(.forminator-radio-inline).forminator-has_image.forminator-has_bullet .forminator-radio-image{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-radio:not(.forminator-radio-inline):first-of-type,.forminator-ui.forminator-custom-form[data-design=default] .forminator-radio:not(.forminator-radio-inline):first-of-type{margin-top:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-radio:not(.forminator-radio-inline):first-child,.forminator-ui.forminator-custom-form[data-design=default] .forminator-radio:not(.forminator-radio-inline):first-child{margin-top:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-radio:not(.forminator-radio-inline):last-of-type,.forminator-ui.forminator-custom-form[data-design=default] .forminator-radio:not(.forminator-radio-inline):last-of-type{margin-bottom:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-radio:not(.forminator-radio-inline):last-child,.forminator-ui.forminator-custom-form[data-design=default] .forminator-radio:not(.forminator-radio-inline):last-child{margin-bottom:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox{cursor:default;pointer-events:none;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:relative;margin:10px 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox input:checked+.forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox input:checked+.forminator-checkbox-box:before{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox span,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox span{cursor:pointer;pointer-events:all;display:block}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox .forminator-checkbox-box,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox .forminator-checkbox-box{width:20px;height:20px;-webkit-box-flex:0;-ms-flex:0 0 20px;flex:0 0 20px;position:relative;border-width:1px;border-style:solid;border-radius:2px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox .forminator-checkbox-box:before{content:"✓";opacity:0;-khtml-opacity:0;display:block;position:absolute;top:50%;left:50%;color:inherit;font-size:12px;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox .forminator-checkbox-box~span,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox .forminator-checkbox-box~span{margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox-label,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox-label{-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;line-height:20px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox .forminator-checkbox-image,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox .forminator-checkbox-image{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;padding:3px;border-width:2px;border-style:solid;border-radius:2px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox .forminator-checkbox-image span,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox .forminator-checkbox-image span{width:70px;height:70px;background-repeat:no-repeat;background-size:cover;background-position:center}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox__wrapper,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox__wrapper{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox__label,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox__label{-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;line-height:20px;margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox__label h1:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox__label h2:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox__label h3:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox__label h4:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox__label h5:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox__label h6:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox__label ol:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox__label p:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox__label ul:last-child,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox__label h1:last-child,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox__label h2:last-child,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox__label h3:last-child,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox__label h4:last-child,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox__label h5:last-child,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox__label h6:last-child,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox__label ol:last-child,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox__label p:last-child,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox__label ul:last-child{margin-bottom:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox.forminator-has_image .forminator-checkbox-image,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox.forminator-has_image .forminator-checkbox-image{margin-left:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox.forminator-checkbox-inline,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox.forminator-checkbox-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle;margin-right:20px;margin-bottom:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox.forminator-checkbox-inline.forminator-has_box,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox.forminator-checkbox-inline.forminator-has_box{min-width:80px;padding-top:90px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox.forminator-checkbox-inline.forminator-has_box .forminator-checkbox-image,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox.forminator-checkbox-inline.forminator-has_box .forminator-checkbox-image{position:absolute;top:0;left:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox.forminator-checkbox-inline:last-of-type,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox.forminator-checkbox-inline:last-of-type{margin-right:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox:not(.forminator-checkbox-inline),.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox:not(.forminator-checkbox-inline){margin:20px 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox:not(.forminator-checkbox-inline).forminator-has_image.forminator-has_box .forminator-checkbox-box,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox:not(.forminator-checkbox-inline).forminator-has_image.forminator-has_box .forminator-checkbox-box{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2;margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox:not(.forminator-checkbox-inline).forminator-has_image.forminator-has_box .forminator-checkbox-label,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox:not(.forminator-checkbox-inline).forminator-has_image.forminator-has_box .forminator-checkbox-label{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox:not(.forminator-checkbox-inline).forminator-has_image.forminator-has_box .forminator-checkbox-image,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox:not(.forminator-checkbox-inline).forminator-has_image.forminator-has_box .forminator-checkbox-image{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox:not(.forminator-checkbox-inline):first-of-type,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox:not(.forminator-checkbox-inline):first-of-type{margin-top:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox:not(.forminator-checkbox-inline):first-child,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox:not(.forminator-checkbox-inline):first-child{margin-top:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox:not(.forminator-checkbox-inline):last-of-type,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox:not(.forminator-checkbox-inline):last-of-type{margin-bottom:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox:not(.forminator-checkbox-inline):last-child,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox:not(.forminator-checkbox-inline):last-child{margin-bottom:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-button,.forminator-ui.forminator-custom-form[data-design=default] .forminator-button{width:auto;min-width:100px;max-width:unset;height:auto;min-height:unset;max-height:unset;cursor:pointer;display:inline-block;position:relative;margin:0 10px 0 0;padding:10px;border:0;border-radius:2px;background-image:unset;line-height:1.45em;text-align:center;-webkit-transition:.2s ease;transition:.2s ease}@media (max-width:782px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-button,.forminator-ui.forminator-custom-form[data-design=default] .forminator-button{width:100%;margin:0 0 10px 0}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-button span,.forminator-ui.forminator-custom-form[data-design=default] .forminator-button span{display:block;-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-button .forminator-icon-loader,.forminator-ui.forminator-custom-form[data-design=default] .forminator-button .forminator-icon-loader{opacity:0;-khtml-opacity:0;position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-button .forminator-icon-loader:before,.forminator-ui.forminator-custom-form[data-design=default] .forminator-button .forminator-icon-loader:before{display:block}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-button,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-button:active,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-button:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-button:hover,.forminator-ui.forminator-custom-form[data-design=default] .forminator-button,.forminator-ui.forminator-custom-form[data-design=default] .forminator-button:active,.forminator-ui.forminator-custom-form[data-design=default] .forminator-button:focus,.forminator-ui.forminator-custom-form[data-design=default] .forminator-button:hover{outline:0;-webkit-box-shadow:none;box-shadow:none;text-decoration:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-button:active,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-button:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-button:hover,.forminator-ui.forminator-custom-form[data-design=default] .forminator-button:active,.forminator-ui.forminator-custom-form[data-design=default] .forminator-button:focus,.forminator-ui.forminator-custom-form[data-design=default] .forminator-button:hover{-webkit-box-shadow:0 1px 4px 0 rgba(0,0,0,.6);box-shadow:0 1px 4px 0 rgba(0,0,0,.6)}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-button:active span[aria-hidden]:not([class*=forminator-icon-]),.forminator-ui.forminator-custom-form[data-design=default] .forminator-button:active span[aria-hidden]:not([class*=forminator-icon-]){width:120%;padding:120% 0 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-button.forminator-disabled,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-button.forminator-onload,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-button:disabled,.forminator-ui.forminator-custom-form[data-design=default] .forminator-button.forminator-disabled,.forminator-ui.forminator-custom-form[data-design=default] .forminator-button.forminator-onload,.forminator-ui.forminator-custom-form[data-design=default] .forminator-button:disabled{opacity:.5;-khtml-opacity:.5;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-button.forminator-onload span,.forminator-ui.forminator-custom-form[data-design=default] .forminator-button.forminator-onload span{opacity:0;-khtml-opacity:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-button.forminator-onload .forminator-icon-loader,.forminator-ui.forminator-custom-form[data-design=default] .forminator-button.forminator-onload .forminator-icon-loader{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-button:last-child,.forminator-ui.forminator-custom-form[data-design=default] .forminator-button:last-child{margin-right:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default].draft-enabled .forminator-save-draft-link,.forminator-ui.forminator-custom-form[data-design=default].draft-enabled .forminator-save-draft-link{display:inline-block;font-size:15px;font-weight:500;color:#17a8e3;text-decoration:none;background-color:transparent;padding:10px 0;margin:0 10px;text-decoration:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default].draft-enabled .forminator-save-draft-link.disabled,.forminator-ui.forminator-custom-form[data-design=default].draft-enabled .forminator-save-draft-link.disabled{color:#a5a5a5;cursor:default}@media (max-width:782px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default].draft-enabled .forminator-save-draft-link,.forminator-ui.forminator-custom-form[data-design=default].draft-enabled .forminator-save-draft-link{text-align:center;width:100%;margin:0 0 10px 0}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default].draft-enabled .forminator-button-paypal+.forminator-save-draft-link,.forminator-ui.forminator-custom-form[data-design=default].draft-enabled .forminator-button-paypal+.forminator-save-draft-link{margin:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-g-recaptcha .grecaptcha-badge,.forminator-ui.forminator-custom-form[data-design=default] .forminator-g-recaptcha .grecaptcha-badge{visibility:visible}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material],.forminator-ui.forminator-custom-form[data-design=bold],.forminator-ui.forminator-custom-form[data-design=default],.forminator-ui.forminator-custom-form[data-design=flat],.forminator-ui.forminator-custom-form[data-design=material],.ui-datepicker.forminator-calendar--bold,.ui-datepicker.forminator-calendar--bold *,.ui-datepicker.forminator-calendar--default,.ui-datepicker.forminator-calendar--default *,.ui-datepicker.forminator-calendar--flat,.ui-datepicker.forminator-calendar--flat *,.ui-datepicker.forminator-calendar--material,.ui-datepicker.forminator-calendar--material *{font-variant-ligatures:none;-webkit-font-variant-ligatures:none;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-smoothing:antialiased;-webkit-font-smoothing:antialiased;text-shadow:rgba(0,0,0,.01) 0 0 1px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload>span,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload>span,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload>span,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload>span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox .forminator-checkbox-box:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-loading:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox .forminator-checkbox-box:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-loading:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox .forminator-checkbox-box:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-loading:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox .forminator-checkbox-box:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-loading:before,.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before,.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before,.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before,.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before,.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before,.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before,.ui-datepicker.forminator-calendar--material .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before,.ui-datepicker.forminator-calendar--material .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before{speak:none;line-height:1;font-family:forminator-icons-font!important;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;letter-spacing:0;-webkit-font-feature-settings:"liga" 1;font-feature-settings:"liga" 1;-webkit-font-variant-ligatures:discretionary-ligatures;font-variant-ligatures:discretionary-ligatures;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-accessible,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-accessible,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-accessible,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=bold] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=default] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=default] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=flat] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=material] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=material] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-accessible,.select2-hidden-accessible,.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-corner-all .ui-icon,.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-corner-all .ui-icon,.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-corner-all .ui-icon,.ui-datepicker.forminator-calendar--material .ui-datepicker-header .ui-corner-all .ui-icon{width:1px!important;height:1px!important;overflow:hidden!important;position:absolute!important;white-space:nowrap!important;margin:-1px!important;padding:0!important;border:0!important;clip:rect(0 0 0 0)!important;-webkit-clip-path:inset(50%)!important;clip-path:inset(50%)!important}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-icon,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-icon{position:relative}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-icon [class*=forminator-icon-],.forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-icon [class*=forminator-icon-]{display:block;position:absolute;top:50%;left:10px;font-size:16px;-webkit-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-icon [class*=forminator-icon-]:before,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-icon [class*=forminator-icon-]:before{color:inherit}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-icon .forminator-input,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-icon .forminator-input{padding-left:35px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-suffix,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-suffix{position:relative}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-suffix .forminator-input,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-suffix .forminator-input{padding-right:60px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-suffix .forminator-suffix,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-suffix .forminator-suffix{display:block;position:absolute;top:50%;right:0;padding:0 10px;-webkit-transform:translateY(-50%);transform:translateY(-50%);line-height:1.4em}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-phone,.forminator-ui.forminator-custom-form[data-design=default] .forminator-phone{display:block}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-phone .iti__flag-container,.forminator-ui.forminator-custom-form[data-design=default] .forminator-phone .iti__flag-container{padding:1px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-phone .iti__flag-container .iti__selected-flag,.forminator-ui.forminator-custom-form[data-design=default] .forminator-phone .iti__flag-container .iti__selected-flag{width:auto;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:0;padding:0 10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-phone .iti__flag-container .iti__selected-flag .iti__flag,.forminator-ui.forminator-custom-form[data-design=default] .forminator-phone .iti__flag-container .iti__selected-flag .iti__flag{display:block;position:relative;top:auto;bottom:auto;margin:0;padding:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-phone .iti__flag-container .iti__selected-flag .iti__flag+.iti__arrow,.forminator-ui.forminator-custom-form[data-design=default] .forminator-phone .iti__flag-container .iti__selected-flag .iti__flag+.iti__arrow{margin-left:5px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-phone .iti__flag-container .iti__selected-flag .iti__arrow,.forminator-ui.forminator-custom-form[data-design=default] .forminator-phone .iti__flag-container .iti__selected-flag .iti__arrow{display:block;position:relative;top:auto;right:auto;margin:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-phone .iti__flag-container .iti__selected-flag:active,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-phone .iti__flag-container .iti__selected-flag:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-phone .iti__flag-container .iti__selected-flag:hover,.forminator-ui.forminator-custom-form[data-design=default] .forminator-phone .iti__flag-container .iti__selected-flag:active,.forminator-ui.forminator-custom-form[data-design=default] .forminator-phone .iti__flag-container .iti__selected-flag:focus,.forminator-ui.forminator-custom-form[data-design=default] .forminator-phone .iti__flag-container .iti__selected-flag:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-phone .iti__flag-container:active,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-phone .iti__flag-container:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-phone .iti__flag-container:hover,.forminator-ui.forminator-custom-form[data-design=default] .forminator-phone .iti__flag-container:active,.forminator-ui.forminator-custom-form[data-design=default] .forminator-phone .iti__flag-container:focus,.forminator-ui.forminator-custom-form[data-design=default] .forminator-phone .iti__flag-container:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-phone.iti--allow-dropdown .forminator-input,.forminator-ui.forminator-custom-form[data-design=default] .forminator-phone.iti--allow-dropdown .forminator-input{padding-left:51px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-phone:not(.iti--allow-dropdown) .iti__flag-container,.forminator-ui.forminator-custom-form[data-design=default] .forminator-phone:not(.iti--allow-dropdown) .iti__flag-container{pointer-events:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-phone:not(.iti--allow-dropdown) .forminator-input,.forminator-ui.forminator-custom-form[data-design=default] .forminator-phone:not(.iti--allow-dropdown) .forminator-input{padding-right:51px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-phone .iti__flag-container .iti__selected-flag,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-phone .iti__flag-container .iti__selected-flag{width:31px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:0;padding:0 10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-phone .iti__flag-container .iti__selected-flag .iti__flag,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-phone .iti__flag-container .iti__selected-flag .iti__flag{display:block;position:relative;top:auto;bottom:auto;margin:0;padding:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-phone .iti__flag-container .iti__selected-flag .iti__flag+.iti__arrow,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-phone .iti__flag-container .iti__selected-flag .iti__flag+.iti__arrow{margin-left:5px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-phone .iti__flag-container .iti__selected-flag .iti__arrow,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-phone .iti__flag-container .iti__selected-flag .iti__arrow{display:block;position:relative;top:auto;right:auto;margin:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-phone .iti__flag-container .iti__selected-flag:active,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-phone .iti__flag-container .iti__selected-flag:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-phone .iti__flag-container .iti__selected-flag:hover,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-phone .iti__flag-container .iti__selected-flag:active,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-phone .iti__flag-container .iti__selected-flag:focus,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-phone .iti__flag-container .iti__selected-flag:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-phone .iti__flag-container:active,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-phone .iti__flag-container:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-phone .iti__flag-container:hover,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-phone .iti__flag-container:active,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-phone .iti__flag-container:focus,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-phone .iti__flag-container:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-phone.iti--allow-dropdown .forminator-input--wrap,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-phone.iti--allow-dropdown .forminator-input--wrap{left:41px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-phone:not(.iti--allow-dropdown) .forminator-input--wrap,.forminator-ui.forminator-custom-form[data-design=default] .forminator-input-with-phone:not(.iti--allow-dropdown) .forminator-input--wrap{left:30px}.iti-mobile .iti--container{z-index:999991}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload,.forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload>span{overflow:hidden;display:block;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload>span:not(:last-child),.forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload>span:not(:last-child){margin-right:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-button-delete,.forminator-ui.forminator-custom-form[data-design=default] .forminator-button-delete{width:30px;height:30px;cursor:pointer;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin:0;padding:0;border:0;border-radius:2px;font-size:14px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-button-delete [class*=forminator-icon-],.forminator-ui.forminator-custom-form[data-design=default] .forminator-button-delete [class*=forminator-icon-]{display:block}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-button-delete [class*=forminator-icon-]:before,.forminator-ui.forminator-custom-form[data-design=default] .forminator-button-delete [class*=forminator-icon-]:before{display:block;color:inherit}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-col-3 .forminator-file-upload .forminator-button-upload,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-col-4 .forminator-file-upload .forminator-button-upload,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-col-3 .forminator-file-upload .forminator-button-upload,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-col-4 .forminator-file-upload .forminator-button-upload{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-col-3 .forminator-file-upload>span:not(:last-child),.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-col-4 .forminator-file-upload>span:not(:last-child),.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-col-3 .forminator-file-upload>span:not(:last-child),.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-col-4 .forminator-file-upload>span:not(:last-child){margin-right:0}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-col-3 .forminator-file-upload>span,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-col-4 .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-col-3 .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-col-4 .forminator-file-upload>span{-webkit-box-flex:1;-ms-flex:1;flex:1;margin-top:10px}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-col-3 .forminator-file-upload .forminator-button-delete,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-col-4 .forminator-file-upload .forminator-button-delete,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-col-3 .forminator-file-upload .forminator-button-delete,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-col-4 .forminator-file-upload .forminator-button-delete{margin-top:10px}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-col-3 .forminator-file-upload,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-col-4 .forminator-file-upload,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-col-3 .forminator-file-upload,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-col-4 .forminator-file-upload{-ms-flex-wrap:wrap;flex-wrap:wrap}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload,.forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload{display:block;margin:0;padding:29px;border-width:1px;border-style:dashed;border-radius:2px;-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload .forminator-multi-upload-message [class*=forminator-icon-],.forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload .forminator-multi-upload-message [class*=forminator-icon-]{width:30px;height:30px;display:block;margin:0 auto 5px;color:inherit;text-align:center}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload .forminator-multi-upload-message [class*=forminator-icon-]:before,.forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload .forminator-multi-upload-message [class*=forminator-icon-]:before{display:block;color:inherit;font-size:30px;line-height:30px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload .forminator-multi-upload-message p,.forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload .forminator-multi-upload-message p{display:block;margin:0;padding:0;border:0;text-align:center}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload .forminator-multi-upload-message p a,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload .forminator-multi-upload-message p a:active a:visited,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload .forminator-multi-upload-message p a:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload .forminator-multi-upload-message p a:hover,.forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload .forminator-multi-upload-message p a,.forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload .forminator-multi-upload-message p a:active a:visited,.forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload .forminator-multi-upload-message p a:focus,.forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload .forminator-multi-upload-message p a:hover{margin:0;padding:0;border:0;outline:0;-webkit-box-shadow:none;box-shadow:none;text-decoration:underline;text-transform:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-files,.forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-files{display:block;margin:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-files,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-files li,.forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-files,.forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-files li{padding:0;border:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-files.forminator-has-files,.forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-files.forminator-has-files{margin-top:20px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file,.forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file{display:block;margin:0 0 20px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--content,.forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--content{direction:ltr;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--image,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--preview,.forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--image,.forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--preview{width:36px;height:36px;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;margin:0;padding:0;border-style:solid;border-radius:2px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--image+.forminator-uploaded-file--text,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--preview+.forminator-uploaded-file--text,.forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--image+.forminator-uploaded-file--text,.forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--preview+.forminator-uploaded-file--text{margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--image,.forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--image{overflow:hidden;position:relative;border-width:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--image [role=image],.forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--image [role=image]{position:absolute;top:0;right:0;bottom:0;left:0;background-size:cover;background-position:center;background-repeat:no-repeat;background-color:transparent}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--preview,.forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--preview{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;border-width:1px;text-align:center}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--preview [class*=forminator-icon-],.forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--preview [class*=forminator-icon-]{display:block;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--preview [class*=forminator-icon-]:before,.forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--preview [class*=forminator-icon-]:before{display:block;color:inherit;font-size:16px;line-height:16px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--text,.forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--text{min-width:1px;-webkit-box-flex:1;-ms-flex:1;flex:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--text p,.forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--text p{margin:0 0 4px;padding:0;border:0;text-align:left;letter-spacing:normal;text-transform:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--text p [class*=forminator-icon-],.forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--text p [class*=forminator-icon-]{width:12px;margin:0 9px 0 0;font-size:12px;line-height:12px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--text p:last-child,.forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--text p:last-child{margin-bottom:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--text+.forminator-uploaded-file--delete,.forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--text+.forminator-uploaded-file--delete{margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--delete,.forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-uploaded-file--delete{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;margin:3px 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-error-message,.forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file .forminator-error-message{display:none!important}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file:last-child,.forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file:last-child{margin-bottom:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file.forminator-has_error .forminator-uploaded-file--image,.forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file.forminator-has_error .forminator-uploaded-file--image{border-width:1px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file.forminator-has_error .forminator-uploaded-file--image [role=image],.forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file.forminator-has_error .forminator-uploaded-file--image [role=image]{top:-1px;right:-1px;bottom:-1px;left:-1px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file.forminator-has_error .forminator-error-message,.forminator-ui.forminator-custom-form[data-design=default] .forminator-uploaded-file.forminator-has_error .forminator-error-message{display:block!important}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-multiselect,.forminator-ui.forminator-custom-form[data-design=default] .forminator-multiselect{width:100%;height:auto;max-height:210px;overflow-x:hidden;overflow-y:auto;display:block;padding:4px;border-width:1px;border-style:solid;border-radius:2px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-multiselect .forminator-option,.forminator-ui.forminator-custom-form[data-design=default] .forminator-multiselect .forminator-option{cursor:pointer;display:block;position:relative;margin:5px 0;padding:10px;line-height:1.3em;-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-multiselect .forminator-option:first-child,.forminator-ui.forminator-custom-form[data-design=default] .forminator-multiselect .forminator-option:first-child{margin-top:0;border-top-right-radius:2px;border-top-left-radius:2px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-multiselect .forminator-option:last-child,.forminator-ui.forminator-custom-form[data-design=default] .forminator-multiselect .forminator-option:last-child{margin-bottom:0;border-bottom-right-radius:2px;border-bottom-left-radius:2px}.ui-datepicker.forminator-calendar--default{width:auto;z-index:20000000;margin:0;padding:1px 0;border:0;border-radius:0;background-color:transparent!important}.ui-datepicker.forminator-calendar--default,.ui-datepicker.forminator-calendar--default *{-webkit-box-sizing:border-box;box-sizing:border-box}.ui-datepicker.forminator-calendar--default:before{content:" ";display:block;position:absolute;z-index:1;top:1px;right:0;bottom:1px;left:0;border-width:1px;border-style:solid;border-radius:2px}.ui-datepicker.forminator-calendar--default .ui-datepicker-header{display:block;position:relative;z-index:1;padding:10px}.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-corner-all{width:30px;height:30px;cursor:pointer;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;position:absolute;top:11px;border-radius:2px;font-size:14px;-webkit-transition:.2s ease;transition:.2s ease}.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-corner-all,.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-corner-all:active,.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-corner-all:focus,.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-corner-all:hover{outline:0;-webkit-box-shadow:none;box-shadow:none;text-decoration:none}.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-corner-all.ui-datepicker-prev{right:unset;left:10px}.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before{content:"❮"}.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-corner-all.ui-datepicker-next{right:10px;left:unset}.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before{content:"❯"}.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-datepicker-title{display:-webkit-box;display:-ms-flexbox;display:flex;padding:0 40px}.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-datepicker-title select{height:30px;cursor:pointer;-webkit-box-flex:1;-ms-flex:1;flex:1;margin:0 5px;padding:0 9px;border-width:1px;border-style:solid;border-radius:2px;font-size:14px;line-height:28px;font-family:inherit;-webkit-appearance:none;-moz-appearance:none;appearance:none}.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-datepicker-title select,.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-datepicker-title select:active,.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-datepicker-title select:focus,.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-datepicker-title select:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-datepicker-title select:first-child{margin-left:0}.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-datepicker-title select:last-child{margin-right:0}.ui-datepicker.forminator-calendar--default .ui-datepicker-header+.ui-datepicker-calendar{padding-top:0}.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar{width:auto;table-layout:fixed;position:relative;z-index:1;margin:0;padding:0;border:0;border-spacing:0;border-collapse:collapse;font-family:inherit}.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar thead tr{margin:0;padding:0;border:0}.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr td,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr th,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar thead tr td,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar thead tr th{margin:0;padding:5px;border:0;text-align:center;font-family:inherit}.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr td a,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr td span,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr th a,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr th span,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar thead tr td a,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar thead tr td span,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar thead tr th a,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar thead tr th span{width:30px;display:block;padding:2px;border:0;border-radius:60px}.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr td a,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr th a,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar thead tr td a,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar thead tr th a{text-decoration:none}.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr td a,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr td a:active,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr td a:hover,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr td a:visited,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr th a,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr th a:active,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr th a:hover,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr th a:visited,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar thead tr td a,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar thead tr td a:active,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar thead tr td a:hover,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar thead tr td a:visited,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar thead tr th a,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar thead tr th a:active,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar thead tr th a:hover,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar thead tr th a:visited{outline:0;-webkit-box-shadow:none;box-shadow:none;text-decoration:none}.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr td a,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr td a:visited,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr th a,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr th a:visited,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar thead tr td a,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar thead tr td a:visited,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar thead tr th a,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar thead tr th a:visited{font-weight:400}.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr td a:active,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr td a:hover,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr th a:active,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr th a:hover,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar thead tr td a:active,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar thead tr td a:hover,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar thead tr th a:active,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar thead tr th a:hover{font-weight:600}.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr td:first-child,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr th:first-child,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar thead tr td:first-child,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar thead tr th:first-child{padding-left:14px}.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr td:last-child,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr th:last-child,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar thead tr td:last-child,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar thead tr th:last-child{padding-right:14px}.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar thead tr th{font-size:12px;font-weight:600}.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar thead tr th span{display:block;line-height:1.4em}.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr td{font-size:13px}.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr td a,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr td span{border-width:1px;border-style:solid;border-radius:2px;line-height:24px}.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr td.ui-datepicker-unselectable a,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr td.ui-datepicker-unselectable span,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr td.ui-state-disabled a,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr td.ui-state-disabled span{cursor:not-allowed;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;opacity:.3;-khtml-opacity:.3}.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr td.ui-datepicker-unselectable.ui-datepicker-other-month a,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr td.ui-datepicker-unselectable.ui-datepicker-other-month span,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr td.ui-state-disabled.ui-datepicker-other-month a,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar tbody tr td.ui-state-disabled.ui-datepicker-other-month span{cursor:default}.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar:last-child tbody:last-child tr:last-child td,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar:last-child tbody:last-child tr:last-child th,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar:last-child thead:last-child tr:last-child td,.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar:last-child thead:last-child tr:last-child th{padding-bottom:14px}.ui-datepicker.forminator-calendar--default .ui-datepicker-calendar+.ui-datepicker-buttonpane{padding-top:8px}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-timepicker .forminator-row,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-timepicker .forminator-row{-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-col:not(.forminator-col-3):not(.forminator-col-4) .forminator-date-input .forminator-error-message,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-col:not(.forminator-col-3):not(.forminator-col-4) .forminator-timepicker .forminator-error-message,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-col:not(.forminator-col-3):not(.forminator-col-4) .forminator-date-input .forminator-error-message,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-col:not(.forminator-col-3):not(.forminator-col-4) .forminator-timepicker .forminator-error-message{display:none}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-col:not(.forminator-col-3):not(.forminator-col-4) .forminator-date-input~.forminator-error-message,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-col:not(.forminator-col-3):not(.forminator-col-4) .forminator-timepicker~.forminator-error-message,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-col:not(.forminator-col-3):not(.forminator-col-4) .forminator-date-input~.forminator-error-message,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-col:not(.forminator-col-3):not(.forminator-col-4) .forminator-timepicker~.forminator-error-message{display:block}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] select.forminator-select2+.forminator-select,.forminator-ui.forminator-custom-form[data-design=default] select.forminator-select2+.forminator-select{min-width:100%;max-width:100%;display:block;text-align:left}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] select.forminator-select2+.forminator-select .selection,.forminator-ui.forminator-custom-form[data-design=default] select.forminator-select2+.forminator-select .selection{display:block}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single,.forminator-ui.forminator-custom-form[data-design=default] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single{height:auto;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:relative;margin:0;padding:0;border-width:1px;border-style:solid}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single .select2-selection__rendered,.forminator-ui.forminator-custom-form[data-design=default] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single .select2-selection__rendered{min-width:10px;overflow:hidden;display:block;-webkit-box-flex:1;-ms-flex:1;flex:1;padding:8px 5px 8px 14px;text-overflow:ellipsis;white-space:nowrap}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single .select2-selection__arrow,.forminator-ui.forminator-custom-form[data-design=default] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single .select2-selection__arrow{width:38px;height:38px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:relative;margin:0;padding:0;border:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single .select2-selection__arrow [class*=forminator-icon-],.forminator-ui.forminator-custom-form[data-design=default] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single .select2-selection__arrow [class*=forminator-icon-]{display:block;margin:0 auto;font-size:12px;-webkit-transition:.2s linear;transition:.2s linear}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single .select2-selection__arrow [class*=forminator-icon-]:before,.forminator-ui.forminator-custom-form[data-design=default] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single .select2-selection__arrow [class*=forminator-icon-]:before{display:block;color:inherit}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single[aria-expanded=true] .select2-selection__arrow [class*=forminator-icon-],.forminator-ui.forminator-custom-form[data-design=default] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single[aria-expanded=true] .select2-selection__arrow [class*=forminator-icon-]{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] select.forminator-select2+.forminator-select .selection span[role=combobox]:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] select.forminator-select2+.forminator-select .selection span[role=combobox]:hover,.forminator-ui.forminator-custom-form[data-design=default] select.forminator-select2+.forminator-select .selection span[role=combobox]:focus,.forminator-ui.forminator-custom-form[data-design=default] select.forminator-select2+.forminator-select .selection span[role=combobox]:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] select.forminator-select2+.forminator-select .selection:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] select.forminator-select2+.forminator-select .selection:hover,.forminator-ui.forminator-custom-form[data-design=default] select.forminator-select2+.forminator-select .selection:focus,.forminator-ui.forminator-custom-form[data-design=default] select.forminator-select2+.forminator-select .selection:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] select.forminator-select2+.forminator-select:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] select.forminator-select2+.forminator-select:hover,.forminator-ui.forminator-custom-form[data-design=default] select.forminator-select2+.forminator-select:focus,.forminator-ui.forminator-custom-form[data-design=default] select.forminator-select2+.forminator-select:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.forminator-select.forminator-select-dropdown-container--open{display:block;z-index:999}.forminator-select.forminator-select-dropdown-container--open *{-webkit-box-sizing:border-box;box-sizing:border-box;font-variant-ligatures:none;-webkit-font-variant-ligatures:none;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-smoothing:antialiased;-webkit-font-smoothing:antialiased;text-shadow:rgba(0,0,0,.01) 0 0 1px}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown{display:block;margin:0}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown .select2-search{display:block;margin:0 0 10px;padding:0 10px}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown .select2-search input{width:100%;max-width:100%;display:block;margin:0}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown .select2-search input:focus,.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown .select2-search input:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown .select2-search.select2-search--hide{display:none!important}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown .select2-results{display:block;margin:0;padding:0;border:0}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown .select2-results .select2-results__options{max-height:200px;overflow-y:auto;display:block;margin:0;padding:0;border:0;list-style:none}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown .select2-results .select2-results__options .select2-results__option{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:block;margin:0;border:0;line-height:35px;list-style:none}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown .select2-results .select2-results__options .select2-results__option.select2-results__message{position:relative;margin:0 15px;padding:15px 20px;border:0}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown .select2-results .select2-results__options .select2-results__option:not(.select2-results__option--selected){cursor:pointer}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--default{padding:9px 0;border-width:1px;border-style:solid}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--default .select2-search{margin:0 0 9px;padding:0 9px}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--default .select2-search input{padding:9px;border-width:1px;border-style:solid;border-radius:2px}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--default .select2-results .select2-results__options .select2-results__option{padding:5px 8px}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--default .select2-results .select2-results__options .select2-results__option.select2-results__message{border-radius:2px}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--flat{padding:10px 0;border-width:0;border-style:none}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--flat .select2-search{margin:0 0 10px;padding:0 10px}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--flat .select2-search input{padding:10px;border-width:0;border-style:none;border-radius:0}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--flat .select2-results .select2-results__options .select2-results__option{padding:5px 10px}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--bold{padding:7px 0;border-width:3px;border-style:solid}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--bold .select2-search{margin:0 0 7px;padding:0 7px}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--bold .select2-search input{padding:7px;border-width:3px;border-style:solid}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--bold .select2-results .select2-results__options .select2-results__option{padding:5px 4px}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--material{padding:10px 0}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--material .select2-search input{padding:0 0 10px;border-width:0;border-bottom-width:1px;border-style:solid;background:none transparent;background-color:transparent!important}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--material .select2-results .select2-results__options .select2-results__option{padding:5px 8px}.sui-dialog-content .forminator-select.forminator-select-dropdown-container--open{margin-top:1px}body.admin-bar>.forminator-select.forminator-select-dropdown-container--open{margin-top:33px}body.forminator-hustle-dropdown-fix .forminator-select.forminator-select-dropdown-container--open{z-index:999999}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-button-paypal,.forminator-ui.forminator-custom-form[data-design=default] .forminator-button-paypal{display:block;position:relative;z-index:1;width:100%;-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1;-webkit-box-flex:unset!important;-ms-flex:unset!important;flex:unset!important;margin-bottom:20px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-button-paypal>.paypal-buttons,.forminator-ui.forminator-custom-form[data-design=default] .forminator-button-paypal>.paypal-buttons{display:block!important}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-button-paypal>.paypal-buttons>iframe,.forminator-ui.forminator-custom-form[data-design=default] .forminator-button-paypal>.paypal-buttons>iframe{width:100%!important}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-field-signature .forminator-signature,.forminator-ui.forminator-custom-form[data-design=default] .forminator-field-signature .forminator-signature{width:auto;max-width:100%;cursor:crosshair;overflow:hidden;display:inline-block;position:relative;margin:0;padding:0;border-width:1px;border-radius:2px;border-style:solid;background-color:transparent;-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-field-signature .forminator-signature *,.forminator-ui.forminator-custom-form[data-design=default] .forminator-field-signature .forminator-signature *{-webkit-box-sizing:border-box;box-sizing:border-box}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-field-signature .forminator-signature .forminator-signature--placeholder,.forminator-ui.forminator-custom-form[data-design=default] .forminator-field-signature .forminator-signature .forminator-signature--placeholder{pointer-events:none;display:block;position:absolute;top:9px;right:29px;left:9px;line-height:1.4;letter-spacing:normal;-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-field-signature .forminator-signature .forminator-signature--container canvas,.forminator-ui.forminator-custom-form[data-design=default] .forminator-field-signature .forminator-signature .forminator-signature--container canvas{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-field-signature .forminator-signature .forminator-signature--container+div,.forminator-ui.forminator-custom-form[data-design=default] .forminator-field-signature .forminator-signature .forminator-signature--container+div{width:20px!important;height:20px!important;cursor:pointer;overflow:hidden;position:absolute!important;top:7px;right:7px;margin:0!important;padding:2px;border:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-field-signature .forminator-signature .forminator-signature--container+div img,.forminator-ui.forminator-custom-form[data-design=default] .forminator-field-signature .forminator-signature .forminator-signature--container+div img{width:16px!important;height:16px!important;float:none!important;display:block}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-field-signature.forminator-is_filled .forminator-signature .forminator-signature--placeholder,.forminator-ui.forminator-custom-form[data-design=default] .forminator-field-signature.forminator-is_filled .forminator-signature .forminator-signature--placeholder{opacity:0;-khtml-opacity:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-content,.forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-content{display:block}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-content,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-content li,.forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-content,.forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-content li{margin:0;padding:0;border:0;list-style:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-content li:after,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-content li:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-content:after,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-content:before,.forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-content li:after,.forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-content li:before,.forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-content:after,.forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-content:before{content:unset}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-content li,.forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-content li{display:none;visibility:hidden}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-content li:focus,.forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-content li:focus{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-content li.forminator-current,.forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-content li.forminator-current{display:block;visibility:visible}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-footer,.forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-footer{display:block;margin:20px 0 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-footer .forminator-button,.forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-footer .forminator-button{width:100%;display:block;margin-right:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-footer .forminator-button:last-child,.forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-footer .forminator-button:last-child{margin-bottom:0}@media (max-width:782px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-footer .forminator-button,.forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-footer .forminator-button{margin-right:0;margin-bottom:10px}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-footer,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-footer{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;margin:30px 0 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-footer a,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-footer button,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-footer a,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-footer button{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-footer .forminator-button:last-child,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-footer .forminator-button:last-child{margin-right:0}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-footer .forminator-button,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-footer .forminator-button{width:auto;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small).draft-enabled .forminator-pagination-footer,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small).draft-enabled .forminator-pagination-footer{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small).draft-enabled .forminator-pagination-footer .forminator-button-back,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small).draft-enabled .forminator-pagination-footer .forminator-button-back{margin-right:20px}@media (max-width:782px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small).draft-enabled .forminator-pagination-footer .forminator-button-back,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small).draft-enabled .forminator-pagination-footer .forminator-button-back{margin-right:0}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small).draft-enabled .forminator-pagination-footer .forminator-save-draft-link,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small).draft-enabled .forminator-pagination-footer .forminator-save-draft-link{padding:10px 0;margin:0 auto 0 0;text-align:right;line-height:22px}@media (max-width:782px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small).draft-enabled .forminator-pagination-footer .forminator-save-draft-link,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small).draft-enabled .forminator-pagination-footer .forminator-save-draft-link{width:100%;text-align:center;margin:0 0 10px;-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-steps,.forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-steps{display:block;margin:0 0 20px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-steps .forminator-break,.forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-steps .forminator-break{width:1px;height:30px;display:block;margin:0 7px;position:relative;z-index:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-steps .forminator-break:before,.forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-steps .forminator-break:before{content:" ";width:3px;height:100%;display:block;position:absolute;top:0;left:-1px;-webkit-transition:.2s linear;transition:.2s linear}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-steps .forminator-break:first-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-steps .forminator-break:last-child,.forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-steps .forminator-break:first-child,.forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-steps .forminator-break:last-child{display:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-steps .forminator-step,.forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-steps .forminator-step{height:15px;cursor:pointer;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:0;padding:0;border:0;border-radius:0;background-color:transparent;-webkit-box-shadow:none;box-shadow:none;text-transform:none;text-decoration:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-steps .forminator-step .forminator-step-label,.forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-steps .forminator-step .forminator-step-label{overflow:hidden;display:block;-webkit-box-flex:1;-ms-flex:1;flex:1;line-height:1.6em;text-overflow:ellipsis;white-space:nowrap}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-steps .forminator-step .forminator-step-label+.forminator-step-dot,.forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-steps .forminator-step .forminator-step-label+.forminator-step-dot{margin-right:5px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-steps .forminator-step .forminator-step-dot,.forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-steps .forminator-step .forminator-step-dot{width:15px;height:15px;display:block;-webkit-box-flex:0;-ms-flex:0 0 15px;flex:0 0 15px;border-width:1px;border-style:solid;border-radius:30px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-steps .forminator-step.forminator-current~.forminator-break:before,.forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-steps .forminator-step.forminator-current~.forminator-break:before{height:0}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-steps .forminator-break:before,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-steps .forminator-break:before{width:100%;height:3px;top:-1px;left:0}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-steps .forminator-break:first-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-steps .forminator-break:last-child,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-steps .forminator-break:first-child,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-steps .forminator-break:last-child{display:block}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-steps .forminator-break,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-steps .forminator-break{width:auto;height:1px;-webkit-box-flex:1;-ms-flex:1;flex:1;margin:7px 0}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-steps .forminator-step .forminator-step-label+.forminator-step-dot,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-steps .forminator-step .forminator-step-label+.forminator-step-dot{margin-top:5px;margin-right:0}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-steps .forminator-step .forminator-step-label,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-steps .forminator-step .forminator-step-label{overflow:unset;text-align:center;text-overflow:unset;white-space:normal;word-break:normal}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-steps .forminator-step.forminator-current~.forminator-break:before,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-steps .forminator-step.forminator-current~.forminator-break:before{width:0}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-steps .forminator-step,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-steps .forminator-step{width:15px;height:auto;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:unset;-ms-flex-pack:unset;justify-content:unset}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-steps,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-steps{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end;margin-bottom:30px}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-progress,.forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-progress{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:0 0 20px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-progress .forminator-progress-label,.forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-progress .forminator-progress-label{display:block;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;line-height:2.2em}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-progress .forminator-progress-label+.forminator-progress-bar,.forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-progress .forminator-progress-label+.forminator-progress-bar{margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-progress .forminator-progress-bar,.forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-progress .forminator-progress-bar{height:8px;overflow:hidden;display:block;-webkit-box-flex:1;-ms-flex:1;flex:1;position:relative;border-radius:8px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-progress .forminator-progress-bar span,.forminator-ui.forminator-custom-form[data-design=default] .forminator-pagination-progress .forminator-progress-bar span{height:8px;display:block}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-progress .forminator-progress-label+.forminator-progress-bar,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-progress .forminator-progress-label+.forminator-progress-bar{margin-left:15px}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-progress,.forminator-ui.forminator-custom-form[data-design=default]:not(.forminator-size--small) .forminator-pagination-progress{margin-bottom:30px}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material],.forminator-ui.forminator-custom-form[data-design=bold],.forminator-ui.forminator-custom-form[data-design=default],.forminator-ui.forminator-custom-form[data-design=flat],.forminator-ui.forminator-custom-form[data-design=material],.ui-datepicker.forminator-calendar--bold,.ui-datepicker.forminator-calendar--bold *,.ui-datepicker.forminator-calendar--default,.ui-datepicker.forminator-calendar--default *,.ui-datepicker.forminator-calendar--flat,.ui-datepicker.forminator-calendar--flat *,.ui-datepicker.forminator-calendar--material,.ui-datepicker.forminator-calendar--material *{font-variant-ligatures:none;-webkit-font-variant-ligatures:none;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-smoothing:antialiased;-webkit-font-smoothing:antialiased;text-shadow:rgba(0,0,0,.01) 0 0 1px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload>span,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload>span,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload>span,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload>span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox .forminator-checkbox-box:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-loading:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox .forminator-checkbox-box:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-loading:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox .forminator-checkbox-box:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-loading:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox .forminator-checkbox-box:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-loading:before,.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before,.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before,.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before,.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before,.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before,.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before,.ui-datepicker.forminator-calendar--material .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before,.ui-datepicker.forminator-calendar--material .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before{speak:none;line-height:1;font-family:forminator-icons-font!important;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;letter-spacing:0;-webkit-font-feature-settings:"liga" 1;font-feature-settings:"liga" 1;-webkit-font-variant-ligatures:discretionary-ligatures;font-variant-ligatures:discretionary-ligatures;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-accessible,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-accessible,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-accessible,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=bold] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=default] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=default] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=flat] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=material] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=material] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-accessible,.select2-hidden-accessible,.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-corner-all .ui-icon,.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-corner-all .ui-icon,.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-corner-all .ui-icon,.ui-datepicker.forminator-calendar--material .ui-datepicker-header .ui-corner-all .ui-icon{width:1px!important;height:1px!important;overflow:hidden!important;position:absolute!important;white-space:nowrap!important;margin:-1px!important;padding:0!important;border:0!important;clip:rect(0 0 0 0)!important;-webkit-clip-path:inset(50%)!important;clip-path:inset(50%)!important}@keyframes spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes click-animation{0%{-webkit-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1);opacity:.2;-khtml-opacity:.2}50%{-webkit-transform:translate(-50%,-50%) scale(2);transform:translate(-50%,-50%) scale(2);opacity:.1;-khtml-opacity:.1}100%{-webkit-transform:translate(-50%,-50%) scale(0);transform:translate(-50%,-50%) scale(0);opacity:0;-khtml-opacity:0}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat],.forminator-ui.forminator-custom-form[data-design=flat]{width:100%;margin:30px 0;-webkit-box-sizing:border-box;box-sizing:border-box}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-field,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-field{margin:0;padding:0;border:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-field:focus,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-field:focus{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:first-child,.forminator-ui.forminator-custom-form[data-design=flat]:first-child{margin-top:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:last-child,.forminator-ui.forminator-custom-form[data-design=flat]:last-child{margin-bottom:0}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small):first-child,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small):first-child{margin-top:0}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small):last-child,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small):last-child{margin-bottom:0}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small).forminator-fields-disabled>.forminator-pagination>*,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small).forminator-fields-disabled>:not(.forminator-response-message):not(.forminator-pagination),.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small).forminator-fields-disabled>.forminator-pagination>*,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small).forminator-fields-disabled>:not(.forminator-response-message):not(.forminator-pagination){opacity:.5;-khtml-opacity:.5;pointer-events:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small).forminator-fields-disabled>.forminator-pagination>* *,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small).forminator-fields-disabled>:not(.forminator-response-message):not(.forminator-pagination) *,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small).forminator-fields-disabled>.forminator-pagination>* *,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small).forminator-fields-disabled>:not(.forminator-response-message):not(.forminator-pagination) *{pointer-events:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row),.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row){cursor:not-allowed}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row) .forminator-col,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row) .forminator-col{opacity:.5;-khtml-opacity:.5}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row) .forminator-col,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row) .forminator-col *,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row) .forminator-col,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row) .forminator-col *{pointer-events:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small).forminator-partial-disabled .forminator-pagination-footer .forminator-button:not(.forminator-button-submit),.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small).forminator-partial-disabled .forminator-pagination-footer .forminator-button:not(.forminator-button-submit){opacity:.5;-khtml-opacity:.5;pointer-events:none}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small),.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small){margin:30px 0}}.forminator-draft-wrap{font-weight:400;font-size:15px}.forminator-draft-wrap .forminator-draft-notice{margin-bottom:30px;padding:15px 22px;border-radius:2px;font-family:inherit;font-size:inherit;font-weight:inherit;color:#333;background-color:#bceee6}.forminator-draft-wrap .forminator-draft-notice.draft-success{background-color:#bceee6;box-shadow:inset 2px 0 0 0 #1abca1;-moz-box-shadow:inset 2px 0 0 0 #1abca1;-webkit-box-shadow:inset 2px 0 0 0 #1abca1}.forminator-draft-wrap .forminator-draft-notice.draft-error{background-color:#f9e4e8;box-shadow:inset 2px 0 0 0 #e04562;-moz-box-shadow:inset 2px 0 0 0 #e04562;-webkit-box-shadow:inset 2px 0 0 0 #e04562}.forminator-draft-wrap .forminator-draft-email-response p:last-of-type{margin-bottom:20px}.forminator-draft-wrap .forminator-copy-field{position:relative;margin-bottom:40px}.forminator-draft-wrap .forminator-copy-field .forminator-draft-link{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;padding:9px 110px 11px 15px;margin:0;background:#eee;border:none;color:#555;text-decoration:underline;outline:0;line-height:20px;font-family:inherit;font-size:inherit;font-weight:inherit;opacity:1}.forminator-draft-wrap .forminator-copy-field button,.forminator-draft-wrap .forminator-copy-field button:hover{width:98px;height:30px;padding:0;position:absolute;top:50%;right:6px;background-color:#666;color:#fff;font-family:inherit;font-style:inherit;font-weight:500;font-size:13px;line-height:22px;border:0;outline:0;-webkit-transform:translateY(-50%);transform:translateY(-50%);cursor:pointer}.forminator-draft-wrap .forminator-copy-field button:hover{background-color:#7b7b7b}.forminator-draft-wrap .forminator-draft-form .forminator-row{margin-bottom:20px}.forminator-draft-wrap .forminator-draft-form .forminator-label{display:block;cursor:default;margin:0 0 5px 0;border:0;line-height:1.7em;font-size:13px;font-family:inherit;font-weight:500;color:#888}.forminator-draft-wrap .forminator-draft-form .forminator-email--field{display:block;width:100%;min-width:unset;max-width:unset;height:auto;min-height:unset;max-height:unset;margin:0;padding:10px;font-size:16px;font-family:inherit;font-weight:400;background-color:#ededed;color:#000;border-width:0;border-style:none;border-radius:0;background-image:unset;line-height:1.3em;-webkit-transition:.2s ease;transition:.2s ease;outline:0}.forminator-draft-wrap .forminator-draft-form .forminator-has_error .forminator-email--field{box-shadow:inset 2px 0 0 0 #e04562;-moz-box-shadow:inset 2px 0 0 0 #e04562;-webkit-box-shadow:inset 2px 0 0 0 #e04562}.forminator-draft-wrap .forminator-draft-form .forminator-has_error .forminator-error-message{display:block;padding:2px 10px;margin:5px 0 0;border-radius:0;line-height:2em;background-color:#f9e4e8;color:#e04562;font-size:12px;font-family:inherit;font-weight:500}.forminator-draft-wrap .forminator-draft-form button.forminator-button-submit{background-color:#289dcc;color:#fff;font-size:14px;font-family:inherit;font-weight:500;outline:0;width:auto;min-width:100px;max-width:unset;height:auto;min-height:unset;max-height:unset;cursor:pointer;display:inline-block;position:relative;margin:0 10px 0 0;padding:10px;border:0;border-radius:0;background-image:unset;line-height:1.45em;text-align:center;-webkit-transition:.2s ease;transition:.2s ease}.forminator-draft-wrap .forminator-draft-form button.forminator-button-submit:hover{background-color:#35aede}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message{margin:0 0 20px;padding:15px 10px;border-radius:0;text-align:left}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message p,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message p{margin:0;padding:0;border:0;line-height:1.3em;letter-spacing:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message p:not(:last-child),.forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message p:not(:last-child){margin-bottom:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message:active,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message:hover,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message:active,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message:focus,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message:last-child,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message:last-child{margin-bottom:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message[aria-hidden=true],.forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message[aria-hidden=true]{display:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-loading,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-loading{position:relative;padding-left:46px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-loading:before{content:"◌";position:absolute;top:17px;left:20px;font-size:16px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-show,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-show{display:block}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-response-message:last-child,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-response-message:last-child{margin-bottom:0}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-response-message,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-response-message{margin-bottom:30px}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-subtitle,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-title,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-subtitle,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-title{display:block;margin:0;padding:0;border:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-subtitle:after,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-subtitle:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-title:after,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-title:before,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-subtitle:after,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-subtitle:before,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-title:after,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-title:before{content:unset;display:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-title,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-title{line-height:1em}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-title+.forminator-subtitle,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-title+.forminator-subtitle{margin-top:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-subtitle,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-subtitle{line-height:1.4em}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-border,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-border{width:100%;min-width:100%;max-width:100%;height:0;min-height:unset;max-height:unset;display:block;margin:20px 0 0;padding:0;border:0;background-image:unset;background-color:transparent}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-border:first-child,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-border:first-child{margin-top:0}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-border:first-child,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-border:first-child{margin-top:0}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-border,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-border{margin-top:30px}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-label,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-label{cursor:default;display:block;margin:0;border:0;line-height:1.7em}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-label[for],.forminator-ui.forminator-custom-form[data-design=flat] .forminator-label[for]{cursor:pointer}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-description,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-error-message,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-description,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-error-message{margin:5px 0 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-description,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-description{display:-webkit-box;display:-ms-flexbox;display:flex;line-height:1.5em}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-description span,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-description span{min-width:80px;margin-right:0;margin-left:auto;text-align:right}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-error-message,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-error-message{display:none;padding:2px 10px;border-radius:0;line-height:2em}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-has_error .forminator-error-message,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-has_error .forminator-error-message{display:block}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;min-width:unset;max-width:unset;height:auto;min-height:unset;max-height:unset;display:block;margin:0;padding:10px;border-width:0;border-style:none;border-radius:0;background-image:unset;line-height:1.3em;-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input:active,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input:disabled,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input:hover,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input:active,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input:disabled,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input:focus,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input:disabled,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input:disabled{pointer-events:none;border-style:dotted}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input:disabled:-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input:disabled:-moz-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input:disabled::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input:disabled::-moz-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input:disabled:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input:disabled:-ms-input-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input:disabled::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input:disabled::-webkit-input-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-prefix,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-prefix{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-prefix input,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-prefix input{min-width:50px;display:block;-webkit-box-flex:1;-ms-flex:1;flex:1;margin:0;padding:0;border:0;background-image:none;background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-prefix .forminator-prefix,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-prefix .forminator-suffix,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-prefix .forminator-prefix,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-prefix .forminator-suffix{display:block;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-prefix .forminator-prefix,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-prefix .forminator-prefix{margin-right:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-prefix .forminator-suffix,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-prefix .forminator-suffix{margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-textarea,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-textarea{width:100%;min-height:140px;resize:vertical;display:block;margin:0;padding:10px;border:0;border-radius:0;background-image:unset;line-height:20px;-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-textarea,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-textarea:active,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-textarea:disabled,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-textarea:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-textarea:hover,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-textarea,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-textarea:active,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-textarea:disabled,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-textarea:focus,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-textarea:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-textarea:disabled,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-textarea:disabled{pointer-events:none;border-style:dotted}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-textarea:disabled:-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-textarea:disabled:-moz-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-textarea:disabled::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-textarea:disabled::-moz-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-textarea:disabled:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-textarea:disabled:-ms-input-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-textarea:disabled::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-textarea:disabled::-webkit-input-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-has_error .tmce-active .forminator-textarea.wp-editor-area,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-has_error .tmce-active .forminator-textarea.wp-editor-area{display:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio{cursor:default;pointer-events:none;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:relative;margin:10px 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio input:checked+.forminator-radio-bullet:before,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio input:checked+.forminator-radio-bullet:before{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio span,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio span{cursor:pointer;pointer-events:all;display:block}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio .forminator-radio-bullet,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio .forminator-radio-bullet{width:20px;height:20px;-webkit-box-flex:0;-ms-flex:0 0 20px;flex:0 0 20px;position:relative;border-width:0;border-style:none;border-radius:40px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio .forminator-radio-bullet:before,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio .forminator-radio-bullet:before{content:" ";width:10px;height:10px;opacity:0;-khtml-opacity:0;display:block;position:absolute;top:50%;left:50%;border-radius:100%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio .forminator-radio-bullet~span,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio .forminator-radio-bullet~span{margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio .forminator-radio-label,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio .forminator-radio-label{-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;line-height:20px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio .forminator-radio-image,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio .forminator-radio-image{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;padding:5px;border-width:0;border-style:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio .forminator-radio-image span,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio .forminator-radio-image span{width:70px;height:70px;background-repeat:no-repeat;background-size:cover;background-position:center}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio.forminator-has_image .forminator-radio-image,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio.forminator-has_image .forminator-radio-image{margin-left:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio.forminator-radio-inline,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio.forminator-radio-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle;margin-right:20px;margin-bottom:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio.forminator-radio-inline.forminator-has_image.forminator-has_bullet,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio.forminator-radio-inline.forminator-has_image.forminator-has_bullet{min-width:80px;padding-top:90px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio.forminator-radio-inline.forminator-has_image.forminator-has_bullet .forminator-radio-image,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio.forminator-radio-inline.forminator-has_image.forminator-has_bullet .forminator-radio-image{position:absolute;top:0;left:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio.forminator-radio-inline:last-of-type,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio.forminator-radio-inline:last-of-type{margin-right:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio:not(.forminator-radio-inline),.forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio:not(.forminator-radio-inline){margin:20px 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio:not(.forminator-radio-inline).forminator-has_image.forminator-has_bullet .forminator-radio-bullet,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio:not(.forminator-radio-inline).forminator-has_image.forminator-has_bullet .forminator-radio-bullet{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2;margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio:not(.forminator-radio-inline).forminator-has_image.forminator-has_bullet .forminator-radio-label,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio:not(.forminator-radio-inline).forminator-has_image.forminator-has_bullet .forminator-radio-label{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio:not(.forminator-radio-inline).forminator-has_image.forminator-has_bullet .forminator-radio-image,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio:not(.forminator-radio-inline).forminator-has_image.forminator-has_bullet .forminator-radio-image{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio:not(.forminator-radio-inline):first-of-type,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio:not(.forminator-radio-inline):first-of-type{margin-top:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio:not(.forminator-radio-inline):first-child,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio:not(.forminator-radio-inline):first-child{margin-top:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio:not(.forminator-radio-inline):last-of-type,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio:not(.forminator-radio-inline):last-of-type{margin-bottom:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio:not(.forminator-radio-inline):last-child,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio:not(.forminator-radio-inline):last-child{margin-bottom:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox{cursor:default;pointer-events:none;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:relative;margin:10px 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox input:checked+.forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox input:checked+.forminator-checkbox-box:before{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox span,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox span{cursor:pointer;pointer-events:all;display:block}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox .forminator-checkbox-box,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox .forminator-checkbox-box{width:20px;height:20px;-webkit-box-flex:0;-ms-flex:0 0 20px;flex:0 0 20px;position:relative;border-width:0;border-style:none;border-radius:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox .forminator-checkbox-box:before{content:"✓";opacity:0;-khtml-opacity:0;display:block;position:absolute;top:50%;left:50%;color:inherit;font-size:12px;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox .forminator-checkbox-box~span,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox .forminator-checkbox-box~span{margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox-label,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox-label{-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;line-height:20px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox .forminator-checkbox-image,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox .forminator-checkbox-image{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;padding:5px;border-width:0;border-style:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox .forminator-checkbox-image span,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox .forminator-checkbox-image span{width:70px;height:70px;background-repeat:no-repeat;background-size:cover;background-position:center}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox__wrapper,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox__wrapper{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox__label,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox__label{-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;line-height:20px;margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox__label h1:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox__label h2:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox__label h3:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox__label h4:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox__label h5:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox__label h6:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox__label ol:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox__label p:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox__label ul:last-child,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox__label h1:last-child,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox__label h2:last-child,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox__label h3:last-child,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox__label h4:last-child,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox__label h5:last-child,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox__label h6:last-child,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox__label ol:last-child,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox__label p:last-child,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox__label ul:last-child{margin-bottom:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox.forminator-has_image .forminator-checkbox-image,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox.forminator-has_image .forminator-checkbox-image{margin-left:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox.forminator-checkbox-inline,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox.forminator-checkbox-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle;margin-right:20px;margin-bottom:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox.forminator-checkbox-inline.forminator-has_box,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox.forminator-checkbox-inline.forminator-has_box{min-width:80px;padding-top:90px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox.forminator-checkbox-inline.forminator-has_box .forminator-checkbox-image,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox.forminator-checkbox-inline.forminator-has_box .forminator-checkbox-image{position:absolute;top:0;left:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox.forminator-checkbox-inline:last-of-type,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox.forminator-checkbox-inline:last-of-type{margin-right:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox:not(.forminator-checkbox-inline),.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox:not(.forminator-checkbox-inline){margin:20px 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox:not(.forminator-checkbox-inline).forminator-has_image.forminator-has_box .forminator-checkbox-box,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox:not(.forminator-checkbox-inline).forminator-has_image.forminator-has_box .forminator-checkbox-box{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2;margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox:not(.forminator-checkbox-inline).forminator-has_image.forminator-has_box .forminator-checkbox-label,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox:not(.forminator-checkbox-inline).forminator-has_image.forminator-has_box .forminator-checkbox-label{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox:not(.forminator-checkbox-inline).forminator-has_image.forminator-has_box .forminator-checkbox-image,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox:not(.forminator-checkbox-inline).forminator-has_image.forminator-has_box .forminator-checkbox-image{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox:not(.forminator-checkbox-inline):first-of-type,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox:not(.forminator-checkbox-inline):first-of-type{margin-top:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox:not(.forminator-checkbox-inline):first-child,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox:not(.forminator-checkbox-inline):first-child{margin-top:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox:not(.forminator-checkbox-inline):last-of-type,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox:not(.forminator-checkbox-inline):last-of-type{margin-bottom:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox:not(.forminator-checkbox-inline):last-child,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox:not(.forminator-checkbox-inline):last-child{margin-bottom:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-button,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-button{width:auto;min-width:100px;max-width:unset;height:auto;min-height:unset;max-height:unset;cursor:pointer;display:inline-block;position:relative;margin:0 10px 0 0;padding:10px;border:0;border-radius:0;background-image:unset;line-height:1.45em;text-align:center;-webkit-transition:.2s ease;transition:.2s ease}@media (max-width:782px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-button,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-button{width:100%;margin:0 0 10px 0}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-button span,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-button span{display:block;-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-button .forminator-icon-loader,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-button .forminator-icon-loader{opacity:0;-khtml-opacity:0;position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-button .forminator-icon-loader:before,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-button .forminator-icon-loader:before{display:block}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-button,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-button:active,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-button:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-button:hover,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-button,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-button:active,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-button:focus,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-button:hover{outline:0;-webkit-box-shadow:none;box-shadow:none;text-decoration:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-button:active,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-button:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-button:hover,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-button:active,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-button:focus,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-button:hover{-webkit-box-shadow:0 1px 4px 0 rgba(0,0,0,.6);box-shadow:0 1px 4px 0 rgba(0,0,0,.6)}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-button:active span[aria-hidden]:not([class*=forminator-icon-]),.forminator-ui.forminator-custom-form[data-design=flat] .forminator-button:active span[aria-hidden]:not([class*=forminator-icon-]){width:120%;padding:120% 0 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-button.forminator-disabled,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-button.forminator-onload,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-button:disabled,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-button.forminator-disabled,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-button.forminator-onload,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-button:disabled{opacity:.5;-khtml-opacity:.5;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-button.forminator-onload span,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-button.forminator-onload span{opacity:0;-khtml-opacity:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-button.forminator-onload .forminator-icon-loader,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-button.forminator-onload .forminator-icon-loader{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-button:last-child,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-button:last-child{margin-right:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat].draft-enabled .forminator-save-draft-link,.forminator-ui.forminator-custom-form[data-design=flat].draft-enabled .forminator-save-draft-link{display:inline-block;font-size:15px;font-weight:500;color:#17a8e3;text-decoration:none;background-color:transparent;padding:10px 0;margin:0 10px;text-decoration:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat].draft-enabled .forminator-save-draft-link.disabled,.forminator-ui.forminator-custom-form[data-design=flat].draft-enabled .forminator-save-draft-link.disabled{color:#a5a5a5;cursor:default}@media (max-width:782px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat].draft-enabled .forminator-save-draft-link,.forminator-ui.forminator-custom-form[data-design=flat].draft-enabled .forminator-save-draft-link{text-align:center;width:100%;margin:0 0 10px 0}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat].draft-enabled .forminator-button-paypal+.forminator-save-draft-link,.forminator-ui.forminator-custom-form[data-design=flat].draft-enabled .forminator-button-paypal+.forminator-save-draft-link{margin:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-g-recaptcha .grecaptcha-badge,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-g-recaptcha .grecaptcha-badge{visibility:visible}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material],.forminator-ui.forminator-custom-form[data-design=bold],.forminator-ui.forminator-custom-form[data-design=default],.forminator-ui.forminator-custom-form[data-design=flat],.forminator-ui.forminator-custom-form[data-design=material],.ui-datepicker.forminator-calendar--bold,.ui-datepicker.forminator-calendar--bold *,.ui-datepicker.forminator-calendar--default,.ui-datepicker.forminator-calendar--default *,.ui-datepicker.forminator-calendar--flat,.ui-datepicker.forminator-calendar--flat *,.ui-datepicker.forminator-calendar--material,.ui-datepicker.forminator-calendar--material *{font-variant-ligatures:none;-webkit-font-variant-ligatures:none;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-smoothing:antialiased;-webkit-font-smoothing:antialiased;text-shadow:rgba(0,0,0,.01) 0 0 1px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload>span,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload>span,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload>span,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload>span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox .forminator-checkbox-box:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-loading:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox .forminator-checkbox-box:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-loading:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox .forminator-checkbox-box:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-loading:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox .forminator-checkbox-box:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-loading:before,.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before,.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before,.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before,.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before,.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before,.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before,.ui-datepicker.forminator-calendar--material .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before,.ui-datepicker.forminator-calendar--material .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before{speak:none;line-height:1;font-family:forminator-icons-font!important;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;letter-spacing:0;-webkit-font-feature-settings:"liga" 1;font-feature-settings:"liga" 1;-webkit-font-variant-ligatures:discretionary-ligatures;font-variant-ligatures:discretionary-ligatures;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-accessible,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-accessible,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-accessible,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=bold] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=default] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=default] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=flat] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=material] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=material] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-accessible,.select2-hidden-accessible,.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-corner-all .ui-icon,.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-corner-all .ui-icon,.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-corner-all .ui-icon,.ui-datepicker.forminator-calendar--material .ui-datepicker-header .ui-corner-all .ui-icon{width:1px!important;height:1px!important;overflow:hidden!important;position:absolute!important;white-space:nowrap!important;margin:-1px!important;padding:0!important;border:0!important;clip:rect(0 0 0 0)!important;-webkit-clip-path:inset(50%)!important;clip-path:inset(50%)!important}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-icon,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-icon{position:relative}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-icon [class*=forminator-icon-],.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-icon [class*=forminator-icon-]{display:block;position:absolute;top:50%;left:10px;font-size:16px;-webkit-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-icon [class*=forminator-icon-]:before,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-icon [class*=forminator-icon-]:before{color:inherit}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-icon .forminator-input,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-icon .forminator-input{padding-left:36px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-suffix,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-suffix{position:relative}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-suffix .forminator-input,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-suffix .forminator-input{padding-right:60px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-suffix .forminator-suffix,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-suffix .forminator-suffix{display:block;position:absolute;top:50%;right:0;padding:0 10px;-webkit-transform:translateY(-50%);transform:translateY(-50%);line-height:1.4em}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-phone,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-phone{display:block}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-phone .iti__flag-container,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-phone .iti__flag-container{padding:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-phone .iti__flag-container .iti__selected-flag,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-phone .iti__flag-container .iti__selected-flag{width:auto;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:0;padding:0 10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-phone .iti__flag-container .iti__selected-flag .iti__flag,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-phone .iti__flag-container .iti__selected-flag .iti__flag{display:block;position:relative;top:auto;bottom:auto;margin:0;padding:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-phone .iti__flag-container .iti__selected-flag .iti__flag+.iti__arrow,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-phone .iti__flag-container .iti__selected-flag .iti__flag+.iti__arrow{margin-left:5px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-phone .iti__flag-container .iti__selected-flag .iti__arrow,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-phone .iti__flag-container .iti__selected-flag .iti__arrow{display:block;position:relative;top:auto;right:auto;margin:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-phone .iti__flag-container .iti__selected-flag:active,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-phone .iti__flag-container .iti__selected-flag:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-phone .iti__flag-container .iti__selected-flag:hover,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-phone .iti__flag-container .iti__selected-flag:active,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-phone .iti__flag-container .iti__selected-flag:focus,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-phone .iti__flag-container .iti__selected-flag:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-phone .iti__flag-container:active,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-phone .iti__flag-container:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-phone .iti__flag-container:hover,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-phone .iti__flag-container:active,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-phone .iti__flag-container:focus,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-phone .iti__flag-container:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-phone.iti--allow-dropdown .forminator-input,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-phone.iti--allow-dropdown .forminator-input{padding-left:50px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-phone:not(.iti--allow-dropdown) .iti__flag-container,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-phone:not(.iti--allow-dropdown) .iti__flag-container{pointer-events:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-phone:not(.iti--allow-dropdown) .forminator-input,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-phone:not(.iti--allow-dropdown) .forminator-input{padding-right:50px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-phone .iti__flag-container .iti__selected-flag,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-phone .iti__flag-container .iti__selected-flag{width:31px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:0;padding:0 10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-phone .iti__flag-container .iti__selected-flag .iti__flag,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-phone .iti__flag-container .iti__selected-flag .iti__flag{display:block;position:relative;top:auto;bottom:auto;margin:0;padding:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-phone .iti__flag-container .iti__selected-flag .iti__flag+.iti__arrow,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-phone .iti__flag-container .iti__selected-flag .iti__flag+.iti__arrow{margin-left:5px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-phone .iti__flag-container .iti__selected-flag .iti__arrow,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-phone .iti__flag-container .iti__selected-flag .iti__arrow{display:block;position:relative;top:auto;right:auto;margin:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-phone .iti__flag-container .iti__selected-flag:active,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-phone .iti__flag-container .iti__selected-flag:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-phone .iti__flag-container .iti__selected-flag:hover,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-phone .iti__flag-container .iti__selected-flag:active,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-phone .iti__flag-container .iti__selected-flag:focus,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-phone .iti__flag-container .iti__selected-flag:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-phone .iti__flag-container:active,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-phone .iti__flag-container:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-phone .iti__flag-container:hover,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-phone .iti__flag-container:active,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-phone .iti__flag-container:focus,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-phone .iti__flag-container:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-phone.iti--allow-dropdown .forminator-input--wrap,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-phone.iti--allow-dropdown .forminator-input--wrap{left:41px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-phone:not(.iti--allow-dropdown) .forminator-input--wrap,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-input-with-phone:not(.iti--allow-dropdown) .forminator-input--wrap{left:30px}.iti-mobile .iti--container{z-index:999991}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload>span{overflow:hidden;display:block;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload>span:not(:last-child),.forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload>span:not(:last-child){margin-right:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-button-delete,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-button-delete{width:20px;height:20px;cursor:pointer;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin:0;padding:0;border:0;border-radius:100%;font-size:14px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-button-delete [class*=forminator-icon-],.forminator-ui.forminator-custom-form[data-design=flat] .forminator-button-delete [class*=forminator-icon-]{display:block}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-button-delete [class*=forminator-icon-]:before,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-button-delete [class*=forminator-icon-]:before{display:block;color:inherit}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-col-3 .forminator-file-upload .forminator-button-upload,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-col-4 .forminator-file-upload .forminator-button-upload,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-col-3 .forminator-file-upload .forminator-button-upload,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-col-4 .forminator-file-upload .forminator-button-upload{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-col-3 .forminator-file-upload>span:not(:last-child),.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-col-4 .forminator-file-upload>span:not(:last-child),.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-col-3 .forminator-file-upload>span:not(:last-child),.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-col-4 .forminator-file-upload>span:not(:last-child){margin-right:0}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-col-3 .forminator-file-upload>span,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-col-4 .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-col-3 .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-col-4 .forminator-file-upload>span{-webkit-box-flex:1;-ms-flex:1;flex:1;margin-top:10px}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-col-3 .forminator-file-upload .forminator-button-delete,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-col-4 .forminator-file-upload .forminator-button-delete,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-col-3 .forminator-file-upload .forminator-button-delete,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-col-4 .forminator-file-upload .forminator-button-delete{margin-top:10px}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-col-3 .forminator-file-upload,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-col-4 .forminator-file-upload,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-col-3 .forminator-file-upload,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-col-4 .forminator-file-upload{-ms-flex-wrap:wrap;flex-wrap:wrap}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload{display:block;margin:0;padding:30px;border:0;border-radius:0;-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload .forminator-multi-upload-message [class*=forminator-icon-],.forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload .forminator-multi-upload-message [class*=forminator-icon-]{width:30px;height:30px;display:block;margin:0 auto 5px;color:inherit;text-align:center}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload .forminator-multi-upload-message [class*=forminator-icon-]:before,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload .forminator-multi-upload-message [class*=forminator-icon-]:before{display:block;color:inherit;font-size:30px;line-height:30px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload .forminator-multi-upload-message p,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload .forminator-multi-upload-message p{display:block;margin:0;padding:0;border:0;text-align:center}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload .forminator-multi-upload-message p a,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload .forminator-multi-upload-message p a:active a:visited,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload .forminator-multi-upload-message p a:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload .forminator-multi-upload-message p a:hover,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload .forminator-multi-upload-message p a,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload .forminator-multi-upload-message p a:active a:visited,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload .forminator-multi-upload-message p a:focus,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload .forminator-multi-upload-message p a:hover{margin:0;padding:0;border:0;outline:0;-webkit-box-shadow:none;box-shadow:none;text-decoration:underline;text-transform:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-files,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-files{display:block;margin:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-files,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-files li,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-files,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-files li{padding:0;border:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-files.forminator-has-files,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-files.forminator-has-files{margin-top:20px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file{display:block;margin:0 0 20px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--content,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--content{direction:ltr;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--image,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--preview,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--image,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--preview{width:36px;height:36px;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;margin:0;padding:0;border-style:solid;border-radius:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--image+.forminator-uploaded-file--text,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--preview+.forminator-uploaded-file--text,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--image+.forminator-uploaded-file--text,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--preview+.forminator-uploaded-file--text{margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--image,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--image{overflow:hidden;position:relative;border-width:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--image [role=image],.forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--image [role=image]{position:absolute;top:0;right:0;bottom:0;left:0;background-size:cover;background-position:center;background-repeat:no-repeat;background-color:transparent}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--preview,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--preview{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;border-width:0;text-align:center}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--preview [class*=forminator-icon-],.forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--preview [class*=forminator-icon-]{display:block;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--preview [class*=forminator-icon-]:before,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--preview [class*=forminator-icon-]:before{display:block;color:inherit;font-size:16px;line-height:16px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--text,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--text{min-width:1px;-webkit-box-flex:1;-ms-flex:1;flex:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--text p,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--text p{margin:0 0 4px;padding:0;border:0;text-align:left;letter-spacing:normal;text-transform:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--text p [class*=forminator-icon-],.forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--text p [class*=forminator-icon-]{width:12px;margin:0 9px 0 0;font-size:12px;line-height:12px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--text p:last-child,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--text p:last-child{margin-bottom:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--text+.forminator-uploaded-file--delete,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--text+.forminator-uploaded-file--delete{margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--delete,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-uploaded-file--delete{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;margin:3px 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-error-message,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file .forminator-error-message{display:none!important}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file:last-child,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file:last-child{margin-bottom:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file.forminator-has_error .forminator-error-message,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-uploaded-file.forminator-has_error .forminator-error-message{display:block!important}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-multiselect,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-multiselect{width:100%;height:auto;max-height:210px;overflow-x:hidden;overflow-y:auto;display:block;padding:5px;border-width:0;border-style:none;border-radius:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-multiselect .forminator-option,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-multiselect .forminator-option{cursor:pointer;display:block;position:relative;margin:5px 0;padding:10px;line-height:1.3em;-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-multiselect .forminator-option:first-child,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-multiselect .forminator-option:first-child{margin-top:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-multiselect .forminator-option:last-child,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-multiselect .forminator-option:last-child{margin-bottom:0}.ui-datepicker.forminator-calendar--flat{width:auto;z-index:20000000;margin:0;padding:1px 0;border:0;border-radius:0;background-color:transparent!important}.ui-datepicker.forminator-calendar--flat,.ui-datepicker.forminator-calendar--flat *{-webkit-box-sizing:border-box;box-sizing:border-box}.ui-datepicker.forminator-calendar--flat:before{content:" ";display:block;position:absolute;z-index:1;top:1px;right:0;bottom:1px;left:0}.ui-datepicker.forminator-calendar--flat .ui-datepicker-header{display:block;position:relative;z-index:1;padding:10px}.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-corner-all{width:30px;height:30px;cursor:pointer;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;position:absolute;top:11px;border-radius:100%;font-size:14px;-webkit-transition:.2s ease;transition:.2s ease}.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-corner-all,.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-corner-all:active,.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-corner-all:focus,.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-corner-all:hover{outline:0;-webkit-box-shadow:none;box-shadow:none;text-decoration:none}.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-corner-all.ui-datepicker-prev{right:unset;left:10px}.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before{content:"❮"}.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-corner-all.ui-datepicker-next{right:10px;left:unset}.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before{content:"❯"}.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-datepicker-title{display:-webkit-box;display:-ms-flexbox;display:flex;padding:0 40px}.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-datepicker-title select{height:30px;cursor:pointer;-webkit-box-flex:1;-ms-flex:1;flex:1;margin:0 5px;padding:0 10px;border-width:0;border-style:none;border-radius:0;font-size:14px;line-height:30px;font-family:inherit;-webkit-appearance:none;-moz-appearance:none;appearance:none}.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-datepicker-title select,.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-datepicker-title select:active,.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-datepicker-title select:focus,.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-datepicker-title select:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-datepicker-title select:first-child{margin-left:0}.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-datepicker-title select:last-child{margin-right:0}.ui-datepicker.forminator-calendar--flat .ui-datepicker-header+.ui-datepicker-calendar{padding-top:0}.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar{width:auto;table-layout:fixed;position:relative;z-index:1;margin:0;padding:0;border:0;border-spacing:0;border-collapse:collapse;font-family:inherit}.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar thead tr{margin:0;padding:0;border:0}.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr td,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr th,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar thead tr td,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar thead tr th{margin:0;padding:5px;border:0;text-align:center;font-family:inherit}.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr td a,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr td span,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr th a,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr th span,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar thead tr td a,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar thead tr td span,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar thead tr th a,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar thead tr th span{width:30px;display:block;padding:2px;border:0;border-radius:60px}.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr td a,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr th a,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar thead tr td a,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar thead tr th a{text-decoration:none}.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr td a,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr td a:active,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr td a:hover,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr td a:visited,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr th a,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr th a:active,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr th a:hover,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr th a:visited,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar thead tr td a,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar thead tr td a:active,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar thead tr td a:hover,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar thead tr td a:visited,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar thead tr th a,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar thead tr th a:active,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar thead tr th a:hover,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar thead tr th a:visited{outline:0;-webkit-box-shadow:none;box-shadow:none;text-decoration:none}.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr td a,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr td a:visited,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr th a,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr th a:visited,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar thead tr td a,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar thead tr td a:visited,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar thead tr th a,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar thead tr th a:visited{font-weight:400}.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr td a:active,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr td a:hover,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr th a:active,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr th a:hover,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar thead tr td a:active,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar thead tr td a:hover,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar thead tr th a:active,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar thead tr th a:hover{font-weight:600}.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr td:first-child,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr th:first-child,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar thead tr td:first-child,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar thead tr th:first-child{padding-left:15px}.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr td:last-child,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr th:last-child,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar thead tr td:last-child,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar thead tr th:last-child{padding-right:15px}.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar thead tr th{font-size:12px;font-weight:600}.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar thead tr th span{display:block;line-height:1.4em}.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr td{font-size:13px}.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr td a,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr td span{border-width:0;border-style:none;border-radius:0;line-height:26px}.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr td.ui-datepicker-unselectable a,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr td.ui-datepicker-unselectable span,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr td.ui-state-disabled a,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr td.ui-state-disabled span{cursor:not-allowed;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;opacity:.3;-khtml-opacity:.3}.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr td.ui-datepicker-unselectable.ui-datepicker-other-month a,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr td.ui-datepicker-unselectable.ui-datepicker-other-month span,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr td.ui-state-disabled.ui-datepicker-other-month a,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar tbody tr td.ui-state-disabled.ui-datepicker-other-month span{cursor:default}.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar:last-child tbody:last-child tr:last-child td,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar:last-child tbody:last-child tr:last-child th,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar:last-child thead:last-child tr:last-child td,.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar:last-child thead:last-child tr:last-child th{padding-bottom:15px}.ui-datepicker.forminator-calendar--flat .ui-datepicker-calendar+.ui-datepicker-buttonpane{padding-top:8px}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-timepicker .forminator-row,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-timepicker .forminator-row{-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-col:not(.forminator-col-3):not(.forminator-col-4) .forminator-date-input .forminator-error-message,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-col:not(.forminator-col-3):not(.forminator-col-4) .forminator-timepicker .forminator-error-message,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-col:not(.forminator-col-3):not(.forminator-col-4) .forminator-date-input .forminator-error-message,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-col:not(.forminator-col-3):not(.forminator-col-4) .forminator-timepicker .forminator-error-message{display:none}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-col:not(.forminator-col-3):not(.forminator-col-4) .forminator-date-input~.forminator-error-message,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-col:not(.forminator-col-3):not(.forminator-col-4) .forminator-timepicker~.forminator-error-message,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-col:not(.forminator-col-3):not(.forminator-col-4) .forminator-date-input~.forminator-error-message,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-col:not(.forminator-col-3):not(.forminator-col-4) .forminator-timepicker~.forminator-error-message{display:block}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] select.forminator-select2+.forminator-select,.forminator-ui.forminator-custom-form[data-design=flat] select.forminator-select2+.forminator-select{min-width:100%;max-width:100%;display:block;text-align:left}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] select.forminator-select2+.forminator-select .selection,.forminator-ui.forminator-custom-form[data-design=flat] select.forminator-select2+.forminator-select .selection{display:block}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single,.forminator-ui.forminator-custom-form[data-design=flat] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single{height:auto;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:relative;margin:0;padding:0;border-width:0;border-style:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single .select2-selection__rendered,.forminator-ui.forminator-custom-form[data-design=flat] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single .select2-selection__rendered{min-width:10px;overflow:hidden;display:block;-webkit-box-flex:1;-ms-flex:1;flex:1;padding:8px 5px 8px 14px;text-overflow:ellipsis;white-space:nowrap}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single .select2-selection__arrow,.forminator-ui.forminator-custom-form[data-design=flat] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single .select2-selection__arrow{width:38px;height:38px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:relative;margin:0;padding:0;border:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single .select2-selection__arrow [class*=forminator-icon-],.forminator-ui.forminator-custom-form[data-design=flat] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single .select2-selection__arrow [class*=forminator-icon-]{display:block;margin:0 auto;font-size:12px;-webkit-transition:.2s linear;transition:.2s linear}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single .select2-selection__arrow [class*=forminator-icon-]:before,.forminator-ui.forminator-custom-form[data-design=flat] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single .select2-selection__arrow [class*=forminator-icon-]:before{display:block;color:inherit}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single[aria-expanded=true] .select2-selection__arrow [class*=forminator-icon-],.forminator-ui.forminator-custom-form[data-design=flat] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single[aria-expanded=true] .select2-selection__arrow [class*=forminator-icon-]{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] select.forminator-select2+.forminator-select .selection span[role=combobox]:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] select.forminator-select2+.forminator-select .selection span[role=combobox]:hover,.forminator-ui.forminator-custom-form[data-design=flat] select.forminator-select2+.forminator-select .selection span[role=combobox]:focus,.forminator-ui.forminator-custom-form[data-design=flat] select.forminator-select2+.forminator-select .selection span[role=combobox]:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] select.forminator-select2+.forminator-select .selection:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] select.forminator-select2+.forminator-select .selection:hover,.forminator-ui.forminator-custom-form[data-design=flat] select.forminator-select2+.forminator-select .selection:focus,.forminator-ui.forminator-custom-form[data-design=flat] select.forminator-select2+.forminator-select .selection:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] select.forminator-select2+.forminator-select:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] select.forminator-select2+.forminator-select:hover,.forminator-ui.forminator-custom-form[data-design=flat] select.forminator-select2+.forminator-select:focus,.forminator-ui.forminator-custom-form[data-design=flat] select.forminator-select2+.forminator-select:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.forminator-select.forminator-select-dropdown-container--open{display:block;z-index:999}.forminator-select.forminator-select-dropdown-container--open *{-webkit-box-sizing:border-box;box-sizing:border-box;font-variant-ligatures:none;-webkit-font-variant-ligatures:none;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-smoothing:antialiased;-webkit-font-smoothing:antialiased;text-shadow:rgba(0,0,0,.01) 0 0 1px}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown{display:block;margin:0}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown .select2-search{display:block;margin:0 0 10px;padding:0 10px}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown .select2-search input{width:100%;max-width:100%;display:block;margin:0}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown .select2-search input:focus,.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown .select2-search input:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown .select2-search.select2-search--hide{display:none!important}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown .select2-results{display:block;margin:0;padding:0;border:0}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown .select2-results .select2-results__options{max-height:200px;overflow-y:auto;display:block;margin:0;padding:0;border:0;list-style:none}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown .select2-results .select2-results__options .select2-results__option{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:block;margin:0;border:0;line-height:35px;list-style:none}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown .select2-results .select2-results__options .select2-results__option.select2-results__message{position:relative;margin:0 15px;padding:15px 20px;border:0}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown .select2-results .select2-results__options .select2-results__option:not(.select2-results__option--selected){cursor:pointer}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--default{padding:9px 0;border-width:1px;border-style:solid}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--default .select2-search{margin:0 0 9px;padding:0 9px}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--default .select2-search input{padding:9px;border-width:1px;border-style:solid;border-radius:2px}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--default .select2-results .select2-results__options .select2-results__option{padding:5px 8px}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--default .select2-results .select2-results__options .select2-results__option.select2-results__message{border-radius:2px}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--flat{padding:10px 0;border-width:0;border-style:none}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--flat .select2-search{margin:0 0 10px;padding:0 10px}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--flat .select2-search input{padding:10px;border-width:0;border-style:none;border-radius:0}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--flat .select2-results .select2-results__options .select2-results__option{padding:5px 10px}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--bold{padding:7px 0;border-width:3px;border-style:solid}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--bold .select2-search{margin:0 0 7px;padding:0 7px}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--bold .select2-search input{padding:7px;border-width:3px;border-style:solid}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--bold .select2-results .select2-results__options .select2-results__option{padding:5px 4px}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--material{padding:10px 0}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--material .select2-search input{padding:0 0 10px;border-width:0;border-bottom-width:1px;border-style:solid;background:none transparent;background-color:transparent!important}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--material .select2-results .select2-results__options .select2-results__option{padding:5px 8px}.sui-dialog-content .forminator-select.forminator-select-dropdown-container--open{margin-top:1px}body.admin-bar>.forminator-select.forminator-select-dropdown-container--open{margin-top:33px}body.forminator-hustle-dropdown-fix .forminator-select.forminator-select-dropdown-container--open{z-index:999999}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-button-paypal,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-button-paypal{display:block;position:relative;z-index:1;width:100%;-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1;-webkit-box-flex:unset!important;-ms-flex:unset!important;flex:unset!important;margin-bottom:20px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-button-paypal>.paypal-buttons,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-button-paypal>.paypal-buttons{display:block!important}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-button-paypal>.paypal-buttons>iframe,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-button-paypal>.paypal-buttons>iframe{width:100%!important}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-field-signature .forminator-signature,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-field-signature .forminator-signature{width:auto;max-width:100%;cursor:crosshair;overflow:hidden;display:inline-block;position:relative;margin:0;padding:0;border-width:0;border-radius:0;border-style:solid;background-color:transparent;-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-field-signature .forminator-signature *,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-field-signature .forminator-signature *{-webkit-box-sizing:border-box;box-sizing:border-box}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-field-signature .forminator-signature .forminator-signature--placeholder,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-field-signature .forminator-signature .forminator-signature--placeholder{pointer-events:none;display:block;position:absolute;top:10px;right:10px;left:10px;line-height:1.4;letter-spacing:normal;-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-field-signature .forminator-signature .forminator-signature--container canvas,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-field-signature .forminator-signature .forminator-signature--container canvas{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-field-signature .forminator-signature .forminator-signature--container+div,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-field-signature .forminator-signature .forminator-signature--container+div{width:20px!important;height:20px!important;cursor:pointer;overflow:hidden;position:absolute!important;top:7px;right:7px;margin:0!important;padding:2px;border:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-field-signature .forminator-signature .forminator-signature--container+div img,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-field-signature .forminator-signature .forminator-signature--container+div img{width:16px!important;height:16px!important;float:none!important;display:block}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-field-signature.forminator-is_filled .forminator-signature .forminator-signature--placeholder,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-field-signature.forminator-is_filled .forminator-signature .forminator-signature--placeholder{opacity:0;-khtml-opacity:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-content,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-content{display:block}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-content,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-content li,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-content,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-content li{margin:0;padding:0;border:0;list-style:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-content li:after,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-content li:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-content:after,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-content:before,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-content li:after,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-content li:before,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-content:after,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-content:before{content:unset}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-content li,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-content li{display:none;visibility:hidden}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-content li:focus,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-content li:focus{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-content li.forminator-current,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-content li.forminator-current{display:block;visibility:visible}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-footer,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-footer{display:block;margin:20px 0 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-footer .forminator-button,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-footer .forminator-button{width:100%;display:block;margin-right:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-footer .forminator-button:last-child,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-footer .forminator-button:last-child{margin-bottom:0}@media (max-width:782px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-footer .forminator-button,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-footer .forminator-button{margin-right:0;margin-bottom:10px}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-footer,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-footer{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;margin:30px 0 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-footer a,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-footer button,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-footer a,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-footer button{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-footer .forminator-button:last-child,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-footer .forminator-button:last-child{margin-right:0}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-footer .forminator-button,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-footer .forminator-button{width:auto;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small).draft-enabled .forminator-pagination-footer,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small).draft-enabled .forminator-pagination-footer{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small).draft-enabled .forminator-pagination-footer .forminator-button-back,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small).draft-enabled .forminator-pagination-footer .forminator-button-back{margin-right:20px}@media (max-width:782px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small).draft-enabled .forminator-pagination-footer .forminator-button-back,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small).draft-enabled .forminator-pagination-footer .forminator-button-back{margin-right:0}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small).draft-enabled .forminator-pagination-footer .forminator-save-draft-link,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small).draft-enabled .forminator-pagination-footer .forminator-save-draft-link{padding:10px 0;margin:0 auto 0 0;text-align:right;line-height:22px}@media (max-width:782px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small).draft-enabled .forminator-pagination-footer .forminator-save-draft-link,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small).draft-enabled .forminator-pagination-footer .forminator-save-draft-link{width:100%;text-align:center;margin:0 0 10px;-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-steps,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-steps{display:block;margin:0 0 20px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-steps .forminator-break,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-steps .forminator-break{width:1px;height:24px;display:block;margin:0 6px;position:relative;z-index:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-steps .forminator-break:before,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-steps .forminator-break:before{content:" ";width:3px;height:100%;display:block;position:absolute;top:0;left:-1px;-webkit-transition:.2s linear;transition:.2s linear}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-steps .forminator-break:first-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-steps .forminator-break:last-child,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-steps .forminator-break:first-child,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-steps .forminator-break:last-child{display:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-steps .forminator-step,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-steps .forminator-step{height:12px;cursor:pointer;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:0;padding:0;border:0;border-radius:0;background-color:transparent;-webkit-box-shadow:none;box-shadow:none;text-transform:none;text-decoration:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-steps .forminator-step .forminator-step-label,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-steps .forminator-step .forminator-step-label{overflow:hidden;display:block;-webkit-box-flex:1;-ms-flex:1;flex:1;line-height:1.6em;text-overflow:ellipsis;white-space:nowrap}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-steps .forminator-step .forminator-step-label+.forminator-step-dot,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-steps .forminator-step .forminator-step-label+.forminator-step-dot{margin-right:5px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-steps .forminator-step .forminator-step-dot,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-steps .forminator-step .forminator-step-dot{width:12px;height:12px;display:block;-webkit-box-flex:0;-ms-flex:0 0 12px;flex:0 0 12px;border-width:0;border-style:none;border-radius:24px;-webkit-transform:scale(1.3);transform:scale(1.3);-webkit-transform-origin:center;transform-origin:center;-webkit-transition:.2s linear;transition:.2s linear}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-steps .forminator-step.forminator-current~.forminator-break:before,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-steps .forminator-step.forminator-current~.forminator-break:before{height:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-steps .forminator-step.forminator-current~.forminator-step .forminator-step-dot,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-steps .forminator-step.forminator-current~.forminator-step .forminator-step-dot{-webkit-transform:scale(1);transform:scale(1)}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-steps .forminator-break:before,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-steps .forminator-break:before{width:100%;height:3px;top:-1px;left:0}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-steps .forminator-break:first-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-steps .forminator-break:last-child,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-steps .forminator-break:first-child,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-steps .forminator-break:last-child{display:block}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-steps .forminator-break,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-steps .forminator-break{width:auto;height:1px;-webkit-box-flex:1;-ms-flex:1;flex:1;margin:6px 0}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-steps .forminator-step .forminator-step-label+.forminator-step-dot,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-steps .forminator-step .forminator-step-label+.forminator-step-dot{margin-top:5px;margin-right:0}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-steps .forminator-step .forminator-step-label,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-steps .forminator-step .forminator-step-label{overflow:unset;text-align:center;text-overflow:unset;white-space:normal;word-break:normal}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-steps .forminator-step.forminator-current~.forminator-break:before,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-steps .forminator-step.forminator-current~.forminator-break:before{width:0}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-steps .forminator-step,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-steps .forminator-step{width:12px;height:auto;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:unset;-ms-flex-pack:unset;justify-content:unset}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-steps,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-steps{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end;margin-bottom:30px}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-progress,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-progress{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:0 0 20px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-progress .forminator-progress-label,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-progress .forminator-progress-label{display:block;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;line-height:2.2em}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-progress .forminator-progress-label+.forminator-progress-bar,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-progress .forminator-progress-label+.forminator-progress-bar{margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-progress .forminator-progress-bar,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-progress .forminator-progress-bar{height:8px;overflow:hidden;display:block;-webkit-box-flex:1;-ms-flex:1;flex:1;position:relative}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-progress .forminator-progress-bar span,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-pagination-progress .forminator-progress-bar span{height:8px;display:block}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-progress .forminator-progress-label+.forminator-progress-bar,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-progress .forminator-progress-label+.forminator-progress-bar{margin-left:15px}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-progress,.forminator-ui.forminator-custom-form[data-design=flat]:not(.forminator-size--small) .forminator-pagination-progress{margin-bottom:30px}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material],.forminator-ui.forminator-custom-form[data-design=bold],.forminator-ui.forminator-custom-form[data-design=default],.forminator-ui.forminator-custom-form[data-design=flat],.forminator-ui.forminator-custom-form[data-design=material],.ui-datepicker.forminator-calendar--bold,.ui-datepicker.forminator-calendar--bold *,.ui-datepicker.forminator-calendar--default,.ui-datepicker.forminator-calendar--default *,.ui-datepicker.forminator-calendar--flat,.ui-datepicker.forminator-calendar--flat *,.ui-datepicker.forminator-calendar--material,.ui-datepicker.forminator-calendar--material *{font-variant-ligatures:none;-webkit-font-variant-ligatures:none;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-smoothing:antialiased;-webkit-font-smoothing:antialiased;text-shadow:rgba(0,0,0,.01) 0 0 1px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload>span,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload>span,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload>span,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload>span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox .forminator-checkbox-box:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-loading:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox .forminator-checkbox-box:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-loading:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox .forminator-checkbox-box:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-loading:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox .forminator-checkbox-box:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-loading:before,.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before,.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before,.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before,.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before,.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before,.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before,.ui-datepicker.forminator-calendar--material .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before,.ui-datepicker.forminator-calendar--material .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before{speak:none;line-height:1;font-family:forminator-icons-font!important;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;letter-spacing:0;-webkit-font-feature-settings:"liga" 1;font-feature-settings:"liga" 1;-webkit-font-variant-ligatures:discretionary-ligatures;font-variant-ligatures:discretionary-ligatures;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-accessible,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-accessible,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-accessible,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=bold] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=default] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=default] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=flat] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=material] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=material] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-accessible,.select2-hidden-accessible,.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-corner-all .ui-icon,.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-corner-all .ui-icon,.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-corner-all .ui-icon,.ui-datepicker.forminator-calendar--material .ui-datepicker-header .ui-corner-all .ui-icon{width:1px!important;height:1px!important;overflow:hidden!important;position:absolute!important;white-space:nowrap!important;margin:-1px!important;padding:0!important;border:0!important;clip:rect(0 0 0 0)!important;-webkit-clip-path:inset(50%)!important;clip-path:inset(50%)!important}@keyframes spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes click-animation{0%{-webkit-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1);opacity:.2;-khtml-opacity:.2}50%{-webkit-transform:translate(-50%,-50%) scale(2);transform:translate(-50%,-50%) scale(2);opacity:.1;-khtml-opacity:.1}100%{-webkit-transform:translate(-50%,-50%) scale(0);transform:translate(-50%,-50%) scale(0);opacity:0;-khtml-opacity:0}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold],.forminator-ui.forminator-custom-form[data-design=bold]{width:100%;margin:30px 0;-webkit-box-sizing:border-box;box-sizing:border-box}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-field,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-field{margin:0;padding:0;border:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-field:focus,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-field:focus{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:first-child,.forminator-ui.forminator-custom-form[data-design=bold]:first-child{margin-top:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:last-child,.forminator-ui.forminator-custom-form[data-design=bold]:last-child{margin-bottom:0}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small):first-child,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small):first-child{margin-top:0}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small):last-child,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small):last-child{margin-bottom:0}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small).forminator-fields-disabled>.forminator-pagination>*,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small).forminator-fields-disabled>:not(.forminator-response-message):not(.forminator-pagination),.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small).forminator-fields-disabled>.forminator-pagination>*,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small).forminator-fields-disabled>:not(.forminator-response-message):not(.forminator-pagination){opacity:.5;-khtml-opacity:.5;pointer-events:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small).forminator-fields-disabled>.forminator-pagination>* *,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small).forminator-fields-disabled>:not(.forminator-response-message):not(.forminator-pagination) *,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small).forminator-fields-disabled>.forminator-pagination>* *,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small).forminator-fields-disabled>:not(.forminator-response-message):not(.forminator-pagination) *{pointer-events:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row),.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row){cursor:not-allowed}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row) .forminator-col,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row) .forminator-col{opacity:.5;-khtml-opacity:.5}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row) .forminator-col,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row) .forminator-col *,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row) .forminator-col,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row) .forminator-col *{pointer-events:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small).forminator-partial-disabled .forminator-pagination-footer .forminator-button:not(.forminator-button-submit),.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small).forminator-partial-disabled .forminator-pagination-footer .forminator-button:not(.forminator-button-submit){opacity:.5;-khtml-opacity:.5;pointer-events:none}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small),.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small){margin:30px 0}}.forminator-draft-wrap{font-weight:400;font-size:15px}.forminator-draft-wrap .forminator-draft-notice{margin-bottom:30px;padding:15px 22px;border-radius:2px;font-family:inherit;font-size:inherit;font-weight:inherit;color:#333;background-color:#bceee6}.forminator-draft-wrap .forminator-draft-notice.draft-success{background-color:#bceee6;box-shadow:inset 2px 0 0 0 #1abca1;-moz-box-shadow:inset 2px 0 0 0 #1abca1;-webkit-box-shadow:inset 2px 0 0 0 #1abca1}.forminator-draft-wrap .forminator-draft-notice.draft-error{background-color:#f9e4e8;box-shadow:inset 2px 0 0 0 #e04562;-moz-box-shadow:inset 2px 0 0 0 #e04562;-webkit-box-shadow:inset 2px 0 0 0 #e04562}.forminator-draft-wrap .forminator-draft-email-response p:last-of-type{margin-bottom:20px}.forminator-draft-wrap .forminator-copy-field{position:relative;margin-bottom:40px}.forminator-draft-wrap .forminator-copy-field .forminator-draft-link{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;padding:9px 110px 11px 15px;margin:0;background:#eee;border:none;color:#555;text-decoration:underline;outline:0;line-height:20px;font-family:inherit;font-size:inherit;font-weight:inherit;opacity:1}.forminator-draft-wrap .forminator-copy-field button,.forminator-draft-wrap .forminator-copy-field button:hover{width:98px;height:30px;padding:0;position:absolute;top:50%;right:6px;background-color:#666;color:#fff;font-family:inherit;font-style:inherit;font-weight:500;font-size:13px;line-height:22px;border:0;outline:0;-webkit-transform:translateY(-50%);transform:translateY(-50%);cursor:pointer}.forminator-draft-wrap .forminator-copy-field button:hover{background-color:#7b7b7b}.forminator-draft-wrap .forminator-draft-form .forminator-row{margin-bottom:20px}.forminator-draft-wrap .forminator-draft-form .forminator-label{display:block;cursor:default;margin:0 0 5px 0;border:0;line-height:1.7em;font-size:13px;font-family:inherit;font-weight:500;color:#888}.forminator-draft-wrap .forminator-draft-form .forminator-email--field{display:block;width:100%;min-width:unset;max-width:unset;height:auto;min-height:unset;max-height:unset;margin:0;padding:10px;font-size:16px;font-family:inherit;font-weight:400;background-color:#ededed;color:#000;border-width:0;border-style:none;border-radius:0;background-image:unset;line-height:1.3em;-webkit-transition:.2s ease;transition:.2s ease;outline:0}.forminator-draft-wrap .forminator-draft-form .forminator-has_error .forminator-email--field{box-shadow:inset 2px 0 0 0 #e04562;-moz-box-shadow:inset 2px 0 0 0 #e04562;-webkit-box-shadow:inset 2px 0 0 0 #e04562}.forminator-draft-wrap .forminator-draft-form .forminator-has_error .forminator-error-message{display:block;padding:2px 10px;margin:5px 0 0;border-radius:0;line-height:2em;background-color:#f9e4e8;color:#e04562;font-size:12px;font-family:inherit;font-weight:500}.forminator-draft-wrap .forminator-draft-form button.forminator-button-submit{background-color:#289dcc;color:#fff;font-size:14px;font-family:inherit;font-weight:500;outline:0;width:auto;min-width:100px;max-width:unset;height:auto;min-height:unset;max-height:unset;cursor:pointer;display:inline-block;position:relative;margin:0 10px 0 0;padding:10px;border:0;border-radius:0;background-image:unset;line-height:1.45em;text-align:center;-webkit-transition:.2s ease;transition:.2s ease}.forminator-draft-wrap .forminator-draft-form button.forminator-button-submit:hover{background-color:#35aede}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message{margin:0 0 20px;padding:15px 20px 15px 22px;border-radius:0;text-align:left}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message p,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message p{margin:0;padding:0;border:0;line-height:1.3em;letter-spacing:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message p:not(:last-child),.forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message p:not(:last-child){margin-bottom:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message:active,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message:hover,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message:active,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message:focus,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message:last-child,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message:last-child{margin-bottom:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message[aria-hidden=true],.forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message[aria-hidden=true]{display:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-loading,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-loading{position:relative;padding-left:46px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-loading:before{content:"◌";position:absolute;top:17px;left:20px;font-size:16px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-show,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-show{display:block}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-response-message:last-child,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-response-message:last-child{margin-bottom:0}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-response-message,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-response-message{margin-bottom:30px}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-subtitle,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-title,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-subtitle,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-title{display:block;margin:0;padding:0;border:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-subtitle:after,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-subtitle:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-title:after,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-title:before,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-subtitle:after,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-subtitle:before,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-title:after,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-title:before{content:unset;display:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-title,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-title{line-height:1em}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-title+.forminator-subtitle,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-title+.forminator-subtitle{margin-top:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-subtitle,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-subtitle{line-height:1.4em}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-border,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-border{width:100%;min-width:100%;max-width:100%;height:0;min-height:unset;max-height:unset;display:block;margin:20px 0 0;padding:0;border:0;background-image:unset;background-color:transparent}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-border:first-child,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-border:first-child{margin-top:0}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-border:first-child,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-border:first-child{margin-top:0}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-border,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-border{margin-top:30px}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-label,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-label{cursor:default;display:block;margin:0;border:0;line-height:1.7em}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-label[for],.forminator-ui.forminator-custom-form[data-design=bold] .forminator-label[for]{cursor:pointer}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-description,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-error-message,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-description,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-error-message{margin:5px 0 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-description,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-description{display:-webkit-box;display:-ms-flexbox;display:flex;line-height:1.5em}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-description span,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-description span{min-width:80px;margin-right:0;margin-left:auto;text-align:right}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-error-message,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-error-message{display:none;padding:2px 10px;border-radius:0;line-height:2em}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-has_error .forminator-error-message,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-has_error .forminator-error-message{display:block}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;min-width:unset;max-width:unset;height:auto;min-height:unset;max-height:unset;display:block;margin:0;padding:7px;border-width:3px;border-style:solid;border-radius:0;background-image:unset;line-height:1.3em;-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input:active,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input:disabled,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input:hover,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input:active,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input:disabled,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input:focus,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input:disabled,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input:disabled{pointer-events:none;border-style:dotted}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input:disabled:-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input:disabled:-moz-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input:disabled::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input:disabled::-moz-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input:disabled:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input:disabled:-ms-input-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input:disabled::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input:disabled::-webkit-input-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-prefix,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-prefix{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-prefix input,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-prefix input{min-width:50px;display:block;-webkit-box-flex:1;-ms-flex:1;flex:1;margin:0;padding:0;border:0;background-image:none;background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-prefix .forminator-prefix,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-prefix .forminator-suffix,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-prefix .forminator-prefix,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-prefix .forminator-suffix{display:block;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-prefix .forminator-prefix,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-prefix .forminator-prefix{margin-right:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-prefix .forminator-suffix,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-prefix .forminator-suffix{margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-textarea,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-textarea{width:100%;min-height:140px;resize:vertical;display:block;margin:0;padding:7px;border-width:3px;border-style:solid;border-radius:0;background-image:unset;line-height:20px;-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-textarea,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-textarea:active,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-textarea:disabled,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-textarea:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-textarea:hover,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-textarea,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-textarea:active,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-textarea:disabled,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-textarea:focus,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-textarea:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-textarea:disabled,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-textarea:disabled{pointer-events:none;border-style:dotted}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-textarea:disabled:-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-textarea:disabled:-moz-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-textarea:disabled::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-textarea:disabled::-moz-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-textarea:disabled:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-textarea:disabled:-ms-input-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-textarea:disabled::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-textarea:disabled::-webkit-input-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-has_error .tmce-active .forminator-textarea.wp-editor-area,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-has_error .tmce-active .forminator-textarea.wp-editor-area{display:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio{cursor:default;pointer-events:none;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:relative;margin:10px 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio input:checked+.forminator-radio-bullet:before,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio input:checked+.forminator-radio-bullet:before{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio span,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio span{cursor:pointer;pointer-events:all;display:block}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio .forminator-radio-bullet,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio .forminator-radio-bullet{width:20px;height:20px;-webkit-box-flex:0;-ms-flex:0 0 20px;flex:0 0 20px;position:relative;border-width:3px;border-style:solid;border-radius:40px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio .forminator-radio-bullet:before,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio .forminator-radio-bullet:before{content:" ";width:7px;height:7px;opacity:0;-khtml-opacity:0;display:block;position:absolute;top:50%;left:50%;border-radius:100%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio .forminator-radio-bullet~span,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio .forminator-radio-bullet~span{margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio .forminator-radio-label,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio .forminator-radio-label{-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;line-height:20px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio .forminator-radio-image,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio .forminator-radio-image{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;padding:2px;border-width:3px;border-style:solid;border-radius:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio .forminator-radio-image span,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio .forminator-radio-image span{width:70px;height:70px;background-repeat:no-repeat;background-size:cover;background-position:center}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio.forminator-has_image .forminator-radio-image,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio.forminator-has_image .forminator-radio-image{margin-left:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio.forminator-radio-inline,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio.forminator-radio-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle;margin-right:20px;margin-bottom:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio.forminator-radio-inline.forminator-has_image.forminator-has_bullet,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio.forminator-radio-inline.forminator-has_image.forminator-has_bullet{min-width:80px;padding-top:90px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio.forminator-radio-inline.forminator-has_image.forminator-has_bullet .forminator-radio-image,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio.forminator-radio-inline.forminator-has_image.forminator-has_bullet .forminator-radio-image{position:absolute;top:0;left:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio.forminator-radio-inline:last-of-type,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio.forminator-radio-inline:last-of-type{margin-right:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio:not(.forminator-radio-inline),.forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio:not(.forminator-radio-inline){margin:20px 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio:not(.forminator-radio-inline).forminator-has_image.forminator-has_bullet .forminator-radio-bullet,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio:not(.forminator-radio-inline).forminator-has_image.forminator-has_bullet .forminator-radio-bullet{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2;margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio:not(.forminator-radio-inline).forminator-has_image.forminator-has_bullet .forminator-radio-label,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio:not(.forminator-radio-inline).forminator-has_image.forminator-has_bullet .forminator-radio-label{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio:not(.forminator-radio-inline).forminator-has_image.forminator-has_bullet .forminator-radio-image,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio:not(.forminator-radio-inline).forminator-has_image.forminator-has_bullet .forminator-radio-image{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio:not(.forminator-radio-inline):first-of-type,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio:not(.forminator-radio-inline):first-of-type{margin-top:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio:not(.forminator-radio-inline):first-child,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio:not(.forminator-radio-inline):first-child{margin-top:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio:not(.forminator-radio-inline):last-of-type,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio:not(.forminator-radio-inline):last-of-type{margin-bottom:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio:not(.forminator-radio-inline):last-child,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio:not(.forminator-radio-inline):last-child{margin-bottom:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox{cursor:default;pointer-events:none;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:relative;margin:10px 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox input:checked+.forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox input:checked+.forminator-checkbox-box:before{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox span,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox span{cursor:pointer;pointer-events:all;display:block}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox .forminator-checkbox-box,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox .forminator-checkbox-box{width:20px;height:20px;-webkit-box-flex:0;-ms-flex:0 0 20px;flex:0 0 20px;position:relative;border-width:3px;border-style:solid;border-radius:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox .forminator-checkbox-box:before{content:"✓";opacity:0;-khtml-opacity:0;display:block;position:absolute;top:50%;left:50%;color:inherit;font-size:12px;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox .forminator-checkbox-box~span,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox .forminator-checkbox-box~span{margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox-label,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox-label{-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;line-height:20px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox .forminator-checkbox-image,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox .forminator-checkbox-image{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;padding:2px;border-width:3px;border-style:solid;border-radius:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox .forminator-checkbox-image span,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox .forminator-checkbox-image span{width:70px;height:70px;background-repeat:no-repeat;background-size:cover;background-position:center}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox__wrapper,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox__wrapper{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox__label,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox__label{-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;line-height:20px;margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox__label h1:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox__label h2:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox__label h3:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox__label h4:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox__label h5:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox__label h6:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox__label ol:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox__label p:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox__label ul:last-child,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox__label h1:last-child,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox__label h2:last-child,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox__label h3:last-child,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox__label h4:last-child,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox__label h5:last-child,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox__label h6:last-child,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox__label ol:last-child,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox__label p:last-child,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox__label ul:last-child{margin-bottom:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox.forminator-has_image .forminator-checkbox-image,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox.forminator-has_image .forminator-checkbox-image{margin-left:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox.forminator-checkbox-inline,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox.forminator-checkbox-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle;margin-right:20px;margin-bottom:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox.forminator-checkbox-inline.forminator-has_box,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox.forminator-checkbox-inline.forminator-has_box{min-width:80px;padding-top:90px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox.forminator-checkbox-inline.forminator-has_box .forminator-checkbox-image,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox.forminator-checkbox-inline.forminator-has_box .forminator-checkbox-image{position:absolute;top:0;left:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox.forminator-checkbox-inline:last-of-type,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox.forminator-checkbox-inline:last-of-type{margin-right:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox:not(.forminator-checkbox-inline),.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox:not(.forminator-checkbox-inline){margin:20px 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox:not(.forminator-checkbox-inline).forminator-has_image.forminator-has_box .forminator-checkbox-box,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox:not(.forminator-checkbox-inline).forminator-has_image.forminator-has_box .forminator-checkbox-box{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2;margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox:not(.forminator-checkbox-inline).forminator-has_image.forminator-has_box .forminator-checkbox-label,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox:not(.forminator-checkbox-inline).forminator-has_image.forminator-has_box .forminator-checkbox-label{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox:not(.forminator-checkbox-inline).forminator-has_image.forminator-has_box .forminator-checkbox-image,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox:not(.forminator-checkbox-inline).forminator-has_image.forminator-has_box .forminator-checkbox-image{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox:not(.forminator-checkbox-inline):first-of-type,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox:not(.forminator-checkbox-inline):first-of-type{margin-top:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox:not(.forminator-checkbox-inline):first-child,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox:not(.forminator-checkbox-inline):first-child{margin-top:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox:not(.forminator-checkbox-inline):last-of-type,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox:not(.forminator-checkbox-inline):last-of-type{margin-bottom:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox:not(.forminator-checkbox-inline):last-child,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox:not(.forminator-checkbox-inline):last-child{margin-bottom:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-button,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-button{width:auto;min-width:120px;max-width:unset;height:auto;min-height:unset;max-height:unset;cursor:pointer;display:inline-block;position:relative;margin:0 10px 0 0;padding:13px 15px;border:0;border-radius:0;background-image:unset;line-height:1.45em;text-align:center;-webkit-transition:.2s ease;transition:.2s ease}@media (max-width:782px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-button,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-button{width:100%;margin:0 0 10px 0}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-button span,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-button span{display:block;-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-button .forminator-icon-loader,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-button .forminator-icon-loader{opacity:0;-khtml-opacity:0;position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-button .forminator-icon-loader:before,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-button .forminator-icon-loader:before{display:block}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-button,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-button:active,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-button:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-button:hover,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-button,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-button:active,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-button:focus,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-button:hover{outline:0;-webkit-box-shadow:none;box-shadow:none;text-decoration:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-button:active,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-button:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-button:hover,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-button:active,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-button:focus,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-button:hover{-webkit-box-shadow:0 1px 4px 0 rgba(0,0,0,.6);box-shadow:0 1px 4px 0 rgba(0,0,0,.6)}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-button:active span[aria-hidden]:not([class*=forminator-icon-]),.forminator-ui.forminator-custom-form[data-design=bold] .forminator-button:active span[aria-hidden]:not([class*=forminator-icon-]){width:120%;padding:120% 0 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-button.forminator-disabled,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-button.forminator-onload,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-button:disabled,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-button.forminator-disabled,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-button.forminator-onload,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-button:disabled{opacity:.5;-khtml-opacity:.5;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-button.forminator-onload span,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-button.forminator-onload span{opacity:0;-khtml-opacity:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-button.forminator-onload .forminator-icon-loader,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-button.forminator-onload .forminator-icon-loader{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-button:last-child,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-button:last-child{margin-right:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold].draft-enabled .forminator-save-draft-link,.forminator-ui.forminator-custom-form[data-design=bold].draft-enabled .forminator-save-draft-link{display:inline-block;font-size:15px;font-weight:500;color:#17a8e3;text-decoration:none;background-color:transparent;padding:10px 0;margin:0 10px;text-decoration:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold].draft-enabled .forminator-save-draft-link.disabled,.forminator-ui.forminator-custom-form[data-design=bold].draft-enabled .forminator-save-draft-link.disabled{color:#a5a5a5;cursor:default}@media (max-width:782px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold].draft-enabled .forminator-save-draft-link,.forminator-ui.forminator-custom-form[data-design=bold].draft-enabled .forminator-save-draft-link{text-align:center;width:100%;margin:0 0 10px 0}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold].draft-enabled .forminator-button-paypal+.forminator-save-draft-link,.forminator-ui.forminator-custom-form[data-design=bold].draft-enabled .forminator-button-paypal+.forminator-save-draft-link{margin:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-g-recaptcha .grecaptcha-badge,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-g-recaptcha .grecaptcha-badge{visibility:visible}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material],.forminator-ui.forminator-custom-form[data-design=bold],.forminator-ui.forminator-custom-form[data-design=default],.forminator-ui.forminator-custom-form[data-design=flat],.forminator-ui.forminator-custom-form[data-design=material],.ui-datepicker.forminator-calendar--bold,.ui-datepicker.forminator-calendar--bold *,.ui-datepicker.forminator-calendar--default,.ui-datepicker.forminator-calendar--default *,.ui-datepicker.forminator-calendar--flat,.ui-datepicker.forminator-calendar--flat *,.ui-datepicker.forminator-calendar--material,.ui-datepicker.forminator-calendar--material *{font-variant-ligatures:none;-webkit-font-variant-ligatures:none;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-smoothing:antialiased;-webkit-font-smoothing:antialiased;text-shadow:rgba(0,0,0,.01) 0 0 1px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload>span,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload>span,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload>span,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload>span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox .forminator-checkbox-box:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-loading:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox .forminator-checkbox-box:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-loading:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox .forminator-checkbox-box:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-loading:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox .forminator-checkbox-box:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-loading:before,.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before,.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before,.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before,.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before,.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before,.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before,.ui-datepicker.forminator-calendar--material .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before,.ui-datepicker.forminator-calendar--material .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before{speak:none;line-height:1;font-family:forminator-icons-font!important;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;letter-spacing:0;-webkit-font-feature-settings:"liga" 1;font-feature-settings:"liga" 1;-webkit-font-variant-ligatures:discretionary-ligatures;font-variant-ligatures:discretionary-ligatures;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-accessible,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-accessible,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-accessible,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=bold] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=default] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=default] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=flat] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=material] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=material] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-accessible,.select2-hidden-accessible,.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-corner-all .ui-icon,.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-corner-all .ui-icon,.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-corner-all .ui-icon,.ui-datepicker.forminator-calendar--material .ui-datepicker-header .ui-corner-all .ui-icon{width:1px!important;height:1px!important;overflow:hidden!important;position:absolute!important;white-space:nowrap!important;margin:-1px!important;padding:0!important;border:0!important;clip:rect(0 0 0 0)!important;-webkit-clip-path:inset(50%)!important;clip-path:inset(50%)!important}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-icon,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-icon{position:relative}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-icon [class*=forminator-icon-],.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-icon [class*=forminator-icon-]{display:block;position:absolute;top:50%;left:10px;font-size:16px;-webkit-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-icon [class*=forminator-icon-]:before,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-icon [class*=forminator-icon-]:before{color:inherit}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-icon .forminator-input,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-icon .forminator-input{padding-left:33px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-suffix,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-suffix{position:relative}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-suffix .forminator-input,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-suffix .forminator-input{padding-right:60px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-suffix .forminator-suffix,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-suffix .forminator-suffix{display:block;position:absolute;top:50%;right:0;padding:0 10px;-webkit-transform:translateY(-50%);transform:translateY(-50%);line-height:1.4em}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-phone,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-phone{display:block}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-phone .iti__flag-container,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-phone .iti__flag-container{padding:3px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-phone .iti__flag-container .iti__selected-flag,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-phone .iti__flag-container .iti__selected-flag{width:auto;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:0;padding:0 10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-phone .iti__flag-container .iti__selected-flag .iti__flag,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-phone .iti__flag-container .iti__selected-flag .iti__flag{display:block;position:relative;top:auto;bottom:auto;margin:0;padding:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-phone .iti__flag-container .iti__selected-flag .iti__flag+.iti__arrow,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-phone .iti__flag-container .iti__selected-flag .iti__flag+.iti__arrow{margin-left:5px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-phone .iti__flag-container .iti__selected-flag .iti__arrow,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-phone .iti__flag-container .iti__selected-flag .iti__arrow{display:block;position:relative;top:auto;right:auto;margin:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-phone .iti__flag-container .iti__selected-flag:active,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-phone .iti__flag-container .iti__selected-flag:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-phone .iti__flag-container .iti__selected-flag:hover,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-phone .iti__flag-container .iti__selected-flag:active,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-phone .iti__flag-container .iti__selected-flag:focus,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-phone .iti__flag-container .iti__selected-flag:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-phone .iti__flag-container:active,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-phone .iti__flag-container:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-phone .iti__flag-container:hover,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-phone .iti__flag-container:active,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-phone .iti__flag-container:focus,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-phone .iti__flag-container:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-phone.iti--allow-dropdown .forminator-input,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-phone.iti--allow-dropdown .forminator-input{padding-left:53px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-phone:not(.iti--allow-dropdown) .iti__flag-container,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-phone:not(.iti--allow-dropdown) .iti__flag-container{pointer-events:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-phone:not(.iti--allow-dropdown) .forminator-input,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-phone:not(.iti--allow-dropdown) .forminator-input{padding-right:53px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-phone .iti__flag-container .iti__selected-flag,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-phone .iti__flag-container .iti__selected-flag{width:31px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:0;padding:0 10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-phone .iti__flag-container .iti__selected-flag .iti__flag,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-phone .iti__flag-container .iti__selected-flag .iti__flag{display:block;position:relative;top:auto;bottom:auto;margin:0;padding:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-phone .iti__flag-container .iti__selected-flag .iti__flag+.iti__arrow,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-phone .iti__flag-container .iti__selected-flag .iti__flag+.iti__arrow{margin-left:5px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-phone .iti__flag-container .iti__selected-flag .iti__arrow,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-phone .iti__flag-container .iti__selected-flag .iti__arrow{display:block;position:relative;top:auto;right:auto;margin:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-phone .iti__flag-container .iti__selected-flag:active,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-phone .iti__flag-container .iti__selected-flag:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-phone .iti__flag-container .iti__selected-flag:hover,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-phone .iti__flag-container .iti__selected-flag:active,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-phone .iti__flag-container .iti__selected-flag:focus,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-phone .iti__flag-container .iti__selected-flag:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-phone .iti__flag-container:active,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-phone .iti__flag-container:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-phone .iti__flag-container:hover,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-phone .iti__flag-container:active,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-phone .iti__flag-container:focus,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-phone .iti__flag-container:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-phone.iti--allow-dropdown .forminator-input--wrap,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-phone.iti--allow-dropdown .forminator-input--wrap{left:41px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-phone:not(.iti--allow-dropdown) .forminator-input--wrap,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-input-with-phone:not(.iti--allow-dropdown) .forminator-input--wrap{left:30px}.iti-mobile .iti--container{z-index:999991}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload>span{overflow:hidden;display:block;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload>span:not(:last-child),.forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload>span:not(:last-child){margin-right:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-button-delete,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-button-delete{width:30px;height:30px;cursor:pointer;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin:0;padding:0;border:0;border-radius:100%;font-size:14px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-button-delete [class*=forminator-icon-],.forminator-ui.forminator-custom-form[data-design=bold] .forminator-button-delete [class*=forminator-icon-]{display:block}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-button-delete [class*=forminator-icon-]:before,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-button-delete [class*=forminator-icon-]:before{display:block;color:inherit}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-col-3 .forminator-file-upload .forminator-button-upload,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-col-4 .forminator-file-upload .forminator-button-upload,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-col-3 .forminator-file-upload .forminator-button-upload,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-col-4 .forminator-file-upload .forminator-button-upload{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-col-3 .forminator-file-upload>span:not(:last-child),.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-col-4 .forminator-file-upload>span:not(:last-child),.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-col-3 .forminator-file-upload>span:not(:last-child),.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-col-4 .forminator-file-upload>span:not(:last-child){margin-right:0}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-col-3 .forminator-file-upload>span,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-col-4 .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-col-3 .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-col-4 .forminator-file-upload>span{-webkit-box-flex:1;-ms-flex:1;flex:1;margin-top:10px}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-col-3 .forminator-file-upload .forminator-button-delete,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-col-4 .forminator-file-upload .forminator-button-delete,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-col-3 .forminator-file-upload .forminator-button-delete,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-col-4 .forminator-file-upload .forminator-button-delete{margin-top:10px}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-col-3 .forminator-file-upload,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-col-4 .forminator-file-upload,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-col-3 .forminator-file-upload,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-col-4 .forminator-file-upload{-ms-flex-wrap:wrap;flex-wrap:wrap}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload{display:block;margin:0;padding:27px;border-width:3px;border-style:dashed;border-radius:0;-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload .forminator-multi-upload-message [class*=forminator-icon-],.forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload .forminator-multi-upload-message [class*=forminator-icon-]{width:30px;height:30px;display:block;margin:0 auto 5px;color:inherit;text-align:center}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload .forminator-multi-upload-message [class*=forminator-icon-]:before,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload .forminator-multi-upload-message [class*=forminator-icon-]:before{display:block;color:inherit;font-size:30px;line-height:30px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload .forminator-multi-upload-message p,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload .forminator-multi-upload-message p{display:block;margin:0;padding:0;border:0;text-align:center}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload .forminator-multi-upload-message p a,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload .forminator-multi-upload-message p a:active a:visited,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload .forminator-multi-upload-message p a:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload .forminator-multi-upload-message p a:hover,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload .forminator-multi-upload-message p a,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload .forminator-multi-upload-message p a:active a:visited,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload .forminator-multi-upload-message p a:focus,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload .forminator-multi-upload-message p a:hover{margin:0;padding:0;border:0;outline:0;-webkit-box-shadow:none;box-shadow:none;text-decoration:underline;text-transform:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-files,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-files{display:block;margin:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-files,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-files li,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-files,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-files li{padding:0;border:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-files.forminator-has-files,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-files.forminator-has-files{margin-top:20px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file{display:block;margin:0 0 20px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--content,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--content{direction:ltr;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--image,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--preview,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--image,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--preview{width:36px;height:36px;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;margin:0;padding:0;border-style:solid;border-radius:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--image+.forminator-uploaded-file--text,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--preview+.forminator-uploaded-file--text,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--image+.forminator-uploaded-file--text,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--preview+.forminator-uploaded-file--text{margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--image,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--image{overflow:hidden;position:relative;border-width:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--image [role=image],.forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--image [role=image]{position:absolute;top:0;right:0;bottom:0;left:0;background-size:cover;background-position:center;background-repeat:no-repeat;background-color:transparent}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--preview,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--preview{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;border-width:3px;text-align:center}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--preview [class*=forminator-icon-],.forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--preview [class*=forminator-icon-]{display:block;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--preview [class*=forminator-icon-]:before,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--preview [class*=forminator-icon-]:before{display:block;color:inherit;font-size:16px;line-height:16px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--text,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--text{min-width:1px;-webkit-box-flex:1;-ms-flex:1;flex:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--text p,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--text p{margin:0 0 4px;padding:0;border:0;text-align:left;letter-spacing:normal;text-transform:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--text p [class*=forminator-icon-],.forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--text p [class*=forminator-icon-]{width:12px;margin:0 9px 0 0;font-size:12px;line-height:12px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--text p:last-child,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--text p:last-child{margin-bottom:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--text+.forminator-uploaded-file--delete,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--text+.forminator-uploaded-file--delete{margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--delete,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-uploaded-file--delete{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;margin:3px 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-error-message,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file .forminator-error-message{display:none!important}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file:last-child,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file:last-child{margin-bottom:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file.forminator-has_error .forminator-uploaded-file--image,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file.forminator-has_error .forminator-uploaded-file--image{border-width:3px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file.forminator-has_error .forminator-uploaded-file--image [role=image],.forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file.forminator-has_error .forminator-uploaded-file--image [role=image]{top:-3px;right:-3px;bottom:-3px;left:-3px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file.forminator-has_error .forminator-error-message,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-uploaded-file.forminator-has_error .forminator-error-message{display:block!important}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-multiselect,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-multiselect{width:100%;height:auto;max-height:210px;overflow-x:hidden;overflow-y:auto;display:block;padding:5px;border-width:3px;border-style:solid;border-radius:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-multiselect .forminator-option,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-multiselect .forminator-option{cursor:pointer;display:block;position:relative;margin:5px 0;padding:10px;line-height:1.3em;-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-multiselect .forminator-option:first-child,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-multiselect .forminator-option:first-child{margin-top:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-multiselect .forminator-option:last-child,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-multiselect .forminator-option:last-child{margin-bottom:0}.ui-datepicker.forminator-calendar--bold{width:auto;z-index:20000000;margin:0;padding:1px 0;border:0;border-radius:0;background-color:transparent!important}.ui-datepicker.forminator-calendar--bold,.ui-datepicker.forminator-calendar--bold *{-webkit-box-sizing:border-box;box-sizing:border-box}.ui-datepicker.forminator-calendar--bold:before{content:" ";display:block;position:absolute;z-index:1;top:1px;right:0;bottom:1px;left:0;border-width:3px;border-style:solid;border-radius:0}.ui-datepicker.forminator-calendar--bold .ui-datepicker-header{display:block;position:relative;z-index:1;padding:10px}.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-corner-all{width:30px;height:30px;cursor:pointer;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;position:absolute;top:11px;border-radius:0;font-size:14px;-webkit-transition:.2s ease;transition:.2s ease}.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-corner-all,.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-corner-all:active,.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-corner-all:focus,.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-corner-all:hover{outline:0;-webkit-box-shadow:none;box-shadow:none;text-decoration:none}.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-corner-all.ui-datepicker-prev{right:unset;left:10px}.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before{content:"❮"}.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-corner-all.ui-datepicker-next{right:10px;left:unset}.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before{content:"❯"}.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-datepicker-title{display:-webkit-box;display:-ms-flexbox;display:flex;padding:0 40px}.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-datepicker-title select{height:30px;cursor:pointer;-webkit-box-flex:1;-ms-flex:1;flex:1;margin:0 5px;border-width:3px;border-style:solid;border-radius:0;padding:0 7px;font-size:14px;line-height:24px;font-family:inherit;-webkit-appearance:none;-moz-appearance:none;appearance:none}.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-datepicker-title select,.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-datepicker-title select:active,.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-datepicker-title select:focus,.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-datepicker-title select:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-datepicker-title select:first-child{margin-left:0}.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-datepicker-title select:last-child{margin-right:0}.ui-datepicker.forminator-calendar--bold .ui-datepicker-header+.ui-datepicker-calendar{padding-top:0}.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar{width:auto;table-layout:fixed;position:relative;z-index:1;margin:0;padding:0;border:0;border-spacing:0;border-collapse:collapse;font-family:inherit}.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar thead tr{margin:0;padding:0;border:0}.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr td,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr th,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar thead tr td,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar thead tr th{margin:0;padding:5px;border:0;text-align:center;font-family:inherit}.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr td a,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr td span,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr th a,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr th span,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar thead tr td a,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar thead tr td span,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar thead tr th a,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar thead tr th span{width:30px;display:block;padding:2px;border:0;border-radius:60px}.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr td a,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr th a,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar thead tr td a,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar thead tr th a{text-decoration:none}.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr td a,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr td a:active,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr td a:hover,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr td a:visited,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr th a,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr th a:active,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr th a:hover,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr th a:visited,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar thead tr td a,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar thead tr td a:active,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar thead tr td a:hover,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar thead tr td a:visited,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar thead tr th a,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar thead tr th a:active,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar thead tr th a:hover,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar thead tr th a:visited{outline:0;-webkit-box-shadow:none;box-shadow:none;text-decoration:none}.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr td a,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr td a:visited,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr th a,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr th a:visited,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar thead tr td a,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar thead tr td a:visited,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar thead tr th a,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar thead tr th a:visited{font-weight:400}.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr td a:active,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr td a:hover,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr th a:active,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr th a:hover,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar thead tr td a:active,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar thead tr td a:hover,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar thead tr th a:active,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar thead tr th a:hover{font-weight:600}.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr td:first-child,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr th:first-child,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar thead tr td:first-child,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar thead tr th:first-child{padding-left:12px}.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr td:last-child,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr th:last-child,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar thead tr td:last-child,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar thead tr th:last-child{padding-right:12px}.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar thead tr th{font-size:12px;font-weight:600}.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar thead tr th span{display:block;line-height:1.4em}.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr td{font-size:13px}.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr td a,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr td span{border-width:3px;border-style:solid;border-radius:0;line-height:20px}.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr td.ui-datepicker-unselectable a,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr td.ui-datepicker-unselectable span,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr td.ui-state-disabled a,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr td.ui-state-disabled span{cursor:not-allowed;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;opacity:.3;-khtml-opacity:.3}.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr td.ui-datepicker-unselectable.ui-datepicker-other-month a,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr td.ui-datepicker-unselectable.ui-datepicker-other-month span,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr td.ui-state-disabled.ui-datepicker-other-month a,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar tbody tr td.ui-state-disabled.ui-datepicker-other-month span{cursor:default}.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar:last-child tbody:last-child tr:last-child td,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar:last-child tbody:last-child tr:last-child th,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar:last-child thead:last-child tr:last-child td,.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar:last-child thead:last-child tr:last-child th{padding-bottom:12px}.ui-datepicker.forminator-calendar--bold .ui-datepicker-calendar+.ui-datepicker-buttonpane{padding-top:8px}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-timepicker .forminator-row,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-timepicker .forminator-row{-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-col:not(.forminator-col-3):not(.forminator-col-4) .forminator-date-input .forminator-error-message,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-col:not(.forminator-col-3):not(.forminator-col-4) .forminator-timepicker .forminator-error-message,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-col:not(.forminator-col-3):not(.forminator-col-4) .forminator-date-input .forminator-error-message,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-col:not(.forminator-col-3):not(.forminator-col-4) .forminator-timepicker .forminator-error-message{display:none}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-col:not(.forminator-col-3):not(.forminator-col-4) .forminator-date-input~.forminator-error-message,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-col:not(.forminator-col-3):not(.forminator-col-4) .forminator-timepicker~.forminator-error-message,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-col:not(.forminator-col-3):not(.forminator-col-4) .forminator-date-input~.forminator-error-message,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-col:not(.forminator-col-3):not(.forminator-col-4) .forminator-timepicker~.forminator-error-message{display:block}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] select.forminator-select2+.forminator-select,.forminator-ui.forminator-custom-form[data-design=bold] select.forminator-select2+.forminator-select{min-width:100%;max-width:100%;display:block;text-align:left}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] select.forminator-select2+.forminator-select .selection,.forminator-ui.forminator-custom-form[data-design=bold] select.forminator-select2+.forminator-select .selection{display:block}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single,.forminator-ui.forminator-custom-form[data-design=bold] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single{height:auto;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:relative;margin:0;padding:0;border-width:3px;border-style:solid}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single .select2-selection__rendered,.forminator-ui.forminator-custom-form[data-design=bold] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single .select2-selection__rendered{min-width:10px;overflow:hidden;display:block;-webkit-box-flex:1;-ms-flex:1;flex:1;padding:4px 5px 4px 14px;text-overflow:ellipsis;white-space:nowrap}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single .select2-selection__arrow,.forminator-ui.forminator-custom-form[data-design=bold] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single .select2-selection__arrow{width:38px;height:38px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:relative;margin:0;padding:0;border:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single .select2-selection__arrow [class*=forminator-icon-],.forminator-ui.forminator-custom-form[data-design=bold] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single .select2-selection__arrow [class*=forminator-icon-]{display:block;margin:0 auto;font-size:12px;-webkit-transition:.2s linear;transition:.2s linear}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single .select2-selection__arrow [class*=forminator-icon-]:before,.forminator-ui.forminator-custom-form[data-design=bold] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single .select2-selection__arrow [class*=forminator-icon-]:before{display:block;color:inherit}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single[aria-expanded=true] .select2-selection__arrow [class*=forminator-icon-],.forminator-ui.forminator-custom-form[data-design=bold] select.forminator-select2+.forminator-select .selection span[role=combobox].select2-selection--single[aria-expanded=true] .select2-selection__arrow [class*=forminator-icon-]{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] select.forminator-select2+.forminator-select .selection span[role=combobox]:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] select.forminator-select2+.forminator-select .selection span[role=combobox]:hover,.forminator-ui.forminator-custom-form[data-design=bold] select.forminator-select2+.forminator-select .selection span[role=combobox]:focus,.forminator-ui.forminator-custom-form[data-design=bold] select.forminator-select2+.forminator-select .selection span[role=combobox]:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] select.forminator-select2+.forminator-select .selection:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] select.forminator-select2+.forminator-select .selection:hover,.forminator-ui.forminator-custom-form[data-design=bold] select.forminator-select2+.forminator-select .selection:focus,.forminator-ui.forminator-custom-form[data-design=bold] select.forminator-select2+.forminator-select .selection:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] select.forminator-select2+.forminator-select:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] select.forminator-select2+.forminator-select:hover,.forminator-ui.forminator-custom-form[data-design=bold] select.forminator-select2+.forminator-select:focus,.forminator-ui.forminator-custom-form[data-design=bold] select.forminator-select2+.forminator-select:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.forminator-select.forminator-select-dropdown-container--open{display:block;z-index:999}.forminator-select.forminator-select-dropdown-container--open *{-webkit-box-sizing:border-box;box-sizing:border-box;font-variant-ligatures:none;-webkit-font-variant-ligatures:none;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-smoothing:antialiased;-webkit-font-smoothing:antialiased;text-shadow:rgba(0,0,0,.01) 0 0 1px}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown{display:block;margin:0}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown .select2-search{display:block;margin:0 0 10px;padding:0 10px}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown .select2-search input{width:100%;max-width:100%;display:block;margin:0}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown .select2-search input:focus,.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown .select2-search input:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown .select2-search.select2-search--hide{display:none!important}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown .select2-results{display:block;margin:0;padding:0;border:0}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown .select2-results .select2-results__options{max-height:200px;overflow-y:auto;display:block;margin:0;padding:0;border:0;list-style:none}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown .select2-results .select2-results__options .select2-results__option{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:block;margin:0;border:0;line-height:35px;list-style:none}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown .select2-results .select2-results__options .select2-results__option.select2-results__message{position:relative;margin:0 15px;padding:15px 20px;border:0}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown .select2-results .select2-results__options .select2-results__option:not(.select2-results__option--selected){cursor:pointer}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--default{padding:9px 0;border-width:1px;border-style:solid}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--default .select2-search{margin:0 0 9px;padding:0 9px}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--default .select2-search input{padding:9px;border-width:1px;border-style:solid;border-radius:2px}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--default .select2-results .select2-results__options .select2-results__option{padding:5px 8px}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--default .select2-results .select2-results__options .select2-results__option.select2-results__message{border-radius:2px}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--flat{padding:10px 0;border-width:0;border-style:none}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--flat .select2-search{margin:0 0 10px;padding:0 10px}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--flat .select2-search input{padding:10px;border-width:0;border-style:none;border-radius:0}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--flat .select2-results .select2-results__options .select2-results__option{padding:5px 10px}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--bold{padding:7px 0;border-width:3px;border-style:solid}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--bold .select2-search{margin:0 0 7px;padding:0 7px}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--bold .select2-search input{padding:7px;border-width:3px;border-style:solid}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--bold .select2-results .select2-results__options .select2-results__option{padding:5px 4px}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--material{padding:10px 0}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--material .select2-search input{padding:0 0 10px;border-width:0;border-bottom-width:1px;border-style:solid;background:none transparent;background-color:transparent!important}.forminator-select.forminator-select-dropdown-container--open .forminator-select-dropdown.forminator-dropdown--material .select2-results .select2-results__options .select2-results__option{padding:5px 8px}.sui-dialog-content .forminator-select.forminator-select-dropdown-container--open{margin-top:1px}body.admin-bar>.forminator-select.forminator-select-dropdown-container--open{margin-top:33px}body.forminator-hustle-dropdown-fix .forminator-select.forminator-select-dropdown-container--open{z-index:999999}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-button-paypal,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-button-paypal{display:block;position:relative;z-index:1;width:100%;-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1;-webkit-box-flex:unset!important;-ms-flex:unset!important;flex:unset!important;margin-bottom:20px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-button-paypal>.paypal-buttons,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-button-paypal>.paypal-buttons{display:block!important}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-button-paypal>.paypal-buttons>iframe,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-button-paypal>.paypal-buttons>iframe{width:100%!important}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-field-signature .forminator-signature,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-field-signature .forminator-signature{width:auto;max-width:100%;cursor:crosshair;overflow:hidden;display:inline-block;position:relative;margin:0;padding:0;border-width:3px;border-style:solid;background-color:transparent;-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-field-signature .forminator-signature *,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-field-signature .forminator-signature *{-webkit-box-sizing:border-box;box-sizing:border-box}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-field-signature .forminator-signature .forminator-signature--placeholder,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-field-signature .forminator-signature .forminator-signature--placeholder{pointer-events:none;display:block;position:absolute;top:7px;right:27px;left:7px;line-height:1.4;letter-spacing:normal;-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-field-signature .forminator-signature .forminator-signature--container canvas,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-field-signature .forminator-signature .forminator-signature--container canvas{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-field-signature .forminator-signature .forminator-signature--container+div,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-field-signature .forminator-signature .forminator-signature--container+div{width:20px!important;height:20px!important;cursor:pointer;overflow:hidden;position:absolute!important;top:7px;right:7px;margin:0!important;padding:2px;border:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-field-signature .forminator-signature .forminator-signature--container+div img,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-field-signature .forminator-signature .forminator-signature--container+div img{width:16px!important;height:16px!important;float:none!important;display:block}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-field-signature.forminator-is_filled .forminator-signature .forminator-signature--placeholder,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-field-signature.forminator-is_filled .forminator-signature .forminator-signature--placeholder{opacity:0;-khtml-opacity:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-content,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-content{display:block}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-content,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-content li,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-content,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-content li{margin:0;padding:0;border:0;list-style:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-content li:after,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-content li:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-content:after,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-content:before,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-content li:after,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-content li:before,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-content:after,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-content:before{content:unset}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-content li,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-content li{display:none;visibility:hidden}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-content li:focus,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-content li:focus{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-content li.forminator-current,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-content li.forminator-current{display:block;visibility:visible}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-footer,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-footer{display:block;margin:20px 0 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-footer .forminator-button,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-footer .forminator-button{width:100%;display:block;margin-right:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-footer .forminator-button:last-child,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-footer .forminator-button:last-child{margin-bottom:0}@media (max-width:782px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-footer .forminator-button,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-footer .forminator-button{margin-right:0;margin-bottom:10px}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-footer,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-footer{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;margin:30px 0 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-footer a,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-footer button,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-footer a,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-footer button{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-footer .forminator-button:last-child,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-footer .forminator-button:last-child{margin-right:0}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-footer .forminator-button,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-footer .forminator-button{width:auto;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small).draft-enabled .forminator-pagination-footer,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small).draft-enabled .forminator-pagination-footer{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small).draft-enabled .forminator-pagination-footer .forminator-button-back,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small).draft-enabled .forminator-pagination-footer .forminator-button-back{margin-right:20px}@media (max-width:782px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small).draft-enabled .forminator-pagination-footer .forminator-button-back,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small).draft-enabled .forminator-pagination-footer .forminator-button-back{margin-right:0}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small).draft-enabled .forminator-pagination-footer .forminator-save-draft-link,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small).draft-enabled .forminator-pagination-footer .forminator-save-draft-link{padding:10px 0;margin:0 auto 0 0;text-align:right;line-height:22px}@media (max-width:782px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small).draft-enabled .forminator-pagination-footer .forminator-save-draft-link,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small).draft-enabled .forminator-pagination-footer .forminator-save-draft-link{width:100%;text-align:center;margin:0 0 10px;-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-steps,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-steps{display:block;margin:0 0 20px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-steps .forminator-break,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-steps .forminator-break{width:3px;height:40px;display:block;margin:0 8.5px;position:relative;z-index:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-steps .forminator-break:first-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-steps .forminator-break:last-child,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-steps .forminator-break:first-child,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-steps .forminator-break:last-child{display:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-steps .forminator-step,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-steps .forminator-step{height:20px;cursor:pointer;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:0;padding:0;border:0;border-radius:0;background-color:transparent;-webkit-box-shadow:none;box-shadow:none;text-transform:none;text-decoration:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-steps .forminator-step .forminator-step-label,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-steps .forminator-step .forminator-step-label{overflow:hidden;display:block;-webkit-box-flex:1;-ms-flex:1;flex:1;line-height:1.6em;text-overflow:ellipsis;white-space:nowrap}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-steps .forminator-step .forminator-step-label+.forminator-step-dot,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-steps .forminator-step .forminator-step-label+.forminator-step-dot{margin-right:5px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-steps .forminator-step .forminator-step-dot,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-steps .forminator-step .forminator-step-dot{width:20px;height:20px;display:block;-webkit-box-flex:0;-ms-flex:0 0 20px;flex:0 0 20px;border-width:3px;border-style:solid;border-radius:40px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-steps .forminator-step.forminator-current~.forminator-break:before,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-steps .forminator-step.forminator-current~.forminator-break:before{height:0}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-steps .forminator-break:before,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-steps .forminator-break:before{width:100%;left:0}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-steps .forminator-break:first-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-steps .forminator-break:last-child,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-steps .forminator-break:first-child,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-steps .forminator-break:last-child{display:block}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-steps .forminator-break,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-steps .forminator-break{width:auto;height:3px;-webkit-box-flex:1;-ms-flex:1;flex:1;margin:8.5px 0}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-steps .forminator-step .forminator-step-label+.forminator-step-dot,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-steps .forminator-step .forminator-step-label+.forminator-step-dot{margin-top:5px;margin-right:0}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-steps .forminator-step .forminator-step-label,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-steps .forminator-step .forminator-step-label{overflow:unset;text-align:center;text-overflow:unset;white-space:normal;word-break:normal}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-steps .forminator-step.forminator-current~.forminator-break:before,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-steps .forminator-step.forminator-current~.forminator-break:before{width:0}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-steps .forminator-step,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-steps .forminator-step{width:20px;height:auto;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:unset;-ms-flex-pack:unset;justify-content:unset}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-steps,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-steps{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end;margin-bottom:30px}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-progress,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-progress{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:0 0 20px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-progress .forminator-progress-label,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-progress .forminator-progress-label{display:block;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;line-height:2.2em}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-progress .forminator-progress-label+.forminator-progress-bar,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-progress .forminator-progress-label+.forminator-progress-bar{margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-progress .forminator-progress-bar,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-progress .forminator-progress-bar{height:12px;overflow:hidden;display:block;-webkit-box-flex:1;-ms-flex:1;flex:1;position:relative}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-progress .forminator-progress-bar span,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-pagination-progress .forminator-progress-bar span{height:12px;display:block}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-progress .forminator-progress-label+.forminator-progress-bar,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-progress .forminator-progress-label+.forminator-progress-bar{margin-left:15px}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-progress,.forminator-ui.forminator-custom-form[data-design=bold]:not(.forminator-size--small) .forminator-pagination-progress{margin-bottom:30px}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material],.forminator-ui.forminator-custom-form[data-design=bold],.forminator-ui.forminator-custom-form[data-design=default],.forminator-ui.forminator-custom-form[data-design=flat],.forminator-ui.forminator-custom-form[data-design=material],.ui-datepicker.forminator-calendar--bold,.ui-datepicker.forminator-calendar--bold *,.ui-datepicker.forminator-calendar--default,.ui-datepicker.forminator-calendar--default *,.ui-datepicker.forminator-calendar--flat,.ui-datepicker.forminator-calendar--flat *,.ui-datepicker.forminator-calendar--material,.ui-datepicker.forminator-calendar--material *{font-variant-ligatures:none;-webkit-font-variant-ligatures:none;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-smoothing:antialiased;-webkit-font-smoothing:antialiased;text-shadow:rgba(0,0,0,.01) 0 0 1px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload>span,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload>span,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload>span,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload>span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox .forminator-checkbox-box:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-loading:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox .forminator-checkbox-box:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-loading:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox .forminator-checkbox-box:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-loading:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox .forminator-checkbox-box:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-loading:before,.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before,.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before,.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before,.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before,.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before,.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before,.ui-datepicker.forminator-calendar--material .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before,.ui-datepicker.forminator-calendar--material .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before{speak:none;line-height:1;font-family:forminator-icons-font!important;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;letter-spacing:0;-webkit-font-feature-settings:"liga" 1;font-feature-settings:"liga" 1;-webkit-font-variant-ligatures:discretionary-ligatures;font-variant-ligatures:discretionary-ligatures;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-accessible,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-accessible,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-accessible,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-multi-upload input[type=file],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-multiselect .forminator-option input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=bold] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=bold] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=default] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=default] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=default] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=default] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=default] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=flat] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=flat] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-response-message.forminator-accessible,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox input,.forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=material] .forminator-multi-upload input[type=file],.forminator-ui.forminator-custom-form[data-design=material] .forminator-multiselect .forminator-option input,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio input,.forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-accessible,.select2-hidden-accessible,.ui-datepicker.forminator-calendar--bold .ui-datepicker-header .ui-corner-all .ui-icon,.ui-datepicker.forminator-calendar--default .ui-datepicker-header .ui-corner-all .ui-icon,.ui-datepicker.forminator-calendar--flat .ui-datepicker-header .ui-corner-all .ui-icon,.ui-datepicker.forminator-calendar--material .ui-datepicker-header .ui-corner-all .ui-icon{width:1px!important;height:1px!important;overflow:hidden!important;position:absolute!important;white-space:nowrap!important;margin:-1px!important;padding:0!important;border:0!important;clip:rect(0 0 0 0)!important;-webkit-clip-path:inset(50%)!important;clip-path:inset(50%)!important}@keyframes spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes click-animation{0%{-webkit-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1);opacity:.2;-khtml-opacity:.2}50%{-webkit-transform:translate(-50%,-50%) scale(2);transform:translate(-50%,-50%) scale(2);opacity:.1;-khtml-opacity:.1}100%{-webkit-transform:translate(-50%,-50%) scale(0);transform:translate(-50%,-50%) scale(0);opacity:0;-khtml-opacity:0}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material],.forminator-ui.forminator-custom-form[data-design=material]{width:100%;margin:30px 0;-webkit-box-sizing:border-box;box-sizing:border-box}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-field,.forminator-ui.forminator-custom-form[data-design=material] .forminator-field{margin:0;padding:0;border:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-field:focus,.forminator-ui.forminator-custom-form[data-design=material] .forminator-field:focus{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material]:first-child,.forminator-ui.forminator-custom-form[data-design=material]:first-child{margin-top:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material]:last-child,.forminator-ui.forminator-custom-form[data-design=material]:last-child{margin-bottom:0}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small):first-child,.forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small):first-child{margin-top:0}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small):last-child,.forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small):last-child{margin-bottom:0}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small).forminator-fields-disabled>.forminator-pagination>*,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small).forminator-fields-disabled>:not(.forminator-response-message):not(.forminator-pagination),.forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small).forminator-fields-disabled>.forminator-pagination>*,.forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small).forminator-fields-disabled>:not(.forminator-response-message):not(.forminator-pagination){opacity:.5;-khtml-opacity:.5;pointer-events:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small).forminator-fields-disabled>.forminator-pagination>* *,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small).forminator-fields-disabled>:not(.forminator-response-message):not(.forminator-pagination) *,.forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small).forminator-fields-disabled>.forminator-pagination>* *,.forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small).forminator-fields-disabled>:not(.forminator-response-message):not(.forminator-pagination) *{pointer-events:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row),.forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row){cursor:not-allowed}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row) .forminator-col,.forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row) .forminator-col{opacity:.5;-khtml-opacity:.5}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row) .forminator-col,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row) .forminator-col *,.forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row) .forminator-col,.forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small).forminator-partial-disabled .forminator-row:not(.forminator-paypal-row) .forminator-col *{pointer-events:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small).forminator-partial-disabled .forminator-pagination-footer .forminator-button:not(.forminator-button-submit),.forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small).forminator-partial-disabled .forminator-pagination-footer .forminator-button:not(.forminator-button-submit){opacity:.5;-khtml-opacity:.5;pointer-events:none}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small),.forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small){margin:30px 0}}.forminator-draft-wrap{font-weight:400;font-size:15px}.forminator-draft-wrap .forminator-draft-notice{margin-bottom:30px;padding:15px 22px;border-radius:2px;font-family:inherit;font-size:inherit;font-weight:inherit;color:#333;background-color:#bceee6}.forminator-draft-wrap .forminator-draft-notice.draft-success{background-color:#bceee6;box-shadow:inset 2px 0 0 0 #1abca1;-moz-box-shadow:inset 2px 0 0 0 #1abca1;-webkit-box-shadow:inset 2px 0 0 0 #1abca1}.forminator-draft-wrap .forminator-draft-notice.draft-error{background-color:#f9e4e8;box-shadow:inset 2px 0 0 0 #e04562;-moz-box-shadow:inset 2px 0 0 0 #e04562;-webkit-box-shadow:inset 2px 0 0 0 #e04562}.forminator-draft-wrap .forminator-draft-email-response p:last-of-type{margin-bottom:20px}.forminator-draft-wrap .forminator-copy-field{position:relative;margin-bottom:40px}.forminator-draft-wrap .forminator-copy-field .forminator-draft-link{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;padding:9px 110px 11px 15px;margin:0;background:#eee;border:none;color:#555;text-decoration:underline;outline:0;line-height:20px;font-family:inherit;font-size:inherit;font-weight:inherit;opacity:1}.forminator-draft-wrap .forminator-copy-field button,.forminator-draft-wrap .forminator-copy-field button:hover{width:98px;height:30px;padding:0;position:absolute;top:50%;right:6px;background-color:#666;color:#fff;font-family:inherit;font-style:inherit;font-weight:500;font-size:13px;line-height:22px;border:0;outline:0;-webkit-transform:translateY(-50%);transform:translateY(-50%);cursor:pointer}.forminator-draft-wrap .forminator-copy-field button:hover{background-color:#7b7b7b}.forminator-draft-wrap .forminator-draft-form .forminator-row{margin-bottom:20px}.forminator-draft-wrap .forminator-draft-form .forminator-label{display:block;cursor:default;margin:0 0 5px 0;border:0;line-height:1.7em;font-size:13px;font-family:inherit;font-weight:500;color:#888}.forminator-draft-wrap .forminator-draft-form .forminator-email--field{display:block;width:100%;min-width:unset;max-width:unset;height:auto;min-height:unset;max-height:unset;margin:0;padding:10px;font-size:16px;font-family:inherit;font-weight:400;background-color:#ededed;color:#000;border-width:0;border-style:none;border-radius:0;background-image:unset;line-height:1.3em;-webkit-transition:.2s ease;transition:.2s ease;outline:0}.forminator-draft-wrap .forminator-draft-form .forminator-has_error .forminator-email--field{box-shadow:inset 2px 0 0 0 #e04562;-moz-box-shadow:inset 2px 0 0 0 #e04562;-webkit-box-shadow:inset 2px 0 0 0 #e04562}.forminator-draft-wrap .forminator-draft-form .forminator-has_error .forminator-error-message{display:block;padding:2px 10px;margin:5px 0 0;border-radius:0;line-height:2em;background-color:#f9e4e8;color:#e04562;font-size:12px;font-family:inherit;font-weight:500}.forminator-draft-wrap .forminator-draft-form button.forminator-button-submit{background-color:#289dcc;color:#fff;font-size:14px;font-family:inherit;font-weight:500;outline:0;width:auto;min-width:100px;max-width:unset;height:auto;min-height:unset;max-height:unset;cursor:pointer;display:inline-block;position:relative;margin:0 10px 0 0;padding:10px;border:0;border-radius:0;background-image:unset;line-height:1.45em;text-align:center;-webkit-transition:.2s ease;transition:.2s ease}.forminator-draft-wrap .forminator-draft-form button.forminator-button-submit:hover{background-color:#35aede}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message,.forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message{margin:0 0 20px;padding:15px 20px 15px 22px;border-radius:2px;background-color:#fff;-webkit-box-shadow:1px 1px 4px rgba(0,0,0,.3);box-shadow:1px 1px 4px rgba(0,0,0,.3);text-align:left}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message p,.forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message p{margin:0;padding:0;border:0;line-height:1.3em;letter-spacing:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message p:not(:last-child),.forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message p:not(:last-child){margin-bottom:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message:active,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message:hover,.forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message,.forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message:active,.forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message:focus,.forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message:hover{outline:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message:last-child,.forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message:last-child{margin-bottom:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message[aria-hidden=true],.forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message[aria-hidden=true]{display:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-loading,.forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-loading{position:relative;padding-left:46px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-loading:before,.forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-loading:before{content:"◌";position:absolute;top:17px;left:20px;font-size:16px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-show,.forminator-ui.forminator-custom-form[data-design=material] .forminator-response-message.forminator-show{display:block}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small) .forminator-response-message:last-child,.forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small) .forminator-response-message:last-child{margin-bottom:0}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small) .forminator-response-message,.forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small) .forminator-response-message{margin-bottom:30px}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-subtitle,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-title,.forminator-ui.forminator-custom-form[data-design=material] .forminator-subtitle,.forminator-ui.forminator-custom-form[data-design=material] .forminator-title{display:block;margin:0;padding:0;border:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-subtitle:after,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-subtitle:before,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-title:after,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-title:before,.forminator-ui.forminator-custom-form[data-design=material] .forminator-subtitle:after,.forminator-ui.forminator-custom-form[data-design=material] .forminator-subtitle:before,.forminator-ui.forminator-custom-form[data-design=material] .forminator-title:after,.forminator-ui.forminator-custom-form[data-design=material] .forminator-title:before{content:unset;display:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-title,.forminator-ui.forminator-custom-form[data-design=material] .forminator-title{line-height:1em}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-title+.forminator-subtitle,.forminator-ui.forminator-custom-form[data-design=material] .forminator-title+.forminator-subtitle{margin-top:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-subtitle,.forminator-ui.forminator-custom-form[data-design=material] .forminator-subtitle{line-height:1.4em}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-border,.forminator-ui.forminator-custom-form[data-design=material] .forminator-border{width:100%;min-width:100%;max-width:100%;height:0;min-height:unset;max-height:unset;display:block;margin:20px 0 0;padding:0;border:0;background-image:unset;background-color:transparent}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-border:first-child,.forminator-ui.forminator-custom-form[data-design=material] .forminator-border:first-child{margin-top:0}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small) .forminator-border:first-child,.forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small) .forminator-border:first-child{margin-top:0}}@media (min-width:783px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small) .forminator-border,.forminator-ui.forminator-custom-form[data-design=material]:not(.forminator-size--small) .forminator-border{margin-top:30px}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-label,.forminator-ui.forminator-custom-form[data-design=material] .forminator-label{cursor:default;display:block;margin:0;border:0;line-height:20px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-label[for],.forminator-ui.forminator-custom-form[data-design=material] .forminator-label[for]{cursor:pointer}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] [class*=forminator-floating-],.forminator-ui.forminator-custom-form[data-design=material] [class*=forminator-floating-]{pointer-events:none;-webkit-transition:.2s linear;transition:.2s linear}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input{-webkit-transform:translateY(30px);transform:translateY(30px)}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input--wrap .forminator-input::-webkit-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-icon .forminator-input::-webkit-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-phone .forminator-input::-webkit-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-suffix .forminator-input::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input--wrap .forminator-input::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-icon .forminator-input::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-phone .forminator-input::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-suffix .forminator-input::-webkit-input-placeholder{opacity:0;-khtml-opacity:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input--wrap .forminator-input::-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-icon .forminator-input::-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-phone .forminator-input::-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-suffix .forminator-input::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input--wrap .forminator-input::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-icon .forminator-input::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-phone .forminator-input::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-suffix .forminator-input::-moz-placeholder{opacity:0;-khtml-opacity:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input--wrap .forminator-input:-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-icon .forminator-input:-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-phone .forminator-input:-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-suffix .forminator-input:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input--wrap .forminator-input:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-icon .forminator-input:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-phone .forminator-input:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-suffix .forminator-input:-ms-input-placeholder{opacity:0;-khtml-opacity:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input--wrap .forminator-input::-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-icon .forminator-input::-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-phone .forminator-input::-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-suffix .forminator-input::-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input--wrap .forminator-input::-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-icon .forminator-input::-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-phone .forminator-input::-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-suffix .forminator-input::-ms-input-placeholder{opacity:0;-khtml-opacity:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input--wrap .forminator-input::placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-icon .forminator-input::placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-phone .forminator-input::placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-suffix .forminator-input::placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input--wrap .forminator-input::placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-icon .forminator-input::placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-phone .forminator-input::placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-suffix .forminator-input::placeholder{opacity:0;-khtml-opacity:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input--wrap .forminator-input:-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-icon .forminator-input:-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-phone .forminator-input:-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-suffix .forminator-input:-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input--wrap .forminator-input:-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-icon .forminator-input:-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-phone .forminator-input:-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-suffix .forminator-input:-moz-placeholder{opacity:0;-khtml-opacity:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input--wrap .forminator-input::-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-icon .forminator-input::-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-phone .forminator-input::-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-suffix .forminator-input::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input--wrap .forminator-input::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-icon .forminator-input::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-phone .forminator-input::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-suffix .forminator-input::-moz-placeholder{opacity:0;-khtml-opacity:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input--wrap .forminator-input:-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-icon .forminator-input:-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-phone .forminator-input:-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-suffix .forminator-input:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input--wrap .forminator-input:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-icon .forminator-input:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-phone .forminator-input:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-suffix .forminator-input:-ms-input-placeholder{opacity:0;-khtml-opacity:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input--wrap .forminator-input::-webkit-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-icon .forminator-input::-webkit-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-phone .forminator-input::-webkit-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-suffix .forminator-input::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input--wrap .forminator-input::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-icon .forminator-input::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-phone .forminator-input::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input+.forminator-input-with-suffix .forminator-input::-webkit-input-placeholder{opacity:0;-khtml-opacity:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input.forminator-has_icon,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input.forminator-has_icon{padding-left:26px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input.forminator-has_phone.iti--allow-dropdown,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input.forminator-has_phone.iti--allow-dropdown{padding-left:41px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input.forminator-has_phone:not(.iti--allow-dropdown),.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--input.forminator-has_phone:not(.iti--allow-dropdown){padding-left:30px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input{-webkit-transform:translateY(0);transform:translateY(0)}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input--wrap .forminator-input::-webkit-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-icon .forminator-input::-webkit-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-phone .forminator-input::-webkit-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-suffix .forminator-input::-webkit-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input--wrap .forminator-input::-webkit-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-icon .forminator-input::-webkit-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-phone .forminator-input::-webkit-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-suffix .forminator-input::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input--wrap .forminator-input::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-icon .forminator-input::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-phone .forminator-input::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-suffix .forminator-input::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input--wrap .forminator-input::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-icon .forminator-input::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-phone .forminator-input::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-suffix .forminator-input::-webkit-input-placeholder{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input--wrap .forminator-input::-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-icon .forminator-input::-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-phone .forminator-input::-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-suffix .forminator-input::-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input--wrap .forminator-input::-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-icon .forminator-input::-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-phone .forminator-input::-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-suffix .forminator-input::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input--wrap .forminator-input::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-icon .forminator-input::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-phone .forminator-input::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-suffix .forminator-input::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input--wrap .forminator-input::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-icon .forminator-input::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-phone .forminator-input::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-suffix .forminator-input::-moz-placeholder{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input--wrap .forminator-input:-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-icon .forminator-input:-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-phone .forminator-input:-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-suffix .forminator-input:-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input--wrap .forminator-input:-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-icon .forminator-input:-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-phone .forminator-input:-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-suffix .forminator-input:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input--wrap .forminator-input:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-icon .forminator-input:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-phone .forminator-input:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-suffix .forminator-input:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input--wrap .forminator-input:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-icon .forminator-input:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-phone .forminator-input:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-suffix .forminator-input:-ms-input-placeholder{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input--wrap .forminator-input::-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-icon .forminator-input::-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-phone .forminator-input::-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-suffix .forminator-input::-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input--wrap .forminator-input::-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-icon .forminator-input::-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-phone .forminator-input::-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-suffix .forminator-input::-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input--wrap .forminator-input::-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-icon .forminator-input::-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-phone .forminator-input::-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-suffix .forminator-input::-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input--wrap .forminator-input::-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-icon .forminator-input::-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-phone .forminator-input::-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-suffix .forminator-input::-ms-input-placeholder{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input--wrap .forminator-input::placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-icon .forminator-input::placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-phone .forminator-input::placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-suffix .forminator-input::placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input--wrap .forminator-input::placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-icon .forminator-input::placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-phone .forminator-input::placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-suffix .forminator-input::placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input--wrap .forminator-input::placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-icon .forminator-input::placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-phone .forminator-input::placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-suffix .forminator-input::placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input--wrap .forminator-input::placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-icon .forminator-input::placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-phone .forminator-input::placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-suffix .forminator-input::placeholder{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input--wrap .forminator-input:-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-icon .forminator-input:-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-phone .forminator-input:-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-suffix .forminator-input:-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input--wrap .forminator-input:-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-icon .forminator-input:-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-phone .forminator-input:-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-suffix .forminator-input:-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input--wrap .forminator-input:-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-icon .forminator-input:-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-phone .forminator-input:-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-suffix .forminator-input:-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input--wrap .forminator-input:-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-icon .forminator-input:-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-phone .forminator-input:-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-suffix .forminator-input:-moz-placeholder{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input--wrap .forminator-input::-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-icon .forminator-input::-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-phone .forminator-input::-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-suffix .forminator-input::-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input--wrap .forminator-input::-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-icon .forminator-input::-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-phone .forminator-input::-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-suffix .forminator-input::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input--wrap .forminator-input::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-icon .forminator-input::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-phone .forminator-input::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-suffix .forminator-input::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input--wrap .forminator-input::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-icon .forminator-input::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-phone .forminator-input::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-suffix .forminator-input::-moz-placeholder{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input--wrap .forminator-input:-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-icon .forminator-input:-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-phone .forminator-input:-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-suffix .forminator-input:-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input--wrap .forminator-input:-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-icon .forminator-input:-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-phone .forminator-input:-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-suffix .forminator-input:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input--wrap .forminator-input:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-icon .forminator-input:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-phone .forminator-input:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-suffix .forminator-input:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input--wrap .forminator-input:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-icon .forminator-input:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-phone .forminator-input:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-suffix .forminator-input:-ms-input-placeholder{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input--wrap .forminator-input::-webkit-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-icon .forminator-input::-webkit-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-phone .forminator-input::-webkit-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-suffix .forminator-input::-webkit-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input--wrap .forminator-input::-webkit-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-icon .forminator-input::-webkit-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-phone .forminator-input::-webkit-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-suffix .forminator-input::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input--wrap .forminator-input::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-icon .forminator-input::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-phone .forminator-input::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--input+.forminator-input-with-suffix .forminator-input::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input--wrap .forminator-input::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-icon .forminator-input::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-phone .forminator-input::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input+.forminator-input-with-suffix .forminator-input::-webkit-input-placeholder{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-input-with-phone .flag-container,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-input-with-phone .flag-container,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-input-with-phone .flag-container,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-input-with-phone .flag-container{top:-61px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input:not(.forminator-has_phone),.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--input:not(.forminator-has_phone){padding-left:0!important}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--textarea,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--textarea{width:100%;max-height:140px;overflow-y:hidden;position:absolute;z-index:1;padding:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::-webkit-input-placeholder{opacity:0;-khtml-opacity:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::-moz-placeholder{opacity:0;-khtml-opacity:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea:-ms-input-placeholder{opacity:0;-khtml-opacity:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::-ms-input-placeholder{opacity:0;-khtml-opacity:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::placeholder{opacity:0;-khtml-opacity:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea:-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea:-moz-placeholder{opacity:0;-khtml-opacity:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::-moz-placeholder{opacity:0;-khtml-opacity:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea:-ms-input-placeholder{opacity:0;-khtml-opacity:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::-webkit-input-placeholder{opacity:0;-khtml-opacity:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--textarea,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--textarea,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--textarea,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--textarea{padding-top:10px!important}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::-webkit-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::-webkit-input-placeholder{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::-moz-placeholder{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea:-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea:-ms-input-placeholder{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::-ms-input-placeholder{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::placeholder{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea:-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea:-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea:-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea:-moz-placeholder{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::-moz-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::-moz-placeholder{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea:-ms-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea:-ms-input-placeholder{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::-webkit-input-placeholder,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_active .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-is_filled .forminator-floating--textarea+.forminator-textarea--wrap .forminator-textarea::-webkit-input-placeholder{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-description,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-error-message,.forminator-ui.forminator-custom-form[data-design=material] .forminator-description,.forminator-ui.forminator-custom-form[data-design=material] .forminator-error-message{margin:5px 0 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-description,.forminator-ui.forminator-custom-form[data-design=material] .forminator-description{display:-webkit-box;display:-ms-flexbox;display:flex;line-height:1.5em}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-description span,.forminator-ui.forminator-custom-form[data-design=material] .forminator-description span{min-width:80px;margin-right:0;margin-left:auto;text-align:right}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-error-message,.forminator-ui.forminator-custom-form[data-design=material] .forminator-error-message{display:none;line-height:2em}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-has_error .forminator-error-message,.forminator-ui.forminator-custom-form[data-design=material] .forminator-has_error .forminator-error-message{display:block}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-input,.forminator-ui.forminator-custom-form[data-design=material] .forminator-input{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;min-width:unset;max-width:unset;height:auto;min-height:unset;max-height:unset;display:block;margin:0;padding:10px 0 9px;border-width:0;border-bottom-width:1px;border-style:solid;border-radius:0;background-color:transparent!important;background-image:unset;line-height:1.3em;-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-input,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-input:active,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-input:disabled,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-input:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-input:hover,.forminator-ui.forminator-custom-form[data-design=material] .forminator-input,.forminator-ui.forminator-custom-form[data-design=material] .forminator-input:active,.forminator-ui.forminator-custom-form[data-design=material] .forminator-input:disabled,.forminator-ui.forminator-custom-form[data-design=material] .forminator-input:focus,.forminator-ui.forminator-custom-form[data-design=material] .forminator-input:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-input:disabled,.forminator-ui.forminator-custom-form[data-design=material] .forminator-input:disabled{pointer-events:none;border-style:dotted}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-input:disabled:-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-input:disabled:-moz-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-input:disabled::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-input:disabled::-moz-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-input:disabled:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-input:disabled:-ms-input-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-input:disabled::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-input:disabled::-webkit-input-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-input--wrap,.forminator-ui.forminator-custom-form[data-design=material] .forminator-input--wrap{display:block;position:relative}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-input--wrap:after,.forminator-ui.forminator-custom-form[data-design=material] .forminator-input--wrap:after{content:" ";height:2px;display:block;position:absolute;right:50%;bottom:0;left:50%;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-transition:.2s linear;transition:.2s linear}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-field.forminator-has_error .forminator-input--wrap:after,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-field.forminator-is_active .forminator-input--wrap:after,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-field.forminator-is_hover .forminator-input--wrap:after,.forminator-ui.forminator-custom-form[data-design=material] .forminator-field.forminator-has_error .forminator-input--wrap:after,.forminator-ui.forminator-custom-form[data-design=material] .forminator-field.forminator-is_active .forminator-input--wrap:after,.forminator-ui.forminator-custom-form[data-design=material] .forminator-field.forminator-is_hover .forminator-input--wrap:after{right:0;left:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-input-with-prefix,.forminator-ui.forminator-custom-form[data-design=material] .forminator-input-with-prefix{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-input-with-prefix input,.forminator-ui.forminator-custom-form[data-design=material] .forminator-input-with-prefix input{min-width:50px;display:block;-webkit-box-flex:1;-ms-flex:1;flex:1;margin:0;padding:0;border:0;background-image:none;background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-input-with-prefix .forminator-prefix,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-input-with-prefix .forminator-suffix,.forminator-ui.forminator-custom-form[data-design=material] .forminator-input-with-prefix .forminator-prefix,.forminator-ui.forminator-custom-form[data-design=material] .forminator-input-with-prefix .forminator-suffix{display:block;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-input-with-prefix .forminator-prefix,.forminator-ui.forminator-custom-form[data-design=material] .forminator-input-with-prefix .forminator-prefix{margin-right:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-input-with-prefix .forminator-suffix,.forminator-ui.forminator-custom-form[data-design=material] .forminator-input-with-prefix .forminator-suffix{margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-textarea,.forminator-ui.forminator-custom-form[data-design=material] .forminator-textarea{width:100%;min-height:140px;resize:vertical;display:block;margin:0;padding:0 9px 9px;border-width:1px;border-style:solid;border-radius:2px;line-height:20px;background-image:unset;line-height:20px;-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-textarea,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-textarea:active,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-textarea:disabled,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-textarea:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-textarea:hover,.forminator-ui.forminator-custom-form[data-design=material] .forminator-textarea,.forminator-ui.forminator-custom-form[data-design=material] .forminator-textarea:active,.forminator-ui.forminator-custom-form[data-design=material] .forminator-textarea:disabled,.forminator-ui.forminator-custom-form[data-design=material] .forminator-textarea:focus,.forminator-ui.forminator-custom-form[data-design=material] .forminator-textarea:hover{outline:0;-webkit-box-shadow:none;box-shadow:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-textarea:disabled,.forminator-ui.forminator-custom-form[data-design=material] .forminator-textarea:disabled{pointer-events:none;border-style:dotted}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-textarea:disabled:-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-textarea:disabled:-moz-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-textarea:disabled::-moz-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-textarea:disabled::-moz-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-textarea:disabled:-ms-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-textarea:disabled:-ms-input-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-textarea:disabled::-webkit-input-placeholder,.forminator-ui.forminator-custom-form[data-design=material] .forminator-textarea:disabled::-webkit-input-placeholder{opacity:.4;-khtml-opacity:.4}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-textarea--wrap,.forminator-ui.forminator-custom-form[data-design=material] .forminator-textarea--wrap{position:relative}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-textarea--wrap:after,.forminator-ui.forminator-custom-form[data-design=material] .forminator-textarea--wrap:after{content:" ";width:100%;height:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none;position:absolute;z-index:1;top:0;left:0;border-width:2px;border-style:solid;border-radius:2px;-webkit-box-sizing:border-box;box-sizing:border-box;opacity:0;-khtml-opacity:0;-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-field.forminator-has_error .forminator-textarea--wrap:after,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-field.forminator-is_active .forminator-textarea--wrap:after,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-field.forminator-is_hover .forminator-textarea--wrap:after,.forminator-ui.forminator-custom-form[data-design=material] .forminator-field.forminator-has_error .forminator-textarea--wrap:after,.forminator-ui.forminator-custom-form[data-design=material] .forminator-field.forminator-is_active .forminator-textarea--wrap:after,.forminator-ui.forminator-custom-form[data-design=material] .forminator-field.forminator-is_hover .forminator-textarea--wrap:after{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-has_error .tmce-active .forminator-textarea.wp-editor-area,.forminator-ui.forminator-custom-form[data-design=material] .forminator-has_error .tmce-active .forminator-textarea.wp-editor-area{display:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio{cursor:default;pointer-events:none;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:relative;margin:10px 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio input:checked:focus+.forminator-radio-bullet:after,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio input:checked:focus+.forminator-radio-bullet:after{-webkit-animation-name:click-animation;animation-name:click-animation}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio input:checked+.forminator-radio-bullet:before,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio input:checked+.forminator-radio-bullet:before{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio input:checked+.forminator-radio-bullet:after,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio input:checked+.forminator-radio-bullet:after{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio input:checked~.forminator-radio-image,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio input:checked~.forminator-radio-image{-webkit-box-shadow:0 3px 8px 0 rgba(0,0,0,.3);box-shadow:0 3px 8px 0 rgba(0,0,0,.3)}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio span,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio span{cursor:pointer;pointer-events:all;display:block}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio .forminator-radio-bullet,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio .forminator-radio-bullet{width:20px;height:20px;-webkit-box-flex:0;-ms-flex:0 0 20px;flex:0 0 20px;position:relative;border-width:2px;border-style:solid;border-radius:40px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio .forminator-radio-bullet:before,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio .forminator-radio-bullet:before{content:" ";width:10px;height:10px;opacity:0;-khtml-opacity:0;display:block;position:absolute;top:50%;left:50%;border-radius:100%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio .forminator-radio-bullet:after,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio .forminator-radio-bullet:after{content:" ";opacity:0;-khtml-opacity:0;width:20px;height:20px;position:absolute;top:50%;left:50%;border-radius:100%;-webkit-transform:translate(-50%,-50%) scale(0);transform:translate(-50%,-50%) scale(0);-webkit-transform-origin:center;transform-origin:center;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;-webkit-animation-duration:.6s;animation-duration:.6s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio .forminator-radio-bullet~span,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio .forminator-radio-bullet~span{margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio .forminator-radio-label,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio .forminator-radio-label{-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;line-height:20px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio .forminator-radio-image,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio .forminator-radio-image{position:relative;overflow:hidden;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;border-width:0;border-radius:2px;background-color:#fff;-webkit-box-shadow:0 1px 1px 0 rgba(0,0,0,.3);box-shadow:0 1px 1px 0 rgba(0,0,0,.3);-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio .forminator-radio-image span,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio .forminator-radio-image span{width:70px;height:70px;background-repeat:no-repeat;background-size:cover;background-position:center}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio:hover .forminator-radio-image,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio:hover .forminator-radio-image{-webkit-box-shadow:0 3px 8px 0 rgba(0,0,0,.3);box-shadow:0 3px 8px 0 rgba(0,0,0,.3)}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio.forminator-has_image .forminator-radio-image,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio.forminator-has_image .forminator-radio-image{margin-left:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio.forminator-radio-inline,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio.forminator-radio-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle;margin-right:20px;margin-bottom:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio.forminator-radio-inline.forminator-has_image.forminator-has_bullet,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio.forminator-radio-inline.forminator-has_image.forminator-has_bullet{min-width:80px;padding-top:90px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio.forminator-radio-inline.forminator-has_image.forminator-has_bullet .forminator-radio-image,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio.forminator-radio-inline.forminator-has_image.forminator-has_bullet .forminator-radio-image{position:absolute;top:0;left:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio.forminator-radio-inline:last-of-type,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio.forminator-radio-inline:last-of-type{margin-right:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio:not(.forminator-radio-inline),.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio:not(.forminator-radio-inline){margin:20px 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio:not(.forminator-radio-inline).forminator-has_image.forminator-has_bullet .forminator-radio-bullet,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio:not(.forminator-radio-inline).forminator-has_image.forminator-has_bullet .forminator-radio-bullet{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2;margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio:not(.forminator-radio-inline).forminator-has_image.forminator-has_bullet .forminator-radio-label,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio:not(.forminator-radio-inline).forminator-has_image.forminator-has_bullet .forminator-radio-label{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio:not(.forminator-radio-inline).forminator-has_image.forminator-has_bullet .forminator-radio-image,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio:not(.forminator-radio-inline).forminator-has_image.forminator-has_bullet .forminator-radio-image{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio:not(.forminator-radio-inline):first-of-type,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio:not(.forminator-radio-inline):first-of-type{margin-top:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio:not(.forminator-radio-inline):first-child,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio:not(.forminator-radio-inline):first-child{margin-top:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio:not(.forminator-radio-inline):last-of-type,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio:not(.forminator-radio-inline):last-of-type{margin-bottom:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-radio:not(.forminator-radio-inline):last-child,.forminator-ui.forminator-custom-form[data-design=material] .forminator-radio:not(.forminator-radio-inline):last-child{margin-bottom:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox{cursor:default;pointer-events:none;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:relative;margin:10px 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox input:checked:focus+.forminator-checkbox-box:after,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox input:checked:focus+.forminator-checkbox-box:after{-webkit-animation-name:click-animation;animation-name:click-animation}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox input:checked+.forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox input:checked+.forminator-checkbox-box:before{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox input:checked+.forminator-checkbox-box:after,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox input:checked+.forminator-checkbox-box:after{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox input:checked~.forminator-checkbox-image,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox input:checked~.forminator-checkbox-image{-webkit-box-shadow:0 3px 8px 0 rgba(0,0,0,.3);box-shadow:0 3px 8px 0 rgba(0,0,0,.3)}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox span,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox span{cursor:pointer;pointer-events:all;display:block}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox .forminator-checkbox-box,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox .forminator-checkbox-box{width:20px;height:20px;-webkit-box-flex:0;-ms-flex:0 0 20px;flex:0 0 20px;position:relative;border-width:2px;border-style:solid;border-radius:2px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox .forminator-checkbox-box:before,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox .forminator-checkbox-box:before{content:"✓";opacity:0;-khtml-opacity:0;display:block;position:absolute;top:50%;left:50%;color:inherit;font-size:12px;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox .forminator-checkbox-box:after,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox .forminator-checkbox-box:after{content:" ";opacity:0;-khtml-opacity:0;width:20px;height:20px;position:absolute;top:50%;left:50%;border-radius:100%;-webkit-transform:translate(-50%,-50%) scale(0);transform:translate(-50%,-50%) scale(0);-webkit-transform-origin:center;transform-origin:center;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;-webkit-animation-duration:.6s;animation-duration:.6s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox .forminator-checkbox-box~span,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox .forminator-checkbox-box~span{margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox-label,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox-label{-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;line-height:20px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox .forminator-checkbox-image,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox .forminator-checkbox-image{position:relative;overflow:hidden;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;border-width:0;border-radius:2px;background-color:#fff;-webkit-box-shadow:0 1px 1px 0 rgba(0,0,0,.3);box-shadow:0 1px 1px 0 rgba(0,0,0,.3);-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox .forminator-checkbox-image span,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox .forminator-checkbox-image span{width:70px;height:70px;background-repeat:no-repeat;background-size:cover;background-position:center}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox:hover .forminator-checkbox-image,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox:hover .forminator-checkbox-image{-webkit-box-shadow:0 3px 8px 0 rgba(0,0,0,.3);box-shadow:0 3px 8px 0 rgba(0,0,0,.3)}@media (max-width:960px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox:hover .forminator-checkbox-image,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox:hover .forminator-checkbox-image{-webkit-box-shadow:0 1px 1px 0 rgba(0,0,0,.3);box-shadow:0 1px 1px 0 rgba(0,0,0,.3)}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox__wrapper,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox__wrapper{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox__label,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox__label{-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;line-height:20px;margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox__label h1:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox__label h2:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox__label h3:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox__label h4:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox__label h5:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox__label h6:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox__label ol:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox__label p:last-child,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox__label ul:last-child,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox__label h1:last-child,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox__label h2:last-child,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox__label h3:last-child,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox__label h4:last-child,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox__label h5:last-child,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox__label h6:last-child,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox__label ol:last-child,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox__label p:last-child,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox__label ul:last-child{margin-bottom:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox.forminator-has_image .forminator-checkbox-image,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox.forminator-has_image .forminator-checkbox-image{margin-left:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox.forminator-checkbox-inline,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox.forminator-checkbox-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle;margin-right:20px;margin-bottom:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox.forminator-checkbox-inline.forminator-has_box,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox.forminator-checkbox-inline.forminator-has_box{min-width:80px;padding-top:90px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox.forminator-checkbox-inline.forminator-has_box .forminator-checkbox-image,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox.forminator-checkbox-inline.forminator-has_box .forminator-checkbox-image{position:absolute;top:0;left:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox.forminator-checkbox-inline:last-of-type,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox.forminator-checkbox-inline:last-of-type{margin-right:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox:not(.forminator-checkbox-inline),.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox:not(.forminator-checkbox-inline){margin:20px 0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox:not(.forminator-checkbox-inline).forminator-has_image.forminator-has_box .forminator-checkbox-box,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox:not(.forminator-checkbox-inline).forminator-has_image.forminator-has_box .forminator-checkbox-box{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2;margin-left:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox:not(.forminator-checkbox-inline).forminator-has_image.forminator-has_box .forminator-checkbox-label,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox:not(.forminator-checkbox-inline).forminator-has_image.forminator-has_box .forminator-checkbox-label{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox:not(.forminator-checkbox-inline).forminator-has_image.forminator-has_box .forminator-checkbox-image,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox:not(.forminator-checkbox-inline).forminator-has_image.forminator-has_box .forminator-checkbox-image{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox:not(.forminator-checkbox-inline):first-of-type,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox:not(.forminator-checkbox-inline):first-of-type{margin-top:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox:not(.forminator-checkbox-inline):first-child,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox:not(.forminator-checkbox-inline):first-child{margin-top:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox:not(.forminator-checkbox-inline):last-of-type,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox:not(.forminator-checkbox-inline):last-of-type{margin-bottom:10px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox:not(.forminator-checkbox-inline):last-child,.forminator-ui.forminator-custom-form[data-design=material] .forminator-checkbox:not(.forminator-checkbox-inline):last-child{margin-bottom:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-button,.forminator-ui.forminator-custom-form[data-design=material] .forminator-button{width:auto;min-width:100px;max-width:unset;height:auto;min-height:unset;max-height:unset;cursor:pointer;overflow:hidden;display:inline-block;position:relative;z-index:1;margin:0 10px 0 0;padding:10px;border:0;border-radius:2px;-webkit-box-shadow:none;box-shadow:none;background-image:unset;line-height:1.45em;text-align:center;-webkit-transition:.2s ease;transition:.2s ease}@media (max-width:782px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-button,.forminator-ui.forminator-custom-form[data-design=material] .forminator-button{width:100%;margin:0 0 10px 0}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-button span,.forminator-ui.forminator-custom-form[data-design=material] .forminator-button span{display:block;-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-button span[aria-hidden]:not([class*=forminator-icon-]),.forminator-ui.forminator-custom-form[data-design=material] .forminator-button span[aria-hidden]:not([class*=forminator-icon-]){width:0;position:absolute;z-index:1;top:50%;left:50%;padding:0;border-radius:100%;background-color:rgba(0,0,0,.12);-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);-webkit-transition:width 450ms cubic-bezier(.23,1,.32,1),.2s ease-out;transition:width 450ms cubic-bezier(.23,1,.32,1),.2s ease-out}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-button span:not([aria-hidden]):not([class*=forminator-icon-]),.forminator-ui.forminator-custom-form[data-design=material] .forminator-button span:not([aria-hidden]):not([class*=forminator-icon-]){position:relative;z-index:2}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-button .forminator-icon-loader,.forminator-ui.forminator-custom-form[data-design=material] .forminator-button .forminator-icon-loader{opacity:0;-khtml-opacity:0;position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);-webkit-transition:.2s ease;transition:.2s ease}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-button .forminator-icon-loader:before,.forminator-ui.forminator-custom-form[data-design=material] .forminator-button .forminator-icon-loader:before{display:block}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-button,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-button:active,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-button:focus,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-button:hover,.forminator-ui.forminator-custom-form[data-design=material] .forminator-button,.forminator-ui.forminator-custom-form[data-design=material] .forminator-button:active,.forminator-ui.forminator-custom-form[data-design=material] .forminator-button:focus,.forminator-ui.forminator-custom-form[data-design=material] .forminator-button:hover{outline:0;text-decoration:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-button.forminator-disabled,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-button.forminator-onload,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-button:disabled,.forminator-ui.forminator-custom-form[data-design=material] .forminator-button.forminator-disabled,.forminator-ui.forminator-custom-form[data-design=material] .forminator-button.forminator-onload,.forminator-ui.forminator-custom-form[data-design=material] .forminator-button:disabled{opacity:.5;-khtml-opacity:.5;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-button.forminator-onload span,.forminator-ui.forminator-custom-form[data-design=material] .forminator-button.forminator-onload span{opacity:0;-khtml-opacity:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-button.forminator-onload .forminator-icon-loader,.forminator-ui.forminator-custom-form[data-design=material] .forminator-button.forminator-onload .forminator-icon-loader{opacity:1;-khtml-opacity:1}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-button:last-child,.forminator-ui.forminator-custom-form[data-design=material] .forminator-button:last-child{margin-right:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material].draft-enabled .forminator-save-draft-link,.forminator-ui.forminator-custom-form[data-design=material].draft-enabled .forminator-save-draft-link{display:inline-block;font-size:15px;font-weight:500;color:#17a8e3;text-decoration:none;background-color:transparent;padding:10px 0;margin:0 10px;text-decoration:none}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material].draft-enabled .forminator-save-draft-link.disabled,.forminator-ui.forminator-custom-form[data-design=material].draft-enabled .forminator-save-draft-link.disabled{color:#a5a5a5;cursor:default}@media (max-width:782px){.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material].draft-enabled .forminator-save-draft-link,.forminator-ui.forminator-custom-form[data-design=material].draft-enabled .forminator-save-draft-link{text-align:center;width:100%;margin:0 0 10px 0}}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material].draft-enabled .forminator-button-paypal+.forminator-save-draft-link,.forminator-ui.forminator-custom-form[data-design=material].draft-enabled .forminator-button-paypal+.forminator-save-draft-link{margin:0}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-g-recaptcha .grecaptcha-badge,.forminator-ui.forminator-custom-form[data-design=material] .forminator-g-recaptcha .grecaptcha-badge{visibility:visible}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat],.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material],.forminator-ui.forminator-custom-form[data-design=bold],.forminator-ui.forminator-custom-form[data-design=default],.forminator-ui.forminator-custom-form[data-design=flat],.forminator-ui.forminator-custom-form[data-design=material],.ui-datepicker.forminator-calendar--bold,.ui-datepicker.forminator-calendar--bold *,.ui-datepicker.forminator-calendar--default,.ui-datepicker.forminator-calendar--default *,.ui-datepicker.forminator-calendar--flat,.ui-datepicker.forminator-calendar--flat *,.ui-datepicker.forminator-calendar--material,.ui-datepicker.forminator-calendar--material *{font-variant-ligatures:none;-webkit-font-variant-ligatures:none;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-smoothing:antialiased;-webkit-font-smoothing:antialiased;text-shadow:rgba(0,0,0,.01) 0 0 1px}.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload>span,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload>span,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload>span,.et-db #et-boc .et_pb_module .forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=bold] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=default] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=flat] .forminator-file-upload>span,.forminator-ui.forminator-custom-form[data-design=material] .forminator-file-upload>span{white-space:nowrap;overflow:hidden;text-overflow
|
2 |
* WPMU DEV Forminator UI
|
3 |
* Copyright 2019 Incsub (https://incsub.com)
|
4 |
* Licensed under GPL v3 (http://www.gnu.org/licenses/gpl-3.0.html)
|
|