Version Description
- Add: Capture leads on Knowledge and Personal quizzes
- Add: Support suffix and prefix in calculation fields
- Add: Shortcode support in quiz results
- Improvement: Ability to change error message for number and Currency field when value added is out of set limits
- Improvement: Update Google Sheets interation documentation
- Improvement: Move Preview button to the top floating bar
- Improvement: Add ability to copy the module shortcode from the editor
- Improvement: Steps pagination are clickable
- Improvement: Update phone validation settings UI and add the ability to select a default flag for international phone number
- Improvement: Add due Date support in Trello integration
- Improvement: Automatically use Privacy Policy link in GDPR field
- Fix: Poll vote count hide not functional
- Fix: Quiz custom CSS having few wrong selectors
- Fix: Add option to center successfully submitted message
- Fix: Forminator emails broken in Outlook
- Fix: Select field does not allow submission of 0 zero value
- Fix: Login form doesnt display in Hustle popup
- Fix: Conditional payment on Stripe is not working correctly
- Fix: Input date field can not be submitted triggering validation error
- Fix: Slack integration not working for public and private channels
- Fix: Conflict with Pretty Links plugin
- Other minor enhancements/fixes
Download this release
Release Info
Developer | rickjc89 |
Plugin | Forminator Payment, Quiz and Contact Form Plugin |
Version | 1.14.0 |
Comparing to | |
See all releases |
Code changes from version 1.13.5 to 1.14.0
- addons/pro/activecampaign/activecampaign.php +3 -0
- addons/pro/activecampaign/class-forminator-addon-activecampaign-form-hooks.php +15 -0
- addons/pro/activecampaign/class-forminator-addon-activecampaign-quiz-hooks.php +763 -0
- addons/pro/activecampaign/class-forminator-addon-activecampaign-quiz-settings-exception.php +68 -0
- addons/pro/activecampaign/class-forminator-addon-activecampaign-quiz-settings.php +777 -0
- addons/pro/activecampaign/class-forminator-addon-activecampaign.php +114 -0
- addons/pro/activecampaign/views/quiz-settings/map-fields.php +87 -0
- addons/pro/activecampaign/views/quiz-settings/pick-name.php +36 -0
- addons/pro/activecampaign/views/quiz-settings/select-list.php +39 -0
- addons/pro/activecampaign/views/quiz-settings/setup-options.php +160 -0
- addons/pro/aweber/aweber.php +3 -0
- addons/pro/aweber/class-forminator-addon-aweber-quiz-hooks.php +805 -0
- addons/pro/aweber/class-forminator-addon-aweber-quiz-settings-exception.php +68 -0
- addons/pro/aweber/class-forminator-addon-aweber-quiz-settings.php +723 -0
- addons/pro/aweber/class-forminator-addon-aweber.php +113 -0
- addons/pro/aweber/views/quiz-settings/map-fields.php +100 -0
- addons/pro/aweber/views/quiz-settings/pick-name.php +34 -0
- addons/pro/aweber/views/quiz-settings/setup-list.php +54 -0
- addons/pro/aweber/views/quiz-settings/setup-options.php +105 -0
- addons/pro/campaignmonitor/campaignmonitor.php +3 -0
- addons/pro/campaignmonitor/class-forminator-addon-campaignmonitor-quiz-hooks.php +710 -0
- addons/pro/campaignmonitor/class-forminator-addon-campaignmonitor-quiz-settings-exception.php +68 -0
- addons/pro/campaignmonitor/class-forminator-addon-campaignmonitor-quiz-settings.php +710 -0
- addons/pro/campaignmonitor/class-forminator-addon-campaignmonitor.php +114 -0
- addons/pro/campaignmonitor/views/quiz-settings/map-fields.php +109 -0
- addons/pro/campaignmonitor/views/quiz-settings/pick-name.php +47 -0
- addons/pro/campaignmonitor/views/quiz-settings/setup-list.php +57 -0
- addons/pro/campaignmonitor/views/quiz-settings/setup-options.php +105 -0
- addons/pro/googlesheet/class-forminator-addon-googlesheet-quiz-hooks.php +106 -48
- addons/pro/googlesheet/views/settings/setup-client.php +33 -97
- addons/pro/gutenberg/library/blocks/class-forminator-gfblock-forms.php +4 -0
- addons/pro/hubspot/class-forminator-addon-hubspot-quiz-hooks.php +737 -0
- addons/pro/hubspot/class-forminator-addon-hubspot-quiz-settings-exception.php +68 -0
- addons/pro/hubspot/class-forminator-addon-hubspot-quiz-settings.php +582 -0
- addons/pro/hubspot/class-forminator-addon-hubspot.php +126 -13
- addons/pro/hubspot/hubspot.php +3 -0
- addons/pro/hubspot/views/quiz-settings/create-contact.php +297 -0
- addons/pro/hubspot/views/quiz-settings/create-ticket.php +337 -0
- addons/pro/mailchimp/class-forminator-addon-mailchimp-quiz-hooks.php +1120 -0
- addons/pro/mailchimp/class-forminator-addon-mailchimp-quiz-settings-exception.php +79 -0
- addons/pro/mailchimp/class-forminator-addon-mailchimp-quiz-settings.php +833 -0
- addons/pro/mailchimp/class-forminator-addon-mailchimp.php +124 -0
- addons/pro/mailchimp/mailchimp.php +4 -0
- addons/pro/slack/class-forminator-addon-slack-form-settings.php +1 -1
- addons/pro/slack/class-forminator-addon-slack-poll-settings.php +1 -1
- addons/pro/slack/class-forminator-addon-slack-quiz-hooks.php +102 -4
- addons/pro/slack/class-forminator-addon-slack-quiz-settings.php +6 -1
- addons/pro/slack/lib/class-forminator-addon-slack-wp-api.php +18 -10
- addons/pro/slack/views/quiz-settings/setup-message.php +8 -1
- addons/pro/trello/class-forminator-addon-trello-form-hooks.php +69 -64
- addons/pro/trello/class-forminator-addon-trello-form-settings.php +13 -8
- addons/pro/trello/class-forminator-addon-trello-poll-hooks.php +5 -0
- addons/pro/trello/class-forminator-addon-trello-poll-settings.php +5 -0
- addons/pro/trello/class-forminator-addon-trello-quiz-hooks.php +29 -14
- addons/pro/trello/class-forminator-addon-trello-quiz-settings.php +10 -0
- addons/pro/trello/views/form-settings/setup-card.php +149 -100
- addons/pro/trello/views/poll-settings/setup-card.php +74 -45
- addons/pro/trello/views/quiz-settings/setup-card.php +81 -40
- admin/abstracts/class-admin-import-mediator.php +1 -4
- admin/abstracts/class-admin-module.php +11 -0
- admin/abstracts/class-admin-page.php +4 -2
- admin/classes/class-admin-ajax.php +56 -52
- admin/classes/class-admin-data.php +11 -20
- admin/classes/class-admin-l10n.php +16 -3
- admin/classes/thirdparty-importers/class-importer-cf7.php +1 -0
- admin/classes/thirdparty-importers/class-importer-gravity.php +21 -41
- admin/classes/thirdparty-importers/class-importer-ninja.php +23 -52
- admin/locale.php +409 -312
- admin/pages/entries-page.php +4 -0
- admin/views/custom-form/list/content.php +36 -9
- admin/views/custom-form/popup/import-gravityforms.php +1 -1
- admin/views/custom-form/popup/import-ninjaforms.php +1 -1
- admin/views/dashboard/content.php +21 -13
- admin/views/dashboard/new-feature-notice.php +14 -45
- admin/views/dashboard/widgets/widget-cform.php +123 -126
- admin/views/dashboard/widgets/widget-poll.php +1 -5
- admin/views/dashboard/widgets/widget-quiz.php +32 -17
- admin/views/dashboard/widgets/widget-upgrade.php +21 -25
- admin/views/poll/list/content.php +13 -2
- admin/views/quiz/entries/content-leads-none.php +218 -0
- admin/views/quiz/entries/content-leads.php +538 -0
- admin/views/quiz/entries/content.php +169 -293
- admin/views/quiz/entries/filter.php +206 -0
- admin/views/quiz/list/content.php +263 -21
- admin/views/settings/dashboard/forms.php +1 -1
- admin/views/settings/dashboard/polls.php +1 -1
- admin/views/settings/dashboard/quizzes.php +1 -1
- admin/views/settings/tab-dashboard.php +1 -1
- assets/css/shared-ui.min.css +0 -1
addons/pro/activecampaign/activecampaign.php
CHANGED
@@ -26,5 +26,8 @@ function forminator_addon_activecampaign_assets_url() {
|
|
26 |
require_once dirname( __FILE__ ) . '/class-forminator-addon-activecampaign.php';
|
27 |
require_once dirname( __FILE__ ) . '/class-forminator-addon-activecampaign-form-settings.php';
|
28 |
require_once dirname( __FILE__ ) . '/class-forminator-addon-activecampaign-form-hooks.php';
|
|
|
|
|
|
|
29 |
//Direct Load
|
30 |
Forminator_Addon_Loader::get_instance()->register( 'Forminator_Addon_Activecampaign' );
|
26 |
require_once dirname( __FILE__ ) . '/class-forminator-addon-activecampaign.php';
|
27 |
require_once dirname( __FILE__ ) . '/class-forminator-addon-activecampaign-form-settings.php';
|
28 |
require_once dirname( __FILE__ ) . '/class-forminator-addon-activecampaign-form-hooks.php';
|
29 |
+
|
30 |
+
require_once dirname( __FILE__ ) . '/class-forminator-addon-activecampaign-quiz-settings.php';
|
31 |
+
require_once dirname( __FILE__ ) . '/class-forminator-addon-activecampaign-quiz-hooks.php';
|
32 |
//Direct Load
|
33 |
Forminator_Addon_Loader::get_instance()->register( 'Forminator_Addon_Activecampaign' );
|
addons/pro/activecampaign/class-forminator-addon-activecampaign-form-hooks.php
CHANGED
@@ -76,6 +76,21 @@ class Forminator_Addon_Activecampaign_Form_Hooks extends Forminator_Addon_Form_H
|
|
76 |
|
77 |
forminator_addon_maybe_log( __METHOD__, $submitted_data );
|
78 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
79 |
$addon_setting_values = $this->form_settings_instance->get_form_settings_values();
|
80 |
$form_settings = $this->form_settings_instance->get_form_settings();
|
81 |
|
76 |
|
77 |
forminator_addon_maybe_log( __METHOD__, $submitted_data );
|
78 |
|
79 |
+
$lead_entry_fields = array();
|
80 |
+
$data_entry = isset( $submitted_data['entry_id'] ) ? $submitted_data['entry_id'] : 0;
|
81 |
+
if ( ! empty( $data_entry ) ) {
|
82 |
+
$submitted_data = forminator_lead_form_data( $data_entry );
|
83 |
+
if ( ! empty( $submitted_data ) ) {
|
84 |
+
foreach ( $submitted_data as $key => $submit ) {
|
85 |
+
$lead_entry_fields[] = array(
|
86 |
+
'name' => $key,
|
87 |
+
'value' => $submit,
|
88 |
+
);
|
89 |
+
}
|
90 |
+
}
|
91 |
+
}
|
92 |
+
$form_entry_fields = $lead_entry_fields;
|
93 |
+
|
94 |
$addon_setting_values = $this->form_settings_instance->get_form_settings_values();
|
95 |
$form_settings = $this->form_settings_instance->get_form_settings();
|
96 |
|
addons/pro/activecampaign/class-forminator-addon-activecampaign-quiz-hooks.php
ADDED
@@ -0,0 +1,763 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/**
|
4 |
+
* Class Forminator_Addon_Activecampaign_Quiz_Hooks
|
5 |
+
*
|
6 |
+
* @since 1.0 Activecampaign Addon
|
7 |
+
*
|
8 |
+
*/
|
9 |
+
class Forminator_Addon_Activecampaign_Quiz_Hooks extends Forminator_Addon_Quiz_Hooks_Abstract {
|
10 |
+
|
11 |
+
/**
|
12 |
+
* Addon instance are auto available quiz abstract
|
13 |
+
* Its added here for development purpose,
|
14 |
+
* Auto-complete will resolve addon directly to `Activecampaign` instance instead of the abstract
|
15 |
+
* And its public properties can be exposed
|
16 |
+
*
|
17 |
+
* @since 1.0 Activecampaign Addon
|
18 |
+
* @var Forminator_Addon_Activecampaign
|
19 |
+
*/
|
20 |
+
protected $addon;
|
21 |
+
|
22 |
+
/**
|
23 |
+
* Quiz Settings Instance
|
24 |
+
*
|
25 |
+
* @since 1.0 Activecampaign Addon
|
26 |
+
* @var Forminator_Addon_Activecampaign_Quiz_Settings | null
|
27 |
+
*/
|
28 |
+
protected $quiz_settings_instance;
|
29 |
+
|
30 |
+
/**
|
31 |
+
* Forminator_Addon_Activecampaign_Quiz_Hooks constructor.
|
32 |
+
*
|
33 |
+
* @since 1.0 Activecampaign Addon
|
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 = __( 'ActiveCampaign failed to process submitted data. Please check your quiz and try again', Forminator::DOMAIN );
|
43 |
+
}
|
44 |
+
|
45 |
+
/**
|
46 |
+
* Save status of request sent and received for each connected Active Campaign Connection
|
47 |
+
*
|
48 |
+
* @since 1.0 Activecampaign Addon
|
49 |
+
* @since 1.7 Add $form_entry_fields
|
50 |
+
*
|
51 |
+
* @param array $submitted_data
|
52 |
+
* @param array $form_entry_fields
|
53 |
+
*
|
54 |
+
* @return array
|
55 |
+
*/
|
56 |
+
public function add_entry_fields( $submitted_data, $form_entry_fields = array() ) {
|
57 |
+
|
58 |
+
$quiz_id = $this->quiz_id;
|
59 |
+
$quiz_settings_instance = $this->quiz_settings_instance;
|
60 |
+
|
61 |
+
/**
|
62 |
+
* Filter ActiveCampaign submitted quiz data to be processed
|
63 |
+
*
|
64 |
+
* @since 1.2
|
65 |
+
*
|
66 |
+
* @param array $submitted_data
|
67 |
+
* @param int $quiz_id current Quiz ID
|
68 |
+
* @param Forminator_Addon_Activecampaign_Quiz_Settings $quiz_settings_instance ActiveCampaign Addon Quiz Settings instance
|
69 |
+
*/
|
70 |
+
$submitted_data = apply_filters(
|
71 |
+
'forminator_addon_activecampaign_quiz_submitted_data',
|
72 |
+
$submitted_data,
|
73 |
+
$quiz_id,
|
74 |
+
$quiz_settings_instance
|
75 |
+
);
|
76 |
+
|
77 |
+
forminator_addon_maybe_log( __METHOD__, $submitted_data );
|
78 |
+
|
79 |
+
$quiz_submitted_data = get_quiz_submitted_data( $this->quiz, $submitted_data, $form_entry_fields );
|
80 |
+
|
81 |
+
$addon_setting_values = $this->quiz_settings_instance->get_quiz_settings_values();
|
82 |
+
$quiz_settings = $this->quiz_settings_instance->get_quiz_settings();
|
83 |
+
$addons_fields = $this->quiz_settings_instance->get_form_fields();
|
84 |
+
|
85 |
+
$form_entry_fields = forminator_lead_form_data( $submitted_data );
|
86 |
+
$submitted_data = get_addons_lead_form_entry_data( $quiz_settings, $submitted_data, $addons_fields );
|
87 |
+
$submitted_data = array_merge( $submitted_data, $quiz_submitted_data );
|
88 |
+
|
89 |
+
$data = array();
|
90 |
+
|
91 |
+
/**
|
92 |
+
* Fires before sending contact sync to Active Campaign
|
93 |
+
*
|
94 |
+
* @since 1.2
|
95 |
+
*
|
96 |
+
* @param int $quiz_id current Quiz ID
|
97 |
+
* @param array $submitted_data
|
98 |
+
* @param Forminator_Addon_Activecampaign_Quiz_Settings $quiz_settings_instance ActiveCampaign Addon Quiz Settings instance
|
99 |
+
*/
|
100 |
+
do_action( 'forminator_addon_activecampaign_before_contact_sync', $quiz_id, $submitted_data, $quiz_settings_instance );
|
101 |
+
|
102 |
+
foreach ( $addon_setting_values as $key => $addon_setting_value ) {
|
103 |
+
// save it on entry field, with name `status-$MULTI_ID`, and value is the return result on sending data to active campaign
|
104 |
+
if ( $quiz_settings_instance->is_multi_quiz_settings_complete( $key ) ) {
|
105 |
+
// exec only on completed connection
|
106 |
+
$data[] = array(
|
107 |
+
'name' => 'status-' . $key,
|
108 |
+
'value' => $this->get_status_on_contact_sync( $key, $submitted_data, $addon_setting_value, $quiz_settings, $form_entry_fields ),
|
109 |
+
);
|
110 |
+
}
|
111 |
+
}
|
112 |
+
|
113 |
+
$entry_fields = $data;
|
114 |
+
/**
|
115 |
+
* Filter ActiveCampaign entry fields to be saved to entry model
|
116 |
+
*
|
117 |
+
* @since 1.2
|
118 |
+
*
|
119 |
+
* @param array $entry_fields
|
120 |
+
* @param int $quiz_id current Quiz ID
|
121 |
+
* @param array $submitted_data
|
122 |
+
* @param Forminator_Addon_Activecampaign_Quiz_Settings $quiz_settings_instance ActiveCampaign Addon Quiz Settings instance
|
123 |
+
*/
|
124 |
+
$data = apply_filters(
|
125 |
+
'forminator_addon_activecampaign_entry_fields',
|
126 |
+
$entry_fields,
|
127 |
+
$quiz_id,
|
128 |
+
$submitted_data,
|
129 |
+
$quiz_settings_instance
|
130 |
+
);
|
131 |
+
|
132 |
+
return $data;
|
133 |
+
|
134 |
+
}
|
135 |
+
|
136 |
+
/**
|
137 |
+
* Get status on contact sync to ActiveCampaign
|
138 |
+
*
|
139 |
+
* @since 1.0 Activecampaign Addon
|
140 |
+
* @since 1.7 Add $form_entry_fields
|
141 |
+
*
|
142 |
+
* @param $connection_id
|
143 |
+
* @param $submitted_data
|
144 |
+
* @param $connection_settings
|
145 |
+
* @param $quiz_settings
|
146 |
+
* @param array $form_entry_fields
|
147 |
+
*
|
148 |
+
* @return array `is_sent` true means its success send data to ActiveCampaign, false otherwise
|
149 |
+
*/
|
150 |
+
private function get_status_on_contact_sync( $connection_id, $submitted_data, $connection_settings, $quiz_settings, $form_entry_fields ) {
|
151 |
+
// initialize as null
|
152 |
+
$ac_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 |
+
$ac_api = $this->addon->get_api();
|
160 |
+
$args = array();
|
161 |
+
|
162 |
+
if ( ! isset( $connection_settings['list_id'] ) ) {
|
163 |
+
throw new Forminator_Addon_Activecampaign_Exception( __( 'List ID not properly setup.', Forminator::DOMAIN ) );
|
164 |
+
}
|
165 |
+
|
166 |
+
$args[ 'p[' . $connection_settings['list_id'] . ']' ] = $connection_settings['list_id'];
|
167 |
+
// subscribed
|
168 |
+
$args[ 'status[' . $connection_settings['list_id'] . ']' ] = '1';
|
169 |
+
|
170 |
+
$fields_map = $connection_settings['fields_map'];
|
171 |
+
|
172 |
+
$email_element_id = $connection_settings['fields_map']['email'];
|
173 |
+
if ( ! isset( $submitted_data[ $email_element_id ] ) || empty( $submitted_data[ $email_element_id ] ) ) {
|
174 |
+
throw new Forminator_Addon_Activecampaign_Exception( __( 'Email on element not found or not filled on submitted data.', Forminator::DOMAIN ) );
|
175 |
+
}
|
176 |
+
$email = $submitted_data[ $email_element_id ];
|
177 |
+
$email = strtolower( trim( $email ) );
|
178 |
+
$args['email'] = $email;
|
179 |
+
|
180 |
+
// processed
|
181 |
+
unset( $fields_map['email'] );
|
182 |
+
|
183 |
+
$common_fields = array(
|
184 |
+
'first_name',
|
185 |
+
'last_name',
|
186 |
+
'phone',
|
187 |
+
'orgname',
|
188 |
+
);
|
189 |
+
|
190 |
+
foreach ( $common_fields as $common_field ) {
|
191 |
+
// not setup
|
192 |
+
if ( ! isset( $fields_map[ $common_field ] ) ) {
|
193 |
+
continue;
|
194 |
+
}
|
195 |
+
|
196 |
+
if ( ! empty( $fields_map[ $common_field ] ) ) {
|
197 |
+
$element_id = $fields_map[ $common_field ];
|
198 |
+
|
199 |
+
if ( isset( $submitted_data[ $element_id ] ) && ! empty( $submitted_data[ $element_id ] ) ) {
|
200 |
+
$element_value = $submitted_data[ $element_id ];
|
201 |
+
if ( is_array( $element_value ) ) {
|
202 |
+
$element_value = implode( ',', $element_value );
|
203 |
+
}
|
204 |
+
}
|
205 |
+
if ( isset( $element_value ) ) {
|
206 |
+
$args[ $common_field ] = $element_value;
|
207 |
+
unset( $element_value ); // unset for next loop
|
208 |
+
}
|
209 |
+
}
|
210 |
+
// processed
|
211 |
+
unset( $fields_map[ $common_field ] );
|
212 |
+
}
|
213 |
+
|
214 |
+
// process rest extra fields if available
|
215 |
+
foreach ( $fields_map as $field_id => $element_id ) {
|
216 |
+
if ( ! empty( $element_id ) ) {
|
217 |
+
if ( isset( $submitted_data[ $element_id ] ) && ( ! empty( $submitted_data[ $element_id ] ) || 0 === (int) $submitted_data[ $element_id ] ) ) {
|
218 |
+
$element_value = $submitted_data[ $element_id ];
|
219 |
+
if ( is_array( $element_value ) ) {
|
220 |
+
$element_value = implode( ',', $element_value );
|
221 |
+
}
|
222 |
+
}
|
223 |
+
|
224 |
+
if ( isset( $element_value ) ) {
|
225 |
+
$args[ 'field[' . $field_id . ',0]' ] = $element_value;
|
226 |
+
unset( $element_value ); // unset for next loop
|
227 |
+
}
|
228 |
+
}
|
229 |
+
}
|
230 |
+
|
231 |
+
// process tags
|
232 |
+
if ( isset( $connection_settings['tags'] ) && is_array( $connection_settings['tags'] ) ) {
|
233 |
+
$tags = array();
|
234 |
+
foreach ( $connection_settings['tags'] as $tag ) {
|
235 |
+
if ( stripos( $tag, '{' ) === 0
|
236 |
+
&& stripos( $tag, '}' ) === ( strlen( $tag ) - 1 )
|
237 |
+
) {
|
238 |
+
// translate to value
|
239 |
+
$element_id = str_ireplace( '{', '', $tag );
|
240 |
+
$element_id = str_ireplace( '}', '', $element_id );
|
241 |
+
if ( isset( $submitted_data[ $element_id ] ) && ! empty( $submitted_data[ $element_id ] ) ) {
|
242 |
+
$element_value = $submitted_data[ $element_id ];
|
243 |
+
if ( is_array( $element_value ) ) {
|
244 |
+
$element_value = implode( ',', $element_value );
|
245 |
+
}
|
246 |
+
}
|
247 |
+
|
248 |
+
if ( isset( $element_value ) ) {
|
249 |
+
$tags[] = $element_value;
|
250 |
+
unset( $element_value ); // unset for next loop
|
251 |
+
}
|
252 |
+
} else {
|
253 |
+
$tags[] = $tag;
|
254 |
+
}
|
255 |
+
}
|
256 |
+
if ( ! empty( $tags ) ) {
|
257 |
+
$tags = implode( ',', $tags );
|
258 |
+
$args['tags'] = $tags;
|
259 |
+
}
|
260 |
+
}
|
261 |
+
|
262 |
+
if ( isset( $connection_settings['double_opt_form_id'] ) && ! empty( $connection_settings['double_opt_form_id'] ) ) {
|
263 |
+
$args['form'] = $connection_settings['double_opt_form_id'];
|
264 |
+
}
|
265 |
+
|
266 |
+
if ( isset( $connection_settings['instantresponders'] ) ) {
|
267 |
+
$instant_responders = filter_var( $connection_settings['instantresponders'], FILTER_VALIDATE_BOOLEAN );
|
268 |
+
if ( $instant_responders ) {
|
269 |
+
$args[ 'instantresponders[' . $connection_settings['list_id'] . ']' ] = '1';
|
270 |
+
}
|
271 |
+
}
|
272 |
+
|
273 |
+
if ( isset( $connection_settings['lastmessage'] ) ) {
|
274 |
+
$last_message = filter_var( $connection_settings['lastmessage'], FILTER_VALIDATE_BOOLEAN );
|
275 |
+
if ( $last_message ) {
|
276 |
+
$args[ 'lastmessage[' . $connection_settings['list_id'] . ']' ] = '1';
|
277 |
+
}
|
278 |
+
}
|
279 |
+
|
280 |
+
/**
|
281 |
+
* Filter arguments to passed on to Contact Sync Active Campaign API
|
282 |
+
*
|
283 |
+
* @since 1.2
|
284 |
+
*
|
285 |
+
* @param array $args
|
286 |
+
* @param int $quiz_id Current Quiz id
|
287 |
+
* @param string $connection_id ID of current connection
|
288 |
+
* @param array $submitted_data
|
289 |
+
* @param array $connection_settings current connection setting, contains options of like `name`, `list_id` etc
|
290 |
+
* @param array $quiz_settings Displayed Quiz settings
|
291 |
+
* @param Forminator_Addon_Activecampaign_Quiz_Settings $quiz_settings_instance ActiveCampaign Addon Quiz Settings instance
|
292 |
+
*/
|
293 |
+
$args = apply_filters(
|
294 |
+
'forminator_addon_activecampaign_contact_sync_args',
|
295 |
+
$args,
|
296 |
+
$quiz_id,
|
297 |
+
$connection_id,
|
298 |
+
$submitted_data,
|
299 |
+
$connection_settings,
|
300 |
+
$quiz_settings,
|
301 |
+
$quiz_settings_instance
|
302 |
+
);
|
303 |
+
|
304 |
+
$ac_api->contact_sync( $args );
|
305 |
+
|
306 |
+
forminator_addon_maybe_log( __METHOD__, 'Success Send Data' );
|
307 |
+
|
308 |
+
return array(
|
309 |
+
'is_sent' => true,
|
310 |
+
'connection_name' => $connection_settings['name'],
|
311 |
+
'description' => __( 'Successfully send data to ActiveCampaign', Forminator::DOMAIN ),
|
312 |
+
'data_sent' => $ac_api->get_last_data_sent(),
|
313 |
+
'data_received' => $ac_api->get_last_data_received(),
|
314 |
+
'url_request' => $ac_api->get_last_url_request(),
|
315 |
+
);
|
316 |
+
|
317 |
+
} catch ( Forminator_Addon_Activecampaign_Exception $e ) {
|
318 |
+
forminator_addon_maybe_log( __METHOD__, 'Failed to Send to ActiveCampaign' );
|
319 |
+
|
320 |
+
return array(
|
321 |
+
'is_sent' => false,
|
322 |
+
'description' => $e->getMessage(),
|
323 |
+
'connection_name' => $connection_settings['name'],
|
324 |
+
'data_sent' => ( ( $ac_api instanceof Forminator_Addon_Activecampaign_Wp_Api ) ? $ac_api->get_last_data_sent() : array() ),
|
325 |
+
'data_received' => ( ( $ac_api instanceof Forminator_Addon_Activecampaign_Wp_Api ) ? $ac_api->get_last_data_received() : array() ),
|
326 |
+
'url_request' => ( ( $ac_api instanceof Forminator_Addon_Activecampaign_Wp_Api ) ? $ac_api->get_last_url_request() : '' ),
|
327 |
+
);
|
328 |
+
}
|
329 |
+
}
|
330 |
+
|
331 |
+
/**
|
332 |
+
* It wil add new row on entry table of submission page, with couple of subentries
|
333 |
+
* subentries included are defined in @see Forminator_Addon_Activecampaign_Quiz_Hooks::get_additional_entry_item()
|
334 |
+
*
|
335 |
+
* @since 1.0 Activecampaign Addon
|
336 |
+
*
|
337 |
+
* @param Forminator_Form_Entry_Model $entry_model
|
338 |
+
* @param $addon_meta_data
|
339 |
+
*
|
340 |
+
* @return array
|
341 |
+
*/
|
342 |
+
public function on_render_entry( Forminator_Form_Entry_Model $entry_model, $addon_meta_data ) {
|
343 |
+
|
344 |
+
$quiz_id = $this->quiz_id;
|
345 |
+
$quiz_settings_instance = $this->quiz_settings_instance;
|
346 |
+
|
347 |
+
/**
|
348 |
+
*
|
349 |
+
* Filter active campaign metadata that previously saved on db to be processed
|
350 |
+
*
|
351 |
+
* @since 1.2
|
352 |
+
*
|
353 |
+
* @param array $addon_meta_data
|
354 |
+
* @param int $quiz_id current Quiz ID
|
355 |
+
* @param Forminator_Addon_Activecampaign_Quiz_Settings $quiz_settings_instance ActiveCampaign Addon Quiz Settings instance
|
356 |
+
*/
|
357 |
+
$addon_meta_data = apply_filters(
|
358 |
+
'forminator_addon_activecampaign_metadata',
|
359 |
+
$addon_meta_data,
|
360 |
+
$quiz_id,
|
361 |
+
$quiz_settings_instance
|
362 |
+
);
|
363 |
+
|
364 |
+
$addon_meta_datas = $addon_meta_data;
|
365 |
+
if ( ! isset( $addon_meta_data[0] ) || ! is_array( $addon_meta_data[0] ) ) {
|
366 |
+
return array();
|
367 |
+
}
|
368 |
+
|
369 |
+
return $this->on_render_entry_multi_connection( $addon_meta_datas );
|
370 |
+
|
371 |
+
}
|
372 |
+
|
373 |
+
/**
|
374 |
+
* Loop through addon meta data on multiple active campaign(s)
|
375 |
+
*
|
376 |
+
* @since 1.0 Activecampaign Addon
|
377 |
+
*
|
378 |
+
* @param $addon_meta_datas
|
379 |
+
*
|
380 |
+
* @return array
|
381 |
+
*/
|
382 |
+
private function on_render_entry_multi_connection( $addon_meta_datas ) {
|
383 |
+
$additional_entry_item = array();
|
384 |
+
foreach ( $addon_meta_datas as $addon_meta_data ) {
|
385 |
+
$additional_entry_item[] = $this->get_additional_entry_item( $addon_meta_data );
|
386 |
+
}
|
387 |
+
|
388 |
+
return $additional_entry_item;
|
389 |
+
|
390 |
+
}
|
391 |
+
|
392 |
+
/**
|
393 |
+
* Format additional entry item as label and value arrays
|
394 |
+
*
|
395 |
+
* - Integration Name : its defined by user when they adding Activecampaign integration on their quiz
|
396 |
+
* - Sent To Activecampaign : will be Yes/No value, that indicates whether sending data to Activecampaign was successful
|
397 |
+
* - Info : Text that are generated by addon when building and sending data to Activecampaign @see Forminator_Addon_Activecampaign_Quiz_Hooks::add_entry_fields()
|
398 |
+
* - Below subentries will be added if full log enabled, @see Forminator_Addon_Activecampaign::is_show_full_log() @see FORMINATOR_ADDON_ACTIVECAMPAIGN_SHOW_FULL_LOG
|
399 |
+
* - API URL : URL that wes requested when sending data to Activecampaign
|
400 |
+
* - Data sent to Activecampaign : encoded body request that was sent
|
401 |
+
* - Data received from Activecampaign : json encoded body response that was received
|
402 |
+
*
|
403 |
+
* @param $addon_meta_data
|
404 |
+
*
|
405 |
+
* @since 1.0 Activecampaign Addon
|
406 |
+
* @return array
|
407 |
+
*/
|
408 |
+
private function get_additional_entry_item( $addon_meta_data ) {
|
409 |
+
|
410 |
+
if ( ! isset( $addon_meta_data['value'] ) || ! is_array( $addon_meta_data['value'] ) ) {
|
411 |
+
return array();
|
412 |
+
}
|
413 |
+
$status = $addon_meta_data['value'];
|
414 |
+
$additional_entry_item = array(
|
415 |
+
'label' => __( 'ActiveCampaign Integration', Forminator::DOMAIN ),
|
416 |
+
'value' => '',
|
417 |
+
);
|
418 |
+
|
419 |
+
$sub_entries = array();
|
420 |
+
if ( isset( $status['connection_name'] ) ) {
|
421 |
+
$sub_entries[] = array(
|
422 |
+
'label' => __( 'Integration Name', Forminator::DOMAIN ),
|
423 |
+
'value' => $status['connection_name'],
|
424 |
+
);
|
425 |
+
}
|
426 |
+
|
427 |
+
if ( isset( $status['is_sent'] ) ) {
|
428 |
+
$is_sent = true === $status['is_sent'] ? __( 'Yes', Forminator::DOMAIN ) : __( 'No', Forminator::DOMAIN );
|
429 |
+
$sub_entries[] = array(
|
430 |
+
'label' => __( 'Sent To ActiveCampaign', Forminator::DOMAIN ),
|
431 |
+
'value' => $is_sent,
|
432 |
+
);
|
433 |
+
}
|
434 |
+
|
435 |
+
if ( isset( $status['description'] ) ) {
|
436 |
+
$sub_entries[] = array(
|
437 |
+
'label' => __( 'Info', Forminator::DOMAIN ),
|
438 |
+
'value' => $status['description'],
|
439 |
+
);
|
440 |
+
}
|
441 |
+
|
442 |
+
if ( Forminator_Addon_Activecampaign::is_show_full_log() ) {
|
443 |
+
// too long to be added on entry data enable this with `define('FORMINATOR_ADDON_ACTIVECAMPAIGN_SHOW_FULL_LOG', true)`
|
444 |
+
if ( isset( $status['url_request'] ) ) {
|
445 |
+
$sub_entries[] = array(
|
446 |
+
'label' => __( 'API URL', Forminator::DOMAIN ),
|
447 |
+
'value' => $status['url_request'],
|
448 |
+
);
|
449 |
+
}
|
450 |
+
|
451 |
+
if ( isset( $status['data_sent'] ) ) {
|
452 |
+
$sub_entries[] = array(
|
453 |
+
'label' => __( 'Data sent to ActiveCampaign', Forminator::DOMAIN ),
|
454 |
+
'value' => '<pre class="sui-code-snippet">' . wp_json_encode( $status['data_sent'], JSON_PRETTY_PRINT ) . '</pre>',
|
455 |
+
);
|
456 |
+
}
|
457 |
+
|
458 |
+
if ( isset( $status['data_received'] ) ) {
|
459 |
+
$sub_entries[] = array(
|
460 |
+
'label' => __( 'Data received from ActiveCampaign', Forminator::DOMAIN ),
|
461 |
+
'value' => '<pre class="sui-code-snippet">' . wp_json_encode( $status['data_received'], JSON_PRETTY_PRINT ) . '</pre>',
|
462 |
+
);
|
463 |
+
}
|
464 |
+
}
|
465 |
+
|
466 |
+
$additional_entry_item['sub_entries'] = $sub_entries;
|
467 |
+
|
468 |
+
// return single array
|
469 |
+
return $additional_entry_item;
|
470 |
+
}
|
471 |
+
|
472 |
+
/**
|
473 |
+
* Activecampaign will add a column on the title/header row
|
474 |
+
* its called `Active Campaign Info` which can be translated on forminator lang
|
475 |
+
*
|
476 |
+
* @since 1.0 Activecampaign Addon
|
477 |
+
* @return array
|
478 |
+
*/
|
479 |
+
public function on_export_render_title_row() {
|
480 |
+
|
481 |
+
$export_headers = array(
|
482 |
+
'info' => __( 'ActiveCampaign Info', Forminator::DOMAIN ),
|
483 |
+
);
|
484 |
+
|
485 |
+
$quiz_id = $this->quiz_id;
|
486 |
+
$quiz_settings_instance = $this->quiz_settings_instance;
|
487 |
+
|
488 |
+
/**
|
489 |
+
* Filter Activecampaign headers on export file
|
490 |
+
*
|
491 |
+
* @since 1.2
|
492 |
+
*
|
493 |
+
* @param array $export_headers headers to be displayed on export file
|
494 |
+
* @param int $quiz_id current Quiz ID
|
495 |
+
* @param Forminator_Addon_Activecampaign_Quiz_Settings $quiz_settings_instance Activecampaign Quiz Settings instance
|
496 |
+
*/
|
497 |
+
$export_headers = apply_filters(
|
498 |
+
'forminator_addon_activecampaign_export_headers',
|
499 |
+
$export_headers,
|
500 |
+
$quiz_id,
|
501 |
+
$quiz_settings_instance
|
502 |
+
);
|
503 |
+
|
504 |
+
return $export_headers;
|
505 |
+
}
|
506 |
+
|
507 |
+
/**
|
508 |
+
* Activecampaign will add a column that give user information whether sending data to Activecampaign successfully or not
|
509 |
+
* It will only add one column even its multiple connection, every connection will be separated by comma
|
510 |
+
*
|
511 |
+
* @since 1.0 Activecampaign Addon
|
512 |
+
*
|
513 |
+
* @param Forminator_Form_Entry_Model $entry_model
|
514 |
+
* @param $addon_meta_data
|
515 |
+
*
|
516 |
+
* @return array
|
517 |
+
*/
|
518 |
+
public function on_export_render_entry( Forminator_Form_Entry_Model $entry_model, $addon_meta_data ) {
|
519 |
+
|
520 |
+
$quiz_id = $this->quiz_id;
|
521 |
+
$quiz_settings_instance = $this->quiz_settings_instance;
|
522 |
+
|
523 |
+
/**
|
524 |
+
*
|
525 |
+
* Filter Activecampaign metadata that previously saved on db to be processed
|
526 |
+
*
|
527 |
+
* @since 1.2
|
528 |
+
*
|
529 |
+
* @param array $addon_meta_data
|
530 |
+
* @param int $quiz_id current Quiz ID
|
531 |
+
* @param Forminator_Addon_Activecampaign_Quiz_Settings $quiz_settings_instance Activecampaign Quiz Settings instance
|
532 |
+
*/
|
533 |
+
$addon_meta_data = apply_filters(
|
534 |
+
'forminator_addon_activecampaign_metadata',
|
535 |
+
$addon_meta_data,
|
536 |
+
$quiz_id,
|
537 |
+
$quiz_settings_instance
|
538 |
+
);
|
539 |
+
|
540 |
+
$export_columns = array(
|
541 |
+
'info' => $this->get_from_addon_meta_data( $addon_meta_data, 'description', '' ),
|
542 |
+
);
|
543 |
+
|
544 |
+
/**
|
545 |
+
* Filter Activecampaign columns to be displayed on export submissions
|
546 |
+
*
|
547 |
+
* @since 1.2
|
548 |
+
*
|
549 |
+
* @param array $export_columns column to be exported
|
550 |
+
* @param int $quiz_id current Quiz ID
|
551 |
+
* @param Forminator_Form_Entry_Model $entry_model Form Entry Model
|
552 |
+
* @param array $addon_meta_data meta data saved by addon on entry fields
|
553 |
+
* @param Forminator_Addon_Activecampaign_Quiz_Settings $quiz_settings_instance Activecampaign Quiz Settings instance
|
554 |
+
*/
|
555 |
+
$export_columns = apply_filters(
|
556 |
+
'forminator_addon_activecampaign_export_columns',
|
557 |
+
$export_columns,
|
558 |
+
$quiz_id,
|
559 |
+
$entry_model,
|
560 |
+
$addon_meta_data,
|
561 |
+
$quiz_settings_instance
|
562 |
+
);
|
563 |
+
|
564 |
+
return $export_columns;
|
565 |
+
}
|
566 |
+
|
567 |
+
/**
|
568 |
+
* Get Addon meta data, will be recursive if meta data is multiple because of multiple connection added
|
569 |
+
*
|
570 |
+
* @since 1.0 Activecampaign Addon
|
571 |
+
*
|
572 |
+
* @param $addon_meta_data
|
573 |
+
* @param $key
|
574 |
+
* @param string $default
|
575 |
+
*
|
576 |
+
* @return string
|
577 |
+
*/
|
578 |
+
protected function get_from_addon_meta_data( $addon_meta_data, $key, $default = '' ) {
|
579 |
+
$addon_meta_datas = $addon_meta_data;
|
580 |
+
if ( ! isset( $addon_meta_data[0] ) || ! is_array( $addon_meta_data[0] ) ) {
|
581 |
+
return $default;
|
582 |
+
}
|
583 |
+
|
584 |
+
$addon_meta_data = $addon_meta_data[0];
|
585 |
+
|
586 |
+
// make sure its `status`, because we only add this
|
587 |
+
if ( 'status' !== $addon_meta_data['name'] ) {
|
588 |
+
if ( stripos( $addon_meta_data['name'], 'status-' ) === 0 ) {
|
589 |
+
$meta_data = array();
|
590 |
+
foreach ( $addon_meta_datas as $addon_meta_data ) {
|
591 |
+
// make it like single value so it will be processed like single meta data
|
592 |
+
$addon_meta_data['name'] = 'status';
|
593 |
+
|
594 |
+
// add it on an array for next recursive process
|
595 |
+
$meta_data[] = $this->get_from_addon_meta_data( array( $addon_meta_data ), $key, $default );
|
596 |
+
}
|
597 |
+
|
598 |
+
return implode( ', ', $meta_data );
|
599 |
+
}
|
600 |
+
|
601 |
+
return $default;
|
602 |
+
|
603 |
+
}
|
604 |
+
|
605 |
+
if ( ! isset( $addon_meta_data['value'] ) || ! is_array( $addon_meta_data['value'] ) ) {
|
606 |
+
return $default;
|
607 |
+
}
|
608 |
+
$status = $addon_meta_data['value'];
|
609 |
+
if ( isset( $status[ $key ] ) ) {
|
610 |
+
$connection_name = '';
|
611 |
+
if ( 'connection_name' !== $key ) {
|
612 |
+
if ( isset( $status['connection_name'] ) ) {
|
613 |
+
$connection_name = '[' . $status['connection_name'] . '] ';
|
614 |
+
}
|
615 |
+
}
|
616 |
+
|
617 |
+
return $connection_name . $status[ $key ];
|
618 |
+
}
|
619 |
+
|
620 |
+
return $default;
|
621 |
+
}
|
622 |
+
|
623 |
+
/**
|
624 |
+
* It will delete contact on ActiveCampaign list
|
625 |
+
*
|
626 |
+
* @since 1.0 ActiveCampaign Addon
|
627 |
+
*
|
628 |
+
* @param Forminator_Form_Entry_Model $entry_model
|
629 |
+
* @param array $addon_meta_data
|
630 |
+
*
|
631 |
+
* @return bool
|
632 |
+
*/
|
633 |
+
public function on_before_delete_entry( Forminator_Form_Entry_Model $entry_model, $addon_meta_data ) {
|
634 |
+
// attach hook first
|
635 |
+
$quiz_id = $this->quiz_id;
|
636 |
+
$quiz_settings_instance = $this->quiz_settings_instance;
|
637 |
+
|
638 |
+
/**
|
639 |
+
*
|
640 |
+
* Filter ActiveCampaign addon metadata that previously saved on db to be processed
|
641 |
+
*
|
642 |
+
* @since 1.1
|
643 |
+
*
|
644 |
+
* @param array $addon_meta_data
|
645 |
+
* @param int $quiz_id current Quiz ID
|
646 |
+
* @param Forminator_Form_Entry_Model $entry_model Forminator Entry Model
|
647 |
+
* @param Forminator_Addon_Activecampaign_Quiz_Settings $quiz_settings_instance Activecampaign Quiz Settings instance
|
648 |
+
*/
|
649 |
+
$addon_meta_data = apply_filters(
|
650 |
+
'forminator_addon_activecampaign_metadata',
|
651 |
+
$addon_meta_data,
|
652 |
+
$quiz_id,
|
653 |
+
$entry_model,
|
654 |
+
$quiz_settings_instance
|
655 |
+
);
|
656 |
+
|
657 |
+
/**
|
658 |
+
* Fires when Activecampaign connected quiz delete a submission
|
659 |
+
*
|
660 |
+
* @since 1.1
|
661 |
+
*
|
662 |
+
* @param int $quiz_id current Quiz ID
|
663 |
+
* @param Forminator_Form_Entry_Model $entry_model Forminator Entry Model
|
664 |
+
* @param array $addon_meta_data addon meta data
|
665 |
+
* @param Forminator_Addon_Activecampaign_Quiz_Settings $quiz_settings_instance Activecampaign Quiz Settings instance
|
666 |
+
*/
|
667 |
+
do_action(
|
668 |
+
'forminator_addon_activecampaign_on_before_delete_submission',
|
669 |
+
$quiz_id,
|
670 |
+
$entry_model,
|
671 |
+
$addon_meta_data,
|
672 |
+
$quiz_settings_instance
|
673 |
+
);
|
674 |
+
|
675 |
+
if ( ! Forminator_Addon_Activecampaign::is_enable_delete_contact() ) {
|
676 |
+
// its disabled, go for it!
|
677 |
+
return true;
|
678 |
+
}
|
679 |
+
$ac_api = null;
|
680 |
+
try {
|
681 |
+
$subscriber_ids_to_delete = array();
|
682 |
+
|
683 |
+
if ( is_array( $addon_meta_data ) ) {
|
684 |
+
foreach ( $addon_meta_data as $addon_meta_datum ) {
|
685 |
+
|
686 |
+
/** data received reference
|
687 |
+
*
|
688 |
+
* data_received: {
|
689 |
+
* subscriber_id: 1,
|
690 |
+
* sendlast_should: 0,
|
691 |
+
* sendlast_did: 0,
|
692 |
+
* result_code: 1,
|
693 |
+
* result_message: Contact added,
|
694 |
+
* result_output: json
|
695 |
+
* }
|
696 |
+
*/
|
697 |
+
|
698 |
+
if ( isset( $addon_meta_datum['value'] ) && is_array( $addon_meta_datum['value'] ) ) {
|
699 |
+
$addon_meta_datum_value = $addon_meta_datum['value'];
|
700 |
+
if ( isset( $addon_meta_datum_value['is_sent'] ) && $addon_meta_datum_value['is_sent'] ) {
|
701 |
+
if ( isset( $addon_meta_datum_value['data_received'] ) && is_object( $addon_meta_datum_value['data_received'] ) ) {
|
702 |
+
$addon_meta_datum_received = $addon_meta_datum_value['data_received'];
|
703 |
+
if ( isset( $addon_meta_datum_received->subscriber_id ) && ! empty( $addon_meta_datum_received->subscriber_id ) ) {
|
704 |
+
$subscriber_ids_to_delete [] = $addon_meta_datum_received->subscriber_id;
|
705 |
+
}
|
706 |
+
}
|
707 |
+
}
|
708 |
+
}
|
709 |
+
}
|
710 |
+
}
|
711 |
+
|
712 |
+
/**
|
713 |
+
* Filter subscriber ids to delete
|
714 |
+
*
|
715 |
+
* @since 1.2
|
716 |
+
*
|
717 |
+
* @param array $subscriber_ids_to_delete
|
718 |
+
* @param int $quiz_id current Quiz ID
|
719 |
+
* @param array $addon_meta_data addon meta data
|
720 |
+
* @param Forminator_Addon_Activecampaign_Quiz_Settings $quiz_settings_instance Activecampaign Quiz Settings instance
|
721 |
+
*
|
722 |
+
*/
|
723 |
+
$subscriber_ids_to_delete = apply_filters(
|
724 |
+
'forminator_addon_activecampaign_subscriber_ids_to_delete',
|
725 |
+
$subscriber_ids_to_delete,
|
726 |
+
$quiz_id,
|
727 |
+
$addon_meta_data,
|
728 |
+
$quiz_settings_instance
|
729 |
+
);
|
730 |
+
|
731 |
+
if ( ! empty( $subscriber_ids_to_delete ) ) {
|
732 |
+
$ac_api = $this->addon->get_api();
|
733 |
+
foreach ( $subscriber_ids_to_delete as $subscriber_id_to_delete ) {
|
734 |
+
$ac_api->contact_delete(
|
735 |
+
array(
|
736 |
+
'id' => $subscriber_id_to_delete,
|
737 |
+
)
|
738 |
+
);
|
739 |
+
}
|
740 |
+
}
|
741 |
+
|
742 |
+
return true;
|
743 |
+
|
744 |
+
} catch ( Forminator_Addon_Activecampaign_Exception $e ) {
|
745 |
+
// handle all internal addon exceptions with `Forminator_Addon_Activecampaign_Exception`
|
746 |
+
|
747 |
+
// use wp_error, for future usage it can be returned to page entries
|
748 |
+
$wp_error = new WP_Error( 'forminator_addon_activecampaign_delete_contact', $e->getMessage() );
|
749 |
+
// handle this in addon by self, since page entries cant handle error messages on delete yet
|
750 |
+
wp_die(
|
751 |
+
esc_html( $wp_error->get_error_message() ),
|
752 |
+
esc_html( $this->addon->get_title() ),
|
753 |
+
array(
|
754 |
+
'response' => 200,
|
755 |
+
'back_link' => true,
|
756 |
+
)
|
757 |
+
);
|
758 |
+
|
759 |
+
return false;
|
760 |
+
}
|
761 |
+
|
762 |
+
}
|
763 |
+
}
|
addons/pro/activecampaign/class-forminator-addon-activecampaign-quiz-settings-exception.php
ADDED
@@ -0,0 +1,68 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/**
|
4 |
+
* Class Forminator_Addon_Activecampaign_Quiz_Settings_Exception
|
5 |
+
* Wrapper of Quiz Settings Activecampaign Exception
|
6 |
+
*
|
7 |
+
* @since 1.0 Activecampaign Addon
|
8 |
+
*/
|
9 |
+
class Forminator_Addon_Activecampaign_Quiz_Settings_Exception extends Forminator_Addon_Activecampaign_Exception {
|
10 |
+
|
11 |
+
/**
|
12 |
+
* Holder of input exceptions
|
13 |
+
*
|
14 |
+
* @since 1.0 Activecampaign Addon
|
15 |
+
* @var array
|
16 |
+
*/
|
17 |
+
protected $input_exceptions = array();
|
18 |
+
|
19 |
+
/**
|
20 |
+
* Forminator_Addon_Activecampaign_Quiz_Settings_Exception constructor.
|
21 |
+
*
|
22 |
+
* Useful if input_id is needed for later.
|
23 |
+
* If no input_id needed, use @see Forminator_Addon_Activecampaign_Exception
|
24 |
+
*
|
25 |
+
* @since 1.0 Activecampaign 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 Activecampaign 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 Activecampaign 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 Activecampaign Addon
|
63 |
+
* @return bool
|
64 |
+
*/
|
65 |
+
public function input_exceptions_is_available() {
|
66 |
+
return count( $this->input_exceptions ) > 0;
|
67 |
+
}
|
68 |
+
}
|
addons/pro/activecampaign/class-forminator-addon-activecampaign-quiz-settings.php
ADDED
@@ -0,0 +1,777 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
require_once dirname( __FILE__ ) . '/class-forminator-addon-activecampaign-quiz-settings-exception.php';
|
4 |
+
|
5 |
+
/**
|
6 |
+
* Class Forminator_Addon_Activecampaign_Quiz_Settings
|
7 |
+
* Handle how quiz settings displayed and saved
|
8 |
+
*
|
9 |
+
* @since 1.0 Activecampaign Addon
|
10 |
+
*/
|
11 |
+
class Forminator_Addon_Activecampaign_Quiz_Settings extends Forminator_Addon_Quiz_Settings_Abstract {
|
12 |
+
|
13 |
+
/**
|
14 |
+
* @var Forminator_Addon_Activecampaign
|
15 |
+
* @since 1.0 Activecampaign Addon
|
16 |
+
*/
|
17 |
+
protected $addon;
|
18 |
+
|
19 |
+
/**
|
20 |
+
* @var Forminator_Addon_Activecampaign_CustomField
|
21 |
+
* @since 1.7 Activecampaign Custom Fields
|
22 |
+
*/
|
23 |
+
protected $custom_fields;
|
24 |
+
|
25 |
+
/**
|
26 |
+
* Forminator_Addon_Activecampaign_Quiz_Settings constructor.
|
27 |
+
*
|
28 |
+
* @since 1.0 Activecampaign Addon
|
29 |
+
*
|
30 |
+
* @param Forminator_Addon_Abstract $addon
|
31 |
+
* @param $quiz_id
|
32 |
+
*
|
33 |
+
* @throws Forminator_Addon_Exception
|
34 |
+
*/
|
35 |
+
public function __construct( Forminator_Addon_Abstract $addon, $quiz_id ) {
|
36 |
+
parent::__construct( $addon, $quiz_id );
|
37 |
+
|
38 |
+
$this->_update_quiz_settings_error_message = __(
|
39 |
+
'The update to your settings for this quiz failed, check the quiz input and try again.',
|
40 |
+
Forminator::DOMAIN
|
41 |
+
);
|
42 |
+
}
|
43 |
+
|
44 |
+
/**
|
45 |
+
* Activecampaign Quiz Settings wizard
|
46 |
+
*
|
47 |
+
* @since 1.0 Activecampaign Addon
|
48 |
+
* @return array
|
49 |
+
*/
|
50 |
+
public function quiz_settings_wizards() {
|
51 |
+
// numerical array steps
|
52 |
+
return array(
|
53 |
+
array(
|
54 |
+
'callback' => array( $this, 'pick_name' ),
|
55 |
+
'is_completed' => array( $this, 'pick_name_is_completed' ),
|
56 |
+
),
|
57 |
+
array(
|
58 |
+
'callback' => array( $this, 'select_list' ),
|
59 |
+
'is_completed' => array( $this, 'select_list_is_completed' ),
|
60 |
+
),
|
61 |
+
array(
|
62 |
+
'callback' => array( $this, 'map_fields' ),
|
63 |
+
'is_completed' => array( $this, 'map_fields_is_completed' ),
|
64 |
+
),
|
65 |
+
array(
|
66 |
+
'callback' => array( $this, 'setup_options' ),
|
67 |
+
'is_completed' => array( $this, 'setup_options_is_completed' ),
|
68 |
+
),
|
69 |
+
);
|
70 |
+
}
|
71 |
+
|
72 |
+
/**
|
73 |
+
* Setup Connection Name
|
74 |
+
*
|
75 |
+
* @since 1.0 Activecampaign Addon
|
76 |
+
*
|
77 |
+
* @param $submitted_data
|
78 |
+
*
|
79 |
+
* @return array
|
80 |
+
*/
|
81 |
+
public function pick_name( $submitted_data ) {
|
82 |
+
$template = forminator_addon_activecampaign_dir() . 'views/quiz-settings/pick-name.php';
|
83 |
+
|
84 |
+
$multi_id = $this->generate_multi_id();
|
85 |
+
if ( isset( $submitted_data['multi_id'] ) ) {
|
86 |
+
$multi_id = $submitted_data['multi_id'];
|
87 |
+
}
|
88 |
+
|
89 |
+
$template_params = array(
|
90 |
+
'name' => $this->get_multi_id_quiz_settings_value( $multi_id, 'name', '' ),
|
91 |
+
'name_error' => '',
|
92 |
+
'multi_id' => $multi_id,
|
93 |
+
);
|
94 |
+
|
95 |
+
unset( $submitted_data['multi_id'] );
|
96 |
+
|
97 |
+
$is_submit = ! empty( $submitted_data );
|
98 |
+
$has_errors = false;
|
99 |
+
if ( $is_submit ) {
|
100 |
+
$name = isset( $submitted_data['name'] ) ? $submitted_data['name'] : '';
|
101 |
+
$template_params['name'] = $name;
|
102 |
+
|
103 |
+
try {
|
104 |
+
if ( empty( $name ) ) {
|
105 |
+
throw new Forminator_Addon_Activecampaign_Exception( __( 'Please pick valid name' ) );
|
106 |
+
}
|
107 |
+
|
108 |
+
$time_added = $this->get_multi_id_quiz_settings_value( $multi_id, 'time_added', time() );
|
109 |
+
$this->save_multi_id_quiz_setting_values(
|
110 |
+
$multi_id,
|
111 |
+
array(
|
112 |
+
'name' => $name,
|
113 |
+
'time_added' => $time_added,
|
114 |
+
)
|
115 |
+
);
|
116 |
+
|
117 |
+
} catch ( Forminator_Addon_Activecampaign_Exception $e ) {
|
118 |
+
$template_params['name_error'] = $e->getMessage();
|
119 |
+
$has_errors = true;
|
120 |
+
}
|
121 |
+
}
|
122 |
+
|
123 |
+
$buttons = array();
|
124 |
+
if ( $this->pick_name_is_completed( array( 'multi_id' => $multi_id ) ) ) {
|
125 |
+
$buttons['disconnect']['markup'] = Forminator_Addon_Abstract::get_button_markup(
|
126 |
+
esc_html__( 'Deactivate', Forminator::DOMAIN ),
|
127 |
+
'sui-button-ghost sui-tooltip sui-tooltip-top-center forminator-addon-form-disconnect',
|
128 |
+
esc_html__( 'Deactivate this ActiveCampaign Integration from this Quiz.', Forminator::DOMAIN )
|
129 |
+
);
|
130 |
+
}
|
131 |
+
|
132 |
+
$buttons['next']['markup'] = '<div class="sui-actions-right">' .
|
133 |
+
Forminator_Addon_Abstract::get_button_markup( esc_html__( 'Next', Forminator::DOMAIN ), 'forminator-addon-next' ) .
|
134 |
+
'</div>';
|
135 |
+
|
136 |
+
return array(
|
137 |
+
'html' => Forminator_Addon_Abstract::get_template( $template, $template_params ),
|
138 |
+
'buttons' => $buttons,
|
139 |
+
'redirect' => false,
|
140 |
+
'has_errors' => $has_errors,
|
141 |
+
);
|
142 |
+
}
|
143 |
+
|
144 |
+
/**
|
145 |
+
* Check if pick name step completed
|
146 |
+
*
|
147 |
+
* @since 1.0 Activecampaign Addon
|
148 |
+
*
|
149 |
+
* @param $submitted_data
|
150 |
+
*
|
151 |
+
* @return bool
|
152 |
+
*/
|
153 |
+
public function pick_name_is_completed( $submitted_data ) {
|
154 |
+
$multi_id = '';
|
155 |
+
if ( isset( $submitted_data['multi_id'] ) ) {
|
156 |
+
$multi_id = $submitted_data['multi_id'];
|
157 |
+
}
|
158 |
+
|
159 |
+
if ( empty( $multi_id ) ) {
|
160 |
+
return false;
|
161 |
+
}
|
162 |
+
|
163 |
+
$name = $this->get_multi_id_quiz_settings_value( $multi_id, 'name', '' );
|
164 |
+
|
165 |
+
if ( empty( $name ) ) {
|
166 |
+
return false;
|
167 |
+
}
|
168 |
+
|
169 |
+
return true;
|
170 |
+
}
|
171 |
+
|
172 |
+
/**
|
173 |
+
* Setup Contact List
|
174 |
+
*
|
175 |
+
* @since 1.0 Activecampaign Addon
|
176 |
+
*
|
177 |
+
* @param $submitted_data
|
178 |
+
*
|
179 |
+
* @return array
|
180 |
+
*/
|
181 |
+
public function select_list( $submitted_data ) {
|
182 |
+
$template = forminator_addon_activecampaign_dir() . 'views/quiz-settings/select-list.php';
|
183 |
+
|
184 |
+
if ( ! isset( $submitted_data['multi_id'] ) ) {
|
185 |
+
return $this->get_force_closed_wizard( __( 'Please pick valid connection', Forminator::DOMAIN ) );
|
186 |
+
}
|
187 |
+
|
188 |
+
$multi_id = $submitted_data['multi_id'];
|
189 |
+
unset( $submitted_data['multi_id'] );
|
190 |
+
|
191 |
+
$template_params = array(
|
192 |
+
'list_id' => $this->get_multi_id_quiz_settings_value( $multi_id, 'list_id', '' ),
|
193 |
+
'list_id_error' => '',
|
194 |
+
'multi_id' => $multi_id,
|
195 |
+
'error_message' => '',
|
196 |
+
'lists' => array(),
|
197 |
+
);
|
198 |
+
|
199 |
+
$is_submit = ! empty( $submitted_data );
|
200 |
+
$has_errors = false;
|
201 |
+
|
202 |
+
$lists = array();
|
203 |
+
$custom_fields = array();
|
204 |
+
|
205 |
+
try {
|
206 |
+
|
207 |
+
$ac_api = $this->addon->get_api();
|
208 |
+
$lists_request = $ac_api->get_lists();
|
209 |
+
foreach ( $lists_request as $key => $data ) {
|
210 |
+
if ( isset( $data->id ) && isset( $data->name ) ) {
|
211 |
+
$lists[ $data->id ] = $data->name;
|
212 |
+
if ( isset( $data->fields ) ) {
|
213 |
+
$custom_fields[ $data->id ] = $data->fields;
|
214 |
+
}
|
215 |
+
}
|
216 |
+
}
|
217 |
+
|
218 |
+
if ( empty( $lists ) ) {
|
219 |
+
throw new Forminator_Addon_Activecampaign_Exception( __( 'No lists found on your ActiveCampaign account. Please create one.', Forminator::DOMAIN ) );
|
220 |
+
}
|
221 |
+
|
222 |
+
$template_params['lists'] = $lists;
|
223 |
+
|
224 |
+
} catch ( Forminator_Addon_Activecampaign_Exception $e ) {
|
225 |
+
$template_params['error_message'] = $e->getMessage();
|
226 |
+
$has_errors = true;
|
227 |
+
}
|
228 |
+
|
229 |
+
if ( $is_submit ) {
|
230 |
+
$list_id = isset( $submitted_data['list_id'] ) ? $submitted_data['list_id'] : '';
|
231 |
+
$template_params['list_id'] = $list_id;
|
232 |
+
|
233 |
+
try {
|
234 |
+
if ( empty( $list_id ) ) {
|
235 |
+
throw new Forminator_Addon_Activecampaign_Exception( __( 'Please pick valid list' ) );
|
236 |
+
}
|
237 |
+
|
238 |
+
// phpcs:ignore WordPress.PHP.StrictInArray.MissingTrueStrict
|
239 |
+
if ( ! in_array( $list_id, array_keys( $lists ) ) ) {
|
240 |
+
throw new Forminator_Addon_Activecampaign_Exception( __( 'Please pick valid list' ) );
|
241 |
+
}
|
242 |
+
|
243 |
+
if ( ! empty( $custom_fields ) ) {
|
244 |
+
$this->custom_fields = $custom_fields[ $list_id ];
|
245 |
+
}
|
246 |
+
|
247 |
+
$list_name = $lists[ $list_id ];
|
248 |
+
|
249 |
+
$this->save_multi_id_quiz_setting_values(
|
250 |
+
$multi_id,
|
251 |
+
array(
|
252 |
+
'list_id' => $list_id,
|
253 |
+
'list_name' => $list_name,
|
254 |
+
)
|
255 |
+
);
|
256 |
+
|
257 |
+
} catch ( Forminator_Addon_Activecampaign_Exception $e ) {
|
258 |
+
$template_params['list_id_error'] = $e->getMessage();
|
259 |
+
$has_errors = true;
|
260 |
+
}
|
261 |
+
}
|
262 |
+
|
263 |
+
$buttons = array();
|
264 |
+
if ( $this->pick_name_is_completed( array( 'multi_id' => $multi_id ) ) ) {
|
265 |
+
$buttons['disconnect']['markup'] = Forminator_Addon_Abstract::get_button_markup(
|
266 |
+
esc_html__( 'Deactivate', Forminator::DOMAIN ),
|
267 |
+
'sui-button-ghost sui-tooltip sui-tooltip-top-center forminator-addon-form-disconnect',
|
268 |
+
esc_html__( 'Deactivate this ActiveCampaign Integration from this Quiz.', Forminator::DOMAIN )
|
269 |
+
);
|
270 |
+
}
|
271 |
+
|
272 |
+
$buttons['next']['markup'] = '<div class="sui-actions-right">' .
|
273 |
+
Forminator_Addon_Abstract::get_button_markup( esc_html__( 'Next', Forminator::DOMAIN ), 'forminator-addon-next' ) .
|
274 |
+
'</div>';
|
275 |
+
|
276 |
+
return array(
|
277 |
+
'html' => Forminator_Addon_Abstract::get_template( $template, $template_params ),
|
278 |
+
'buttons' => $buttons,
|
279 |
+
'redirect' => false,
|
280 |
+
'has_errors' => $has_errors,
|
281 |
+
'has_back' => true,
|
282 |
+
);
|
283 |
+
}
|
284 |
+
|
285 |
+
/**
|
286 |
+
* Check if select contact list completed
|
287 |
+
*
|
288 |
+
* @since 1.0 Activecampaign Addon
|
289 |
+
*
|
290 |
+
* @param $submitted_data
|
291 |
+
*
|
292 |
+
* @return bool
|
293 |
+
*/
|
294 |
+
public function select_list_is_completed( $submitted_data ) {
|
295 |
+
$multi_id = '';
|
296 |
+
if ( isset( $submitted_data['multi_id'] ) ) {
|
297 |
+
$multi_id = $submitted_data['multi_id'];
|
298 |
+
}
|
299 |
+
|
300 |
+
if ( empty( $multi_id ) ) {
|
301 |
+
return false;
|
302 |
+
}
|
303 |
+
|
304 |
+
$list_id = $this->get_multi_id_quiz_settings_value( $multi_id, 'list_id', '' );
|
305 |
+
|
306 |
+
if ( empty( $list_id ) ) {
|
307 |
+
return false;
|
308 |
+
}
|
309 |
+
|
310 |
+
return true;
|
311 |
+
}
|
312 |
+
|
313 |
+
|
314 |
+
/**
|
315 |
+
* Setup fields map
|
316 |
+
*
|
317 |
+
* @since 1.0 Activecampaign Addon
|
318 |
+
*
|
319 |
+
* @param $submitted_data
|
320 |
+
*
|
321 |
+
* @return array
|
322 |
+
*/
|
323 |
+
public function map_fields( $submitted_data ) {
|
324 |
+
$template = forminator_addon_activecampaign_dir() . 'views/quiz-settings/map-fields.php';
|
325 |
+
|
326 |
+
if ( ! isset( $submitted_data['multi_id'] ) ) {
|
327 |
+
return $this->get_force_closed_wizard( __( 'Please pick valid connection', Forminator::DOMAIN ) );
|
328 |
+
}
|
329 |
+
|
330 |
+
$multi_id = $submitted_data['multi_id'];
|
331 |
+
unset( $submitted_data['multi_id'] );
|
332 |
+
|
333 |
+
// find type of email
|
334 |
+
$email_fields = array();
|
335 |
+
$forminator_quiz_element_ids = array();
|
336 |
+
$forminator_field_element_ids = array();
|
337 |
+
foreach ( $this->form_fields as $form_field ) {
|
338 |
+
// collect element ids
|
339 |
+
$forminator_field_element_ids[] = $form_field['element_id'];
|
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' => __( 'Quiz Name', Forminator::DOMAIN ),
|
349 |
+
);
|
350 |
+
foreach ( $quiz_questions as $quiz_question ) {
|
351 |
+
// collect element ids
|
352 |
+
$forminator_quiz_element_ids[] = $quiz_question['slug'];
|
353 |
+
$quiz_fields[ $quiz_question['slug'] ] = $quiz_question['title'];
|
354 |
+
}
|
355 |
+
if ( 'knowledge' === $this->quiz->quiz_type ) {
|
356 |
+
$quiz_fields['correct-answers'] = __( 'Correct Answers', Forminator::DOMAIN );
|
357 |
+
$quiz_fields['total-answers'] = __( 'Total Answers', Forminator::DOMAIN );
|
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::DOMAIN );
|
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 );
|
365 |
+
|
366 |
+
$template_params = array(
|
367 |
+
'fields_map' => $this->get_multi_id_quiz_settings_value( $multi_id, 'fields_map', array() ),
|
368 |
+
'multi_id' => $multi_id,
|
369 |
+
'error_message' => '',
|
370 |
+
'fields' => array(),
|
371 |
+
'form_fields' => $this->form_fields,
|
372 |
+
'quiz_fields' => $quiz_fields,
|
373 |
+
'email_fields' => $email_fields,
|
374 |
+
);
|
375 |
+
|
376 |
+
$is_submit = ! empty( $submitted_data );
|
377 |
+
$has_errors = false;
|
378 |
+
|
379 |
+
$fields = array(
|
380 |
+
'email' => __( 'Email Address', Forminator::DOMAIN ),
|
381 |
+
'first_name' => __( 'First Name', Forminator::DOMAIN ),
|
382 |
+
'last_name' => __( 'Last Name', Forminator::DOMAIN ),
|
383 |
+
'phone' => __( 'Phone', Forminator::DOMAIN ),
|
384 |
+
'orgname' => __( 'Organization Name', Forminator::DOMAIN ),
|
385 |
+
);
|
386 |
+
|
387 |
+
$list_id = $this->get_multi_id_quiz_settings_value( $multi_id, 'list_id', 0 );
|
388 |
+
|
389 |
+
try {
|
390 |
+
|
391 |
+
$ac_api = $this->addon->get_api();
|
392 |
+
$list_detail = $ac_api->get_list( $list_id );
|
393 |
+
|
394 |
+
//get global fields assigned to the form as well as explecit field
|
395 |
+
if ( ! empty( $this->custom_fields ) && is_array( $this->custom_fields ) ) {
|
396 |
+
foreach ( $this->custom_fields as $field ) {
|
397 |
+
$fields[ $field->id ] = $field->title;
|
398 |
+
}
|
399 |
+
}
|
400 |
+
|
401 |
+
$template_params['fields'] = $fields;
|
402 |
+
|
403 |
+
} catch ( Forminator_Addon_Activecampaign_Exception $e ) {
|
404 |
+
$template_params['error_message'] = $e->getMessage();
|
405 |
+
$has_errors = true;
|
406 |
+
}
|
407 |
+
|
408 |
+
if ( $is_submit ) {
|
409 |
+
$fields_map = isset( $submitted_data['fields_map'] ) ? $submitted_data['fields_map'] : array();
|
410 |
+
$template_params['fields_map'] = $fields_map;
|
411 |
+
|
412 |
+
try {
|
413 |
+
if ( empty( $fields_map ) ) {
|
414 |
+
throw new Forminator_Addon_Activecampaign_Exception( __( 'Please assign fields.', Forminator::DOMAIN ) );
|
415 |
+
}
|
416 |
+
|
417 |
+
$input_exceptions = new Forminator_Addon_Activecampaign_Quiz_Settings_Exception();
|
418 |
+
if ( ! isset( $fields_map['email'] ) || empty( $fields_map['email'] ) ) {
|
419 |
+
$input_exceptions->add_input_exception( 'Please assign field for Email Address', 'email_error' );
|
420 |
+
}
|
421 |
+
|
422 |
+
$fields_map_to_save = array();
|
423 |
+
foreach ( $fields as $key => $title ) {
|
424 |
+
if ( isset( $fields_map[ $key ] ) && ! empty( $fields_map[ $key ] ) ) {
|
425 |
+
$element_id = $fields_map[ $key ];
|
426 |
+
if ( ! in_array( $element_id, $forminator_field_element_ids, true ) ) {
|
427 |
+
$input_exceptions->add_input_exception(
|
428 |
+
/* translators: %s: title */
|
429 |
+
sprintf( __( 'Please assign valid field for %s', Forminator::DOMAIN ), $title ),
|
430 |
+
$key . '_error'
|
431 |
+
);
|
432 |
+
continue;
|
433 |
+
}
|
434 |
+
|
435 |
+
$fields_map_to_save[ $key ] = $fields_map[ $key ];
|
436 |
+
}
|
437 |
+
}
|
438 |
+
|
439 |
+
if ( $input_exceptions->input_exceptions_is_available() ) {
|
440 |
+
throw $input_exceptions;
|
441 |
+
}
|
442 |
+
|
443 |
+
$this->save_multi_id_quiz_setting_values( $multi_id, array( 'fields_map' => $fields_map ) );
|
444 |
+
|
445 |
+
} catch ( Forminator_Addon_Activecampaign_Quiz_Settings_Exception $e ) {
|
446 |
+
$template_params = array_merge( $template_params, $e->get_input_exceptions() );
|
447 |
+
$has_errors = true;
|
448 |
+
} catch ( Forminator_Addon_Activecampaign_Exception $e ) {
|
449 |
+
$template_params['error_message'] = $e->getMessage();
|
450 |
+
$has_errors = true;
|
451 |
+
}
|
452 |
+
}
|
453 |
+
|
454 |
+
$buttons = array();
|
455 |
+
if ( $this->pick_name_is_completed( array( 'multi_id' => $multi_id ) ) ) {
|
456 |
+
$buttons['disconnect']['markup'] = Forminator_Addon_Abstract::get_button_markup(
|
457 |
+
esc_html__( 'Deactivate', Forminator::DOMAIN ),
|
458 |
+
'sui-button-ghost sui-tooltip sui-tooltip-top-center forminator-addon-form-disconnect',
|
459 |
+
esc_html__( 'Deactivate this ActiveCampaign Integration from this Quiz.', Forminator::DOMAIN )
|
460 |
+
);
|
461 |
+
}
|
462 |
+
|
463 |
+
$buttons['next']['markup'] = '<div class="sui-actions-right">' .
|
464 |
+
Forminator_Addon_Abstract::get_button_markup( esc_html__( 'Next', Forminator::DOMAIN ), 'forminator-addon-next' ) .
|
465 |
+
'</div>';
|
466 |
+
|
467 |
+
return array(
|
468 |
+
'html' => Forminator_Addon_Abstract::get_template( $template, $template_params ),
|
469 |
+
'buttons' => $buttons,
|
470 |
+
'size' => 'normal',
|
471 |
+
'redirect' => false,
|
472 |
+
'has_errors' => $has_errors,
|
473 |
+
'has_back' => true,
|
474 |
+
);
|
475 |
+
}
|
476 |
+
|
477 |
+
/**
|
478 |
+
* Check if fields mapped
|
479 |
+
*
|
480 |
+
* @since 1.0 Activecampaign Addon
|
481 |
+
*
|
482 |
+
* @param $submitted_data
|
483 |
+
*
|
484 |
+
* @return bool
|
485 |
+
*/
|
486 |
+
public function map_fields_is_completed( $submitted_data ) {
|
487 |
+
$multi_id = '';
|
488 |
+
if ( isset( $submitted_data['multi_id'] ) ) {
|
489 |
+
$multi_id = $submitted_data['multi_id'];
|
490 |
+
}
|
491 |
+
|
492 |
+
if ( empty( $multi_id ) ) {
|
493 |
+
return false;
|
494 |
+
}
|
495 |
+
|
496 |
+
$fields_map = $this->get_multi_id_quiz_settings_value( $multi_id, 'fields_map', array() );
|
497 |
+
|
498 |
+
if ( empty( $fields_map ) || ! is_array( $fields_map ) || count( $fields_map ) < 1 ) {
|
499 |
+
return false;
|
500 |
+
}
|
501 |
+
|
502 |
+
if ( ! isset( $fields_map['email'] ) || empty( $fields_map['email'] ) ) {
|
503 |
+
return false;
|
504 |
+
}
|
505 |
+
|
506 |
+
return true;
|
507 |
+
}
|
508 |
+
|
509 |
+
/**
|
510 |
+
* Setup options
|
511 |
+
*
|
512 |
+
* Contains :
|
513 |
+
* - Double opt-in quiz,
|
514 |
+
* - tags,
|
515 |
+
* - instant-responder,
|
516 |
+
* - send last broadcast
|
517 |
+
*
|
518 |
+
* @since 1.0 Activecampaign Addon
|
519 |
+
*
|
520 |
+
* @param $submitted_data
|
521 |
+
*
|
522 |
+
* @return array
|
523 |
+
*/
|
524 |
+
public function setup_options( $submitted_data ) {
|
525 |
+
$template = forminator_addon_activecampaign_dir() . 'views/quiz-settings/setup-options.php';
|
526 |
+
|
527 |
+
if ( ! isset( $submitted_data['multi_id'] ) ) {
|
528 |
+
return $this->get_force_closed_wizard( __( 'Please pick valid connection', Forminator::DOMAIN ) );
|
529 |
+
}
|
530 |
+
|
531 |
+
$multi_id = $submitted_data['multi_id'];
|
532 |
+
unset( $submitted_data['multi_id'] );
|
533 |
+
|
534 |
+
$forminator_form_element_ids = array();
|
535 |
+
foreach ( $this->form_fields as $field ) {
|
536 |
+
$forminator_form_element_ids[ $field['element_id'] ] = $field;
|
537 |
+
}
|
538 |
+
|
539 |
+
$template_params = array(
|
540 |
+
'multi_id' => $multi_id,
|
541 |
+
'error_message' => '',
|
542 |
+
'forms' => array(),
|
543 |
+
'double_opt_form_id' => $this->get_multi_id_quiz_settings_value( $multi_id, 'double_opt_form_id', '' ),
|
544 |
+
'instantresponders' => $this->get_multi_id_quiz_settings_value( $multi_id, 'instantresponders', 0 ),
|
545 |
+
'lastmessage' => $this->get_multi_id_quiz_settings_value( $multi_id, 'lastmessage', 0 ),
|
546 |
+
'tags_fields' => array(),
|
547 |
+
'tags_selected_fields' => array(),
|
548 |
+
);
|
549 |
+
|
550 |
+
$saved_tags = $this->get_multi_id_quiz_settings_value( $multi_id, 'tags', array() );
|
551 |
+
|
552 |
+
if ( isset( $submitted_data['tags'] ) && is_array( $submitted_data['tags'] ) ) {
|
553 |
+
$saved_tags = $submitted_data['tags'];
|
554 |
+
|
555 |
+
}
|
556 |
+
$tag_selected_fields = array();
|
557 |
+
foreach ( $saved_tags as $key => $saved_tag ) {
|
558 |
+
// using form data
|
559 |
+
if ( stripos( $saved_tag, '{' ) === 0
|
560 |
+
&& stripos( $saved_tag, '}' ) === ( strlen( $saved_tag ) - 1 )
|
561 |
+
) {
|
562 |
+
$element_id = str_ireplace( '{', '', $saved_tag );
|
563 |
+
$element_id = str_ireplace( '}', '', $element_id );
|
564 |
+
if ( in_array( $element_id, array_keys( $forminator_form_element_ids ), true ) ) {
|
565 |
+
$forminator_form_element_ids[ $element_id ]['field_label'] = $forminator_form_element_ids[ $element_id ]['field_label'] .
|
566 |
+
' | ' . $forminator_form_element_ids[ $element_id ]['element_id'];
|
567 |
+
$forminator_form_element_ids[ $element_id ]['element_id'] = '{' . $forminator_form_element_ids[ $element_id ]['element_id'] . '}';
|
568 |
+
|
569 |
+
$tag_selected_fields[] = $forminator_form_element_ids[ $element_id ];
|
570 |
+
// let this go, its already selected.
|
571 |
+
unset( $forminator_form_element_ids[ $element_id ] );
|
572 |
+
} else {
|
573 |
+
// no more exist on element ids let it go
|
574 |
+
unset( $saved_tags[ $key ] );
|
575 |
+
}
|
576 |
+
} else { // free form type
|
577 |
+
$tag_selected_fields[] = array(
|
578 |
+
'element_id' => $saved_tag,
|
579 |
+
'field_label' => $saved_tag,
|
580 |
+
);
|
581 |
+
}
|
582 |
+
}
|
583 |
+
|
584 |
+
$template_params['tags_fields'] = $forminator_form_element_ids;
|
585 |
+
$template_params['tags_selected_fields'] = $tag_selected_fields;
|
586 |
+
|
587 |
+
$is_submit = ! empty( $submitted_data );
|
588 |
+
$has_errors = false;
|
589 |
+
$notification = array();
|
590 |
+
$is_close = false;
|
591 |
+
|
592 |
+
$forms = array();
|
593 |
+
try {
|
594 |
+
$api = $this->addon->get_api();
|
595 |
+
$forms_request = $api->get_forms();
|
596 |
+
|
597 |
+
foreach ( $forms_request as $data ) {
|
598 |
+
if ( isset( $data->id ) && isset( $data->name ) ) {
|
599 |
+
$forms[ $data->id ] = $data->name;
|
600 |
+
}
|
601 |
+
}
|
602 |
+
} catch ( Forminator_Addon_Activecampaign_Exception $e ) {
|
603 |
+
$forms = array();
|
604 |
+
}
|
605 |
+
|
606 |
+
$template_params['forms'] = $forms;
|
607 |
+
|
608 |
+
if ( $is_submit ) {
|
609 |
+
$double_opt_form_id = isset( $submitted_data['double_opt_form_id'] ) ? $submitted_data['double_opt_form_id'] : '';
|
610 |
+
$instantresponders = isset( $submitted_data['instantresponders'] ) ? (int) $submitted_data['instantresponders'] : 0;
|
611 |
+
$lastmessage = isset( $submitted_data['lastmessage'] ) ? (int) $submitted_data['lastmessage'] : 0;
|
612 |
+
|
613 |
+
try {
|
614 |
+
$input_exceptions = new Forminator_Addon_Activecampaign_Quiz_Settings_Exception();
|
615 |
+
|
616 |
+
// possible different type intended
|
617 |
+
// phpcs:ignore WordPress.PHP.StrictInArray.MissingTrueStrict
|
618 |
+
if ( ! empty( $double_opt_form_id ) && ! in_array( $double_opt_form_id, array_keys( $forms ) ) ) {
|
619 |
+
$input_exceptions->add_input_exception( __( 'Please pick valid ActiveCampaign Quiz', Forminator::DOMAIN ), 'double_opt_form_id_error' );
|
620 |
+
}
|
621 |
+
|
622 |
+
if ( $input_exceptions->input_exceptions_is_available() ) {
|
623 |
+
throw $input_exceptions;
|
624 |
+
}
|
625 |
+
|
626 |
+
$this->save_multi_id_quiz_setting_values(
|
627 |
+
$multi_id,
|
628 |
+
array(
|
629 |
+
'tags' => $saved_tags,
|
630 |
+
'double_opt_form_id' => $double_opt_form_id,
|
631 |
+
'instantresponders' => $instantresponders,
|
632 |
+
'lastmessage' => $lastmessage,
|
633 |
+
)
|
634 |
+
);
|
635 |
+
|
636 |
+
$notification = array(
|
637 |
+
'type' => 'success',
|
638 |
+
'text' => '<strong>' . $this->addon->get_title() . '</strong> ' . __( 'Successfully connected to your quiz' ),
|
639 |
+
);
|
640 |
+
$is_close = true;
|
641 |
+
|
642 |
+
} catch ( Forminator_Addon_Activecampaign_Quiz_Settings_Exception $e ) {
|
643 |
+
$template_params = array_merge( $template_params, $e->get_input_exceptions() );
|
644 |
+
$has_errors = true;
|
645 |
+
} catch ( Forminator_Addon_Activecampaign_Exception $e ) {
|
646 |
+
$template_params['error_message'] = $e->getMessage();
|
647 |
+
$has_errors = true;
|
648 |
+
}
|
649 |
+
}
|
650 |
+
|
651 |
+
$buttons = array();
|
652 |
+
if ( $this->pick_name_is_completed( array( 'multi_id' => $multi_id ) ) ) {
|
653 |
+
$buttons['disconnect']['markup'] = Forminator_Addon_Abstract::get_button_markup(
|
654 |
+
esc_html__( 'Deactivate', Forminator::DOMAIN ),
|
655 |
+
'sui-button-ghost sui-tooltip sui-tooltip-top-center forminator-addon-form-disconnect',
|
656 |
+
esc_html__( 'Deactivate this ActiveCampaign Integration from this Quiz.', Forminator::DOMAIN )
|
657 |
+
);
|
658 |
+
}
|
659 |
+
|
660 |
+
$buttons['next']['markup'] = '<div class="sui-actions-right">' .
|
661 |
+
Forminator_Addon_Abstract::get_button_markup( esc_html__( 'Save', Forminator::DOMAIN ), 'sui-button-primary forminator-addon-finish' ) .
|
662 |
+
'</div>';
|
663 |
+
|
664 |
+
return array(
|
665 |
+
'html' => Forminator_Addon_Abstract::get_template( $template, $template_params ),
|
666 |
+
'buttons' => $buttons,
|
667 |
+
'size' => 'normal',
|
668 |
+
'redirect' => false,
|
669 |
+
'has_errors' => $has_errors,
|
670 |
+
'has_back' => true,
|
671 |
+
'notification' => $notification,
|
672 |
+
'is_close' => $is_close,
|
673 |
+
);
|
674 |
+
}
|
675 |
+
|
676 |
+
/**
|
677 |
+
* Check if setup options completed
|
678 |
+
*
|
679 |
+
* @since 1.0 Activecampaign Addon
|
680 |
+
*
|
681 |
+
* @param $submitted_data
|
682 |
+
*
|
683 |
+
* @return bool
|
684 |
+
*/
|
685 |
+
public function setup_options_is_completed( $submitted_data ) {
|
686 |
+
// all settings here are optional, so it can be marked as completed
|
687 |
+
return true;
|
688 |
+
}
|
689 |
+
|
690 |
+
/**
|
691 |
+
* Generate multi id for multiple connection
|
692 |
+
*
|
693 |
+
* @since 1.0 Activecampaign Addon
|
694 |
+
* @return string
|
695 |
+
*/
|
696 |
+
public function generate_multi_id() {
|
697 |
+
return uniqid( 'activecampaign_', true );
|
698 |
+
}
|
699 |
+
|
700 |
+
|
701 |
+
/**
|
702 |
+
* Override how multi connection displayed
|
703 |
+
*
|
704 |
+
* @since 1.0 Activecampaign Addon
|
705 |
+
* @return array
|
706 |
+
*/
|
707 |
+
public function get_multi_ids() {
|
708 |
+
$multi_ids = array();
|
709 |
+
$quiz_settings_values = $this->get_quiz_settings_values();
|
710 |
+
foreach ( $quiz_settings_values as $key => $value ) {
|
711 |
+
// apply some sorting if applicable
|
712 |
+
$multi_ids[] = array(
|
713 |
+
'id' => $key,
|
714 |
+
// use name that was added by user on creating connection
|
715 |
+
'label' => isset( $value['name'] ) ? $value['name'] : $key,
|
716 |
+
);
|
717 |
+
}
|
718 |
+
|
719 |
+
/**
|
720 |
+
* Filter labels of multi_id on integrations tab
|
721 |
+
*
|
722 |
+
* @since 1.2
|
723 |
+
*
|
724 |
+
* @param array $multi_ids
|
725 |
+
* @param array $quiz_settings_values
|
726 |
+
*/
|
727 |
+
$multi_ids = apply_filters( 'forminator_addon_activecampaign_multi_id_labels', $multi_ids, $quiz_settings_values );
|
728 |
+
|
729 |
+
return $multi_ids;
|
730 |
+
}
|
731 |
+
|
732 |
+
/**
|
733 |
+
* Disconnect a connection from current quiz
|
734 |
+
*
|
735 |
+
* @since 1.0 Activecampaign Addon
|
736 |
+
*
|
737 |
+
* @param array $submitted_data
|
738 |
+
*/
|
739 |
+
public function disconnect_form( $submitted_data ) {
|
740 |
+
// only execute if multi_id provided on submitted data
|
741 |
+
if ( isset( $submitted_data['multi_id'] ) && ! empty( $submitted_data['multi_id'] ) ) {
|
742 |
+
$addon_quiz_settings = $this->get_quiz_settings_values();
|
743 |
+
unset( $addon_quiz_settings[ $submitted_data['multi_id'] ] );
|
744 |
+
$this->save_quiz_settings_values( $addon_quiz_settings );
|
745 |
+
}
|
746 |
+
}
|
747 |
+
|
748 |
+
/**
|
749 |
+
* Check if multi_id quiz settings values completed
|
750 |
+
*
|
751 |
+
* @since 1.0 Active Campaign Added
|
752 |
+
*
|
753 |
+
* @param $multi_id
|
754 |
+
*
|
755 |
+
* @return bool
|
756 |
+
*/
|
757 |
+
public function is_multi_quiz_settings_complete( $multi_id ) {
|
758 |
+
$data = array( 'multi_id' => $multi_id );
|
759 |
+
|
760 |
+
if ( ! $this->pick_name_is_completed( $data ) ) {
|
761 |
+
return false;
|
762 |
+
}
|
763 |
+
if ( ! $this->select_list_is_completed( $data ) ) {
|
764 |
+
return false;
|
765 |
+
}
|
766 |
+
|
767 |
+
if ( ! $this->map_fields_is_completed( $data ) ) {
|
768 |
+
return false;
|
769 |
+
}
|
770 |
+
|
771 |
+
if ( ! $this->setup_options_is_completed( $data ) ) {
|
772 |
+
return false;
|
773 |
+
}
|
774 |
+
|
775 |
+
return true;
|
776 |
+
}
|
777 |
+
}
|
addons/pro/activecampaign/class-forminator-addon-activecampaign.php
CHANGED
@@ -28,6 +28,9 @@ final class Forminator_Addon_Activecampaign extends Forminator_Addon_Abstract {
|
|
28 |
protected $_form_settings = 'Forminator_Addon_Activecampaign_Form_Settings';
|
29 |
protected $_form_hooks = 'Forminator_Addon_Activecampaign_Form_Hooks';
|
30 |
|
|
|
|
|
|
|
31 |
/**
|
32 |
* @var Forminator_Addon_Activecampaign_Wp_Api|null
|
33 |
*/
|
@@ -483,4 +486,115 @@ final class Forminator_Addon_Activecampaign extends Forminator_Addon_Abstract {
|
|
483 |
public function is_poll_connected( $poll_id ) {
|
484 |
return false;
|
485 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
486 |
}
|
28 |
protected $_form_settings = 'Forminator_Addon_Activecampaign_Form_Settings';
|
29 |
protected $_form_hooks = 'Forminator_Addon_Activecampaign_Form_Hooks';
|
30 |
|
31 |
+
protected $_quiz_settings = 'Forminator_Addon_Activecampaign_Quiz_Settings';
|
32 |
+
protected $_quiz_hooks = 'Forminator_Addon_Activecampaign_Quiz_Hooks';
|
33 |
+
|
34 |
/**
|
35 |
* @var Forminator_Addon_Activecampaign_Wp_Api|null
|
36 |
*/
|
486 |
public function is_poll_connected( $poll_id ) {
|
487 |
return false;
|
488 |
}
|
489 |
+
|
490 |
+
/**
|
491 |
+
* Check if Activecampaign is connected with current quiz
|
492 |
+
*
|
493 |
+
* @since 1.0 Activecampaign Addon
|
494 |
+
*
|
495 |
+
* @param $quiz_id
|
496 |
+
*
|
497 |
+
* @return bool
|
498 |
+
*/
|
499 |
+
public function is_quiz_connected( $quiz_id ) {
|
500 |
+
try {
|
501 |
+
$quiz_settings_instance = null;
|
502 |
+
if ( ! $this->is_connected() ) {
|
503 |
+
throw new Forminator_Addon_Activecampaign_Exception( __( 'ActiveCampaign is not connected', Forminator::DOMAIN ) );
|
504 |
+
}
|
505 |
+
|
506 |
+
$quiz_settings_instance = $this->get_addon_quiz_settings( $quiz_id );
|
507 |
+
if ( ! $quiz_settings_instance instanceof Forminator_Addon_Activecampaign_Quiz_Settings ) {
|
508 |
+
throw new Forminator_Addon_Activecampaign_Exception( __( 'Invalid Quiz Settings of ActiveCampaign', Forminator::DOMAIN ) );
|
509 |
+
}
|
510 |
+
|
511 |
+
// Mark as active when there is at least one active connection
|
512 |
+
if ( false === $quiz_settings_instance->find_one_active_connection() ) {
|
513 |
+
throw new Forminator_Addon_Activecampaign_Exception( __( 'No active ActiveCampaign connection found in this quiz', Forminator::DOMAIN ) );
|
514 |
+
}
|
515 |
+
|
516 |
+
$is_quiz_connected = true;
|
517 |
+
|
518 |
+
} catch ( Forminator_Addon_Activecampaign_Exception $e ) {
|
519 |
+
$is_quiz_connected = false;
|
520 |
+
forminator_addon_maybe_log( __METHOD__, $e->getMessage() );
|
521 |
+
}
|
522 |
+
|
523 |
+
/**
|
524 |
+
* Filter connected status of ActiveCampaign with the quiz
|
525 |
+
*
|
526 |
+
* @since 1.2
|
527 |
+
*
|
528 |
+
* @param bool $is_quiz_connected
|
529 |
+
* @param int $quiz_id Current Quiz ID
|
530 |
+
* @param Forminator_Addon_Activecampaign_Quiz_Settings|null $quiz_settings_instance Instance of quiz settings, or null when unavailable
|
531 |
+
*
|
532 |
+
*/
|
533 |
+
$is_quiz_connected = apply_filters( 'forminator_addon_activecampaign_is_quiz_connected', $is_quiz_connected, $quiz_id, $quiz_settings_instance );
|
534 |
+
|
535 |
+
return $is_quiz_connected;
|
536 |
+
}
|
537 |
+
|
538 |
+
/**
|
539 |
+
* Flag for check if has lead form addon connected to a quiz
|
540 |
+
* by default it will check if last step of form settings already completed by user
|
541 |
+
*
|
542 |
+
* @since 1.0 ActiveCampaign Addon
|
543 |
+
*
|
544 |
+
* @param $quiz_id
|
545 |
+
*
|
546 |
+
* @return bool
|
547 |
+
*/
|
548 |
+
public function is_quiz_lead_connected( $quiz_id ) {
|
549 |
+
|
550 |
+
try {
|
551 |
+
// initialize with null
|
552 |
+
$quiz_settings_instance = null;
|
553 |
+
if ( ! $this->is_connected() ) {
|
554 |
+
throw new Forminator_Addon_Activecampaign_Exception( __( ' ActiveCampaign is not connected', Forminator::DOMAIN ) );
|
555 |
+
}
|
556 |
+
|
557 |
+
$quiz_settings_instance = $this->get_addon_quiz_settings( $quiz_id );
|
558 |
+
if ( ! $quiz_settings_instance instanceof Forminator_Addon_Activecampaign_Quiz_Settings ) {
|
559 |
+
throw new Forminator_Addon_Activecampaign_Exception( __( 'Invalid Quiz Settings of ActiveCampaign', Forminator::DOMAIN ) );
|
560 |
+
}
|
561 |
+
|
562 |
+
$quiz_settings = $quiz_settings_instance->get_quiz_settings();
|
563 |
+
|
564 |
+
if ( isset( $quiz_settings['hasLeads'] ) && $quiz_settings['hasLeads'] ) {
|
565 |
+
$is_quiz_connected = true;
|
566 |
+
} else {
|
567 |
+
$is_quiz_connected = false;
|
568 |
+
}
|
569 |
+
} catch ( Forminator_Addon_Activecampaign_Exception $e ) {
|
570 |
+
$is_quiz_connected = false;
|
571 |
+
|
572 |
+
forminator_addon_maybe_log( __METHOD__, $e->getMessage() );
|
573 |
+
}
|
574 |
+
|
575 |
+
/**
|
576 |
+
* Filter connected status of ActiveCampaign with the form
|
577 |
+
*
|
578 |
+
* @since 1.1
|
579 |
+
*
|
580 |
+
* @param bool $is_quiz_connected
|
581 |
+
* @param int $quiz_id Current Form ID
|
582 |
+
* @param Forminator_Addon_Activecampaign_Quiz_Settings|null $quiz_settings_instance Instance of quiz settings, or null when unavailable
|
583 |
+
*
|
584 |
+
*/
|
585 |
+
$is_quiz_connected = apply_filters( 'forminator_addon_activecampaign_is_quiz_lead_connected', $is_quiz_connected, $quiz_id, $quiz_settings_instance );
|
586 |
+
|
587 |
+
return $is_quiz_connected;
|
588 |
+
|
589 |
+
}
|
590 |
+
|
591 |
+
/**
|
592 |
+
* Allow multiple connection on one quiz
|
593 |
+
*
|
594 |
+
* @since 1.6.1
|
595 |
+
* @return bool
|
596 |
+
*/
|
597 |
+
public function is_allow_multi_on_quiz() {
|
598 |
+
return true;
|
599 |
+
}
|
600 |
}
|
addons/pro/activecampaign/views/quiz-settings/map-fields.php
ADDED
@@ -0,0 +1,87 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
// defaults
|
3 |
+
$vars = array(
|
4 |
+
'error_message' => '',
|
5 |
+
'multi_id' => '',
|
6 |
+
'fields_map' => array(),
|
7 |
+
'fields' => array(),
|
8 |
+
'form_fields' => array(),
|
9 |
+
'quiz_fields' => array(),
|
10 |
+
'email_fields' => array(),
|
11 |
+
);
|
12 |
+
/** @var array $template_vars */
|
13 |
+
foreach ( $template_vars as $key => $val ) {
|
14 |
+
$vars[ $key ] = $val;
|
15 |
+
}
|
16 |
+
|
17 |
+
?>
|
18 |
+
<div class="integration-header">
|
19 |
+
<h3 class="sui-box-title" id="dialogTitle2"><?php echo esc_html( __( 'Assign Fields', Forminator::DOMAIN ) ); ?></h3>
|
20 |
+
<span class="sui-description" style="margin-top: 20px;"><?php esc_html_e( 'Match up your quiz lead fields with your campaign fields to make sure we\'re sending data to the right place.', Forminator::DOMAIN ); ?></span>
|
21 |
+
<?php if ( ! empty( $vars['error_message'] ) ) : ?>
|
22 |
+
<div class="sui-notice sui-notice-error">
|
23 |
+
<p><?php echo esc_html( $vars['error_message'] ); ?></p>
|
24 |
+
</div>
|
25 |
+
<?php endif; ?>
|
26 |
+
</div>
|
27 |
+
<form>
|
28 |
+
<table class="sui-table">
|
29 |
+
<thead>
|
30 |
+
<tr>
|
31 |
+
<th><?php esc_html_e( 'ActiveCampaign Field', Forminator::DOMAIN ); ?></th>
|
32 |
+
<th><?php esc_html_e( 'Forminator Field', Forminator::DOMAIN ); ?></th>
|
33 |
+
</tr>
|
34 |
+
</thead>
|
35 |
+
<tbody>
|
36 |
+
<?php foreach ( $vars['fields'] as $key => $field_title ) : ?>
|
37 |
+
<tr>
|
38 |
+
<td>
|
39 |
+
<?php echo esc_html( $field_title ); ?>
|
40 |
+
<?php if ( 'email' === $key ) : ?>
|
41 |
+
<span class="integrations-required-field">*</span>
|
42 |
+
<?php endif; ?>
|
43 |
+
</td>
|
44 |
+
<td>
|
45 |
+
<?php
|
46 |
+
$forminator_fields = $vars['form_fields'];
|
47 |
+
if ( 'email' === $key ) {
|
48 |
+
$forminator_fields = $vars['email_fields'];
|
49 |
+
}
|
50 |
+
$current_error = '';
|
51 |
+
$current_selected = '';
|
52 |
+
if ( isset( $vars[ $key . '_error' ] ) && ! empty( $vars[ $key . '_error' ] ) ) {
|
53 |
+
$current_error = $vars[ $key . '_error' ];
|
54 |
+
}
|
55 |
+
if ( isset( $vars['fields_map'][ $key ] ) && ! empty( $vars['fields_map'][ $key ] ) ) {
|
56 |
+
$current_selected = $vars['fields_map'][ $key ];
|
57 |
+
}
|
58 |
+
?>
|
59 |
+
<div class="sui-form-field <?php echo esc_attr( ! empty( $current_error ) ? 'sui-form-field-error' : '' ); ?>">
|
60 |
+
<select class="sui-select" name="fields_map[<?php echo esc_attr( $key ); ?>]">
|
61 |
+
<option value=""><?php esc_html_e( 'Please Select A Field', Forminator::DOMAIN ); ?></option>
|
62 |
+
<?php foreach ( $forminator_fields as $forminator_field ) : ?>
|
63 |
+
<option value="<?php echo esc_attr( $forminator_field['element_id'] ); ?>"
|
64 |
+
<?php selected( $current_selected, $forminator_field['element_id'] ); ?>>
|
65 |
+
<?php echo esc_html( $forminator_field['field_label'] . ' | ' . $forminator_field['element_id'] ); ?>
|
66 |
+
</option>
|
67 |
+
<?php endforeach; ?>
|
68 |
+
<?php if ( 'email' !== $key ) {
|
69 |
+
foreach ( $vars['quiz_fields'] as $quiz_key => $quiz_field ) : ?>
|
70 |
+
<option value="<?php echo esc_attr( $quiz_key ); ?>"
|
71 |
+
<?php selected( $current_selected, $quiz_key ); ?>>
|
72 |
+
<?php echo esc_html( $quiz_field . ' | ' . $quiz_key ); ?>
|
73 |
+
</option>
|
74 |
+
<?php endforeach;
|
75 |
+
} ?>
|
76 |
+
</select>
|
77 |
+
<?php if ( ! empty( $current_error ) ) : ?>
|
78 |
+
<span class="sui-error-message"><?php echo esc_html( $current_error ); ?></span>
|
79 |
+
<?php endif; ?>
|
80 |
+
</div>
|
81 |
+
</td>
|
82 |
+
</tr>
|
83 |
+
<?php endforeach; ?>
|
84 |
+
</tbody>
|
85 |
+
</table>
|
86 |
+
<input type="hidden" name="multi_id" value="<?php echo esc_attr( $vars['multi_id'] ); ?>">
|
87 |
+
</form>
|
addons/pro/activecampaign/views/quiz-settings/pick-name.php
ADDED
@@ -0,0 +1,36 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
// defaults
|
3 |
+
$vars = array(
|
4 |
+
'error_message' => '',
|
5 |
+
'name' => '',
|
6 |
+
'name_error' => '',
|
7 |
+
'multi_id' => '',
|
8 |
+
);
|
9 |
+
/** @var array $template_vars */
|
10 |
+
foreach ( $template_vars as $key => $val ) {
|
11 |
+
$vars[ $key ] = $val;
|
12 |
+
}
|
13 |
+
|
14 |
+
?>
|
15 |
+
<div class="integration-header">
|
16 |
+
<h3 class="sui-box-title" id="dialogTitle2"><?php echo esc_html( __( 'Setup Name', Forminator::DOMAIN ) ); ?></h3>
|
17 |
+
<span class="sui-description" style="margin-top: 20px;"><?php esc_html_e( 'Setup friendly name for this integration, so it will be easily identified by you.', Forminator::DOMAIN ); ?></span>
|
18 |
+
<?php if ( ! empty( $vars['error_message'] ) ) : ?>
|
19 |
+
<div class="sui-notice sui-notice-error">
|
20 |
+
<p><?php echo esc_html( $vars['error_message'] ); ?></p>
|
21 |
+
</div>
|
22 |
+
<?php endif; ?>
|
23 |
+
</div>
|
24 |
+
<form>
|
25 |
+
<div class="sui-form-field <?php echo esc_attr( ! empty( $vars['name_error'] ) ? 'sui-form-field-error' : '' ); ?>">
|
26 |
+
<label class="sui-label"><?php esc_html_e( 'Name', Forminator::DOMAIN ); ?></label>
|
27 |
+
<input
|
28 |
+
class="sui-form-control"
|
29 |
+
name="name" placeholder="<?php echo esc_attr( __( 'Friendly Name', Forminator::DOMAIN ) ); ?>"
|
30 |
+
value="<?php echo esc_attr( $vars['name'] ); ?>">
|
31 |
+
<?php if ( ! empty( $vars['name_error'] ) ) : ?>
|
32 |
+
<span class="sui-error-message"><?php echo esc_html( $vars['name_error'] ); ?></span>
|
33 |
+
<?php endif; ?>
|
34 |
+
</div>
|
35 |
+
<input type="hidden" name="multi_id" value="<?php echo esc_attr( $vars['multi_id'] ); ?>">
|
36 |
+
</form>
|
addons/pro/activecampaign/views/quiz-settings/select-list.php
ADDED
@@ -0,0 +1,39 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
// defaults
|
3 |
+
$vars = array(
|
4 |
+
'error_message' => '',
|
5 |
+
'list_id' => '',
|
6 |
+
'list_id_error' => '',
|
7 |
+
'multi_id' => '',
|
8 |
+
'lists' => array(),
|
9 |
+
);
|
10 |
+
/** @var array $template_vars */
|
11 |
+
foreach ( $template_vars as $key => $val ) {
|
12 |
+
$vars[ $key ] = $val;
|
13 |
+
}
|
14 |
+
|
15 |
+
?>
|
16 |
+
<div class="integration-header">
|
17 |
+
<h3 class="sui-box-title" id="dialogTitle2"><?php echo esc_html( __( 'Choose Contact List', Forminator::DOMAIN ) ); ?></h3>
|
18 |
+
<span class="sui-description" style="margin-top: 20px;"><?php esc_html_e( 'Pick ActiveCampaign List for new contacts to be added to.', Forminator::DOMAIN ); ?></span>
|
19 |
+
<?php if ( ! empty( $vars['error_message'] ) ) : ?>
|
20 |
+
<div class="sui-notice sui-notice-error">
|
21 |
+
<p><?php echo esc_html( $vars['error_message'] ); ?></p>
|
22 |
+
</div>
|
23 |
+
<?php endif; ?>
|
24 |
+
</div>
|
25 |
+
<form>
|
26 |
+
<div class="sui-form-field <?php echo esc_attr( ! empty( $vars['list_id_error'] ) ? 'sui-form-field-error' : '' ); ?>">
|
27 |
+
<label class="sui-label" for="activecampaign-list-id"><?php esc_html_e( 'List', Forminator::DOMAIN ); ?></label>
|
28 |
+
<select name="list_id" class="sui-select sui-form-control" id="activecampaign-list-id">
|
29 |
+
<option><?php esc_html_e( 'Please select a list', Forminator::DOMAIN ); ?></option>
|
30 |
+
<?php foreach ( $vars['lists'] as $list_id => $list_name ) : ?>
|
31 |
+
<option value="<?php echo esc_attr( $list_id ); ?>" <?php selected( $vars['list_id'], $list_id ); ?>><?php echo esc_html( $list_name ); ?></option>
|
32 |
+
<?php endforeach; ?>
|
33 |
+
</select>
|
34 |
+
<?php if ( ! empty( $vars['list_id_error'] ) ) : ?>
|
35 |
+
<span class="sui-error-message"><?php echo esc_html( $vars['list_id_error'] ); ?></span>
|
36 |
+
<?php endif; ?>
|
37 |
+
</div>
|
38 |
+
<input type="hidden" name="multi_id" value="<?php echo esc_attr( $vars['multi_id'] ); ?>">
|
39 |
+
</form>
|
addons/pro/activecampaign/views/quiz-settings/setup-options.php
ADDED
@@ -0,0 +1,160 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
// defaults
|
3 |
+
$vars = array(
|
4 |
+
'error_message' => '',
|
5 |
+
'multi_id' => '',
|
6 |
+
'tags_error' => '',
|
7 |
+
'forms' => array(),
|
8 |
+
'double_opt_form_id' => '',
|
9 |
+
'double_opt_form_id_error' => '',
|
10 |
+
'instantresponders' => 0,
|
11 |
+
'instantresponders_error' => '',
|
12 |
+
'lastmessage' => 0,
|
13 |
+
'lastmessage_error' => '',
|
14 |
+
'tags_fields' => array(),
|
15 |
+
'tags_selected_fields' => array(),
|
16 |
+
);
|
17 |
+
/** @var array $template_vars */
|
18 |
+
foreach ( $template_vars as $key => $val ) {
|
19 |
+
$vars[ $key ] = $val;
|
20 |
+
}
|
21 |
+
?>
|
22 |
+
<div class="integration-header">
|
23 |
+
|
24 |
+
<h3 class="sui-box-title" id="dialogTitle2"><?php echo esc_html( __( 'Additional Options', Forminator::DOMAIN ) ); ?></h3>
|
25 |
+
|
26 |
+
<span class="sui-description" style="margin-top: 20px;"><?php esc_html_e( 'Configure additional options for ActiveCampaign integration.', Forminator::DOMAIN ); ?></span>
|
27 |
+
|
28 |
+
<?php if ( ! empty( $vars['error_message'] ) ) : ?>
|
29 |
+
<span class="sui-notice sui-notice-error"><p><?php echo esc_html( $vars['error_message'] ); ?></p></span>
|
30 |
+
<?php endif; ?>
|
31 |
+
|
32 |
+
</div>
|
33 |
+
|
34 |
+
<form>
|
35 |
+
|
36 |
+
<div class="sui-form-field<?php echo esc_attr( ! empty( $vars['tags_error'] ) ? ' sui-form-field-error' : '' ); ?>">
|
37 |
+
|
38 |
+
<label class="sui-label" for="tags"><?php esc_html_e( 'Tags', Forminator::DOMAIN ); ?></label>
|
39 |
+
|
40 |
+
<select name="tags[]"
|
41 |
+
multiple="multiple"
|
42 |
+
data-reorder="1"
|
43 |
+
data-tags="true"
|
44 |
+
data-token-separators="[',']"
|
45 |
+
data-placeholder=""
|
46 |
+
data-allow-clear="false"
|
47 |
+
id="tags"
|
48 |
+
class="sui-select fui-multi-select" >
|
49 |
+
|
50 |
+
<?php foreach ( $vars['tags_selected_fields'] as $forminator_field ) : ?>
|
51 |
+
|
52 |
+
<option value="<?php echo esc_attr( $forminator_field['element_id'] ); ?>"
|
53 |
+
selected="selected">
|
54 |
+
<?php echo esc_html( $forminator_field['field_label'] ); ?>
|
55 |
+
</option>
|
56 |
+
|
57 |
+
<?php endforeach; ?>
|
58 |
+
|
59 |
+
<?php foreach ( $vars['tags_fields'] as $forminator_field ) : ?>
|
60 |
+
|
61 |
+
<option value="{<?php echo esc_attr( $forminator_field['element_id'] ); ?>}">
|
62 |
+
<?php echo esc_html( $forminator_field['field_label'] . ' | ' . $forminator_field['element_id'] ); ?>
|
63 |
+
</option>
|
64 |
+
|
65 |
+
<?php endforeach; ?>
|
66 |
+
|
67 |
+
</select>
|
68 |
+
|
69 |
+
<?php if ( ! empty( $vars['tags_error'] ) ) : ?>
|
70 |
+
<span class="sui-error-message"><?php echo esc_html( $vars['tags_error'] ); ?></span>
|
71 |
+
<?php endif; ?>
|
72 |
+
|
73 |
+
<span class="sui-description">
|
74 |
+
<?php esc_html_e( 'Tags for contact that sent to ActiveCampaign.', Forminator::DOMAIN ); ?>
|
75 |
+
</span>
|
76 |
+
|
77 |
+
</div>
|
78 |
+
|
79 |
+
<div class="sui-form-field <?php echo esc_attr( ! empty( $vars['double_opt_form_id_error'] ) ? 'sui-form-field-error' : '' ); ?>">
|
80 |
+
<label class="sui-label" for="double_opt_form_id"><?php esc_html_e( 'Double Opt-In Form', Forminator::DOMAIN ); ?></label>
|
81 |
+
<select name="double_opt_form_id" id="double_opt_form_id" class="sui-select sui-form-control">
|
82 |
+
<option value=""><?php esc_html_e( 'No form selected', Forminator::DOMAIN ); ?></option>
|
83 |
+
<?php foreach ( $vars['forms'] as $form_id => $form_name ) : ?>
|
84 |
+
<option value="<?php echo esc_attr( $form_id ); ?>" <?php selected( $form_id, $vars['double_opt_form_id'] ); ?>><?php echo esc_html( $form_name ); ?></option>
|
85 |
+
<?php endforeach; ?>
|
86 |
+
</select>
|
87 |
+
<?php if ( ! empty( $vars['double_opt_form_id_error'] ) ) : ?>
|
88 |
+
<span class="sui-error-message"><?php echo esc_html( $vars['double_opt_form_id_error'] ); ?></span>
|
89 |
+
<?php endif; ?>
|
90 |
+
<span class="sui-description">
|
91 |
+
<?php
|
92 |
+
esc_html_e(
|
93 |
+
'Select which ActiveCampaign form will be used when adding to ActiveCampaign to send the opt-in email. You can read more information ',
|
94 |
+
Forminator::DOMAIN
|
95 |
+
);
|
96 |
+
?>
|
97 |
+
<a href="https://help.activecampaign.com/hc/en-us/articles/115000839230-How-do-I-enable-double-opt-in-confirmation-" target="_blank">here</a>.
|
98 |
+
</span>
|
99 |
+
</div>
|
100 |
+
|
101 |
+
<div class="sui-row">
|
102 |
+
<div class="sui-col-md-6">
|
103 |
+
|
104 |
+
<div class="sui-form-field <?php echo esc_attr( ! empty( $vars['instantresponders_error'] ) ? 'sui-form-field-error' : '' ); ?>">
|
105 |
+
<label class="sui-toggle">
|
106 |
+
|
107 |
+
<input type="checkbox"
|
108 |
+
name="instantresponders"
|
109 |
+
id="instantresponders"
|
110 |
+
value="1"
|
111 |
+
<?php checked( 1, $vars['instantresponders'] ); ?>>
|
112 |
+
<span class="sui-toggle-slider"></span>
|
113 |
+
</label>
|
114 |
+
<label class="sui-toggle-label" for="instantresponders"><?php esc_html_e( 'Enable Instant Responders', Forminator::DOMAIN ); ?></label>
|
115 |
+
<?php if ( ! empty( $vars['instantresponders_error'] ) ) : ?>
|
116 |
+
<span class="sui-error-message"><?php echo esc_html( $vars['instantresponders_error'] ); ?></span>
|
117 |
+
<?php endif; ?>
|
118 |
+
<span class="sui-description">
|
119 |
+
<?php
|
120 |
+
esc_html_e(
|
121 |
+
'When the instant responders option is enabled, ActiveCampaign will send any instant responders setup when the contact is added to the list.
|
122 |
+
This option is not available to users on a free trial.',
|
123 |
+
Forminator::DOMAIN
|
124 |
+
);
|
125 |
+
?>
|
126 |
+
</span>
|
127 |
+
</div>
|
128 |
+
|
129 |
+
</div>
|
130 |
+
<div class="sui-col-md-6">
|
131 |
+
|
132 |
+
<div class="sui-form-field <?php echo esc_attr( ! empty( $vars['lastmessage_error'] ) ? 'sui-form-field-error' : '' ); ?>">
|
133 |
+
<label class="sui-toggle">
|
134 |
+
<input type="checkbox"
|
135 |
+
name="lastmessage"
|
136 |
+
id="lastmessage"
|
137 |
+
value="1"
|
138 |
+
<?php checked( 1, $vars['lastmessage'] ); ?>>
|
139 |
+
<span class="sui-toggle-slider"></span>
|
140 |
+
</label>
|
141 |
+
<label class="sui-toggle-label" for="lastmessage"><?php esc_html_e( 'Send last broadcast campaign', Forminator::DOMAIN ); ?></label>
|
142 |
+
<?php if ( ! empty( $vars['lastmessage_error'] ) ) : ?>
|
143 |
+
<span class="sui-error-message"><?php echo esc_html( $vars['lastmessage_error'] ); ?></span>
|
144 |
+
<?php endif; ?>
|
145 |
+
<span class="sui-description">
|
146 |
+
<?php
|
147 |
+
esc_html_e(
|
148 |
+
'When the send last broadcast campaign option is enabled, ActiveCampaign will send the last campaign sent out to the list to the contact being added.
|
149 |
+
This option is not available to users on a free trial.',
|
150 |
+
Forminator::DOMAIN
|
151 |
+
);
|
152 |
+
?>
|
153 |
+
</span>
|
154 |
+
</div>
|
155 |
+
|
156 |
+
</div>
|
157 |
+
</div>
|
158 |
+
|
159 |
+
<input type="hidden" name="multi_id" value="<?php echo esc_attr( $vars['multi_id'] ); ?>">
|
160 |
+
</form>
|
addons/pro/aweber/aweber.php
CHANGED
@@ -26,5 +26,8 @@ function forminator_addon_aweber_assets_url() {
|
|
26 |
require_once dirname( __FILE__ ) . '/class-forminator-addon-aweber.php';
|
27 |
require_once dirname( __FILE__ ) . '/class-forminator-addon-aweber-form-settings.php';
|
28 |
require_once dirname( __FILE__ ) . '/class-forminator-addon-aweber-form-hooks.php';
|
|
|
|
|
|
|
29 |
//Direct Load
|
30 |
Forminator_Addon_Loader::get_instance()->register( 'Forminator_Addon_Aweber' );
|
26 |
require_once dirname( __FILE__ ) . '/class-forminator-addon-aweber.php';
|
27 |
require_once dirname( __FILE__ ) . '/class-forminator-addon-aweber-form-settings.php';
|
28 |
require_once dirname( __FILE__ ) . '/class-forminator-addon-aweber-form-hooks.php';
|
29 |
+
|
30 |
+
require_once dirname( __FILE__ ) . '/class-forminator-addon-aweber-quiz-settings.php';
|
31 |
+
require_once dirname( __FILE__ ) . '/class-forminator-addon-aweber-quiz-hooks.php';
|
32 |
//Direct Load
|
33 |
Forminator_Addon_Loader::get_instance()->register( 'Forminator_Addon_Aweber' );
|
addons/pro/aweber/class-forminator-addon-aweber-quiz-hooks.php
ADDED
@@ -0,0 +1,805 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/**
|
4 |
+
* Class Forminator_Addon_Aweber_Quiz_Hooks
|
5 |
+
*
|
6 |
+
* @since 1.0 Aweber Addon
|
7 |
+
*
|
8 |
+
*/
|
9 |
+
class Forminator_Addon_Aweber_Quiz_Hooks extends Forminator_Addon_Quiz_Hooks_Abstract {
|
10 |
+
|
11 |
+
/**
|
12 |
+
* Addon instance are auto available quiz abstract
|
13 |
+
* Its added here for development purpose,
|
14 |
+
* Auto-complete will resolve addon directly to `Aweber` instance instead of the abstract
|
15 |
+
* And its public properties can be exposed
|
16 |
+
*
|
17 |
+
* @since 1.0 Aweber Addon
|
18 |
+
* @var Forminator_Addon_Aweber
|
19 |
+
*/
|
20 |
+
protected $addon;
|
21 |
+
|
22 |
+
/**
|
23 |
+
* Quiz Settings Instance
|
24 |
+
*
|
25 |
+
* @since 1.0 Aweber Addon
|
26 |
+
* @var Forminator_Addon_Aweber_Quiz_Settings | null
|
27 |
+
*/
|
28 |
+
protected $quiz_settings_instance;
|
29 |
+
|
30 |
+
/**
|
31 |
+
* Forminator_Addon_Aweber_Quiz_Hooks constructor.
|
32 |
+
*
|
33 |
+
* @since 1.0 Aweber Addon
|
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 = __( 'AWeber failed to process submitted data. Please check your quiz and try again', Forminator::DOMAIN );
|
43 |
+
}
|
44 |
+
|
45 |
+
/**
|
46 |
+
* Save status of request sent and received for each connected AWeber Connection
|
47 |
+
*
|
48 |
+
* @since 1.0 AWeber Addon
|
49 |
+
*
|
50 |
+
* @param array $submitted_data
|
51 |
+
* @param array $form_entry_fields
|
52 |
+
*
|
53 |
+
* @return array
|
54 |
+
*/
|
55 |
+
public function add_entry_fields( $submitted_data, $form_entry_fields = array() ) {
|
56 |
+
|
57 |
+
$quiz_id = $this->quiz_id;
|
58 |
+
$quiz_settings_instance = $this->quiz_settings_instance;
|
59 |
+
|
60 |
+
/**
|
61 |
+
* Filter AWeber submitted quiz data to be processed
|
62 |
+
*
|
63 |
+
* @since 1.3
|
64 |
+
*
|
65 |
+
* @param array $submitted_data
|
66 |
+
* @param int $quiz_id current Quiz ID
|
67 |
+
* @param Forminator_Addon_Aweber_Quiz_Settings $quiz_settings_instance AWeber Addon Quiz Settings instance
|
68 |
+
*/
|
69 |
+
$submitted_data = apply_filters(
|
70 |
+
'forminator_addon_aweber_quiz_submitted_data',
|
71 |
+
$submitted_data,
|
72 |
+
$quiz_id,
|
73 |
+
$quiz_settings_instance
|
74 |
+
);
|
75 |
+
|
76 |
+
$quiz_submitted_data = get_quiz_submitted_data( $this->quiz, $submitted_data, $form_entry_fields );
|
77 |
+
|
78 |
+
$addon_setting_values = $this->quiz_settings_instance->get_quiz_settings_values();
|
79 |
+
$quiz_settings = $this->quiz_settings_instance->get_quiz_settings();
|
80 |
+
$addons_fields = $this->quiz_settings_instance->get_form_fields();
|
81 |
+
|
82 |
+
$form_entry_fields = forminator_lead_form_data( $submitted_data );
|
83 |
+
$submitted_data = get_addons_lead_form_entry_data( $quiz_settings, $submitted_data, $addons_fields );
|
84 |
+
$lead_submitted_data = forminator_addons_lead_submitted_data( $addons_fields, $form_entry_fields );
|
85 |
+
$submitted_data = array_merge( $submitted_data, $quiz_submitted_data );
|
86 |
+
|
87 |
+
$data = array();
|
88 |
+
|
89 |
+
/**
|
90 |
+
* Fires before adding subscriber to AWeber
|
91 |
+
*
|
92 |
+
* @since 1.3
|
93 |
+
*
|
94 |
+
* @param int $quiz_id current Quiz ID
|
95 |
+
* @param array $submitted_data
|
96 |
+
* @param Forminator_Addon_Aweber_Quiz_Settings $quiz_settings_instance AWeber Addon Quiz Settings instance
|
97 |
+
*/
|
98 |
+
do_action( 'forminator_addon_aweber_before_add_subscriber', $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 to aweber
|
102 |
+
if ( $quiz_settings_instance->is_multi_quiz_settings_complete( $key ) ) {
|
103 |
+
// exec only on completed connection
|
104 |
+
$data[] = array(
|
105 |
+
'name' => 'status-' . $key,
|
106 |
+
'value' => $this->get_status_on_add_subscriber( $key, $submitted_data, $addon_setting_value, $form_entry_fields, $lead_submitted_data ),
|
107 |
+
);
|
108 |
+
}
|
109 |
+
}
|
110 |
+
|
111 |
+
$entry_fields = $data;
|
112 |
+
/**
|
113 |
+
* Filter AWeber entry fields to be saved to entry model
|
114 |
+
*
|
115 |
+
* @since 1.3
|
116 |
+
*
|
117 |
+
* @param array $entry_fields
|
118 |
+
* @param int $quiz_id current Quiz ID
|
119 |
+
* @param array $submitted_data
|
120 |
+
* @param Forminator_Addon_Aweber_Quiz_Settings $quiz_settings_instance AWeber Addon Quiz Settings instance
|
121 |
+
*/
|
122 |
+
$data = apply_filters(
|
123 |
+
'forminator_addon_aweber_entry_fields',
|
124 |
+
$entry_fields,
|
125 |
+
$quiz_id,
|
126 |
+
$submitted_data,
|
127 |
+
$quiz_settings_instance
|
128 |
+
);
|
129 |
+
|
130 |
+
return $data;
|
131 |
+
|
132 |
+
}
|
133 |
+
|
134 |
+
/**
|
135 |
+
* Get status on add subscriber to AWeber
|
136 |
+
*
|
137 |
+
* @since 1.0 AWeber Addon
|
138 |
+
*
|
139 |
+
* @param $connection_id
|
140 |
+
* @param $submitted_data
|
141 |
+
* @param $connection_settings
|
142 |
+
* @param $form_entry_fields
|
143 |
+
*
|
144 |
+
* @return array `is_sent` true means its success send data to AWeber, false otherwise
|
145 |
+
*/
|
146 |
+
private function get_status_on_add_subscriber( $connection_id, $submitted_data, $connection_settings, $form_entry_fields, $lead_submitted_data ) {
|
147 |
+
// initialize as null
|
148 |
+
$api = null;
|
149 |
+
|
150 |
+
$quiz_id = $this->quiz_id;
|
151 |
+
$quiz_settings_instance = $this->quiz_settings_instance;
|
152 |
+
$quiz_settings = $this->quiz_settings_instance->get_quiz_settings();
|
153 |
+
|
154 |
+
//check required fields
|
155 |
+
try {
|
156 |
+
$api = $this->addon->get_api();
|
157 |
+
$args = array();
|
158 |
+
|
159 |
+
if ( ! isset( $connection_settings['list_id'] ) ) {
|
160 |
+
throw new Forminator_Addon_Aweber_Exception( __( 'List ID not properly setup.', Forminator::DOMAIN ) );
|
161 |
+
}
|
162 |
+
|
163 |
+
$list_id = $connection_settings['list_id'];
|
164 |
+
|
165 |
+
$fields_map = $connection_settings['fields_map'];
|
166 |
+
$fields_mapper = $connection_settings['fields_mapper'];
|
167 |
+
|
168 |
+
$email_element_id = $connection_settings['fields_map']['default_field_email'];
|
169 |
+
if ( ! isset( $submitted_data[ $email_element_id ] ) || empty( $submitted_data[ $email_element_id ] ) ) {
|
170 |
+
throw new Forminator_Addon_Aweber_Exception(/* translators: ... */
|
171 |
+
sprintf( __( 'Email Address on element %1$s not found or not filled on submitted data.', Forminator::DOMAIN ), $email_element_id )
|
172 |
+
);
|
173 |
+
}
|
174 |
+
$email = $submitted_data[ $email_element_id ];
|
175 |
+
$email = strtolower( trim( $email ) );
|
176 |
+
$args['email'] = $email;
|
177 |
+
|
178 |
+
//find existing subscriber first
|
179 |
+
/**
|
180 |
+
* Filter arguments to passed on to Find Subscriber AWeber API
|
181 |
+
*
|
182 |
+
* @since 1.3
|
183 |
+
*
|
184 |
+
* @param array $args
|
185 |
+
* @param int $quiz_id Current Quiz id
|
186 |
+
* @param string $connection_id ID of current connection
|
187 |
+
* @param array $submitted_data
|
188 |
+
* @param array $connection_settings current connection setting, contains options of like `name`, `list_id` etc
|
189 |
+
* @param array $form_entry_fields default entry fields of quiz
|
190 |
+
* @param array $quiz_settings Displayed Quiz settings
|
191 |
+
* @param Forminator_Addon_Aweber_Quiz_Settings $quiz_settings_instance AWeber Addon Quiz Settings instance
|
192 |
+
*/
|
193 |
+
$args = apply_filters(
|
194 |
+
'forminator_addon_aweber_find_subscriber_args',
|
195 |
+
$args,
|
196 |
+
$quiz_id,
|
197 |
+
$connection_id,
|
198 |
+
$submitted_data,
|
199 |
+
$connection_settings,
|
200 |
+
$form_entry_fields,
|
201 |
+
$quiz_settings,
|
202 |
+
$quiz_settings_instance
|
203 |
+
);
|
204 |
+
|
205 |
+
$subscriber_is_exist = false;
|
206 |
+
$existing_subscriber = null;
|
207 |
+
|
208 |
+
$existing_subscriber_request = $api->find_account_list_subscriber( $this->addon->get_account_id(), $list_id, $args );
|
209 |
+
|
210 |
+
if ( isset( $existing_subscriber_request->entries ) && is_array( $existing_subscriber_request->entries ) ) {
|
211 |
+
$existing_subscriber_entries = $existing_subscriber_request->entries;
|
212 |
+
if ( isset( $existing_subscriber_entries[0] ) ) {
|
213 |
+
$existing_subscriber = $existing_subscriber_entries[0];
|
214 |
+
if ( isset( $existing_subscriber->id ) ) {
|
215 |
+
$subscriber_is_exist = true;
|
216 |
+
// https://labs.aweber.com/docs/reference/1.0#subscriber_entry
|
217 |
+
// you can not modify or delete Subscribers with a status of 'unconfirmed'.
|
218 |
+
if ( isset( $existing_subscriber->status ) && 'unconfirmed' === $existing_subscriber->status ) {
|
219 |
+
throw new Forminator_Addon_Aweber_Exception( __( 'Unconfirmed subscriber can\'t be modified.', Forminator::DOMAIN ) );
|
220 |
+
}
|
221 |
+
}
|
222 |
+
}
|
223 |
+
}
|
224 |
+
|
225 |
+
// processed
|
226 |
+
unset( $fields_map['default_field_email'] );
|
227 |
+
|
228 |
+
$name_element_id = $connection_settings['fields_map']['default_field_name'];
|
229 |
+
|
230 |
+
if ( isset( $submitted_data[ $name_element_id ] ) && ! empty( $submitted_data[ $name_element_id ] ) ) {
|
231 |
+
$name = $submitted_data[ $name_element_id ];
|
232 |
+
|
233 |
+
}
|
234 |
+
|
235 |
+
if ( isset( $name ) ) {
|
236 |
+
$args['name'] = $name;
|
237 |
+
}
|
238 |
+
|
239 |
+
// processed
|
240 |
+
unset( $fields_map['default_field_name'] );
|
241 |
+
|
242 |
+
$custom_fields = array();
|
243 |
+
// process rest extra fields if available
|
244 |
+
foreach ( $fields_map as $field_id => $element_id ) {
|
245 |
+
if ( ! empty( $element_id ) ) {
|
246 |
+
|
247 |
+
if ( isset( $submitted_data[ $element_id ] ) && ( ! empty( $submitted_data[ $element_id ] ) || 0 === (int) $submitted_data[ $element_id ] ) ) {
|
248 |
+
$element_value = $submitted_data[ $element_id ];
|
249 |
+
if ( is_array( $element_value ) ) {
|
250 |
+
$element_value = implode( ',', $element_value );
|
251 |
+
}
|
252 |
+
}
|
253 |
+
|
254 |
+
if ( isset( $fields_mapper[ $field_id ] ) && isset( $element_value ) ) {
|
255 |
+
$custom_fields[ $fields_mapper[ $field_id ] ] = (string) $element_value; // custom value must be string
|
256 |
+
unset( $element_value ); // unset for next loop
|
257 |
+
}
|
258 |
+
}
|
259 |
+
}
|
260 |
+
if ( ! empty( $custom_fields ) ) {
|
261 |
+
$args['custom_fields'] = $custom_fields;
|
262 |
+
}
|
263 |
+
|
264 |
+
if ( isset( $connection_settings['ad_tracking'] ) && ! empty( $connection_settings['ad_tracking'] ) ) {
|
265 |
+
$ad_tracking = $connection_settings['ad_tracking'];
|
266 |
+
|
267 |
+
// disable all_fields here
|
268 |
+
$ad_tracking = str_ireplace( '{all_fields}', '', $ad_tracking );
|
269 |
+
$ad_tracking = str_ireplace( '{quiz_name}', forminator_get_name_from_model( $this->quiz ), $ad_tracking );
|
270 |
+
$ad_tracking = forminator_addon_replace_custom_vars( $ad_tracking, $lead_submitted_data, $this->lead_model, $form_entry_fields, false );
|
271 |
+
/**
|
272 |
+
* Filter `ad_tracking` to passed onto API
|
273 |
+
*
|
274 |
+
* @since 1.2
|
275 |
+
*
|
276 |
+
* @param string $card_name
|
277 |
+
* @param int $quiz_id Current Quiz id
|
278 |
+
* @param string $connection_id ID of current connection
|
279 |
+
* @param array $submitted_data
|
280 |
+
* @param array $connection_settings current connection setting, contains options of like `name`, `list_id` etc
|
281 |
+
* @param array $form_entry_fields default entry fields of quiz
|
282 |
+
* @param array $quiz_settings Displayed Quiz settings
|
283 |
+
* @param Forminator_Addon_Aweber_Quiz_Settings $quiz_settings_instance AWeber Addon Quiz Settings instance
|
284 |
+
*/
|
285 |
+
$ad_tracking = apply_filters(
|
286 |
+
'forminator_addon_aweber_subscriber_ad_tracking',
|
287 |
+
$ad_tracking,
|
288 |
+
$quiz_id,
|
289 |
+
$connection_id,
|
290 |
+
$submitted_data,
|
291 |
+
$connection_settings,
|
292 |
+
$form_entry_fields,
|
293 |
+
$quiz_settings,
|
294 |
+
$quiz_settings_instance
|
295 |
+
);
|
296 |
+
|
297 |
+
if ( ! empty( $ad_tracking ) && is_string( $ad_tracking ) ) {
|
298 |
+
if ( strlen( $ad_tracking ) > 20 ) {
|
299 |
+
// 20 chars max
|
300 |
+
$ad_tracking = substr( $ad_tracking, 0, 20 );
|
301 |
+
}
|
302 |
+
$args['ad_tracking'] = $ad_tracking;
|
303 |
+
}
|
304 |
+
}
|
305 |
+
|
306 |
+
if ( isset( $connection_settings['tags'] ) && ! empty( $connection_settings['tags'] ) ) {
|
307 |
+
$tags = array();
|
308 |
+
foreach ( $connection_settings['tags'] as $tag ) {
|
309 |
+
if ( stripos( $tag, '{' ) === 0
|
310 |
+
&& stripos( $tag, '}' ) === ( strlen( $tag ) - 1 )
|
311 |
+
) {
|
312 |
+
// translate to value
|
313 |
+
$element_id = str_ireplace( '{', '', $tag );
|
314 |
+
$element_id = str_ireplace( '}', '', $element_id );
|
315 |
+
if ( isset( $submitted_data[ $element_id ] ) && ! empty( $submitted_data[ $element_id ] ) ) {
|
316 |
+
$element_value = $submitted_data[ $element_id ];
|
317 |
+
if ( is_array( $element_value ) ) {
|
318 |
+
$element_value = implode( ',', $element_value );
|
319 |
+
}
|
320 |
+
}
|
321 |
+
|
322 |
+
if ( isset( $element_value ) ) {
|
323 |
+
$tags[] = strtolower( (string) $element_value ); // tag must be string
|
324 |
+
unset( $element_value ); // unset for next loop
|
325 |
+
}
|
326 |
+
} else {
|
327 |
+
$tags[] = strtolower( $tag );
|
328 |
+
}
|
329 |
+
}
|
330 |
+
|
331 |
+
/**
|
332 |
+
* Filter `tags` to passed onto API
|
333 |
+
*
|
334 |
+
* @since 1.2
|
335 |
+
*
|
336 |
+
* @param string $card_name
|
337 |
+
* @param int $quiz_id Current Quiz id
|
338 |
+
* @param string $connection_id ID of current connection
|
339 |
+
* @param array $submitted_data
|
340 |
+
* @param array $connection_settings current connection setting, contains options of like `name`, `list_id` etc
|
341 |
+
* @param array $form_entry_fields default entry fields of quiz
|
342 |
+
* @param array $quiz_settings Displayed Quiz settings
|
343 |
+
* @param Forminator_Addon_Aweber_Quiz_Settings $quiz_settings_instance AWeber Addon Quiz Settings instance
|
344 |
+
*/
|
345 |
+
$tags = apply_filters(
|
346 |
+
'forminator_addon_aweber_subscriber_tags',
|
347 |
+
$tags,
|
348 |
+
$quiz_id,
|
349 |
+
$connection_id,
|
350 |
+
$submitted_data,
|
351 |
+
$connection_settings,
|
352 |
+
$form_entry_fields,
|
353 |
+
$quiz_settings,
|
354 |
+
$quiz_settings_instance
|
355 |
+
);
|
356 |
+
|
357 |
+
if ( ! empty( $tags ) ) {
|
358 |
+
sort( $tags );
|
359 |
+
$args['tags'] = $tags;
|
360 |
+
}
|
361 |
+
}
|
362 |
+
|
363 |
+
$ip_address = Forminator_Geo::get_user_ip();
|
364 |
+
|
365 |
+
/**
|
366 |
+
* Filter `ip_address` to passed onto API
|
367 |
+
*
|
368 |
+
* @since 1.2
|
369 |
+
*
|
370 |
+
* @param string $card_name
|
371 |
+
* @param int $quiz_id Current Quiz id
|
372 |
+
* @param string $connection_id ID of current connection
|
373 |
+
* @param array $submitted_data
|
374 |
+
* @param array $connection_settings current connection setting, contains options of like `name`, `list_id` etc
|
375 |
+
* @param array $form_entry_fields default entry fields of quiz
|
376 |
+
* @param array $quiz_settings Displayed Quiz settings
|
377 |
+
* @param Forminator_Addon_Aweber_Quiz_Settings $quiz_settings_instance AWeber Addon Quiz Settings instance
|
378 |
+
*/
|
379 |
+
$ip_address = apply_filters(
|
380 |
+
'forminator_addon_aweber_subscriber_ip_address',
|
381 |
+
$ip_address,
|
382 |
+
$quiz_id,
|
383 |
+
$connection_id,
|
384 |
+
$submitted_data,
|
385 |
+
$connection_settings,
|
386 |
+
$form_entry_fields,
|
387 |
+
$quiz_settings,
|
388 |
+
$quiz_settings_instance
|
389 |
+
);
|
390 |
+
|
391 |
+
$args['ip_address'] = $ip_address;
|
392 |
+
|
393 |
+
if ( ! $subscriber_is_exist ) {
|
394 |
+
/**
|
395 |
+
* Filter arguments to passed on to Add Subscriber AWeber API
|
396 |
+
*
|
397 |
+
* @since 1.3
|
398 |
+
*
|
399 |
+
* @param array $args
|
400 |
+
* @param int $quiz_id Current Quiz id
|
401 |
+
* @param string $connection_id ID of current connection
|
402 |
+
* @param array $submitted_data
|
403 |
+
* @param array $connection_settings current connection setting, contains options of like `name`, `list_id` etc
|
404 |
+
* @param array $form_entry_fields default entry fields of quiz
|
405 |
+
* @param array $quiz_settings Displayed Quiz settings
|
406 |
+
* @param Forminator_Addon_Aweber_Quiz_Settings $quiz_settings_instance AWeber Addon Quiz Settings instance
|
407 |
+
*/
|
408 |
+
$args = apply_filters(
|
409 |
+
'forminator_addon_aweber_add_subscriber_args',
|
410 |
+
$args,
|
411 |
+
$quiz_id,
|
412 |
+
$connection_id,
|
413 |
+
$submitted_data,
|
414 |
+
$connection_settings,
|
415 |
+
$form_entry_fields,
|
416 |
+
$quiz_settings,
|
417 |
+
$quiz_settings_instance
|
418 |
+
);
|
419 |
+
|
420 |
+
$api->add_account_list_subscriber( $this->addon->get_account_id(), $list_id, $args );
|
421 |
+
|
422 |
+
} else {
|
423 |
+
/**
|
424 |
+
* This will only update information
|
425 |
+
* subscribed, unconfirmed, unsubscribed status wont be updated
|
426 |
+
* use hooks @see forminator_addon_aweber_update_subscriber_args, if needed
|
427 |
+
*/
|
428 |
+
// update if exist
|
429 |
+
$current_tags = array();
|
430 |
+
if ( isset( $existing_subscriber->tags ) && is_array( $existing_subscriber->tags ) ) {
|
431 |
+
$current_tags = $existing_subscriber->tags;
|
432 |
+
}
|
433 |
+
|
434 |
+
if ( ! isset( $args['tags'] ) ) {
|
435 |
+
$args['tags'] = array();
|
436 |
+
}
|
437 |
+
|
438 |
+
$add_tags = array_diff( $args['tags'], $current_tags );
|
439 |
+
$remove_tags = array_diff( $current_tags, $args['tags'] );
|
440 |
+
|
441 |
+
sort( $add_tags );
|
442 |
+
sort( $remove_tags );
|
443 |
+
|
444 |
+
$new_tags = array(
|
445 |
+
'add' => $add_tags,
|
446 |
+
'remove' => $remove_tags,
|
447 |
+
);
|
448 |
+
|
449 |
+
$args['tags'] = $new_tags;
|
450 |
+
|
451 |
+
/**
|
452 |
+
* Filter arguments to passed on to Add Subscriber AWeber API
|
453 |
+
*
|
454 |
+
* @since 1.3
|
455 |
+
*
|
456 |
+
* @param array $args
|
457 |
+
* @param int $quiz_id Current Quiz id
|
458 |
+
* @param string $connection_id ID of current connection
|
459 |
+
* @param array $submitted_data
|
460 |
+
* @param array $connection_settings current connection setting, contains options of like `name`, `list_id` etc
|
461 |
+
* @param array $form_entry_fields default entry fields of quiz
|
462 |
+
* @param array $quiz_settings Displayed Quiz settings
|
463 |
+
* @param Forminator_Addon_Aweber_Quiz_Settings $quiz_settings_instance AWeber Addon Quiz Settings instance
|
464 |
+
*/
|
465 |
+
$args = apply_filters(
|
466 |
+
'forminator_addon_aweber_update_subscriber_args',
|
467 |
+
$args,
|
468 |
+
$quiz_id,
|
469 |
+
$connection_id,
|
470 |
+
$submitted_data,
|
471 |
+
$connection_settings,
|
472 |
+
$form_entry_fields,
|
473 |
+
$quiz_settings,
|
474 |
+
$quiz_settings_instance
|
475 |
+
);
|
476 |
+
|
477 |
+
$api->update_account_list_subscriber( $this->addon->get_account_id(), $list_id, $existing_subscriber->id, $args );
|
478 |
+
}
|
479 |
+
|
480 |
+
return array(
|
481 |
+
'is_sent' => true,
|
482 |
+
'connection_name' => $connection_settings['name'],
|
483 |
+
'description' => __( 'Successfully send data to AWeber', Forminator::DOMAIN ),
|
484 |
+
'data_sent' => $api->get_last_data_sent(),
|
485 |
+
'data_received' => $api->get_last_data_received(),
|
486 |
+
'url_request' => $api->get_last_url_request(),
|
487 |
+
'list_id' => $list_id, // for delete reference
|
488 |
+
);
|
489 |
+
|
490 |
+
} catch ( Forminator_Addon_Aweber_Exception $e ) {
|
491 |
+
$addon_entry_fields = array(
|
492 |
+
'is_sent' => false,
|
493 |
+
'description' => $e->getMessage(),
|
494 |
+
'connection_name' => $connection_settings['name'],
|
495 |
+
'data_sent' => ( ( $api instanceof Forminator_Addon_Aweber_Wp_Api ) ? $api->get_last_data_sent() : array() ),
|
496 |
+
'data_received' => ( ( $api instanceof Forminator_Addon_Aweber_Wp_Api ) ? $api->get_last_data_received() : array() ),
|
497 |
+
'url_request' => ( ( $api instanceof Forminator_Addon_Aweber_Wp_Api ) ? $api->get_last_url_request() : '' ),
|
498 |
+
);
|
499 |
+
|
500 |
+
return $addon_entry_fields;
|
501 |
+
}
|
502 |
+
}
|
503 |
+
|
504 |
+
/**
|
505 |
+
* It wil add new row on entry table of submission page, with couple of subentries
|
506 |
+
* subentries included are defined in @see Forminator_Addon_Aweber_Quiz_Hooks::get_additional_entry_item()
|
507 |
+
*
|
508 |
+
* @since 1.0 AWeber Addon
|
509 |
+
*
|
510 |
+
* @param Forminator_Form_Entry_Model $entry_model
|
511 |
+
* @param $addon_meta_data
|
512 |
+
*
|
513 |
+
* @return array
|
514 |
+
*/
|
515 |
+
public function on_render_entry( Forminator_Form_Entry_Model $entry_model, $addon_meta_data ) {
|
516 |
+
|
517 |
+
$quiz_id = $this->quiz_id;
|
518 |
+
$quiz_settings_instance = $this->quiz_settings_instance;
|
519 |
+
|
520 |
+
/**
|
521 |
+
*
|
522 |
+
* Filter active metadata that previously saved on db to be processed
|
523 |
+
*
|
524 |
+
* @since 1.3
|
525 |
+
*
|
526 |
+
* @param array $addon_meta_data
|
527 |
+
* @param int $quiz_id current Quiz ID
|
528 |
+
* @param Forminator_Addon_Aweber_Quiz_Settings $quiz_settings_instance AWeber Addon Quiz Settings instance
|
529 |
+
*/
|
530 |
+
$addon_meta_data = apply_filters(
|
531 |
+
'forminator_addon_aweber_metadata',
|
532 |
+
$addon_meta_data,
|
533 |
+
$quiz_id,
|
534 |
+
$quiz_settings_instance
|
535 |
+
);
|
536 |
+
|
537 |
+
$addon_meta_datas = $addon_meta_data;
|
538 |
+
if ( ! isset( $addon_meta_data[0] ) || ! is_array( $addon_meta_data[0] ) ) {
|
539 |
+
return array();
|
540 |
+
}
|
541 |
+
|
542 |
+
return $this->on_render_entry_multi_connection( $addon_meta_datas );
|
543 |
+
|
544 |
+
}
|
545 |
+
|
546 |
+
/**
|
547 |
+
* Loop through addon meta data on multiple AWeber(s)
|
548 |
+
*
|
549 |
+
* @since 1.0 AWeber Addon
|
550 |
+
*
|
551 |
+
* @param $addon_meta_datas
|
552 |
+
*
|
553 |
+
* @return array
|
554 |
+
*/
|
555 |
+
private function on_render_entry_multi_connection( $addon_meta_datas ) {
|
556 |
+
$additional_entry_item = array();
|
557 |
+
foreach ( $addon_meta_datas as $addon_meta_data ) {
|
558 |
+
$additional_entry_item[] = $this->get_additional_entry_item( $addon_meta_data );
|
559 |
+
}
|
560 |
+
|
561 |
+
return $additional_entry_item;
|
562 |
+
|
563 |
+
}
|
564 |
+
|
565 |
+
/**
|
566 |
+
* Format additional entry item as label and value arrays
|
567 |
+
*
|
568 |
+
* - Integration Name : its defined by user when they adding AWeber integration on their quiz
|
569 |
+
* - Sent To AWeber : will be Yes/No value, that indicates whether sending data to AWeber was successful
|
570 |
+
* - Info : Text that are generated by addon when building and sending data to AWeber @see Forminator_Addon_Aweber_Quiz_Hooks::add_entry_fields()
|
571 |
+
* - Below subentries will be added if full log enabled, @see Forminator_Addon_Aweber::is_show_full_log() @see FORMINATOR_ADDON_AWEBER_SHOW_FULL_LOG
|
572 |
+
* - API URL : URL that wes requested when sending data to AWeber
|
573 |
+
* - Data sent to AWeber : encoded body request that was sent
|
574 |
+
* - Data received from AWeber : json encoded body response that was received
|
575 |
+
*
|
576 |
+
* @param $addon_meta_data
|
577 |
+
*
|
578 |
+
* @since 1.0 AWeber Addon
|
579 |
+
* @return array
|
580 |
+
*/
|
581 |
+
private function get_additional_entry_item( $addon_meta_data ) {
|
582 |
+
|
583 |
+
if ( ! isset( $addon_meta_data['value'] ) || ! is_array( $addon_meta_data['value'] ) ) {
|
584 |
+
return array();
|
585 |
+
}
|
586 |
+
$status = $addon_meta_data['value'];
|
587 |
+
$additional_entry_item = array(
|
588 |
+
'label' => __( 'AWeber Integration', Forminator::DOMAIN ),
|
589 |
+
'value' => '',
|
590 |
+
);
|
591 |
+
|
592 |
+
$sub_entries = array();
|
593 |
+
if ( isset( $status['connection_name'] ) ) {
|
594 |
+
$sub_entries[] = array(
|
595 |
+
'label' => __( 'Integration Name', Forminator::DOMAIN ),
|
596 |
+
'value' => $status['connection_name'],
|
597 |
+
);
|
598 |
+
}
|
599 |
+
|
600 |
+
if ( isset( $status['is_sent'] ) ) {
|
601 |
+
$is_sent = true === $status['is_sent'] ? __( 'Yes', Forminator::DOMAIN ) : __( 'No', Forminator::DOMAIN );
|
602 |
+
$sub_entries[] = array(
|
603 |
+
'label' => __( 'Sent To AWeber', Forminator::DOMAIN ),
|
604 |
+
'value' => $is_sent,
|
605 |
+
);
|
606 |
+
}
|
607 |
+
|
608 |
+
if ( isset( $status['description'] ) ) {
|
609 |
+
$sub_entries[] = array(
|
610 |
+
'label' => __( 'Info', Forminator::DOMAIN ),
|
611 |
+
'value' => $status['description'],
|
612 |
+
);
|
613 |
+
}
|
614 |
+
|
615 |
+
if ( Forminator_Addon_Aweber::is_show_full_log() ) {
|
616 |
+
// too long to be added on entry data enable this with `define('FORMINATOR_ADDON_AWEBER_SHOW_FULL_LOG', true)`
|
617 |
+
if ( isset( $status['url_request'] ) ) {
|
618 |
+
$sub_entries[] = array(
|
619 |
+
'label' => __( 'API URL', Forminator::DOMAIN ),
|
620 |
+
'value' => $status['url_request'],
|
621 |
+
);
|
622 |
+
}
|
623 |
+
|
624 |
+
if ( isset( $status['data_sent'] ) ) {
|
625 |
+
$sub_entries[] = array(
|
626 |
+
'label' => __( 'Data sent to AWeber', Forminator::DOMAIN ),
|
627 |
+
'value' => '<pre class="sui-code-snippet">' . wp_json_encode( $status['data_sent'], JSON_PRETTY_PRINT ) . '</pre>',
|
628 |
+
);
|
629 |
+
}
|
630 |
+
|
631 |
+
if ( isset( $status['data_received'] ) ) {
|
632 |
+
$sub_entries[] = array(
|
633 |
+
'label' => __( 'Data received from AWeber', Forminator::DOMAIN ),
|
634 |
+
'value' => '<pre class="sui-code-snippet">' . wp_json_encode( $status['data_received'], JSON_PRETTY_PRINT ) . '</pre>',
|
635 |
+
);
|
636 |
+
}
|
637 |
+
}
|
638 |
+
|
639 |
+
$additional_entry_item['sub_entries'] = $sub_entries;
|
640 |
+
|
641 |
+
// return single array
|
642 |
+
return $additional_entry_item;
|
643 |
+
}
|
644 |
+
|
645 |
+
/**
|
646 |
+
* AWeber will add a column on the title/header row
|
647 |
+
* its called `AWeber Info` which can be translated on forminator lang
|
648 |
+
*
|
649 |
+
* @since 1.0 AWeber Addon
|
650 |
+
* @return array
|
651 |
+
*/
|
652 |
+
public function on_export_render_title_row() {
|
653 |
+
|
654 |
+
$export_headers = array(
|
655 |
+
'info' => __( 'AWeber Info', Forminator::DOMAIN ),
|
656 |
+
);
|
657 |
+
|
658 |
+
$quiz_id = $this->quiz_id;
|
659 |
+
$quiz_settings_instance = $this->quiz_settings_instance;
|
660 |
+
|
661 |
+
/**
|
662 |
+
* Filter AWeber headers on export file
|
663 |
+
*
|
664 |
+
* @since 1.3
|
665 |
+
*
|
666 |
+
* @param array $export_headers headers to be displayed on export file
|
667 |
+
* @param int $quiz_id current Quiz ID
|
668 |
+
* @param Forminator_Addon_Aweber_Quiz_Settings $quiz_settings_instance AWeber Addon Quiz Settings instance
|
669 |
+
*/
|
670 |
+
$export_headers = apply_filters(
|
671 |
+
'forminator_addon_aweber_export_headers',
|
672 |
+
$export_headers,
|
673 |
+
$quiz_id,
|
674 |
+
$quiz_settings_instance
|
675 |
+
);
|
676 |
+
|
677 |
+
return $export_headers;
|
678 |
+
}
|
679 |
+
|
680 |
+
/**
|
681 |
+
* AWeber will add a column that give user information whether sending data to AWeber successfully or not
|
682 |
+
* It will only add one column even its multiple connection, every connection will be separated by comma
|
683 |
+
*
|
684 |
+
* @since 1.0 AWeber Addon
|
685 |
+
*
|
686 |
+
* @param Forminator_Form_Entry_Model $entry_model
|
687 |
+
* @param $addon_meta_data
|
688 |
+
*
|
689 |
+
* @return array
|
690 |
+
*/
|
691 |
+
public function on_export_render_entry( Forminator_Form_Entry_Model $entry_model, $addon_meta_data ) {
|
692 |
+
|
693 |
+
$quiz_id = $this->quiz_id;
|
694 |
+
$quiz_settings_instance = $this->quiz_settings_instance;
|
695 |
+
|
696 |
+
/**
|
697 |
+
*
|
698 |
+
* Filter AWeber metadata that previously saved on db to be processed
|
699 |
+
*
|
700 |
+
* @since 1.3
|
701 |
+
*
|
702 |
+
* @param array $addon_meta_data
|
703 |
+
* @param int $quiz_id current Quiz ID
|
704 |
+
* @param Forminator_Addon_Aweber_Quiz_Settings $quiz_settings_instance AWeber Quiz Settings instance
|
705 |
+
*/
|
706 |
+
$addon_meta_data = apply_filters(
|
707 |
+
'forminator_addon_aweber_metadata',
|
708 |
+
$addon_meta_data,
|
709 |
+
$quiz_id,
|
710 |
+
$quiz_settings_instance
|
711 |
+
);
|
712 |
+
|
713 |
+
$export_columns = array(
|
714 |
+
'info' => $this->get_from_addon_meta_data( $addon_meta_data, 'description', '' ),
|
715 |
+
);
|
716 |
+
|
717 |
+
/**
|
718 |
+
* Filter AWeber columns to be displayed on export submissions
|
719 |
+
*
|
720 |
+
* @since 1.3
|
721 |
+
*
|
722 |
+
* @param array $export_columns column to be exported
|
723 |
+
* @param int $quiz_id current Quiz ID
|
724 |
+
* @param Forminator_Form_Entry_Model $entry_model Form Entry Model
|
725 |
+
* @param array $addon_meta_data meta data saved by addon on entry fields
|
726 |
+
* @param Forminator_Addon_Aweber_Quiz_Settings $quiz_settings_instance AWeber Addon Quiz Settings instance
|
727 |
+
*/
|
728 |
+
$export_columns = apply_filters(
|
729 |
+
'forminator_addon_aweber_export_columns',
|
730 |
+
$export_columns,
|
731 |
+
$quiz_id,
|
732 |
+
$entry_model,
|
733 |
+
$addon_meta_data,
|
734 |
+
$quiz_settings_instance
|
735 |
+
);
|
736 |
+
|
737 |
+
return $export_columns;
|
738 |
+
}
|
739 |
+
|
740 |
+
/**
|
741 |
+
* Get Addon meta data, will be recursive if meta data is multiple because of multiple connection added
|
742 |
+
*
|
743 |
+
* @since 1.0 AWeber Addon
|
744 |
+
*
|
745 |
+
* @param $addon_meta_data
|
746 |
+
* @param $key
|
747 |
+
* @param string $default
|
748 |
+
*
|
749 |
+
* @return string
|
750 |
+
*/
|
751 |
+
protected function get_from_addon_meta_data( $addon_meta_data, $key, $default = '' ) {
|
752 |
+
$addon_meta_datas = $addon_meta_data;
|
753 |
+
if ( ! isset( $addon_meta_data[0] ) || ! is_array( $addon_meta_data[0] ) ) {
|
754 |
+
return $default;
|
755 |
+
}
|
756 |
+
|
757 |
+
$addon_meta_data = $addon_meta_data[0];
|
758 |
+
|
759 |
+
// make sure its `status`, because we only add this
|
760 |
+
if ( 'status' !== $addon_meta_data['name'] ) {
|
761 |
+
if ( stripos( $addon_meta_data['name'], 'status-' ) === 0 ) {
|
762 |
+
$meta_data = array();
|
763 |
+
foreach ( $addon_meta_datas as $addon_meta_data ) {
|
764 |
+
// make it like single value so it will be processed like single meta data
|
765 |
+
$addon_meta_data['name'] = 'status';
|
766 |
+
|
767 |
+
// add it on an array for next recursive process
|
768 |
+
$meta_data[] = $this->get_from_addon_meta_data( array( $addon_meta_data ), $key, $default );
|
769 |
+
}
|
770 |
+
|
771 |
+
return implode( ', ', $meta_data );
|
772 |
+
}
|
773 |
+
|
774 |
+
return $default;
|
775 |
+
|
776 |
+
}
|
777 |
+
|
778 |
+
if ( ! isset( $addon_meta_data['value'] ) || ! is_array( $addon_meta_data['value'] ) ) {
|
779 |
+
return $default;
|
780 |
+
}
|
781 |
+
$status = $addon_meta_data['value'];
|
782 |
+
if ( isset( $status[ $key ] ) ) {
|
783 |
+
$connection_name = '';
|
784 |
+
if ( 'connection_name' !== $key ) {
|
785 |
+
if ( isset( $status['connection_name'] ) ) {
|
786 |
+
$connection_name = '[' . $status['connection_name'] . '] ';
|
787 |
+
}
|
788 |
+
}
|
789 |
+
|
790 |
+
return $connection_name . $status[ $key ];
|
791 |
+
}
|
792 |
+
|
793 |
+
return $default;
|
794 |
+
}
|
795 |
+
|
796 |
+
// /**
|
797 |
+
// * DELETE NOT SUPPORTED HERE, BECAUSE AWEBER API NOT RETURNING SUBSCRIBER ID ON CREATE SUBSCRIBER
|
798 |
+
// *
|
799 |
+
// * @param Forminator_Form_Entry_Model $entry_model
|
800 |
+
// * @param $addon_meta_data
|
801 |
+
// */
|
802 |
+
// public function on_before_delete_entry( Forminator_Form_Entry_Model $entry_model, $addon_meta_data ) {
|
803 |
+
// parent::on_before_delete_entry( $entry_model, $addon_meta_data );
|
804 |
+
// }
|
805 |
+
}
|
addons/pro/aweber/class-forminator-addon-aweber-quiz-settings-exception.php
ADDED
@@ -0,0 +1,68 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/**
|
4 |
+
* Class Forminator_Addon_Aweber_Quiz_Settings_Exception
|
5 |
+
* Wrapper of Form Settings Aweber Exception
|
6 |
+
*
|
7 |
+
* @since 1.0 Aweber Addon
|
8 |
+
*/
|
9 |
+
class Forminator_Addon_Aweber_Quiz_Settings_Exception extends Forminator_Addon_Aweber_Exception {
|
10 |
+
|
11 |
+
/**
|
12 |
+
* Holder of input exceptions
|
13 |
+
*
|
14 |
+
* @since 1.0 Aweber Addon
|
15 |
+
* @var array
|
16 |
+
*/
|
17 |
+
protected $input_exceptions = array();
|
18 |
+
|
19 |
+
/**
|
20 |
+
* Forminator_Addon_Aweber_Quiz_Settings_Exception constructor.
|
21 |
+
*
|
22 |
+
* Useful if input_id is needed for later.
|
23 |
+
* If no input_id needed, use @see Forminator_Addon_Aweber_Exception
|
24 |
+
*
|
25 |
+
* @since 1.0 Aweber 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 Aweber 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 Aweber 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 Aweber Addon
|
63 |
+
* @return bool
|
64 |
+
*/
|
65 |
+
public function input_exceptions_is_available() {
|
66 |
+
return count( $this->input_exceptions ) > 0;
|
67 |
+
}
|
68 |
+
}
|
addons/pro/aweber/class-forminator-addon-aweber-quiz-settings.php
ADDED
@@ -0,0 +1,723 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
require_once dirname( __FILE__ ) . '/class-forminator-addon-aweber-quiz-settings-exception.php';
|
4 |
+
|
5 |
+
/**
|
6 |
+
* Class Forminator_Addon_Aweber_Quiz_Settings
|
7 |
+
* Handle how quiz settings displayed and saved
|
8 |
+
*
|
9 |
+
* @since 1.0 Aweber Addon
|
10 |
+
*/
|
11 |
+
class Forminator_Addon_Aweber_Quiz_Settings extends Forminator_Addon_Quiz_Settings_Abstract {
|
12 |
+
|
13 |
+
/**
|
14 |
+
* @var Forminator_Addon_Aweber
|
15 |
+
* @since 1.0 Aweber Addon
|
16 |
+
*/
|
17 |
+
protected $addon;
|
18 |
+
|
19 |
+
/**
|
20 |
+
* Forminator_Addon_Aweber_Quiz_Settings constructor.
|
21 |
+
*
|
22 |
+
* @since 1.0 Aweber Addon
|
23 |
+
*
|
24 |
+
* @param Forminator_Addon_Abstract $addon
|
25 |
+
* @param $quiz_id
|
26 |
+
*
|
27 |
+
* @throws Forminator_Addon_Exception
|
28 |
+
*/
|
29 |
+
public function __construct( Forminator_Addon_Abstract $addon, $quiz_id ) {
|
30 |
+
parent::__construct( $addon, $quiz_id );
|
31 |
+
|
32 |
+
$this->_update_quiz_settings_error_message = __(
|
33 |
+
'The update to your settings for this quiz failed, check the quiz input and try again.',
|
34 |
+
Forminator::DOMAIN
|
35 |
+
);
|
36 |
+
}
|
37 |
+
|
38 |
+
/**
|
39 |
+
* Aweber Quiz Settings wizard
|
40 |
+
*
|
41 |
+
* @since 1.0 Aweber Addon
|
42 |
+
* @return array
|
43 |
+
*/
|
44 |
+
public function quiz_settings_wizards() {
|
45 |
+
// numerical array steps
|
46 |
+
return array(
|
47 |
+
array(
|
48 |
+
'callback' => array( $this, 'pick_name' ),
|
49 |
+
'is_completed' => array( $this, 'pick_name_is_completed' ),
|
50 |
+
),
|
51 |
+
array(
|
52 |
+
'callback' => array( $this, 'setup_list' ),
|
53 |
+
'is_completed' => array( $this, 'setup_list_is_completed' ),
|
54 |
+
),
|
55 |
+
array(
|
56 |
+
'callback' => array( $this, 'map_fields' ),
|
57 |
+
'is_completed' => array( $this, 'map_fields_is_completed' ),
|
58 |
+
),
|
59 |
+
array(
|
60 |
+
'callback' => array( $this, 'setup_options' ),
|
61 |
+
'is_completed' => array( $this, 'setup_options_is_completed' ),
|
62 |
+
),
|
63 |
+
);
|
64 |
+
}
|
65 |
+
|
66 |
+
/**
|
67 |
+
* Setup Connection Name
|
68 |
+
*
|
69 |
+
* @since 1.0 AWeber Addon
|
70 |
+
*
|
71 |
+
* @param $submitted_data
|
72 |
+
*
|
73 |
+
* @return array
|
74 |
+
*/
|
75 |
+
public function pick_name( $submitted_data ) {
|
76 |
+
$template = forminator_addon_aweber_dir() . 'views/quiz-settings/pick-name.php';
|
77 |
+
|
78 |
+
$multi_id = $this->generate_multi_id();
|
79 |
+
if ( isset( $submitted_data['multi_id'] ) ) {
|
80 |
+
$multi_id = $submitted_data['multi_id'];
|
81 |
+
}
|
82 |
+
|
83 |
+
$template_params = array(
|
84 |
+
'name' => $this->get_multi_id_quiz_settings_value( $multi_id, 'name', '' ),
|
85 |
+
'name_error' => '',
|
86 |
+
'multi_id' => $multi_id,
|
87 |
+
);
|
88 |
+
|
89 |
+
unset( $submitted_data['multi_id'] );
|
90 |
+
|
91 |
+
$is_submit = ! empty( $submitted_data );
|
92 |
+
$has_errors = false;
|
93 |
+
if ( $is_submit ) {
|
94 |
+
$name = isset( $submitted_data['name'] ) ? $submitted_data['name'] : '';
|
95 |
+
$template_params['name'] = $name;
|
96 |
+
|
97 |
+
try {
|
98 |
+
|
99 |
+
if ( empty( $name ) ) {
|
100 |
+
throw new Forminator_Addon_Aweber_Exception( __( 'Please pick valid name' ) );
|
101 |
+
}
|
102 |
+
|
103 |
+
$time_added = $this->get_multi_id_quiz_settings_value( $multi_id, 'time_added', time() );
|
104 |
+
$this->save_multi_id_quiz_setting_values(
|
105 |
+
$multi_id,
|
106 |
+
array(
|
107 |
+
'name' => $name,
|
108 |
+
'time_added' => $time_added,
|
109 |
+
)
|
110 |
+
);
|
111 |
+
|
112 |
+
} catch ( Forminator_Addon_Aweber_Exception $e ) {
|
113 |
+
$template_params['name_error'] = $e->getMessage();
|
114 |
+
$has_errors = true;
|
115 |
+
}
|
116 |
+
}
|
117 |
+
|
118 |
+
$buttons = array();
|
119 |
+
if ( $this->pick_name_is_completed( array( 'multi_id' => $multi_id ) ) ) {
|
120 |
+
$buttons['disconnect']['markup'] = Forminator_Addon_Abstract::get_button_markup(
|
121 |
+
esc_html__( 'Deactivate', Forminator::DOMAIN ),
|
122 |
+
'sui-button-ghost sui-tooltip sui-tooltip-top-center forminator-addon-form-disconnect',
|
123 |
+
esc_html__( 'Deactivate this AWeber Integration from this Quiz.', Forminator::DOMAIN )
|
124 |
+
);
|
125 |
+
}
|
126 |
+
|
127 |
+
$buttons['next']['markup'] = '<div class="sui-actions-right">' .
|
128 |
+
Forminator_Addon_Abstract::get_button_markup( esc_html__( 'Next', Forminator::DOMAIN ), 'forminator-addon-next' ) .
|
129 |
+
'</div>';
|
130 |
+
|
131 |
+
return array(
|
132 |
+
'html' => Forminator_Addon_Abstract::get_template( $template, $template_params ),
|
133 |
+
'buttons' => $buttons,
|
134 |
+
'redirect' => false,
|
135 |
+
'has_errors' => $has_errors,
|
136 |
+
);
|
137 |
+
}
|
138 |
+
|
139 |
+
/**
|
140 |
+
* Check if pick name step completed
|
141 |
+
*
|
142 |
+
* @since 1.0 AWeber Addon
|
143 |
+
*
|
144 |
+
* @param $submitted_data
|
145 |
+
*
|
146 |
+
* @return bool
|
147 |
+
*/
|
148 |
+
public function pick_name_is_completed( $submitted_data ) {
|
149 |
+
$multi_id = '';
|
150 |
+
if ( isset( $submitted_data['multi_id'] ) ) {
|
151 |
+
$multi_id = $submitted_data['multi_id'];
|
152 |
+
}
|
153 |
+
|
154 |
+
if ( empty( $multi_id ) ) {
|
155 |
+
return false;
|
156 |
+
}
|
157 |
+
|
158 |
+
$name = $this->get_multi_id_quiz_settings_value( $multi_id, 'name', '' );
|
159 |
+
|
160 |
+
if ( empty( $name ) ) {
|
161 |
+
return false;
|
162 |
+
}
|
163 |
+
|
164 |
+
return true;
|
165 |
+
}
|
166 |
+
|
167 |
+
/**
|
168 |
+
* Setup List
|
169 |
+
*
|
170 |
+
* @since 1.0 AWeber Addon
|
171 |
+
*
|
172 |
+
* @param $submitted_data
|
173 |
+
*
|
174 |
+
* @return array
|
175 |
+
*/
|
176 |
+
public function setup_list( $submitted_data ) {
|
177 |
+
$template = forminator_addon_aweber_dir() . 'views/quiz-settings/setup-list.php';
|
178 |
+
|
179 |
+
if ( ! isset( $submitted_data['multi_id'] ) ) {
|
180 |
+
return $this->get_force_closed_wizard( __( 'Please pick valid connection', Forminator::DOMAIN ) );
|
181 |
+
}
|
182 |
+
|
183 |
+
$multi_id = $submitted_data['multi_id'];
|
184 |
+
unset( $submitted_data['multi_id'] );
|
185 |
+
|
186 |
+
$template_params = array(
|
187 |
+
'list_id' => $this->get_multi_id_quiz_settings_value( $multi_id, 'list_id', '' ),
|
188 |
+
'list_name' => $this->get_multi_id_quiz_settings_value( $multi_id, 'list_name', '' ),
|
189 |
+
'list_id_error' => '',
|
190 |
+
'multi_id' => $multi_id,
|
191 |
+
'error_message' => '',
|
192 |
+
);
|
193 |
+
|
194 |
+
$is_submit = ! empty( $submitted_data );
|
195 |
+
$has_errors = false;
|
196 |
+
|
197 |
+
$lists = array();
|
198 |
+
|
199 |
+
try {
|
200 |
+
|
201 |
+
$api = $this->addon->get_api();
|
202 |
+
$lists_request = $api->get_account_lists( $this->addon->get_account_id() );
|
203 |
+
|
204 |
+
if ( ! is_object( $lists_request ) || ! isset( $lists_request->entries ) || ! is_array( $lists_request->entries ) || empty( $lists_request->entries ) ) {
|
205 |
+
throw new Forminator_Addon_Aweber_Exception( __( 'No lists found on your AWeber. Please create one.', Forminator::DOMAIN ) );
|
206 |
+
}
|
207 |
+
|
208 |
+
foreach ( $lists_request->entries as $entry ) {
|
209 |
+
$lists[ $entry->id ] = $entry->name;
|
210 |
+
}
|
211 |
+
|
212 |
+
$template_params['lists'] = $lists;
|
213 |
+
|
214 |
+
} catch ( Forminator_Addon_Aweber_Exception $e ) {
|
215 |
+
$template_params['error_message'] = $e->getMessage();
|
216 |
+
$has_errors = true;
|
217 |
+
}
|
218 |
+
|
219 |
+
if ( $is_submit ) {
|
220 |
+
$list_id = isset( $submitted_data['list_id'] ) ? $submitted_data['list_id'] : '';
|
221 |
+
$template_params['list_id'] = $list_id;
|
222 |
+
|
223 |
+
try {
|
224 |
+
|
225 |
+
if ( empty( $list_id ) ) {
|
226 |
+
throw new Forminator_Addon_Aweber_Exception( __( 'Please pick valid list' ) );
|
227 |
+
}
|
228 |
+
|
229 |
+
// phpcs:ignore WordPress.PHP.StrictInArray.MissingTrueStrict
|
230 |
+
if ( ! in_array( $list_id, array_keys( $lists ) ) ) {
|
231 |
+
throw new Forminator_Addon_Aweber_Exception( __( 'Please pick valid list' ) );
|
232 |
+
}
|
233 |
+
|
234 |
+
$list_name = $lists[ $list_id ];
|
235 |
+
|
236 |
+
$this->save_multi_id_quiz_setting_values(
|
237 |
+
$multi_id,
|
238 |
+
array(
|
239 |
+
'list_id' => $list_id,
|
240 |
+
'list_name' => $list_name,
|
241 |
+
)
|
242 |
+
);
|
243 |
+
|
244 |
+
} catch ( Forminator_Addon_Aweber_Exception $e ) {
|
245 |
+
$template_params['list_id_error'] = $e->getMessage();
|
246 |
+
$has_errors = true;
|
247 |
+
}
|
248 |
+
}
|
249 |
+
|
250 |
+
$buttons = array();
|
251 |
+
if ( $this->pick_name_is_completed( array( 'multi_id' => $multi_id ) ) ) {
|
252 |
+
$buttons['disconnect']['markup'] = Forminator_Addon_Abstract::get_button_markup(
|
253 |
+
esc_html__( 'Deactivate', Forminator::DOMAIN ),
|
254 |
+
'sui-button-ghost sui-tooltip sui-tooltip-top-center forminator-addon-form-disconnect',
|
255 |
+
esc_html__( 'Deactivate this AWeber Integration from this Quiz.', Forminator::DOMAIN )
|
256 |
+
);
|
257 |
+
}
|
258 |
+
|
259 |
+
$buttons['next']['markup'] = '<div class="sui-actions-right">' .
|
260 |
+
Forminator_Addon_Abstract::get_button_markup( esc_html__( 'Next', Forminator::DOMAIN ), 'forminator-addon-next' ) .
|
261 |
+
'</div>';
|
262 |
+
|
263 |
+
return array(
|
264 |
+
'html' => Forminator_Addon_Abstract::get_template( $template, $template_params ),
|
265 |
+
'buttons' => $buttons,
|
266 |
+
'redirect' => false,
|
267 |
+
'has_errors' => $has_errors,
|
268 |
+
'has_back' => true,
|
269 |
+
);
|
270 |
+
}
|
271 |
+
|
272 |
+
/**
|
273 |
+
* Check if setup list completed
|
274 |
+
*
|
275 |
+
* @since 1.0 AWeber Addon
|
276 |
+
*
|
277 |
+
* @param $submitted_data
|
278 |
+
*
|
279 |
+
* @return bool
|
280 |
+
*/
|
281 |
+
public function setup_list_is_completed( $submitted_data ) {
|
282 |
+
$multi_id = '';
|
283 |
+
if ( isset( $submitted_data['multi_id'] ) ) {
|
284 |
+
$multi_id = $submitted_data['multi_id'];
|
285 |
+
}
|
286 |
+
|
287 |
+
if ( empty( $multi_id ) ) {
|
288 |
+
return false;
|
289 |
+
}
|
290 |
+
|
291 |
+
$list_id = $this->get_multi_id_quiz_settings_value( $multi_id, 'list_id', '' );
|
292 |
+
|
293 |
+
if ( empty( $list_id ) ) {
|
294 |
+
return false;
|
295 |
+
}
|
296 |
+
|
297 |
+
return true;
|
298 |
+
}
|
299 |
+
|
300 |
+
/**
|
301 |
+
* Setup fields map
|
302 |
+
*
|
303 |
+
* @since 1.0 AWeber Addon
|
304 |
+
*
|
305 |
+
* @param $submitted_data
|
306 |
+
*
|
307 |
+
* @return array
|
308 |
+
*/
|
309 |
+
public function map_fields( $submitted_data ) {
|
310 |
+
$template = forminator_addon_aweber_dir() . 'views/quiz-settings/map-fields.php';
|
311 |
+
|
312 |
+
if ( ! isset( $submitted_data['multi_id'] ) ) {
|
313 |
+
return $this->get_force_closed_wizard( __( 'Please pick valid connection', Forminator::DOMAIN ) );
|
314 |
+
}
|
315 |
+
|
316 |
+
$multi_id = $submitted_data['multi_id'];
|
317 |
+
unset( $submitted_data['multi_id'] );
|
318 |
+
|
319 |
+
// find type of email
|
320 |
+
$email_fields = array();
|
321 |
+
$forminator_field_element_ids = array();
|
322 |
+
$forminator_quiz_element_ids = array();
|
323 |
+
foreach ( $this->form_fields as $form_field ) {
|
324 |
+
// collect element ids
|
325 |
+
$forminator_field_element_ids[] = $form_field['element_id'];
|
326 |
+
if ( 'email' === $form_field['type'] ) {
|
327 |
+
$email_fields[] = $form_field;
|
328 |
+
}
|
329 |
+
}
|
330 |
+
|
331 |
+
$quiz_questions = $this->get_quiz_fields();
|
332 |
+
$quiz_fields = array(
|
333 |
+
'quiz-name' => __( 'Quiz Name', Forminator::DOMAIN ),
|
334 |
+
);
|
335 |
+
foreach ( $quiz_questions as $quiz_question ) {
|
336 |
+
// collect element ids
|
337 |
+
$forminator_quiz_element_ids[] = $quiz_question['slug'];
|
338 |
+
$quiz_fields[ $quiz_question['slug'] ] = $quiz_question['title'];
|
339 |
+
}
|
340 |
+
if ( 'knowledge' === $this->quiz->quiz_type ) {
|
341 |
+
$quiz_fields['correct-answers'] = __( 'Correct Answers', Forminator::DOMAIN );
|
342 |
+
$quiz_fields['total-answers'] = __( 'Total Answers', Forminator::DOMAIN );
|
343 |
+
array_push( $forminator_quiz_element_ids,'quiz-name','correct-answers', 'total-answers' );
|
344 |
+
} elseif ( 'nowrong' === $this->quiz->quiz_type ) {
|
345 |
+
$quiz_fields['result-answers'] = __( 'Result Answer', Forminator::DOMAIN );
|
346 |
+
array_push( $forminator_quiz_element_ids,'quiz-name', 'result-answers' );
|
347 |
+
}
|
348 |
+
|
349 |
+
$forminator_field_element_ids = array_merge( $forminator_field_element_ids, $forminator_quiz_element_ids );
|
350 |
+
|
351 |
+
$template_params = array(
|
352 |
+
'fields_map' => $this->get_multi_id_quiz_settings_value( $multi_id, 'fields_map', array() ),
|
353 |
+
'multi_id' => $multi_id,
|
354 |
+
'error_message' => '',
|
355 |
+
'fields' => array(),
|
356 |
+
'quiz_fields' => $quiz_fields,
|
357 |
+
'form_fields' => $this->form_fields,
|
358 |
+
'email_fields' => $email_fields,
|
359 |
+
);
|
360 |
+
|
361 |
+
$is_submit = ! empty( $submitted_data );
|
362 |
+
$has_errors = false;
|
363 |
+
|
364 |
+
$fields = array(
|
365 |
+
'default_field_email' => __( 'Email Address', Forminator::DOMAIN ),
|
366 |
+
'default_field_name' => __( 'Name', Forminator::DOMAIN ),
|
367 |
+
);
|
368 |
+
|
369 |
+
$list_id = $this->get_multi_id_quiz_settings_value( $multi_id, 'list_id', 0 );
|
370 |
+
|
371 |
+
try {
|
372 |
+
|
373 |
+
$api = $this->addon->get_api();
|
374 |
+
$list_custom_fields_request = $api->get_account_list_custom_fields( $this->addon->get_account_id(), $list_id );
|
375 |
+
|
376 |
+
if ( ! is_object( $list_custom_fields_request ) || ! isset( $list_custom_fields_request->entries ) || ! is_array( $list_custom_fields_request->entries ) ) {
|
377 |
+
throw new Forminator_Addon_Aweber_Exception( __( 'Failed to get Custom Fields on the list.', Forminator::DOMAIN ) );
|
378 |
+
}
|
379 |
+
|
380 |
+
foreach ( $list_custom_fields_request->entries as $entry ) {
|
381 |
+
$fields[ $entry->id ] = $entry->name;
|
382 |
+
}
|
383 |
+
|
384 |
+
$template_params['fields'] = $fields;
|
385 |
+
|
386 |
+
} catch ( Forminator_Addon_Aweber_Exception $e ) {
|
387 |
+
$template_params['error_message'] = $e->getMessage();
|
388 |
+
$has_errors = true;
|
389 |
+
}
|
390 |
+
|
391 |
+
if ( $is_submit ) {
|
392 |
+
$fields_map = isset( $submitted_data['fields_map'] ) ? $submitted_data['fields_map'] : array();
|
393 |
+
$template_params['fields_map'] = $fields_map;
|
394 |
+
|
395 |
+
try {
|
396 |
+
if ( empty( $fields_map ) ) {
|
397 |
+
throw new Forminator_Addon_Aweber_Exception( __( 'Please assign fields.', Forminator::DOMAIN ) );
|
398 |
+
}
|
399 |
+
|
400 |
+
$input_exceptions = new Forminator_Addon_Aweber_Quiz_Settings_Exception();
|
401 |
+
if ( ! isset( $fields_map['default_field_email'] ) || empty( $fields_map['default_field_email'] ) ) {
|
402 |
+
$input_exceptions->add_input_exception( 'Please assign field for Email Address', 'default_field_email_error' );
|
403 |
+
}
|
404 |
+
|
405 |
+
$fields_map_to_save = array();
|
406 |
+
foreach ( $fields as $key => $title ) {
|
407 |
+
if ( isset( $fields_map[ $key ] ) && ! empty( $fields_map[ $key ] ) ) {
|
408 |
+
$element_id = $fields_map[ $key ];
|
409 |
+
if ( ! in_array( $element_id, $forminator_field_element_ids, true ) ) {
|
410 |
+
$input_exceptions->add_input_exception(/* translators: ... */
|
411 |
+
sprintf( __( 'Please assign valid field for %s', Forminator::DOMAIN ), $title ),
|
412 |
+
$key . '_error'
|
413 |
+
);
|
414 |
+
continue;
|
415 |
+
}
|
416 |
+
|
417 |
+
$fields_map_to_save[ $key ] = $fields_map[ $key ];
|
418 |
+
}
|
419 |
+
}
|
420 |
+
|
421 |
+
if ( $input_exceptions->input_exceptions_is_available() ) {
|
422 |
+
throw $input_exceptions;
|
423 |
+
}
|
424 |
+
|
425 |
+
$this->save_multi_id_quiz_setting_values(
|
426 |
+
$multi_id,
|
427 |
+
array(
|
428 |
+
'fields_map' => $fields_map,
|
429 |
+
'fields_mapper' => $fields,
|
430 |
+
)
|
431 |
+
);
|
432 |
+
|
433 |
+
} catch ( Forminator_Addon_Aweber_Quiz_Settings_Exception $e ) {
|
434 |
+
$template_params = array_merge( $template_params, $e->get_input_exceptions() );
|
435 |
+
$has_errors = true;
|
436 |
+
} catch ( Forminator_Addon_Aweber_Exception $e ) {
|
437 |
+
$template_params['error_message'] = $e->getMessage();
|
438 |
+
$has_errors = true;
|
439 |
+
}
|
440 |
+
}
|
441 |
+
|
442 |
+
$buttons = array();
|
443 |
+
if ( $this->pick_name_is_completed( array( 'multi_id' => $multi_id ) ) ) {
|
444 |
+
$buttons['disconnect']['markup'] = Forminator_Addon_Abstract::get_button_markup(
|
445 |
+
esc_html__( 'Deactivate', Forminator::DOMAIN ),
|
446 |
+
'sui-button-ghost sui-tooltip sui-tooltip-top-center forminator-addon-form-disconnect',
|
447 |
+
esc_html__( 'Deactivate this AWeber Integration from this Quiz.', Forminator::DOMAIN )
|
448 |
+
);
|
449 |
+
}
|
450 |
+
|
451 |
+
$buttons['next']['markup'] = '<div class="sui-actions-right">' .
|
452 |
+
Forminator_Addon_Abstract::get_button_markup( esc_html__( 'Next', Forminator::DOMAIN ), 'forminator-addon-next' ) .
|
453 |
+
'</div>';
|
454 |
+
|
455 |
+
return array(
|
456 |
+
'html' => Forminator_Addon_Abstract::get_template( $template, $template_params ),
|
457 |
+
'buttons' => $buttons,
|
458 |
+
'size' => 'normal',
|
459 |
+
'redirect' => false,
|
460 |
+
'has_errors' => $has_errors,
|
461 |
+
'has_back' => true,
|
462 |
+
);
|
463 |
+
}
|
464 |
+
|
465 |
+
/**
|
466 |
+
* Check if fields mapped
|
467 |
+
*
|
468 |
+
* @since 1.0 AWeber Addon
|
469 |
+
*
|
470 |
+
* @param $submitted_data
|
471 |
+
*
|
472 |
+
* @return bool
|
473 |
+
*/
|
474 |
+
public function map_fields_is_completed( $submitted_data ) {
|
475 |
+
$multi_id = '';
|
476 |
+
if ( isset( $submitted_data['multi_id'] ) ) {
|
477 |
+
$multi_id = $submitted_data['multi_id'];
|
478 |
+
}
|
479 |
+
|
480 |
+
if ( empty( $multi_id ) ) {
|
481 |
+
return false;
|
482 |
+
}
|
483 |
+
|
484 |
+
$fields_map = $this->get_multi_id_quiz_settings_value( $multi_id, 'fields_map', array() );
|
485 |
+
$fields_mapper = $this->get_multi_id_quiz_settings_value( $multi_id, 'fields_mapper', array() );
|
486 |
+
|
487 |
+
if ( empty( $fields_map ) || ! is_array( $fields_map ) || count( $fields_map ) < 1 ) {
|
488 |
+
return false;
|
489 |
+
}
|
490 |
+
if ( empty( $fields_mapper ) || ! is_array( $fields_mapper ) || count( $fields_mapper ) < 1 ) {
|
491 |
+
return false;
|
492 |
+
}
|
493 |
+
|
494 |
+
if ( ! isset( $fields_map['default_field_email'] ) || empty( $fields_map['default_field_email'] ) ) {
|
495 |
+
return false;
|
496 |
+
}
|
497 |
+
|
498 |
+
return true;
|
499 |
+
}
|
500 |
+
|
501 |
+
/**
|
502 |
+
* Setup options
|
503 |
+
*
|
504 |
+
* Contains :
|
505 |
+
* - ad_tracking
|
506 |
+
* - misc_notes
|
507 |
+
* - tags
|
508 |
+
*
|
509 |
+
* @since 1.0 Campaign Monitor Addon
|
510 |
+
*
|
511 |
+
* @param $submitted_data
|
512 |
+
*
|
513 |
+
* @return array
|
514 |
+
*/
|
515 |
+
public function setup_options( $submitted_data ) {
|
516 |
+
$template = forminator_addon_aweber_dir() . 'views/quiz-settings/setup-options.php';
|
517 |
+
|
518 |
+
if ( ! isset( $submitted_data['multi_id'] ) ) {
|
519 |
+
return $this->get_force_closed_wizard( __( 'Please pick valid connection', Forminator::DOMAIN ) );
|
520 |
+
}
|
521 |
+
|
522 |
+
$multi_id = $submitted_data['multi_id'];
|
523 |
+
unset( $submitted_data['multi_id'] );
|
524 |
+
|
525 |
+
$forminator_form_element_ids = array();
|
526 |
+
foreach ( $this->form_fields as $field ) {
|
527 |
+
$forminator_form_element_ids[ $field['element_id'] ] = $field;
|
528 |
+
}
|
529 |
+
|
530 |
+
$template_params = array(
|
531 |
+
'multi_id' => $multi_id,
|
532 |
+
'error_message' => '',
|
533 |
+
'ad_tracking' => $this->get_multi_id_quiz_settings_value( $multi_id, 'ad_tracking', 'FORMINATOR {quiz_name} {form_name}' ),
|
534 |
+
'fields' => $this->form_fields,
|
535 |
+
'tags_fields' => array(),
|
536 |
+
'tags_selected_fields' => array(),
|
537 |
+
);
|
538 |
+
|
539 |
+
$saved_tags = $this->get_multi_id_quiz_settings_value( $multi_id, 'tags', array() );
|
540 |
+
|
541 |
+
if ( isset( $submitted_data['tags'] ) && is_array( $submitted_data['tags'] ) ) {
|
542 |
+
$saved_tags = $submitted_data['tags'];
|
543 |
+
|
544 |
+
}
|
545 |
+
$tag_selected_fields = array();
|
546 |
+
foreach ( $saved_tags as $key => $saved_tag ) {
|
547 |
+
// using form data
|
548 |
+
if ( stripos( $saved_tag, '{' ) === 0
|
549 |
+
&& stripos( $saved_tag, '}' ) === ( strlen( $saved_tag ) - 1 )
|
550 |
+
) {
|
551 |
+
$element_id = str_ireplace( '{', '', $saved_tag );
|
552 |
+
$element_id = str_ireplace( '}', '', $element_id );
|
553 |
+
if ( in_array( $element_id, array_keys( $forminator_form_element_ids ), true ) ) {
|
554 |
+
$forminator_form_element_ids[ $element_id ]['field_label'] = $forminator_form_element_ids[ $element_id ]['field_label'] .
|
555 |
+
' | ' . $forminator_form_element_ids[ $element_id ]['element_id'];
|
556 |
+
$forminator_form_element_ids[ $element_id ]['element_id'] = '{' . $forminator_form_element_ids[ $element_id ]['element_id'] . '}';
|
557 |
+
|
558 |
+
$tag_selected_fields[] = $forminator_form_element_ids[ $element_id ];
|
559 |
+
// let this go, its already selected.
|
560 |
+
unset( $forminator_form_element_ids[ $element_id ] );
|
561 |
+
} else {
|
562 |
+
// no more exist on element ids let it go
|
563 |
+
unset( $saved_tags[ $key ] );
|
564 |
+
}
|
565 |
+
} else { // free form type
|
566 |
+
$tag_selected_fields[] = array(
|
567 |
+
'element_id' => $saved_tag,
|
568 |
+
'field_label' => $saved_tag,
|
569 |
+
);
|
570 |
+
}
|
571 |
+
}
|
572 |
+
|
573 |
+
$template_params['tags_fields'] = $forminator_form_element_ids;
|
574 |
+
$template_params['tags_selected_fields'] = $tag_selected_fields;
|
575 |
+
|
576 |
+
$is_submit = ! empty( $submitted_data );
|
577 |
+
$has_errors = false;
|
578 |
+
$notification = array();
|
579 |
+
$is_close = false;
|
580 |
+
|
581 |
+
if ( $is_submit ) {
|
582 |
+
$ad_tracking = isset( $submitted_data['ad_tracking'] ) ? $submitted_data['ad_tracking'] : '';
|
583 |
+
|
584 |
+
try {
|
585 |
+
|
586 |
+
$this->save_multi_id_quiz_setting_values(
|
587 |
+
$multi_id,
|
588 |
+
array(
|
589 |
+
'ad_tracking' => $ad_tracking,
|
590 |
+
'tags' => $saved_tags,
|
591 |
+
)
|
592 |
+
);
|
593 |
+
|
594 |
+
$notification = array(
|
595 |
+
'type' => 'success',
|
596 |
+
'text' => '<strong>' . $this->addon->get_title() . '</strong> ' . __( 'Successfully connected to your quiz' ),
|
597 |
+
);
|
598 |
+
$is_close = true;
|
599 |
+
|
600 |
+
} catch ( Forminator_Addon_Aweber_Quiz_Settings_Exception $e ) {
|
601 |
+
$template_params = array_merge( $template_params, $e->get_input_exceptions() );
|
602 |
+
$has_errors = true;
|
603 |
+
} catch ( Forminator_Addon_Aweber_Exception $e ) {
|
604 |
+
$template_params['error_message'] = $e->getMessage();
|
605 |
+
$has_errors = true;
|
606 |
+
}
|
607 |
+
}
|
608 |
+
|
609 |
+
$buttons = array();
|
610 |
+
if ( $this->pick_name_is_completed( array( 'multi_id' => $multi_id ) ) ) {
|
611 |
+
$buttons['disconnect']['markup'] = Forminator_Addon_Abstract::get_button_markup(
|
612 |
+
esc_html__( 'Deactivate', Forminator::DOMAIN ),
|
613 |
+
'sui-button-ghost sui-tooltip sui-tooltip-top-center forminator-addon-form-disconnect',
|
614 |
+
esc_html__( 'Deactivate this Campaign Monitor Integration from this Quiz.', Forminator::DOMAIN )
|
615 |
+
);
|
616 |
+
}
|
617 |
+
|
618 |
+
$buttons['next']['markup'] = '<div class="sui-actions-right">' .
|
619 |
+
Forminator_Addon_Abstract::get_button_markup( esc_html__( 'Save', Forminator::DOMAIN ), 'sui-button-primary forminator-addon-finish' ) .
|
620 |
+
'</div>';
|
621 |
+
|
622 |
+
return array(
|
623 |
+
'html' => Forminator_Addon_Abstract::get_template( $template, $template_params ),
|
624 |
+
'buttons' => $buttons,
|
625 |
+
'size' => 'normal',
|
626 |
+
'redirect' => false,
|
627 |
+
'has_errors' => $has_errors,
|
628 |
+
'has_back' => true,
|
629 |
+
'notification' => $notification,
|
630 |
+
'is_close' => $is_close,
|
631 |
+
);
|
632 |
+
}
|
633 |
+
|
634 |
+
/**
|
635 |
+
* Check if setup options completed
|
636 |
+
*
|
637 |
+
* @since 1.0 AWeber Addon
|
638 |
+
*
|
639 |
+
* @param $submitted_data
|
640 |
+
*
|
641 |
+
* @return bool
|
642 |
+
*/
|
643 |
+
public function setup_options_is_completed( $submitted_data ) {
|
644 |
+
// all settings here are optional, so it can be marked as completed
|
645 |
+
return true;
|
646 |
+
}
|
647 |
+
|
648 |
+
/**
|
649 |
+
* Check if multi_id quiz settings values completed
|
650 |
+
*
|
651 |
+
* @since 1.0 Aweber Added
|
652 |
+
*
|
653 |
+
* @param $multi_id
|
654 |
+
*
|
655 |
+
* @return bool
|
656 |
+
*/
|
657 |
+
public function is_multi_quiz_settings_complete( $multi_id ) {
|
658 |
+
$data = array( 'multi_id' => $multi_id );
|
659 |
+
|
660 |
+
if ( ! $this->pick_name_is_completed( $data ) ) {
|
661 |
+
return false;
|
662 |
+
}
|
663 |
+
if ( ! $this->setup_list_is_completed( $data ) ) {
|
664 |
+
return false;
|
665 |
+
}
|
666 |
+
|
667 |
+
if ( ! $this->map_fields_is_completed( $data ) ) {
|
668 |
+
return false;
|
669 |
+
}
|
670 |
+
|
671 |
+
if ( ! $this->setup_options_is_completed( $data ) ) {
|
672 |
+
return false;
|
673 |
+
}
|
674 |
+
|
675 |
+
return true;
|
676 |
+
}
|
677 |
+
|
678 |
+
/**
|
679 |
+
* Generate multi id for multiple connection
|
680 |
+
*
|
681 |
+
* @since 1.0 Aweber Addon
|
682 |
+
* @return string
|
683 |
+
*/
|
684 |
+
public function generate_multi_id() {
|
685 |
+
return uniqid( 'aweber_', true );
|
686 |
+
}
|
687 |
+
|
688 |
+
|
689 |
+
/**
|
690 |
+
* Override how multi connection displayed
|
691 |
+
*
|
692 |
+
* @since 1.0 Aweber Addon
|
693 |
+
* @return array
|
694 |
+
*/
|
695 |
+
public function get_multi_ids() {
|
696 |
+
$multi_ids = array();
|
697 |
+
foreach ( $this->get_quiz_settings_values() as $key => $value ) {
|
698 |
+
$multi_ids[] = array(
|
699 |
+
'id' => $key,
|
700 |
+
// use name that was added by user on creating connection
|
701 |
+
'label' => isset( $value['name'] ) ? $value['name'] : $key,
|
702 |
+
);
|
703 |
+
}
|
704 |
+
|
705 |
+
return $multi_ids;
|
706 |
+
}
|
707 |
+
|
708 |
+
/**
|
709 |
+
* Disconnect a connection from current quiz
|
710 |
+
*
|
711 |
+
* @since 1.0 Aweber Addon
|
712 |
+
*
|
713 |
+
* @param array $submitted_data
|
714 |
+
*/
|
715 |
+
public function disconnect_form( $submitted_data ) {
|
716 |
+
// only execute if multi_id provided on submitted data
|
717 |
+
if ( isset( $submitted_data['multi_id'] ) && ! empty( $submitted_data['multi_id'] ) ) {
|
718 |
+
$addon_form_settings = $this->get_quiz_settings_values();
|
719 |
+
unset( $addon_form_settings[ $submitted_data['multi_id'] ] );
|
720 |
+
$this->save_quiz_settings_values( $addon_form_settings );
|
721 |
+
}
|
722 |
+
}
|
723 |
+
}
|
addons/pro/aweber/class-forminator-addon-aweber.php
CHANGED
@@ -28,6 +28,9 @@ final class Forminator_Addon_Aweber extends Forminator_Addon_Abstract {
|
|
28 |
protected $_form_settings = 'Forminator_Addon_Aweber_Form_Settings';
|
29 |
protected $_form_hooks = 'Forminator_Addon_Aweber_Form_Hooks';
|
30 |
|
|
|
|
|
|
|
31 |
private $_app_id = 'd806984a';
|
32 |
|
33 |
/**
|
@@ -621,4 +624,114 @@ final class Forminator_Addon_Aweber extends Forminator_Addon_Abstract {
|
|
621 |
public function is_poll_connected( $poll_id ) {
|
622 |
return false;
|
623 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
624 |
}
|
28 |
protected $_form_settings = 'Forminator_Addon_Aweber_Form_Settings';
|
29 |
protected $_form_hooks = 'Forminator_Addon_Aweber_Form_Hooks';
|
30 |
|
31 |
+
protected $_quiz_settings = 'Forminator_Addon_Aweber_Quiz_Settings';
|
32 |
+
protected $_quiz_hooks = 'Forminator_Addon_Aweber_Quiz_Hooks';
|
33 |
+
|
34 |
private $_app_id = 'd806984a';
|
35 |
|
36 |
/**
|
624 |
public function is_poll_connected( $poll_id ) {
|
625 |
return false;
|
626 |
}
|
627 |
+
|
628 |
+
/**
|
629 |
+
* Check if Aweber is connected with current quiz
|
630 |
+
*
|
631 |
+
* @since 1.0 Aweber Addon
|
632 |
+
*
|
633 |
+
* @param $quiz_id
|
634 |
+
*
|
635 |
+
* @return bool
|
636 |
+
*/
|
637 |
+
public function is_quiz_connected( $quiz_id ) {
|
638 |
+
try {
|
639 |
+
$quiz_settings_instance = null;
|
640 |
+
if ( ! $this->is_connected() ) {
|
641 |
+
throw new Forminator_Addon_Aweber_Exception( __( ' AWeber is not connected', Forminator::DOMAIN ) );
|
642 |
+
}
|
643 |
+
|
644 |
+
$quiz_settings_instance = $this->get_addon_quiz_settings( $quiz_id );
|
645 |
+
if ( ! $quiz_settings_instance instanceof Forminator_Addon_Aweber_Quiz_Settings ) {
|
646 |
+
throw new Forminator_Addon_Aweber_Exception( __( 'Invalid Quiz Settings of AWeber', Forminator::DOMAIN ) );
|
647 |
+
}
|
648 |
+
|
649 |
+
// Mark as active when there is at least one active connection
|
650 |
+
if ( false === $quiz_settings_instance->find_one_active_connection() ) {
|
651 |
+
throw new Forminator_Addon_Aweber_Exception( __( 'No active AWeber connection found in this quiz', Forminator::DOMAIN ) );
|
652 |
+
}
|
653 |
+
|
654 |
+
$is_quiz_connected = true;
|
655 |
+
|
656 |
+
} catch ( Forminator_Addon_Aweber_Exception $e ) {
|
657 |
+
$is_quiz_connected = false;
|
658 |
+
}
|
659 |
+
|
660 |
+
/**
|
661 |
+
* Filter connected status of Aweber with the quiz
|
662 |
+
*
|
663 |
+
* @since 1.0
|
664 |
+
*
|
665 |
+
* @param bool $is_quiz_connected
|
666 |
+
* @param int $quiz_id Current Quiz ID
|
667 |
+
* @param Forminator_Addon_Aweber_Form_Settings|null $quiz_settings_instance Instance of quiz settings, or null when unavailable
|
668 |
+
*
|
669 |
+
*/
|
670 |
+
$is_quiz_connected = apply_filters( 'forminator_addon_aweber_is_form_connected', $is_quiz_connected, $quiz_id, $quiz_settings_instance );
|
671 |
+
|
672 |
+
return $is_quiz_connected;
|
673 |
+
}
|
674 |
+
|
675 |
+
/**
|
676 |
+
* Flag for check if has lead form addon connected to a quiz
|
677 |
+
* by default it will check if last step of form settings already completed by user
|
678 |
+
*
|
679 |
+
* @since 1.0 Aweber Addon
|
680 |
+
*
|
681 |
+
* @param $quiz_id
|
682 |
+
*
|
683 |
+
* @return bool
|
684 |
+
*/
|
685 |
+
public function is_quiz_lead_connected( $quiz_id ) {
|
686 |
+
|
687 |
+
try {
|
688 |
+
// initialize with null
|
689 |
+
$quiz_settings_instance = null;
|
690 |
+
if ( ! $this->is_connected() ) {
|
691 |
+
throw new Forminator_Addon_Aweber_Exception( __( ' AWeber is not connected', Forminator::DOMAIN ) );
|
692 |
+
}
|
693 |
+
|
694 |
+
$quiz_settings_instance = $this->get_addon_quiz_settings( $quiz_id );
|
695 |
+
if ( ! $quiz_settings_instance instanceof Forminator_Addon_Aweber_Quiz_Settings ) {
|
696 |
+
throw new Forminator_Addon_Aweber_Exception( __( 'Invalid Quiz Settings of AWeber', Forminator::DOMAIN ) );
|
697 |
+
}
|
698 |
+
|
699 |
+
$quiz_settings = $quiz_settings_instance->get_quiz_settings();
|
700 |
+
|
701 |
+
if ( isset( $quiz_settings['hasLeads'] ) && $quiz_settings['hasLeads'] ) {
|
702 |
+
$is_quiz_connected = true;
|
703 |
+
} else {
|
704 |
+
$is_quiz_connected = false;
|
705 |
+
}
|
706 |
+
} catch ( Forminator_Addon_Aweber_Exception $e ) {
|
707 |
+
$is_quiz_connected = false;
|
708 |
+
|
709 |
+
forminator_addon_maybe_log( __METHOD__, $e->getMessage() );
|
710 |
+
}
|
711 |
+
|
712 |
+
/**
|
713 |
+
* Filter connected status of Aweber with the form
|
714 |
+
*
|
715 |
+
* @since 1.1
|
716 |
+
*
|
717 |
+
* @param bool $is_quiz_connected
|
718 |
+
* @param int $quiz_id Current Quiz ID
|
719 |
+
* @param Forminator_Addon_Aweber_Quiz_Settings|null $quiz_settings_instance Instance of quiz settings, or null when unavailable
|
720 |
+
*
|
721 |
+
*/
|
722 |
+
$is_quiz_connected = apply_filters( 'forminator_addon_aweber_is_quiz_lead_connected', $is_quiz_connected, $quiz_id, $quiz_settings_instance );
|
723 |
+
|
724 |
+
return $is_quiz_connected;
|
725 |
+
|
726 |
+
}
|
727 |
+
|
728 |
+
/**
|
729 |
+
* Allow multiple connection on one quiz
|
730 |
+
*
|
731 |
+
* @since 1.6.1
|
732 |
+
* @return bool
|
733 |
+
*/
|
734 |
+
public function is_allow_multi_on_quiz() {
|
735 |
+
return true;
|
736 |
+
}
|
737 |
}
|
addons/pro/aweber/views/quiz-settings/map-fields.php
ADDED
@@ -0,0 +1,100 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
// Defaults
|
3 |
+
$vars = array(
|
4 |
+
'error_message' => '',
|
5 |
+
'multi_id' => '',
|
6 |
+
'fields_map' => array(),
|
7 |
+
'fields' => array(),
|
8 |
+
'form_fields' => array(),
|
9 |
+
'quiz_fields' => array(),
|
10 |
+
'email_fields' => array(),
|
11 |
+
);
|
12 |
+
|
13 |
+
/** @var array $template_vars */
|
14 |
+
foreach ( $template_vars as $key => $val ) {
|
15 |
+
$vars[ $key ] = $val;
|
16 |
+
} ?>
|
17 |
+
|
18 |
+
<div class="integration-header">
|
19 |
+
|
20 |
+
<h3 class="sui-box-title" id="dialogTitle2"><?php echo esc_html( __( 'Assign Fields', Forminator::DOMAIN ) ); ?></h3>
|
21 |
+
|
22 |
+
<p><?php esc_html_e( 'Match up your form fields with your AWeber fields to make sure we\'re sending data to the right place.', Forminator::DOMAIN ); ?></p>
|
23 |
+
|
24 |
+
<?php if ( ! empty( $vars['error_message'] ) ) : ?>
|
25 |
+
<span class="sui-notice sui-notice-error"><p><?php echo esc_html( $vars['error_message'] ); ?></p></span>
|
26 |
+
<?php endif; ?>
|
27 |
+
|
28 |
+
</div>
|
29 |
+
|
30 |
+
<form>
|
31 |
+
|
32 |
+
<table class="sui-table">
|
33 |
+
|
34 |
+
<thead>
|
35 |
+
|
36 |
+
<tr>
|
37 |
+
<th><?php esc_html_e( 'AWeber Field', Forminator::DOMAIN ); ?></th>
|
38 |
+
<th><?php esc_html_e( 'Forminator Field', Forminator::DOMAIN ); ?></th>
|
39 |
+
</tr>
|
40 |
+
|
41 |
+
</thead>
|
42 |
+
|
43 |
+
<tbody>
|
44 |
+
|
45 |
+
<?php foreach ( $vars['fields'] as $key => $field_title ) : ?>
|
46 |
+
<tr>
|
47 |
+
<td>
|
48 |
+
<?php echo esc_html( $field_title ); ?>
|
49 |
+
<?php if ( 'default_field_email' === $key ) : ?>
|
50 |
+
<span class="integrations-required-field">*</span>
|
51 |
+
<?php endif; ?>
|
52 |
+
</td>
|
53 |
+
<td>
|
54 |
+
<?php
|
55 |
+
$forminator_fields = $vars['form_fields'];
|
56 |
+
if ( 'default_field_email' === $key ) {
|
57 |
+
$forminator_fields = $vars['email_fields'];
|
58 |
+
}
|
59 |
+
$current_error = '';
|
60 |
+
$current_selected = '';
|
61 |
+
if ( isset( $vars[ $key . '_error' ] ) && ! empty( $vars[ $key . '_error' ] ) ) {
|
62 |
+
$current_error = $vars[ $key . '_error' ];
|
63 |
+
}
|
64 |
+
if ( isset( $vars['fields_map'][ $key ] ) && ! empty( $vars['fields_map'][ $key ] ) ) {
|
65 |
+
$current_selected = $vars['fields_map'][ $key ];
|
66 |
+
}
|
67 |
+
?>
|
68 |
+
<div class="sui-form-field <?php echo esc_attr( ! empty( $current_error ) ? 'sui-form-field-error' : '' ); ?>">
|
69 |
+
<select class="sui-select" name="fields_map[<?php echo esc_attr( $key ); ?>]">
|
70 |
+
<option value=""><?php esc_html_e( 'Please Select A Field', Forminator::DOMAIN ); ?></option>
|
71 |
+
<?php foreach ( $forminator_fields as $forminator_field ) : ?>
|
72 |
+
<option value="<?php echo esc_attr( $forminator_field['element_id'] ); ?>"
|
73 |
+
<?php selected( $current_selected, $forminator_field['element_id'] ); ?>>
|
74 |
+
<?php echo esc_html( $forminator_field['field_label'] . ' | ' . $forminator_field['element_id'] ); ?>
|
75 |
+
</option>
|
76 |
+
<?php endforeach; ?>
|
77 |
+
<?php if ( 'default_field_email' !== $key ) {
|
78 |
+
foreach ( $vars['quiz_fields'] as $quiz_key => $quiz_field ) : ?>
|
79 |
+
<option value="<?php echo esc_attr( $quiz_key ); ?>"
|
80 |
+
<?php selected( $current_selected, $quiz_key ); ?>>
|
81 |
+
<?php echo esc_html( $quiz_field . ' | ' . $quiz_key ); ?>
|
82 |
+
</option>
|
83 |
+
<?php endforeach;
|
84 |
+
} ?>
|
85 |
+
</select>
|
86 |
+
<?php if ( ! empty( $current_error ) ) : ?>
|
87 |
+
<span class="sui-error-message"><?php echo esc_html( $current_error ); ?></span>
|
88 |
+
<?php endif; ?>
|
89 |
+
</div>
|
90 |
+
</td>
|
91 |
+
</tr>
|
92 |
+
<?php endforeach; ?>
|
93 |
+
|
94 |
+
</tbody>
|
95 |
+
|
96 |
+
</table>
|
97 |
+
|
98 |
+
<input type="hidden" name="multi_id" value="<?php echo esc_attr( $vars['multi_id'] ); ?>">
|
99 |
+
|
100 |
+
</form>
|
addons/pro/aweber/views/quiz-settings/pick-name.php
ADDED
@@ -0,0 +1,34 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
// defaults
|
3 |
+
$vars = array(
|
4 |
+
'error_message' => '',
|
5 |
+
'name' => '',
|
6 |
+
'name_error' => '',
|
7 |
+
'multi_id' => '',
|
8 |
+
);
|
9 |
+
/** @var array $template_vars */
|
10 |
+
foreach ( $template_vars as $key => $val ) {
|
11 |
+
$vars[ $key ] = $val;
|
12 |
+
}
|
13 |
+
|
14 |
+
?>
|
15 |
+
<div class="integration-header">
|
16 |
+
<h3 class="sui-box-title" id="dialogTitle2"><?php echo esc_html( __( 'Setup Name', Forminator::DOMAIN ) ); ?></h3>
|
17 |
+
<p><?php esc_html_e( 'Setup friendly name for this integration, so it will be easily identified by you.', Forminator::DOMAIN ); ?></p>
|
18 |
+
<?php if ( ! empty( $vars['error_message'] ) ) : ?>
|
19 |
+
<span class="sui-notice sui-notice-error"><p><?php echo esc_html( $vars['error_message'] ); ?></p></span>
|
20 |
+
<?php endif; ?>
|
21 |
+
</div>
|
22 |
+
<form>
|
23 |
+
<div class="sui-form-field <?php echo esc_attr( ! empty( $vars['name_error'] ) ? 'sui-form-field-error' : '' ); ?>">
|
24 |
+
<label class="sui-label"><?php esc_html_e( 'Name', Forminator::DOMAIN ); ?></label>
|
25 |
+
<input
|
26 |
+
class="sui-form-control"
|
27 |
+
name="name" placeholder="<?php echo esc_attr( __( 'Friendly Name', Forminator::DOMAIN ) ); ?>"
|
28 |
+
value="<?php echo esc_attr( $vars['name'] ); ?>">
|
29 |
+
<?php if ( ! empty( $vars['name_error'] ) ) : ?>
|
30 |
+
<span class="sui-error-message"><?php echo esc_html( $vars['name_error'] ); ?></span>
|
31 |
+
<?php endif; ?>
|
32 |
+
</div>
|
33 |
+
<input type="hidden" name="multi_id" value="<?php echo esc_attr( $vars['multi_id'] ); ?>">
|
34 |
+
</form>
|
addons/pro/aweber/views/quiz-settings/setup-list.php
ADDED
@@ -0,0 +1,54 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
// defaults
|
3 |
+
$vars = array(
|
4 |
+
'error_message' => '',
|
5 |
+
'list_id' => '',
|
6 |
+
'list_id_error' => '',
|
7 |
+
'multi_id' => '',
|
8 |
+
'lists' => array(),
|
9 |
+
);
|
10 |
+
/** @var array $template_vars */
|
11 |
+
foreach ( $template_vars as $key => $val ) {
|
12 |
+
$vars[ $key ] = $val;
|
13 |
+
}
|
14 |
+
|
15 |
+
?>
|
16 |
+
<div class="integration-header">
|
17 |
+
|
18 |
+
<h3 class="sui-box-title" id="dialogTitle2"><?php echo esc_html( __( 'Choose List', Forminator::DOMAIN ) ); ?></h3>
|
19 |
+
|
20 |
+
<span class="sui-description" style="margin-top: 20px;"><?php esc_html_e( 'Pick AWeber List for new subscriber to be added to.', Forminator::DOMAIN ); ?></span>
|
21 |
+
|
22 |
+
<?php if ( ! empty( $vars['error_message'] ) ) : ?>
|
23 |
+
<div class="sui-notice sui-notice-error">
|
24 |
+
<p><?php echo esc_html( $vars['error_message'] ); ?></p>
|
25 |
+
</div>
|
26 |
+
<?php endif; ?>
|
27 |
+
|
28 |
+
</div>
|
29 |
+
|
30 |
+
<form>
|
31 |
+
|
32 |
+
<div class="sui-form-field<?php echo esc_attr( ! empty( $vars['list_id_error'] ) ? ' sui-form-field-error' : '' ); ?>">
|
33 |
+
|
34 |
+
<label class="sui-label" for="aweber-list-id"><?php esc_html_e( 'List', Forminator::DOMAIN ); ?></label>
|
35 |
+
|
36 |
+
<select name="list_id" class="sui-select sui-form-control" id="aweber-list-id">
|
37 |
+
<option value=""><?php esc_html_e( 'Please select a list', Forminator::DOMAIN ); ?></option>
|
38 |
+
<?php foreach ( $vars['lists'] as $list_id => $list_name ) : ?>
|
39 |
+
<option value="<?php echo esc_attr( $list_id ); ?>"
|
40 |
+
<?php selected( $vars['list_id'], $list_id ); ?>>
|
41 |
+
<?php echo esc_html( $list_name ); ?>
|
42 |
+
</option>
|
43 |
+
<?php endforeach; ?>
|
44 |
+
</select>
|
45 |
+
|
46 |
+
<?php if ( ! empty( $vars['list_id_error'] ) ) : ?>
|
47 |
+
<span class="sui-error-message"><?php echo esc_html( $vars['list_id_error'] ); ?></span>
|
48 |
+
<?php endif; ?>
|
49 |
+
|
50 |
+
</div>
|
51 |
+
|
52 |
+
<input type="hidden" name="multi_id" value="<?php echo esc_attr( $vars['multi_id'] ); ?>">
|
53 |
+
|
54 |
+
</form>
|
addons/pro/aweber/views/quiz-settings/setup-options.php
ADDED
@@ -0,0 +1,105 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
// defaults
|
3 |
+
$vars = array(
|
4 |
+
'error_message' => '',
|
5 |
+
'multi_id' => '',
|
6 |
+
'ad_tracking' => '',
|
7 |
+
'ad_tracking_error' => '',
|
8 |
+
'tags_fields' => array(),
|
9 |
+
'tags_selected_fields' => array(),
|
10 |
+
'fields' => array(),
|
11 |
+
'tags_error' => '',
|
12 |
+
);
|
13 |
+
/** @var array $template_vars */
|
14 |
+
foreach ( $template_vars as $key => $val ) {
|
15 |
+
$vars[ $key ] = $val;
|
16 |
+
}
|
17 |
+
|
18 |
+
?>
|
19 |
+
<div class="integration-header">
|
20 |
+
|
21 |
+
<h3 class="sui-box-title" id="dialogTitle2"><?php echo esc_html( __( 'Additional Options', Forminator::DOMAIN ) ); ?></h3>
|
22 |
+
|
23 |
+
<span class="sui-description" style="margin-top: 20px;"><?php esc_html_e( 'Configure additional options for AWeber integration.', Forminator::DOMAIN ); ?></span>
|
24 |
+
|
25 |
+
<?php if ( ! empty( $vars['error_message'] ) ) : ?>
|
26 |
+
<div class="sui-notice sui-notice-error">
|
27 |
+
<p><?php echo esc_html( $vars['error_message'] ); ?></p>
|
28 |
+
</div>
|
29 |
+
<?php endif; ?>
|
30 |
+
|
31 |
+
</div>
|
32 |
+
|
33 |
+
<form>
|
34 |
+
|
35 |
+
<div class="sui-form-field<?php echo esc_attr( ! empty( $vars['ad_tracking_error'] ) ? ' sui-form-field-error' : '' ); ?>">
|
36 |
+
|
37 |
+
<label class="sui-label"><?php esc_html_e( 'Ad Tracking', Forminator::DOMAIN ); ?></label>
|
38 |
+
|
39 |
+
<div class="sui-insert-variables">
|
40 |
+
|
41 |
+
<input name="ad_tracking"
|
42 |
+
placeholder="<?php echo esc_attr( __( 'Ad Tracking', Forminator::DOMAIN ) ); ?>"
|
43 |
+
value="<?php echo esc_attr( $vars['ad_tracking'] ); ?>"
|
44 |
+
id="ad_tracking"
|
45 |
+
class="sui-form-control" />
|
46 |
+
|
47 |
+
<select data-textarea-id="ad_tracking">
|
48 |
+
|
49 |
+
<?php foreach ( $vars['fields'] as $field ) : ?>
|
50 |
+
<option value="{<?php echo esc_attr( $field['element_id'] ); ?>}"
|
51 |
+
data-content="{<?php echo esc_attr( $field['element_id'] ); ?>}">
|
52 |
+
<?php echo esc_html( $field['field_label'] ); ?>
|
53 |
+
</option>
|
54 |
+
<?php endforeach; ?>
|
55 |
+
|
56 |
+
</select>
|
57 |
+
|
58 |
+
</div>
|
59 |
+
|
60 |
+
<?php if ( ! empty( $vars['ad_tracking_error'] ) ) : ?>
|
61 |
+
<span class="sui-error-message"><?php echo esc_html( $vars['ad_tracking_error'] ); ?></span>
|
62 |
+
<?php endif; ?>
|
63 |
+
|
64 |
+
<span class="sui-description"><?php echo ( sprintf( __( 'Use 20 or fewer characters to label subscribers based on how they signed up. Find complete article %1$shere%2$s.', Forminator::DOMAIN ), '<a href="https://help.aweber.com/hc/en-us/articles/204028836-What-is-Ad-Tracking-" target="_blank">', '</a>' ) ); // phpcs:ignore ?></span>
|
65 |
+
|
66 |
+
</div>
|
67 |
+
|
68 |
+
<div class="sui-form-field <?php echo esc_attr( ! empty( $vars['tags_error'] ) ? 'sui-form-field-error' : '' ); ?>">
|
69 |
+
|
70 |
+
<label class="sui-label" for="tags"><?php esc_html_e( 'Tags', Forminator::DOMAIN ); ?></label>
|
71 |
+
|
72 |
+
<select class="sui-select fui-multi-select" name="tags[]" id="tags"
|
73 |
+
multiple="multiple"
|
74 |
+
data-reorder="1"
|
75 |
+
data-tags="true"
|
76 |
+
data-token-separators="[',']"
|
77 |
+
data-placeholder=""
|
78 |
+
data-allow-clear="false">
|
79 |
+
|
80 |
+
<?php foreach ( $vars['tags_selected_fields'] as $forminator_field ) : ?>
|
81 |
+
<option value="<?php echo esc_attr( $forminator_field['element_id'] ); ?>"
|
82 |
+
selected="selected">
|
83 |
+
<?php echo esc_html( $forminator_field['field_label'] ); ?>
|
84 |
+
</option>
|
85 |
+
<?php endforeach; ?>
|
86 |
+
|
87 |
+
<?php foreach ( $vars['tags_fields'] as $forminator_field ) : ?>
|
88 |
+
<option value="{<?php echo esc_attr( $forminator_field['element_id'] ); ?>}">
|
89 |
+
<?php echo esc_html( $forminator_field['field_label'] . ' | ' . $forminator_field['element_id'] ); ?>
|
90 |
+
</option>
|
91 |
+
<?php endforeach; ?>
|
92 |
+
|
93 |
+
</select>
|
94 |
+
|
95 |
+
<?php if ( ! empty( $vars['tags_error'] ) ) : ?>
|
96 |
+
<span class="sui-error-message"><?php echo esc_html( $vars['tags_error'] ); ?></span>
|
97 |
+
<?php endif; ?>
|
98 |
+
|
99 |
+
<span class="sui-description"><?php echo ( sprintf( __( 'Available fields value or free text can be used as tags. Have a campaign that’s triggered when a subscriber is tagged? Enter the appropriate tag to add the subscriber to the campaign, and they will immediately begin receiving your messages. More info about AWeber subscriber tags can be found %1$shere%2$s.', Forminator::DOMAIN ), '<a href="https://help.aweber.com/hc/en-us/articles/212677877-How-do-I-use-Tags-with-Campaigns-" target="_blank">', '</a>' ) ); // phpcs:ignore ?></span>
|
100 |
+
|
101 |
+
</div>
|
102 |
+
|
103 |
+
<input type="hidden" name="multi_id" value="<?php echo esc_attr( $vars['multi_id'] ); ?>">
|
104 |
+
|
105 |
+
</form>
|
addons/pro/campaignmonitor/campaignmonitor.php
CHANGED
@@ -26,5 +26,8 @@ function forminator_addon_campaignmonitor_assets_url() {
|
|
26 |
require_once dirname( __FILE__ ) . '/class-forminator-addon-campaignmonitor.php';
|
27 |
require_once dirname( __FILE__ ) . '/class-forminator-addon-campaignmonitor-form-settings.php';
|
28 |
require_once dirname( __FILE__ ) . '/class-forminator-addon-campaignmonitor-form-hooks.php';
|
|
|
|
|
|
|
29 |
//Direct Load
|
30 |
Forminator_Addon_Loader::get_instance()->register( 'Forminator_Addon_Campaignmonitor' );
|
26 |
require_once dirname( __FILE__ ) . '/class-forminator-addon-campaignmonitor.php';
|
27 |
require_once dirname( __FILE__ ) . '/class-forminator-addon-campaignmonitor-form-settings.php';
|
28 |
require_once dirname( __FILE__ ) . '/class-forminator-addon-campaignmonitor-form-hooks.php';
|
29 |
+
|
30 |
+
require_once dirname( __FILE__ ) . '/class-forminator-addon-campaignmonitor-quiz-settings.php';
|
31 |
+
require_once dirname( __FILE__ ) . '/class-forminator-addon-campaignmonitor-quiz-hooks.php';
|
32 |
//Direct Load
|
33 |
Forminator_Addon_Loader::get_instance()->register( 'Forminator_Addon_Campaignmonitor' );
|
addons/pro/campaignmonitor/class-forminator-addon-campaignmonitor-quiz-hooks.php
ADDED
@@ -0,0 +1,710 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/**
|
4 |
+
* Class Forminator_Addon_Campaignmonitor_Quiz_Hooks
|
5 |
+
*
|
6 |
+
* @since 1.0 Campaignmonitor Addon
|
7 |
+
*
|
8 |
+
*/
|
9 |
+
class Forminator_Addon_Campaignmonitor_Quiz_Hooks extends Forminator_Addon_Quiz_Hooks_Abstract {
|
10 |
+
|
11 |
+
/**
|
12 |
+
* Addon instance are auto available quiz abstract
|
13 |
+
* Its added here for development purpose,
|
14 |
+
* Auto-complete will resolve addon directly to `Campaignmonitor` instance instead of the abstract
|
15 |
+
* And its public properties can be exposed
|
16 |
+
*
|
17 |
+
* @since 1.0 Campaignmonitor Addon
|
18 |
+
* @var Forminator_Addon_Campaignmonitor
|
19 |
+
*/
|
20 |
+
protected $addon;
|
21 |
+
|
22 |
+
/**
|
23 |
+
* Quiz Settings Instance
|
24 |
+
*
|
25 |
+
* @since 1.0 Campaignmonitor Addon
|
26 |
+
* @var Forminator_Addon_Campaignmonitor_Quiz_Settings | null
|
27 |
+
*/
|
28 |
+
protected $quiz_settings_instance;
|
29 |
+
|
30 |
+
/**
|
31 |
+
* Forminator_Addon_Campaignmonitor_Quiz_Hooks constructor.
|
32 |
+
*
|
33 |
+
* @since 1.0 Campaignmonitor Addon
|
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 = __( 'Campaign Monitor failed to process submitted data. Please check your quiz and try again', Forminator::DOMAIN );
|
43 |
+
}
|
44 |
+
|
45 |
+
/**
|
46 |
+
* Save status of request sent and received for each connected Campaign Monitor Connection
|
47 |
+
*
|
48 |
+
* @since 1.0 Campaign Monitor Addon
|
49 |
+
* @since 1.7 Add $form_entry_fields arg
|
50 |
+
*
|
51 |
+
* @param array $submitted_data
|
52 |
+
* @param array $form_entry_fields
|
53 |
+
*
|
54 |
+
* @return array
|
55 |
+
*/
|
56 |
+
public function add_entry_fields( $submitted_data, $form_entry_fields = array() ) {
|
57 |
+
|
58 |
+
$quiz_id = $this->quiz_id;
|
59 |
+
$quiz_settings_instance = $this->quiz_settings_instance;
|
60 |
+
|
61 |
+
/**
|
62 |
+
* Filter Campaign Monitor submitted quiz data to be processed
|
63 |
+
*
|
64 |
+
* @since 1.3
|
65 |
+
*
|
66 |
+
* @param array $submitted_data
|
67 |
+
* @param int $quiz_id current Quiz ID
|
68 |
+
* @param Forminator_Addon_Campaignmonitor_Quiz_Settings $quiz_settings_instance Campaign Monitor Addon Quiz Settings instance
|
69 |
+
*/
|
70 |
+
$submitted_data = apply_filters(
|
71 |
+
'forminator_addon_campaignmonitor_quiz_submitted_data',
|
72 |
+
$submitted_data,
|
73 |
+
$quiz_id,
|
74 |
+
$quiz_settings_instance
|
75 |
+
);
|
76 |
+
|
77 |
+
forminator_addon_maybe_log( __METHOD__, $submitted_data );
|
78 |
+
|
79 |
+
$quiz_submitted_data = get_quiz_submitted_data( $this->quiz, $submitted_data, $form_entry_fields );
|
80 |
+
|
81 |
+
$addon_setting_values = $this->quiz_settings_instance->get_quiz_settings_values();
|
82 |
+
$quiz_settings = $this->quiz_settings_instance->get_quiz_settings();
|
83 |
+
$addons_fields = $this->quiz_settings_instance->get_form_fields();
|
84 |
+
|
85 |
+
$form_entry_fields = forminator_lead_form_data( $submitted_data );
|
86 |
+
$submitted_data = get_addons_lead_form_entry_data( $quiz_settings, $submitted_data, $addons_fields );
|
87 |
+
$submitted_data = array_merge( $submitted_data, $quiz_submitted_data );
|
88 |
+
|
89 |
+
$data = array();
|
90 |
+
|
91 |
+
/**
|
92 |
+
* Fires before adding subscriber to Campaign Monitor
|
93 |
+
*
|
94 |
+
* @since 1.3
|
95 |
+
*
|
96 |
+
* @param int $quiz_id current Quiz ID
|
97 |
+
* @param array $submitted_data
|
98 |
+
* @param Forminator_Addon_Campaignmonitor_Quiz_Settings $quiz_settings_instance Campaign Monitor Addon Quiz Settings instance
|
99 |
+
*/
|
100 |
+
do_action( 'forminator_addon_campaignmonitor_before_add_subscriber', $quiz_id, $submitted_data, $quiz_settings_instance );
|
101 |
+
|
102 |
+
foreach ( $addon_setting_values as $key => $addon_setting_value ) {
|
103 |
+
// save it on entry field, with name `status-$MULTI_ID`, and value is the return result on sending data to campaign monitor
|
104 |
+
if ( $quiz_settings_instance->is_multi_quiz_settings_complete( $key ) ) {
|
105 |
+
// exec only on completed connection
|
106 |
+
$data[] = array(
|
107 |
+
'name' => 'status-' . $key,
|
108 |
+
'value' => $this->get_status_on_add_subscriber( $key, $submitted_data, $addon_setting_value, $quiz_settings, $form_entry_fields ),
|
109 |
+
);
|
110 |
+
}
|
111 |
+
}
|
112 |
+
|
113 |
+
$entry_fields = $data;
|
114 |
+
/**
|
115 |
+
* Filter Campaign Monitor entry fields to be saved to entry model
|
116 |
+
*
|
117 |
+
* @since 1.3
|
118 |
+
*
|
119 |
+
* @param array $entry_fields
|
120 |
+
* @param int $quiz_id current Quiz ID
|
121 |
+
* @param array $submitted_data
|
122 |
+
* @param Forminator_Addon_Campaignmonitor_Quiz_Settings $quiz_settings_instance Campaign Monitor Addon Quiz Settings instance
|
123 |
+
*/
|
124 |
+
$data = apply_filters(
|
125 |
+
'forminator_addon_campaignmonitor_entry_fields',
|
126 |
+
$entry_fields,
|
127 |
+
$quiz_id,
|
128 |
+
$submitted_data,
|
129 |
+
$quiz_settings_instance
|
130 |
+
);
|
131 |
+
|
132 |
+
return $data;
|
133 |
+
|
134 |
+
}
|
135 |
+
|
136 |
+
/**
|
137 |
+
* Get status on add subscriber to Campaign Monitor
|
138 |
+
*
|
139 |
+
* @since 1.0 Campaign Monitor Addon
|
140 |
+
* @since 1.7 Add $form_entry_fields args
|
141 |
+
*
|
142 |
+
* @param $connection_id
|
143 |
+
* @param $submitted_data
|
144 |
+
* @param $connection_settings
|
145 |
+
* @param $quiz_settings
|
146 |
+
* @param array $form_entry_fields
|
147 |
+
*
|
148 |
+
* @return array `is_sent` true means its success send data to ampaign Monitor, false otherwise
|
149 |
+
*/
|
150 |
+
private function get_status_on_add_subscriber( $connection_id, $submitted_data, $connection_settings, $quiz_settings, $form_entry_fields = array() ) {
|
151 |
+
// initialize as null
|
152 |
+
$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 |
+
$api = $this->addon->get_api();
|
160 |
+
$args = array();
|
161 |
+
|
162 |
+
if ( ! isset( $connection_settings['list_id'] ) ) {
|
163 |
+
throw new Forminator_Addon_Campaignmonitor_Exception( __( 'List ID not properly setup.', Forminator::DOMAIN ) );
|
164 |
+
}
|
165 |
+
|
166 |
+
$list_id = $connection_settings['list_id'];
|
167 |
+
|
168 |
+
$fields_map = $connection_settings['fields_map'];
|
169 |
+
|
170 |
+
$email_element_id = $connection_settings['fields_map']['default_field_email'];
|
171 |
+
if ( ! isset( $submitted_data[ $email_element_id ] ) || empty( $submitted_data[ $email_element_id ] ) ) {
|
172 |
+
throw new Forminator_Addon_Campaignmonitor_Exception(/* translators: ... */
|
173 |
+
sprintf( __( 'Email Address on element %1$s not found or not filled on submitted data.', Forminator::DOMAIN ), $email_element_id )
|
174 |
+
);
|
175 |
+
}
|
176 |
+
$email = $submitted_data[ $email_element_id ];
|
177 |
+
$email = strtolower( trim( $email ) );
|
178 |
+
|
179 |
+
// processed
|
180 |
+
unset( $fields_map['default_field_email'] );
|
181 |
+
|
182 |
+
$name_element_id = $connection_settings['fields_map']['default_field_name'];
|
183 |
+
if ( ! isset( $submitted_data[ $name_element_id ] ) || empty( $submitted_data[ $name_element_id ] ) ) {
|
184 |
+
throw new Forminator_Addon_Campaignmonitor_Exception(/* translators: ... */
|
185 |
+
sprintf( __( 'Name on element %1$s not found or not filled on submitted data.', Forminator::DOMAIN ), $name_element_id )
|
186 |
+
);
|
187 |
+
}
|
188 |
+
|
189 |
+
if ( isset( $name ) ) {
|
190 |
+
$args['Name'] = $name;
|
191 |
+
} else {
|
192 |
+
$args['Name'] = $submitted_data[ $name_element_id ];
|
193 |
+
}
|
194 |
+
|
195 |
+
// processed
|
196 |
+
unset( $fields_map['default_field_name'] );
|
197 |
+
|
198 |
+
$custom_fields = array();
|
199 |
+
// process rest extra fields if available
|
200 |
+
foreach ( $fields_map as $field_id => $element_id ) {
|
201 |
+
if ( ! empty( $element_id ) ) {
|
202 |
+
if ( isset( $submitted_data[ $element_id ] ) && ( ! empty( $submitted_data[ $element_id ] ) || 0 === (int) $submitted_data[ $element_id ] ) ) {
|
203 |
+
$element_value = $submitted_data[ $element_id ];
|
204 |
+
if ( is_array( $element_value ) ) {
|
205 |
+
$element_value = implode( ',', $element_value );
|
206 |
+
}
|
207 |
+
}
|
208 |
+
|
209 |
+
if ( isset( $element_value ) ) {
|
210 |
+
$custom_fields[] = array(
|
211 |
+
'Key' => $field_id,
|
212 |
+
'Value' => $element_value,
|
213 |
+
);
|
214 |
+
unset( $element_value ); // unset for next loop
|
215 |
+
}
|
216 |
+
}
|
217 |
+
}
|
218 |
+
$args['CustomFields'] = $custom_fields;
|
219 |
+
|
220 |
+
if ( isset( $connection_settings['resubscribe'] ) ) {
|
221 |
+
$resubscribe = filter_var( $connection_settings['resubscribe'], FILTER_VALIDATE_BOOLEAN );
|
222 |
+
$args['Resubscribe'] = $resubscribe;
|
223 |
+
}
|
224 |
+
|
225 |
+
if ( isset( $connection_settings['restart_subscription_based_autoresponders'] ) ) {
|
226 |
+
$restart_subscription_based_autoresponders = filter_var( $connection_settings['restart_subscription_based_autoresponders'], FILTER_VALIDATE_BOOLEAN );
|
227 |
+
$args['RestartSubscriptionBasedAutoresponders'] = $restart_subscription_based_autoresponders;
|
228 |
+
}
|
229 |
+
|
230 |
+
if ( isset( $connection_settings['consent_to_track'] ) ) {
|
231 |
+
$consent_to_track = $connection_settings['consent_to_track'];
|
232 |
+
$args['ConsentToTrack'] = $consent_to_track;
|
233 |
+
}
|
234 |
+
|
235 |
+
/**
|
236 |
+
* Filter arguments to passed on to Add Subscriber Campaign Monitor API
|
237 |
+
*
|
238 |
+
* @since 1.3
|
239 |
+
*
|
240 |
+
* @param array $args
|
241 |
+
* @param int $quiz_id Current Quiz id
|
242 |
+
* @param string $connection_id ID of current connection
|
243 |
+
* @param array $submitted_data
|
244 |
+
* @param array $connection_settings current connection setting, contains options of like `name`, `list_id` etc
|
245 |
+
* @param array $quiz_settings Displayed Quiz settings
|
246 |
+
* @param Forminator_Addon_Campaignmonitor_Quiz_Settings $quiz_settings_instance Campaign Monitor Addon Quiz Settings instance
|
247 |
+
*/
|
248 |
+
$args = apply_filters(
|
249 |
+
'forminator_addon_campaignmonitor_add_subscriber_args',
|
250 |
+
$args,
|
251 |
+
$quiz_id,
|
252 |
+
$connection_id,
|
253 |
+
$submitted_data,
|
254 |
+
$connection_settings,
|
255 |
+
$quiz_settings,
|
256 |
+
$quiz_settings_instance
|
257 |
+
);
|
258 |
+
|
259 |
+
$api->add_subscriber( $list_id, $email, $args );
|
260 |
+
|
261 |
+
forminator_addon_maybe_log( __METHOD__, 'Success Send Data' );
|
262 |
+
forminator_addon_maybe_log( __METHOD__, $api->get_last_data_received() );
|
263 |
+
|
264 |
+
return array(
|
265 |
+
'is_sent' => true,
|
266 |
+
'connection_name' => $connection_settings['name'],
|
267 |
+
'description' => __( 'Successfully send data to Campaign Monitor', Forminator::DOMAIN ),
|
268 |
+
'data_sent' => $api->get_last_data_sent(),
|
269 |
+
'data_received' => $api->get_last_data_received(),
|
270 |
+
'url_request' => $api->get_last_url_request(),
|
271 |
+
'subscriber_email' => $api->get_last_data_received(), // for delete reference
|
272 |
+
'list_id' => $list_id, // for delete reference
|
273 |
+
);
|
274 |
+
|
275 |
+
} catch ( Forminator_Addon_Campaignmonitor_Exception $e ) {
|
276 |
+
forminator_addon_maybe_log( __METHOD__, 'Failed to Send to Campaign Monitor' );
|
277 |
+
|
278 |
+
return array(
|
279 |
+
'is_sent' => false,
|
280 |
+
'description' => $e->getMessage(),
|
281 |
+
'connection_name' => $connection_settings['name'],
|
282 |
+
'data_sent' => ( ( $api instanceof Forminator_Addon_Campaignmonitor_Wp_Api ) ? $api->get_last_data_sent() : array() ),
|
283 |
+
'data_received' => ( ( $api instanceof Forminator_Addon_Campaignmonitor_Wp_Api ) ? $api->get_last_data_received() : array() ),
|
284 |
+
'url_request' => ( ( $api instanceof Forminator_Addon_Campaignmonitor_Wp_Api ) ? $api->get_last_url_request() : '' ),
|
285 |
+
);
|
286 |
+
}
|
287 |
+
}
|
288 |
+
|
289 |
+
/**
|
290 |
+
* It wil add new row on entry table of submission page, with couple of subentries
|
291 |
+
* subentries included are defined in @see Forminator_Addon_Campaignmonitor_Quiz_Hooks::get_additional_entry_item()
|
292 |
+
*
|
293 |
+
* @since 1.0 Campaign Monitor Addon
|
294 |
+
*
|
295 |
+
* @param Forminator_Form_Entry_Model $entry_model
|
296 |
+
* @param $addon_meta_data
|
297 |
+
*
|
298 |
+
* @return array
|
299 |
+
*/
|
300 |
+
public function on_render_entry( Forminator_Form_Entry_Model $entry_model, $addon_meta_data ) {
|
301 |
+
|
302 |
+
$quiz_id = $this->quiz_id;
|
303 |
+
$quiz_settings_instance = $this->quiz_settings_instance;
|
304 |
+
|
305 |
+
/**
|
306 |
+
*
|
307 |
+
* Filter active metadata that previously saved on db to be processed
|
308 |
+
*
|
309 |
+
* @since 1.3
|
310 |
+
*
|
311 |
+
* @param array $addon_meta_data
|
312 |
+
* @param int $quiz_id current Quiz ID
|
313 |
+
* @param Forminator_Addon_Campaignmonitor_Quiz_Settings $quiz_settings_instance Campaign Monitor Addon Quiz Settings instance
|
314 |
+
*/
|
315 |
+
$addon_meta_data = apply_filters(
|
316 |
+
'forminator_addon_campaignmonitor_metadata',
|
317 |
+
$addon_meta_data,
|
318 |
+
$quiz_id,
|
319 |
+
$quiz_settings_instance
|
320 |
+
);
|
321 |
+
|
322 |
+
$addon_meta_datas = $addon_meta_data;
|
323 |
+
if ( ! isset( $addon_meta_data[0] ) || ! is_array( $addon_meta_data[0] ) ) {
|
324 |
+
return array();
|
325 |
+
}
|
326 |
+
|
327 |
+
return $this->on_render_entry_multi_connection( $addon_meta_datas );
|
328 |
+
|
329 |
+
}
|
330 |
+
|
331 |
+
/**
|
332 |
+
* Loop through addon meta data on multiple campaign monitor(s)
|
333 |
+
*
|
334 |
+
* @since 1.0 Campaign Monitor Addon
|
335 |
+
*
|
336 |
+
* @param $addon_meta_datas
|
337 |
+
*
|
338 |
+
* @return array
|
339 |
+
*/
|
340 |
+
private function on_render_entry_multi_connection( $addon_meta_datas ) {
|
341 |
+
$additional_entry_item = array();
|
342 |
+
foreach ( $addon_meta_datas as $addon_meta_data ) {
|
343 |
+
$additional_entry_item[] = $this->get_additional_entry_item( $addon_meta_data );
|
344 |
+
}
|
345 |
+
|
346 |
+
return $additional_entry_item;
|
347 |
+
|
348 |
+
}
|
349 |
+
|
350 |
+
/**
|
351 |
+
* Format additional entry item as label and value arrays
|
352 |
+
*
|
353 |
+
* - Integration Name : its defined by user when they adding Campaign Monitor integration on their quiz
|
354 |
+
* - Sent To Campaign Monitor : will be Yes/No value, that indicates whether sending data to Campaign Monitor was successful
|
355 |
+
* - Info : Text that are generated by addon when building and sending data to Campaign Monitor @see Forminator_Addon_Campaignmonitor_Quiz_Hooks::add_entry_fields()
|
356 |
+
* - Below subentries will be added if full log enabled, @see Forminator_Addon_Campaignmonitor::is_show_full_log() @see FORMINATOR_ADDON_CAMPAIGNMONITOR_SHOW_FULL_LOG
|
357 |
+
* - API URL : URL that wes requested when sending data to Campaign Monitor
|
358 |
+
* - Data sent to Campaign Monitor : encoded body request that was sent
|
359 |
+
* - Data received from Campaign Monitor : json encoded body response that was received
|
360 |
+
*
|
361 |
+
* @param $addon_meta_data
|
362 |
+
*
|
363 |
+
* @since 1.0 Campaign Monitor Addon
|
364 |
+
* @return array
|
365 |
+
*/
|
366 |
+
private function get_additional_entry_item( $addon_meta_data ) {
|
367 |
+
|
368 |
+
if ( ! isset( $addon_meta_data['value'] ) || ! is_array( $addon_meta_data['value'] ) ) {
|
369 |
+
return array();
|
370 |
+
}
|
371 |
+
$status = $addon_meta_data['value'];
|
372 |
+
$additional_entry_item = array(
|
373 |
+
'label' => __( 'Campaign Monitor Integration', Forminator::DOMAIN ),
|
374 |
+
'value' => '',
|
375 |
+
);
|
376 |
+
|
377 |
+
$sub_entries = array();
|
378 |
+
if ( isset( $status['connection_name'] ) ) {
|
379 |
+
$sub_entries[] = array(
|
380 |
+
'label' => __( 'Integration Name', Forminator::DOMAIN ),
|
381 |
+
'value' => $status['connection_name'],
|
382 |
+
);
|
383 |
+
}
|
384 |
+
|
385 |
+
if ( isset( $status['is_sent'] ) ) {
|
386 |
+
$is_sent = true === $status['is_sent'] ? __( 'Yes', Forminator::DOMAIN ) : __( 'No', Forminator::DOMAIN );
|
387 |
+
$sub_entries[] = array(
|
388 |
+
'label' => __( 'Sent To Campaign Monitor', Forminator::DOMAIN ),
|
389 |
+
'value' => $is_sent,
|
390 |
+
);
|
391 |
+
}
|
392 |
+
|
393 |
+
if ( isset( $status['description'] ) ) {
|
394 |
+
$sub_entries[] = array(
|
395 |
+
'label' => __( 'Info', Forminator::DOMAIN ),
|
396 |
+
'value' => $status['description'],
|
397 |
+
);
|
398 |
+
}
|
399 |
+
|
400 |
+
if ( Forminator_Addon_Campaignmonitor::is_show_full_log() ) {
|
401 |
+
// too long to be added on entry data enable this with `define('FORMINATOR_ADDON_CAMPAIGNMONITOR_SHOW_FULL_LOG', true)`
|
402 |
+
if ( isset( $status['url_request'] ) ) {
|
403 |
+
$sub_entries[] = array(
|
404 |
+
'label' => __( 'API URL', Forminator::DOMAIN ),
|
405 |
+
'value' => $status['url_request'],
|
406 |
+
);
|
407 |
+
}
|
408 |
+
|
409 |
+
if ( isset( $status['data_sent'] ) ) {
|
410 |
+
$sub_entries[] = array(
|
411 |
+
'label' => __( 'Data sent to Campaign Monitor', Forminator::DOMAIN ),
|
412 |
+
'value' => '<pre class="sui-code-snippet">' . wp_json_encode( $status['data_sent'], JSON_PRETTY_PRINT ) . '</pre>',
|
413 |
+
);
|
414 |
+
}
|
415 |
+
|
416 |
+
if ( isset( $status['data_received'] ) ) {
|
417 |
+
$sub_entries[] = array(
|
418 |
+
'label' => __( 'Data received from Campaign Monitor', Forminator::DOMAIN ),
|
419 |
+
'value' => '<pre class="sui-code-snippet">' . wp_json_encode( $status['data_received'], JSON_PRETTY_PRINT ) . '</pre>',
|
420 |
+
);
|
421 |
+
}
|
422 |
+
}
|
423 |
+
|
424 |
+
$additional_entry_item['sub_entries'] = $sub_entries;
|
425 |
+
|
426 |
+
// return single array
|
427 |
+
return $additional_entry_item;
|
428 |
+
}
|
429 |
+
|
430 |
+
/**
|
431 |
+
* Campaign Monitor will add a column on the title/header row
|
432 |
+
* its called `Campaign Monitor Info` which can be translated on forminator lang
|
433 |
+
*
|
434 |
+
* @since 1.0 Campaign Monitor Addon
|
435 |
+
* @return array
|
436 |
+
*/
|
437 |
+
public function on_export_render_title_row() {
|
438 |
+
|
439 |
+
$export_headers = array(
|
440 |
+
'info' => __( 'Campaign Monitor Info', Forminator::DOMAIN ),
|
441 |
+
);
|
442 |
+
|
443 |
+
$quiz_id = $this->quiz_id;
|
444 |
+
$quiz_settings_instance = $this->quiz_settings_instance;
|
445 |
+
|
446 |
+
/**
|
447 |
+
* Filter Campaign Monitor headers on export file
|
448 |
+
*
|
449 |
+
* @since 1.3
|
450 |
+
*
|
451 |
+
* @param array $export_headers headers to be displayed on export file
|
452 |
+
* @param int $quiz_id current Quiz ID
|
453 |
+
* @param Forminator_Addon_Campaignmonitor_Quiz_Settings $quiz_settings_instance Campaign Monitor Addon Quiz Settings instance
|
454 |
+
*/
|
455 |
+
$export_headers = apply_filters(
|
456 |
+
'forminator_addon_campaignmonitor_export_headers',
|
457 |
+
$export_headers,
|
458 |
+
$quiz_id,
|
459 |
+
$quiz_settings_instance
|
460 |
+
);
|
461 |
+
|
462 |
+
return $export_headers;
|
463 |
+
}
|
464 |
+
|
465 |
+
/**
|
466 |
+
* Campaign Monitor will add a column that give user information whether sending data to Campaign Monitor successfully or not
|
467 |
+
* It will only add one column even its multiple connection, every connection will be separated by comma
|
468 |
+
*
|
469 |
+
* @since 1.0 Campaign Monitor Addon
|
470 |
+
*
|
471 |
+
* @param Forminator_Form_Entry_Model $entry_model
|
472 |
+
* @param $addon_meta_data
|
473 |
+
*
|
474 |
+
* @return array
|
475 |
+
*/
|
476 |
+
public function on_export_render_entry( Forminator_Form_Entry_Model $entry_model, $addon_meta_data ) {
|
477 |
+
|
478 |
+
$quiz_id = $this->quiz_id;
|
479 |
+
$quiz_settings_instance = $this->quiz_settings_instance;
|
480 |
+
|
481 |
+
/**
|
482 |
+
*
|
483 |
+
* Filter Campaign Monitor metadata that previously saved on db to be processed
|
484 |
+
*
|
485 |
+
* @since 1.3
|
486 |
+
*
|
487 |
+
* @param array $addon_meta_data
|
488 |
+
* @param int $quiz_id current Quiz ID
|
489 |
+
* @param Forminator_Addon_Campaignmonitor_Quiz_Settings $quiz_settings_instance Campaign Monitor Addon Quiz Settings instance
|
490 |
+
*/
|
491 |
+
$addon_meta_data = apply_filters(
|
492 |
+
'forminator_addon_campaignmonitor_metadata',
|
493 |
+
$addon_meta_data,
|
494 |
+
$quiz_id,
|
495 |
+
$quiz_settings_instance
|
496 |
+
);
|
497 |
+
|
498 |
+
$export_columns = array(
|
499 |
+
'info' => $this->get_from_addon_meta_data( $addon_meta_data, 'description', '' ),
|
500 |
+
);
|
501 |
+
|
502 |
+
/**
|
503 |
+
* Filter Campaign Monitor columns to be displayed on export submissions
|
504 |
+
*
|
505 |
+
* @since 1.3
|
506 |
+
*
|
507 |
+
* @param array $export_columns column to be exported
|
508 |
+
* @param int $quiz_id current Quiz ID
|
509 |
+
* @param Forminator_Form_Entry_Model $entry_model Form Entry Model
|
510 |
+
* @param array $addon_meta_data meta data saved by addon on entry fields
|
511 |
+
* @param Forminator_Addon_Campaignmonitor_Quiz_Settings $quiz_settings_instance Campaign Monitor Addon Quiz Settings instance
|
512 |
+
*/
|
513 |
+
$export_columns = apply_filters(
|
514 |
+
'forminator_addon_campaignmonitor_export_columns',
|
515 |
+
$export_columns,
|
516 |
+
$quiz_id,
|
517 |
+
$entry_model,
|
518 |
+
$addon_meta_data,
|
519 |
+
$quiz_settings_instance
|
520 |
+
);
|
521 |
+
|
522 |
+
return $export_columns;
|
523 |
+
}
|
524 |
+
|
525 |
+
/**
|
526 |
+
* Get Addon meta data, will be recursive if meta data is multiple because of multiple connection added
|
527 |
+
*
|
528 |
+
* @since 1.0 Campaign Monitor Addon
|
529 |
+
*
|
530 |
+
* @param $addon_meta_data
|
531 |
+
* @param $key
|
532 |
+
* @param string $default
|
533 |
+
*
|
534 |
+
* @return string
|
535 |
+
*/
|
536 |
+
protected function get_from_addon_meta_data( $addon_meta_data, $key, $default = '' ) {
|
537 |
+
$addon_meta_datas = $addon_meta_data;
|
538 |
+
if ( ! isset( $addon_meta_data[0] ) || ! is_array( $addon_meta_data[0] ) ) {
|
539 |
+
return $default;
|
540 |
+
}
|
541 |
+
|
542 |
+
$addon_meta_data = $addon_meta_data[0];
|
543 |
+
|
544 |
+
// make sure its `status`, because we only add this
|
545 |
+
if ( 'status' !== $addon_meta_data['name'] ) {
|
546 |
+
if ( stripos( $addon_meta_data['name'], 'status-' ) === 0 ) {
|
547 |
+
$meta_data = array();
|
548 |
+
foreach ( $addon_meta_datas as $addon_meta_data ) {
|
549 |
+
// make it like single value so it will be processed like single meta data
|
550 |
+
$addon_meta_data['name'] = 'status';
|
551 |
+
|
552 |
+
// add it on an array for next recursive process
|
553 |
+
$meta_data[] = $this->get_from_addon_meta_data( array( $addon_meta_data ), $key, $default );
|
554 |
+
}
|
555 |
+
|
556 |
+
return implode( ', ', $meta_data );
|
557 |
+
}
|
558 |
+
|
559 |
+
return $default;
|
560 |
+
|
561 |
+
}
|
562 |
+
|
563 |
+
if ( ! isset( $addon_meta_data['value'] ) || ! is_array( $addon_meta_data['value'] ) ) {
|
564 |
+
return $default;
|
565 |
+
}
|
566 |
+
$status = $addon_meta_data['value'];
|
567 |
+
if ( isset( $status[ $key ] ) ) {
|
568 |
+
$connection_name = '';
|
569 |
+
if ( 'connection_name' !== $key ) {
|
570 |
+
if ( isset( $status['connection_name'] ) ) {
|
571 |
+
$connection_name = '[' . $status['connection_name'] . '] ';
|
572 |
+
}
|
573 |
+
}
|
574 |
+
|
575 |
+
return $connection_name . $status[ $key ];
|
576 |
+
}
|
577 |
+
|
578 |
+
return $default;
|
579 |
+
}
|
580 |
+
|
581 |
+
/**
|
582 |
+
* It will delete subscriber on Campaign Monitor from list
|
583 |
+
*
|
584 |
+
* @since 1.0 Campaign Monitor Addon
|
585 |
+
*
|
586 |
+
* @param Forminator_Form_Entry_Model $entry_model
|
587 |
+
* @param array $addon_meta_data
|
588 |
+
*
|
589 |
+
* @return bool
|
590 |
+
*/
|
591 |
+
public function on_before_delete_entry( Forminator_Form_Entry_Model $entry_model, $addon_meta_data ) {
|
592 |
+
// attach hook first
|
593 |
+
$quiz_id = $this->quiz_id;
|
594 |
+
$quiz_settings_instance = $this->quiz_settings_instance;
|
595 |
+
|
596 |
+
/**
|
597 |
+
*
|
598 |
+
* Filter Campaign Monitor addon metadata that previously saved on db to be processed
|
599 |
+
*
|
600 |
+
* @since 1.1
|
601 |
+
*
|
602 |
+
* @param array $addon_meta_data
|
603 |
+
* @param int $quiz_id current Quiz ID
|
604 |
+
* @param Forminator_Form_Entry_Model $entry_model Forminator Entry Model
|
605 |
+
* @param Forminator_Addon_Campaignmonitor_Quiz_Settings $quiz_settings_instance Campaign Monitor Addon Quiz Settings instance
|
606 |
+
*/
|
607 |
+
$addon_meta_data = apply_filters(
|
608 |
+
'forminator_addon_campaignmonitor_metadata',
|
609 |
+
$addon_meta_data,
|
610 |
+
$quiz_id,
|
611 |
+
$entry_model,
|
612 |
+
$quiz_settings_instance
|
613 |
+
);
|
614 |
+
|
615 |
+
/**
|
616 |
+
* Fires when Campaign Monitor connected quiz delete a submission
|
617 |
+
*
|
618 |
+
* @since 1.1
|
619 |
+
*
|
620 |
+
* @param int $quiz_id current Quiz ID
|
621 |
+
* @param Forminator_Form_Entry_Model $entry_model Forminator Entry Model
|
622 |
+
* @param array $addon_meta_data addon meta data
|
623 |
+
* @param Forminator_Addon_Campaignmonitor_Quiz_Settings $quiz_settings_instance Campaign Monitor Addon Quiz Settings instance
|
624 |
+
*/
|
625 |
+
do_action(
|
626 |
+
'forminator_addon_campaignmonitor_on_before_delete_submission',
|
627 |
+
$quiz_id,
|
628 |
+
$entry_model,
|
629 |
+
$addon_meta_data,
|
630 |
+
$quiz_settings_instance
|
631 |
+
);
|
632 |
+
|
633 |
+
if ( ! Forminator_Addon_Campaignmonitor::is_enable_delete_subscriber() ) {
|
634 |
+
// its disabled, go for it!
|
635 |
+
return true;
|
636 |
+
}
|
637 |
+
$api = null;
|
638 |
+
try {
|
639 |
+
$subscribers_to_delete = array();
|
640 |
+
|
641 |
+
if ( is_array( $addon_meta_data ) ) {
|
642 |
+
foreach ( $addon_meta_data as $addon_meta_datum ) {
|
643 |
+
|
644 |
+
if ( isset( $addon_meta_datum['value'] ) && is_array( $addon_meta_datum['value'] ) ) {
|
645 |
+
$addon_meta_datum_value = $addon_meta_datum['value'];
|
646 |
+
if ( isset( $addon_meta_datum_value['is_sent'] ) && $addon_meta_datum_value['is_sent'] ) {
|
647 |
+
if ( isset( $addon_meta_datum_value['list_id'] ) && ! empty( $addon_meta_datum_value['list_id'] )
|
648 |
+
&& isset( $addon_meta_datum_value['subscriber_email'] )
|
649 |
+
&& ! empty( $addon_meta_datum_value['subscriber_email'] ) ) {
|
650 |
+
$subscribers_to_delete[] = array(
|
651 |
+
'list_id' => $addon_meta_datum_value['list_id'],
|
652 |
+
'email' => $addon_meta_datum_value['subscriber_email'],
|
653 |
+
);
|
654 |
+
}
|
655 |
+
}
|
656 |
+
}
|
657 |
+
}
|
658 |
+
}
|
659 |
+
|
660 |
+
/**
|
661 |
+
* Filter subscribers to delete
|
662 |
+
*
|
663 |
+
* @since 1.3
|
664 |
+
*
|
665 |
+
* @param array $subscriber_ids_to_delete
|
666 |
+
* @param int $quiz_id current Quiz ID
|
667 |
+
* @param array $addon_meta_data addon meta data
|
668 |
+
* @param Forminator_Addon_Campaignmonitor_Quiz_Settings $quiz_settings_instance Campaign Monitor Addon Quiz Settings instance
|
669 |
+
*
|
670 |
+
*/
|
671 |
+
$subscribers_to_delete = apply_filters(
|
672 |
+
'forminator_addon_campaignmonitor_subscribers_to_delete',
|
673 |
+
$subscribers_to_delete,
|
674 |
+
$quiz_id,
|
675 |
+
$addon_meta_data,
|
676 |
+
$quiz_settings_instance
|
677 |
+
);
|
678 |
+
|
679 |
+
if ( ! empty( $subscribers_to_delete ) ) {
|
680 |
+
$api = $this->addon->get_api();
|
681 |
+
foreach ( $subscribers_to_delete as $subscriber ) {
|
682 |
+
|
683 |
+
if ( isset( $subscriber['list_id'] ) && isset( $subscriber['email'] ) ) {
|
684 |
+
$api->delete_subscriber( $subscriber['list_id'], $subscriber['email'] );
|
685 |
+
}
|
686 |
+
}
|
687 |
+
}
|
688 |
+
|
689 |
+
return true;
|
690 |
+
|
691 |
+
} catch ( Forminator_Addon_Campaignmonitor_Exception $e ) {
|
692 |
+
// handle all internal addon exceptions with `Forminator_Addon_Campaignmonitor_Exception`
|
693 |
+
|
694 |
+
// use wp_error, for future usage it can be returned to page entries
|
695 |
+
$wp_error = new WP_Error( 'forminator_addon_campaignmonitor_delete_subscriber', $e->getMessage() );
|
696 |
+
// handle this in addon by self, since page entries cant handle error messages on delete yet
|
697 |
+
wp_die(
|
698 |
+
esc_html( $wp_error->get_error_message() ),
|
699 |
+
esc_html( $this->addon->get_title() ),
|
700 |
+
array(
|
701 |
+
'response' => 200,
|
702 |
+
'back_link' => true,
|
703 |
+
)
|
704 |
+
);
|
705 |
+
|
706 |
+
return false;
|
707 |
+
}
|
708 |
+
|
709 |
+
}
|
710 |
+
}
|
addons/pro/campaignmonitor/class-forminator-addon-campaignmonitor-quiz-settings-exception.php
ADDED
@@ -0,0 +1,68 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/**
|
4 |
+
* Class Forminator_Addon_Campaignmonitor_Quiz_Settings_Exception
|
5 |
+
* Wrapper of Form Settings Campaignmonitor Exception
|
6 |
+
*
|
7 |
+
* @since 1.0 Campaignmonitor Addon
|
8 |
+
*/
|
9 |
+
class Forminator_Addon_Campaignmonitor_Quiz_Settings_Exception extends Forminator_Addon_Campaignmonitor_Exception {
|
10 |
+
|
11 |
+
/**
|
12 |
+
* Holder of input exceptions
|
13 |
+
*
|
14 |
+
* @since 1.0 Campaignmonitor Addon
|
15 |
+
* @var array
|
16 |
+
*/
|
17 |
+
protected $input_exceptions = array();
|
18 |
+
|
19 |
+
/**
|
20 |
+
* Forminator_Addon_Campaignmonitor_Quiz_Settings_Exception constructor.
|
21 |
+
*
|
22 |
+
* Useful if input_id is needed for later.
|
23 |
+
* If no input_id needed, use @see Forminator_Addon_Campaignmonitor_Exception
|
24 |
+
*
|
25 |
+
* @since 1.0 Campaignmonitor 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 Campaignmonitor 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 Campaignmonitor 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 Campaignmonitor Addon
|
63 |
+
* @return bool
|
64 |
+
*/
|
65 |
+
public function input_exceptions_is_available() {
|
66 |
+
return count( $this->input_exceptions ) > 0;
|
67 |
+
}
|
68 |
+
}
|
addons/pro/campaignmonitor/class-forminator-addon-campaignmonitor-quiz-settings.php
ADDED
@@ -0,0 +1,710 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
require_once dirname( __FILE__ ) . '/class-forminator-addon-campaignmonitor-quiz-settings-exception.php';
|
4 |
+
|
5 |
+
/**
|
6 |
+
* Class Forminator_Addon_Campaignmonitor_Quiz_Settings
|
7 |
+
* Handle how quiz settings displayed and saved
|
8 |
+
*
|
9 |
+
* @since 1.0 Campaignmonitor Addon
|
10 |
+
*/
|
11 |
+
class Forminator_Addon_Campaignmonitor_Quiz_Settings extends Forminator_Addon_Quiz_Settings_Abstract {
|
12 |
+
|
13 |
+
/**
|
14 |
+
* @var Forminator_Addon_Campaignmonitor
|
15 |
+
* @since 1.0 Campaignmonitor Addon
|
16 |
+
*/
|
17 |
+
protected $addon;
|
18 |
+
|
19 |
+
/**
|
20 |
+
* Forminator_Addon_Campaignmonitor_Quiz_Settings constructor.
|
21 |
+
*
|
22 |
+
* @since 1.0 Campaignmonitor Addon
|
23 |
+
*
|
24 |
+
* @param Forminator_Addon_Abstract $addon
|
25 |
+
* @param $quiz_id
|
26 |
+
*
|
27 |
+
* @throws Forminator_Addon_Exception
|
28 |
+
*/
|
29 |
+
public function __construct( Forminator_Addon_Abstract $addon, $quiz_id ) {
|
30 |
+
parent::__construct( $addon, $quiz_id );
|
31 |
+
|
32 |
+
$this->_update_quiz_settings_error_message = __(
|
33 |
+
'The update to your settings for this quiz failed, check the quiz input and try again.',
|
34 |
+
Forminator::DOMAIN
|
35 |
+
);
|
36 |
+
}
|
37 |
+
|
38 |
+
/**
|
39 |
+
* Campaignmonitor Quiz Settings wizard
|
40 |
+
*
|
41 |
+
* @since 1.0 Campaignmonitor Addon
|
42 |
+
* @return array
|
43 |
+
*/
|
44 |
+
public function quiz_settings_wizards() {
|
45 |
+
// numerical array steps
|
46 |
+
return array(
|
47 |
+
array(
|
48 |
+
'callback' => array( $this, 'pick_name' ),
|
49 |
+
'is_completed' => array( $this, 'pick_name_is_completed' ),
|
50 |
+
),
|
51 |
+
array(
|
52 |
+
'callback' => array( $this, 'setup_list' ),
|
53 |
+
'is_completed' => array( $this, 'setup_list_is_completed' ),
|
54 |
+
),
|
55 |
+
array(
|
56 |
+
'callback' => array( $this, 'map_fields' ),
|
57 |
+
'is_completed' => array( $this, 'map_fields_is_completed' ),
|
58 |
+
),
|
59 |
+
array(
|
60 |
+
'callback' => array( $this, 'setup_options' ),
|
61 |
+
'is_completed' => array( $this, 'setup_options_is_completed' ),
|
62 |
+
),
|
63 |
+
);
|
64 |
+
}
|
65 |
+
|
66 |
+
/**
|
67 |
+
* Setup Connection Name
|
68 |
+
*
|
69 |
+
* @since 1.0 Campaign Monitor Addon
|
70 |
+
*
|
71 |
+
* @param $submitted_data
|
72 |
+
*
|
73 |
+
* @return array
|
74 |
+
*/
|
75 |
+
public function pick_name( $submitted_data ) {
|
76 |
+
$template = forminator_addon_campaignmonitor_dir() . 'views/quiz-settings/pick-name.php';
|
77 |
+
|
78 |
+
$multi_id = $this->generate_multi_id();
|
79 |
+
if ( isset( $submitted_data['multi_id'] ) ) {
|
80 |
+
$multi_id = $submitted_data['multi_id'];
|
81 |
+
}
|
82 |
+
|
83 |
+
$template_params = array(
|
84 |
+
'name' => $this->get_multi_id_quiz_settings_value( $multi_id, 'name', '' ),
|
85 |
+
'name_error' => '',
|
86 |
+
'multi_id' => $multi_id,
|
87 |
+
);
|
88 |
+
|
89 |
+
unset( $submitted_data['multi_id'] );
|
90 |
+
|
91 |
+
$is_submit = ! empty( $submitted_data );
|
92 |
+
$has_errors = false;
|
93 |
+
if ( $is_submit ) {
|
94 |
+
$name = isset( $submitted_data['name'] ) ? $submitted_data['name'] : '';
|
95 |
+
$template_params['name'] = $name;
|
96 |
+
|
97 |
+
try {
|
98 |
+
|
99 |
+
if ( empty( $name ) ) {
|
100 |
+
throw new Forminator_Addon_Campaignmonitor_Exception( __( 'Please pick valid name' ) );
|
101 |
+
}
|
102 |
+
|
103 |
+
$time_added = $this->get_multi_id_quiz_settings_value( $multi_id, 'time_added', time() );
|
104 |
+
$this->save_multi_id_quiz_setting_values(
|
105 |
+
$multi_id,
|
106 |
+
array(
|
107 |
+
'name' => $name,
|
108 |
+
'time_added' => $time_added,
|
109 |
+
)
|
110 |
+
);
|
111 |
+
|
112 |
+
} catch ( Forminator_Addon_Campaignmonitor_Exception $e ) {
|
113 |
+
$template_params['name_error'] = $e->getMessage();
|
114 |
+
$has_errors = true;
|
115 |
+
}
|
116 |
+
}
|
117 |
+
|
118 |
+
$buttons = array();
|
119 |
+
if ( $this->pick_name_is_completed( array( 'multi_id' => $multi_id ) ) ) {
|
120 |
+
$buttons['disconnect']['markup'] = Forminator_Addon_Abstract::get_button_markup(
|
121 |
+
esc_html__( 'Deactivate', Forminator::DOMAIN ),
|
122 |
+
'sui-button-ghost sui-tooltip sui-tooltip-top-center forminator-addon-form-disconnect',
|
123 |
+
esc_html__( 'Deactivate this Campaign Monitor Integration from this Quiz.', Forminator::DOMAIN )
|
124 |
+
);
|
125 |
+
}
|
126 |
+
|
127 |
+
$buttons['next']['markup'] = '<div class="sui-actions-right">' .
|
128 |
+
Forminator_Addon_Abstract::get_button_markup( esc_html__( 'Next', Forminator::DOMAIN ), 'forminator-addon-next' ) .
|
129 |
+
'</div>';
|
130 |
+
|
131 |
+
return array(
|
132 |
+
'html' => Forminator_Addon_Abstract::get_template( $template, $template_params ),
|
133 |
+
'buttons' => $buttons,
|
134 |
+
'redirect' => false,
|
135 |
+
'has_errors' => $has_errors,
|
136 |
+
);
|
137 |
+
}
|
138 |
+
|
139 |
+
/**
|
140 |
+
* Check if pick name step completed
|
141 |
+
*
|
142 |
+
* @since 1.0 Campaign Monitor Addon
|
143 |
+
*
|
144 |
+
* @param $submitted_data
|
145 |
+
*
|
146 |
+
* @return bool
|
147 |
+
*/
|
148 |
+
public function pick_name_is_completed( $submitted_data ) {
|
149 |
+
$multi_id = '';
|
150 |
+
if ( isset( $submitted_data['multi_id'] ) ) {
|
151 |
+
$multi_id = $submitted_data['multi_id'];
|
152 |
+
}
|
153 |
+
|
154 |
+
if ( empty( $multi_id ) ) {
|
155 |
+
return false;
|
156 |
+
}
|
157 |
+
|
158 |
+
$name = $this->get_multi_id_quiz_settings_value( $multi_id, 'name', '' );
|
159 |
+
|
160 |
+
if ( empty( $name ) ) {
|
161 |
+
return false;
|
162 |
+
}
|
163 |
+
|
164 |
+
return true;
|
165 |
+
}
|
166 |
+
|
167 |
+
/**
|
168 |
+
* Setup List
|
169 |
+
*
|
170 |
+
* @since 1.0 Campaign Monitor Addon
|
171 |
+
*
|
172 |
+
* @param $submitted_data
|
173 |
+
*
|
174 |
+
* @return array
|
175 |
+
*/
|
176 |
+
public function setup_list( $submitted_data ) {
|
177 |
+
$template = forminator_addon_campaignmonitor_dir() . 'views/quiz-settings/setup-list.php';
|
178 |
+
|
179 |
+
if ( ! isset( $submitted_data['multi_id'] ) ) {
|
180 |
+
return $this->get_force_closed_wizard( __( 'Please pick valid connection', Forminator::DOMAIN ) );
|
181 |
+
}
|
182 |
+
|
183 |
+
$multi_id = $submitted_data['multi_id'];
|
184 |
+
unset( $submitted_data['multi_id'] );
|
185 |
+
|
186 |
+
$template_params = array(
|
187 |
+
'list_id' => $this->get_multi_id_quiz_settings_value( $multi_id, 'list_id', '' ),
|
188 |
+
'list_name' => $this->get_multi_id_quiz_settings_value( $multi_id, 'list_name', '' ),
|
189 |
+
'list_id_error' => '',
|
190 |
+
'multi_id' => $multi_id,
|
191 |
+
'error_message' => '',
|
192 |
+
);
|
193 |
+
|
194 |
+
$is_submit = ! empty( $submitted_data );
|
195 |
+
$has_errors = false;
|
196 |
+
|
197 |
+
$lists = array();
|
198 |
+
|
199 |
+
try {
|
200 |
+
|
201 |
+
$api = $this->addon->get_api();
|
202 |
+
$lists_request = $api->get_client_lists( $this->addon->get_client_id() );
|
203 |
+
|
204 |
+
foreach ( $lists_request as $key => $data ) {
|
205 |
+
if ( isset( $data->ListID ) && isset( $data->Name ) ) { //phpcs:ignore WordPress.NamingConventions.ValidVariableName.NotSnakeCaseMemberVar
|
206 |
+
$lists[ $data->ListID ] = $data->Name; //phpcs:ignore WordPress.NamingConventions.ValidVariableName.NotSnakeCaseMemberVar
|
207 |
+
}
|
208 |
+
}
|
209 |
+
|
210 |
+
if ( empty( $lists ) ) {
|
211 |
+
throw new Forminator_Addon_Campaignmonitor_Exception( __( 'No lists found on your Campaign Monitor. Please create one.', Forminator::DOMAIN ) );
|
212 |
+
}
|
213 |
+
|
214 |
+
$template_params['lists'] = $lists;
|
215 |
+
|
216 |
+
} catch ( Forminator_Addon_Campaignmonitor_Exception $e ) {
|
217 |
+
$template_params['error_message'] = $e->getMessage();
|
218 |
+
$has_errors = true;
|
219 |
+
}
|
220 |
+
|
221 |
+
if ( $is_submit ) {
|
222 |
+
$list_id = isset( $submitted_data['list_id'] ) ? $submitted_data['list_id'] : '';
|
223 |
+
$template_params['list_id'] = $list_id;
|
224 |
+
|
225 |
+
try {
|
226 |
+
|
227 |
+
if ( empty( $list_id ) ) {
|
228 |
+
throw new Forminator_Addon_Campaignmonitor_Exception( __( 'Please pick valid list' ) );
|
229 |
+
}
|
230 |
+
|
231 |
+
// phpcs:ignore WordPress.PHP.StrictInArray.MissingTrueStrict
|
232 |
+
if ( ! in_array( $list_id, array_keys( $lists ) ) ) {
|
233 |
+
throw new Forminator_Addon_Campaignmonitor_Exception( __( 'Please pick valid list' ) );
|
234 |
+
}
|
235 |
+
|
236 |
+
$list_name = $lists[ $list_id ];
|
237 |
+
|
238 |
+
$this->save_multi_id_quiz_setting_values(
|
239 |
+
$multi_id,
|
240 |
+
array(
|
241 |
+
'list_id' => $list_id,
|
242 |
+
'list_name' => $list_name,
|
243 |
+
)
|
244 |
+
);
|
245 |
+
|
246 |
+
} catch ( Forminator_Addon_Campaignmonitor_Exception $e ) {
|
247 |
+
$template_params['list_id_error'] = $e->getMessage();
|
248 |
+
$has_errors = true;
|
249 |
+
}
|
250 |
+
}
|
251 |
+
|
252 |
+
$buttons = array();
|
253 |
+
if ( $this->pick_name_is_completed( array( 'multi_id' => $multi_id ) ) ) {
|
254 |
+
$buttons['disconnect']['markup'] = Forminator_Addon_Abstract::get_button_markup(
|
255 |
+
esc_html__( 'Deactivate', Forminator::DOMAIN ),
|
256 |
+
'sui-button-ghost sui-tooltip sui-tooltip-top-center forminator-addon-form-disconnect',
|
257 |
+
esc_html__( 'Deactivate this Campaign Monitor Integration from this Quiz.', Forminator::DOMAIN )
|
258 |
+
);
|
259 |
+
}
|
260 |
+
|
261 |
+
$buttons['next']['markup'] = '<div class="sui-actions-right">' .
|
262 |
+
Forminator_Addon_Abstract::get_button_markup( esc_html__( 'Next', Forminator::DOMAIN ), 'forminator-addon-next' ) .
|
263 |
+
'</div>';
|
264 |
+
|
265 |
+
return array(
|
266 |
+
'html' => Forminator_Addon_Abstract::get_template( $template, $template_params ),
|
267 |
+
'buttons' => $buttons,
|
268 |
+
'redirect' => false,
|
269 |
+
'has_errors' => $has_errors,
|
270 |
+
'has_back' => true,
|
271 |
+
);
|
272 |
+
}
|
273 |
+
|
274 |
+
/**
|
275 |
+
* Check if setup list completed
|
276 |
+
*
|
277 |
+
* @since 1.0 Campaign Monitor Addon
|
278 |
+
*
|
279 |
+
* @param $submitted_data
|
280 |
+
*
|
281 |
+
* @return bool
|
282 |
+
*/
|
283 |
+
public function setup_list_is_completed( $submitted_data ) {
|
284 |
+
$multi_id = '';
|
285 |
+
if ( isset( $submitted_data['multi_id'] ) ) {
|
286 |
+
$multi_id = $submitted_data['multi_id'];
|
287 |
+
}
|
288 |
+
|
289 |
+
if ( empty( $multi_id ) ) {
|
290 |
+
return false;
|
291 |
+
}
|
292 |
+
|
293 |
+
$list_id = $this->get_multi_id_quiz_settings_value( $multi_id, 'list_id', '' );
|
294 |
+
|
295 |
+
if ( empty( $list_id ) ) {
|
296 |
+
return false;
|
297 |
+
}
|
298 |
+
|
299 |
+
return true;
|
300 |
+
}
|
301 |
+
|
302 |
+
/**
|
303 |
+
* Setup fields map
|
304 |
+
*
|
305 |
+
* @since 1.0 Campaignmonitor Addon
|
306 |
+
*
|
307 |
+
* @param $submitted_data
|
308 |
+
*
|
309 |
+
* @return array
|
310 |
+
*/
|
311 |
+
public function map_fields( $submitted_data ) {
|
312 |
+
$template = forminator_addon_campaignmonitor_dir() . 'views/quiz-settings/map-fields.php';
|
313 |
+
|
314 |
+
if ( ! isset( $submitted_data['multi_id'] ) ) {
|
315 |
+
return $this->get_force_closed_wizard( __( 'Please pick valid connection', Forminator::DOMAIN ) );
|
316 |
+
}
|
317 |
+
|
318 |
+
$multi_id = $submitted_data['multi_id'];
|
319 |
+
unset( $submitted_data['multi_id'] );
|
320 |
+
|
321 |
+
// find type of email
|
322 |
+
$email_fields = array();
|
323 |
+
$forminator_field_element_ids = array();
|
324 |
+
$forminator_quiz_element_ids = array();
|
325 |
+
foreach ( $this->form_fields as $form_field ) {
|
326 |
+
// collect element ids
|
327 |
+
$forminator_field_element_ids[] = $form_field['element_id'];
|
328 |
+
if ( 'email' === $form_field['type'] ) {
|
329 |
+
$email_fields[] = $form_field;
|
330 |
+
}
|
331 |
+
}
|
332 |
+
|
333 |
+
$quiz_questions = $this->get_quiz_fields();
|
334 |
+
$quiz_fields = array(
|
335 |
+
'quiz-name' => __( 'Quiz Name', Forminator::DOMAIN ),
|
336 |
+
);
|
337 |
+
foreach ( $quiz_questions as $quiz_question ) {
|
338 |
+
// collect element ids
|
339 |
+
$forminator_quiz_element_ids[] = $quiz_question['slug'];
|
340 |
+
$quiz_fields[ $quiz_question['slug'] ] = $quiz_question['title'];
|
341 |
+
}
|
342 |
+
if ( 'knowledge' === $this->quiz->quiz_type ) {
|
343 |
+
$quiz_fields['correct-answers'] = __( 'Correct Answers', Forminator::DOMAIN );
|
344 |
+
$quiz_fields['total-answers'] = __( 'Total Answers', Forminator::DOMAIN );
|
345 |
+
array_push( $forminator_quiz_element_ids, 'quiz-name', 'correct-answers', 'total-answers' );
|
346 |
+
} elseif ( 'nowrong' === $this->quiz->quiz_type ) {
|
347 |
+
$quiz_fields['result-answers'] = __( 'Result Answer', Forminator::DOMAIN );
|
348 |
+
array_push( $forminator_quiz_element_ids, 'quiz-name', 'result-answers' );
|
349 |
+
}
|
350 |
+
|
351 |
+
$forminator_field_element_ids = array_merge( $forminator_field_element_ids, $forminator_quiz_element_ids );
|
352 |
+
|
353 |
+
$template_params = array(
|
354 |
+
'fields_map' => $this->get_multi_id_quiz_settings_value( $multi_id, 'fields_map', array() ),
|
355 |
+
'multi_id' => $multi_id,
|
356 |
+
'error_message' => '',
|
357 |
+
'fields' => array(),
|
358 |
+
'form_fields' => $this->form_fields,
|
359 |
+
'quiz_fields' => $quiz_fields,
|
360 |
+
'email_fields' => $email_fields,
|
361 |
+
);
|
362 |
+
|
363 |
+
$is_submit = ! empty( $submitted_data );
|
364 |
+
$has_errors = false;
|
365 |
+
|
366 |
+
$fields = array(
|
367 |
+
'default_field_email' => __( 'Email Address', Forminator::DOMAIN ),
|
368 |
+
'default_field_name' => __( 'Name', Forminator::DOMAIN ),
|
369 |
+
);
|
370 |
+
|
371 |
+
$list_id = $this->get_multi_id_quiz_settings_value( $multi_id, 'list_id', 0 );
|
372 |
+
|
373 |
+
try {
|
374 |
+
|
375 |
+
$api = $this->addon->get_api();
|
376 |
+
$list_custom_fields = $api->get_list_custom_field( $list_id );
|
377 |
+
|
378 |
+
if ( ! is_array( $list_custom_fields ) ) {
|
379 |
+
throw new Forminator_Addon_Campaignmonitor_Exception( __( 'Campaign Monitor list\'s custom fields could not be found', Forminator::DOMAIN ) );
|
380 |
+
}
|
381 |
+
|
382 |
+
foreach ( $list_custom_fields as $field ) {
|
383 |
+
$field_key = $field->Key; //phpcs:ignore WordPress.NamingConventions.ValidVariableName.NotSnakeCaseMemberVar
|
384 |
+
if ( stripos( $field_key, '[' ) === 0 ) {
|
385 |
+
$field_key = substr( $field_key, 1 );
|
386 |
+
}
|
387 |
+
if ( strripos( $field_key, ']' ) === ( strlen( $field_key ) - 1 ) ) {
|
388 |
+
$field_key = substr( $field_key, 0, strlen( $field_key ) - 1 );
|
389 |
+
}
|
390 |
+
$fields[ $field_key ] = $field->FieldName; //phpcs:ignore WordPress.NamingConventions.ValidVariableName.NotSnakeCaseMemberVar
|
391 |
+
}
|
392 |
+
|
393 |
+
$template_params['fields'] = $fields;
|
394 |
+
|
395 |
+
} catch ( Forminator_Addon_Campaignmonitor_Exception $e ) {
|
396 |
+
$template_params['error_message'] = $e->getMessage();
|
397 |
+
$has_errors = true;
|
398 |
+
}
|
399 |
+
|
400 |
+
if ( $is_submit ) {
|
401 |
+
$fields_map = isset( $submitted_data['fields_map'] ) ? $submitted_data['fields_map'] : array();
|
402 |
+
$template_params['fields_map'] = $fields_map;
|
403 |
+
|
404 |
+
try {
|
405 |
+
if ( empty( $fields_map ) ) {
|
406 |
+
throw new Forminator_Addon_Campaignmonitor_Exception( __( 'Please assign fields.', Forminator::DOMAIN ) );
|
407 |
+
}
|
408 |
+
|
409 |
+
$input_exceptions = new Forminator_Addon_Campaignmonitor_Quiz_Settings_Exception();
|
410 |
+
if ( ! isset( $fields_map['default_field_email'] ) || empty( $fields_map['default_field_email'] ) ) {
|
411 |
+
$input_exceptions->add_input_exception( 'Please assign field for Email Address', 'default_field_email_error' );
|
412 |
+
}
|
413 |
+
|
414 |
+
if ( ! isset( $fields_map['default_field_name'] ) || empty( $fields_map['default_field_name'] ) ) {
|
415 |
+
$input_exceptions->add_input_exception( 'Please assign field for Name', 'default_field_name_error' );
|
416 |
+
}
|
417 |
+
|
418 |
+
$fields_map_to_save = array();
|
419 |
+
foreach ( $fields as $key => $title ) {
|
420 |
+
if ( isset( $fields_map[ $key ] ) && ! empty( $fields_map[ $key ] ) ) {
|
421 |
+
$element_id = $fields_map[ $key ];
|
422 |
+
if ( ! in_array( $element_id, $forminator_field_element_ids, true ) ) {
|
423 |
+
$input_exceptions->add_input_exception(/* translators: ... */
|
424 |
+
sprintf( __( 'Please assign valid field for %s', Forminator::DOMAIN ), $title ),
|
425 |
+
$key . '_error'
|
426 |
+
);
|
427 |
+
continue;
|
428 |
+
}
|
429 |
+
|
430 |
+
$fields_map_to_save[ $key ] = $fields_map[ $key ];
|
431 |
+
}
|
432 |
+
}
|
433 |
+
|
434 |
+
if ( $input_exceptions->input_exceptions_is_available() ) {
|
435 |
+
throw $input_exceptions;
|
436 |
+
}
|
437 |
+
|
438 |
+
$this->save_multi_id_quiz_setting_values( $multi_id, array( 'fields_map' => $fields_map ) );
|
439 |
+
|
440 |
+
} catch ( Forminator_Addon_Campaignmonitor_Quiz_Settings_Exception $e ) {
|
441 |
+
$template_params = array_merge( $template_params, $e->get_input_exceptions() );
|
442 |
+
$has_errors = true;
|
443 |
+
} catch ( Forminator_Addon_Campaignmonitor_Exception $e ) {
|
444 |
+
$template_params['error_message'] = $e->getMessage();
|
445 |
+
$has_errors = true;
|
446 |
+
}
|
447 |
+
}
|
448 |
+
|
449 |
+
$buttons = array();
|
450 |
+
if ( $this->pick_name_is_completed( array( 'multi_id' => $multi_id ) ) ) {
|
451 |
+
$buttons['disconnect']['markup'] = Forminator_Addon_Abstract::get_button_markup(
|
452 |
+
esc_html__( 'Deactivate', Forminator::DOMAIN ),
|
453 |
+
'sui-button-ghost sui-tooltip sui-tooltip-top-center forminator-addon-form-disconnect',
|
454 |
+
esc_html__( 'Deactivate this Campaign Monitor Integration from this Quiz.', Forminator::DOMAIN )
|
455 |
+
);
|
456 |
+
}
|
457 |
+
|
458 |
+
$buttons['next']['markup'] = '<div class="sui-actions-right">' .
|
459 |
+
Forminator_Addon_Abstract::get_button_markup( esc_html__( 'Next', Forminator::DOMAIN ), 'forminator-addon-next' ) .
|
460 |
+
'</div>';
|
461 |
+
|
462 |
+
return array(
|
463 |
+
'html' => Forminator_Addon_Abstract::get_template( $template, $template_params ),
|
464 |
+
'buttons' => $buttons,
|
465 |
+
'size' => 'normal',
|
466 |
+
'redirect' => false,
|
467 |
+
'has_errors' => $has_errors,
|
468 |
+
'has_back' => true,
|
469 |
+
);
|
470 |
+
}
|
471 |
+
|
472 |
+
/**
|
473 |
+
* Check if fields mapped
|
474 |
+
*
|
475 |
+
* @since 1.0 Campaign Monitor Addon
|
476 |
+
*
|
477 |
+
* @param $submitted_data
|
478 |
+
*
|
479 |
+
* @return bool
|
480 |
+
*/
|
481 |
+
public function map_fields_is_completed( $submitted_data ) {
|
482 |
+
$multi_id = '';
|
483 |
+
if ( isset( $submitted_data['multi_id'] ) ) {
|
484 |
+
$multi_id = $submitted_data['multi_id'];
|
485 |
+
}
|
486 |
+
|
487 |
+
if ( empty( $multi_id ) ) {
|
488 |
+
return false;
|
489 |
+
}
|
490 |
+
|
491 |
+
$fields_map = $this->get_multi_id_quiz_settings_value( $multi_id, 'fields_map', array() );
|
492 |
+
|
493 |
+
if ( empty( $fields_map ) || ! is_array( $fields_map ) || count( $fields_map ) < 1 ) {
|
494 |
+
return false;
|
495 |
+
}
|
496 |
+
|
497 |
+
if ( ! isset( $fields_map['default_field_email'] ) || empty( $fields_map['default_field_email'] ) ) {
|
498 |
+
return false;
|
499 |
+
}
|
500 |
+
|
501 |
+
if ( ! isset( $fields_map['default_field_name'] ) || empty( $fields_map['default_field_name'] ) ) {
|
502 |
+
return false;
|
503 |
+
}
|
504 |
+
|
505 |
+
return true;
|
506 |
+
}
|
507 |
+
|
508 |
+
/**
|
509 |
+
* Setup options
|
510 |
+
*
|
511 |
+
* Contains :
|
512 |
+
* - Resubscribe
|
513 |
+
* - RestartSubscriptionBasedAutoresponders
|
514 |
+
* - ConsentToTrack
|
515 |
+
*
|
516 |
+
* @since 1.0 Campaign Monitor Addon
|
517 |
+
*
|
518 |
+
* @param $submitted_data
|
519 |
+
*
|
520 |
+
* @return array
|
521 |
+
*/
|
522 |
+
public function setup_options( $submitted_data ) {
|
523 |
+
$template = forminator_addon_campaignmonitor_dir() . 'views/quiz-settings/setup-options.php';
|
524 |
+
|
525 |
+
if ( ! isset( $submitted_data['multi_id'] ) ) {
|
526 |
+
return $this->get_force_closed_wizard( __( 'Please pick valid connection', Forminator::DOMAIN ) );
|
527 |
+
}
|
528 |
+
|
529 |
+
$multi_id = $submitted_data['multi_id'];
|
530 |
+
unset( $submitted_data['multi_id'] );
|
531 |
+
|
532 |
+
$forminator_form_element_ids = array();
|
533 |
+
foreach ( $this->form_fields as $field ) {
|
534 |
+
$forminator_form_element_ids[ $field['element_id'] ] = $field;
|
535 |
+
}
|
536 |
+
|
537 |
+
$template_params = array(
|
538 |
+
'multi_id' => $multi_id,
|
539 |
+
'error_message' => '',
|
540 |
+
'resubscribe' => $this->get_multi_id_quiz_settings_value( $multi_id, 'resubscribe', false ),
|
541 |
+
'restart_subscription_based_autoresponders' => $this->get_multi_id_quiz_settings_value( $multi_id, 'restart_subscription_based_autoresponders', false ),
|
542 |
+
'consent_to_track' => $this->get_multi_id_quiz_settings_value( $multi_id, 'consent_to_track', 'Unchanged' ),
|
543 |
+
);
|
544 |
+
|
545 |
+
$is_submit = ! empty( $submitted_data );
|
546 |
+
$has_errors = false;
|
547 |
+
$notification = array();
|
548 |
+
$is_close = false;
|
549 |
+
|
550 |
+
if ( $is_submit ) {
|
551 |
+
$resubscribe = isset( $submitted_data['resubscribe'] ) ? (int) $submitted_data['resubscribe'] : 0;
|
552 |
+
$restart_subscription_based_autoresponders = isset( $submitted_data['restart_subscription_based_autoresponders'] ) ? (int) $submitted_data['restart_subscription_based_autoresponders'] : 0;
|
553 |
+
$consent_to_track = isset( $submitted_data['consent_to_track'] ) ? $submitted_data['consent_to_track'] : 'Unchanged';
|
554 |
+
|
555 |
+
try {
|
556 |
+
$input_exceptions = new Forminator_Addon_Campaignmonitor_Quiz_Settings_Exception();
|
557 |
+
|
558 |
+
$available_consents = array(
|
559 |
+
'Yes',
|
560 |
+
'No',
|
561 |
+
'Unchanged',
|
562 |
+
);
|
563 |
+
|
564 |
+
if ( ! in_array( $consent_to_track, $available_consents, true ) ) {
|
565 |
+
$input_exceptions->add_input_exception( __( 'Please pick valid Consent To Track options', Forminator::DOMAIN ), 'consent_to_track_error' );
|
566 |
+
}
|
567 |
+
|
568 |
+
if ( $input_exceptions->input_exceptions_is_available() ) {
|
569 |
+
throw $input_exceptions;
|
570 |
+
}
|
571 |
+
|
572 |
+
$this->save_multi_id_quiz_setting_values(
|
573 |
+
$multi_id,
|
574 |
+
array(
|
575 |
+
'resubscribe' => (bool) $resubscribe,
|
576 |
+
'restart_subscription_based_autoresponders' => (bool) $restart_subscription_based_autoresponders,
|
577 |
+
'consent_to_track' => $consent_to_track,
|
578 |
+
)
|
579 |
+
);
|
580 |
+
|
581 |
+
$notification = array(
|
582 |
+
'type' => 'success',
|
583 |
+
'text' => '<strong>' . $this->addon->get_title() . '</strong> ' . __( 'Successfully connected to your quiz' ),
|
584 |
+
);
|
585 |
+
$is_close = true;
|
586 |
+
|
587 |
+
} catch ( Forminator_Addon_Campaignmonitor_Quiz_Settings_Exception $e ) {
|
588 |
+
$template_params = array_merge( $template_params, $e->get_input_exceptions() );
|
589 |
+
$has_errors = true;
|
590 |
+
} catch ( Forminator_Addon_Campaignmonitor_Quiz_Settings_Exception $e ) {
|
591 |
+
$template_params['error_message'] = $e->getMessage();
|
592 |
+
$has_errors = true;
|
593 |
+
}
|
594 |
+
}
|
595 |
+
|
596 |
+
$buttons = array();
|
597 |
+
if ( $this->pick_name_is_completed( array( 'multi_id' => $multi_id ) ) ) {
|
598 |
+
$buttons['disconnect']['markup'] = Forminator_Addon_Abstract::get_button_markup(
|
599 |
+
esc_html__( 'Deactivate', Forminator::DOMAIN ),
|
600 |
+
'sui-button-ghost sui-tooltip sui-tooltip-top-center forminator-addon-form-disconnect',
|
601 |
+
esc_html__( 'Deactivate this Campaign Monitor Integration from this Quiz.', Forminator::DOMAIN )
|
602 |
+
);
|
603 |
+
}
|
604 |
+
|
605 |
+
$buttons['next']['markup'] = '<div class="sui-actions-right">' .
|
606 |
+
Forminator_Addon_Abstract::get_button_markup( esc_html__( 'Save', Forminator::DOMAIN ), 'sui-button-primary forminator-addon-finish' ) .
|
607 |
+
'</div>';
|
608 |
+
|
609 |
+
return array(
|
610 |
+
'html' => Forminator_Addon_Abstract::get_template( $template, $template_params ),
|
611 |
+
'buttons' => $buttons,
|
612 |
+
'size' => 'normal',
|
613 |
+
'redirect' => false,
|
614 |
+
'has_errors' => $has_errors,
|
615 |
+
'has_back' => true,
|
616 |
+
'notification' => $notification,
|
617 |
+
'is_close' => $is_close,
|
618 |
+
);
|
619 |
+
}
|
620 |
+
|
621 |
+
/**
|
622 |
+
* Check if setup options completed
|
623 |
+
*
|
624 |
+
* @since 1.0 Campaign Monitor Addon
|
625 |
+
*
|
626 |
+
* @param $submitted_data
|
627 |
+
*
|
628 |
+
* @return bool
|
629 |
+
*/
|
630 |
+
public function setup_options_is_completed( $submitted_data ) {
|
631 |
+
// all settings here are optional, so it can be marked as completed
|
632 |
+
return true;
|
633 |
+
}
|
634 |
+
|
635 |
+
/**
|
636 |
+
* Check if multi_id quiz settings values completed
|
637 |
+
*
|
638 |
+
* @since 1.0 Campaign Monitor Added
|
639 |
+
*
|
640 |
+
* @param $multi_id
|
641 |
+
*
|
642 |
+
* @return bool
|
643 |
+
*/
|
644 |
+
public function is_multi_quiz_settings_complete( $multi_id ) {
|
645 |
+
$data = array( 'multi_id' => $multi_id );
|
646 |
+
|
647 |
+
if ( ! $this->pick_name_is_completed( $data ) ) {
|
648 |
+
return false;
|
649 |
+
}
|
650 |
+
if ( ! $this->setup_list_is_completed( $data ) ) {
|
651 |
+
return false;
|
652 |
+
}
|
653 |
+
|
654 |
+
if ( ! $this->map_fields_is_completed( $data ) ) {
|
655 |
+
return false;
|
656 |
+
}
|
657 |
+
|
658 |
+
if ( ! $this->setup_options_is_completed( $data ) ) {
|
659 |
+
return false;
|
660 |
+
}
|
661 |
+
|
662 |
+
return true;
|
663 |
+
}
|
664 |
+
|
665 |
+
/**
|
666 |
+
* Generate multi id for multiple connection
|
667 |
+
*
|
668 |
+
* @since 1.0 Campaignmonitor Addon
|
669 |
+
* @return string
|
670 |
+
*/
|
671 |
+
public function generate_multi_id() {
|
672 |
+
return uniqid( 'campaignmonitor_', true );
|
673 |
+
}
|
674 |
+
|
675 |
+
|
676 |
+
/**
|
677 |
+
* Override how multi connection displayed
|
678 |
+
*
|
679 |
+
* @since 1.0 Campaignmonitor Addon
|
680 |
+
* @return array
|
681 |
+
*/
|
682 |
+
public function get_multi_ids() {
|
683 |
+
$multi_ids = array();
|
684 |
+
foreach ( $this->get_quiz_settings_values() as $key => $value ) {
|
685 |
+
$multi_ids[] = array(
|
686 |
+
'id' => $key,
|
687 |
+
// use name that was added by user on creating connection
|
688 |
+
'label' => isset( $value['name'] ) ? $value['name'] : $key,
|
689 |
+
);
|
690 |
+
}
|
691 |
+
|
692 |
+
return $multi_ids;
|
693 |
+
}
|
694 |
+
|
695 |
+
/**
|
696 |
+
* Disconnect a connection from current quiz
|
697 |
+
*
|
698 |
+
* @since 1.0 Campaignmonitor Addon
|
699 |
+
*
|
700 |
+
* @param array $submitted_data
|
701 |
+
*/
|
702 |
+
public function disconnect_form( $submitted_data ) {
|
703 |
+
// only execute if multi_id provided on submitted data
|
704 |
+
if ( isset( $submitted_data['multi_id'] ) && ! empty( $submitted_data['multi_id'] ) ) {
|
705 |
+
$addon_form_settings = $this->get_quiz_settings_values();
|
706 |
+
unset( $addon_form_settings[ $submitted_data['multi_id'] ] );
|
707 |
+
$this->save_quiz_settings_values( $addon_form_settings );
|
708 |
+
}
|
709 |
+
}
|
710 |
+
}
|
addons/pro/campaignmonitor/class-forminator-addon-campaignmonitor.php
CHANGED
@@ -28,6 +28,9 @@ final class Forminator_Addon_Campaignmonitor extends Forminator_Addon_Abstract {
|
|
28 |
protected $_form_settings = 'Forminator_Addon_Campaignmonitor_Form_Settings';
|
29 |
protected $_form_hooks = 'Forminator_Addon_Campaignmonitor_Form_Hooks';
|
30 |
|
|
|
|
|
|
|
31 |
/**
|
32 |
* Campaign Monitor API
|
33 |
*
|
@@ -518,4 +521,115 @@ final class Forminator_Addon_Campaignmonitor extends Forminator_Addon_Abstract {
|
|
518 |
public function is_poll_connected( $poll_id ) {
|
519 |
return false;
|
520 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
521 |
}
|
28 |
protected $_form_settings = 'Forminator_Addon_Campaignmonitor_Form_Settings';
|
29 |
protected $_form_hooks = 'Forminator_Addon_Campaignmonitor_Form_Hooks';
|
30 |
|
31 |
+
protected $_quiz_settings = 'Forminator_Addon_Campaignmonitor_Quiz_Settings';
|
32 |
+
protected $_quiz_hooks = 'Forminator_Addon_Campaignmonitor_Quiz_Hooks';
|
33 |
+
|
34 |
/**
|
35 |
* Campaign Monitor API
|
36 |
*
|
521 |
public function is_poll_connected( $poll_id ) {
|
522 |
return false;
|
523 |
}
|
524 |
+
|
525 |
+
/**
|
526 |
+
* Check if Campaignmonitor is connected with current quiz
|
527 |
+
*
|
528 |
+
* @since 1.0 Campaignmonitor Addon
|
529 |
+
*
|
530 |
+
* @param $quiz_id
|
531 |
+
*
|
532 |
+
* @return bool
|
533 |
+
*/
|
534 |
+
public function is_quiz_connected( $quiz_id ) {
|
535 |
+
try {
|
536 |
+
$quiz_settings_instance = null;
|
537 |
+
if ( ! $this->is_connected() ) {
|
538 |
+
throw new Forminator_Addon_Campaignmonitor_Exception( __( ' Campaign Monitor is not connected', Forminator::DOMAIN ) );
|
539 |
+
}
|
540 |
+
|
541 |
+
$quiz_settings_instance = $this->get_addon_quiz_settings( $quiz_id );
|
542 |
+
if ( ! $quiz_settings_instance instanceof Forminator_Addon_Campaignmonitor_Quiz_Settings ) {
|
543 |
+
throw new Forminator_Addon_Campaignmonitor_Exception( __( 'Invalid Quiz Settings of Campaign Monitor', Forminator::DOMAIN ) );
|
544 |
+
}
|
545 |
+
|
546 |
+
// Mark as active when there is at least one active connection
|
547 |
+
if ( false === $quiz_settings_instance->find_one_active_connection() ) {
|
548 |
+
throw new Forminator_Addon_Campaignmonitor_Exception( __( 'No active Campaign Monitor connection found in this quiz', Forminator::DOMAIN ) );
|
549 |
+
}
|
550 |
+
|
551 |
+
$is_quiz_connected = true;
|
552 |
+
|
553 |
+
} catch ( Forminator_Addon_Campaignmonitor_Exception $e ) {
|
554 |
+
$is_quiz_connected = false;
|
555 |
+
forminator_addon_maybe_log( __METHOD__, $e->getMessage() );
|
556 |
+
}
|
557 |
+
|
558 |
+
/**
|
559 |
+
* Filter connected status of Campaign Monitor with the quiz
|
560 |
+
*
|
561 |
+
* @since 1.3
|
562 |
+
*
|
563 |
+
* @param bool $is_quiz_connected
|
564 |
+
* @param int $quiz_id Current Quiz ID
|
565 |
+
* @param Forminator_Addon_Campaignmonitor_Quiz_Settings|null $quiz_settings_instance Instance of quiz settings, or null when unavailable
|
566 |
+
*
|
567 |
+
*/
|
568 |
+
$is_quiz_connected = apply_filters( 'forminator_addon_campaignmonitor_is_quiz_connected', $is_quiz_connected, $quiz_id, $quiz_settings_instance );
|
569 |
+
|
570 |
+
return $is_quiz_connected;
|
571 |
+
}
|
572 |
+
|
573 |
+
/**
|
574 |
+
* Flag for check if has lead form addon connected to a quiz
|
575 |
+
* by default it will check if last step of form settings already completed by user
|
576 |
+
*
|
577 |
+
* @since 1.0 Campaignmonitor Addon
|
578 |
+
*
|
579 |
+
* @param $quiz_id
|
580 |
+
*
|
581 |
+
* @return bool
|
582 |
+
*/
|
583 |
+
public function is_quiz_lead_connected( $quiz_id ) {
|
584 |
+
|
585 |
+
try {
|
586 |
+
// initialize with null
|
587 |
+
$quiz_settings_instance = null;
|
588 |
+
if ( ! $this->is_connected() ) {
|
589 |
+
throw new Forminator_Addon_Campaignmonitor_Exception( __( ' Campaign Monitor is not connected', Forminator::DOMAIN ) );
|
590 |
+
}
|
591 |
+
|
592 |
+
$quiz_settings_instance = $this->get_addon_quiz_settings( $quiz_id );
|
593 |
+
if ( ! $quiz_settings_instance instanceof Forminator_Addon_Campaignmonitor_Quiz_Settings ) {
|
594 |
+
throw new Forminator_Addon_Campaignmonitor_Exception( __( 'Invalid Quiz Settings of Campaign Monitor', Forminator::DOMAIN ) );
|
595 |
+
}
|
596 |
+
|
597 |
+
$quiz_settings = $quiz_settings_instance->get_quiz_settings();
|
598 |
+
|
599 |
+
if ( isset( $quiz_settings['hasLeads'] ) && $quiz_settings['hasLeads'] ) {
|
600 |
+
$is_quiz_connected = true;
|
601 |
+
} else {
|
602 |
+
$is_quiz_connected = false;
|
603 |
+
}
|
604 |
+
} catch ( Forminator_Addon_Campaignmonitor_Exception $e ) {
|
605 |
+
$is_quiz_connected = false;
|
606 |
+
|
607 |
+
forminator_addon_maybe_log( __METHOD__, $e->getMessage() );
|
608 |
+
}
|
609 |
+
|
610 |
+
/**
|
611 |
+
* Filter connected status of Campaignmonitor with the form
|
612 |
+
*
|
613 |
+
* @since 1.1
|
614 |
+
*
|
615 |
+
* @param bool $is_quiz_connected
|
616 |
+
* @param int $quiz_id Current Form ID
|
617 |
+
* @param Forminator_Addon_Campaignmonitor_Quiz_Settings|null $quiz_settings_instance Instance of quiz settings, or null when unavailable
|
618 |
+
*
|
619 |
+
*/
|
620 |
+
$is_quiz_connected = apply_filters( 'forminator_addon_campaignmonitor_is_quiz_lead_connected', $is_quiz_connected, $quiz_id, $quiz_settings_instance );
|
621 |
+
|
622 |
+
return $is_quiz_connected;
|
623 |
+
|
624 |
+
}
|
625 |
+
|
626 |
+
/**
|
627 |
+
* Allow multiple connection on one quiz
|
628 |
+
*
|
629 |
+
* @since 1.6.1
|
630 |
+
* @return bool
|
631 |
+
*/
|
632 |
+
public function is_allow_multi_on_quiz() {
|
633 |
+
return true;
|
634 |
+
}
|
635 |
}
|
addons/pro/campaignmonitor/views/quiz-settings/map-fields.php
ADDED
@@ -0,0 +1,109 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
// Defaults
|
3 |
+
$vars = array(
|
4 |
+
'error_message' => '',
|
5 |
+
'multi_id' => '',
|
6 |
+
'fields_map' => array(),
|
7 |
+
'fields' => array(),
|
8 |
+
'form_fields' => array(),
|
9 |
+
'quiz_fields' => array(),
|
10 |
+
'email_fields' => array(),
|
11 |
+
);
|
12 |
+
|
13 |
+
/** @var array $template_vars */
|
14 |
+
foreach ( $template_vars as $key => $val ) {
|
15 |
+
$vars[ $key ] = $val;
|
16 |
+
} ?>
|
17 |
+
|
18 |
+
<div class="integration-header">
|
19 |
+
|
20 |
+
<h3 id="dialogTitle2" class="sui-box-title"><?php echo esc_html( __( 'Assign Fields', Forminator::DOMAIN ) ); ?></h3>
|
21 |
+
|
22 |
+
<span class="sui-description" style="margin-top: 20px;"><?php esc_html_e( "Match up your quiz lead fields with your Campaign Monitor fields to make sure we're sending data to the right place.", Forminator::DOMAIN ); ?></span>
|
23 |
+
|
24 |
+
<?php if ( ! empty( $vars['error_message'] ) ) : ?>
|
25 |
+
<div class="sui-notice sui-notice-error">
|
26 |
+
<p><?php echo esc_html( $vars['error_message'] ); ?></p>
|
27 |
+
</div>
|
28 |
+
<?php endif; ?>
|
29 |
+
|
30 |
+
</div>
|
31 |
+
|
32 |
+
<form>
|
33 |
+
|
34 |
+
<table class="sui-table" style="margin-bottom: 0;">
|
35 |
+
|
36 |
+
<thead>
|
37 |
+
|
38 |
+
<tr>
|
39 |
+
<th><?php esc_html_e( 'Campaign Monitor Field', Forminator::DOMAIN ); ?></th>
|
40 |
+
<th><?php esc_html_e( 'Forminator Field', Forminator::DOMAIN ); ?></th>
|
41 |
+
</tr>
|
42 |
+
|
43 |
+
</thead>
|
44 |
+
|
45 |
+
<tbody>
|
46 |
+
|
47 |
+
<?php foreach ( $vars['fields'] as $key => $field_title ) : ?>
|
48 |
+
|
49 |
+
<tr>
|
50 |
+
|
51 |
+
<td>
|
52 |
+
<?php echo esc_html( $field_title ); ?>
|
53 |
+
<?php if ( 'default_field_email' === $key || 'default_field_name' === $key ) : ?>
|
54 |
+
<span class="integrations-required-field">*</span>
|
55 |
+
<?php endif; ?>
|
56 |
+
</td>
|
57 |
+
|
58 |
+
<td>
|
59 |
+
<?php
|
60 |
+
$forminator_fields = $vars['form_fields'];
|
61 |
+
if ( 'default_field_email' === $key ) {
|
62 |
+
$forminator_fields = $vars['email_fields'];
|
63 |
+
}
|
64 |
+
$current_error = '';
|
65 |
+
$current_selected = '';
|
66 |
+
if ( isset( $vars[ $key . '_error' ] ) && ! empty( $vars[ $key . '_error' ] ) ) {
|
67 |
+
$current_error = $vars[ $key . '_error' ];
|
68 |
+
}
|
69 |
+
if ( isset( $vars['fields_map'][ $key ] ) && ! empty( $vars['fields_map'][ $key ] ) ) {
|
70 |
+
$current_selected = $vars['fields_map'][ $key ];
|
71 |
+
}
|
72 |
+
?>
|
73 |
+
<div class="sui-form-field <?php echo esc_attr( ! empty( $current_error ) ? 'sui-form-field-error' : '' ); ?>">
|
74 |
+
<label>
|
75 |
+
<select class="sui-select" name="fields_map[<?php echo esc_attr( $key ); ?>]">
|
76 |
+
<option value=""><?php esc_html_e( 'None', Forminator::DOMAIN ); ?></option>
|
77 |
+
<?php foreach ( $forminator_fields as $forminator_field ) : ?>
|
78 |
+
<option value="<?php echo esc_attr( $forminator_field['element_id'] ); ?>"
|
79 |
+
<?php selected( $current_selected, $forminator_field['element_id'] ); ?>>
|
80 |
+
<?php echo esc_html( $forminator_field['field_label'] . ' | ' . $forminator_field['element_id'] ); ?>
|
81 |
+
</option>
|
82 |
+
<?php endforeach;
|
83 |
+
if ( 'default_field_email' !== $key ) {
|
84 |
+
foreach ( $vars['quiz_fields'] as $quiz_key => $quiz_field ) : ?>
|
85 |
+
<option value="<?php echo esc_attr( $quiz_key ); ?>"
|
86 |
+
<?php selected( $current_selected, $quiz_key ); ?>>
|
87 |
+
<?php echo esc_html( $quiz_field . ' | ' . $quiz_key ); ?>
|
88 |
+
</option>
|
89 |
+
<?php endforeach;
|
90 |
+
} ?>
|
91 |
+
</select>
|
92 |
+
</label>
|
93 |
+
<?php if ( ! empty( $current_error ) ) : ?>
|
94 |
+
<span class="sui-error-message"><?php echo esc_html( $current_error ); ?></span>
|
95 |
+
<?php endif; ?>
|
96 |
+
</div>
|
97 |
+
</td>
|
98 |
+
|
99 |
+
</tr>
|
100 |
+
|
101 |
+
<?php endforeach; ?>
|
102 |
+
|
103 |
+
</tbody>
|
104 |
+
|
105 |
+
</table>
|
106 |
+
|
107 |
+
<input type="hidden" name="multi_id" value="<?php echo esc_attr( $vars['multi_id'] ); ?>">
|
108 |
+
|
109 |
+
</form>
|
addons/pro/campaignmonitor/views/quiz-settings/pick-name.php
ADDED
@@ -0,0 +1,47 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
// Defaults
|
3 |
+
$vars = array(
|
4 |
+
'error_message' => '',
|
5 |
+
'name' => '',
|
6 |
+
'name_error' => '',
|
7 |
+
'multi_id' => '',
|
8 |
+
);
|
9 |
+
|
10 |
+
/** @var array $template_vars */
|
11 |
+
foreach ( $template_vars as $key => $val ) {
|
12 |
+
$vars[ $key ] = $val;
|
13 |
+
} ?>
|
14 |
+
|
15 |
+
<div class="integration-header">
|
16 |
+
|
17 |
+
<h3 class="sui-box-title" id="dialogTitle2"><?php echo esc_html( __( 'Setup Name', Forminator::DOMAIN ) ); ?></h3>
|
18 |
+
|
19 |
+
<span class="sui-description" style="margin-top: 20px;"><?php esc_html_e( 'Setup friendly name for this integration, so it will be easily identified by you.', Forminator::DOMAIN ); ?></span>
|
20 |
+
|
21 |
+
<?php if ( ! empty( $vars['error_message'] ) ) : ?>
|
22 |
+
<span class="sui-notice sui-notice-error"><p><?php echo esc_html( $vars['error_message'] ); ?></p></span>
|
23 |
+
<?php endif; ?>
|
24 |
+
|
25 |
+
</div>
|
26 |
+
|
27 |
+
<form>
|
28 |
+
|
29 |
+
<div class="sui-form-field<?php echo esc_attr( ! empty( $vars['name_error'] ) ? ' sui-form-field-error' : '' ); ?>"
|
30 |
+
style="margin-bottom: 0;">
|
31 |
+
|
32 |
+
<label class="sui-label"><?php esc_html_e( 'Name', Forminator::DOMAIN ); ?></label>
|
33 |
+
|
34 |
+
<input name="name"
|
35 |
+
placeholder="<?php echo esc_attr( __( 'Friendly Name', Forminator::DOMAIN ) ); ?>"
|
36 |
+
value="<?php echo esc_attr( $vars['name'] ); ?>"
|
37 |
+
class="sui-form-control" />
|
38 |
+
|
39 |
+
<?php if ( ! empty( $vars['name_error'] ) ) : ?>
|
40 |
+
<span class="sui-error-message"><?php echo esc_html( $vars['name_error'] ); ?></span>
|
41 |
+
<?php endif; ?>
|
42 |
+
|
43 |
+
</div>
|
44 |
+
|
45 |
+
<input type="hidden" name="multi_id" value="<?php echo esc_attr( $vars['multi_id'] ); ?>">
|
46 |
+
|
47 |
+
</form>
|
addons/pro/campaignmonitor/views/quiz-settings/setup-list.php
ADDED
@@ -0,0 +1,57 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
// Defaults
|
3 |
+
$vars = array(
|
4 |
+
'error_message' => '',
|
5 |
+
'list_id' => '',
|
6 |
+
'list_id_error' => '',
|
7 |
+
'multi_id' => '',
|
8 |
+
'lists' => array(),
|
9 |
+
);
|
10 |
+
|
11 |
+
/** @var array $template_vars */
|
12 |
+
foreach ( $template_vars as $key => $val ) {
|
13 |
+
$vars[ $key ] = $val;
|
14 |
+
} ?>
|
15 |
+
|
16 |
+
<div class="integration-header">
|
17 |
+
|
18 |
+
<h3 class="sui-box-title" id="dialogTitle2"><?php echo esc_html( __( 'Choose List', Forminator::DOMAIN ) ); ?></h3>
|
19 |
+
|
20 |
+
<span class="sui-description" style="margin-top: 20px;"><?php esc_html_e( 'Pick Campaign Monitor List for new subscriber to be added to.', Forminator::DOMAIN ); ?></span>
|
21 |
+
|
22 |
+
<?php if ( ! empty( $vars['error_message'] ) ) : ?>
|
23 |
+
<div class="sui-notice sui-notice-error">
|
24 |
+
<p><?php echo esc_html( $vars['error_message'] ); ?></p>
|
25 |
+
</div>
|
26 |
+
<?php endif; ?>
|
27 |
+
|
28 |
+
</div>
|
29 |
+
|
30 |
+
<form>
|
31 |
+
|
32 |
+
<div class="sui-form-field<?php echo esc_attr( ! empty( $vars['list_id_error'] ) ? ' sui-form-field-error' : '' ); ?>"
|
33 |
+
style="margin-bottom: 0;">
|
34 |
+
|
35 |
+
<label class="sui-label"><?php esc_html_e( 'List', Forminator::DOMAIN ); ?></label>
|
36 |
+
|
37 |
+
<select name="list_id" class="sui-select sui-form-control">
|
38 |
+
<option><?php esc_html_e( 'Please select a list', Forminator::DOMAIN ); ?></option>
|
39 |
+
<?php foreach ( $vars['lists'] as $list_id => $list_name ) : ?>
|
40 |
+
<option value="<?php echo esc_attr( $list_id ); ?>"
|
41 |
+
<?php selected( $vars['list_id'], $list_id ); ?>>
|
42 |
+
<?php echo esc_html( $list_name ); ?>
|
43 |
+
</option>
|
44 |
+
<?php endforeach; ?>
|
45 |
+
</select>
|
46 |
+
|
47 |
+
<?php if ( ! empty( $vars['list_id_error'] ) ) : ?>
|
48 |
+
<span class="sui-error-message"><?php echo esc_html( $vars['list_id_error'] ); ?></span>
|
49 |
+
<?php endif; ?>
|
50 |
+
|
51 |
+
</div>
|
52 |
+
|
53 |
+
<input type="hidden"
|
54 |
+
name="multi_id"
|
55 |
+
value="<?php echo esc_attr( $vars['multi_id'] ); ?>" />
|
56 |
+
|
57 |
+
</form>
|
addons/pro/campaignmonitor/views/quiz-settings/setup-options.php
ADDED
@@ -0,0 +1,105 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
// Defaults
|
3 |
+
$vars = array(
|
4 |
+
'error_message' => '',
|
5 |
+
'multi_id' => '',
|
6 |
+
'resubscribe' => 0,
|
7 |
+
'resubscribe_error' => '',
|
8 |
+
'restart_subscription_based_autoresponders' => 0,
|
9 |
+
'restart_subscription_based_autoresponders_error' => '',
|
10 |
+
'consent_to_track' => 'Unchanged',
|
11 |
+
'consent_to_track_error' => '',
|
12 |
+
);
|
13 |
+
|
14 |
+
/** @var array $template_vars */
|
15 |
+
foreach ( $template_vars as $key => $val ) {
|
16 |
+
$vars[ $key ] = $val;
|
17 |
+
} ?>
|
18 |
+
|
19 |
+
<div class="integration-header">
|
20 |
+
|
21 |
+
<h3 class="sui-box-title" id="dialogTitle2"><?php echo esc_html( __( 'Additional Options', Forminator::DOMAIN ) ); ?></h3>
|
22 |
+
|
23 |
+
<span class="sui-description" style="margin-top: 20px;"><?php esc_html_e( 'Configure additional options for Campaign Monitor integration.', Forminator::DOMAIN ); ?></span>
|
24 |
+
|
25 |
+
<?php if ( ! empty( $vars['error_message'] ) ) : ?>
|
26 |
+
<div class="sui-notice sui-notice-error">
|
27 |
+
<p><?php echo esc_html( $vars['error_message'] ); ?></p>
|
28 |
+
</div>
|
29 |
+
<?php endif; ?>
|
30 |
+
|
31 |
+
</div>
|
32 |
+
|
33 |
+
<form>
|
34 |
+
|
35 |
+
<div class="sui-form-field<?php echo esc_attr( ! empty( $vars['resubscribe_error'] ) ? ' sui-form-field-error' : '' ); ?>">
|
36 |
+
|
37 |
+
<label class="sui-toggle">
|
38 |
+
|
39 |
+
<input type="checkbox"
|
40 |
+
name="resubscribe"
|
41 |
+
value="1"
|
42 |
+
id="resubscribe"
|
43 |
+
<?php checked( true, $vars['resubscribe'] ); ?> />
|
44 |
+
|
45 |
+
<span class="sui-toggle-slider" aria-hidden="true"></span>
|
46 |
+
|
47 |
+
</label>
|
48 |
+
|
49 |
+
<label for="resubscribe" class="sui-toggle-label"><?php esc_html_e( 'Re-subscribe', Forminator::DOMAIN ); ?></label>
|
50 |
+
|
51 |
+
<?php if ( ! empty( $vars['resubscribe_error'] ) ) : ?>
|
52 |
+
<span class="sui-error-message"><?php echo esc_html( $vars['resubscribe_error'] ); ?></span>
|
53 |
+
<?php endif; ?>
|
54 |
+
|
55 |
+
<span class="sui-description"><?php esc_html_e( 'If the subscriber is in an inactive state or has previously been unsubscribed or added to the suppression list and you enabled Re-subscribe, they will be re-added to the list. Therefore, this options should be used with caution and only where suitable. If Re-subscribe is disabled, the subscriber will not be re-added to the active list.', Forminator::DOMAIN ); ?></span>
|
56 |
+
|
57 |
+
</div>
|
58 |
+
|
59 |
+
<div class="sui-form-field<?php echo esc_attr( ! empty( $vars['restart_subscription_based_autoresponders_error'] ) ? ' sui-form-field-error' : '' ); ?>">
|
60 |
+
|
61 |
+
<label class="sui-toggle">
|
62 |
+
|
63 |
+
<input type="checkbox"
|
64 |
+
name="restart_subscription_based_autoresponders"
|
65 |
+
value="1"
|
66 |
+
id="restart_subscription_based_autoresponders"
|
67 |
+
<?php checked( true, $vars['restart_subscription_based_autoresponders'] ); ?> />
|
68 |
+
|
69 |
+
<span class="sui-toggle-slider" aria-hidden="true"></span>
|
70 |
+
|
71 |
+
</label>
|
72 |
+
|
73 |
+
<label class="sui-toggle-label" for="restart_subscription_based_autoresponders"><?php esc_html_e( 'Restart Subscription based Autoresponders', Forminator::DOMAIN ); ?></label>
|
74 |
+
|
75 |
+
<?php if ( ! empty( $vars['restart_subscription_based_autoresponders_error'] ) ) : ?>
|
76 |
+
<span class="sui-error-message"><?php echo esc_html( $vars['restart_subscription_based_autoresponders_error'] ); ?></span>
|
77 |
+
<?php endif; ?>
|
78 |
+
|
79 |
+
<span class="sui-description"><?php esc_html_e( 'By default, resubscribed subscribers will not restart any automated workflows, but they will receive any remaining emails. However, if you enable the Restart Subscription based Autoresponders, any sequences will be restarted. Restart Subscription based Autoresponders only affects resubscribing subscribers.', Forminator::DOMAIN ); ?></span>
|
80 |
+
|
81 |
+
</div>
|
82 |
+
|
83 |
+
<div class="sui-form-field<?php echo esc_attr( ! empty( $vars['consent_to_track_error'] ) ? ' sui-form-field-error' : '' ); ?>">
|
84 |
+
|
85 |
+
<label class="sui-label" for="consent_to_track"><?php esc_html_e( 'Consent to Track', Forminator::DOMAIN ); ?></label>
|
86 |
+
|
87 |
+
<select name="consent_to_track" id="consent_to_track" class="sui-select sui-form-control">
|
88 |
+
<option value="Unchanged" <?php selected( 'Unchanged', $vars['consent_to_track'] ); ?>>Unchanged</option>
|
89 |
+
<option value="Yes" <?php selected( 'Yes', $vars['consent_to_track'] ); ?>>Yes</option>
|
90 |
+
<option value="No" <?php selected( 'No', $vars['consent_to_track'] ); ?>>No</option>
|
91 |
+
</select>
|
92 |
+
|
93 |
+
<?php if ( ! empty( $vars['consent_to_track_error'] ) ) : ?>
|
94 |
+
<span class="sui-error-message"><?php echo esc_html( $vars['consent_to_track_error'] ); ?></span>
|
95 |
+
<?php endif; ?>
|
96 |
+
|
97 |
+
<span class="sui-description"><?php esc_html_e( 'Whether or not the subscriber has consented to having their email opens and clicks tracked. This value applies to all subscribers with the same email address, within the same client. If an email address has no value stored for Consent to Track, it is assumed that the subscriber has given consent. You can find more information ', Forminator::DOMAIN ); ?><a href="https://help.campaignmonitor.com/gdpr-faqs" target="_blank">here</a>.
|
98 |
+
</span>
|
99 |
+
</div>
|
100 |
+
|
101 |
+
<input type="hidden"
|
102 |
+
name="multi_id"
|
103 |
+
value="<?php echo esc_attr( $vars['multi_id'] ); ?>" />
|
104 |
+
|
105 |
+
</form>
|
addons/pro/googlesheet/class-forminator-addon-googlesheet-quiz-hooks.php
CHANGED
@@ -30,10 +30,10 @@ class Forminator_Addon_Googlesheet_Quiz_Hooks extends Forminator_Addon_Quiz_Hook
|
|
30 |
/**
|
31 |
* Google sheet column titles
|
32 |
*/
|
33 |
-
const GSHEET_DATE_COLUMN_NAME
|
34 |
const GSHEET_QUESTION_COLUMN_NAME = 'Question';
|
35 |
-
const GSHEET_ANSWER_COLUMN_NAME
|
36 |
-
const GSHEET_RESULT_COLUMN_NAME
|
37 |
|
38 |
/**
|
39 |
* Forminator_Addon_Googlesheet_Quiz_Hooks constructor.
|
@@ -69,9 +69,9 @@ class Forminator_Addon_Googlesheet_Quiz_Hooks extends Forminator_Addon_Quiz_Hook
|
|
69 |
*
|
70 |
* @since 1.6.2
|
71 |
*
|
72 |
-
* @param array
|
73 |
-
* @param array
|
74 |
-
* @param int
|
75 |
* @param Forminator_Addon_Googlesheet_Quiz_Settings $quiz_settings_instance Google Sheets Addon quiz Settings instance
|
76 |
*/
|
77 |
$submitted_data = apply_filters(
|
@@ -87,9 +87,9 @@ class Forminator_Addon_Googlesheet_Quiz_Hooks extends Forminator_Addon_Quiz_Hook
|
|
87 |
*
|
88 |
* @since 1.6.2
|
89 |
*
|
90 |
-
* @param array
|
91 |
-
* @param array
|
92 |
-
* @param int
|
93 |
* @param Forminator_Addon_Googlesheet_Quiz_Settings $quiz_settings_instance Google Sheets Addon Quiz Settings instance
|
94 |
*/
|
95 |
$current_entry_fields = apply_filters(
|
@@ -111,8 +111,8 @@ class Forminator_Addon_Googlesheet_Quiz_Hooks extends Forminator_Addon_Quiz_Hook
|
|
111 |
*
|
112 |
* @since 1.6.2
|
113 |
*
|
114 |
-
* @param int
|
115 |
-
* @param array
|
116 |
* @param Forminator_Addon_Googlesheet_Quiz_Settings $quiz_settings_instance Google Sheets Addon Quiz Settings instance
|
117 |
*/
|
118 |
do_action( 'forminator_addon_googlesheet_quiz_before_create_row', $quiz_id, $submitted_data, $quiz_settings_instance );
|
@@ -134,10 +134,10 @@ class Forminator_Addon_Googlesheet_Quiz_Hooks extends Forminator_Addon_Quiz_Hook
|
|
134 |
*
|
135 |
* @since 1.6.2
|
136 |
*
|
137 |
-
* @param array
|
138 |
-
* @param int
|
139 |
-
* @param array
|
140 |
-
* @param array
|
141 |
* @param Forminator_Addon_Googlesheet_Quiz_Settings $quiz_settings_instance Google Sheets Addon Quiz Settings instance
|
142 |
*/
|
143 |
$data = apply_filters(
|
@@ -158,9 +158,9 @@ class Forminator_Addon_Googlesheet_Quiz_Hooks extends Forminator_Addon_Quiz_Hook
|
|
158 |
* @since 1.6.2
|
159 |
*
|
160 |
* @param string $connection_id
|
161 |
-
* @param array
|
162 |
-
* @param array
|
163 |
-
* @param array
|
164 |
*
|
165 |
* @return array `is_sent` true means its success send data to Google Sheets, false otherwise
|
166 |
*/
|
@@ -170,6 +170,8 @@ class Forminator_Addon_Googlesheet_Quiz_Hooks extends Forminator_Addon_Quiz_Hook
|
|
170 |
|
171 |
$quiz_id = $this->quiz_id;
|
172 |
$quiz_settings_instance = $this->quiz_settings_instance;
|
|
|
|
|
173 |
|
174 |
try {
|
175 |
|
@@ -178,27 +180,27 @@ class Forminator_Addon_Googlesheet_Quiz_Hooks extends Forminator_Addon_Quiz_Hook
|
|
178 |
*
|
179 |
* @since 1.6.2
|
180 |
*
|
181 |
-
* @param array
|
182 |
-
* @param int
|
183 |
-
* @param array
|
184 |
-
* @param array
|
185 |
* @param Forminator_Addon_Googlesheet_Quiz_Settings $quiz_settings_instance Google Sheets Addon Quiz Settings instance
|
186 |
*/
|
187 |
do_action( 'forminator_addon_quiz_googlesheet_before_prepare_sheet_headers', $connection_settings, $quiz_id, $submitted_data, $quiz_entry_fields, $quiz_settings_instance );
|
188 |
|
189 |
// prepare headers
|
190 |
-
$header_fields = $this->get_sheet_headers( $connection_settings['file_id'] );
|
191 |
|
192 |
/**
|
193 |
* Filter Sheet headers fields that will be used to map the entry rows
|
194 |
*
|
195 |
* @since 1.6.2
|
196 |
*
|
197 |
-
* @param array
|
198 |
-
* @param array
|
199 |
-
* @param int
|
200 |
-
* @param array
|
201 |
-
* @param array
|
202 |
* @param Forminator_Addon_Googlesheet_Quiz_Settings $quiz_settings_instance Google Sheets Addon Quiz Settings instance
|
203 |
*/
|
204 |
$header_fields = apply_filters(
|
@@ -216,11 +218,11 @@ class Forminator_Addon_Googlesheet_Quiz_Hooks extends Forminator_Addon_Quiz_Hook
|
|
216 |
*
|
217 |
* @since 1.6.2
|
218 |
*
|
219 |
-
* @param array
|
220 |
-
* @param array
|
221 |
-
* @param int
|
222 |
-
* @param array
|
223 |
-
* @param array
|
224 |
* @param Forminator_Addon_Googlesheet_Quiz_Settings $quiz_settings_instance Google Sheets Addon Quiz Settings instance
|
225 |
*/
|
226 |
do_action( 'forminator_addon_quiz_googlesheet_after_prepare_sheet_headers', $header_fields, $connection_settings, $quiz_id, $submitted_data, $quiz_entry_fields, $quiz_settings_instance );
|
@@ -247,9 +249,9 @@ class Forminator_Addon_Googlesheet_Quiz_Hooks extends Forminator_Addon_Quiz_Hook
|
|
247 |
}
|
248 |
} elseif ( 'nowrong' === $this->quiz->quiz_type ) {
|
249 |
if ( isset( $quiz_entry['value'][0] )
|
250 |
-
|
251 |
-
|
252 |
-
|
253 |
|
254 |
$quiz_entry = $quiz_entry['value'][0]['value'];
|
255 |
|
@@ -273,11 +275,23 @@ class Forminator_Addon_Googlesheet_Quiz_Hooks extends Forminator_Addon_Quiz_Hook
|
|
273 |
}
|
274 |
}
|
275 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
276 |
$requests = array();
|
277 |
$date = date_i18n( 'Y-m-d H:i:s' );
|
278 |
foreach ( $answers as $i => $answer ) {
|
279 |
$values = array();
|
280 |
foreach ( $header_fields as $column_name => $header_field ) {
|
|
|
281 |
if ( self::GSHEET_DATE_COLUMN_NAME === $column_name ) {
|
282 |
$value = new Forminator_Google_Service_Sheets_ExtendedValue();
|
283 |
$cell_data = new Forminator_Google_Service_Sheets_CellData();
|
@@ -312,6 +326,31 @@ class Forminator_Addon_Googlesheet_Quiz_Hooks extends Forminator_Addon_Quiz_Hook
|
|
312 |
$value->setStringValue( $result_value );
|
313 |
$cell_data->setUserEnteredValue( $value );
|
314 |
$values[] = $cell_data;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
315 |
} else {
|
316 |
// unknown column, set empty
|
317 |
$value = new Forminator_Google_Service_Sheets_ExtendedValue();
|
@@ -401,12 +440,13 @@ class Forminator_Addon_Googlesheet_Quiz_Hooks extends Forminator_Addon_Quiz_Hook
|
|
401 |
* @since 1.6.2
|
402 |
*
|
403 |
* @param $file_id
|
|
|
404 |
*
|
405 |
* @return array
|
406 |
* @throws Forminator_Addon_Googlesheet_Exception
|
407 |
* @throws Exception
|
408 |
*/
|
409 |
-
public function get_sheet_headers( $file_id ) {
|
410 |
|
411 |
$google_client = $this->addon->get_google_client();
|
412 |
$google_client->setAccessToken( $this->addon->get_client_access_token() );
|
@@ -457,7 +497,25 @@ class Forminator_Addon_Googlesheet_Quiz_Hooks extends Forminator_Addon_Quiz_Hook
|
|
457 |
}
|
458 |
|
459 |
// dont use translation because it will be used as reference
|
460 |
-
$required_header_columns = array(
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
461 |
|
462 |
$new_column_count = 0;
|
463 |
$update_bodies = array();
|
@@ -572,8 +630,8 @@ class Forminator_Addon_Googlesheet_Quiz_Hooks extends Forminator_Addon_Quiz_Hook
|
|
572 |
*
|
573 |
* @since 1.6.2
|
574 |
*
|
575 |
-
* @param array
|
576 |
-
* @param int
|
577 |
* @param Forminator_Addon_Googlesheet_Quiz_Settings $quiz_settings_instance Google Sheets Addon Quiz Settings instance
|
578 |
*/
|
579 |
$export_headers = apply_filters(
|
@@ -608,8 +666,8 @@ class Forminator_Addon_Googlesheet_Quiz_Hooks extends Forminator_Addon_Quiz_Hook
|
|
608 |
*
|
609 |
* @since 1.6.2
|
610 |
*
|
611 |
-
* @param array
|
612 |
-
* @param int
|
613 |
* @param Forminator_Addon_Googlesheet_Quiz_Settings $quiz_settings_instance Google Sheets Addon Quiz Settings instance
|
614 |
*/
|
615 |
$addon_meta_data = apply_filters(
|
@@ -628,10 +686,10 @@ class Forminator_Addon_Googlesheet_Quiz_Hooks extends Forminator_Addon_Quiz_Hook
|
|
628 |
*
|
629 |
* @since 1.2
|
630 |
*
|
631 |
-
* @param array
|
632 |
-
* @param int
|
633 |
-
* @param Forminator_Form_Entry_Model
|
634 |
-
* @param array
|
635 |
* @param Forminator_Addon_Googlesheet_Quiz_Settings $quiz_settings_instance Google Sheets Addon Quiz Settings instance
|
636 |
*/
|
637 |
$export_columns = apply_filters(
|
@@ -668,8 +726,8 @@ class Forminator_Addon_Googlesheet_Quiz_Hooks extends Forminator_Addon_Quiz_Hook
|
|
668 |
*
|
669 |
* @since 1.6.2
|
670 |
*
|
671 |
-
* @param array
|
672 |
-
* @param int
|
673 |
* @param Forminator_Addon_Googlesheet_Quiz_Settings $quiz_settings_instance Google Sheets Addon Form Settings instance
|
674 |
*/
|
675 |
$addon_meta_data = apply_filters(
|
30 |
/**
|
31 |
* Google sheet column titles
|
32 |
*/
|
33 |
+
const GSHEET_DATE_COLUMN_NAME = 'Date';
|
34 |
const GSHEET_QUESTION_COLUMN_NAME = 'Question';
|
35 |
+
const GSHEET_ANSWER_COLUMN_NAME = 'Answer';
|
36 |
+
const GSHEET_RESULT_COLUMN_NAME = 'Result';
|
37 |
|
38 |
/**
|
39 |
* Forminator_Addon_Googlesheet_Quiz_Hooks constructor.
|
69 |
*
|
70 |
* @since 1.6.2
|
71 |
*
|
72 |
+
* @param array $submitted_data
|
73 |
+
* @param array $current_entry_fields
|
74 |
+
* @param int $quiz_id current quiz ID
|
75 |
* @param Forminator_Addon_Googlesheet_Quiz_Settings $quiz_settings_instance Google Sheets Addon quiz Settings instance
|
76 |
*/
|
77 |
$submitted_data = apply_filters(
|
87 |
*
|
88 |
* @since 1.6.2
|
89 |
*
|
90 |
+
* @param array $current_entry_fields
|
91 |
+
* @param array $submitted_data
|
92 |
+
* @param int $quiz_id current Quiz ID
|
93 |
* @param Forminator_Addon_Googlesheet_Quiz_Settings $quiz_settings_instance Google Sheets Addon Quiz Settings instance
|
94 |
*/
|
95 |
$current_entry_fields = apply_filters(
|
111 |
*
|
112 |
* @since 1.6.2
|
113 |
*
|
114 |
+
* @param int $quiz_id current Quiz ID
|
115 |
+
* @param array $submitted_data
|
116 |
* @param Forminator_Addon_Googlesheet_Quiz_Settings $quiz_settings_instance Google Sheets Addon Quiz Settings instance
|
117 |
*/
|
118 |
do_action( 'forminator_addon_googlesheet_quiz_before_create_row', $quiz_id, $submitted_data, $quiz_settings_instance );
|
134 |
*
|
135 |
* @since 1.6.2
|
136 |
*
|
137 |
+
* @param array $entry_fields
|
138 |
+
* @param int $quiz_id current Quiz ID
|
139 |
+
* @param array $submitted_data
|
140 |
+
* @param array $current_entry_fields
|
141 |
* @param Forminator_Addon_Googlesheet_Quiz_Settings $quiz_settings_instance Google Sheets Addon Quiz Settings instance
|
142 |
*/
|
143 |
$data = apply_filters(
|
158 |
* @since 1.6.2
|
159 |
*
|
160 |
* @param string $connection_id
|
161 |
+
* @param array $submitted_data
|
162 |
+
* @param array $connection_settings
|
163 |
+
* @param array $quiz_entry_fields
|
164 |
*
|
165 |
* @return array `is_sent` true means its success send data to Google Sheets, false otherwise
|
166 |
*/
|
170 |
|
171 |
$quiz_id = $this->quiz_id;
|
172 |
$quiz_settings_instance = $this->quiz_settings_instance;
|
173 |
+
$quiz_settings = $quiz_settings_instance->get_quiz_settings();
|
174 |
+
$addons_fields = $this->quiz_settings_instance->get_form_fields();
|
175 |
|
176 |
try {
|
177 |
|
180 |
*
|
181 |
* @since 1.6.2
|
182 |
*
|
183 |
+
* @param array $connection_settings
|
184 |
+
* @param int $quiz_id current Quiz ID
|
185 |
+
* @param array $submitted_data
|
186 |
+
* @param array $quiz_entry_fields
|
187 |
* @param Forminator_Addon_Googlesheet_Quiz_Settings $quiz_settings_instance Google Sheets Addon Quiz Settings instance
|
188 |
*/
|
189 |
do_action( 'forminator_addon_quiz_googlesheet_before_prepare_sheet_headers', $connection_settings, $quiz_id, $submitted_data, $quiz_entry_fields, $quiz_settings_instance );
|
190 |
|
191 |
// prepare headers
|
192 |
+
$header_fields = $this->get_sheet_headers( $connection_settings['file_id'], $quiz_settings );
|
193 |
|
194 |
/**
|
195 |
* Filter Sheet headers fields that will be used to map the entry rows
|
196 |
*
|
197 |
* @since 1.6.2
|
198 |
*
|
199 |
+
* @param array $header_fields sheet headers
|
200 |
+
* @param array $connection_settings
|
201 |
+
* @param int $quiz_id current Quiz ID
|
202 |
+
* @param array $submitted_data
|
203 |
+
* @param array $quiz_entry_fields
|
204 |
* @param Forminator_Addon_Googlesheet_Quiz_Settings $quiz_settings_instance Google Sheets Addon Quiz Settings instance
|
205 |
*/
|
206 |
$header_fields = apply_filters(
|
218 |
*
|
219 |
* @since 1.6.2
|
220 |
*
|
221 |
+
* @param array $header_fields sheet headers
|
222 |
+
* @param array $connection_settings
|
223 |
+
* @param int $quiz_id current Quiz ID
|
224 |
+
* @param array $submitted_data
|
225 |
+
* @param array $quiz_entry_fields
|
226 |
* @param Forminator_Addon_Googlesheet_Quiz_Settings $quiz_settings_instance Google Sheets Addon Quiz Settings instance
|
227 |
*/
|
228 |
do_action( 'forminator_addon_quiz_googlesheet_after_prepare_sheet_headers', $header_fields, $connection_settings, $quiz_id, $submitted_data, $quiz_entry_fields, $quiz_settings_instance );
|
249 |
}
|
250 |
} elseif ( 'nowrong' === $this->quiz->quiz_type ) {
|
251 |
if ( isset( $quiz_entry['value'][0] )
|
252 |
+
&& is_array( $quiz_entry['value'][0] )
|
253 |
+
&& isset( $quiz_entry['value'][0]['value'] )
|
254 |
+
&& is_array( $quiz_entry['value'][0]['value'] ) ) {
|
255 |
|
256 |
$quiz_entry = $quiz_entry['value'][0]['value'];
|
257 |
|
275 |
}
|
276 |
}
|
277 |
|
278 |
+
$form_entry_fields = get_addons_lead_form_entry_data( $quiz_settings, $submitted_data, $addons_fields );
|
279 |
+
|
280 |
+
// all avail fields on library
|
281 |
+
$fields = forminator_fields_to_array();
|
282 |
+
$field_types = array_keys( $fields );
|
283 |
+
|
284 |
+
// sort by length, so stripos will work by traverse from longest field type first
|
285 |
+
$field_types_strlen = array_map( 'strlen', $field_types );
|
286 |
+
array_multisort( $field_types_strlen, $field_types );
|
287 |
+
$field_types = array_reverse( $field_types );
|
288 |
+
|
289 |
$requests = array();
|
290 |
$date = date_i18n( 'Y-m-d H:i:s' );
|
291 |
foreach ( $answers as $i => $answer ) {
|
292 |
$values = array();
|
293 |
foreach ( $header_fields as $column_name => $header_field ) {
|
294 |
+
$lead_column_name = explode( '|', $column_name );
|
295 |
if ( self::GSHEET_DATE_COLUMN_NAME === $column_name ) {
|
296 |
$value = new Forminator_Google_Service_Sheets_ExtendedValue();
|
297 |
$cell_data = new Forminator_Google_Service_Sheets_CellData();
|
326 |
$value->setStringValue( $result_value );
|
327 |
$cell_data->setUserEnteredValue( $value );
|
328 |
$values[] = $cell_data;
|
329 |
+
} elseif ( isset( $lead_column_name[1] ) && array_key_exists( $lead_column_name[1], $form_entry_fields ) ) {
|
330 |
+
$field_type = '';
|
331 |
+
$form_column_name = $lead_column_name[1];
|
332 |
+
|
333 |
+
foreach ( $field_types as $type ) {
|
334 |
+
if ( false !== stripos( $form_column_name, $type . '-' ) ) {
|
335 |
+
$field_type = $type;
|
336 |
+
break;
|
337 |
+
}
|
338 |
+
}
|
339 |
+
|
340 |
+
$meta_value = array();
|
341 |
+
// take from entry fields (to be saved)
|
342 |
+
if ( isset( $form_entry_fields[ $form_column_name ] ) ) {
|
343 |
+
$meta_value = $form_entry_fields[ $form_column_name ];
|
344 |
+
}
|
345 |
+
|
346 |
+
forminator_addon_maybe_log( __METHOD__, $field_type, $meta_value );
|
347 |
+
|
348 |
+
$value = new Forminator_Google_Service_Sheets_ExtendedValue();
|
349 |
+
$cell_data = new Forminator_Google_Service_Sheets_CellData();
|
350 |
+
$field_value = 0 === $i ? $meta_value : '';
|
351 |
+
$value->setStringValue( $field_value );
|
352 |
+
$cell_data->setUserEnteredValue( $value );
|
353 |
+
$values[] = $cell_data;
|
354 |
} else {
|
355 |
// unknown column, set empty
|
356 |
$value = new Forminator_Google_Service_Sheets_ExtendedValue();
|
440 |
* @since 1.6.2
|
441 |
*
|
442 |
* @param $file_id
|
443 |
+
* @param $quiz_settings
|
444 |
*
|
445 |
* @return array
|
446 |
* @throws Forminator_Addon_Googlesheet_Exception
|
447 |
* @throws Exception
|
448 |
*/
|
449 |
+
public function get_sheet_headers( $file_id, $quiz_settings = array() ) {
|
450 |
|
451 |
$google_client = $this->addon->get_google_client();
|
452 |
$google_client->setAccessToken( $this->addon->get_client_access_token() );
|
497 |
}
|
498 |
|
499 |
// dont use translation because it will be used as reference
|
500 |
+
$required_header_columns = array(
|
501 |
+
self::GSHEET_DATE_COLUMN_NAME,
|
502 |
+
self::GSHEET_QUESTION_COLUMN_NAME,
|
503 |
+
self::GSHEET_ANSWER_COLUMN_NAME,
|
504 |
+
self::GSHEET_RESULT_COLUMN_NAME
|
505 |
+
);
|
506 |
+
|
507 |
+
if ( isset( $quiz_settings['hasLeads'] ) && $quiz_settings['hasLeads'] ) {
|
508 |
+
$form_fields = $this->lead_settings_instance->get_form_fields();
|
509 |
+
$lead_form_field = array();
|
510 |
+
if ( ! empty( $form_fields ) ) {
|
511 |
+
foreach ( $form_fields as $form_field ) {
|
512 |
+
$element_id = $form_field['element_id'];
|
513 |
+
$lead_form_field[] = $form_field['field_label'] . '|' . $element_id;
|
514 |
+
|
515 |
+
}
|
516 |
+
}
|
517 |
+
$required_header_columns = array_merge( $required_header_columns, $lead_form_field );
|
518 |
+
}
|
519 |
|
520 |
$new_column_count = 0;
|
521 |
$update_bodies = array();
|
630 |
*
|
631 |
* @since 1.6.2
|
632 |
*
|
633 |
+
* @param array $export_headers headers to be displayed on export file
|
634 |
+
* @param int $quiz_id current Quiz ID
|
635 |
* @param Forminator_Addon_Googlesheet_Quiz_Settings $quiz_settings_instance Google Sheets Addon Quiz Settings instance
|
636 |
*/
|
637 |
$export_headers = apply_filters(
|
666 |
*
|
667 |
* @since 1.6.2
|
668 |
*
|
669 |
+
* @param array $addon_meta_data
|
670 |
+
* @param int $quiz_id current Quiz ID
|
671 |
* @param Forminator_Addon_Googlesheet_Quiz_Settings $quiz_settings_instance Google Sheets Addon Quiz Settings instance
|
672 |
*/
|
673 |
$addon_meta_data = apply_filters(
|
686 |
*
|
687 |
* @since 1.2
|
688 |
*
|
689 |
+
* @param array $export_columns column to be exported
|
690 |
+
* @param int $quiz_id current Quiz ID
|
691 |
+
* @param Forminator_Form_Entry_Model $entry_model Form Entry Model
|
692 |
+
* @param array $addon_meta_data meta data saved by addon on entry fields
|
693 |
* @param Forminator_Addon_Googlesheet_Quiz_Settings $quiz_settings_instance Google Sheets Addon Quiz Settings instance
|
694 |
*/
|
695 |
$export_columns = apply_filters(
|
726 |
*
|
727 |
* @since 1.6.2
|
728 |
*
|
729 |
+
* @param array $addon_meta_data
|
730 |
+
* @param int $quiz_id current Form ID
|
731 |
* @param Forminator_Addon_Googlesheet_Quiz_Settings $quiz_settings_instance Google Sheets Addon Form Settings instance
|
732 |
*/
|
733 |
$addon_meta_data = apply_filters(
|
addons/pro/googlesheet/views/settings/setup-client.php
CHANGED
@@ -23,7 +23,14 @@ foreach ( $template_vars as $key => $val ) {
|
|
23 |
<span class="sui-description" style="margin-top: 20px;"><?php esc_html_e( 'Your Google Sheets account is already authorized. Edit info below to re-authorize.', Forminator::DOMAIN ); ?></span>
|
24 |
<?php else : ?>
|
25 |
<span class="sui-description" style="margin-top: 20px;">
|
26 |
-
<?php esc_html_e( '
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
27 |
</span>
|
28 |
<?php if ( ! empty( $vars['error_message'] ) ) : ?>
|
29 |
<div class="sui-notice sui-notice-error">
|
@@ -36,6 +43,22 @@ foreach ( $template_vars as $key => $val ) {
|
|
36 |
|
37 |
<form>
|
38 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
39 |
<div class="sui-form-field<?php echo esc_attr( ! empty( $vars['client_id_error'] ) ? ' sui-form-field-error' : '' ); ?>">
|
40 |
|
41 |
<label class="sui-label"><?php esc_html_e( 'Client ID', Forminator::DOMAIN ); ?></label>
|
@@ -78,101 +101,14 @@ foreach ( $template_vars as $key => $val ) {
|
|
78 |
|
79 |
</div>
|
80 |
|
81 |
-
|
82 |
-
|
83 |
-
<span style="display: block;"><?php esc_html_e( 'Follow these instructions to retrieve your Client ID and Secret.', Forminator::DOMAIN ); ?></span>
|
84 |
-
|
85 |
-
<ol class="instructions" id="clientid-instructions">
|
86 |
-
|
87 |
-
<li>
|
88 |
-
<?php
|
89 |
-
echo sprintf(/* translators: ... */
|
90 |
-
esc_html__( 'Go to the %1$sGoogle API Console%2$s', Forminator::DOMAIN ),
|
91 |
-
'<a href="https://console.developers.google.com/cloud-resource-manager" target="_blank">',
|
92 |
-
'</a>'
|
93 |
-
); //phpcs:ignore Standard.Category.SniffName.ErrorCode
|
94 |
-
?>
|
95 |
-
</li>
|
96 |
-
|
97 |
-
<li><?php esc_html_e( 'Select an existing project or create a new one. If creating a new project, you will need to enter a name, but the ID is not important and can be ignored.', Forminator::DOMAIN ); ?></li>
|
98 |
-
|
99 |
-
<li>
|
100 |
-
<?php
|
101 |
-
echo sprintf(/* translators: ... */
|
102 |
-
esc_html__( 'Once the Project creation is completed go to the %1$sAPI Manager%2$s. Here you need to enable the %3$sGoogle Drive API%4$s and %5$sGoogle Sheets API%6$s.', Forminator::DOMAIN ),
|
103 |
-
'<strong>',
|
104 |
-
'</strong>',
|
105 |
-
'<strong>',
|
106 |
-
'</strong>',
|
107 |
-
'<strong>',
|
108 |
-
'</strong>'
|
109 |
-
); //phpcs:ignore Standard.Category.SniffName.ErrorCode
|
110 |
-
?>
|
111 |
-
</li>
|
112 |
-
|
113 |
-
<li>
|
114 |
-
<?php
|
115 |
-
echo sprintf(/* translators: ... */
|
116 |
-
esc_html__( 'Next, go to the %1$sAPI Manager > Credentials%2$s section.', Forminator::DOMAIN ),
|
117 |
-
'<strong>',
|
118 |
-
'</strong>'
|
119 |
-
); //phpcs:ignore Standard.Category.SniffName.ErrorCode
|
120 |
-
?>
|
121 |
-
</li>
|
122 |
-
|
123 |
-
<ol style="margin-top: 15px; margin-bottom: 15px;">
|
124 |
-
|
125 |
-
<li>
|
126 |
-
<?php
|
127 |
-
echo sprintf(/* translators: ... */
|
128 |
-
esc_html__( 'Click %1$sCreate Credentials > OAuth 2.0 client ID%2$s.', Forminator::DOMAIN ),
|
129 |
-
'<strong>',
|
130 |
-
'</strong>'
|
131 |
-
); //phpcs:ignore Standard.Category.SniffName.ErrorCode
|
132 |
-
?>
|
133 |
-
</li>
|
134 |
-
|
135 |
-
<li>
|
136 |
-
<?php
|
137 |
-
echo sprintf(/* translators: ... */
|
138 |
-
esc_html__( 'In the popup select the %1$sApplication Type%2$s as %3$sWeb application%4$s.', Forminator::DOMAIN ),
|
139 |
-
'<strong>',
|
140 |
-
'</strong>',
|
141 |
-
'<strong>',
|
142 |
-
'</strong>'
|
143 |
-
); //phpcs:ignore Standard.Category.SniffName.ErrorCode
|
144 |
-
?>
|
145 |
-
</li>
|
146 |
-
|
147 |
-
<li>
|
148 |
-
<?php
|
149 |
-
echo sprintf(/* translators: ... */
|
150 |
-
esc_html__( 'In the field %1$sAuthorized redirect URI%2$s, put this value below:', Forminator::DOMAIN ),
|
151 |
-
'<strong>',
|
152 |
-
'</strong>'
|
153 |
-
); //phpcs:ignore Standard.Category.SniffName.ErrorCode
|
154 |
-
?>
|
155 |
-
<pre class="sui-code-snippet"><?php echo esc_html( ! empty( $vars['redirect_url'] ) ? $vars['redirect_url'] : '' ); ?></pre>
|
156 |
-
</li>
|
157 |
-
|
158 |
-
<li>
|
159 |
-
<?php
|
160 |
-
echo sprintf(/* translators: ... */
|
161 |
-
esc_html__( 'Then click the %1$sCreate Client ID%2$s button, then navigate to %1$sAPI Keys%2$s section.', Forminator::DOMAIN ),
|
162 |
-
'<strong>',
|
163 |
-
'</strong>'
|
164 |
-
); //phpcs:ignore Standard.Category.SniffName.ErrorCode
|
165 |
-
?>
|
166 |
-
</li>
|
167 |
-
|
168 |
-
</ol>
|
169 |
-
|
170 |
-
</li>
|
171 |
-
|
172 |
-
<li><?php esc_html_e( 'After the popup closes copy the Client ID and Client Secret from the Google page and paste into the form fields.', Forminator::DOMAIN ); ?></li>
|
173 |
-
|
174 |
-
</ol>
|
175 |
|
176 |
-
|
|
|
|
|
177 |
|
178 |
-
|
|
|
|
|
|
|
|
23 |
<span class="sui-description" style="margin-top: 20px;"><?php esc_html_e( 'Your Google Sheets account is already authorized. Edit info below to re-authorize.', Forminator::DOMAIN ); ?></span>
|
24 |
<?php else : ?>
|
25 |
<span class="sui-description" style="margin-top: 20px;">
|
26 |
+
<?php esc_html_e( 'Set up your Google Sheets oAuth 2.0 client by entering your credentials below.', Forminator::DOMAIN ); ?>
|
27 |
+
<br />
|
28 |
+
<?php echo sprintf(/* translators: ... */
|
29 |
+
esc_html__( '%1$sGuide to generate credentials%2$s.', Forminator::DOMAIN ),
|
30 |
+
'<a href="https://premium.wpmudev.org/docs/wpmu-dev-plugins/forminator/#google-sheets" target="_blank">',
|
31 |
+
'</a>'
|
32 |
+
);
|
33 |
+
?>
|
34 |
</span>
|
35 |
<?php if ( ! empty( $vars['error_message'] ) ) : ?>
|
36 |
<div class="sui-notice sui-notice-error">
|
43 |
|
44 |
<form>
|
45 |
|
46 |
+
<div class="sui-form-field">
|
47 |
+
|
48 |
+
<label class="sui-label"><?php esc_html_e( 'Authorized Redirect URI', Forminator::DOMAIN ); ?></label>
|
49 |
+
|
50 |
+
<div class="sui-with-button sui-with-button-icon">
|
51 |
+
<input type="text" id="forminator-form-shortcode" class="sui-form-control" value="<?php echo esc_html( ! empty( $vars['redirect_url'] ) ? $vars['redirect_url'] : '' ); ?>">
|
52 |
+
<a class="sui-button-icon copy-clipboard-integration" data-shortcode="<?php echo esc_html( ! empty( $vars['redirect_url'] ) ? $vars['redirect_url'] : '' ); ?>">
|
53 |
+
<i aria-hidden="true" class="sui-icon-copy"></i>
|
54 |
+
<span class="sui-screen-reader-text"><?php esc_html_e( 'Copy shortcode', Forminator::DOMAIN ); ?></span>
|
55 |
+
</a>
|
56 |
+
</div>
|
57 |
+
|
58 |
+
<span class="sui-description"><?php esc_html_e( 'Please use this redirect URI while generating your client credentials on the Google API console.', Forminator::DOMAIN ); ?></span>
|
59 |
+
|
60 |
+
</div>
|
61 |
+
|
62 |
<div class="sui-form-field<?php echo esc_attr( ! empty( $vars['client_id_error'] ) ? ' sui-form-field-error' : '' ); ?>">
|
63 |
|
64 |
<label class="sui-label"><?php esc_html_e( 'Client ID', Forminator::DOMAIN ); ?></label>
|
101 |
|
102 |
</div>
|
103 |
|
104 |
+
</form>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
105 |
|
106 |
+
<script>
|
107 |
+
jQuery('.copy-clipboard-integration').on( "click", function ( e ) {
|
108 |
+
e.preventDefault();
|
109 |
|
110 |
+
copyToClipboard( jQuery( this ).data( 'shortcode' ) );
|
111 |
+
|
112 |
+
Forminator.Notification.open( 'success', Forminator.l10n.options.uri_copied, 4000 );
|
113 |
+
});
|
114 |
+
</script>
|
addons/pro/gutenberg/library/blocks/class-forminator-gfblock-forms.php
CHANGED
@@ -160,6 +160,10 @@ class Forminator_GFBlock_Forms extends Forminator_GFBlock_Abstract {
|
|
160 |
foreach ( $forms as $form ) {
|
161 |
$form_name = $form->name;
|
162 |
|
|
|
|
|
|
|
|
|
163 |
if ( isset( $form->settings['formName'] ) && ! empty( $form->settings['formName'] ) ) {
|
164 |
$form_name = $form->settings['formName'];
|
165 |
}
|
160 |
foreach ( $forms as $form ) {
|
161 |
$form_name = $form->name;
|
162 |
|
163 |
+
if ( isset( $form->settings['form-type'] ) && 'leads' === $form->settings['form-type'] ) {
|
164 |
+
continue;
|
165 |
+
}
|
166 |
+
|
167 |
if ( isset( $form->settings['formName'] ) && ! empty( $form->settings['formName'] ) ) {
|
168 |
$form_name = $form->settings['formName'];
|
169 |
}
|
addons/pro/hubspot/class-forminator-addon-hubspot-quiz-hooks.php
ADDED
@@ -0,0 +1,737 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/**
|
4 |
+
* Class Forminator_Addon_Hubspot_Quiz_Hooks
|
5 |
+
*
|
6 |
+
* @since 1.0 HubSpot Addon
|
7 |
+
*
|
8 |
+
*/
|
9 |
+
class Forminator_Addon_Hubspot_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 `HubSpot` instance instead of the abstract
|
15 |
+
* And its public properties can be exposed
|
16 |
+
*
|
17 |
+
* @since 1.0 HubSpot Addon
|
18 |
+
* @var Forminator_Addon_Hubspot
|
19 |
+
*/
|
20 |
+
protected $addon;
|
21 |
+
|
22 |
+
/**
|
23 |
+
* Form Settings Instance
|
24 |
+
*
|
25 |
+
* @since 1.0 HubSpot Addon
|
26 |
+
* @var Forminator_Addon_Hubspot_Quiz_Settings | null
|
27 |
+
*/
|
28 |
+
protected $quiz_settings_instance;
|
29 |
+
|
30 |
+
/**
|
31 |
+
* Forminator_Addon_Hubspot_Quiz_Hooks constructor.
|
32 |
+
*
|
33 |
+
* @since 1.0 HubSpot Addon
|
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 = __( 'HubSpot failed to process submitted data. Please check your quiz and try again', Forminator::DOMAIN );
|
43 |
+
}
|
44 |
+
|
45 |
+
/**
|
46 |
+
* Save status of request sent and received for each connected HubSpot Connection
|
47 |
+
*
|
48 |
+
* @since 1.0 HubSpot Addon
|
49 |
+
*
|
50 |
+
* @param array $submitted_data
|
51 |
+
* @param array $form_entry_fields
|
52 |
+
*
|
53 |
+
* @return array
|
54 |
+
*/
|
55 |
+
public function add_entry_fields( $submitted_data, $form_entry_fields = array() ) {
|
56 |
+
|
57 |
+
$quiz_id = $this->quiz_id;
|
58 |
+
$quiz_settings_instance = $this->quiz_settings_instance;
|
59 |
+
|
60 |
+
/**
|
61 |
+
* Filter HubSpot submitted form data to be processed
|
62 |
+
*
|
63 |
+
* @since 1.4
|
64 |
+
*
|
65 |
+
* @param array $submitted_data
|
66 |
+
* @param int $quiz_id current quiz ID
|
67 |
+
* @param Forminator_Addon_Hubspot_Quiz_Settings $quiz_settings_instance HubSpot Addon quiz Settings instance
|
68 |
+
*/
|
69 |
+
$submitted_data = apply_filters(
|
70 |
+
'forminator_addon_hubspot_quiz_submitted_data',
|
71 |
+
$submitted_data,
|
72 |
+
$quiz_id,
|
73 |
+
$quiz_settings_instance
|
74 |
+
);
|
75 |
+
|
76 |
+
$quiz_submitted_data = get_quiz_submitted_data( $this->quiz, $submitted_data, $form_entry_fields );
|
77 |
+
|
78 |
+
$addon_setting_values = $this->quiz_settings_instance->get_quiz_settings_values();
|
79 |
+
$quiz_settings = $this->quiz_settings_instance->get_quiz_settings();
|
80 |
+
$addons_fields = $this->quiz_settings_instance->get_form_fields();
|
81 |
+
|
82 |
+
$form_entry_fields = forminator_lead_form_data( $submitted_data );
|
83 |
+
$submitted_data = get_addons_lead_form_entry_data( $quiz_settings, $submitted_data, $addons_fields );
|
84 |
+
$submitted_data = array_merge( $submitted_data, $quiz_submitted_data );
|
85 |
+
|
86 |
+
$data = array();
|
87 |
+
|
88 |
+
/**
|
89 |
+
* Fires before send message to HubSpot
|
90 |
+
*
|
91 |
+
* @since 1.4
|
92 |
+
*
|
93 |
+
* @param int $quiz_id current Form ID
|
94 |
+
* @param array $submitted_data
|
95 |
+
* @param Forminator_Addon_Hubspot_Quiz_Settings $quiz_settings_instance HubSpot Addon Quiz Settings instance
|
96 |
+
*/
|
97 |
+
do_action( 'forminator_addon_hubspot_before_send_message', $quiz_id, $submitted_data, $quiz_settings_instance );
|
98 |
+
|
99 |
+
foreach ( $addon_setting_values as $key => $addon_setting_value ) {
|
100 |
+
// save it on entry field, with name `status-$MULTI_ID`, and value is the return result on sending data to hubspot
|
101 |
+
if ( $quiz_settings_instance->is_multi_quiz_settings_complete( $key ) ) {
|
102 |
+
// exec only on completed connection
|
103 |
+
$data[] = array(
|
104 |
+
'name' => 'status-' . $key,
|
105 |
+
'value' => $this->get_status_on_contact_sync( $key, $submitted_data, $addon_setting_value, $form_entry_fields ),
|
106 |
+
);
|
107 |
+
}
|
108 |
+
}
|
109 |
+
|
110 |
+
$entry_fields = $data;
|
111 |
+
/**
|
112 |
+
* Filter HubSpot entry fields to be saved to entry model
|
113 |
+
*
|
114 |
+
* @since 1.4
|
115 |
+
*
|
116 |
+
* @param array $entry_fields
|
117 |
+
* @param int $quiz_id current Form ID
|
118 |
+
* @param array $submitted_data
|
119 |
+
* @param Forminator_Addon_Hubspot_Quiz_Settings $quiz_settings_instance HubSpot Addon Quiz Settings instance
|
120 |
+
*/
|
121 |
+
$data = apply_filters(
|
122 |
+
'forminator_addon_hubspot_entry_fields',
|
123 |
+
$entry_fields,
|
124 |
+
$quiz_id,
|
125 |
+
$submitted_data,
|
126 |
+
$quiz_settings_instance
|
127 |
+
);
|
128 |
+
|
129 |
+
return $data;
|
130 |
+
|
131 |
+
}
|
132 |
+
|
133 |
+
/**
|
134 |
+
* Get status on send message to HubSpot
|
135 |
+
*
|
136 |
+
* @since 1.0 HubSpot Addon
|
137 |
+
*
|
138 |
+
* @param $connection_id
|
139 |
+
* @param $submitted_data
|
140 |
+
* @param $connection_settings
|
141 |
+
* @param $form_entry_fields
|
142 |
+
*
|
143 |
+
* @return array `is_sent` true means its success send data to HubSpot, false otherwise
|
144 |
+
*/
|
145 |
+
private function get_status_on_contact_sync( $connection_id, $submitted_data, $connection_settings, $form_entry_fields ) {
|
146 |
+
// initialize as null
|
147 |
+
$api = null;
|
148 |
+
|
149 |
+
$quiz_id = $this->quiz_id;
|
150 |
+
$quiz_settings_instance = $this->quiz_settings_instance;
|
151 |
+
$quiz_settings = $this->quiz_settings_instance->get_quiz_settings();
|
152 |
+
|
153 |
+
//check required fields
|
154 |
+
try {
|
155 |
+
$api = $this->addon->get_api();
|
156 |
+
$args = array();
|
157 |
+
|
158 |
+
$list_id = $connection_settings['list_id'];
|
159 |
+
|
160 |
+
$deafult_fields = $connection_settings['fields_map'];
|
161 |
+
$custom_fields_map = array_filter( $connection_settings['custom_fields_map'] );
|
162 |
+
|
163 |
+
$fields_map = array_merge( $deafult_fields, $custom_fields_map );
|
164 |
+
|
165 |
+
$email_element_id = $connection_settings['fields_map']['email'];
|
166 |
+
if ( ! isset( $submitted_data[ $email_element_id ] ) || empty( $submitted_data[ $email_element_id ] ) ) {
|
167 |
+
/* translators: ... */
|
168 |
+
throw new Forminator_Addon_Hubspot_Exception( __( 'Email on element %1$s not found or not filled on submitted data.', Forminator::DOMAIN ) );
|
169 |
+
}
|
170 |
+
$email = $submitted_data[ $email_element_id ];
|
171 |
+
$email = strtolower( trim( $email ) );
|
172 |
+
$args['email'] = $email;
|
173 |
+
|
174 |
+
// processed
|
175 |
+
unset( $fields_map['email'] );
|
176 |
+
$common_fields = array(
|
177 |
+
'firstname',
|
178 |
+
'lastname',
|
179 |
+
'jobtitle',
|
180 |
+
);
|
181 |
+
$extra_field = array();
|
182 |
+
if ( ! empty( $custom_fields_map ) ) {
|
183 |
+
foreach( $custom_fields_map as $custom => $custom_field ) {
|
184 |
+
if( ! empty( $custom ) ) {
|
185 |
+
$extra_field[] = $custom;
|
186 |
+
}
|
187 |
+
}
|
188 |
+
}
|
189 |
+
$common_fields = array_merge( $common_fields, $extra_field );
|
190 |
+
foreach ( $common_fields as $common_field ) {
|
191 |
+
// not setup
|
192 |
+
if ( ! isset( $fields_map[ $common_field ] ) ) {
|
193 |
+
continue;
|
194 |
+
}
|
195 |
+
|
196 |
+
if ( ! empty( $fields_map[ $common_field ] ) ) {
|
197 |
+
$element_id = $fields_map[ $common_field ];
|
198 |
+
|
199 |
+
if ( isset( $submitted_data[ $element_id ] ) && ( ! empty( $submitted_data[ $element_id ] ) || 0 === (int) $submitted_data[ $element_id ] ) ) {
|
200 |
+
$element_value = $submitted_data[ $element_id ];
|
201 |
+
if ( is_array( $element_value ) ) {
|
202 |
+
$element_value = implode( ',', $element_value );
|
203 |
+
}
|
204 |
+
}
|
205 |
+
if ( isset( $element_value ) ) {
|
206 |
+
$args[ $common_field ] = $element_value;
|
207 |
+
unset( $element_value ); // unset for next loop
|
208 |
+
}
|
209 |
+
}
|
210 |
+
// processed
|
211 |
+
unset( $fields_map[ $common_field ] );
|
212 |
+
}
|
213 |
+
/**
|
214 |
+
* Filter arguments to passed on to Contact Sync HubSpot API
|
215 |
+
*
|
216 |
+
* @since 1.2
|
217 |
+
*
|
218 |
+
* @param array $args
|
219 |
+
* @param int $quiz_id Current Quiz id
|
220 |
+
* @param string $connection_id ID of current connection
|
221 |
+
* @param array $submitted_data
|
222 |
+
* @param array $connection_settings current connection setting, contains options of like `name`, `list_id` etc
|
223 |
+
* @param array $quiz_settings Displayed Quiz settings
|
224 |
+
* @param Forminator_Addon_Hubspot_Quiz_Settings $quiz_settings_instance HubSpot Addon Quiz Settings instance
|
225 |
+
*/
|
226 |
+
$args = apply_filters(
|
227 |
+
'forminator_addon_hubspot_create_contact_args',
|
228 |
+
$args,
|
229 |
+
$quiz_id,
|
230 |
+
$connection_id,
|
231 |
+
$submitted_data,
|
232 |
+
$connection_settings,
|
233 |
+
$quiz_settings,
|
234 |
+
$quiz_settings_instance
|
235 |
+
);
|
236 |
+
|
237 |
+
$contact_id = $api->add_update_contact( $args );
|
238 |
+
// Add contact to contact list
|
239 |
+
$toObjectId = null;
|
240 |
+
if ( ! empty( $list_id ) && ! empty( $contact_id ) && ! is_object( $contact_id ) && (int) $contact_id > 0 ) {
|
241 |
+
$toObjectId = $contact_id;
|
242 |
+
$api->add_to_contact_list( $contact_id, $args['email'], $list_id );
|
243 |
+
}
|
244 |
+
|
245 |
+
$create_ticket = isset( $connection_settings['create_ticket'] ) ? $connection_settings['create_ticket'] : '';
|
246 |
+
if( empty( $connection_settings['name'] ) ) {
|
247 |
+
$connection_settings['name'] = 'HubSpot';
|
248 |
+
}
|
249 |
+
$fromObjectId = null;
|
250 |
+
if ( '1' === $create_ticket ) {
|
251 |
+
$ticket['pipeline_id'] = $connection_settings['pipeline_id'];
|
252 |
+
$ticket['status_id'] = $connection_settings['status_id'];
|
253 |
+
$ticket_name = str_ireplace( '{quiz_name}', forminator_get_name_from_model( $this->quiz ), $connection_settings['ticket_name'] );
|
254 |
+
$ticket_name = forminator_addon_replace_custom_vars( $ticket_name, $submitted_data, $this->lead_model, $form_entry_fields, false );
|
255 |
+
$ticket['ticket_name'] = $ticket_name;
|
256 |
+
$ticket_description = str_ireplace( '{quiz_name}', forminator_get_name_from_model( $this->quiz ), $connection_settings['ticket_description'] );
|
257 |
+
$ticket_description = forminator_addon_replace_custom_vars( $ticket_description, $submitted_data, $this->lead_model, $form_entry_fields, false );
|
258 |
+
$ticket['ticket_description'] = $ticket_description;
|
259 |
+
$supported_file = isset( $submitted_data[ $connection_settings['supported_file'] ] ) ? $submitted_data[ $connection_settings['supported_file'] ] : array();
|
260 |
+
$supported_file_url = '';
|
261 |
+
|
262 |
+
if ( ! empty( $supported_file['file_url'] ) ) {
|
263 |
+
if ( is_array( $supported_file['file_url'] ) ) {
|
264 |
+
$supported_file_url = implode( ', ', $supported_file['file_url'] );
|
265 |
+
} else {
|
266 |
+
$supported_file_url = $supported_file['file_url'];
|
267 |
+
}
|
268 |
+
}
|
269 |
+
|
270 |
+
$ticket['supported_file'] = $supported_file_url;
|
271 |
+
|
272 |
+
$object_id = $api->create_ticket( $ticket );
|
273 |
+
|
274 |
+
if ( ! is_null( $toObjectId ) && ! is_object( $object_id ) && (int) $object_id > 0 ) {
|
275 |
+
$fromObjectId = $object_id;
|
276 |
+
$associate['fromObjectId'] = $fromObjectId;
|
277 |
+
$associate['toObjectId'] = $toObjectId;
|
278 |
+
$api->ticket_associate_contact( $associate );
|
279 |
+
}
|
280 |
+
}
|
281 |
+
|
282 |
+
forminator_addon_maybe_log( __METHOD__, 'Success Send Data' );
|
283 |
+
|
284 |
+
return array(
|
285 |
+
'is_sent' => true,
|
286 |
+
'connection_name' => $connection_settings['name'],
|
287 |
+
'description' => __( 'Successfully send data to HubSpot', Forminator::DOMAIN ),
|
288 |
+
'data_sent' => $api->get_last_data_sent(),
|
289 |
+
'data_received' => $api->get_last_data_received(),
|
290 |
+
'url_request' => $api->get_last_url_request(),
|
291 |
+
'contact_id' => $toObjectId,
|
292 |
+
'ticket_id' => $fromObjectId,
|
293 |
+
);
|
294 |
+
|
295 |
+
} catch ( Forminator_Addon_Hubspot_Exception $e ) {
|
296 |
+
|
297 |
+
forminator_addon_maybe_log( __METHOD__, 'Failed to Send to HubSpot' );
|
298 |
+
|
299 |
+
$addon_entry_fields = array(
|
300 |
+
'is_sent' => false,
|
301 |
+
'description' => $e->getMessage(),
|
302 |
+
'connection_name' => $connection_settings['name'],
|
303 |
+
'data_sent' => ( ( $api instanceof Forminator_Addon_Hubspot_Wp_Api ) ? $api->get_last_data_sent() : array() ),
|
304 |
+
'data_received' => ( ( $api instanceof Forminator_Addon_Hubspot_Wp_Api ) ? $api->get_last_data_received() : array() ),
|
305 |
+
'url_request' => ( ( $api instanceof Forminator_Addon_Hubspot_Wp_Api ) ? $api->get_last_url_request() : '' ),
|
306 |
+
'contact_id' => null,
|
307 |
+
'ticket_id' => null,
|
308 |
+
);
|
309 |
+
|
310 |
+
return $addon_entry_fields;
|
311 |
+
}
|
312 |
+
}
|
313 |
+
|
314 |
+
|
315 |
+
/**
|
316 |
+
* It wil add new row on entry table of submission page, with couple of subentries
|
317 |
+
* subentries included are defined in @see Forminator_Addon_Hubspot_Quiz_Hooks::get_additional_entry_item()
|
318 |
+
*
|
319 |
+
* @since 1.0 HubSpot Addon
|
320 |
+
*
|
321 |
+
* @param Forminator_Form_Entry_Model $entry_model
|
322 |
+
* @param $addon_meta_data
|
323 |
+
*
|
324 |
+
* @return array
|
325 |
+
*/
|
326 |
+
public function on_render_entry( Forminator_Form_Entry_Model $entry_model, $addon_meta_data ) {
|
327 |
+
|
328 |
+
$quiz_id = $this->quiz_id;
|
329 |
+
$quiz_settings_instance = $this->quiz_settings_instance;
|
330 |
+
|
331 |
+
/**
|
332 |
+
*
|
333 |
+
* Filter HubSpot metadata that previously saved on db to be processed
|
334 |
+
*
|
335 |
+
* @since 1.4
|
336 |
+
*
|
337 |
+
* @param array $addon_meta_data
|
338 |
+
* @param int $quiz_id current quiz ID
|
339 |
+
* @param Forminator_Addon_Hubspot_Quiz_Settings $quiz_settings_instance HubSpot Addon Quiz Settings instance
|
340 |
+
*/
|
341 |
+
$addon_meta_data = apply_filters(
|
342 |
+
'forminator_addon_hubspot_metadata',
|
343 |
+
$addon_meta_data,
|
344 |
+
$quiz_id,
|
345 |
+
$quiz_settings_instance
|
346 |
+
);
|
347 |
+
|
348 |
+
$addon_meta_datas = $addon_meta_data;
|
349 |
+
if ( ! isset( $addon_meta_data[0] ) || ! is_array( $addon_meta_data[0] ) ) {
|
350 |
+
return array();
|
351 |
+
}
|
352 |
+
|
353 |
+
return $this->on_render_entry_multi_connection( $addon_meta_datas );
|
354 |
+
|
355 |
+
}
|
356 |
+
|
357 |
+
/**
|
358 |
+
* Loop through addon meta data on multiple HubSpot setup(s)
|
359 |
+
*
|
360 |
+
* @since 1.0 HubSpot Addon
|
361 |
+
*
|
362 |
+
* @param $addon_meta_datas
|
363 |
+
*
|
364 |
+
* @return array
|
365 |
+
*/
|
366 |
+
private function on_render_entry_multi_connection( $addon_meta_datas ) {
|
367 |
+
$additional_entry_item = array();
|
368 |
+
foreach ( $addon_meta_datas as $addon_meta_data ) {
|
369 |
+
$additional_entry_item[] = $this->get_additional_entry_item( $addon_meta_data );
|
370 |
+
}
|
371 |
+
|
372 |
+
return $additional_entry_item;
|
373 |
+
|
374 |
+
}
|
375 |
+
|
376 |
+
/**
|
377 |
+
* Format additional entry item as label and value arrays
|
378 |
+
*
|
379 |
+
* - Integration Name : its defined by user when they adding HubSpot integration on their form
|
380 |
+
* - Sent To HubSpot : will be Yes/No value, that indicates whether sending data to HubSpot API was successful
|
381 |
+
* - Info : Text that are generated by addon when building and sending data to HubSpot @see Forminator_Addon_Hubspot_Quiz_Hooks::add_entry_fields()
|
382 |
+
* - Below subentries will be added if full log enabled, @see Forminator_Addon_Hubspot::is_show_full_log() @see FORMINATOR_ADDON_HUBSPOT_SHOW_FULL_LOG
|
383 |
+
* - API URL : URL that wes requested when sending data to HubSpot
|
384 |
+
* - Data sent to HubSpot : encoded body request that was sent
|
385 |
+
* - Data received from HubSpot : json encoded body response that was received
|
386 |
+
*
|
387 |
+
* @param $addon_meta_data
|
388 |
+
*
|
389 |
+
* @since 1.0 HubSpot Addon
|
390 |
+
* @return array
|
391 |
+
*/
|
392 |
+
private function get_additional_entry_item( $addon_meta_data ) {
|
393 |
+
|
394 |
+
if ( ! isset( $addon_meta_data['value'] ) || ! is_array( $addon_meta_data['value'] ) ) {
|
395 |
+
return array();
|
396 |
+
}
|
397 |
+
$status = $addon_meta_data['value'];
|
398 |
+
$additional_entry_item = array(
|
399 |
+
'label' => __( 'HubSpot Integration', Forminator::DOMAIN ),
|
400 |
+
'value' => '',
|
401 |
+
);
|
402 |
+
|
403 |
+
$sub_entries = array();
|
404 |
+
if ( isset( $status['connection_name'] ) ) {
|
405 |
+
$sub_entries[] = array(
|
406 |
+
'label' => __( 'Integration Name', Forminator::DOMAIN ),
|
407 |
+
'value' => $status['connection_name'],
|
408 |
+
);
|
409 |
+
}
|
410 |
+
|
411 |
+
if ( isset( $status['is_sent'] ) ) {
|
412 |
+
$is_sent = true === $status['is_sent'] ? __( 'Yes', Forminator::DOMAIN ) : __( 'No', Forminator::DOMAIN );
|
413 |
+
$sub_entries[] = array(
|
414 |
+
'label' => __( 'Sent To HubSpot', Forminator::DOMAIN ),
|
415 |
+
'value' => $is_sent,
|
416 |
+
);
|
417 |
+
}
|
418 |
+
|
419 |
+
if ( isset( $status['description'] ) ) {
|
420 |
+
$sub_entries[] = array(
|
421 |
+
'label' => __( 'Info', Forminator::DOMAIN ),
|
422 |
+
'value' => $status['description'],
|
423 |
+
);
|
424 |
+
}
|
425 |
+
|
426 |
+
if ( Forminator_Addon_Hubspot::is_show_full_log() ) {
|
427 |
+
// too long to be added on entry data enable this with `define('FORMINATOR_ADDON_HUBSPOT_SHOW_FULL_LOG', true)`
|
428 |
+
if ( isset( $status['url_request'] ) ) {
|
429 |
+
$sub_entries[] = array(
|
430 |
+
'label' => __( 'API URL', Forminator::DOMAIN ),
|
431 |
+
'value' => $status['url_request'],
|
432 |
+
);
|
433 |
+
}
|
434 |
+
|
435 |
+
if ( isset( $status['data_sent'] ) ) {
|
436 |
+
$sub_entries[] = array(
|
437 |
+
'label' => __( 'Data sent to HubSpot', Forminator::DOMAIN ),
|
438 |
+
'value' => '<pre class="sui-code-snippet">' . wp_json_encode( $status['data_sent'], JSON_PRETTY_PRINT ) . '</pre>',
|
439 |
+
);
|
440 |
+
}
|
441 |
+
|
442 |
+
if ( isset( $status['data_received'] ) ) {
|
443 |
+
$sub_entries[] = array(
|
444 |
+
'label' => __( 'Data received from HubSpot', Forminator::DOMAIN ),
|
445 |
+
'value' => '<pre class="sui-code-snippet">' . wp_json_encode( $status['data_received'], JSON_PRETTY_PRINT ) . '</pre>',
|
446 |
+
);
|
447 |
+
}
|
448 |
+
}
|
449 |
+
|
450 |
+
$additional_entry_item['sub_entries'] = $sub_entries;
|
451 |
+
|
452 |
+
// return single array
|
453 |
+
return $additional_entry_item;
|
454 |
+
}
|
455 |
+
|
456 |
+
/**
|
457 |
+
* HubSpot will add a column on the title/header row
|
458 |
+
* its called `HubSpot Info` which can be translated on forminator lang
|
459 |
+
*
|
460 |
+
* @since 1.0 HubSpot Addon
|
461 |
+
* @return array
|
462 |
+
*/
|
463 |
+
public function on_export_render_title_row() {
|
464 |
+
|
465 |
+
$export_headers = array(
|
466 |
+
'info' => __( 'HubSpot Info', Forminator::DOMAIN ),
|
467 |
+
);
|
468 |
+
|
469 |
+
$quiz_id = $this->quiz_id;
|
470 |
+
$quiz_settings_instance = $this->quiz_settings_instance;
|
471 |
+
|
472 |
+
/**
|
473 |
+
* Filter HubSpot headers on export file
|
474 |
+
*
|
475 |
+
* @since 1.2
|
476 |
+
*
|
477 |
+
* @param array $export_headers headers to be displayed on export file
|
478 |
+
* @param int $quiz_id current Quiz ID
|
479 |
+
* @param Forminator_Addon_Hubspot_Quiz_Settings $quiz_settings_instance HubSpot Addon Quiz Settings instance
|
480 |
+
*/
|
481 |
+
$export_headers = apply_filters(
|
482 |
+
'forminator_addon_hubspot_export_headers',
|
483 |
+
$export_headers,
|
484 |
+
$quiz_id,
|
485 |
+
$quiz_settings_instance
|
486 |
+
);
|
487 |
+
|
488 |
+
return $export_headers;
|
489 |
+
}
|
490 |
+
|
491 |
+
/**
|
492 |
+
* HubSpot will add a column that give user information whether sending data to HubSpot successfully or not
|
493 |
+
* It will only add one column even its multiple connection, every connection will be separated by comma
|
494 |
+
*
|
495 |
+
* @since 1.0 HubSpot Addon
|
496 |
+
*
|
497 |
+
* @param Forminator_Form_Entry_Model $entry_model
|
498 |
+
* @param $addon_meta_data
|
499 |
+
*
|
500 |
+
* @return array
|
501 |
+
*/
|
502 |
+
public function on_export_render_entry( Forminator_Form_Entry_Model $entry_model, $addon_meta_data ) {
|
503 |
+
|
504 |
+
$quiz_id = $this->quiz_id;
|
505 |
+
$quiz_settings_instance = $this->quiz_settings_instance;
|
506 |
+
|
507 |
+
/**
|
508 |
+
*
|
509 |
+
* Filter HubSpot metadata that previously saved on db to be processed
|
510 |
+
*
|
511 |
+
* @since 1.4
|
512 |
+
*
|
513 |
+
* @param array $addon_meta_data
|
514 |
+
* @param int $quiz_id current Quiz ID
|
515 |
+
* @param Forminator_Addon_Hubspot_Quiz_Settings $quiz_settings_instance HubSpot Addon Quiz Settings instance
|
516 |
+
*/
|
517 |
+
$addon_meta_data = apply_filters(
|
518 |
+
'forminator_addon_hubspot_metadata',
|
519 |
+
$addon_meta_data,
|
520 |
+
$quiz_id,
|
521 |
+
$quiz_settings_instance
|
522 |
+
);
|
523 |
+
|
524 |
+
$export_columns = array(
|
525 |
+
'info' => $this->get_from_addon_meta_data( $addon_meta_data, 'description', '' ),
|
526 |
+
);
|
527 |
+
|
528 |
+
/**
|
529 |
+
* Filter HubSpot columns to be displayed on export submissions
|
530 |
+
*
|
531 |
+
* @since 1.4
|
532 |
+
*
|
533 |
+
* @param array $export_columns column to be exported
|
534 |
+
* @param int $quiz_id current Quiz ID
|
535 |
+
* @param Forminator_Quiz_Entry_Model $entry_model Form Entry Model
|
536 |
+
* @param array $addon_meta_data meta data saved by addon on entry fields
|
537 |
+
* @param Forminator_Addon_Hubspot_Quiz_Settings $quiz_settings_instance HubSpot Addon Quiz Settings instance
|
538 |
+
*/
|
539 |
+
$export_columns = apply_filters(
|
540 |
+
'forminator_addon_hubspot_export_columns',
|
541 |
+
$export_columns,
|
542 |
+
$quiz_id,
|
543 |
+
$entry_model,
|
544 |
+
$addon_meta_data,
|
545 |
+
$quiz_settings_instance
|
546 |
+
);
|
547 |
+
|
548 |
+
return $export_columns;
|
549 |
+
}
|
550 |
+
|
551 |
+
/**
|
552 |
+
* Get Addon meta data, will be recursive if meta data is multiple because of multiple connection added
|
553 |
+
*
|
554 |
+
* @since 1.0 HubSpot Addon
|
555 |
+
*
|
556 |
+
* @param $addon_meta_data
|
557 |
+
* @param $key
|
558 |
+
* @param string $default
|
559 |
+
*
|
560 |
+
* @return string
|
561 |
+
*/
|
562 |
+
protected function get_from_addon_meta_data( $addon_meta_data, $key, $default = '' ) {
|
563 |
+
$addon_meta_datas = $addon_meta_data;
|
564 |
+
if ( ! isset( $addon_meta_data[0] ) || ! is_array( $addon_meta_data[0] ) ) {
|
565 |
+
return $default;
|
566 |
+
}
|
567 |
+
|
568 |
+
$addon_meta_data = $addon_meta_data[0];
|
569 |
+
|
570 |
+
// make sure its `status`, because we only add this
|
571 |
+
if ( 'status' !== $addon_meta_data['name'] ) {
|
572 |
+
if ( stripos( $addon_meta_data['name'], 'status-' ) === 0 ) {
|
573 |
+
$meta_data = array();
|
574 |
+
foreach ( $addon_meta_datas as $addon_meta_data ) {
|
575 |
+
// make it like single value so it will be processed like single meta data
|
576 |
+
$addon_meta_data['name'] = 'status';
|
577 |
+
|
578 |
+
// add it on an array for next recursive process
|
579 |
+
$meta_data[] = $this->get_from_addon_meta_data( array( $addon_meta_data ), $key, $default );
|
580 |
+
}
|
581 |
+
|
582 |
+
return implode( ', ', $meta_data );
|
583 |
+
}
|
584 |
+
|
585 |
+
return $default;
|
586 |
+
|
587 |
+
}
|
588 |
+
|
589 |
+
if ( ! isset( $addon_meta_data['value'] ) || ! is_array( $addon_meta_data['value'] ) ) {
|
590 |
+
return $default;
|
591 |
+
}
|
592 |
+
$status = $addon_meta_data['value'];
|
593 |
+
if ( isset( $status[ $key ] ) ) {
|
594 |
+
$connection_name = '';
|
595 |
+
if ( 'connection_name' !== $key ) {
|
596 |
+
if ( isset( $status['connection_name'] ) ) {
|
597 |
+
$connection_name = '[' . $status['connection_name'] . '] ';
|
598 |
+
}
|
599 |
+
}
|
600 |
+
|
601 |
+
return $connection_name . $status[ $key ];
|
602 |
+
}
|
603 |
+
|
604 |
+
return $default;
|
605 |
+
}
|
606 |
+
|
607 |
+
/**
|
608 |
+
* It will delete sent chat
|
609 |
+
*
|
610 |
+
* @since 1.0 HubSpot Addon
|
611 |
+
*
|
612 |
+
* @param Forminator_Form_Entry_Model $entry_model
|
613 |
+
* @param array $addon_meta_data
|
614 |
+
*
|
615 |
+
* @return bool
|
616 |
+
*/
|
617 |
+
public function on_before_delete_entry( Forminator_Form_Entry_Model $entry_model, $addon_meta_data ) {
|
618 |
+
// attach hook first
|
619 |
+
$quiz_id = $this->quiz_id;
|
620 |
+
$quiz_settings_instance = $this->quiz_settings_instance;
|
621 |
+
|
622 |
+
/**
|
623 |
+
*
|
624 |
+
* Filter HubSpot addon metadata that previously saved on db to be processed
|
625 |
+
*
|
626 |
+
* @since 1.4
|
627 |
+
*
|
628 |
+
* @param array $addon_meta_data
|
629 |
+
* @param int $quiz_id current Quiz ID
|
630 |
+
* @param Forminator_Form_Entry_Model $entry_model Forminator Entry Model
|
631 |
+
* @param Forminator_Addon_Hubspot_Quiz_Settings $quiz_settings_instance HubSpot Addon Quiz Settings instance
|
632 |
+
*/
|
633 |
+
$addon_meta_data = apply_filters(
|
634 |
+
'forminator_addon_hubspot_metadata',
|
635 |
+
$addon_meta_data,
|
636 |
+
$quiz_id,
|
637 |
+
$entry_model,
|
638 |
+
$quiz_settings_instance
|
639 |
+
);
|
640 |
+
|
641 |
+
/**
|
642 |
+
* Fires when HubSpot connected form delete a submission
|
643 |
+
*
|
644 |
+
* @since 1.1
|
645 |
+
*
|
646 |
+
* @param int $quiz_id current Quiz ID
|
647 |
+
* @param Forminator_Form_Entry_Model $entry_model Forminator Entry Model
|
648 |
+
* @param array $addon_meta_data addon meta data
|
649 |
+
* @param Forminator_Addon_Hubspot_Quiz_Settings $quiz_settings_instance HubSpot Addon Quiz Settings instance
|
650 |
+
*/
|
651 |
+
do_action(
|
652 |
+
'forminator_addon_hubspot_on_before_delete_submission',
|
653 |
+
$quiz_id,
|
654 |
+
$entry_model,
|
655 |
+
$addon_meta_data,
|
656 |
+
$quiz_settings_instance
|
657 |
+
);
|
658 |
+
if ( ! Forminator_Addon_Hubspot::is_enable_delete_member() ) {
|
659 |
+
// its disabled, go for it!
|
660 |
+
return true;
|
661 |
+
}
|
662 |
+
try {
|
663 |
+
|
664 |
+
$contact_to_delete = array();
|
665 |
+
$ticket_to_delete = array();
|
666 |
+
if ( is_array( $addon_meta_data ) ) {
|
667 |
+
foreach ( $addon_meta_data as $addon_meta ) {
|
668 |
+
|
669 |
+
if ( isset( $addon_meta['value'] ) && is_array( $addon_meta['value'] ) ) {
|
670 |
+
$addon_meta_value = $addon_meta['value'];
|
671 |
+
if ( isset( $addon_meta_value['is_sent'] ) && $addon_meta_value['is_sent'] ) {
|
672 |
+
if ( isset( $addon_meta_value['contact_id'] ) && ! is_null( $addon_meta_value['contact_id'] ) ) {
|
673 |
+
$contact_to_delete[] = $addon_meta_value['contact_id'];
|
674 |
+
}
|
675 |
+
if ( isset( $addon_meta_value['ticket_id'] ) && ! is_null( $addon_meta_value['ticket_id'] ) ) {
|
676 |
+
$ticket_to_delete[] = $addon_meta_value['ticket_id'];
|
677 |
+
}
|
678 |
+
}
|
679 |
+
}
|
680 |
+
}
|
681 |
+
}
|
682 |
+
|
683 |
+
$contact_to_delete = apply_filters(
|
684 |
+
'forminator_addon_hubspot_contact_to_delete',
|
685 |
+
$contact_to_delete,
|
686 |
+
$quiz_id,
|
687 |
+
$addon_meta_data,
|
688 |
+
$quiz_settings_instance
|
689 |
+
);
|
690 |
+
if ( ! empty( $contact_to_delete ) ) {
|
691 |
+
$api = $this->addon->get_api();
|
692 |
+
foreach ( $contact_to_delete as $contact ) {
|
693 |
+
|
694 |
+
if ( ! empty( $contact ) ) {
|
695 |
+
$api->delete_contact( $contact );
|
696 |
+
}
|
697 |
+
}
|
698 |
+
}
|
699 |
+
|
700 |
+
$ticket_to_delete = apply_filters(
|
701 |
+
'forminator_addon_hubspot_ticket_to_delete',
|
702 |
+
$ticket_to_delete,
|
703 |
+
$quiz_id,
|
704 |
+
$addon_meta_data,
|
705 |
+
$quiz_settings_instance
|
706 |
+
);
|
707 |
+
if ( ! empty( $ticket_to_delete ) ) {
|
708 |
+
$api = $this->addon->get_api();
|
709 |
+
foreach ( $ticket_to_delete as $ticket ) {
|
710 |
+
|
711 |
+
if ( ! empty( $ticket ) ) {
|
712 |
+
$api->delete_ticket( $ticket );
|
713 |
+
}
|
714 |
+
}
|
715 |
+
}
|
716 |
+
|
717 |
+
return true;
|
718 |
+
|
719 |
+
} catch ( Forminator_Addon_Hubspot_Exception $e ) {
|
720 |
+
// use wp_error, for future usage it can be returned to page entries
|
721 |
+
$wp_error
|
722 |
+
= new WP_Error( 'forminator_addon_hubspot_delete_contact', $e->getMessage() );
|
723 |
+
// handle this in addon by self, since page entries cant handle error messages on delete yet
|
724 |
+
wp_die(
|
725 |
+
esc_html( $wp_error->get_error_message() ),
|
726 |
+
esc_html( $this->addon->get_title() ),
|
727 |
+
array(
|
728 |
+
'response' => 200,
|
729 |
+
'back_link' => true,
|
730 |
+
)
|
731 |
+
);
|
732 |
+
|
733 |
+
return false;
|
734 |
+
}
|
735 |
+
|
736 |
+
}
|
737 |
+
}
|
addons/pro/hubspot/class-forminator-addon-hubspot-quiz-settings-exception.php
ADDED
@@ -0,0 +1,68 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/**
|
4 |
+
* Class Forminator_Addon_Hubspot_Quiz_Settings_Exception
|
5 |
+
* Wrapper of Quiz Settings HubSpot Exception
|
6 |
+
*
|
7 |
+
* @since 1.0 HubSpot Addon
|
8 |
+
*/
|
9 |
+
class Forminator_Addon_Hubspot_Quiz_Settings_Exception extends Forminator_Addon_Hubspot_Exception {
|
10 |
+
|
11 |
+
/**
|
12 |
+
* Holder of input exceptions
|
13 |
+
*
|
14 |
+
* @since 1.0 HubSpot Addon
|
15 |
+
* @var array
|
16 |
+
*/
|
17 |
+
protected $input_exceptions = array();
|
18 |
+
|
19 |
+
/**
|
20 |
+
* Forminator_Addon_Hubspot_Quiz_Settings_Exception constructor.
|
21 |
+
*
|
22 |
+
* Useful if input_id is needed for later.
|
23 |
+
* If no input_id needed, use @see Forminator_Addon_Hubspot_Exception
|
24 |
+
*
|
25 |
+
* @since 1.0 HubSpot 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 HubSpot 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 HubSpot 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 HubSpot Addon
|
63 |
+
* @return bool
|
64 |
+
*/
|
65 |
+
public function input_exceptions_is_available() {
|
66 |
+
return count( $this->input_exceptions ) > 0;
|
67 |
+
}
|
68 |
+
}
|
addons/pro/hubspot/class-forminator-addon-hubspot-quiz-settings.php
ADDED
@@ -0,0 +1,582 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
require_once dirname( __FILE__ ) . '/class-forminator-addon-hubspot-quiz-settings-exception.php';
|
4 |
+
|
5 |
+
/**
|
6 |
+
* Class Forminator_Addon_Hubspot_Quiz_Settings
|
7 |
+
* Handle how quiz settings displayed and saved
|
8 |
+
*
|
9 |
+
* @since 1.0 HubSpot Addon
|
10 |
+
*/
|
11 |
+
class Forminator_Addon_Hubspot_Quiz_Settings extends Forminator_Addon_Quiz_Settings_Abstract {
|
12 |
+
|
13 |
+
/**
|
14 |
+
* @var Forminator_Addon_Hubspot
|
15 |
+
* @since 1.0 HubSpot Addon
|
16 |
+
*/
|
17 |
+
protected $addon;
|
18 |
+
|
19 |
+
public $target_types = array();
|
20 |
+
|
21 |
+
/**
|
22 |
+
* Forminator_Addon_Hubspot_Quiz_Settings constructor.
|
23 |
+
*
|
24 |
+
* @since 1.0 HubSpot Addon
|
25 |
+
*
|
26 |
+
* @param Forminator_Addon_Abstract $addon
|
27 |
+
* @param $quiz_id
|
28 |
+
*
|
29 |
+
* @throws Forminator_Addon_Exception
|
30 |
+
*/
|
31 |
+
public function __construct( Forminator_Addon_Abstract $addon, $quiz_id ) {
|
32 |
+
parent::__construct( $addon, $quiz_id );
|
33 |
+
|
34 |
+
$this->_update_quiz_settings_error_message = __(
|
35 |
+
'The update to your settings for this quiz failed, check the quiz input and try again.',
|
36 |
+
Forminator::DOMAIN
|
37 |
+
);
|
38 |
+
}
|
39 |
+
|
40 |
+
/**
|
41 |
+
* HubSpot quiz Settings wizard
|
42 |
+
*
|
43 |
+
* @since 1.0 HubSpot Addon
|
44 |
+
* @return array
|
45 |
+
*/
|
46 |
+
public function quiz_settings_wizards() {
|
47 |
+
// numerical array steps
|
48 |
+
return array(
|
49 |
+
array(
|
50 |
+
'callback' => array( $this, 'map_fields' ),
|
51 |
+
'is_completed' => array( $this, 'map_fields_is_completed' ),
|
52 |
+
),
|
53 |
+
array(
|
54 |
+
'callback' => array( $this, 'create_ticket' ),
|
55 |
+
'is_completed' => array( $this, 'create_ticket_is_completed' ),
|
56 |
+
),
|
57 |
+
);
|
58 |
+
}
|
59 |
+
|
60 |
+
|
61 |
+
/**
|
62 |
+
* Setup Connection Name
|
63 |
+
*
|
64 |
+
* @param $submitted_data
|
65 |
+
*
|
66 |
+
* @return array
|
67 |
+
* @throws Forminator_Addon_Hubspot_Exception
|
68 |
+
* @throws Forminator_Addon_Hubspot_Wp_Api_Exception
|
69 |
+
* @throws Forminator_Addon_Hubspot_Wp_Api_Not_Found_Exception
|
70 |
+
*/
|
71 |
+
public function map_fields( $submitted_data ) {
|
72 |
+
$template = forminator_addon_hubspot_dir() . 'views/quiz-settings/create-contact.php';
|
73 |
+
|
74 |
+
$multi_id = $this->generate_multi_id();
|
75 |
+
if ( isset( $submitted_data['multi_id'] ) ) {
|
76 |
+
$multi_id = $submitted_data['multi_id'];
|
77 |
+
}
|
78 |
+
|
79 |
+
$lists = array();
|
80 |
+
$property = array();
|
81 |
+
$email_fields = array();
|
82 |
+
$forminator_field_element_ids = array();
|
83 |
+
$forminator_quiz_element_ids = array();
|
84 |
+
foreach ( $this->form_fields as $form_field ) {
|
85 |
+
// collect element ids
|
86 |
+
$forminator_field_element_ids[] = $form_field['element_id'];
|
87 |
+
if ( 'email' === $form_field['type'] ) {
|
88 |
+
$email_fields[] = $form_field;
|
89 |
+
}
|
90 |
+
}
|
91 |
+
|
92 |
+
$quiz_questions = $this->get_quiz_fields();
|
93 |
+
$quiz_fields = array(
|
94 |
+
'quiz-name' => __( 'Quiz Name', Forminator::DOMAIN ),
|
95 |
+
);
|
96 |
+
foreach ( $quiz_questions as $quiz_question ) {
|
97 |
+
// collect element ids
|
98 |
+
$forminator_quiz_element_ids[] = $quiz_question['slug'];
|
99 |
+
$quiz_fields[ $quiz_question['slug'] ] = $quiz_question['title'];
|
100 |
+
}
|
101 |
+
if ( 'knowledge' === $this->quiz->quiz_type ) {
|
102 |
+
$quiz_fields['correct-answers'] = __( 'Correct Answers', Forminator::DOMAIN );
|
103 |
+
$quiz_fields['total-answers'] = __( 'Total Answers', Forminator::DOMAIN );
|
104 |
+
array_push( $forminator_quiz_element_ids, 'quiz-name', 'correct-answers', 'total-answers' );
|
105 |
+
} elseif ( 'nowrong' === $this->quiz->quiz_type ) {
|
106 |
+
$quiz_fields['result-answers'] = __( 'Result Answer', Forminator::DOMAIN );
|
107 |
+
array_push( $forminator_quiz_element_ids, 'quiz-name', 'result-answers' );
|
108 |
+
}
|
109 |
+
|
110 |
+
$forminator_field_element_ids = array_merge( $forminator_field_element_ids, $forminator_quiz_element_ids );
|
111 |
+
|
112 |
+
$template_params = array(
|
113 |
+
'fields_map' => $this->get_multi_id_quiz_settings_value( $multi_id, 'fields_map', array() ),
|
114 |
+
'error_message' => '',
|
115 |
+
'multi_id' => $multi_id,
|
116 |
+
'fields' => array(),
|
117 |
+
'form_fields' => $this->form_fields,
|
118 |
+
'quiz_fields' => $quiz_fields,
|
119 |
+
'email_fields' => $email_fields,
|
120 |
+
'list_id' => $this->get_multi_id_quiz_settings_value( $multi_id, 'list_id', '' ),
|
121 |
+
'list_name' => $this->get_multi_id_quiz_settings_value( $multi_id, 'list_name', '' ),
|
122 |
+
'custom_fields_map' => $this->get_multi_id_quiz_settings_value( $multi_id, 'custom_fields_map', array() ),
|
123 |
+
);
|
124 |
+
|
125 |
+
unset( $submitted_data['multi_id'] );
|
126 |
+
|
127 |
+
$fields = array(
|
128 |
+
'email' => __( 'Email Address', Forminator::DOMAIN ),
|
129 |
+
'firstname' => __( 'First Name', Forminator::DOMAIN ),
|
130 |
+
'lastname' => __( 'Last Name', Forminator::DOMAIN ),
|
131 |
+
'jobtitle' => __( 'Job Title', Forminator::DOMAIN ),
|
132 |
+
);
|
133 |
+
$template_params['fields'] = $fields;
|
134 |
+
try {
|
135 |
+
$api = $this->addon->get_api();
|
136 |
+
$lists_request = $api->get_contact_list();
|
137 |
+
$lists_property = $api->get_properties();
|
138 |
+
|
139 |
+
if ( ! empty( $lists_request->lists ) ) {
|
140 |
+
foreach ( $lists_request->lists as $key => $data ) {
|
141 |
+
if ( isset( $data->listId ) && isset( $data->name ) ) {
|
142 |
+
$lists[ $data->listId ] = $data->name;
|
143 |
+
}
|
144 |
+
}
|
145 |
+
}
|
146 |
+
if ( ! empty( $lists_property ) ) {
|
147 |
+
foreach ( $lists_property as $key => $data ) {
|
148 |
+
if ( isset( $data->name ) ) {
|
149 |
+
$property[ $data->name ] = $data->label;
|
150 |
+
}
|
151 |
+
}
|
152 |
+
}
|
153 |
+
} catch ( Forminator_Addon_Hubspot_Quiz_Settings_Exception $e ) {
|
154 |
+
$template_params['error_message'] = $e->getMessage();
|
155 |
+
$has_errors = true;
|
156 |
+
}
|
157 |
+
|
158 |
+
$template_params['lists'] = $lists;
|
159 |
+
$template_params['properties'] = $property;
|
160 |
+
$is_submit = ! empty( $submitted_data );
|
161 |
+
$has_errors = false;
|
162 |
+
if ( $is_submit ) {
|
163 |
+
$custom_property = isset( $submitted_data['custom_property'] ) ? $submitted_data['custom_property'] : array();
|
164 |
+
$custom_field = isset( $submitted_data['custom_field'] ) ? $submitted_data['custom_field'] : array();
|
165 |
+
$custom_field_map = array_combine( $custom_property, $custom_field );
|
166 |
+
$fields_map = isset( $submitted_data['fields_map'] ) ? $submitted_data['fields_map'] : array();
|
167 |
+
$template_params['fields_map'] = $fields_map;
|
168 |
+
$template_params['custom_fields_map'] = $custom_field_map;
|
169 |
+
|
170 |
+
try {
|
171 |
+
$input_exceptions = new Forminator_Addon_Hubspot_Quiz_Settings_Exception();
|
172 |
+
if ( ! isset( $fields_map['email'] ) || empty( $fields_map['email'] ) ) {
|
173 |
+
$input_exceptions->add_input_exception( 'Please assign field for Email Address', 'email_error' );
|
174 |
+
}
|
175 |
+
$fields_map_to_save = array();
|
176 |
+
foreach ( $fields as $key => $title ) {
|
177 |
+
if ( isset( $fields_map[ $key ] ) && ! empty( $fields_map[ $key ] ) ) {
|
178 |
+
$element_id = $fields_map[ $key ];
|
179 |
+
if ( ! in_array( $element_id, $forminator_field_element_ids, true ) ) {
|
180 |
+
$input_exceptions->add_input_exception(/* translators: ... */
|
181 |
+
sprintf( __( 'Please assign valid field for %s', Forminator::DOMAIN ), $title ),
|
182 |
+
$key . '_error'
|
183 |
+
);
|
184 |
+
continue;
|
185 |
+
}
|
186 |
+
|
187 |
+
$fields_map_to_save[ $key ] = $fields_map[ $key ];
|
188 |
+
}
|
189 |
+
}
|
190 |
+
|
191 |
+
if ( $input_exceptions->input_exceptions_is_available() ) {
|
192 |
+
throw $input_exceptions;
|
193 |
+
}
|
194 |
+
|
195 |
+
$list_id = isset( $submitted_data['list_id'] ) ? $submitted_data['list_id'] : '';
|
196 |
+
|
197 |
+
$list_name = isset( $lists[ $list_id ] ) ? $lists[ $list_id ] : '';
|
198 |
+
|
199 |
+
$this->save_multi_id_quiz_setting_values(
|
200 |
+
$multi_id,
|
201 |
+
array(
|
202 |
+
'fields_map' => $fields_map,
|
203 |
+
'custom_fields_map' => $custom_field_map,
|
204 |
+
'list_id' => $list_id,
|
205 |
+
'list_name' => $list_name,
|
206 |
+
)
|
207 |
+
);
|
208 |
+
|
209 |
+
} catch ( Forminator_Addon_Hubspot_Quiz_Settings_Exception $e ) {
|
210 |
+
$template_params = array_merge( $template_params, $e->get_input_exceptions() );
|
211 |
+
$has_errors = true;
|
212 |
+
} catch ( Forminator_Addon_Hubspot_Exception $e ) {
|
213 |
+
$template_params['error_message'] = $e->getMessage();
|
214 |
+
$has_errors = true;
|
215 |
+
}
|
216 |
+
}
|
217 |
+
|
218 |
+
$buttons = array();
|
219 |
+
|
220 |
+
if ( $this->map_fields_is_completed( array( 'multi_id' => $multi_id ) ) ) {
|
221 |
+
$buttons['disconnect']['markup'] = Forminator_Addon_Abstract::get_button_markup(
|
222 |
+
esc_html__( 'Deactivate', Forminator::DOMAIN ),
|
223 |
+
'sui-button-ghost sui-tooltip sui-tooltip-top-center forminator-addon-form-disconnect',
|
224 |
+
esc_html__( 'Deactivate this HubSpot Integration from this Form.', Forminator::DOMAIN )
|
225 |
+
);
|
226 |
+
}
|
227 |
+
|
228 |
+
$buttons['next']['markup'] = '<div class="sui-actions-right">' .
|
229 |
+
Forminator_Addon_Abstract::get_button_markup( esc_html__( 'Continue', Forminator::DOMAIN ), 'forminator-addon-next' ) .
|
230 |
+
'</div>';
|
231 |
+
|
232 |
+
return array(
|
233 |
+
'html' => Forminator_Addon_Abstract::get_template( $template, $template_params ),
|
234 |
+
'buttons' => $buttons,
|
235 |
+
'size' => 'normal',
|
236 |
+
'redirect' => false,
|
237 |
+
'has_errors' => $has_errors,
|
238 |
+
);
|
239 |
+
}
|
240 |
+
|
241 |
+
/**
|
242 |
+
* Check if pick name step completed
|
243 |
+
*
|
244 |
+
* @since 1.0 HubSpot Addon
|
245 |
+
*
|
246 |
+
* @param $submitted_data
|
247 |
+
*
|
248 |
+
* @return bool
|
249 |
+
*/
|
250 |
+
public function map_fields_is_completed( $submitted_data ) {
|
251 |
+
$multi_id = '';
|
252 |
+
|
253 |
+
if ( isset( $submitted_data['multi_id'] ) ) {
|
254 |
+
$multi_id = $submitted_data['multi_id'];
|
255 |
+
}
|
256 |
+
|
257 |
+
if ( empty( $multi_id ) ) {
|
258 |
+
return false;
|
259 |
+
}
|
260 |
+
|
261 |
+
$fields_map = $this->get_multi_id_quiz_settings_value( $multi_id, 'fields_map', array() );
|
262 |
+
|
263 |
+
if ( empty( $fields_map ) || ! is_array( $fields_map ) || count( $fields_map ) < 1 ) {
|
264 |
+
return false;
|
265 |
+
}
|
266 |
+
|
267 |
+
if ( ! isset( $fields_map['email'] ) || empty( $fields_map['email'] ) ) {
|
268 |
+
return false;
|
269 |
+
}
|
270 |
+
|
271 |
+
return true;
|
272 |
+
}
|
273 |
+
|
274 |
+
/**
|
275 |
+
* Setup Create ticket
|
276 |
+
*
|
277 |
+
* @param $submitted_data
|
278 |
+
*
|
279 |
+
* @return array
|
280 |
+
* @throws Forminator_Addon_Aweber_Exception
|
281 |
+
*/
|
282 |
+
public function create_ticket( $submitted_data ) {
|
283 |
+
$template = forminator_addon_hubspot_dir() . 'views/quiz-settings/create-ticket.php';
|
284 |
+
|
285 |
+
if ( ! isset( $submitted_data['multi_id'] ) ) {
|
286 |
+
return $this->get_force_closed_wizard( __( 'Please pick valid connection', Forminator::DOMAIN ) );
|
287 |
+
}
|
288 |
+
|
289 |
+
$multi_id = $submitted_data['multi_id'];
|
290 |
+
|
291 |
+
$is_poll = false;
|
292 |
+
$file_fields = array();
|
293 |
+
$forminator_field_element_ids = array();
|
294 |
+
foreach ( $this->form_fields as $form_field ) {
|
295 |
+
// collect element ids
|
296 |
+
$forminator_field_element_ids[] = $form_field['element_id'];
|
297 |
+
if ( 'upload' === $form_field['type'] ) {
|
298 |
+
$file_fields[] = $form_field;
|
299 |
+
}
|
300 |
+
}
|
301 |
+
|
302 |
+
$template_params = array(
|
303 |
+
'form_fields' => $this->form_fields,
|
304 |
+
'file_fields' => $file_fields,
|
305 |
+
'create_ticket' => $this->get_multi_id_quiz_settings_value( $multi_id, 'create_ticket', '' ),
|
306 |
+
'pipeline_id' => $this->get_multi_id_quiz_settings_value( $multi_id, 'pipeline_id', '' ),
|
307 |
+
'pipeline_name' => $this->get_multi_id_quiz_settings_value( $multi_id, 'pipeline_name', '' ),
|
308 |
+
'status_id' => $this->get_multi_id_quiz_settings_value( $multi_id, 'status_id', '' ),
|
309 |
+
'status_name' => $this->get_multi_id_quiz_settings_value( $multi_id, 'status_name', '' ),
|
310 |
+
'ticket_name' => $this->get_multi_id_quiz_settings_value( $multi_id, 'ticket_name', '' ),
|
311 |
+
'ticket_description' => $this->get_multi_id_quiz_settings_value( $multi_id, 'ticket_description', '' ),
|
312 |
+
'supported_file' => $this->get_multi_id_quiz_settings_value( $multi_id, 'supported_file', '' ),
|
313 |
+
'list_id_error' => '',
|
314 |
+
'multi_id' => $multi_id,
|
315 |
+
'error_message' => '',
|
316 |
+
'auth_url' => $this->addon->get_auth_url(),
|
317 |
+
);
|
318 |
+
|
319 |
+
$settings = $this->addon->get_settings_values();
|
320 |
+
if ( ! empty( $settings['token'] ) ) {
|
321 |
+
$template_params['token'] = $settings['token'];
|
322 |
+
}
|
323 |
+
|
324 |
+
$buttonID = 'ticket-activate';
|
325 |
+
if ( ! empty( $settings['re-authorize'] ) ) {
|
326 |
+
$template_params['re-authorize'] = $settings['re-authorize'];
|
327 |
+
$buttonID = 'ticket-activated';
|
328 |
+
}
|
329 |
+
|
330 |
+
if ( ( isset( $submitted_data['create_ticket'] ) && '1' === $submitted_data['create_ticket'] ) && empty( $settings['re-authorize'] ) ) {
|
331 |
+
$is_poll = true;
|
332 |
+
}
|
333 |
+
|
334 |
+
unset( $submitted_data['multi_id'] );
|
335 |
+
|
336 |
+
$is_submit = ! empty( $submitted_data );
|
337 |
+
$has_errors = false;
|
338 |
+
$notification = array();
|
339 |
+
$is_close = false;
|
340 |
+
|
341 |
+
$pipeline = array();
|
342 |
+
$status = array();
|
343 |
+
|
344 |
+
try {
|
345 |
+
|
346 |
+
$api = $this->addon->get_api();
|
347 |
+
$pipeline_request = $api->get_pipeline();
|
348 |
+
if ( ! empty( $submitted_data['pipeline_id'] ) ) {
|
349 |
+
$pipelineId = $submitted_data['pipeline_id'];
|
350 |
+
} else {
|
351 |
+
$pipelineId = $this->get_multi_id_quiz_settings_value( $multi_id, 'pipeline_id', 0 );
|
352 |
+
}
|
353 |
+
if ( ! empty( $pipeline_request->results ) ) {
|
354 |
+
$default_status = reset( $pipeline_request->results );
|
355 |
+
foreach ( $pipeline_request->results as $key => $data ) {
|
356 |
+
if ( isset( $data->pipelineId ) ) {
|
357 |
+
$pipeline[ $data->pipelineId ] = $data->label;
|
358 |
+
if ( $pipelineId === $data->pipelineId ) {
|
359 |
+
$pipeline_status = $data->stages;
|
360 |
+
} else {
|
361 |
+
$pipeline_status = $default_status->stages;
|
362 |
+
}
|
363 |
+
if ( ! empty( $pipeline_status ) ) {
|
364 |
+
foreach ( $pipeline_status as $s => $stat ) {
|
365 |
+
if ( isset( $stat->stageId ) ) {
|
366 |
+
$status[ $stat->stageId ] = $stat->label;
|
367 |
+
}
|
368 |
+
}
|
369 |
+
}
|
370 |
+
}
|
371 |
+
}
|
372 |
+
}
|
373 |
+
if ( empty( $pipeline ) ) {
|
374 |
+
throw new Forminator_Addon_Hubspot_Exception( __( 'No pipeline found on your HubSpot account. Please create one.', Forminator::DOMAIN ) );
|
375 |
+
}
|
376 |
+
|
377 |
+
if ( empty( $status ) ) {
|
378 |
+
throw new Forminator_Addon_Hubspot_Exception( __( 'No status found on your HubSpot account. Please create one.', Forminator::DOMAIN ) );
|
379 |
+
}
|
380 |
+
|
381 |
+
$template_params['status'] = $status;
|
382 |
+
$template_params['pipeline'] = $pipeline;
|
383 |
+
|
384 |
+
} catch ( Forminator_Addon_Hubspot_Exception $e ) {
|
385 |
+
$template_params['error_message'] = $e->getMessage();
|
386 |
+
$has_errors = true;
|
387 |
+
}
|
388 |
+
|
389 |
+
if ( $is_submit ) {
|
390 |
+
$pipeline_id = isset( $submitted_data['pipeline_id'] ) ? $submitted_data['pipeline_id'] : null;
|
391 |
+
$status_id = isset( $submitted_data['status_id'] ) ? $submitted_data['status_id'] : null;
|
392 |
+
$ticket_name = isset( $submitted_data['ticket_name'] ) ? $submitted_data['ticket_name'] : '';
|
393 |
+
$ticket_description = isset( $submitted_data['ticket_description'] ) ? $submitted_data['ticket_description'] : '';
|
394 |
+
$create_ticket = isset( $submitted_data['create_ticket'] ) ? $submitted_data['create_ticket'] : '';
|
395 |
+
$supported_file = isset( $submitted_data['supported_file'] ) ? $submitted_data['supported_file'] : '';
|
396 |
+
$template_params['pipeline_id'] = $pipeline_id;
|
397 |
+
$template_params['status_id'] = $status_id;
|
398 |
+
$template_params['ticket_name'] = $ticket_name;
|
399 |
+
$template_params['ticket_description'] = $ticket_description;
|
400 |
+
$template_params['create_ticket'] = $create_ticket;
|
401 |
+
$template_params['supported_file'] = $supported_file;
|
402 |
+
try {
|
403 |
+
|
404 |
+
$input_exceptions = new Forminator_Addon_Hubspot_Quiz_Settings_Exception();
|
405 |
+
if ( '1' === $create_ticket && isset( $submitted_data['pipeline_id'] ) && empty( $submitted_data['pipeline_id'] )
|
406 |
+
&& 0 !== (int) $submitted_data['pipeline_id'] ) {
|
407 |
+
$input_exceptions->add_input_exception( 'Please select pipeline', 'pipeline_error' );
|
408 |
+
}
|
409 |
+
if ( '1' === $create_ticket && isset( $submitted_data['status_id'] ) && empty( $submitted_data['status_id'] )
|
410 |
+
&& 0 !== (int) $submitted_data['status_id'] ) {
|
411 |
+
$input_exceptions->add_input_exception( 'Please select status', 'status_error' );
|
412 |
+
}
|
413 |
+
|
414 |
+
if ( '1' === $create_ticket && isset( $submitted_data['ticket_name'] ) && empty( $submitted_data['ticket_name'] ) ) {
|
415 |
+
$input_exceptions->add_input_exception( 'Please enter ticket name', 'ticket_name_error' );
|
416 |
+
}
|
417 |
+
|
418 |
+
if ( $input_exceptions->input_exceptions_is_available() ) {
|
419 |
+
throw $input_exceptions;
|
420 |
+
}
|
421 |
+
|
422 |
+
if ( empty( $create_ticket ) || ( '1' === $create_ticket && isset( $submitted_data['ticket_name'] ) ) ) {
|
423 |
+
$pipeline_name = $pipeline[ $pipeline_id ];
|
424 |
+
$status_name = $status[ $status_id ];
|
425 |
+
|
426 |
+
$this->save_multi_id_quiz_setting_values(
|
427 |
+
$multi_id,
|
428 |
+
array(
|
429 |
+
'pipeline_id' => $pipeline_id,
|
430 |
+
'pipeline_name' => $pipeline_name,
|
431 |
+
'status_id' => $status_id,
|
432 |
+
'status_name' => $status_name,
|
433 |
+
'ticket_name' => $ticket_name,
|
434 |
+
'ticket_description' => $ticket_description,
|
435 |
+
'create_ticket' => $create_ticket,
|
436 |
+
'supported_file' => $supported_file
|
437 |
+
)
|
438 |
+
);
|
439 |
+
$notification = array(
|
440 |
+
'type' => 'success',
|
441 |
+
'text' => '<strong>' . $this->addon->get_title() . '</strong> ' . __( 'is activated successfully.' ),
|
442 |
+
);
|
443 |
+
$is_close = true;
|
444 |
+
}
|
445 |
+
|
446 |
+
} catch ( Forminator_Addon_Hubspot_Quiz_Settings_Exception $e ) {
|
447 |
+
$template_params = array_merge( $template_params, $e->get_input_exceptions() );
|
448 |
+
$has_errors = true;
|
449 |
+
} catch ( Forminator_Addon_Hubspot_Exception $e ) {
|
450 |
+
$template_params['ticket_error'] = $e->getMessage();
|
451 |
+
$has_errors = true;
|
452 |
+
}
|
453 |
+
}
|
454 |
+
|
455 |
+
$buttons = array();
|
456 |
+
if ( $this->create_ticket_is_completed( array( 'multi_id' => $multi_id ) ) ) {
|
457 |
+
$buttons['disconnect']['markup'] = Forminator_Addon_Abstract::get_button_markup(
|
458 |
+
esc_html__( 'Deactivate', Forminator::DOMAIN ),
|
459 |
+
'sui-button-ghost sui-tooltip sui-tooltip-top-center forminator-addon-form-disconnect',
|
460 |
+
esc_html__( 'Deactivate this HubSpot Integration from this Form.', Forminator::DOMAIN )
|
461 |
+
);
|
462 |
+
$buttons['next']['markup'] = '<div class="sui-actions-right">' .
|
463 |
+
Forminator_Addon_Abstract::get_button_markup( esc_html__( 'Update', Forminator::DOMAIN ), 'forminator-addon-next sui-button-blue' ) .
|
464 |
+
'</div>';
|
465 |
+
} else if ( ( isset( $submitted_data['create_ticket'] ) && '1' === $submitted_data['create_ticket'] ) && empty( $settings['re-authorize'] ) ) {
|
466 |
+
$buttons = array();
|
467 |
+
} else {
|
468 |
+
$buttons['next']['markup'] = '<div class="sui-actions-right" id="' . $buttonID . '">' .
|
469 |
+
Forminator_Addon_Abstract::get_button_markup( esc_html__( 'Activate', Forminator::DOMAIN ), 'forminator-addon-next sui-button-blue' ) .
|
470 |
+
'</div>';
|
471 |
+
}
|
472 |
+
|
473 |
+
return array(
|
474 |
+
'html' => Forminator_Addon_Abstract::get_template( $template, $template_params ),
|
475 |
+
'buttons' => $buttons,
|
476 |
+
'size' => 'reduced',
|
477 |
+
'redirect' => false,
|
478 |
+
'has_errors' => $has_errors,
|
479 |
+
'has_back' => true,
|
480 |
+
'notification' => $notification,
|
481 |
+
'is_close' => $is_close,
|
482 |
+
'is_poll' => $is_poll,
|
483 |
+
);
|
484 |
+
}
|
485 |
+
|
486 |
+
/**
|
487 |
+
* Check if setup list completed
|
488 |
+
*
|
489 |
+
* @since 1.0 HubSpot Addon
|
490 |
+
*
|
491 |
+
* @param $submitted_data
|
492 |
+
*
|
493 |
+
* @return bool
|
494 |
+
*/
|
495 |
+
public function create_ticket_is_completed( $submitted_data ) {
|
496 |
+
$multi_id = '';
|
497 |
+
if ( isset( $submitted_data['multi_id'] ) ) {
|
498 |
+
$multi_id = $submitted_data['multi_id'];
|
499 |
+
}
|
500 |
+
|
501 |
+
if ( empty( $multi_id ) ) {
|
502 |
+
return false;
|
503 |
+
}
|
504 |
+
|
505 |
+
$create_ticket = $this->get_multi_id_quiz_settings_value( $multi_id, 'create_ticket', '' );
|
506 |
+
$pipeline_id = $this->get_multi_id_quiz_settings_value( $multi_id, 'pipeline_id', '' );
|
507 |
+
$status_id = $this->get_multi_id_quiz_settings_value( $multi_id, 'status_id', '' );
|
508 |
+
$ticket_name = $this->get_multi_id_quiz_settings_value( $multi_id, 'ticket_name', '' );
|
509 |
+
|
510 |
+
if ( ( empty( $create_ticket ) || '1' === $create_ticket ) && empty( $pipeline_id ) && empty( $status_id ) && empty( $ticket_name ) ) {
|
511 |
+
return false;
|
512 |
+
}
|
513 |
+
|
514 |
+
return true;
|
515 |
+
}
|
516 |
+
|
517 |
+
|
518 |
+
/**
|
519 |
+
* Check if multi_id form settings values completed
|
520 |
+
*
|
521 |
+
* @since 1.0 HubSpot Added
|
522 |
+
*
|
523 |
+
* @param $multi_id
|
524 |
+
*
|
525 |
+
* @return bool
|
526 |
+
*/
|
527 |
+
public function is_multi_quiz_settings_complete( $multi_id ) {
|
528 |
+
$data = array( 'multi_id' => $multi_id );
|
529 |
+
|
530 |
+
if ( ! $this->map_fields_is_completed( $data ) ) {
|
531 |
+
return false;
|
532 |
+
}
|
533 |
+
|
534 |
+
return true;
|
535 |
+
}
|
536 |
+
|
537 |
+
/**
|
538 |
+
* Generate multi id for multiple connection
|
539 |
+
*
|
540 |
+
* @since 1.0 HubSpot Addon
|
541 |
+
* @return string
|
542 |
+
*/
|
543 |
+
public function generate_multi_id() {
|
544 |
+
return uniqid( 'hubspot_', true );
|
545 |
+
}
|
546 |
+
|
547 |
+
|
548 |
+
/**
|
549 |
+
* Override how multi connection displayed
|
550 |
+
*
|
551 |
+
* @since 1.0 HubSpot Addon
|
552 |
+
* @return array
|
553 |
+
*/
|
554 |
+
public function get_multi_ids() {
|
555 |
+
$multi_ids = array();
|
556 |
+
foreach ( $this->get_quiz_settings_values() as $key => $value ) {
|
557 |
+
$multi_ids[] = array(
|
558 |
+
'id' => $key,
|
559 |
+
// use name that was added by user on creating connection
|
560 |
+
'label' => isset( $value['name'] ) ? $value['name'] : $key,
|
561 |
+
);
|
562 |
+
}
|
563 |
+
|
564 |
+
return $multi_ids;
|
565 |
+
}
|
566 |
+
|
567 |
+
/**
|
568 |
+
* Disconnect a connection from current form
|
569 |
+
*
|
570 |
+
* @since 1.0 HubSpot Addon
|
571 |
+
*
|
572 |
+
* @param array $submitted_data
|
573 |
+
*/
|
574 |
+
public function disconnect_form( $submitted_data ) {
|
575 |
+
// only execute if multi_id provided on submitted data
|
576 |
+
if ( isset( $submitted_data['multi_id'] ) && ! empty( $submitted_data['multi_id'] ) ) {
|
577 |
+
$addon_quiz_settings = $this->get_quiz_settings_values();
|
578 |
+
unset( $addon_quiz_settings[ $submitted_data['multi_id'] ] );
|
579 |
+
$this->save_quiz_settings_values( $addon_quiz_settings );
|
580 |
+
}
|
581 |
+
}
|
582 |
+
}
|
addons/pro/hubspot/class-forminator-addon-hubspot.php
CHANGED
@@ -16,24 +16,27 @@ final class Forminator_Addon_Hubspot extends Forminator_Addon_Abstract {
|
|
16 |
*/
|
17 |
private static $_instance = null;
|
18 |
|
19 |
-
protected $_slug
|
20 |
-
protected $_version
|
21 |
protected $_min_forminator_version = '1.1';
|
22 |
-
protected $_short_title
|
23 |
-
protected $_title
|
24 |
-
protected $_url
|
25 |
-
protected $_full_path
|
26 |
|
27 |
protected $_form_settings = 'Forminator_Addon_Hubspot_Form_Settings';
|
28 |
-
protected $_form_hooks
|
|
|
|
|
|
|
29 |
|
30 |
private $_token = '';
|
31 |
|
32 |
private $_auth_error_message = '';
|
33 |
|
34 |
-
const TARGET_TYPE_PUBLIC_CHANNEL
|
35 |
const TARGET_TYPE_PRIVATE_CHANNEL = 'private_channel';
|
36 |
-
const TARGET_TYPE_DIRECT_MESSAGE
|
37 |
|
38 |
/**
|
39 |
* @var null|Forminator_Addon_Hubspot_Wp_Api
|
@@ -140,7 +143,7 @@ final class Forminator_Addon_Hubspot extends Forminator_Addon_Abstract {
|
|
140 |
try {
|
141 |
$form_settings_instance = null;
|
142 |
if ( ! $this->is_connected() ) {
|
143 |
-
throw new Forminator_Addon_Hubspot_Exception( __( '
|
144 |
}
|
145 |
|
146 |
$form_settings_instance = $this->get_addon_form_settings( $form_id );
|
@@ -254,7 +257,7 @@ final class Forminator_Addon_Hubspot extends Forminator_Addon_Abstract {
|
|
254 |
'markup' => self::get_button_markup( esc_html__( 'DISCONNECT', Forminator::DOMAIN ), 'sui-button-ghost forminator-addon-disconnect' ),
|
255 |
);
|
256 |
|
257 |
-
$setting_values
|
258 |
$template_params = array(
|
259 |
'auth_url' => $this->get_auth_url(),
|
260 |
'token' => $this->_token,
|
@@ -500,8 +503,8 @@ final class Forminator_Addon_Hubspot extends Forminator_Addon_Abstract {
|
|
500 |
}
|
501 |
$user = $api->get_access_token_information();
|
502 |
|
503 |
-
$settings['token']
|
504 |
-
$settings['user']
|
505 |
$settings['re-authorize'] = 'ticket';
|
506 |
$this->save_settings_values( $settings );
|
507 |
$template_params['is_close'] = true;
|
@@ -618,4 +621,114 @@ final class Forminator_Addon_Hubspot extends Forminator_Addon_Abstract {
|
|
618 |
wp_send_json_error( $e->getMessage() );
|
619 |
}
|
620 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
621 |
}
|
16 |
*/
|
17 |
private static $_instance = null;
|
18 |
|
19 |
+
protected $_slug = 'hubspot';
|
20 |
+
protected $_version = FORMINATOR_ADDON_HUBSPOT_VERSION;
|
21 |
protected $_min_forminator_version = '1.1';
|
22 |
+
protected $_short_title = 'HubSpot';
|
23 |
+
protected $_title = 'HubSpot';
|
24 |
+
protected $_url = 'https://premium.wpmudev.org';
|
25 |
+
protected $_full_path = __FILE__;
|
26 |
|
27 |
protected $_form_settings = 'Forminator_Addon_Hubspot_Form_Settings';
|
28 |
+
protected $_form_hooks = 'Forminator_Addon_Hubspot_Form_Hooks';
|
29 |
+
|
30 |
+
protected $_quiz_settings = 'Forminator_Addon_Hubspot_Quiz_Settings';
|
31 |
+
protected $_quiz_hooks = 'Forminator_Addon_Hubspot_Quiz_Hooks';
|
32 |
|
33 |
private $_token = '';
|
34 |
|
35 |
private $_auth_error_message = '';
|
36 |
|
37 |
+
const TARGET_TYPE_PUBLIC_CHANNEL = 'public_channel';
|
38 |
const TARGET_TYPE_PRIVATE_CHANNEL = 'private_channel';
|
39 |
+
const TARGET_TYPE_DIRECT_MESSAGE = 'direct_message';
|
40 |
|
41 |
/**
|
42 |
* @var null|Forminator_Addon_Hubspot_Wp_Api
|
143 |
try {
|
144 |
$form_settings_instance = null;
|
145 |
if ( ! $this->is_connected() ) {
|
146 |
+
throw new Forminator_Addon_Hubspot_Exception( __( 'HubSpot is not connected', Forminator::DOMAIN ) );
|
147 |
}
|
148 |
|
149 |
$form_settings_instance = $this->get_addon_form_settings( $form_id );
|
257 |
'markup' => self::get_button_markup( esc_html__( 'DISCONNECT', Forminator::DOMAIN ), 'sui-button-ghost forminator-addon-disconnect' ),
|
258 |
);
|
259 |
|
260 |
+
$setting_values = $this->get_settings_values();
|
261 |
$template_params = array(
|
262 |
'auth_url' => $this->get_auth_url(),
|
263 |
'token' => $this->_token,
|
503 |
}
|
504 |
$user = $api->get_access_token_information();
|
505 |
|
506 |
+
$settings['token'] = $token;
|
507 |
+
$settings['user'] = $user;
|
508 |
$settings['re-authorize'] = 'ticket';
|
509 |
$this->save_settings_values( $settings );
|
510 |
$template_params['is_close'] = true;
|
621 |
wp_send_json_error( $e->getMessage() );
|
622 |
}
|
623 |
}
|
624 |
+
|
625 |
+
/**
|
626 |
+
* Check if HubSpot is connected with current quiz
|
627 |
+
*
|
628 |
+
* @since 1.0 HubSpot Addon
|
629 |
+
*
|
630 |
+
* @param $quiz_id
|
631 |
+
*
|
632 |
+
* @return bool
|
633 |
+
*/
|
634 |
+
public function is_quiz_connected( $quiz_id ) {
|
635 |
+
try {
|
636 |
+
$quiz_settings_instance = null;
|
637 |
+
if ( ! $this->is_connected() ) {
|
638 |
+
throw new Forminator_Addon_Hubspot_Exception( __( 'HubSpot is not connected', Forminator::DOMAIN ) );
|
639 |
+
}
|
640 |
+
|
641 |
+
$quiz_settings_instance = $this->get_addon_quiz_settings( $quiz_id );
|
642 |
+
if ( ! $quiz_settings_instance instanceof Forminator_Addon_Hubspot_Quiz_Settings ) {
|
643 |
+
throw new Forminator_Addon_Hubspot_Exception( __( 'Invalid Quiz Settings of HubSpot', Forminator::DOMAIN ) );
|
644 |
+
}
|
645 |
+
|
646 |
+
// Mark as active when there is at least one active connection
|
647 |
+
if ( false === $quiz_settings_instance->find_one_active_connection() ) {
|
648 |
+
throw new Forminator_Addon_Hubspot_Exception( __( 'No active HubSpot connection found in this quiz', Forminator::DOMAIN ) );
|
649 |
+
}
|
650 |
+
|
651 |
+
$is_quiz_connected = true;
|
652 |
+
|
653 |
+
} catch ( Forminator_Addon_Hubspot_Exception $e ) {
|
654 |
+
$is_quiz_connected = false;
|
655 |
+
}
|
656 |
+
|
657 |
+
/**
|
658 |
+
* Filter connected status of HubSpot with the form
|
659 |
+
*
|
660 |
+
* @since 1.0
|
661 |
+
*
|
662 |
+
* @param bool $is_quiz_connected
|
663 |
+
* @param int $quiz_id Current Quiz ID
|
664 |
+
* @param Forminator_Addon_Hubspot_Quiz_Settings|null $quiz_settings_instance Instance of quiz settings, or null when unavailable
|
665 |
+
*
|
666 |
+
*/
|
667 |
+
$is_quiz_connected = apply_filters( 'forminator_addon_hubspot_is_form_connected', $is_quiz_connected, $quiz_id, $quiz_settings_instance );
|
668 |
+
|
669 |
+
return $is_quiz_connected;
|
670 |
+
}
|
671 |
+
|
672 |
+
/**
|
673 |
+
* Flag for check if has lead form addon connected to a quiz
|
674 |
+
* by default it will check if last step of form settings already completed by user
|
675 |
+
*
|
676 |
+
* @since 1.0 Hubspot Addon
|
677 |
+
*
|
678 |
+
* @param $quiz_id
|
679 |
+
*
|
680 |
+
* @return bool
|
681 |
+
*/
|
682 |
+
public function is_quiz_lead_connected( $quiz_id ) {
|
683 |
+
|
684 |
+
try {
|
685 |
+
// initialize with null
|
686 |
+
$quiz_settings_instance = null;
|
687 |
+
if ( ! $this->is_connected() ) {
|
688 |
+
throw new Forminator_Addon_Hubspot_Exception( __( 'HubSpot is not connected', Forminator::DOMAIN ) );
|
689 |
+
}
|
690 |
+
|
691 |
+
$quiz_settings_instance = $this->get_addon_quiz_settings( $quiz_id );
|
692 |
+
if ( ! $quiz_settings_instance instanceof Forminator_Addon_Hubspot_Quiz_Settings ) {
|
693 |
+
throw new Forminator_Addon_Hubspot_Exception( __( 'Invalid Quiz Settings of HubSpot', Forminator::DOMAIN ) );
|
694 |
+
}
|
695 |
+
|
696 |
+
$quiz_settings = $quiz_settings_instance->get_quiz_settings();
|
697 |
+
|
698 |
+
if ( isset( $quiz_settings['hasLeads'] ) && $quiz_settings['hasLeads'] ) {
|
699 |
+
$is_quiz_connected = true;
|
700 |
+
} else {
|
701 |
+
$is_quiz_connected = false;
|
702 |
+
}
|
703 |
+
} catch ( Forminator_Addon_Hubspot_Exception $e ) {
|
704 |
+
$is_quiz_connected = false;
|
705 |
+
|
706 |
+
forminator_addon_maybe_log( __METHOD__, $e->getMessage() );
|
707 |
+
}
|
708 |
+
|
709 |
+
/**
|
710 |
+
* Filter connected status of Hubspot with the form
|
711 |
+
*
|
712 |
+
* @since 1.1
|
713 |
+
*
|
714 |
+
* @param bool $is_quiz_connected
|
715 |
+
* @param int $quiz_id Current Form ID
|
716 |
+
* @param Forminator_Addon_Hubspot_Quiz_Settings|null $quiz_settings_instance Instance of quiz settings, or null when unavailable
|
717 |
+
*
|
718 |
+
*/
|
719 |
+
$is_quiz_connected = apply_filters( 'forminator_addon_hubspot_is_quiz_lead_connected', $is_quiz_connected, $quiz_id, $quiz_settings_instance );
|
720 |
+
|
721 |
+
return $is_quiz_connected;
|
722 |
+
|
723 |
+
}
|
724 |
+
|
725 |
+
/**
|
726 |
+
* Allow multiple connection on one quiz
|
727 |
+
*
|
728 |
+
* @since 1.6.1
|
729 |
+
* @return bool
|
730 |
+
*/
|
731 |
+
public function is_allow_multi_on_quiz() {
|
732 |
+
return true;
|
733 |
+
}
|
734 |
}
|
addons/pro/hubspot/hubspot.php
CHANGED
@@ -26,5 +26,8 @@ function forminator_addon_hubspot_assets_url() {
|
|
26 |
require_once dirname( __FILE__ ) . '/class-forminator-addon-hubspot.php';
|
27 |
require_once dirname( __FILE__ ) . '/class-forminator-addon-hubspot-form-settings.php';
|
28 |
require_once dirname( __FILE__ ) . '/class-forminator-addon-hubspot-form-hooks.php';
|
|
|
|
|
|
|
29 |
//Direct Load
|
30 |
Forminator_Addon_Loader::get_instance()->register( 'Forminator_Addon_HubSpot' );
|
26 |
require_once dirname( __FILE__ ) . '/class-forminator-addon-hubspot.php';
|
27 |
require_once dirname( __FILE__ ) . '/class-forminator-addon-hubspot-form-settings.php';
|
28 |
require_once dirname( __FILE__ ) . '/class-forminator-addon-hubspot-form-hooks.php';
|
29 |
+
|
30 |
+
require_once dirname( __FILE__ ) . '/class-forminator-addon-hubspot-quiz-settings.php';
|
31 |
+
require_once dirname( __FILE__ ) . '/class-forminator-addon-hubspot-quiz-hooks.php';
|
32 |
//Direct Load
|
33 |
Forminator_Addon_Loader::get_instance()->register( 'Forminator_Addon_HubSpot' );
|
addons/pro/hubspot/views/quiz-settings/create-contact.php
ADDED
@@ -0,0 +1,297 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
// defaults
|
3 |
+
$vars = array(
|
4 |
+
'error_message' => '',
|
5 |
+
'name' => '',
|
6 |
+
'name_error' => '',
|
7 |
+
'multi_id' => '',
|
8 |
+
'fields' => array(),
|
9 |
+
'form_fields' => array(),
|
10 |
+
'quiz_fields' => array(),
|
11 |
+
'email_fields' => array(),
|
12 |
+
'lists' => array(),
|
13 |
+
'properties' => array()
|
14 |
+
);
|
15 |
+
/** @var array $template_vars */
|
16 |
+
|
17 |
+
foreach ( $template_vars as $key => $val ) {
|
18 |
+
$vars[ $key ] = $val;
|
19 |
+
}
|
20 |
+
|
21 |
+
$list_selector_class = 'sui-select';
|
22 |
+
|
23 |
+
if ( empty( $vars['lists'] ) ) {
|
24 |
+
$list_selector_class = 'fui-select-disabled';
|
25 |
+
}
|
26 |
+
|
27 |
+
$custom_field_map = isset( $vars['custom_fields_map'] ) ? array_filter( $vars['custom_fields_map'] ) : array();
|
28 |
+
?>
|
29 |
+
<div class="integration-header">
|
30 |
+
|
31 |
+
<h3 id="dialogTitle2" class="sui-box-title"><?php echo esc_html( __( 'Create Contact', Forminator::DOMAIN ) ); ?></h3>
|
32 |
+
|
33 |
+
<p class="sui-description" style="max-width: 400px; margin: 20px auto 0; line-height: 22px;"><?php esc_html_e( 'Let\'s start with choosing a HubSpot list and matching up your quiz lead fields with the default HubSpot contact fields to make sure we’re sending data to the right place.', Forminator::DOMAIN ); ?></p>
|
34 |
+
|
35 |
+
<?php if ( ! empty( $vars['error_message'] ) ) : ?>
|
36 |
+
<span class="sui-notice sui-notice-error"><p><?php echo esc_html( $vars['error_message'] ); ?></p></span>
|
37 |
+
<?php endif; ?>
|
38 |
+
|
39 |
+
</div>
|
40 |
+
|
41 |
+
<form style="display: block; margin-top: -10px;">
|
42 |
+
|
43 |
+
<div tabindex="0" role="group" class="sui-form-field<?php echo esc_attr( ! empty( $vars['list_id_error'] ) ? ' sui-form-field-error' : '' ); ?>"<?php echo empty( $vars['lists'] ) ? ' disabled="disabled"' : ''; ?>>
|
44 |
+
|
45 |
+
<label for="hubspot-list-id" id="hubspot-list-id-label" class="sui-label">
|
46 |
+
<?php esc_html_e( 'HubSpot List (optional)', Forminator::DOMAIN ); ?>
|
47 |
+
<span class="sui-label-note"><?php esc_html_e( 'Static list only', Forminator::DOMAIN ); ?></span>
|
48 |
+
</label>
|
49 |
+
|
50 |
+
<select id="hubspot-list-id" class="<?php echo esc_attr( $list_selector_class ); ?>" aria-labelledby="hubspot-list-id-label" aria-describedby="hubspot-list-id-desc hubspot-list-id-error" name="list_id">
|
51 |
+
|
52 |
+
<?php
|
53 |
+
// Select a list.
|
54 |
+
if ( ! empty( $vars['lists'] ) ) { ?>
|
55 |
+
|
56 |
+
<option value=""><?php esc_html_e( 'Select a list', Forminator::DOMAIN ); ?></option>
|
57 |
+
|
58 |
+
<?php
|
59 |
+
foreach ( $vars['lists'] as $list_id => $list_name ) : ?>
|
60 |
+
<option value="<?php echo esc_attr( $list_id ); ?>" <?php selected( $vars['list_id'], $list_id ); ?>><?php echo esc_html( $list_name ); ?></option>
|
61 |
+
<?php
|
62 |
+
endforeach; ?>
|
63 |
+
|
64 |
+
<?php
|
65 |
+
// Empty notice.
|
66 |
+
} else { ?>
|
67 |
+
<option value=""><?php esc_html_e( 'No static lists found on your HubSpot account', Forminator::DOMAIN ); ?></option>
|
68 |
+
<?php } ?>
|
69 |
+
|
70 |
+
</select>
|
71 |
+
|
72 |
+
<span id="hubspot-list-id-error" class="sui-error-message">
|
73 |
+
<?php
|
74 |
+
if ( ! empty( $vars['list_id_error'] ) ) :
|
75 |
+
echo esc_html( $vars['list_id_error'] );
|
76 |
+
endif;
|
77 |
+
?>
|
78 |
+
</span>
|
79 |
+
|
80 |
+
<span id="hubspot-list-id-desc" class="sui-description"><?php esc_html_e( 'You can optionally add the contact to a static HubSpot list. Leave it empty to create a contact without adding it to a list.', Forminator::DOMAIN ); ?></span>
|
81 |
+
|
82 |
+
</div>
|
83 |
+
|
84 |
+
<div tabindex="0" role="group" class="sui-form-field" style="margin-bottom: 0;">
|
85 |
+
|
86 |
+
<label for="hubspot-list-id" id="hubspot-list-id-label" class="sui-label"><?php esc_html_e( 'Field Mapping', Forminator::DOMAIN ); ?></label>
|
87 |
+
|
88 |
+
<table class="sui-table" style="margin-top: 5px; margin-bottom: 0;">
|
89 |
+
|
90 |
+
<thead>
|
91 |
+
|
92 |
+
<tr>
|
93 |
+
<th><?php esc_html_e( 'HubSpot Fields', Forminator::DOMAIN ); ?></th>
|
94 |
+
<th><?php esc_html_e( 'Forminator Fields', Forminator::DOMAIN ); ?></th>
|
95 |
+
</tr>
|
96 |
+
|
97 |
+
</thead>
|
98 |
+
|
99 |
+
<tbody>
|
100 |
+
|
101 |
+
<?php
|
102 |
+
if ( ! empty( $vars['fields'] ) ) :
|
103 |
+
|
104 |
+
foreach ( $vars['fields'] as $key => $field_title ) : ?>
|
105 |
+
|
106 |
+
<tr>
|
107 |
+
|
108 |
+
<td>
|
109 |
+
<?php echo esc_html( $field_title ); ?>
|
110 |
+
<?php if ( 'email' === $key ) : ?>
|
111 |
+
<span class="integrations-required-field">*</span>
|
112 |
+
<?php endif; ?>
|
113 |
+
</td>
|
114 |
+
|
115 |
+
<td>
|
116 |
+
<?php
|
117 |
+
$forminator_fields = $vars['form_fields'];
|
118 |
+
if ( 'email' === $key ) {
|
119 |
+
$forminator_fields = $vars['email_fields'];
|
120 |
+
}
|
121 |
+
$current_error = '';
|
122 |
+
$current_selected = '';
|
123 |
+
if ( isset( $vars[ $key . '_error' ] ) && ! empty( $vars[ $key . '_error' ] ) ) {
|
124 |
+
$current_error = $vars[ $key . '_error' ];
|
125 |
+
}
|
126 |
+
if ( isset( $vars['fields_map'][ $key ] ) && ! empty( $vars['fields_map'][ $key ] ) ) {
|
127 |
+
$current_selected = $vars['fields_map'][ $key ];
|
128 |
+
}
|
129 |
+
?>
|
130 |
+
<div class="sui-form-field <?php echo esc_attr( ! empty( $current_error ) ? 'sui-form-field-error' : '' ); ?>"<?php echo ( ! empty( $current_error ) ) ? ' style="padding-top: 5px;"' : ''; ?>>
|
131 |
+
<select class="sui-select" name="fields_map[<?php echo esc_attr( $key ); ?>]">
|
132 |
+
<option value=""><?php esc_html_e( 'None', Forminator::DOMAIN ); ?></option>
|
133 |
+
<?php if ( ! empty( $forminator_fields ) ) :
|
134 |
+
foreach ( $forminator_fields as $forminator_field ) : ?>
|
135 |
+
<option value="<?php echo esc_attr( $forminator_field['element_id'] ); ?>"
|
136 |
+
<?php selected( $current_selected, $forminator_field['element_id'] ); ?>>
|
137 |
+
<?php echo esc_html( $forminator_field['field_label'] . ' | ' . $forminator_field['element_id'] ); ?>
|
138 |
+
</option>
|
139 |
+
<?php endforeach;
|
140 |
+
endif;
|
141 |
+
if ( 'email' !== $key ) :
|
142 |
+
foreach ( $vars['quiz_fields'] as $quiz_key => $quiz_field ) : ?>
|
143 |
+
<option value="<?php echo esc_attr( $quiz_key ); ?>"
|
144 |
+
<?php selected( $current_selected, $quiz_key ); ?>>
|
145 |
+
<?php echo esc_html( $quiz_field . ' | ' . $quiz_key ); ?>
|
146 |
+
</option>
|
147 |
+
<?php endforeach;
|
148 |
+
endif; ?>
|
149 |
+
</select>
|
150 |
+
<?php if ( ! empty( $current_error ) ) : ?>
|
151 |
+
<span class="sui-error-message"
|
152 |
+
style="margin-top: 5px; margin-bottom: 5px;"><?php echo esc_html( $current_error ); ?></span>
|
153 |
+
<?php endif; ?>
|
154 |
+
</div>
|
155 |
+
</td>
|
156 |
+
</tr>
|
157 |
+
<?php endforeach;
|
158 |
+
endif;
|
159 |
+
if ( ! empty( $custom_field_map ) ) {
|
160 |
+
foreach ( $custom_field_map as $custom => $custom_field ) { ?>
|
161 |
+
<tr class="custom-field" id="custom-field">
|
162 |
+
<td>
|
163 |
+
<div class="sui-form-field">
|
164 |
+
<select class="sui-select" name=custom_property[]">
|
165 |
+
<option value=""><?php esc_html_e( 'None', Forminator::DOMAIN ); ?></option>
|
166 |
+
<?php if ( ! empty( $vars['properties'] ) ) {
|
167 |
+
foreach ( $vars['properties'] as $p => $prop ) { ?>
|
168 |
+
<option value="<?php echo esc_html( $p ); ?>" <?php selected( $custom, $p ); ?>><?php echo esc_html( $prop ); ?></option>
|
169 |
+
<?php }
|
170 |
+
} ?>
|
171 |
+
</select>
|
172 |
+
</div>
|
173 |
+
</td>
|
174 |
+
<td>
|
175 |
+
<div class="fui-select-with-delete">
|
176 |
+
|
177 |
+
<div class="sui-form-field">
|
178 |
+
<select class="sui-select" name="custom_field[]">
|
179 |
+
<option value=""><?php esc_html_e( 'None', Forminator::DOMAIN ); ?></option>
|
180 |
+
<?php
|
181 |
+
if ( ! empty( $forminator_fields ) ) :
|
182 |
+
foreach ( $forminator_fields as $forminator_field ) : ?>
|
183 |
+
<option value="<?php echo esc_attr( $forminator_field['element_id'] ); ?>" <?php selected( $custom_field, $forminator_field['element_id'] ); ?>>
|
184 |
+
<?php echo esc_html( $forminator_field['field_label'] . ' | ' . $forminator_field['element_id'] ); ?>
|
185 |
+
</option>
|
186 |
+
<?php endforeach;
|
187 |
+
endif;
|
188 |
+
foreach ( $vars['quiz_fields'] as $quiz_key => $quiz_field ) : ?>
|
189 |
+
<option value="<?php echo esc_attr( $quiz_key ); ?>"
|
190 |
+
<?php selected( $custom_field, $quiz_key ); ?>>
|
191 |
+
<?php echo esc_html( $quiz_field . ' | ' . $quiz_key ); ?>
|
192 |
+
</option>
|
193 |
+
<?php endforeach; ?>
|
194 |
+
</select>
|
195 |
+
</div>
|
196 |
+
|
197 |
+
<button class="sui-button-icon sui-button-red fui-option-remove delete-hubspot-field">
|
198 |
+
<i class="sui-icon-trash" aria-hidden="true"></i>
|
199 |
+
</button>
|
200 |
+
|
201 |
+
</div>
|
202 |
+
</td>
|
203 |
+
</tr>
|
204 |
+
<?php }
|
205 |
+
} else { ?>
|
206 |
+
<tr class="custom-field" id="custom-field" style="display: none;">
|
207 |
+
<td>
|
208 |
+
<div class="sui-form-field">
|
209 |
+
<select class="sui-select" name=custom_property[]">
|
210 |
+
<option value=""><?php esc_html_e( 'None', Forminator::DOMAIN ); ?></option>
|
211 |
+
<?php if ( ! empty( $vars['properties'] ) ) {
|
212 |
+
foreach ( $vars['properties'] as $p => $prop ) { ?>
|
213 |
+
<option value="<?php echo esc_html( $p ); ?>"><?php echo esc_html( $prop ); ?></option>
|
214 |
+
<?php }
|
215 |
+
} ?>
|
216 |
+
</select>
|
217 |
+
</div>
|
218 |
+
</td>
|
219 |
+
<td>
|
220 |
+
|
221 |
+
<div class="fui-select-with-delete">
|
222 |
+
|
223 |
+
<div class="sui-form-field">
|
224 |
+
<select class="sui-select" name="custom_field[]">
|
225 |
+
<option value=""><?php esc_html_e( 'None', Forminator::DOMAIN ); ?></option>
|
226 |
+
<?php
|
227 |
+
if ( ! empty( $forminator_fields ) ) :
|
228 |
+
foreach ( $forminator_fields as $forminator_field ) : ?>
|
229 |
+
<option value="<?php echo esc_attr( $forminator_field['element_id'] ); ?>">
|
230 |
+
<?php echo esc_html( $forminator_field['field_label'] . ' | ' . $forminator_field['element_id'] ); ?>
|
231 |
+
</option>
|
232 |
+
<?php endforeach;
|
233 |
+
endif;
|
234 |
+
foreach ( $vars['quiz_fields'] as $quiz_key => $quiz_field ) : ?>
|
235 |
+
<option value="<?php echo esc_attr( $quiz_key ); ?>">
|
236 |
+
<?php echo esc_html( $quiz_field . ' | ' . $quiz_key ); ?>
|
237 |
+
</option>
|
238 |
+
<?php endforeach; ?>
|
239 |
+
</select>
|
240 |
+
</div>
|
241 |
+
|
242 |
+
<button class="sui-button-icon sui-button-red fui-option-remove delete-hubspot-field">
|
243 |
+
<i class="sui-icon-trash" aria-hidden="true"></i>
|
244 |
+
</button>
|
245 |
+
|
246 |
+
</div>
|
247 |
+
|
248 |
+
</td>
|
249 |
+
</tr>
|
250 |
+
<?php } ?>
|
251 |
+
<tr class="add-additional-field">
|
252 |
+
<td>
|
253 |
+
<div class="sui-button sui-button-ghost add-hubspot-field">
|
254 |
+
<i class="sui-icon-plus" aria-hidden="true"></i>
|
255 |
+
<?php esc_html_e( 'Add Additional field', Forminator::DOMAIN ); ?>
|
256 |
+
</div>
|
257 |
+
</td>
|
258 |
+
<td></td>
|
259 |
+
</tr>
|
260 |
+
|
261 |
+
</tbody>
|
262 |
+
|
263 |
+
</table>
|
264 |
+
</div>
|
265 |
+
|
266 |
+
<input type="hidden" name="multi_id" value="<?php echo esc_attr( $vars['multi_id'] ); ?>" />
|
267 |
+
|
268 |
+
</form>
|
269 |
+
<script type="text/javascript">
|
270 |
+
(function ($) {
|
271 |
+
$(document).ready(function (e) {
|
272 |
+
$(".add-hubspot-field").unbind().click(function(e) {
|
273 |
+
e.preventDefault();
|
274 |
+
if( $('.custom-field:visible').length < 1 ) {
|
275 |
+
$('#custom-field').show();
|
276 |
+
} else {
|
277 |
+
var clone_field = $('#custom-field').clone();
|
278 |
+
$('.add-additional-field').before( clone_field );
|
279 |
+
clone_field.find('.select2').remove();
|
280 |
+
clone_field.find('select.sui-select').val('').removeAttr('selected');
|
281 |
+
clone_field.find( '.sui-select' ).SUIselect2({
|
282 |
+
dropdownCssClass: 'sui-variables-dropdown sui-color-accessible'
|
283 |
+
});
|
284 |
+
}
|
285 |
+
});
|
286 |
+
$(document).on("click",".delete-hubspot-field",function(e){
|
287 |
+
e.preventDefault();
|
288 |
+
if( $('.custom-field:visible').length < 2 ) {
|
289 |
+
$(this).closest('.custom-field').find('select.sui-select').val('');
|
290 |
+
$(this).closest('.custom-field').hide();
|
291 |
+
} else {
|
292 |
+
$(this).closest('.custom-field').remove();
|
293 |
+
}
|
294 |
+
});
|
295 |
+
});
|
296 |
+
})(jQuery);
|
297 |
+
</script>
|
addons/pro/hubspot/views/quiz-settings/create-ticket.php
ADDED
@@ -0,0 +1,337 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
// defaults
|
3 |
+
$vars = array(
|
4 |
+
'error_message' => '',
|
5 |
+
'name' => '',
|
6 |
+
'name_error' => '',
|
7 |
+
'multi_id' => '',
|
8 |
+
'fields' => array(),
|
9 |
+
'form_fields' => array(),
|
10 |
+
'file_fields' => array(),
|
11 |
+
'pipeline' => array(),
|
12 |
+
'status' => array(),
|
13 |
+
'auth_url' => '',
|
14 |
+
'token' => '',
|
15 |
+
're-authorize' => '',
|
16 |
+
);
|
17 |
+
/** @var array $template_vars */
|
18 |
+
|
19 |
+
foreach ( $template_vars as $key => $val ) {
|
20 |
+
$vars[ $key ] = $val;
|
21 |
+
}
|
22 |
+
?>
|
23 |
+
<div class="integration-header">
|
24 |
+
|
25 |
+
<h3 id="dialogTitle2" class="sui-box-title"><?php echo esc_html( __( 'Create Ticket', Forminator::DOMAIN ) ); ?></h3>
|
26 |
+
|
27 |
+
<p class="sui-description" style="max-width: 400px; margin: 20px auto 0; line-height: 22px;"><?php esc_html_e( 'In addition to adding a new contact to your HubSpot account, you can also create a HubSpot ticket for each quiz lead submission.', Forminator::DOMAIN ); ?></p>
|
28 |
+
|
29 |
+
<?php if ( ! empty( $vars['error_message'] ) ) : ?>
|
30 |
+
<span class="sui-notice sui-notice-error"><p><?php echo esc_html( $vars['error_message'] ); ?></p></span>
|
31 |
+
<?php endif; ?>
|
32 |
+
|
33 |
+
</div>
|
34 |
+
|
35 |
+
<form style="display: block; margin-top: -10px; margin-bottom: 0;">
|
36 |
+
|
37 |
+
<div class="fui-section-toggle">
|
38 |
+
|
39 |
+
<label class="sui-toggle">
|
40 |
+
<input
|
41 |
+
type="checkbox"
|
42 |
+
name="create_ticket"
|
43 |
+
value="1"
|
44 |
+
id="create-ticket"
|
45 |
+
aria-labelledby="create-ticket-label"
|
46 |
+
<?php checked( $vars['create_ticket'], 1 ); ?>
|
47 |
+
/>
|
48 |
+
<span class="sui-toggle-slider"></span>
|
49 |
+
</label>
|
50 |
+
|
51 |
+
<label for="create-ticket" id="create-ticket-label" class="sui-toggle-label"><?php esc_html_e( 'Create a HubSpot ticket for each submission', Forminator::DOMAIN ); ?></label>
|
52 |
+
|
53 |
+
</div>
|
54 |
+
|
55 |
+
<div
|
56 |
+
tabindex="0"
|
57 |
+
role="group"
|
58 |
+
class="fui-section-toggle-content ticket-fields"
|
59 |
+
<?php echo '1' === $vars['create_ticket'] ? '' : 'style="display: none;"'; ?>
|
60 |
+
<?php echo '1' === $vars['create_ticket'] ? '' : 'hidden'; ?>
|
61 |
+
>
|
62 |
+
<?php if ( empty( $vars['re-authorize'] ) && ! empty( $vars['token'] ) ) { ?>
|
63 |
+
<div class="sui-notice sui-notice-info">
|
64 |
+
<p style="margin-bottom: 5px;"><strong><?php esc_html_e( 'Authorize Forminator to access HubSpot tickets', Forminator::DOMAIN ); ?></strong></p>
|
65 |
+
<p style="margin-top: 5px; margin-bottom: 10px;"><?php esc_html_e( 'Forminator requires additional permissions to create HubSpot tickets. Note that you will be taken to HubSpot website to grant Forminator access to HubSpot tickets and redirected back here.', Forminator::DOMAIN ); ?></p>
|
66 |
+
<p style="margin-top: 10px;"><a href="<?php echo esc_attr( $vars['auth_url'] ); ?>" target="_blank" class="sui-button sui-button-primary forminator-addon-connect"><?php esc_html_e( 'Authorize', Forminator::DOMAIN ); ?></a></p>
|
67 |
+
</div>
|
68 |
+
<?php } else { ?>
|
69 |
+
|
70 |
+
<!-- FIELD: Pipeline -->
|
71 |
+
<div class="sui-form-field">
|
72 |
+
|
73 |
+
<label for="hubspot-support-request" id="hubspot-support-request-label" class="sui-label"><?php esc_html_e( 'Pipeline', Forminator::DOMAIN ); ?></label>
|
74 |
+
|
75 |
+
<select
|
76 |
+
name="pipeline_id"
|
77 |
+
id="hubspot-support-request"
|
78 |
+
class="sui-select"
|
79 |
+
aria-labelledby="hubspot-support-request-label"
|
80 |
+
aria-describedby="hubspot-support-request-error"
|
81 |
+
>
|
82 |
+
<?php
|
83 |
+
if ( ! empty( $vars['pipeline'] ) ) :
|
84 |
+
|
85 |
+
foreach ( $vars['pipeline'] as $pipeline_id => $pipeline_name ) :
|
86 |
+
?>
|
87 |
+
|
88 |
+
<option value="<?php echo esc_attr( $pipeline_id ); ?>" <?php selected( $vars['pipeline_id'], $pipeline_id ); ?>><?php echo esc_html( $pipeline_name ); ?></option>
|
89 |
+
|
90 |
+
<?php
|
91 |
+
endforeach;
|
92 |
+
|
93 |
+
endif;
|
94 |
+
?>
|
95 |
+
|
96 |
+
</select>
|
97 |
+
|
98 |
+
<span id="hubspot-support-request-error" class="sui-error-message">
|
99 |
+
<?php
|
100 |
+
if ( ! empty( $vars['pipeline_error'] ) ) :
|
101 |
+
echo esc_html( $vars['pipeline_error'] );
|
102 |
+
endif; ?>
|
103 |
+
</span>
|
104 |
+
|
105 |
+
</div>
|
106 |
+
|
107 |
+
<!-- FIELD: Ticket Status -->
|
108 |
+
<div class="sui-form-field">
|
109 |
+
|
110 |
+
<label for="hubspot-ticket-status" id="hubspot-ticket-status-label" class="sui-label"><?php esc_html_e( 'Ticket Status', Forminator::DOMAIN ); ?></label>
|
111 |
+
|
112 |
+
<select
|
113 |
+
name="status_id"
|
114 |
+
id="hubspot-ticket-status"
|
115 |
+
class="sui-select"
|
116 |
+
aria-labelledby="hubspot-ticket-status-label"
|
117 |
+
aria-describedby="hubspot-ticket-status-error"
|
118 |
+
>
|
119 |
+
|
120 |
+
<?php
|
121 |
+
if ( ! empty( $vars['status'] ) ) {
|
122 |
+
|
123 |
+
foreach ( $vars['status'] as $stages => $stage ) {
|
124 |
+
|
125 |
+
if ( isset( $stages ) && isset( $stage ) ) :
|
126 |
+
?>
|
127 |
+
|
128 |
+
<option value="<?php echo esc_attr( $stages ); ?>" <?php selected( $vars['status_id'], $stages ); ?>><?php echo esc_html( $stage ); ?></option>
|
129 |
+
|
130 |
+
<?php
|
131 |
+
endif;
|
132 |
+
|
133 |
+
}
|
134 |
+
|
135 |
+
}
|
136 |
+
?>
|
137 |
+
|
138 |
+
</select>
|
139 |
+
|
140 |
+
<span id="hubspot-ticket-status-error" class="sui-error-message">
|
141 |
+
<?php
|
142 |
+
if ( ! empty( $vars['status_error'] ) ) :
|
143 |
+
echo esc_html( $vars['status_error'] );
|
144 |
+
endif;
|
145 |
+
?>
|
146 |
+
</span>
|
147 |
+
|
148 |
+
</div>
|
149 |
+
|
150 |
+
<!-- FIELD: Ticket Name -->
|
151 |
+
<div class="sui-form-field<?php echo ( ! empty( $vars['ticket_name_error'] ) ) ? ' sui-form-field-error' : ''; ?>">
|
152 |
+
|
153 |
+
<label for="ticket-name-input" id="ticket-name-input-label" class="sui-label">
|
154 |
+
<?php esc_html_e( 'Ticket Name', Forminator::DOMAIN ); ?>
|
155 |
+
<span class="sui-label-note"><?php esc_html_e( 'Use the "+" icon to add form fields', Forminator::DOMAIN ); ?></span>
|
156 |
+
</label>
|
157 |
+
|
158 |
+
<div class="sui-insert-variables">
|
159 |
+
|
160 |
+
<input
|
161 |
+
type="text"
|
162 |
+
name="ticket_name"
|
163 |
+
value="<?php echo esc_attr( $vars['ticket_name'] ); ?>"
|
164 |
+
placeholder="Enter ticket name"
|
165 |
+
id="ticket-name-input"
|
166 |
+
class="sui-form-control ticket-text"
|
167 |
+
aria-labelledby="ticket-name-input-label"
|
168 |
+
aria-describedby="ticket-name-input-error"
|
169 |
+
/>
|
170 |
+
|
171 |
+
<select id="select-ticket-name" class="select-field">
|
172 |
+
<option value="{quiz_name}" data-content="{quiz_name}"><?php esc_html_e( 'Quiz Name', Forminator::DOMAIN ); ?></option>
|
173 |
+
<?php
|
174 |
+
if ( ! empty( $vars['form_fields'] ) ) :
|
175 |
+
|
176 |
+
foreach ( $vars['form_fields'] as $key => $field_title ) :
|
177 |
+
?>
|
178 |
+
|
179 |
+
<option value="{<?php echo esc_attr( $field_title['element_id'] ); ?>}" data-content="{<?php echo esc_attr( $field_title['element_id'] ); ?>}"><?php echo esc_html( $field_title['field_label'] . ' | ' . $field_title['element_id'] ); ?></option>
|
180 |
+
|
181 |
+
<?php
|
182 |
+
endforeach;
|
183 |
+
|
184 |
+
endif;
|
185 |
+
?>
|
186 |
+
|
187 |
+
</select>
|
188 |
+
|
189 |
+
</div>
|
190 |
+
|
191 |
+
<span id="ticket-name-input-error" class="sui-error-message">
|
192 |
+
<?php
|
193 |
+
if ( ! empty( $vars['ticket_name_error'] ) ) :
|
194 |
+
echo esc_html( $vars['ticket_name_error'] );
|
195 |
+
endif;
|
196 |
+
?>
|
197 |
+
</span>
|
198 |
+
|
199 |
+
</div>
|
200 |
+
|
201 |
+
<!-- FIELD: Ticket Description -->
|
202 |
+
<div class="sui-form-field">
|
203 |
+
|
204 |
+
<label for="ticket-description" id="ticket-description-label" class="sui-label">
|
205 |
+
<?php esc_html_e( 'Ticket Description (optional)', Forminator::DOMAIN ); ?>
|
206 |
+
<span class="sui-label-note"><?php esc_html_e( 'Use the "+" icon to add form fields', Forminator::DOMAIN ); ?></span>
|
207 |
+
</label>
|
208 |
+
|
209 |
+
<div class="sui-insert-variables">
|
210 |
+
|
211 |
+
<textarea
|
212 |
+
name="ticket_description"
|
213 |
+
placeholder="Enter ticket description"
|
214 |
+
id="ticket-description"
|
215 |
+
class="sui-form-control ticket-text"
|
216 |
+
aria-labelledby="ticket-description-label"
|
217 |
+
>
|
218 |
+
<?php echo esc_attr( $vars['ticket_description'] ); ?>
|
219 |
+
</textarea>
|
220 |
+
|
221 |
+
<select id="select-ticket-description" class="select-field">
|
222 |
+
<option value="{quiz_name}" data-content="{quiz_name}"><?php esc_html_e( 'Quiz Name', Forminator::DOMAIN ); ?></option>
|
223 |
+
<?php
|
224 |
+
if ( ! empty( $vars['form_fields'] ) ) :
|
225 |
+
|
226 |
+
foreach ( $vars['form_fields'] as $key => $field_title ) :
|
227 |
+
?>
|
228 |
+
|
229 |
+
<option value="{<?php echo esc_attr( $field_title['element_id'] ); ?>}" data-content="{<?php echo esc_attr( $field_title['element_id'] ); ?>}"><?php echo esc_html( $field_title['field_label'] . ' | ' . $field_title['element_id'] ); ?></option>
|
230 |
+
|
231 |
+
<?php
|
232 |
+
endforeach;
|
233 |
+
|
234 |
+
endif;
|
235 |
+
?>
|
236 |
+
|
237 |
+
</select>
|
238 |
+
|
239 |
+
</div>
|
240 |
+
|
241 |
+
</div>
|
242 |
+
|
243 |
+
<!-- FIELD: Supported File -->
|
244 |
+
<div class="sui-form-field">
|
245 |
+
|
246 |
+
<label for="hubspot-support-file" id="hubspot-support-file-label" class="sui-label"><?php esc_html_e( 'Supported File (optional)', Forminator::DOMAIN ); ?></label>
|
247 |
+
|
248 |
+
<select
|
249 |
+
name="supported_file"
|
250 |
+
id="hubspot-support-file"
|
251 |
+
class="sui-select sui-form-control"
|
252 |
+
aria-labelledby="hubspot-support-file-label"
|
253 |
+
>
|
254 |
+
|
255 |
+
<option value=""><?php esc_html_e( 'Select a file upload field', Forminator::DOMAIN ); ?></option>
|
256 |
+
|
257 |
+
<?php
|
258 |
+
$file_selected = $vars['supported_file'];
|
259 |
+
|
260 |
+
if ( ! empty( $vars['file_fields'] ) ) :
|
261 |
+
|
262 |
+
foreach ( $vars['file_fields'] as $file => $file_field ) :
|
263 |
+
?>
|
264 |
+
|
265 |
+
<option value="<?php echo esc_attr( $file_field['element_id'] ); ?>" <?php selected( $file_selected, $file_field['element_id'] ); ?>><?php echo esc_html( $file_field['field_label'] . ' | ' . $file_field['element_id'] ); ?></option>
|
266 |
+
|
267 |
+
<?php
|
268 |
+
endforeach;
|
269 |
+
|
270 |
+
endif;
|
271 |
+
?>
|
272 |
+
|
273 |
+
</select>
|
274 |
+
|
275 |
+
</div>
|
276 |
+
<?php } ?>
|
277 |
+
</div>
|
278 |
+
|
279 |
+
<input
|
280 |
+
type="hidden"
|
281 |
+
name="multi_id"
|
282 |
+
value="<?php echo esc_attr( $vars['multi_id'] ); ?>"
|
283 |
+
/>
|
284 |
+
|
285 |
+
<input
|
286 |
+
type="hidden"
|
287 |
+
name="re-authorize"
|
288 |
+
value="<?php echo esc_attr( $vars['re-authorize'] ); ?>"
|
289 |
+
/>
|
290 |
+
|
291 |
+
</form>
|
292 |
+
|
293 |
+
<script>
|
294 |
+
(function ($) {
|
295 |
+
$(document).ready(function (e) {
|
296 |
+
$('#create-ticket').on('change', function () {
|
297 |
+
let ticketField = $('.ticket-fields'),
|
298 |
+
ticketActivate = $('div#ticket-activate');
|
299 |
+
ticketField.hide();
|
300 |
+
ticketActivate.show();
|
301 |
+
if (this.checked) {
|
302 |
+
ticketField.show();
|
303 |
+
ticketActivate.hide();
|
304 |
+
}
|
305 |
+
});
|
306 |
+
$('.select-field').on('change', function () {
|
307 |
+
let value = $(this).val(),
|
308 |
+
ticket_text = $(this).closest('.sui-form-field').find('.ticket-text'),
|
309 |
+
text_val = ticket_text.val();
|
310 |
+
text_val += value;
|
311 |
+
ticket_text.val(text_val);
|
312 |
+
});
|
313 |
+
$('#hubspot-support-request').on('change', function () {
|
314 |
+
let value = $(this).val();
|
315 |
+
$.ajax({
|
316 |
+
url: '<?php echo forminator_ajax_url();// phpcs:ignore ?>',
|
317 |
+
type: "POST",
|
318 |
+
data: {
|
319 |
+
action: "forminator_hubspot_support_request",
|
320 |
+
value: value
|
321 |
+
},
|
322 |
+
success: function (response) {
|
323 |
+
if ( response.success && Object.keys(response.data).length > 0 ) {
|
324 |
+
let options = '';
|
325 |
+
$.each(response.data, function (i, value) {
|
326 |
+
options += '<option value="' + i + '">' + value + '</option>';
|
327 |
+
});
|
328 |
+
$('#hubspot-ticket-status').html('').append(options);
|
329 |
+
} else {
|
330 |
+
$('#hubspot-ticket-status').html('');
|
331 |
+
}
|
332 |
+
}
|
333 |
+
});
|
334 |
+
});
|
335 |
+
});
|
336 |
+
})(jQuery);
|
337 |
+
</script>
|
addons/pro/mailchimp/class-forminator-addon-mailchimp-quiz-hooks.php
ADDED
@@ -0,0 +1,1120 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/**
|
4 |
+
* Class Forminator_Addon_Mailchimp_Quiz_Hooks
|
5 |
+
*
|
6 |
+
* Hooks that used by Mailchimp Addon defined here
|
7 |
+
*
|
8 |
+
* @since 1.0 Mailchimp Addon
|
9 |
+
*/
|
10 |
+
class Forminator_Addon_Mailchimp_Quiz_Hooks extends Forminator_Addon_Quiz_Hooks_Abstract {
|
11 |
+
|
12 |
+
/**
|
13 |
+
* Addon instance
|
14 |
+
*
|
15 |
+
* @var Forminator_Addon_Mailchimp
|
16 |
+
*/
|
17 |
+
protected $addon;
|
18 |
+
|
19 |
+
/**
|
20 |
+
* Form settings instance
|
21 |
+
*
|
22 |
+
* @since 1.0 Mailchimp Addon
|
23 |
+
* @var Forminator_Addon_Mailchimp_Quiz_Settings | null
|
24 |
+
*
|
25 |
+
*/
|
26 |
+
protected $quiz_settings_instance;
|
27 |
+
|
28 |
+
/**
|
29 |
+
* Flag of gpdr field checked on submit
|
30 |
+
*
|
31 |
+
* @since 1.0 Mailchimp Addon
|
32 |
+
*
|
33 |
+
* @var bool
|
34 |
+
*/
|
35 |
+
private $gdpr_is_checked = true;
|
36 |
+
|
37 |
+
/**
|
38 |
+
* Forminator_Addon_Mailchimp_Form_Hooks constructor.
|
39 |
+
*
|
40 |
+
* @since 1.0 Mailchimp Addon
|
41 |
+
*
|
42 |
+
* @param Forminator_Addon_Abstract $addon
|
43 |
+
* @param $quiz_id
|
44 |
+
*
|
45 |
+
* @throws Forminator_Addon_Exception
|
46 |
+
*/
|
47 |
+
public function __construct( Forminator_Addon_Abstract $addon, $quiz_id ) {
|
48 |
+
parent::__construct( $addon, $quiz_id );
|
49 |
+
$this->_submit_quiz_error_message = __( 'Mailchimp failed to process submitted data. Please check your form and try again', Forminator::DOMAIN );
|
50 |
+
}
|
51 |
+
|
52 |
+
/**
|
53 |
+
* Render extra fields after all forms fields rendered
|
54 |
+
*
|
55 |
+
* @since 1.0 Mailchimp Addon
|
56 |
+
*/
|
57 |
+
public function on_after_render_form_fields() {
|
58 |
+
// Render GDPR field if enabled
|
59 |
+
if ( Forminator_Addon_Mailchimp::is_enable_gdpr() ) {
|
60 |
+
$addon_setting_values = $this->quiz_settings_instance->get_quiz_settings_values();
|
61 |
+
if ( isset( $addon_setting_values['enable_gdpr'] ) && $addon_setting_values['enable_gdpr'] ) {
|
62 |
+
if ( isset( $addon_setting_values['gdpr_text'] ) && ! empty( $addon_setting_values['gdpr_text'] ) ) {
|
63 |
+
$this->render_gdpr_field( $addon_setting_values );
|
64 |
+
}
|
65 |
+
}
|
66 |
+
}
|
67 |
+
|
68 |
+
$quiz_id = $this->quiz_id;
|
69 |
+
$quiz_settings_instance = $this->quiz_settings_instance;
|
70 |
+
|
71 |
+
/**
|
72 |
+
* Fires when mailchimp rendering extra output after connected form fields rendered
|
73 |
+
*
|
74 |
+
* @since 1.1
|
75 |
+
*
|
76 |
+
* @param int $quiz_id current Quiz ID
|
77 |
+
* @param Forminator_Addon_Mailchimp_Quiz_Settings $quiz_settings_instance Mailchimp quiz settings Instance
|
78 |
+
*/
|
79 |
+
do_action(
|
80 |
+
'forminator_addon_mailchimp_on_after_render_quiz_fields',
|
81 |
+
$quiz_id,
|
82 |
+
$quiz_settings_instance
|
83 |
+
);
|
84 |
+
}
|
85 |
+
|
86 |
+
/**
|
87 |
+
* Render GDPR Field - Experimental
|
88 |
+
*
|
89 |
+
* @since 1.0 Mailchimp Addon
|
90 |
+
*
|
91 |
+
* @param $addon_setting_values
|
92 |
+
*/
|
93 |
+
private function render_gdpr_field( $addon_setting_values ) {
|
94 |
+
|
95 |
+
$uniq_id = uniqid();
|
96 |
+
$input_name = 'forminator-addon-mailchimp-gdpr';
|
97 |
+
$input_id = $input_name . '-' . $uniq_id;
|
98 |
+
$html = '<div class="forminator-row"><div id="field-' . $input_id . '" class="forminator-col forminator-col-12"><div class="forminator-field">';
|
99 |
+
$html .= '<div class="forminator-field--label"><label class="forminator-label" id="forminator-label-' . $input_id . '">' . esc_html_e( 'Mailchimp GDPR', Forminator::DOMAIN )
|
100 |
+
. '</label></div>';
|
101 |
+
// matching checkbox with design
|
102 |
+
$form_settings = $this->quiz_settings_instance->get_quiz_settings();
|
103 |
+
$design_class = self::get_form_setting_value_as( $form_settings, 'form-style', 'default', 'string' );
|
104 |
+
if ( 'clean' === $design_class ) {
|
105 |
+
|
106 |
+
$html .= '<label class="forminator-checkbox">';
|
107 |
+
$html .= sprintf(
|
108 |
+
'<input id="%s" type="checkbox" name="%s" value="1"> %s',
|
109 |
+
$input_id,
|
110 |
+
$input_name,
|
111 |
+
$addon_setting_values['gdpr_text']
|
112 |
+
);
|
113 |
+
$html .= '</label>';
|
114 |
+
|
115 |
+
} else {
|
116 |
+
|
117 |
+
$html .= '<div class="forminator-checkbox">';
|
118 |
+
$html .= sprintf(
|
119 |
+
'<input id="%s" type="checkbox" name="%s" value="1" class="forminator-checkbox--input">',
|
120 |
+
$input_id,
|
121 |
+
$input_name
|
122 |
+
);
|
123 |
+
$html .= sprintf(
|
124 |
+
'<label for="%s" class="forminator-checkbox--design wpdui-icon wpdui-icon-check" aria-hidden="true"></label>',
|
125 |
+
$input_id
|
126 |
+
);
|
127 |
+
$html .= sprintf(
|
128 |
+
'<label for="%s" class="forminator-checkbox--label">%s</label>',
|
129 |
+
$input_id,
|
130 |
+
$addon_setting_values['gdpr_text']
|
131 |
+
);
|
132 |
+
$html .= '</div>';
|
133 |
+
|
134 |
+
}
|
135 |
+
$html .= '</div></div></div>';
|
136 |
+
|
137 |
+
echo wp_kses_post( $html );// phpcs:ignore Standard.Category.SniffName.ErrorCode
|
138 |
+
}
|
139 |
+
|
140 |
+
/**
|
141 |
+
* Helper Get form setting value with fixed var type
|
142 |
+
*
|
143 |
+
* @since 1.0 Mailchimp Addon
|
144 |
+
*
|
145 |
+
* @param array $form_settings
|
146 |
+
* @param string $key
|
147 |
+
* @param $default
|
148 |
+
* @param string $type
|
149 |
+
*
|
150 |
+
* @return int|mixed
|
151 |
+
*/
|
152 |
+
private static function get_form_setting_value_as( $form_settings, $key, $default, $type = 'string' ) {
|
153 |
+
if ( ! isset( $form_settings[ $key ] ) ) {
|
154 |
+
return self::convert_value_to( $default, $type );
|
155 |
+
}
|
156 |
+
|
157 |
+
return self::convert_value_to( $form_settings[ $key ], $type );
|
158 |
+
}
|
159 |
+
|
160 |
+
/**
|
161 |
+
* Helper to convert value to expected var type
|
162 |
+
*
|
163 |
+
* @since 1.0 Mailchimp Addon
|
164 |
+
*
|
165 |
+
* @param $value
|
166 |
+
* @param $type
|
167 |
+
*
|
168 |
+
* @return array|false|int|mixed|string
|
169 |
+
*/
|
170 |
+
private static function convert_value_to( $value, $type ) {
|
171 |
+
switch ( $type ) {
|
172 |
+
case 'array':
|
173 |
+
if ( ! is_array( $value ) ) {
|
174 |
+
if ( is_scalar( $value ) ) {
|
175 |
+
return array( $value );
|
176 |
+
} else {
|
177 |
+
return (array) $value;
|
178 |
+
}
|
179 |
+
}
|
180 |
+
|
181 |
+
return $value;
|
182 |
+
case 'string':
|
183 |
+
if ( ! is_scalar( $value ) ) {
|
184 |
+
return wp_json_encode( $value );
|
185 |
+
}
|
186 |
+
|
187 |
+
return (string) trim( $value );
|
188 |
+
case 'boolean':
|
189 |
+
return filter_var( trim( $value ), FILTER_VALIDATE_BOOLEAN );
|
190 |
+
case 'int':
|
191 |
+
if ( ! is_scalar( $value ) ) {
|
192 |
+
return 1;
|
193 |
+
}
|
194 |
+
|
195 |
+
return (int) trim( $value );
|
196 |
+
default:
|
197 |
+
return $value;
|
198 |
+
}
|
199 |
+
}
|
200 |
+
|
201 |
+
/**
|
202 |
+
* Check GDPR field - Experimental
|
203 |
+
*
|
204 |
+
* @since 1.0 Mailchimp Addon
|
205 |
+
*
|
206 |
+
* @param $submitted_data
|
207 |
+
*
|
208 |
+
* @return bool
|
209 |
+
*/
|
210 |
+
public function on_form_submit( $submitted_data ) {
|
211 |
+
$is_success = true;
|
212 |
+
|
213 |
+
$quiz_id = $this->quiz_id;
|
214 |
+
$quiz_settings_instance = $this->quiz_settings_instance;
|
215 |
+
|
216 |
+
/**
|
217 |
+
* Filter mailchimp submitted form data to be processed
|
218 |
+
*
|
219 |
+
* @since 1.1
|
220 |
+
*
|
221 |
+
* @param array $submitted_data
|
222 |
+
* @param int $quiz_id current Quiz ID
|
223 |
+
* @param Forminator_Addon_Mailchimp_Quiz_Settings $quiz_settings_instance Mailchimp API Form Settings instance
|
224 |
+
*/
|
225 |
+
$submitted_data = apply_filters(
|
226 |
+
'forminator_addon_mailchimp_form_submitted_data',
|
227 |
+
$submitted_data,
|
228 |
+
$quiz_id,
|
229 |
+
$quiz_settings_instance
|
230 |
+
);
|
231 |
+
|
232 |
+
/**
|
233 |
+
* Fires when mailchimp connected form submit data
|
234 |
+
*
|
235 |
+
* Return `true` if success, or **(string) error message** on fail
|
236 |
+
*
|
237 |
+
* @since 1.1
|
238 |
+
*
|
239 |
+
* @param bool $is_success
|
240 |
+
* @param int $quiz_id current Form ID
|
241 |
+
* @param array $submitted_data
|
242 |
+
* @param Forminator_Addon_Mailchimp_Quiz_Settings $quiz_settings_instance Mailchimp API Form Settings instance
|
243 |
+
*/
|
244 |
+
$is_success = apply_filters(
|
245 |
+
'forminator_addon_mailchimp_on_form_submit_result',
|
246 |
+
$is_success,
|
247 |
+
$quiz_id,
|
248 |
+
$submitted_data,
|
249 |
+
$quiz_settings_instance
|
250 |
+
);
|
251 |
+
|
252 |
+
// process filter
|
253 |
+
if ( true !== $is_success ) {
|
254 |
+
// only update `_submit_form_error_message` when not empty
|
255 |
+
if ( ! empty( $is_success ) ) {
|
256 |
+
$this->_submit_quiz_error_message = (string) $is_success;
|
257 |
+
}
|
258 |
+
|
259 |
+
return $is_success;
|
260 |
+
}
|
261 |
+
|
262 |
+
// only exec this below when filter return true
|
263 |
+
// check is enabled
|
264 |
+
if ( ! Forminator_Addon_Mailchimp::is_enable_gdpr() ) {
|
265 |
+
return true;
|
266 |
+
}
|
267 |
+
|
268 |
+
// Only flag check for gdpr
|
269 |
+
if ( ! isset( $submitted_data['forminator-addon-mailchimp-gdpr'] ) || '1' !== $submitted_data['forminator-addon-mailchimp-gdpr'] ) {
|
270 |
+
$this->gdpr_is_checked = false;
|
271 |
+
}
|
272 |
+
|
273 |
+
return true;
|
274 |
+
}
|
275 |
+
|
276 |
+
/**
|
277 |
+
* Check submitted_data met requirement to sent to mailchimp
|
278 |
+
* Send if possible, add result to entry fields
|
279 |
+
*
|
280 |
+
* @since 1.0 Mailchimp Addon
|
281 |
+
* @since 1.7 Add $form_entry_fields arg
|
282 |
+
*
|
283 |
+
* @param array $submitted_data
|
284 |
+
* @param array $form_entry_fields
|
285 |
+
*
|
286 |
+
* @return array
|
287 |
+
*/
|
288 |
+
public function add_entry_fields( $submitted_data, $form_entry_fields = array() ) {
|
289 |
+
|
290 |
+
$quiz_id = $this->quiz_id;
|
291 |
+
$quiz_settings_instance = $this->quiz_settings_instance;
|
292 |
+
|
293 |
+
/**
|
294 |
+
* Filter mailchimp submitted form data to be processed
|
295 |
+
*
|
296 |
+
* @since 1.1
|
297 |
+
*
|
298 |
+
* @param array $submitted_data
|
299 |
+
* @param int $quiz_id current Quiz ID
|
300 |
+
* @param Forminator_Addon_Mailchimp_Quiz_Settings $quiz_settings_instance Mailchimp API Quiz Settings instance
|
301 |
+
*/
|
302 |
+
$submitted_data = apply_filters(
|
303 |
+
'forminator_addon_mailchimp_quiz_submitted_data',
|
304 |
+
$submitted_data,
|
305 |
+
$quiz_id,
|
306 |
+
$quiz_settings_instance
|
307 |
+
);
|
308 |
+
|
309 |
+
forminator_addon_maybe_log( __METHOD__, $submitted_data );
|
310 |
+
|
311 |
+
$quiz_submitted_data = get_quiz_submitted_data( $this->quiz, $submitted_data, $form_entry_fields );
|
312 |
+
|
313 |
+
$addon_setting_values = $this->quiz_settings_instance->get_quiz_settings_values();
|
314 |
+
$quiz_settings = $this->quiz_settings_instance->get_quiz_settings();
|
315 |
+
$addons_fields = $this->quiz_settings_instance->get_form_fields();
|
316 |
+
|
317 |
+
$form_entry_fields = forminator_lead_form_data( $submitted_data );
|
318 |
+
$submitted_data = get_addons_lead_form_entry_data( $quiz_settings, $submitted_data, $addons_fields );
|
319 |
+
$submitted_data = array_merge( $submitted_data, $quiz_submitted_data );
|
320 |
+
|
321 |
+
// initialize as null
|
322 |
+
$mailchimp_api = null;
|
323 |
+
|
324 |
+
//check required fields
|
325 |
+
try {
|
326 |
+
$mailchimp_api = $this->addon->get_api();
|
327 |
+
|
328 |
+
if ( Forminator_Addon_Mailchimp::is_enable_gdpr() ) {
|
329 |
+
// GDPR
|
330 |
+
if ( isset( $addon_setting_values['enable_gdpr'] ) && $addon_setting_values['enable_gdpr'] ) {
|
331 |
+
if ( isset( $addon_setting_values['gdpr_text'] ) && ! empty( $addon_setting_values['gdpr_text'] ) ) {
|
332 |
+
if ( ! $this->gdpr_is_checked ) {
|
333 |
+
//GDPR not checked, add error
|
334 |
+
throw new Forminator_Addon_Mailchimp_Exception(
|
335 |
+
__(
|
336 |
+
'Forminator Addon Mailchimp was not sending subscriber to mailchimp as GDPR field is not checked on input',
|
337 |
+
Forminator::DOMAIN
|
338 |
+
)
|
339 |
+
);
|
340 |
+
|
341 |
+
}
|
342 |
+
}
|
343 |
+
}
|
344 |
+
}
|
345 |
+
|
346 |
+
// EMAIL : super required**
|
347 |
+
if ( ! isset( $addon_setting_values['fields_map']['EMAIL'] ) ) {
|
348 |
+
throw new Forminator_Addon_Mailchimp_Exception(/* translators: ... */
|
349 |
+
sprintf( __( 'Required Field %1$s not mapped yet to Forminator Form Field, Please check your Mailchimp Configuration on Form Settings', Forminator::DOMAIN ), 'EMAIL' )
|
350 |
+
);
|
351 |
+
}
|
352 |
+
|
353 |
+
if ( ! isset( $submitted_data[ $addon_setting_values['fields_map']['EMAIL'] ] ) || empty( $submitted_data[ $addon_setting_values['fields_map']['EMAIL'] ] ) ) {
|
354 |
+
throw new Forminator_Addon_Mailchimp_Exception(/* translators: ... */
|
355 |
+
sprintf( __( 'Required Field %1$s is not filled by user', Forminator::DOMAIN ), 'EMAIL' )
|
356 |
+
);
|
357 |
+
}
|
358 |
+
|
359 |
+
$mailchimp_fields_list_request = $this->addon->get_api()->get_list_merge_fields( $addon_setting_values['mail_list_id'], array() );
|
360 |
+
forminator_addon_maybe_log( __METHOD__, $mailchimp_fields_list_request );
|
361 |
+
$mailchimp_required_fields = array();
|
362 |
+
$mailchimp_required_fields_ids = array();
|
363 |
+
$mailchimp_fields_list = array();
|
364 |
+
if ( isset( $mailchimp_fields_list_request->merge_fields ) && is_array( $mailchimp_fields_list_request->merge_fields ) && ! empty( $mailchimp_fields_list_request->merge_fields ) ) {
|
365 |
+
$mailchimp_fields_list = $mailchimp_fields_list_request->merge_fields;
|
366 |
+
}
|
367 |
+
|
368 |
+
foreach ( $mailchimp_fields_list as $item ) {
|
369 |
+
if ( $item->required ) {
|
370 |
+
$mailchimp_required_fields [] = $item;
|
371 |
+
$mailchimp_required_fields_ids[] = $item->merge_id;
|
372 |
+
}
|
373 |
+
}
|
374 |
+
|
375 |
+
//check required fields fulfilled
|
376 |
+
foreach ( $mailchimp_required_fields as $mailchimp_required_field ) {
|
377 |
+
if ( 'address' === $mailchimp_required_field->type ) {
|
378 |
+
$address_fields = $this->quiz_settings_instance->mail_address_fields();
|
379 |
+
foreach ( $address_fields as $addr => $address ) {
|
380 |
+
if ( ! isset( $addon_setting_values['fields_map'][ $mailchimp_required_field->tag ][ $addr ] ) ) {
|
381 |
+
throw new Forminator_Addon_Mailchimp_Exception(/* translators: ... */
|
382 |
+
sprintf( __( 'Required Field %1$s not mapped yet to Forminator Form Field, Please check your Mailchimp Configuration on Form Settings', Forminator::DOMAIN ), $mailchimp_required_field->name )
|
383 |
+
);
|
384 |
+
}
|
385 |
+
|
386 |
+
if ( ! isset( $submitted_data[ $addon_setting_values['fields_map'][ $mailchimp_required_field->tag ][ $addr ] ] )
|
387 |
+
|| empty( $submitted_data[ $addon_setting_values['fields_map'][ $mailchimp_required_field->tag ][ $addr ] ] ) ) {
|
388 |
+
throw new Forminator_Addon_Mailchimp_Exception(/* translators: ... */
|
389 |
+
sprintf( __( 'Required Field %1$s not filled by user', Forminator::DOMAIN ), $mailchimp_required_field->name )
|
390 |
+
);
|
391 |
+
}
|
392 |
+
}
|
393 |
+
} else {
|
394 |
+
|
395 |
+
if ( ! isset( $addon_setting_values['fields_map'][ $mailchimp_required_field->tag ] ) ) {
|
396 |
+
throw new Forminator_Addon_Mailchimp_Exception(/* translators: ... */
|
397 |
+
sprintf( __( 'Required Field %1$s not mapped yet to Forminator Form Field, Please check your Mailchimp Configuration on Form Settings', Forminator::DOMAIN ), $mailchimp_required_field->name )
|
398 |
+
);
|
399 |
+
}
|
400 |
+
|
401 |
+
$element_id = $addon_setting_values['fields_map'][ $mailchimp_required_field->tag ];
|
402 |
+
$is_calculation = self::element_is_calculation( $element_id );
|
403 |
+
$is_stripe = self::element_is_stripe( $element_id );
|
404 |
+
$has_submit_data = isset( $submitted_data[ $element_id ] ) && ! empty( $submitted_data[ $element_id ] );
|
405 |
+
|
406 |
+
if ( ! $is_calculation && ! $is_stripe && ! $has_submit_data ) {
|
407 |
+
throw new Forminator_Addon_Mailchimp_Exception(/* translators: ... */
|
408 |
+
sprintf( __( 'Required Field %1$s not filled by user', Forminator::DOMAIN ), $mailchimp_required_field->name )
|
409 |
+
);
|
410 |
+
}
|
411 |
+
}
|
412 |
+
}
|
413 |
+
|
414 |
+
// check if user already on the list
|
415 |
+
$subscriber_hash = md5( strtolower( trim( $submitted_data[ $addon_setting_values['fields_map']['EMAIL'] ] ) ) );
|
416 |
+
|
417 |
+
$is_double_opt_in_enabled = isset( $addon_setting_values['enable_double_opt_in'] ) && filter_var( $addon_setting_values['enable_double_opt_in'], FILTER_VALIDATE_BOOLEAN ) ? true : false;
|
418 |
+
$status = 'subscribed';
|
419 |
+
if ( $is_double_opt_in_enabled ) {
|
420 |
+
$status = 'pending';
|
421 |
+
}
|
422 |
+
|
423 |
+
try {
|
424 |
+
// keep subscribed if already subscribed
|
425 |
+
$member_status_request = $mailchimp_api->get_member( $addon_setting_values['mail_list_id'], $subscriber_hash, array() );
|
426 |
+
if ( isset( $member_status_request->status ) && ! empty( $member_status_request->status ) ) {
|
427 |
+
if ( 'subscribed' === $member_status_request->status ) {
|
428 |
+
// already subscribed, keep it subscribed, just update merge_fields
|
429 |
+
$status = 'subscribed';
|
430 |
+
}
|
431 |
+
}
|
432 |
+
} catch ( Forminator_Addon_Mailchimp_Wp_Api_Not_Found_Exception $e ) {
|
433 |
+
//Member not yet subscribed, keep going on, mark status based on double-opt-in option
|
434 |
+
if ( $is_double_opt_in_enabled ) {
|
435 |
+
$status = 'pending';
|
436 |
+
}
|
437 |
+
}
|
438 |
+
|
439 |
+
$args = array(
|
440 |
+
'status' => $status,
|
441 |
+
'status_if_new' => $status,
|
442 |
+
'email_address' => strtolower( trim( $submitted_data[ $addon_setting_values['fields_map']['EMAIL'] ] ) ),
|
443 |
+
);
|
444 |
+
|
445 |
+
$merge_fields = array();
|
446 |
+
foreach ( $mailchimp_fields_list as $item ) {
|
447 |
+
// its mapped ?
|
448 |
+
if ( 'address' === $item->type ) {
|
449 |
+
$address_fields = $this->quiz_settings_instance->mail_address_fields();
|
450 |
+
foreach ( $address_fields as $addr => $address ) {
|
451 |
+
if ( isset( $addon_setting_values['fields_map'][ $item->tag ] ) && ! empty( $addon_setting_values['fields_map'][ $item->tag ] ) ) {
|
452 |
+
if ( isset( $submitted_data[ $addon_setting_values['fields_map'][ $item->tag ][ $addr ] ] ) && ! empty( $submitted_data[ $addon_setting_values['fields_map'][ $item->tag ][ $addr ] ] ) ) {
|
453 |
+
$merge_fields[ $item->tag ][ $addr ] = trim( $submitted_data[ $addon_setting_values['fields_map'][ $item->tag ][ $addr ] ] );
|
454 |
+
}
|
455 |
+
}
|
456 |
+
}
|
457 |
+
} else {
|
458 |
+
if ( isset( $addon_setting_values['fields_map'][ $item->tag ] ) && ! empty( $addon_setting_values['fields_map'][ $item->tag ] ) ) {
|
459 |
+
$element_id = $addon_setting_values['fields_map'][ $item->tag ];
|
460 |
+
if ( isset( $submitted_data[ $element_id ] ) && ( ! empty( $submitted_data[ $element_id ] ) || 0 === (int) $submitted_data[ $element_id ] ) ) {
|
461 |
+
$element_value = trim( $submitted_data[ $element_id ] );
|
462 |
+
}
|
463 |
+
|
464 |
+
if ( isset( $element_value ) ) {
|
465 |
+
$merge_fields[ $item->tag ] = $element_value;
|
466 |
+
unset( $element_value ); // unset for next loop
|
467 |
+
}
|
468 |
+
}
|
469 |
+
}
|
470 |
+
}
|
471 |
+
|
472 |
+
forminator_addon_maybe_log( __METHOD__, $mailchimp_fields_list, $addon_setting_values, $submitted_data, $merge_fields );
|
473 |
+
|
474 |
+
if ( ! empty( $merge_fields ) ) {
|
475 |
+
$args['merge_fields'] = $merge_fields;
|
476 |
+
}
|
477 |
+
|
478 |
+
$mail_list_id = $addon_setting_values['mail_list_id'];
|
479 |
+
|
480 |
+
/**
|
481 |
+
* Filter mail list id to send to Mailchimp API
|
482 |
+
*
|
483 |
+
* Change $mail_list_id that will be send to Mailchimp API,
|
484 |
+
* Any validation required by the mail list should be done.
|
485 |
+
* Else if it's rejected by Mailchimp API, It will only add Request to Log.
|
486 |
+
* Log can be viewed on Entries Page
|
487 |
+
*
|
488 |
+
* @since 1.1
|
489 |
+
*
|
490 |
+
* @param string $mail_list_id
|
491 |
+
* @param int $quiz_id current Form ID
|
492 |
+
* @param array $submitted_data Submitted data
|
493 |
+
* @param Forminator_Addon_Mailchimp_Quiz_Settings $quiz_settings_instance Mailchimp Form Settings
|
494 |
+
*/
|
495 |
+
$mail_list_id = apply_filters(
|
496 |
+
'forminator_addon_mailchimp_add_update_member_request_mail_list_id',
|
497 |
+
$mail_list_id,
|
498 |
+
$quiz_id,
|
499 |
+
$submitted_data,
|
500 |
+
$quiz_settings_instance
|
501 |
+
);
|
502 |
+
|
503 |
+
/**
|
504 |
+
* Filter Mailchimp API request arguments
|
505 |
+
*
|
506 |
+
* Request Arguments will be added to request body.
|
507 |
+
* Default args that will be send contains these keys:
|
508 |
+
* - status
|
509 |
+
* - status_if_new
|
510 |
+
* - merge_fields
|
511 |
+
* - email_address
|
512 |
+
* - interests
|
513 |
+
*
|
514 |
+
* @since 1.1
|
515 |
+
*
|
516 |
+
* @param array $args
|
517 |
+
* @param int $quiz_id current Quiz ID
|
518 |
+
* @param array $submitted_data Submitted data
|
519 |
+
* @param Forminator_Addon_Mailchimp_Quiz_Settings $quiz_settings_instance Mailchimp Quiz Settings
|
520 |
+
*/
|
521 |
+
$args = apply_filters(
|
522 |
+
'forminator_addon_mailchimp_add_update_member_request_args',
|
523 |
+
$args,
|
524 |
+
$quiz_id,
|
525 |
+
$submitted_data,
|
526 |
+
$quiz_settings_instance
|
527 |
+
);
|
528 |
+
|
529 |
+
/**
|
530 |
+
* Fires before Addon send request `add_or_update_member` to Mailchimp API
|
531 |
+
*
|
532 |
+
* If this action throw an error,
|
533 |
+
* then `add_or_update_member` process will be cancelled
|
534 |
+
*
|
535 |
+
* @since 1.1
|
536 |
+
*
|
537 |
+
* @param int $quiz_id current Quiz ID
|
538 |
+
* @param array $submitted_data Submitted data
|
539 |
+
* @param Forminator_Addon_Mailchimp_Quiz_Settings $quiz_settings_instance Mailchimp Quiz Settings
|
540 |
+
*/
|
541 |
+
do_action( 'forminator_addon_mailchimp_before_add_update_member', $quiz_id, $submitted_data, $quiz_settings_instance );
|
542 |
+
|
543 |
+
$add_member_request = $mailchimp_api->add_or_update_member( $mail_list_id, $subscriber_hash, $args );
|
544 |
+
|
545 |
+
if ( ! isset( $add_member_request->id ) || ! $add_member_request->id ) {
|
546 |
+
throw new Forminator_Addon_Mailchimp_Exception(
|
547 |
+
__(
|
548 |
+
'Failed adding or updating member on Mailchimp list',
|
549 |
+
Forminator::DOMAIN
|
550 |
+
)
|
551 |
+
);
|
552 |
+
}
|
553 |
+
|
554 |
+
forminator_addon_maybe_log( __METHOD__, 'Success Add Member' );
|
555 |
+
|
556 |
+
$entry_fields = array(
|
557 |
+
array(
|
558 |
+
'name' => 'status',
|
559 |
+
'value' => array(
|
560 |
+
'is_sent' => true,
|
561 |
+
'description' => __( 'Successfully added or updated member on Mailchimp list', Forminator::DOMAIN ),
|
562 |
+
'data_sent' => $mailchimp_api->get_last_data_sent(),
|
563 |
+
'data_received' => $mailchimp_api->get_last_data_received(),
|
564 |
+
'url_request' => $mailchimp_api->get_last_url_request(),
|
565 |
+
),
|
566 |
+
),
|
567 |
+
);
|
568 |
+
|
569 |
+
} catch ( Forminator_Addon_Mailchimp_Exception $e ) {
|
570 |
+
forminator_addon_maybe_log( __METHOD__, 'Failed to Add Member' );
|
571 |
+
|
572 |
+
$entry_fields = array(
|
573 |
+
array(
|
574 |
+
'name' => 'status',
|
575 |
+
'value' => array(
|
576 |
+
'is_sent' => false,
|
577 |
+
'description' => $e->getMessage(),
|
578 |
+
'data_sent' => ( ( $mailchimp_api instanceof Forminator_Addon_Mailchimp_Wp_Api ) ? $mailchimp_api->get_last_data_sent() : array() ),
|
579 |
+
'data_received' => ( ( $mailchimp_api instanceof Forminator_Addon_Mailchimp_Wp_Api ) ? $mailchimp_api->get_last_data_received() : array() ),
|
580 |
+
'url_request' => ( ( $mailchimp_api instanceof Forminator_Addon_Mailchimp_Wp_Api ) ? $mailchimp_api->get_last_url_request() : '' ),
|
581 |
+
),
|
582 |
+
),
|
583 |
+
);
|
584 |
+
}
|
585 |
+
|
586 |
+
/**
|
587 |
+
* Filter mailchimp entry fields to be saved to entry model
|
588 |
+
*
|
589 |
+
* @since 1.1
|
590 |
+
*
|
591 |
+
* @param array $entry_fields
|
592 |
+
* @param int $quiz_id current Quiz ID
|
593 |
+
* @param array $submitted_data
|
594 |
+
* @param Forminator_Addon_Mailchimp_Quiz_Settings $quiz_settings_instance Mailchimp API Quiz Settings instance
|
595 |
+
*/
|
596 |
+
$entry_fields = apply_filters(
|
597 |
+
'forminator_addon_mailchimp_entry_fields',
|
598 |
+
$entry_fields,
|
599 |
+
$quiz_id,
|
600 |
+
$submitted_data,
|
601 |
+
$quiz_settings_instance
|
602 |
+
);
|
603 |
+
|
604 |
+
return $entry_fields;
|
605 |
+
}
|
606 |
+
|
607 |
+
/**
|
608 |
+
* Add new row of Mailchimp Integration on render entry
|
609 |
+
* subentries that included are:
|
610 |
+
* - Sent To Mailchimp : whether Yes/No, addon send data to Mailchimp API
|
611 |
+
* - Info : Additional info when addon tried to send data to Mailchimp API
|
612 |
+
* - Member Status : Member status that received from Mailchimp API after sending request
|
613 |
+
* - Below subentries will be added if full log enabled, @see Forminator_Addon_Mailchimp::is_show_full_log() @see FORMINATOR_ADDON_MAILCHIMP_SHOW_FULL_LOG
|
614 |
+
* - API URL : URL that wes requested when sending data to Mailchimp
|
615 |
+
* - Data sent to Mailchimp : json encoded body request that was sent
|
616 |
+
* - Data received from Mailchimp : json encoded body response that was received
|
617 |
+
*
|
618 |
+
* @since 1.0 Mailchimp Addon
|
619 |
+
*
|
620 |
+
* @param Forminator_Form_Entry_Model $entry_model
|
621 |
+
* @param $addon_meta_data
|
622 |
+
*
|
623 |
+
* @return array
|
624 |
+
*/
|
625 |
+
public function on_render_entry( Forminator_Form_Entry_Model $entry_model, $addon_meta_data ) {
|
626 |
+
|
627 |
+
$quiz_id = $this->quiz_id;
|
628 |
+
$quiz_settings_instance = $this->quiz_settings_instance;
|
629 |
+
|
630 |
+
/**
|
631 |
+
*
|
632 |
+
* Filter mailchimp metadata that previously saved on db to be processed
|
633 |
+
*
|
634 |
+
* @since 1.1
|
635 |
+
*
|
636 |
+
* @param array $addon_meta_data
|
637 |
+
* @param int $quiz_id current Quiz ID
|
638 |
+
* @param Forminator_Form_Entry_Model $entry_model Forminator Entry Model
|
639 |
+
* @param Forminator_Addon_Mailchimp_Quiz_Settings $quiz_settings_instance Mailchimp API quiz Settings instance
|
640 |
+
*/
|
641 |
+
$addon_meta_data = apply_filters(
|
642 |
+
'forminator_addon_mailchimp_metadata',
|
643 |
+
$addon_meta_data,
|
644 |
+
$quiz_id,
|
645 |
+
$entry_model,
|
646 |
+
$quiz_settings_instance
|
647 |
+
);
|
648 |
+
|
649 |
+
$entry_items = $this->format_metadata_for_entry( $entry_model, $addon_meta_data );
|
650 |
+
|
651 |
+
/**
|
652 |
+
* Filter mailchimp row(s) to be displayed on entries page
|
653 |
+
*
|
654 |
+
* @since 1.1
|
655 |
+
*
|
656 |
+
* @param array $entry_items row(s) to be displayed on entries page
|
657 |
+
* @param int $quiz_id current Quiz ID
|
658 |
+
* @param Forminator_Form_Entry_Model $entry_model Form Entry Model
|
659 |
+
* @param array $addon_meta_data meta data saved by addon on entry fields
|
660 |
+
* @param Forminator_Addon_Mailchimp_Quiz_Settings $quiz_settings_instance Mailchimp API quiz Settings instance
|
661 |
+
*/
|
662 |
+
$entry_items = apply_filters(
|
663 |
+
'forminator_addon_mailchimp_entry_items',
|
664 |
+
$entry_items,
|
665 |
+
$quiz_id,
|
666 |
+
$entry_model,
|
667 |
+
$addon_meta_data,
|
668 |
+
$quiz_settings_instance
|
669 |
+
);
|
670 |
+
|
671 |
+
return $entry_items;
|
672 |
+
}
|
673 |
+
|
674 |
+
/**
|
675 |
+
* Format metadata saved before to be rendered on entry
|
676 |
+
*
|
677 |
+
* @since 1.1
|
678 |
+
*
|
679 |
+
* @param Forminator_Form_Entry_Model $entry_model
|
680 |
+
* @param $addon_meta_data
|
681 |
+
*
|
682 |
+
* @return array
|
683 |
+
*/
|
684 |
+
private function format_metadata_for_entry( Forminator_Form_Entry_Model $entry_model, $addon_meta_data ) {
|
685 |
+
// only process first addon meta datas since we only save one
|
686 |
+
// no entry fields was added before
|
687 |
+
if ( ! isset( $addon_meta_data[0] ) || ! is_array( $addon_meta_data[0] ) ) {
|
688 |
+
return array();
|
689 |
+
}
|
690 |
+
|
691 |
+
$addon_meta_data = $addon_meta_data[0];
|
692 |
+
|
693 |
+
// make sure its `status`, because we only add this
|
694 |
+
if ( 'status' !== $addon_meta_data['name'] ) {
|
695 |
+
return array();
|
696 |
+
}
|
697 |
+
|
698 |
+
if ( ! isset( $addon_meta_data['value'] ) || ! is_array( $addon_meta_data['value'] ) ) {
|
699 |
+
return array();
|
700 |
+
}
|
701 |
+
|
702 |
+
$additional_entry_item = array(
|
703 |
+
'label' => __( 'Mailchimp Integration', Forminator::DOMAIN ),
|
704 |
+
'value' => '',
|
705 |
+
);
|
706 |
+
|
707 |
+
$status = $addon_meta_data['value'];
|
708 |
+
$sub_entries = array();
|
709 |
+
if ( isset( $status['is_sent'] ) ) {
|
710 |
+
$is_sent = true === $status['is_sent'] ? __( 'Yes', Forminator::DOMAIN ) : __( 'No', Forminator::DOMAIN );
|
711 |
+
$sub_entries[] = array(
|
712 |
+
'label' => __( 'Sent To Mailchimp', Forminator::DOMAIN ),
|
713 |
+
'value' => $is_sent,
|
714 |
+
);
|
715 |
+
}
|
716 |
+
|
717 |
+
if ( isset( $status['description'] ) ) {
|
718 |
+
$sub_entries[] = array(
|
719 |
+
'label' => __( 'Info', Forminator::DOMAIN ),
|
720 |
+
'value' => $status['description'],
|
721 |
+
);
|
722 |
+
}
|
723 |
+
|
724 |
+
if ( isset( $status['data_received'] ) && is_object( $status['data_received'] ) ) {
|
725 |
+
$data_received = $status['data_received'];
|
726 |
+
if ( isset( $data_received->status ) && ! empty( $data_received->status ) && is_string( $data_received->status ) ) {
|
727 |
+
$sub_entries[] = array(
|
728 |
+
'label' => __( 'Member Status', Forminator::DOMAIN ),
|
729 |
+
'value' => strtoupper( $data_received->status ),
|
730 |
+
);
|
731 |
+
}
|
732 |
+
}
|
733 |
+
|
734 |
+
if ( Forminator_Addon_Mailchimp::is_show_full_log() ) {
|
735 |
+
// too long to be added on entry data enable this with `define('FORMINATOR_ADDON_MAILCHIMP_SHOW_FULL_LOG', true)`
|
736 |
+
if ( isset( $status['url_request'] ) ) {
|
737 |
+
$sub_entries[] = array(
|
738 |
+
'label' => __( 'API URL', Forminator::DOMAIN ),
|
739 |
+
'value' => $status['url_request'],
|
740 |
+
);
|
741 |
+
}
|
742 |
+
|
743 |
+
if ( isset( $status['data_sent'] ) ) {
|
744 |
+
$sub_entries[] = array(
|
745 |
+
'label' => __( 'Data sent to Mailchimp', Forminator::DOMAIN ),
|
746 |
+
'value' => '<pre class="sui-code-snippet">' . wp_json_encode( $status['data_sent'], JSON_PRETTY_PRINT ) . '</pre>',
|
747 |
+
);
|
748 |
+
}
|
749 |
+
|
750 |
+
if ( isset( $status['data_received'] ) ) {
|
751 |
+
$sub_entries[] = array(
|
752 |
+
'label' => __( 'Data received from Mailchimp', Forminator::DOMAIN ),
|
753 |
+
'value' => '<pre class="sui-code-snippet">' . wp_json_encode( $status['data_received'], JSON_PRETTY_PRINT ) . '</pre>',
|
754 |
+
);
|
755 |
+
}
|
756 |
+
}
|
757 |
+
|
758 |
+
$additional_entry_item['sub_entries'] = $sub_entries;
|
759 |
+
|
760 |
+
// return single array
|
761 |
+
return array( $additional_entry_item );
|
762 |
+
}
|
763 |
+
|
764 |
+
/**
|
765 |
+
* Add new Column called `Mailchimp Info` on header of export file
|
766 |
+
*
|
767 |
+
* @since 1.0 Mailchimp Addon
|
768 |
+
* @return array
|
769 |
+
*/
|
770 |
+
public function on_export_render_title_row() {
|
771 |
+
$export_headers = array(
|
772 |
+
'info' => 'Mailchimp Info',
|
773 |
+
);
|
774 |
+
|
775 |
+
$quiz_id = $this->quiz_id;
|
776 |
+
$quiz_settings_instance = $this->quiz_settings_instance;
|
777 |
+
|
778 |
+
/**
|
779 |
+
* Filter mailchimp headers on export file
|
780 |
+
*
|
781 |
+
* @since 1.1
|
782 |
+
*
|
783 |
+
* @param array $export_headers headers to be displayed on export file
|
784 |
+
* @param int $quiz_id current Quiz ID
|
785 |
+
* @param Forminator_Addon_Mailchimp_Quiz_Settings $quiz_settings_instance Mailchimp API Quiz Settings instance
|
786 |
+
*/
|
787 |
+
$export_headers = apply_filters(
|
788 |
+
'forminator_addon_mailchimp_export_headers',
|
789 |
+
$export_headers,
|
790 |
+
$quiz_id,
|
791 |
+
$quiz_settings_instance
|
792 |
+
);
|
793 |
+
|
794 |
+
return $export_headers;
|
795 |
+
}
|
796 |
+
|
797 |
+
/**
|
798 |
+
* Add description of status mailchimp addon after form submitted similar with render entry
|
799 |
+
*
|
800 |
+
* @since 1.0 Mailchimp Addon
|
801 |
+
*
|
802 |
+
* @param Forminator_Form_Entry_Model $entry_model
|
803 |
+
* @param $addon_meta_data
|
804 |
+
*
|
805 |
+
* @return array
|
806 |
+
*/
|
807 |
+
public function on_export_render_entry( Forminator_Form_Entry_Model $entry_model, $addon_meta_data ) {
|
808 |
+
|
809 |
+
$quiz_id = $this->quiz_id;
|
810 |
+
$quiz_settings_instance = $this->quiz_settings_instance;
|
811 |
+
|
812 |
+
/**
|
813 |
+
*
|
814 |
+
* Filter mailchimp metadata that previously saved on db to be processed
|
815 |
+
*
|
816 |
+
* @since 1.1
|
817 |
+
*
|
818 |
+
* @param array $addon_meta_data
|
819 |
+
* @param int $quiz_id current quiz ID
|
820 |
+
* @param Forminator_Addon_Mailchimp_Quiz_Settings $quiz_settings_instance Mailchimp API Form Settings instance
|
821 |
+
*/
|
822 |
+
$addon_meta_data = apply_filters(
|
823 |
+
'forminator_addon_mailchimp_metadata',
|
824 |
+
$addon_meta_data,
|
825 |
+
$quiz_id,
|
826 |
+
$quiz_settings_instance
|
827 |
+
);
|
828 |
+
|
829 |
+
$export_columns = array(
|
830 |
+
'info' => $this->get_quiz_addon_meta_data( $addon_meta_data, 'description', '' ),
|
831 |
+
);
|
832 |
+
|
833 |
+
/**
|
834 |
+
* Filter mailchimp columns to be displayed on export submissions
|
835 |
+
*
|
836 |
+
* @since 1.1
|
837 |
+
*
|
838 |
+
* @param array $export_columns column to be exported
|
839 |
+
* @param int $quiz_id current quiz ID
|
840 |
+
* @param Forminator_Form_Entry_Model $entry_model Form Entry Model
|
841 |
+
* @param array $addon_meta_data meta data saved by addon on entry fields
|
842 |
+
* @param Forminator_Addon_Mailchimp_Quiz_Settings $quiz_settings_instance Mailchimp API quiz Settings instance
|
843 |
+
*/
|
844 |
+
$export_columns = apply_filters(
|
845 |
+
'forminator_addon_mailchimp_export_columns',
|
846 |
+
$export_columns,
|
847 |
+
$quiz_id,
|
848 |
+
$entry_model,
|
849 |
+
$addon_meta_data,
|
850 |
+
$quiz_settings_instance
|
851 |
+
);
|
852 |
+
|
853 |
+
return $export_columns;
|
854 |
+
}
|
855 |
+
|
856 |
+
/**
|
857 |
+
* Helper to get addon meta data with key specified
|
858 |
+
*
|
859 |
+
* @since 1.0 Mailchimp Addon
|
860 |
+
*
|
861 |
+
* @param $addon_meta_data
|
862 |
+
* @param $key
|
863 |
+
* @param string $default
|
864 |
+
*
|
865 |
+
* @return string
|
866 |
+
*/
|
867 |
+
private function get_quiz_addon_meta_data( $addon_meta_data, $key, $default = '' ) {
|
868 |
+
// only process first addon meta datas since we only save one
|
869 |
+
// no entry fields was added before
|
870 |
+
if ( ! isset( $addon_meta_data[0] ) || ! is_array( $addon_meta_data[0] ) ) {
|
871 |
+
return $default;
|
872 |
+
}
|
873 |
+
|
874 |
+
$addon_meta_data = $addon_meta_data[0];
|
875 |
+
|
876 |
+
// make sure its `status`, because we only add this
|
877 |
+
if ( 'status' !== $addon_meta_data['name'] ) {
|
878 |
+
return $default;
|
879 |
+
}
|
880 |
+
|
881 |
+
if ( ! isset( $addon_meta_data['value'] ) || ! is_array( $addon_meta_data['value'] ) ) {
|
882 |
+
return $default;
|
883 |
+
}
|
884 |
+
$status = $addon_meta_data['value'];
|
885 |
+
if ( isset( $status[ $key ] ) ) {
|
886 |
+
return $status[ $key ];
|
887 |
+
}
|
888 |
+
|
889 |
+
return $default;
|
890 |
+
}
|
891 |
+
|
892 |
+
/**
|
893 |
+
* It will delete members on mailchimp list
|
894 |
+
*
|
895 |
+
* @since 1.0 Mailchimp Addon
|
896 |
+
*
|
897 |
+
* @param Forminator_Form_Entry_Model $entry_model
|
898 |
+
* @param array $addon_meta_data
|
899 |
+
*
|
900 |
+
* @return bool
|
901 |
+
*/
|
902 |
+
public function on_before_delete_entry( Forminator_Form_Entry_Model $entry_model, $addon_meta_data ) {
|
903 |
+
// attach hook first
|
904 |
+
$quiz_id = $this->quiz_id;
|
905 |
+
$quiz_settings_instance = $this->quiz_settings_instance;
|
906 |
+
|
907 |
+
/**
|
908 |
+
*
|
909 |
+
* Filter mailchimp addon metadata that previously saved on db to be processed
|
910 |
+
*
|
911 |
+
* Although it can be used for all addon.
|
912 |
+
* Please keep in mind that if the addon override this method,
|
913 |
+
* then this filter probably won't be applied.
|
914 |
+
* To be sure please check individual addon documentations.
|
915 |
+
*
|
916 |
+
* @since 1.1
|
917 |
+
*
|
918 |
+
* @param array $addon_meta_data
|
919 |
+
* @param int $quiz_id current quiz ID
|
920 |
+
* @param Forminator_Form_Entry_Model $entry_model Forminator Entry Model
|
921 |
+
* @param Forminator_Addon_Quiz_Settings_Abstract|null $quiz_settings_instance of Addon quiz Settings
|
922 |
+
*/
|
923 |
+
$addon_meta_data = apply_filters(
|
924 |
+
'forminator_addon_mailchimp_metadata',
|
925 |
+
$addon_meta_data,
|
926 |
+
$quiz_id,
|
927 |
+
$entry_model,
|
928 |
+
$quiz_settings_instance
|
929 |
+
);
|
930 |
+
|
931 |
+
/**
|
932 |
+
* Fires when mailchimp connected form delete a submission
|
933 |
+
*
|
934 |
+
* Although it can be used for all addon.
|
935 |
+
* Please keep in mind that if the addon override this method,
|
936 |
+
* then this action won't be triggered.
|
937 |
+
* To be sure please check individual addon documentations.
|
938 |
+
*
|
939 |
+
* @since 1.1
|
940 |
+
*
|
941 |
+
* @param int $quiz_id current quiz ID
|
942 |
+
* @param Forminator_Form_Entry_Model $entry_model Forminator Entry Model
|
943 |
+
* @param array $addon_meta_data addon meta data
|
944 |
+
* @param Forminator_Addon_Quiz_Settings_Abstract|null $quiz_settings_instance of Addon quiz Settings
|
945 |
+
*/
|
946 |
+
do_action(
|
947 |
+
'forminator_addon_mailchimp_on_before_delete_submission',
|
948 |
+
$quiz_id,
|
949 |
+
$entry_model,
|
950 |
+
$addon_meta_data,
|
951 |
+
$quiz_settings_instance
|
952 |
+
);
|
953 |
+
|
954 |
+
if ( ! Forminator_Addon_Mailchimp::is_enable_delete_member() ) {
|
955 |
+
// its disabled, go for it!
|
956 |
+
return true;
|
957 |
+
}
|
958 |
+
$mailchimp_api = null;
|
959 |
+
try {
|
960 |
+
$delete_member_url = '';
|
961 |
+
/**
|
962 |
+
* Filter delete member url to send to mailchimp api
|
963 |
+
*/
|
964 |
+
$delete_member_url = apply_filters(
|
965 |
+
'forminator_addon_mailchimp_delete_member_url',
|
966 |
+
$delete_member_url,
|
967 |
+
$quiz_id,
|
968 |
+
$addon_meta_data,
|
969 |
+
$quiz_settings_instance
|
970 |
+
);
|
971 |
+
|
972 |
+
if ( empty( $delete_member_url ) ) {
|
973 |
+
$delete_member_url = self::get_delete_member_url_from_addon_meta_data( $addon_meta_data );
|
974 |
+
}
|
975 |
+
|
976 |
+
forminator_addon_maybe_log( __METHOD__, $delete_member_url );
|
977 |
+
|
978 |
+
if ( ! empty( $delete_member_url ) ) {
|
979 |
+
$mailchimp_api = $this->addon->get_api();
|
980 |
+
$mailchimp_api->delete_( $delete_member_url );
|
981 |
+
}
|
982 |
+
|
983 |
+
return true;
|
984 |
+
|
985 |
+
} catch ( Forminator_Addon_Mailchimp_Wp_Api_Not_Found_Exception $e ) {
|
986 |
+
// its not found, probably already deleted on mailchimp
|
987 |
+
return true;
|
988 |
+
} catch ( Forminator_Addon_Mailchimp_Exception $e ) {
|
989 |
+
// handle all internal addon exceptions with `Forminator_Addon_Mailchimp_Exception`
|
990 |
+
|
991 |
+
// use wp_error, for future usage it can be returned to page entries
|
992 |
+
$wp_error = new WP_Error( 'forminator_addon_mailchimp_delete_member', $e->getMessage() );
|
993 |
+
// handle this in addon by self, since page entries cant handle error messages on delete yet
|
994 |
+
wp_die(
|
995 |
+
esc_html( $wp_error->get_error_message() ),
|
996 |
+
esc_html( $this->addon->get_title() ),
|
997 |
+
array(
|
998 |
+
'response' => 200,
|
999 |
+
'back_link' => true,
|
1000 |
+
)
|
1001 |
+
);
|
1002 |
+
|
1003 |
+
return false;
|
1004 |
+
}
|
1005 |
+
|
1006 |
+
}
|
1007 |
+
|
1008 |
+
/**
|
1009 |
+
* Get valid addon meta data
|
1010 |
+
*
|
1011 |
+
* @since 1.0 Mailchimp Addon
|
1012 |
+
*
|
1013 |
+
* @param array $addon_meta_data
|
1014 |
+
*
|
1015 |
+
* @return array
|
1016 |
+
*/
|
1017 |
+
public static function get_valid_addon_meta_data_value( $addon_meta_data ) {
|
1018 |
+
// preliminary check of addon_meta_data
|
1019 |
+
if ( ! isset( $addon_meta_data[0] ) || ! is_array( $addon_meta_data[0] ) ) {
|
1020 |
+
return array();
|
1021 |
+
}
|
1022 |
+
|
1023 |
+
$addon_meta_data = $addon_meta_data[0];
|
1024 |
+
|
1025 |
+
// make sure its `status`, because we only add this
|
1026 |
+
if ( 'status' !== $addon_meta_data['name'] ) {
|
1027 |
+
return array();
|
1028 |
+
}
|
1029 |
+
if ( ! isset( $addon_meta_data['value'] ) || ! is_array( $addon_meta_data['value'] ) ) {
|
1030 |
+
return array();
|
1031 |
+
}
|
1032 |
+
|
1033 |
+
return $addon_meta_data['value'];
|
1034 |
+
}
|
1035 |
+
|
1036 |
+
/**
|
1037 |
+
* Get DELETE member url form saved addon meta data
|
1038 |
+
*
|
1039 |
+
* @since 1.0 Mailchimp Addon
|
1040 |
+
*
|
1041 |
+
* @param $addon_meta_data
|
1042 |
+
*
|
1043 |
+
* @return string
|
1044 |
+
*/
|
1045 |
+
public static function get_delete_member_url_from_addon_meta_data( $addon_meta_data ) {
|
1046 |
+
|
1047 |
+
// delete links available on data_received of mailchimp
|
1048 |
+
/** == Addon meta data reference ==*/
|
1049 |
+
//[
|
1050 |
+
// {
|
1051 |
+
// "name": "status",
|
1052 |
+
// "value": {
|
1053 |
+
// "is_sent": true,
|
1054 |
+
// "description": "Successfully added or updated member on Mailchimp list",
|
1055 |
+
// "data_sent": {
|
1056 |
+
// ...
|
1057 |
+
// },
|
1058 |
+
// "data_received": {
|
1059 |
+
// "id": "XXXXXXX",
|
1060 |
+
// ...
|
1061 |
+
// "list_id": "XXXXXXX",
|
1062 |
+
// "_links": [
|
1063 |
+
// {
|
1064 |
+
// "rel": "upsert",
|
1065 |
+
// "href": "https:\/\/us9.api.mailchimp.com\/3.0\/lists\/XXXXXXX\/members\/XXXXXXX",
|
1066 |
+
// "method": "PUT",
|
1067 |
+
// "targetSchema": "https:\/\/us9.api.mailchimp.com\/schema\/3.0\/Definitions\/Lists\/Members\/Response.json",
|
1068 |
+
// "schema": "https:\/\/us9.api.mailchimp.com\/schema\/3.0\/Definitions\/Lists\/Members\/PUT.json"
|
1069 |
+
// },
|
1070 |
+
// {
|
1071 |
+
// "rel": "delete",
|
1072 |
+
// "href": "https:\/\/us9.api.mailchimp.com\/3.0\/lists\/XXXXXXX\/members\/XXXXXXX",
|
1073 |
+
// "method": "DELETE"
|
1074 |
+
// },
|
1075 |
+
// ...
|
1076 |
+
// ]
|
1077 |
+
// },
|
1078 |
+
// "url_request": "https:\/\/us9.api.mailchimp.com\/3.0\/lists\/XXXX\/members\/XXXXXXX"
|
1079 |
+
// }
|
1080 |
+
// }
|
1081 |
+
//]
|
1082 |
+
/** == Addon meta data reference ==*/
|
1083 |
+
|
1084 |
+
$delete_member_url = '';
|
1085 |
+
|
1086 |
+
$meta_data_value = self::get_valid_addon_meta_data_value( $addon_meta_data );
|
1087 |
+
if ( empty( $meta_data_value ) ) {
|
1088 |
+
// probably this entry added before connected to mailchimp, mark it as okay to delete entry
|
1089 |
+
return '';
|
1090 |
+
}
|
1091 |
+
|
1092 |
+
if ( isset( $meta_data_value['is_sent'] ) && ! $meta_data_value['is_sent'] ) {
|
1093 |
+
// its not sent to mailchimp so it won't have delete member uri
|
1094 |
+
return '';
|
1095 |
+
}
|
1096 |
+
|
1097 |
+
if ( ! isset( $meta_data_value['data_received'] ) || ! is_object( $meta_data_value['data_received'] ) ) {
|
1098 |
+
// something is happened on addon meta data
|
1099 |
+
return '';
|
1100 |
+
}
|
1101 |
+
|
1102 |
+
$data_received = $meta_data_value['data_received'];
|
1103 |
+
|
1104 |
+
if ( ! isset( $data_received->_links ) || ! is_array( $data_received->_links ) ) {
|
1105 |
+
// something is happened on addon meta data
|
1106 |
+
return '';
|
1107 |
+
}
|
1108 |
+
|
1109 |
+
foreach ( $data_received->_links as $link ) {
|
1110 |
+
if ( ! isset( $link->rel ) || ! isset( $link->method ) || ! isset( $link->href ) ) {
|
1111 |
+
continue;
|
1112 |
+
}
|
1113 |
+
if ( 'delete' === $link->rel && 'DELETE' === $link->method ) {
|
1114 |
+
$delete_member_url = $link->href;
|
1115 |
+
}
|
1116 |
+
}
|
1117 |
+
|
1118 |
+
return $delete_member_url;
|
1119 |
+
}
|
1120 |
+
}
|
addons/pro/mailchimp/class-forminator-addon-mailchimp-quiz-settings-exception.php
ADDED
@@ -0,0 +1,79 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/**
|
4 |
+
* Class Forminator_Addon_Mailchimp_Form_Settings_Exception
|
5 |
+
* Wrapper of Form Settings Mailchimp Exception
|
6 |
+
*
|
7 |
+
* @since 1.0 Mailchimp Addon
|
8 |
+
*/
|
9 |
+
class Forminator_Addon_Mailchimp_Quiz_Settings_Exception extends Forminator_Addon_Mailchimp_Exception {
|
10 |
+
|
11 |
+
/**
|
12 |
+
* Holder of input exceptions
|
13 |
+
*
|
14 |
+
* @var array
|
15 |
+
*/
|
16 |
+
protected $input_exceptions = array();
|
17 |
+
|
18 |
+
/**
|
19 |
+
* Forminator_Addon_Mailchimp_Form_Settings_Exception constructor.
|
20 |
+
*
|
21 |
+
* Useful if input_id is needed for later.
|
22 |
+
* If no input_id needed, use @see Forminator_Addon_Mailchimp_Exception
|
23 |
+
*
|
24 |
+
* @since 1.0 Mailchimp Addon
|
25 |
+
*
|
26 |
+
* @param string $message
|
27 |
+
* @param string $input_id
|
28 |
+
*/
|
29 |
+
public function __construct( $message = '', $input_id = '' ) {
|
30 |
+
parent::__construct( $message, 0 );
|
31 |
+
if ( ! empty( $input_id ) ) {
|
32 |
+
$this->add_input_exception( $message, $input_id );
|
33 |
+
}
|
34 |
+
}
|
35 |
+
|
36 |
+
/**
|
37 |
+
* Set exception message for an input
|
38 |
+
*
|
39 |
+
* @since 1.0 Mailchimp Addon
|
40 |
+
*
|
41 |
+
* @param $message
|
42 |
+
* @param $input_id
|
43 |
+
*/
|
44 |
+
public function add_input_exception( $message, $input_id ) {
|
45 |
+
$this->input_exceptions[ $input_id ] = $message;
|
46 |
+
}
|
47 |
+
|
48 |
+
/**
|
49 |
+
* Set exception message for an address input
|
50 |
+
*
|
51 |
+
* @since 1.0 Mailchimp Addon
|
52 |
+
*
|
53 |
+
* @param $message
|
54 |
+
* @param $input_id
|
55 |
+
* @param $sub_input
|
56 |
+
*/
|
57 |
+
public function add_sub_input_exception( $message, $input_id, $sub_input ) {
|
58 |
+
$this->input_exceptions[ $input_id ][ $sub_input ] = $message;
|
59 |
+
}
|
60 |
+
|
61 |
+
/**
|
62 |
+
* Get all input exceptions
|
63 |
+
*
|
64 |
+
* @since 1.0 Mailchimp Addon
|
65 |
+
* @return array
|
66 |
+
*/
|
67 |
+
public function get_input_exceptions() {
|
68 |
+
return $this->input_exceptions;
|
69 |
+
}
|
70 |
+
|
71 |
+
/**
|
72 |
+
* Check if there is input_exceptions_is_available
|
73 |
+
*
|
74 |
+
* @return bool
|
75 |
+
*/
|
76 |
+
public function input_exceptions_is_available() {
|
77 |
+
return count( $this->input_exceptions ) > 0;
|
78 |
+
}
|
79 |
+
}
|
addons/pro/mailchimp/class-forminator-addon-mailchimp-quiz-settings.php
ADDED
@@ -0,0 +1,833 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
require_once dirname( __FILE__ ) . '/class-forminator-addon-mailchimp-quiz-settings-exception.php';
|
4 |
+
|
5 |
+
/**
|
6 |
+
* Class Forminator_Addon_Mailchimp_Quiz_Settings
|
7 |
+
* Form Settings Mailchimp Process
|
8 |
+
*
|
9 |
+
* @since 1.0 Mailchimp Addon
|
10 |
+
*/
|
11 |
+
class Forminator_Addon_Mailchimp_Quiz_Settings extends Forminator_Addon_Quiz_Settings_Abstract {
|
12 |
+
|
13 |
+
/**
|
14 |
+
* @since 1.0 Mailchimp Addon
|
15 |
+
* @var Forminator_Addon_Mailchimp
|
16 |
+
*/
|
17 |
+
protected $addon;
|
18 |
+
|
19 |
+
/**
|
20 |
+
* Forminator_Addon_Mailchimp_Form_Settings constructor.
|
21 |
+
*
|
22 |
+
* @since 1.0 Mailchimp Addon
|
23 |
+
*
|
24 |
+
* @param Forminator_Addon_Abstract $addon
|
25 |
+
* @param $quiz_id
|
26 |
+
*
|
27 |
+
* @throws Forminator_Addon_Exception
|
28 |
+
*/
|
29 |
+
public function __construct( Forminator_Addon_Abstract $addon, $quiz_id ) {
|
30 |
+
parent::__construct( $addon, $quiz_id );
|
31 |
+
|
32 |
+
$this->_update_quiz_settings_error_message = __(
|
33 |
+
'The update to your settings for this quiz failed, check the quiz input and try again.',
|
34 |
+
Forminator::DOMAIN
|
35 |
+
);
|
36 |
+
}
|
37 |
+
|
38 |
+
/**
|
39 |
+
* For settings Wizard steps
|
40 |
+
*
|
41 |
+
* @since 1.0 Mailchimp Addon
|
42 |
+
* @return array
|
43 |
+
*/
|
44 |
+
public function quiz_settings_wizards() {
|
45 |
+
// already filtered on Abstract
|
46 |
+
// numerical array steps
|
47 |
+
return array(
|
48 |
+
// 0
|
49 |
+
array(
|
50 |
+
'callback' => array( $this, 'mail_list_limit' ),
|
51 |
+
'is_completed' => array( $this, 'step_mail_list_limit_is_completed' ),
|
52 |
+
),
|
53 |
+
// 1
|
54 |
+
array(
|
55 |
+
'callback' => array( $this, 'choose_mail_list' ),
|
56 |
+
'is_completed' => array( $this, 'step_choose_mail_list_is_completed' ),
|
57 |
+
),
|
58 |
+
// 2
|
59 |
+
array(
|
60 |
+
'callback' => array( $this, 'map_fields' ),
|
61 |
+
'is_completed' => array( $this, 'step_map_fields_is_completed' ),
|
62 |
+
),
|
63 |
+
);
|
64 |
+
}
|
65 |
+
|
66 |
+
/**
|
67 |
+
* Choose Mail Limit wizard
|
68 |
+
*
|
69 |
+
* @since 1.0 Mailchimp Addon
|
70 |
+
*
|
71 |
+
* @param $submitted_data
|
72 |
+
*
|
73 |
+
* @return array
|
74 |
+
*/
|
75 |
+
public function mail_list_limit( $submitted_data ) {
|
76 |
+
|
77 |
+
$this->addon_quiz_settings = $this->get_quiz_settings_values();
|
78 |
+
$current_data = array();
|
79 |
+
|
80 |
+
if ( isset( $submitted_data['mail_list_limit'] ) ) {
|
81 |
+
$current_data['mail_list_limit'] = $submitted_data['mail_list_limit'];
|
82 |
+
} elseif ( isset( $this->addon_quiz_settings['mail_list_limit'] ) ) {
|
83 |
+
$current_data['mail_list_limit'] = $this->addon_quiz_settings['mail_list_limit'];
|
84 |
+
} else {
|
85 |
+
$current_data['mail_list_limit'] = 10;
|
86 |
+
}
|
87 |
+
|
88 |
+
forminator_addon_maybe_log( __METHOD__, 'current_data', $current_data );
|
89 |
+
|
90 |
+
$is_submit = ! empty( $submitted_data );
|
91 |
+
|
92 |
+
if ( $is_submit ) {
|
93 |
+
forminator_addon_maybe_log( __METHOD__, '$submitted_data', $submitted_data );
|
94 |
+
|
95 |
+
$this->addon_quiz_settings['mail_list_limit'] = $submitted_data['mail_list_limit'];
|
96 |
+
|
97 |
+
$this->save_quiz_settings_values( $this->addon_quiz_settings );
|
98 |
+
}
|
99 |
+
$buttons = array();
|
100 |
+
// add disconnect button if already is_quiz_connected
|
101 |
+
if ( $this->addon->is_quiz_connected( $this->quiz_id ) ) {
|
102 |
+
$buttons['disconnect']['markup'] = Forminator_Addon_Mailchimp::get_button_markup(
|
103 |
+
esc_html__( 'DISCONNECT', Forminator::DOMAIN ),
|
104 |
+
'sui-button-ghost sui-tooltip sui-tooltip-top-center forminator-addon-form-disconnect',
|
105 |
+
esc_html__( 'Disconnect Mailchimp from this quiz.', Forminator::DOMAIN )
|
106 |
+
);
|
107 |
+
}
|
108 |
+
|
109 |
+
$buttons['next']['markup'] = '<div class="sui-actions-right">' .
|
110 |
+
Forminator_Addon_Mailchimp::get_button_markup( esc_html__( 'Next', Forminator::DOMAIN ), 'forminator-addon-next' ) .
|
111 |
+
'</div>';
|
112 |
+
|
113 |
+
return array(
|
114 |
+
'html' => '<div class="sui-box-content integration-header"><h3 class="sui-box-title" id="dialogTitle2">' . __( 'Enter list limit', Forminator::DOMAIN ) . '</h3></div>
|
115 |
+
<form>
|
116 |
+
<div class="sui-form-field">
|
117 |
+
<label class="sui-label">' . __( 'List limit', Forminator::DOMAIN ) . '</label>
|
118 |
+
<div class="sui-form-field">
|
119 |
+
<input name="mail_list_limit"
|
120 |
+
placeholder="' . sprintf( __( 'Example: 10', Forminator::DOMAIN ), 'Mailchimp' ) . '"
|
121 |
+
value="' . esc_attr( $current_data['mail_list_limit'] ) . '"
|
122 |
+
class="sui-form-control" />
|
123 |
+
<span class="sui-description">' . __( 'By default list limit will be 10.', Forminator::DOMAIN ) . '</spna>
|
124 |
+
|
125 |
+
</div>
|
126 |
+
</div>
|
127 |
+
</form>',
|
128 |
+
'redirect' => false,
|
129 |
+
'buttons' => $buttons,
|
130 |
+
'has_errors' => '',
|
131 |
+
'size' => 'small',
|
132 |
+
);
|
133 |
+
}
|
134 |
+
|
135 |
+
/**
|
136 |
+
* Choose Mail wizard
|
137 |
+
*
|
138 |
+
* @since 1.0 Mailchimp Addon
|
139 |
+
*
|
140 |
+
* @param $submitted_data
|
141 |
+
*
|
142 |
+
* @return array
|
143 |
+
*/
|
144 |
+
public function choose_mail_list( $submitted_data ) {
|
145 |
+
|
146 |
+
// already filtered on Forminator_Addon_Abstract::get_wizard
|
147 |
+
$this->addon_quiz_settings = $this->get_quiz_settings_values();
|
148 |
+
$current_data = array(
|
149 |
+
'mail_list_id' => '',
|
150 |
+
'enable_double_opt_in' => '',
|
151 |
+
'enable_gdpr' => '',
|
152 |
+
'gdpr_text' => '',
|
153 |
+
);
|
154 |
+
|
155 |
+
foreach ( $current_data as $key => $current_field ) {
|
156 |
+
if ( isset( $submitted_data[ $key ] ) ) {
|
157 |
+
$current_data[ $key ] = $submitted_data[ $key ];
|
158 |
+
} elseif ( isset( $this->addon_quiz_settings[ $key ] ) ) {
|
159 |
+
$current_data[ $key ] = $this->addon_quiz_settings[ $key ];
|
160 |
+
}
|
161 |
+
}
|
162 |
+
|
163 |
+
forminator_addon_maybe_log( __METHOD__, 'current_data', $current_data );
|
164 |
+
|
165 |
+
$is_submit = ! empty( $submitted_data );
|
166 |
+
|
167 |
+
$error_message = '';
|
168 |
+
$input_error_messages = array();
|
169 |
+
|
170 |
+
$html_select_mail_list = '';
|
171 |
+
$html_field_mail_list = '';
|
172 |
+
$list_array = array();
|
173 |
+
|
174 |
+
try {
|
175 |
+
$api = $this->addon->get_api();
|
176 |
+
if ( ! empty( $this->addon_quiz_settings['mail_list_limit'] ) ) {
|
177 |
+
$list_array['count'] = $this->addon_quiz_settings['mail_list_limit'];
|
178 |
+
}
|
179 |
+
$request_mail_lists = $api->get_lists( $list_array );
|
180 |
+
|
181 |
+
// Get mailchimp list to be selected, bail on empty
|
182 |
+
if ( ! isset( $request_mail_lists->lists ) || empty( $request_mail_lists->lists ) || ! is_array( $request_mail_lists->lists ) ) {
|
183 |
+
throw new Forminator_Addon_Mailchimp_Exception( 'Your Mailchimp Lists is empty, please create one.' );
|
184 |
+
}
|
185 |
+
$mail_lists = $request_mail_lists->lists;
|
186 |
+
|
187 |
+
// build html select for mail list
|
188 |
+
$html_select_mail_list = '<select name="mail_list_id" class="sui-select sui-form-control">';
|
189 |
+
$html_select_mail_list .= '<option value="">' . __( 'None', Forminator::DOMAIN ) . '</option>';
|
190 |
+
|
191 |
+
foreach ( $mail_lists as $mail_list ) {
|
192 |
+
$html_select_mail_list
|
193 |
+
.= '<option value="' . esc_attr( $mail_list->id ) . '" ' . selected(
|
194 |
+
$current_data['mail_list_id'],
|
195 |
+
$mail_list->id,
|
196 |
+
false
|
197 |
+
) . '>' . esc_html( $mail_list->name ) . '</option>';
|
198 |
+
}
|
199 |
+
$html_select_mail_list .= '</select>';
|
200 |
+
|
201 |
+
// logic when user submit mail list
|
202 |
+
if ( $is_submit ) {
|
203 |
+
forminator_addon_maybe_log( __METHOD__, '$submitted_data', $submitted_data );
|
204 |
+
$mail_list_name = $this->get_choosen_mail_list_name( $mail_lists, $submitted_data );
|
205 |
+
forminator_addon_maybe_log( __METHOD__, '$mail_list_name', $mail_list_name );
|
206 |
+
if ( empty( $mail_list_name ) ) {
|
207 |
+
throw new Forminator_Addon_Mailchimp_Quiz_Settings_Exception( __( 'Please select valid Email List', Forminator::DOMAIN ), 'mail_list_id' );
|
208 |
+
}
|
209 |
+
$this->addon_quiz_settings['mail_list_id'] = $submitted_data['mail_list_id'];
|
210 |
+
$this->addon_quiz_settings['mail_list_name'] = $mail_list_name;
|
211 |
+
|
212 |
+
if ( isset( $submitted_data['enable_double_opt_in'] ) ) {
|
213 |
+
$this->addon_quiz_settings['enable_double_opt_in'] = $submitted_data['enable_double_opt_in'];
|
214 |
+
} else {
|
215 |
+
$this->addon_quiz_settings['enable_double_opt_in'] = 0;
|
216 |
+
}
|
217 |
+
|
218 |
+
// GDPR fields
|
219 |
+
if ( Forminator_Addon_Mailchimp::is_enable_gdpr() ) {
|
220 |
+
if ( isset( $submitted_data['enable_gdpr'] ) ) {
|
221 |
+
$this->addon_quiz_settings['enable_gdpr'] = $submitted_data['enable_gdpr'];
|
222 |
+
} else {
|
223 |
+
$this->addon_quiz_settings['enable_gdpr'] = 0;
|
224 |
+
}
|
225 |
+
if ( isset( $submitted_data['gdpr_text'] ) ) {
|
226 |
+
$this->addon_quiz_settings['gdpr_text'] = $submitted_data['gdpr_text'];
|
227 |
+
}
|
228 |
+
}
|
229 |
+
|
230 |
+
$this->save_quiz_settings_values( $this->addon_quiz_settings );
|
231 |
+
}
|
232 |
+
|
233 |
+
$html_field_mail_list
|
234 |
+
= '<div class="sui-form-field">
|
235 |
+
<label class="sui-label">' . __( 'Email List', Forminator::DOMAIN ) . '</label>
|
236 |
+
' . $html_select_mail_list . '
|
237 |
+
</div>';
|
238 |
+
|
239 |
+
} catch ( Forminator_Addon_Mailchimp_Quiz_Settings_Exception $e ) {
|
240 |
+
// send errors with related input
|
241 |
+
$input_error_messages = $e->get_input_exceptions();
|
242 |
+
if ( isset( $input_error_messages['mail_list_id'] ) ) {
|
243 |
+
$html_field_mail_list
|
244 |
+
= '<div class="sui-form-field sui-form-field-error">
|
245 |
+
<label class="sui-label">' . __( 'Email List', Forminator::DOMAIN ) . '</label>
|
246 |
+
' . $html_select_mail_list . '
|
247 |
+
<span class="sui-error-message">' . esc_html( $input_error_messages['mail_list_id'] ) . '</span>
|
248 |
+
</div>';
|
249 |
+
}
|
250 |
+
} catch ( Forminator_Addon_Mailchimp_Exception $e ) {
|
251 |
+
// send error back to client
|
252 |
+
$error_message = '<div class="sui-notice sui-notice-error"><p>' . $e->getMessage() . '</p></div>';
|
253 |
+
}
|
254 |
+
|
255 |
+
$buttons = array();
|
256 |
+
// add disconnect button if already is_quiz_connected
|
257 |
+
if ( $this->addon->is_quiz_connected( $this->quiz_id ) ) {
|
258 |
+
$buttons['disconnect']['markup'] = Forminator_Addon_Mailchimp::get_button_markup(
|
259 |
+
esc_html__( 'Deactivate', Forminator::DOMAIN ),
|
260 |
+
'sui-button-ghost sui-tooltip sui-tooltip-top-center forminator-addon-form-disconnect',
|
261 |
+
esc_html__( 'Deactivate Mailchimp from this quiz.', Forminator::DOMAIN )
|
262 |
+
);
|
263 |
+
}
|
264 |
+
|
265 |
+
$buttons['next']['markup'] = '<div class="sui-actions-right">' .
|
266 |
+
Forminator_Addon_Mailchimp::get_button_markup( esc_html__( 'Next', Forminator::DOMAIN ), 'forminator-addon-next' ) .
|
267 |
+
'</div>';
|
268 |
+
|
269 |
+
$gdpr_fields = '';
|
270 |
+
if ( Forminator_Addon_Mailchimp::is_enable_gdpr() ) {
|
271 |
+
$gdpr_fields = '<div class="sui-form-field">' .
|
272 |
+
'<label class="sui-label">' . __( 'Enable GDPR', Forminator::DOMAIN ) . '</label>
|
273 |
+
<input type="checkbox" name="enable_gdpr" value="1" ' . checked( 1, $current_data['enable_double_opt_in'], false ) . '>
|
274 |
+
</div>
|
275 |
+
|
276 |
+
<div class="sui-form-field">
|
277 |
+
<label class="sui-label">' . __( 'GDPR Text', Forminator::DOMAIN ) . '</label>
|
278 |
+
<textarea name="gdpr_text">' . $current_data['gdpr_text'] . '</textarea>
|
279 |
+
</div>';
|
280 |
+
}
|
281 |
+
|
282 |
+
return array(
|
283 |
+
'html' => '<div class="sui-box-content integration-header"><h3 class="sui-box-title" id="dialogTitle2">' . __( 'Choose your list', Forminator::DOMAIN ) . '</h3>
|
284 |
+
<span class="sui-description" style="margin-top: 20px;">' . __( 'Choose the list you want to send quiz data to.', Forminator::DOMAIN ) . '</span>
|
285 |
+
' . $error_message . '</div>
|
286 |
+
<form enctype="multipart/form-data">
|
287 |
+
' . $html_field_mail_list . '
|
288 |
+
<div class="sui-form-field">
|
289 |
+
<label class="sui-toggle">
|
290 |
+
<input type="checkbox"
|
291 |
+
name="enable_double_opt_in"
|
292 |
+
id="forminator_addon_mailchimp_enable_double_opt_in"
|
293 |
+
value="1" ' . checked( 1, $current_data['enable_double_opt_in'], false ) . '>
|
294 |
+
<span class="sui-toggle-slider"></span>
|
295 |
+
</label>
|
296 |
+
<span class="sui-toggle-label" for="forminator_addon_mailchimp_enable_double_opt_in">' . __( 'Use Double Opt in', Forminator::DOMAIN ) . '</span>
|
297 |
+
</div>
|
298 |
+
' . $gdpr_fields . '
|
299 |
+
</form>',
|
300 |
+
'redirect' => false,
|
301 |
+
'buttons' => $buttons,
|
302 |
+
'has_errors' => ( ! empty( $error_message ) || ! empty( $input_error_messages ) ),
|
303 |
+
'size' => 'small',
|
304 |
+
'has_back' => true,
|
305 |
+
);
|
306 |
+
|
307 |
+
}
|
308 |
+
|
309 |
+
/**
|
310 |
+
* Step mapping fields on wizard
|
311 |
+
*
|
312 |
+
* @since 1.0 Mailchimp Addon
|
313 |
+
* @since 1.2 Refactor `hasBack` to `has_back`
|
314 |
+
*
|
315 |
+
* @param $submitted_data
|
316 |
+
*
|
317 |
+
* @return array
|
318 |
+
*/
|
319 |
+
public function map_fields( $submitted_data ) {
|
320 |
+
$this->addon_quiz_settings = $this->get_quiz_settings_values();
|
321 |
+
$is_close = false;
|
322 |
+
|
323 |
+
$is_submit = ! empty( $submitted_data );
|
324 |
+
$error_message = '';
|
325 |
+
$html_input_map_fields = '';
|
326 |
+
$input_error_messages = array();
|
327 |
+
|
328 |
+
try {
|
329 |
+
// get merge fields
|
330 |
+
$mailchimp_fields_list_request = $this->addon->get_api()->get_list_merge_fields( $this->addon_quiz_settings['mail_list_id'], array() );
|
331 |
+
$mailchimp_required_fields = array();
|
332 |
+
$mailchimp_required_fields_ids = array();
|
333 |
+
$mailchimp_fields_list = array();
|
334 |
+
if ( isset( $mailchimp_fields_list_request->merge_fields ) && is_array( $mailchimp_fields_list_request->merge_fields ) && ! empty( $mailchimp_fields_list_request->merge_fields ) ) {
|
335 |
+
$mailchimp_fields_list = $mailchimp_fields_list_request->merge_fields;
|
336 |
+
}
|
337 |
+
|
338 |
+
$current_data = array( 'fields_map' => array() );
|
339 |
+
foreach ( $mailchimp_fields_list as $item ) {
|
340 |
+
if ( $item->required ) {
|
341 |
+
$mailchimp_required_fields [] = $item;
|
342 |
+
$mailchimp_required_fields_ids[] = $item->merge_id;
|
343 |
+
}
|
344 |
+
if ( 'address' === $item->type ) {
|
345 |
+
$address_fields = $this->mail_address_fields();
|
346 |
+
foreach ( $address_fields as $addr => $address ) {
|
347 |
+
$current_data['fields_map'][ $item->tag ][ $addr ] = '';
|
348 |
+
}
|
349 |
+
} else {
|
350 |
+
$current_data['fields_map'][ $item->tag ] = '';
|
351 |
+
}
|
352 |
+
}
|
353 |
+
|
354 |
+
// find type of email
|
355 |
+
$email_fields = array();
|
356 |
+
foreach ( $this->form_fields as $form_field ) {
|
357 |
+
if ( 'email' === $form_field['type'] ) {
|
358 |
+
$email_fields[] = $form_field;
|
359 |
+
}
|
360 |
+
}
|
361 |
+
|
362 |
+
// EMAIL
|
363 |
+
$current_data['fields_map']['EMAIL'] = '';
|
364 |
+
if ( isset( $submitted_data['fields_map']['EMAIL'] ) ) {
|
365 |
+
$current_data['fields_map']['EMAIL'] = $submitted_data['fields_map']['EMAIL'];
|
366 |
+
} elseif ( isset( $this->addon_quiz_settings['fields_map']['EMAIL'] ) ) {
|
367 |
+
$current_data['fields_map']['EMAIL'] = $this->addon_quiz_settings['fields_map']['EMAIL'];
|
368 |
+
}
|
369 |
+
|
370 |
+
foreach ( $current_data['fields_map'] as $key => $current_field ) {
|
371 |
+
if ( is_array( $current_field ) ) {
|
372 |
+
foreach ( $current_field as $a => $current ) {
|
373 |
+
if ( isset( $submitted_data['fields_map'][ $key ][ $a ] ) ) {
|
374 |
+
$current_data['fields_map'][ $key ][ $a ] = $submitted_data['fields_map'][ $key ][ $a ];
|
375 |
+
} elseif ( isset( $this->addon_quiz_settings['fields_map'][ $key ] ) ) {
|
376 |
+
$current_data['fields_map'][ $key ][ $a ] = $this->addon_quiz_settings['fields_map'][ $key ][ $a ];
|
377 |
+
}
|
378 |
+
}
|
379 |
+
} else {
|
380 |
+
if ( isset( $submitted_data['fields_map'][ $key ] ) ) {
|
381 |
+
$current_data['fields_map'][ $key ] = $submitted_data['fields_map'][ $key ];
|
382 |
+
} elseif ( isset( $this->addon_quiz_settings['fields_map'][ $key ] ) ) {
|
383 |
+
$current_data['fields_map'][ $key ] = $this->addon_quiz_settings['fields_map'][ $key ];
|
384 |
+
}
|
385 |
+
}
|
386 |
+
}
|
387 |
+
|
388 |
+
/** Build table map fields input */
|
389 |
+
ob_start();
|
390 |
+
$this->get_input_map_fields( $email_fields, $mailchimp_fields_list, $current_data );
|
391 |
+
$html_input_map_fields = ob_get_clean();
|
392 |
+
|
393 |
+
if ( $is_submit ) {
|
394 |
+
$this->step_map_fields_validate( $mailchimp_fields_list, $mailchimp_required_fields, $submitted_data );
|
395 |
+
$this->save_quiz_settings_values( $this->addon_quiz_settings );
|
396 |
+
$is_close = true;
|
397 |
+
}
|
398 |
+
} catch ( Forminator_Addon_Mailchimp_Quiz_Settings_Exception $e ) {
|
399 |
+
$input_error_messages = $e->get_input_exceptions();
|
400 |
+
if ( ! empty( $html_input_map_fields ) ) {
|
401 |
+
foreach ( $input_error_messages as $input_id => $message ) {
|
402 |
+
if ( is_array( $message ) ) {
|
403 |
+
foreach ( $message as $addr => $m ) {
|
404 |
+
$html_input_map_fields = str_replace( '{{$error_css_class_' . $input_id . '_' . $addr . '}}', 'sui-form-field-error', $html_input_map_fields );
|
405 |
+
$html_input_map_fields = str_replace( '{{$error_message_' . $input_id . '_' . $addr . '}}', '<span class="sui-error-message">' . esc_html( $m ) . '</span>', $html_input_map_fields );
|
406 |
+
}
|
407 |
+
} else {
|
408 |
+
$html_input_map_fields = str_replace( '{{$error_css_class_' . $input_id . '}}', 'sui-form-field-error', $html_input_map_fields );
|
409 |
+
$html_input_map_fields = str_replace( '{{$error_message_' . $input_id . '}}', '<span class="sui-error-message">' . esc_html( $message ) . '</span>', $html_input_map_fields );
|
410 |
+
}
|
411 |
+
}
|
412 |
+
}
|
413 |
+
} catch ( Forminator_Addon_Mailchimp_Exception $e ) {
|
414 |
+
$error_message = '<div class="sui-notice sui-notice-error"><p>' . $e->getMessage() . '</p></div>';
|
415 |
+
}
|
416 |
+
|
417 |
+
//cleanup map fields input markup placeholder
|
418 |
+
if ( ! empty( $html_input_map_fields ) ) {
|
419 |
+
$replaced_html_input_map_fields = $html_input_map_fields;
|
420 |
+
$replaced_html_input_map_fields = preg_replace( '/\{\{\$error_css_class_(.+)\}\}/', '', $replaced_html_input_map_fields );
|
421 |
+
$replaced_html_input_map_fields = preg_replace( '/\{\{\$error_message_(.+)\}\}/', '', $replaced_html_input_map_fields );
|
422 |
+
if ( ! is_null( $replaced_html_input_map_fields ) ) {
|
423 |
+
$html_input_map_fields = $replaced_html_input_map_fields;
|
424 |
+
}
|
425 |
+
}
|
426 |
+
|
427 |
+
$buttons = array();
|
428 |
+
if ( $this->addon->is_quiz_connected( $this->quiz_id ) ) {
|
429 |
+
$buttons['disconnect']['markup'] = Forminator_Addon_Mailchimp::get_button_markup(
|
430 |
+
esc_html__( 'Deactivate', Forminator::DOMAIN ),
|
431 |
+
'sui-button-ghost sui-tooltip sui-tooltip-top-center forminator-addon-form-disconnect',
|
432 |
+
esc_html__( 'Deactivate Mailchimp from this quiz.', Forminator::DOMAIN )
|
433 |
+
);
|
434 |
+
}
|
435 |
+
|
436 |
+
$buttons['next']['markup'] = '<div class="sui-actions-right">' .
|
437 |
+
Forminator_Addon_Mailchimp::get_button_markup( esc_html__( 'Save', Forminator::DOMAIN ), 'sui-button-primary forminator-addon-finish' ) .
|
438 |
+
'</div>';
|
439 |
+
|
440 |
+
$notification = array();
|
441 |
+
|
442 |
+
if ( $is_submit && empty( $error_message ) && empty( $input_error_messages ) ) {
|
443 |
+
$notification = array(
|
444 |
+
'type' => 'success',
|
445 |
+
'text' => '<strong>' . $this->addon->get_title() . '</strong> ' . __( 'is activated successfully.' ),
|
446 |
+
);
|
447 |
+
}
|
448 |
+
|
449 |
+
return array(
|
450 |
+
'html' => '<div class="sui-box-content integration-header"><h3 class="sui-box-title" id="dialogTitle2">' . __( 'Assign Fields', Forminator::DOMAIN ) . '</h3>
|
451 |
+
<span class="sui-description" style="margin-top: 20px;">' . __( 'Lastly, match up your quiz fields with your campaign fields to make sure we\'re sending data to the right place.', Forminator::DOMAIN ) . '</span>
|
452 |
+
' . $error_message . '</div>
|
453 |
+
<form enctype="multipart/form-data">
|
454 |
+
' . $html_input_map_fields . '
|
455 |
+
</form>',
|
456 |
+
'redirect' => false,
|
457 |
+
'is_close' => $is_close,
|
458 |
+
'buttons' => $buttons,
|
459 |
+
'has_errors' => ! empty( $error_message ) || ! empty( $input_error_messages ),
|
460 |
+
'notification' => $notification,
|
461 |
+
'size' => 'normal',
|
462 |
+
'has_back' => true,
|
463 |
+
);
|
464 |
+
}
|
465 |
+
|
466 |
+
/**
|
467 |
+
* Get input of Map Fields
|
468 |
+
* its table with html select options as input
|
469 |
+
*
|
470 |
+
* @since 1.0 Mailchimp Addon
|
471 |
+
*
|
472 |
+
* @param $email_fields
|
473 |
+
* @param $mailchimp_fields_list
|
474 |
+
* @param $current_data
|
475 |
+
*/
|
476 |
+
private function get_input_map_fields( $email_fields, $mailchimp_fields_list, $current_data ) {
|
477 |
+
|
478 |
+
$quiz_questions = $this->get_quiz_fields();
|
479 |
+
$quiz_fields = array(
|
480 |
+
'quiz-name' => __( 'Quiz Name', Forminator::DOMAIN ),
|
481 |
+
);
|
482 |
+
foreach ( $quiz_questions as $quiz_question ) {
|
483 |
+
$quiz_fields[ $quiz_question['slug'] ] = $quiz_question['title'];
|
484 |
+
}
|
485 |
+
if ( 'knowledge' === $this->quiz->quiz_type ) {
|
486 |
+
$quiz_fields['correct-answers'] = __( 'Correct Answers', Forminator::DOMAIN );
|
487 |
+
$quiz_fields['total-answers'] = __( 'Total Answers', Forminator::DOMAIN );
|
488 |
+
} elseif ( 'nowrong' === $this->quiz->quiz_type ) {
|
489 |
+
$quiz_fields['result-answers'] = __( 'Result Answer', Forminator::DOMAIN );
|
490 |
+
}
|
491 |
+
?>
|
492 |
+
<table class="sui-table">
|
493 |
+
<thead>
|
494 |
+
<tr>
|
495 |
+
<th><?php echo esc_html( __( 'Mailchimp Field', Forminator::DOMAIN ) ); ?></th>
|
496 |
+
<th><?php echo esc_html( __( 'Forminator Field', Forminator::DOMAIN ) ); ?></th>
|
497 |
+
</tr>
|
498 |
+
</thead>
|
499 |
+
<tbody>
|
500 |
+
<tr>
|
501 |
+
<td><?php echo esc_html( __( 'Email Address', Forminator::DOMAIN ) ); ?> <span class="integrations-required-field">*</span></td>
|
502 |
+
<td>
|
503 |
+
<div class="sui-form-field {{$error_css_class_EMAIL}}">
|
504 |
+
<select class="sui-select" name="fields_map[EMAIL]">
|
505 |
+
<?php if ( empty( $email_fields ) ) { ?>
|
506 |
+
<option value=""><?php esc_html_e( 'None', Forminator::DOMAIN ); ?></option>
|
507 |
+
<?php } else { ?>
|
508 |
+
<?php foreach ( $email_fields as $email_field ) { ?>
|
509 |
+
<option value="<?php echo esc_attr( $email_field['element_id'] ); ?>"
|
510 |
+
<?php selected( $current_data['fields_map']['EMAIL'], $email_field['element_id'] ); ?>>
|
511 |
+
<?php echo esc_html( $email_field['field_label'] . ' | ' . $email_field['element_id'] ); ?>
|
512 |
+
</option>
|
513 |
+
<?php } ?>
|
514 |
+
<?php } ?>
|
515 |
+
</select>
|
516 |
+
{{$error_message_EMAIL}}
|
517 |
+
</div>
|
518 |
+
</td>
|
519 |
+
</tr>
|
520 |
+
<?php
|
521 |
+
foreach ( $mailchimp_fields_list as $item ) {
|
522 |
+
$require_sign = $item->required ? '<span class="integrations-required-field">*</span>' : '';
|
523 |
+
if ( 'address' === $item->type ) {
|
524 |
+
$address_fields = $this->mail_address_fields();
|
525 |
+
foreach ( $address_fields as $addr => $address ) {
|
526 |
+
$address_require_sign = 'addr2' === $addr ? '' : $require_sign;
|
527 |
+
?>
|
528 |
+
<tr>
|
529 |
+
<td><?php echo esc_html( $item->name . ' - ' . $address ); ?> <?php echo esc_html( $address_require_sign ); ?></td>
|
530 |
+
<td>
|
531 |
+
<div class="sui-form-field {{$error_css_class_<?php echo esc_attr( $item->tag ); ?>_<?php echo esc_attr( $addr ); ?>}}">
|
532 |
+
<select class="sui-select" name="fields_map[<?php echo esc_attr( $item->tag ); ?>][<?php echo esc_attr( $addr ); ?>]">
|
533 |
+
<option value=""><?php esc_html_e( 'None', Forminator::DOMAIN ); ?></option>
|
534 |
+
<?php foreach ( $this->form_fields as $form_field ) { ?>
|
535 |
+
<option value="<?php echo esc_attr( $form_field['element_id'] ); ?>"
|
536 |
+
<?php selected( $current_data['fields_map'][ $item->tag ][ $addr ], $form_field['element_id'] ); ?>>
|
537 |
+
<?php echo esc_html( $form_field['field_label'] . ' | ' . $form_field['element_id'] ); ?>
|
538 |
+
</option>
|
539 |
+
<?php } ?>
|
540 |
+
</select>
|
541 |
+
{{$error_message_<?php echo esc_attr( $item->tag ); ?>_<?php echo esc_attr( $addr ); ?>}}
|
542 |
+
</div>
|
543 |
+
</td>
|
544 |
+
</tr>
|
545 |
+
<?php
|
546 |
+
}
|
547 |
+
} else {
|
548 |
+
?>
|
549 |
+
<tr>
|
550 |
+
<td><?php echo esc_html( $item->name ); ?> <?php echo esc_html( $require_sign ); ?></td>
|
551 |
+
<td>
|
552 |
+
<div class="sui-form-field {{$error_css_class_<?php echo esc_attr( $item->tag ); ?>}}">
|
553 |
+
<select class="sui-select" name="fields_map[<?php echo esc_attr( $item->tag ); ?>]">
|
554 |
+
<option value=""><?php esc_html_e( 'None', Forminator::DOMAIN ); ?></option>
|
555 |
+
<?php foreach ( $this->form_fields as $form_field ) { ?>
|
556 |
+
<option value="<?php echo esc_attr( $form_field['element_id'] ); ?>"
|
557 |
+
<?php selected( $current_data['fields_map'][ $item->tag ], $form_field['element_id'] ); ?>>
|
558 |
+
<?php echo esc_html( $form_field['field_label'] . ' | ' . $form_field['element_id'] ); ?>
|
559 |
+
</option>
|
560 |
+
<?php }
|
561 |
+
foreach ( $quiz_fields as $quiz_key => $quiz_field ) : ?>
|
562 |
+
<option value="<?php echo esc_attr( $quiz_key ); ?>"
|
563 |
+
<?php selected( $current_data['fields_map'][ $item->tag ], $quiz_key ); ?>>
|
564 |
+
<?php echo esc_html( $quiz_field . ' | ' . $quiz_key ); ?>
|
565 |
+
</option>
|
566 |
+
<?php endforeach; ?>
|
567 |
+
</select>
|
568 |
+
{{$error_message_<?php echo esc_attr( $item->tag ); ?>}}
|
569 |
+
</div>
|
570 |
+
</td>
|
571 |
+
</tr>
|
572 |
+
<?php
|
573 |
+
}
|
574 |
+
}
|
575 |
+
?>
|
576 |
+
</tbody>
|
577 |
+
</table>
|
578 |
+
<?php
|
579 |
+
}
|
580 |
+
|
581 |
+
/**
|
582 |
+
* Get mail List Name of submitted data
|
583 |
+
*
|
584 |
+
* @since 1.0 Mailchimp Addon
|
585 |
+
*
|
586 |
+
* @param $mail_lists
|
587 |
+
* @param $submitted_data
|
588 |
+
*
|
589 |
+
* @return string
|
590 |
+
*/
|
591 |
+
private function get_choosen_mail_list_name( $mail_lists, $submitted_data ) {
|
592 |
+
$mail_list_id = isset( $submitted_data['mail_list_id'] ) ? $submitted_data['mail_list_id'] : 0;
|
593 |
+
|
594 |
+
$mail_list_name = '';
|
595 |
+
foreach ( $mail_lists as $mail_list ) {
|
596 |
+
if ( $mail_list_id === $mail_list->id ) {
|
597 |
+
$mail_list_name = $mail_list->name;
|
598 |
+
break;
|
599 |
+
}
|
600 |
+
}
|
601 |
+
|
602 |
+
return $mail_list_name;
|
603 |
+
}
|
604 |
+
|
605 |
+
/**
|
606 |
+
* Validate submitted data by user as expected by merge field on mailchimp mail list
|
607 |
+
*
|
608 |
+
* @since 1.0 Mailchimp Addon
|
609 |
+
*
|
610 |
+
* @param $mailchimp_fields_list
|
611 |
+
* @param $mailchimp_required_fields
|
612 |
+
* @param $post_data
|
613 |
+
*
|
614 |
+
* @return array current addon form settings
|
615 |
+
* @throws Forminator_Addon_Mailchimp_Exception
|
616 |
+
* @throws Forminator_Addon_Mailchimp_Form_Settings_Exception
|
617 |
+
*/
|
618 |
+
public function step_map_fields_validate( $mailchimp_fields_list, $mailchimp_required_fields, $post_data ) {
|
619 |
+
|
620 |
+
$forminator_field_element_ids = array();
|
621 |
+
$forminator_quiz_element_ids = array();
|
622 |
+
$address_value = array();
|
623 |
+
foreach ( $this->form_fields as $form_field ) {
|
624 |
+
$forminator_field_element_ids[] = $form_field['element_id'];
|
625 |
+
}
|
626 |
+
|
627 |
+
$quiz_questions = $this->get_quiz_fields();
|
628 |
+
foreach ( $quiz_questions as $quiz_question ) {
|
629 |
+
// collect element ids
|
630 |
+
$forminator_quiz_element_ids[] = $quiz_question['slug'];
|
631 |
+
}
|
632 |
+
if ( 'knowledge' === $this->quiz->quiz_type ) {
|
633 |
+
array_push( $forminator_quiz_element_ids,'quiz-name','correct-answers', 'total-answers' );
|
634 |
+
} elseif ( 'nowrong' === $this->quiz->quiz_type ) {
|
635 |
+
array_push( $forminator_quiz_element_ids,'quiz-name', 'result-answers' );
|
636 |
+
}
|
637 |
+
|
638 |
+
$forminator_field_element_ids = array_merge( $forminator_field_element_ids, $forminator_quiz_element_ids );
|
639 |
+
|
640 |
+
//map mailchimp maped with tag as its key
|
641 |
+
$tag_maped_mailchimp_fields = array();
|
642 |
+
foreach ( $mailchimp_fields_list as $item ) {
|
643 |
+
$tag_maped_mailchimp_fields[ $item->tag ] = $item;
|
644 |
+
}
|
645 |
+
|
646 |
+
if ( ! isset( $post_data['fields_map'] ) ) {
|
647 |
+
$this->_update_quiz_settings_error_message = 'Please assign fields.';
|
648 |
+
throw new Forminator_Addon_Mailchimp_Exception( $this->_update_quiz_settings_error_message );
|
649 |
+
}
|
650 |
+
$post_data = $post_data['fields_map'];
|
651 |
+
|
652 |
+
if ( ! isset( $this->addon_quiz_settings['fields_map'] ) ) {
|
653 |
+
$this->addon_quiz_settings['fields_map'] = array();
|
654 |
+
}
|
655 |
+
|
656 |
+
// set fields_map from post_data for reuse
|
657 |
+
foreach ( $post_data as $mailchimp_field_tag => $forminator_field_id ) {
|
658 |
+
$this->addon_quiz_settings['fields_map'][ $mailchimp_field_tag ] = $post_data[ $mailchimp_field_tag ];
|
659 |
+
}
|
660 |
+
|
661 |
+
$input_exceptions = new Forminator_Addon_Mailchimp_Quiz_Settings_Exception();
|
662 |
+
// EMAIL : super required**
|
663 |
+
if ( ! isset( $post_data['EMAIL'] ) || empty( $post_data['EMAIL'] ) ) {
|
664 |
+
$this->_update_quiz_settings_error_message = __( 'Please choose valid Forminator field for email address.', Forminator::DOMAIN );
|
665 |
+
$input_exceptions->add_input_exception( $this->_update_quiz_settings_error_message, 'EMAIL' );
|
666 |
+
}
|
667 |
+
|
668 |
+
//check required fields fulfilled
|
669 |
+
foreach ( $mailchimp_required_fields as $mailchimp_required_field ) {
|
670 |
+
if ( 'address' === $mailchimp_required_field->type ) {
|
671 |
+
$address_fields = $this->mail_address_fields();
|
672 |
+
foreach ( $address_fields as $addr => $address ) {
|
673 |
+
if ( 'addr2' !== $addr ) {
|
674 |
+
if ( ! isset( $post_data[ $mailchimp_required_field->tag ][ $addr ] ) || empty( $post_data[ $mailchimp_required_field->tag ][ $addr ] ) ) {
|
675 |
+
$this->_update_quiz_settings_error_message =
|
676 |
+
/* translators: ... */
|
677 |
+
sprintf( __( '%s is required by Mailchimp, please choose valid Forminator field.', Forminator::DOMAIN ), $mailchimp_required_field->name );
|
678 |
+
$input_exceptions->add_sub_input_exception( $this->_update_quiz_settings_error_message, $mailchimp_required_field->tag, $addr );
|
679 |
+
}
|
680 |
+
}
|
681 |
+
}
|
682 |
+
}
|
683 |
+
if ( ! isset( $post_data[ $mailchimp_required_field->tag ] ) || empty( $post_data[ $mailchimp_required_field->tag ] ) ) {
|
684 |
+
$this->_update_quiz_settings_error_message =
|
685 |
+
/* translators: ... */
|
686 |
+
sprintf( __( '%s is required by Mailchimp, please choose valid Forminator field.', Forminator::DOMAIN ), $mailchimp_required_field->name );
|
687 |
+
$input_exceptions->add_input_exception( $this->_update_quiz_settings_error_message, $mailchimp_required_field->tag );
|
688 |
+
}
|
689 |
+
}
|
690 |
+
|
691 |
+
// Check availibility on forminator field
|
692 |
+
foreach ( $this->addon_quiz_settings['fields_map'] as $mailchimp_field_tag => $forminator_field_id ) {
|
693 |
+
if ( empty( $forminator_field_id ) ) {
|
694 |
+
continue;
|
695 |
+
}
|
696 |
+
if ( is_array( $forminator_field_id ) ) {
|
697 |
+
foreach ( $forminator_field_id as $addr => $field_id ) {
|
698 |
+
if ( ! empty( $field_id ) ) {
|
699 |
+
$address_value[ $mailchimp_field_tag ][ $addr ] = $field_id;
|
700 |
+
}
|
701 |
+
}
|
702 |
+
foreach ( $forminator_field_id as $addr => $field_id ) {
|
703 |
+
if ( 'addr2' === $addr ) {
|
704 |
+
continue;
|
705 |
+
}
|
706 |
+
if ( ! empty( $address_value ) && ! in_array( $field_id, $forminator_field_element_ids, true ) ) {
|
707 |
+
$mailchimp_field = $tag_maped_mailchimp_fields[ $mailchimp_field_tag ];
|
708 |
+
$mailchimp_field_name = $mailchimp_field->name;
|
709 |
+
|
710 |
+
$this->_update_quiz_settings_error_message =
|
711 |
+
/* translators: ... */
|
712 |
+
sprintf( __( 'Please choose valid Forminator field for %s.', Forminator::DOMAIN ), $mailchimp_field_name );
|
713 |
+
$input_exceptions->add_sub_input_exception( $this->_update_quiz_settings_error_message, $mailchimp_field_tag, $addr );
|
714 |
+
}
|
715 |
+
}
|
716 |
+
}
|
717 |
+
if ( ! is_array( $forminator_field_id ) && ! in_array( $forminator_field_id, $forminator_field_element_ids, true ) ) {
|
718 |
+
if ( 'EMAIL' === $mailchimp_field_tag ) {
|
719 |
+
$mailchimp_field_name = __( 'Email Address', Forminator::DOMAIN );
|
720 |
+
} else {
|
721 |
+
$mailchimp_field = $tag_maped_mailchimp_fields[ $mailchimp_field_tag ];
|
722 |
+
$mailchimp_field_name = $mailchimp_field->name;
|
723 |
+
}
|
724 |
+
|
725 |
+
$this->_update_quiz_settings_error_message =
|
726 |
+
/* translators: ... */
|
727 |
+
sprintf( __( 'Please choose valid Forminator field for %s.', Forminator::DOMAIN ), $mailchimp_field_name );
|
728 |
+
$input_exceptions->add_input_exception( $this->_update_quiz_settings_error_message, $mailchimp_field_tag );
|
729 |
+
}
|
730 |
+
}
|
731 |
+
|
732 |
+
if ( $input_exceptions->input_exceptions_is_available() ) {
|
733 |
+
throw $input_exceptions;
|
734 |
+
}
|
735 |
+
|
736 |
+
return $this->addon_quiz_settings;
|
737 |
+
}
|
738 |
+
|
739 |
+
/**
|
740 |
+
* Check if map fields is completed
|
741 |
+
*
|
742 |
+
* @since 1.0 Mailchimp Addon
|
743 |
+
* @return bool
|
744 |
+
*/
|
745 |
+
public function step_map_fields_is_completed() {
|
746 |
+
$this->addon_quiz_settings = $this->get_quiz_settings_values();
|
747 |
+
if ( ! $this->step_choose_mail_list_is_completed() ) {
|
748 |
+
|
749 |
+
return false;
|
750 |
+
}
|
751 |
+
|
752 |
+
if ( empty( $this->addon_quiz_settings['fields_map'] ) ) {
|
753 |
+
|
754 |
+
return false;
|
755 |
+
}
|
756 |
+
|
757 |
+
if ( ! is_array( $this->addon_quiz_settings['fields_map'] ) ) {
|
758 |
+
return false;
|
759 |
+
}
|
760 |
+
|
761 |
+
if ( count( $this->addon_quiz_settings['fields_map'] ) < 1 ) {
|
762 |
+
|
763 |
+
return false;
|
764 |
+
}
|
765 |
+
|
766 |
+
/**
|
767 |
+
* TODO: check if saved fields_map still valid, by request merge_fields on mailchimp
|
768 |
+
* Easy achieved but will add overhead on site
|
769 |
+
* force_form_disconnect();
|
770 |
+
* save_force_quiz_disconnect_reason();
|
771 |
+
*/
|
772 |
+
|
773 |
+
return true;
|
774 |
+
|
775 |
+
}
|
776 |
+
|
777 |
+
/**
|
778 |
+
* Check if mail list already selected completed
|
779 |
+
*
|
780 |
+
* @since 1.0 Mailchimp Addon
|
781 |
+
* @return bool
|
782 |
+
*/
|
783 |
+
public function step_choose_mail_list_is_completed() {
|
784 |
+
$this->addon_quiz_settings = $this->get_quiz_settings_values();
|
785 |
+
if ( ! isset( $this->addon_quiz_settings['mail_list_id'] ) ) {
|
786 |
+
// preliminary value
|
787 |
+
$this->addon_quiz_settings['mail_list_id'] = 0;
|
788 |
+
|
789 |
+
return false;
|
790 |
+
}
|
791 |
+
|
792 |
+
if ( empty( $this->addon_quiz_settings['mail_list_id'] ) ) {
|
793 |
+
return false;
|
794 |
+
}
|
795 |
+
|
796 |
+
/**
|
797 |
+
* TODO: check if saved mail list id still valid, by request info on mailchimp
|
798 |
+
* Easy achieved but will add overhead on site
|
799 |
+
* force_quiz_disconnect();
|
800 |
+
* save_force_quiz_disconnect_reason();
|
801 |
+
*/
|
802 |
+
|
803 |
+
return true;
|
804 |
+
}
|
805 |
+
|
806 |
+
/**
|
807 |
+
* Check if list limit is completed
|
808 |
+
*
|
809 |
+
* @since 1.0 Mailchimp Addon
|
810 |
+
* @return bool
|
811 |
+
*/
|
812 |
+
public function step_mail_list_limit_is_completed() {
|
813 |
+
|
814 |
+
$this->addon_quiz_settings = $this->get_quiz_settings_values();
|
815 |
+
if ( ! isset( $this->addon_quiz_settings['mail_list_limit'] ) ) {
|
816 |
+
// preliminary value
|
817 |
+
$this->addon_quiz_settings['mail_list_limit'] = 10;
|
818 |
+
|
819 |
+
return true;
|
820 |
+
}
|
821 |
+
|
822 |
+
/**
|
823 |
+
* TODO: check if saved mail list limit still valid, by request info on mailchimp
|
824 |
+
* Easy achieved but will add overhead on site
|
825 |
+
* force_quiz_disconnect();
|
826 |
+
* save_force_quiz_disconnect_reason();
|
827 |
+
*/
|
828 |
+
|
829 |
+
return true;
|
830 |
+
|
831 |
+
}
|
832 |
+
|
833 |
+
}
|
addons/pro/mailchimp/class-forminator-addon-mailchimp.php
CHANGED
@@ -88,6 +88,23 @@ class Forminator_Addon_Mailchimp extends Forminator_Addon_Abstract {
|
|
88 |
*/
|
89 |
protected $_form_hooks = 'Forminator_Addon_Mailchimp_Form_Hooks';
|
90 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
91 |
/**
|
92 |
* Hold account information that currently connected
|
93 |
* Will be saved to @see Forminator_Addon_Mailchimp::save_settings_values()
|
@@ -257,6 +274,60 @@ class Forminator_Addon_Mailchimp extends Forminator_Addon_Abstract {
|
|
257 |
|
258 |
}
|
259 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
260 |
/**
|
261 |
* Return with true / false, you may update you setting update message too
|
262 |
*
|
@@ -636,4 +707,57 @@ class Forminator_Addon_Mailchimp extends Forminator_Addon_Abstract {
|
|
636 |
public function is_poll_connected( $poll_id ) {
|
637 |
return false;
|
638 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
639 |
}
|
88 |
*/
|
89 |
protected $_form_hooks = 'Forminator_Addon_Mailchimp_Form_Hooks';
|
90 |
|
91 |
+
/**
|
92 |
+
* Class name of quiz settings
|
93 |
+
*
|
94 |
+
* @since 1.0 Mailchimp Addon
|
95 |
+
*
|
96 |
+
* @var string
|
97 |
+
*/
|
98 |
+
protected $_quiz_settings = 'Forminator_Addon_Mailchimp_Quiz_Settings';
|
99 |
+
|
100 |
+
/**
|
101 |
+
* Class name of quiz hooks
|
102 |
+
*
|
103 |
+
* @since 1.0 Mailchimp Addon
|
104 |
+
* @var string
|
105 |
+
*/
|
106 |
+
protected $_quiz_hooks = 'Forminator_Addon_Mailchimp_Quiz_Hooks';
|
107 |
+
|
108 |
/**
|
109 |
* Hold account information that currently connected
|
110 |
* Will be saved to @see Forminator_Addon_Mailchimp::save_settings_values()
|
274 |
|
275 |
}
|
276 |
|
277 |
+
/**
|
278 |
+
* Flag for check if and addon connected to a form
|
279 |
+
* by default it will check if last step of form settings already completed by user
|
280 |
+
*
|
281 |
+
* @since 1.0 Mailchimp Addon
|
282 |
+
*
|
283 |
+
* @param $quiz_id
|
284 |
+
*
|
285 |
+
* @return bool
|
286 |
+
*/
|
287 |
+
public function is_quiz_connected( $quiz_id ) {
|
288 |
+
|
289 |
+
try {
|
290 |
+
// initialize with null
|
291 |
+
$quiz_settings_instance = null;
|
292 |
+
if ( ! $this->is_connected() ) {
|
293 |
+
throw new Forminator_Addon_Mailchimp_Exception( __( 'Mailchimp addon not connected.', Forminator::DOMAIN ) );
|
294 |
+
}
|
295 |
+
|
296 |
+
$quiz_settings_instance = $this->get_addon_quiz_settings( $quiz_id );
|
297 |
+
if ( ! $quiz_settings_instance instanceof Forminator_Addon_Mailchimp_Quiz_Settings ) {
|
298 |
+
throw new Forminator_Addon_Mailchimp_Exception( __( 'Form settings instance is not valid Forminator_Addon_Mailchimp_Quiz_Settings.', Forminator::DOMAIN ) );
|
299 |
+
}
|
300 |
+
$wizards = $quiz_settings_instance->quiz_settings_wizards();
|
301 |
+
//last step is completed
|
302 |
+
$last_step = end( $wizards );
|
303 |
+
$last_step_is_complete = call_user_func( $last_step['is_completed'] );
|
304 |
+
if ( ! $last_step_is_complete ) {
|
305 |
+
throw new Forminator_Addon_Mailchimp_Exception( __( 'Form settings is not yet completed.', Forminator::DOMAIN ) );
|
306 |
+
}
|
307 |
+
|
308 |
+
$is_quiz_connected = true;
|
309 |
+
} catch ( Forminator_Addon_Mailchimp_Exception $e ) {
|
310 |
+
$is_quiz_connected = false;
|
311 |
+
|
312 |
+
forminator_addon_maybe_log( __METHOD__, $e->getMessage() );
|
313 |
+
}
|
314 |
+
|
315 |
+
/**
|
316 |
+
* Filter connected status of mailchimp with the form
|
317 |
+
*
|
318 |
+
* @since 1.1
|
319 |
+
*
|
320 |
+
* @param bool $is_quiz_connected
|
321 |
+
* @param int $quiz_id Current Form ID
|
322 |
+
* @param Forminator_Addon_Mailchimp_Quiz_Settings|null $quiz_settings_instance Instance of form settings, or null when unavailable
|
323 |
+
*
|
324 |
+
*/
|
325 |
+
$is_quiz_connected = apply_filters( 'forminator_addon_mailchimp_is_form_connected', $is_quiz_connected, $quiz_id, $quiz_settings_instance );
|
326 |
+
|
327 |
+
return $is_quiz_connected;
|
328 |
+
|
329 |
+
}
|
330 |
+
|
331 |
/**
|
332 |
* Return with true / false, you may update you setting update message too
|
333 |
*
|
707 |
public function is_poll_connected( $poll_id ) {
|
708 |
return false;
|
709 |
}
|
710 |
+
|
711 |
+
/**
|
712 |
+
* Flag for check if has lead form addon connected to a quiz
|
713 |
+
* by default it will check if last step of form settings already completed by user
|
714 |
+
*
|
715 |
+
* @since 1.0 Mailchimp Addon
|
716 |
+
*
|
717 |
+
* @param $quiz_id
|
718 |
+
*
|
719 |
+
* @return bool
|
720 |
+
*/
|
721 |
+
public function is_quiz_lead_connected( $quiz_id ) {
|
722 |
+
|
723 |
+
try {
|
724 |
+
// initialize with null
|
725 |
+
$quiz_settings_instance = null;
|
726 |
+
if ( ! $this->is_connected() ) {
|
727 |
+
throw new Forminator_Addon_Mailchimp_Exception( __( 'Mailchimp addon not connected.', Forminator::DOMAIN ) );
|
728 |
+
}
|
729 |
+
$quiz_settings_instance = $this->get_addon_quiz_settings( $quiz_id );
|
730 |
+
|
731 |
+
if ( ! $quiz_settings_instance instanceof Forminator_Addon_Mailchimp_Quiz_Settings ) {
|
732 |
+
throw new Forminator_Addon_Mailchimp_Exception( __( 'Form settings instance is not valid Forminator_Addon_Mailchimp_Quiz_Settings.', Forminator::DOMAIN ) );
|
733 |
+
}
|
734 |
+
|
735 |
+
$quiz_settings = $quiz_settings_instance->get_quiz_settings();
|
736 |
+
|
737 |
+
if ( isset( $quiz_settings['hasLeads'] ) && $quiz_settings['hasLeads'] ) {
|
738 |
+
$is_quiz_connected = true;
|
739 |
+
} else {
|
740 |
+
$is_quiz_connected = false;
|
741 |
+
}
|
742 |
+
} catch ( Forminator_Addon_Mailchimp_Exception $e ) {
|
743 |
+
$is_quiz_connected = false;
|
744 |
+
|
745 |
+
forminator_addon_maybe_log( __METHOD__, $e->getMessage() );
|
746 |
+
}
|
747 |
+
|
748 |
+
/**
|
749 |
+
* Filter connected status of mailchimp with the form
|
750 |
+
*
|
751 |
+
* @since 1.1
|
752 |
+
*
|
753 |
+
* @param bool $is_quiz_connected
|
754 |
+
* @param int $quiz_id Current Form ID
|
755 |
+
* @param Forminator_Addon_Mailchimp_Quiz_Settings|null $quiz_settings_instance Instance of form settings, or null when unavailable
|
756 |
+
*
|
757 |
+
*/
|
758 |
+
$is_quiz_connected = apply_filters( 'forminator_addon_mailchimp_is_quiz_lead_connected', $is_quiz_connected, $quiz_id, $quiz_settings_instance );
|
759 |
+
|
760 |
+
return $is_quiz_connected;
|
761 |
+
|
762 |
+
}
|
763 |
}
|
addons/pro/mailchimp/mailchimp.php
CHANGED
@@ -21,5 +21,9 @@ function forminator_addon_mailchimp_assets_url() {
|
|
21 |
require_once dirname( __FILE__ ) . '/class-forminator-addon-mailchimp.php';
|
22 |
require_once dirname( __FILE__ ) . '/class-forminator-addon-mailchimp-form-settings.php';
|
23 |
require_once dirname( __FILE__ ) . '/class-forminator-addon-mailchimp-form-hooks.php';
|
|
|
|
|
|
|
|
|
24 |
//Direct Load
|
25 |
Forminator_Addon_Loader::get_instance()->register( 'Forminator_Addon_Mailchimp' );
|
21 |
require_once dirname( __FILE__ ) . '/class-forminator-addon-mailchimp.php';
|
22 |
require_once dirname( __FILE__ ) . '/class-forminator-addon-mailchimp-form-settings.php';
|
23 |
require_once dirname( __FILE__ ) . '/class-forminator-addon-mailchimp-form-hooks.php';
|
24 |
+
|
25 |
+
require_once dirname( __FILE__ ) . '/class-forminator-addon-mailchimp-quiz-settings.php';
|
26 |
+
require_once dirname( __FILE__ ) . '/class-forminator-addon-mailchimp-quiz-hooks.php';
|
27 |
+
|
28 |
//Direct Load
|
29 |
Forminator_Addon_Loader::get_instance()->register( 'Forminator_Addon_Mailchimp' );
|
addons/pro/slack/class-forminator-addon-slack-form-settings.php
CHANGED
@@ -317,7 +317,7 @@ class Forminator_Addon_Slack_Form_Settings extends Forminator_Addon_Form_Setting
|
|
317 |
switch ( $type ) {
|
318 |
case Forminator_Addon_Slack::TARGET_TYPE_PRIVATE_CHANNEL:
|
319 |
$func_get_targets = 'get_groups_list';
|
320 |
-
$key_to_walk = '
|
321 |
$template_params['help_message'] = __( 'Select which Slack private group / channel this feed will post a message to.', Forminator::DOMAIN );
|
322 |
break;
|
323 |
case Forminator_Addon_Slack::TARGET_TYPE_DIRECT_MESSAGE:
|
317 |
switch ( $type ) {
|
318 |
case Forminator_Addon_Slack::TARGET_TYPE_PRIVATE_CHANNEL:
|
319 |
$func_get_targets = 'get_groups_list';
|
320 |
+
$key_to_walk = 'channels';
|
321 |
$template_params['help_message'] = __( 'Select which Slack private group / channel this feed will post a message to.', Forminator::DOMAIN );
|
322 |
break;
|
323 |
case Forminator_Addon_Slack::TARGET_TYPE_DIRECT_MESSAGE:
|
addons/pro/slack/class-forminator-addon-slack-poll-settings.php
CHANGED
@@ -316,7 +316,7 @@ class Forminator_Addon_Slack_Poll_Settings extends Forminator_Addon_Poll_Setting
|
|
316 |
switch ( $type ) {
|
317 |
case Forminator_Addon_Slack::TARGET_TYPE_PRIVATE_CHANNEL:
|
318 |
$func_get_targets = 'get_groups_list';
|
319 |
-
$key_to_walk = '
|
320 |
$template_params['help_message'] = __( 'Select which Slack private group / channel this feed will post a message to.', Forminator::DOMAIN );
|
321 |
break;
|
322 |
case Forminator_Addon_Slack::TARGET_TYPE_DIRECT_MESSAGE:
|
316 |
switch ( $type ) {
|
317 |
case Forminator_Addon_Slack::TARGET_TYPE_PRIVATE_CHANNEL:
|
318 |
$func_get_targets = 'get_groups_list';
|
319 |
+
$key_to_walk = 'channels';
|
320 |
$template_params['help_message'] = __( 'Select which Slack private group / channel this feed will post a message to.', Forminator::DOMAIN );
|
321 |
break;
|
322 |
case Forminator_Addon_Slack::TARGET_TYPE_DIRECT_MESSAGE:
|
addons/pro/slack/class-forminator-addon-slack-quiz-hooks.php
CHANGED
@@ -126,11 +126,13 @@ class Forminator_Addon_Slack_Quiz_Hooks extends Forminator_Addon_Quiz_Hooks_Abst
|
|
126 |
$quiz_id = $this->quiz_id;
|
127 |
$quiz_settings_instance = $this->quiz_settings_instance;
|
128 |
$quiz_settings = $this->quiz_settings_instance->get_quiz_settings();
|
|
|
129 |
|
130 |
//check required fields
|
131 |
try {
|
132 |
$api = $this->addon->get_api();
|
133 |
$args = array();
|
|
|
134 |
|
135 |
if ( ! isset( $connection_settings['target_id'] ) ) {
|
136 |
throw new Forminator_Addon_Slack_Exception( __( 'Target ID not properly setup.', Forminator::DOMAIN ) );
|
@@ -145,8 +147,16 @@ class Forminator_Addon_Slack_Quiz_Hooks extends Forminator_Addon_Quiz_Hooks_Abst
|
|
145 |
// {quiz_name_replace} //phpcs:ignore
|
146 |
$text_message = str_ireplace( '{quiz_name}', forminator_get_name_from_model( $this->quiz ), $text_message );
|
147 |
|
148 |
-
$
|
149 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
150 |
/**
|
151 |
* Filter `attachments` to passed onto API
|
152 |
*
|
@@ -286,9 +296,9 @@ class Forminator_Addon_Slack_Quiz_Hooks extends Forminator_Addon_Quiz_Hooks_Abst
|
|
286 |
}
|
287 |
} elseif ( 'nowrong' === $this->quiz->quiz_type ) {
|
288 |
if ( isset( $quiz_entry['value'][0] )
|
289 |
-
|
290 |
-
|
291 |
-
|
292 |
|
293 |
$quiz_entry = $quiz_entry['value'][0]['value'];
|
294 |
|
@@ -365,6 +375,94 @@ class Forminator_Addon_Slack_Quiz_Hooks extends Forminator_Addon_Quiz_Hooks_Abst
|
|
365 |
return $attachments;
|
366 |
}
|
367 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
368 |
|
369 |
/**
|
370 |
* Slack will add a column on the title/header row
|
126 |
$quiz_id = $this->quiz_id;
|
127 |
$quiz_settings_instance = $this->quiz_settings_instance;
|
128 |
$quiz_settings = $this->quiz_settings_instance->get_quiz_settings();
|
129 |
+
$addons_fields = $this->quiz_settings_instance->get_form_fields();
|
130 |
|
131 |
//check required fields
|
132 |
try {
|
133 |
$api = $this->addon->get_api();
|
134 |
$args = array();
|
135 |
+
$lead_attachments = array();
|
136 |
|
137 |
if ( ! isset( $connection_settings['target_id'] ) ) {
|
138 |
throw new Forminator_Addon_Slack_Exception( __( 'Target ID not properly setup.', Forminator::DOMAIN ) );
|
147 |
// {quiz_name_replace} //phpcs:ignore
|
148 |
$text_message = str_ireplace( '{quiz_name}', forminator_get_name_from_model( $this->quiz ), $text_message );
|
149 |
|
150 |
+
$quiz_attachments = $this->get_quiz_data_as_attachments( $submitted_data, $quiz_entry_fields );
|
151 |
|
152 |
+
if ( isset( $quiz_settings['hasLeads'] ) && $quiz_settings['hasLeads'] ) {
|
153 |
+
$form_entry_fields = forminator_lead_form_data( $submitted_data );
|
154 |
+
$lead_submitted_data = forminator_addons_lead_submitted_data( $addons_fields, $form_entry_fields );
|
155 |
+
$text_message = forminator_addon_replace_custom_vars( $text_message, $lead_submitted_data, $this->lead_model, $form_entry_fields );
|
156 |
+
$lead_attachments = $this->get_lead_form_fields_as_attachments( $lead_submitted_data, $form_entry_fields );
|
157 |
+
}
|
158 |
+
|
159 |
+
$attachments = array_merge( $quiz_attachments, $lead_attachments );
|
160 |
/**
|
161 |
* Filter `attachments` to passed onto API
|
162 |
*
|
296 |
}
|
297 |
} elseif ( 'nowrong' === $this->quiz->quiz_type ) {
|
298 |
if ( isset( $quiz_entry['value'][0] )
|
299 |
+
&& is_array( $quiz_entry['value'][0] )
|
300 |
+
&& isset( $quiz_entry['value'][0]['value'] )
|
301 |
+
&& is_array( $quiz_entry['value'][0]['value'] ) ) {
|
302 |
|
303 |
$quiz_entry = $quiz_entry['value'][0]['value'];
|
304 |
|
375 |
return $attachments;
|
376 |
}
|
377 |
|
378 |
+
/**
|
379 |
+
* Get All Form Fields as attachments
|
380 |
+
*
|
381 |
+
* @since 1.0 Slack Addon
|
382 |
+
*
|
383 |
+
* @param $submitted_data
|
384 |
+
* @param $form_entry_fields
|
385 |
+
*
|
386 |
+
* @return array
|
387 |
+
*/
|
388 |
+
public function get_lead_form_fields_as_attachments( $submitted_data, $form_entry_fields ) {
|
389 |
+
$attachments = array();
|
390 |
+
$all_fields_attachments = array();
|
391 |
+
$all_fields_attachments_fields = array();
|
392 |
+
$form_fields = $this->quiz_settings_instance->get_form_fields();
|
393 |
+
$field_format = array();
|
394 |
+
$post_element_ids = array();
|
395 |
+
|
396 |
+
foreach ( $form_fields as $form_field ) {
|
397 |
+
$element_id = $form_field['element_id'];
|
398 |
+
$field_type = $form_field['type'];
|
399 |
+
$field_label = $form_field['field_label'];
|
400 |
+
|
401 |
+
$post_element_id = $element_id;
|
402 |
+
if ( stripos( $field_type, 'postdata' ) !== false ) {
|
403 |
+
$post_type = $form_field['post_type'];
|
404 |
+
$category_list = forminator_post_categories( $post_type );
|
405 |
+
$post_element_id = str_ireplace( '-post-title', '', $post_element_id );
|
406 |
+
$post_element_id = str_ireplace( '-post-content', '', $post_element_id );
|
407 |
+
$post_element_id = str_ireplace( '-post-excerpt', '', $post_element_id );
|
408 |
+
if ( ! empty( $category_list ) ) {
|
409 |
+
foreach ( $category_list as $category ) {
|
410 |
+
$post_element_id = str_ireplace( '-' . $category['value'], '', $post_element_id );
|
411 |
+
$field_format[] = 'postdata-' . $category['value'];
|
412 |
+
}
|
413 |
+
}
|
414 |
+
$post_element_id = str_ireplace( '-post-image', '', $post_element_id );
|
415 |
+
|
416 |
+
// only add postdata as single
|
417 |
+
if ( in_array( $post_element_id, $post_element_ids, true ) ) {
|
418 |
+
continue;
|
419 |
+
}
|
420 |
+
$post_element_ids[] = $post_element_id;
|
421 |
+
}
|
422 |
+
|
423 |
+
switch ( $field_type ) {
|
424 |
+
case 'postdata-post-title':
|
425 |
+
case 'postdata-post-content':
|
426 |
+
case 'postdata-post-excerpt':
|
427 |
+
case 'postdata-post-image':
|
428 |
+
$field_value = '{' . $post_element_id . '}';
|
429 |
+
$field_value = forminator_addon_replace_custom_vars( $field_value, $submitted_data, $this->lead_model, $form_entry_fields, false );
|
430 |
+
$all_fields_attachments_fields[] = array(
|
431 |
+
'title' => $field_label,
|
432 |
+
'value' => ( empty( $field_value ) ? '-' : $field_value ),
|
433 |
+
'short' => false,
|
434 |
+
);
|
435 |
+
|
436 |
+
break;
|
437 |
+
default:
|
438 |
+
$field_value = '{' . $element_id . '}';
|
439 |
+
$field_value = forminator_addon_replace_custom_vars( $field_value, $submitted_data, $this->lead_model, $form_entry_fields, false );
|
440 |
+
$all_fields_attachments_fields[] = array(
|
441 |
+
'title' => $field_label,
|
442 |
+
'value' => ( empty( $field_value ) ? '-' : $field_value ),
|
443 |
+
'short' => false,
|
444 |
+
);
|
445 |
+
break;
|
446 |
+
}
|
447 |
+
|
448 |
+
if ( in_array( $field_type, $field_format, true ) ) {
|
449 |
+
|
450 |
+
$field_value = '{' . $post_element_id . '}';
|
451 |
+
$field_value = forminator_addon_replace_custom_vars( $field_value, $submitted_data, $this->lead_model, $form_entry_fields, false );
|
452 |
+
$all_fields_attachments_fields[] = array(
|
453 |
+
'title' => $field_label,
|
454 |
+
'value' => ( empty( $field_value ) ? '-' : $field_value ),
|
455 |
+
'short' => false,
|
456 |
+
);
|
457 |
+
}
|
458 |
+
}
|
459 |
+
|
460 |
+
$all_fields_attachments['fields'] = $all_fields_attachments_fields;
|
461 |
+
$attachments[] = $all_fields_attachments;
|
462 |
+
|
463 |
+
return $attachments;
|
464 |
+
}
|
465 |
+
|
466 |
|
467 |
/**
|
468 |
* Slack will add a column on the title/header row
|
addons/pro/slack/class-forminator-addon-slack-quiz-settings.php
CHANGED
@@ -316,7 +316,7 @@ class Forminator_Addon_Slack_Quiz_Settings extends Forminator_Addon_Quiz_Setting
|
|
316 |
switch ( $type ) {
|
317 |
case Forminator_Addon_Slack::TARGET_TYPE_PRIVATE_CHANNEL:
|
318 |
$func_get_targets = 'get_groups_list';
|
319 |
-
$key_to_walk = '
|
320 |
$template_params['help_message'] = __( 'Select which Slack private group / channel this feed will post a message to.', Forminator::DOMAIN );
|
321 |
break;
|
322 |
case Forminator_Addon_Slack::TARGET_TYPE_DIRECT_MESSAGE:
|
@@ -460,11 +460,16 @@ class Forminator_Addon_Slack_Quiz_Settings extends Forminator_Addon_Quiz_Setting
|
|
460 |
'multi_id' => $multi_id,
|
461 |
'error_message' => '',
|
462 |
'tags' => array(),
|
|
|
463 |
);
|
464 |
|
465 |
$template_params['tags'] = forminator_get_vars();
|
466 |
$template_params['tags']['quiz_name'] = __( 'Quiz Name', Forminator::DOMAIN );
|
467 |
|
|
|
|
|
|
|
|
|
468 |
$is_submit = ! empty( $submitted_data );
|
469 |
$has_errors = false;
|
470 |
$notification = array();
|
316 |
switch ( $type ) {
|
317 |
case Forminator_Addon_Slack::TARGET_TYPE_PRIVATE_CHANNEL:
|
318 |
$func_get_targets = 'get_groups_list';
|
319 |
+
$key_to_walk = 'channels';
|
320 |
$template_params['help_message'] = __( 'Select which Slack private group / channel this feed will post a message to.', Forminator::DOMAIN );
|
321 |
break;
|
322 |
case Forminator_Addon_Slack::TARGET_TYPE_DIRECT_MESSAGE:
|
460 |
'multi_id' => $multi_id,
|
461 |
'error_message' => '',
|
462 |
'tags' => array(),
|
463 |
+
'lead_fields' => array(),
|
464 |
);
|
465 |
|
466 |
$template_params['tags'] = forminator_get_vars();
|
467 |
$template_params['tags']['quiz_name'] = __( 'Quiz Name', Forminator::DOMAIN );
|
468 |
|
469 |
+
if ( isset( $this->quiz_settings['hasLeads'] ) && $this->quiz_settings['hasLeads'] ) {
|
470 |
+
$template_params['lead_fields'] = $this->form_fields;
|
471 |
+
}
|
472 |
+
|
473 |
$is_submit = ! empty( $submitted_data );
|
474 |
$has_errors = false;
|
475 |
$notification = array();
|
addons/pro/slack/lib/class-forminator-addon-slack-wp-api.php
CHANGED
@@ -272,7 +272,8 @@ class Forminator_Addon_Slack_Wp_Api {
|
|
272 |
'code' => $code,
|
273 |
'redirect_uri' => $redirect_uri,
|
274 |
);
|
275 |
-
|
|
|
276 |
|
277 |
return $this->request(
|
278 |
'GET',
|
@@ -294,9 +295,10 @@ class Forminator_Addon_Slack_Wp_Api {
|
|
294 |
*/
|
295 |
public function get_users_list( $args = array() ) {
|
296 |
$default_args = array(
|
297 |
-
'limit' =>
|
298 |
);
|
299 |
-
|
|
|
300 |
|
301 |
return $this->request(
|
302 |
'GET',
|
@@ -320,13 +322,14 @@ class Forminator_Addon_Slack_Wp_Api {
|
|
320 |
$default_args = array(
|
321 |
'exclude_archived' => true,
|
322 |
'exclude_members' => true,
|
323 |
-
'limit' =>
|
324 |
);
|
325 |
-
|
|
|
326 |
|
327 |
return $this->request(
|
328 |
'GET',
|
329 |
-
'
|
330 |
$args
|
331 |
);
|
332 |
}
|
@@ -346,12 +349,15 @@ class Forminator_Addon_Slack_Wp_Api {
|
|
346 |
$default_args = array(
|
347 |
'exclude_archived' => true,
|
348 |
'exclude_members' => true,
|
|
|
|
|
349 |
);
|
350 |
-
|
|
|
351 |
|
352 |
return $this->request(
|
353 |
'GET',
|
354 |
-
'
|
355 |
$args
|
356 |
);
|
357 |
}
|
@@ -374,7 +380,8 @@ class Forminator_Addon_Slack_Wp_Api {
|
|
374 |
'channel' => $channel,
|
375 |
'text' => $text,
|
376 |
);
|
377 |
-
|
|
|
378 |
|
379 |
return $this->request(
|
380 |
'POST',
|
@@ -401,7 +408,8 @@ class Forminator_Addon_Slack_Wp_Api {
|
|
401 |
'channel' => $channel,
|
402 |
'ts' => $chat_ts,
|
403 |
);
|
404 |
-
|
|
|
405 |
|
406 |
return $this->request(
|
407 |
'POST',
|
272 |
'code' => $code,
|
273 |
'redirect_uri' => $redirect_uri,
|
274 |
);
|
275 |
+
|
276 |
+
$args = array_merge( $default_args, $args );
|
277 |
|
278 |
return $this->request(
|
279 |
'GET',
|
295 |
*/
|
296 |
public function get_users_list( $args = array() ) {
|
297 |
$default_args = array(
|
298 |
+
'limit' => 100,
|
299 |
);
|
300 |
+
|
301 |
+
$args = array_merge( $default_args, $args );
|
302 |
|
303 |
return $this->request(
|
304 |
'GET',
|
322 |
$default_args = array(
|
323 |
'exclude_archived' => true,
|
324 |
'exclude_members' => true,
|
325 |
+
'limit' => 100,
|
326 |
);
|
327 |
+
|
328 |
+
$args = array_merge( $default_args, $args );
|
329 |
|
330 |
return $this->request(
|
331 |
'GET',
|
332 |
+
'conversations.list',
|
333 |
$args
|
334 |
);
|
335 |
}
|
349 |
$default_args = array(
|
350 |
'exclude_archived' => true,
|
351 |
'exclude_members' => true,
|
352 |
+
'limit' => 100,
|
353 |
+
'types' => 'private_channel'
|
354 |
);
|
355 |
+
|
356 |
+
$args = array_merge( $default_args, $args );
|
357 |
|
358 |
return $this->request(
|
359 |
'GET',
|
360 |
+
'conversations.list',
|
361 |
$args
|
362 |
);
|
363 |
}
|
380 |
'channel' => $channel,
|
381 |
'text' => $text,
|
382 |
);
|
383 |
+
|
384 |
+
$args = array_merge( $default_args, $args );
|
385 |
|
386 |
return $this->request(
|
387 |
'POST',
|
408 |
'channel' => $channel,
|
409 |
'ts' => $chat_ts,
|
410 |
);
|
411 |
+
|
412 |
+
$args = array_merge( $default_args, $args );
|
413 |
|
414 |
return $this->request(
|
415 |
'POST',
|
addons/pro/slack/views/quiz-settings/setup-message.php
CHANGED
@@ -6,6 +6,7 @@ $vars = array(
|
|
6 |
'error_message' => '',
|
7 |
'multi_id' => '',
|
8 |
'tags' => array(),
|
|
|
9 |
);
|
10 |
/** @var array $template_vars */
|
11 |
foreach ( $template_vars as $key => $val ) {
|
@@ -37,7 +38,13 @@ foreach ( $template_vars as $key => $val ) {
|
|
37 |
<?php foreach ( $vars['tags'] as $short_tag => $label ) : ?>
|
38 |
<option value="{<?php echo esc_attr( $short_tag ); ?>}"
|
39 |
data-content="{<?php echo esc_attr( $short_tag ); ?>}"><?php echo esc_html( $label ); ?></option>
|
40 |
-
<?php endforeach;
|
|
|
|
|
|
|
|
|
|
|
|
|
41 |
|
42 |
</div>
|
43 |
|
6 |
'error_message' => '',
|
7 |
'multi_id' => '',
|
8 |
'tags' => array(),
|
9 |
+
'lead_fields' => array(),
|
10 |
);
|
11 |
/** @var array $template_vars */
|
12 |
foreach ( $template_vars as $key => $val ) {
|
38 |
<?php foreach ( $vars['tags'] as $short_tag => $label ) : ?>
|
39 |
<option value="{<?php echo esc_attr( $short_tag ); ?>}"
|
40 |
data-content="{<?php echo esc_attr( $short_tag ); ?>}"><?php echo esc_html( $label ); ?></option>
|
41 |
+
<?php endforeach; ?>
|
42 |
+
<?php if ( ! empty( $vars['lead_fields'] ) ) :
|
43 |
+
foreach ( $vars['lead_fields'] as $field ) : ?>
|
44 |
+
<option value="{<?php echo esc_attr( $field['element_id'] ); ?>}" data-content="{<?php echo esc_attr( $field['element_id'] ); ?>}"><?php echo esc_html( $field['field_label'] ); ?></option>
|
45 |
+
<?php endforeach;
|
46 |
+
endif; ?>
|
47 |
+
</select>
|
48 |
|
49 |
</div>
|
50 |
|
addons/pro/trello/class-forminator-addon-trello-form-hooks.php
CHANGED
@@ -62,9 +62,9 @@ class Forminator_Addon_Trello_Form_Hooks extends Forminator_Addon_Form_Hooks_Abs
|
|
62 |
*
|
63 |
* @since 1.2
|
64 |
*
|
65 |
-
* @param array
|
66 |
-
* @param array
|
67 |
-
* @param int
|
68 |
* @param Forminator_Addon_Trello_Form_Settings $form_settings_instance Trello Addon Form Settings instance
|
69 |
*/
|
70 |
$submitted_data = apply_filters(
|
@@ -80,9 +80,9 @@ class Forminator_Addon_Trello_Form_Hooks extends Forminator_Addon_Form_Hooks_Abs
|
|
80 |
*
|
81 |
* @since 1.2
|
82 |
*
|
83 |
-
* @param array
|
84 |
-
* @param array
|
85 |
-
* @param int
|
86 |
* @param Forminator_Addon_Trello_Form_Settings $form_settings_instance Trello Addon Form Settings instance
|
87 |
*/
|
88 |
$form_entry_fields = apply_filters(
|
@@ -104,8 +104,8 @@ class Forminator_Addon_Trello_Form_Hooks extends Forminator_Addon_Form_Hooks_Abs
|
|
104 |
*
|
105 |
* @since 1.2
|
106 |
*
|
107 |
-
* @param int
|
108 |
-
* @param array
|
109 |
* @param Forminator_Addon_Trello_Form_Settings $form_settings_instance Trello Addon Form Settings instance
|
110 |
*/
|
111 |
do_action( 'forminator_addon_trello_before_create_card', $form_id, $submitted_data, $form_settings_instance );
|
@@ -127,10 +127,10 @@ class Forminator_Addon_Trello_Form_Hooks extends Forminator_Addon_Form_Hooks_Abs
|
|
127 |
*
|
128 |
* @since 1.2
|
129 |
*
|
130 |
-
* @param array
|
131 |
-
* @param int
|
132 |
-
* @param array
|
133 |
-
* @param array
|
134 |
* @param Forminator_Addon_Trello_Form_Settings $form_settings_instance Trello Addon Form Settings instance
|
135 |
*/
|
136 |
$data = apply_filters(
|
@@ -152,9 +152,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 |
*/
|
@@ -187,13 +187,13 @@ class Forminator_Addon_Trello_Form_Hooks extends Forminator_Addon_Form_Hooks_Abs
|
|
187 |
*
|
188 |
* @since 1.2
|
189 |
*
|
190 |
-
* @param string
|
191 |
-
* @param int
|
192 |
-
* @param string
|
193 |
-
* @param array
|
194 |
-
* @param array
|
195 |
-
* @param array
|
196 |
-
* @param array
|
197 |
* @param Forminator_Addon_Trello_Form_Settings $form_settings_instance Trello Addon Form Settings instance
|
198 |
*/
|
199 |
$card_name = apply_filters(
|
@@ -222,13 +222,13 @@ class Forminator_Addon_Trello_Form_Hooks extends Forminator_Addon_Form_Hooks_Abs
|
|
222 |
*
|
223 |
* @since 1.2
|
224 |
*
|
225 |
-
* @param string
|
226 |
-
* @param int
|
227 |
-
* @param string
|
228 |
-
* @param array
|
229 |
-
* @param array
|
230 |
-
* @param array
|
231 |
-
* @param array
|
232 |
* @param Forminator_Addon_Trello_Form_Settings $form_settings_instance Trello Addon Form Settings instance
|
233 |
*/
|
234 |
$card_description = apply_filters(
|
@@ -245,6 +245,11 @@ class Forminator_Addon_Trello_Form_Hooks extends Forminator_Addon_Form_Hooks_Abs
|
|
245 |
$args['desc'] = $card_description;
|
246 |
}
|
247 |
|
|
|
|
|
|
|
|
|
|
|
248 |
if ( isset( $connection_settings['position'] ) ) {
|
249 |
$args['pos'] = $connection_settings['position'];
|
250 |
}
|
@@ -269,12 +274,12 @@ class Forminator_Addon_Trello_Form_Hooks extends Forminator_Addon_Form_Hooks_Abs
|
|
269 |
*
|
270 |
* @since 1.2
|
271 |
*
|
272 |
-
* @param array
|
273 |
-
* @param int
|
274 |
-
* @param string
|
275 |
-
* @param array
|
276 |
-
* @param array
|
277 |
-
* @param array
|
278 |
* @param Forminator_Addon_Trello_Form_Settings $form_settings_instance Trello Addon Form Settings instance
|
279 |
*/
|
280 |
$args = apply_filters(
|
@@ -384,7 +389,7 @@ class Forminator_Addon_Trello_Form_Hooks extends Forminator_Addon_Form_Hooks_Abs
|
|
384 |
* @since 1.2
|
385 |
*
|
386 |
* @param string $markdown
|
387 |
-
* @param array
|
388 |
*/
|
389 |
$markdown = apply_filters(
|
390 |
'forminator_addon_trello_all_fields_markdown',
|
@@ -415,7 +420,7 @@ class Forminator_Addon_Trello_Form_Hooks extends Forminator_Addon_Form_Hooks_Abs
|
|
415 |
* @since 1.2
|
416 |
*
|
417 |
* @param string $markdown
|
418 |
-
* @param string $type
|
419 |
* @param string $label field label
|
420 |
* @param string $value field string
|
421 |
*/
|
@@ -452,8 +457,8 @@ class Forminator_Addon_Trello_Form_Hooks extends Forminator_Addon_Form_Hooks_Abs
|
|
452 |
*
|
453 |
* @since 1.2
|
454 |
*
|
455 |
-
* @param array
|
456 |
-
* @param int
|
457 |
* @param Forminator_Addon_Trello_Form_Settings $form_settings_instance Trello Addon Form Settings instance
|
458 |
*/
|
459 |
$addon_meta_data = apply_filters(
|
@@ -592,8 +597,8 @@ class Forminator_Addon_Trello_Form_Hooks extends Forminator_Addon_Form_Hooks_Abs
|
|
592 |
*
|
593 |
* @since 1.2
|
594 |
*
|
595 |
-
* @param array
|
596 |
-
* @param int
|
597 |
* @param Forminator_Addon_Trello_Form_Settings $form_settings_instance Trello Addon Form Settings instance
|
598 |
*/
|
599 |
$export_headers = apply_filters(
|
@@ -628,8 +633,8 @@ class Forminator_Addon_Trello_Form_Hooks extends Forminator_Addon_Form_Hooks_Abs
|
|
628 |
*
|
629 |
* @since 1.2
|
630 |
*
|
631 |
-
* @param array
|
632 |
-
* @param int
|
633 |
* @param Forminator_Addon_Trello_Form_Settings $form_settings_instance Trello Addon Form Settings instance
|
634 |
*/
|
635 |
$addon_meta_data = apply_filters(
|
@@ -648,10 +653,10 @@ class Forminator_Addon_Trello_Form_Hooks extends Forminator_Addon_Form_Hooks_Abs
|
|
648 |
*
|
649 |
* @since 1.2
|
650 |
*
|
651 |
-
* @param array
|
652 |
-
* @param int
|
653 |
-
* @param Forminator_Form_Entry_Model
|
654 |
-
* @param array
|
655 |
* @param Forminator_Addon_Trello_Form_Settings $form_settings_instance Trello Addon Form Settings instance
|
656 |
*/
|
657 |
$export_columns = apply_filters(
|
@@ -728,7 +733,7 @@ class Forminator_Addon_Trello_Form_Hooks extends Forminator_Addon_Form_Hooks_Abs
|
|
728 |
* @since 1.0 Trello Addon
|
729 |
*
|
730 |
* @param Forminator_Form_Entry_Model $entry_model
|
731 |
-
* @param array
|
732 |
*
|
733 |
* @return bool
|
734 |
*/
|
@@ -743,9 +748,9 @@ class Forminator_Addon_Trello_Form_Hooks extends Forminator_Addon_Form_Hooks_Abs
|
|
743 |
*
|
744 |
* @since 1.1
|
745 |
*
|
746 |
-
* @param array
|
747 |
-
* @param int
|
748 |
-
* @param Forminator_Form_Entry_Model
|
749 |
* @param Forminator_Addon_Trello_Form_Settings $form_settings_instance Trello Addon Form Settings instance
|
750 |
*/
|
751 |
$addon_meta_data = apply_filters(
|
@@ -761,9 +766,9 @@ class Forminator_Addon_Trello_Form_Hooks extends Forminator_Addon_Form_Hooks_Abs
|
|
761 |
*
|
762 |
* @since 1.1
|
763 |
*
|
764 |
-
* @param int
|
765 |
-
* @param Forminator_Form_Entry_Model
|
766 |
-
* @param array
|
767 |
* @param Forminator_Addon_Trello_Form_Settings $form_settings_instance Trello Addon Form Settings instance
|
768 |
*/
|
769 |
do_action(
|
@@ -863,11 +868,11 @@ class Forminator_Addon_Trello_Form_Hooks extends Forminator_Addon_Form_Hooks_Abs
|
|
863 |
*
|
864 |
* @since 1.2
|
865 |
*
|
866 |
-
* @param array
|
867 |
-
* @param string
|
868 |
-
* @param string
|
869 |
-
* @param array
|
870 |
-
* @param int
|
871 |
* @param Forminator_Addon_Trello_Form_Settings $form_settings_instance Trello Addon Form Settings instance
|
872 |
*/
|
873 |
$args = apply_filters(
|
@@ -896,11 +901,11 @@ class Forminator_Addon_Trello_Form_Hooks extends Forminator_Addon_Form_Hooks_Abs
|
|
896 |
*
|
897 |
* @since 1.2
|
898 |
*
|
899 |
-
* @param array
|
900 |
-
* @param string
|
901 |
-
* @param string
|
902 |
-
* @param array
|
903 |
-
* @param int
|
904 |
* @param Forminator_Addon_Trello_Form_Settings $form_settings_instance Trello Addon Form Settings instance
|
905 |
*
|
906 |
*/
|
62 |
*
|
63 |
* @since 1.2
|
64 |
*
|
65 |
+
* @param array $submitted_data
|
66 |
+
* @param array $form_entry_fields
|
67 |
+
* @param int $form_id current Form ID
|
68 |
* @param Forminator_Addon_Trello_Form_Settings $form_settings_instance Trello Addon Form Settings instance
|
69 |
*/
|
70 |
$submitted_data = apply_filters(
|
80 |
*
|
81 |
* @since 1.2
|
82 |
*
|
83 |
+
* @param array $form_entry_fields
|
84 |
+
* @param array $submitted_data
|
85 |
+
* @param int $form_id current Form ID
|
86 |
* @param Forminator_Addon_Trello_Form_Settings $form_settings_instance Trello Addon Form Settings instance
|
87 |
*/
|
88 |
$form_entry_fields = apply_filters(
|
104 |
*
|
105 |
* @since 1.2
|
106 |
*
|
107 |
+
* @param int $form_id current Form ID
|
108 |
+
* @param array $submitted_data
|
109 |
* @param Forminator_Addon_Trello_Form_Settings $form_settings_instance Trello Addon Form Settings instance
|
110 |
*/
|
111 |
do_action( 'forminator_addon_trello_before_create_card', $form_id, $submitted_data, $form_settings_instance );
|
127 |
*
|
128 |
* @since 1.2
|
129 |
*
|
130 |
+
* @param array $entry_fields
|
131 |
+
* @param int $form_id current Form ID
|
132 |
+
* @param array $submitted_data
|
133 |
+
* @param array $form_entry_fields
|
134 |
* @param Forminator_Addon_Trello_Form_Settings $form_settings_instance Trello Addon Form Settings instance
|
135 |
*/
|
136 |
$data = apply_filters(
|
152 |
* @since 1.0 Trello Addon
|
153 |
*
|
154 |
* @param string $connection_id
|
155 |
+
* @param array $submitted_data
|
156 |
+
* @param array $connection_settings
|
157 |
+
* @param array $form_entry_fields
|
158 |
*
|
159 |
* @return array `is_sent` true means its success send data to Trello, false otherwise
|
160 |
*/
|
187 |
*
|
188 |
* @since 1.2
|
189 |
*
|
190 |
+
* @param string $card_name
|
191 |
+
* @param int $form_id Current Form id
|
192 |
+
* @param string $connection_id ID of current connection
|
193 |
+
* @param array $submitted_data
|
194 |
+
* @param array $connection_settings current connection setting, contains options of like `name`, `list_id` etc
|
195 |
+
* @param array $form_entry_fields default entry fields of form
|
196 |
+
* @param array $form_settings Displayed Form settings
|
197 |
* @param Forminator_Addon_Trello_Form_Settings $form_settings_instance Trello Addon Form Settings instance
|
198 |
*/
|
199 |
$card_name = apply_filters(
|
222 |
*
|
223 |
* @since 1.2
|
224 |
*
|
225 |
+
* @param string $card_description
|
226 |
+
* @param int $form_id Current Form id
|
227 |
+
* @param string $connection_id ID of current connection
|
228 |
+
* @param array $submitted_data
|
229 |
+
* @param array $connection_settings current connection setting, contains options of like `name`, `list_id` etc
|
230 |
+
* @param array $form_entry_fields default entry fields of form
|
231 |
+
* @param array $form_settings Displayed Form settings
|
232 |
* @param Forminator_Addon_Trello_Form_Settings $form_settings_instance Trello Addon Form Settings instance
|
233 |
*/
|
234 |
$card_description = apply_filters(
|
245 |
$args['desc'] = $card_description;
|
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 );
|
250 |
+
$args['due'] = $due_date;
|
251 |
+
}
|
252 |
+
|
253 |
if ( isset( $connection_settings['position'] ) ) {
|
254 |
$args['pos'] = $connection_settings['position'];
|
255 |
}
|
274 |
*
|
275 |
* @since 1.2
|
276 |
*
|
277 |
+
* @param array $args
|
278 |
+
* @param int $form_id Current Form id
|
279 |
+
* @param string $connection_id ID of current connection
|
280 |
+
* @param array $submitted_data
|
281 |
+
* @param array $connection_settings current connection setting, contains options of like `name`, `list_id` etc
|
282 |
+
* @param array $form_settings Displayed Form settings
|
283 |
* @param Forminator_Addon_Trello_Form_Settings $form_settings_instance Trello Addon Form Settings instance
|
284 |
*/
|
285 |
$args = apply_filters(
|
389 |
* @since 1.2
|
390 |
*
|
391 |
* @param string $markdown
|
392 |
+
* @param array $form_fields all fields on form
|
393 |
*/
|
394 |
$markdown = apply_filters(
|
395 |
'forminator_addon_trello_all_fields_markdown',
|
420 |
* @since 1.2
|
421 |
*
|
422 |
* @param string $markdown
|
423 |
+
* @param string $type field type
|
424 |
* @param string $label field label
|
425 |
* @param string $value field string
|
426 |
*/
|
457 |
*
|
458 |
* @since 1.2
|
459 |
*
|
460 |
+
* @param array $addon_meta_data
|
461 |
+
* @param int $form_id current Form ID
|
462 |
* @param Forminator_Addon_Trello_Form_Settings $form_settings_instance Trello Addon Form Settings instance
|
463 |
*/
|
464 |
$addon_meta_data = apply_filters(
|
597 |
*
|
598 |
* @since 1.2
|
599 |
*
|
600 |
+
* @param array $export_headers headers to be displayed on export file
|
601 |
+
* @param int $form_id current Form ID
|
602 |
* @param Forminator_Addon_Trello_Form_Settings $form_settings_instance Trello Addon Form Settings instance
|
603 |
*/
|
604 |
$export_headers = apply_filters(
|
633 |
*
|
634 |
* @since 1.2
|
635 |
*
|
636 |
+
* @param array $addon_meta_data
|
637 |
+
* @param int $form_id current Form ID
|
638 |
* @param Forminator_Addon_Trello_Form_Settings $form_settings_instance Trello Addon Form Settings instance
|
639 |
*/
|
640 |
$addon_meta_data = apply_filters(
|
653 |
*
|
654 |
* @since 1.2
|
655 |
*
|
656 |
+
* @param array $export_columns column to be exported
|
657 |
+
* @param int $form_id current Form ID
|
658 |
+
* @param Forminator_Form_Entry_Model $entry_model Form Entry Model
|
659 |
+
* @param array $addon_meta_data meta data saved by addon on entry fields
|
660 |
* @param Forminator_Addon_Trello_Form_Settings $form_settings_instance Trello Addon Form Settings instance
|
661 |
*/
|
662 |
$export_columns = apply_filters(
|
733 |
* @since 1.0 Trello Addon
|
734 |
*
|
735 |
* @param Forminator_Form_Entry_Model $entry_model
|
736 |
+
* @param array $addon_meta_data
|
737 |
*
|
738 |
* @return bool
|
739 |
*/
|
748 |
*
|
749 |
* @since 1.1
|
750 |
*
|
751 |
+
* @param array $addon_meta_data
|
752 |
+
* @param int $form_id current Form ID
|
753 |
+
* @param Forminator_Form_Entry_Model $entry_model Forminator Entry Model
|
754 |
* @param Forminator_Addon_Trello_Form_Settings $form_settings_instance Trello Addon Form Settings instance
|
755 |
*/
|
756 |
$addon_meta_data = apply_filters(
|
766 |
*
|
767 |
* @since 1.1
|
768 |
*
|
769 |
+
* @param int $form_id current Form ID
|
770 |
+
* @param Forminator_Form_Entry_Model $entry_model Forminator Entry Model
|
771 |
+
* @param array $addon_meta_data addon meta data
|
772 |
* @param Forminator_Addon_Trello_Form_Settings $form_settings_instance Trello Addon Form Settings instance
|
773 |
*/
|
774 |
do_action(
|
868 |
*
|
869 |
* @since 1.2
|
870 |
*
|
871 |
+
* @param array $args
|
872 |
+
* @param string $card_id
|
873 |
+
* @param string $card_delete_mode
|
874 |
+
* @param array $addon_meta_datum
|
875 |
+
* @param int $form_id
|
876 |
* @param Forminator_Addon_Trello_Form_Settings $form_settings_instance Trello Addon Form Settings instance
|
877 |
*/
|
878 |
$args = apply_filters(
|
901 |
*
|
902 |
* @since 1.2
|
903 |
*
|
904 |
+
* @param array $args args sent to Trello API
|
905 |
+
* @param string $card_id
|
906 |
+
* @param string $card_delete_mode
|
907 |
+
* @param array $addon_meta_datum
|
908 |
+
* @param int $form_id
|
909 |
* @param Forminator_Addon_Trello_Form_Settings $form_settings_instance Trello Addon Form Settings instance
|
910 |
*
|
911 |
*/
|
addons/pro/trello/class-forminator-addon-trello-form-settings.php
CHANGED
@@ -124,8 +124,8 @@ class Forminator_Addon_Trello_Form_Settings extends Forminator_Addon_Form_Settin
|
|
124 |
}
|
125 |
|
126 |
$buttons['next']['markup'] = '<div class="sui-actions-right">' .
|
127 |
-
|
128 |
-
|
129 |
|
130 |
return array(
|
131 |
'html' => Forminator_Addon_Abstract::get_template( $template, $template_params ),
|
@@ -257,8 +257,8 @@ class Forminator_Addon_Trello_Form_Settings extends Forminator_Addon_Form_Settin
|
|
257 |
}
|
258 |
|
259 |
$buttons['next']['markup'] = '<div class="sui-actions-right">' .
|
260 |
-
|
261 |
-
|
262 |
|
263 |
return array(
|
264 |
'html' => Forminator_Addon_Abstract::get_template( $template, $template_params ),
|
@@ -397,8 +397,8 @@ class Forminator_Addon_Trello_Form_Settings extends Forminator_Addon_Form_Settin
|
|
397 |
}
|
398 |
|
399 |
$buttons['next']['markup'] = '<div class="sui-actions-right">' .
|
400 |
-
|
401 |
-
|
402 |
|
403 |
return array(
|
404 |
'html' => Forminator_Addon_Abstract::get_template( $template, $template_params ),
|
@@ -469,6 +469,7 @@ class Forminator_Addon_Trello_Form_Settings extends Forminator_Addon_Form_Settin
|
|
469 |
'card_name_error' => '',
|
470 |
'card_description' => $this->get_multi_id_form_settings_value( $multi_id, 'card_description', '{all_fields}' ),
|
471 |
'card_description_error' => '',
|
|
|
472 |
'position' => $this->get_multi_id_form_settings_value( $multi_id, 'position', 'bottom' ),
|
473 |
'position_error' => '',
|
474 |
'positions' => $positions,
|
@@ -550,6 +551,9 @@ class Forminator_Addon_Trello_Form_Settings extends Forminator_Addon_Form_Settin
|
|
550 |
$member_ids = isset( $submitted_data['member_ids'] ) ? $submitted_data['member_ids'] : array();
|
551 |
$template_params['member_ids'] = $member_ids;
|
552 |
|
|
|
|
|
|
|
553 |
try {
|
554 |
$input_exceptions = new Forminator_Addon_Trello_Form_Settings_Exception();
|
555 |
|
@@ -607,6 +611,7 @@ class Forminator_Addon_Trello_Form_Settings extends Forminator_Addon_Form_Settin
|
|
607 |
'position' => $position,
|
608 |
'label_ids' => $label_ids,
|
609 |
'member_ids' => $member_ids,
|
|
|
610 |
)
|
611 |
);
|
612 |
|
@@ -635,8 +640,8 @@ class Forminator_Addon_Trello_Form_Settings extends Forminator_Addon_Form_Settin
|
|
635 |
}
|
636 |
|
637 |
$buttons['next']['markup'] = '<div class="sui-actions-right">' .
|
638 |
-
|
639 |
-
|
640 |
|
641 |
return array(
|
642 |
'html' => Forminator_Addon_Abstract::get_template( $template, $template_params ),
|
124 |
}
|
125 |
|
126 |
$buttons['next']['markup'] = '<div class="sui-actions-right">' .
|
127 |
+
Forminator_Addon_Abstract::get_button_markup( esc_html__( 'Next', Forminator::DOMAIN ), 'forminator-addon-next' ) .
|
128 |
+
'</div>';
|
129 |
|
130 |
return array(
|
131 |
'html' => Forminator_Addon_Abstract::get_template( $template, $template_params ),
|
257 |
}
|
258 |
|
259 |
$buttons['next']['markup'] = '<div class="sui-actions-right">' .
|
260 |
+
Forminator_Addon_Abstract::get_button_markup( esc_html__( 'Next', Forminator::DOMAIN ), 'forminator-addon-next' ) .
|
261 |
+
'</div>';
|
262 |
|
263 |
return array(
|
264 |
'html' => Forminator_Addon_Abstract::get_template( $template, $template_params ),
|
397 |
}
|
398 |
|
399 |
$buttons['next']['markup'] = '<div class="sui-actions-right">' .
|
400 |
+
Forminator_Addon_Abstract::get_button_markup( esc_html__( 'Next', Forminator::DOMAIN ), 'forminator-addon-next' ) .
|
401 |
+
'</div>';
|
402 |
|
403 |
return array(
|
404 |
'html' => Forminator_Addon_Abstract::get_template( $template, $template_params ),
|
469 |
'card_name_error' => '',
|
470 |
'card_description' => $this->get_multi_id_form_settings_value( $multi_id, 'card_description', '{all_fields}' ),
|
471 |
'card_description_error' => '',
|
472 |
+
'due_date' => $this->get_multi_id_form_settings_value( $multi_id, 'due_date', '' ),
|
473 |
'position' => $this->get_multi_id_form_settings_value( $multi_id, 'position', 'bottom' ),
|
474 |
'position_error' => '',
|
475 |
'positions' => $positions,
|
551 |
$member_ids = isset( $submitted_data['member_ids'] ) ? $submitted_data['member_ids'] : array();
|
552 |
$template_params['member_ids'] = $member_ids;
|
553 |
|
554 |
+
$due_date = isset( $submitted_data['due_date'] ) ? $submitted_data['due_date'] : '';
|
555 |
+
$template_params['due_date'] = $due_date;
|
556 |
+
|
557 |
try {
|
558 |
$input_exceptions = new Forminator_Addon_Trello_Form_Settings_Exception();
|
559 |
|
611 |
'position' => $position,
|
612 |
'label_ids' => $label_ids,
|
613 |
'member_ids' => $member_ids,
|
614 |
+
'due_date' => $due_date,
|
615 |
)
|
616 |
);
|
617 |
|
640 |
}
|
641 |
|
642 |
$buttons['next']['markup'] = '<div class="sui-actions-right">' .
|
643 |
+
Forminator_Addon_Abstract::get_button_markup( esc_html__( 'Save', Forminator::DOMAIN ), 'sui-button-primary forminator-addon-finish' ) .
|
644 |
+
'</div>';
|
645 |
|
646 |
return array(
|
647 |
'html' => Forminator_Addon_Abstract::get_template( $template, $template_params ),
|
addons/pro/trello/class-forminator-addon-trello-poll-hooks.php
CHANGED
@@ -250,6 +250,11 @@ class Forminator_Addon_Trello_Poll_Hooks extends Forminator_Addon_Poll_Hooks_Abs
|
|
250 |
$args['desc'] = $card_description;
|
251 |
}
|
252 |
|
|
|
|
|
|
|
|
|
|
|
253 |
if ( isset( $connection_settings['position'] ) ) {
|
254 |
$args['pos'] = $connection_settings['position'];
|
255 |
}
|
250 |
$args['desc'] = $card_description;
|
251 |
}
|
252 |
|
253 |
+
if ( isset( $connection_settings['due_date'] ) && ! empty( $connection_settings['due_date'] ) ) {
|
254 |
+
$due_date = $connection_settings['due_date'];
|
255 |
+
$args['due'] = $due_date;
|
256 |
+
}
|
257 |
+
|
258 |
if ( isset( $connection_settings['position'] ) ) {
|
259 |
$args['pos'] = $connection_settings['position'];
|
260 |
}
|
addons/pro/trello/class-forminator-addon-trello-poll-settings.php
CHANGED
@@ -469,6 +469,7 @@ class Forminator_Addon_Trello_Poll_Settings extends Forminator_Addon_Poll_Settin
|
|
469 |
'card_name_error' => '',
|
470 |
'card_description' => $this->get_multi_id_poll_settings_value( $multi_id, 'card_description', "{poll_answer}\n{poll_result}" ),
|
471 |
'card_description_error' => '',
|
|
|
472 |
'position' => $this->get_multi_id_poll_settings_value( $multi_id, 'position', 'bottom' ),
|
473 |
'position_error' => '',
|
474 |
'positions' => $positions,
|
@@ -557,6 +558,9 @@ class Forminator_Addon_Trello_Poll_Settings extends Forminator_Addon_Poll_Settin
|
|
557 |
$member_ids = isset( $submitted_data['member_ids'] ) ? $submitted_data['member_ids'] : array();
|
558 |
$template_params['member_ids'] = $member_ids;
|
559 |
|
|
|
|
|
|
|
560 |
try {
|
561 |
$input_exceptions = new Forminator_Addon_Trello_Poll_Settings_Exception();
|
562 |
|
@@ -614,6 +618,7 @@ class Forminator_Addon_Trello_Poll_Settings extends Forminator_Addon_Poll_Settin
|
|
614 |
'position' => $position,
|
615 |
'label_ids' => $label_ids,
|
616 |
'member_ids' => $member_ids,
|
|
|
617 |
)
|
618 |
);
|
619 |
|
469 |
'card_name_error' => '',
|
470 |
'card_description' => $this->get_multi_id_poll_settings_value( $multi_id, 'card_description', "{poll_answer}\n{poll_result}" ),
|
471 |
'card_description_error' => '',
|
472 |
+
'due_date' => $this->get_multi_id_poll_settings_value( $multi_id, 'due_date', '' ),
|
473 |
'position' => $this->get_multi_id_poll_settings_value( $multi_id, 'position', 'bottom' ),
|
474 |
'position_error' => '',
|
475 |
'positions' => $positions,
|
558 |
$member_ids = isset( $submitted_data['member_ids'] ) ? $submitted_data['member_ids'] : array();
|
559 |
$template_params['member_ids'] = $member_ids;
|
560 |
|
561 |
+
$due_date = isset( $submitted_data['due_date'] ) ? $submitted_data['due_date'] : '';
|
562 |
+
$template_params['due_date'] = $due_date;
|
563 |
+
|
564 |
try {
|
565 |
$input_exceptions = new Forminator_Addon_Trello_Poll_Settings_Exception();
|
566 |
|
618 |
'position' => $position,
|
619 |
'label_ids' => $label_ids,
|
620 |
'member_ids' => $member_ids,
|
621 |
+
'due_date' => $due_date,
|
622 |
)
|
623 |
);
|
624 |
|
addons/pro/trello/class-forminator-addon-trello-quiz-hooks.php
CHANGED
@@ -167,13 +167,18 @@ class Forminator_Addon_Trello_Quiz_Hooks extends Forminator_Addon_Quiz_Hooks_Abs
|
|
167 |
try {
|
168 |
$api = $this->addon->get_api();
|
169 |
$args = array();
|
|
|
170 |
|
171 |
$quiz_settings = $this->quiz_settings_instance->get_quiz_settings();
|
|
|
172 |
|
173 |
if ( isset( $connection_settings['list_id'] ) ) {
|
174 |
$args['idList'] = $connection_settings['list_id'];
|
175 |
}
|
176 |
|
|
|
|
|
|
|
177 |
if ( isset( $connection_settings['card_name'] ) ) {
|
178 |
$card_name = $connection_settings['card_name'];
|
179 |
// disable all_fields here
|
@@ -181,6 +186,10 @@ class Forminator_Addon_Trello_Quiz_Hooks extends Forminator_Addon_Quiz_Hooks_Abs
|
|
181 |
// {quizname_replace} //phpcs:ignore
|
182 |
$card_name = str_ireplace( '{quiz_name}', forminator_get_name_from_model( $this->quiz ), $card_name );
|
183 |
|
|
|
|
|
|
|
|
|
184 |
/**
|
185 |
* Filter Card Name to passed on to Create Trello Card API
|
186 |
*
|
@@ -217,6 +226,9 @@ class Forminator_Addon_Trello_Quiz_Hooks extends Forminator_Addon_Quiz_Hooks_Abs
|
|
217 |
$card_description = str_ireplace( '{quiz_answer}', $quiz_answers_to_markdown, $card_description );
|
218 |
$card_description = str_ireplace( '{quiz_result}', $quiz_result_to_markdown, $card_description );
|
219 |
$card_description = forminator_replace_variables( $card_description );
|
|
|
|
|
|
|
220 |
|
221 |
/**
|
222 |
* Filter Card Description to passed on to Create Trello Card API
|
@@ -245,7 +257,10 @@ class Forminator_Addon_Trello_Quiz_Hooks extends Forminator_Addon_Quiz_Hooks_Abs
|
|
245 |
);
|
246 |
$args['desc'] = $card_description;
|
247 |
}
|
248 |
-
|
|
|
|
|
|
|
249 |
if ( isset( $connection_settings['position'] ) ) {
|
250 |
$args['pos'] = $connection_settings['position'];
|
251 |
}
|
@@ -339,14 +354,14 @@ class Forminator_Addon_Trello_Quiz_Hooks extends Forminator_Addon_Quiz_Hooks_Abs
|
|
339 |
$markdown .= '###' . $question . "\n";
|
340 |
$markdown .= $answer . "\n";
|
341 |
$markdown .= __( 'Correct : ', Forminator::DOMAIN )
|
342 |
-
|
343 |
-
|
344 |
}
|
345 |
} elseif ( 'nowrong' === $this->quiz->quiz_type ) {
|
346 |
if ( isset( $quiz_entry['value'][0] )
|
347 |
-
|
348 |
-
|
349 |
-
|
350 |
|
351 |
$quiz_entry = $quiz_entry['value'][0]['value'];
|
352 |
|
@@ -411,24 +426,24 @@ class Forminator_Addon_Trello_Quiz_Hooks extends Forminator_Addon_Quiz_Hooks_Abs
|
|
411 |
|
412 |
$markdown .= '##' . __( 'Quiz Result', Forminator::DOMAIN ) . "\n";
|
413 |
$markdown .= __( 'Correct Answers : ', Forminator::DOMAIN )
|
414 |
-
|
415 |
-
|
416 |
$markdown .= __( 'Total Answers : ', Forminator::DOMAIN )
|
417 |
-
|
418 |
-
|
419 |
|
420 |
} elseif ( 'nowrong' === $this->quiz->quiz_type ) {
|
421 |
if ( isset( $quiz_entry['value'][0] )
|
422 |
-
|
423 |
-
|
424 |
-
|
425 |
|
426 |
$quiz_entry = $quiz_entry['value'][0]['value'];
|
427 |
$nowrong_result = ( isset( $quiz_entry['result'] ) && isset( $quiz_entry['result']['title'] ) ) ? $quiz_entry['result']['title'] : '';
|
428 |
|
429 |
$markdown .= '##' . __( 'Quiz Result', Forminator::DOMAIN ) . "\n";
|
430 |
$markdown .= '**' . $nowrong_result . '**'
|
431 |
-
|
432 |
|
433 |
}
|
434 |
}
|
167 |
try {
|
168 |
$api = $this->addon->get_api();
|
169 |
$args = array();
|
170 |
+
$entries = null;
|
171 |
|
172 |
$quiz_settings = $this->quiz_settings_instance->get_quiz_settings();
|
173 |
+
$addons_fields = $this->quiz_settings_instance->get_form_fields();
|
174 |
|
175 |
if ( isset( $connection_settings['list_id'] ) ) {
|
176 |
$args['idList'] = $connection_settings['list_id'];
|
177 |
}
|
178 |
|
179 |
+
$form_entry_fields = forminator_lead_form_data( $submitted_data );
|
180 |
+
$lead_submitted_data = forminator_addons_lead_submitted_data( $addons_fields, $form_entry_fields );
|
181 |
+
|
182 |
if ( isset( $connection_settings['card_name'] ) ) {
|
183 |
$card_name = $connection_settings['card_name'];
|
184 |
// disable all_fields here
|
186 |
// {quizname_replace} //phpcs:ignore
|
187 |
$card_name = str_ireplace( '{quiz_name}', forminator_get_name_from_model( $this->quiz ), $card_name );
|
188 |
|
189 |
+
if ( isset( $quiz_settings['hasLeads'] ) && $quiz_settings['hasLeads'] ) {
|
190 |
+
$card_name = forminator_addon_replace_custom_vars( $card_name, $lead_submitted_data, $this->lead_model, $form_entry_fields );
|
191 |
+
}
|
192 |
+
|
193 |
/**
|
194 |
* Filter Card Name to passed on to Create Trello Card API
|
195 |
*
|
226 |
$card_description = str_ireplace( '{quiz_answer}', $quiz_answers_to_markdown, $card_description );
|
227 |
$card_description = str_ireplace( '{quiz_result}', $quiz_result_to_markdown, $card_description );
|
228 |
$card_description = forminator_replace_variables( $card_description );
|
229 |
+
if ( isset( $quiz_settings['hasLeads'] ) && $quiz_settings['hasLeads'] ) {
|
230 |
+
$card_description = forminator_addon_replace_custom_vars( $card_description, $lead_submitted_data, $this->lead_model, $form_entry_fields );
|
231 |
+
}
|
232 |
|
233 |
/**
|
234 |
* Filter Card Description to passed on to Create Trello Card API
|
257 |
);
|
258 |
$args['desc'] = $card_description;
|
259 |
}
|
260 |
+
if ( isset( $connection_settings['due_date'] ) && ! empty( $connection_settings['due_date'] ) ) {
|
261 |
+
$due_date = forminator_addon_replace_custom_vars( $connection_settings['due_date'], $lead_submitted_data, $this->lead_model, $form_entry_fields, false );
|
262 |
+
$args['due'] = $due_date;
|
263 |
+
}
|
264 |
if ( isset( $connection_settings['position'] ) ) {
|
265 |
$args['pos'] = $connection_settings['position'];
|
266 |
}
|
354 |
$markdown .= '###' . $question . "\n";
|
355 |
$markdown .= $answer . "\n";
|
356 |
$markdown .= __( 'Correct : ', Forminator::DOMAIN )
|
357 |
+
. '**' . ( $is_correct ? __( 'Yes', Forminator::DOMAIN ) : __( 'No', Forminator::DOMAIN ) ) . '**'
|
358 |
+
. "\n";
|
359 |
}
|
360 |
} elseif ( 'nowrong' === $this->quiz->quiz_type ) {
|
361 |
if ( isset( $quiz_entry['value'][0] )
|
362 |
+
&& is_array( $quiz_entry['value'][0] )
|
363 |
+
&& isset( $quiz_entry['value'][0]['value'] )
|
364 |
+
&& is_array( $quiz_entry['value'][0]['value'] ) ) {
|
365 |
|
366 |
$quiz_entry = $quiz_entry['value'][0]['value'];
|
367 |
|
426 |
|
427 |
$markdown .= '##' . __( 'Quiz Result', Forminator::DOMAIN ) . "\n";
|
428 |
$markdown .= __( 'Correct Answers : ', Forminator::DOMAIN )
|
429 |
+
. '**' . $total_correct . '**'
|
430 |
+
. "\n";
|
431 |
$markdown .= __( 'Total Answers : ', Forminator::DOMAIN )
|
432 |
+
. '**' . $total_answers . '**'
|
433 |
+
. "\n";
|
434 |
|
435 |
} elseif ( 'nowrong' === $this->quiz->quiz_type ) {
|
436 |
if ( isset( $quiz_entry['value'][0] )
|
437 |
+
&& is_array( $quiz_entry['value'][0] )
|
438 |
+
&& isset( $quiz_entry['value'][0]['value'] )
|
439 |
+
&& is_array( $quiz_entry['value'][0]['value'] ) ) {
|
440 |
|
441 |
$quiz_entry = $quiz_entry['value'][0]['value'];
|
442 |
$nowrong_result = ( isset( $quiz_entry['result'] ) && isset( $quiz_entry['result']['title'] ) ) ? $quiz_entry['result']['title'] : '';
|
443 |
|
444 |
$markdown .= '##' . __( 'Quiz Result', Forminator::DOMAIN ) . "\n";
|
445 |
$markdown .= '**' . $nowrong_result . '**'
|
446 |
+
. "\n";
|
447 |
|
448 |
}
|
449 |
}
|
addons/pro/trello/class-forminator-addon-trello-quiz-settings.php
CHANGED
@@ -469,6 +469,7 @@ class Forminator_Addon_Trello_Quiz_Settings extends Forminator_Addon_Quiz_Settin
|
|
469 |
'card_name_error' => '',
|
470 |
'card_description' => $this->get_multi_id_quiz_settings_value( $multi_id, 'card_description', "{quiz_answer}\n{quiz_result}" ),
|
471 |
'card_description_error' => '',
|
|
|
472 |
'position' => $this->get_multi_id_quiz_settings_value( $multi_id, 'position', 'bottom' ),
|
473 |
'position_error' => '',
|
474 |
'positions' => $positions,
|
@@ -481,6 +482,7 @@ class Forminator_Addon_Trello_Quiz_Settings extends Forminator_Addon_Quiz_Settin
|
|
481 |
'error_message' => '',
|
482 |
'multi_id' => $multi_id,
|
483 |
'list_name' => $this->get_multi_id_quiz_settings_value( $multi_id, 'list_name', '' ),
|
|
|
484 |
);
|
485 |
|
486 |
$var_list = array();
|
@@ -491,6 +493,10 @@ class Forminator_Addon_Trello_Quiz_Settings extends Forminator_Addon_Quiz_Settin
|
|
491 |
$template_params['name_fields'] = $var_list;
|
492 |
$template_params['desc_fields'] = array_merge( forminator_get_quiz_vars(), $var_list );
|
493 |
|
|
|
|
|
|
|
|
|
494 |
$is_submit = ! empty( $submitted_data );
|
495 |
$has_errors = false;
|
496 |
$is_close = false;
|
@@ -557,6 +563,9 @@ class Forminator_Addon_Trello_Quiz_Settings extends Forminator_Addon_Quiz_Settin
|
|
557 |
$member_ids = isset( $submitted_data['member_ids'] ) ? $submitted_data['member_ids'] : array();
|
558 |
$template_params['member_ids'] = $member_ids;
|
559 |
|
|
|
|
|
|
|
560 |
try {
|
561 |
$input_exceptions = new Forminator_Addon_Trello_Quiz_Settings_Exception();
|
562 |
|
@@ -614,6 +623,7 @@ class Forminator_Addon_Trello_Quiz_Settings extends Forminator_Addon_Quiz_Settin
|
|
614 |
'position' => $position,
|
615 |
'label_ids' => $label_ids,
|
616 |
'member_ids' => $member_ids,
|
|
|
617 |
)
|
618 |
);
|
619 |
|
469 |
'card_name_error' => '',
|
470 |
'card_description' => $this->get_multi_id_quiz_settings_value( $multi_id, 'card_description', "{quiz_answer}\n{quiz_result}" ),
|
471 |
'card_description_error' => '',
|
472 |
+
'due_date' => $this->get_multi_id_quiz_settings_value( $multi_id, 'due_date', '' ),
|
473 |
'position' => $this->get_multi_id_quiz_settings_value( $multi_id, 'position', 'bottom' ),
|
474 |
'position_error' => '',
|
475 |
'positions' => $positions,
|
482 |
'error_message' => '',
|
483 |
'multi_id' => $multi_id,
|
484 |
'list_name' => $this->get_multi_id_quiz_settings_value( $multi_id, 'list_name', '' ),
|
485 |
+
'lead_fields' => array(),
|
486 |
);
|
487 |
|
488 |
$var_list = array();
|
493 |
$template_params['name_fields'] = $var_list;
|
494 |
$template_params['desc_fields'] = array_merge( forminator_get_quiz_vars(), $var_list );
|
495 |
|
496 |
+
if ( isset( $this->quiz_settings['hasLeads'] ) && $this->quiz_settings['hasLeads'] ) {
|
497 |
+
$template_params['lead_fields'] = $this->form_fields;
|
498 |
+
}
|
499 |
+
|
500 |
$is_submit = ! empty( $submitted_data );
|
501 |
$has_errors = false;
|
502 |
$is_close = false;
|
563 |
$member_ids = isset( $submitted_data['member_ids'] ) ? $submitted_data['member_ids'] : array();
|
564 |
$template_params['member_ids'] = $member_ids;
|
565 |
|
566 |
+
$due_date = isset( $submitted_data['due_date'] ) ? $submitted_data['due_date'] : '';
|
567 |
+
$template_params['due_date'] = $due_date;
|
568 |
+
|
569 |
try {
|
570 |
$input_exceptions = new Forminator_Addon_Trello_Quiz_Settings_Exception();
|
571 |
|
623 |
'position' => $position,
|
624 |
'label_ids' => $label_ids,
|
625 |
'member_ids' => $member_ids,
|
626 |
+
'due_date' => $due_date,
|
627 |
)
|
628 |
);
|
629 |
|
addons/pro/trello/views/form-settings/setup-card.php
CHANGED
@@ -22,177 +22,226 @@ $vars = array(
|
|
22 |
foreach ( $template_vars as $key => $val ) {
|
23 |
$vars[ $key ] = $val;
|
24 |
}
|
|
|
25 |
?>
|
26 |
|
27 |
<div class="integration-header">
|
28 |
|
29 |
-
|
30 |
|
31 |
-
|
32 |
|
33 |
<?php if ( ! empty( $vars['error_message'] ) ) : ?>
|
34 |
-
|
35 |
<?php endif; ?>
|
36 |
|
37 |
</div>
|
38 |
|
39 |
<form>
|
40 |
|
41 |
-
|
42 |
|
43 |
-
|
44 |
|
45 |
-
|
46 |
|
47 |
-
|
48 |
|
49 |
-
|
50 |
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
|
61 |
-
|
62 |
|
63 |
<?php if ( ! empty( $vars['card_name_error'] ) ) : ?>
|
64 |
-
|
65 |
<?php endif; ?>
|
66 |
|
67 |
-
|
68 |
|
69 |
-
|
70 |
|
71 |
-
|
72 |
|
73 |
-
|
74 |
|
75 |
-
|
76 |
|
77 |
-
|
78 |
|
79 |
-
|
80 |
|
81 |
-
|
82 |
|
83 |
-
|
84 |
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
|
89 |
-
|
90 |
|
91 |
<?php if ( ! empty( $vars['card_description_error'] ) ) : ?>
|
92 |
-
|
93 |
<?php endif; ?>
|
94 |
|
95 |
-
|
96 |
<?php esc_html_e( 'Markdown supported for card description. Find complete guide', Forminator::DOMAIN ); ?>
|
97 |
<a href="https://help.trello.com/article/821-using-markdown-in-trello" target="_blank"><?php esc_html_e( 'here', Forminator::DOMAIN ); ?></a>.
|
98 |
</span>
|
99 |
|
100 |
-
|
101 |
-
|
102 |
-
|
103 |
-
|
104 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
105 |
|
106 |
-
|
107 |
-
|
108 |
-
|
109 |
-
|
110 |
-
|
|
|
111 |
<?php foreach ( $vars['positions'] as $pos_id => $pos_name ) : ?>
|
112 |
-
|
113 |
<?php endforeach; ?>
|
114 |
-
|
115 |
<?php if ( ! empty( $vars['position_error'] ) ) : ?>
|
116 |
-
|
117 |
<?php endif; ?>
|
118 |
|
119 |
-
|
120 |
-
|
121 |
-
|
122 |
-
|
123 |
-
|
124 |
-
|
125 |
-
|
126 |
-
|
127 |
-
|
128 |
-
|
129 |
-
|
130 |
-
|
131 |
-
|
|
|
132 |
<?php foreach ( $vars['label_ids'] as $label_id ) : ?>
|
133 |
<?php if ( isset( $vars['labels'][ $label_id ] ) ) : ?>
|
134 |
-
|
135 |
-
|
136 |
-
|
137 |
-
|
138 |
-
|
139 |
-
|
140 |
<?php endif; ?>
|
141 |
<?php endforeach; ?>
|
142 |
|
143 |
<?php foreach ( $vars['labels'] as $label_id => $label ) : ?>
|
144 |
<?php if ( ! in_array( $label_id, $vars['label_ids'], true ) ) : ?>
|
145 |
-
|
146 |
-
|
147 |
-
|
148 |
-
|
149 |
-
|
|
|
|
|
150 |
<?php endif; ?>
|
151 |
<?php endforeach; ?>
|
152 |
-
|
153 |
<?php if ( ! empty( $vars['label_ids_error'] ) ) : ?>
|
154 |
-
|
155 |
<?php endif; ?>
|
156 |
-
|
157 |
-
|
158 |
-
|
159 |
-
|
160 |
-
|
161 |
-
|
162 |
-
|
163 |
-
|
164 |
-
|
165 |
-
|
166 |
-
|
167 |
-
|
168 |
-
|
169 |
-
|
170 |
-
|
|
|
171 |
<?php foreach ( $vars['member_ids'] as $member_id ) : ?>
|
172 |
<?php if ( isset( $vars['members'][ $member_id ] ) ) : ?>
|
173 |
-
|
174 |
-
|
175 |
-
selected="selected"
|
176 |
-
><?php echo esc_html( $vars['members'][ $member_id ] ); ?></option>
|
177 |
<?php endif; ?>
|
178 |
<?php endforeach; ?>
|
179 |
|
180 |
<?php foreach ( $vars['members'] as $member_id => $name ) : ?>
|
181 |
<?php if ( ! in_array( $member_id, $vars['member_ids'], true ) ) : ?>
|
182 |
-
|
183 |
-
value="<?php echo esc_attr( $member_id ); ?>"
|
184 |
-
><?php echo esc_html( $name ); ?></option>
|
185 |
<?php endif; ?>
|
186 |
<?php endforeach; ?>
|
187 |
-
|
188 |
<?php if ( ! empty( $vars['member_ids_error'] ) ) : ?>
|
189 |
-
|
190 |
<?php endif; ?>
|
191 |
-
|
192 |
|
193 |
|
194 |
-
|
195 |
-
|
196 |
|
197 |
-
|
198 |
</form>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
22 |
foreach ( $template_vars as $key => $val ) {
|
23 |
$vars[ $key ] = $val;
|
24 |
}
|
25 |
+
$has_date = true;
|
26 |
?>
|
27 |
|
28 |
<div class="integration-header">
|
29 |
|
30 |
+
<h3 class="sui-box-title" id="dialogTitle2"><?php echo esc_html( __( 'Customize Fields', Forminator::DOMAIN ) ); ?></h3>
|
31 |
|
32 |
+
<p><?php esc_html_e( 'Set up how you want your cards to be created in Trello.', Forminator::DOMAIN ); ?></p>
|
33 |
|
34 |
<?php if ( ! empty( $vars['error_message'] ) ) : ?>
|
35 |
+
<span class="sui-notice sui-notice-error"><p><?php echo esc_html( $vars['error_message'] ); ?></p></span>
|
36 |
<?php endif; ?>
|
37 |
|
38 |
</div>
|
39 |
|
40 |
<form>
|
41 |
|
42 |
+
<div id="trello-card-name-settings" class="sui-row">
|
43 |
|
44 |
+
<div class="sui-col-12">
|
45 |
|
46 |
+
<div class="sui-form-field <?php echo esc_attr( ! empty( $vars['card_name_error'] ) ? 'sui-form-field-error' : '' ); ?>">
|
47 |
|
48 |
+
<label class="sui-label"><?php esc_html_e( 'Card Name', Forminator::DOMAIN ); ?></label>
|
49 |
|
50 |
+
<div class="sui-insert-variables">
|
51 |
|
52 |
+
<input id="card_name"
|
53 |
+
class="sui-form-control"
|
54 |
+
name="card_name"
|
55 |
+
placeholder="<?php echo esc_attr( __( 'Card Name', Forminator::DOMAIN ) ); ?>"
|
56 |
+
value="<?php echo esc_attr( $vars['card_name'] ); ?>">
|
57 |
|
58 |
+
<select data-textarea-id="card_name"><?php foreach ( $vars['fields'] as $field ) : ?>
|
59 |
+
<option value="{<?php echo esc_attr( $field['element_id'] ); ?>}" data-content="{<?php echo esc_attr( $field['element_id'] ); ?>}"><?php echo esc_html( $field['field_label'] ); ?></option>
|
60 |
+
<?php endforeach; ?></select>
|
61 |
|
62 |
+
</div>
|
63 |
|
64 |
<?php if ( ! empty( $vars['card_name_error'] ) ) : ?>
|
65 |
+
<span class="sui-error-message"><?php echo esc_html( $vars['card_name_error'] ); ?></span>
|
66 |
<?php endif; ?>
|
67 |
|
68 |
+
</div>
|
69 |
|
70 |
+
</div>
|
71 |
|
72 |
+
</div>
|
73 |
|
74 |
+
<div id="trello-card-description-settings" class="sui-row">
|
75 |
|
76 |
+
<div class="sui-col-12">
|
77 |
|
78 |
+
<div class="sui-form-field <?php echo esc_attr( ! empty( $vars['card_description_error'] ) ? 'sui-form-field-error' : '' ); ?>">
|
79 |
|
80 |
+
<label class="sui-label" for="card_description"><?php esc_html_e( 'Card Description', Forminator::DOMAIN ); ?></label>
|
81 |
|
82 |
+
<div class="sui-insert-variables">
|
83 |
|
84 |
+
<textarea class="sui-form-control" name="card_description" id="card_description" rows="7"><?php echo esc_html( $vars['card_description'] ); ?></textarea>
|
85 |
|
86 |
+
<select data-textarea-id="card_description"><?php foreach ( $vars['fields'] as $field ) : ?>
|
87 |
+
<option value="{<?php echo esc_attr( $field['element_id'] ); ?>}" data-content="{<?php echo esc_attr( $field['element_id'] ); ?>}"><?php echo esc_html( $field['field_label'] ); ?></option>
|
88 |
+
<?php endforeach; ?></select>
|
89 |
|
90 |
+
</div>
|
91 |
|
92 |
<?php if ( ! empty( $vars['card_description_error'] ) ) : ?>
|
93 |
+
<span class="sui-error-message"><?php echo esc_html( $vars['card_description_error'] ); ?></span>
|
94 |
<?php endif; ?>
|
95 |
|
96 |
+
<span class="sui-description">
|
97 |
<?php esc_html_e( 'Markdown supported for card description. Find complete guide', Forminator::DOMAIN ); ?>
|
98 |
<a href="https://help.trello.com/article/821-using-markdown-in-trello" target="_blank"><?php esc_html_e( 'here', Forminator::DOMAIN ); ?></a>.
|
99 |
</span>
|
100 |
|
101 |
+
</div>
|
102 |
+
|
103 |
+
</div>
|
104 |
+
|
105 |
+
</div>
|
106 |
+
|
107 |
+
<div class="sui-row">
|
108 |
+
<div class="sui-col-md-6">
|
109 |
+
<div class="sui-form-field <?php echo esc_attr( ! empty( $vars['due_date_error'] ) ? 'sui-form-field-error' : '' ); ?>">
|
110 |
+
<label class="sui-label" for="due_date"><?php esc_html_e( 'Due Date', Forminator::DOMAIN ); ?></label>
|
111 |
+
<div class="sui-insert-variables">
|
112 |
+
|
113 |
+
<input id="due_date"
|
114 |
+
class="sui-form-control"
|
115 |
+
name="due_date"
|
116 |
+
placeholder="<?php echo esc_attr( __( 'Select a due date', Forminator::DOMAIN ) ); ?>"
|
117 |
+
value="<?php echo esc_attr( $vars['due_date'] ); ?>">
|
118 |
+
|
119 |
+
<select data-textarea-id="due_date">
|
120 |
+
<?php foreach ( $vars['fields'] as $field ) :
|
121 |
+
if ( isset( $field['type'] ) && 'date' === $field['type'] ) {
|
122 |
+
$has_date = false;
|
123 |
+
?>
|
124 |
+
<option value="{<?php echo esc_attr( $field['element_id'] ); ?>}"
|
125 |
+
data-content="{<?php echo esc_attr( $field['element_id'] ); ?>}"
|
126 |
+
>
|
127 |
+
<?php echo esc_html( $field['field_label'] ); ?>
|
128 |
+
</option>
|
129 |
+
<?php }
|
130 |
+
endforeach;
|
131 |
+
if ( $has_date ) { ?>
|
132 |
+
<option value=""><?php echo esc_html__( 'You don\'t have a datepicker field in your form.', Forminator::DOMAIN ); ?></option>
|
133 |
+
<?php } ?>
|
134 |
+
</select>
|
135 |
+
|
136 |
+
</div>
|
137 |
+
|
138 |
+
<?php if ( ! empty( $vars['due_date_error'] ) ) : ?>
|
139 |
+
<span class="sui-error-message"><?php echo esc_html( $vars['due_date_error'] ); ?></span>
|
140 |
+
<?php endif; ?>
|
141 |
|
142 |
+
</div>
|
143 |
+
</div>
|
144 |
+
<div class="sui-col-md-6">
|
145 |
+
<div class="sui-form-field <?php echo esc_attr( ! empty( $vars['position_error'] ) ? 'sui-form-field-error' : '' ); ?>">
|
146 |
+
<label class="sui-label" for="position"><?php esc_html_e( 'Card Position', Forminator::DOMAIN ); ?></label>
|
147 |
+
<select name="position" class="sui-select" id="position">
|
148 |
<?php foreach ( $vars['positions'] as $pos_id => $pos_name ) : ?>
|
149 |
+
<option value="<?php echo esc_attr( $pos_id ); ?>" <?php selected( $vars['position'], $pos_id ); ?>><?php echo esc_html( $pos_name ); ?></option>
|
150 |
<?php endforeach; ?>
|
151 |
+
</select>
|
152 |
<?php if ( ! empty( $vars['position_error'] ) ) : ?>
|
153 |
+
<span class="sui-error-message"><?php echo esc_html( $vars['position_error'] ); ?></span>
|
154 |
<?php endif; ?>
|
155 |
|
156 |
+
</div>
|
157 |
+
</div>
|
158 |
+
</div>
|
159 |
+
<div class="sui-row">
|
160 |
+
<div class="sui-col-md-12">
|
161 |
+
<div class="sui-form-field <?php echo esc_attr( ! empty( $vars['label_ids_error'] ) ? 'sui-form-field-error' : '' ); ?>">
|
162 |
+
<label class="sui-label" for="label_ids"><?php esc_html_e( 'Labels', Forminator::DOMAIN ); ?></label>
|
163 |
+
<select class="sui-select fui-multi-select" name="label_ids[]" id="label_ids"
|
164 |
+
multiple="multiple"
|
165 |
+
data-reorder="1"
|
166 |
+
data-tags="false"
|
167 |
+
data-token-separators="[',']"
|
168 |
+
data-placeholder="<?php esc_html_e( 'Click here to add labels', Forminator::DOMAIN ); ?>"
|
169 |
+
data-allow-clear="false">
|
170 |
<?php foreach ( $vars['label_ids'] as $label_id ) : ?>
|
171 |
<?php if ( isset( $vars['labels'][ $label_id ] ) ) : ?>
|
172 |
+
<option
|
173 |
+
value="<?php echo esc_attr( $label_id ); ?>"
|
174 |
+
selected="selected"
|
175 |
+
data-color="<?php echo esc_attr( $vars['labels'][ $label_id ]['color'] ); ?>"
|
176 |
+
style="background-color: <?php echo esc_attr( $vars['labels'][ $label_id ]['color'] ); ?>;"
|
177 |
+
><?php echo esc_html( $vars['labels'][ $label_id ]['name'] ); ?></option>
|
178 |
<?php endif; ?>
|
179 |
<?php endforeach; ?>
|
180 |
|
181 |
<?php foreach ( $vars['labels'] as $label_id => $label ) : ?>
|
182 |
<?php if ( ! in_array( $label_id, $vars['label_ids'], true ) ) : ?>
|
183 |
+
<option
|
184 |
+
value="<?php echo esc_attr( $label_id ); ?>"
|
185 |
+
data-color="<?php echo esc_attr( $label['color'] ); ?>"
|
186 |
+
style="background-color: <?php echo esc_attr( $vars['labels'][ $label_id ]['color'] ); ?>;"
|
187 |
+
>
|
188 |
+
<?php echo esc_html( $label['name'] ); ?>
|
189 |
+
</option>
|
190 |
<?php endif; ?>
|
191 |
<?php endforeach; ?>
|
192 |
+
</select>
|
193 |
<?php if ( ! empty( $vars['label_ids_error'] ) ) : ?>
|
194 |
+
<span class="sui-error-message"><?php echo esc_html( $vars['label_ids_error'] ); ?></span>
|
195 |
<?php endif; ?>
|
196 |
+
</div>
|
197 |
+
</div>
|
198 |
+
</div>
|
199 |
+
<div class="sui-row">
|
200 |
+
<div class="sui-col-md-12">
|
201 |
+
<div class="sui-form-field <?php echo esc_attr( ! empty( $vars['member_ids_error'] ) ? 'sui-form-field-error' : '' ); ?>">
|
202 |
+
<label class="sui-label" for="member_ids"><?php esc_html_e( 'Members', Forminator::DOMAIN ); ?></label>
|
203 |
+
<select class="sui-select fui-multi-select"
|
204 |
+
name="member_ids[]"
|
205 |
+
id="member_ids"
|
206 |
+
multiple="multiple"
|
207 |
+
data-reorder="1"
|
208 |
+
data-tags="false"
|
209 |
+
data-token-separators="[',']"
|
210 |
+
data-placeholder="<?php esc_html_e( 'Click here to add members', Forminator::DOMAIN ); ?>"
|
211 |
+
data-allow-clear="false">
|
212 |
<?php foreach ( $vars['member_ids'] as $member_id ) : ?>
|
213 |
<?php if ( isset( $vars['members'][ $member_id ] ) ) : ?>
|
214 |
+
<option value="<?php echo esc_attr( $member_id ); ?>"
|
215 |
+
selected="selected"><?php echo esc_html( $vars['members'][ $member_id ] ); ?></option>
|
|
|
|
|
216 |
<?php endif; ?>
|
217 |
<?php endforeach; ?>
|
218 |
|
219 |
<?php foreach ( $vars['members'] as $member_id => $name ) : ?>
|
220 |
<?php if ( ! in_array( $member_id, $vars['member_ids'], true ) ) : ?>
|
221 |
+
<option value="<?php echo esc_attr( $member_id ); ?>"><?php echo esc_html( $name ); ?></option>
|
|
|
|
|
222 |
<?php endif; ?>
|
223 |
<?php endforeach; ?>
|
224 |
+
</select>
|
225 |
<?php if ( ! empty( $vars['member_ids_error'] ) ) : ?>
|
226 |
+
<span class="sui-error-message"><?php echo esc_html( $vars['member_ids_error'] ); ?></span>
|
227 |
<?php endif; ?>
|
228 |
+
</div>
|
229 |
|
230 |
|
231 |
+
</div>
|
232 |
+
</div>
|
233 |
|
234 |
+
<input type="hidden" name="multi_id" value="<?php echo esc_attr( $vars['multi_id'] ); ?>">
|
235 |
</form>
|
236 |
+
<script type="text/javascript">
|
237 |
+
( function ($) {
|
238 |
+
$( document ).ready(function (e) {
|
239 |
+
$( '#due_date' ).datepicker({
|
240 |
+
beforeShow: function( input, inst ) {
|
241 |
+
$( '#ui-datepicker-div' ).addClass( 'sui-calendar' );
|
242 |
+
},
|
243 |
+
'dateFormat': 'd MM yy'
|
244 |
+
});
|
245 |
+
});
|
246 |
+
})(jQuery);
|
247 |
+
</script>
|
addons/pro/trello/views/poll-settings/setup-card.php
CHANGED
@@ -105,58 +105,75 @@ foreach ( $template_vars as $key => $val ) {
|
|
105 |
</div>
|
106 |
|
107 |
<div class="sui-row">
|
108 |
-
<div class="sui-col-md-
|
109 |
-
|
110 |
-
|
111 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
112 |
<?php foreach ( $vars['positions'] as $pos_id => $pos_name ) : ?>
|
113 |
-
|
114 |
<?php endforeach; ?>
|
115 |
-
|
116 |
<?php if ( ! empty( $vars['position_error'] ) ) : ?>
|
117 |
-
|
118 |
<?php endif; ?>
|
119 |
|
120 |
-
|
121 |
-
|
122 |
|
123 |
-
<div class="sui-col-md-8">
|
124 |
-
<div class="sui-form-field <?php echo esc_attr( ! empty( $vars['label_ids_error'] ) ? 'sui-form-field-error' : '' ); ?>">
|
125 |
-
<label class="sui-label" for="label_ids"><?php esc_html_e( 'Labels', Forminator::DOMAIN ); ?></label>
|
126 |
-
<select class="sui-select fui-multi-select" name="label_ids[]" id="label_ids"
|
127 |
-
multiple="multiple"
|
128 |
-
data-reorder="1"
|
129 |
-
data-tags="false"
|
130 |
-
data-token-separators="[',']"
|
131 |
-
data-placeholder="<?php esc_html_e( 'Enter label name', Forminator::DOMAIN ); ?>"
|
132 |
-
data-allow-clear="false">
|
133 |
-
<?php foreach ( $vars['label_ids'] as $label_id ) : ?>
|
134 |
-
<?php if ( isset( $vars['labels'][ $label_id ] ) ) : ?>
|
135 |
-
<option
|
136 |
-
value="<?php echo esc_attr( $label_id ); ?>"
|
137 |
-
selected="selected"
|
138 |
-
data-color="<?php echo esc_attr( $vars['labels'][ $label_id ]['color'] ); ?>"
|
139 |
-
style="background-color: <?php echo esc_attr( $vars['labels'][ $label_id ]['color'] ); ?>;"
|
140 |
-
><?php echo esc_html( $vars['labels'][ $label_id ]['name'] ); ?></option>
|
141 |
-
<?php endif; ?>
|
142 |
-
<?php endforeach; ?>
|
143 |
-
|
144 |
-
<?php foreach ( $vars['labels'] as $label_id => $label ) : ?>
|
145 |
-
<?php if ( ! in_array( $label_id, $vars['label_ids'], true ) ) : ?>
|
146 |
-
<option
|
147 |
-
value="<?php echo esc_attr( $label_id ); ?>"
|
148 |
-
data-color="<?php echo esc_attr( $label['color'] ); ?>"
|
149 |
-
style="background-color: <?php echo esc_attr( $vars['labels'][ $label_id ]['color'] ); ?>;"
|
150 |
-
><?php echo esc_html( $label['name'] ); ?></option>
|
151 |
-
<?php endif; ?>
|
152 |
-
<?php endforeach; ?>
|
153 |
-
</select>
|
154 |
-
<?php if ( ! empty( $vars['label_ids_error'] ) ) : ?>
|
155 |
-
<span class="sui-error-message"><?php echo esc_html( $vars['label_ids_error'] ); ?></span>
|
156 |
-
<?php endif; ?>
|
157 |
-
</div>
|
158 |
-
</div>
|
159 |
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
160 |
|
161 |
<div class="sui-row">
|
162 |
<div class="sui-col-md-12">
|
@@ -197,3 +214,15 @@ foreach ( $template_vars as $key => $val ) {
|
|
197 |
|
198 |
<input type="hidden" name="multi_id" value="<?php echo esc_attr( $vars['multi_id'] ); ?>">
|
199 |
</form>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
105 |
</div>
|
106 |
|
107 |
<div class="sui-row">
|
108 |
+
<div class="sui-col-md-6">
|
109 |
+
<div class="sui-form-field <?php echo esc_attr( ! empty( $vars['due_date_error'] ) ? 'sui-form-field-error' : '' ); ?>">
|
110 |
+
<label class="sui-label" for="due_date"><?php esc_html_e( 'Due Date', Forminator::DOMAIN ); ?></label>
|
111 |
+
<input id="due_date"
|
112 |
+
class="sui-form-control"
|
113 |
+
name="due_date"
|
114 |
+
placeholder="<?php echo esc_attr( __( 'Select a due date', Forminator::DOMAIN ) ); ?>"
|
115 |
+
value="<?php echo esc_attr( $vars['due_date'] ); ?>">
|
116 |
+
|
117 |
+
<?php if ( ! empty( $vars['due_date_error'] ) ) : ?>
|
118 |
+
<span class="sui-error-message"><?php echo esc_html( $vars['due_date_error'] ); ?></span>
|
119 |
+
<?php endif; ?>
|
120 |
+
|
121 |
+
</div>
|
122 |
+
</div>
|
123 |
+
<div class="sui-col-md-6">
|
124 |
+
<div class="sui-form-field <?php echo esc_attr( ! empty( $vars['position_error'] ) ? 'sui-form-field-error' : '' ); ?>">
|
125 |
+
<label class="sui-label" for="position"><?php esc_html_e( 'Position', Forminator::DOMAIN ); ?></label>
|
126 |
+
<select name="position" id="position">
|
127 |
<?php foreach ( $vars['positions'] as $pos_id => $pos_name ) : ?>
|
128 |
+
<option value="<?php echo esc_attr( $pos_id ); ?>" <?php selected( $vars['position'], $pos_id ); ?>><?php echo esc_html( $pos_name ); ?></option>
|
129 |
<?php endforeach; ?>
|
130 |
+
</select>
|
131 |
<?php if ( ! empty( $vars['position_error'] ) ) : ?>
|
132 |
+
<span class="sui-error-message"><?php echo esc_html( $vars['position_error'] ); ?></span>
|
133 |
<?php endif; ?>
|
134 |
|
135 |
+
</div>
|
136 |
+
</div>
|
137 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
138 |
</div>
|
139 |
+
<div class="sui-row">
|
140 |
+
<div class="sui-col-md-12">
|
141 |
+
<div class="sui-form-field <?php echo esc_attr( ! empty( $vars['label_ids_error'] ) ? 'sui-form-field-error' : '' ); ?>">
|
142 |
+
<label class="sui-label" for="label_ids"><?php esc_html_e( 'Labels', Forminator::DOMAIN ); ?></label>
|
143 |
+
<select class="sui-select fui-multi-select" name="label_ids[]" id="label_ids"
|
144 |
+
multiple="multiple"
|
145 |
+
data-reorder="1"
|
146 |
+
data-tags="false"
|
147 |
+
data-token-separators="[',']"
|
148 |
+
data-placeholder="<?php esc_html_e( 'Enter label name', Forminator::DOMAIN ); ?>"
|
149 |
+
data-allow-clear="false">
|
150 |
+
<?php foreach ( $vars['label_ids'] as $label_id ) : ?>
|
151 |
+
<?php if ( isset( $vars['labels'][ $label_id ] ) ) : ?>
|
152 |
+
<option
|
153 |
+
value="<?php echo esc_attr( $label_id ); ?>"
|
154 |
+
selected="selected"
|
155 |
+
data-color="<?php echo esc_attr( $vars['labels'][ $label_id ]['color'] ); ?>"
|
156 |
+
style="background-color: <?php echo esc_attr( $vars['labels'][ $label_id ]['color'] ); ?>;"
|
157 |
+
><?php echo esc_html( $vars['labels'][ $label_id ]['name'] ); ?></option>
|
158 |
+
<?php endif; ?>
|
159 |
+
<?php endforeach; ?>
|
160 |
+
|
161 |
+
<?php foreach ( $vars['labels'] as $label_id => $label ) : ?>
|
162 |
+
<?php if ( ! in_array( $label_id, $vars['label_ids'], true ) ) : ?>
|
163 |
+
<option
|
164 |
+
value="<?php echo esc_attr( $label_id ); ?>"
|
165 |
+
data-color="<?php echo esc_attr( $label['color'] ); ?>"
|
166 |
+
style="background-color: <?php echo esc_attr( $vars['labels'][ $label_id ]['color'] ); ?>;"
|
167 |
+
><?php echo esc_html( $label['name'] ); ?></option>
|
168 |
+
<?php endif; ?>
|
169 |
+
<?php endforeach; ?>
|
170 |
+
</select>
|
171 |
+
<?php if ( ! empty( $vars['label_ids_error'] ) ) : ?>
|
172 |
+
<span class="sui-error-message"><?php echo esc_html( $vars['label_ids_error'] ); ?></span>
|
173 |
+
<?php endif; ?>
|
174 |
+
</div>
|
175 |
+
</div>
|
176 |
+
</div>
|
177 |
|
178 |
<div class="sui-row">
|
179 |
<div class="sui-col-md-12">
|
214 |
|
215 |
<input type="hidden" name="multi_id" value="<?php echo esc_attr( $vars['multi_id'] ); ?>">
|
216 |
</form>
|
217 |
+
<script type="text/javascript">
|
218 |
+
( function ($) {
|
219 |
+
$( document ).ready(function (e) {
|
220 |
+
$( '#due_date' ).datepicker({
|
221 |
+
beforeShow: function( input, inst ) {
|
222 |
+
$( '#ui-datepicker-div' ).addClass( 'sui-calendar' );
|
223 |
+
},
|
224 |
+
'dateFormat': 'd MM yy'
|
225 |
+
});
|
226 |
+
});
|
227 |
+
})(jQuery);
|
228 |
+
</script>
|
addons/pro/trello/views/quiz-settings/setup-card.php
CHANGED
@@ -18,6 +18,7 @@ $vars = array(
|
|
18 |
'desc_fields' => array(),
|
19 |
'error_message' => '',
|
20 |
'list_name' => '',
|
|
|
21 |
);
|
22 |
/** @var array $template_vars */
|
23 |
foreach ( $template_vars as $key => $val ) {
|
@@ -57,7 +58,13 @@ foreach ( $template_vars as $key => $val ) {
|
|
57 |
|
58 |
<select data-textarea-id="card_name"><?php foreach ( $vars['name_fields'] as $key => $field ) : ?>
|
59 |
<option value="{<?php echo esc_attr( $key ); ?>}" data-content="{<?php echo esc_attr( $key ); ?>}"><?php echo esc_html( $field ); ?></option>
|
60 |
-
<?php endforeach;
|
|
|
|
|
|
|
|
|
|
|
|
|
61 |
|
62 |
</div>
|
63 |
|
@@ -85,7 +92,13 @@ foreach ( $template_vars as $key => $val ) {
|
|
85 |
|
86 |
<select data-textarea-id="card_description"><?php foreach ( $vars['desc_fields'] as $key => $field ) : ?>
|
87 |
<option value="{<?php echo esc_attr( $key ); ?>}" data-content="{<?php echo esc_attr( $key ); ?>}"><?php echo esc_html( $field ); ?></option>
|
88 |
-
<?php endforeach;
|
|
|
|
|
|
|
|
|
|
|
|
|
89 |
|
90 |
</div>
|
91 |
|
@@ -105,7 +118,22 @@ foreach ( $template_vars as $key => $val ) {
|
|
105 |
</div>
|
106 |
|
107 |
<div class="sui-row">
|
108 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
109 |
<div class="sui-form-field <?php echo esc_attr( ! empty( $vars['position_error'] ) ? 'sui-form-field-error' : '' ); ?>">
|
110 |
<label class="sui-label" for="position"><?php esc_html_e( 'Position', Forminator::DOMAIN ); ?></label>
|
111 |
<select name="position" id="position">
|
@@ -120,44 +148,45 @@ foreach ( $template_vars as $key => $val ) {
|
|
120 |
</div>
|
121 |
</div>
|
122 |
|
123 |
-
<div class="sui-col-md-8">
|
124 |
-
<div class="sui-form-field <?php echo esc_attr( ! empty( $vars['label_ids_error'] ) ? 'sui-form-field-error' : '' ); ?>">
|
125 |
-
<label class="sui-label" for="label_ids"><?php esc_html_e( 'Labels', Forminator::DOMAIN ); ?></label>
|
126 |
-
<select class="sui-select fui-multi-select" name="label_ids[]" id="label_ids"
|
127 |
-
multiple="multiple"
|
128 |
-
data-reorder="1"
|
129 |
-
data-tags="false"
|
130 |
-
data-token-separators="[',']"
|
131 |
-
data-placeholder="<?php esc_html_e( 'Enter label name', Forminator::DOMAIN ); ?>"
|
132 |
-
data-allow-clear="false">
|
133 |
-
<?php foreach ( $vars['label_ids'] as $label_id ) : ?>
|
134 |
-
<?php if ( isset( $vars['labels'][ $label_id ] ) ) : ?>
|
135 |
-
<option
|
136 |
-
value="<?php echo esc_attr( $label_id ); ?>"
|
137 |
-
selected="selected"
|
138 |
-
data-color="<?php echo esc_attr( $vars['labels'][ $label_id ]['color'] ); ?>"
|
139 |
-
style="background-color: <?php echo esc_attr( $vars['labels'][ $label_id ]['color'] ); ?>;"
|
140 |
-
><?php echo esc_html( $vars['labels'][ $label_id ]['name'] ); ?></option>
|
141 |
-
<?php endif; ?>
|
142 |
-
<?php endforeach; ?>
|
143 |
-
|
144 |
-
<?php foreach ( $vars['labels'] as $label_id => $label ) : ?>
|
145 |
-
<?php if ( ! in_array( $label_id, $vars['label_ids'], true ) ) : ?>
|
146 |
-
<option
|
147 |
-
value="<?php echo esc_attr( $label_id ); ?>"
|
148 |
-
data-color="<?php echo esc_attr( $label['color'] ); ?>"
|
149 |
-
style="background-color: <?php echo esc_attr( $vars['labels'][ $label_id ]['color'] ); ?>;"
|
150 |
-
><?php echo esc_html( $label['name'] ); ?></option>
|
151 |
-
<?php endif; ?>
|
152 |
-
<?php endforeach; ?>
|
153 |
-
</select>
|
154 |
-
<?php if ( ! empty( $vars['label_ids_error'] ) ) : ?>
|
155 |
-
<span class="sui-error-message"><?php echo esc_html( $vars['label_ids_error'] ); ?></span>
|
156 |
-
<?php endif; ?>
|
157 |
-
</div>
|
158 |
-
</div>
|
159 |
</div>
|
160 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
161 |
<div class="sui-row">
|
162 |
<div class="sui-col-md-12">
|
163 |
<div class="sui-form-field <?php echo esc_attr( ! empty( $vars['member_ids_error'] ) ? 'sui-form-field-error' : '' ); ?>">
|
@@ -197,3 +226,15 @@ foreach ( $template_vars as $key => $val ) {
|
|
197 |
|
198 |
<input type="hidden" name="multi_id" value="<?php echo esc_attr( $vars['multi_id'] ); ?>">
|
199 |
</form>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
18 |
'desc_fields' => array(),
|
19 |
'error_message' => '',
|
20 |
'list_name' => '',
|
21 |
+
'lead_fields' => array(),
|
22 |
);
|
23 |
/** @var array $template_vars */
|
24 |
foreach ( $template_vars as $key => $val ) {
|
58 |
|
59 |
<select data-textarea-id="card_name"><?php foreach ( $vars['name_fields'] as $key => $field ) : ?>
|
60 |
<option value="{<?php echo esc_attr( $key ); ?>}" data-content="{<?php echo esc_attr( $key ); ?>}"><?php echo esc_html( $field ); ?></option>
|
61 |
+
<?php endforeach; ?>
|
62 |
+
<?php if ( ! empty( $vars['lead_fields'] ) ) :
|
63 |
+
foreach ( $vars['lead_fields'] as $field ) : ?>
|
64 |
+
<option value="{<?php echo esc_attr( $field['element_id'] ); ?>}" data-content="{<?php echo esc_attr( $field['element_id'] ); ?>}"><?php echo esc_html( $field['field_label'] ); ?></option>
|
65 |
+
<?php endforeach;
|
66 |
+
endif; ?>
|
67 |
+
</select>
|
68 |
|
69 |
</div>
|
70 |
|
92 |
|
93 |
<select data-textarea-id="card_description"><?php foreach ( $vars['desc_fields'] as $key => $field ) : ?>
|
94 |
<option value="{<?php echo esc_attr( $key ); ?>}" data-content="{<?php echo esc_attr( $key ); ?>}"><?php echo esc_html( $field ); ?></option>
|
95 |
+
<?php endforeach; ?>
|
96 |
+
<?php if ( ! empty( $vars['lead_fields'] ) ) :
|
97 |
+
foreach ( $vars['lead_fields'] as $field ) : ?>
|
98 |
+
<option value="{<?php echo esc_attr( $field['element_id'] ); ?>}" data-content="{<?php echo esc_attr( $field['element_id'] ); ?>}"><?php echo esc_html( $field['field_label'] ); ?></option>
|
99 |
+
<?php endforeach;
|
100 |
+
endif; ?>
|
101 |
+
</select>
|
102 |
|
103 |
</div>
|
104 |
|
118 |
</div>
|
119 |
|
120 |
<div class="sui-row">
|
121 |
+
<div class="sui-col-md-6">
|
122 |
+
<div class="sui-form-field <?php echo esc_attr( ! empty( $vars['due_date_error'] ) ? 'sui-form-field-error' : '' ); ?>">
|
123 |
+
<label class="sui-label" for="due_date"><?php esc_html_e( 'Due Date', Forminator::DOMAIN ); ?></label>
|
124 |
+
<input id="due_date"
|
125 |
+
class="sui-form-control"
|
126 |
+
name="due_date"
|
127 |
+
placeholder="<?php echo esc_attr( __( 'Select a due date', Forminator::DOMAIN ) ); ?>"
|
128 |
+
value="<?php echo esc_attr( $vars['due_date'] ); ?>">
|
129 |
+
|
130 |
+
<?php if ( ! empty( $vars['due_date_error'] ) ) : ?>
|
131 |
+
<span class="sui-error-message"><?php echo esc_html( $vars['due_date_error'] ); ?></span>
|
132 |
+
<?php endif; ?>
|
133 |
+
|
134 |
+
</div>
|
135 |
+
</div>
|
136 |
+
<div class="sui-col-md-6">
|
137 |
<div class="sui-form-field <?php echo esc_attr( ! empty( $vars['position_error'] ) ? 'sui-form-field-error' : '' ); ?>">
|
138 |
<label class="sui-label" for="position"><?php esc_html_e( 'Position', Forminator::DOMAIN ); ?></label>
|
139 |
<select name="position" id="position">
|
148 |
</div>
|
149 |
</div>
|
150 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
151 |
</div>
|
152 |
+
<div class="sui-row">
|
153 |
+
<div class="sui-col-md-12">
|
154 |
+
<div class="sui-form-field <?php echo esc_attr( ! empty( $vars['label_ids_error'] ) ? 'sui-form-field-error' : '' ); ?>">
|
155 |
+
<label class="sui-label" for="label_ids"><?php esc_html_e( 'Labels', Forminator::DOMAIN ); ?></label>
|
156 |
+
<select class="sui-select fui-multi-select" name="label_ids[]" id="label_ids"
|
157 |
+
multiple="multiple"
|
158 |
+
data-reorder="1"
|
159 |
+
data-tags="false"
|
160 |
+
data-token-separators="[',']"
|
161 |
+
data-placeholder="<?php esc_html_e( 'Enter label name', Forminator::DOMAIN ); ?>"
|
162 |
+
data-allow-clear="false">
|
163 |
+
<?php foreach ( $vars['label_ids'] as $label_id ) : ?>
|
164 |
+
<?php if ( isset( $vars['labels'][ $label_id ] ) ) : ?>
|
165 |
+
<option
|
166 |
+
value="<?php echo esc_attr( $label_id ); ?>"
|
167 |
+
selected="selected"
|
168 |
+
data-color="<?php echo esc_attr( $vars['labels'][ $label_id ]['color'] ); ?>"
|
169 |
+
style="background-color: <?php echo esc_attr( $vars['labels'][ $label_id ]['color'] ); ?>;"
|
170 |
+
><?php echo esc_html( $vars['labels'][ $label_id ]['name'] ); ?></option>
|
171 |
+
<?php endif; ?>
|
172 |
+
<?php endforeach; ?>
|
173 |
+
|
174 |
+
<?php foreach ( $vars['labels'] as $label_id => $label ) : ?>
|
175 |
+
<?php if ( ! in_array( $label_id, $vars['label_ids'], true ) ) : ?>
|
176 |
+
<option
|
177 |
+
value="<?php echo esc_attr( $label_id ); ?>"
|
178 |
+
data-color="<?php echo esc_attr( $label['color'] ); ?>"
|
179 |
+
style="background-color: <?php echo esc_attr( $vars['labels'][ $label_id ]['color'] ); ?>;"
|
180 |
+
><?php echo esc_html( $label['name'] ); ?></option>
|
181 |
+
<?php endif; ?>
|
182 |
+
<?php endforeach; ?>
|
183 |
+
</select>
|
184 |
+
<?php if ( ! empty( $vars['label_ids_error'] ) ) : ?>
|
185 |
+
<span class="sui-error-message"><?php echo esc_html( $vars['label_ids_error'] ); ?></span>
|
186 |
+
<?php endif; ?>
|
187 |
+
</div>
|
188 |
+
</div>
|
189 |
+
</div>
|
190 |
<div class="sui-row">
|
191 |
<div class="sui-col-md-12">
|
192 |
<div class="sui-form-field <?php echo esc_attr( ! empty( $vars['member_ids_error'] ) ? 'sui-form-field-error' : '' ); ?>">
|
226 |
|
227 |
<input type="hidden" name="multi_id" value="<?php echo esc_attr( $vars['multi_id'] ); ?>">
|
228 |
</form>
|
229 |
+
<script type="text/javascript">
|
230 |
+
( function ($) {
|
231 |
+
$( document ).ready(function (e) {
|
232 |
+
$( '#due_date' ).datepicker({
|
233 |
+
beforeShow: function( input, inst ) {
|
234 |
+
$( '#ui-datepicker-div' ).addClass( 'sui-calendar' );
|
235 |
+
},
|
236 |
+
'dateFormat': 'd MM yy'
|
237 |
+
});
|
238 |
+
});
|
239 |
+
})(jQuery);
|
240 |
+
</script>
|
admin/abstracts/class-admin-import-mediator.php
CHANGED
@@ -142,10 +142,8 @@ abstract class Forminator_Import_Mediator {
|
|
142 |
* @return int random number
|
143 |
*/
|
144 |
public function random_wrapper_int() {
|
145 |
-
|
146 |
//get all forms
|
147 |
-
|
148 |
-
$int = intval( (float) rand() / (float) getrandmax() * 9999 );
|
149 |
|
150 |
return absint( $int );
|
151 |
}
|
@@ -159,7 +157,6 @@ abstract class Forminator_Import_Mediator {
|
|
159 |
* @return string returns string with valid field tag format
|
160 |
*/
|
161 |
public function get_thirdparty_field_type( $type ) {
|
162 |
-
|
163 |
switch ( trim( $type ) ) {
|
164 |
case 'firstname':
|
165 |
case 'lastname':
|
142 |
* @return int random number
|
143 |
*/
|
144 |
public function random_wrapper_int() {
|
|
|
145 |
//get all forms
|
146 |
+
$int = intval( (float)rand()/(float)getrandmax() * 9999 );
|
|
|
147 |
|
148 |
return absint( $int );
|
149 |
}
|
157 |
* @return string returns string with valid field tag format
|
158 |
*/
|
159 |
public function get_thirdparty_field_type( $type ) {
|
|
|
160 |
switch ( trim( $type ) ) {
|
161 |
case 'firstname':
|
162 |
case 'lastname':
|
admin/abstracts/class-admin-module.php
CHANGED
@@ -36,12 +36,16 @@ abstract class Forminator_Admin_Module {
|
|
36 |
* @since 1.0
|
37 |
*/
|
38 |
public function __construct() {
|
|
|
39 |
$this->init();
|
|
|
40 |
$this->includes();
|
41 |
|
42 |
add_action( 'admin_menu', array( $this, 'add_menu_pages' ) );
|
43 |
add_action( 'admin_head', array( $this, 'hide_menu_pages' ) );
|
44 |
|
|
|
|
|
45 |
// admin-menu-editor compat
|
46 |
add_action( 'admin_menu_editor-menu_replaced', array( $this, 'hide_menu_pages' ) );
|
47 |
|
@@ -66,6 +70,8 @@ abstract class Forminator_Admin_Module {
|
|
66 |
*/
|
67 |
public function add_menu_pages() {}
|
68 |
|
|
|
|
|
69 |
/**
|
70 |
* Hide pages from menu
|
71 |
*
|
@@ -133,6 +139,11 @@ abstract class Forminator_Admin_Module {
|
|
133 |
public function is_admin_wizard() {
|
134 |
global $plugin_page;
|
135 |
|
|
|
|
|
|
|
|
|
|
|
136 |
return $this->page_edit === $plugin_page;
|
137 |
}
|
138 |
|
36 |
* @since 1.0
|
37 |
*/
|
38 |
public function __construct() {
|
39 |
+
|
40 |
$this->init();
|
41 |
+
|
42 |
$this->includes();
|
43 |
|
44 |
add_action( 'admin_menu', array( $this, 'add_menu_pages' ) );
|
45 |
add_action( 'admin_head', array( $this, 'hide_menu_pages' ) );
|
46 |
|
47 |
+
add_action( 'wp_loaded', array( $this, 'create_module' ) );
|
48 |
+
|
49 |
// admin-menu-editor compat
|
50 |
add_action( 'admin_menu_editor-menu_replaced', array( $this, 'hide_menu_pages' ) );
|
51 |
|
70 |
*/
|
71 |
public function add_menu_pages() {}
|
72 |
|
73 |
+
public function create_module() {}
|
74 |
+
|
75 |
/**
|
76 |
* Hide pages from menu
|
77 |
*
|
139 |
public function is_admin_wizard() {
|
140 |
global $plugin_page;
|
141 |
|
142 |
+
// $plugin_page may not be set if we call the function too early, retrieve the page slug from $_GET
|
143 |
+
if ( ( ! isset( $plugin_page ) || empty( $plugin_page ) ) && isset( $_GET[ 'page' ] ) ) {
|
144 |
+
$plugin_page = sanitize_text_field( $_GET[ 'page' ] );
|
145 |
+
}
|
146 |
+
|
147 |
return $this->page_edit === $plugin_page;
|
148 |
}
|
149 |
|
admin/abstracts/class-admin-page.php
CHANGED
@@ -567,10 +567,12 @@ abstract class Forminator_Admin_Page {
|
|
567 |
*
|
568 |
* @param string $fallback_redirect url if referer not found
|
569 |
*/
|
570 |
-
protected function maybe_redirect_to_referer( $fallback_redirect = '' ) {
|
571 |
$referer = wp_get_referer();
|
572 |
$referer = ! empty( $referer ) ? $referer : wp_get_raw_referer();
|
573 |
-
|
|
|
|
|
574 |
wp_safe_redirect( $referer );
|
575 |
} elseif ( $fallback_redirect ) {
|
576 |
wp_safe_redirect( $fallback_redirect );
|
567 |
*
|
568 |
* @param string $fallback_redirect url if referer not found
|
569 |
*/
|
570 |
+
protected function maybe_redirect_to_referer( $fallback_redirect = '', $to_referer = true ) {
|
571 |
$referer = wp_get_referer();
|
572 |
$referer = ! empty( $referer ) ? $referer : wp_get_raw_referer();
|
573 |
+
$referer = remove_query_arg( array( 'export', 'delete' ), $referer );
|
574 |
+
|
575 |
+
if ( $referer && $to_referer ) {
|
576 |
wp_safe_redirect( $referer );
|
577 |
} elseif ( $fallback_redirect ) {
|
578 |
wp_safe_redirect( $fallback_redirect );
|
admin/classes/class-admin-ajax.php
CHANGED
@@ -129,16 +129,17 @@ class Forminator_Admin_AJAX {
|
|
129 |
$quiz_data = json_decode( stripslashes( $quiz_data ), true );
|
130 |
}
|
131 |
|
132 |
-
$questions
|
133 |
-
$results
|
134 |
-
$settings
|
135 |
-
$msg_count
|
136 |
-
$id
|
137 |
-
$id
|
138 |
-
$title
|
139 |
-
$status
|
140 |
-
$version
|
141 |
-
$action
|
|
|
142 |
|
143 |
if ( is_null( $id ) || $id <= 0 ) {
|
144 |
$form_model = new Forminator_Quiz_Form_Model();
|
@@ -228,6 +229,19 @@ class Forminator_Admin_AJAX {
|
|
228 |
$settings['social-share-message'] = forminator_sanitize_textarea( $quiz_data['settings']['social-share-message'] );
|
229 |
}
|
230 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
231 |
// Update with backuped version
|
232 |
if ( $msg_count ) {
|
233 |
$settings['msg_count'] = $msg_count;
|
@@ -237,6 +251,7 @@ class Forminator_Admin_AJAX {
|
|
237 |
$settings['version'] = $version;
|
238 |
|
239 |
$form_model->settings = $settings;
|
|
|
240 |
|
241 |
$quiz_data['formName'] = $title;
|
242 |
|
@@ -260,7 +275,7 @@ class Forminator_Admin_AJAX {
|
|
260 |
* @param array $results - quiz results
|
261 |
*
|
262 |
*/
|
263 |
-
do_action( '
|
264 |
|
265 |
|
266 |
wp_send_json_success( $id );
|
@@ -465,29 +480,21 @@ class Forminator_Admin_AJAX {
|
|
465 |
$settings['custom_css'] = sanitize_textarea_field( $form_data['settings']['custom_css'] );
|
466 |
}
|
467 |
|
468 |
-
// Sanitize thank you message
|
469 |
-
if ( isset( $form_data['settings']['thankyou-message'] ) ) {
|
470 |
-
$settings['thankyou-message'] = $form_data['settings']['thankyou-message'];
|
471 |
-
}
|
472 |
-
|
473 |
-
// Sanitize user email message
|
474 |
-
if ( isset( $form_data['settings']['user-email-editor'] ) ) {
|
475 |
-
$settings['user-email-editor'] = $form_data['settings']['user-email-editor'];
|
476 |
-
}
|
477 |
-
|
478 |
-
// Sanitize admin email message
|
479 |
-
if ( isset( $form_data['settings']['admin-email-editor'] ) ) {
|
480 |
-
$settings['admin-email-editor'] = $form_data['settings']['admin-email-editor'];
|
481 |
-
}
|
482 |
-
|
483 |
if ( isset( $form_data['notifications'] ) ) {
|
484 |
$notifications = forminator_sanitize_field( $form_data['notifications'] );
|
485 |
|
486 |
$count = 0;
|
487 |
foreach( $notifications as $notification ) {
|
488 |
-
if( isset( $notification['email-editor'] ) ) {
|
489 |
$notifications[ $count ]['email-editor'] = $form_data['notifications'][ $count ]['email-editor'];
|
490 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
491 |
$count++;
|
492 |
}
|
493 |
}
|
@@ -542,6 +549,11 @@ class Forminator_Admin_AJAX {
|
|
542 |
|
543 |
forminator_update_form_submissions_retention( $id, $retention_number, $retention_unit );
|
544 |
|
|
|
|
|
|
|
|
|
|
|
545 |
wp_send_json_success( $id );
|
546 |
}
|
547 |
|
@@ -1387,19 +1399,20 @@ class Forminator_Admin_AJAX {
|
|
1387 |
$class = '';
|
1388 |
|
1389 |
switch ( $type ) {
|
1390 |
-
|
1391 |
case 'cf7':
|
1392 |
-
if( class_exists( 'Forminator_Admin_Import_CF7' ) )
|
1393 |
$class = new Forminator_Admin_Import_CF7();
|
1394 |
break;
|
1395 |
case 'ninja':
|
1396 |
-
if( class_exists( 'Forminator_Admin_Import_Ninja' ) )
|
1397 |
$class = new Forminator_Admin_Import_Ninja();
|
1398 |
break;
|
1399 |
case 'gravity':
|
1400 |
-
if( class_exists( 'Forminator_Admin_Import_Gravity' ) )
|
1401 |
return new Forminator_Admin_Import_Gravity();
|
1402 |
break;
|
|
|
|
|
1403 |
}
|
1404 |
|
1405 |
return $class;
|
@@ -1508,34 +1521,30 @@ class Forminator_Admin_AJAX {
|
|
1508 |
$importable = isset( $post_data['ninjaforms'] ) ? $post_data['ninjaforms'] : '';// wpcs: CSRF ok
|
1509 |
$importer = ( ! empty ( $this->importers( 'ninja' ) ) ? $this->importers( 'ninja' ) : '' );
|
1510 |
|
1511 |
-
if( ! empty( $importer ) ):
|
1512 |
-
if( 'all' !== $importable && '' !== $importable ){
|
1513 |
|
1514 |
$importable = absint( $importable );
|
1515 |
$imported = $importer->import_form( $importable );
|
1516 |
|
1517 |
-
if( 'fail' === $imported['type'] ){
|
1518 |
-
|
1519 |
wp_send_json_error( $imported['message'] );
|
1520 |
}
|
1521 |
|
1522 |
wp_send_json_success( $imported );
|
1523 |
|
1524 |
-
}elseif( '' !== $importable ){
|
1525 |
-
|
1526 |
$forms = forminator_list_thirdparty_contact_forms( 'ninjaforms' );
|
1527 |
|
1528 |
foreach ($forms as $key => $value) {
|
1529 |
-
|
1530 |
$imported = $importer->import_form( $value->get_id() );
|
1531 |
|
1532 |
-
if( 'fail' === $imported['type'] ){
|
1533 |
-
|
1534 |
$error = $imported['message'];
|
1535 |
}
|
1536 |
}
|
1537 |
|
1538 |
-
if( !empty( $error ) ){
|
1539 |
wp_send_json_error( $error );
|
1540 |
}
|
1541 |
|
@@ -1544,7 +1553,6 @@ class Forminator_Admin_AJAX {
|
|
1544 |
endif;
|
1545 |
|
1546 |
wp_send_json_error( __( 'Could not import the forms. Check if the selected form plugin is active', Forminator::DOMAIN ) );
|
1547 |
-
|
1548 |
}
|
1549 |
|
1550 |
/**
|
@@ -1581,34 +1589,30 @@ class Forminator_Admin_AJAX {
|
|
1581 |
$importable = isset( $post_data['gravityforms'] ) ? $post_data['gravityforms'] : '';// wpcs: CSRF ok
|
1582 |
$importer = ( ! empty ( $this->importers( 'gravity' ) ) ? $this->importers( 'gravity' ) : '' );
|
1583 |
|
1584 |
-
if( ! empty( $importer ) ):
|
1585 |
-
if( 'all' !== $importable && '' !== $importable ){
|
1586 |
|
1587 |
$importable = absint( $importable );
|
1588 |
$imported = $importer->import_form( $importable );
|
1589 |
|
1590 |
-
if( 'fail' === $imported['type'] ){
|
1591 |
-
|
1592 |
wp_send_json_error( $imported['message'] );
|
1593 |
}
|
1594 |
|
1595 |
wp_send_json_success( $imported );
|
1596 |
|
1597 |
-
}elseif( '' !== $importable ){
|
1598 |
-
|
1599 |
$forms = forminator_list_thirdparty_contact_forms( 'gravityforms' );
|
1600 |
|
1601 |
foreach ($forms as $key => $value) {
|
1602 |
-
|
1603 |
$imported = $importer->import_form( $value['id'] );
|
1604 |
|
1605 |
-
if( 'fail' === $imported['type'] ){
|
1606 |
-
|
1607 |
$error = $imported['message'];
|
1608 |
}
|
1609 |
}
|
1610 |
|
1611 |
-
if( !empty( $error ) ){
|
1612 |
wp_send_json_error( $error );
|
1613 |
}
|
1614 |
|
129 |
$quiz_data = json_decode( stripslashes( $quiz_data ), true );
|
130 |
}
|
131 |
|
132 |
+
$questions = array();
|
133 |
+
$results = array();
|
134 |
+
$settings = array();
|
135 |
+
$msg_count = false;
|
136 |
+
$id = isset( $submitted_data['form_id'] ) ? $submitted_data['form_id'] : null;
|
137 |
+
$id = intval( $id );
|
138 |
+
$title = isset( $submitted_data['quiz_title'] ) ? sanitize_text_field( $submitted_data['quiz_title'] ) : sanitize_text_field( $submitted_data['formName'] );
|
139 |
+
$status = isset( $submitted_data['status'] ) ? sanitize_text_field( $submitted_data['status'] ) : '';
|
140 |
+
$version = isset( $submitted_data['version'] ) ? sanitize_text_field( $submitted_data['version'] ) : '1.0';
|
141 |
+
$action = false;
|
142 |
+
$notifications = array();
|
143 |
|
144 |
if ( is_null( $id ) || $id <= 0 ) {
|
145 |
$form_model = new Forminator_Quiz_Form_Model();
|
229 |
$settings['social-share-message'] = forminator_sanitize_textarea( $quiz_data['settings']['social-share-message'] );
|
230 |
}
|
231 |
|
232 |
+
if ( isset( $quiz_data['notifications'] ) ) {
|
233 |
+
$notifications = forminator_sanitize_field( $quiz_data['notifications'] );
|
234 |
+
|
235 |
+
$count = 0;
|
236 |
+
foreach( $notifications as $notification ) {
|
237 |
+
if ( isset( $notification['email-editor'] ) ) {
|
238 |
+
$notifications[ $count ]['email-editor'] = $quiz_data['notifications'][ $count ]['email-editor'];
|
239 |
+
}
|
240 |
+
|
241 |
+
$count++;
|
242 |
+
}
|
243 |
+
}
|
244 |
+
|
245 |
// Update with backuped version
|
246 |
if ( $msg_count ) {
|
247 |
$settings['msg_count'] = $msg_count;
|
251 |
$settings['version'] = $version;
|
252 |
|
253 |
$form_model->settings = $settings;
|
254 |
+
$form_model->notifications = $notifications;
|
255 |
|
256 |
$quiz_data['formName'] = $title;
|
257 |
|
275 |
* @param array $results - quiz results
|
276 |
*
|
277 |
*/
|
278 |
+
do_action( 'forminator_quiz_action_' . $action, $id, $type, $status, $questions, $results );
|
279 |
|
280 |
|
281 |
wp_send_json_success( $id );
|
480 |
$settings['custom_css'] = sanitize_textarea_field( $form_data['settings']['custom_css'] );
|
481 |
}
|
482 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
483 |
if ( isset( $form_data['notifications'] ) ) {
|
484 |
$notifications = forminator_sanitize_field( $form_data['notifications'] );
|
485 |
|
486 |
$count = 0;
|
487 |
foreach( $notifications as $notification ) {
|
488 |
+
if ( isset( $notification['email-editor'] ) ) {
|
489 |
$notifications[ $count ]['email-editor'] = $form_data['notifications'][ $count ]['email-editor'];
|
490 |
}
|
491 |
+
if ( isset( $notification['email-editor-method-email'] ) ) {
|
492 |
+
$notifications[ $count ]['email-editor-method-email'] = $form_data['notifications'][ $count ]['email-editor-method-email'];
|
493 |
+
}
|
494 |
+
if ( isset( $notification['email-editor-method-manual'] ) ) {
|
495 |
+
$notifications[ $count ]['email-editor-method-manual'] = $form_data['notifications'][ $count ]['email-editor-method-manual'];
|
496 |
+
}
|
497 |
+
|
498 |
$count++;
|
499 |
}
|
500 |
}
|
549 |
|
550 |
forminator_update_form_submissions_retention( $id, $retention_number, $retention_unit );
|
551 |
|
552 |
+
// Purge count forms cache
|
553 |
+
wp_cache_delete( 'forminator_form_total_entries', 'forminator_form_total_entries' );
|
554 |
+
wp_cache_delete( 'forminator_form_total_entries_publish', 'forminator_form_total_entries_publish' );
|
555 |
+
wp_cache_delete( 'forminator_form_total_entries_draft', 'forminator_form_total_entries_draft' );
|
556 |
+
|
557 |
wp_send_json_success( $id );
|
558 |
}
|
559 |
|
1399 |
$class = '';
|
1400 |
|
1401 |
switch ( $type ) {
|
|
|
1402 |
case 'cf7':
|
1403 |
+
if ( class_exists( 'Forminator_Admin_Import_CF7' ) )
|
1404 |
$class = new Forminator_Admin_Import_CF7();
|
1405 |
break;
|
1406 |
case 'ninja':
|
1407 |
+
if ( class_exists( 'Forminator_Admin_Import_Ninja' ) )
|
1408 |
$class = new Forminator_Admin_Import_Ninja();
|
1409 |
break;
|
1410 |
case 'gravity':
|
1411 |
+
if ( class_exists( 'Forminator_Admin_Import_Gravity' ) )
|
1412 |
return new Forminator_Admin_Import_Gravity();
|
1413 |
break;
|
1414 |
+
default:
|
1415 |
+
break;
|
1416 |
}
|
1417 |
|
1418 |
return $class;
|
1521 |
$importable = isset( $post_data['ninjaforms'] ) ? $post_data['ninjaforms'] : '';// wpcs: CSRF ok
|
1522 |
$importer = ( ! empty ( $this->importers( 'ninja' ) ) ? $this->importers( 'ninja' ) : '' );
|
1523 |
|
1524 |
+
if ( ! empty( $importer ) ):
|
1525 |
+
if ( 'all' !== $importable && '' !== $importable ) {
|
1526 |
|
1527 |
$importable = absint( $importable );
|
1528 |
$imported = $importer->import_form( $importable );
|
1529 |
|
1530 |
+
if ( 'fail' === $imported['type'] ) {
|
|
|
1531 |
wp_send_json_error( $imported['message'] );
|
1532 |
}
|
1533 |
|
1534 |
wp_send_json_success( $imported );
|
1535 |
|
1536 |
+
} elseif ( '' !== $importable ) {
|
|
|
1537 |
$forms = forminator_list_thirdparty_contact_forms( 'ninjaforms' );
|
1538 |
|
1539 |
foreach ($forms as $key => $value) {
|
|
|
1540 |
$imported = $importer->import_form( $value->get_id() );
|
1541 |
|
1542 |
+
if ( 'fail' === $imported['type'] ) {
|
|
|
1543 |
$error = $imported['message'];
|
1544 |
}
|
1545 |
}
|
1546 |
|
1547 |
+
if ( !empty( $error ) ) {
|
1548 |
wp_send_json_error( $error );
|
1549 |
}
|
1550 |
|
1553 |
endif;
|
1554 |
|
1555 |
wp_send_json_error( __( 'Could not import the forms. Check if the selected form plugin is active', Forminator::DOMAIN ) );
|
|
|
1556 |
}
|
1557 |
|
1558 |
/**
|
1589 |
$importable = isset( $post_data['gravityforms'] ) ? $post_data['gravityforms'] : '';// wpcs: CSRF ok
|
1590 |
$importer = ( ! empty ( $this->importers( 'gravity' ) ) ? $this->importers( 'gravity' ) : '' );
|
1591 |
|
1592 |
+
if ( ! empty( $importer ) ):
|
1593 |
+
if ( 'all' !== $importable && '' !== $importable ) {
|
1594 |
|
1595 |
$importable = absint( $importable );
|
1596 |
$imported = $importer->import_form( $importable );
|
1597 |
|
1598 |
+
if ( 'fail' === $imported['type'] ) {
|
|
|
1599 |
wp_send_json_error( $imported['message'] );
|
1600 |
}
|
1601 |
|
1602 |
wp_send_json_success( $imported );
|
1603 |
|
1604 |
+
} elseif ( '' !== $importable ) {
|
|
|
1605 |
$forms = forminator_list_thirdparty_contact_forms( 'gravityforms' );
|
1606 |
|
1607 |
foreach ($forms as $key => $value) {
|
|
|
1608 |
$imported = $importer->import_form( $value['id'] );
|
1609 |
|
1610 |
+
if ( 'fail' === $imported['type'] ) {
|
|
|
1611 |
$error = $imported['message'];
|
1612 |
}
|
1613 |
}
|
1614 |
|
1615 |
+
if ( !empty( $error ) ) {
|
1616 |
wp_send_json_error( $error );
|
1617 |
}
|
1618 |
|
admin/classes/class-admin-data.php
CHANGED
@@ -68,25 +68,10 @@ class Forminator_Admin_Data {
|
|
68 |
* @return mixed
|
69 |
*/
|
70 |
public function get_pages() {
|
71 |
-
$
|
72 |
-
|
73 |
-
|
74 |
-
|
75 |
-
'exclude' => '',
|
76 |
-
'include' => '',
|
77 |
-
'meta_key' => '',
|
78 |
-
'meta_value' => '',
|
79 |
-
'authors' => '',
|
80 |
-
'child_of' => 0,
|
81 |
-
'parent' => -1,
|
82 |
-
'exclude_tree' => '',
|
83 |
-
'number' => '',
|
84 |
-
'offset' => 0,
|
85 |
-
'post_type' => 'page',
|
86 |
-
'post_status' => 'publish'
|
87 |
-
);
|
88 |
-
|
89 |
-
$pages = get_pages($args);
|
90 |
|
91 |
return $pages;
|
92 |
}
|
@@ -121,7 +106,13 @@ class Forminator_Admin_Data {
|
|
121 |
'formNonce' => $this->get_nonce(),
|
122 |
'searchNonce' => wp_create_nonce( 'forminator_search_emails' ),
|
123 |
'gFontNonce' => wp_create_nonce( 'forminator_load_google_fonts' ),
|
124 |
-
'dismissNonce'
|
|
|
|
|
|
|
|
|
|
|
|
|
125 |
'addons_enabled' => Forminator::is_addons_feature_enabled(),
|
126 |
'pluginUrl' => forminator_plugin_url(),
|
127 |
'imagesUrl' => forminator_plugin_url() . '/assets/images',
|
68 |
* @return mixed
|
69 |
*/
|
70 |
public function get_pages() {
|
71 |
+
global $wpdb;
|
72 |
+
|
73 |
+
$sql = "SELECT ID, post_title FROM {$wpdb->posts} WHERE post_type = 'page' AND post_status = 'publish' ORDER BY post_title ASC";
|
74 |
+
$pages = $wpdb->get_results( $sql );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
75 |
|
76 |
return $pages;
|
77 |
}
|
106 |
'formNonce' => $this->get_nonce(),
|
107 |
'searchNonce' => wp_create_nonce( 'forminator_search_emails' ),
|
108 |
'gFontNonce' => wp_create_nonce( 'forminator_load_google_fonts' ),
|
109 |
+
'dismissNonce' => wp_create_nonce( 'forminator_dismiss_notification' ),
|
110 |
+
'formProcessNonce' => wp_create_nonce( 'forminatorCustomFormRequest' ),
|
111 |
+
'formExportNonce' => wp_create_nonce( 'forminator_popup_export_cform' ),
|
112 |
+
'pollProcessNonce' => wp_create_nonce( 'forminatorPollFormRequest' ),
|
113 |
+
'pollExportNonce' => wp_create_nonce( 'forminator_popup_export_poll' ),
|
114 |
+
'quizProcessNonce' => wp_create_nonce( 'forminatorQuizFormRequest' ),
|
115 |
+
'quizExportNonce' => wp_create_nonce( 'forminator_popup_export_quiz' ),
|
116 |
'addons_enabled' => Forminator::is_addons_feature_enabled(),
|
117 |
'pluginUrl' => forminator_plugin_url(),
|
118 |
'imagesUrl' => forminator_plugin_url() . '/assets/images',
|
admin/classes/class-admin-l10n.php
CHANGED
@@ -87,6 +87,11 @@ class Forminator_Admin_L10n {
|
|
87 |
"are_you_sure" => __( "Are you sure?", Forminator::DOMAIN ),
|
88 |
"cannot_be_reverted" => __( "Have in mind this action cannot be reverted.", Forminator::DOMAIN ),
|
89 |
"are_you_sure_form" => __( "Are you sure you wish to permanently delete this form?", Forminator::DOMAIN ),
|
|
|
|
|
|
|
|
|
|
|
90 |
"confirm_action" => __( "Please confirm that you want to do this action.", Forminator::DOMAIN ),
|
91 |
"confirm_title" => __( "Confirm Action", Forminator::DOMAIN ),
|
92 |
"confirm_field_delete" => __( "Please confirm that you want to delete this field", Forminator::DOMAIN ),
|
@@ -115,7 +120,8 @@ class Forminator_Admin_L10n {
|
|
115 |
"enter_name" => __( 'Enter a name', Forminator::DOMAIN ),
|
116 |
"new_form_desc2" => __( 'Name your new form, then let\'s start building!', Forminator::DOMAIN ),
|
117 |
"new_poll_desc2" => __( 'Name your new poll, then let\'s start building!', Forminator::DOMAIN ),
|
118 |
-
"new_quiz_desc2" => __( 'Choose
|
|
|
119 |
"input_label" => __( 'Input Label', Forminator::DOMAIN ),
|
120 |
"form_name_validation" => __( 'Form name cannot be empty.', Forminator::DOMAIN ),
|
121 |
"poll_name_validation" => __( 'Poll name cannot be empty.', Forminator::DOMAIN ),
|
@@ -134,13 +140,19 @@ class Forminator_Admin_L10n {
|
|
134 |
'login_name' => __( 'User Login', Forminator::DOMAIN ),
|
135 |
),
|
136 |
'quiz' => array(
|
137 |
-
'choose_quiz_title' => __( '
|
138 |
-
'choose_quiz_description' => __( "Let's start by choosing
|
|
|
|
|
|
|
139 |
'knowledge_label' => __( 'Knowledge Quiz', Forminator::DOMAIN ),
|
140 |
'knowledge_description' => __( 'Test the knowledge of your visitors on a subject and final score is calculated based on number of right answers. E.g. Test your music knowledge.', Forminator::DOMAIN ),
|
141 |
'nowrong_label' => __( 'Personality Quiz', Forminator::DOMAIN ),
|
142 |
'nowrong_description' => __( "Show different outcomes depending on the visitor's answers. There are no wrong answers. E.g. Which superhero are you?", Forminator::DOMAIN ),
|
143 |
'continue_button' => __( 'Continue', Forminator::DOMAIN ),
|
|
|
|
|
|
|
144 |
),
|
145 |
'form' => array(
|
146 |
'form_template_title' => __( 'Choose a template', Forminator::DOMAIN ),
|
@@ -228,6 +240,7 @@ class Forminator_Admin_L10n {
|
|
228 |
'user_email' => __( 'User Email', Forminator::DOMAIN ),
|
229 |
'user_login' => __( 'User Login', Forminator::DOMAIN ),
|
230 |
'shortcode_copied' => __( 'Shortcode has been copied successfully.', Forminator::DOMAIN ),
|
|
|
231 |
),
|
232 |
"commons" => array(
|
233 |
"color" => __( "Color", Forminator::DOMAIN ),
|
87 |
"are_you_sure" => __( "Are you sure?", Forminator::DOMAIN ),
|
88 |
"cannot_be_reverted" => __( "Have in mind this action cannot be reverted.", Forminator::DOMAIN ),
|
89 |
"are_you_sure_form" => __( "Are you sure you wish to permanently delete this form?", Forminator::DOMAIN ),
|
90 |
+
"are_you_sure_poll" => __( "Are you sure you wish to permanently delete this poll?", Forminator::DOMAIN ),
|
91 |
+
"are_you_sure_quiz" => __( "Are you sure you wish to permanently delete this quiz?", Forminator::DOMAIN ),
|
92 |
+
"delete_form" => __( "Delete Form", Forminator::DOMAIN ),
|
93 |
+
"delete_poll" => __( "Delete Poll", Forminator::DOMAIN ),
|
94 |
+
"delete_quiz" => __( "Delete Quiz", Forminator::DOMAIN ),
|
95 |
"confirm_action" => __( "Please confirm that you want to do this action.", Forminator::DOMAIN ),
|
96 |
"confirm_title" => __( "Confirm Action", Forminator::DOMAIN ),
|
97 |
"confirm_field_delete" => __( "Please confirm that you want to delete this field", Forminator::DOMAIN ),
|
120 |
"enter_name" => __( 'Enter a name', Forminator::DOMAIN ),
|
121 |
"new_form_desc2" => __( 'Name your new form, then let\'s start building!', Forminator::DOMAIN ),
|
122 |
"new_poll_desc2" => __( 'Name your new poll, then let\'s start building!', Forminator::DOMAIN ),
|
123 |
+
"new_quiz_desc2" => __( 'Choose whether you want to collect participants details (e.g. name, email, etc.) on your quiz.'),
|
124 |
+
"learn_more" => __( 'Learn more', Forminator::DOMAIN ),
|
125 |
"input_label" => __( 'Input Label', Forminator::DOMAIN ),
|
126 |
"form_name_validation" => __( 'Form name cannot be empty.', Forminator::DOMAIN ),
|
127 |
"poll_name_validation" => __( 'Poll name cannot be empty.', Forminator::DOMAIN ),
|
140 |
'login_name' => __( 'User Login', Forminator::DOMAIN ),
|
141 |
),
|
142 |
'quiz' => array(
|
143 |
+
'choose_quiz_title' => __( 'Create Quiz', Forminator::DOMAIN ),
|
144 |
+
'choose_quiz_description' => __( "Let's start by giving your quiz a name and choosing the appropriate quiz type based on your goal.", Forminator::DOMAIN ),
|
145 |
+
'quiz_name' => __( "Quiz Name", Forminator::DOMAIN ),
|
146 |
+
'quiz_type' => __( "Quiz Type", Forminator::DOMAIN ),
|
147 |
+
'collect_leads' => __( "Collect Leads", Forminator::DOMAIN ),
|
148 |
'knowledge_label' => __( 'Knowledge Quiz', Forminator::DOMAIN ),
|
149 |
'knowledge_description' => __( 'Test the knowledge of your visitors on a subject and final score is calculated based on number of right answers. E.g. Test your music knowledge.', Forminator::DOMAIN ),
|
150 |
'nowrong_label' => __( 'Personality Quiz', Forminator::DOMAIN ),
|
151 |
'nowrong_description' => __( "Show different outcomes depending on the visitor's answers. There are no wrong answers. E.g. Which superhero are you?", Forminator::DOMAIN ),
|
152 |
'continue_button' => __( 'Continue', Forminator::DOMAIN ),
|
153 |
+
'quiz_leads_toggle' => __( 'Collect leads on your quiz', Forminator::DOMAIN ),
|
154 |
+
'create_quiz' => __( 'Create Quiz', Forminator::DOMAIN ),
|
155 |
+
'quiz_leads_desc' => __( 'We will automatically create a default lead generation form for you. The lead generation form uses the Forms module, and some of the settings are shared between this quiz and the leads form.')
|
156 |
),
|
157 |
'form' => array(
|
158 |
'form_template_title' => __( 'Choose a template', Forminator::DOMAIN ),
|
240 |
'user_email' => __( 'User Email', Forminator::DOMAIN ),
|
241 |
'user_login' => __( 'User Login', Forminator::DOMAIN ),
|
242 |
'shortcode_copied' => __( 'Shortcode has been copied successfully.', Forminator::DOMAIN ),
|
243 |
+
'uri_copied' => __( 'URI has been copied successfully.', Forminator::DOMAIN ),
|
244 |
),
|
245 |
"commons" => array(
|
246 |
"color" => __( "Color", Forminator::DOMAIN ),
|
admin/classes/thirdparty-importers/class-importer-cf7.php
CHANGED
@@ -80,6 +80,7 @@ class Forminator_Admin_Import_CF7 extends Forminator_Import_Mediator {
|
|
80 |
$count = array();
|
81 |
$new_fields = array();
|
82 |
$settings = array(
|
|
|
83 |
'pagination-header' => 'nav',
|
84 |
'form-border-style' => 'solid',
|
85 |
'form-padding' => '',
|
80 |
$count = array();
|
81 |
$new_fields = array();
|
82 |
$settings = array(
|
83 |
+
'form-type' => 'default',
|
84 |
'pagination-header' => 'nav',
|
85 |
'form-border-style' => 'solid',
|
86 |
'form-padding' => '',
|
admin/classes/thirdparty-importers/class-importer-gravity.php
CHANGED
@@ -37,8 +37,7 @@ class Forminator_Admin_Import_Gravity extends Forminator_Import_Mediator {
|
|
37 |
* @since 1.7
|
38 |
* @return array Form import message
|
39 |
*/
|
40 |
-
public function import_form( $id ){
|
41 |
-
|
42 |
$form = GFAPI::get_form( $id );
|
43 |
$form_fields = $form['fields'];
|
44 |
$notifications = $form['notifications'];
|
@@ -52,9 +51,9 @@ class Forminator_Admin_Import_Gravity extends Forminator_Import_Mediator {
|
|
52 |
foreach ( $form_fields as $mkey => $field ) {
|
53 |
|
54 |
$type = $this->get_thirdparty_field_type( $field['type'] );
|
55 |
-
if( '' === $type ) continue;
|
56 |
|
57 |
-
if( isset( $count[ $type ] ) && $count[ $type ] > 0 ){
|
58 |
$count[ $type ] = $count[ $type ] + 1;
|
59 |
} else {
|
60 |
$count[ $type ] = 1;
|
@@ -64,8 +63,7 @@ class Forminator_Admin_Import_Gravity extends Forminator_Import_Mediator {
|
|
64 |
$field_options = array();
|
65 |
$wrapper = 'wrapper-' . $this->random_wrapper_int() . '-' . $this->random_wrapper_int();
|
66 |
|
67 |
-
if( !empty( $options ) ){
|
68 |
-
|
69 |
foreach ( $options as $key => $option) {
|
70 |
$field_options[] = array(
|
71 |
'label' => esc_html( $option['text'] ),
|
@@ -88,31 +86,29 @@ class Forminator_Admin_Import_Gravity extends Forminator_Import_Mediator {
|
|
88 |
'placeholder' => esc_html( $field['placeholder'] ),
|
89 |
);
|
90 |
|
91 |
-
if( 'address' === $type ){
|
92 |
-
foreach ($field['inputs'] as $key => $input) {
|
93 |
-
if( '4.1' === $input['id'] ){
|
94 |
$new_fields[$mkey]['street_address'] = ! isset ( $input['isHidden'] );
|
95 |
-
}elseif( '4.2' === $input['id'] ){
|
96 |
$new_fields[$mkey]['address_line'] = ! isset ( $input['isHidden'] );
|
97 |
-
}elseif( '4.3' === $input['id'] ){
|
98 |
$new_fields[$mkey]['address_city'] = ! isset ( $input['isHidden'] );
|
99 |
-
}elseif( '4.4' === $input['id'] ){
|
100 |
$new_fields[$mkey]['address_state'] = ! isset ( $input['isHidden'] );
|
101 |
-
}elseif( '4.5' === $input['id'] ){
|
102 |
$new_fields[$mkey]['address_zip'] = ! isset ( $input['isHidden'] );
|
103 |
-
}elseif( '4.6' === $input['id'] ){
|
104 |
$new_fields[$mkey]['address_country'] = ! isset ( $input['isHidden'] );
|
105 |
}
|
106 |
}
|
107 |
-
|
108 |
}
|
109 |
|
110 |
-
if( 'multiselect' === $field['type'] ){
|
111 |
-
|
112 |
$new_fields[$mkey]['value_type'] = 'multiselect';
|
113 |
}
|
114 |
|
115 |
-
if( 'page' === $field['type'] ){
|
116 |
$new_fields[$mkey]['btn_left'] = $field['previousButton']['text'];
|
117 |
$new_fields[$mkey]['btn_right'] = $field['nextButton']['text'];
|
118 |
}
|
@@ -126,54 +122,38 @@ class Forminator_Admin_Import_Gravity extends Forminator_Import_Mediator {
|
|
126 |
$settings['use-user-email'] = false;
|
127 |
|
128 |
//form actions
|
129 |
-
if( ! empty( $notifications ) ){
|
130 |
-
|
131 |
-
foreach ($notifications as $key => $action) {
|
132 |
|
133 |
-
|
134 |
|
135 |
-
|
136 |
|
|
|
137 |
$settings['use-admin-email'] = true;
|
138 |
$settings['admin-email-title'] = ( isset( $action['subject'] ) ? $this->replace_invalid_tags( $action['subject'], $tags ) : '' );
|
139 |
-
|
140 |
$settings['admin-email-editor'] = ( isset( $action['message'] ) ? $this->replace_invalid_tags( $action['message'], $tags ) : '' );
|
141 |
-
|
142 |
$settings['admin-email-from-name'] = ( isset( $action['fromName'] ) ? $this->replace_invalid_tags( $action['fromName'], $tags ) : '' );
|
143 |
-
|
144 |
$settings['admin-email-recipients'] = get_bloginfo( 'admin_email' );
|
145 |
-
|
146 |
$settings['admin-email-bcc-address'] = ( isset( $action['bcc'] ) ? $this->replace_invalid_tags( $action['bcc'], $tags ) : '' );
|
147 |
-
|
148 |
$settings['admin-email-cc-address'] = ( isset( $action['cc'] ) ? $this->replace_invalid_tags( $action['cc'], $tags ) : '' );
|
149 |
-
|
150 |
$settings['admin-email-reply-to-address'] = ( isset( $action['replyTo'] ) ? $this->replace_invalid_tags( $action['replyTo'], $tags ) : '' );
|
151 |
-
|
152 |
-
}elseif( isset( $action['to'] ) && '{admin_email}' !== $action['to'] && false === $settings['use-user-email'] ){
|
153 |
-
|
154 |
$settings['use-user-email'] = true;
|
155 |
-
|
156 |
$settings['user-email-title'] = ( isset( $action['subject'] ) ? $this->replace_invalid_tags( $action['subject'], $tags ) : '' );
|
157 |
-
|
158 |
$settings['user-email-editor'] = ( isset( $action['message'] ) ? $this->replace_invalid_tags( $action['message'], $tags ) : '' );
|
159 |
-
|
160 |
$settings['user-email-from-name'] = ( isset( $action['fromName'] ) ? $this->replace_invalid_tags( $action['fromName'], $tags ) : '' );
|
161 |
-
|
162 |
$settings['user-email-recipients'] = ( isset( $action['to'] ) ? $this->replace_invalid_tags( $action['to'], $tags ) : '' );
|
163 |
-
|
164 |
$settings['user-email-bcc-address'] = ( isset( $action['bcc'] ) ? $this->replace_invalid_tags( $action['bcc'], $tags ) : '' );
|
165 |
-
|
166 |
$settings['user-email-cc-address'] = ( isset( $action['cc'] ) ? $this->replace_invalid_tags( $action['cc'], $tags ) : '' );
|
167 |
-
|
168 |
$settings['user-email-reply-to-address'] = ( isset( $action['replyTo'] ) ? $this->replace_invalid_tags( $action['replyTo'], $tags ) : '' );
|
169 |
}
|
170 |
}
|
171 |
}
|
172 |
}//end settings loop
|
173 |
|
174 |
-
$action = ( !empty( $confirmations ) ? current( $confirmations ) : '' );
|
175 |
|
176 |
-
if( ! empty( $action ) && isset( $action['type'] ) ){
|
177 |
switch ( $action['type'] ) {
|
178 |
case 'page':
|
179 |
case 'redirect':
|
37 |
* @since 1.7
|
38 |
* @return array Form import message
|
39 |
*/
|
40 |
+
public function import_form( $id ) {
|
|
|
41 |
$form = GFAPI::get_form( $id );
|
42 |
$form_fields = $form['fields'];
|
43 |
$notifications = $form['notifications'];
|
51 |
foreach ( $form_fields as $mkey => $field ) {
|
52 |
|
53 |
$type = $this->get_thirdparty_field_type( $field['type'] );
|
54 |
+
if ( '' === $type ) continue;
|
55 |
|
56 |
+
if ( isset( $count[ $type ] ) && $count[ $type ] > 0 ) {
|
57 |
$count[ $type ] = $count[ $type ] + 1;
|
58 |
} else {
|
59 |
$count[ $type ] = 1;
|
63 |
$field_options = array();
|
64 |
$wrapper = 'wrapper-' . $this->random_wrapper_int() . '-' . $this->random_wrapper_int();
|
65 |
|
66 |
+
if ( !empty( $options ) ) {
|
|
|
67 |
foreach ( $options as $key => $option) {
|
68 |
$field_options[] = array(
|
69 |
'label' => esc_html( $option['text'] ),
|
86 |
'placeholder' => esc_html( $field['placeholder'] ),
|
87 |
);
|
88 |
|
89 |
+
if ( 'address' === $type ) {
|
90 |
+
foreach ( $field['inputs'] as $key => $input ) {
|
91 |
+
if( '4.1' === $input['id'] ) {
|
92 |
$new_fields[$mkey]['street_address'] = ! isset ( $input['isHidden'] );
|
93 |
+
} elseif ( '4.2' === $input['id'] ) {
|
94 |
$new_fields[$mkey]['address_line'] = ! isset ( $input['isHidden'] );
|
95 |
+
} elseif ( '4.3' === $input['id'] ) {
|
96 |
$new_fields[$mkey]['address_city'] = ! isset ( $input['isHidden'] );
|
97 |
+
} elseif ( '4.4' === $input['id'] ) {
|
98 |
$new_fields[$mkey]['address_state'] = ! isset ( $input['isHidden'] );
|
99 |
+
} elseif ( '4.5' === $input['id'] ) {
|
100 |
$new_fields[$mkey]['address_zip'] = ! isset ( $input['isHidden'] );
|
101 |
+
} elseif ( '4.6' === $input['id'] ) {
|
102 |
$new_fields[$mkey]['address_country'] = ! isset ( $input['isHidden'] );
|
103 |
}
|
104 |
}
|
|
|
105 |
}
|
106 |
|
107 |
+
if ( 'multiselect' === $field['type'] ) {
|
|
|
108 |
$new_fields[$mkey]['value_type'] = 'multiselect';
|
109 |
}
|
110 |
|
111 |
+
if ( 'page' === $field['type'] ) {
|
112 |
$new_fields[$mkey]['btn_left'] = $field['previousButton']['text'];
|
113 |
$new_fields[$mkey]['btn_right'] = $field['nextButton']['text'];
|
114 |
}
|
122 |
$settings['use-user-email'] = false;
|
123 |
|
124 |
//form actions
|
125 |
+
if ( ! empty( $notifications ) ) {
|
|
|
|
|
126 |
|
127 |
+
foreach ( $notifications as $key => $action ) {
|
128 |
|
129 |
+
if ( 'email' === $action['toType'] ) {
|
130 |
|
131 |
+
if ( isset( $action['to'] ) && '{admin_email}' === $action['to'] && false === $settings['use-admin-email'] ) {
|
132 |
$settings['use-admin-email'] = true;
|
133 |
$settings['admin-email-title'] = ( isset( $action['subject'] ) ? $this->replace_invalid_tags( $action['subject'], $tags ) : '' );
|
|
|
134 |
$settings['admin-email-editor'] = ( isset( $action['message'] ) ? $this->replace_invalid_tags( $action['message'], $tags ) : '' );
|
|
|
135 |
$settings['admin-email-from-name'] = ( isset( $action['fromName'] ) ? $this->replace_invalid_tags( $action['fromName'], $tags ) : '' );
|
|
|
136 |
$settings['admin-email-recipients'] = get_bloginfo( 'admin_email' );
|
|
|
137 |
$settings['admin-email-bcc-address'] = ( isset( $action['bcc'] ) ? $this->replace_invalid_tags( $action['bcc'], $tags ) : '' );
|
|
|
138 |
$settings['admin-email-cc-address'] = ( isset( $action['cc'] ) ? $this->replace_invalid_tags( $action['cc'], $tags ) : '' );
|
|
|
139 |
$settings['admin-email-reply-to-address'] = ( isset( $action['replyTo'] ) ? $this->replace_invalid_tags( $action['replyTo'], $tags ) : '' );
|
140 |
+
} elseif ( isset( $action['to'] ) && '{admin_email}' !== $action['to'] && false === $settings['use-user-email'] ) {
|
|
|
|
|
141 |
$settings['use-user-email'] = true;
|
|
|
142 |
$settings['user-email-title'] = ( isset( $action['subject'] ) ? $this->replace_invalid_tags( $action['subject'], $tags ) : '' );
|
|
|
143 |
$settings['user-email-editor'] = ( isset( $action['message'] ) ? $this->replace_invalid_tags( $action['message'], $tags ) : '' );
|
|
|
144 |
$settings['user-email-from-name'] = ( isset( $action['fromName'] ) ? $this->replace_invalid_tags( $action['fromName'], $tags ) : '' );
|
|
|
145 |
$settings['user-email-recipients'] = ( isset( $action['to'] ) ? $this->replace_invalid_tags( $action['to'], $tags ) : '' );
|
|
|
146 |
$settings['user-email-bcc-address'] = ( isset( $action['bcc'] ) ? $this->replace_invalid_tags( $action['bcc'], $tags ) : '' );
|
|
|
147 |
$settings['user-email-cc-address'] = ( isset( $action['cc'] ) ? $this->replace_invalid_tags( $action['cc'], $tags ) : '' );
|
|
|
148 |
$settings['user-email-reply-to-address'] = ( isset( $action['replyTo'] ) ? $this->replace_invalid_tags( $action['replyTo'], $tags ) : '' );
|
149 |
}
|
150 |
}
|
151 |
}
|
152 |
}//end settings loop
|
153 |
|
154 |
+
$action = ( ! empty( $confirmations ) ? current( $confirmations ) : '' );
|
155 |
|
156 |
+
if ( ! empty( $action ) && isset( $action['type'] ) ) {
|
157 |
switch ( $action['type'] ) {
|
158 |
case 'page':
|
159 |
case 'redirect':
|
admin/classes/thirdparty-importers/class-importer-ninja.php
CHANGED
@@ -38,9 +38,8 @@ class Forminator_Admin_Import_Ninja extends Forminator_Import_Mediator {
|
|
38 |
* @since 1.7
|
39 |
* @return bool
|
40 |
*/
|
41 |
-
public function ninja_multipart(){
|
42 |
-
|
43 |
-
if( class_exists( 'NF_MultiPart' ) )
|
44 |
return true;
|
45 |
|
46 |
return false;
|
@@ -60,8 +59,7 @@ class Forminator_Admin_Import_Ninja extends Forminator_Import_Mediator {
|
|
60 |
* @since 1.7
|
61 |
* @return array Form import message
|
62 |
*/
|
63 |
-
public function import_form( $id ){
|
64 |
-
|
65 |
$form = Ninja_Forms()->form( $id );
|
66 |
$form_fields = $form->get_fields();
|
67 |
$actions = $form->get_actions();
|
@@ -75,7 +73,7 @@ class Forminator_Admin_Import_Ninja extends Forminator_Import_Mediator {
|
|
75 |
$mkey = 0;
|
76 |
|
77 |
//multipart
|
78 |
-
if( $this->ninja_multipart() && isset( $pagination[0]['formContentData'] ) ){
|
79 |
$page_total = count( $pagination );
|
80 |
foreach ($pagination as $key => $value) {
|
81 |
$page_key = call_user_func( 'end', array_values( $value['formContentData'] ) );
|
@@ -87,20 +85,14 @@ class Forminator_Admin_Import_Ninja extends Forminator_Import_Mediator {
|
|
87 |
foreach ( $form_fields as $key => $field ) {
|
88 |
|
89 |
$type = $this->get_thirdparty_field_type( $field->get_setting( 'type' ) );
|
90 |
-
if( '' === $type ) continue;
|
91 |
-
|
92 |
-
if( 'submit' === $type ){
|
93 |
|
|
|
94 |
$submit_label = esc_html( $field->get_setting( 'label' ) );
|
95 |
-
|
96 |
} else {
|
97 |
-
|
98 |
-
if( isset( $count[ $type ] ) && $count[ $type ] > 0 ){
|
99 |
-
|
100 |
$count[ $type ] = $count[ $type ] + 1;
|
101 |
-
|
102 |
} else {
|
103 |
-
|
104 |
$count[ $type ] = 1;
|
105 |
}
|
106 |
|
@@ -108,10 +100,8 @@ class Forminator_Admin_Import_Ninja extends Forminator_Import_Mediator {
|
|
108 |
$field_options = array();
|
109 |
$wrapper = 'wrapper-' . $this->random_wrapper_int() . '-' . $this->random_wrapper_int();
|
110 |
|
111 |
-
if( !empty( $options ) ){
|
112 |
-
|
113 |
foreach ( $options as $key => $option) {
|
114 |
-
|
115 |
$field_options[] = array(
|
116 |
'label' => esc_html( $option['label'] ),
|
117 |
'value' => esc_html( $option['value'] ),
|
@@ -133,33 +123,24 @@ class Forminator_Admin_Import_Ninja extends Forminator_Import_Mediator {
|
|
133 |
'placeholder' => $field->get_setting( 'placeholder' ),
|
134 |
);
|
135 |
|
136 |
-
if( 'address' === $type ){
|
137 |
-
|
138 |
-
if( 'address' === $field->get_setting('type') ){
|
139 |
-
|
140 |
$new_fields[$mkey]['street_address'] = true;
|
141 |
$new_fields[$mkey]['address_city'] = true;
|
142 |
$new_fields[$mkey]['address_state'] = true;
|
143 |
$new_fields[$mkey]['address_zip'] = true;
|
144 |
$new_fields[$mkey]['address_country'] = true;
|
145 |
$new_fields[$mkey]['address_line'] = true;
|
146 |
-
|
147 |
-
} elseif( 'city' === $field->get_setting('type') ) {
|
148 |
-
|
149 |
$new_fields[$mkey]['address_city'] = true;
|
150 |
-
|
151 |
-
} elseif( 'zip' === $field->get_setting('type') ) {
|
152 |
-
|
153 |
$new_fields[$mkey]['address_zip'] = true;
|
154 |
-
|
155 |
-
} elseif( 'country' === $field->get_setting('type') ) {
|
156 |
-
|
157 |
$new_fields[$mkey]['address_country'] = true;
|
158 |
}
|
159 |
}
|
160 |
|
161 |
-
if( 'multiselect' === $type ){
|
162 |
-
|
163 |
$new_fields[$mkey]['value_type'] = 'multiselect';
|
164 |
}
|
165 |
}
|
@@ -167,8 +148,7 @@ class Forminator_Admin_Import_Ninja extends Forminator_Import_Mediator {
|
|
167 |
$tag_key = $field->get_setting('key');
|
168 |
$tags["{$tag_key}"] = "{$new_fields[$mkey]['element_id']}";
|
169 |
|
170 |
-
if( isset( $page["{$tag_key}"] ) && $page["{$tag_key}"] < $page_total ){
|
171 |
-
|
172 |
$mkey++;
|
173 |
$element_key = $page["{$tag_key}"];
|
174 |
|
@@ -178,7 +158,6 @@ class Forminator_Admin_Import_Ninja extends Forminator_Import_Mediator {
|
|
178 |
'cols' => 12,
|
179 |
'wrapper_id' => 'wrapper-' . $this->random_wrapper_int() . '-' . $this->random_wrapper_int(),
|
180 |
);
|
181 |
-
|
182 |
}
|
183 |
|
184 |
$mkey++;
|
@@ -188,45 +167,38 @@ class Forminator_Admin_Import_Ninja extends Forminator_Import_Mediator {
|
|
188 |
$settings['use-user-email'] = false;
|
189 |
|
190 |
//form actions
|
191 |
-
foreach ($actions as $key => $action) {
|
192 |
$action = $action->get_settings();
|
193 |
$active = filter_var( $action['active'], FILTER_VALIDATE_BOOLEAN );
|
194 |
|
195 |
-
if( false === $active ) continue;
|
196 |
|
197 |
-
if( 'email' === $action['type'] ){
|
198 |
|
199 |
//admin email detection.
|
200 |
-
if( isset( $action['to'] ) && '{system:admin_email}' === $action['to'] && false === $settings['use-admin-email'] ){
|
201 |
-
|
202 |
$settings['use-admin-email'] = true;
|
203 |
$settings['admin-email-title'] = $this->replace_invalid_tags( $action['email_subject'], $tags );
|
204 |
$settings['admin-email-editor'] = $this->replace_invalid_tags( $action['email_message'], $tags );
|
205 |
$settings['admin-email-from-name'] = $this->replace_invalid_tags( $action['reply_to'], $tags );
|
206 |
$settings['admin-email-recipients'] = get_bloginfo( 'admin_email' );
|
207 |
-
|
208 |
}
|
209 |
|
210 |
//get the first user notification action
|
211 |
-
if( isset( $action['to'] ) && '{system:admin_email}' !== $action['to'] && false === $settings['use-user-email'] ){
|
212 |
-
|
213 |
$settings['use-user-email'] = true;
|
214 |
$settings['user-email-title'] = $this->replace_invalid_tags( $action['email_subject'], $tags );
|
215 |
$settings['user-email-editor'] = $this->replace_invalid_tags( $action['email_message'], $tags );
|
216 |
$settings['user-email-from-name'] = $this->replace_invalid_tags( $action['reply_to'], $tags );
|
217 |
$settings['user-email-recipients'] = $this->replace_invalid_tags( $action['to'], $tags );
|
218 |
-
|
219 |
}
|
220 |
-
}
|
221 |
-
elseif( 'redirect' === $action['type'] ){
|
222 |
$settings['submission-behaviour'] = 'behaviour-redirect';
|
223 |
$settings['redirect-url'] = $action['redirect_url'];
|
224 |
-
}
|
225 |
-
elseif( 'successmessage' === $action['type'] && ! isset( $settings['submission-behaviour'] ) ){
|
226 |
$settings['submission-behaviour'] = 'behaviour-thankyou';
|
227 |
$settings['thankyou-message'] = $action['message'];
|
228 |
-
}
|
229 |
-
elseif( 'save' === $action['type'] ){
|
230 |
$settings['store'] = $action['active'];
|
231 |
}
|
232 |
}//endforeach form actions
|
@@ -248,5 +220,4 @@ class Forminator_Admin_Import_Ninja extends Forminator_Import_Mediator {
|
|
248 |
|
249 |
return $import;
|
250 |
}
|
251 |
-
|
252 |
}
|
38 |
* @since 1.7
|
39 |
* @return bool
|
40 |
*/
|
41 |
+
public function ninja_multipart() {
|
42 |
+
if ( class_exists( 'NF_MultiPart' ) )
|
|
|
43 |
return true;
|
44 |
|
45 |
return false;
|
59 |
* @since 1.7
|
60 |
* @return array Form import message
|
61 |
*/
|
62 |
+
public function import_form( $id ) {
|
|
|
63 |
$form = Ninja_Forms()->form( $id );
|
64 |
$form_fields = $form->get_fields();
|
65 |
$actions = $form->get_actions();
|
73 |
$mkey = 0;
|
74 |
|
75 |
//multipart
|
76 |
+
if ( $this->ninja_multipart() && isset( $pagination[0]['formContentData'] ) ) {
|
77 |
$page_total = count( $pagination );
|
78 |
foreach ($pagination as $key => $value) {
|
79 |
$page_key = call_user_func( 'end', array_values( $value['formContentData'] ) );
|
85 |
foreach ( $form_fields as $key => $field ) {
|
86 |
|
87 |
$type = $this->get_thirdparty_field_type( $field->get_setting( 'type' ) );
|
88 |
+
if ( '' === $type ) continue;
|
|
|
|
|
89 |
|
90 |
+
if ( 'submit' === $type ) {
|
91 |
$submit_label = esc_html( $field->get_setting( 'label' ) );
|
|
|
92 |
} else {
|
93 |
+
if ( isset( $count[ $type ] ) && $count[ $type ] > 0 ) {
|
|
|
|
|
94 |
$count[ $type ] = $count[ $type ] + 1;
|
|
|
95 |
} else {
|
|
|
96 |
$count[ $type ] = 1;
|
97 |
}
|
98 |
|
100 |
$field_options = array();
|
101 |
$wrapper = 'wrapper-' . $this->random_wrapper_int() . '-' . $this->random_wrapper_int();
|
102 |
|
103 |
+
if ( !empty( $options ) ) {
|
|
|
104 |
foreach ( $options as $key => $option) {
|
|
|
105 |
$field_options[] = array(
|
106 |
'label' => esc_html( $option['label'] ),
|
107 |
'value' => esc_html( $option['value'] ),
|
123 |
'placeholder' => $field->get_setting( 'placeholder' ),
|
124 |
);
|
125 |
|
126 |
+
if ( 'address' === $type ) {
|
127 |
+
if ( 'address' === $field->get_setting('type') ) {
|
|
|
|
|
128 |
$new_fields[$mkey]['street_address'] = true;
|
129 |
$new_fields[$mkey]['address_city'] = true;
|
130 |
$new_fields[$mkey]['address_state'] = true;
|
131 |
$new_fields[$mkey]['address_zip'] = true;
|
132 |
$new_fields[$mkey]['address_country'] = true;
|
133 |
$new_fields[$mkey]['address_line'] = true;
|
134 |
+
} elseif ( 'city' === $field->get_setting('type') ) {
|
|
|
|
|
135 |
$new_fields[$mkey]['address_city'] = true;
|
136 |
+
} elseif ( 'zip' === $field->get_setting('type') ) {
|
|
|
|
|
137 |
$new_fields[$mkey]['address_zip'] = true;
|
138 |
+
} elseif ( 'country' === $field->get_setting('type') ) {
|
|
|
|
|
139 |
$new_fields[$mkey]['address_country'] = true;
|
140 |
}
|
141 |
}
|
142 |
|
143 |
+
if ( 'multiselect' === $type ) {
|
|
|
144 |
$new_fields[$mkey]['value_type'] = 'multiselect';
|
145 |
}
|
146 |
}
|
148 |
$tag_key = $field->get_setting('key');
|
149 |
$tags["{$tag_key}"] = "{$new_fields[$mkey]['element_id']}";
|
150 |
|
151 |
+
if ( isset( $page["{$tag_key}"] ) && $page["{$tag_key}"] < $page_total ) {
|
|
|
152 |
$mkey++;
|
153 |
$element_key = $page["{$tag_key}"];
|
154 |
|
158 |
'cols' => 12,
|
159 |
'wrapper_id' => 'wrapper-' . $this->random_wrapper_int() . '-' . $this->random_wrapper_int(),
|
160 |
);
|
|
|
161 |
}
|
162 |
|
163 |
$mkey++;
|
167 |
$settings['use-user-email'] = false;
|
168 |
|
169 |
//form actions
|
170 |
+
foreach ( $actions as $key => $action ) {
|
171 |
$action = $action->get_settings();
|
172 |
$active = filter_var( $action['active'], FILTER_VALIDATE_BOOLEAN );
|
173 |
|
174 |
+
if ( false === $active ) continue;
|
175 |
|
176 |
+
if ( 'email' === $action['type'] ) {
|
177 |
|
178 |
//admin email detection.
|
179 |
+
if ( isset( $action['to'] ) && '{system:admin_email}' === $action['to'] && false === $settings['use-admin-email'] ) {
|
|
|
180 |
$settings['use-admin-email'] = true;
|
181 |
$settings['admin-email-title'] = $this->replace_invalid_tags( $action['email_subject'], $tags );
|
182 |
$settings['admin-email-editor'] = $this->replace_invalid_tags( $action['email_message'], $tags );
|
183 |
$settings['admin-email-from-name'] = $this->replace_invalid_tags( $action['reply_to'], $tags );
|
184 |
$settings['admin-email-recipients'] = get_bloginfo( 'admin_email' );
|
|
|
185 |
}
|
186 |
|
187 |
//get the first user notification action
|
188 |
+
if ( isset( $action['to'] ) && '{system:admin_email}' !== $action['to'] && false === $settings['use-user-email'] ) {
|
|
|
189 |
$settings['use-user-email'] = true;
|
190 |
$settings['user-email-title'] = $this->replace_invalid_tags( $action['email_subject'], $tags );
|
191 |
$settings['user-email-editor'] = $this->replace_invalid_tags( $action['email_message'], $tags );
|
192 |
$settings['user-email-from-name'] = $this->replace_invalid_tags( $action['reply_to'], $tags );
|
193 |
$settings['user-email-recipients'] = $this->replace_invalid_tags( $action['to'], $tags );
|
|
|
194 |
}
|
195 |
+
} elseif ( 'redirect' === $action['type'] ) {
|
|
|
196 |
$settings['submission-behaviour'] = 'behaviour-redirect';
|
197 |
$settings['redirect-url'] = $action['redirect_url'];
|
198 |
+
} elseif ( 'successmessage' === $action['type'] && ! isset( $settings['submission-behaviour'] ) ) {
|
|
|
199 |
$settings['submission-behaviour'] = 'behaviour-thankyou';
|
200 |
$settings['thankyou-message'] = $action['message'];
|
201 |
+
} elseif ( 'save' === $action['type'] ) {
|
|
|
202 |
$settings['store'] = $action['active'];
|
203 |
}
|
204 |
}//endforeach form actions
|
220 |
|
221 |
return $import;
|
222 |
}
|
|
|
223 |
}
|
admin/locale.php
CHANGED
@@ -6,35 +6,35 @@ $forminator_admin_locale = array(
|
|
6 |
"Behaviour" => array( null, __("Behaviour", "forminator" ), ), // src/form/components/appearance.js:113
|
7 |
"User Registration" => array( null, __("User Registration", "forminator" ), ), // src/form/components/appearance.js:121
|
8 |
"User Login" => array( null, __("User Login", "forminator" ), ), // src/form/components/appearance.js:129
|
9 |
-
"Colors" => array( null, __("Colors", "forminator" ), ), // src/form/components/appearance/colors.js:
|
10 |
-
"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:
|
11 |
-
"Use Default Colors" => array( null, __("Use Default Colors", "forminator" ), ), // src/form/components/appearance/colors.js:
|
12 |
-
"Custom" => array( null, __("Custom", "forminator" ), ), // src/form/components/appearance/colors.js:
|
13 |
-
"Element" => array( null, __("Element", "forminator" ), ), // src/form/components/appearance/colors.js:
|
14 |
-
"Form Container" => array( null, __("Form Container", "forminator" ), ), // src/form/components/appearance/colors.js:
|
15 |
-
"Submission Indicator" => array( null, __("Submission Indicator", "forminator" ), ), // src/form/components/appearance/colors.js:
|
16 |
-
"Response Success" => array( null, __("Response Success", "forminator" ), ), // src/form/components/appearance/colors.js:
|
17 |
-
"Successful response message will be displayed after form submission succeeds." => array( null, __("Successful response message will be displayed after form submission succeeds.", "forminator" ), ), // src/form/components/appearance/colors.js:
|
18 |
-
"Response Error" => array( null, __("Response Error", "forminator" ), ), // src/form/components/appearance/colors.js:
|
19 |
-
"Error response message will be displayed after form submission fails." => array( null, __("Error response message will be displayed after form submission fails.", "forminator" ), ), // src/form/components/appearance/colors.js:
|
20 |
-
"Pagination Steps" => array( null, __("Pagination Steps", "forminator" ), ), // src/form/components/appearance/colors.js:
|
21 |
-
"Pagination Progress Bar" => array( null, __("Pagination Progress Bar", "forminator" ), ), // src/form/components/appearance/colors.js:
|
22 |
-
"Fields Basics" => array( null, __("Fields Basics", "forminator" ), ), // src/form/components/appearance/colors.js:
|
23 |
-
"Section" => array( null, __("Section", "forminator" ), ), // src/form/components/appearance/colors.js:
|
24 |
-
"Input and Textarea" => array( null, __("Input and Textarea", "forminator" ), ), // src/form/components/appearance/colors.js:
|
25 |
-
"Input Extras" => array( null, __("Input Extras", "forminator" ), ), // src/form/components/appearance/colors.js:
|
26 |
-
"Radio and Checkbox" => array( null, __("Radio and Checkbox", "forminator" ), ), // src/form/components/appearance/colors.js:
|
27 |
-
"Select" => array( null, __("Select", "forminator" ), ), // src/form/components/appearance/colors.js:
|
28 |
-
"Dropdown List" => array( null, __("Dropdown List", "forminator" ), ), // src/form/components/appearance/colors.js:
|
29 |
-
"Dropdown Search" => array( null, __("Dropdown Search", "forminator" ), ), // src/form/components/appearance/colors.js:
|
30 |
-
"Multi Select" => array( null, __("Multi Select", "forminator" ), ), // src/form/components/appearance/colors.js:
|
31 |
-
"Calendar Basics" => array( null, __("Calendar Basics", "forminator" ), ), // src/form/components/appearance/colors.js:
|
32 |
-
"Calendar Table" => array( null, __("Calendar Table", "forminator" ), ), // src/form/components/appearance/colors.js:
|
33 |
-
"File Upload" => array( null, __("File Upload", "forminator" ), ), // src/form/components/appearance/colors.js:
|
34 |
-
"E-Signature" => array( null, __("E-Signature", "forminator" ), ), // src/form/components/appearance/colors.js:
|
35 |
-
"Button Back" => array( null, __("Button Back", "forminator" ), ), // src/form/components/appearance/colors.js:
|
36 |
-
"Button Next" => array( null, __("Button Next", "forminator" ), ), // src/form/components/appearance/colors.js:
|
37 |
-
"Submit Button" => array( null, __("Submit Button", "forminator" ), ), // src/form/components/appearance/colors.js:
|
38 |
"Container" => array( null, __("Container", "forminator" ), ), // src/form/components/appearance/colors/calendar-basics.js:22
|
39 |
"Border" => array( null, __("Border", "forminator" ), ), // src/form/components/appearance/colors/calendar-basics.js:28
|
40 |
"Header background" => array( null, __("Header background", "forminator" ), ), // src/form/components/appearance/colors/calendar-basics.js:29
|
@@ -83,8 +83,9 @@ $forminator_admin_locale = array(
|
|
83 |
"Message link color" => array( null, __("Message link color", "forminator" ), ), // src/form/components/appearance/colors/file-upload/upload-panel-multiple.js:63
|
84 |
"Drop" => array( null, __("Drop", "forminator" ), ), // src/form/components/appearance/colors/file-upload/upload-panel-multiple.js:107
|
85 |
"Left border color" => array( null, __("Left border color", "forminator" ), ), // src/form/components/appearance/colors/file-upload/upload-panel-multiple.js:158
|
86 |
-
"
|
87 |
-
"
|
|
|
88 |
"Placeholder" => array( null, __("Placeholder", "forminator" ), ), // src/form/components/appearance/colors/inputs.js:44
|
89 |
"Option border" => array( null, __("Option border", "forminator" ), ), // src/form/components/appearance/colors/multi-select.js:32
|
90 |
"Label color" => array( null, __("Label color", "forminator" ), ), // src/form/components/appearance/colors/pagination-back.js:33
|
@@ -117,26 +118,27 @@ $forminator_admin_locale = array(
|
|
117 |
"Text" => array( null, __("Text", "forminator" ), ), // src/form/components/appearance/design/bold.js:20
|
118 |
"Button" => array( null, __("Button", "forminator" ), ), // src/form/components/appearance/design/bold.js:22
|
119 |
"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:12
|
120 |
-
"Fonts" => array( null, __("Fonts", "forminator" ), ), // src/form/components/appearance/fonts.js:
|
121 |
-
"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:
|
122 |
-
"Use Theme Fonts" => array( null, __("Use Theme Fonts", "forminator" ), ), // src/form/components/appearance/fonts.js:
|
123 |
-
"Response Message" => array( null, __("Response Message", "forminator" ), ), // src/form/components/appearance/fonts.js:
|
124 |
-
"Fields Label" => array( null, __("Fields Label", "forminator" ), ), // src/form/components/appearance/fonts.js:
|
125 |
-
"Fields Description" => array( null, __("Fields Description", "forminator" ), ), // src/form/components/appearance/fonts.js:
|
126 |
-
"Fields Error Message" => array( null, __("Fields Error Message", "forminator" ), ), // src/form/components/appearance/fonts.js:
|
127 |
-
"Section Title" => array( null, __("Section Title", "forminator" ), ), // src/form/components/appearance/fonts.js:
|
128 |
-
"Section Subtitle" => array( null, __("Section Subtitle", "forminator" ), ), // src/form/components/appearance/fonts.js:
|
129 |
-
"Input
|
130 |
-
"
|
131 |
-
"
|
132 |
-
"
|
133 |
-
"Upload
|
134 |
-
"
|
135 |
-
"
|
136 |
-
"Upload
|
137 |
-
"
|
138 |
-
"
|
139 |
-
"
|
|
|
140 |
"Customize the form container's padding and border." => array( null, __("Customize the form container's padding and border.", "forminator" ), ), // src/form/components/appearance/form-container.js:18
|
141 |
"Padding" => array( null, __("Padding", "forminator" ), ), // src/form/components/appearance/form-container.js:27
|
142 |
"By default the form will fill the available space where you insert it. You can add some padding here to better suit your theme." => array( null, __("By default the form will fill the available space where you insert it. You can add some padding here to better suit your theme.", "forminator" ), ), // src/form/components/appearance/form-container.js:28
|
@@ -170,7 +172,9 @@ $forminator_admin_locale = array(
|
|
170 |
"Show" => array( null, __("Show", "forminator" ), ), // src/form/components/appearance/pagination.js:63
|
171 |
"Progress Bar" => array( null, __("Progress Bar", "forminator" ), ), // src/form/components/appearance/pagination.js:72
|
172 |
"Steps" => array( null, __("Steps", "forminator" ), ), // src/form/components/appearance/pagination.js:78
|
173 |
-
"
|
|
|
|
|
174 |
"Form does not have fields that can be autofilled." => array( null, __("Form does not have fields that can be autofilled.", "forminator" ), ), // src/form/components/behaviour/autofill.js:61
|
175 |
"Autofill" => array( null, __("Autofill", "forminator" ), ), // src/form/components/behaviour/autofill.js:159
|
176 |
"If the user filling out the form is logged in, we can auto-fill fields with any available data." => array( null, __("If the user filling out the form is logged in, we can auto-fill fields with any available data.", "forminator" ), ), // src/form/components/behaviour/autofill.js:161
|
@@ -207,37 +211,37 @@ $forminator_admin_locale = array(
|
|
207 |
"Lock down your form submissions to registered users only." => array( null, __("Lock down your form submissions to registered users only.", "forminator" ), ), // src/form/components/behaviour/security.js:39
|
208 |
"Submission Behaviour" => array( null, __("Submission Behaviour", "forminator" ), ), // src/form/components/behaviour/submission.js:50
|
209 |
"Choose what you want to happen after your visitor has successfully submitted this form." => array( null, __("Choose what you want to happen after your visitor has successfully submitted this form.", "forminator" ), ), // src/form/components/behaviour/submission.js:53
|
210 |
-
"After submission" => array( null, __("After submission", "forminator" ), ), // src/form/components/behaviour/submission.js:
|
211 |
-
"Choose what happens after a user successfully submits your form." => array( null, __("Choose what happens after a user successfully submits your form.", "forminator" ), ), // src/form/components/behaviour/submission.js:
|
212 |
-
"Inline Message" => array( null, __("Inline Message", "forminator" ), ), // src/form/components/behaviour/submission.js:
|
213 |
-
"Display a success message after form submitted." => array( null, __("Display a success message after form submitted.", "forminator" ), ), // src/form/components/behaviour/submission.js:
|
214 |
-
"Auto-close success message after" => array( null, __("Auto-close success message after", "forminator" ), ), // src/form/components/behaviour/submission.js:
|
215 |
-
"E.g. 5" => array( null, __("E.g. 5", "forminator" ), ), // src/form/components/behaviour/submission.js:
|
216 |
-
"seconds." => array( null, __("seconds.", "forminator" ), ), // src/form/components/behaviour/submission.js:
|
217 |
-
"Redirect user to a URL" => array( null, __("Redirect user to a URL", "forminator" ), ), // src/form/components/behaviour/submission.js:
|
218 |
-
"https://www.mywebsite.com" => array( null, __("https://www.mywebsite.com", "forminator" ), ), // src/form/components/behaviour/submission.js:
|
219 |
-
"Redirect URL" => array( null, __("Redirect URL", "forminator" ), ), // src/form/components/behaviour/submission.js:
|
220 |
-
"Provide the absolute URL of the page you want to redirect users to after submitting the login form. For example, to redirect users to the WordPress admin, use the URL {{strong}}http://www.website.com/wp-admin/{{/strong}}." => array( null, __("Provide the absolute URL of the page you want to redirect users to after submitting the login form. For example, to redirect users to the WordPress admin, use the URL {{strong}}http://www.website.com/wp-admin/{{/strong}}.", "forminator" ), ), // src/form/components/behaviour/submission.js:
|
221 |
-
"Redirection Option" => array( null, __("Redirection Option", "forminator" ), ), // src/form/components/behaviour/submission.js:
|
222 |
-
"Redirect on the same tab" => array( null, __("Redirect on the same tab", "forminator" ), ), // src/form/components/behaviour/submission.js:
|
223 |
-
"Redirect on new tab and show thank you message on form page" => array( null, __("Redirect on new tab and show thank you message on form page", "forminator" ), ), // src/form/components/behaviour/submission.js:
|
224 |
-
"Redirect on new tab and hide form on the form page" => array( null, __("Redirect on new tab and hide form on the form page", "forminator" ), ), // src/form/components/behaviour/submission.js:
|
225 |
-
"Hide form" => array( null, __("Hide form", "forminator" ), ), // src/form/components/behaviour/submission.js:
|
226 |
-
"Submit Message" => array( null, __("Submit Message", "forminator" ), ), // src/form/components/behaviour/submission.js:
|
227 |
-
"Method" => array( null, __("Method", "forminator" ), ), // src/form/components/behaviour/submission.js:
|
228 |
-
"Choose whether you want to use AJAX to send this form without reloading the page, or use the more traditional method of reloading the page." => array( null, __("Choose whether you want to use AJAX to send this form without reloading the page, or use the more traditional method of reloading the page.", "forminator" ), ), // src/form/components/behaviour/submission.js:
|
229 |
-
"Ajax" => array( null, __("Ajax", "forminator" ), ), // src/form/components/behaviour/submission.js:
|
230 |
-
"Ajax method, when used with the Stripe field, will hide your form after the successful submission and show your inline success message only. The form will be available again when the page is reloaded." => array( null, __("Ajax method, when used with the Stripe field, will hide your form after the successful submission and show your inline success message only. The form will be available again when the page is reloaded.", "forminator" ), ), // src/form/components/behaviour/submission.js:
|
231 |
-
"Page Reload" => array( null, __("Page Reload", "forminator" ), ), // src/form/components/behaviour/submission.js:
|
232 |
-
"Validation" => array( null, __("Validation", "forminator" ), ), // src/form/components/behaviour/submission.js:
|
233 |
-
"For fields that you've chosen to validate, choose how you want the validation to behave. On submission will run validation checks when the user submits the form using Ajax (recommended). The Live method will check fields at the same time as the user fills them out. Server side does the validation using PHP and returns any error messages after a page reload." => array( null, __("For fields that you've chosen to validate, choose how you want the validation to behave. On submission will run validation checks when the user submits the form using Ajax (recommended). The Live method will check fields at the same time as the user fills them out. Server side does the validation using PHP and returns any error messages after a page reload.", "forminator" ), ), // src/form/components/behaviour/submission.js:
|
234 |
-
"On Submit" => array( null, __("On Submit", "forminator" ), ), // src/form/components/behaviour/submission.js:
|
235 |
-
"Server Side" => array( null, __("Server Side", "forminator" ), ), // src/form/components/behaviour/submission.js:
|
236 |
-
"Enable inline validation (as user types)" => array( null, __("Enable inline validation (as user types)", "forminator" ), ), // src/form/components/behaviour/submission.js:
|
237 |
-
"Choose whether you want to show a loader on your form until it is submitted. We highly recommend using this on long forms or forms with payment field since they may take a few seconds to submit." => array( null, __("Choose whether you want to show a loader on your form until it is submitted. We highly recommend using this on long forms or forms with payment field since they may take a few seconds to submit.", "forminator" ), ), // src/form/components/behaviour/submission.js:
|
238 |
-
"Show Loader" => array( null, __("Show Loader", "forminator" ), ), // src/form/components/behaviour/submission.js:
|
239 |
-
"E.g. Submitting..." => array( null, __("E.g. Submitting...", "forminator" ), ), // src/form/components/behaviour/submission.js:
|
240 |
-
"Choose the text to show on the right of loading icon" => array( null, __("Choose the text to show on the right of loading icon", "forminator" ), ), // src/form/components/behaviour/submission.js:
|
241 |
"null" => array( null, __("null", "forminator" ), ), // src/form/components/builder/field.js:638
|
242 |
"more condition(s)" => array( null, __("more condition(s)", "forminator" ), ), // src/form/components/builder/field.js:685
|
243 |
"if" => array( null, __("if", "forminator" ), ), // src/form/components/builder/field.js:690
|
@@ -247,7 +251,7 @@ $forminator_admin_locale = array(
|
|
247 |
"Delete" => array( null, __("Delete", "forminator" ), ), // src/form/components/builder/field.js:859
|
248 |
"Insert Fields" => array( null, __("Insert Fields", "forminator" ), ), // src/form/components/builder/insert-fields.js:17
|
249 |
" Insert Fields" => array( null, __(" Insert Fields", "forminator" ), ), // src/form/components/builder/insert-fields.js:43
|
250 |
-
"A form without fields isn’t going to be very useful… Add your first field above!" => array( null, __("A form without fields isn’t going to be very useful… Add your first field above!", "forminator" ), ), // src/form/components/builder/insert-fields.js:
|
251 |
"Since you are using Page Break field(s) to divide your form into multiple pages, use the pagination settings to customize the page label, progress indicator, and the buttons on each page." => array( null, __("Since you are using Page Break field(s) to divide your form into multiple pages, use the pagination settings to customize the page label, progress indicator, and the buttons on each page.", "forminator" ), ), // src/form/components/builder/pagination.js:41
|
252 |
"Edit field" => array( null, __("Edit field", "forminator" ), ), // src/form/components/builder/pagination.js:74
|
253 |
"PayPal Checkout" => array( null, __("PayPal Checkout", "forminator" ), ), // src/form/components/builder/paypal.js:204
|
@@ -269,14 +273,20 @@ $forminator_admin_locale = array(
|
|
269 |
"Description (optional)" => array( null, __("Description (optional)", "forminator" ), ), // src/form/components/fields/address.js:122
|
270 |
"Enter description" => array( null, __("Enter description", "forminator" ), ), // src/form/components/fields/address.js:123
|
271 |
"At least one field must be enabled" => array( null, __("At least one field must be enabled", "forminator" ), ), // src/form/components/fields/address.js:235
|
272 |
-
"Field Type" => array( null, __("Field Type", "forminator" ), ), // src/form/components/fields/calculation.js:
|
273 |
-
"By default, the calculation field is read-only. You can also hide the field if you don
|
274 |
-
"Read-only" => array( null, __("Read-only", "forminator" ), ), // src/form/components/fields/calculation.js:
|
275 |
-
"Hidden" => array( null, __("Hidden", "forminator" ), ), // src/form/components/fields/calculation.js:
|
276 |
-
"
|
277 |
-
"Choose
|
278 |
-
"
|
279 |
-
"
|
|
|
|
|
|
|
|
|
|
|
|
|
280 |
"reCAPTCHA type" => array( null, __("reCAPTCHA type", "forminator" ), ), // src/form/components/fields/captcha.js:35
|
281 |
"Choose the reCAPTCHA type you want to use on your form. You can read more about the different reCAPTCHA types {{link}}here{{/link}} and then choose the one which suits you the best." => array( null, __("Choose the reCAPTCHA type you want to use on your form. You can read more about the different reCAPTCHA types {{link}}here{{/link}} and then choose the one which suits you the best.", "forminator" ), ), // src/form/components/fields/captcha.js:38
|
282 |
"V2 Checkbox" => array( null, __("V2 Checkbox", "forminator" ), ), // src/form/components/fields/captcha.js:61
|
@@ -306,17 +316,21 @@ $forminator_admin_locale = array(
|
|
306 |
"Automatic" => array( null, __("Automatic", "forminator" ), ), // src/form/components/fields/captcha.js:237
|
307 |
"Error Message" => array( null, __("Error Message", "forminator" ), ), // src/form/components/fields/captcha.js:255
|
308 |
"Choose the error message you want to display on your form when reCAPTCHA verification fails." => array( null, __("Choose the error message you want to display on your form when reCAPTCHA verification fails.", "forminator" ), ), // src/form/components/fields/captcha.js:260
|
309 |
-
"Default Value (optional)" => array( null, __("Default Value (optional)", "forminator" ), ), // src/form/components/fields/currency.js:
|
310 |
-
"Enter default value" => array( null, __("Enter default value", "forminator" ), ), // src/form/components/fields/currency.js:
|
311 |
-
"Currency" => array( null, __("Currency", "forminator" ), ), // src/form/components/fields/currency.js:
|
312 |
-
"Choose the currency to display on the field. If you are going to collect payments based on this field, it is recommended to keep this currency same as your charge currency to avoid any confusions." => array( null, __("Choose the currency to display on the field. If you are going to collect payments based on this field, it is recommended to keep this currency same as your charge currency to avoid any confusions.", "forminator" ), ), // src/form/components/fields/currency.js:
|
313 |
-
"Decimal Points" => array( null, __("Decimal Points", "forminator" ), ), // src/form/components/fields/currency.js:
|
314 |
-
"Set the maximum number of digits that your users can enter after the decimal point." => array( null, __("Set the maximum number of digits that your users can enter after the decimal point.", "forminator" ), ), // src/form/components/fields/currency.js:
|
315 |
-
"Limit" => array( null, __("Limit", "forminator" ), ), // src/form/components/fields/currency.js:
|
316 |
-
"Restrict the value that your users can enter in this field within a custom range." => array( null, __("Restrict the value that your users can enter in this field within a custom range.", "forminator" ), ), // src/form/components/fields/currency.js:
|
317 |
-
"Min" => array( null, __("Min", "forminator" ), ), // src/form/components/fields/currency.js:
|
318 |
-
"Max" => array( null, __("Max", "forminator" ), ), // src/form/components/fields/currency.js:
|
319 |
-
"
|
|
|
|
|
|
|
|
|
320 |
"Note: The query parameter's value passed in URL should match with the selected date format." => array( null, __("Note: The query parameter's value passed in URL should match with the selected date format.", "forminator" ), ), // src/form/components/fields/date.js:29
|
321 |
"Type" => array( null, __("Type", "forminator" ), ), // src/form/components/fields/date.js:42
|
322 |
"Date Format" => array( null, __("Date Format", "forminator" ), ), // src/form/components/fields/date.js:76
|
@@ -337,10 +351,10 @@ $forminator_admin_locale = array(
|
|
337 |
"Year" => array( null, __("Year", "forminator" ), ), // src/form/components/fields/date.js:208
|
338 |
"Text inputs" => array( null, __("Text inputs", "forminator" ), ), // src/form/components/fields/date.js:228
|
339 |
"Enter placeholder" => array( null, __("Enter placeholder", "forminator" ), ), // src/form/components/fields/date.js:299
|
340 |
-
"Default date" => array( null, __("Default date", "forminator" ), ), // src/form/components/fields/date.js:
|
341 |
-
"Use this feature to specify a default selected date." => array( null, __("Use this feature to specify a default selected date.", "forminator" ), ), // src/form/components/fields/date.js:
|
342 |
-
"Today" => array( null, __("Today", "forminator" ), ), // src/form/components/fields/date.js:
|
343 |
-
"Future Date" => array( null, __("Future Date", "forminator" ), ), // src/form/components/fields/date.js:
|
344 |
"Wrong field type!" => array( null, __("Wrong field type!", "forminator" ), ), // src/form/components/fields/email.js:36
|
345 |
"Note, the form will not submit until the user has accepted the terms." => array( null, __("Note, the form will not submit until the user has accepted the terms.", "forminator" ), ), // src/form/components/fields/gdprcheckbox.js:35
|
346 |
"Error message" => array( null, __("Error message", "forminator" ), ), // src/form/components/fields/gdprcheckbox.js:49
|
@@ -354,16 +368,15 @@ $forminator_admin_locale = array(
|
|
354 |
"Vertical" => array( null, __("Vertical", "forminator" ), ), // src/form/components/fields/multivalue.js:81
|
355 |
"Horizontal" => array( null, __("Horizontal", "forminator" ), ), // src/form/components/fields/multivalue.js:82
|
356 |
"Choose whether to allow this field to be used in calculations or not." => array( null, __("Choose whether to allow this field to be used in calculations or not.", "forminator" ), ), // src/form/components/fields/multivalue.js:93
|
357 |
-
"Prefix" => array( null, __("Prefix", "forminator" ), ), // src/form/components/fields/name.js:23
|
358 |
"First Name" => array( null, __("First Name", "forminator" ), ), // src/form/components/fields/name.js:27
|
359 |
"Middle Name" => array( null, __("Middle Name", "forminator" ), ), // src/form/components/fields/name.js:31
|
360 |
"Last Name" => array( null, __("Last Name", "forminator" ), ), // src/form/components/fields/name.js:35
|
361 |
"Single" => array( null, __("Single", "forminator" ), ), // src/form/components/fields/name.js:74
|
362 |
"Multiple" => array( null, __("Multiple", "forminator" ), ), // src/form/components/fields/name.js:81
|
363 |
-
"Limits" => array( null, __("Limits", "forminator" ), ), // src/form/components/fields/number.js:
|
364 |
-
"Set the minimum and maximum values the user can choose. Leave the fields blank to allow any number including negatives." => array( null, __("Set the minimum and maximum values the user can choose. Leave the fields blank to allow any number including negatives.", "forminator" ), ), // src/form/components/fields/number.js:
|
365 |
-
"Minimum" => array( null, __("Minimum", "forminator" ), ), // src/form/components/fields/number.js:
|
366 |
-
"Maximum" => array( null, __("Maximum", "forminator" ), ), // src/form/components/fields/number.js:
|
367 |
"Step label" => array( null, __("Step label", "forminator" ), ), // src/form/components/fields/pagination.js:24
|
368 |
"Enter step label" => array( null, __("Enter step label", "forminator" ), ), // src/form/components/fields/pagination.js:25
|
369 |
"Buttons Text" => array( null, __("Buttons Text", "forminator" ), ), // src/form/components/fields/pagination.js:31
|
@@ -437,46 +450,48 @@ $forminator_admin_locale = array(
|
|
437 |
"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:516
|
438 |
"Disable" => array( null, __("Disable", "forminator" ), ), // src/form/components/fields/paypal.js:531
|
439 |
"Enable" => array( null, __("Enable", "forminator" ), ), // src/form/components/fields/paypal.js:532
|
440 |
-
"
|
441 |
-
"National" => array( null, __("National", "forminator" ), ), // src/form/components/fields/phone.js:
|
442 |
-
"
|
443 |
-
"
|
444 |
-
"
|
445 |
-
"
|
446 |
-
"
|
|
|
|
|
447 |
"Title" => array( null, __("Title", "forminator" ), ), // src/form/components/fields/postdata.js:25
|
448 |
"Content" => array( null, __("Content", "forminator" ), ), // src/form/components/fields/postdata.js:30
|
449 |
"Excerpt" => array( null, __("Excerpt", "forminator" ), ), // src/form/components/fields/postdata.js:35
|
450 |
"Featured Image" => array( null, __("Featured Image", "forminator" ), ), // src/form/components/fields/postdata.js:40
|
451 |
"Custom Fields" => array( null, __("Custom Fields", "forminator" ), ), // src/form/components/fields/postdata.js:65
|
452 |
"Allow users to submit post data with this field. By default, this will create new posts, but you can assign it to any post type in the {{strong}}Settings{{/strong}} tab." => array( null, __("Allow users to submit post data with this field. By default, this will create new posts, but you can assign it to any post type in the {{strong}}Settings{{/strong}} tab.", "forminator" ), ), // src/form/components/fields/postdata.js:85
|
453 |
-
"Post type" => array( null, __("Post type", "forminator" ), ), // src/form/components/fields/postdata.js:
|
454 |
-
"Choose the post type associated with this field." => array( null, __("Choose the post type associated with this field.", "forminator" ), ), // src/form/components/fields/postdata.js:
|
455 |
-
"Assigned post type" => array( null, __("Assigned post type", "forminator" ), ), // src/form/components/fields/postdata.js:
|
456 |
-
"post" => array( null, __("post", "forminator" ), ), // src/form/components/fields/postdata.js:
|
457 |
-
"Default status" => array( null, __("Default status", "forminator" ), ), // src/form/components/fields/postdata.js:
|
458 |
-
"When a user submits this form, choose what status this post data is." => array( null, __("When a user submits this form, choose what status this post data is.", "forminator" ), ), // src/form/components/fields/postdata.js:
|
459 |
-
"Status" => array( null, __("Status", "forminator" ), ), // src/form/components/fields/postdata.js:
|
460 |
-
"pending" => array( null, __("pending", "forminator" ), ), // src/form/components/fields/postdata.js:
|
461 |
-
"Draft" => array( null, __("Draft", "forminator" ), ), // src/form/components/fields/postdata.js:
|
462 |
-
"Pending Review" => array( null, __("Pending Review", "forminator" ), ), // src/form/components/fields/postdata.js:
|
463 |
-
"Published" => array( null, __("Published", "forminator" ), ), // src/form/components/fields/postdata.js:
|
464 |
-
"Default author" => array( null, __("Default author", "forminator" ), ), // src/form/components/fields/postdata.js:
|
465 |
-
"By default we'll assign posts to users if they're logged in, and fall back to the user specified below if you're allowing visitors to make posts. You can also override this to always assign posts to a specified user." => array( null, __("By default we'll assign posts to users if they're logged in, and fall back to the user specified below if you're allowing visitors to make posts. You can also override this to always assign posts to a specified user.", "forminator" ), ), // src/form/components/fields/postdata.js:
|
466 |
-
"Always assign posts to this user" => array( null, __("Always assign posts to this user", "forminator" ), ), // src/form/components/fields/postdata.js:
|
467 |
-
"Taxonomies limits" => array( null, __("Taxonomies limits", "forminator" ), ), // src/form/components/fields/postdata.js:
|
468 |
-
"Choose whether to allow single or multiple categories or tags on this post." => array( null, __("Choose whether to allow single or multiple categories or tags on this post.", "forminator" ), ), // src/form/components/fields/postdata.js:
|
469 |
"Enter title" => array( null, __("Enter title", "forminator" ), ), // src/form/components/fields/section.js:31
|
470 |
"Subtitle (optional)" => array( null, __("Subtitle (optional)", "forminator" ), ), // src/form/components/fields/section.js:39
|
471 |
"Enter subtitle" => array( null, __("Enter subtitle", "forminator" ), ), // src/form/components/fields/section.js:40
|
472 |
"Add a border to this section." => array( null, __("Add a border to this section.", "forminator" ), ), // src/form/components/fields/section.js:55
|
473 |
-
"Signature filetype" => array( null, __("Signature filetype", "forminator" ), ), // src/form/components/fields/signature.js:
|
474 |
-
"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:
|
475 |
-
"PNG" => array( null, __("PNG", "forminator" ), ), // src/form/components/fields/signature.js:
|
476 |
-
"JPG" => array( null, __("JPG", "forminator" ), ), // src/form/components/fields/signature.js:
|
477 |
-
"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:
|
478 |
-
"Stroke thickness" => array( null, __("Stroke thickness", "forminator" ), ), // src/form/components/fields/signature.js:
|
479 |
-
"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:
|
480 |
"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
|
481 |
"Search" => array( null, __("Search", "forminator" ), ), // src/form/components/fields/singlevalue.js:112
|
482 |
"Display the search box in a dropdown" => array( null, __("Display the search box in a dropdown", "forminator" ), ), // src/form/components/fields/singlevalue.js:120
|
@@ -484,76 +499,75 @@ $forminator_admin_locale = array(
|
|
484 |
"You can limit submissions of each option to a certain number, and once an option reaches the submission limit, we'll hide that option from the dropdown list." => array( null, __("You can limit submissions of each option to a certain number, and once an option reaches the submission limit, we'll hide that option from the dropdown list.", "forminator" ), ), // src/form/components/fields/singlevalue.js:155
|
485 |
"You can set a limit for your options in the LABELS tab. Options for which limit field is left empty can have unlimited submissions." => array( null, __("You can set a limit for your options in the LABELS tab. Options for which limit field is left empty can have unlimited submissions.", "forminator" ), ), // src/form/components/fields/singlevalue.js:188
|
486 |
"Choose whether to allow this field to be used in calculations or not. The value used in calculations is the same as the input value of this field." => array( null, __("Choose whether to allow this field to be used in calculations or not. The value used in calculations is the same as the input value of this field.", "forminator" ), ), // src/form/components/fields/singlevalue.js:209
|
487 |
-
"Credit / Debit Card" => array( null, __("Credit / Debit Card", "forminator" ), ), // src/form/components/fields/stripe.js:
|
488 |
-
"Choose your preferred language for the Stripe field. This will affect the placeholders language, and the card validation errors returned by the Stripe." => array( null, __("Choose your preferred language for the Stripe field. This will affect the placeholders language, and the card validation errors returned by the Stripe.", "forminator" ), ), // src/form/components/fields/stripe.js:
|
489 |
-
"Auto" => array( null, __("Auto", "forminator" ), ), // src/form/components/fields/stripe.js:
|
490 |
-
"English (en)" => array( null, __("English (en)", "forminator" ), ), // src/form/components/fields/stripe.js:
|
491 |
-
"Simplified Chinese (zh)" => array( null, __("Simplified Chinese (zh)", "forminator" ), ), // src/form/components/fields/stripe.js:
|
492 |
-
"Danish (da)" => array( null, __("Danish (da)", "forminator" ), ), // src/form/components/fields/stripe.js:
|
493 |
-
"Dutch (nl)" => array( null, __("Dutch (nl)", "forminator" ), ), // src/form/components/fields/stripe.js:
|
494 |
-
"Finnish (fi)" => array( null, __("Finnish (fi)", "forminator" ), ), // src/form/components/fields/stripe.js:
|
495 |
-
"French (fr)" => array( null, __("French (fr)", "forminator" ), ), // src/form/components/fields/stripe.js:
|
496 |
-
"German (de)" => array( null, __("German (de)", "forminator" ), ), // src/form/components/fields/stripe.js:
|
497 |
-
"Italian (it)" => array( null, __("Italian (it)", "forminator" ), ), // src/form/components/fields/stripe.js:
|
498 |
-
"Japanese (ja)" => array( null, __("Japanese (ja)", "forminator" ), ), // src/form/components/fields/stripe.js:
|
499 |
-
"Norwegian (no)" => array( null, __("Norwegian (no)", "forminator" ), ), // src/form/components/fields/stripe.js:
|
500 |
-
"Spanish (es)" => array( null, __("Spanish (es)", "forminator" ), ), // src/form/components/fields/stripe.js:
|
501 |
-
"Swedish (sv)" => array( null, __("Swedish (sv)", "forminator" ), ), // src/form/components/fields/stripe.js:
|
502 |
-
"Card icon" => array( null, __("Card icon", "forminator" ), ), // src/form/components/fields/stripe.js:
|
503 |
-
"Choose whether you want to show the card icon on the Stripe field." => array( null, __("Choose whether you want to show the card icon on the Stripe field.", "forminator" ), ), // src/form/components/fields/stripe.js:
|
504 |
-
"Postal code" => array( null, __("Postal code", "forminator" ), ), // src/form/components/fields/stripe.js:
|
505 |
-
"Choose whether you want to collect the postal code on the Stripe field." => array( null, __("Choose whether you want to collect the postal code on the Stripe field.", "forminator" ), ), // src/form/components/fields/stripe.js:
|
506 |
-
"Prefill (optional)" => array( null, __("Prefill (optional)", "forminator" ), ), // src/form/components/fields/stripe.js:
|
507 |
-
"If you are already collecting ZIP code on your form, you can pre-fill it on the Stripe field." => array( null, __("If you are already collecting ZIP code on your form, you can pre-fill it on the Stripe field.", "forminator" ), ), // src/form/components/fields/stripe.js:
|
508 |
-
"You have not connected your Stripe account with Forminator. Connect your Stripe account {{link}}here{{/link}} and then come back to configure this field." => array( null, __("You have not connected your Stripe account with Forminator. Connect your Stripe account {{link}}here{{/link}} and then come back to configure this field.", "forminator" ), ), // src/form/components/fields/stripe.js:
|
509 |
-
"We recommend using test mode to ensure the payments are working as expected and when you are ready to start collecting live payments, switch to Live payments mode." => array( null, __("We recommend using test mode to ensure the payments are working as expected and when you are ready to start collecting live payments, switch to Live payments mode.", "forminator" ), ), // src/form/components/fields/stripe.js:
|
510 |
-
"Test" => array( null, __("Test", "forminator" ), ), // src/form/components/fields/stripe.js:
|
511 |
-
"It's recommended to charge in your customers' currency to drive more sales and avoid foreign exchange fee to your customers. Read more about Stripe's currency conversions {{link}}here{{/link}}." => array( null, __("It's recommended to charge in your customers' currency to drive more sales and avoid foreign exchange fee to your customers. Read more about Stripe's currency conversions {{link}}here{{/link}}.", "forminator" ), ), // src/form/components/fields/stripe.js:
|
512 |
-
"Minimum amount required to process Stripe payments is equivalent to {{strong}}0.5 USD{{/strong}}." => array( null, __("Minimum amount required to process Stripe payments is equivalent to {{strong}}0.5 USD{{/strong}}.", "forminator" ), ), // src/form/components/fields/stripe.js:
|
513 |
-
"Payment Receipt" => array( null, __("Payment Receipt", "forminator" ), ), // src/form/components/fields/stripe.js:
|
514 |
-
"Choose whether you want Stripe to email a receipt to your customers on successful payment. Note that Stripe sends the email receipt only for live payments. {{link}}Customize email template{{/link}}." => array( null, __("Choose whether you want Stripe to email a receipt to your customers on successful payment. Note that Stripe sends the email receipt only for live payments. {{link}}Customize email template{{/link}}.", "forminator" ), ), // src/form/components/fields/stripe.js:
|
515 |
-
"Email address" => array( null, __("Email address", "forminator" ), ), // src/form/components/fields/stripe.js:
|
516 |
-
"E.g. john@doe.com" => array( null, __("E.g. john@doe.com", "forminator" ), ), // src/form/components/fields/stripe.js:
|
517 |
-
"Select an email field" => array( null, __("Select an email field", "forminator" ), ), // src/form/components/fields/stripe.js:
|
518 |
-
"Payment Details (optional)" => array( null, __("Payment Details (optional)", "forminator" ), ), // src/form/components/fields/stripe.js:
|
519 |
-
"You can add a statement decipher and a description to help you and your customers recognizing the transactions made on this form." => array( null, __("You can add a statement decipher and a description to help you and your customers recognizing the transactions made on this form.", "forminator" ), ), // src/form/components/fields/stripe.js:
|
520 |
-
"Statement decipher" => array( null, __("Statement decipher", "forminator" ), ), // src/form/components/fields/stripe.js:
|
521 |
-
"E.g. Company Name" => array( null, __("E.g. Company Name", "forminator" ), ), // src/form/components/fields/stripe.js:
|
522 |
-
"this is the business name your customers will see on their card statement." => array( null, __("this is the business name your customers will see on their card statement.", "forminator" ), ), // src/form/components/fields/stripe.js:
|
523 |
-
"Up to 22 characters only" => array( null, __("Up to 22 characters only", "forminator" ), ), // src/form/components/fields/stripe.js:
|
524 |
-
"
|
525 |
-
"
|
526 |
-
"
|
527 |
-
"Card Validation" => array( null, __("Card Validation", "forminator" ), ), // src/form/components/fields/stripe.js:
|
528 |
-
"Note: Stripe field automatically validates the card as the user fills the card details regardless of the validation behaviour set on the Behaviours tab." => array( null, __("Note: Stripe field automatically validates the card as the user fills the card details regardless of the validation behaviour set on the Behaviours tab.", "forminator" ), ), // src/form/components/fields/stripe.js:
|
529 |
-
"Billing Details" => array( null, __("Billing Details", "forminator" ), ), // src/form/components/fields/stripe.js:
|
530 |
-
"If you are collection billing details on your forms, you can send that data to Stripe. The billing details will appear on your Stripe dashboard for each payment." => array( null, __("If you are collection billing details on your forms, you can send that data to Stripe. The billing details will appear on your Stripe dashboard for each payment.", "forminator" ), ), // src/form/components/fields/stripe.js:
|
531 |
-
"Customer name (optional)" => array( null, __("Customer name (optional)", "forminator" ), ), // src/form/components/fields/stripe.js:
|
532 |
-
"Select a name field" => array( null, __("Select a name field", "forminator" ), ), // src/form/components/fields/stripe.js:
|
533 |
-
"Customer email address (optional)" => array( null, __("Customer email address (optional)", "forminator" ), ), // src/form/components/fields/stripe.js:
|
534 |
-
"Select an name field" => array( null, __("Select an name field", "forminator" ), ), // src/form/components/fields/stripe.js:
|
535 |
-
"Billing address (optional)" => array( null, __("Billing address (optional)", "forminator" ), ), // src/form/components/fields/stripe.js:
|
536 |
-
"Select an address field" => array( null, __("Select an address field", "forminator" ), ), // src/form/components/fields/stripe.js:
|
537 |
-
"Meta Data" => array( null, __("Meta Data", "forminator" ), ), // src/form/components/fields/stripe.js:
|
538 |
-
"You can send custom meta data to Stripe. This would appear under the MetaData section of every payment. A maximum of 20 meta keys can be sent. The key name must be 20 characters or less, and the mapped data will be truncated to 500 characters as Stripe's requirements." => array( null, __("You can send custom meta data to Stripe. This would appear under the MetaData section of every payment. A maximum of 20 meta keys can be sent. The key name must be 20 characters or less, and the mapped data will be truncated to 500 characters as Stripe's requirements.", "forminator" ), ), // src/form/components/fields/stripe.js:
|
539 |
-
"MetaData" => array( null, __("MetaData", "forminator" ), ), // src/form/components/fields/stripe.js:
|
540 |
-
"Additional CSS Classes" => array( null, __("Additional CSS Classes", "forminator" ), ), // src/form/components/fields/stripe.js:
|
541 |
-
"Stripe automatically adds classes to the container DOM element based on the field state. However, you can customize them here. {{link}}Read more{{/link}}" => array( null, __("Stripe automatically adds classes to the container DOM element based on the field state. However, you can customize them here. {{link}}Read more{{/link}}", "forminator" ), ), // src/form/components/fields/stripe.js:
|
542 |
-
"Base class" => array( null, __("Base class", "forminator" ), ), // src/form/components/fields/stripe.js:
|
543 |
-
"Complete" => array( null, __("Complete", "forminator" ), ), // src/form/components/fields/stripe.js:
|
544 |
-
"Empty" => array( null, __("Empty", "forminator" ), ), // src/form/components/fields/stripe.js:
|
545 |
-
"Focused" => array( null, __("Focused", "forminator" ), ), // src/form/components/fields/stripe.js:
|
546 |
-
"Invalid" => array( null, __("Invalid", "forminator" ), ), // src/form/components/fields/stripe.js:
|
547 |
-
"Autofilled (Chrome and Safari only)" => array( null, __("Autofilled (Chrome and Safari only)", "forminator" ), ), // src/form/components/fields/stripe.js:
|
548 |
-
"Max characters" => array( null, __("Max characters", "forminator" ), ), // src/form/components/fields/text.js:
|
549 |
-
"By default the user can enter as many characters as they want. Use this setting to limit the number of characters the user can enter. Leave field blank to allow unlimited characters." => array( null, __("By default the user can enter as many characters as they want. Use this setting to limit the number of characters the user can enter. Leave field blank to allow unlimited characters.", "forminator" ), ), // src/form/components/fields/text.js:
|
550 |
-
"Character limit" => array( null, __("Character limit", "forminator" ), ), // src/form/components/fields/text.js:
|
551 |
-
"E.g. 100" => array( null, __("E.g. 100", "forminator" ), ), // src/form/components/fields/text.js:
|
552 |
-
"
|
553 |
-
"Words" => array( null, __("Words", "forminator" ), ), // src/form/components/fields/text.js:107
|
554 |
"You can add new line" => array( null, __("You can add new line", "forminator" ), ), // src/form/components/fields/textarea.js:52
|
555 |
-
"Rich-Text editor" => array( null, __("Rich-Text editor", "forminator" ), ), // src/form/components/fields/textarea.js:
|
556 |
-
"Enable TinyMCE editor to allow the formatted text." => array( null, __("Enable TinyMCE editor to allow the formatted text.", "forminator" ), ), // src/form/components/fields/textarea.js:
|
557 |
"Default height" => array( null, __("Default height", "forminator" ), ), // src/form/components/fields/textarea.js:154
|
558 |
"Choose the default minimum height of your textarea field." => array( null, __("Choose the default minimum height of your textarea field.", "forminator" ), ), // src/form/components/fields/textarea.js:158
|
559 |
"Note: The query parameter's value passed in URL should match with the selected time format." => array( null, __("Note: The query parameter's value passed in URL should match with the selected time format.", "forminator" ), ), // src/form/components/fields/time.js:94
|
@@ -562,50 +576,49 @@ $forminator_admin_locale = array(
|
|
562 |
"24 hour" => array( null, __("24 hour", "forminator" ), ), // src/form/components/fields/time.js:125
|
563 |
"Hours" => array( null, __("Hours", "forminator" ), ), // src/form/components/fields/time.js:154
|
564 |
"Minutes" => array( null, __("Minutes", "forminator" ), ), // src/form/components/fields/time.js:180
|
565 |
-
"Increments" => array( null, __("Increments", "forminator" ), ), // src/form/components/fields/time.js:
|
566 |
-
"Choose what time increments you want to use for the hour and minute timepickers." => array( null, __("Choose what time increments you want to use for the hour and minute timepickers.", "forminator" ), ), // src/form/components/fields/time.js:
|
567 |
-
"Hour" => array( null, __("Hour", "forminator" ), ), // src/form/components/fields/time.js:
|
568 |
-
"Minute" => array( null, __("Minute", "forminator" ), ), // src/form/components/fields/time.js:
|
569 |
-
"Choose a time limit for the time picker field to restrict the time selection between specific hours." => array( null, __("Choose a time limit for the time picker field to restrict the time selection between specific hours.", "forminator" ), ), // src/form/components/fields/time.js:
|
570 |
-
"Specific Hours" => array( null, __("Specific Hours", "forminator" ), ), // src/form/components/fields/time.js:
|
571 |
-
"Start Time" => array( null, __("Start Time", "forminator" ), ), // src/form/components/fields/time.js:
|
572 |
-
"AM" => array( null, __("AM", "forminator" ), ), // src/form/components/fields/time.js:
|
573 |
-
"PM" => array( null, __("PM", "forminator" ), ), // src/form/components/fields/time.js:
|
574 |
-
"End Time" => array( null, __("End Time", "forminator" ), ), // src/form/components/fields/time.js:
|
575 |
-
"This error message will be used when time entered is out of the set limits." => array( null, __("This error message will be used when time entered is out of the set limits.", "forminator" ), ), // src/form/components/fields/time.js:
|
576 |
-
"Default time" => array( null, __("Default time", "forminator" ), ), // src/form/components/fields/time.js:
|
577 |
-
"Use this feature to specify a default selected time." => array( null, __("Use this feature to specify a default selected time.", "forminator" ), ), // src/form/components/fields/time.js:
|
578 |
-
"Default time can't be outside the allowed time limit." => array( null, __("Default time can't be outside the allowed time limit.", "forminator" ), ), // src/form/components/fields/time.js:
|
579 |
-
"Limit number of files" => array( null, __("Limit number of files", "forminator" ), ), // src/form/components/fields/upload.js:
|
580 |
-
"Choose the maximum number of files that can be uploaded using this field." => array( null, __("Choose the maximum number of files that can be uploaded using this field.", "forminator" ), ), // src/form/components/fields/upload.js:
|
581 |
-
"Unlimited" => array( null, __("Unlimited", "forminator" ), ), // src/form/components/fields/upload.js:
|
582 |
-
"File upload limit" => array( null, __("File upload limit", "forminator" ), ), // src/form/components/fields/upload.js:
|
583 |
-
"Filesize limit per file" => array( null, __("Filesize limit per file", "forminator" ), ), // src/form/components/fields/upload.js:
|
584 |
-
"Filesize limit" => array( null, __("Filesize limit", "forminator" ), ), // src/form/components/fields/upload.js:
|
585 |
-
"We've detected your server will allow uploads up to %(maxUpload)sMB in size currently. You can set a lower limit than this using the input below, however if you want uploads of more than %(maxUpload)sMB you'll need to adjust this in your server PHP.ini settings." => array( null, __("We've detected your server will allow uploads up to %(maxUpload)sMB in size currently. You can set a lower limit than this using the input below, however if you want uploads of more than %(maxUpload)sMB you'll need to adjust this in your server PHP.ini settings.", "forminator" ), ), // src/form/components/fields/upload.js:
|
586 |
-
"Upload limit per file" => array( null, __("Upload limit per file", "forminator" ), ), // src/form/components/fields/upload.js:
|
587 |
-
"MB" => array( null, __("MB", "forminator" ), ), // src/form/components/fields/upload.js:
|
588 |
-
"KB" => array( null, __("KB", "forminator" ), ), // src/form/components/fields/upload.js:
|
589 |
-
"B" => array( null, __("B", "forminator" ), ), // src/form/components/fields/upload.js:
|
590 |
-
"The file size you have entered exceeds what your current hosting settings are capped to. You need to increase your max filesize limit at the server level first." => array( null, __("The file size you have entered exceeds what your current hosting settings are capped to. You need to increase your max filesize limit at the server level first.", "forminator" ), ), // src/form/components/fields/upload.js:
|
591 |
-
"Upload method" => array( null, __("Upload method", "forminator" ), ), // src/form/components/fields/upload.js:
|
592 |
-
"Choose whether you want to use AJAX to upload individual files as they are selected or use the traditional method of uploading all files together on form submission. We recommend using the AJAX method to avoid server timeouts." => array( null, __("Choose whether you want to use AJAX to upload individual files as they are selected or use the traditional method of uploading all files together on form submission. We recommend using the AJAX method to avoid server timeouts.", "forminator" ), ), // src/form/components/fields/upload.js:
|
593 |
-
"AJAX" => array( null, __("AJAX", "forminator" ), ), // src/form/components/fields/upload.js:
|
594 |
-
"On form submission" => array( null, __("On form submission", "forminator" ), ), // src/form/components/fields/upload.js:
|
595 |
"Show files in media library" => array( null, __("Show files in media library", "forminator" ), ), // src/form/components/fields/upload.js:238
|
596 |
"Choose whether you want to show the files uploaded by your visitors using this field in your media library." => array( null, __("Choose whether you want to show the files uploaded by your visitors using this field in your media library.", "forminator" ), ), // src/form/components/fields/upload.js:242
|
597 |
-
"Edit Form" => array( null, __("Edit Form", "forminator" ), ), // src/form/components/header.js:
|
598 |
"View Documentation" => array( null, __("View Documentation", "forminator" ), ), // src/form/components/header/documentation.js:14
|
599 |
-
"Name your form" => array( null, __("Name your form", "forminator" ), ), // src/form/components/header/title.js:
|
600 |
-
"Give your form a name" => array( null, __("Give your form a name", "forminator" ), ), // src/form/components/header/title.js:
|
601 |
-
"Please, enter a valid name." => array( null, __("Please, enter a valid name.", "forminator" ), ), // src/form/components/header/title.js:
|
602 |
"Fetching integration list…" => array( null, __("Fetching integration list…", "forminator" ), ), // src/form/components/integrations.js:106
|
603 |
"You need to save this form before using integrations." => array( null, __("You need to save this form before using integrations.", "forminator" ), ), // src/form/components/integrations.js:112
|
604 |
"TRY AGAIN" => array( null, __("TRY AGAIN", "forminator" ), ), // src/form/components/integrations.js:115
|
605 |
"Integrations" => array( null, __("Integrations", "forminator" ), ), // src/form/components/integrations.js:132
|
606 |
"Applications" => array( null, __("Applications", "forminator" ), ), // src/form/components/integrations.js:138
|
607 |
"You can send this form's data to any of the connected third party apps. Connect to more apps on the {{link}}Integrations{{/link}} page." => array( null, __("You can send this form's data to any of the connected third party apps. Connect to more apps on the {{link}}Integrations{{/link}} page.", "forminator" ), ), // src/form/components/integrations.js:139
|
608 |
-
"Settings" => array( null, __("Settings", "forminator" ), ), // src/form/components/integrations.js:165
|
609 |
"Login User" => array( null, __("Login User", "forminator" ), ), // src/form/components/login.js:31
|
610 |
"Additional Settings" => array( null, __("Additional Settings", "forminator" ), ), // src/form/components/login/additional-settings.js:20
|
611 |
"These settings will add some extra control on your login process." => array( null, __("These settings will add some extra control on your login process.", "forminator" ), ), // src/form/components/login/additional-settings.js:23
|
@@ -630,10 +643,10 @@ $forminator_admin_locale = array(
|
|
630 |
"year(s)" => array( null, __("year(s)", "forminator" ), ), // src/form/components/login/meta-mapping.js:136
|
631 |
"Users will have to provide login details again after the selected period." => array( null, __("Users will have to provide login details again after the selected period.", "forminator" ), ), // src/form/components/login/meta-mapping.js:142
|
632 |
"Something went wrong while saving your form. Please try again." => array( null, __("Something went wrong while saving your form. Please try again.", "forminator" ), ), // src/form/components/meta.js:125
|
633 |
-
"Unpublish" => array( null, __("Unpublish", "forminator" ), ), // src/form/components/meta/buttons.js:
|
634 |
-
"Save Draft" => array( null, __("Save Draft", "forminator" ), ), // src/form/components/meta/buttons.js:
|
635 |
-
"Update" => array( null, __("Update", "forminator" ), ), // src/form/components/meta/buttons.js:
|
636 |
-
"Publish" => array( null, __("Publish", "forminator" ), ), // src/form/components/meta/buttons.js:
|
637 |
"Saving..." => array( null, __("Saving...", "forminator" ), ), // src/form/components/meta/status.js:29
|
638 |
"Unsaved changes" => array( null, __("Unsaved changes", "forminator" ), ), // src/form/components/meta/status.js:36
|
639 |
"Saved" => array( null, __("Saved", "forminator" ), ), // src/form/components/meta/status.js:43
|
@@ -661,38 +674,38 @@ $forminator_admin_locale = array(
|
|
661 |
"Please enter recipients" => array( null, __("Please enter recipients", "forminator" ), ), // src/form/components/modals/notification.js:205
|
662 |
"Please select rule" => array( null, __("Please select rule", "forminator" ), ), // src/form/components/modals/notification.js:217
|
663 |
"Please add email routing" => array( null, __("Please add email routing", "forminator" ), ), // src/form/components/modals/notification.js:222
|
664 |
-
"Please fix the error(s) in the EMAIL tab." => array( null, __("Please fix the error(s) in the EMAIL tab.", "forminator" ), ), // src/form/components/modals/notification.js:
|
665 |
-
"Add Email Notification" => array( null, __("Add Email Notification", "forminator" ), ), // src/form/components/modals/notification.js:
|
666 |
-
"Email" => array( null, __("Email", "forminator" ), ), // src/form/components/modals/notification.js:
|
667 |
-
"Recipients" => array( null, __("Recipients", "forminator" ), ), // src/form/components/modals/notification.js:
|
668 |
-
"Advanced" => array( null, __("Advanced", "forminator" ), ), // src/form/components/modals/notification.js:
|
669 |
-
"Conditions" => array( null, __("Conditions", "forminator" ), ), // src/form/components/modals/notification.js:
|
670 |
-
"The label is to help you identify this email and won't appear anywhere in the email." => array( null, __("The label is to help you identify this email and won't appear anywhere in the email.", "forminator" ), ), // src/form/components/modals/notification.js:
|
671 |
-
"E.g. Sales Team Notification" => array( null, __("E.g. Sales Team Notification", "forminator" ), ), // src/form/components/modals/notification.js:
|
672 |
-
"E.g. New Form Submission" => array( null, __("E.g. New Form Submission", "forminator" ), ), // src/form/components/modals/notification.js:
|
673 |
-
"Subject" => array( null, __("Subject", "forminator" ), ), // src/form/components/modals/notification.js:
|
674 |
-
"Email subject can't be empty" => array( null, __("Email subject can't be empty", "forminator" ), ), // src/form/components/modals/notification.js:
|
675 |
-
"Body" => array( null, __("Body", "forminator" ), ), // src/form/components/modals/notification.js:
|
676 |
-
"Email body can't be empty" => array( null, __("Email body can't be empty", "forminator" ), ), // src/form/components/modals/notification.js:
|
677 |
-
"Attachments" => array( null, __("Attachments", "forminator" ), ), // src/form/components/modals/notification.js:
|
678 |
-
"Choose whether you want to attach the files uploaded via the File Upload fields to this email." => array( null, __("Choose whether you want to attach the files uploaded via the File Upload fields to this email.", "forminator" ), ), // src/form/components/modals/notification.js:
|
679 |
-
"Uploaded files" => array( null, __("Uploaded files", "forminator" ), ), // src/form/components/modals/notification.js:
|
680 |
-
"The default behavior is to send the email to the same recipients. If you want to send this email to different recipients conditionally, you can enable the email routing and change the recipients of this email based on the user input." => array( null, __("The default behavior is to send the email to the same recipients. If you want to send this email to different recipients conditionally, you can enable the email routing and change the recipients of this email based on the user input.", "forminator" ), ), // src/form/components/modals/notification.js:
|
681 |
-
"E.g. sales@website.com" => array( null, __("E.g. sales@website.com", "forminator" ), ), // src/form/components/modals/notification.js:
|
682 |
-
"Separate multiple emails with a comma" => array( null, __("Separate multiple emails with a comma", "forminator" ), ), // src/form/components/modals/notification.js:
|
683 |
-
"Email Routing" => array( null, __("Email Routing", "forminator" ), ), // src/form/components/modals/notification.js:
|
684 |
-
"Enter from name here" => array( null, __("Enter from name here", "forminator" ), ), // src/form/components/modals/notification.js:
|
685 |
-
"From Name" => array( null, __("From Name", "forminator" ), ), // src/form/components/modals/notification.js:
|
686 |
-
"Enter from email here" => array( null, __("Enter from email here", "forminator" ), ), // src/form/components/modals/notification.js:
|
687 |
-
"From Email" => array( null, __("From Email", "forminator" ), ), // src/form/components/modals/notification.js:
|
688 |
-
"Enter reply-to email here" => array( null, __("Enter reply-to email here", "forminator" ), ), // src/form/components/modals/notification.js:
|
689 |
-
"Reply-to Email" => array( null, __("Reply-to Email", "forminator" ), ), // src/form/components/modals/notification.js:
|
690 |
-
"Enter CC email here" => array( null, __("Enter CC email here", "forminator" ), ), // src/form/components/modals/notification.js:
|
691 |
-
"CC Emails" => array( null, __("CC Emails", "forminator" ), ), // src/form/components/modals/notification.js:
|
692 |
-
"Enter BCC email here" => array( null, __("Enter BCC email here", "forminator" ), ), // src/form/components/modals/notification.js:
|
693 |
-
"BCC Emails" => array( null, __("BCC Emails", "forminator" ), ), // src/form/components/modals/notification.js:
|
694 |
-
"Discard Changes" => array( null, __("Discard Changes", "forminator" ), ), // src/form/components/modals/notification.js:
|
695 |
-
"Add" => array( null, __("Add", "forminator" ), ), // src/form/components/modals/notification.js:
|
696 |
"Labels" => array( null, __("Labels", "forminator" ), ), // src/form/components/modals/pagination.js:79
|
697 |
"Your form is divided into multiple pages by Page Break field(s), and you can customize the label of each page here. Page names appear on your form header along with the progress indicator." => array( null, __("Your form is divided into multiple pages by Page Break field(s), and you can customize the label of each page here. Page names appear on your form header along with the progress indicator.", "forminator" ), ), // src/form/components/modals/pagination.js:107
|
698 |
"Finish" => array( null, __("Finish", "forminator" ), ), // src/form/components/modals/pagination.js:134
|
@@ -728,7 +741,9 @@ $forminator_admin_locale = array(
|
|
728 |
"Copy shortcode" => array( null, __("Copy shortcode", "forminator" ), ), // src/form/components/modals/shortcode.js:49
|
729 |
"Button text" => array( null, __("Button text", "forminator" ), ), // src/form/components/modals/submit.js:102
|
730 |
"Enter message" => array( null, __("Enter message", "forminator" ), ), // src/form/components/modals/submit.js:115
|
731 |
-
"
|
|
|
|
|
732 |
"Preview" => array( null, __("Preview", "forminator" ), ), // src/form/components/navigation/preview.js:16
|
733 |
"You can send customized email notifications to your site admins and visitors on successful form submission. Advanced features like email routing and conditional emails provide granular control over the email notifications." => array( null, __("You can send customized email notifications to your site admins and visitors on successful form submission. Advanced features like email routing and conditional emails provide granular control over the email notifications.", "forminator" ), ), // src/form/components/notifications.js:36
|
734 |
"Admin Email" => array( null, __("Admin Email", "forminator" ), ), // src/form/components/notifications/admin-email.js:296
|
@@ -943,10 +958,19 @@ $forminator_admin_locale = array(
|
|
943 |
"Add classes that will be output on this field's container to aid your theme's default styling." => array( null, __("Add classes that will be output on this field's container to aid your theme's default styling.", "forminator" ), ), // src/form/components/settings/styling.js:21
|
944 |
"E.g. form-field" => array( null, __("E.g. form-field", "forminator" ), ), // src/form/components/settings/styling.js:30
|
945 |
"These will be output as you see them here." => array( null, __("These will be output as you see them here.", "forminator" ), ), // src/form/components/settings/styling.js:38
|
946 |
-
"
|
947 |
-
"
|
948 |
-
"
|
949 |
-
"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
950 |
"You have unsaved changes, are you sure want to leave this page" => array( null, __("You have unsaved changes, are you sure want to leave this page", "forminator" ), ), // src/form/containers/main.js:52
|
951 |
"Details" => array( null, __("Details", "forminator" ), ), // src/poll/components/appearance.js:51
|
952 |
"Use default colors" => array( null, __("Use default colors", "forminator" ), ), // src/poll/components/appearance/colors.js:47
|
@@ -986,6 +1010,26 @@ $forminator_admin_locale = array(
|
|
986 |
"Choose the method you want to use to limit the number of votes." => array( null, __("Choose the method you want to use to limit the number of votes.", "forminator" ), ), // src/poll/components/behaviour/limits.js:109
|
987 |
"User IP" => array( null, __("User IP", "forminator" ), ), // src/poll/components/behaviour/limits.js:117
|
988 |
"Browser Cookie" => array( null, __("Browser Cookie", "forminator" ), ), // src/poll/components/behaviour/limits.js:118
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
989 |
"Choose how you want your poll to be rendered for users." => array( null, __("Choose how you want your poll to be rendered for users.", "forminator" ), ), // src/poll/components/behaviour/render.js:14
|
990 |
"Load poll using AJAX" => array( null, __("Load poll using AJAX", "forminator" ), ), // src/poll/components/behaviour/render.js:22
|
991 |
"Enabling this feature will load the poll via AJAX after the page has loaded up, effectively speeding up your page load time. This method can also (in most cases) avoid page caching issues with your poll." => array( null, __("Enabling this feature will load the poll via AJAX after the page has loaded up, effectively speeding up your page load time. This method can also (in most cases) avoid page caching issues with your poll.", "forminator" ), ), // src/poll/components/behaviour/render.js:23
|
@@ -1021,14 +1065,16 @@ $forminator_admin_locale = array(
|
|
1021 |
"Customize the button label used for submitting the users answer." => array( null, __("Customize the button label used for submitting the users answer.", "forminator" ), ), // src/poll/components/builder/details.js:97
|
1022 |
"Button Text" => array( null, __("Button Text", "forminator" ), ), // src/poll/components/builder/details.js:108
|
1023 |
"E.g. Vote" => array( null, __("E.g. Vote", "forminator" ), ), // src/poll/components/builder/details.js:110
|
1024 |
-
"Edit Poll" => array( null, __("Edit Poll", "forminator" ), ), // src/poll/components/header.js:
|
|
|
|
|
1025 |
"You need to save this poll before using integrations." => array( null, __("You need to save this poll before using integrations.", "forminator" ), ), // src/poll/components/integrations.js:113
|
1026 |
"Poll answers can not be empty." => array( null, __("Poll answers can not be empty.", "forminator" ), ), // src/poll/components/meta.js:100
|
1027 |
"Please enter valid voting limit." => array( null, __("Please enter valid voting limit.", "forminator" ), ), // src/poll/components/meta.js:116
|
1028 |
"Deleting this answer" => array( null, __("Deleting this answer", "forminator" ), ), // src/poll/components/modals/delete.js:40
|
1029 |
"Publishing poll…" => array( null, __("Publishing poll…", "forminator" ), ), // src/poll/components/modals/publish.js:18
|
1030 |
"Your poll 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 poll 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/poll/components/modals/shortcode.js:37
|
1031 |
-
"Notifications" => array( null, __("Notifications", "forminator" ), ), // src/poll/components/navigation/menu.js:
|
1032 |
"Optionally, you can send a notification email to nominated email accounts when poll submissions come in." => array( null, __("Optionally, you can send a notification email to nominated email accounts when poll submissions come in.", "forminator" ), ), // src/poll/components/notifications/admin-email.js:243
|
1033 |
"Poll Name" => array( null, __("Poll Name", "forminator" ), ), // src/poll/components/notifications/admin-email.js:367
|
1034 |
"Poll Answer" => array( null, __("Poll Answer", "forminator" ), ), // src/poll/components/notifications/admin-email.js:368
|
@@ -1104,8 +1150,8 @@ $forminator_admin_locale = array(
|
|
1104 |
"Select Personality" => array( null, __("Select Personality", "forminator" ), ), // src/quiz/global/components/builder/answer.js:117
|
1105 |
"Add Question" => array( null, __("Add Question", "forminator" ), ), // src/quiz/global/components/builder/questions.js:102
|
1106 |
"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
|
1107 |
-
"Edit Quiz" => array( null, __("Edit Quiz", "forminator" ), ), // src/quiz/global/components/header.js:
|
1108 |
-
"Give your quiz a name" => array( null, __("Give your quiz a name", "forminator" ), ), // src/quiz/global/components/header/title.js:
|
1109 |
"You need to save this quiz before using integrations." => array( null, __("You need to save this quiz before using integrations.", "forminator" ), ), // src/quiz/global/components/integrations.js:113
|
1110 |
"Intro" => array( null, __("Intro", "forminator" ), ), // src/quiz/global/components/intro.js:29
|
1111 |
"Start by adding a title for your quiz to let your visitors know what this quiz is all about." => array( null, __("Start by adding a title for your quiz to let your visitors know what this quiz is all about.", "forminator" ), ), // src/quiz/global/components/intro.js:40
|
@@ -1117,6 +1163,20 @@ $forminator_admin_locale = array(
|
|
1117 |
"Provide your visitors with more information about your quiz." => array( null, __("Provide your visitors with more information about your quiz.", "forminator" ), ), // src/quiz/global/components/intro.js:100
|
1118 |
"Questions" => array( null, __("Questions", "forminator" ), ), // src/quiz/global/components/intro.js:134
|
1119 |
"Personalities" => array( null, __("Personalities", "forminator" ), ), // src/quiz/global/components/intro.js:144
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1120 |
"Delete personality %s" => array( null, __("Delete personality %s", "forminator" ), ), // src/quiz/global/components/modals/delete-personality.js:45
|
1121 |
"Are you sure you wish to delete this personality?" => array( null, __("Are you sure you wish to delete this personality?", "forminator" ), ), // src/quiz/global/components/modals/delete-personality.js:61
|
1122 |
"Edit Question" => array( null, __("Edit Question", "forminator" ), ), // src/quiz/global/components/modals/delete-personality.js:103
|
@@ -1124,6 +1184,10 @@ $forminator_admin_locale = array(
|
|
1124 |
"Please remove the reference of this Personality from the questions in your quiz and then delete this." => array( null, __("Please remove the reference of this Personality from the questions in your quiz and then delete this.", "forminator" ), ), // src/quiz/global/components/modals/delete-personality.js:129
|
1125 |
"Delete Question" => array( null, __("Delete Question", "forminator" ), ), // src/quiz/global/components/modals/delete.js:26
|
1126 |
"Deleting this question will remove its value from the existing submissions as well." => array( null, __("Deleting this question will remove its value from the existing submissions as well.", "forminator" ), ), // src/quiz/global/components/modals/delete.js:38
|
|
|
|
|
|
|
|
|
1127 |
"Add Personality" => array( null, __("Add Personality", "forminator" ), ), // src/quiz/global/components/modals/personality.js:60
|
1128 |
"Edit Personality" => array( null, __("Edit Personality", "forminator" ), ), // src/quiz/global/components/modals/personality.js:61
|
1129 |
"E.g. Iron Man" => array( null, __("E.g. Iron Man", "forminator" ), ), // src/quiz/global/components/modals/personality.js:97
|
@@ -1142,8 +1206,15 @@ $forminator_admin_locale = array(
|
|
1142 |
"Custom CSS Classes" => array( null, __("Custom CSS Classes", "forminator" ), ), // src/quiz/global/components/modals/submit.js:77
|
1143 |
"E.g. form-submit-btn" => array( null, __("E.g. form-submit-btn", "forminator" ), ), // src/quiz/global/components/modals/submit.js:78
|
1144 |
"These will be output as you see them here. To add multiple classes, separate them with a space. For example, \"form-submit-btn button\" will add two classes \"form-submit-btn\" and \"button\"." => array( null, __("These will be output as you see them here. To add multiple classes, separate them with a space. For example, \"form-submit-btn button\" will add two classes \"form-submit-btn\" and \"button\".", "forminator" ), ), // src/quiz/global/components/modals/submit.js:80
|
|
|
1145 |
"Optionally, you can send a notification email to nominated email accounts when quiz submissions come in." => array( null, __("Optionally, you can send a notification email to nominated email accounts when quiz submissions come in.", "forminator" ), ), // src/quiz/global/components/notifications/admin-email.js:243
|
1146 |
"Add as many emails as you like" => array( null, __("Add as many emails as you like", "forminator" ), ), // src/quiz/global/components/notifications/admin-email.js:296
|
|
|
|
|
|
|
|
|
|
|
|
|
1147 |
"e.g. 0.75em" => array( null, __("e.g. 0.75em", "forminator" ), ), // src/quiz/global/components/settings/fonts.js:102
|
1148 |
"Choose how you want to handle this quiz's data storage. By default we'll use the configuration you've set in your {{link}}global privacy settings{{/link}}." => array( null, __("Choose how you want to handle this quiz's data storage. By default we'll use the configuration you've set in your {{link}}global privacy settings{{/link}}.", "forminator" ), ), // src/quiz/global/components/settings/privacy.js:34
|
1149 |
"How long do you want to retain this quiz's submissions for?" => array( null, __("How long do you want to retain this quiz's submissions for?", "forminator" ), ), // src/quiz/global/components/settings/privacy.js:52
|
@@ -1152,19 +1223,22 @@ $forminator_admin_locale = array(
|
|
1152 |
"Wrong" => array( null, __("Wrong", "forminator" ), ), // src/quiz/knowledge/components/appearance/colors/answer-checkbox.js:119
|
1153 |
"Answer text color" => array( null, __("Answer text color", "forminator" ), ), // src/quiz/knowledge/components/appearance/colors/answer-text.js:28
|
1154 |
"Answer result message" => array( null, __("Answer result message", "forminator" ), ), // src/quiz/knowledge/components/appearance/colors/answer-text.js:34
|
1155 |
-
"
|
|
|
|
|
1156 |
"Basic" => array( null, __("Basic", "forminator" ), ), // src/quiz/knowledge/components/appearance/colors/colors-table.js:24
|
1157 |
"Answer - Container" => array( null, __("Answer - Container", "forminator" ), ), // src/quiz/knowledge/components/appearance/colors/colors-table.js:31
|
1158 |
"Answer - Checkbox" => array( null, __("Answer - Checkbox", "forminator" ), ), // src/quiz/knowledge/components/appearance/colors/colors-table.js:38
|
1159 |
"Answer - Text" => array( null, __("Answer - Text", "forminator" ), ), // src/quiz/knowledge/components/appearance/colors/colors-table.js:45
|
1160 |
"Social Share" => array( null, __("Social Share", "forminator" ), ), // src/quiz/knowledge/components/appearance/colors/colors-table.js:59
|
1161 |
"By default this quiz will inherit the fonts your theme uses. You can override these fonts with custom ones from Google Fonts." => array( null, __("By default this quiz will inherit the fonts your theme uses. You can override these fonts with custom ones from Google Fonts.", "forminator" ), ), // src/quiz/knowledge/components/appearance/fonts.js:15
|
1162 |
-
"Quiz Title" => array( null, __("Quiz Title", "forminator" ), ), // src/quiz/knowledge/components/appearance/fonts/fonts-table.js:
|
1163 |
-
"Quiz Description" => array( null, __("Quiz Description", "forminator" ), ), // src/quiz/knowledge/components/appearance/fonts/fonts-table.js:
|
1164 |
-
"Answer" => array( null, __("Answer", "forminator" ), ), // src/quiz/knowledge/components/appearance/fonts/fonts-table.js:
|
1165 |
-
"Answer Result Message" => array( null, __("Answer Result Message", "forminator" ), ), // src/quiz/knowledge/components/appearance/fonts/fonts-table.js:
|
1166 |
-
"Social Share Title" => array( null, __("Social Share Title", "forminator" ), ), // src/quiz/knowledge/components/appearance/fonts/fonts-table.js:
|
1167 |
-
"Social Share Icons" => array( null, __("Social Share Icons", "forminator" ), ), // src/quiz/knowledge/components/appearance/fonts/fonts-table.js:
|
|
|
1168 |
"Icon size" => array( null, __("Icon size", "forminator" ), ), // src/quiz/knowledge/components/appearance/fonts/social-icons.js:18
|
1169 |
"Choose one of the pre-defined sizes we have for social share icons." => array( null, __("Choose one of the pre-defined sizes we have for social share icons.", "forminator" ), ), // src/quiz/knowledge/components/appearance/fonts/social-icons.js:19
|
1170 |
"Regular" => array( null, __("Regular", "forminator" ), ), // src/quiz/knowledge/components/appearance/fonts/social-icons.js:24
|
@@ -1179,6 +1253,19 @@ $forminator_admin_locale = array(
|
|
1179 |
"Let's add the different personalities. Each of the following personality is a possible outcome of your quiz. In case of a tie, the personality is chosen as per their order below." => array( null, __("Let's add the different personalities. Each of the following personality is a possible outcome of your quiz. In case of a tie, the personality is chosen as per their order below.", "forminator" ), ), // src/quiz/personality/components/personalities.js:33
|
1180 |
"Reorder the personalities to set the priority order." => array( null, __("Reorder the personalities to set the priority order.", "forminator" ), ), // src/quiz/personality/components/personalities.js:50
|
1181 |
"Define the different personalities possible as the outcome of your quiz here." => array( null, __("Define the different personalities possible as the outcome of your quiz here.", "forminator" ), ), // src/quiz/personality/components/personalities/personalities.js:104
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1182 |
"Basic selectors" => array( null, __("Basic selectors", "forminator" ), ), // src/settings/inputs/ace-editor.js:63
|
1183 |
"Form" => array( null, __("Form", "forminator" ), ), // src/settings/inputs/ace-editor.js:68
|
1184 |
"Field Description" => array( null, __("Field Description", "forminator" ), ), // src/settings/inputs/ace-editor.js:96
|
@@ -1204,6 +1291,8 @@ $forminator_admin_locale = array(
|
|
1204 |
"You can preview your form and check if the formula is generating expected results." => array( null, __("You can preview your form and check if the formula is generating expected results.", "forminator" ), ), // src/settings/inputs/calculation.js:361
|
1205 |
"Formula Preview" => array( null, __("Formula Preview", "forminator" ), ), // src/settings/inputs/calculation.js:370
|
1206 |
"Remove this date range" => array( null, __("Remove this date range", "forminator" ), ), // src/settings/inputs/date-picker.js:84
|
|
|
|
|
1207 |
"This field is required!" => array( null, __("This field is required!", "forminator" ), ), // src/settings/inputs/input.js:39
|
1208 |
"Please enter valid number." => array( null, __("Please enter valid number.", "forminator" ), ), // src/settings/inputs/input.js:120
|
1209 |
"Click here to add a date range..." => array( null, __("Click here to add a date range...", "forminator" ), ), // src/settings/inputs/sui-tags-date-range.js:24
|
@@ -1220,20 +1309,28 @@ $forminator_admin_locale = array(
|
|
1220 |
"Form Name" => array( null, __("Form Name", "forminator" ), ), // src/settings/inputs/wp-editor.js:255
|
1221 |
"All Form Fields" => array( null, __("All Form Fields", "forminator" ), ), // src/settings/inputs/wp-editor.js:265
|
1222 |
"All Non Empty Fields" => array( null, __("All Non Empty Fields", "forminator" ), ), // src/settings/inputs/wp-editor.js:275
|
1223 |
-
"Add form data" => array( null, __("Add form data", "forminator" ), ), // src/settings/inputs/wp-editor.js:
|
1224 |
-
"is having" => array( null, __("is having", "forminator" ), ), // src/utils.js:
|
1225 |
-
"is" => array( null, __("is", "forminator" ), ), // src/utils.js:
|
1226 |
-
"is not having" => array( null, __("is not having", "forminator" ), ), // src/utils.js:
|
1227 |
-
"is not" => array( null, __("is not", "forminator" ), ), // src/utils.js:
|
1228 |
-
"day is" => array( null, __("day is", "forminator" ), ), // src/utils.js:
|
1229 |
-
"day is not" => array( null, __("day is not", "forminator" ), ), // src/utils.js:
|
1230 |
-
"month is not" => array( null, __("month is not", "forminator" ), ), // src/utils.js:
|
1231 |
-
"month is" => array( null, __("month is", "forminator" ), ), // src/utils.js:
|
1232 |
-
"is
|
1233 |
-
"is
|
1234 |
-
"
|
1235 |
-
"
|
1236 |
-
"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1237 |
);
|
1238 |
return $forminator_admin_locale;
|
1239 |
/* THIS IS THE END OF THE GENERATED FILE */
|
6 |
"Behaviour" => array( null, __("Behaviour", "forminator" ), ), // src/form/components/appearance.js:113
|
7 |
"User Registration" => array( null, __("User Registration", "forminator" ), ), // src/form/components/appearance.js:121
|
8 |
"User Login" => array( null, __("User Login", "forminator" ), ), // src/form/components/appearance.js:129
|
9 |
+
"Colors" => array( null, __("Colors", "forminator" ), ), // src/form/components/appearance/colors.js:174
|
10 |
+
"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:175
|
11 |
+
"Use Default Colors" => array( null, __("Use Default Colors", "forminator" ), ), // src/form/components/appearance/colors.js:189
|
12 |
+
"Custom" => array( null, __("Custom", "forminator" ), ), // src/form/components/appearance/colors.js:192
|
13 |
+
"Element" => array( null, __("Element", "forminator" ), ), // src/form/components/appearance/colors.js:197
|
14 |
+
"Form Container" => array( null, __("Form Container", "forminator" ), ), // src/form/components/appearance/colors.js:202
|
15 |
+
"Submission Indicator" => array( null, __("Submission Indicator", "forminator" ), ), // src/form/components/appearance/colors.js:210
|
16 |
+
"Response Success" => array( null, __("Response Success", "forminator" ), ), // src/form/components/appearance/colors.js:218
|
17 |
+
"Successful response message will be displayed after form submission succeeds." => array( null, __("Successful response message will be displayed after form submission succeeds.", "forminator" ), ), // src/form/components/appearance/colors.js:220
|
18 |
+
"Response Error" => array( null, __("Response Error", "forminator" ), ), // src/form/components/appearance/colors.js:229
|
19 |
+
"Error response message will be displayed after form submission fails." => array( null, __("Error response message will be displayed after form submission fails.", "forminator" ), ), // src/form/components/appearance/colors.js:231
|
20 |
+
"Pagination Steps" => array( null, __("Pagination Steps", "forminator" ), ), // src/form/components/appearance/colors.js:243
|
21 |
+
"Pagination Progress Bar" => array( null, __("Pagination Progress Bar", "forminator" ), ), // src/form/components/appearance/colors.js:251
|
22 |
+
"Fields Basics" => array( null, __("Fields Basics", "forminator" ), ), // src/form/components/appearance/colors.js:261
|
23 |
+
"Section" => array( null, __("Section", "forminator" ), ), // src/form/components/appearance/colors.js:269
|
24 |
+
"Input and Textarea" => array( null, __("Input and Textarea", "forminator" ), ), // src/form/components/appearance/colors.js:277
|
25 |
+
"Input Extras" => array( null, __("Input Extras", "forminator" ), ), // src/form/components/appearance/colors.js:290
|
26 |
+
"Radio and Checkbox" => array( null, __("Radio and Checkbox", "forminator" ), ), // src/form/components/appearance/colors.js:303
|
27 |
+
"Select" => array( null, __("Select", "forminator" ), ), // src/form/components/appearance/colors.js:319
|
28 |
+
"Dropdown List" => array( null, __("Dropdown List", "forminator" ), ), // src/form/components/appearance/colors.js:325
|
29 |
+
"Dropdown Search" => array( null, __("Dropdown Search", "forminator" ), ), // src/form/components/appearance/colors.js:335
|
30 |
+
"Multi Select" => array( null, __("Multi Select", "forminator" ), ), // src/form/components/appearance/colors.js:347
|
31 |
+
"Calendar Basics" => array( null, __("Calendar Basics", "forminator" ), ), // src/form/components/appearance/colors.js:358
|
32 |
+
"Calendar Table" => array( null, __("Calendar Table", "forminator" ), ), // src/form/components/appearance/colors.js:365
|
33 |
+
"File Upload" => array( null, __("File Upload", "forminator" ), ), // src/form/components/appearance/colors.js:377
|
34 |
+
"E-Signature" => array( null, __("E-Signature", "forminator" ), ), // src/form/components/appearance/colors.js:391
|
35 |
+
"Button Back" => array( null, __("Button Back", "forminator" ), ), // src/form/components/appearance/colors.js:413
|
36 |
+
"Button Next" => array( null, __("Button Next", "forminator" ), ), // src/form/components/appearance/colors.js:420
|
37 |
+
"Submit Button" => array( null, __("Submit Button", "forminator" ), ), // src/form/components/appearance/colors.js:430
|
38 |
"Container" => array( null, __("Container", "forminator" ), ), // src/form/components/appearance/colors/calendar-basics.js:22
|
39 |
"Border" => array( null, __("Border", "forminator" ), ), // src/form/components/appearance/colors/calendar-basics.js:28
|
40 |
"Header background" => array( null, __("Header background", "forminator" ), ), // src/form/components/appearance/colors/calendar-basics.js:29
|
83 |
"Message link color" => array( null, __("Message link color", "forminator" ), ), // src/form/components/appearance/colors/file-upload/upload-panel-multiple.js:63
|
84 |
"Drop" => array( null, __("Drop", "forminator" ), ), // src/form/components/appearance/colors/file-upload/upload-panel-multiple.js:107
|
85 |
"Left border color" => array( null, __("Left border color", "forminator" ), ), // src/form/components/appearance/colors/file-upload/upload-panel-multiple.js:158
|
86 |
+
"Prefix color" => array( null, __("Prefix color", "forminator" ), ), // src/form/components/appearance/colors/inputs-extra.js:53
|
87 |
+
"Suffix color" => array( null, __("Suffix color", "forminator" ), ), // src/form/components/appearance/colors/inputs-extra.js:63
|
88 |
+
"Only Stripe card icon will show this color variation." => array( null, __("Only Stripe card icon will show this color variation.", "forminator" ), ), // src/form/components/appearance/colors/inputs-extra.js:121
|
89 |
"Placeholder" => array( null, __("Placeholder", "forminator" ), ), // src/form/components/appearance/colors/inputs.js:44
|
90 |
"Option border" => array( null, __("Option border", "forminator" ), ), // src/form/components/appearance/colors/multi-select.js:32
|
91 |
"Label color" => array( null, __("Label color", "forminator" ), ), // src/form/components/appearance/colors/pagination-back.js:33
|
118 |
"Text" => array( null, __("Text", "forminator" ), ), // src/form/components/appearance/design/bold.js:20
|
119 |
"Button" => array( null, __("Button", "forminator" ), ), // src/form/components/appearance/design/bold.js:22
|
120 |
"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:12
|
121 |
+
"Fonts" => array( null, __("Fonts", "forminator" ), ), // src/form/components/appearance/fonts.js:145
|
122 |
+
"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:146
|
123 |
+
"Use Theme Fonts" => array( null, __("Use Theme Fonts", "forminator" ), ), // src/form/components/appearance/fonts.js:161
|
124 |
+
"Response Message" => array( null, __("Response Message", "forminator" ), ), // src/form/components/appearance/fonts.js:173
|
125 |
+
"Fields Label" => array( null, __("Fields Label", "forminator" ), ), // src/form/components/appearance/fonts.js:222
|
126 |
+
"Fields Description" => array( null, __("Fields Description", "forminator" ), ), // src/form/components/appearance/fonts.js:236
|
127 |
+
"Fields Error Message" => array( null, __("Fields Error Message", "forminator" ), ), // src/form/components/appearance/fonts.js:250
|
128 |
+
"Section Title" => array( null, __("Section Title", "forminator" ), ), // src/form/components/appearance/fonts.js:267
|
129 |
+
"Section Subtitle" => array( null, __("Section Subtitle", "forminator" ), ), // src/form/components/appearance/fonts.js:281
|
130 |
+
"Input Prefix" => array( null, __("Input Prefix", "forminator" ), ), // src/form/components/appearance/fonts.js:312
|
131 |
+
"Input Suffix" => array( null, __("Input Suffix", "forminator" ), ), // src/form/components/appearance/fonts.js:329
|
132 |
+
"Dropdown" => array( null, __("Dropdown", "forminator" ), ), // src/form/components/appearance/fonts.js:387
|
133 |
+
"Calendar" => array( null, __("Calendar", "forminator" ), ), // src/form/components/appearance/fonts.js:405
|
134 |
+
"Single File Upload" => array( null, __("Single File Upload", "forminator" ), ), // src/form/components/appearance/fonts.js:436
|
135 |
+
"Upload Button" => array( null, __("Upload Button", "forminator" ), ), // src/form/components/appearance/fonts.js:449
|
136 |
+
"File Name" => array( null, __("File Name", "forminator" ), ), // src/form/components/appearance/fonts.js:460
|
137 |
+
"Multiple Files Upload" => array( null, __("Multiple Files Upload", "forminator" ), ), // src/form/components/appearance/fonts.js:476
|
138 |
+
"Upload Panel" => array( null, __("Upload Panel", "forminator" ), ), // src/form/components/appearance/fonts.js:489
|
139 |
+
"File Size" => array( null, __("File Size", "forminator" ), ), // src/form/components/appearance/fonts.js:511
|
140 |
+
"E-Signature Placeholder" => array( null, __("E-Signature Placeholder", "forminator" ), ), // src/form/components/appearance/fonts.js:527
|
141 |
+
"Pagination Buttons" => array( null, __("Pagination Buttons", "forminator" ), ), // src/form/components/appearance/fonts.js:545
|
142 |
"Customize the form container's padding and border." => array( null, __("Customize the form container's padding and border.", "forminator" ), ), // src/form/components/appearance/form-container.js:18
|
143 |
"Padding" => array( null, __("Padding", "forminator" ), ), // src/form/components/appearance/form-container.js:27
|
144 |
"By default the form will fill the available space where you insert it. You can add some padding here to better suit your theme." => array( null, __("By default the form will fill the available space where you insert it. You can add some padding here to better suit your theme.", "forminator" ), ), // src/form/components/appearance/form-container.js:28
|
172 |
"Show" => array( null, __("Show", "forminator" ), ), // src/form/components/appearance/pagination.js:63
|
173 |
"Progress Bar" => array( null, __("Progress Bar", "forminator" ), ), // src/form/components/appearance/pagination.js:72
|
174 |
"Steps" => array( null, __("Steps", "forminator" ), ), // src/form/components/appearance/pagination.js:78
|
175 |
+
"Some of the settings you'd find in a regular form are unavailable in this form template because they are either unnecessary or controlled by the parent quiz automatically." => array( null, __("Some of the settings you'd find in a regular form are unavailable in this form template because they are either unnecessary or controlled by the parent quiz automatically.", "forminator" ), ), // src/form/components/behaviour.js:54
|
176 |
+
"Settings" => array( null, __("Settings", "forminator" ), ), // src/form/components/behaviour.js:106
|
177 |
+
"Email Notifications" => array( null, __("Email Notifications", "forminator" ), ), // src/form/components/behaviour.js:115
|
178 |
"Form does not have fields that can be autofilled." => array( null, __("Form does not have fields that can be autofilled.", "forminator" ), ), // src/form/components/behaviour/autofill.js:61
|
179 |
"Autofill" => array( null, __("Autofill", "forminator" ), ), // src/form/components/behaviour/autofill.js:159
|
180 |
"If the user filling out the form is logged in, we can auto-fill fields with any available data." => array( null, __("If the user filling out the form is logged in, we can auto-fill fields with any available data.", "forminator" ), ), // src/form/components/behaviour/autofill.js:161
|
211 |
"Lock down your form submissions to registered users only." => array( null, __("Lock down your form submissions to registered users only.", "forminator" ), ), // src/form/components/behaviour/security.js:39
|
212 |
"Submission Behaviour" => array( null, __("Submission Behaviour", "forminator" ), ), // src/form/components/behaviour/submission.js:50
|
213 |
"Choose what you want to happen after your visitor has successfully submitted this form." => array( null, __("Choose what you want to happen after your visitor has successfully submitted this form.", "forminator" ), ), // src/form/components/behaviour/submission.js:53
|
214 |
+
"After submission" => array( null, __("After submission", "forminator" ), ), // src/form/components/behaviour/submission.js:66
|
215 |
+
"Choose what happens after a user successfully submits your form." => array( null, __("Choose what happens after a user successfully submits your form.", "forminator" ), ), // src/form/components/behaviour/submission.js:68
|
216 |
+
"Inline Message" => array( null, __("Inline Message", "forminator" ), ), // src/form/components/behaviour/submission.js:75
|
217 |
+
"Display a success message after form submitted." => array( null, __("Display a success message after form submitted.", "forminator" ), ), // src/form/components/behaviour/submission.js:82
|
218 |
+
"Auto-close success message after" => array( null, __("Auto-close success message after", "forminator" ), ), // src/form/components/behaviour/submission.js:143
|
219 |
+
"E.g. 5" => array( null, __("E.g. 5", "forminator" ), ), // src/form/components/behaviour/submission.js:150
|
220 |
+
"seconds." => array( null, __("seconds.", "forminator" ), ), // src/form/components/behaviour/submission.js:159
|
221 |
+
"Redirect user to a URL" => array( null, __("Redirect user to a URL", "forminator" ), ), // src/form/components/behaviour/submission.js:169
|
222 |
+
"https://www.mywebsite.com" => array( null, __("https://www.mywebsite.com", "forminator" ), ), // src/form/components/behaviour/submission.js:175
|
223 |
+
"Redirect URL" => array( null, __("Redirect URL", "forminator" ), ), // src/form/components/behaviour/submission.js:177
|
224 |
+
"Provide the absolute URL of the page you want to redirect users to after submitting the login form. For example, to redirect users to the WordPress admin, use the URL {{strong}}http://www.website.com/wp-admin/{{/strong}}." => array( null, __("Provide the absolute URL of the page you want to redirect users to after submitting the login form. For example, to redirect users to the WordPress admin, use the URL {{strong}}http://www.website.com/wp-admin/{{/strong}}.", "forminator" ), ), // src/form/components/behaviour/submission.js:179
|
225 |
+
"Redirection Option" => array( null, __("Redirection Option", "forminator" ), ), // src/form/components/behaviour/submission.js:206
|
226 |
+
"Redirect on the same tab" => array( null, __("Redirect on the same tab", "forminator" ), ), // src/form/components/behaviour/submission.js:210
|
227 |
+
"Redirect on new tab and show thank you message on form page" => array( null, __("Redirect on new tab and show thank you message on form page", "forminator" ), ), // src/form/components/behaviour/submission.js:211
|
228 |
+
"Redirect on new tab and hide form on the form page" => array( null, __("Redirect on new tab and hide form on the form page", "forminator" ), ), // src/form/components/behaviour/submission.js:212
|
229 |
+
"Hide form" => array( null, __("Hide form", "forminator" ), ), // src/form/components/behaviour/submission.js:222
|
230 |
+
"Submit Message" => array( null, __("Submit Message", "forminator" ), ), // src/form/components/behaviour/submission.js:234
|
231 |
+
"Method" => array( null, __("Method", "forminator" ), ), // src/form/components/behaviour/submission.js:276
|
232 |
+
"Choose whether you want to use AJAX to send this form without reloading the page, or use the more traditional method of reloading the page." => array( null, __("Choose whether you want to use AJAX to send this form without reloading the page, or use the more traditional method of reloading the page.", "forminator" ), ), // src/form/components/behaviour/submission.js:277
|
233 |
+
"Ajax" => array( null, __("Ajax", "forminator" ), ), // src/form/components/behaviour/submission.js:285
|
234 |
+
"Ajax method, when used with the Stripe field, will hide your form after the successful submission and show your inline success message only. The form will be available again when the page is reloaded." => array( null, __("Ajax method, when used with the Stripe field, will hide your form after the successful submission and show your inline success message only. The form will be available again when the page is reloaded.", "forminator" ), ), // src/form/components/behaviour/submission.js:290
|
235 |
+
"Page Reload" => array( null, __("Page Reload", "forminator" ), ), // src/form/components/behaviour/submission.js:302
|
236 |
+
"Validation" => array( null, __("Validation", "forminator" ), ), // src/form/components/behaviour/submission.js:311
|
237 |
+
"For fields that you've chosen to validate, choose how you want the validation to behave. On submission will run validation checks when the user submits the form using Ajax (recommended). The Live method will check fields at the same time as the user fills them out. Server side does the validation using PHP and returns any error messages after a page reload." => array( null, __("For fields that you've chosen to validate, choose how you want the validation to behave. On submission will run validation checks when the user submits the form using Ajax (recommended). The Live method will check fields at the same time as the user fills them out. Server side does the validation using PHP and returns any error messages after a page reload.", "forminator" ), ), // src/form/components/behaviour/submission.js:312
|
238 |
+
"On Submit" => array( null, __("On Submit", "forminator" ), ), // src/form/components/behaviour/submission.js:322
|
239 |
+
"Server Side" => array( null, __("Server Side", "forminator" ), ), // src/form/components/behaviour/submission.js:323
|
240 |
+
"Enable inline validation (as user types)" => array( null, __("Enable inline validation (as user types)", "forminator" ), ), // src/form/components/behaviour/submission.js:327
|
241 |
+
"Choose whether you want to show a loader on your form until it is submitted. We highly recommend using this on long forms or forms with payment field since they may take a few seconds to submit." => array( null, __("Choose whether you want to show a loader on your form until it is submitted. We highly recommend using this on long forms or forms with payment field since they may take a few seconds to submit.", "forminator" ), ), // src/form/components/behaviour/submission.js:337
|
242 |
+
"Show Loader" => array( null, __("Show Loader", "forminator" ), ), // src/form/components/behaviour/submission.js:347
|
243 |
+
"E.g. Submitting..." => array( null, __("E.g. Submitting...", "forminator" ), ), // src/form/components/behaviour/submission.js:352
|
244 |
+
"Choose the text to show on the right of loading icon" => array( null, __("Choose the text to show on the right of loading icon", "forminator" ), ), // src/form/components/behaviour/submission.js:355
|
245 |
"null" => array( null, __("null", "forminator" ), ), // src/form/components/builder/field.js:638
|
246 |
"more condition(s)" => array( null, __("more condition(s)", "forminator" ), ), // src/form/components/builder/field.js:685
|
247 |
"if" => array( null, __("if", "forminator" ), ), // src/form/components/builder/field.js:690
|
251 |
"Delete" => array( null, __("Delete", "forminator" ), ), // src/form/components/builder/field.js:859
|
252 |
"Insert Fields" => array( null, __("Insert Fields", "forminator" ), ), // src/form/components/builder/insert-fields.js:17
|
253 |
" Insert Fields" => array( null, __(" Insert Fields", "forminator" ), ), // src/form/components/builder/insert-fields.js:43
|
254 |
+
"A form without fields isn’t going to be very useful… Add your first field above!" => array( null, __("A form without fields isn’t going to be very useful… Add your first field above!", "forminator" ), ), // src/form/components/builder/insert-fields.js:55
|
255 |
"Since you are using Page Break field(s) to divide your form into multiple pages, use the pagination settings to customize the page label, progress indicator, and the buttons on each page." => array( null, __("Since you are using Page Break field(s) to divide your form into multiple pages, use the pagination settings to customize the page label, progress indicator, and the buttons on each page.", "forminator" ), ), // src/form/components/builder/pagination.js:41
|
256 |
"Edit field" => array( null, __("Edit field", "forminator" ), ), // src/form/components/builder/pagination.js:74
|
257 |
"PayPal Checkout" => array( null, __("PayPal Checkout", "forminator" ), ), // src/form/components/builder/paypal.js:204
|
273 |
"Description (optional)" => array( null, __("Description (optional)", "forminator" ), ), // src/form/components/fields/address.js:122
|
274 |
"Enter description" => array( null, __("Enter description", "forminator" ), ), // src/form/components/fields/address.js:123
|
275 |
"At least one field must be enabled" => array( null, __("At least one field must be enabled", "forminator" ), ), // src/form/components/fields/address.js:235
|
276 |
+
"Field Type" => array( null, __("Field Type", "forminator" ), ), // src/form/components/fields/calculation.js:78
|
277 |
+
"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:86
|
278 |
+
"Read-only" => array( null, __("Read-only", "forminator" ), ), // src/form/components/fields/calculation.js:97
|
279 |
+
"Hidden" => array( null, __("Hidden", "forminator" ), ), // src/form/components/fields/calculation.js:107
|
280 |
+
"Formatting" => array( null, __("Formatting", "forminator" ), ), // src/form/components/fields/calculation.js:117
|
281 |
+
"Choose how do you want to format the value of this field." => array( null, __("Choose how do you want to format the value of this field.", "forminator" ), ), // src/form/components/fields/calculation.js:125
|
282 |
+
"E.g. $" => array( null, __("E.g. $", "forminator" ), ), // src/form/components/fields/calculation.js:138
|
283 |
+
"Prefix" => array( null, __("Prefix", "forminator" ), ), // src/form/components/fields/calculation.js:140
|
284 |
+
"E.g. Kg" => array( null, __("E.g. Kg", "forminator" ), ), // src/form/components/fields/calculation.js:150
|
285 |
+
"Suffix" => array( null, __("Suffix", "forminator" ), ), // src/form/components/fields/calculation.js:152
|
286 |
+
"Decimal Places" => array( null, __("Decimal Places", "forminator" ), ), // src/form/components/fields/calculation.js:329
|
287 |
+
"Choose the decimal places to round off the calculated result." => array( null, __("Choose the decimal places to round off the calculated result.", "forminator" ), ), // src/form/components/fields/calculation.js:337
|
288 |
+
"decimals" => array( null, __("decimals", "forminator" ), ), // src/form/components/fields/calculation.js:362
|
289 |
+
"You can't set visibility conditions for a hidden field. Uncheck the Hidden option in the settings tab and come back here to define visibility rules." => array( null, __("You can't set visibility conditions for a hidden field. Uncheck the Hidden option in the settings tab and come back here to define visibility rules.", "forminator" ), ), // src/form/components/fields/calculation.js:381
|
290 |
"reCAPTCHA type" => array( null, __("reCAPTCHA type", "forminator" ), ), // src/form/components/fields/captcha.js:35
|
291 |
"Choose the reCAPTCHA type you want to use on your form. You can read more about the different reCAPTCHA types {{link}}here{{/link}} and then choose the one which suits you the best." => array( null, __("Choose the reCAPTCHA type you want to use on your form. You can read more about the different reCAPTCHA types {{link}}here{{/link}} and then choose the one which suits you the best.", "forminator" ), ), // src/form/components/fields/captcha.js:38
|
292 |
"V2 Checkbox" => array( null, __("V2 Checkbox", "forminator" ), ), // src/form/components/fields/captcha.js:61
|
316 |
"Automatic" => array( null, __("Automatic", "forminator" ), ), // src/form/components/fields/captcha.js:237
|
317 |
"Error Message" => array( null, __("Error Message", "forminator" ), ), // src/form/components/fields/captcha.js:255
|
318 |
"Choose the error message you want to display on your form when reCAPTCHA verification fails." => array( null, __("Choose the error message you want to display on your form when reCAPTCHA verification fails.", "forminator" ), ), // src/form/components/fields/captcha.js:260
|
319 |
+
"Default Value (optional)" => array( null, __("Default Value (optional)", "forminator" ), ), // src/form/components/fields/currency.js:68
|
320 |
+
"Enter default value" => array( null, __("Enter default value", "forminator" ), ), // src/form/components/fields/currency.js:69
|
321 |
+
"Currency" => array( null, __("Currency", "forminator" ), ), // src/form/components/fields/currency.js:100
|
322 |
+
"Choose the currency to display on the field. If you are going to collect payments based on this field, it is recommended to keep this currency same as your charge currency to avoid any confusions." => array( null, __("Choose the currency to display on the field. If you are going to collect payments based on this field, it is recommended to keep this currency same as your charge currency to avoid any confusions.", "forminator" ), ), // src/form/components/fields/currency.js:108
|
323 |
+
"Decimal Points" => array( null, __("Decimal Points", "forminator" ), ), // src/form/components/fields/currency.js:132
|
324 |
+
"Set the maximum number of digits that your users can enter after the decimal point." => array( null, __("Set the maximum number of digits that your users can enter after the decimal point.", "forminator" ), ), // src/form/components/fields/currency.js:140
|
325 |
+
"Limit" => array( null, __("Limit", "forminator" ), ), // src/form/components/fields/currency.js:176
|
326 |
+
"Restrict the value that your users can enter in this field within a custom range." => array( null, __("Restrict the value that your users can enter in this field within a custom range.", "forminator" ), ), // src/form/components/fields/currency.js:180
|
327 |
+
"Min" => array( null, __("Min", "forminator" ), ), // src/form/components/fields/currency.js:195
|
328 |
+
"Max" => array( null, __("Max", "forminator" ), ), // src/form/components/fields/currency.js:204
|
329 |
+
"Error Messages" => array( null, __("Error Messages", "forminator" ), ), // src/form/components/fields/currency.js:216
|
330 |
+
"When number is smaller than the min limit" => array( null, __("When number is smaller than the min limit", "forminator" ), ), // src/form/components/fields/currency.js:231
|
331 |
+
"E.g. Please enter a number greater than 0." => array( null, __("E.g. Please enter a number greater than 0.", "forminator" ), ), // src/form/components/fields/currency.js:233
|
332 |
+
"When number is greater than the max limit" => array( null, __("When number is greater than the max limit", "forminator" ), ), // src/form/components/fields/currency.js:239
|
333 |
+
"E.g. Please enter a number lower than 1000." => array( null, __("E.g. Please enter a number lower than 1000.", "forminator" ), ), // src/form/components/fields/currency.js:241
|
334 |
"Note: The query parameter's value passed in URL should match with the selected date format." => array( null, __("Note: The query parameter's value passed in URL should match with the selected date format.", "forminator" ), ), // src/form/components/fields/date.js:29
|
335 |
"Type" => array( null, __("Type", "forminator" ), ), // src/form/components/fields/date.js:42
|
336 |
"Date Format" => array( null, __("Date Format", "forminator" ), ), // src/form/components/fields/date.js:76
|
351 |
"Year" => array( null, __("Year", "forminator" ), ), // src/form/components/fields/date.js:208
|
352 |
"Text inputs" => array( null, __("Text inputs", "forminator" ), ), // src/form/components/fields/date.js:228
|
353 |
"Enter placeholder" => array( null, __("Enter placeholder", "forminator" ), ), // src/form/components/fields/date.js:299
|
354 |
+
"Default date" => array( null, __("Default date", "forminator" ), ), // src/form/components/fields/date.js:371
|
355 |
+
"Use this feature to specify a default selected date." => array( null, __("Use this feature to specify a default selected date.", "forminator" ), ), // src/form/components/fields/date.js:373
|
356 |
+
"Today" => array( null, __("Today", "forminator" ), ), // src/form/components/fields/date.js:384
|
357 |
+
"Future Date" => array( null, __("Future Date", "forminator" ), ), // src/form/components/fields/date.js:389
|
358 |
"Wrong field type!" => array( null, __("Wrong field type!", "forminator" ), ), // src/form/components/fields/email.js:36
|
359 |
"Note, the form will not submit until the user has accepted the terms." => array( null, __("Note, the form will not submit until the user has accepted the terms.", "forminator" ), ), // src/form/components/fields/gdprcheckbox.js:35
|
360 |
"Error message" => array( null, __("Error message", "forminator" ), ), // src/form/components/fields/gdprcheckbox.js:49
|
368 |
"Vertical" => array( null, __("Vertical", "forminator" ), ), // src/form/components/fields/multivalue.js:81
|
369 |
"Horizontal" => array( null, __("Horizontal", "forminator" ), ), // src/form/components/fields/multivalue.js:82
|
370 |
"Choose whether to allow this field to be used in calculations or not." => array( null, __("Choose whether to allow this field to be used in calculations or not.", "forminator" ), ), // src/form/components/fields/multivalue.js:93
|
|
|
371 |
"First Name" => array( null, __("First Name", "forminator" ), ), // src/form/components/fields/name.js:27
|
372 |
"Middle Name" => array( null, __("Middle Name", "forminator" ), ), // src/form/components/fields/name.js:31
|
373 |
"Last Name" => array( null, __("Last Name", "forminator" ), ), // src/form/components/fields/name.js:35
|
374 |
"Single" => array( null, __("Single", "forminator" ), ), // src/form/components/fields/name.js:74
|
375 |
"Multiple" => array( null, __("Multiple", "forminator" ), ), // src/form/components/fields/name.js:81
|
376 |
+
"Limits" => array( null, __("Limits", "forminator" ), ), // src/form/components/fields/number.js:84
|
377 |
+
"Set the minimum and maximum values the user can choose. Leave the fields blank to allow any number including negatives." => array( null, __("Set the minimum and maximum values the user can choose. Leave the fields blank to allow any number including negatives.", "forminator" ), ), // src/form/components/fields/number.js:85
|
378 |
+
"Minimum" => array( null, __("Minimum", "forminator" ), ), // src/form/components/fields/number.js:95
|
379 |
+
"Maximum" => array( null, __("Maximum", "forminator" ), ), // src/form/components/fields/number.js:103
|
380 |
"Step label" => array( null, __("Step label", "forminator" ), ), // src/form/components/fields/pagination.js:24
|
381 |
"Enter step label" => array( null, __("Enter step label", "forminator" ), ), // src/form/components/fields/pagination.js:25
|
382 |
"Buttons Text" => array( null, __("Buttons Text", "forminator" ), ), // src/form/components/fields/pagination.js:31
|
450 |
"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:516
|
451 |
"Disable" => array( null, __("Disable", "forminator" ), ), // src/form/components/fields/paypal.js:531
|
452 |
"Enable" => array( null, __("Enable", "forminator" ), ), // src/form/components/fields/paypal.js:532
|
453 |
+
"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:36
|
454 |
+
"National" => array( null, __("National", "forminator" ), ), // src/form/components/fields/phone.js:55
|
455 |
+
"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:62
|
456 |
+
"International" => array( null, __("International", "forminator" ), ), // src/form/components/fields/phone.js:81
|
457 |
+
"Default country" => array( null, __("Default country", "forminator" ), ), // src/form/components/fields/phone.js:88
|
458 |
+
"Character Limit" => array( null, __("Character Limit", "forminator" ), ), // src/form/components/fields/phone.js:108
|
459 |
+
"Limit field to" => array( null, __("Limit field to", "forminator" ), ), // src/form/components/fields/phone.js:115
|
460 |
+
"10" => array( null, __("10", "forminator" ), ), // src/form/components/fields/phone.js:117
|
461 |
+
"Characters" => array( null, __("Characters", "forminator" ), ), // src/form/components/fields/phone.js:119
|
462 |
"Title" => array( null, __("Title", "forminator" ), ), // src/form/components/fields/postdata.js:25
|
463 |
"Content" => array( null, __("Content", "forminator" ), ), // src/form/components/fields/postdata.js:30
|
464 |
"Excerpt" => array( null, __("Excerpt", "forminator" ), ), // src/form/components/fields/postdata.js:35
|
465 |
"Featured Image" => array( null, __("Featured Image", "forminator" ), ), // src/form/components/fields/postdata.js:40
|
466 |
"Custom Fields" => array( null, __("Custom Fields", "forminator" ), ), // src/form/components/fields/postdata.js:65
|
467 |
"Allow users to submit post data with this field. By default, this will create new posts, but you can assign it to any post type in the {{strong}}Settings{{/strong}} tab." => array( null, __("Allow users to submit post data with this field. By default, this will create new posts, but you can assign it to any post type in the {{strong}}Settings{{/strong}} tab.", "forminator" ), ), // src/form/components/fields/postdata.js:85
|
468 |
+
"Post type" => array( null, __("Post type", "forminator" ), ), // src/form/components/fields/postdata.js:247
|
469 |
+
"Choose the post type associated with this field." => array( null, __("Choose the post type associated with this field.", "forminator" ), ), // src/form/components/fields/postdata.js:250
|
470 |
+
"Assigned post type" => array( null, __("Assigned post type", "forminator" ), ), // src/form/components/fields/postdata.js:257
|
471 |
+
"post" => array( null, __("post", "forminator" ), ), // src/form/components/fields/postdata.js:258
|
472 |
+
"Default status" => array( null, __("Default status", "forminator" ), ), // src/form/components/fields/postdata.js:277
|
473 |
+
"When a user submits this form, choose what status this post data is." => array( null, __("When a user submits this form, choose what status this post data is.", "forminator" ), ), // src/form/components/fields/postdata.js:281
|
474 |
+
"Status" => array( null, __("Status", "forminator" ), ), // src/form/components/fields/postdata.js:290
|
475 |
+
"pending" => array( null, __("pending", "forminator" ), ), // src/form/components/fields/postdata.js:291
|
476 |
+
"Draft" => array( null, __("Draft", "forminator" ), ), // src/form/components/fields/postdata.js:296
|
477 |
+
"Pending Review" => array( null, __("Pending Review", "forminator" ), ), // src/form/components/fields/postdata.js:299
|
478 |
+
"Published" => array( null, __("Published", "forminator" ), ), // src/form/components/fields/postdata.js:302
|
479 |
+
"Default author" => array( null, __("Default author", "forminator" ), ), // src/form/components/fields/postdata.js:311
|
480 |
+
"By default we'll assign posts to users if they're logged in, and fall back to the user specified below if you're allowing visitors to make posts. You can also override this to always assign posts to a specified user." => array( null, __("By default we'll assign posts to users if they're logged in, and fall back to the user specified below if you're allowing visitors to make posts. You can also override this to always assign posts to a specified user.", "forminator" ), ), // src/form/components/fields/postdata.js:314
|
481 |
+
"Always assign posts to this user" => array( null, __("Always assign posts to this user", "forminator" ), ), // src/form/components/fields/postdata.js:343
|
482 |
+
"Taxonomies limits" => array( null, __("Taxonomies limits", "forminator" ), ), // src/form/components/fields/postdata.js:356
|
483 |
+
"Choose whether to allow single or multiple categories or tags on this post." => array( null, __("Choose whether to allow single or multiple categories or tags on this post.", "forminator" ), ), // src/form/components/fields/postdata.js:359
|
484 |
"Enter title" => array( null, __("Enter title", "forminator" ), ), // src/form/components/fields/section.js:31
|
485 |
"Subtitle (optional)" => array( null, __("Subtitle (optional)", "forminator" ), ), // src/form/components/fields/section.js:39
|
486 |
"Enter subtitle" => array( null, __("Enter subtitle", "forminator" ), ), // src/form/components/fields/section.js:40
|
487 |
"Add a border to this section." => array( null, __("Add a border to this section.", "forminator" ), ), // src/form/components/fields/section.js:55
|
488 |
+
"Signature filetype" => array( null, __("Signature filetype", "forminator" ), ), // src/form/components/fields/signature.js:32
|
489 |
+
"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:33
|
490 |
+
"PNG" => array( null, __("PNG", "forminator" ), ), // src/form/components/fields/signature.js:43
|
491 |
+
"JPG" => array( null, __("JPG", "forminator" ), ), // src/form/components/fields/signature.js:44
|
492 |
+
"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:56
|
493 |
+
"Stroke thickness" => array( null, __("Stroke thickness", "forminator" ), ), // src/form/components/fields/signature.js:78
|
494 |
+
"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:79
|
495 |
"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
|
496 |
"Search" => array( null, __("Search", "forminator" ), ), // src/form/components/fields/singlevalue.js:112
|
497 |
"Display the search box in a dropdown" => array( null, __("Display the search box in a dropdown", "forminator" ), ), // src/form/components/fields/singlevalue.js:120
|
499 |
"You can limit submissions of each option to a certain number, and once an option reaches the submission limit, we'll hide that option from the dropdown list." => array( null, __("You can limit submissions of each option to a certain number, and once an option reaches the submission limit, we'll hide that option from the dropdown list.", "forminator" ), ), // src/form/components/fields/singlevalue.js:155
|
500 |
"You can set a limit for your options in the LABELS tab. Options for which limit field is left empty can have unlimited submissions." => array( null, __("You can set a limit for your options in the LABELS tab. Options for which limit field is left empty can have unlimited submissions.", "forminator" ), ), // src/form/components/fields/singlevalue.js:188
|
501 |
"Choose whether to allow this field to be used in calculations or not. The value used in calculations is the same as the input value of this field." => array( null, __("Choose whether to allow this field to be used in calculations or not. The value used in calculations is the same as the input value of this field.", "forminator" ), ), // src/form/components/fields/singlevalue.js:209
|
502 |
+
"Credit / Debit Card" => array( null, __("Credit / Debit Card", "forminator" ), ), // src/form/components/fields/stripe.js:145
|
503 |
+
"Choose your preferred language for the Stripe field. This will affect the placeholders language, and the card validation errors returned by the Stripe." => array( null, __("Choose your preferred language for the Stripe field. This will affect the placeholders language, and the card validation errors returned by the Stripe.", "forminator" ), ), // src/form/components/fields/stripe.js:170
|
504 |
+
"Auto" => array( null, __("Auto", "forminator" ), ), // src/form/components/fields/stripe.js:176
|
505 |
+
"English (en)" => array( null, __("English (en)", "forminator" ), ), // src/form/components/fields/stripe.js:177
|
506 |
+
"Simplified Chinese (zh)" => array( null, __("Simplified Chinese (zh)", "forminator" ), ), // src/form/components/fields/stripe.js:178
|
507 |
+
"Danish (da)" => array( null, __("Danish (da)", "forminator" ), ), // src/form/components/fields/stripe.js:179
|
508 |
+
"Dutch (nl)" => array( null, __("Dutch (nl)", "forminator" ), ), // src/form/components/fields/stripe.js:180
|
509 |
+
"Finnish (fi)" => array( null, __("Finnish (fi)", "forminator" ), ), // src/form/components/fields/stripe.js:181
|
510 |
+
"French (fr)" => array( null, __("French (fr)", "forminator" ), ), // src/form/components/fields/stripe.js:182
|
511 |
+
"German (de)" => array( null, __("German (de)", "forminator" ), ), // src/form/components/fields/stripe.js:183
|
512 |
+
"Italian (it)" => array( null, __("Italian (it)", "forminator" ), ), // src/form/components/fields/stripe.js:184
|
513 |
+
"Japanese (ja)" => array( null, __("Japanese (ja)", "forminator" ), ), // src/form/components/fields/stripe.js:185
|
514 |
+
"Norwegian (no)" => array( null, __("Norwegian (no)", "forminator" ), ), // src/form/components/fields/stripe.js:186
|
515 |
+
"Spanish (es)" => array( null, __("Spanish (es)", "forminator" ), ), // src/form/components/fields/stripe.js:187
|
516 |
+
"Swedish (sv)" => array( null, __("Swedish (sv)", "forminator" ), ), // src/form/components/fields/stripe.js:188
|
517 |
+
"Card icon" => array( null, __("Card icon", "forminator" ), ), // src/form/components/fields/stripe.js:199
|
518 |
+
"Choose whether you want to show the card icon on the Stripe field." => array( null, __("Choose whether you want to show the card icon on the Stripe field.", "forminator" ), ), // src/form/components/fields/stripe.js:200
|
519 |
+
"Postal code" => array( null, __("Postal code", "forminator" ), ), // src/form/components/fields/stripe.js:217
|
520 |
+
"Choose whether you want to collect the postal code on the Stripe field." => array( null, __("Choose whether you want to collect the postal code on the Stripe field.", "forminator" ), ), // src/form/components/fields/stripe.js:218
|
521 |
+
"Prefill (optional)" => array( null, __("Prefill (optional)", "forminator" ), ), // src/form/components/fields/stripe.js:238
|
522 |
+
"If you are already collecting ZIP code on your form, you can pre-fill it on the Stripe field." => array( null, __("If you are already collecting ZIP code on your form, you can pre-fill it on the Stripe field.", "forminator" ), ), // src/form/components/fields/stripe.js:260
|
523 |
+
"You have not connected your Stripe account with Forminator. Connect your Stripe account {{link}}here{{/link}} and then come back to configure this field." => array( null, __("You have not connected your Stripe account with Forminator. Connect your Stripe account {{link}}here{{/link}} and then come back to configure this field.", "forminator" ), ), // src/form/components/fields/stripe.js:285
|
524 |
+
"We recommend using test mode to ensure the payments are working as expected and when you are ready to start collecting live payments, switch to Live payments mode." => array( null, __("We recommend using test mode to ensure the payments are working as expected and when you are ready to start collecting live payments, switch to Live payments mode.", "forminator" ), ), // src/form/components/fields/stripe.js:307
|
525 |
+
"Test" => array( null, __("Test", "forminator" ), ), // src/form/components/fields/stripe.js:313
|
526 |
+
"It's recommended to charge in your customers' currency to drive more sales and avoid foreign exchange fee to your customers. Read more about Stripe's currency conversions {{link}}here{{/link}}." => array( null, __("It's recommended to charge in your customers' currency to drive more sales and avoid foreign exchange fee to your customers. Read more about Stripe's currency conversions {{link}}here{{/link}}.", "forminator" ), ), // src/form/components/fields/stripe.js:322
|
527 |
+
"Minimum amount required to process Stripe payments is equivalent to {{strong}}0.5 USD{{/strong}}." => array( null, __("Minimum amount required to process Stripe payments is equivalent to {{strong}}0.5 USD{{/strong}}.", "forminator" ), ), // src/form/components/fields/stripe.js:377
|
528 |
+
"Payment Receipt" => array( null, __("Payment Receipt", "forminator" ), ), // src/form/components/fields/stripe.js:447
|
529 |
+
"Choose whether you want Stripe to email a receipt to your customers on successful payment. Note that Stripe sends the email receipt only for live payments. {{link}}Customize email template{{/link}}." => array( null, __("Choose whether you want Stripe to email a receipt to your customers on successful payment. Note that Stripe sends the email receipt only for live payments. {{link}}Customize email template{{/link}}.", "forminator" ), ), // src/form/components/fields/stripe.js:455
|
530 |
+
"Email address" => array( null, __("Email address", "forminator" ), ), // src/form/components/fields/stripe.js:484
|
531 |
+
"E.g. john@doe.com" => array( null, __("E.g. john@doe.com", "forminator" ), ), // src/form/components/fields/stripe.js:486
|
532 |
+
"Select an email field" => array( null, __("Select an email field", "forminator" ), ), // src/form/components/fields/stripe.js:488
|
533 |
+
"Payment Details (optional)" => array( null, __("Payment Details (optional)", "forminator" ), ), // src/form/components/fields/stripe.js:513
|
534 |
+
"You can add a statement decipher and a description to help you and your customers recognizing the transactions made on this form." => array( null, __("You can add a statement decipher and a description to help you and your customers recognizing the transactions made on this form.", "forminator" ), ), // src/form/components/fields/stripe.js:521
|
535 |
+
"Statement decipher" => array( null, __("Statement decipher", "forminator" ), ), // src/form/components/fields/stripe.js:531
|
536 |
+
"E.g. Company Name" => array( null, __("E.g. Company Name", "forminator" ), ), // src/form/components/fields/stripe.js:534
|
537 |
+
"this is the business name your customers will see on their card statement." => array( null, __("this is the business name your customers will see on their card statement.", "forminator" ), ), // src/form/components/fields/stripe.js:537
|
538 |
+
"Up to 22 characters only" => array( null, __("Up to 22 characters only", "forminator" ), ), // src/form/components/fields/stripe.js:542
|
539 |
+
"Enter your payment description here" => array( null, __("Enter your payment description here", "forminator" ), ), // src/form/components/fields/stripe.js:550
|
540 |
+
"This appears on your Stripe account and on the payment receipt sent to your customers." => array( null, __("This appears on your Stripe account and on the payment receipt sent to your customers.", "forminator" ), ), // src/form/components/fields/stripe.js:553
|
541 |
+
"Payment description" => array( null, __("Payment description", "forminator" ), ), // src/form/components/fields/stripe.js:557
|
542 |
+
"Card Validation" => array( null, __("Card Validation", "forminator" ), ), // src/form/components/fields/stripe.js:576
|
543 |
+
"Note: Stripe field automatically validates the card as the user fills the card details regardless of the validation behaviour set on the Behaviours tab." => array( null, __("Note: Stripe field automatically validates the card as the user fills the card details regardless of the validation behaviour set on the Behaviours tab.", "forminator" ), ), // src/form/components/fields/stripe.js:582
|
544 |
+
"Billing Details" => array( null, __("Billing Details", "forminator" ), ), // src/form/components/fields/stripe.js:594
|
545 |
+
"If you are collection billing details on your forms, you can send that data to Stripe. The billing details will appear on your Stripe dashboard for each payment." => array( null, __("If you are collection billing details on your forms, you can send that data to Stripe. The billing details will appear on your Stripe dashboard for each payment.", "forminator" ), ), // src/form/components/fields/stripe.js:602
|
546 |
+
"Customer name (optional)" => array( null, __("Customer name (optional)", "forminator" ), ), // src/form/components/fields/stripe.js:626
|
547 |
+
"Select a name field" => array( null, __("Select a name field", "forminator" ), ), // src/form/components/fields/stripe.js:628
|
548 |
+
"Customer email address (optional)" => array( null, __("Customer email address (optional)", "forminator" ), ), // src/form/components/fields/stripe.js:643
|
549 |
+
"Select an name field" => array( null, __("Select an name field", "forminator" ), ), // src/form/components/fields/stripe.js:645
|
550 |
+
"Billing address (optional)" => array( null, __("Billing address (optional)", "forminator" ), ), // src/form/components/fields/stripe.js:660
|
551 |
+
"Select an address field" => array( null, __("Select an address field", "forminator" ), ), // src/form/components/fields/stripe.js:662
|
552 |
+
"Meta Data" => array( null, __("Meta Data", "forminator" ), ), // src/form/components/fields/stripe.js:686
|
553 |
+
"You can send custom meta data to Stripe. This would appear under the MetaData section of every payment. A maximum of 20 meta keys can be sent. The key name must be 20 characters or less, and the mapped data will be truncated to 500 characters as Stripe's requirements." => array( null, __("You can send custom meta data to Stripe. This would appear under the MetaData section of every payment. A maximum of 20 meta keys can be sent. The key name must be 20 characters or less, and the mapped data will be truncated to 500 characters as Stripe's requirements.", "forminator" ), ), // src/form/components/fields/stripe.js:694
|
554 |
+
"MetaData" => array( null, __("MetaData", "forminator" ), ), // src/form/components/fields/stripe.js:735
|
555 |
+
"Additional CSS Classes" => array( null, __("Additional CSS Classes", "forminator" ), ), // src/form/components/fields/stripe.js:751
|
556 |
+
"Stripe automatically adds classes to the container DOM element based on the field state. However, you can customize them here. {{link}}Read more{{/link}}" => array( null, __("Stripe automatically adds classes to the container DOM element based on the field state. However, you can customize them here. {{link}}Read more{{/link}}", "forminator" ), ), // src/form/components/fields/stripe.js:754
|
557 |
+
"Base class" => array( null, __("Base class", "forminator" ), ), // src/form/components/fields/stripe.js:770
|
558 |
+
"Complete" => array( null, __("Complete", "forminator" ), ), // src/form/components/fields/stripe.js:778
|
559 |
+
"Empty" => array( null, __("Empty", "forminator" ), ), // src/form/components/fields/stripe.js:786
|
560 |
+
"Focused" => array( null, __("Focused", "forminator" ), ), // src/form/components/fields/stripe.js:794
|
561 |
+
"Invalid" => array( null, __("Invalid", "forminator" ), ), // src/form/components/fields/stripe.js:802
|
562 |
+
"Autofilled (Chrome and Safari only)" => array( null, __("Autofilled (Chrome and Safari only)", "forminator" ), ), // src/form/components/fields/stripe.js:810
|
563 |
+
"Max characters" => array( null, __("Max characters", "forminator" ), ), // src/form/components/fields/text.js:81
|
564 |
+
"By default the user can enter as many characters as they want. Use this setting to limit the number of characters the user can enter. Leave field blank to allow unlimited characters." => array( null, __("By default the user can enter as many characters as they want. Use this setting to limit the number of characters the user can enter. Leave field blank to allow unlimited characters.", "forminator" ), ), // src/form/components/fields/text.js:82
|
565 |
+
"Character limit" => array( null, __("Character limit", "forminator" ), ), // src/form/components/fields/text.js:90
|
566 |
+
"E.g. 100" => array( null, __("E.g. 100", "forminator" ), ), // src/form/components/fields/text.js:97
|
567 |
+
"Words" => array( null, __("Words", "forminator" ), ), // src/form/components/fields/text.js:108
|
|
|
568 |
"You can add new line" => array( null, __("You can add new line", "forminator" ), ), // src/form/components/fields/textarea.js:52
|
569 |
+
"Rich-Text editor" => array( null, __("Rich-Text editor", "forminator" ), ), // src/form/components/fields/textarea.js:89
|
570 |
+
"Enable TinyMCE editor to allow the formatted text." => array( null, __("Enable TinyMCE editor to allow the formatted text.", "forminator" ), ), // src/form/components/fields/textarea.js:90
|
571 |
"Default height" => array( null, __("Default height", "forminator" ), ), // src/form/components/fields/textarea.js:154
|
572 |
"Choose the default minimum height of your textarea field." => array( null, __("Choose the default minimum height of your textarea field.", "forminator" ), ), // src/form/components/fields/textarea.js:158
|
573 |
"Note: The query parameter's value passed in URL should match with the selected time format." => array( null, __("Note: The query parameter's value passed in URL should match with the selected time format.", "forminator" ), ), // src/form/components/fields/time.js:94
|
576 |
"24 hour" => array( null, __("24 hour", "forminator" ), ), // src/form/components/fields/time.js:125
|
577 |
"Hours" => array( null, __("Hours", "forminator" ), ), // src/form/components/fields/time.js:154
|
578 |
"Minutes" => array( null, __("Minutes", "forminator" ), ), // src/form/components/fields/time.js:180
|
579 |
+
"Increments" => array( null, __("Increments", "forminator" ), ), // src/form/components/fields/time.js:223
|
580 |
+
"Choose what time increments you want to use for the hour and minute timepickers." => array( null, __("Choose what time increments you want to use for the hour and minute timepickers.", "forminator" ), ), // src/form/components/fields/time.js:226
|
581 |
+
"Hour" => array( null, __("Hour", "forminator" ), ), // src/form/components/fields/time.js:235
|
582 |
+
"Minute" => array( null, __("Minute", "forminator" ), ), // src/form/components/fields/time.js:246
|
583 |
+
"Choose a time limit for the time picker field to restrict the time selection between specific hours." => array( null, __("Choose a time limit for the time picker field to restrict the time selection between specific hours.", "forminator" ), ), // src/form/components/fields/time.js:267
|
584 |
+
"Specific Hours" => array( null, __("Specific Hours", "forminator" ), ), // src/form/components/fields/time.js:284
|
585 |
+
"Start Time" => array( null, __("Start Time", "forminator" ), ), // src/form/components/fields/time.js:287
|
586 |
+
"AM" => array( null, __("AM", "forminator" ), ), // src/form/components/fields/time.js:319
|
587 |
+
"PM" => array( null, __("PM", "forminator" ), ), // src/form/components/fields/time.js:320
|
588 |
+
"End Time" => array( null, __("End Time", "forminator" ), ), // src/form/components/fields/time.js:325
|
589 |
+
"This error message will be used when time entered is out of the set limits." => array( null, __("This error message will be used when time entered is out of the set limits.", "forminator" ), ), // src/form/components/fields/time.js:370
|
590 |
+
"Default time" => array( null, __("Default time", "forminator" ), ), // src/form/components/fields/time.js:387
|
591 |
+
"Use this feature to specify a default selected time." => array( null, __("Use this feature to specify a default selected time.", "forminator" ), ), // src/form/components/fields/time.js:392
|
592 |
+
"Default time can't be outside the allowed time limit." => array( null, __("Default time can't be outside the allowed time limit.", "forminator" ), ), // src/form/components/fields/time.js:452
|
593 |
+
"Limit number of files" => array( null, __("Limit number of files", "forminator" ), ), // src/form/components/fields/upload.js:78
|
594 |
+
"Choose the maximum number of files that can be uploaded using this field." => array( null, __("Choose the maximum number of files that can be uploaded using this field.", "forminator" ), ), // src/form/components/fields/upload.js:82
|
595 |
+
"Unlimited" => array( null, __("Unlimited", "forminator" ), ), // src/form/components/fields/upload.js:96
|
596 |
+
"File upload limit" => array( null, __("File upload limit", "forminator" ), ), // src/form/components/fields/upload.js:112
|
597 |
+
"Filesize limit per file" => array( null, __("Filesize limit per file", "forminator" ), ), // src/form/components/fields/upload.js:127
|
598 |
+
"Filesize limit" => array( null, __("Filesize limit", "forminator" ), ), // src/form/components/fields/upload.js:128
|
599 |
+
"We've detected your server will allow uploads up to %(maxUpload)sMB in size currently. You can set a lower limit than this using the input below, however if you want uploads of more than %(maxUpload)sMB you'll need to adjust this in your server PHP.ini settings." => array( null, __("We've detected your server will allow uploads up to %(maxUpload)sMB in size currently. You can set a lower limit than this using the input below, however if you want uploads of more than %(maxUpload)sMB you'll need to adjust this in your server PHP.ini settings.", "forminator" ), ), // src/form/components/fields/upload.js:133
|
600 |
+
"Upload limit per file" => array( null, __("Upload limit per file", "forminator" ), ), // src/form/components/fields/upload.js:150
|
601 |
+
"MB" => array( null, __("MB", "forminator" ), ), // src/form/components/fields/upload.js:179
|
602 |
+
"KB" => array( null, __("KB", "forminator" ), ), // src/form/components/fields/upload.js:180
|
603 |
+
"B" => array( null, __("B", "forminator" ), ), // src/form/components/fields/upload.js:181
|
604 |
+
"The file size you have entered exceeds what your current hosting settings are capped to. You need to increase your max filesize limit at the server level first." => array( null, __("The file size you have entered exceeds what your current hosting settings are capped to. You need to increase your max filesize limit at the server level first.", "forminator" ), ), // src/form/components/fields/upload.js:193
|
605 |
+
"Upload method" => array( null, __("Upload method", "forminator" ), ), // src/form/components/fields/upload.js:208
|
606 |
+
"Choose whether you want to use AJAX to upload individual files as they are selected or use the traditional method of uploading all files together on form submission. We recommend using the AJAX method to avoid server timeouts." => array( null, __("Choose whether you want to use AJAX to upload individual files as they are selected or use the traditional method of uploading all files together on form submission. We recommend using the AJAX method to avoid server timeouts.", "forminator" ), ), // src/form/components/fields/upload.js:212
|
607 |
+
"AJAX" => array( null, __("AJAX", "forminator" ), ), // src/form/components/fields/upload.js:227
|
608 |
+
"On form submission" => array( null, __("On form submission", "forminator" ), ), // src/form/components/fields/upload.js:228
|
609 |
"Show files in media library" => array( null, __("Show files in media library", "forminator" ), ), // src/form/components/fields/upload.js:238
|
610 |
"Choose whether you want to show the files uploaded by your visitors using this field in your media library." => array( null, __("Choose whether you want to show the files uploaded by your visitors using this field in your media library.", "forminator" ), ), // src/form/components/fields/upload.js:242
|
611 |
+
"Edit Form" => array( null, __("Edit Form", "forminator" ), ), // src/form/components/header.js:13
|
612 |
"View Documentation" => array( null, __("View Documentation", "forminator" ), ), // src/form/components/header/documentation.js:14
|
613 |
+
"Name your form" => array( null, __("Name your form", "forminator" ), ), // src/form/components/header/title.js:31
|
614 |
+
"Give your form a name" => array( null, __("Give your form a name", "forminator" ), ), // src/form/components/header/title.js:36
|
615 |
+
"Please, enter a valid name." => array( null, __("Please, enter a valid name.", "forminator" ), ), // src/form/components/header/title.js:59
|
616 |
"Fetching integration list…" => array( null, __("Fetching integration list…", "forminator" ), ), // src/form/components/integrations.js:106
|
617 |
"You need to save this form before using integrations." => array( null, __("You need to save this form before using integrations.", "forminator" ), ), // src/form/components/integrations.js:112
|
618 |
"TRY AGAIN" => array( null, __("TRY AGAIN", "forminator" ), ), // src/form/components/integrations.js:115
|
619 |
"Integrations" => array( null, __("Integrations", "forminator" ), ), // src/form/components/integrations.js:132
|
620 |
"Applications" => array( null, __("Applications", "forminator" ), ), // src/form/components/integrations.js:138
|
621 |
"You can send this form's data to any of the connected third party apps. Connect to more apps on the {{link}}Integrations{{/link}} page." => array( null, __("You can send this form's data to any of the connected third party apps. Connect to more apps on the {{link}}Integrations{{/link}} page.", "forminator" ), ), // src/form/components/integrations.js:139
|
|
|
622 |
"Login User" => array( null, __("Login User", "forminator" ), ), // src/form/components/login.js:31
|
623 |
"Additional Settings" => array( null, __("Additional Settings", "forminator" ), ), // src/form/components/login/additional-settings.js:20
|
624 |
"These settings will add some extra control on your login process." => array( null, __("These settings will add some extra control on your login process.", "forminator" ), ), // src/form/components/login/additional-settings.js:23
|
643 |
"year(s)" => array( null, __("year(s)", "forminator" ), ), // src/form/components/login/meta-mapping.js:136
|
644 |
"Users will have to provide login details again after the selected period." => array( null, __("Users will have to provide login details again after the selected period.", "forminator" ), ), // src/form/components/login/meta-mapping.js:142
|
645 |
"Something went wrong while saving your form. Please try again." => array( null, __("Something went wrong while saving your form. Please try again.", "forminator" ), ), // src/form/components/meta.js:125
|
646 |
+
"Unpublish" => array( null, __("Unpublish", "forminator" ), ), // src/form/components/meta/buttons.js:77
|
647 |
+
"Save Draft" => array( null, __("Save Draft", "forminator" ), ), // src/form/components/meta/buttons.js:83
|
648 |
+
"Update" => array( null, __("Update", "forminator" ), ), // src/form/components/meta/buttons.js:104
|
649 |
+
"Publish" => array( null, __("Publish", "forminator" ), ), // src/form/components/meta/buttons.js:106
|
650 |
"Saving..." => array( null, __("Saving...", "forminator" ), ), // src/form/components/meta/status.js:29
|
651 |
"Unsaved changes" => array( null, __("Unsaved changes", "forminator" ), ), // src/form/components/meta/status.js:36
|
652 |
"Saved" => array( null, __("Saved", "forminator" ), ), // src/form/components/meta/status.js:43
|
674 |
"Please enter recipients" => array( null, __("Please enter recipients", "forminator" ), ), // src/form/components/modals/notification.js:205
|
675 |
"Please select rule" => array( null, __("Please select rule", "forminator" ), ), // src/form/components/modals/notification.js:217
|
676 |
"Please add email routing" => array( null, __("Please add email routing", "forminator" ), ), // src/form/components/modals/notification.js:222
|
677 |
+
"Please fix the error(s) in the EMAIL tab." => array( null, __("Please fix the error(s) in the EMAIL tab.", "forminator" ), ), // src/form/components/modals/notification.js:254
|
678 |
+
"Add Email Notification" => array( null, __("Add Email Notification", "forminator" ), ), // src/form/components/modals/notification.js:267
|
679 |
+
"Email" => array( null, __("Email", "forminator" ), ), // src/form/components/modals/notification.js:292
|
680 |
+
"Recipients" => array( null, __("Recipients", "forminator" ), ), // src/form/components/modals/notification.js:301
|
681 |
+
"Advanced" => array( null, __("Advanced", "forminator" ), ), // src/form/components/modals/notification.js:310
|
682 |
+
"Conditions" => array( null, __("Conditions", "forminator" ), ), // src/form/components/modals/notification.js:319
|
683 |
+
"The label is to help you identify this email and won't appear anywhere in the email." => array( null, __("The label is to help you identify this email and won't appear anywhere in the email.", "forminator" ), ), // src/form/components/modals/notification.js:346
|
684 |
+
"E.g. Sales Team Notification" => array( null, __("E.g. Sales Team Notification", "forminator" ), ), // src/form/components/modals/notification.js:351
|
685 |
+
"E.g. New Form Submission" => array( null, __("E.g. New Form Submission", "forminator" ), ), // src/form/components/modals/notification.js:365
|
686 |
+
"Subject" => array( null, __("Subject", "forminator" ), ), // src/form/components/modals/notification.js:368
|
687 |
+
"Email subject can't be empty" => array( null, __("Email subject can't be empty", "forminator" ), ), // src/form/components/modals/notification.js:371
|
688 |
+
"Body" => array( null, __("Body", "forminator" ), ), // src/form/components/modals/notification.js:402
|
689 |
+
"Email body can't be empty" => array( null, __("Email body can't be empty", "forminator" ), ), // src/form/components/modals/notification.js:404
|
690 |
+
"Attachments" => array( null, __("Attachments", "forminator" ), ), // src/form/components/modals/notification.js:416
|
691 |
+
"Choose whether you want to attach the files uploaded via the File Upload fields to this email." => array( null, __("Choose whether you want to attach the files uploaded via the File Upload fields to this email.", "forminator" ), ), // src/form/components/modals/notification.js:417
|
692 |
+
"Uploaded files" => array( null, __("Uploaded files", "forminator" ), ), // src/form/components/modals/notification.js:424
|
693 |
+
"The default behavior is to send the email to the same recipients. If you want to send this email to different recipients conditionally, you can enable the email routing and change the recipients of this email based on the user input." => array( null, __("The default behavior is to send the email to the same recipients. If you want to send this email to different recipients conditionally, you can enable the email routing and change the recipients of this email based on the user input.", "forminator" ), ), // src/form/components/modals/notification.js:442
|
694 |
+
"E.g. sales@website.com" => array( null, __("E.g. sales@website.com", "forminator" ), ), // src/form/components/modals/notification.js:476
|
695 |
+
"Separate multiple emails with a comma" => array( null, __("Separate multiple emails with a comma", "forminator" ), ), // src/form/components/modals/notification.js:482
|
696 |
+
"Email Routing" => array( null, __("Email Routing", "forminator" ), ), // src/form/components/modals/notification.js:502
|
697 |
+
"Enter from name here" => array( null, __("Enter from name here", "forminator" ), ), // src/form/components/modals/notification.js:529
|
698 |
+
"From Name" => array( null, __("From Name", "forminator" ), ), // src/form/components/modals/notification.js:530
|
699 |
+
"Enter from email here" => array( null, __("Enter from email here", "forminator" ), ), // src/form/components/modals/notification.js:551
|
700 |
+
"From Email" => array( null, __("From Email", "forminator" ), ), // src/form/components/modals/notification.js:552
|
701 |
+
"Enter reply-to email here" => array( null, __("Enter reply-to email here", "forminator" ), ), // src/form/components/modals/notification.js:573
|
702 |
+
"Reply-to Email" => array( null, __("Reply-to Email", "forminator" ), ), // src/form/components/modals/notification.js:574
|
703 |
+
"Enter CC email here" => array( null, __("Enter CC email here", "forminator" ), ), // src/form/components/modals/notification.js:595
|
704 |
+
"CC Emails" => array( null, __("CC Emails", "forminator" ), ), // src/form/components/modals/notification.js:596
|
705 |
+
"Enter BCC email here" => array( null, __("Enter BCC email here", "forminator" ), ), // src/form/components/modals/notification.js:617
|
706 |
+
"BCC Emails" => array( null, __("BCC Emails", "forminator" ), ), // src/form/components/modals/notification.js:618
|
707 |
+
"Discard Changes" => array( null, __("Discard Changes", "forminator" ), ), // src/form/components/modals/notification.js:663
|
708 |
+
"Add" => array( null, __("Add", "forminator" ), ), // src/form/components/modals/notification.js:675
|
709 |
"Labels" => array( null, __("Labels", "forminator" ), ), // src/form/components/modals/pagination.js:79
|
710 |
"Your form is divided into multiple pages by Page Break field(s), and you can customize the label of each page here. Page names appear on your form header along with the progress indicator." => array( null, __("Your form is divided into multiple pages by Page Break field(s), and you can customize the label of each page here. Page names appear on your form header along with the progress indicator.", "forminator" ), ), // src/form/components/modals/pagination.js:107
|
711 |
"Finish" => array( null, __("Finish", "forminator" ), ), // src/form/components/modals/pagination.js:134
|
741 |
"Copy shortcode" => array( null, __("Copy shortcode", "forminator" ), ), // src/form/components/modals/shortcode.js:49
|
742 |
"Button text" => array( null, __("Button text", "forminator" ), ), // src/form/components/modals/submit.js:102
|
743 |
"Enter message" => array( null, __("Enter message", "forminator" ), ), // src/form/components/modals/submit.js:115
|
744 |
+
"You can configure email notifications on the parent quiz as it is shared between this form and the parent quiz." => array( null, __("You can configure email notifications on the parent quiz as it is shared between this form and the parent quiz.", "forminator" ), ), // src/form/components/navigation/menu.js:71
|
745 |
+
"You can configure integrations on the parent quiz as it is shared between this form and the parent quiz." => array( null, __("You can configure integrations on the parent quiz as it is shared between this form and the parent quiz.", "forminator" ), ), // src/form/components/navigation/menu.js:91
|
746 |
+
"Navigate" => array( null, __("Navigate", "forminator" ), ), // src/form/components/navigation/mobile-select.js:33
|
747 |
"Preview" => array( null, __("Preview", "forminator" ), ), // src/form/components/navigation/preview.js:16
|
748 |
"You can send customized email notifications to your site admins and visitors on successful form submission. Advanced features like email routing and conditional emails provide granular control over the email notifications." => array( null, __("You can send customized email notifications to your site admins and visitors on successful form submission. Advanced features like email routing and conditional emails provide granular control over the email notifications.", "forminator" ), ), // src/form/components/notifications.js:36
|
749 |
"Admin Email" => array( null, __("Admin Email", "forminator" ), ), // src/form/components/notifications/admin-email.js:296
|
958 |
"Add classes that will be output on this field's container to aid your theme's default styling." => array( null, __("Add classes that will be output on this field's container to aid your theme's default styling.", "forminator" ), ), // src/form/components/settings/styling.js:21
|
959 |
"E.g. form-field" => array( null, __("E.g. form-field", "forminator" ), ), // src/form/components/settings/styling.js:30
|
960 |
"These will be output as you see them here." => array( null, __("These will be output as you see them here.", "forminator" ), ), // src/form/components/settings/styling.js:38
|
961 |
+
"Is before" => array( null, __("Is before", "forminator" ), ), // src/form/components/settings/visibility-rule.js:281
|
962 |
+
"Is after" => array( null, __("Is after", "forminator" ), ), // src/form/components/settings/visibility-rule.js:284
|
963 |
+
"Is before n or more days" => array( null, __("Is before n or more days", "forminator" ), ), // src/form/components/settings/visibility-rule.js:287
|
964 |
+
"Is before less than n days" => array( null, __("Is before less than n days", "forminator" ), ), // src/form/components/settings/visibility-rule.js:290
|
965 |
+
"Is after n or more days" => array( null, __("Is after n or more days", "forminator" ), ), // src/form/components/settings/visibility-rule.js:293
|
966 |
+
"Is after less than n days" => array( null, __("Is after less than n days", "forminator" ), ), // src/form/components/settings/visibility-rule.js:296
|
967 |
+
"Select date" => array( null, __("Select date", "forminator" ), ), // src/form/components/settings/visibility-rule.js:401
|
968 |
+
"Number of days" => array( null, __("Number of days", "forminator" ), ), // src/form/components/settings/visibility-rule.js:427
|
969 |
+
"E.g. 10" => array( null, __("E.g. 10", "forminator" ), ), // src/form/components/settings/visibility-rule.js:428
|
970 |
+
"this field if" => array( null, __("this field if", "forminator" ), ), // src/form/components/settings/visibility.js:148
|
971 |
+
"You need more than one field to configure visibility conditions. Add more fields!" => array( null, __("You need more than one field to configure visibility conditions. Add more fields!", "forminator" ), ), // src/form/components/settings/visibility.js:177
|
972 |
+
"Rules" => array( null, __("Rules", "forminator" ), ), // src/form/components/settings/visibility.js:188
|
973 |
+
"By default field will always be visible. If you want to hide or show fields based on user input you can add conditions." => array( null, __("By default field will always be visible. If you want to hide or show fields based on user input you can add conditions.", "forminator" ), ), // src/form/components/settings/visibility.js:202
|
974 |
"You have unsaved changes, are you sure want to leave this page" => array( null, __("You have unsaved changes, are you sure want to leave this page", "forminator" ), ), // src/form/containers/main.js:52
|
975 |
"Details" => array( null, __("Details", "forminator" ), ), // src/poll/components/appearance.js:51
|
976 |
"Use default colors" => array( null, __("Use default colors", "forminator" ), ), // src/poll/components/appearance/colors.js:47
|
1010 |
"Choose the method you want to use to limit the number of votes." => array( null, __("Choose the method you want to use to limit the number of votes.", "forminator" ), ), // src/poll/components/behaviour/limits.js:109
|
1011 |
"User IP" => array( null, __("User IP", "forminator" ), ), // src/poll/components/behaviour/limits.js:117
|
1012 |
"Browser Cookie" => array( null, __("Browser Cookie", "forminator" ), ), // src/poll/components/behaviour/limits.js:118
|
1013 |
+
"Vote Opening" => array( null, __("Vote Opening", "forminator" ), ), // src/poll/components/behaviour/opening.js:25
|
1014 |
+
"Choose when you want to open and close voting" => array( null, __("Choose when you want to open and close voting", "forminator" ), ), // src/poll/components/behaviour/opening.js:29
|
1015 |
+
"Choose the status of voting" => array( null, __("Choose the status of voting", "forminator" ), ), // src/poll/components/behaviour/opening.js:41
|
1016 |
+
"Open" => array( null, __("Open", "forminator" ), ), // src/poll/components/behaviour/opening.js:54
|
1017 |
+
"Pause" => array( null, __("Pause", "forminator" ), ), // src/poll/components/behaviour/opening.js:58
|
1018 |
+
"Close" => array( null, __("Close", "forminator" ), ), // src/poll/components/behaviour/opening.js:62
|
1019 |
+
"Open from" => array( null, __("Open from", "forminator" ), ), // src/poll/components/behaviour/opening.js:69
|
1020 |
+
"Choose when voting will be opened" => array( null, __("Choose when voting will be opened", "forminator" ), ), // src/poll/components/behaviour/opening.js:72
|
1021 |
+
"Now" => array( null, __("Now", "forminator" ), ), // src/poll/components/behaviour/opening.js:85
|
1022 |
+
"Specific DateTime" => array( null, __("Specific DateTime", "forminator" ), ), // src/poll/components/behaviour/opening.js:90
|
1023 |
+
"Open until" => array( null, __("Open until", "forminator" ), ), // src/poll/components/behaviour/opening.js:106
|
1024 |
+
"Choose how long voting will remain open" => array( null, __("Choose how long voting will remain open", "forminator" ), ), // src/poll/components/behaviour/opening.js:109
|
1025 |
+
"Forever" => array( null, __("Forever", "forminator" ), ), // src/poll/components/behaviour/opening.js:122
|
1026 |
+
"Custom messages" => array( null, __("Custom messages", "forminator" ), ), // src/poll/components/behaviour/opening.js:143
|
1027 |
+
"Message when voting is closed" => array( null, __("Message when voting is closed", "forminator" ), ), // src/poll/components/behaviour/opening.js:149
|
1028 |
+
"E.g. Voting is closed" => array( null, __("E.g. Voting is closed", "forminator" ), ), // src/poll/components/behaviour/opening.js:152
|
1029 |
+
"Message when voting is paused" => array( null, __("Message when voting is paused", "forminator" ), ), // src/poll/components/behaviour/opening.js:157
|
1030 |
+
"E.g. Voting is paused, check again later" => array( null, __("E.g. Voting is paused, check again later", "forminator" ), ), // src/poll/components/behaviour/opening.js:160
|
1031 |
+
"Message before voting open from time" => array( null, __("Message before voting open from time", "forminator" ), ), // src/poll/components/behaviour/opening.js:165
|
1032 |
+
"E.g. Voting has not been started yet" => array( null, __("E.g. Voting has not been started yet", "forminator" ), ), // src/poll/components/behaviour/opening.js:168
|
1033 |
"Choose how you want your poll to be rendered for users." => array( null, __("Choose how you want your poll to be rendered for users.", "forminator" ), ), // src/poll/components/behaviour/render.js:14
|
1034 |
"Load poll using AJAX" => array( null, __("Load poll using AJAX", "forminator" ), ), // src/poll/components/behaviour/render.js:22
|
1035 |
"Enabling this feature will load the poll via AJAX after the page has loaded up, effectively speeding up your page load time. This method can also (in most cases) avoid page caching issues with your poll." => array( null, __("Enabling this feature will load the poll via AJAX after the page has loaded up, effectively speeding up your page load time. This method can also (in most cases) avoid page caching issues with your poll.", "forminator" ), ), // src/poll/components/behaviour/render.js:23
|
1065 |
"Customize the button label used for submitting the users answer." => array( null, __("Customize the button label used for submitting the users answer.", "forminator" ), ), // src/poll/components/builder/details.js:97
|
1066 |
"Button Text" => array( null, __("Button Text", "forminator" ), ), // src/poll/components/builder/details.js:108
|
1067 |
"E.g. Vote" => array( null, __("E.g. Vote", "forminator" ), ), // src/poll/components/builder/details.js:110
|
1068 |
+
"Edit Poll" => array( null, __("Edit Poll", "forminator" ), ), // src/poll/components/header.js:13
|
1069 |
+
"Name your poll" => array( null, __("Name your poll", "forminator" ), ), // src/poll/components/header/title.js:37
|
1070 |
+
"Give your poll a name" => array( null, __("Give your poll a name", "forminator" ), ), // src/poll/components/header/title.js:42
|
1071 |
"You need to save this poll before using integrations." => array( null, __("You need to save this poll before using integrations.", "forminator" ), ), // src/poll/components/integrations.js:113
|
1072 |
"Poll answers can not be empty." => array( null, __("Poll answers can not be empty.", "forminator" ), ), // src/poll/components/meta.js:100
|
1073 |
"Please enter valid voting limit." => array( null, __("Please enter valid voting limit.", "forminator" ), ), // src/poll/components/meta.js:116
|
1074 |
"Deleting this answer" => array( null, __("Deleting this answer", "forminator" ), ), // src/poll/components/modals/delete.js:40
|
1075 |
"Publishing poll…" => array( null, __("Publishing poll…", "forminator" ), ), // src/poll/components/modals/publish.js:18
|
1076 |
"Your poll 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 poll 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/poll/components/modals/shortcode.js:37
|
1077 |
+
"Notifications" => array( null, __("Notifications", "forminator" ), ), // src/poll/components/navigation/menu.js:47
|
1078 |
"Optionally, you can send a notification email to nominated email accounts when poll submissions come in." => array( null, __("Optionally, you can send a notification email to nominated email accounts when poll submissions come in.", "forminator" ), ), // src/poll/components/notifications/admin-email.js:243
|
1079 |
"Poll Name" => array( null, __("Poll Name", "forminator" ), ), // src/poll/components/notifications/admin-email.js:367
|
1080 |
"Poll Answer" => array( null, __("Poll Answer", "forminator" ), ), // src/poll/components/notifications/admin-email.js:368
|
1150 |
"Select Personality" => array( null, __("Select Personality", "forminator" ), ), // src/quiz/global/components/builder/answer.js:117
|
1151 |
"Add Question" => array( null, __("Add Question", "forminator" ), ), // src/quiz/global/components/builder/questions.js:102
|
1152 |
"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
|
1153 |
+
"Edit Quiz" => array( null, __("Edit Quiz", "forminator" ), ), // src/quiz/global/components/header.js:13
|
1154 |
+
"Give your quiz a name" => array( null, __("Give your quiz a name", "forminator" ), ), // src/quiz/global/components/header/title.js:42
|
1155 |
"You need to save this quiz before using integrations." => array( null, __("You need to save this quiz before using integrations.", "forminator" ), ), // src/quiz/global/components/integrations.js:113
|
1156 |
"Intro" => array( null, __("Intro", "forminator" ), ), // src/quiz/global/components/intro.js:29
|
1157 |
"Start by adding a title for your quiz to let your visitors know what this quiz is all about." => array( null, __("Start by adding a title for your quiz to let your visitors know what this quiz is all about.", "forminator" ), ), // src/quiz/global/components/intro.js:40
|
1163 |
"Provide your visitors with more information about your quiz." => array( null, __("Provide your visitors with more information about your quiz.", "forminator" ), ), // src/quiz/global/components/intro.js:100
|
1164 |
"Questions" => array( null, __("Questions", "forminator" ), ), // src/quiz/global/components/intro.js:134
|
1165 |
"Personalities" => array( null, __("Personalities", "forminator" ), ), // src/quiz/global/components/intro.js:144
|
1166 |
+
"Leads" => array( null, __("Leads", "forminator" ), ), // src/quiz/global/components/leads.js:32
|
1167 |
+
"Capture Leads" => array( null, __("Capture Leads", "forminator" ), ), // src/quiz/global/components/leads.js:38
|
1168 |
+
"Collect participants' details (e.g., name, email, etc.) by integrating a lead generation form in your quiz." => array( null, __("Collect participants' details (e.g., name, email, etc.) by integrating a lead generation form in your quiz.", "forminator" ), ), // src/quiz/global/components/leads.js:39
|
1169 |
+
"Lead generation form" => array( null, __("Lead generation form", "forminator" ), ), // src/quiz/global/components/leads.js:49
|
1170 |
+
"Customize the default lead generation form using the edit button below. Note that this lead generation form has limited settings only, and the rest of them are either automatically set by this quiz or they are shared between this quiz and the lead generation form (such as Email Notifications, Integrations, etc.)." => array( null, __("Customize the default lead generation form using the edit button below. Note that this lead generation form has limited settings only, and the rest of them are either automatically set by this quiz or they are shared between this quiz and the lead generation form (such as Email Notifications, Integrations, etc.).", "forminator" ), ), // src/quiz/global/components/leads.js:57
|
1171 |
+
"%s - Leads form" => array( null, __("%s - Leads form", "forminator" ), ), // src/quiz/global/components/leads.js:74
|
1172 |
+
"Form Placement" => array( null, __("Form Placement", "forminator" ), ), // src/quiz/global/components/leads.js:109
|
1173 |
+
"Where do you want to embed the lead generation form in your quiz?" => array( null, __("Where do you want to embed the lead generation form in your quiz?", "forminator" ), ), // src/quiz/global/components/leads.js:110
|
1174 |
+
"Beginning of quiz" => array( null, __("Beginning of quiz", "forminator" ), ), // src/quiz/global/components/leads.js:117
|
1175 |
+
"Before showing results" => array( null, __("Before showing results", "forminator" ), ), // src/quiz/global/components/leads.js:121
|
1176 |
+
"Skip Form" => array( null, __("Skip Form", "forminator" ), ), // src/quiz/global/components/leads.js:131
|
1177 |
+
"Enable this option if you want to allow your participants to skip the form." => array( null, __("Enable this option if you want to allow your participants to skip the form.", "forminator" ), ), // src/quiz/global/components/leads.js:132
|
1178 |
+
"Link text" => array( null, __("Link text", "forminator" ), ), // src/quiz/global/components/leads.js:144
|
1179 |
+
"Skip and continue" => array( null, __("Skip and continue", "forminator" ), ), // src/quiz/global/components/leads.js:145
|
1180 |
"Delete personality %s" => array( null, __("Delete personality %s", "forminator" ), ), // src/quiz/global/components/modals/delete-personality.js:45
|
1181 |
"Are you sure you wish to delete this personality?" => array( null, __("Are you sure you wish to delete this personality?", "forminator" ), ), // src/quiz/global/components/modals/delete-personality.js:61
|
1182 |
"Edit Question" => array( null, __("Edit Question", "forminator" ), ), // src/quiz/global/components/modals/delete-personality.js:103
|
1184 |
"Please remove the reference of this Personality from the questions in your quiz and then delete this." => array( null, __("Please remove the reference of this Personality from the questions in your quiz and then delete this.", "forminator" ), ), // src/quiz/global/components/modals/delete-personality.js:129
|
1185 |
"Delete Question" => array( null, __("Delete Question", "forminator" ), ), // src/quiz/global/components/modals/delete.js:26
|
1186 |
"Deleting this question will remove its value from the existing submissions as well." => array( null, __("Deleting this question will remove its value from the existing submissions as well.", "forminator" ), ), // src/quiz/global/components/modals/delete.js:38
|
1187 |
+
"Quiz data" => array( null, __("Quiz data", "forminator" ), ), // src/quiz/global/components/modals/notification.js:376
|
1188 |
+
"Lead data" => array( null, __("Lead data", "forminator" ), ), // src/quiz/global/components/modals/notification.js:381
|
1189 |
+
"Misc data" => array( null, __("Misc data", "forminator" ), ), // src/quiz/global/components/modals/notification.js:392
|
1190 |
+
"Quiz Data" => array( null, __("Quiz Data", "forminator" ), ), // src/quiz/global/components/modals/notification.js:417
|
1191 |
"Add Personality" => array( null, __("Add Personality", "forminator" ), ), // src/quiz/global/components/modals/personality.js:60
|
1192 |
"Edit Personality" => array( null, __("Edit Personality", "forminator" ), ), // src/quiz/global/components/modals/personality.js:61
|
1193 |
"E.g. Iron Man" => array( null, __("E.g. Iron Man", "forminator" ), ), // src/quiz/global/components/modals/personality.js:97
|
1206 |
"Custom CSS Classes" => array( null, __("Custom CSS Classes", "forminator" ), ), // src/quiz/global/components/modals/submit.js:77
|
1207 |
"E.g. form-submit-btn" => array( null, __("E.g. form-submit-btn", "forminator" ), ), // src/quiz/global/components/modals/submit.js:78
|
1208 |
"These will be output as you see them here. To add multiple classes, separate them with a space. For example, \"form-submit-btn button\" will add two classes \"form-submit-btn\" and \"button\"." => array( null, __("These will be output as you see them here. To add multiple classes, separate them with a space. For example, \"form-submit-btn button\" will add two classes \"form-submit-btn\" and \"button\".", "forminator" ), ), // src/quiz/global/components/modals/submit.js:80
|
1209 |
+
"You can send customized email notifications to your site admins and participant on successful quiz submission. Use advanced features such as email routing, and conditions to have granular control over them." => array( null, __("You can send customized email notifications to your site admins and participant on successful quiz submission. Use advanced features such as email routing, and conditions to have granular control over them.", "forminator" ), ), // src/quiz/global/components/notifications.js:32
|
1210 |
"Optionally, you can send a notification email to nominated email accounts when quiz submissions come in." => array( null, __("Optionally, you can send a notification email to nominated email accounts when quiz submissions come in.", "forminator" ), ), // src/quiz/global/components/notifications/admin-email.js:243
|
1211 |
"Add as many emails as you like" => array( null, __("Add as many emails as you like", "forminator" ), ), // src/quiz/global/components/notifications/admin-email.js:296
|
1212 |
+
"Final Score" => array( null, __("Final Score", "forminator" ), ), // src/quiz/global/components/notifications/conditions-rule.js:80
|
1213 |
+
"Form Data" => array( null, __("Form Data", "forminator" ), ), // src/quiz/global/components/notifications/conditions-rule.js:170
|
1214 |
+
"Is correct" => array( null, __("Is correct", "forminator" ), ), // src/quiz/global/components/notifications/conditions-rule.js:209
|
1215 |
+
"Is incorrect" => array( null, __("Is incorrect", "forminator" ), ), // src/quiz/global/components/notifications/conditions-rule.js:212
|
1216 |
+
"greater than" => array( null, __("greater than", "forminator" ), ), // src/quiz/global/components/notifications/conditions-rule.js:223
|
1217 |
+
"less than" => array( null, __("less than", "forminator" ), ), // src/quiz/global/components/notifications/conditions-rule.js:226
|
1218 |
"e.g. 0.75em" => array( null, __("e.g. 0.75em", "forminator" ), ), // src/quiz/global/components/settings/fonts.js:102
|
1219 |
"Choose how you want to handle this quiz's data storage. By default we'll use the configuration you've set in your {{link}}global privacy settings{{/link}}." => array( null, __("Choose how you want to handle this quiz's data storage. By default we'll use the configuration you've set in your {{link}}global privacy settings{{/link}}.", "forminator" ), ), // src/quiz/global/components/settings/privacy.js:34
|
1220 |
"How long do you want to retain this quiz's submissions for?" => array( null, __("How long do you want to retain this quiz's submissions for?", "forminator" ), ), // src/quiz/global/components/settings/privacy.js:52
|
1223 |
"Wrong" => array( null, __("Wrong", "forminator" ), ), // src/quiz/knowledge/components/appearance/colors/answer-checkbox.js:119
|
1224 |
"Answer text color" => array( null, __("Answer text color", "forminator" ), ), // src/quiz/knowledge/components/appearance/colors/answer-text.js:28
|
1225 |
"Answer result message" => array( null, __("Answer result message", "forminator" ), ), // src/quiz/knowledge/components/appearance/colors/answer-text.js:34
|
1226 |
+
"Main Container" => array( null, __("Main Container", "forminator" ), ), // src/quiz/knowledge/components/appearance/colors/basic.js:30
|
1227 |
+
"Quiz result color" => array( null, __("Quiz result color", "forminator" ), ), // src/quiz/knowledge/components/appearance/colors/basic.js:59
|
1228 |
+
"Skip form button" => array( null, __("Skip form button", "forminator" ), ), // src/quiz/knowledge/components/appearance/colors/basic.js:66
|
1229 |
"Basic" => array( null, __("Basic", "forminator" ), ), // src/quiz/knowledge/components/appearance/colors/colors-table.js:24
|
1230 |
"Answer - Container" => array( null, __("Answer - Container", "forminator" ), ), // src/quiz/knowledge/components/appearance/colors/colors-table.js:31
|
1231 |
"Answer - Checkbox" => array( null, __("Answer - Checkbox", "forminator" ), ), // src/quiz/knowledge/components/appearance/colors/colors-table.js:38
|
1232 |
"Answer - Text" => array( null, __("Answer - Text", "forminator" ), ), // src/quiz/knowledge/components/appearance/colors/colors-table.js:45
|
1233 |
"Social Share" => array( null, __("Social Share", "forminator" ), ), // src/quiz/knowledge/components/appearance/colors/colors-table.js:59
|
1234 |
"By default this quiz will inherit the fonts your theme uses. You can override these fonts with custom ones from Google Fonts." => array( null, __("By default this quiz will inherit the fonts your theme uses. You can override these fonts with custom ones from Google Fonts.", "forminator" ), ), // src/quiz/knowledge/components/appearance/fonts.js:15
|
1235 |
+
"Quiz Title" => array( null, __("Quiz Title", "forminator" ), ), // src/quiz/knowledge/components/appearance/fonts/fonts-table.js:32
|
1236 |
+
"Quiz Description" => array( null, __("Quiz Description", "forminator" ), ), // src/quiz/knowledge/components/appearance/fonts/fonts-table.js:39
|
1237 |
+
"Answer" => array( null, __("Answer", "forminator" ), ), // src/quiz/knowledge/components/appearance/fonts/fonts-table.js:53
|
1238 |
+
"Answer Result Message" => array( null, __("Answer Result Message", "forminator" ), ), // src/quiz/knowledge/components/appearance/fonts/fonts-table.js:60
|
1239 |
+
"Social Share Title" => array( null, __("Social Share Title", "forminator" ), ), // src/quiz/knowledge/components/appearance/fonts/fonts-table.js:81
|
1240 |
+
"Social Share Icons" => array( null, __("Social Share Icons", "forminator" ), ), // src/quiz/knowledge/components/appearance/fonts/fonts-table.js:88
|
1241 |
+
"Skip Form Button" => array( null, __("Skip Form Button", "forminator" ), ), // src/quiz/knowledge/components/appearance/fonts/fonts-table.js:96
|
1242 |
"Icon size" => array( null, __("Icon size", "forminator" ), ), // src/quiz/knowledge/components/appearance/fonts/social-icons.js:18
|
1243 |
"Choose one of the pre-defined sizes we have for social share icons." => array( null, __("Choose one of the pre-defined sizes we have for social share icons.", "forminator" ), ), // src/quiz/knowledge/components/appearance/fonts/social-icons.js:19
|
1244 |
"Regular" => array( null, __("Regular", "forminator" ), ), // src/quiz/knowledge/components/appearance/fonts/social-icons.js:24
|
1253 |
"Let's add the different personalities. Each of the following personality is a possible outcome of your quiz. In case of a tie, the personality is chosen as per their order below." => array( null, __("Let's add the different personalities. Each of the following personality is a possible outcome of your quiz. In case of a tie, the personality is chosen as per their order below.", "forminator" ), ), // src/quiz/personality/components/personalities.js:33
|
1254 |
"Reorder the personalities to set the priority order." => array( null, __("Reorder the personalities to set the priority order.", "forminator" ), ), // src/quiz/personality/components/personalities.js:50
|
1255 |
"Define the different personalities possible as the outcome of your quiz here." => array( null, __("Define the different personalities possible as the outcome of your quiz here.", "forminator" ), ), // src/quiz/personality/components/personalities/personalities.js:104
|
1256 |
+
"Open form options" => array( null, __("Open form options", "forminator" ), ), // src/settings/containers/layout/meta-dropdown.js:19
|
1257 |
+
"Open poll options" => array( null, __("Open poll options", "forminator" ), ), // src/settings/containers/layout/meta-dropdown.js:30
|
1258 |
+
"Open quiz options" => array( null, __("Open quiz options", "forminator" ), ), // src/settings/containers/layout/meta-dropdown.js:41
|
1259 |
+
"Create New Form" => array( null, __("Create New Form", "forminator" ), ), // src/settings/containers/layout/meta-dropdown.js:73
|
1260 |
+
"Create New Poll" => array( null, __("Create New Poll", "forminator" ), ), // src/settings/containers/layout/meta-dropdown.js:76
|
1261 |
+
"Create New Quiz" => array( null, __("Create New Quiz", "forminator" ), ), // src/settings/containers/layout/meta-dropdown.js:80
|
1262 |
+
"Copy Shortcode" => array( null, __("Copy Shortcode", "forminator" ), ), // src/settings/containers/layout/meta-dropdown.js:120
|
1263 |
+
"View Submissions" => array( null, __("View Submissions", "forminator" ), ), // src/settings/containers/layout/meta-dropdown.js:134
|
1264 |
+
"Duplicate isn't supported at the moment for the quizzes with lead capturing enabled." => array( null, __("Duplicate isn't supported at the moment for the quizzes with lead capturing enabled.", "forminator" ), ), // src/settings/containers/layout/meta-dropdown.js:154
|
1265 |
+
"Coming soon" => array( null, __("Coming soon", "forminator" ), ), // src/settings/containers/layout/meta-dropdown.js:167
|
1266 |
+
"Reset Tracking Data" => array( null, __("Reset Tracking Data", "forminator" ), ), // src/settings/containers/layout/meta-dropdown.js:187
|
1267 |
+
"Export isn't supported at the moment for the quizzes with lead capturing enabled." => array( null, __("Export isn't supported at the moment for the quizzes with lead capturing enabled.", "forminator" ), ), // src/settings/containers/layout/meta-dropdown.js:197
|
1268 |
+
"Export" => array( null, __("Export", "forminator" ), ), // src/settings/containers/layout/meta-dropdown.js:204
|
1269 |
"Basic selectors" => array( null, __("Basic selectors", "forminator" ), ), // src/settings/inputs/ace-editor.js:63
|
1270 |
"Form" => array( null, __("Form", "forminator" ), ), // src/settings/inputs/ace-editor.js:68
|
1271 |
"Field Description" => array( null, __("Field Description", "forminator" ), ), // src/settings/inputs/ace-editor.js:96
|
1291 |
"You can preview your form and check if the formula is generating expected results." => array( null, __("You can preview your form and check if the formula is generating expected results.", "forminator" ), ), // src/settings/inputs/calculation.js:361
|
1292 |
"Formula Preview" => array( null, __("Formula Preview", "forminator" ), ), // src/settings/inputs/calculation.js:370
|
1293 |
"Remove this date range" => array( null, __("Remove this date range", "forminator" ), ), // src/settings/inputs/date-picker.js:84
|
1294 |
+
"10 January 2020" => array( null, __("10 January 2020", "forminator" ), ), // src/settings/inputs/date-time-picker.js:149
|
1295 |
+
"AM/PM" => array( null, __("AM/PM", "forminator" ), ), // src/settings/inputs/date-time-picker.js:181
|
1296 |
"This field is required!" => array( null, __("This field is required!", "forminator" ), ), // src/settings/inputs/input.js:39
|
1297 |
"Please enter valid number." => array( null, __("Please enter valid number.", "forminator" ), ), // src/settings/inputs/input.js:120
|
1298 |
"Click here to add a date range..." => array( null, __("Click here to add a date range...", "forminator" ), ), // src/settings/inputs/sui-tags-date-range.js:24
|
1309 |
"Form Name" => array( null, __("Form Name", "forminator" ), ), // src/settings/inputs/wp-editor.js:255
|
1310 |
"All Form Fields" => array( null, __("All Form Fields", "forminator" ), ), // src/settings/inputs/wp-editor.js:265
|
1311 |
"All Non Empty Fields" => array( null, __("All Non Empty Fields", "forminator" ), ), // src/settings/inputs/wp-editor.js:275
|
1312 |
+
"Add form data" => array( null, __("Add form data", "forminator" ), ), // src/settings/inputs/wp-editor.js:338
|
1313 |
+
"is having" => array( null, __("is having", "forminator" ), ), // src/utils.js:875
|
1314 |
+
"is" => array( null, __("is", "forminator" ), ), // src/utils.js:878
|
1315 |
+
"is not having" => array( null, __("is not having", "forminator" ), ), // src/utils.js:882
|
1316 |
+
"is not" => array( null, __("is not", "forminator" ), ), // src/utils.js:885
|
1317 |
+
"day is" => array( null, __("day is", "forminator" ), ), // src/utils.js:889
|
1318 |
+
"day is not" => array( null, __("day is not", "forminator" ), ), // src/utils.js:891
|
1319 |
+
"month is not" => array( null, __("month is not", "forminator" ), ), // src/utils.js:893
|
1320 |
+
"month is" => array( null, __("month is", "forminator" ), ), // src/utils.js:895
|
1321 |
+
"is before" => array( null, __("is before", "forminator" ), ), // src/utils.js:897
|
1322 |
+
"is after" => array( null, __("is after", "forminator" ), ), // src/utils.js:899
|
1323 |
+
"is before %s or more days from current date" => array( null, __("is before %s or more days from current date", "forminator" ), ), // src/utils.js:901
|
1324 |
+
"is before less than %s days from current date" => array( null, __("is before less than %s days from current date", "forminator" ), ), // src/utils.js:903
|
1325 |
+
"is after %s or more days from current date" => array( null, __("is after %s or more days from current date", "forminator" ), ), // src/utils.js:905
|
1326 |
+
"is after less than %s days from current date" => array( null, __("is after less than %s days from current date", "forminator" ), ), // src/utils.js:907
|
1327 |
+
"is greater than" => array( null, __("is greater than", "forminator" ), ), // src/utils.js:909
|
1328 |
+
"is less than" => array( null, __("is less than", "forminator" ), ), // src/utils.js:911
|
1329 |
+
"contains" => array( null, __("contains", "forminator" ), ), // src/utils.js:913
|
1330 |
+
"starts with" => array( null, __("starts with", "forminator" ), ), // src/utils.js:915
|
1331 |
+
"ends with" => array( null, __("ends with", "forminator" ), ), // src/utils.js:917
|
1332 |
+
"is correct" => array( null, __("is correct", "forminator" ), ), // src/utils.js:919
|
1333 |
+
"is incorrect" => array( null, __("is incorrect", "forminator" ), ), // src/utils.js:921
|
1334 |
);
|
1335 |
return $forminator_admin_locale;
|
1336 |
/* THIS IS THE END OF THE GENERATED FILE */
|
admin/pages/entries-page.php
CHANGED
@@ -210,6 +210,10 @@ class Forminator_Entries_Page extends Forminator_Admin_Page {
|
|
210 |
$forms = $this->get_forms();
|
211 |
|
212 |
foreach ( $forms as $form ) {
|
|
|
|
|
|
|
|
|
213 |
/**@var Forminator_Base_Form_Model $form */
|
214 |
$title = ! empty( $form->settings['formName'] ) ? $form->settings['formName'] : $form->raw->post_title;
|
215 |
$html .= '<option value="' . $form->id . '" ' . selected( $form->id, $this->get_current_form_id(), false ) . '>' . $title . '</option>';
|
210 |
$forms = $this->get_forms();
|
211 |
|
212 |
foreach ( $forms as $form ) {
|
213 |
+
if ( isset( $form->settings['form-type'] ) && 'leads' === $form->settings['form-type'] ) {
|
214 |
+
continue;
|
215 |
+
}
|
216 |
+
|
217 |
/**@var Forminator_Base_Form_Model $form */
|
218 |
$title = ! empty( $form->settings['formName'] ) ? $form->settings['formName'] : $form->raw->post_title;
|
219 |
$html .= '<option value="' . $form->id . '" ' . selected( $form->id, $this->get_current_form_id(), false ) . '>' . $title . '</option>';
|
admin/views/custom-form/list/content.php
CHANGED
@@ -6,7 +6,7 @@ $image_empty = forminator_plugin_url() . 'assets/images/forminator-empty-messa
|
|
6 |
$image_empty2x = forminator_plugin_url() . 'assets/images/forminator-empty-message@2x.png';
|
7 |
|
8 |
// Count total forms
|
9 |
-
$count
|
10 |
$count_active = $this->countModules( 'publish' );
|
11 |
|
12 |
// available bulk actions
|
@@ -17,6 +17,8 @@ $sql_month_start_date = date( 'Y-m-d H:i:s', strtotime( '-30 days midnight' ) );
|
|
17 |
|
18 |
// Count total entries from last 30 days
|
19 |
$total_entries_from_last_month = count( Forminator_Form_Entry_Model::get_newer_entry_ids( 'custom-forms', $sql_month_start_date ) );
|
|
|
|
|
20 |
?>
|
21 |
|
22 |
<?php if ( $count > 0 ) { ?>
|
@@ -33,6 +35,22 @@ $total_entries_from_last_month = count( Forminator_Form_Entry_Model::get_newer_e
|
|
33 |
|
34 |
<span class="sui-summary-sub"><?php printf( esc_html( _n( 'Active Form', 'Active Forms', esc_html( $count_active ), Forminator::DOMAIN ) ), esc_html( $count_active ) ); ?></span>
|
35 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
36 |
</div>
|
37 |
|
38 |
</div>
|
@@ -50,7 +68,16 @@ $total_entries_from_last_month = count( Forminator_Form_Entry_Model::get_newer_e
|
|
50 |
<span class="sui-list-label"><?php esc_html_e( 'Submissions in the last 30 days', Forminator::DOMAIN ); ?></span>
|
51 |
<span class="sui-list-detail"><?php echo esc_html( $total_entries_from_last_month ); ?></span>
|
52 |
</li>
|
53 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
54 |
</ul>
|
55 |
|
56 |
</div>
|
@@ -117,8 +144,8 @@ $total_entries_from_last_month = count( Forminator_Form_Entry_Model::get_newer_e
|
|
117 |
<?php
|
118 |
foreach ( $this->getModules() as $module ) {
|
119 |
$module_entries_from_last_month = 0 !== $module['entries'] ? count( Forminator_Form_Entry_Model::get_newer_entry_ids_of_form_id( $module['id'], $sql_month_start_date ) ) : 0;
|
120 |
-
$opened_class
|
121 |
-
$opened_chart
|
122 |
|
123 |
if( isset( $_GET['view-stats'] ) && intval( $_GET['view-stats'] ) === intval( $module['id'] ) ) { // phpcs:ignore
|
124 |
$opened_class = ' sui-accordion-item--open forminator-scroll-to';
|
@@ -412,14 +439,14 @@ $total_entries_from_last_month = count( Forminator_Form_Entry_Model::get_newer_e
|
|
412 |
<?php } ?>
|
413 |
|
414 |
<?php
|
415 |
-
$days_array
|
416 |
$default_array = array();
|
417 |
|
418 |
for ( $h = 30; $h >= 0; $h-- ) {
|
419 |
-
$time
|
420 |
-
$date
|
421 |
$default_array[ $date ] = 0;
|
422 |
-
$days_array[]
|
423 |
}
|
424 |
|
425 |
foreach ( $this->getModules() as $module ) {
|
@@ -427,7 +454,7 @@ foreach ( $this->getModules() as $module ) {
|
|
427 |
if ( 0 === $module['entries'] ) {
|
428 |
$submissions_data = $default_array;
|
429 |
} else {
|
430 |
-
$submissions
|
431 |
$submissions_array = wp_list_pluck( $submissions, 'entries_amount', 'date_created' );
|
432 |
$submissions_data = array_merge( $default_array, array_intersect_key( $submissions_array, $default_array ) );
|
433 |
}
|
6 |
$image_empty2x = forminator_plugin_url() . 'assets/images/forminator-empty-message@2x.png';
|
7 |
|
8 |
// Count total forms
|
9 |
+
$count = $this->countModules();
|
10 |
$count_active = $this->countModules( 'publish' );
|
11 |
|
12 |
// available bulk actions
|
17 |
|
18 |
// Count total entries from last 30 days
|
19 |
$total_entries_from_last_month = count( Forminator_Form_Entry_Model::get_newer_entry_ids( 'custom-forms', $sql_month_start_date ) );
|
20 |
+
|
21 |
+
$most_entry = Forminator_Form_Entry_Model::get_most_entry( 'custom-forms' );
|
22 |
?>
|
23 |
|
24 |
<?php if ( $count > 0 ) { ?>
|
35 |
|
36 |
<span class="sui-summary-sub"><?php printf( esc_html( _n( 'Active Form', 'Active Forms', esc_html( $count_active ), Forminator::DOMAIN ) ), esc_html( $count_active ) ); ?></span>
|
37 |
|
38 |
+
<div class="sui-form-field sui-input-md">
|
39 |
+
|
40 |
+
<div class="sui-control-with-icon">
|
41 |
+
<span class="sui-icon-magnifying-glass-search" style="position: absolute; top: 11px; left: 14px;" aria-hidden="true"></span>
|
42 |
+
<input
|
43 |
+
type="text"
|
44 |
+
name="search"
|
45 |
+
value=""
|
46 |
+
placeholder="<?php esc_html_e( 'Search form...', Forminator::DOMAIN ); ?>"
|
47 |
+
id="forminator-forms-search-by-keyword"
|
48 |
+
class="sui-form-control"
|
49 |
+
/>
|
50 |
+
</div>
|
51 |
+
|
52 |
+
</div>
|
53 |
+
|
54 |
</div>
|
55 |
|
56 |
</div>
|
68 |
<span class="sui-list-label"><?php esc_html_e( 'Submissions in the last 30 days', Forminator::DOMAIN ); ?></span>
|
69 |
<span class="sui-list-detail"><?php echo esc_html( $total_entries_from_last_month ); ?></span>
|
70 |
</li>
|
71 |
+
<?php if ( ! empty( $most_entry ) && get_post_status( $most_entry->form_id ) && 0 !== (int) $most_entry->entry_count ) { ?>
|
72 |
+
<li>
|
73 |
+
<span class="sui-list-label"><?php esc_html_e( 'Most submissions', Forminator::DOMAIN ); ?></span>
|
74 |
+
<span class="sui-list-detail">
|
75 |
+
<a href="<?php echo esc_url( admin_url( 'admin.php?page=forminator-cform-wizard&id=' . $most_entry->form_id ) ); ?>">
|
76 |
+
<?php echo forminator_get_form_name( $most_entry->form_id, 'custom_form' ); ?>
|
77 |
+
</a>
|
78 |
+
</span>
|
79 |
+
</li>
|
80 |
+
<?php } ?>
|
81 |
</ul>
|
82 |
|
83 |
</div>
|
144 |
<?php
|
145 |
foreach ( $this->getModules() as $module ) {
|
146 |
$module_entries_from_last_month = 0 !== $module['entries'] ? count( Forminator_Form_Entry_Model::get_newer_entry_ids_of_form_id( $module['id'], $sql_month_start_date ) ) : 0;
|
147 |
+
$opened_class = '';
|
148 |
+
$opened_chart = '';
|
149 |
|
150 |
if( isset( $_GET['view-stats'] ) && intval( $_GET['view-stats'] ) === intval( $module['id'] ) ) { // phpcs:ignore
|
151 |
$opened_class = ' sui-accordion-item--open forminator-scroll-to';
|
439 |
<?php } ?>
|
440 |
|
441 |
<?php
|
442 |
+
$days_array = array();
|
443 |
$default_array = array();
|
444 |
|
445 |
for ( $h = 30; $h >= 0; $h-- ) {
|
446 |
+
$time = strtotime( '-' . $h . ' days' );
|
447 |
+
$date = date( 'Y-m-d', $time );// phpcs:ignore
|
448 |
$default_array[ $date ] = 0;
|
449 |
+
$days_array[] = date( 'M j, Y', $time );// phpcs:ignore
|
450 |
}
|
451 |
|
452 |
foreach ( $this->getModules() as $module ) {
|
454 |
if ( 0 === $module['entries'] ) {
|
455 |
$submissions_data = $default_array;
|
456 |
} else {
|
457 |
+
$submissions = Forminator_Form_Entry_Model::get_form_latest_entries_count_grouped_by_day( $module['id'], $sql_month_start_date );
|
458 |
$submissions_array = wp_list_pluck( $submissions, 'entries_amount', 'date_created' );
|
459 |
$submissions_data = array_merge( $default_array, array_intersect_key( $submissions_array, $default_array ) );
|
460 |
}
|
admin/views/custom-form/popup/import-gravityforms.php
CHANGED
@@ -11,7 +11,7 @@ $forms = forminator_list_thirdparty_contact_forms( 'gravityforms' );
|
|
11 |
<select class="sui-form-dropdown" name="gravityforms">
|
12 |
<option value="all"><?php esc_html_e('All Forms', Forminator::DOMAIN); ?></option>
|
13 |
<?php
|
14 |
-
if( ! empty( $forms ) ):
|
15 |
foreach ($forms as $key => $value) {
|
16 |
echo sprintf('<option value="%f">%s</option>',
|
17 |
absint( $value['id'] ),
|
11 |
<select class="sui-form-dropdown" name="gravityforms">
|
12 |
<option value="all"><?php esc_html_e('All Forms', Forminator::DOMAIN); ?></option>
|
13 |
<?php
|
14 |
+
if ( ! empty( $forms ) ):
|
15 |
foreach ($forms as $key => $value) {
|
16 |
echo sprintf('<option value="%f">%s</option>',
|
17 |
absint( $value['id'] ),
|
admin/views/custom-form/popup/import-ninjaforms.php
CHANGED
@@ -11,7 +11,7 @@ $forms = forminator_list_thirdparty_contact_forms( 'ninjaforms' );
|
|
11 |
<select class="sui-form-dropdown" name="ninjaforms">
|
12 |
<option value="all"><?php esc_html_e('All Forms', Forminator::DOMAIN); ?></option>
|
13 |
<?php
|
14 |
-
if( ! empty( $forms ) ):
|
15 |
foreach ($forms as $key => $value) {
|
16 |
echo sprintf('<option value="%f">%s</option>',
|
17 |
absint( $value->get_id() ),
|
11 |
<select class="sui-form-dropdown" name="ninjaforms">
|
12 |
<option value="all"><?php esc_html_e('All Forms', Forminator::DOMAIN); ?></option>
|
13 |
<?php
|
14 |
+
if ( ! empty( $forms ) ):
|
15 |
foreach ($forms as $key => $value) {
|
16 |
echo sprintf('<option value="%f">%s</option>',
|
17 |
absint( $value->get_id() ),
|
admin/views/dashboard/content.php
CHANGED
@@ -2,28 +2,36 @@
|
|
2 |
|
3 |
<?php $this->template( 'dashboard/widgets/widget-resume' ); ?>
|
4 |
|
5 |
-
<div class="
|
6 |
|
7 |
-
|
8 |
|
9 |
-
|
10 |
-
$this->template( 'dashboard/widgets/widget-upgrade' );
|
11 |
-
} ?>
|
12 |
|
13 |
-
|
14 |
|
15 |
-
|
16 |
|
17 |
-
|
18 |
-
$notice_dismissed = get_option( 'forminator_dismiss_feature_113', false );
|
19 |
-
$version_upgraded = get_option( 'forminator_version_upgraded', false );
|
20 |
|
21 |
-
|
|
|
|
|
22 |
|
23 |
-
<?php $this->template( 'dashboard/
|
24 |
|
25 |
-
|
26 |
|
27 |
</div>
|
28 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
29 |
</section>
|
2 |
|
3 |
<?php $this->template( 'dashboard/widgets/widget-resume' ); ?>
|
4 |
|
5 |
+
<div class="sui-row">
|
6 |
|
7 |
+
<div class="sui-col-md-6">
|
8 |
|
9 |
+
<?php $this->template( 'dashboard/widgets/widget-cform' ); ?>
|
|
|
|
|
10 |
|
11 |
+
<?php $this->template( 'dashboard/widgets/widget-poll' ); ?>
|
12 |
|
13 |
+
</div>
|
14 |
|
15 |
+
<div class="sui-col-md-6">
|
|
|
|
|
16 |
|
17 |
+
<?php if ( ! FORMINATOR_PRO ) {
|
18 |
+
$this->template( 'dashboard/widgets/widget-upgrade' );
|
19 |
+
} ?>
|
20 |
|
21 |
+
<?php $this->template( 'dashboard/widgets/widget-quiz' ); ?>
|
22 |
|
23 |
+
</div>
|
24 |
|
25 |
</div>
|
26 |
|
27 |
+
<?php
|
28 |
+
$notice_dismissed = get_option( 'forminator_dismiss_feature_114', false );
|
29 |
+
$version_upgraded = get_option( 'forminator_version_upgraded', false );
|
30 |
+
|
31 |
+
if ( ! $notice_dismissed && $version_upgraded ) { ?>
|
32 |
+
|
33 |
+
<?php $this->template( 'dashboard/new-feature-notice' ); ?>
|
34 |
+
|
35 |
+
<?php } ?>
|
36 |
+
|
37 |
</section>
|
admin/views/dashboard/new-feature-notice.php
CHANGED
@@ -1,11 +1,13 @@
|
|
1 |
<?php
|
2 |
-
$banner_1x = forminator_plugin_url() . 'assets/images/
|
3 |
-
$banner_2x = forminator_plugin_url() . 'assets/images/
|
4 |
|
|
|
5 |
if ( ! FORMINATOR_PRO ) {
|
6 |
$banner_1x = forminator_plugin_url() . 'assets/images/graphic-upgradetour-feature.png';
|
7 |
$banner_2x = forminator_plugin_url() . 'assets/images/graphic-upgradetour-feature@2x.png';
|
8 |
}
|
|
|
9 |
?>
|
10 |
|
11 |
<div
|
@@ -21,7 +23,7 @@ if ( ! FORMINATOR_PRO ) {
|
|
21 |
role="dialog"
|
22 |
>
|
23 |
|
24 |
-
<div class="sui-slider forminator-feature-modal" data-prop="
|
25 |
|
26 |
<ul role="document" class="sui-slider-content">
|
27 |
|
@@ -30,33 +32,24 @@ if ( ! FORMINATOR_PRO ) {
|
|
30 |
<div class="sui-box">
|
31 |
|
32 |
<div class="sui-box-banner" role="banner" aria-hidden="true">
|
33 |
-
<
|
34 |
-
src="<?php echo esc_url( $banner_1x ); ?>"
|
35 |
-
srcset="<?php echo esc_url( $banner_1x ); ?> 1x, <?php echo esc_url( $banner_2x ); ?> 2x"
|
36 |
-
class="sui-image"
|
37 |
-
alt="Forminator"
|
38 |
-
/>
|
39 |
</div>
|
40 |
|
41 |
<div class="sui-box-header sui-block-content-center">
|
42 |
|
43 |
-
<button data-a11y-dialog-hide="forminator-new-feature" class="sui-dialog-close forminator-dismiss-new-feature" aria-label="<?php esc_html_e( 'Close this dialog window', Forminator::DOMAIN ); ?>"></button>
|
44 |
|
45 |
-
<?php if ( FORMINATOR_PRO ) { ?>
|
46 |
|
47 |
-
<h2 class="sui-box-title"><?php esc_html_e( '
|
48 |
|
49 |
-
<p class="sui-description"><?php printf( esc_html__( 'That\'s right
|
50 |
|
51 |
-
<p class="sui-description"><?php printf( esc_html__( '
|
52 |
|
53 |
-
<?php } else { ?>
|
54 |
|
55 |
-
|
56 |
-
|
57 |
-
<p class="sui-description" sui-content-size="380"><?php esc_html_e( 'Introducing some excellent new features and improvements with Forminator 1.13, including the multi-file upload option, advanced date field limits, and much more.', Forminator::DOMAIN ); ?></p>
|
58 |
-
|
59 |
-
<?php } ?>
|
60 |
|
61 |
</div>
|
62 |
|
@@ -70,31 +63,7 @@ if ( ! FORMINATOR_PRO ) {
|
|
70 |
|
71 |
<?php } else { ?>
|
72 |
|
73 |
-
<div class="sui-box-
|
74 |
-
|
75 |
-
<ul class="sui-list" sui-type="bullets">
|
76 |
-
|
77 |
-
<li>
|
78 |
-
<p class="sui-description"><strong sui-color="darkgray"><?php esc_html_e( 'Multi-file Uploader', Forminator::DOMAIN ); ?></strong></p>
|
79 |
-
<p class="sui-description">
|
80 |
-
<?php printf(
|
81 |
-
esc_html__( 'Allow your users to upload more than just one file in the File Upload field with a drag & drop interface. All you have to do is, set the type as "%1$sMultiple%2$s" under the Labels tab of the File Upload field.', Forminator::DOMAIN ),
|
82 |
-
'<strong>',
|
83 |
-
'</strong>'
|
84 |
-
); ?>
|
85 |
-
</p>
|
86 |
-
</li>
|
87 |
-
|
88 |
-
<li>
|
89 |
-
<p class="sui-description"><strong sui-color="darkgray"><?php esc_html_e( 'Advanced Datepicker Limits', Forminator::DOMAIN ); ?></strong></p>
|
90 |
-
<p class="sui-description"><?php esc_html_e( 'Datepicker field has now got a new Limits tab where you can restrict the selectable dates in your form date picker field. E.g., future dates only, N days from today, dates between a specific date range, specific days of the week, and a lot more.', Forminator::DOMAIN ); ?></p>
|
91 |
-
</li>
|
92 |
-
|
93 |
-
</ul>
|
94 |
-
|
95 |
-
</div>
|
96 |
-
|
97 |
-
<div class="sui-box-footer sui-block-content-center">
|
98 |
|
99 |
<button class="sui-button forminator-dismiss-new-feature" type="button" data-a11y-dialog-hide="forminator-new-feature"><?php esc_html_e( 'Got It', Forminator::DOMAIN ); ?></button>
|
100 |
|
1 |
<?php
|
2 |
+
$banner_1x = forminator_plugin_url() . 'assets/images/graphic-upgradetour-feature.png';
|
3 |
+
$banner_2x = forminator_plugin_url() . 'assets/images/graphic-upgradetour-feature@2x.png';
|
4 |
|
5 |
+
/*
|
6 |
if ( ! FORMINATOR_PRO ) {
|
7 |
$banner_1x = forminator_plugin_url() . 'assets/images/graphic-upgradetour-feature.png';
|
8 |
$banner_2x = forminator_plugin_url() . 'assets/images/graphic-upgradetour-feature@2x.png';
|
9 |
}
|
10 |
+
*/
|
11 |
?>
|
12 |
|
13 |
<div
|
23 |
role="dialog"
|
24 |
>
|
25 |
|
26 |
+
<div class="sui-slider forminator-feature-modal" data-prop="forminator_dismiss_feature_114" data-nonce="<?php echo esc_attr( wp_create_nonce( 'forminator_dismiss_notification' ) ); ?>">
|
27 |
|
28 |
<ul role="document" class="sui-slider-content">
|
29 |
|
32 |
<div class="sui-box">
|
33 |
|
34 |
<div class="sui-box-banner" role="banner" aria-hidden="true">
|
35 |
+
<script src="https://fast.wistia.com/embed/medias/sbu0fqxgiu.jsonp" async></script><script src="https://fast.wistia.com/assets/external/E-v1.js" async></script><div class="wistia_responsive_padding" style="padding:56.25% 0 0 0;position:relative;"><div class="wistia_responsive_wrapper" style="height:100%;left:0;position:absolute;top:0;width:100%;"><span class="wistia_embed wistia_async_sbu0fqxgiu popover=true popoverAnimateThumbnail=true videoFoam=true" style="display:inline-block;height:100%;position:relative;width:100%"> </span></div></div>
|
|
|
|
|
|
|
|
|
|
|
36 |
</div>
|
37 |
|
38 |
<div class="sui-box-header sui-block-content-center">
|
39 |
|
40 |
+
<button data-a11y-dialog-hide="forminator-new-feature" style="z-index: 2" class="sui-dialog-close forminator-dismiss-new-feature" aria-label="<?php esc_html_e( 'Close this dialog window', Forminator::DOMAIN ); ?>"></button>
|
41 |
|
42 |
+
<?php //if ( FORMINATOR_PRO ) { ?>
|
43 |
|
44 |
+
<h2 class="sui-box-title"><?php esc_html_e( 'New! Capture leads on quizzes', Forminator::DOMAIN ); ?></h2>
|
45 |
|
46 |
+
<p class="sui-description"><?php printf( esc_html__( 'That\'s right! You can %scapture participants data%s (such as name, email, etc.) on your quizzes with this release.', Forminator::DOMAIN ), '<strong>', '</strong>' ); ?></p>
|
47 |
|
48 |
+
<p class="sui-description"><?php printf( esc_html__( 'While creating a quiz, you\'ll see a new option to collect leads and enabling that will add a new tab called "Leads" into the quiz editor where you can configure your lead generation from settings.', Forminator::DOMAIN ), '<strong>', '</strong>' ); ?></p>
|
49 |
|
50 |
+
<?php //} else { ?>
|
51 |
|
52 |
+
<?php //} ?>
|
|
|
|
|
|
|
|
|
53 |
|
54 |
</div>
|
55 |
|
63 |
|
64 |
<?php } else { ?>
|
65 |
|
66 |
+
<div class="sui-box-footer sui-block-content-center" sui-space-bottom="60">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
67 |
|
68 |
<button class="sui-button forminator-dismiss-new-feature" type="button" data-a11y-dialog-hide="forminator-new-feature"><?php esc_html_e( 'Got It', Forminator::DOMAIN ); ?></button>
|
69 |
|
admin/views/dashboard/widgets/widget-cform.php
CHANGED
@@ -18,167 +18,164 @@ if ( 0 === $num_recent ) {
|
|
18 |
};
|
19 |
?>
|
20 |
|
21 |
-
<div class="
|
22 |
|
23 |
-
<div class="sui-box">
|
24 |
|
25 |
-
<
|
26 |
|
27 |
-
|
28 |
-
|
29 |
-
</div>
|
30 |
-
|
31 |
-
<div class="sui-box-body">
|
32 |
|
33 |
-
|
34 |
|
35 |
-
|
36 |
|
37 |
-
|
|
|
38 |
|
39 |
-
<?php
|
40 |
|
41 |
-
|
42 |
-
|
43 |
-
<?php if ( 0 < forminator_cforms_total() ) { ?>
|
44 |
|
45 |
-
|
46 |
|
47 |
-
|
48 |
|
49 |
-
|
50 |
|
51 |
-
|
52 |
|
53 |
-
|
54 |
|
55 |
-
|
56 |
|
57 |
-
|
58 |
-
|
59 |
-
<tbody>
|
60 |
-
|
61 |
-
<?php foreach ( forminator_cform_modules( $num_recent, $statuses ) as $module ) { ?>
|
62 |
-
|
63 |
-
<tr>
|
64 |
-
|
65 |
-
<td class="sui-table-item-title"><?php echo forminator_get_form_name( $module['id'], 'custom_form' ); // phpcs:ignore ?></td>
|
66 |
-
|
67 |
-
<td class="fui-col-status">
|
68 |
-
|
69 |
-
<?php
|
70 |
-
if ( 'publish' === $module['status'] ) {
|
71 |
-
$status_class = 'published';
|
72 |
-
$status_text = esc_html__( 'Published', Forminator::DOMAIN );
|
73 |
-
} else {
|
74 |
-
$status_class = 'draft';
|
75 |
-
$status_text = esc_html__( 'Draft', Forminator::DOMAIN );
|
76 |
-
}
|
77 |
-
?>
|
78 |
-
|
79 |
-
<span
|
80 |
-
class="sui-status-dot sui-<?php echo esc_html( $status_class ); ?> sui-tooltip"
|
81 |
-
data-tooltip="<?php echo esc_html( $status_text ); ?>"
|
82 |
-
>
|
83 |
-
<span aria-hidden="true"></span>
|
84 |
-
</span>
|
85 |
-
|
86 |
-
<a href="<?php echo admin_url( 'admin.php?page=forminator-cform&view-stats=' . esc_attr( $module['id'] ) ); // phpcs:ignore ?>"
|
87 |
-
class="sui-button-icon sui-tooltip sui-tooltip-top-right-mobile"
|
88 |
-
data-tooltip="<?php esc_html_e( 'View Stats', Forminator::DOMAIN ); ?>">
|
89 |
-
<i class="sui-icon-graph-line" aria-hidden="true"></i>
|
90 |
-
</a>
|
91 |
-
|
92 |
-
<div class="sui-dropdown">
|
93 |
-
|
94 |
-
<button class="sui-button-icon sui-dropdown-anchor"
|
95 |
-
aria-expanded="false"
|
96 |
-
aria-label="<?php esc_html_e( 'More options', Forminator::DOMAIN ); ?>">
|
97 |
-
<i class="sui-icon-widget-settings-config" aria-hidden="true"></i>
|
98 |
-
</button>
|
99 |
-
|
100 |
-
<ul>
|
101 |
-
<li>
|
102 |
-
<a href="<?php echo admin_url( 'admin.php?page=forminator-cform-wizard&id=' . $module['id'] ); // phpcs:ignore ?>">
|
103 |
-
<i class="sui-icon-pencil" aria-hidden="true"></i> <?php esc_html_e( 'Edit', Forminator::DOMAIN ); ?>
|
104 |
-
</a>
|
105 |
-
</li>
|
106 |
-
<li><button class="wpmudev-open-modal"
|
107 |
-
data-modal="preview_cforms"
|
108 |
-
data-modal-title="<?php echo sprintf( '%s - %s', esc_html__( 'Preview Custom Form', Forminator::DOMAIN ), forminator_get_form_name( $module['id'], 'custom_form' ) ); // phpcs:ignore ?>"
|
109 |
-
data-form-id="<?php echo esc_attr( $module['id'] ); ?>"
|
110 |
-
data-nonce="<?php echo esc_attr( wp_create_nonce( 'forminator_popup_preview_cforms' ) ); ?>">
|
111 |
-
<i class="sui-icon-eye" aria-hidden="true"></i> <?php esc_html_e( 'Preview', Forminator::DOMAIN ); ?>
|
112 |
-
</button></li>
|
113 |
|
114 |
-
|
115 |
-
<button class="copy-clipboard" data-shortcode='[forminator_form id="<?php echo esc_attr( $module['id'] ); ?>"]'><i class="sui-icon-code" aria-hidden="true"></i> <?php esc_html_e( 'Copy Shortcode', Forminator::DOMAIN ); ?></button>
|
116 |
-
</li>
|
117 |
|
118 |
-
|
119 |
|
120 |
-
|
121 |
-
<input type="hidden" name="forminator_action" value="clone">
|
122 |
-
<input type="hidden" name="id" value="<?php echo esc_attr( $module['id'] ); ?>"/>
|
123 |
-
<?php wp_nonce_field( 'forminatorCustomFormRequest', 'forminatorNonce' ); ?>
|
124 |
-
<button type="submit">
|
125 |
-
<i class="sui-icon-page-multiple" aria-hidden="true"></i> <?php esc_html_e( 'Duplicate', Forminator::DOMAIN ); ?>
|
126 |
-
</button>
|
127 |
-
</form></li>
|
128 |
|
129 |
-
|
130 |
|
131 |
-
|
132 |
-
class="wpmudev-open-modal"
|
133 |
-
data-modal="export_cform"
|
134 |
-
data-modal-title=""
|
135 |
-
data-form-id="<?php echo esc_attr( $module['id'] ); ?>"
|
136 |
-
data-nonce="<?php echo esc_attr( wp_create_nonce( 'forminator_popup_export_cform' ) ); ?>">
|
137 |
-
<i class="sui-icon-cloud-migration" aria-hidden="true"></i> <?php esc_html_e( 'Export', Forminator::DOMAIN ); ?>
|
138 |
-
</a></li>
|
139 |
|
140 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
141 |
|
142 |
-
|
143 |
-
<button class="wpmudev-open-modal"
|
144 |
-
data-modal="delete-module"
|
145 |
-
data-modal-title="<?php esc_attr_e( 'Delete Form', Forminator::DOMAIN ); ?>"
|
146 |
-
data-modal-content="<?php esc_attr_e( 'Are you sure you wish to permanently delete this form?', Forminator::DOMAIN ); ?>"
|
147 |
-
data-form-id="<?php echo esc_attr( $module['id'] ); ?>"
|
148 |
-
data-nonce="<?php echo esc_attr( wp_create_nonce( 'forminatorCustomFormRequest' ) ); ?>">
|
149 |
-
<i class="sui-icon-trash" aria-hidden="true"></i> <?php esc_html_e( 'Delete', Forminator::DOMAIN ); ?>
|
150 |
-
</button>
|
151 |
-
</li>
|
152 |
|
153 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
154 |
|
155 |
-
</
|
156 |
|
157 |
-
</
|
158 |
|
159 |
-
</
|
160 |
|
161 |
-
|
162 |
|
163 |
-
|
164 |
|
165 |
-
</
|
166 |
|
167 |
-
|
168 |
|
169 |
-
|
170 |
-
data-modal="custom_forms">
|
171 |
-
<i class="sui-icon-plus" aria-hidden="true"></i> <?php esc_html_e( 'Create', Forminator::DOMAIN ); ?>
|
172 |
-
</button>
|
173 |
|
174 |
-
|
175 |
-
|
176 |
-
|
|
|
177 |
|
|
|
|
|
178 |
</div>
|
179 |
|
180 |
-
|
181 |
|
182 |
-
|
183 |
|
184 |
</div>
|
18 |
};
|
19 |
?>
|
20 |
|
21 |
+
<div class="sui-box">
|
22 |
|
23 |
+
<div class="sui-box-header">
|
24 |
|
25 |
+
<h3 class="sui-box-title"><i class="sui-icon-clipboard-notes" aria-hidden="true"></i><?php esc_html_e( 'Forms', Forminator::DOMAIN ); ?></h3>
|
26 |
|
27 |
+
</div>
|
|
|
|
|
|
|
|
|
28 |
|
29 |
+
<div class="sui-box-body">
|
30 |
|
31 |
+
<p><?php esc_html_e( 'Create any type of form from one of our pre-made templates, or build your own from scratch.', Forminator::DOMAIN ); ?></p>
|
32 |
|
33 |
+
<?php // Strict comparison is removed for a reason! ?>
|
34 |
+
<?php if ( 0 == forminator_cforms_total() ) { // WPCS: loose comparison ok ?>
|
35 |
|
36 |
+
<p><button href="/" class="sui-button sui-button-blue wpmudev-open-modal" data-modal="custom_forms"><i class="sui-icon-plus" aria-hidden="true"></i> <?php esc_html_e( 'Create', Forminator::DOMAIN ); ?></button></p>
|
37 |
|
38 |
+
<?php } ?>
|
|
|
|
|
39 |
|
40 |
+
</div>
|
41 |
|
42 |
+
<?php if ( 0 < forminator_cforms_total() ) { ?>
|
43 |
|
44 |
+
<table class="sui-table sui-table-flushed">
|
45 |
|
46 |
+
<thead>
|
47 |
|
48 |
+
<tr>
|
49 |
|
50 |
+
<th><?php esc_html_e( 'Name', Forminator::DOMAIN ); ?></th>
|
51 |
|
52 |
+
<th class="fui-col-status"><?php esc_html_e( 'Status', Forminator::DOMAIN ); ?></th>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
53 |
|
54 |
+
</tr>
|
|
|
|
|
55 |
|
56 |
+
</thead>
|
57 |
|
58 |
+
<tbody>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
59 |
|
60 |
+
<?php foreach ( forminator_cform_modules( $num_recent, $statuses ) as $module ) { ?>
|
61 |
|
62 |
+
<tr>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
63 |
|
64 |
+
<td class="sui-table-item-title"><?php echo forminator_get_form_name( $module['id'], 'custom_form' ); // phpcs:ignore ?></td>
|
65 |
+
|
66 |
+
<td class="fui-col-status">
|
67 |
+
|
68 |
+
<?php
|
69 |
+
if ( 'publish' === $module['status'] ) {
|
70 |
+
$status_class = 'published';
|
71 |
+
$status_text = esc_html__( 'Published', Forminator::DOMAIN );
|
72 |
+
} else {
|
73 |
+
$status_class = 'draft';
|
74 |
+
$status_text = esc_html__( 'Draft', Forminator::DOMAIN );
|
75 |
+
}
|
76 |
+
?>
|
77 |
+
|
78 |
+
<span
|
79 |
+
class="sui-status-dot sui-<?php echo esc_html( $status_class ); ?> sui-tooltip"
|
80 |
+
data-tooltip="<?php echo esc_html( $status_text ); ?>"
|
81 |
+
>
|
82 |
+
<span aria-hidden="true"></span>
|
83 |
+
</span>
|
84 |
+
|
85 |
+
<a href="<?php echo admin_url( 'admin.php?page=forminator-cform&view-stats=' . esc_attr( $module['id'] ) ); // phpcs:ignore ?>"
|
86 |
+
class="sui-button-icon sui-tooltip sui-tooltip-top-right-mobile"
|
87 |
+
data-tooltip="<?php esc_html_e( 'View Stats', Forminator::DOMAIN ); ?>">
|
88 |
+
<span class="sui-icon-graph-line" aria-hidden="true"></span>
|
89 |
+
</a>
|
90 |
+
|
91 |
+
<div class="sui-dropdown">
|
92 |
+
|
93 |
+
<button class="sui-button-icon sui-dropdown-anchor"
|
94 |
+
aria-expanded="false"
|
95 |
+
aria-label="<?php esc_html_e( 'More options', Forminator::DOMAIN ); ?>">
|
96 |
+
<span class="sui-icon-widget-settings-config" aria-hidden="true"></span>
|
97 |
+
</button>
|
98 |
+
|
99 |
+
<ul>
|
100 |
+
<li>
|
101 |
+
<a href="<?php echo admin_url( 'admin.php?page=forminator-cform-wizard&id=' . $module['id'] ); // phpcs:ignore ?>">
|
102 |
+
<span class="sui-icon-pencil" aria-hidden="true"></span> <?php esc_html_e( 'Edit', Forminator::DOMAIN ); ?>
|
103 |
+
</a>
|
104 |
+
</li>
|
105 |
+
<li><button class="wpmudev-open-modal"
|
106 |
+
data-modal="preview_cforms"
|
107 |
+
data-modal-title="<?php echo sprintf( '%s - %s', esc_html__( 'Preview Custom Form', Forminator::DOMAIN ), forminator_get_form_name( $module['id'], 'custom_form' ) ); // phpcs:ignore ?>"
|
108 |
+
data-form-id="<?php echo esc_attr( $module['id'] ); ?>"
|
109 |
+
data-nonce="<?php echo esc_attr( wp_create_nonce( 'forminator_popup_preview_cforms' ) ); ?>">
|
110 |
+
<span class="sui-icon-eye" aria-hidden="true"></span> <?php esc_html_e( 'Preview', Forminator::DOMAIN ); ?>
|
111 |
+
</button></li>
|
112 |
+
|
113 |
+
<li>
|
114 |
+
<button class="copy-clipboard" data-shortcode='[forminator_form id="<?php echo esc_attr( $module['id'] ); ?>"]'><i class="sui-icon-code" aria-hidden="true"></i> <?php esc_html_e( 'Copy Shortcode', Forminator::DOMAIN ); ?></button>
|
115 |
+
</li>
|
116 |
+
|
117 |
+
<li><a href="<?php echo admin_url( 'admin.php?page=forminator-entries&form_type=forminator_forms&form_id=' . $module['id'] ); // phpcs:ignore ?>"><i class="sui-icon-community-people" aria-hidden="true"></i> <?php esc_html_e( 'View Submissions', Forminator::DOMAIN ); ?></a></li>
|
118 |
+
|
119 |
+
<li><form method="post">
|
120 |
+
<input type="hidden" name="forminator_action" value="clone">
|
121 |
+
<input type="hidden" name="id" value="<?php echo esc_attr( $module['id'] ); ?>"/>
|
122 |
+
<?php wp_nonce_field( 'forminatorCustomFormRequest', 'forminatorNonce' ); ?>
|
123 |
+
<button type="submit">
|
124 |
+
<span class="sui-icon-page-multiple" aria-hidden="true"></span> <?php esc_html_e( 'Duplicate', Forminator::DOMAIN ); ?>
|
125 |
+
</button>
|
126 |
+
</form></li>
|
127 |
+
|
128 |
+
<?php if ( Forminator::is_import_export_feature_enabled() ) : ?>
|
129 |
+
|
130 |
+
<li><a href="#"
|
131 |
+
class="wpmudev-open-modal"
|
132 |
+
data-modal="export_cform"
|
133 |
+
data-modal-title=""
|
134 |
+
data-form-id="<?php echo esc_attr( $module['id'] ); ?>"
|
135 |
+
data-nonce="<?php echo esc_attr( wp_create_nonce( 'forminator_popup_export_cform' ) ); ?>">
|
136 |
+
<span class="sui-icon-cloud-migration" aria-hidden="true"></span> <?php esc_html_e( 'Export', Forminator::DOMAIN ); ?>
|
137 |
+
</a></li>
|
138 |
|
139 |
+
<?php endif; ?>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
140 |
|
141 |
+
<li>
|
142 |
+
<button class="wpmudev-open-modal"
|
143 |
+
data-modal="delete-module"
|
144 |
+
data-modal-title="<?php esc_attr_e( 'Delete Form', Forminator::DOMAIN ); ?>"
|
145 |
+
data-modal-content="<?php esc_attr_e( 'Are you sure you wish to permanently delete this form?', Forminator::DOMAIN ); ?>"
|
146 |
+
data-form-id="<?php echo esc_attr( $module['id'] ); ?>"
|
147 |
+
data-nonce="<?php echo esc_attr( wp_create_nonce( 'forminatorCustomFormRequest' ) ); ?>">
|
148 |
+
<span class="sui-icon-trash" aria-hidden="true"></span> <?php esc_html_e( 'Delete', Forminator::DOMAIN ); ?>
|
149 |
+
</button>
|
150 |
+
</li>
|
151 |
|
152 |
+
</ul>
|
153 |
|
154 |
+
</div>
|
155 |
|
156 |
+
</td>
|
157 |
|
158 |
+
</tr>
|
159 |
|
160 |
+
<?php } ?>
|
161 |
|
162 |
+
</tbody>
|
163 |
|
164 |
+
</table>
|
165 |
|
166 |
+
<div class="sui-box-footer">
|
|
|
|
|
|
|
167 |
|
168 |
+
<button class="sui-button sui-button-blue wpmudev-open-modal forminator-create-form"
|
169 |
+
data-modal="custom_forms">
|
170 |
+
<span class="sui-icon-plus" aria-hidden="true"></span> <?php esc_html_e( 'Create', Forminator::DOMAIN ); ?>
|
171 |
+
</button>
|
172 |
|
173 |
+
<div class="sui-actions-right">
|
174 |
+
<p class="sui-description"><a href="<?php echo admin_url( 'admin.php?page=forminator-cform' ); // phpcs:ignore ?>" class="sui-link-gray"><?php esc_html_e( 'View all forms', Forminator::DOMAIN ); ?></a></p>
|
175 |
</div>
|
176 |
|
177 |
+
</div>
|
178 |
|
179 |
+
<?php } ?>
|
180 |
|
181 |
</div>
|
admin/views/dashboard/widgets/widget-poll.php
CHANGED
@@ -16,8 +16,6 @@ if ( 0 === $num_recent ) {
|
|
16 |
}
|
17 |
?>
|
18 |
|
19 |
-
<div class="fui-col-6">
|
20 |
-
|
21 |
<div class="sui-box">
|
22 |
|
23 |
<div class="sui-box-header">
|
@@ -162,7 +160,7 @@ if ( 0 === $num_recent ) {
|
|
162 |
|
163 |
<div class="sui-box-footer">
|
164 |
|
165 |
-
<button class="sui-button sui-button-blue wpmudev-open-modal"
|
166 |
data-modal="polls">
|
167 |
<i class="sui-icon-plus" aria-hidden="true"></i> <?php esc_html_e( 'Create', Forminator::DOMAIN ); ?>
|
168 |
</button>
|
@@ -176,5 +174,3 @@ if ( 0 === $num_recent ) {
|
|
176 |
<?php } ?>
|
177 |
|
178 |
</div>
|
179 |
-
|
180 |
-
</div>
|
16 |
}
|
17 |
?>
|
18 |
|
|
|
|
|
19 |
<div class="sui-box">
|
20 |
|
21 |
<div class="sui-box-header">
|
160 |
|
161 |
<div class="sui-box-footer">
|
162 |
|
163 |
+
<button class="sui-button sui-button-blue wpmudev-open-modal forminator-create-poll"
|
164 |
data-modal="polls">
|
165 |
<i class="sui-icon-plus" aria-hidden="true"></i> <?php esc_html_e( 'Create', Forminator::DOMAIN ); ?>
|
166 |
</button>
|
174 |
<?php } ?>
|
175 |
|
176 |
</div>
|
|
|
|
admin/views/dashboard/widgets/widget-quiz.php
CHANGED
@@ -18,8 +18,6 @@ if ( 0 === $num_recent ) {
|
|
18 |
}
|
19 |
?>
|
20 |
|
21 |
-
<div class="fui-col-6">
|
22 |
-
|
23 |
<div class="sui-box">
|
24 |
|
25 |
<div class="sui-box-header">
|
@@ -76,6 +74,8 @@ if ( 0 === $num_recent ) {
|
|
76 |
$status_class = 'draft';
|
77 |
$status_text = esc_html__( 'Draft', Forminator::DOMAIN );
|
78 |
}
|
|
|
|
|
79 |
?>
|
80 |
|
81 |
<span
|
@@ -110,6 +110,8 @@ if ( 0 === $num_recent ) {
|
|
110 |
data-modal="preview_quizzes"
|
111 |
data-modal-title="<?php echo sprintf( '%s - %s', __( 'Preview Quiz', Forminator::DOMAIN ), forminator_get_form_name( $module['id'], 'quiz' ) ); // phpcs:ignore ?>"
|
112 |
data-form-id="<?php echo esc_attr( $module['id'] ); ?>"
|
|
|
|
|
113 |
data-nonce="<?php echo esc_attr( wp_create_nonce( 'forminator_popup_preview_quizzes' ) ); ?>">
|
114 |
<i class="sui-icon-eye" aria-hidden="true"></i> <?php esc_html_e( 'Preview', Forminator::DOMAIN ); ?>
|
115 |
</button></li>
|
@@ -120,24 +122,39 @@ if ( 0 === $num_recent ) {
|
|
120 |
|
121 |
<li><a href="<?php echo admin_url( 'admin.php?page=forminator-entries&form_type=forminator_quizzes&form_id=' . $module['id'] ); // phpcs:ignore ?>"><i class="sui-icon-community-people" aria-hidden="true"></i> <?php esc_html_e( 'View Submissions', Forminator::DOMAIN ); ?></a></li>
|
122 |
|
123 |
-
<li
|
124 |
<input type="hidden" name="forminator_action" value="clone">
|
125 |
<input type="hidden" name="id" value="<?php echo esc_attr( $module['id'] ); ?>"/>
|
126 |
<?php wp_nonce_field( 'forminatorQuizFormRequest', 'forminatorNonce' ); ?>
|
127 |
-
|
128 |
-
<
|
129 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
130 |
</form></li>
|
131 |
|
132 |
<?php if ( Forminator::is_import_export_feature_enabled() ) : ?>
|
133 |
-
|
134 |
-
|
135 |
-
|
136 |
-
|
137 |
-
|
138 |
-
|
139 |
-
|
140 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
141 |
|
142 |
<?php endif; ?>
|
143 |
|
@@ -167,7 +184,7 @@ if ( 0 === $num_recent ) {
|
|
167 |
|
168 |
<div class="sui-box-footer">
|
169 |
|
170 |
-
<button class="sui-button sui-button-blue wpmudev-open-modal"
|
171 |
data-modal="quizzes">
|
172 |
<i class="sui-icon-plus" aria-hidden="true"></i> <?php esc_html_e( 'Create', Forminator::DOMAIN ); ?>
|
173 |
</button>
|
@@ -181,5 +198,3 @@ if ( 0 === $num_recent ) {
|
|
181 |
<?php } ?>
|
182 |
|
183 |
</div>
|
184 |
-
|
185 |
-
</div>
|
18 |
}
|
19 |
?>
|
20 |
|
|
|
|
|
21 |
<div class="sui-box">
|
22 |
|
23 |
<div class="sui-box-header">
|
74 |
$status_class = 'draft';
|
75 |
$status_text = esc_html__( 'Draft', Forminator::DOMAIN );
|
76 |
}
|
77 |
+
$has_leads = isset( $module['has_leads'] ) ? $module['has_leads'] : false;
|
78 |
+
$leads_id = isset( $module['leads_id'] ) ? $module['leads_id'] : 0;
|
79 |
?>
|
80 |
|
81 |
<span
|
110 |
data-modal="preview_quizzes"
|
111 |
data-modal-title="<?php echo sprintf( '%s - %s', __( 'Preview Quiz', Forminator::DOMAIN ), forminator_get_form_name( $module['id'], 'quiz' ) ); // phpcs:ignore ?>"
|
112 |
data-form-id="<?php echo esc_attr( $module['id'] ); ?>"
|
113 |
+
data-has-leads="<?php echo esc_attr( $has_leads ); ?>"
|
114 |
+
data-leads-id="<?php echo esc_attr( $leads_id ); ?>"
|
115 |
data-nonce="<?php echo esc_attr( wp_create_nonce( 'forminator_popup_preview_quizzes' ) ); ?>">
|
116 |
<i class="sui-icon-eye" aria-hidden="true"></i> <?php esc_html_e( 'Preview', Forminator::DOMAIN ); ?>
|
117 |
</button></li>
|
122 |
|
123 |
<li><a href="<?php echo admin_url( 'admin.php?page=forminator-entries&form_type=forminator_quizzes&form_id=' . $module['id'] ); // phpcs:ignore ?>"><i class="sui-icon-community-people" aria-hidden="true"></i> <?php esc_html_e( 'View Submissions', Forminator::DOMAIN ); ?></a></li>
|
124 |
|
125 |
+
<li <?php echo ( $module['has_leads'] ) ? 'aria-hidden="true"' : ''; ?>><form method="post">
|
126 |
<input type="hidden" name="forminator_action" value="clone">
|
127 |
<input type="hidden" name="id" value="<?php echo esc_attr( $module['id'] ); ?>"/>
|
128 |
<?php wp_nonce_field( 'forminatorQuizFormRequest', 'forminatorNonce' ); ?>
|
129 |
+
<?php if ( $module['has_leads'] ): ?>
|
130 |
+
<button type="submit" disabled="disabled" class="fui-button-with-tag sui-tooltip sui-tooltip-left sui-constrained" data-tooltip="<?php esc_html_e( 'Duplicate isn\'t supported at the moment for the quizzes with lead capturing enabled.', Forminator::DOMAIN ); ?>">
|
131 |
+
<span class="sui-icon-page-multiple" aria-hidden="true"></span>
|
132 |
+
<span class="fui-button-label"><?php esc_html_e( 'Duplicate', Forminator::DOMAIN ); ?></span>
|
133 |
+
<span class="sui-tag sui-tag-blue sui-tag-sm"><?php echo esc_html__( 'Coming soon', Forminator::DOMAIN ); ?></span>
|
134 |
+
</button>
|
135 |
+
<?php else: ?>
|
136 |
+
<button type="submit"><span class="sui-icon-page-multiple" aria-hidden="true"></span> <?php esc_html_e( 'Duplicate', Forminator::DOMAIN ); ?></button>
|
137 |
+
<?php endif; ?>
|
138 |
</form></li>
|
139 |
|
140 |
<?php if ( Forminator::is_import_export_feature_enabled() ) : ?>
|
141 |
+
<?php if ( $module['has_leads'] ): ?>
|
142 |
+
<li aria-hidden="true"><a href="#" class="fui-button-with-tag sui-tooltip sui-tooltip-left"
|
143 |
+
data-tooltip="<?php esc_html_e( 'Export isn\'t supported at the moment for the quizzes with lead capturing enabled.', Forminator::DOMAIN ); ?>">
|
144 |
+
<span class="sui-icon-cloud-migration" aria-hidden="true"></span>
|
145 |
+
<span class="fui-button-label"><?php esc_html_e( 'Export', Forminator::DOMAIN ); ?></span>
|
146 |
+
<span class="sui-tag sui-tag-blue sui-tag-sm"><?php echo esc_html__( 'Coming soon', Forminator::DOMAIN ); ?></span>
|
147 |
+
</a></li>
|
148 |
+
<?php else: ?>
|
149 |
+
<li><a href="#"
|
150 |
+
class="wpmudev-open-modal"
|
151 |
+
data-modal="export_quiz"
|
152 |
+
data-modal-title=""
|
153 |
+
data-form-id="<?php echo esc_attr( $module['id'] ); ?>"
|
154 |
+
data-nonce="<?php echo esc_attr( wp_create_nonce( 'forminator_popup_export_quiz' ) ); ?>">
|
155 |
+
<i class="sui-icon-cloud-migration" aria-hidden="true"></i> <?php esc_html_e( 'Export', Forminator::DOMAIN ); ?>
|
156 |
+
</a></li>
|
157 |
+
<?php endif; ?>
|
158 |
|
159 |
<?php endif; ?>
|
160 |
|
184 |
|
185 |
<div class="sui-box-footer">
|
186 |
|
187 |
+
<button class="sui-button sui-button-blue wpmudev-open-modal forminator-create-quiz"
|
188 |
data-modal="quizzes">
|
189 |
<i class="sui-icon-plus" aria-hidden="true"></i> <?php esc_html_e( 'Create', Forminator::DOMAIN ); ?>
|
190 |
</button>
|
198 |
<?php } ?>
|
199 |
|
200 |
</div>
|
|
|
|
admin/views/dashboard/widgets/widget-upgrade.php
CHANGED
@@ -1,37 +1,33 @@
|
|
1 |
-
<div class="
|
2 |
|
3 |
-
<div class="sui-box">
|
4 |
|
5 |
-
<
|
6 |
-
|
7 |
-
<h2 class="sui-box-title"><span class="sui-icon-forminator" aria-hidden="true"></span> <?php esc_html_e( 'Forminator Pro', Forminator::DOMAIN ); ?></h2>
|
8 |
-
|
9 |
-
<div class="sui-actions-left" aria-hidden="true">
|
10 |
-
<span class="sui-tag sui-tag-pro"><?php esc_html_e( 'Pro', Forminator::DOMAIN ); ?></span>
|
11 |
-
</div>
|
12 |
|
|
|
|
|
13 |
</div>
|
14 |
|
15 |
-
|
16 |
|
17 |
-
|
18 |
|
19 |
-
|
20 |
-
<li><span class="sui-icon-check sui-lg" aria-hidden="true"></span><?php esc_html_e( 'Premium form fields and E-Signature integration', Forminator::DOMAIN ); ?></li>
|
21 |
-
<li><span class="sui-icon-check sui-lg" aria-hidden="true"></span><?php esc_html_e( 'Early access to the newest from features', Forminator::DOMAIN ); ?></li>
|
22 |
-
<li><span class="sui-icon-check sui-lg" aria-hidden="true"></span><?php esc_html_e( 'Smush and Hummingbird Pro performance pack', Forminator::DOMAIN ); ?></li>
|
23 |
-
<li><span class="sui-icon-check sui-lg" aria-hidden="true"></span><?php esc_html_e( 'Complete marketing suite - pop-ups, email, and more', Forminator::DOMAIN ); ?></li>
|
24 |
-
<li><span class="sui-icon-check sui-lg" aria-hidden="true"></span><?php esc_html_e( 'Customizable Google analytic dashboard', Forminator::DOMAIN ); ?></li>
|
25 |
-
<li><span class="sui-icon-check sui-lg" aria-hidden="true"></span><?php esc_html_e( 'Manage unlimited WordPress sites from the Hub', Forminator::DOMAIN ); ?></li>
|
26 |
-
<li><span class="sui-icon-check sui-lg" aria-hidden="true"></span><?php esc_html_e( '24/7 live WordPress support', Forminator::DOMAIN ); ?></li>
|
27 |
-
<li><span class="sui-icon-check sui-lg" aria-hidden="true"></span><?php esc_html_e( 'The WPMU DEV Guarantee', Forminator::DOMAIN ); ?></li>
|
28 |
-
</ul>
|
29 |
|
30 |
-
|
31 |
-
|
32 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
33 |
|
34 |
-
|
|
|
|
|
35 |
|
36 |
</div>
|
37 |
|
1 |
+
<div class="sui-box">
|
2 |
|
3 |
+
<div class="sui-box-header">
|
4 |
|
5 |
+
<h2 class="sui-box-title"><span class="sui-icon-forminator" aria-hidden="true"></span> <?php esc_html_e( 'Forminator Pro', Forminator::DOMAIN ); ?></h2>
|
|
|
|
|
|
|
|
|
|
|
|
|
6 |
|
7 |
+
<div class="sui-actions-left" aria-hidden="true">
|
8 |
+
<span class="sui-tag sui-tag-pro"><?php esc_html_e( 'Pro', Forminator::DOMAIN ); ?></span>
|
9 |
</div>
|
10 |
|
11 |
+
</div>
|
12 |
|
13 |
+
<div class="sui-box-body">
|
14 |
|
15 |
+
<p style="margin-bottom: 34px;"><?php esc_html_e( 'Get Forminator Pro, our full lineup of WordPress marketing tools and more for free when you start your WPMU DEV membership.', Forminator::DOMAIN ); ?></p>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
16 |
|
17 |
+
<ul class="sui-list-pro">
|
18 |
+
<li><span class="sui-icon-check sui-lg" aria-hidden="true"></span><?php esc_html_e( 'Premium form fields and E-Signature integration', Forminator::DOMAIN ); ?></li>
|
19 |
+
<li><span class="sui-icon-check sui-lg" aria-hidden="true"></span><?php esc_html_e( 'Early access to the newest from features', Forminator::DOMAIN ); ?></li>
|
20 |
+
<li><span class="sui-icon-check sui-lg" aria-hidden="true"></span><?php esc_html_e( 'Smush and Hummingbird Pro performance pack', Forminator::DOMAIN ); ?></li>
|
21 |
+
<li><span class="sui-icon-check sui-lg" aria-hidden="true"></span><?php esc_html_e( 'Complete marketing suite - pop-ups, email, and more', Forminator::DOMAIN ); ?></li>
|
22 |
+
<li><span class="sui-icon-check sui-lg" aria-hidden="true"></span><?php esc_html_e( 'Customizable Google analytic dashboard', Forminator::DOMAIN ); ?></li>
|
23 |
+
<li><span class="sui-icon-check sui-lg" aria-hidden="true"></span><?php esc_html_e( 'Manage unlimited WordPress sites from the Hub', Forminator::DOMAIN ); ?></li>
|
24 |
+
<li><span class="sui-icon-check sui-lg" aria-hidden="true"></span><?php esc_html_e( '24/7 live WordPress support', Forminator::DOMAIN ); ?></li>
|
25 |
+
<li><span class="sui-icon-check sui-lg" aria-hidden="true"></span><?php esc_html_e( 'The WPMU DEV Guarantee', Forminator::DOMAIN ); ?></li>
|
26 |
+
</ul>
|
27 |
|
28 |
+
<p><a href="https://premium.wpmudev.org/project/forminator-pro/?utm_source=forminator&utm_medium=plugin&utm_campaign=forminator_dashboard_upsellwidget_button" class="sui-button sui-button-purple" target="_blank">
|
29 |
+
<?php esc_html_e( 'Try Pro for FREE today!', Forminator::DOMAIN ); ?>
|
30 |
+
</a></p>
|
31 |
|
32 |
</div>
|
33 |
|
admin/views/poll/list/content.php
CHANGED
@@ -17,6 +17,8 @@ $sql_month_start_date = date( 'Y-m-d H:i:s', strtotime( '-30 days midnight' ) );
|
|
17 |
|
18 |
// Count total entries from last 30 days
|
19 |
$total_entries_from_last_month = count( Forminator_Form_Entry_Model::get_newer_entry_ids( 'poll', $sql_month_start_date ) );
|
|
|
|
|
20 |
?>
|
21 |
|
22 |
<?php if ( $count > 0 ) { ?>
|
@@ -53,7 +55,16 @@ $total_entries_from_last_month = count( Forminator_Form_Entry_Model::get_newer_e
|
|
53 |
<span class="sui-list-label"><?php esc_html_e( 'Submissions in the last 30 days', Forminator::DOMAIN ); ?></span>
|
54 |
<span class="sui-list-detail"><?php echo esc_html( $total_entries_from_last_month ); ?></span>
|
55 |
</li>
|
56 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
57 |
</ul>
|
58 |
|
59 |
</div>
|
@@ -480,7 +491,7 @@ foreach ( $this->getModules() as $module ) {
|
|
480 |
return tooltipItem.xLabel;
|
481 |
},
|
482 |
// Set label text color
|
483 |
-
labelTextColor:function( tooltipItem, chart ){
|
484 |
return '#AAAAAA';
|
485 |
}
|
486 |
}
|
17 |
|
18 |
// Count total entries from last 30 days
|
19 |
$total_entries_from_last_month = count( Forminator_Form_Entry_Model::get_newer_entry_ids( 'poll', $sql_month_start_date ) );
|
20 |
+
|
21 |
+
$most_entry = Forminator_Form_Entry_Model::get_most_entry( 'poll' );
|
22 |
?>
|
23 |
|
24 |
<?php if ( $count > 0 ) { ?>
|
55 |
<span class="sui-list-label"><?php esc_html_e( 'Submissions in the last 30 days', Forminator::DOMAIN ); ?></span>
|
56 |
<span class="sui-list-detail"><?php echo esc_html( $total_entries_from_last_month ); ?></span>
|
57 |
</li>
|
58 |
+
<?php if ( ! empty( $most_entry ) && get_post_status( $most_entry->form_id ) && 0 !== (int) $most_entry->entry_count ) { ?>
|
59 |
+
<li>
|
60 |
+
<span class="sui-list-label"><?php esc_html_e( 'Most submissions', Forminator::DOMAIN ); ?></span>
|
61 |
+
<span class="sui-list-detail">
|
62 |
+
<a href="<?php echo esc_url( admin_url( 'admin.php?page=forminator-poll-wizard&id=' . $most_entry->form_id ) ); ?>">
|
63 |
+
<?php echo forminator_get_form_name( $most_entry->form_id, 'poll' ); ?>
|
64 |
+
</a>
|
65 |
+
</span>
|
66 |
+
</li>
|
67 |
+
<?php } ?>
|
68 |
</ul>
|
69 |
|
70 |
</div>
|
491 |
return tooltipItem.xLabel;
|
492 |
},
|
493 |
// Set label text color
|
494 |
+
labelTextColor:function( tooltipItem, chart ) {
|
495 |
return '#AAAAAA';
|
496 |
}
|
497 |
}
|
admin/views/quiz/entries/content-leads-none.php
ADDED
@@ -0,0 +1,218 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
$entries = $this->get_table();
|
3 |
+
$form_type = $this->get_form_type();
|
4 |
+
$count = $this->get_total_entries();
|
5 |
+
$entries_per_page = $this->get_per_page();
|
6 |
+
$first_item = $count;
|
7 |
+
$page_number = $this->get_paged();
|
8 |
+
|
9 |
+
if ( $page_number > 1 ) {
|
10 |
+
$first_item = $count - ( ( $page_number - 1 ) * $entries_per_page );
|
11 |
+
}
|
12 |
+
?>
|
13 |
+
|
14 |
+
<?php foreach ( $entries as $entry ) : ?>
|
15 |
+
|
16 |
+
<tr class="sui-accordion-item">
|
17 |
+
|
18 |
+
<td>
|
19 |
+
<label class="sui-checkbox">
|
20 |
+
<input name="ids[]" value="<?php echo esc_attr( $entry->entry_id ); ?>" type="checkbox" id="quiz-answer-<?php echo esc_attr( $entry->entry_id ); ?>">
|
21 |
+
<span></span>
|
22 |
+
<div class="sui-description"><?php echo esc_attr( $first_item ); ?></div>
|
23 |
+
</label>
|
24 |
+
</td>
|
25 |
+
|
26 |
+
<td colspan="5">
|
27 |
+
<?php echo date( get_option( 'date_format' ) . ' ' . get_option( 'time_format' ), strtotime( $entry->date_created_sql ) ); // phpcs:ignore ?>
|
28 |
+
<span class="sui-accordion-open-indicator">
|
29 |
+
<i class="sui-icon-chevron-down"></i>
|
30 |
+
</span>
|
31 |
+
</td>
|
32 |
+
|
33 |
+
</tr>
|
34 |
+
|
35 |
+
<tr class="sui-accordion-item-content">
|
36 |
+
|
37 |
+
<td colspan="6">
|
38 |
+
|
39 |
+
<div class="sui-box">
|
40 |
+
|
41 |
+
<div class="sui-box-body fui-entries--knowledge">
|
42 |
+
|
43 |
+
<?php // ROW: Title. ?>
|
44 |
+
<div class="fui-entries-block">
|
45 |
+
|
46 |
+
<h2 class="fui-entries-title"><?php echo '#' . esc_attr( $first_item ); ?></h2>
|
47 |
+
|
48 |
+
<p class="sui-description"><?php echo date( get_option( 'date_format' ) . ' ' . get_option( 'time_format' ), strtotime( $entry->date_created_sql ) ); // phpcs:ignore ?></p>
|
49 |
+
|
50 |
+
</div>
|
51 |
+
|
52 |
+
<?php // ROW: Lead Details. ?>
|
53 |
+
<?php if ( isset( $entry->meta_data['lead_entry'] ) && isset( $entry->meta_data['lead_entry']['value'] ) ) { ?>
|
54 |
+
|
55 |
+
<div class="fui-entries-block">
|
56 |
+
|
57 |
+
<h3 class="fui-entries-subtitle"><?php esc_html_e( 'Lead Details', Forminator::DOMAIN ); ?></h3>
|
58 |
+
|
59 |
+
<table class="fui-entries-table" data-design="ghost">
|
60 |
+
|
61 |
+
<tbody>
|
62 |
+
|
63 |
+
<?php foreach( $entry->meta_data['lead_entry']['value'] as $lead_entry ) { ?>
|
64 |
+
|
65 |
+
<tr>
|
66 |
+
|
67 |
+
<td><?php echo $lead_entry['name']; // phpcs:ignore ?></td>
|
68 |
+
<td><?php echo $lead_entry['value']; // phpcs:ignore ?></td>
|
69 |
+
|
70 |
+
</tr>
|
71 |
+
|
72 |
+
<?php } ?>
|
73 |
+
|
74 |
+
</tbody>
|
75 |
+
|
76 |
+
</table>
|
77 |
+
|
78 |
+
</div>
|
79 |
+
|
80 |
+
<?php } ?>
|
81 |
+
|
82 |
+
<?php // ROW: Quiz Results. ?>
|
83 |
+
<div class="fui-entries-block">
|
84 |
+
|
85 |
+
<h3 class="fui-entries-subtitle"><?php esc_html_e( 'Quiz Results', Forminator::DOMAIN ); ?></h3>
|
86 |
+
|
87 |
+
<?php if ( 'knowledge' === $form_type ) { ?>
|
88 |
+
|
89 |
+
<?php
|
90 |
+
$meta = $entry->meta_data['entry']['value'];
|
91 |
+
$total = 0;
|
92 |
+
$right = 0;
|
93 |
+
?>
|
94 |
+
|
95 |
+
<p class="sui-description"><?php echo sprintf( __( 'You got %s/%s correct answers.', Forminator::DOMAIN ), $right, $total ); // phpcs:ignore ?></p>
|
96 |
+
|
97 |
+
<table class="fui-entries-table">
|
98 |
+
|
99 |
+
<thead>
|
100 |
+
|
101 |
+
<tr>
|
102 |
+
<th><?php esc_html_e( 'Question', Forminator::DOMAIN ); ?></th>
|
103 |
+
<th><?php esc_html_e( 'Answer', Forminator::DOMAIN ); ?></th>
|
104 |
+
</tr>
|
105 |
+
|
106 |
+
</thead>
|
107 |
+
|
108 |
+
<tbody>
|
109 |
+
|
110 |
+
<?php foreach ( $meta as $answer ) : ?>
|
111 |
+
|
112 |
+
<?php
|
113 |
+
$total ++;
|
114 |
+
|
115 |
+
if ( $answer['isCorrect'] ) {
|
116 |
+
$right ++;
|
117 |
+
}
|
118 |
+
|
119 |
+
$user_answer = $answer['answer'];
|
120 |
+
?>
|
121 |
+
|
122 |
+
<tr>
|
123 |
+
<td><strong><?php echo esc_html( $answer['question'] ); ?></strong></td>
|
124 |
+
<td>
|
125 |
+
<?php if ( $answer['isCorrect'] ) {
|
126 |
+
echo '<span class="sui-tag sui-tag-success">' . esc_html( $user_answer ) . '</span>';
|
127 |
+
} else {
|
128 |
+
echo '<span class="sui-tag sui-tag-error">' . esc_html( $user_answer ) . '</span>';
|
129 |
+
} ?>
|
130 |
+
</td>
|
131 |
+
</tr>
|
132 |
+
|
133 |
+
<?php endforeach; ?>
|
134 |
+
|
135 |
+
</tbody>
|
136 |
+
|
137 |
+
<tfoot aria-hidden="true">
|
138 |
+
|
139 |
+
<tr>
|
140 |
+
|
141 |
+
<td colspan="2">
|
142 |
+
|
143 |
+
<div class="fui-entries-table-legend">
|
144 |
+
|
145 |
+
<p class="correct"><?php esc_html_e( 'Correct', Forminator::DOMAIN ); ?></p>
|
146 |
+
|
147 |
+
<p class="incorrect"><?php esc_html_e( 'Incorrect', Forminator::DOMAIN ); ?></p>
|
148 |
+
|
149 |
+
</div>
|
150 |
+
|
151 |
+
</td>
|
152 |
+
|
153 |
+
</tr>
|
154 |
+
|
155 |
+
</tfoot>
|
156 |
+
|
157 |
+
</table>
|
158 |
+
|
159 |
+
<?php } else { ?>
|
160 |
+
|
161 |
+
<?php $meta = $entry->meta_data['entry']['value'][0]['value']; ?>
|
162 |
+
|
163 |
+
<?php if ( isset( $meta['answers'] ) && is_array( $meta['answers'] ) ) : ?>
|
164 |
+
|
165 |
+
<table class="fui-entries-table">
|
166 |
+
|
167 |
+
<thead>
|
168 |
+
|
169 |
+
<tr>
|
170 |
+
<th><?php esc_html_e( 'Question', Forminator::DOMAIN ); ?></th>
|
171 |
+
<th><?php esc_html_e( 'Answer', Forminator::DOMAIN ); ?></th>
|
172 |
+
</tr>
|
173 |
+
|
174 |
+
</thead>
|
175 |
+
|
176 |
+
<tbody>
|
177 |
+
|
178 |
+
<?php foreach ( $meta['answers'] as $answer ) : ?>
|
179 |
+
|
180 |
+
<tr>
|
181 |
+
<td><strong><?php echo esc_html( $answer['question'] ); ?></strong></td>
|
182 |
+
<td><?php echo esc_html( $answer['answer'] ); ?></td>
|
183 |
+
</tr>
|
184 |
+
|
185 |
+
<?php endforeach; ?>
|
186 |
+
|
187 |
+
</tbody>
|
188 |
+
|
189 |
+
<tfoot aria-hidden="true">
|
190 |
+
|
191 |
+
<tr>
|
192 |
+
|
193 |
+
<td colspan="2"><?php printf( __( '<strong>Quiz Result:</strong> %s', Forminator::DOMAIN ), $meta['result']['title'] ); // phpcs:ignore ?></td>
|
194 |
+
|
195 |
+
</tr>
|
196 |
+
|
197 |
+
</tfoot>
|
198 |
+
|
199 |
+
</table>
|
200 |
+
|
201 |
+
<?php endif; ?>
|
202 |
+
|
203 |
+
<?php } ?>
|
204 |
+
|
205 |
+
</div>
|
206 |
+
|
207 |
+
</div>
|
208 |
+
|
209 |
+
</div>
|
210 |
+
|
211 |
+
</td>
|
212 |
+
|
213 |
+
</tr>
|
214 |
+
|
215 |
+
<?php
|
216 |
+
$first_item --;
|
217 |
+
|
218 |
+
endforeach;
|
admin/views/quiz/entries/content-leads.php
ADDED
@@ -0,0 +1,538 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
$form_type = $this->get_form_type();
|
3 |
+
$url_entry_id = ( isset( $_GET['entry_id'] ) && ! empty( $_GET['entry_id'] ) ) ? (int) sanitize_text_field( $_GET['entry_id'] ) : 0;//phpcs:ignore
|
4 |
+
foreach ( $this->entries_iterator() as $entries ) {
|
5 |
+
|
6 |
+
$db_entry_id = isset( $entries['entry_id'] ) ? $entries['entry_id'] : '';
|
7 |
+
$entry_date = isset( $entries['entry_date'] ) ? $entries['entry_date'] : '';
|
8 |
+
|
9 |
+
$summary = $entries['summary'];
|
10 |
+
$summary_items = $summary['items'];
|
11 |
+
|
12 |
+
$detail = $entries['detail'];
|
13 |
+
$detail_items = $detail['items'];
|
14 |
+
$quiz_entry = $detail['quiz_entry'];
|
15 |
+
$integrations = $detail['integrations'];
|
16 |
+
//Open entry tab by received submission link
|
17 |
+
$cls_open_tab = $url_entry_id === (int) $db_entry_id ? 'sui-accordion-item--open' : '';
|
18 |
+
?>
|
19 |
+
|
20 |
+
<tr class="sui-accordion-item <?php echo esc_attr( $cls_open_tab ); ?>" data-entry-id="<?php echo esc_attr( $db_entry_id ); ?>">
|
21 |
+
|
22 |
+
<?php foreach ( $summary_items as $key => $summary_item ) { ?>
|
23 |
+
|
24 |
+
<?php
|
25 |
+
if ( ! $summary['num_fields_left'] && ( count( $summary_items ) - 1 ) === $key ) :
|
26 |
+
|
27 |
+
echo '<td>';
|
28 |
+
|
29 |
+
echo esc_html( $summary_item['value'] );
|
30 |
+
|
31 |
+
echo '<span class="sui-accordion-open-indicator">';
|
32 |
+
|
33 |
+
echo '<span class="sui-icon-chevron-down"></span>';
|
34 |
+
|
35 |
+
echo '</span>';
|
36 |
+
|
37 |
+
echo '</td>';
|
38 |
+
|
39 |
+
elseif ( 1 === $summary_item['colspan'] ) :
|
40 |
+
|
41 |
+
echo '<td class="sui-accordion-item-title">';
|
42 |
+
|
43 |
+
echo '<label class="sui-checkbox">';
|
44 |
+
|
45 |
+
echo '<input type="checkbox" name="ids[]" value="' . esc_attr( $db_entry_id ) . '" id="quiz-answer-' . esc_attr( $db_entry_id ) . '" />';
|
46 |
+
|
47 |
+
echo '<span aria-hidden="true"></span>';
|
48 |
+
|
49 |
+
echo '<span class="sui-screen-reader-text">' . sprintf(/* translators: ... */
|
50 |
+
esc_html__( 'Select entry number %s', Forminator::DOMAIN ),
|
51 |
+
esc_html( $db_entry_id )
|
52 |
+
) . '</span>';
|
53 |
+
|
54 |
+
echo '</label>';
|
55 |
+
|
56 |
+
echo esc_html( $db_entry_id );
|
57 |
+
|
58 |
+
echo '</td>';
|
59 |
+
|
60 |
+
else :
|
61 |
+
|
62 |
+
echo '<td>';
|
63 |
+
|
64 |
+
echo esc_html( $summary_item['value'] );
|
65 |
+
|
66 |
+
echo '<span class="sui-accordion-open-indicator fui-mobile-only" aria-hidden="true">';
|
67 |
+
echo '<span class="sui-icon-chevron-down"></span>';
|
68 |
+
echo '</span>';
|
69 |
+
|
70 |
+
echo '</td>';
|
71 |
+
|
72 |
+
endif;
|
73 |
+
?>
|
74 |
+
|
75 |
+
<?php } ?>
|
76 |
+
|
77 |
+
<?php
|
78 |
+
if ( $summary['num_fields_left'] ) {
|
79 |
+
|
80 |
+
echo '<td>';
|
81 |
+
echo '' . sprintf(/* translators: ... */
|
82 |
+
esc_html__( '+ %s other fields', Forminator::DOMAIN ),
|
83 |
+
esc_html( $summary['num_fields_left'] )
|
84 |
+
) . '';
|
85 |
+
echo '<span class="sui-accordion-open-indicator">';
|
86 |
+
echo '<span class="sui-icon-chevron-down"></span>';
|
87 |
+
echo '</span>';
|
88 |
+
echo '</td>';
|
89 |
+
|
90 |
+
}
|
91 |
+
?>
|
92 |
+
|
93 |
+
</tr>
|
94 |
+
|
95 |
+
<tr class="sui-accordion-item-content">
|
96 |
+
|
97 |
+
<td colspan="<?php echo esc_attr( $detail['colspan'] ); ?>">
|
98 |
+
|
99 |
+
<div class="sui-box">
|
100 |
+
|
101 |
+
<div class="sui-box-body fui-entries--knowledge">
|
102 |
+
|
103 |
+
<?php // ROW: Title. ?>
|
104 |
+
<div class="fui-entries-block">
|
105 |
+
|
106 |
+
<h2 class="fui-entries-title"><?php echo '#' . esc_attr( $db_entry_id ); ?></h2>
|
107 |
+
|
108 |
+
<p class="sui-description"><?php echo esc_html( $entry_date ); ?></p>
|
109 |
+
|
110 |
+
</div>
|
111 |
+
|
112 |
+
<?php // ROW: Lead Details. ?>
|
113 |
+
<div class="fui-entries-block">
|
114 |
+
|
115 |
+
<h3 class="fui-entries-subtitle"><?php esc_html_e( 'Lead Details', Forminator::DOMAIN ); ?></h3>
|
116 |
+
|
117 |
+
<?php if ( ! empty( $detail_items ) ) { ?>
|
118 |
+
|
119 |
+
<table class="fui-entries-table" data-design="ghost">
|
120 |
+
|
121 |
+
<tbody>
|
122 |
+
|
123 |
+
<?php foreach ( $detail_items as $detail_item ) { ?>
|
124 |
+
|
125 |
+
<?php $sub_entries = $detail_item['sub_entries']; ?>
|
126 |
+
|
127 |
+
<?php if ( isset( $detail_item['type'] ) && ( 'stripe' === $detail_item['type'] || 'paypal' === $detail_item['type'] ) ) { ?>
|
128 |
+
|
129 |
+
<?php if ( ! empty( $sub_entries ) ) { ?>
|
130 |
+
|
131 |
+
<tr>
|
132 |
+
|
133 |
+
<td><?php echo esc_html( $detail_item['label'] ); ?></td>
|
134 |
+
|
135 |
+
<td>
|
136 |
+
|
137 |
+
<table class="fui-entries-table" data-size="sm">
|
138 |
+
|
139 |
+
<thead>
|
140 |
+
|
141 |
+
<tr>
|
142 |
+
|
143 |
+
<?php
|
144 |
+
$end = count( $sub_entries );
|
145 |
+
foreach ( $sub_entries as $sub_key => $sub_entry ) {
|
146 |
+
|
147 |
+
$sub_key ++;
|
148 |
+
|
149 |
+
if ( $sub_key === $end ) {
|
150 |
+
|
151 |
+
echo '<th colspan="2">' . esc_html( $sub_entry['label'] ) . '</th>';
|
152 |
+
|
153 |
+
} else {
|
154 |
+
|
155 |
+
echo '<th>' . esc_html( $sub_entry['label'] ) . '</th>';
|
156 |
+
|
157 |
+
}
|
158 |
+
}
|
159 |
+
?>
|
160 |
+
|
161 |
+
</tr>
|
162 |
+
|
163 |
+
</thead>
|
164 |
+
|
165 |
+
<tbody>
|
166 |
+
|
167 |
+
<tr>
|
168 |
+
|
169 |
+
<?php
|
170 |
+
$end = count( $sub_entries );
|
171 |
+
foreach ( $sub_entries as $sub_key => $sub_entry ) {
|
172 |
+
|
173 |
+
$sub_key ++;
|
174 |
+
|
175 |
+
if ( $sub_key === $end ) {
|
176 |
+
// No escape for Stripe & PayPal transaction links because we generate it ourselves above
|
177 |
+
echo '<td colspan="2">' . $sub_entry['value'] . '</td>'; //phpcs:ignore -- html output intended
|
178 |
+
|
179 |
+
} else {
|
180 |
+
|
181 |
+
echo '<td>' . esc_html( $sub_entry['value'] ) . '</td>';
|
182 |
+
|
183 |
+
}
|
184 |
+
}
|
185 |
+
?>
|
186 |
+
|
187 |
+
</tr>
|
188 |
+
|
189 |
+
</tbody>
|
190 |
+
|
191 |
+
</table>
|
192 |
+
|
193 |
+
</td>
|
194 |
+
|
195 |
+
</tr>
|
196 |
+
|
197 |
+
<?php } ?>
|
198 |
+
|
199 |
+
<?php } else { ?>
|
200 |
+
|
201 |
+
<tr>
|
202 |
+
|
203 |
+
<td><?php echo esc_html( $detail_item['label'] ); ?></td>
|
204 |
+
|
205 |
+
<td>
|
206 |
+
|
207 |
+
<?php if ( empty( $sub_entries ) ) { ?>
|
208 |
+
|
209 |
+
<?php if ( 'textarea' === $detail_item['type'] && ( isset( $detail_item['rich'] ) && 'true' === $detail_item['rich'] ) ): ?>
|
210 |
+
|
211 |
+
<div class="fui-rich-textarea"><?php echo( $detail_item['value'] );//phpcs:ignore -- html output intended ?></div>
|
212 |
+
|
213 |
+
<?php else: ?>
|
214 |
+
|
215 |
+
<?php echo( $detail_item['value'] );//phpcs:ignore -- html output intended ?>
|
216 |
+
|
217 |
+
<?php endif; ?>
|
218 |
+
|
219 |
+
<?php } else { ?>
|
220 |
+
|
221 |
+
<?php foreach ( $sub_entries as $sub_entry ) { ?>
|
222 |
+
|
223 |
+
<div class="sui-form-field">
|
224 |
+
<span class="sui-settings-label"><?php echo esc_html( $sub_entry['label'] ); ?></span>
|
225 |
+
<span class="sui-description"><?php echo( $sub_entry['value'] );//phpcs:ignore -- html output intended ?></span>
|
226 |
+
</div>
|
227 |
+
|
228 |
+
<?php } ?>
|
229 |
+
|
230 |
+
<?php } ?>
|
231 |
+
|
232 |
+
</td>
|
233 |
+
|
234 |
+
</tr>
|
235 |
+
|
236 |
+
<?php } ?>
|
237 |
+
|
238 |
+
<?php } ?>
|
239 |
+
|
240 |
+
</tbody>
|
241 |
+
|
242 |
+
</table>
|
243 |
+
|
244 |
+
<?php } else { ?>
|
245 |
+
|
246 |
+
<div class="sui-notice">
|
247 |
+
<p><?php esc_html_e( 'Lead details are not available for this submission. Looks like the participant opted to skip the lead generation form while submitting the quiz.', Forminator::DOMAIN ); ?></p>
|
248 |
+
</div>
|
249 |
+
|
250 |
+
<?php } ?>
|
251 |
+
|
252 |
+
</div>
|
253 |
+
|
254 |
+
<?php // ROW: Quiz Results. ?>
|
255 |
+
<div class="fui-entries-block">
|
256 |
+
|
257 |
+
<h3 class="fui-entries-subtitle"><?php esc_html_e( 'Quiz Results', Forminator::DOMAIN ); ?></h3>
|
258 |
+
|
259 |
+
<?php if ( ! empty( $quiz_entry ) ) {
|
260 |
+
|
261 |
+
if ( 'knowledge' === $form_type ) {
|
262 |
+
|
263 |
+
$meta = isset( $quiz_entry['value'] ) ? $quiz_entry['value'] : array();
|
264 |
+
$total = count( $meta );
|
265 |
+
$right = 0;
|
266 |
+
if ( ! empty( $meta ) ) {
|
267 |
+
foreach ( $meta as $answer ) {
|
268 |
+
if ( isset( $answer['isCorrect'] ) && $answer['isCorrect'] ) {
|
269 |
+
$right ++;
|
270 |
+
}
|
271 |
+
}
|
272 |
+
}
|
273 |
+
?>
|
274 |
+
|
275 |
+
<p class="sui-description"><?php echo sprintf( __( 'You got %s/%s correct answers.', Forminator::DOMAIN ), $right, $total ); // phpcs:ignore ?></p>
|
276 |
+
|
277 |
+
<table class="fui-entries-table">
|
278 |
+
|
279 |
+
<thead>
|
280 |
+
|
281 |
+
<tr>
|
282 |
+
<th><?php esc_html_e( 'Question', Forminator::DOMAIN ); ?></th>
|
283 |
+
<th><?php esc_html_e( 'Answer', Forminator::DOMAIN ); ?></th>
|
284 |
+
</tr>
|
285 |
+
|
286 |
+
</thead>
|
287 |
+
|
288 |
+
<tbody>
|
289 |
+
|
290 |
+
<?php foreach ( $meta as $answer ) : ?>
|
291 |
+
|
292 |
+
<?php $user_answer = $answer['answer']; ?>
|
293 |
+
|
294 |
+
<tr>
|
295 |
+
<td><strong><?php echo esc_html( $answer['question'] ); ?></strong></td>
|
296 |
+
<td>
|
297 |
+
<?php if ( $answer['isCorrect'] ) {
|
298 |
+
echo '<span class="sui-tag sui-tag-success">' . esc_html( $user_answer ) . '</span>';
|
299 |
+
} else {
|
300 |
+
echo '<span class="sui-tag sui-tag-error">' . esc_html( $user_answer ) . '</span>';
|
301 |
+
} ?>
|
302 |
+
</td>
|
303 |
+
</tr>
|
304 |
+
|
305 |
+
<?php endforeach; ?>
|
306 |
+
|
307 |
+
</tbody>
|
308 |
+
|
309 |
+
<tfoot aria-hidden="true">
|
310 |
+
|
311 |
+
<tr>
|
312 |
+
|
313 |
+
<td colspan="2">
|
314 |
+
|
315 |
+
<div class="fui-entries-table-legend">
|
316 |
+
|
317 |
+
<p class="correct"><?php esc_html_e( 'Correct', Forminator::DOMAIN ); ?></p>
|
318 |
+
|
319 |
+
<p class="incorrect"><?php esc_html_e( 'Incorrect', Forminator::DOMAIN ); ?></p>
|
320 |
+
|
321 |
+
</div>
|
322 |
+
|
323 |
+
</td>
|
324 |
+
|
325 |
+
</tr>
|
326 |
+
|
327 |
+
</tfoot>
|
328 |
+
|
329 |
+
</table>
|
330 |
+
|
331 |
+
<?php } else { ?>
|
332 |
+
|
333 |
+
<?php $meta = $quiz_entry['value'][0]['value']; ?>
|
334 |
+
|
335 |
+
<?php if ( isset( $meta['answers'] ) && is_array( $meta['answers'] ) ) : ?>
|
336 |
+
|
337 |
+
<table class="fui-entries-table">
|
338 |
+
|
339 |
+
<thead>
|
340 |
+
|
341 |
+
<tr>
|
342 |
+
<th><?php esc_html_e( 'Question', Forminator::DOMAIN ); ?></th>
|
343 |
+
<th><?php esc_html_e( 'Answer', Forminator::DOMAIN ); ?></th>
|
344 |
+
</tr>
|
345 |
+
|
346 |
+
</thead>
|
347 |
+
|
348 |
+
<tbody>
|
349 |
+
|
350 |
+
<?php foreach ( $meta['answers'] as $answer ) : ?>
|
351 |
+
|
352 |
+
<tr>
|
353 |
+
<td><strong><?php echo esc_html( $answer['question'] ); ?></strong></td>
|
354 |
+
<td><?php echo esc_html( $answer['answer'] ); ?></td>
|
355 |
+
</tr>
|
356 |
+
|
357 |
+
<?php endforeach; ?>
|
358 |
+
|
359 |
+
</tbody>
|
360 |
+
|
361 |
+
<tfoot aria-hidden="true">
|
362 |
+
|
363 |
+
<tr>
|
364 |
+
|
365 |
+
<td colspan="2"><?php printf( __( '<strong>Quiz Result:</strong> %s', Forminator::DOMAIN ), $meta['result']['title'] ); // phpcs:ignore ?></td>
|
366 |
+
|
367 |
+
</tr>
|
368 |
+
|
369 |
+
</tfoot>
|
370 |
+
|
371 |
+
</table>
|
372 |
+
|
373 |
+
<?php endif; ?>
|
374 |
+
|
375 |
+
<?php } ?>
|
376 |
+
|
377 |
+
<?php } else { ?>
|
378 |
+
<div class="sui-notice">
|
379 |
+
<p><?php esc_html_e( 'Quiz results are not available for this submission. The participant either couldn\'t finish the quiz or had some errors while submitting the quiz.', Forminator::DOMAIN ); ?></p>
|
380 |
+
</div>
|
381 |
+
<?php } ?>
|
382 |
+
|
383 |
+
</div>
|
384 |
+
|
385 |
+
<?php // ROW: Integrations. ?>
|
386 |
+
<?php if ( ! empty( $integrations ) ) { ?>
|
387 |
+
|
388 |
+
<div class="fui-entries-block">
|
389 |
+
|
390 |
+
<h3 class="fui-entries-subtitle"><?php esc_html_e( 'Active Integrations', Forminator::DOMAIN ); ?></h3>
|
391 |
+
|
392 |
+
<p class="sui-description"><?php esc_html_e( 'Check the status and response of your active 3rd-party applications for this submissions.', Forminator::DOMAIN ); ?></p>
|
393 |
+
|
394 |
+
<div class="sui-accordion">
|
395 |
+
|
396 |
+
<div class="sui-accordion-header">
|
397 |
+
<div><?php esc_html_e( 'Integration Name', Forminator::DOMAIN ); ?></div>
|
398 |
+
<div><?php esc_html_e( 'Data send to integration', Forminator::DOMAIN ); ?></div>
|
399 |
+
<div></div>
|
400 |
+
</div>
|
401 |
+
|
402 |
+
<?php foreach ( $integrations as $integration ) : ?>
|
403 |
+
|
404 |
+
<div class="sui-accordion-item">
|
405 |
+
|
406 |
+
<div class="sui-accordion-item-header">
|
407 |
+
|
408 |
+
<div class="fui-app--wrapper">
|
409 |
+
<img
|
410 |
+
src="<?php echo esc_url( $integration['banner'] ); ?>"
|
411 |
+
srcset="<?php echo esc_url( $integration['banner'] ); ?> 1x, <?php echo esc_url( $integration['banner_x2'] ); ?> 2x"
|
412 |
+
alt="<?php echo esc_attr( $integration['label'] ); ?>"
|
413 |
+
class="sui-image"
|
414 |
+
style="width: 20px; height: 20px;"
|
415 |
+
/>
|
416 |
+
<span style="margin-left: 10px;"><?php echo $integration['title']; // phpcs:ignore -- html output intended ?></span>
|
417 |
+
</div>
|
418 |
+
|
419 |
+
<div>
|
420 |
+
|
421 |
+
<?php
|
422 |
+
$sub_entries = isset( $integration['sub_entries'] ) ? $integration['sub_entries'] : array();
|
423 |
+
|
424 |
+
if ( ! empty( $sub_entries ) && is_array( $sub_entries ) ) :
|
425 |
+
|
426 |
+
$success = isset( $sub_entries[1]['value'] ) ? $sub_entries[1]['value'] : '';
|
427 |
+
?>
|
428 |
+
|
429 |
+
<span class="integration-"<?php echo esc_attr( $success ); ?>><?php echo esc_html( $success ); ?></span>
|
430 |
+
|
431 |
+
<?php else : ?>
|
432 |
+
|
433 |
+
<span><?php echo( $integration['value'] ); // phpcs:ignore -- html output intended ?></span>
|
434 |
+
|
435 |
+
<?php endif; ?>
|
436 |
+
|
437 |
+
</div>
|
438 |
+
|
439 |
+
<div>
|
440 |
+
<span class="sui-button-icon sui-accordion-open-indicator" aria-label="Open item">
|
441 |
+
<i class="sui-icon-chevron-down" aria-hidden="true"></i>
|
442 |
+
</span>
|
443 |
+
</div>
|
444 |
+
|
445 |
+
</div>
|
446 |
+
|
447 |
+
<div class="sui-accordion-item-body">
|
448 |
+
|
449 |
+
<div class="sui-box">
|
450 |
+
|
451 |
+
<div class="sui-box-body">
|
452 |
+
|
453 |
+
<?php if ( ! empty( $sub_entries ) && is_array( $sub_entries ) ) { ?>
|
454 |
+
|
455 |
+
<?php foreach ( $sub_entries as $sub_entry ) { ?>
|
456 |
+
|
457 |
+
<div class="">
|
458 |
+
<span class="sui-settings-label"><?php echo esc_html( $sub_entry['label'] ); ?></span>
|
459 |
+
<span class="sui-description"><?php echo( $sub_entry['value'] ); // phpcs:ignore -- html output intended ?></span>
|
460 |
+
</div>
|
461 |
+
|
462 |
+
<?php } ?>
|
463 |
+
|
464 |
+
<?php } ?>
|
465 |
+
|
466 |
+
</div>
|
467 |
+
|
468 |
+
</div>
|
469 |
+
|
470 |
+
</div>
|
471 |
+
|
472 |
+
</div>
|
473 |
+
|
474 |
+
<?php endforeach; ?>
|
475 |
+
|
476 |
+
</div>
|
477 |
+
|
478 |
+
</div>
|
479 |
+
|
480 |
+
<?php } ?>
|
481 |
+
|
482 |
+
</div>
|
483 |
+
|
484 |
+
<div class="sui-box-footer">
|
485 |
+
|
486 |
+
<button
|
487 |
+
type="button"
|
488 |
+
class="sui-button sui-button-ghost sui-button-red wpmudev-open-modal"
|
489 |
+
<?php if ( isset( $entries['activation_key'] ) ) {
|
490 |
+
$button_title = esc_html__( 'Delete Submission & User', Forminator::DOMAIN );
|
491 |
+
$is_activation_key = true;
|
492 |
+
?>
|
493 |
+
data-activation-key="<?php echo $entries['activation_key']; ?>"
|
494 |
+
data-modal="delete-unconfirmed-user-module"
|
495 |
+
data-entry-id="<?php echo esc_attr( $db_entry_id ); ?>"
|
496 |
+
data-form-id="<?php echo esc_attr( $this->model->id ); ?>"
|
497 |
+
<?php } else {
|
498 |
+
$button_title = esc_html__( 'Delete', Forminator::DOMAIN );
|
499 |
+
$is_activation_key = false;
|
500 |
+
?>
|
501 |
+
data-modal="delete-module"
|
502 |
+
data-form-id="<?php echo esc_attr( $db_entry_id ); ?>"
|
503 |
+
<?php } ?>
|
504 |
+
data-modal-title="<?php esc_attr_e( 'Delete Submission', Forminator::DOMAIN ); ?>"
|
505 |
+
data-modal-content="<?php esc_attr_e( 'Are you sure you wish to permanently delete this submission?', Forminator::DOMAIN ); ?>"
|
506 |
+
data-nonce="<?php echo esc_attr( wp_create_nonce( 'forminatorQuizEntries' ) ); ?>"
|
507 |
+
>
|
508 |
+
<i class="sui-icon-trash" aria-hidden="true"></i> <?php echo $button_title; ?>
|
509 |
+
</button>
|
510 |
+
|
511 |
+
<?php if ( isset( $entries['activation_method'] ) && 'manual' === $entries['activation_method'] && $is_activation_key ) { ?>
|
512 |
+
|
513 |
+
<div class="sui-actions-right">
|
514 |
+
<button
|
515 |
+
type="button"
|
516 |
+
class="sui-button wpmudev-open-modal"
|
517 |
+
data-modal="approve-user-module"
|
518 |
+
data-modal-title="<?php esc_attr_e( 'Approve User', Forminator::DOMAIN ); ?>"
|
519 |
+
data-modal-content="<?php esc_attr_e( 'Are you sure you want to approve and activate this user?', Forminator::DOMAIN ); ?>"
|
520 |
+
data-form-id="<?php echo esc_attr( $db_entry_id ); ?>"
|
521 |
+
data-activation-key="<?php echo esc_attr( $entries['activation_key'] ); ?>"
|
522 |
+
data-nonce="<?php echo wp_create_nonce( 'forminatorCustomFormEntries' ); // WPCS: XSS ok. ?>"
|
523 |
+
>
|
524 |
+
<?php esc_html_e( 'Approve User', Forminator::DOMAIN ); ?>
|
525 |
+
</button>
|
526 |
+
</div>
|
527 |
+
|
528 |
+
<?php } ?>
|
529 |
+
|
530 |
+
</div>
|
531 |
+
|
532 |
+
</div>
|
533 |
+
|
534 |
+
</td>
|
535 |
+
|
536 |
+
</tr>
|
537 |
+
|
538 |
+
<?php } ?>
|
admin/views/quiz/entries/content.php
CHANGED
@@ -1,11 +1,10 @@
|
|
1 |
<?php
|
2 |
/** @var Forminator_Quizz_Renderer_Entries $this */
|
3 |
-
$plugin_path
|
4 |
-
$
|
5 |
-
$
|
6 |
-
$
|
7 |
-
$
|
8 |
-
$total_page = ceil( $count / $entries_per_page );
|
9 |
?>
|
10 |
<?php if ( $this->error_message() ) : ?>
|
11 |
<span class="sui-notice sui-notice-error"><p><?php echo esc_html( $this->error_message() ); ?></p></span>
|
@@ -13,327 +12,204 @@ $total_page = ceil( $count / $entries_per_page );
|
|
13 |
|
14 |
<?php if ( $count > 0 ) : ?>
|
15 |
|
16 |
-
<form method="
|
17 |
|
18 |
-
|
19 |
|
20 |
-
|
21 |
|
22 |
-
<?php $this->
|
23 |
|
24 |
-
|
25 |
|
26 |
-
|
27 |
|
28 |
-
|
|
|
|
|
29 |
|
30 |
-
|
31 |
|
32 |
-
|
33 |
|
34 |
-
|
|
|
|
|
35 |
|
36 |
-
|
37 |
|
38 |
-
|
39 |
-
<?php
|
40 |
-
if ( 1 === $count ) {
|
41 |
-
/* translators: ... */
|
42 |
-
printf( esc_html__( '%s result', Forminator::DOMAIN ), esc_html( $count ) );
|
43 |
-
} else {
|
44 |
-
/* translators: ... */
|
45 |
-
printf( esc_html__( '%s results', Forminator::DOMAIN ), esc_html( $count ) );
|
46 |
-
}
|
47 |
-
?>
|
48 |
-
</span>
|
49 |
|
50 |
-
|
51 |
|
52 |
-
|
53 |
|
54 |
-
|
55 |
|
56 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
57 |
|
58 |
-
|
59 |
-
|
60 |
-
<table class="sui-table sui-table-flushed sui-accordion">
|
61 |
-
|
62 |
-
<thead>
|
63 |
-
<tr>
|
64 |
-
<th>
|
65 |
-
<label class="sui-checkbox">
|
66 |
-
<input id="wpf-cform-check_all" type="checkbox">
|
67 |
-
<span></span>
|
68 |
-
<div class="sui-description"><?php esc_html_e( 'ID', Forminator::DOMAIN ); ?></div>
|
69 |
-
</label>
|
70 |
-
</th>
|
71 |
-
<th colspan="5"><?php esc_html_e( 'Date Submitted', Forminator::DOMAIN ); ?></th>
|
72 |
-
</tr>
|
73 |
-
|
74 |
-
</thead>
|
75 |
-
|
76 |
-
<tbody>
|
77 |
-
|
78 |
-
<?php
|
79 |
-
$first_item = $count;
|
80 |
-
$page_number = $this->get_paged();
|
81 |
-
|
82 |
-
if ( $page_number > 1 ) {
|
83 |
-
$first_item = $count - ( ( $page_number - 1 ) * $entries_per_page );
|
84 |
-
}
|
85 |
-
?>
|
86 |
-
|
87 |
-
<?php foreach ( $entries as $entry ) : ?>
|
88 |
-
<tr class="sui-accordion-item">
|
89 |
-
|
90 |
-
<td>
|
91 |
-
<label class="sui-checkbox">
|
92 |
-
<input name="ids[]" value="<?php echo esc_attr( $entry->entry_id ); ?>" type="checkbox" id="quiz-answer-<?php echo esc_attr( $entry->entry_id ); ?>">
|
93 |
-
<span></span>
|
94 |
-
<div class="sui-description"><?php echo esc_attr( $first_item ); ?></div>
|
95 |
-
</label>
|
96 |
-
</td>
|
97 |
-
|
98 |
-
<td colspan="5">
|
99 |
-
<?php echo date( get_option( 'date_format' ) . ' ' . get_option( 'time_format' ), strtotime( $entry->date_created_sql ) ); // phpcs:ignore ?>
|
100 |
-
<span class="sui-accordion-open-indicator">
|
101 |
-
<i class="sui-icon-chevron-down"></i>
|
102 |
-
</span>
|
103 |
-
</td>
|
104 |
-
|
105 |
-
</tr>
|
106 |
-
|
107 |
-
<tr class="sui-accordion-item-content">
|
108 |
-
|
109 |
-
<td colspan="6">
|
110 |
-
|
111 |
-
<div class="sui-box" style="margin-bottom: 30px;">
|
112 |
-
|
113 |
-
<div class="sui-box-body">
|
114 |
-
|
115 |
-
<h2>
|
116 |
-
<?php echo forminator_get_form_name( $this->form_id, 'quiz' ); // phpcs:ignore ?>
|
117 |
-
</h2>
|
118 |
-
|
119 |
-
<?php if ( 'knowledge' === $form_type ) { ?>
|
120 |
-
|
121 |
-
<?php
|
122 |
-
$meta = $entry->meta_data['entry']['value'];
|
123 |
-
$total = 0;
|
124 |
-
$right = 0;
|
125 |
-
?>
|
126 |
-
|
127 |
-
<table class="sui-table">
|
128 |
-
|
129 |
-
<thead>
|
130 |
-
|
131 |
-
<tr>
|
132 |
-
|
133 |
-
<th><?php esc_html_e( 'Question', Forminator::DOMAIN ); ?></th>
|
134 |
-
|
135 |
-
<th><?php esc_html_e( 'Answer', Forminator::DOMAIN ); ?></th>
|
136 |
-
|
137 |
-
</tr>
|
138 |
-
|
139 |
-
</thead>
|
140 |
-
|
141 |
-
<tbody>
|
142 |
-
|
143 |
-
<?php foreach ( $meta as $answer ) : ?>
|
144 |
-
<?php
|
145 |
-
$total ++;
|
146 |
-
|
147 |
-
if ( $answer['isCorrect'] ) {
|
148 |
-
$right ++;
|
149 |
-
}
|
150 |
-
|
151 |
-
$user_answer = $answer['answer'];
|
152 |
-
?>
|
153 |
-
|
154 |
-
<tr>
|
155 |
-
|
156 |
-
<td><?php echo esc_html( $answer['question'] ); ?></td>
|
157 |
-
|
158 |
-
<td>
|
159 |
-
<?php
|
160 |
-
if ( $answer['isCorrect'] ) {
|
161 |
-
|
162 |
-
echo '<span class="sui-tag sui-tag-success">' . esc_html( $user_answer ) . '</span>';
|
163 |
-
|
164 |
-
} else {
|
165 |
-
|
166 |
-
echo '<span class="sui-tag sui-tag-error">' . esc_html( $user_answer ) . '</span>';
|
167 |
-
|
168 |
-
}
|
169 |
-
?>
|
170 |
-
</td>
|
171 |
|
172 |
-
|
|
|
|
|
173 |
|
174 |
-
|
175 |
|
176 |
-
|
177 |
-
<?php if ( ! empty( $integrations_data ) ) : ?>
|
178 |
-
<?php foreach ( $integrations_data as $integrations_datum ) : ?>
|
179 |
-
<tr>
|
180 |
-
<td><?php echo $integrations_datum['label']; // phpcs:ignore -- html output intended ?></td>
|
181 |
-
<td>
|
182 |
-
<?php
|
183 |
-
$sub_entries = isset( $integrations_datum['sub_entries'] ) ? $integrations_datum['sub_entries'] : array();
|
184 |
-
?>
|
185 |
-
<?php if ( ! empty( $sub_entries ) && is_array( $sub_entries ) ) : ?>
|
186 |
-
<?php foreach ( $sub_entries as $sub_entry ) : ?>
|
187 |
-
<div class="">
|
188 |
-
<span class="sui-settings-label"><?php echo esc_html( $sub_entry['label'] ); ?></span>
|
189 |
-
<span class="sui-description"><?php echo( $sub_entry['value'] ); // phpcs:ignore -- html output intended ?></span>
|
190 |
-
</div>
|
191 |
-
<?php endforeach; ?>
|
192 |
-
<?php else : ?>
|
193 |
-
<?php echo( $integrations_datum['value'] ); // phpcs:ignore -- html output intended ?>
|
194 |
-
<?php endif; ?>
|
195 |
-
</td>
|
196 |
-
</tr>
|
197 |
-
<?php endforeach; ?>
|
198 |
-
<?php endif; ?>
|
199 |
|
200 |
-
|
201 |
|
202 |
-
|
203 |
|
204 |
-
|
205 |
|
206 |
-
|
207 |
-
</div>
|
208 |
|
209 |
-
|
210 |
-
} else {
|
211 |
|
212 |
-
|
213 |
-
?>
|
214 |
|
215 |
-
|
216 |
|
217 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
218 |
|
219 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
220 |
|
221 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
222 |
|
223 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
224 |
|
225 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
226 |
|
227 |
-
|
228 |
|
229 |
-
|
230 |
|
231 |
-
|
|
|
|
|
232 |
|
233 |
-
|
234 |
-
|
235 |
-
|
236 |
-
|
237 |
-
|
238 |
-
|
239 |
-
|
240 |
-
|
241 |
-
|
242 |
-
|
243 |
-
|
244 |
-
|
245 |
-
|
246 |
-
|
247 |
-
|
248 |
-
|
249 |
-
|
250 |
-
|
251 |
-
|
252 |
-
|
253 |
-
|
254 |
-
|
255 |
-
|
256 |
-
|
257 |
-
|
258 |
-
|
259 |
-
|
260 |
-
|
261 |
-
|
262 |
-
|
263 |
-
|
264 |
-
|
265 |
-
|
266 |
-
|
267 |
-
|
268 |
-
|
269 |
-
|
270 |
-
|
271 |
-
|
272 |
-
|
273 |
-
|
274 |
-
|
275 |
-
|
276 |
-
|
277 |
-
|
278 |
-
<p><?php printf( __( '<strong>Quiz Result:</strong> %s', Forminator::DOMAIN ), $meta['result']['title'] ); // phpcs:ignore ?></p>
|
279 |
-
|
280 |
-
</div>
|
281 |
-
|
282 |
-
<?php } ?>
|
283 |
-
|
284 |
-
</div>
|
285 |
-
|
286 |
-
</div>
|
287 |
-
|
288 |
-
</td>
|
289 |
-
|
290 |
-
</tr>
|
291 |
-
|
292 |
-
<?php
|
293 |
-
$first_item --;
|
294 |
-
|
295 |
-
endforeach;
|
296 |
-
?>
|
297 |
-
|
298 |
-
</tbody>
|
299 |
-
|
300 |
-
</table>
|
301 |
-
|
302 |
-
<div class="sui-box-body">
|
303 |
-
|
304 |
-
<div class="sui-box-search">
|
305 |
-
|
306 |
-
<div class="sui-search-left">
|
307 |
-
|
308 |
-
<?php $this->bulk_actions( 'bottom' ); ?>
|
309 |
-
|
310 |
-
</div>
|
311 |
-
|
312 |
-
<div class="sui-search-right">
|
313 |
-
|
314 |
-
<div class="sui-pagination-wrap">
|
315 |
-
|
316 |
-
<span class="sui-pagination-results">
|
317 |
-
<?php
|
318 |
-
if ( 1 === $count ) {
|
319 |
-
/* translators: ... */
|
320 |
-
printf( esc_html__( '%s result', Forminator::DOMAIN ), esc_html( $count ) );
|
321 |
-
} else {
|
322 |
-
/* translators: ... */
|
323 |
-
printf( esc_html__( '%s results', Forminator::DOMAIN ), esc_html( $count ) );
|
324 |
-
}
|
325 |
-
?>
|
326 |
-
</span>
|
327 |
-
|
328 |
-
<?php $this->paginate(); ?>
|
329 |
-
|
330 |
-
</div>
|
331 |
-
|
332 |
-
</div>
|
333 |
-
|
334 |
-
</div>
|
335 |
-
|
336 |
-
</div>
|
337 |
|
338 |
</form>
|
339 |
|
@@ -354,7 +230,7 @@ $total_page = ceil( $count / $entries_per_page );
|
|
354 |
|
355 |
<h2><?php echo forminator_get_form_name( $this->form_id, 'quiz' ); // phpcs:ignore ?></h2>
|
356 |
|
357 |
-
<p><?php esc_html_e( 'You haven
|
358 |
|
359 |
</div>
|
360 |
|
1 |
<?php
|
2 |
/** @var Forminator_Quizz_Renderer_Entries $this */
|
3 |
+
$plugin_path = forminator_plugin_url();
|
4 |
+
$count = $this->filtered_total_entries();
|
5 |
+
$entries_per_page = $this->get_per_page();
|
6 |
+
$is_filter_enabled = $this->is_filter_box_enabled();
|
7 |
+
$total_page = ceil( $count / $entries_per_page );
|
|
|
8 |
?>
|
9 |
<?php if ( $this->error_message() ) : ?>
|
10 |
<span class="sui-notice sui-notice-error"><p><?php echo esc_html( $this->error_message() ); ?></p></span>
|
12 |
|
13 |
<?php if ( $count > 0 ) : ?>
|
14 |
|
15 |
+
<form method="get" class="sui-box fui-box-entries forminator-entries-actions">
|
16 |
|
17 |
+
<div class="fui-pagination-entries sui-pagination-wrap">
|
18 |
|
19 |
+
<span class="sui-pagination-results"><?php if ( 1 === $count ) { printf( esc_html__( '%s result', Forminator::DOMAIN ), $count ); } else { printf( esc_html__( '%s results', Forminator::DOMAIN ), $count ); } // phpcs:ignore ?></span>
|
20 |
|
21 |
+
<?php $this->paginate(); ?>
|
22 |
|
23 |
+
</div>
|
24 |
|
25 |
+
<div class="sui-box fui-box-entries">
|
26 |
|
27 |
+
<fieldset class="forminator-entries-nonce">
|
28 |
+
<?php wp_nonce_field( 'forminatorQuizEntries', 'forminatorEntryNonce' ); ?>
|
29 |
+
</fieldset>
|
30 |
|
31 |
+
<div class="sui-box-body fui-box-actions">
|
32 |
|
33 |
+
<?php $this->template( 'quiz/entries/prompt' ); ?>
|
34 |
|
35 |
+
<input type="hidden" name="page" value="<?php echo esc_attr( $this->get_admin_page() ); ?>">
|
36 |
+
<input type="hidden" name="form_type" value="<?php echo esc_attr( $this->forminator_get_form_type() ); ?>">
|
37 |
+
<input type="hidden" name="form_id" value="<?php echo esc_attr( $this->form_id ); ?>"/>
|
38 |
|
39 |
+
<div class="sui-box-search">
|
40 |
|
41 |
+
<div class="sui-search-left">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
42 |
|
43 |
+
<?php $this->bulk_actions(); ?>
|
44 |
|
45 |
+
</div>
|
46 |
|
47 |
+
<div class="sui-search-right">
|
48 |
|
49 |
+
<div class="sui-pagination-wrap">
|
50 |
+
|
51 |
+
<span class="sui-pagination-results">
|
52 |
+
<?php
|
53 |
+
if ( 1 === $count ) {
|
54 |
+
/* translators: ... */
|
55 |
+
printf( esc_html__( '%s result', Forminator::DOMAIN ), esc_html( $count ) );
|
56 |
+
} else {
|
57 |
+
/* translators: ... */
|
58 |
+
printf( esc_html__( '%s results', Forminator::DOMAIN ), esc_html( $count ) );
|
59 |
+
}
|
60 |
+
?>
|
61 |
+
</span>
|
62 |
|
63 |
+
<?php $this->paginate(); ?>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
64 |
|
65 |
+
<button class="sui-button-icon sui-button-outlined forminator-toggle-entries-filter <?php echo( $is_filter_enabled ? 'sui-active' : '' ); ?>">
|
66 |
+
<i class="sui-icon-filter" aria-hidden="true"></i>
|
67 |
+
</button>
|
68 |
|
69 |
+
</div>
|
70 |
|
71 |
+
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
72 |
|
73 |
+
</div>
|
74 |
|
75 |
+
<?php $this->template( 'quiz/entries/filter' ); ?>
|
76 |
|
77 |
+
</div>
|
78 |
|
79 |
+
<?php if ( isset( $is_filter_enabled ) && true === $is_filter_enabled ) : ?>
|
|
|
80 |
|
81 |
+
<div class="sui-box-body fui-box-actions-filters">
|
|
|
82 |
|
83 |
+
<label class="sui-label"><?php esc_html_e( 'Active Filters', Forminator::DOMAIN ); ?></label>
|
|
|
84 |
|
85 |
+
<div class="sui-pagination-active-filters forminator-entries-fields-filters">
|
86 |
|
87 |
+
<?php if ( isset( $this->filters['search'] ) ) : ?>
|
88 |
+
<div class="sui-active-filter">
|
89 |
+
<?php
|
90 |
+
printf(/* translators: ... */
|
91 |
+
esc_html__( 'Keyword: %s', Forminator::DOMAIN ),
|
92 |
+
esc_html( $this->filters['search'] )
|
93 |
+
);
|
94 |
+
?>
|
95 |
+
<button class="sui-active-filter-remove" type="submit" name="search" value="">
|
96 |
+
<span class="sui-screen-reader-text"><?php esc_html_e( 'Remove this keyword', Forminator::DOMAIN ); ?></span>
|
97 |
+
</button>
|
98 |
+
</div>
|
99 |
+
<?php endif; ?>
|
100 |
|
101 |
+
<?php if ( isset( $this->filters['min_id'] ) ) : ?>
|
102 |
+
<div class="sui-active-filter">
|
103 |
+
<?php
|
104 |
+
printf(/* translators: ... */
|
105 |
+
esc_html__( 'From ID: %s', Forminator::DOMAIN ),
|
106 |
+
esc_html( $this->filters['min_id'] )
|
107 |
+
);
|
108 |
+
?>
|
109 |
+
<button class="sui-active-filter-remove" type="submit" name="min_id" value="">
|
110 |
+
<span class="sui-screen-reader-text"><?php esc_html_e( 'Remove this keyword', Forminator::DOMAIN ); ?></span>
|
111 |
+
</button>
|
112 |
+
</div>
|
113 |
+
<?php endif; ?>
|
114 |
|
115 |
+
<?php if ( isset( $this->filters['max_id'] ) ) : ?>
|
116 |
+
<div class="sui-active-filter">
|
117 |
+
<?php
|
118 |
+
printf(/* translators: ... */
|
119 |
+
esc_html__( 'To ID: %s', Forminator::DOMAIN ),
|
120 |
+
esc_html( $this->filters['max_id'] )
|
121 |
+
);
|
122 |
+
?>
|
123 |
+
<button class="sui-active-filter-remove" type="submit" name="max_id" value="">
|
124 |
+
<span class="sui-screen-reader-text"><?php esc_html_e( 'Remove this keyword', Forminator::DOMAIN ); ?></span>
|
125 |
+
</button>
|
126 |
+
</div>
|
127 |
+
<?php endif; ?>
|
128 |
|
129 |
+
<?php if ( isset( $this->filters['date_created'][0] ) || isset( $this->filters['date_created'][1] ) ) : ?>
|
130 |
+
<div class="sui-active-filter">
|
131 |
+
<?php
|
132 |
+
printf(/* translators: ... */
|
133 |
+
esc_html__( 'Submission Date Range: %1$s to %2$s', Forminator::DOMAIN ),
|
134 |
+
esc_html( $this->filters['date_created'][0] ),
|
135 |
+
esc_html( $this->filters['date_created'][1] )
|
136 |
+
);
|
137 |
+
?>
|
138 |
+
<button class="sui-active-filter-remove" type="submit" name="date_range" value="">
|
139 |
+
<span class="sui-screen-reader-text"><?php esc_html_e( 'Remove this keyword', Forminator::DOMAIN ); ?></span>
|
140 |
+
</button>
|
141 |
+
</div>
|
142 |
+
<?php endif; ?>
|
143 |
|
144 |
+
<div class="sui-active-filter">
|
145 |
+
<?php
|
146 |
+
esc_html_e( 'Sort Order', Forminator::DOMAIN );
|
147 |
+
echo ': ';
|
148 |
+
if ( 'DESC' === $this->order['order'] ) {
|
149 |
+
esc_html_e( 'Descending', Forminator::DOMAIN );
|
150 |
+
} else {
|
151 |
+
esc_html_e( 'Ascending', Forminator::DOMAIN );
|
152 |
+
}
|
153 |
+
?>
|
154 |
+
</div>
|
155 |
+
|
156 |
+
</div>
|
157 |
+
|
158 |
+
</div>
|
159 |
|
160 |
+
<?php endif; ?>
|
161 |
|
162 |
+
<table class="sui-table sui-table-flushed sui-accordion fui-table-entries">
|
163 |
|
164 |
+
<?php $this->entries_header(); ?>
|
165 |
+
|
166 |
+
<tbody>
|
167 |
|
168 |
+
<?php if ( $this->has_leads() ) {
|
169 |
+
$this->template( 'quiz/entries/content-leads' );
|
170 |
+
} else {
|
171 |
+
$this->template( 'quiz/entries/content-leads-none' );
|
172 |
+
} ?>
|
173 |
+
</tbody>
|
174 |
+
|
175 |
+
</table>
|
176 |
+
|
177 |
+
<div class="sui-box-body">
|
178 |
+
|
179 |
+
<div class="sui-box-search">
|
180 |
+
|
181 |
+
<div class="sui-search-left">
|
182 |
+
|
183 |
+
<?php $this->bulk_actions( 'bottom' ); ?>
|
184 |
+
|
185 |
+
</div>
|
186 |
+
|
187 |
+
<div class="sui-search-right">
|
188 |
+
|
189 |
+
<div class="sui-pagination-wrap">
|
190 |
+
|
191 |
+
<span class="sui-pagination-results">
|
192 |
+
<?php
|
193 |
+
if ( 1 === $count ) {
|
194 |
+
/* translators: ... */
|
195 |
+
printf( esc_html__( '%s result', Forminator::DOMAIN ), esc_html( $count ) );
|
196 |
+
} else {
|
197 |
+
/* translators: ... */
|
198 |
+
printf( esc_html__( '%s results', Forminator::DOMAIN ), esc_html( $count ) );
|
199 |
+
}
|
200 |
+
?>
|
201 |
+
</span>
|
202 |
+
|
203 |
+
<?php $this->paginate(); ?>
|
204 |
+
|
205 |
+
</div>
|
206 |
+
|
207 |
+
</div>
|
208 |
+
|
209 |
+
</div>
|
210 |
+
|
211 |
+
</div>
|
212 |
+
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
213 |
|
214 |
</form>
|
215 |
|
230 |
|
231 |
<h2><?php echo forminator_get_form_name( $this->form_id, 'quiz' ); // phpcs:ignore ?></h2>
|
232 |
|
233 |
+
<p><?php esc_html_e( 'You haven\'t received any submissions for this quiz yet. When you do, you\'ll be able to view all the data here.', Forminator::DOMAIN ); ?></p>
|
234 |
|
235 |
</div>
|
236 |
|
admin/views/quiz/entries/filter.php
ADDED
@@ -0,0 +1,206 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* JS reference : assets/js/admin/layout.js
|
4 |
+
*/
|
5 |
+
|
6 |
+
/** @var $this Forminator_CForm_View_Page */
|
7 |
+
$is_filter_enabled = $this->is_filter_box_enabled();
|
8 |
+
$date_range = '';
|
9 |
+
$date_created = isset( $this->filters['date_created'] ) ? $this->filters['date_created'] : '';
|
10 |
+
if ( is_array( $date_created ) && isset( $date_created[0] ) && isset( $date_created[1] ) ) {
|
11 |
+
$date_created[0] = date( 'm/d/Y', strtotime( $date_created[0] ) );// phpcs:ignore
|
12 |
+
$date_created[1] = date( 'm/d/Y', strtotime( $date_created[1] ) );// phpcs:ignore
|
13 |
+
$date_range = implode( ' - ', $date_created );
|
14 |
+
}
|
15 |
+
$search_filter = isset( $this->filters['search'] ) ? $this->filters['search'] : '';
|
16 |
+
$min_id = isset( $this->filters['min_id'] ) ? $this->filters['min_id'] : '';
|
17 |
+
$max_id = isset( $this->filters['max_id'] ) ? $this->filters['max_id'] : '';
|
18 |
+
$order_by = isset( $this->order['order_by'] ) ? $this->order['order_by'] : '';
|
19 |
+
$order_filter = isset( $this->order['order'] ) ? $this->order['order'] : '';
|
20 |
+
?>
|
21 |
+
<div class="sui-pagination-filter <?php echo( $is_filter_enabled ? 'sui-open' : '' ); ?>">
|
22 |
+
|
23 |
+
<div class="sui-row">
|
24 |
+
|
25 |
+
<div class="sui-col-md-6">
|
26 |
+
|
27 |
+
<div class="sui-form-field">
|
28 |
+
|
29 |
+
<label for="forminator-forms-filter--by-date" class="sui-label"><?php esc_html_e( 'Submission Date Range', Forminator::DOMAIN ); ?></label>
|
30 |
+
|
31 |
+
<div class="sui-date">
|
32 |
+
<i class="sui-icon-calendar" aria-hidden="true"></i>
|
33 |
+
<input type="text"
|
34 |
+
placeholder="<?php esc_html_e( 'Pick a date range', Forminator::DOMAIN ); ?>"
|
35 |
+
id="forminator-forms-filter--by-date"
|
36 |
+
name="date_range"
|
37 |
+
autocomplete="off"
|
38 |
+
value="<?php echo esc_attr( $date_range ); ?>"
|
39 |
+
class="sui-form-control forminator-entries-filter-date"/>
|
40 |
+
</div>
|
41 |
+
|
42 |
+
</div>
|
43 |
+
|
44 |
+
</div>
|
45 |
+
|
46 |
+
<div class="sui-col-md-3">
|
47 |
+
|
48 |
+
<label for="forminator-forms-filter--from-id" class="sui-label"><?php esc_html_e( 'From ID', Forminator::DOMAIN ); ?></label>
|
49 |
+
<input type="number"
|
50 |
+
name="min_id"
|
51 |
+
min="0"
|
52 |
+
value="<?php echo esc_attr( $min_id ); ?>"
|
53 |
+
placeholder="<?php esc_html_e( 'E.g. 100', Forminator::DOMAIN ); ?>"
|
54 |
+
id="forminator-forms-filter--from-id"
|
55 |
+
class="sui-form-control"/>
|
56 |
+
|
57 |
+
</div>
|
58 |
+
|
59 |
+
<div class="sui-col-md-3">
|
60 |
+
|
61 |
+
<label for="forminator-forms-filter--to-id" class="sui-label"><?php esc_html_e( 'To ID', Forminator::DOMAIN ); ?></label>
|
62 |
+
<input type="number"
|
63 |
+
name="max_id"
|
64 |
+
min="0"
|
65 |
+
value="<?php echo esc_attr( $max_id ); ?>"
|
66 |
+
placeholder="<?php esc_html_e( 'E.g. 100', Forminator::DOMAIN ); ?>"
|
67 |
+
id="forminator-forms-filte--to-id"
|
68 |
+
class="sui-form-control"/>
|
69 |
+
|
70 |
+
</div>
|
71 |
+
|
72 |
+
</div>
|
73 |
+
|
74 |
+
<div class="sui-row">
|
75 |
+
|
76 |
+
<div class="sui-col-md-6">
|
77 |
+
|
78 |
+
<div class="sui-form-field">
|
79 |
+
|
80 |
+
<label for="forminator-forms-filter--by-keyword" class="sui-label"><?php esc_html_e( 'Keyword', Forminator::DOMAIN ); ?></label>
|
81 |
+
|
82 |
+
<div class="sui-control-with-icon">
|
83 |
+
<i class="sui-icon-magnifying-glass-search" aria-hidden="true"></i>
|
84 |
+
<input type="text"
|
85 |
+
name="search"
|
86 |
+
value="<?php echo esc_attr( $search_filter ); ?>"
|
87 |
+
placeholder="<?php esc_html_e( 'E.g. search', Forminator::DOMAIN ); ?>"
|
88 |
+
id="forminator-forms-filter--by-keyword"
|
89 |
+
class="sui-form-control"/>
|
90 |
+
</div>
|
91 |
+
|
92 |
+
</div>
|
93 |
+
|
94 |
+
</div>
|
95 |
+
|
96 |
+
<div class="sui-col-md-3">
|
97 |
+
|
98 |
+
<label for="forminator-forms-filter--sort-by" class="sui-label"><?php esc_html_e( 'Sort by', Forminator::DOMAIN ); ?></label>
|
99 |
+
<select id="forminator-forms-filter--sort-by" name="order_by">
|
100 |
+
<!-- <option value="">--><?php //esc_html_e( 'ID', Forminator::DOMAIN ); ?><!--</option>-->
|
101 |
+
<option value="entries.date_created" <?php selected( 'entries.date_created', $order_by ); ?> ><?php esc_html_e( 'Submissions Date', Forminator::DOMAIN ); ?></option>
|
102 |
+
</select>
|
103 |
+
|
104 |
+
</div>
|
105 |
+
|
106 |
+
<div class="sui-col-md-3">
|
107 |
+
|
108 |
+
<label for="forminator-forms-filter--sort-order" class="sui-label"><?php esc_html_e( 'Sort Order', Forminator::DOMAIN ); ?></label>
|
109 |
+
<select id="forminator-forms-filter--sort-order" name="order">
|
110 |
+
<option value="DESC" <?php selected( 'DESC', $order_filter ); ?>><?php esc_html_e( 'Descending', Forminator::DOMAIN ); ?></option>
|
111 |
+
<option value="ASC" <?php selected( 'ASC', $order_filter ); ?>><?php esc_html_e( 'Ascending', Forminator::DOMAIN ); ?></option>
|
112 |
+
</select>
|
113 |
+
|
114 |
+
</div>
|
115 |
+
|
116 |
+
</div>
|
117 |
+
|
118 |
+
<div class="sui-form-field">
|
119 |
+
|
120 |
+
<label class="sui-label"><?php esc_html_e( 'Display Fields', Forminator::DOMAIN ); ?></label>
|
121 |
+
|
122 |
+
<div class="sui-side-tabs forminator-field-select-tab">
|
123 |
+
|
124 |
+
<div class="sui-tabs-menu">
|
125 |
+
|
126 |
+
<label for="forminator-forms-filter--display-false" class="sui-tab-item <?php echo ( $this->fields_is_filtered ? '' : 'active' ); ?>" data-tab-index="1">
|
127 |
+
<input type="radio"
|
128 |
+
name="fields_select"
|
129 |
+
id="forminator-forms-filter--display-false"
|
130 |
+
value="false"/>
|
131 |
+
<?php esc_html_e( 'All', Forminator::DOMAIN ); ?>
|
132 |
+
</label>
|
133 |
+
|
134 |
+
<label for="forminator-forms-filter--display-true" class="sui-tab-item <?php echo ( $this->fields_is_filtered ? 'active' : '' ); ?>" data-tab-index="2">
|
135 |
+
<input type="radio"
|
136 |
+
name="fields_select"
|
137 |
+
id="forminator-forms-filter--display-true"
|
138 |
+
value="true"/>
|
139 |
+
<?php esc_html_e( 'Specified Fields', Forminator::DOMAIN ); ?>
|
140 |
+
</label>
|
141 |
+
|
142 |
+
</div>
|
143 |
+
|
144 |
+
<div class="sui-tabs-content">
|
145 |
+
|
146 |
+
<div class="sui-tab-content <?php echo ( $this->fields_is_filtered ? '' : 'active' ); ?>" data-tab-index="1">
|
147 |
+
</div>
|
148 |
+
<div class="sui-tab-content sui-tab-boxed <?php echo ( $this->fields_is_filtered ? 'active' : '' ); ?>" data-tab-index="2">
|
149 |
+
|
150 |
+
<fieldset class="forminator-entries-fields-filter" <?php echo ( $this->fields_is_filtered ? '' : 'disabled=disabled' ); ?>>
|
151 |
+
<?php
|
152 |
+
$ignored_field_types = Forminator_Form_Entry_Model::ignored_fields();
|
153 |
+
$fields = apply_filters( 'forminator_custom_form_filter_fields', $this->get_lead_fields() );
|
154 |
+
|
155 |
+
foreach ( $fields as $field ) {
|
156 |
+
|
157 |
+
$label = $field->__get( 'field_label' );
|
158 |
+
$field_type = $field->__get( 'type' );
|
159 |
+
|
160 |
+
if ( in_array( $field_type, $ignored_field_types, true ) ) {
|
161 |
+
continue;
|
162 |
+
}
|
163 |
+
|
164 |
+
if ( ! $label ) {
|
165 |
+
$label = $field->title;
|
166 |
+
}
|
167 |
+
|
168 |
+
if ( empty( $label ) ) {
|
169 |
+
$label = ucfirst( $field_type );
|
170 |
+
}
|
171 |
+
|
172 |
+
$slug = isset( $field->slug ) ? $field->slug : sanitize_title( $label );
|
173 |
+
?>
|
174 |
+
|
175 |
+
<label class="sui-checkbox" for="<?php echo esc_attr( $slug ); ?>-enable">
|
176 |
+
<input type="checkbox"
|
177 |
+
name="field[]"
|
178 |
+
value="<?php echo esc_attr( $slug ); ?>"
|
179 |
+
id="<?php echo esc_attr( $slug ); ?>-enable"
|
180 |
+
<?php $this->checked_field( $slug ); ?> />
|
181 |
+
<span aria-hidden="true"></span>
|
182 |
+
<span class="sui-description"><?php echo esc_html( $label ); ?></span>
|
183 |
+
</label>
|
184 |
+
|
185 |
+
<?php } ?>
|
186 |
+
</fieldset>
|
187 |
+
|
188 |
+
</div>
|
189 |
+
|
190 |
+
</div>
|
191 |
+
|
192 |
+
</div>
|
193 |
+
|
194 |
+
</div>
|
195 |
+
|
196 |
+
<div class="sui-filter-footer">
|
197 |
+
|
198 |
+
<button class="sui-button sui-button-ghost forminator-entries-clear-filter"><?php esc_html_e( 'Clear Filters', Forminator::DOMAIN ); ?></button>
|
199 |
+
|
200 |
+
<div class="sui-actions-right">
|
201 |
+
<button class="sui-button forminator-entries-apply-filter" type="submit"><?php esc_html_e( 'Apply', Forminator::DOMAIN ); ?></button>
|
202 |
+
</div>
|
203 |
+
|
204 |
+
</div>
|
205 |
+
|
206 |
+
</div>
|
admin/views/quiz/list/content.php
CHANGED
@@ -17,6 +17,14 @@ $sql_month_start_date = date( 'Y-m-d H:i:s', strtotime( '-30 days midnight' ) );
|
|
17 |
|
18 |
// Count total entries from last 30 days
|
19 |
$total_entries_from_last_month = count( Forminator_Form_Entry_Model::get_newer_entry_ids( 'quizzes', $sql_month_start_date ) );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
20 |
?>
|
21 |
|
22 |
<?php if ( $count > 0 ) { ?>
|
@@ -53,7 +61,16 @@ $total_entries_from_last_month = count( Forminator_Form_Entry_Model::get_newer_e
|
|
53 |
<span class="sui-list-label"><?php esc_html_e( 'Submissions in the last 30 days', Forminator::DOMAIN ); ?></span>
|
54 |
<span class="sui-list-detail"><?php echo esc_html( $total_entries_from_last_month ); ?></span>
|
55 |
</li>
|
56 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
57 |
</ul>
|
58 |
|
59 |
</div>
|
@@ -118,10 +135,12 @@ $total_entries_from_last_month = count( Forminator_Form_Entry_Model::get_newer_e
|
|
118 |
<div class="sui-accordion sui-accordion-block" id="forminator-modules-list">
|
119 |
|
120 |
<?php
|
121 |
-
foreach ( $
|
122 |
$module_entries_from_last_month = 0 !== $module['entries'] ? count( Forminator_Form_Entry_Model::get_newer_entry_ids_of_form_id( $module['id'], $sql_month_start_date ) ) : 0;
|
123 |
$opened_class = '';
|
124 |
$opened_chart = '';
|
|
|
|
|
125 |
|
126 |
if( isset( $_GET['view-stats'] ) && intval( $_GET['view-stats'] ) === intval( $module['id'] ) ) { // phpcs:ignore
|
127 |
$opened_class = ' sui-accordion-item--open forminator-scroll-to';
|
@@ -166,7 +185,7 @@ $total_entries_from_last_month = count( Forminator_Form_Entry_Model::get_newer_e
|
|
166 |
<i class="sui-icon-pencil" aria-hidden="true"></i> <?php esc_html_e( 'Edit', Forminator::DOMAIN ); ?>
|
167 |
</a>
|
168 |
|
169 |
-
<div class="sui-dropdown sui-accordion-item-action">
|
170 |
|
171 |
<button class="sui-button-icon sui-dropdown-anchor">
|
172 |
<i class="sui-icon-widget-settings-config" aria-hidden="true"></i>
|
@@ -180,6 +199,8 @@ $total_entries_from_last_month = count( Forminator_Form_Entry_Model::get_newer_e
|
|
180 |
data-modal="preview_quizzes"
|
181 |
data-modal-title="<?php /* translators: ... */ echo sprintf( '%s - %s', __( 'Preview Quiz', Forminator::DOMAIN ), forminator_get_form_name( $module['id'], 'quiz' ) ); // phpcs:ignore ?>"
|
182 |
data-form-id="<?php echo esc_attr( $module['id'] ); ?>"
|
|
|
|
|
183 |
data-nonce="<?php echo esc_attr( wp_create_nonce( 'forminator_popup_preview_quizzes' ) ); ?>">
|
184 |
<i class="sui-icon-eye" aria-hidden="true"></i> <?php esc_html_e( 'Preview', Forminator::DOMAIN ); ?>
|
185 |
</a></li>
|
@@ -218,11 +239,19 @@ $total_entries_from_last_month = count( Forminator_Form_Entry_Model::get_newer_e
|
|
218 |
</a>
|
219 |
</li>
|
220 |
|
221 |
-
<li
|
222 |
<input type="hidden" name="forminator_action" value="clone">
|
223 |
<input type="hidden" name="id" value="<?php echo esc_attr( $module['id'] ); ?>"/>
|
224 |
<?php wp_nonce_field( 'forminatorQuizFormRequest', 'forminatorNonce' ); ?>
|
225 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
226 |
</form></li>
|
227 |
|
228 |
<li><form method="post">
|
@@ -233,15 +262,23 @@ $total_entries_from_last_month = count( Forminator_Form_Entry_Model::get_newer_e
|
|
233 |
</form></li>
|
234 |
|
235 |
<?php if ( Forminator::is_import_export_feature_enabled() ) : ?>
|
236 |
-
|
237 |
-
|
238 |
-
|
239 |
-
|
240 |
-
|
241 |
-
|
242 |
-
|
243 |
-
|
244 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
245 |
|
246 |
<?php endif; ?>
|
247 |
|
@@ -283,18 +320,35 @@ $total_entries_from_last_month = count( Forminator_Form_Entry_Model::get_newer_e
|
|
283 |
</li>
|
284 |
|
285 |
<li>
|
286 |
-
|
287 |
-
|
|
|
|
|
|
|
|
|
288 |
</li>
|
289 |
|
290 |
<li>
|
291 |
<strong><?php esc_html_e( 'Conversion Rate', Forminator::DOMAIN ); ?></strong>
|
292 |
-
<span><?php echo $this->getRate( $module ); // phpcs:ignore ?>%</span>
|
|
|
|
|
|
|
293 |
</li>
|
294 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
295 |
</ul>
|
296 |
|
297 |
-
<div class="sui-chartjs sui-chartjs-animated<?php echo esc_attr( $opened_chart ); ?>" data-chart-id="<?php echo esc_attr( $module['id'] ); ?>">
|
298 |
|
299 |
<div class="sui-chartjs-message sui-chartjs-message--loading">
|
300 |
<p><i class="sui-icon-loader sui-loading" aria-hidden="true"></i> <?php esc_html_e( 'Loading data...', Forminator::DOMAIN ); ?></p>
|
@@ -328,6 +382,44 @@ $total_entries_from_last_month = count( Forminator_Form_Entry_Model::get_newer_e
|
|
328 |
|
329 |
</div>
|
330 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
331 |
</div>
|
332 |
|
333 |
</div>
|
@@ -389,7 +481,7 @@ for ( $h = 30; $h >= 0; $h-- ) {
|
|
389 |
$days_array[] = date( 'M j, Y', $time );// phpcs:ignore
|
390 |
}
|
391 |
|
392 |
-
foreach ( $
|
393 |
|
394 |
if ( 0 === $module['entries'] ) {
|
395 |
$submissions_data = $default_array;
|
@@ -404,10 +496,10 @@ foreach ( $this->getModules() as $module ) {
|
|
404 |
|
405 |
// Calculate canvas top spacing
|
406 |
$canvas_top_spacing = $highest_submission + 8;
|
|
|
407 |
?>
|
408 |
|
409 |
<script>
|
410 |
-
|
411 |
var ctx = document.getElementById( 'forminator-quiz-<?php echo $module['id']; // phpcs:ignore ?>-stats' );
|
412 |
|
413 |
var monthDays = [ '<?php echo implode( "', '", $days_array ); // phpcs:ignore ?>' ],
|
@@ -480,7 +572,7 @@ foreach ( $this->getModules() as $module ) {
|
|
480 |
return tooltipItem.xLabel;
|
481 |
},
|
482 |
// Set label text color
|
483 |
-
labelTextColor:function( tooltipItem, chart ){
|
484 |
return '#AAAAAA';
|
485 |
}
|
486 |
}
|
@@ -507,4 +599,154 @@ foreach ( $this->getModules() as $module ) {
|
|
507 |
|
508 |
</script>
|
509 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
510 |
<?php } ?>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
17 |
|
18 |
// Count total entries from last 30 days
|
19 |
$total_entries_from_last_month = count( Forminator_Form_Entry_Model::get_newer_entry_ids( 'quizzes', $sql_month_start_date ) );
|
20 |
+
|
21 |
+
$quiz_module = $this->getModules();
|
22 |
+
|
23 |
+
$most_entry = array_reduce( $quiz_module, function ( $a, $b ) {
|
24 |
+
if ( isset( $a['entries'] ) && isset( $b['entries'] ) ) {
|
25 |
+
return $a['entries'] > $b['entries'] ? $a : $b;
|
26 |
+
}
|
27 |
+
} );
|
28 |
?>
|
29 |
|
30 |
<?php if ( $count > 0 ) { ?>
|
61 |
<span class="sui-list-label"><?php esc_html_e( 'Submissions in the last 30 days', Forminator::DOMAIN ); ?></span>
|
62 |
<span class="sui-list-detail"><?php echo esc_html( $total_entries_from_last_month ); ?></span>
|
63 |
</li>
|
64 |
+
<?php if ( ! empty( $most_entry ) && isset( $most_entry['entries'] ) && 0 !== (int) $most_entry['entries'] ) { ?>
|
65 |
+
<li>
|
66 |
+
<span class="sui-list-label"><?php esc_html_e( 'Most submissions', Forminator::DOMAIN ); ?></span>
|
67 |
+
<span class="sui-list-detail">
|
68 |
+
<a href="<?php echo $this->getAdminEditUrl( $most_entry['type'], $most_entry['id'] ); ?>">
|
69 |
+
<?php echo forminator_get_form_name( $most_entry['id'], 'quiz' ); ?>
|
70 |
+
</a>
|
71 |
+
</span>
|
72 |
+
</li>
|
73 |
+
<?php } ?>
|
74 |
</ul>
|
75 |
|
76 |
</div>
|
135 |
<div class="sui-accordion sui-accordion-block" id="forminator-modules-list">
|
136 |
|
137 |
<?php
|
138 |
+
foreach ( $quiz_module as $module ) {
|
139 |
$module_entries_from_last_month = 0 !== $module['entries'] ? count( Forminator_Form_Entry_Model::get_newer_entry_ids_of_form_id( $module['id'], $sql_month_start_date ) ) : 0;
|
140 |
$opened_class = '';
|
141 |
$opened_chart = '';
|
142 |
+
$has_leads = isset( $module['has_leads'] ) ? $module['has_leads'] : false;
|
143 |
+
$leads_id = isset( $module['leads_id'] ) ? $module['leads_id'] : 0;
|
144 |
|
145 |
if( isset( $_GET['view-stats'] ) && intval( $_GET['view-stats'] ) === intval( $module['id'] ) ) { // phpcs:ignore
|
146 |
$opened_class = ' sui-accordion-item--open forminator-scroll-to';
|
185 |
<i class="sui-icon-pencil" aria-hidden="true"></i> <?php esc_html_e( 'Edit', Forminator::DOMAIN ); ?>
|
186 |
</a>
|
187 |
|
188 |
+
<div class="sui-dropdown sui-accordion-item-action fui-dropdown-soon">
|
189 |
|
190 |
<button class="sui-button-icon sui-dropdown-anchor">
|
191 |
<i class="sui-icon-widget-settings-config" aria-hidden="true"></i>
|
199 |
data-modal="preview_quizzes"
|
200 |
data-modal-title="<?php /* translators: ... */ echo sprintf( '%s - %s', __( 'Preview Quiz', Forminator::DOMAIN ), forminator_get_form_name( $module['id'], 'quiz' ) ); // phpcs:ignore ?>"
|
201 |
data-form-id="<?php echo esc_attr( $module['id'] ); ?>"
|
202 |
+
data-has-leads="<?php echo esc_attr( $has_leads ); ?>"
|
203 |
+
data-leads-id="<?php echo esc_attr( $leads_id ); ?>"
|
204 |
data-nonce="<?php echo esc_attr( wp_create_nonce( 'forminator_popup_preview_quizzes' ) ); ?>">
|
205 |
<i class="sui-icon-eye" aria-hidden="true"></i> <?php esc_html_e( 'Preview', Forminator::DOMAIN ); ?>
|
206 |
</a></li>
|
239 |
</a>
|
240 |
</li>
|
241 |
|
242 |
+
<li <?php echo ( $module['has_leads'] ) ? 'aria-hidden="true"' : ''; ?>><form method="post">
|
243 |
<input type="hidden" name="forminator_action" value="clone">
|
244 |
<input type="hidden" name="id" value="<?php echo esc_attr( $module['id'] ); ?>"/>
|
245 |
<?php wp_nonce_field( 'forminatorQuizFormRequest', 'forminatorNonce' ); ?>
|
246 |
+
<?php if ( $module['has_leads'] ): ?>
|
247 |
+
<button type="submit" disabled="disabled" class="fui-button-with-tag sui-tooltip sui-tooltip-left sui-constrained" data-tooltip="<?php esc_html_e( 'Duplicate isn\'t supported at the moment for the quizzes with lead capturing enabled.', Forminator::DOMAIN ); ?>">
|
248 |
+
<span class="sui-icon-page-multiple" aria-hidden="true"></span>
|
249 |
+
<span class="fui-button-label"><?php esc_html_e( 'Duplicate', Forminator::DOMAIN ); ?></span>
|
250 |
+
<span class="sui-tag sui-tag-blue sui-tag-sm"><?php echo esc_html__( 'Coming soon', Forminator::DOMAIN ); ?></span>
|
251 |
+
</button>
|
252 |
+
<?php else: ?>
|
253 |
+
<button type="submit"><span class="sui-icon-page-multiple" aria-hidden="true"></span> <?php esc_html_e( 'Duplicate', Forminator::DOMAIN ); ?></button>
|
254 |
+
<?php endif; ?>
|
255 |
</form></li>
|
256 |
|
257 |
<li><form method="post">
|
262 |
</form></li>
|
263 |
|
264 |
<?php if ( Forminator::is_import_export_feature_enabled() ) : ?>
|
265 |
+
<?php if ( $module['has_leads'] ): ?>
|
266 |
+
<li aria-hidden="true"><a href="#" class="fui-button-with-tag sui-tooltip sui-tooltip-left"
|
267 |
+
data-tooltip="<?php esc_html_e( 'Export isn\'t supported at the moment for the quizzes with lead capturing enabled.', Forminator::DOMAIN ); ?>">
|
268 |
+
<span class="sui-icon-cloud-migration" aria-hidden="true"></span>
|
269 |
+
<span class="fui-button-label"><?php esc_html_e( 'Export', Forminator::DOMAIN ); ?></span>
|
270 |
+
<span class="sui-tag sui-tag-blue sui-tag-sm"><?php echo esc_html__( 'Coming soon', Forminator::DOMAIN ); ?></span>
|
271 |
+
</a></li>
|
272 |
+
<?php else: ?>
|
273 |
+
<li><a href="#"
|
274 |
+
class="wpmudev-open-modal"
|
275 |
+
data-modal="export_quiz"
|
276 |
+
data-modal-title=""
|
277 |
+
data-form-id="<?php echo esc_attr( $module['id'] ); ?>"
|
278 |
+
data-nonce="<?php echo esc_attr( wp_create_nonce( 'forminator_popup_export_quiz' ) ); ?>">
|
279 |
+
<i class="sui-icon-cloud-migration" aria-hidden="true"></i> <?php esc_html_e( 'Export', Forminator::DOMAIN ); ?>
|
280 |
+
</a></li>
|
281 |
+
<?php endif; ?>
|
282 |
|
283 |
<?php endif; ?>
|
284 |
|
320 |
</li>
|
321 |
|
322 |
<li>
|
323 |
+
<?php if ( $module['has_leads'] ) : ?>
|
324 |
+
<strong class="forminator-leads-leads" style="display:none;"><?php esc_html_e( 'Leads Collected', Forminator::DOMAIN ); ?></strong>
|
325 |
+
<a href="<?php echo admin_url( 'admin.php?page=forminator-quiz-view&form_id=' . $module['id'] ); // phpcs:ignore ?>" class="forminator-leads-leads" style="display:none;"><?php echo esc_html( $module['leads'] ); ?></a>
|
326 |
+
<?php endif; ?>
|
327 |
+
<strong class="forminator-leads-submissions"><?php esc_html_e( 'Submissions', Forminator::DOMAIN ); ?></strong>
|
328 |
+
<a href="<?php echo admin_url( 'admin.php?page=forminator-quiz-view&form_id=' . $module['id'] ); // phpcs:ignore ?>" class="forminator-leads-submissions"><?php echo esc_html( $module['entries'] ); ?></a>
|
329 |
</li>
|
330 |
|
331 |
<li>
|
332 |
<strong><?php esc_html_e( 'Conversion Rate', Forminator::DOMAIN ); ?></strong>
|
333 |
+
<span class="forminator-submission-rate"><?php echo $this->getRate( $module ); // phpcs:ignore ?>%</span>
|
334 |
+
<?php if ( $module['has_leads'] ): ?>
|
335 |
+
<span class="forminator-leads-rate" style="display:none;"><?php echo $this->getLeadsRate( $module ); // phpcs:ignore ?>%</span>
|
336 |
+
<?php endif; ?>
|
337 |
</li>
|
338 |
|
339 |
+
<?php if ( $module['has_leads'] ): ?>
|
340 |
+
<li class="fui-conversion-select" data-col="selector">
|
341 |
+
<label class="fui-selector-label"><?php esc_html_e( 'View data for', Forminator::DOMAIN ); ?></label>
|
342 |
+
<select class="sui-select-sm fui-selector-button fui-select-listing-data">
|
343 |
+
<option value="submissions"><?php esc_html_e( 'Submissions', Forminator::DOMAIN ); ?></option>
|
344 |
+
<option value="leads"><?php esc_html_e( 'Leads Form', Forminator::DOMAIN ); ?></option>
|
345 |
+
</select>
|
346 |
+
</li>
|
347 |
+
<?php endif; ?>
|
348 |
+
|
349 |
</ul>
|
350 |
|
351 |
+
<div class="sui-chartjs sui-chartjs-animated<?php echo esc_attr( $opened_chart ); ?> forminator-stats-chart" data-chart-id="<?php echo esc_attr( $module['id'] ); ?>">
|
352 |
|
353 |
<div class="sui-chartjs-message sui-chartjs-message--loading">
|
354 |
<p><i class="sui-icon-loader sui-loading" aria-hidden="true"></i> <?php esc_html_e( 'Loading data...', Forminator::DOMAIN ); ?></p>
|
382 |
|
383 |
</div>
|
384 |
|
385 |
+
<?php if ( isset( $module['has_leads'] ) && $module['has_leads'] ) { ?>
|
386 |
+
|
387 |
+
<div class="sui-chartjs sui-chartjs-animated<?php echo esc_attr( $opened_chart ); ?> forminator-leads-chart" style="display: none;" data-chart-id="<?php echo esc_attr( $module['leads_id'] ); ?>">
|
388 |
+
|
389 |
+
<div class="sui-chartjs-message sui-chartjs-message--loading">
|
390 |
+
<p><i class="sui-icon-loader sui-loading" aria-hidden="true"></i> <?php esc_html_e( 'Loading data...', Forminator::DOMAIN ); ?></p>
|
391 |
+
</div>
|
392 |
+
|
393 |
+
<?php if ( 0 === $module['entries'] ) { ?>
|
394 |
+
|
395 |
+
<div class="sui-chartjs-message sui-chartjs-message--empty">
|
396 |
+
<p><i class="sui-icon-info" aria-hidden="true"></i> <?php esc_html_e( "Your quiz doesn't have any submission yet. Try again in a moment.", Forminator::DOMAIN ); ?></p>
|
397 |
+
</div>
|
398 |
+
|
399 |
+
<?php } else { ?>
|
400 |
+
|
401 |
+
<?php if ( 0 === $module_entries_from_last_month ) { ?>
|
402 |
+
|
403 |
+
<div class="sui-chartjs-message sui-chartjs-message--empty">
|
404 |
+
<p><i class="sui-icon-info" aria-hidden="true"></i> <?php esc_html_e( "Your quiz didn't collect submissions in the past 30 days.", Forminator::DOMAIN ); ?></p>
|
405 |
+
</div>
|
406 |
+
|
407 |
+
<?php } ?>
|
408 |
+
|
409 |
+
<?php } ?>
|
410 |
+
|
411 |
+
<div class="sui-chartjs-canvas">
|
412 |
+
|
413 |
+
<?php if ( ( 0 !== $module['entries'] ) || ( 0 !== $module_entries_from_last_month ) ) { ?>
|
414 |
+
<canvas id="forminator-quiz-<?php echo esc_attr( $module['leads_id'] ); ?>-stats"></canvas>
|
415 |
+
<?php } ?>
|
416 |
+
|
417 |
+
</div>
|
418 |
+
|
419 |
+
</div>
|
420 |
+
|
421 |
+
<?php } ?>
|
422 |
+
|
423 |
</div>
|
424 |
|
425 |
</div>
|
481 |
$days_array[] = date( 'M j, Y', $time );// phpcs:ignore
|
482 |
}
|
483 |
|
484 |
+
foreach ( $quiz_module as $module ) {
|
485 |
|
486 |
if ( 0 === $module['entries'] ) {
|
487 |
$submissions_data = $default_array;
|
496 |
|
497 |
// Calculate canvas top spacing
|
498 |
$canvas_top_spacing = $highest_submission + 8;
|
499 |
+
|
500 |
?>
|
501 |
|
502 |
<script>
|
|
|
503 |
var ctx = document.getElementById( 'forminator-quiz-<?php echo $module['id']; // phpcs:ignore ?>-stats' );
|
504 |
|
505 |
var monthDays = [ '<?php echo implode( "', '", $days_array ); // phpcs:ignore ?>' ],
|
572 |
return tooltipItem.xLabel;
|
573 |
},
|
574 |
// Set label text color
|
575 |
+
labelTextColor:function( tooltipItem, chart ) {
|
576 |
return '#AAAAAA';
|
577 |
}
|
578 |
}
|
599 |
|
600 |
</script>
|
601 |
|
602 |
+
<?php
|
603 |
+
if ( isset( $module['has_leads'] ) && $module['has_leads'] ) {
|
604 |
+
|
605 |
+
if ( ! isset( $module['leads'] ) || 0 === $module['leads'] ) {
|
606 |
+
$submissions_data = $default_array;
|
607 |
+
} else {
|
608 |
+
$submissions = Forminator_Form_Entry_Model::get_form_latest_lead_entries_count_grouped_by_day( $module['id'], $sql_month_start_date );
|
609 |
+
$submissions_array = wp_list_pluck( $submissions, 'entries_amount', 'date_created' );
|
610 |
+
$submissions_data = array_merge( $default_array, array_intersect_key( $submissions_array, $default_array ) );
|
611 |
+
}
|
612 |
+
|
613 |
+
// Get highest value
|
614 |
+
$highest_submission = max( $submissions_data );
|
615 |
+
|
616 |
+
// Calculate canvas top spacing
|
617 |
+
$canvas_top_spacing = $highest_submission + 8;
|
618 |
+
?>
|
619 |
+
<script>
|
620 |
+
var ctx = document.getElementById( 'forminator-quiz-<?php echo $module['leads_id']; // phpcs:ignore ?>-stats' );
|
621 |
+
|
622 |
+
var monthDays = [ '<?php echo implode( "', '", $days_array ); // phpcs:ignore ?>' ],
|
623 |
+
submissions = [ <?php echo implode( ', ', $submissions_data ); // phpcs:ignore ?> ];
|
624 |
+
|
625 |
+
var chartData = {
|
626 |
+
labels: monthDays,
|
627 |
+
datasets: [{
|
628 |
+
label: 'Submissions',
|
629 |
+
data: submissions,
|
630 |
+
backgroundColor: [
|
631 |
+
'#E1F6FF'
|
632 |
+
],
|
633 |
+
borderColor: [
|
634 |
+
'#17A8E3'
|
635 |
+
],
|
636 |
+
borderWidth: 2,
|
637 |
+
pointRadius: 0,
|
638 |
+
pointHitRadius: 20,
|
639 |
+
pointHoverRadius: 5,
|
640 |
+
pointHoverBorderColor: '#17A8E3',
|
641 |
+
pointHoverBackgroundColor: '#17A8E3'
|
642 |
+
}]
|
643 |
+
};
|
644 |
+
|
645 |
+
var chartOptions = {
|
646 |
+
maintainAspectRatio: false,
|
647 |
+
legend: {
|
648 |
+
display: false
|
649 |
+
},
|
650 |
+
scales: {
|
651 |
+
xAxes: [{
|
652 |
+
display: false,
|
653 |
+
gridLines: {
|
654 |
+
color: 'rgba(0, 0, 0, 0)'
|
655 |
+
}
|
656 |
+
}],
|
657 |
+
yAxes: [{
|
658 |
+
display: false,
|
659 |
+
gridLines: {
|
660 |
+
color: 'rgba(0, 0, 0, 0)'
|
661 |
+
},
|
662 |
+
ticks: {
|
663 |
+
beginAtZero: false,
|
664 |
+
min: 0,
|
665 |
+
max: <?php echo esc_attr( $canvas_top_spacing ); ?>,
|
666 |
+
stepSize: 1
|
667 |
+
}
|
668 |
+
}]
|
669 |
+
},
|
670 |
+
elements: {
|
671 |
+
line: {
|
672 |
+
tension: 0
|
673 |
+
},
|
674 |
+
point: {
|
675 |
+
radius: 0
|
676 |
+
}
|
677 |
+
},
|
678 |
+
tooltips: {
|
679 |
+
custom: function( tooltip ) {
|
680 |
+
if ( ! tooltip ) return;
|
681 |
+
// disable displaying the color box;
|
682 |
+
tooltip.displayColors = false;
|
683 |
+
},
|
684 |
+
callbacks: {
|
685 |
+
title: function( tooltipItem, data ) {
|
686 |
+
return tooltipItem[0].yLabel + " Submissions";
|
687 |
+
},
|
688 |
+
label: function( tooltipItem, data ) {
|
689 |
+
return tooltipItem.xLabel;
|
690 |
+
},
|
691 |
+
// Set label text color
|
692 |
+
labelTextColor:function( tooltipItem, chart ) {
|
693 |
+
return '#AAAAAA';
|
694 |
+
}
|
695 |
+
}
|
696 |
+
},
|
697 |
+
plugins: {
|
698 |
+
datalabels: {
|
699 |
+
display: false
|
700 |
+
}
|
701 |
+
}
|
702 |
+
};
|
703 |
+
|
704 |
+
if (ctx) {
|
705 |
+
var myChart = new Chart(ctx, {
|
706 |
+
type: 'line',
|
707 |
+
fill: 'start',
|
708 |
+
data: chartData,
|
709 |
+
plugins: [
|
710 |
+
ChartDataLabels
|
711 |
+
],
|
712 |
+
options: chartOptions
|
713 |
+
});
|
714 |
+
}
|
715 |
+
|
716 |
+
|
717 |
+
</script>
|
718 |
+
|
719 |
+
<?php } ?>
|
720 |
+
|
721 |
<?php } ?>
|
722 |
+
|
723 |
+
<script>
|
724 |
+
jQuery( '.fui-select-listing-data' ).change( function( e ) {
|
725 |
+
var $el = jQuery( this ),
|
726 |
+
$parent = $el.closest( '.sui-accordion-item' ),
|
727 |
+
submissions = $parent.find( '.forminator-leads-submissions' ),
|
728 |
+
leads = $parent.find( '.forminator-leads-leads'),
|
729 |
+
submissionsRate = $parent.find( '.forminator-submission-rate' ),
|
730 |
+
leadsRate = $parent.find( '.forminator-leads-rate' ),
|
731 |
+
statsChart = $parent.find( '.forminator-stats-chart'),
|
732 |
+
leadsChart = $parent.find( '.forminator-leads-chart'),
|
733 |
+
value = $el.val()
|
734 |
+
;
|
735 |
+
|
736 |
+
if ( value === 'leads' ) {
|
737 |
+
submissions.hide();
|
738 |
+
submissionsRate.hide();
|
739 |
+
statsChart.hide();
|
740 |
+
leads.show();
|
741 |
+
leadsRate.show();
|
742 |
+
leadsChart.show();
|
743 |
+
} else {
|
744 |
+
submissions.show();
|
745 |
+
submissionsRate.show();
|
746 |
+
statsChart.show();
|
747 |
+
leads.hide();
|
748 |
+
leadsRate.hide();
|
749 |
+
leadsChart.hide();
|
750 |
+
}
|
751 |
+
});
|
752 |
+
</script>
|
admin/views/settings/dashboard/forms.php
CHANGED
@@ -33,7 +33,7 @@ $draft = isset( $dashboard_settings['draft'] ) ? filter_var( $dashb
|
|
33 |
|
34 |
<label id="listings-forms-status-label" class="sui-settings-label"><?php esc_html_e( 'Status', Forminator::DOMAIN ); ?></label>
|
35 |
|
36 |
-
<span id="listings-forms-status-message" class="sui-description" style="margin-bottom: 10px;"><?php esc_html_e( 'By default,
|
37 |
|
38 |
<label for="forminator-forms-status-published" class="sui-checkbox sui-checkbox-sm sui-checkbox-stacked">
|
39 |
<input
|
33 |
|
34 |
<label id="listings-forms-status-label" class="sui-settings-label"><?php esc_html_e( 'Status', Forminator::DOMAIN ); ?></label>
|
35 |
|
36 |
+
<span id="listings-forms-status-message" class="sui-description" style="margin-bottom: 10px;"><?php esc_html_e( 'By default, all forms, regardless of status, are displayed on the dashboard. Use this setting to display the forms with a specific status only.', Forminator::DOMAIN ); ?></span>
|
37 |
|
38 |
<label for="forminator-forms-status-published" class="sui-checkbox sui-checkbox-sm sui-checkbox-stacked">
|
39 |
<input
|
admin/views/settings/dashboard/polls.php
CHANGED
@@ -31,7 +31,7 @@ $draft = isset( $dashboard_settings['draft'] ) ? filter_var( $dashb
|
|
31 |
|
32 |
<label id="listings-polls-status-label" class="sui-settings-label"><?php esc_html_e( 'Status', Forminator::DOMAIN ); ?></label>
|
33 |
|
34 |
-
<span id="listings-polls-status-message" class="sui-description" style="margin-bottom: 10px;"><?php esc_html_e( 'By default,
|
35 |
|
36 |
<label for="forminator-polls-status-published" class="sui-checkbox sui-checkbox-sm sui-checkbox-stacked">
|
37 |
<input
|
31 |
|
32 |
<label id="listings-polls-status-label" class="sui-settings-label"><?php esc_html_e( 'Status', Forminator::DOMAIN ); ?></label>
|
33 |
|
34 |
+
<span id="listings-polls-status-message" class="sui-description" style="margin-bottom: 10px;"><?php esc_html_e( 'By default, all polls, regardless of status, are displayed on the dashboard. Use this setting to display the polls with a specific status only.', Forminator::DOMAIN ); ?></span>
|
35 |
|
36 |
<label for="forminator-polls-status-published" class="sui-checkbox sui-checkbox-sm sui-checkbox-stacked">
|
37 |
<input
|
admin/views/settings/dashboard/quizzes.php
CHANGED
@@ -32,7 +32,7 @@ $draft = isset( $dashboard_settings['draft'] ) ? filter_var( $dashb
|
|
32 |
|
33 |
<label for="forminator-quizzes-status-published" id="listings-quizzes-status-label" class="sui-settings-label"><?php esc_html_e( 'Status', Forminator::DOMAIN ); ?></label>
|
34 |
|
35 |
-
<span id="listings-quizzes-status-message" class="sui-description" style="margin-bottom: 10px;"><?php esc_html_e( 'By default,
|
36 |
|
37 |
<label for="forminator-quizzes-status-published" class="sui-checkbox sui-checkbox-sm sui-checkbox-stacked">
|
38 |
<input
|
32 |
|
33 |
<label for="forminator-quizzes-status-published" id="listings-quizzes-status-label" class="sui-settings-label"><?php esc_html_e( 'Status', Forminator::DOMAIN ); ?></label>
|
34 |
|
35 |
+
<span id="listings-quizzes-status-message" class="sui-description" style="margin-bottom: 10px;"><?php esc_html_e( 'By default, all quizzes, regardless of status, are displayed on the dashboard. Use this setting to display the quizzes with a specific status only.', Forminator::DOMAIN ); ?></span>
|
36 |
|
37 |
<label for="forminator-quizzes-status-published" class="sui-checkbox sui-checkbox-sm sui-checkbox-stacked">
|
38 |
<input
|
admin/views/settings/tab-dashboard.php
CHANGED
@@ -24,7 +24,7 @@ $nonce = wp_create_nonce( 'forminator_save_dashboard_settings' );
|
|
24 |
|
25 |
<label class="sui-settings-label"><?php esc_html_e( 'Modules Listing', Forminator::DOMAIN ); ?></label>
|
26 |
|
27 |
-
<span class="sui-description" style="margin-bottom: 10px;"><?php esc_html_e( 'Choose the number of modules
|
28 |
|
29 |
<div class="sui-tabs sui-tabs-overflow">
|
30 |
|
24 |
|
25 |
<label class="sui-settings-label"><?php esc_html_e( 'Modules Listing', Forminator::DOMAIN ); ?></label>
|
26 |
|
27 |
+
<span class="sui-description" style="margin-bottom: 10px;"><?php esc_html_e( 'Choose the number of modules by module type and/or by status that you want displayed on the dashboard.', Forminator::DOMAIN ); ?></span>
|
28 |
|
29 |
<div class="sui-tabs sui-tabs-overflow">
|
30 |
|
assets/css/shared-ui.min.css
CHANGED
@@ -1,2 +1,2 @@
|
|
1 |
-
@import url(https://fonts.googleapis.com/css?family=Roboto:400,500,700);@import url(https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/css/select2.min.css);.sui-2-6-0 .sui-wrap .fui-demo--poll.fui-demo--bold label input,.sui-2-6-0 .sui-wrap .fui-demo--poll.fui-demo--default label input,.sui-2-6-0 .sui-wrap .fui-demo--poll.fui-demo--flat label input,.sui-2-6-0 .sui-wrap .fui-demo--poll.fui-demo--material label input,.sui-2-6-0 .sui-wrap .fui-demo--quiz.fui-demo--bold>label input,.sui-2-6-0 .sui-wrap .fui-demo--quiz.fui-demo--default>label input,.sui-2-6-0 .sui-wrap .fui-demo--quiz.fui-demo--flat>label input,.sui-2-6-0 .sui-wrap .fui-demo--quiz.fui-demo--material>label input,.sui-2-6-0 .sui-wrap .sui-box-selector input,.sui-2-6-0 .sui-wrap .sui-checkbox input,.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .wp-picker-container .button,.sui-2-6-0 .sui-wrap .sui-insert-variables .sui-variables+.select2 .select2-selection--single .select2-selection__rendered,.sui-2-6-0 .sui-wrap .sui-multi-checkbox label input,.sui-2-6-0 .sui-wrap .sui-radio input,.sui-2-6-0 .sui-wrap .sui-side-tabs>.sui-tabs-menu .sui-tab-item input,.sui-2-6-0 .sui-wrap .sui-side-tabs>.sui-tabs-menu>* input,.sui-2-6-0 .sui-wrap .sui-side-tabs>[data-tabs] .sui-tab-item input,.sui-2-6-0 .sui-wrap .sui-side-tabs>[data-tabs]>* input,.sui-2-6-0 .sui-wrap .sui-toggle input,.sui-2-6-0 .sui-wrap .sui-tree li[role=treeitem]>.sui-tree-node>label.sui-node-checkbox input,.sui-2-6-0 .sui-wrap .sui-tree li[role=treeitem]>.sui-tree-node>label.sui-node-checkbox span:not([aria-hidden]),.sui-2-6-0 .sui-wrap .sui-upload input[type=file],.sui-screen-reader-text{border:0;clip:rect(1px,1px,1px,1px);-webkit-clip-path:inset(50%);clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute!important;width:1px;word-wrap:normal!important}.sui-2-6-0 .sui-wrap .sui-fade-in{animation:fadeIn .3s ease-in forwards}.sui-2-6-0 .sui-wrap .sui-fade-out{animation:fadeOut .3s ease-in forwards}.sui-2-6-0 .sui-wrap .sui-bounce-in{animation:bounceInJiggle .8s ease-in forwards}.sui-2-6-0 .sui-wrap .sui-bounce-out{animation:bounceOutJiggle .6s ease-out forwards}.sui-2-6-0 .sui-wrap .sui-content-fade-in{animation:fadeScaleIn .5s ease-in forwards}.sui-2-6-0 .sui-wrap .sui-content-fade-out{animation:fadeScaleOut .9s ease-in forwards}@keyframes bounceInDown{0%,60%,75%,90%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:translate3d(0,-3000px,0)}60%{opacity:1;transform:translate3d(0,25px,0)}75%{transform:translate3d(0,-10px,0)}90%{transform:translate3d(0,5px,0)}to{transform:none}}@keyframes bounceInJiggle{0%{transform:translateY(-200%) scale(1.5);opacity:0}30%{opacity:1}58%{transform:translateY(0) rotate(1deg) scale(1);opacity:1}72%{transform:translateY(-30px) rotate(-1deg)}80%{transform:translateY(0) rotate(.5deg)}to{transform:translateY(0) rotate(0deg)}}@keyframes bounceOutJiggle{0%{transform:translateY(0)}10%{transform:translateY(-10px) rotate(-.5deg)}30%{transform:translateY(20px) rotate(8deg)}70%{opacity:1}90%{transform:translateY(300%) translateX(40px) rotate(35deg);opacity:0}to{display:none}}@keyframes bounceOut{20%{transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;transform:scale3d(1.1,1.1,1.1)}to{opacity:0;transform:scale3d(.3,.3,.3)}}@keyframes fadeIn{0%{opacity:0}25%{opacity:1}}@keyframes fadeScaleIn{0%{opacity:0}25%{opacity:0;transform:translate3d(0,10px,0) scale(.9)}to{transform:translateZ(0) scale(1)}}@keyframes fadeOut{0%{opacity:1}75%{opacity:1}to{opacity:0}}@keyframes fadeScaleOut{0%{opacity:1;transform:translateZ(0) scale(1)}25%{opacity:0;transform:translate3d(0,10px,0) scale(.9)}to{opacity:0}}@keyframes fadeInLeft{0%{opacity:0;transform:translate3d(-50px,0,0)}to{opacity:1;transform:none}}@keyframes fadeInRight{0%{opacity:0;transform:translate3d(50px,0,0)}to{opacity:1;transform:none}}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.sui-2-6-0 .sui-wrap{font-family:Roboto,Arial,sans-serif;font-weight:400;font-size:15px;line-height:30px;color:#666;letter-spacing:-.25px;margin:30px 30px 0 10px}.sui-2-6-0 .sui-wrap *{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}@media (max-width:782px){.sui-2-6-0 .sui-wrap{margin:20px 10px 0 0}}.sui-2-6-0 .sui-wrap h1,.sui-2-6-0 .sui-wrap h2,.sui-2-6-0 .sui-wrap h3,.sui-2-6-0 .sui-wrap h4,.sui-2-6-0 .sui-wrap h5,.sui-2-6-0 .sui-wrap h6{display:block;margin:.5em auto;padding:0;line-height:30px;color:#333;font-weight:700;font-family:Roboto,Arial,sans-serif}.sui-2-6-0 .sui-wrap h1{font-size:32px;line-height:40px;color:#333;margin:0}.sui-2-6-0 .sui-wrap h2{font-size:22px;line-height:35px}.sui-2-6-0 .sui-wrap h3{font-size:18px;line-height:40px}.sui-2-6-0 .sui-wrap h4,.sui-2-6-0 .sui-wrap h5,.sui-2-6-0 .sui-wrap h6{font-size:15px}.sui-2-6-0 .sui-wrap p{font-family:Roboto,Arial,sans-serif;font-weight:400;font-size:15px;line-height:30px;color:#666;letter-spacing:-.25px;text-rendering:optimizeLegibility}.sui-2-6-0 .sui-wrap p.sui-p-small{font-size:13px;line-height:22px;color:#888;margin:5px 0}.sui-2-6-0 .sui-wrap p:first-child{margin-top:0}.sui-2-6-0 .sui-wrap p:last-of-type:not(:last-child){margin-bottom:30px}@media (max-width:782px){.sui-2-6-0 .sui-wrap p:last-of-type:not(:last-child){margin-bottom:20px}}.sui-2-6-0 .sui-wrap p:last-child{margin-bottom:0}.sui-2-6-0 .sui-wrap small{display:inline-block;font-size:13px;line-height:22px;color:#888;margin-bottom:5px}.sui-2-6-0 .sui-wrap a{text-decoration:none;color:#17a8e3;font-weight:500;outline-color:transparent;outline-style:none;box-shadow:none}.sui-2-6-0 .sui-wrap a:active:not(.sui-button),.sui-2-6-0 .sui-wrap a:focus:not(.sui-button),.sui-2-6-0 .sui-wrap a:hover:not(.sui-button){color:#1286b5}.sui-2-6-0 .sui-wrap a.disabled{pointer-events:none}.sui-2-6-0 .sui-wrap a.disabled:active,.sui-2-6-0 .sui-wrap a.disabled:focus,.sui-2-6-0 .sui-wrap a.disabled:hover{color:#888;cursor:default}.sui-2-6-0 .sui-wrap code,.sui-2-6-0 .sui-wrap pre{font-weight:500;font-size:13px;line-height:18px;color:#333;background-color:#f8f8f8;border:1px solid #e6e6e6;border-radius:4px;margin:0;padding:10px 15px;white-space:pre;overflow:auto;max-width:100%;vertical-align:middle;-moz-tab-size:4;-o-tab-size:4;tab-size:4}.sui-2-6-0 .sui-wrap code{display:inline-block;padding:2px 5px}.sui-2-6-0 .sui-wrap b,.sui-2-6-0 .sui-wrap strong{font-weight:500}.sui-2-6-0 .sui-wrap dfn{font-style:normal;font-weight:400;border-bottom:1px dotted #888}.sui-2-6-0 .sui-wrap hr{border:none;display:block;height:1px;background:#e6e6e6;margin:30px 0}.sui-2-6-0 #ui-datepicker-div.sui-calendar .ui-datepicker-header .ui-corner-all.ui-datepicker-next:before,.sui-2-6-0 #ui-datepicker-div.sui-calendar .ui-datepicker-header .ui-corner-all.ui-datepicker-prev:before,.sui-2-6-0 .daterangepicker .drp-calendar .table-condensed thead tr th.next span:before,.sui-2-6-0 .daterangepicker .drp-calendar .table-condensed thead tr th.prev span:before,.sui-2-6-0 .sui-dialog .sui-dialog-back:before,.sui-2-6-0 .sui-dialog .sui-dialog-close:before,.sui-2-6-0 .sui-select-dropdown .select2-search--dropdown:after,.sui-2-6-0 .sui-variables-dropdown .select2-search--dropdown:after,.sui-2-6-0 .sui-wrap .fui-builder-field-block.fui-unsaved:before,.sui-2-6-0 .sui-wrap .fui-multi-options .fui-option:before,.sui-2-6-0 .sui-wrap .sui-box-body .sui-upsell-row .sui-upsell-notice p:first-of-type:before,.sui-2-6-0 .sui-wrap .sui-box-selector input:checked+span:before,.sui-2-6-0 .sui-wrap .sui-checkbox input+span:before,.sui-2-6-0 .sui-wrap .sui-insert-variables .select-container .select-list-container .list-value:before,.sui-2-6-0 .sui-wrap .sui-insert-variables .sui-variables+.select2 .select2-selection--single .select2-selection__arrow:before,.sui-2-6-0 .sui-wrap .sui-listing li:before,.sui-2-6-0 .sui-wrap .sui-notice-floating p:first-of-type:before,.sui-2-6-0 .sui-wrap .sui-notice-top p:first-of-type:before,.sui-2-6-0 .sui-wrap .sui-notice p:first-of-type:before,.sui-2-6-0 .sui-wrap .sui-pagination-active-filters .sui-active-filter .sui-active-filter-remove:before,.sui-2-6-0 .sui-wrap .sui-recipient .sui-recipient-name:before,.sui-2-6-0 .sui-wrap .sui-reviews__stars:before,.sui-2-6-0 .sui-wrap .sui-tree-fancy[data-tree=directory] ul.ui-fancytree li[role=treeitem]>span.fancytree-node>span.fancytree-icon:before,.sui-2-6-0 .sui-wrap .sui-tree-fancy ul.ui-fancytree li[role=treeitem]>span.fancytree-node>span.fancytree-checkbox:before,.sui-2-6-0 .sui-wrap .sui-tree-fancy ul.ui-fancytree li[role=treeitem]>span.fancytree-node>span.fancytree-expander:before,.sui-2-6-0 .sui-wrap .sui-tree div[role=contentinfo] span[role=form] button:before,.sui-2-6-0 .sui-wrap .sui-tree div[role=contentinfo] span[role=form] span[role=button]:before,.sui-2-6-0 .sui-wrap .sui-tree li[role=treeitem]>.sui-tree-node>.sui-node-checkbox[role=checkbox]:before,.sui-2-6-0 .sui-wrap .sui-tree li[role=treeitem]>.sui-tree-node>label.sui-node-checkbox span[aria-hidden]:before,.sui-2-6-0 .sui-wrap .sui-tree li[role=treeitem]>.sui-tree-node>span[aria-hidden]:before,.sui-2-6-0 .sui-wrap .sui-tree li[role=treeitem] button[data-button] span[aria-hidden]:before,.sui-2-6-0 .sui-wrap .sui-tree li[role=treeitem] span[role=button]:before,.sui-2-6-0 .sui-wrap .sui-tree span[role=contentinfo] button[data-button] span[aria-hidden]:before,.sui-2-6-0 .sui-wrap .sui-tree span[role=contentinfo] span[role=button]:before,.sui-2-6-0 .sui-wrap .sui-tree span[role=contentinfo] span[role=form] button:before,.sui-2-6-0 .sui-wrap .sui-tree span[role=contentinfo] span[role=form] span[role=button]:before,.sui-2-6-0 .sui-wrap .sui-upload .sui-upload-file:before,.sui-2-6-0 .sui-wrap .sui-upload .sui-upload-image .sui-image-preview:before,.sui-2-6-0 .sui-wrap [class*=sui-icon-]:after,.sui-2-6-0 .sui-wrap [class*=sui-icon-]:before,.sui-2-6-0 .sui-wrap select.sui-search+.select2 .select2-selection--multiple:before,.sui-2-6-0 select.sui-select+.select2-container .select2-selection--single .select2-selection__arrow:before{font-family:wpmudev-plugin-icons!important;speak:none;font-size:1em;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;text-rendering:auto;display:inline-block;color:#888;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@font-face{font-family:wpmudev-plugin-icons;src:url(../fonts/wpmudev-plugin-icons.eot);src:url(../fonts/wpmudev-plugin-icons.eot) format("embedded-opentype"),url(../fonts/wpmudev-plugin-icons.ttf) format("truetype"),url(../fonts/wpmudev-plugin-icons.woff) format("woff"),url(../fonts/wpmudev-plugin-icons.woff2) format("woff2"),url(../fonts/wpmudev-plugin-icons.svg) format("svg");font-weight:400;font-style:normal}.sui-2-6-0 .sui-wrap .sui-loading:before{animation:spin 1.3s linear infinite}.sui-2-6-0 .sui-wrap [class*=sui-icon-]{display:inline-block}.sui-2-6-0 .sui-wrap [class*=sui-icon-].sui-xl:before{font-size:30px}.sui-2-6-0 .sui-wrap [class*=sui-icon-].sui-lg:before{font-size:20px}.sui-2-6-0 .sui-wrap [class*=sui-icon-].sui-md:before{font-size:16px}.sui-2-6-0 .sui-wrap [class*=sui-icon-].sui-sm:before{font-size:12px}.sui-2-6-0 .sui-wrap [class*=sui-icon-].sui-error:before,.sui-2-6-0 .sui-wrap [class*=sui-icon-].sui-info:before,.sui-2-6-0 .sui-wrap [class*=sui-icon-].sui-success:before,.sui-2-6-0 .sui-wrap [class*=sui-icon-].sui-warning:before{color:inherit}.sui-2-6-0 .sui-wrap [class*=sui-icon-].sui-fw{width:1.8em;text-align:center;min-height:1em}.sui-2-6-0 .sui-wrap .sui-icon-check:before{content:"("}.sui-2-6-0 .sui-wrap .sui-icon-close:before{content:")"}.sui-2-6-0 .sui-wrap .sui-icon-check-tick:before{content:"_"}.sui-2-6-0 .sui-wrap .sui-icon-cross-close:before{content:"+"}.sui-2-6-0 .sui-wrap .sui-icon-plus-circle:before{content:"@"}.sui-2-6-0 .sui-wrap .sui-icon-warning-alert:before{content:"!"}.sui-2-6-0 .sui-wrap .sui-icon-info:before{content:"I"}.sui-2-6-0 .sui-wrap .sui-icon-question:before{content:"?"}.sui-2-6-0 .sui-wrap .sui-icon-trash:before{content:"Q"}.sui-2-6-0 .sui-wrap .sui-icon-pencil:before{content:"/"}.sui-2-6-0 .sui-wrap .sui-icon-unlock:before{content:"0"}.sui-2-6-0 .sui-wrap .sui-icon-lock:before{content:"9"}.sui-2-6-0 .sui-wrap .sui-icon-key:before{content:"\25CA"}.sui-2-6-0 .sui-wrap .sui-icon-plus:before{content:"="}.sui-2-6-0 .sui-wrap .sui-icon-magnifying-glass-search:before{content:"\BA"}.sui-2-6-0 .sui-wrap .sui-icon-more:before{content:"\2026"}.sui-2-6-0 .sui-wrap .sui-icon-wrench-tool:before{content:"\2044"}.sui-2-6-0 .sui-wrap .sui-icon-widget-settings-config:before{content:"x"}.sui-2-6-0 .sui-wrap .sui-icon-settings-slider-control:before{content:"\153"}.sui-2-6-0 .sui-wrap .sui-icon-loader:before{content:"N"}.sui-2-6-0 .sui-wrap .sui-icon-calendar:before{content:"\220F"}.sui-2-6-0 .sui-wrap .sui-icon-clock:before{content:","}.sui-2-6-0 .sui-wrap .sui-icon-speed-optimize:before{content:"\F8"}.sui-2-6-0 .sui-wrap .sui-icon-stopwatch:before{content:"V"}.sui-2-6-0 .sui-wrap .sui-icon-filter:before{content:"z"}.sui-2-6-0 .sui-wrap .sui-icon-bookmark:before{content:"\221A"}.sui-2-6-0 .sui-wrap .sui-icon-chevron-up:before{content:"\2DD"}.sui-2-6-0 .sui-wrap .sui-icon-chevron-right:before{content:"\2DC"}.sui-2-6-0 .sui-wrap .sui-icon-chevron-down:before{content:"\131"}.sui-2-6-0 .sui-wrap .sui-icon-chevron-left:before{content:"\D3"}.sui-2-6-0 .sui-wrap .sui-icon-arrow-up:before{content:"\D4"}.sui-2-6-0 .sui-wrap .sui-icon-arrow-right:before{content:"\AF"}.sui-2-6-0 .sui-wrap .sui-icon-arrow-down:before{content:"\C2"}.sui-2-6-0 .sui-wrap .sui-icon-arrow-left:before{content:"\F8FF"}.sui-2-6-0 .sui-wrap .sui-icon-arrow-skip-back:before{content:"{"}.sui-2-6-0 .sui-wrap .sui-icon-arrow-skip-forward:before{content:"}"}.sui-2-6-0 .sui-wrap .sui-icon-arrow-skip-start:before{content:":"}.sui-2-6-0 .sui-wrap .sui-icon-arrow-skip-end:before{content:'"'}.sui-2-6-0 .sui-wrap .sui-icon-play:before{content:"\B4"}.sui-2-6-0 .sui-wrap .sui-icon-pause:before{content:"\2020"}.sui-2-6-0 .sui-wrap .sui-icon-arrows-out:before{content:"\2DA"}.sui-2-6-0 .sui-wrap .sui-icon-arrows-in:before{content:"\2264"}.sui-2-6-0 .sui-wrap .sui-icon-arrows-expand:before{content:"\AC"}.sui-2-6-0 .sui-wrap .sui-icon-arrows-compress:before{content:"\2265"}.sui-2-6-0 .sui-wrap .sui-icon-refresh2:before{content:"\C1"}.sui-2-6-0 .sui-wrap .sui-icon-zip:before{content:"a"}.sui-2-6-0 .sui-wrap .sui-icon-combine:before{content:"o"}.sui-2-6-0 .sui-wrap .sui-icon-defer:before{content:"p"}.sui-2-6-0 .sui-wrap .sui-icon-inlinecss:before{content:"c"}.sui-2-6-0 .sui-wrap .sui-icon-movefooter:before{content:"u"}.sui-2-6-0 .sui-wrap .sui-icon-popup:before{content:"1"}.sui-2-6-0 .sui-wrap .sui-icon-slide-in:before{content:"2"}.sui-2-6-0 .sui-wrap .sui-icon-embed:before{content:"3"}.sui-2-6-0 .sui-wrap .sui-icon-list:before{content:"`"}.sui-2-6-0 .sui-wrap .sui-icon-layout-grid:before{content:"\221E"}.sui-2-6-0 .sui-wrap .sui-icon-layout:before{content:"\A9"}.sui-2-6-0 .sui-wrap .sui-icon-thumbnails:before{content:"G"}.sui-2-6-0 .sui-wrap .sui-icon-drag:before{content:"\201E"}.sui-2-6-0 .sui-wrap .sui-icon-align-left:before{content:"%"}.sui-2-6-0 .sui-wrap .sui-icon-align-center:before{content:"^"}.sui-2-6-0 .sui-wrap .sui-icon-align-right:before{content:"&"}.sui-2-6-0 .sui-wrap .sui-icon-align-justify:before{content:"#"}.sui-2-6-0 .sui-wrap .sui-icon-indent-more:before{content:"\2019"}.sui-2-6-0 .sui-wrap .sui-icon-indent-less:before{content:"\201D"}.sui-2-6-0 .sui-wrap .sui-icon-blog:before{content:"Y"}.sui-2-6-0 .sui-wrap .sui-icon-list-number:before{content:"7"}.sui-2-6-0 .sui-wrap .sui-icon-list-bullet:before{content:"8"}.sui-2-6-0 .sui-wrap .sui-icon-bold:before{content:"B"}.sui-2-6-0 .sui-wrap .sui-icon-quote-2:before{content:"'"}.sui-2-6-0 .sui-wrap .sui-icon-style-type:before{content:"<"}.sui-2-6-0 .sui-wrap .sui-icon-wand-magic:before{content:"Z"}.sui-2-6-0 .sui-wrap .sui-icon-link:before{content:"5"}.sui-2-6-0 .sui-wrap .sui-icon-unlink:before{content:"6"}.sui-2-6-0 .sui-wrap .sui-icon-paperclip:before{content:"A"}.sui-2-6-0 .sui-wrap .sui-icon-code:before{content:";"}.sui-2-6-0 .sui-wrap .sui-icon-color-pick-eyedropper:before{content:"\A5"}.sui-2-6-0 .sui-wrap .sui-icon-crop:before{content:"C"}.sui-2-6-0 .sui-wrap .sui-icon-paint-bucket:before{content:"\222B"}.sui-2-6-0 .sui-wrap .sui-icon-camera:before{content:"\D8"}.sui-2-6-0 .sui-wrap .sui-icon-photo-picture:before{content:"D"}.sui-2-6-0 .sui-wrap .sui-icon-animation-video:before{content:"F"}.sui-2-6-0 .sui-wrap .sui-icon-home:before{content:"J"}.sui-2-6-0 .sui-wrap .sui-icon-mail:before{content:"m"}.sui-2-6-0 .sui-wrap .sui-icon-send:before{content:"\201C"}.sui-2-6-0 .sui-wrap .sui-icon-phone:before{content:">"}.sui-2-6-0 .sui-wrap .sui-icon-pin:before{content:"\152"}.sui-2-6-0 .sui-wrap .sui-icon-post-pin:before{content:"\2C7"}.sui-2-6-0 .sui-wrap .sui-icon-calculator:before{content:"\A8"}.sui-2-6-0 .sui-wrap .sui-icon-element-checkbox:before{content:"\C5"}.sui-2-6-0 .sui-wrap .sui-icon-element-radio:before{content:"\CD"}.sui-2-6-0 .sui-wrap .sui-icon-element-select:before{content:"\CF"}.sui-2-6-0 .sui-wrap .sui-icon-element-number:before{content:"\DA"}.sui-2-6-0 .sui-wrap .sui-icon-recaptcha:before{content:"\2013"}.sui-2-6-0 .sui-wrap .sui-icon-folder:before{content:"\2D8"}.sui-2-6-0 .sui-wrap .sui-icon-folder-open:before{content:"\BB"}.sui-2-6-0 .sui-wrap .sui-icon-archive:before{content:"b"}.sui-2-6-0 .sui-wrap .sui-icon-book:before{content:"\2206"}.sui-2-6-0 .sui-wrap .sui-icon-page-multiple:before{content:"\E7"}.sui-2-6-0 .sui-wrap .sui-icon-layers:before{content:"\E6"}.sui-2-6-0 .sui-wrap .sui-icon-copy:before{content:"4"}.sui-2-6-0 .sui-wrap .sui-icon-graph-bar:before{content:"\C7"}.sui-2-6-0 .sui-wrap .sui-icon-graph-bar-2:before{content:"\2DB"}.sui-2-6-0 .sui-wrap .sui-icon-graph-line:before{content:"\A1"}.sui-2-6-0 .sui-wrap .sui-icon-tracking-disabled:before{content:"\20AC"}.sui-2-6-0 .sui-wrap .sui-icon-page:before{content:"\D2"}.sui-2-6-0 .sui-wrap .sui-icon-clipboard-notes:before{content:"\BF"}.sui-2-6-0 .sui-wrap .sui-icon-page-pdf:before{content:"\C6"}.sui-2-6-0 .sui-wrap .sui-icon-heart:before{content:"K"}.sui-2-6-0 .sui-wrap .sui-icon-star:before{content:"S"}.sui-2-6-0 .sui-wrap .sui-icon-plugin-2:before{content:"O"}.sui-2-6-0 .sui-wrap .sui-icon-brush:before{content:"~"}.sui-2-6-0 .sui-wrap .sui-icon-plug-connected:before{content:"R"}.sui-2-6-0 .sui-wrap .sui-icon-plug-disconnected:before{content:"."}.sui-2-6-0 .sui-wrap .sui-icon-power-on-off:before{content:"["}.sui-2-6-0 .sui-wrap .sui-icon-target:before{content:"\2260"}.sui-2-6-0 .sui-wrap .sui-icon-upload-cloud:before{content:"\A2"}.sui-2-6-0 .sui-wrap .sui-icon-download-cloud:before{content:"\A3"}.sui-2-6-0 .sui-wrap .sui-icon-cloud:before{content:"\2122"}.sui-2-6-0 .sui-wrap .sui-icon-cloud-migration:before{content:"l"}.sui-2-6-0 .sui-wrap .sui-icon-unpublish:before{content:"\2C6"}.sui-2-6-0 .sui-wrap .sui-icon-download:before{content:"X"}.sui-2-6-0 .sui-wrap .sui-icon-save:before{content:"\DF"}.sui-2-6-0 .sui-wrap .sui-icon-lightbulb:before{content:"L"}.sui-2-6-0 .sui-wrap .sui-icon-sitemap:before{content:"\B8"}.sui-2-6-0 .sui-wrap .sui-icon-storage-server-data:before{content:"\CE"}.sui-2-6-0 .sui-wrap .sui-icon-user-reputation-points:before{content:"E"}.sui-2-6-0 .sui-wrap .sui-icon-tablet-portrait:before{content:"]"}.sui-2-6-0 .sui-wrap .sui-icon-laptop:before{content:"\AB"}.sui-2-6-0 .sui-wrap .sui-icon-monitor:before{content:"$"}.sui-2-6-0 .sui-wrap .sui-icon-eye:before{content:"e"}.sui-2-6-0 .sui-wrap .sui-icon-eye-hide:before{content:"q"}.sui-2-6-0 .sui-wrap .sui-icon-update:before{content:"\AE"}.sui-2-6-0 .sui-wrap .sui-icon-refresh:before{content:"H"}.sui-2-6-0 .sui-wrap .sui-icon-undo:before{content:"\2030"}.sui-2-6-0 .sui-wrap .sui-icon-web-globe-world:before{content:"W"}.sui-2-6-0 .sui-wrap .sui-icon-flag:before{content:"|"}.sui-2-6-0 .sui-wrap .sui-icon-academy:before{content:"\3C0"}.sui-2-6-0 .sui-wrap .sui-icon-profile-male:before{content:"\B5"}.sui-2-6-0 .sui-wrap .sui-icon-community-people:before{content:"\2018"}.sui-2-6-0 .sui-wrap .sui-icon-help-support:before{content:"M"}.sui-2-6-0 .sui-wrap .sui-icon-gdpr:before{content:"\2211"}.sui-2-6-0 .sui-wrap .sui-icon-like:before{content:"j"}.sui-2-6-0 .sui-wrap .sui-icon-dislike:before{content:"k"}.sui-2-6-0 .sui-wrap .sui-icon-finger-point:before{content:"\2248"}.sui-2-6-0 .sui-wrap .sui-icon-open-new-window:before{content:"n"}.sui-2-6-0 .sui-wrap .sui-icon-reply:before{content:"r"}.sui-2-6-0 .sui-wrap .sui-icon-share:before{content:"s"}.sui-2-6-0 .sui-wrap .sui-icon-wordpress:before{content:"w"}.sui-2-6-0 .sui-wrap .sui-icon-social-facebook:before{content:"f"}.sui-2-6-0 .sui-wrap .sui-icon-social-twitter:before{content:"t"}.sui-2-6-0 .sui-wrap .sui-icon-social-linkedin:before{content:"i"}.sui-2-6-0 .sui-wrap .sui-icon-social-dropbox:before{content:"d"}.sui-2-6-0 .sui-wrap .sui-icon-social-drive:before{content:"v"}.sui-2-6-0 .sui-wrap .sui-icon-social-google-plus:before{content:"g"}.sui-2-6-0 .sui-wrap .sui-icon-social-youtube:before{content:"y"}.sui-2-6-0 .sui-wrap .sui-icon-instagram:before{content:"-"}.sui-2-6-0 .sui-wrap .sui-icon-cloudflare:before{content:"\D0"}.sui-2-6-0 .sui-wrap .sui-icon-social-github:before{content:"h"}.sui-2-6-0 .sui-wrap .sui-icon-wpmudev-logo:before{content:"\2039"}.sui-2-6-0 .sui-wrap .sui-icon-defender:before{content:"\B7"}.sui-2-6-0 .sui-wrap .sui-icon-smush:before{content:"\2021"}.sui-2-6-0 .sui-wrap .sui-icon-upfront:before{content:"\201A"}.sui-2-6-0 .sui-wrap .sui-icon-hummingbird:before{content:"\B0"}.sui-2-6-0 .sui-wrap .sui-icon-uptime:before{content:"\B1"}.sui-2-6-0 .sui-wrap .sui-icon-smart-crawl:before{content:"\2202"}.sui-2-6-0 .sui-wrap .sui-icon-forminator:before{content:"P"}.sui-2-6-0 .sui-wrap .sui-icon-shipper-anchor:before{content:"T"}.sui-2-6-0 .sui-wrap .sui-icon-snapshot:before{content:"\FB01"}.sui-2-6-0 .sui-wrap .sui-icon-hustle:before{content:"\2014"}.sui-2-6-0 .sui-wrap .sui-icon-performance:before{content:"U"}.sui-2-6-0 .sui-wrap .sui-icon-hub:before{content:"\FB02"}.sui-2-6-0 .sui-wrap .sui-icon-automate:before{content:"\2D9"}.sui-2-6-0 .sui-wrap .sui-icon-align-y-center:before{content:"*"}.sui-2-6-0 .sui-wrap .sui-icon-align-y-top:before{content:"\A7"}.sui-2-6-0 .sui-wrap .sui-icon-align-y-bottom:before{content:"\B6"}.sui-2-6-0 .sui-wrap .sui-icon-align-x-center:before{content:"\192"}.sui-2-6-0 .sui-wrap .sui-icon-align-x-right:before{content:"\2022"}.sui-2-6-0 .sui-wrap .sui-icon-align-x-left:before{content:"\E5"}.sui-2-6-0 .sui-wrap .sui-icon-logout:before{content:"\203A"}.sui-2-6-0 .sui-wrap .sui-button,.sui-2-6-0 .sui-wrap .sui-button-icon,.sui-2-6-0 .sui-wrap a.sui-button,.sui-2-6-0 .sui-wrap a.sui-button-icon,.sui-2-6-0 .sui-wrap button.sui-button,.sui-2-6-0 .sui-wrap button.sui-button-icon{cursor:pointer;display:inline-block;position:relative;margin:0;border:2px solid transparent;border-radius:4px;text-decoration:none;text-align:center;transition:all .3s ease}.sui-2-6-0 .sui-wrap .sui-button-icon .sui-loading,.sui-2-6-0 .sui-wrap .sui-button .sui-loading,.sui-2-6-0 .sui-wrap a.sui-button-icon .sui-loading,.sui-2-6-0 .sui-wrap a.sui-button .sui-loading,.sui-2-6-0 .sui-wrap button.sui-button-icon .sui-loading,.sui-2-6-0 .sui-wrap button.sui-button .sui-loading{width:16px;height:16px;display:none;-ms-flex-direction:column;flex-direction:column;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;position:absolute;margin:0}.sui-2-6-0 .sui-wrap .sui-button-icon .sui-loading:before,.sui-2-6-0 .sui-wrap .sui-button .sui-loading:before,.sui-2-6-0 .sui-wrap a.sui-button-icon .sui-loading:before,.sui-2-6-0 .sui-wrap a.sui-button .sui-loading:before,.sui-2-6-0 .sui-wrap button.sui-button-icon .sui-loading:before,.sui-2-6-0 .sui-wrap button.sui-button .sui-loading:before{display:block}.sui-2-6-0 .sui-wrap .sui-button-icon .sui-button-text-default,.sui-2-6-0 .sui-wrap .sui-button-icon .sui-loading-text,.sui-2-6-0 .sui-wrap .sui-button .sui-button-text-default,.sui-2-6-0 .sui-wrap .sui-button .sui-loading-text,.sui-2-6-0 .sui-wrap a.sui-button-icon .sui-button-text-default,.sui-2-6-0 .sui-wrap a.sui-button-icon .sui-loading-text,.sui-2-6-0 .sui-wrap a.sui-button .sui-button-text-default,.sui-2-6-0 .sui-wrap a.sui-button .sui-loading-text,.sui-2-6-0 .sui-wrap button.sui-button-icon .sui-button-text-default,.sui-2-6-0 .sui-wrap button.sui-button-icon .sui-loading-text,.sui-2-6-0 .sui-wrap button.sui-button .sui-button-text-default,.sui-2-6-0 .sui-wrap button.sui-button .sui-loading-text{display:block;pointer-events:none}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-button-icon .sui-button-text-default .sui-loading-text,.sui-2-6-0 .sui-wrap .sui-button-icon .sui-loading-text .sui-loading-text,.sui-2-6-0 .sui-wrap .sui-button .sui-button-text-default .sui-loading-text,.sui-2-6-0 .sui-wrap .sui-button .sui-loading-text .sui-loading-text,.sui-2-6-0 .sui-wrap a.sui-button-icon .sui-button-text-default .sui-loading-text,.sui-2-6-0 .sui-wrap a.sui-button-icon .sui-loading-text .sui-loading-text,.sui-2-6-0 .sui-wrap a.sui-button .sui-button-text-default .sui-loading-text,.sui-2-6-0 .sui-wrap a.sui-button .sui-loading-text .sui-loading-text,.sui-2-6-0 .sui-wrap button.sui-button-icon .sui-button-text-default .sui-loading-text,.sui-2-6-0 .sui-wrap button.sui-button-icon .sui-loading-text .sui-loading-text,.sui-2-6-0 .sui-wrap button.sui-button .sui-button-text-default .sui-loading-text,.sui-2-6-0 .sui-wrap button.sui-button .sui-loading-text .sui-loading-text{overflow:hidden;text-overflow:ellipsis}}.sui-2-6-0 .sui-wrap .sui-button-icon .sui-button-text-onload,.sui-2-6-0 .sui-wrap .sui-button .sui-button-text-onload,.sui-2-6-0 .sui-wrap a.sui-button-icon .sui-button-text-onload,.sui-2-6-0 .sui-wrap a.sui-button .sui-button-text-onload,.sui-2-6-0 .sui-wrap button.sui-button-icon .sui-button-text-onload,.sui-2-6-0 .sui-wrap button.sui-button .sui-button-text-onload{display:none}.sui-2-6-0 .sui-wrap .sui-button-icon [class*=sui-icon-],.sui-2-6-0 .sui-wrap .sui-button [class*=sui-icon-],.sui-2-6-0 .sui-wrap a.sui-button-icon [class*=sui-icon-],.sui-2-6-0 .sui-wrap a.sui-button [class*=sui-icon-],.sui-2-6-0 .sui-wrap button.sui-button-icon [class*=sui-icon-],.sui-2-6-0 .sui-wrap button.sui-button [class*=sui-icon-]{font-size:12px}.sui-2-6-0 .sui-wrap .sui-button-icon [class*=sui-icon-]:before,.sui-2-6-0 .sui-wrap .sui-button [class*=sui-icon-]:before,.sui-2-6-0 .sui-wrap a.sui-button-icon [class*=sui-icon-]:before,.sui-2-6-0 .sui-wrap a.sui-button [class*=sui-icon-]:before,.sui-2-6-0 .sui-wrap button.sui-button-icon [class*=sui-icon-]:before,.sui-2-6-0 .sui-wrap button.sui-button [class*=sui-icon-]:before{display:block;color:inherit}.sui-2-6-0 .sui-wrap .sui-button,.sui-2-6-0 .sui-wrap .sui-button-icon,.sui-2-6-0 .sui-wrap .sui-button-icon:active,.sui-2-6-0 .sui-wrap .sui-button-icon:focus,.sui-2-6-0 .sui-wrap .sui-button-icon:hover,.sui-2-6-0 .sui-wrap .sui-button:active,.sui-2-6-0 .sui-wrap .sui-button:focus,.sui-2-6-0 .sui-wrap .sui-button:hover,.sui-2-6-0 .sui-wrap a.sui-button,.sui-2-6-0 .sui-wrap a.sui-button-icon,.sui-2-6-0 .sui-wrap a.sui-button-icon:active,.sui-2-6-0 .sui-wrap a.sui-button-icon:focus,.sui-2-6-0 .sui-wrap a.sui-button-icon:hover,.sui-2-6-0 .sui-wrap a.sui-button:active,.sui-2-6-0 .sui-wrap a.sui-button:focus,.sui-2-6-0 .sui-wrap a.sui-button:hover,.sui-2-6-0 .sui-wrap button.sui-button,.sui-2-6-0 .sui-wrap button.sui-button-icon,.sui-2-6-0 .sui-wrap button.sui-button-icon:active,.sui-2-6-0 .sui-wrap button.sui-button-icon:focus,.sui-2-6-0 .sui-wrap button.sui-button-icon:hover,.sui-2-6-0 .sui-wrap button.sui-button:active,.sui-2-6-0 .sui-wrap button.sui-button:focus,.sui-2-6-0 .sui-wrap button.sui-button:hover{outline:none;box-shadow:none}.sui-2-6-0 .sui-wrap .sui-button-icon.disabled,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-onload,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-onload-text,.sui-2-6-0 .sui-wrap .sui-button-icon:disabled,.sui-2-6-0 .sui-wrap .sui-button-icon[disabled],.sui-2-6-0 .sui-wrap .sui-button.disabled,.sui-2-6-0 .sui-wrap .sui-button.sui-button-onload,.sui-2-6-0 .sui-wrap .sui-button.sui-button-onload-text,.sui-2-6-0 .sui-wrap .sui-button:disabled,.sui-2-6-0 .sui-wrap .sui-button[disabled],.sui-2-6-0 .sui-wrap a.sui-button-icon.disabled,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-onload,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-onload-text,.sui-2-6-0 .sui-wrap a.sui-button-icon:disabled,.sui-2-6-0 .sui-wrap a.sui-button-icon[disabled],.sui-2-6-0 .sui-wrap a.sui-button.disabled,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-onload,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-onload-text,.sui-2-6-0 .sui-wrap a.sui-button:disabled,.sui-2-6-0 .sui-wrap a.sui-button[disabled],.sui-2-6-0 .sui-wrap button.sui-button-icon.disabled,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-onload,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-onload-text,.sui-2-6-0 .sui-wrap button.sui-button-icon:disabled,.sui-2-6-0 .sui-wrap button.sui-button-icon[disabled],.sui-2-6-0 .sui-wrap button.sui-button.disabled,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-onload,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-onload-text,.sui-2-6-0 .sui-wrap button.sui-button:disabled,.sui-2-6-0 .sui-wrap button.sui-button[disabled]{cursor:default;pointer-events:none}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-onload,.sui-2-6-0 .sui-wrap .sui-button.sui-button-onload,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-onload,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-onload,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-onload,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-onload{pointer-events:none;display:-ms-inline-flexbox;display:inline-flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-onload .sui-loading,.sui-2-6-0 .sui-wrap .sui-button.sui-button-onload .sui-loading,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-onload .sui-loading,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-onload .sui-loading,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-onload .sui-loading,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-onload .sui-loading{display:-ms-flexbox;display:flex}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-onload .sui-loading-text,.sui-2-6-0 .sui-wrap .sui-button.sui-button-onload .sui-loading-text,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-onload .sui-loading-text,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-onload .sui-loading-text,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-onload .sui-loading-text,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-onload .sui-loading-text{opacity:0}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-onload-text,.sui-2-6-0 .sui-wrap .sui-button.sui-button-onload-text,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-onload-text,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-onload-text,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-onload-text,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-onload-text{pointer-events:none}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-onload-text .sui-button-text-default,.sui-2-6-0 .sui-wrap .sui-button.sui-button-onload-text .sui-button-text-default,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-onload-text .sui-button-text-default,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-onload-text .sui-button-text-default,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-onload-text .sui-button-text-default,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-onload-text .sui-button-text-default{display:none}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-onload-text .sui-button-text-onload,.sui-2-6-0 .sui-wrap .sui-button.sui-button-onload-text .sui-button-text-onload,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-onload-text .sui-button-text-onload,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-onload-text .sui-button-text-onload,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-onload-text .sui-button-text-onload,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-onload-text .sui-button-text-onload{display:block}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-onload-text .sui-button-text-onload .sui-loading,.sui-2-6-0 .sui-wrap .sui-button.sui-button-onload-text .sui-button-text-onload .sui-loading,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-onload-text .sui-button-text-onload .sui-loading,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-onload-text .sui-button-text-onload .sui-loading,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-onload-text .sui-button-text-onload .sui-loading,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-onload-text .sui-button-text-onload .sui-loading{width:auto;height:auto;display:inline-block;position:relative;vertical-align:unset;margin-right:4px}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-onload-text .sui-button-text-onload .sui-loading:before,.sui-2-6-0 .sui-wrap .sui-button.sui-button-onload-text .sui-button-text-onload .sui-loading:before,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-onload-text .sui-button-text-onload .sui-loading:before,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-onload-text .sui-button-text-onload .sui-loading:before,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-onload-text .sui-button-text-onload .sui-loading:before,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-onload-text .sui-button-text-onload .sui-loading:before{display:inline-block}.sui-2-6-0 .sui-wrap .sui-button-icon:not(:last-child),.sui-2-6-0 .sui-wrap .sui-button:not(:last-child),.sui-2-6-0 .sui-wrap a.sui-button-icon:not(:last-child),.sui-2-6-0 .sui-wrap a.sui-button:not(:last-child),.sui-2-6-0 .sui-wrap button.sui-button-icon:not(:last-child),.sui-2-6-0 .sui-wrap button.sui-button:not(:last-child){margin-right:10px}.sui-2-6-0 .sui-wrap .sui-button,.sui-2-6-0 .sui-wrap a.sui-button,.sui-2-6-0 .sui-wrap button.sui-button{width:auto;min-width:80px;padding:5px 14px;background-color:#888;color:#fff;font:500 12px/16px Roboto,Arial,sans-serif;letter-spacing:-.25px;text-transform:uppercase}.sui-2-6-0 .sui-wrap .sui-button [class*=sui-icon-],.sui-2-6-0 .sui-wrap a.sui-button [class*=sui-icon-],.sui-2-6-0 .sui-wrap button.sui-button [class*=sui-icon-]{vertical-align:middle}.sui-2-6-0 .sui-wrap .sui-button [class*=sui-icon-]:not(.sui-loading),.sui-2-6-0 .sui-wrap a.sui-button [class*=sui-icon-]:not(.sui-loading),.sui-2-6-0 .sui-wrap button.sui-button [class*=sui-icon-]:not(.sui-loading){width:22px;position:relative;top:-1px;margin-left:-7px}.sui-2-6-0 .sui-wrap .sui-button:active,.sui-2-6-0 .sui-wrap .sui-button:hover,.sui-2-6-0 .sui-wrap a.sui-button:active,.sui-2-6-0 .sui-wrap a.sui-button:hover,.sui-2-6-0 .sui-wrap button.sui-button:active,.sui-2-6-0 .sui-wrap button.sui-button:hover{background-color:#6f6f6f}.sui-2-6-0 .sui-wrap .sui-button.disabled,.sui-2-6-0 .sui-wrap .sui-button.sui-button-onload,.sui-2-6-0 .sui-wrap .sui-button.sui-button-onload-text,.sui-2-6-0 .sui-wrap .sui-button:disabled,.sui-2-6-0 .sui-wrap .sui-button[disabled],.sui-2-6-0 .sui-wrap a.sui-button.disabled,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-onload,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-onload-text,.sui-2-6-0 .sui-wrap a.sui-button:disabled,.sui-2-6-0 .sui-wrap a.sui-button[disabled],.sui-2-6-0 .sui-wrap button.sui-button.disabled,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-onload,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-onload-text,.sui-2-6-0 .sui-wrap button.sui-button:disabled,.sui-2-6-0 .sui-wrap button.sui-button[disabled]{background-color:#e6e6e6;color:#aaa}.sui-2-6-0 .sui-wrap .sui-button.sui-button-icon-right [class*=sui-icon-]:not(.sui-loading),.sui-2-6-0 .sui-wrap a.sui-button.sui-button-icon-right [class*=sui-icon-]:not(.sui-loading),.sui-2-6-0 .sui-wrap button.sui-button.sui-button-icon-right [class*=sui-icon-]:not(.sui-loading){margin-right:-7px;margin-left:0}.sui-2-6-0 .sui-wrap .sui-button.sui-button-blue,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-blue,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-blue{background-color:#17a8e3;color:#fff}.sui-2-6-0 .sui-wrap .sui-button.sui-button-blue:active,.sui-2-6-0 .sui-wrap .sui-button.sui-button-blue:hover,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-blue:active,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-blue:hover,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-blue:active,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-blue:hover{background-color:#1286b5}.sui-2-6-0 .sui-wrap .sui-button.sui-button-blue.disabled,.sui-2-6-0 .sui-wrap .sui-button.sui-button-blue.sui-button-onload,.sui-2-6-0 .sui-wrap .sui-button.sui-button-blue.sui-button-onload-text,.sui-2-6-0 .sui-wrap .sui-button.sui-button-blue:disabled,.sui-2-6-0 .sui-wrap .sui-button.sui-button-blue[disabled],.sui-2-6-0 .sui-wrap a.sui-button.sui-button-blue.disabled,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-blue.sui-button-onload,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-blue.sui-button-onload-text,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-blue:disabled,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-blue[disabled],.sui-2-6-0 .sui-wrap button.sui-button.sui-button-blue.disabled,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-blue.sui-button-onload,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-blue.sui-button-onload-text,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-blue:disabled,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-blue[disabled]{background-color:#e6e6e6;color:#aaa}.sui-2-6-0 .sui-wrap .sui-button.sui-button-green,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-green,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-green{background-color:#1abc9c;color:#fff}.sui-2-6-0 .sui-wrap .sui-button.sui-button-green:active,.sui-2-6-0 .sui-wrap .sui-button.sui-button-green:hover,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-green:active,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-green:hover,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-green:active,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-green:hover{background-color:#148f77}.sui-2-6-0 .sui-wrap .sui-button.sui-button-green.disabled,.sui-2-6-0 .sui-wrap .sui-button.sui-button-green.sui-button-onload,.sui-2-6-0 .sui-wrap .sui-button.sui-button-green.sui-button-onload-text,.sui-2-6-0 .sui-wrap .sui-button.sui-button-green:disabled,.sui-2-6-0 .sui-wrap .sui-button.sui-button-green[disabled],.sui-2-6-0 .sui-wrap a.sui-button.sui-button-green.disabled,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-green.sui-button-onload,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-green.sui-button-onload-text,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-green:disabled,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-green[disabled],.sui-2-6-0 .sui-wrap button.sui-button.sui-button-green.disabled,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-green.sui-button-onload,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-green.sui-button-onload-text,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-green:disabled,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-green[disabled]{background-color:#e6e6e6;color:#aaa}.sui-2-6-0 .sui-wrap .sui-button.sui-button-red,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-red,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-red{background-color:#ff6d6d;color:#fff}.sui-2-6-0 .sui-wrap .sui-button.sui-button-red:active,.sui-2-6-0 .sui-wrap .sui-button.sui-button-red:hover,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-red:active,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-red:hover,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-red:active,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-red:hover{background-color:#ff3a3a}.sui-2-6-0 .sui-wrap .sui-button.sui-button-red.disabled,.sui-2-6-0 .sui-wrap .sui-button.sui-button-red.sui-button-onload,.sui-2-6-0 .sui-wrap .sui-button.sui-button-red.sui-button-onload-text,.sui-2-6-0 .sui-wrap .sui-button.sui-button-red:disabled,.sui-2-6-0 .sui-wrap .sui-button.sui-button-red[disabled],.sui-2-6-0 .sui-wrap a.sui-button.sui-button-red.disabled,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-red.sui-button-onload,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-red.sui-button-onload-text,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-red:disabled,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-red[disabled],.sui-2-6-0 .sui-wrap button.sui-button.sui-button-red.disabled,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-red.sui-button-onload,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-red.sui-button-onload-text,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-red:disabled,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-red[disabled]{background-color:#e6e6e6;color:#aaa}.sui-2-6-0 .sui-wrap .sui-button.sui-button-orange,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-orange,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-orange{background-color:#ff7e41;color:#fff}.sui-2-6-0 .sui-wrap .sui-button.sui-button-orange:active,.sui-2-6-0 .sui-wrap .sui-button.sui-button-orange:hover,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-orange:active,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-orange:hover,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-orange:active,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-orange:hover{background-color:#ff5b0e}.sui-2-6-0 .sui-wrap .sui-button.sui-button-orange.disabled,.sui-2-6-0 .sui-wrap .sui-button.sui-button-orange.sui-button-onload,.sui-2-6-0 .sui-wrap .sui-button.sui-button-orange.sui-button-onload-text,.sui-2-6-0 .sui-wrap .sui-button.sui-button-orange:disabled,.sui-2-6-0 .sui-wrap .sui-button.sui-button-orange[disabled],.sui-2-6-0 .sui-wrap a.sui-button.sui-button-orange.disabled,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-orange.sui-button-onload,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-orange.sui-button-onload-text,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-orange:disabled,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-orange[disabled],.sui-2-6-0 .sui-wrap button.sui-button.sui-button-orange.disabled,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-orange.sui-button-onload,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-orange.sui-button-onload-text,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-orange:disabled,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-orange[disabled]{background-color:#e6e6e6;color:#aaa}.sui-2-6-0 .sui-wrap .sui-button.sui-button-yellow,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-yellow,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-yellow{background-color:#fecf2f;color:#333}.sui-2-6-0 .sui-wrap .sui-button.sui-button-yellow:active,.sui-2-6-0 .sui-wrap .sui-button.sui-button-yellow:hover,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-yellow:active,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-yellow:hover,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-yellow:active,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-yellow:hover{background-color:#f9c101}.sui-2-6-0 .sui-wrap .sui-button.sui-button-yellow.disabled,.sui-2-6-0 .sui-wrap .sui-button.sui-button-yellow.sui-button-onload,.sui-2-6-0 .sui-wrap .sui-button.sui-button-yellow.sui-button-onload-text,.sui-2-6-0 .sui-wrap .sui-button.sui-button-yellow:disabled,.sui-2-6-0 .sui-wrap .sui-button.sui-button-yellow[disabled],.sui-2-6-0 .sui-wrap a.sui-button.sui-button-yellow.disabled,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-yellow.sui-button-onload,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-yellow.sui-button-onload-text,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-yellow:disabled,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-yellow[disabled],.sui-2-6-0 .sui-wrap button.sui-button.sui-button-yellow.disabled,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-yellow.sui-button-onload,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-yellow.sui-button-onload-text,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-yellow:disabled,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-yellow[disabled]{background-color:#e6e6e6;color:#aaa}.sui-2-6-0 .sui-wrap .sui-button.sui-button-purple,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-purple,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-purple{color:#fff}.sui-2-6-0 .sui-wrap .sui-button.sui-button-purple:active,.sui-2-6-0 .sui-wrap .sui-button.sui-button-purple:hover,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-purple:active,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-purple:hover,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-purple:active,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-purple:hover{background-color:#64007e}.sui-2-6-0 .sui-wrap .sui-button.sui-button-purple.disabled,.sui-2-6-0 .sui-wrap .sui-button.sui-button-purple.sui-button-onload,.sui-2-6-0 .sui-wrap .sui-button.sui-button-purple.sui-button-onload-text,.sui-2-6-0 .sui-wrap .sui-button.sui-button-purple:disabled,.sui-2-6-0 .sui-wrap .sui-button.sui-button-purple[disabled],.sui-2-6-0 .sui-wrap a.sui-button.sui-button-purple.disabled,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-purple.sui-button-onload,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-purple.sui-button-onload-text,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-purple:disabled,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-purple[disabled],.sui-2-6-0 .sui-wrap button.sui-button.sui-button-purple.disabled,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-purple.sui-button-onload,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-purple.sui-button-onload-text,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-purple:disabled,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-purple[disabled]{background-color:#e6e6e6;color:#aaa}.sui-2-6-0 .sui-wrap .sui-button.sui-button-upsell,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-upsell,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-upsell{width:auto;height:26px;padding:4px 14px;border-color:#d1f1ea;border-radius:14px;background-color:transparent;color:#1abc9c;line-height:14px;text-transform:none}.sui-2-6-0 .sui-wrap .sui-button.sui-button-upsell:active,.sui-2-6-0 .sui-wrap .sui-button.sui-button-upsell:hover,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-upsell:active,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-upsell:hover,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-upsell:active,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-upsell:hover{opacity:1;border-color:#1abc9c;background-color:#1abc9c;color:#fff}.sui-2-6-0 .sui-wrap .sui-button.sui-button-dashed,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-dashed,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-dashed{width:100%;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;border:1px dashed #aaa;background-color:transparent;color:#888;line-height:18px}.sui-2-6-0 .sui-wrap .sui-button.sui-button-dashed.sui-lg,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-dashed.sui-lg,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-dashed.sui-lg{height:70px}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-button.sui-button-dashed,.sui-2-6-0 .sui-wrap .sui-button.sui-button-dashed.sui-lg,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-dashed,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-dashed.sui-lg,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-dashed,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-dashed.sui-lg{height:50px}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-button.sui-button-dashed,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-dashed,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-dashed{height:60px}}.sui-2-6-0 .sui-wrap .sui-button.sui-button-ghost,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-ghost,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-ghost{border-color:#ddd;background-color:transparent;color:#888}.sui-2-6-0 .sui-wrap .sui-button.sui-button-ghost:active,.sui-2-6-0 .sui-wrap .sui-button.sui-button-ghost:hover,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-ghost:active,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-ghost:hover,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-ghost:active,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-ghost:hover{border-color:#888;background-color:#888;color:#fff}.sui-2-6-0 .sui-wrap .sui-button.sui-button-ghost.disabled,.sui-2-6-0 .sui-wrap .sui-button.sui-button-ghost.sui-button-onload,.sui-2-6-0 .sui-wrap .sui-button.sui-button-ghost.sui-button-onload-text,.sui-2-6-0 .sui-wrap .sui-button.sui-button-ghost:disabled,.sui-2-6-0 .sui-wrap .sui-button.sui-button-ghost[disabled],.sui-2-6-0 .sui-wrap a.sui-button.sui-button-ghost.disabled,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-ghost.sui-button-onload,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-ghost.sui-button-onload-text,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-ghost:disabled,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-ghost[disabled],.sui-2-6-0 .sui-wrap button.sui-button.sui-button-ghost.disabled,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-ghost.sui-button-onload,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-ghost.sui-button-onload-text,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-ghost:disabled,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-ghost[disabled]{border-color:#e6e6e6;background-color:#e6e6e6;color:#aaa}.sui-2-6-0 .sui-wrap .sui-button.sui-button-ghost.sui-button-blue,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-ghost.sui-button-blue,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-ghost.sui-button-blue{border-color:#e1f6ff;color:#17a8e3}.sui-2-6-0 .sui-wrap .sui-button.sui-button-ghost.sui-button-blue:active,.sui-2-6-0 .sui-wrap .sui-button.sui-button-ghost.sui-button-blue:hover,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-ghost.sui-button-blue:active,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-ghost.sui-button-blue:hover,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-ghost.sui-button-blue:active,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-ghost.sui-button-blue:hover{border-color:#17a8e3;background-color:#17a8e3;color:#fff}.sui-2-6-0 .sui-wrap .sui-button.sui-button-ghost.sui-button-blue.disabled,.sui-2-6-0 .sui-wrap .sui-button.sui-button-ghost.sui-button-blue.sui-button-onload,.sui-2-6-0 .sui-wrap .sui-button.sui-button-ghost.sui-button-blue:disabled,.sui-2-6-0 .sui-wrap .sui-button.sui-button-ghost.sui-button-blue[disabled],.sui-2-6-0 .sui-wrap a.sui-button.sui-button-ghost.sui-button-blue.disabled,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-ghost.sui-button-blue.sui-button-onload,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-ghost.sui-button-blue:disabled,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-ghost.sui-button-blue[disabled],.sui-2-6-0 .sui-wrap button.sui-button.sui-button-ghost.sui-button-blue.disabled,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-ghost.sui-button-blue.sui-button-onload,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-ghost.sui-button-blue:disabled,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-ghost.sui-button-blue[disabled]{border-color:#e6e6e6;background-color:#e6e6e6;color:#aaa}.sui-2-6-0 .sui-wrap .sui-button.sui-button-ghost.sui-button-green,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-ghost.sui-button-green,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-ghost.sui-button-green{border-color:#d1f1ea;color:#1abc9c}.sui-2-6-0 .sui-wrap .sui-button.sui-button-ghost.sui-button-green:active,.sui-2-6-0 .sui-wrap .sui-button.sui-button-ghost.sui-button-green:hover,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-ghost.sui-button-green:active,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-ghost.sui-button-green:hover,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-ghost.sui-button-green:active,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-ghost.sui-button-green:hover{border-color:#1abc9c;background-color:#1abc9c;color:#fff}.sui-2-6-0 .sui-wrap .sui-button.sui-button-ghost.sui-button-green.disabled,.sui-2-6-0 .sui-wrap .sui-button.sui-button-ghost.sui-button-green.sui-button-onload,.sui-2-6-0 .sui-wrap .sui-button.sui-button-ghost.sui-button-green:disabled,.sui-2-6-0 .sui-wrap .sui-button.sui-button-ghost.sui-button-green[disabled],.sui-2-6-0 .sui-wrap a.sui-button.sui-button-ghost.sui-button-green.disabled,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-ghost.sui-button-green.sui-button-onload,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-ghost.sui-button-green:disabled,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-ghost.sui-button-green[disabled],.sui-2-6-0 .sui-wrap button.sui-button.sui-button-ghost.sui-button-green.disabled,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-ghost.sui-button-green.sui-button-onload,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-ghost.sui-button-green:disabled,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-ghost.sui-button-green[disabled]{border-color:#e6e6e6;background-color:#e6e6e6;color:#aaa}.sui-2-6-0 .sui-wrap .sui-button.sui-button-ghost.sui-button-red,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-ghost.sui-button-red,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-ghost.sui-button-red{border-color:#ffe5e9;color:#ff6d6d}.sui-2-6-0 .sui-wrap .sui-button.sui-button-ghost.sui-button-red:active,.sui-2-6-0 .sui-wrap .sui-button.sui-button-ghost.sui-button-red:hover,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-ghost.sui-button-red:active,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-ghost.sui-button-red:hover,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-ghost.sui-button-red:active,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-ghost.sui-button-red:hover{border-color:#ff6d6d;background-color:#ff6d6d;color:#fff}.sui-2-6-0 .sui-wrap .sui-button.sui-button-ghost.sui-button-red.disabled,.sui-2-6-0 .sui-wrap .sui-button.sui-button-ghost.sui-button-red.sui-button-onload,.sui-2-6-0 .sui-wrap .sui-button.sui-button-ghost.sui-button-red:disabled,.sui-2-6-0 .sui-wrap .sui-button.sui-button-ghost.sui-button-red[disabled],.sui-2-6-0 .sui-wrap a.sui-button.sui-button-ghost.sui-button-red.disabled,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-ghost.sui-button-red.sui-button-onload,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-ghost.sui-button-red:disabled,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-ghost.sui-button-red[disabled],.sui-2-6-0 .sui-wrap button.sui-button.sui-button-ghost.sui-button-red.disabled,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-ghost.sui-button-red.sui-button-onload,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-ghost.sui-button-red:disabled,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-ghost.sui-button-red[disabled]{border-color:#e6e6e6;background-color:#e6e6e6;color:#aaa}.sui-2-6-0 .sui-wrap .sui-button.sui-button-ghost.sui-button-orange,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-ghost.sui-button-orange,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-ghost.sui-button-orange{border-color:#ffe5d9;color:#ff7e41}.sui-2-6-0 .sui-wrap .sui-button.sui-button-ghost.sui-button-orange:active,.sui-2-6-0 .sui-wrap .sui-button.sui-button-ghost.sui-button-orange:hover,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-ghost.sui-button-orange:active,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-ghost.sui-button-orange:hover,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-ghost.sui-button-orange:active,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-ghost.sui-button-orange:hover{border-color:#ff7e41;background-color:#ff7e41;color:#fff}.sui-2-6-0 .sui-wrap .sui-button.sui-button-ghost.sui-button-orange.disabled,.sui-2-6-0 .sui-wrap .sui-button.sui-button-ghost.sui-button-orange.sui-button-onload,.sui-2-6-0 .sui-wrap .sui-button.sui-button-ghost.sui-button-orange:disabled,.sui-2-6-0 .sui-wrap .sui-button.sui-button-ghost.sui-button-orange[disabled],.sui-2-6-0 .sui-wrap a.sui-button.sui-button-ghost.sui-button-orange.disabled,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-ghost.sui-button-orange.sui-button-onload,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-ghost.sui-button-orange:disabled,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-ghost.sui-button-orange[disabled],.sui-2-6-0 .sui-wrap button.sui-button.sui-button-ghost.sui-button-orange.disabled,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-ghost.sui-button-orange.sui-button-onload,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-ghost.sui-button-orange:disabled,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-ghost.sui-button-orange[disabled]{border-color:#e6e6e6;background-color:#e6e6e6;color:#aaa}.sui-2-6-0 .sui-wrap .sui-button.sui-button-ghost.sui-button-yellow,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-ghost.sui-button-yellow,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-ghost.sui-button-yellow{border-color:#fff5d5;color:#fecf2f}.sui-2-6-0 .sui-wrap .sui-button.sui-button-ghost.sui-button-yellow:active,.sui-2-6-0 .sui-wrap .sui-button.sui-button-ghost.sui-button-yellow:hover,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-ghost.sui-button-yellow:active,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-ghost.sui-button-yellow:hover,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-ghost.sui-button-yellow:active,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-ghost.sui-button-yellow:hover{border-color:#fecf2f;background-color:#fecf2f;color:#333}.sui-2-6-0 .sui-wrap .sui-button.sui-button-ghost.sui-button-yellow.disabled,.sui-2-6-0 .sui-wrap .sui-button.sui-button-ghost.sui-button-yellow.sui-button-onload,.sui-2-6-0 .sui-wrap .sui-button.sui-button-ghost.sui-button-yellow:disabled,.sui-2-6-0 .sui-wrap .sui-button.sui-button-ghost.sui-button-yellow[disabled],.sui-2-6-0 .sui-wrap a.sui-button.sui-button-ghost.sui-button-yellow.disabled,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-ghost.sui-button-yellow.sui-button-onload,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-ghost.sui-button-yellow:disabled,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-ghost.sui-button-yellow[disabled],.sui-2-6-0 .sui-wrap button.sui-button.sui-button-ghost.sui-button-yellow.disabled,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-ghost.sui-button-yellow.sui-button-onload,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-ghost.sui-button-yellow:disabled,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-ghost.sui-button-yellow[disabled]{border-color:#e6e6e6;background-color:#e6e6e6;color:#aaa}.sui-2-6-0 .sui-wrap .sui-button.sui-button-ghost.sui-button-purple,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-ghost.sui-button-purple,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-ghost.sui-button-purple{border-color:#f9e1ff;color:#8d00b1}.sui-2-6-0 .sui-wrap .sui-button.sui-button-ghost.sui-button-purple:active,.sui-2-6-0 .sui-wrap .sui-button.sui-button-ghost.sui-button-purple:hover,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-ghost.sui-button-purple:active,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-ghost.sui-button-purple:hover,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-ghost.sui-button-purple:active,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-ghost.sui-button-purple:hover{border-color:#8d00b1;background-color:#8d00b1;color:#fff}.sui-2-6-0 .sui-wrap .sui-button.sui-button-ghost.sui-button-purple.disabled,.sui-2-6-0 .sui-wrap .sui-button.sui-button-ghost.sui-button-purple.sui-button-onload,.sui-2-6-0 .sui-wrap .sui-button.sui-button-ghost.sui-button-purple:disabled,.sui-2-6-0 .sui-wrap .sui-button.sui-button-ghost.sui-button-purple[disabled],.sui-2-6-0 .sui-wrap a.sui-button.sui-button-ghost.sui-button-purple.disabled,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-ghost.sui-button-purple.sui-button-onload,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-ghost.sui-button-purple:disabled,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-ghost.sui-button-purple[disabled],.sui-2-6-0 .sui-wrap button.sui-button.sui-button-ghost.sui-button-purple.disabled,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-ghost.sui-button-purple.sui-button-onload,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-ghost.sui-button-purple:disabled,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-ghost.sui-button-purple[disabled]{border-color:#e6e6e6;background-color:#e6e6e6;color:#aaa}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-button.sui-button-compound .sui-compound-desktop,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-compound .sui-compound-desktop,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-compound .sui-compound-desktop{display:none}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-button.sui-button-compound .sui-compound-desktop,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-compound .sui-compound-desktop,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-compound .sui-compound-desktop{display:block}}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-button.sui-button-compound .sui-compound-mobile [class*=sui-icon-],.sui-2-6-0 .sui-wrap a.sui-button.sui-button-compound .sui-compound-mobile [class*=sui-icon-],.sui-2-6-0 .sui-wrap button.sui-button.sui-button-compound .sui-compound-mobile [class*=sui-icon-]{margin-right:0;margin-left:0}}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-button.sui-button-compound .sui-compound-mobile,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-compound .sui-compound-mobile,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-compound .sui-compound-mobile{display:block}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-button.sui-button-compound .sui-compound-mobile,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-compound .sui-compound-mobile,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-compound .sui-compound-mobile{display:none}}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-button.sui-button-compound,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-compound,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-compound{min-width:44px;padding-right:5px;padding-left:5px}}.sui-2-6-0 .sui-wrap .sui-button.sui-button-lg,.sui-2-6-0 .sui-wrap a.sui-button.sui-button-lg,.sui-2-6-0 .sui-wrap button.sui-button.sui-button-lg{padding:8px 20px;font-size:15px;line-height:20px}.sui-2-6-0 .sui-wrap .sui-button.sui-button-lg [class*=sui-icon-],.sui-2-6-0 .sui-wrap a.sui-button.sui-button-lg [class*=sui-icon-],.sui-2-6-0 .sui-wrap button.sui-button.sui-button-lg [class*=sui-icon-]{font-size:16px}.sui-2-6-0 .sui-wrap .sui-button-icon,.sui-2-6-0 .sui-wrap a.sui-button-icon,.sui-2-6-0 .sui-wrap button.sui-button-icon{width:30px;height:30px;display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;padding:0 4px;border-width:1px;background-color:transparent;color:#888;text-align:center;white-space:nowrap}.sui-2-6-0 .sui-wrap .sui-button-icon [class*=sui-icon-]:not(.sui-loading),.sui-2-6-0 .sui-wrap a.sui-button-icon [class*=sui-icon-]:not(.sui-loading),.sui-2-6-0 .sui-wrap button.sui-button-icon [class*=sui-icon-]:not(.sui-loading){display:block}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-active,.sui-2-6-0 .sui-wrap .sui-button-icon:active,.sui-2-6-0 .sui-wrap .sui-button-icon:hover,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-active,.sui-2-6-0 .sui-wrap a.sui-button-icon:active,.sui-2-6-0 .sui-wrap a.sui-button-icon:hover,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-active,.sui-2-6-0 .sui-wrap button.sui-button-icon:active,.sui-2-6-0 .sui-wrap button.sui-button-icon:hover{background-color:#f2f2f2;color:#333}.sui-2-6-0 .sui-wrap .sui-button-icon.disabled,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-onload,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-onload-text,.sui-2-6-0 .sui-wrap .sui-button-icon:disabled,.sui-2-6-0 .sui-wrap .sui-button-icon[disabled],.sui-2-6-0 .sui-wrap a.sui-button-icon.disabled,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-onload,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-onload-text,.sui-2-6-0 .sui-wrap a.sui-button-icon:disabled,.sui-2-6-0 .sui-wrap a.sui-button-icon[disabled],.sui-2-6-0 .sui-wrap button.sui-button-icon.disabled,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-onload,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-onload-text,.sui-2-6-0 .sui-wrap button.sui-button-icon:disabled,.sui-2-6-0 .sui-wrap button.sui-button-icon[disabled]{color:#aaa;background-color:#e6e6e6}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-blue,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-blue,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-blue{color:#17a8e3}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-blue.sui-active,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-blue:active,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-blue:hover,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-blue.sui-active,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-blue:active,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-blue:hover,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-blue.sui-active,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-blue:active,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-blue:hover{background-color:#e1f6ff;color:#17a8e3}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-blue.disabled,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-blue.sui-button-onload,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-blue.sui-button-onload-text,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-blue:disabled,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-blue[disabled],.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-blue.disabled,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-blue.sui-button-onload,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-blue.sui-button-onload-text,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-blue:disabled,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-blue[disabled],.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-blue.disabled,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-blue.sui-button-onload,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-blue.sui-button-onload-text,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-blue:disabled,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-blue[disabled]{color:#aaa;background-color:#e6e6e6}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-green,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-green,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-green{color:#1abc9c}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-green.sui-active,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-green:active,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-green:hover,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-green.sui-active,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-green:active,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-green:hover,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-green.sui-active,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-green:active,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-green:hover{background-color:#d1f1ea;color:#1abc9c}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-green.disabled,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-green.sui-button-onload,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-green.sui-button-onload-text,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-green:disabled,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-green[disabled],.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-green.disabled,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-green.sui-button-onload,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-green.sui-button-onload-text,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-green:disabled,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-green[disabled],.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-green.disabled,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-green.sui-button-onload,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-green.sui-button-onload-text,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-green:disabled,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-green[disabled]{color:#aaa;background-color:#e6e6e6}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-red,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-red,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-red{color:#ff6d6d}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-red.sui-active,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-red:active,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-red:hover,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-red.sui-active,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-red:active,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-red:hover,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-red.sui-active,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-red:active,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-red:hover{background-color:#ffe5e9;color:#ff6d6d}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-red.disabled,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-red.sui-button-onload,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-red.sui-button-onload-text,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-red:disabled,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-red[disabled],.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-red.disabled,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-red.sui-button-onload,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-red.sui-button-onload-text,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-red:disabled,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-red[disabled],.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-red.disabled,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-red.sui-button-onload,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-red.sui-button-onload-text,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-red:disabled,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-red[disabled]{color:#aaa;background-color:#e6e6e6}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-orange,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-orange,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-orange{color:#ff7e41}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-orange.sui-active,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-orange:active,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-orange:hover,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-orange.sui-active,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-orange:active,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-orange:hover,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-orange.sui-active,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-orange:active,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-orange:hover{background-color:#ffe5d9;color:#ff7e41}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-orange.disabled,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-orange.sui-button-onload,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-orange.sui-button-onload-text,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-orange:disabled,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-orange[disabled],.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-orange.disabled,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-orange.sui-button-onload,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-orange.sui-button-onload-text,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-orange:disabled,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-orange[disabled],.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-orange.disabled,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-orange.sui-button-onload,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-orange.sui-button-onload-text,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-orange:disabled,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-orange[disabled]{color:#aaa;background-color:#e6e6e6}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-yellow,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-yellow,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-yellow{color:#fecf2f}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-yellow.sui-active,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-yellow:active,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-yellow:hover,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-yellow.sui-active,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-yellow:active,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-yellow:hover,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-yellow.sui-active,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-yellow:active,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-yellow:hover{background-color:#fff5d5;color:#fecf2f}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-yellow.disabled,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-yellow.sui-button-onload,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-yellow.sui-button-onload-text,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-yellow:disabled,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-yellow[disabled],.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-yellow.disabled,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-yellow.sui-button-onload,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-yellow.sui-button-onload-text,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-yellow:disabled,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-yellow[disabled],.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-yellow.disabled,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-yellow.sui-button-onload,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-yellow.sui-button-onload-text,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-yellow:disabled,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-yellow[disabled]{color:#aaa;background-color:#e6e6e6}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-purple,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-purple,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-purple{color:#8d00b1}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-purple.sui-active,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-purple:active,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-purple:hover,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-purple.sui-active,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-purple:active,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-purple:hover,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-purple.sui-active,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-purple:active,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-purple:hover{background-color:#f9e1ff;color:#8d00b1}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-purple.disabled,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-purple.sui-button-onload,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-purple.sui-button-onload-text,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-purple:disabled,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-purple[disabled],.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-purple.disabled,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-purple.sui-button-onload,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-purple.sui-button-onload-text,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-purple:disabled,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-purple[disabled],.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-purple.disabled,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-purple.sui-button-onload,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-purple.sui-button-onload-text,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-purple:disabled,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-purple[disabled]{color:#aaa;background-color:#e6e6e6}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined{width:44px;border-color:#ddd}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined.sui-active,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined:active,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined:hover,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined.sui-active,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined:active,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined:hover,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined.sui-active,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined:active,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined:hover{border-color:#888;background-color:#888;color:#fff}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined.disabled,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined.sui-button-onload,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined.sui-button-onload-text,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined:disabled,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined[disabled],.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined.disabled,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined.sui-button-onload,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined.sui-button-onload-text,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined:disabled,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined[disabled],.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined.disabled,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined.sui-button-onload,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined.sui-button-onload-text,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined:disabled,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined[disabled]{border-color:#e6e6e6}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined.sui-button-blue,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined.sui-button-blue,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined.sui-button-blue{border-color:#e1f6ff}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined.sui-button-blue.sui-active,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined.sui-button-blue:active,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined.sui-button-blue:hover,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined.sui-button-blue.sui-active,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined.sui-button-blue:active,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined.sui-button-blue:hover,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined.sui-button-blue.sui-active,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined.sui-button-blue:active,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined.sui-button-blue:hover{border-color:#17a8e3;background-color:#17a8e3;color:#fff}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined.sui-button-blue.disabled,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined.sui-button-blue.sui-button-onload,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined.sui-button-blue.sui-button-onload-text,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined.sui-button-blue:disabled,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined.sui-button-blue[disabled],.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined.sui-button-blue.disabled,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined.sui-button-blue.sui-button-onload,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined.sui-button-blue.sui-button-onload-text,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined.sui-button-blue:disabled,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined.sui-button-blue[disabled],.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined.sui-button-blue.disabled,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined.sui-button-blue.sui-button-onload,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined.sui-button-blue.sui-button-onload-text,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined.sui-button-blue:disabled,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined.sui-button-blue[disabled]{border-color:#e6e6e6}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined.sui-button-green,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined.sui-button-green,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined.sui-button-green{border-color:#d1f1ea}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined.sui-button-green.sui-active,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined.sui-button-green:active,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined.sui-button-green:hover,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined.sui-button-green.sui-active,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined.sui-button-green:active,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined.sui-button-green:hover,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined.sui-button-green.sui-active,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined.sui-button-green:active,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined.sui-button-green:hover{border-color:#1abc9c;background-color:#1abc9c;color:#fff}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined.sui-button-green.disabled,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined.sui-button-green.sui-button-onload,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined.sui-button-green.sui-button-onload-text,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined.sui-button-green:disabled,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined.sui-button-green[disabled],.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined.sui-button-green.disabled,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined.sui-button-green.sui-button-onload,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined.sui-button-green.sui-button-onload-text,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined.sui-button-green:disabled,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined.sui-button-green[disabled],.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined.sui-button-green.disabled,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined.sui-button-green.sui-button-onload,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined.sui-button-green.sui-button-onload-text,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined.sui-button-green:disabled,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined.sui-button-green[disabled]{border-color:#e6e6e6}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined.sui-button-red,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined.sui-button-red,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined.sui-button-red{border-color:#ffe5e9}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined.sui-button-red.sui-active,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined.sui-button-red:active,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined.sui-button-red:hover,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined.sui-button-red.sui-active,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined.sui-button-red:active,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined.sui-button-red:hover,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined.sui-button-red.sui-active,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined.sui-button-red:active,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined.sui-button-red:hover{border-color:#ff6d6d;background-color:#ff6d6d;color:#fff}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined.sui-button-red.disabled,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined.sui-button-red.sui-button-onload,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined.sui-button-red.sui-button-onload-text,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined.sui-button-red:disabled,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined.sui-button-red[disabled],.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined.sui-button-red.disabled,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined.sui-button-red.sui-button-onload,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined.sui-button-red.sui-button-onload-text,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined.sui-button-red:disabled,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined.sui-button-red[disabled],.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined.sui-button-red.disabled,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined.sui-button-red.sui-button-onload,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined.sui-button-red.sui-button-onload-text,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined.sui-button-red:disabled,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined.sui-button-red[disabled]{border-color:#e6e6e6}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined.sui-button-orange,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined.sui-button-orange,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined.sui-button-orange{border-color:#ffe5d9}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined.sui-button-orange.sui-active,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined.sui-button-orange:active,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined.sui-button-orange:hover,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined.sui-button-orange.sui-active,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined.sui-button-orange:active,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined.sui-button-orange:hover,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined.sui-button-orange.sui-active,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined.sui-button-orange:active,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined.sui-button-orange:hover{border-color:#ff7e41;background-color:#ff7e41;color:#fff}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined.sui-button-orange.disabled,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined.sui-button-orange.sui-button-onload,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined.sui-button-orange.sui-button-onload-text,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined.sui-button-orange:disabled,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined.sui-button-orange[disabled],.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined.sui-button-orange.disabled,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined.sui-button-orange.sui-button-onload,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined.sui-button-orange.sui-button-onload-text,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined.sui-button-orange:disabled,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined.sui-button-orange[disabled],.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined.sui-button-orange.disabled,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined.sui-button-orange.sui-button-onload,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined.sui-button-orange.sui-button-onload-text,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined.sui-button-orange:disabled,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined.sui-button-orange[disabled]{border-color:#e6e6e6}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined.sui-button-yellow,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined.sui-button-yellow,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined.sui-button-yellow{border-color:#fff5d5}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined.sui-button-yellow.sui-active,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined.sui-button-yellow:active,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined.sui-button-yellow:hover,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined.sui-button-yellow.sui-active,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined.sui-button-yellow:active,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined.sui-button-yellow:hover,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined.sui-button-yellow.sui-active,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined.sui-button-yellow:active,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined.sui-button-yellow:hover{border-color:#fecf2f;background-color:#fecf2f;color:#333}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined.sui-button-yellow.disabled,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined.sui-button-yellow.sui-button-onload,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined.sui-button-yellow.sui-button-onload-text,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined.sui-button-yellow:disabled,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined.sui-button-yellow[disabled],.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined.sui-button-yellow.disabled,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined.sui-button-yellow.sui-button-onload,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined.sui-button-yellow.sui-button-onload-text,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined.sui-button-yellow:disabled,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined.sui-button-yellow[disabled],.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined.sui-button-yellow.disabled,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined.sui-button-yellow.sui-button-onload,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined.sui-button-yellow.sui-button-onload-text,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined.sui-button-yellow:disabled,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined.sui-button-yellow[disabled]{border-color:#e6e6e6}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined.sui-button-purple,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined.sui-button-purple,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined.sui-button-purple{border-color:#f9e1ff}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined.sui-button-purple.sui-active,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined.sui-button-purple:active,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined.sui-button-purple:hover,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined.sui-button-purple.sui-active,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined.sui-button-purple:active,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined.sui-button-purple:hover,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined.sui-button-purple.sui-active,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined.sui-button-purple:active,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined.sui-button-purple:hover{border-color:#8d00b1;background-color:#8d00b1;color:#fff}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined.sui-button-purple.disabled,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined.sui-button-purple.sui-button-onload,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined.sui-button-purple.sui-button-onload-text,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined.sui-button-purple:disabled,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-outlined.sui-button-purple[disabled],.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined.sui-button-purple.disabled,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined.sui-button-purple.sui-button-onload,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined.sui-button-purple.sui-button-onload-text,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined.sui-button-purple:disabled,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-outlined.sui-button-purple[disabled],.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined.sui-button-purple.disabled,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined.sui-button-purple.sui-button-onload,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined.sui-button-purple.sui-button-onload-text,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined.sui-button-purple:disabled,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-outlined.sui-button-purple[disabled]{border-color:#e6e6e6}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled{background-color:#e6e6e6;color:#aaa}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled.sui-active,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled:active,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled:hover,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled.sui-active,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled:active,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled:hover,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled.sui-active,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled:active,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled:hover{background-color:#d2d2d2}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled.disabled,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled.sui-button-onload,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled.sui-button-onload-text,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled:disabled,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled[disabled],.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled.disabled,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled.sui-button-onload,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled.sui-button-onload-text,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled:disabled,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled[disabled],.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled.disabled,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled.sui-button-onload,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled.sui-button-onload-text,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled:disabled,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled[disabled]{background-color:#e6e6e6;color:#aaa}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled.sui-button-blue,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled.sui-button-blue,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled.sui-button-blue{background-color:#17a8e3;color:#fff}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled.sui-button-blue.sui-active,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled.sui-button-blue:active,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled.sui-button-blue:hover,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled.sui-button-blue.sui-active,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled.sui-button-blue:active,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled.sui-button-blue:hover,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled.sui-button-blue.sui-active,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled.sui-button-blue:active,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled.sui-button-blue:hover{background-color:#1286b5}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled.sui-button-blue.disabled,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled.sui-button-blue.sui-button-onload,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled.sui-button-blue.sui-button-onload-text,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled.sui-button-blue:disabled,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled.sui-button-blue[disabled],.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled.sui-button-blue.disabled,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled.sui-button-blue.sui-button-onload,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled.sui-button-blue.sui-button-onload-text,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled.sui-button-blue:disabled,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled.sui-button-blue[disabled],.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled.sui-button-blue.disabled,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled.sui-button-blue.sui-button-onload,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled.sui-button-blue.sui-button-onload-text,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled.sui-button-blue:disabled,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled.sui-button-blue[disabled]{background-color:#e6e6e6;color:#aaa}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled.sui-button-green,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled.sui-button-green,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled.sui-button-green{background-color:#1abc9c;color:#fff}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled.sui-button-green.sui-active,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled.sui-button-green:active,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled.sui-button-green:hover,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled.sui-button-green.sui-active,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled.sui-button-green:active,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled.sui-button-green:hover,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled.sui-button-green.sui-active,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled.sui-button-green:active,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled.sui-button-green:hover{background-color:#148f77}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled.sui-button-green.disabled,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled.sui-button-green.sui-button-onload,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled.sui-button-green.sui-button-onload-text,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled.sui-button-green:disabled,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled.sui-button-green[disabled],.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled.sui-button-green.disabled,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled.sui-button-green.sui-button-onload,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled.sui-button-green.sui-button-onload-text,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled.sui-button-green:disabled,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled.sui-button-green[disabled],.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled.sui-button-green.disabled,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled.sui-button-green.sui-button-onload,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled.sui-button-green.sui-button-onload-text,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled.sui-button-green:disabled,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled.sui-button-green[disabled]{background-color:#e6e6e6;color:#aaa}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled.sui-button-red,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled.sui-button-red,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled.sui-button-red{background-color:#ff6d6d;color:#fff}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled.sui-button-red.sui-active,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled.sui-button-red:active,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled.sui-button-red:hover,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled.sui-button-red.sui-active,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled.sui-button-red:active,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled.sui-button-red:hover,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled.sui-button-red.sui-active,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled.sui-button-red:active,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled.sui-button-red:hover{background-color:#ff3a3a}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled.sui-button-red.disabled,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled.sui-button-red.sui-button-onload,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled.sui-button-red.sui-button-onload-text,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled.sui-button-red:disabled,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled.sui-button-red[disabled],.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled.sui-button-red.disabled,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled.sui-button-red.sui-button-onload,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled.sui-button-red.sui-button-onload-text,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled.sui-button-red:disabled,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled.sui-button-red[disabled],.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled.sui-button-red.disabled,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled.sui-button-red.sui-button-onload,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled.sui-button-red.sui-button-onload-text,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled.sui-button-red:disabled,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled.sui-button-red[disabled]{background-color:#e6e6e6;color:#aaa}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled.sui-button-orange,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled.sui-button-orange,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled.sui-button-orange{background-color:#ff7e41;color:#fff}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled.sui-button-orange.sui-active,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled.sui-button-orange:active,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled.sui-button-orange:hover,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled.sui-button-orange.sui-active,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled.sui-button-orange:active,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled.sui-button-orange:hover,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled.sui-button-orange.sui-active,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled.sui-button-orange:active,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled.sui-button-orange:hover{background-color:#ff5b0e}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled.sui-button-orange.disabled,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled.sui-button-orange.sui-button-onload,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled.sui-button-orange.sui-button-onload-text,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled.sui-button-orange:disabled,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled.sui-button-orange[disabled],.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled.sui-button-orange.disabled,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled.sui-button-orange.sui-button-onload,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled.sui-button-orange.sui-button-onload-text,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled.sui-button-orange:disabled,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled.sui-button-orange[disabled],.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled.sui-button-orange.disabled,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled.sui-button-orange.sui-button-onload,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled.sui-button-orange.sui-button-onload-text,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled.sui-button-orange:disabled,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled.sui-button-orange[disabled]{background-color:#e6e6e6;color:#aaa}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled.sui-button-yellow,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled.sui-button-yellow,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled.sui-button-yellow{background-color:#fecf2f;color:#333}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled.sui-button-yellow.sui-active,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled.sui-button-yellow:active,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled.sui-button-yellow:hover,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled.sui-button-yellow.sui-active,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled.sui-button-yellow:active,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled.sui-button-yellow:hover,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled.sui-button-yellow.sui-active,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled.sui-button-yellow:active,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled.sui-button-yellow:hover{background-color:#f9c101}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled.sui-button-yellow.disabled,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled.sui-button-yellow.sui-button-onload,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled.sui-button-yellow.sui-button-onload-text,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled.sui-button-yellow:disabled,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled.sui-button-yellow[disabled],.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled.sui-button-yellow.disabled,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled.sui-button-yellow.sui-button-onload,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled.sui-button-yellow.sui-button-onload-text,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled.sui-button-yellow:disabled,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled.sui-button-yellow[disabled],.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled.sui-button-yellow.disabled,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled.sui-button-yellow.sui-button-onload,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled.sui-button-yellow.sui-button-onload-text,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled.sui-button-yellow:disabled,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled.sui-button-yellow[disabled]{background-color:#e6e6e6;color:#aaa}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled.sui-button-purple,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled.sui-button-purple,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled.sui-button-purple{background-color:#8d00b1;color:#fff}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled.sui-button-purple.sui-active,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled.sui-button-purple:active,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled.sui-button-purple:hover,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled.sui-button-purple.sui-active,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled.sui-button-purple:active,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled.sui-button-purple:hover,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled.sui-button-purple.sui-active,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled.sui-button-purple:active,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled.sui-button-purple:hover{background-color:#64007e}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled.sui-button-purple.disabled,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled.sui-button-purple.sui-button-onload,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled.sui-button-purple.sui-button-onload-text,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled.sui-button-purple:disabled,.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-filled.sui-button-purple[disabled],.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled.sui-button-purple.disabled,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled.sui-button-purple.sui-button-onload,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled.sui-button-purple.sui-button-onload-text,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled.sui-button-purple:disabled,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-filled.sui-button-purple[disabled],.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled.sui-button-purple.disabled,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled.sui-button-purple.sui-button-onload,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled.sui-button-purple.sui-button-onload-text,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled.sui-button-purple:disabled,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-filled.sui-button-purple[disabled]{background-color:#e6e6e6;color:#aaa}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-lg,.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-lg,.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-lg{width:50px;height:40px}.sui-2-6-0 .sui-wrap .sui-button-icon.sui-button-lg [class*=sui-icon-],.sui-2-6-0 .sui-wrap a.sui-button-icon.sui-button-lg [class*=sui-icon-],.sui-2-6-0 .sui-wrap button.sui-button-icon.sui-button-lg [class*=sui-icon-]{font-size:13px}.sui-2-6-0 .sui-wrap .sui-dropdown .sui-button-icon:not(:last-child),.sui-2-6-0 .sui-wrap .sui-dropdown .sui-button:not(:last-child),.sui-2-6-0 .sui-wrap .sui-dropdown a.sui-button-icon:not(:last-child),.sui-2-6-0 .sui-wrap .sui-dropdown a.sui-button:not(:last-child),.sui-2-6-0 .sui-wrap .sui-dropdown button.sui-button-icon:not(:last-child),.sui-2-6-0 .sui-wrap .sui-dropdown button.sui-button:not(:last-child){margin-right:0}.sui-2-6-0 .sui-wrap .sui-toggle{display:block}.sui-2-6-0 .sui-wrap .sui-toggle input:focus~.sui-toggle-slider{box-shadow:0 0 0 5px #f2f2f2}.sui-2-6-0 .sui-wrap .sui-toggle input:checked~.sui-toggle-slider{background-color:#17a8e3}.sui-2-6-0 .sui-wrap .sui-toggle input:checked~.sui-toggle-slider:before{transform:translateX(18px)}.sui-2-6-0 .sui-wrap .sui-toggle input:checked:focus~.sui-toggle-slider,.sui-2-6-0 .sui-wrap .sui-toggle input:checked~.sui-toggle-slider:hover{box-shadow:0 0 0 5px #e1f6ff}.sui-2-6-0 .sui-wrap .sui-toggle .sui-toggle-slider{width:34px;height:16px;float:left;display:block;position:relative;margin:3px 0;padding:0;border:0;border-radius:8px;background-color:#aaa;transition:all .3s ease}.sui-2-6-0 .sui-wrap .sui-toggle .sui-toggle-slider:before{content:" ";width:14px;height:14px;position:absolute;top:1px;left:1px;border-radius:16px;background-color:#fff;transition:.2s linear}.sui-2-6-0 .sui-wrap .sui-toggle .sui-toggle-slider:hover{box-shadow:0 0 0 5px #f2f2f2}.sui-2-6-0 .sui-wrap .fui-table--apps tbody tr.fui-app--promote .fui-app--content .sui-toggle .sui-toggle-slider~.fui-app--description,.sui-2-6-0 .sui-wrap .sui-toggle .fui-table--apps tbody tr.fui-app--promote .fui-app--content .sui-toggle-slider~.fui-app--description,.sui-2-6-0 .sui-wrap .sui-toggle .sui-toggle-slider~.sui-description,.sui-2-6-0 .sui-wrap .sui-toggle .sui-toggle-slider~.sui-toggle-label{margin-left:44px}.sui-2-6-0 .sui-wrap .sui-toggle .sui-toggle-label{display:block;font:500 15px/22px Roboto,Arial,sans-serif;letter-spacing:-.25px}.sui-2-6-0 .sui-wrap .fui-table--apps tbody tr.fui-app--promote .fui-app--content .sui-toggle .fui-app--description,.sui-2-6-0 .sui-wrap .sui-toggle .fui-table--apps tbody tr.fui-app--promote .fui-app--content .fui-app--description,.sui-2-6-0 .sui-wrap .sui-toggle .sui-description{display:block}.sui-2-6-0 .sui-wrap .sui-toggle+.sui-toggle-label,.sui-2-6-0 .sui-wrap .sui-toggle+label{position:relative;top:-3px;margin-left:10px;font-weight:500}.sui-2-6-0 .sui-wrap .sui-toggle-content,.sui-2-6-0 .sui-wrap .sui-toggle-content.sui-border-frame{margin-left:44px}.sui-2-6-0 .sui-wrap *,.sui-2-6-0 .sui-wrap :after,.sui-2-6-0 .sui-wrap :before{box-sizing:border-box}.sui-2-6-0 .sui-wrap .sui-box{min-height:20px;position:relative;border-radius:4px;background-color:#fff;box-shadow:0 2px 0 #e6e6e6}.sui-2-6-0 .sui-wrap .sui-box .sui-box-header{border-bottom:1px solid #e6e6e6;padding:15px 30px;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-box .sui-box-header{padding:15px 20px}}.sui-2-6-0 .sui-wrap .sui-box .sui-box-header>h3>i{line-height:30px}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-box .sui-box-body{padding:20px}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box .sui-box-body{padding:30px}}.sui-2-6-0 .sui-wrap .sui-box .sui-box-footer{border-top:1px solid #e6e6e6;padding:30px;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.sui-2-6-0 .sui-wrap .sui-box .sui-box-footer.sui-pull-up{margin-top:-15px}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-box .sui-box-footer{padding:20px}}.sui-2-6-0 .sui-wrap .sui-box .sui-box-status{padding:15px 20px 20px}.sui-2-6-0 .sui-wrap .sui-box .sui-box-status .sui-status{display:-ms-flexbox;display:flex}.sui-2-6-0 .sui-wrap .sui-box .sui-box-status .sui-status [class*=sui-status-]{font-size:12px;line-height:30px;font-family:Roboto,Arial,sans-serif;letter-spacing:-.25px}.sui-2-6-0 .sui-wrap .sui-box .sui-box-status .sui-status [class*=sui-status-] .sui-tag{margin-left:8px}.sui-2-6-0 .sui-wrap .sui-box .sui-box-status .sui-status [class*=sui-status-] [class*=sui-icon-]{margin-right:4px;font-size:12px}.sui-2-6-0 .sui-wrap .sui-box .sui-box-status .sui-status [class*=sui-status-] [class*=sui-icon-]:before{display:block}.sui-2-6-0 .sui-wrap .sui-box .sui-box-status .sui-status [class*=sui-status-]:not(:last-child){margin-right:20px}.sui-2-6-0 .sui-wrap .sui-box .sui-box-status .sui-status [class*=sui-status-]:not(:first-child){padding-left:20px;border-left:1px solid #e6e6e6}.sui-2-6-0 .sui-wrap .sui-box .sui-box-status .sui-status .sui-status-module{color:#888;font-weight:700}.sui-2-6-0 .sui-wrap .sui-box .sui-box-status .sui-status .sui-status-changes{color:#aaa;font-weight:500;letter-spacing:-.25px}.sui-2-6-0 .sui-wrap .sui-box .sui-box-status .sui-status .sui-status-changes .sui-icon-check-tick:before{color:#1abc9c}.sui-2-6-0 .sui-wrap .sui-box .sui-box-status .sui-status .sui-status-changes .sui-icon-update:before{color:#888}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-box .sui-box-status .sui-status+.sui-actions{margin-top:15px}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box .sui-box-status .sui-status+.sui-actions{margin-left:15px}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box .sui-box-status .sui-status{-ms-flex:1;flex:1}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box .sui-box-status .sui-actions{-ms-flex:0 0 auto;flex:0 0 auto}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box .sui-box-status{display:-ms-flexbox;display:flex;padding:15px 30px}}.sui-2-6-0 .sui-wrap .sui-box .sui-box-search>*{max-width:100%;-ms-flex:0 1 auto;flex:0 1 auto}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box .sui-box-search>.sui-search-left:not(:last-child){margin-right:15px}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box .sui-box-search>.sui-search-left{display:-ms-flexbox;display:flex;-ms-flex:1;flex:1}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box .sui-box-search>.sui-search-right:only-child{-ms-flex:1;flex:1}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box .sui-box-search>.sui-search-right:not(:only-child):not(:last-child){margin-right:15px}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box .sui-box-search>.sui-search-right:not(:only-child){-ms-flex:0 0 auto;flex:0 0 auto}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box .sui-box-search{display:-ms-flexbox;display:flex}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box.sui-box-sticky{position:-webkit-sticky!important;position:sticky!important;top:32px;z-index:12}}.sui-2-6-0 .sui-wrap .sui-box.sui-box-sticky.sui-is-sticky{box-shadow:0 5px 25px rgba(0,0,0,.15)}.sui-2-6-0 .sui-wrap .sui-box>.sui-box-search{padding-top:15px;padding-bottom:15px}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-box>.sui-box-search{padding-right:20px;padding-left:20px}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box>.sui-box-search{padding-right:30px;padding-left:30px}}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-box:last-child{margin-bottom:0}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box:last-child{margin-bottom:0}}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-box{margin-bottom:20px}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box{margin-bottom:30px}}.sui-2-6-0 .sui-wrap .sui-message{display:block;text-align:center}.sui-2-6-0 .sui-wrap .sui-message .sui-message-content{max-width:600px;margin-right:auto;margin-left:auto}.sui-2-6-0 .sui-wrap .sui-message .sui-message-content h1,.sui-2-6-0 .sui-wrap .sui-message .sui-message-content h2,.sui-2-6-0 .sui-wrap .sui-message .sui-message-content h3,.sui-2-6-0 .sui-wrap .sui-message .sui-message-content h4,.sui-2-6-0 .sui-wrap .sui-message .sui-message-content h5,.sui-2-6-0 .sui-wrap .sui-message .sui-message-content h6{margin:0 0 20px}.sui-2-6-0 .sui-wrap .sui-message .sui-message-content h1:last-child,.sui-2-6-0 .sui-wrap .sui-message .sui-message-content h2:last-child,.sui-2-6-0 .sui-wrap .sui-message .sui-message-content h3:last-child,.sui-2-6-0 .sui-wrap .sui-message .sui-message-content h4:last-child,.sui-2-6-0 .sui-wrap .sui-message .sui-message-content h5:last-child,.sui-2-6-0 .sui-wrap .sui-message .sui-message-content h6:last-child{margin-bottom:0}.sui-2-6-0 .sui-wrap .sui-message .sui-message-content p{margin:0 0 30px;letter-spacing:-.25px}.sui-2-6-0 .sui-wrap .sui-message .sui-message-content p:last-child{margin-bottom:0}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-message .sui-message-content{margin-top:20px;margin-bottom:20px}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-message .sui-message-content{margin-top:30px;margin-bottom:30px}}.sui-2-6-0 .sui-wrap .sui-message:not(.sui-message-lg) .sui-image{margin:10px auto}.sui-2-6-0 .sui-wrap .sui-message:not(.sui-message-lg) .sui-message-content:first-child{margin-top:0}.sui-2-6-0 .sui-wrap .sui-message:not(.sui-message-lg) .sui-message-content:last-child{margin-bottom:0}.sui-2-6-0 .sui-wrap .sui-message.sui-message-lg .sui-image{margin:30px auto}.sui-2-6-0 .sui-wrap .sui-message:first-child{margin-top:0}.sui-2-6-0 .sui-wrap .sui-message:last-child{margin-bottom:0}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-message{padding:20px}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-message{padding:30px}}.sui-2-6-0 .sui-wrap .sui-box .sui-box-title{display:block;margin:0;padding:0;border:0;color:#333;font:700 15px/30px Roboto,Arial,sans-serif;text-transform:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sui-2-6-0 .sui-wrap .sui-box .sui-box-title *{vertical-align:middle}.sui-2-6-0 .sui-wrap .sui-box .sui-box-title [class*=sui-icon-]{float:left;display:block;margin-right:10px}.sui-2-6-0 .sui-wrap .sui-box .sui-box-title [class*=sui-icon-]:before{color:inherit;font-size:20px;vertical-align:text-bottom}.sui-2-6-0 .sui-wrap .sui-box-body .sui-upsell-row{position:relative}.sui-2-6-0 .sui-wrap .sui-box-body .sui-upsell-row .sui-upsell-image{width:100px;position:absolute;bottom:0}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-box-body .sui-upsell-row .sui-upsell-image{display:none}}.sui-2-6-0 .sui-wrap .sui-box-body .sui-upsell-row .sui-upsell-notice p{position:relative;padding:15px 20px 15px 43px;border-radius:4px;color:#333;font-size:13px;line-height:22px;border-top:1px solid #e6e6e6;border-right:1px solid #e6e6e6;border-bottom:1px solid #e6e6e6;border-left:2px solid #8d00b1}.sui-2-6-0 .sui-wrap .sui-box-body .sui-upsell-row .sui-upsell-notice p a{color:#333;font-weight:500}.sui-2-6-0 .sui-wrap .sui-box-body .sui-upsell-row .sui-upsell-notice p:first-of-type:before{content:"I";color:#8d00b1;margin-left:-23px;margin-right:10px}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box-body .sui-upsell-row .sui-upsell-notice{padding-left:130px}}.sui-2-6-0 .sui-wrap .sui-box-body.sui-upsell-items{padding:0}.sui-2-6-0 .sui-wrap .sui-box-body .sui-settings-box{padding:20px;border:1px solid #e6e6e6;border-radius:4px}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box-body .sui-settings-box{padding:30px}}.sui-2-6-0 .sui-wrap .sui-with-bottom-border{margin-bottom:30px;padding-bottom:30px;border-bottom:1px solid #e6e6e6}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-with-bottom-border{margin-bottom:20px;padding-bottom:20px}}.sui-2-6-0 .sui-wrap .sui-border-frame{margin:10px 0 0;border:1px solid #e6e6e6;border-radius:4px}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-border-frame:not(:last-child){margin-bottom:20px}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-border-frame:not(:last-child){margin-bottom:30px}}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-border-frame{padding:20px}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-border-frame{padding:30px}}.sui-2-6-0 .sui-wrap .sui-box-body .sui-box-settings-row{position:relative;margin-bottom:30px;padding-bottom:30px;border-bottom:1px solid #e6e6e6}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-box-body .sui-box-settings-row [class*=sui-box-settings-col-]+div{padding-top:20px}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box-body .sui-box-settings-row [class*=sui-box-settings-col-]+div{margin-left:30px}}.sui-2-6-0 .sui-wrap .sui-box-body .sui-box-settings-row:last-child{margin-bottom:0;padding-bottom:0;border-bottom-width:0}.sui-2-6-0 .sui-wrap .sui-box-body .sui-box-settings-row.sui-disabled{opacity:.5;pointer-events:none;background-color:hsla(0,0%,95%,.5)}.sui-2-6-0 .sui-wrap .sui-box-body .sui-box-settings-row.sui-flushed{margin-right:-20px;margin-left:-20px;padding-right:20px;padding-left:20px}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box-body .sui-box-settings-row.sui-flushed{margin-right:-30px;margin-left:-30px;padding-right:30px;padding-left:30px}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box-body .sui-box-settings-row{display:-ms-flexbox;display:flex}}.sui-2-6-0 .sui-wrap .sui-box-body .sui-box-settings-slim-row{position:relative;margin-bottom:20px}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-box-body .sui-box-settings-slim-row [class*=sui-box-settings-col-]+div{padding-top:20px}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box-body .sui-box-settings-slim-row [class*=sui-box-settings-col-]+div{margin-left:30px}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box-body .sui-box-settings-slim-row .sui-settings-label-with-tag:only-child,.sui-2-6-0 .sui-wrap .sui-box-body .sui-box-settings-slim-row .sui-settings-label:only-child{margin:5px 0;line-height:30px}}.sui-2-6-0 .sui-wrap .sui-box-body .sui-box-settings-slim-row:last-child{margin-bottom:0}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box-body .sui-box-settings-slim-row{display:-ms-flexbox;display:flex}}.sui-2-6-0 .sui-wrap .sui-box-body .sui-box-settings-col-1{max-width:200px;-ms-flex:0 1 200px;flex:0 1 200px}.sui-2-6-0 .sui-wrap .sui-box-body .sui-box-settings-col-1 .sui-settings-label,.sui-2-6-0 .sui-wrap .sui-box-body .sui-box-settings-col-1 .sui-settings-label-with-tag{color:#333}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box-body .sui-box-settings-col-2{min-width:0;-ms-flex:1;flex:1}}.sui-2-6-0 .sui-wrap .sui-box-body .sui-settings-label,.sui-2-6-0 .sui-wrap .sui-box-body .sui-settings-label-with-tag{display:block;margin:0 0 5px;padding:0;border:0;color:#666;font:500 15px/22px Roboto,Arial,sans-serif;letter-spacing:-.25px}.sui-2-6-0 .sui-wrap .sui-box-body .sui-settings-label-with-tag:last-child,.sui-2-6-0 .sui-wrap .sui-box-body .sui-settings-label:last-child{margin:0}.sui-2-6-0 .sui-wrap .sui-box-body .sui-dark.sui-settings-label-with-tag,.sui-2-6-0 .sui-wrap .sui-box-body .sui-settings-label.sui-dark{color:#333}.sui-2-6-0 .sui-wrap .sui-box-body .sui-settings-label-with-tag{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start}.sui-2-6-0 .sui-wrap .sui-box-body .sui-settings-label-with-tag .sui-tag{margin-top:-2px;margin-left:10px}.sui-2-6-0 .sui-wrap .sui-box-body .sui-settings-label-with-tag .sui-tag.sui-tag-sm{margin-top:4px}.sui-2-6-0 .sui-wrap .sui-box-body .sui-settings-label-with-tag .sui-tag.sui-tag-beta,.sui-2-6-0 .sui-wrap .sui-box-body .sui-settings-label-with-tag .sui-tag.sui-tag-pro{margin-top:5px}.sui-2-6-0 .sui-wrap .fui-table--apps tbody tr.fui-app--promote .fui-app--content .sui-box-body .fui-app--description,.sui-2-6-0 .sui-wrap .sui-box-body .fui-table--apps tbody tr.fui-app--promote .fui-app--content .fui-app--description,.sui-2-6-0 .sui-wrap .sui-box-body .sui-description{line-height:22px}.sui-2-6-0 .sui-wrap .fui-table--apps tbody tr.fui-app--promote .fui-app--content .sui-box-body .fui-app--description+.sui-settings-box,.sui-2-6-0 .sui-wrap .sui-box-body .fui-table--apps tbody tr.fui-app--promote .fui-app--content .fui-app--description+.sui-settings-box,.sui-2-6-0 .sui-wrap .sui-box-body .sui-description+.sui-settings-box{margin-top:10px}.sui-2-6-0 .sui-wrap .sui-box-body.sui-upsell-items .sui-box-settings-row{margin:0;padding-top:21px;padding-right:20px;padding-left:20px;border-bottom:none}.sui-2-6-0 .sui-wrap .sui-box-body.sui-upsell-items .sui-box-settings-row:after{content:"";height:1px;clear:both;display:block;position:absolute;right:0;bottom:0;left:0;background-color:#e6e6e6}.sui-2-6-0 .sui-wrap .sui-box-body.sui-upsell-items .sui-box-settings-row:last-child,.sui-2-6-0 .sui-wrap .sui-box-body.sui-upsell-items .sui-box-settings-row:last-of-type{padding-bottom:30px}.sui-2-6-0 .sui-wrap .sui-box-body.sui-upsell-items .sui-box-settings-row:last-child:after,.sui-2-6-0 .sui-wrap .sui-box-body.sui-upsell-items .sui-box-settings-row:last-of-type:after{content:unset}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-box-body.sui-upsell-items .sui-box-settings-row:last-child,.sui-2-6-0 .sui-wrap .sui-box-body.sui-upsell-items .sui-box-settings-row:last-of-type{padding-top:20px}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box-body.sui-upsell-items .sui-box-settings-row{padding-top:31px;padding-right:30px;padding-left:30px}}.sui-2-6-0 .sui-wrap .sui-box-selectors{background-color:#f8f8f8}.sui-2-6-0 .sui-wrap .sui-box-selectors li,.sui-2-6-0 .sui-wrap .sui-box-selectors ul{list-style:none}.sui-2-6-0 .sui-wrap .sui-box-selectors ul{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:0 -10px;padding:0;border:0}.sui-2-6-0 .sui-wrap .sui-box-selectors ul li{margin:0;padding:10px;border:0}.sui-2-6-0 .sui-wrap .sui-box-selectors ul.sui-spacing-slim li{padding:5px}.sui-2-6-0 .sui-wrap .sui-box-selectors[class*=sui-box-selectors-col-] ul li{-ms-flex:0 0 auto;flex:0 0 auto}.sui-2-6-0 .sui-wrap .sui-box-selectors:not([class*=sui-box-selectors-col-]) ul li{-ms-flex:1;flex:1}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-box-selectors.sui-box-selectors-col-1 ul li{min-width:100%;-ms-flex-preferred-size:100%;flex-basis:100%}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box-selectors.sui-box-selectors-col-1 ul li{min-width:100%;-ms-flex-preferred-size:100%;flex-basis:100%}}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-box-selectors.sui-box-selectors-col-2 ul li{min-width:100%;-ms-flex-preferred-size:100%;flex-basis:100%}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box-selectors.sui-box-selectors-col-2 ul li{min-width:50%;-ms-flex-preferred-size:50%;flex-basis:50%}}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-box-selectors.sui-box-selectors-col-3 ul li{min-width:100%;-ms-flex-preferred-size:100%;flex-basis:100%}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box-selectors.sui-box-selectors-col-3 ul li{min-width:33.33%;-ms-flex-preferred-size:33.33%;flex-basis:33.33%}}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-box-selectors.sui-box-selectors-col-4 ul li{min-width:100%;-ms-flex-preferred-size:100%;flex-basis:100%}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box-selectors.sui-box-selectors-col-4 ul li{min-width:25%;-ms-flex-preferred-size:25%;flex-basis:25%}}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-box-selectors.sui-box-selectors-col-5 ul li{min-width:100%;-ms-flex-preferred-size:100%;flex-basis:100%}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box-selectors.sui-box-selectors-col-5 ul li{min-width:20%;-ms-flex-preferred-size:20%;flex-basis:20%}}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-box-selectors{padding:10px 20px}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box-selectors{padding:20px 30px}}.sui-2-6-0 .sui-wrap .sui-box-selector{overflow:hidden;display:block;border-radius:4px;background-color:#fff;box-shadow:0 2px 7px 0 rgba(0,0,0,.05);color:#888;font-family:Roboto,Arial,sans-serif;letter-spacing:-.25px;transition:all .3s ease}.sui-2-6-0 .sui-wrap .sui-box-selector input~span{display:block;padding-right:30px;padding-left:20px;transition:all .3s ease}.sui-2-6-0 .sui-wrap .sui-box-selector input+span{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding-top:20px;padding-bottom:20px;font-size:12px;line-height:20px;font-weight:500}.sui-2-6-0 .sui-wrap .sui-box-selector input+span [class*=sui-icon]{width:30px;-ms-flex:0 0 30px;flex:0 0 30px;-ms-flex-item-align:start;align-self:flex-start;margin:0 5px 0 0;font-size:16px;text-align:center}.sui-2-6-0 .sui-wrap .sui-box-selector input+span [class*=sui-icon]:before{display:block;color:#aaa;line-height:20px;transition:all .3s ease}.sui-2-6-0 .sui-wrap .sui-box-selector input+span img{max-width:24px;height:auto;display:block;margin:0 5px 0 0}.sui-2-6-0 .sui-wrap .sui-box-selector input+span~span{padding-top:20px;padding-bottom:20px;border-top:1px solid hsla(0,0%,90%,.5);font-size:13px;line-height:22px}.sui-2-6-0 .sui-wrap .sui-box-selector input:checked+span{overflow:hidden;position:relative;background-color:#e1f6ff;color:#17a8e3}.sui-2-6-0 .sui-wrap .sui-box-selector input:checked+span:before{content:"_";position:absolute;z-index:1;top:5px;right:5px;color:#fff;font-size:12px}.sui-2-6-0 .sui-wrap .sui-box-selector input:checked+span:after{content:" ";position:absolute;top:0;right:0;border-top:40px solid #17a8e3;border-left:40px solid transparent}.sui-2-6-0 .sui-wrap .sui-box-selector input:checked+span [class*=sui-icon]:before{color:#17a8e3}.sui-2-6-0 .sui-wrap .sui-box-selector input:checked+span~span{border-top-color:#e1f6ff}.sui-2-6-0 .sui-wrap .sui-box-selector:hover{box-shadow:0 0 0 4px rgba(0,0,0,.02),0 4px 15px 0 rgba(0,0,0,.05)}.sui-2-6-0 .sui-wrap .sui-box-selector.sui-box-selector-vertical input~span{text-align:center}.sui-2-6-0 .sui-wrap .sui-box-selector.sui-box-selector-vertical input+span{display:block;padding:21px 10px 16px}.sui-2-6-0 .sui-wrap .sui-box-selector.sui-box-selector-vertical input+span [class*=sui-icon]{display:block;margin:0 auto 7px}.sui-2-6-0 .sui-wrap .sui-box-selector.sui-box-selector-vertical input+span [class*=sui-icon]:before{line-height:16px}.sui-2-6-0 .sui-wrap .sui-box-selector.sui-box-selector-vertical input+span img{margin:0 auto}.sui-2-6-0 .sui-wrap .sui-box-builder{display:block;margin:0;border:1px solid #e6e6e6;border-radius:4px;background-color:#fff}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field .sui-button,.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field .sui-button-icon{margin:0}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field .sui-button-icon.sui-align_top,.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field .sui-button.sui-align_top{-ms-flex-item-align:start;align-self:flex-start;margin-top:5px;margin-bottom:5px}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field .sui-builder-field-label{min-width:0;display:-ms-flexbox;display:flex;-ms-flex:1 1 auto;flex:1 1 auto;-ms-flex-align:center;align-items:center;color:#333;font:500 13px/22px Roboto,Arial,sans-serif;letter-spacing:-.25px}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field .sui-builder-field-label>[class*=sui-icon-]{-ms-flex:0 0 30px;flex:0 0 30px;font-size:16px;text-align:center}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field .sui-builder-field-label>[class*=sui-icon-]:before{display:block}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field .sui-builder-field-label>[class*=sui-icon-]+span{margin-left:5px}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field .sui-builder-field-label>[class*=sui-icon-]+.sui-builder-field-image{margin-left:10px}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field .sui-builder-field-label .sui-builder-field-image{width:40px;height:40px;-ms-flex:0 0 40px;flex:0 0 40px;border:1px solid #e6e6e6;background-color:#ddd;background-image:linear-gradient(45deg,#fff 25%,transparent 0,transparent 75%,#fff 0,#fff),linear-gradient(45deg,#fff 25%,transparent 0,transparent 75%,#fff 0,#fff);background-size:12px 12px;background-position:0 0,6px 6px;border-radius:4px}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field .sui-builder-field-label .sui-builder-field-image span{width:38px;height:38px;display:block;border:1px solid #fff;border-radius:3px;background-repeat:no-repeat;background-size:cover;background-position:50%}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field .sui-builder-field-label .sui-builder-field-image+span{margin-left:10px}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field .sui-builder-field-label>span{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field .sui-builder-field-label+.sui-button,.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field .sui-builder-field-label+.sui-button-icon,.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field .sui-builder-field-label+.sui-dropdown{margin-left:10px}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field .sui-builder-field-form{display:block;-ms-flex:1 1 auto;flex:1 1 auto}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field .sui-builder-field-form .sui-form-field-row{display:-ms-flexbox;display:flex;margin:0 0 10px;-ms-flex-align:center;align-items:center}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field .sui-builder-field-form .sui-form-field-row .sui-form-field{-ms-flex:1;flex:1;margin:0 10px}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field .sui-builder-field-form .sui-form-field-row .sui-form-field:first-child{margin-left:0}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field .sui-builder-field-form .sui-form-field-row .sui-form-field:last-child{margin-right:0}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field .sui-builder-field-form .sui-form-field-row .sui-form-field.sui-auto{-ms-flex:0 1 auto;flex:0 1 auto}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field .sui-builder-field-form .sui-form-field-row:last-child{margin-bottom:0}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field .sui-builder-field-border{width:1px;height:20px;background-color:#e6e6e6}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field .sui-builder-field-border:not(:last-child){margin-right:10px}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field .sui-builder-field-border:not(:first-child){margin-left:10px}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field .sui-builder-field-border+.sui-dropdown{margin-left:0}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field .sui-builder-field-notice{width:30px;height:30px;cursor:help;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;border-radius:4px;background-color:transparent;color:#17a8e3;transition:all .3s ease}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field .sui-builder-field-notice [class*=sui-icon-]{font-size:12px}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field .sui-builder-field-notice [class*=sui-icon-]:before{display:block;color:inherit}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field .sui-builder-field-notice:hover{background-color:#f2f2f2}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field .sui-accordion-open-indicator [class*=sui-icon-]{transition:.2s linear}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field .sui-accordion-item-header>.sui-icon-drag,.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field.sui-react .sui-field-info>.sui-icon-drag,.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field>.sui-icon-drag{width:30px;-ms-flex:0 0 30px;flex:0 0 30px;color:#ddd;font-size:16px;text-align:center;transition:all .3s ease}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field .sui-accordion-item-header>.sui-icon-drag:before,.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field.sui-react .sui-field-info>.sui-icon-drag:before,.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field>.sui-icon-drag:before{display:block;color:inherit}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field .sui-accordion-item-header>.sui-icon-drag.sui-align_top,.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field.sui-react .sui-field-info>.sui-icon-drag.sui-align_top,.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field>.sui-icon-drag.sui-align_top{-ms-flex-item-align:start;align-self:flex-start;margin-top:12px;margin-bottom:12px}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field .sui-accordion-item-header>.sui-button,.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field .sui-accordion-item-header>.sui-button-icon,.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field .sui-accordion-item-header>.sui-dropdown,.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field.sui-react .sui-field-info>.sui-button,.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field.sui-react .sui-field-info>.sui-button-icon,.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field.sui-react .sui-field-info>.sui-dropdown,.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field>.sui-button,.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field>.sui-button-icon,.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field>.sui-dropdown{-ms-flex:0 0 auto;flex:0 0 auto}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field:not(.sui-accordion-item):not(.sui-react){display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding-right:20px;padding-left:20px}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field:not(.sui-accordion-item):not(.sui-react).sui-can-move,.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field:not(.sui-accordion-item):not(.sui-react).sui-can_move{cursor:move}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field:not(.sui-accordion-item):not(.sui-react).sui-can_open{cursor:pointer}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field:not(.sui-accordion-item):not(.sui-react){min-height:50px;padding-top:10px;padding-bottom:10px}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field:not(.sui-accordion-item):not(.sui-react){min-height:60px;padding-top:15px;padding-bottom:15px}}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field.sui-accordion-item .sui-accordion-item-header{cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding-right:20px;padding-left:20px}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field.sui-accordion-item .sui-accordion-item-header{min-height:50px;padding-top:10px;padding-bottom:10px}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field.sui-accordion-item .sui-accordion-item-header{min-height:60px;padding-top:15px;padding-bottom:15px}}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field.sui-accordion-item .sui-accordion-item-body{display:none;border-top:1px solid #e6e6e6}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field.sui-accordion-item .sui-accordion-item-body{padding:20px}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field.sui-accordion-item .sui-accordion-item-body{padding:30px}}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field.sui-accordion-item.sui-can-move .sui-accordion-item-header,.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field.sui-accordion-item.sui-can_move .sui-accordion-item-header{cursor:move}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field.sui-accordion-item.sui-can_open .sui-accordion-item-header{cursor:pointer}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field.sui-accordion-item.sui-accordion-item--open .sui-accordion-item-header .sui-accordion-open-indicator [class*=sui-icon-]{transform:rotate(180deg)}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field.sui-accordion-item.sui-accordion-item--open .sui-accordion-item-body{display:block}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field.sui-react{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field.sui-react .sui-field-info{overflow:hidden;display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-align:center;align-items:center}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field.sui-react .sui-field-info:not(:last-child){padding-left:20px}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field.sui-react .sui-field-info:not(:first-child){padding-right:20px}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field.sui-react .sui-field-info{min-height:50px;padding-top:10px;padding-bottom:10px}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field.sui-react .sui-field-info{min-height:60px;padding-top:15px;padding-bottom:15px}}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field.sui-react .sui-field-info+.sui-field-actions{margin-left:5px}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field.sui-react .sui-field-actions{-ms-flex:0 0 auto;flex:0 0 auto}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field.sui-react .sui-field-actions:first-child{margin-left:20px}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field.sui-react .sui-field-actions:last-child{margin-right:20px}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field.sui-react .sui-field-actions.sui-align_top{-ms-flex-item-align:start;align-self:flex-start}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field.sui-react .sui-field-actions.sui-align_top .sui-button,.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field.sui-react .sui-field-actions.sui-align_top .sui-button-icon{margin-top:5px;margin-bottom:5px}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field.sui-react .sui-field-actions.sui-align_top{padding-top:10px;padding-bottom:10px}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field.sui-react .sui-field-actions.sui-align_top{padding-top:15px;padding-bottom:15px}}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field.sui-react.sui-can-move,.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field.sui-react.sui-can_move{cursor:move}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-builder-field.sui-react.sui-can_open{cursor:pointer}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-header{display:block}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-header .sui-builder-text{display:block;color:#888;font:400 13px/22px Roboto,Arial,sans-serif;letter-spacing:-.25px}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-header .sui-builder-conditions:not(:first-child),.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-header .sui-builder-options:not(:first-child){border-top:1px solid #e6e6e6}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-header .sui-builder-conditions:not(:first-child),.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-header .sui-builder-options:not(:first-child){margin-top:10px;margin-right:-20px;margin-left:-20px;padding:10px 20px 0}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-header .sui-builder-conditions:not(:first-child),.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-header .sui-builder-options:not(:first-child){margin-top:15px;margin-right:-30px;margin-left:-30px;padding:15px 30px 0}}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-header .sui-builder-options.sui-options-inline .sui-builder-text:not(:last-child),.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-header .sui-builder-options.sui-options-inline .sui-checkbox:not(:last-child),.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-header .sui-builder-options.sui-options-inline .sui-radio:not(:last-child){margin-bottom:10px}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-header .sui-builder-options.sui-options-inline .sui-builder-text:not(:last-child),.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-header .sui-builder-options.sui-options-inline .sui-checkbox:not(:last-child),.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-header .sui-builder-options.sui-options-inline .sui-radio:not(:last-child){margin-right:10px}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-header .sui-builder-options.sui-options-inline{display:-ms-flexbox;display:flex}}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-header .sui-builder-options:not(.sui-options-inline) .sui-builder-text:not(:last-child){margin-bottom:10px}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-header .sui-builder-conditions{display:-ms-flexbox;display:flex}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-header .sui-builder-conditions .sui-builder-conditions-rule{-ms-flex:1;flex:1}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-header .sui-builder-conditions .sui-builder-conditions-rule span:first-child{margin-left:0}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-header .sui-builder-conditions .sui-builder-conditions-rule span:last-child{margin-right:0}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-header .sui-builder-conditions .sui-builder-conditions-rule span{-ms-flex:0 1 auto;flex:0 1 auto;margin:0 5px}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-header .sui-builder-conditions .sui-builder-conditions-rule .select-container:first-child{margin-left:0}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-header .sui-builder-conditions .sui-builder-conditions-rule .select-container:last-child{margin-right:0}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-header .sui-builder-conditions .sui-builder-conditions-rule .select-container{width:auto;min-width:75px;max-width:unset;-ms-flex:0 0 auto;flex:0 0 auto;margin:0 5px}}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-header .sui-builder-conditions .sui-builder-conditions-rule+*{margin-left:10px}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-header .sui-builder-conditions .sui-builder-conditions-rule+*{margin-left:15px}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-header .sui-builder-conditions .sui-builder-conditions-rule{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-header .sui-builder-conditions .sui-builder-conditions-actions{-ms-flex:0 0 auto;flex:0 0 auto}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-header:not(:only-child):not(:last-child){border-bottom:1px solid #e6e6e6}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-header{padding:10px 20px}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-header{padding:15px 30px}}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-body{background-color:#f8f8f8}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-body .sui-builder-field{margin:0 0 20px;border-radius:4px;background-color:#fff;box-shadow:0 2px 7px 0 rgba(0,0,0,.05);transition:all .3s ease}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-body .sui-builder-field .sui-accordion-item-header>.sui-icon-drag,.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-body .sui-builder-field.sui-react .sui-field-info>.sui-icon-drag,.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-body .sui-builder-field>.sui-icon-drag{margin-left:-10px}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-body .sui-builder-field.ui-sortable-handle{transition:unset}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-body .sui-builder-field .sui-builder-field-label:first-child>[class*=sui-icon-]{margin-left:-10px}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-body .sui-builder-field .sui-builder-field-border{transition:all .3s ease}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-body .sui-builder-field .sui-hover-show{opacity:0}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-body .sui-builder-field:hover .sui-hover-show{opacity:1}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-body .sui-builder-field:active,.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-body .sui-builder-field:hover{box-shadow:0 0 0 4px rgba(0,0,0,.02),0 4px 15px 0 rgba(0,0,0,.05)}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-body .sui-builder-field:active .sui-accordion-item-header>.sui-icon-drag,.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-body .sui-builder-field:active.sui-react .sui-field-info>.sui-icon-drag,.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-body .sui-builder-field:active>.sui-icon-drag,.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-body .sui-builder-field:hover .sui-accordion-item-header>.sui-icon-drag,.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-body .sui-builder-field:hover.sui-react .sui-field-info>.sui-icon-drag,.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-body .sui-builder-field:hover>.sui-icon-drag{color:#888}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-body .sui-button-dashed+.sui-box-builder-message{margin-top:20px}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-body .sui-button-dashed+.sui-box-builder-message{margin-top:30px}}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-body .sui-box-builder-message{display:block;color:#888;font:400 13px/22px Roboto,Arial,sans-serif;letter-spacing:-.25px}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-body .sui-builder-empty-message:not(:first-child){margin-top:20px}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-body .sui-builder-empty-message:not(:first-child){margin-top:30px}}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-body .sui-builder-empty-message:last-child{margin-bottom:-20px}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-body .sui-builder-empty-message:last-child{margin-bottom:-30px}}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-body .sui-box-builder-message-block .sui-box-builder-message{text-align:center}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-body .sui-box-builder-message-block .sui-image:not(:first-child){margin-top:20px}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-body .sui-box-builder-message-block .sui-image:not(:first-child){margin-top:30px}}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-body .sui-box-builder-message-block .sui-image:last-child{margin-bottom:-20px}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-body .sui-box-builder-message-block .sui-image:last-child{margin-bottom:-30px}}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-body .sui-box-builder-message-block:not(:first-child){margin-top:20px}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-body .sui-box-builder-message-block:not(:first-child){margin-top:30px}}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-body:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-body{padding:20px}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-body{padding:30px}}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-footer .sui-hidden{display:none!important}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-footer.sui-fields-boxed .sui-builder-field{border:1px solid #e6e6e6;border-radius:4px}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-footer.sui-fields-boxed .sui-builder-field:not(:last-child){margin-bottom:20px}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-footer.sui-fields-boxed .sui-builder-field:not(:last-child){margin-bottom:30px}}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-footer.sui-fields-boxed{padding:20px}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-footer.sui-fields-boxed{padding:30px}}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-footer:not(.sui-fields-boxed) .sui-builder-field:not(:only-child):not(:last-child){border-bottom:1px solid #e6e6e6}.sui-2-6-0 .sui-wrap .sui-box-builder .sui-box-builder-footer:not(:only-child):not(:first-child){border-top:1px solid #e6e6e6}.sui-2-6-0 .sui-wrap .sui-box-builder.sui-flushed{border-width:0;border-radius:0}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box-builder.sui-flushed .sui-builder-field.sui-accordion-item .sui-accordion-item-header,.sui-2-6-0 .sui-wrap .sui-box-builder.sui-flushed .sui-builder-field:not(.sui-accordion-item):not(.sui-react){height:70px}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box-builder.sui-flushed .sui-builder-field.sui-react .sui-field-info{min-height:70px}}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-box-builder.sui-flushed{margin:-20px}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box-builder.sui-flushed{margin:-30px}}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-box-builder:not(:last-child){margin-bottom:20px}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box-builder:not(:last-child){margin-bottom:30px}}.sui-2-6-0 .sui-wrap .sui-col,.sui-2-6-0 .sui-wrap [class*=sui-col-]{min-height:1px;padding-left:15px;padding-right:15px;position:relative}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-col,.sui-2-6-0 .sui-wrap [class*=sui-col-]{padding-left:10px;padding-right:10px}}.sui-2-6-0 .sui-wrap .sui-row{display:-ms-flexbox;display:flex;-ms-flex-flow:wrap;flex-flow:wrap;margin-right:-15px;margin-bottom:30px;margin-left:-15px}.sui-2-6-0 .sui-wrap .sui-row:last-child{margin-bottom:0}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-row:last-child{margin-bottom:0}}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-row{margin-right:-10px;margin-bottom:20px;margin-left:-10px}}.sui-2-6-0 .sui-wrap .sui-reverse{-ms-flex-direction:row-reverse;flex-direction:row-reverse}.sui-2-6-0 .sui-wrap .sui-col{-ms-flex:1;flex:1}.sui-2-6-0 .sui-wrap [class*=sui-col-]{-ms-flex:0 0 auto;flex:0 0 auto;width:100%;max-width:100%;-ms-flex-preferred-size:100%;flex-basis:100%}.sui-2-6-0 .sui-wrap .sui-col-xs-12{width:100%;max-width:100%;-ms-flex-preferred-size:100%;flex-basis:100%}.sui-2-6-0 .sui-wrap .sui-col-xs-offset-12{margin-left:100%}.sui-2-6-0 .sui-wrap .sui-col-xs-11{width:91.66667%;max-width:91.66667%;-ms-flex-preferred-size:91.66667%;flex-basis:91.66667%}.sui-2-6-0 .sui-wrap .sui-col-xs-offset-11{margin-left:91.66667%}.sui-2-6-0 .sui-wrap .sui-col-xs-10{width:83.33333%;max-width:83.33333%;-ms-flex-preferred-size:83.33333%;flex-basis:83.33333%}.sui-2-6-0 .sui-wrap .sui-col-xs-offset-10{margin-left:83.33333%}.sui-2-6-0 .sui-wrap .sui-col-xs-9{width:75%;max-width:75%;-ms-flex-preferred-size:75%;flex-basis:75%}.sui-2-6-0 .sui-wrap .sui-col-xs-offset-9{margin-left:75%}.sui-2-6-0 .sui-wrap .sui-col-xs-8{width:66.66667%;max-width:66.66667%;-ms-flex-preferred-size:66.66667%;flex-basis:66.66667%}.sui-2-6-0 .sui-wrap .sui-col-xs-offset-8{margin-left:66.66667%}.sui-2-6-0 .sui-wrap .sui-col-xs-7{width:58.33333%;max-width:58.33333%;-ms-flex-preferred-size:58.33333%;flex-basis:58.33333%}.sui-2-6-0 .sui-wrap .sui-col-xs-offset-7{margin-left:58.33333%}.sui-2-6-0 .sui-wrap .sui-col-xs-6{width:50%;max-width:50%;-ms-flex-preferred-size:50%;flex-basis:50%}.sui-2-6-0 .sui-wrap .sui-col-xs-offset-6{margin-left:50%}.sui-2-6-0 .sui-wrap .sui-col-xs-5{width:41.66667%;max-width:41.66667%;-ms-flex-preferred-size:41.66667%;flex-basis:41.66667%}.sui-2-6-0 .sui-wrap .sui-col-xs-offset-5{margin-left:41.66667%}.sui-2-6-0 .sui-wrap .sui-col-xs-4{width:33.33333%;max-width:33.33333%;-ms-flex-preferred-size:33.33333%;flex-basis:33.33333%}.sui-2-6-0 .sui-wrap .sui-col-xs-offset-4{margin-left:33.33333%}.sui-2-6-0 .sui-wrap .sui-col-xs-3{width:25%;max-width:25%;-ms-flex-preferred-size:25%;flex-basis:25%}.sui-2-6-0 .sui-wrap .sui-col-xs-offset-3{margin-left:25%}.sui-2-6-0 .sui-wrap .sui-col-xs-2{width:16.66667%;max-width:16.66667%;-ms-flex-preferred-size:16.66667%;flex-basis:16.66667%}.sui-2-6-0 .sui-wrap .sui-col-xs-offset-2{margin-left:16.66667%}.sui-2-6-0 .sui-wrap .sui-col-xs-1{width:8.33333%;max-width:8.33333%;-ms-flex-preferred-size:8.33333%;flex-basis:8.33333%}.sui-2-6-0 .sui-wrap .sui-col-xs-offset-1{margin-left:8.33333%}@media (min-width:0px){.sui-2-6-0 .sui-wrap .sui-col-xs-12{width:100%;max-width:100%;-ms-flex-preferred-size:100%;flex-basis:100%}.sui-2-6-0 .sui-wrap .sui-col-xs-offset-12{margin-left:100%}.sui-2-6-0 .sui-wrap .sui-col-xs-11{width:91.66667%;max-width:91.66667%;-ms-flex-preferred-size:91.66667%;flex-basis:91.66667%}.sui-2-6-0 .sui-wrap .sui-col-xs-offset-11{margin-left:91.66667%}.sui-2-6-0 .sui-wrap .sui-col-xs-10{width:83.33333%;max-width:83.33333%;-ms-flex-preferred-size:83.33333%;flex-basis:83.33333%}.sui-2-6-0 .sui-wrap .sui-col-xs-offset-10{margin-left:83.33333%}.sui-2-6-0 .sui-wrap .sui-col-xs-9{width:75%;max-width:75%;-ms-flex-preferred-size:75%;flex-basis:75%}.sui-2-6-0 .sui-wrap .sui-col-xs-offset-9{margin-left:75%}.sui-2-6-0 .sui-wrap .sui-col-xs-8{width:66.66667%;max-width:66.66667%;-ms-flex-preferred-size:66.66667%;flex-basis:66.66667%}.sui-2-6-0 .sui-wrap .sui-col-xs-offset-8{margin-left:66.66667%}.sui-2-6-0 .sui-wrap .sui-col-xs-7{width:58.33333%;max-width:58.33333%;-ms-flex-preferred-size:58.33333%;flex-basis:58.33333%}.sui-2-6-0 .sui-wrap .sui-col-xs-offset-7{margin-left:58.33333%}.sui-2-6-0 .sui-wrap .sui-col-xs-6{width:50%;max-width:50%;-ms-flex-preferred-size:50%;flex-basis:50%}.sui-2-6-0 .sui-wrap .sui-col-xs-offset-6{margin-left:50%}.sui-2-6-0 .sui-wrap .sui-col-xs-5{width:41.66667%;max-width:41.66667%;-ms-flex-preferred-size:41.66667%;flex-basis:41.66667%}.sui-2-6-0 .sui-wrap .sui-col-xs-offset-5{margin-left:41.66667%}.sui-2-6-0 .sui-wrap .sui-col-xs-4{width:33.33333%;max-width:33.33333%;-ms-flex-preferred-size:33.33333%;flex-basis:33.33333%}.sui-2-6-0 .sui-wrap .sui-col-xs-offset-4{margin-left:33.33333%}.sui-2-6-0 .sui-wrap .sui-col-xs-3{width:25%;max-width:25%;-ms-flex-preferred-size:25%;flex-basis:25%}.sui-2-6-0 .sui-wrap .sui-col-xs-offset-3{margin-left:25%}.sui-2-6-0 .sui-wrap .sui-col-xs-2{width:16.66667%;max-width:16.66667%;-ms-flex-preferred-size:16.66667%;flex-basis:16.66667%}.sui-2-6-0 .sui-wrap .sui-col-xs-offset-2{margin-left:16.66667%}.sui-2-6-0 .sui-wrap .sui-col-xs-1{width:8.33333%;max-width:8.33333%;-ms-flex-preferred-size:8.33333%;flex-basis:8.33333%}.sui-2-6-0 .sui-wrap .sui-col-xs-offset-1{margin-left:8.33333%}}@media (min-width:480px){.sui-2-6-0 .sui-wrap .sui-col-sm-12{width:100%;max-width:100%;-ms-flex-preferred-size:100%;flex-basis:100%}.sui-2-6-0 .sui-wrap .sui-col-sm-offset-12{margin-left:100%}.sui-2-6-0 .sui-wrap .sui-col-sm-11{width:91.66667%;max-width:91.66667%;-ms-flex-preferred-size:91.66667%;flex-basis:91.66667%}.sui-2-6-0 .sui-wrap .sui-col-sm-offset-11{margin-left:91.66667%}.sui-2-6-0 .sui-wrap .sui-col-sm-10{width:83.33333%;max-width:83.33333%;-ms-flex-preferred-size:83.33333%;flex-basis:83.33333%}.sui-2-6-0 .sui-wrap .sui-col-sm-offset-10{margin-left:83.33333%}.sui-2-6-0 .sui-wrap .sui-col-sm-9{width:75%;max-width:75%;-ms-flex-preferred-size:75%;flex-basis:75%}.sui-2-6-0 .sui-wrap .sui-col-sm-offset-9{margin-left:75%}.sui-2-6-0 .sui-wrap .sui-col-sm-8{width:66.66667%;max-width:66.66667%;-ms-flex-preferred-size:66.66667%;flex-basis:66.66667%}.sui-2-6-0 .sui-wrap .sui-col-sm-offset-8{margin-left:66.66667%}.sui-2-6-0 .sui-wrap .sui-col-sm-7{width:58.33333%;max-width:58.33333%;-ms-flex-preferred-size:58.33333%;flex-basis:58.33333%}.sui-2-6-0 .sui-wrap .sui-col-sm-offset-7{margin-left:58.33333%}.sui-2-6-0 .sui-wrap .sui-col-sm-6{width:50%;max-width:50%;-ms-flex-preferred-size:50%;flex-basis:50%}.sui-2-6-0 .sui-wrap .sui-col-sm-offset-6{margin-left:50%}.sui-2-6-0 .sui-wrap .sui-col-sm-5{width:41.66667%;max-width:41.66667%;-ms-flex-preferred-size:41.66667%;flex-basis:41.66667%}.sui-2-6-0 .sui-wrap .sui-col-sm-offset-5{margin-left:41.66667%}.sui-2-6-0 .sui-wrap .sui-col-sm-4{width:33.33333%;max-width:33.33333%;-ms-flex-preferred-size:33.33333%;flex-basis:33.33333%}.sui-2-6-0 .sui-wrap .sui-col-sm-offset-4{margin-left:33.33333%}.sui-2-6-0 .sui-wrap .sui-col-sm-3{width:25%;max-width:25%;-ms-flex-preferred-size:25%;flex-basis:25%}.sui-2-6-0 .sui-wrap .sui-col-sm-offset-3{margin-left:25%}.sui-2-6-0 .sui-wrap .sui-col-sm-2{width:16.66667%;max-width:16.66667%;-ms-flex-preferred-size:16.66667%;flex-basis:16.66667%}.sui-2-6-0 .sui-wrap .sui-col-sm-offset-2{margin-left:16.66667%}.sui-2-6-0 .sui-wrap .sui-col-sm-1{width:8.33333%;max-width:8.33333%;-ms-flex-preferred-size:8.33333%;flex-basis:8.33333%}.sui-2-6-0 .sui-wrap .sui-col-sm-offset-1{margin-left:8.33333%}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-col-md-12{width:100%;max-width:100%;-ms-flex-preferred-size:100%;flex-basis:100%}.sui-2-6-0 .sui-wrap .sui-col-md-offset-12{margin-left:100%}.sui-2-6-0 .sui-wrap .sui-col-md-11{width:91.66667%;max-width:91.66667%;-ms-flex-preferred-size:91.66667%;flex-basis:91.66667%}.sui-2-6-0 .sui-wrap .sui-col-md-offset-11{margin-left:91.66667%}.sui-2-6-0 .sui-wrap .sui-col-md-10{width:83.33333%;max-width:83.33333%;-ms-flex-preferred-size:83.33333%;flex-basis:83.33333%}.sui-2-6-0 .sui-wrap .sui-col-md-offset-10{margin-left:83.33333%}.sui-2-6-0 .sui-wrap .sui-col-md-9{width:75%;max-width:75%;-ms-flex-preferred-size:75%;flex-basis:75%}.sui-2-6-0 .sui-wrap .sui-col-md-offset-9{margin-left:75%}.sui-2-6-0 .sui-wrap .sui-col-md-8{width:66.66667%;max-width:66.66667%;-ms-flex-preferred-size:66.66667%;flex-basis:66.66667%}.sui-2-6-0 .sui-wrap .sui-col-md-offset-8{margin-left:66.66667%}.sui-2-6-0 .sui-wrap .sui-col-md-7{width:58.33333%;max-width:58.33333%;-ms-flex-preferred-size:58.33333%;flex-basis:58.33333%}.sui-2-6-0 .sui-wrap .sui-col-md-offset-7{margin-left:58.33333%}.sui-2-6-0 .sui-wrap .sui-col-md-6{width:50%;max-width:50%;-ms-flex-preferred-size:50%;flex-basis:50%}.sui-2-6-0 .sui-wrap .sui-col-md-offset-6{margin-left:50%}.sui-2-6-0 .sui-wrap .sui-col-md-5{width:41.66667%;max-width:41.66667%;-ms-flex-preferred-size:41.66667%;flex-basis:41.66667%}.sui-2-6-0 .sui-wrap .sui-col-md-offset-5{margin-left:41.66667%}.sui-2-6-0 .sui-wrap .sui-col-md-4{width:33.33333%;max-width:33.33333%;-ms-flex-preferred-size:33.33333%;flex-basis:33.33333%}.sui-2-6-0 .sui-wrap .sui-col-md-offset-4{margin-left:33.33333%}.sui-2-6-0 .sui-wrap .sui-col-md-3{width:25%;max-width:25%;-ms-flex-preferred-size:25%;flex-basis:25%}.sui-2-6-0 .sui-wrap .sui-col-md-offset-3{margin-left:25%}.sui-2-6-0 .sui-wrap .sui-col-md-2{width:16.66667%;max-width:16.66667%;-ms-flex-preferred-size:16.66667%;flex-basis:16.66667%}.sui-2-6-0 .sui-wrap .sui-col-md-offset-2{margin-left:16.66667%}.sui-2-6-0 .sui-wrap .sui-col-md-1{width:8.33333%;max-width:8.33333%;-ms-flex-preferred-size:8.33333%;flex-basis:8.33333%}.sui-2-6-0 .sui-wrap .sui-col-md-offset-1{margin-left:8.33333%}}@media (min-width:1200px){.sui-2-6-0 .sui-wrap .sui-col-lg-12{width:100%;max-width:100%;-ms-flex-preferred-size:100%;flex-basis:100%}.sui-2-6-0 .sui-wrap .sui-col-lg-offset-12{margin-left:100%}.sui-2-6-0 .sui-wrap .sui-col-lg-11{width:91.66667%;max-width:91.66667%;-ms-flex-preferred-size:91.66667%;flex-basis:91.66667%}.sui-2-6-0 .sui-wrap .sui-col-lg-offset-11{margin-left:91.66667%}.sui-2-6-0 .sui-wrap .sui-col-lg-10{width:83.33333%;max-width:83.33333%;-ms-flex-preferred-size:83.33333%;flex-basis:83.33333%}.sui-2-6-0 .sui-wrap .sui-col-lg-offset-10{margin-left:83.33333%}.sui-2-6-0 .sui-wrap .sui-col-lg-9{width:75%;max-width:75%;-ms-flex-preferred-size:75%;flex-basis:75%}.sui-2-6-0 .sui-wrap .sui-col-lg-offset-9{margin-left:75%}.sui-2-6-0 .sui-wrap .sui-col-lg-8{width:66.66667%;max-width:66.66667%;-ms-flex-preferred-size:66.66667%;flex-basis:66.66667%}.sui-2-6-0 .sui-wrap .sui-col-lg-offset-8{margin-left:66.66667%}.sui-2-6-0 .sui-wrap .sui-col-lg-7{width:58.33333%;max-width:58.33333%;-ms-flex-preferred-size:58.33333%;flex-basis:58.33333%}.sui-2-6-0 .sui-wrap .sui-col-lg-offset-7{margin-left:58.33333%}.sui-2-6-0 .sui-wrap .sui-col-lg-6{width:50%;max-width:50%;-ms-flex-preferred-size:50%;flex-basis:50%}.sui-2-6-0 .sui-wrap .sui-col-lg-offset-6{margin-left:50%}.sui-2-6-0 .sui-wrap .sui-col-lg-5{width:41.66667%;max-width:41.66667%;-ms-flex-preferred-size:41.66667%;flex-basis:41.66667%}.sui-2-6-0 .sui-wrap .sui-col-lg-offset-5{margin-left:41.66667%}.sui-2-6-0 .sui-wrap .sui-col-lg-4{width:33.33333%;max-width:33.33333%;-ms-flex-preferred-size:33.33333%;flex-basis:33.33333%}.sui-2-6-0 .sui-wrap .sui-col-lg-offset-4{margin-left:33.33333%}.sui-2-6-0 .sui-wrap .sui-col-lg-3{width:25%;max-width:25%;-ms-flex-preferred-size:25%;flex-basis:25%}.sui-2-6-0 .sui-wrap .sui-col-lg-offset-3{margin-left:25%}.sui-2-6-0 .sui-wrap .sui-col-lg-2{width:16.66667%;max-width:16.66667%;-ms-flex-preferred-size:16.66667%;flex-basis:16.66667%}.sui-2-6-0 .sui-wrap .sui-col-lg-offset-2{margin-left:16.66667%}.sui-2-6-0 .sui-wrap .sui-col-lg-1{width:8.33333%;max-width:8.33333%;-ms-flex-preferred-size:8.33333%;flex-basis:8.33333%}.sui-2-6-0 .sui-wrap .sui-col-lg-offset-1{margin-left:8.33333%}}@media (max-width:1200px){.sui-2-6-0 .sui-wrap [class*=sui-col-lg-]:last-child{margin-bottom:0}}@media (max-width:1200px){.sui-2-6-0 .sui-wrap [class*=sui-col-lg-]{margin-bottom:30px}}@media (max-width:783px){.sui-2-6-0 .sui-wrap [class*=sui-col-lg-]{margin-bottom:20px}}@media (max-width:783px){.sui-2-6-0 .sui-wrap [class*=sui-col-md-]:last-child{margin-bottom:0}}@media (max-width:783px){.sui-2-6-0 .sui-wrap [class*=sui-col-md-]{margin-bottom:20px}}@media (max-width:480px){.sui-2-6-0 .sui-wrap [class*=sui-col-sm-]:last-child{margin-bottom:0}}@media (max-width:480px){.sui-2-6-0 .sui-wrap [class*=sui-col-sm-]{margin-bottom:20px}}@media (max-width:0px){.sui-2-6-0 .sui-wrap [class*=sui-col-xs-]:last-child{margin-bottom:0}}@media (max-width:0px){.sui-2-6-0 .sui-wrap [class*=sui-col-xs-]{margin-bottom:20px}}.sui-2-6-0 .sui-wrap .sui-notice-floating p:first-of-type:before,.sui-2-6-0 .sui-wrap .sui-notice-top p:first-of-type:before,.sui-2-6-0 .sui-wrap .sui-notice p:first-of-type:before{content:"I";position:absolute;color:#888;font-size:16px}.sui-2-6-0 .sui-wrap .sui-notice-info.sui-notice-floating,.sui-2-6-0 .sui-wrap .sui-notice-top.sui-notice-info,.sui-2-6-0 .sui-wrap .sui-notice.sui-notice-info{border-left:2px solid #17a8e3}.sui-2-6-0 .sui-wrap .sui-notice-info.sui-notice-floating p:first-of-type:before,.sui-2-6-0 .sui-wrap .sui-notice-top.sui-notice-info p:first-of-type:before,.sui-2-6-0 .sui-wrap .sui-notice.sui-notice-info p:first-of-type:before{color:#17a8e3}.sui-2-6-0 .sui-wrap .sui-notice-success.sui-notice-floating,.sui-2-6-0 .sui-wrap .sui-notice-top.sui-notice-success,.sui-2-6-0 .sui-wrap .sui-notice.sui-notice-success{border-left:2px solid #1abc9c}.sui-2-6-0 .sui-wrap .sui-notice-success.sui-notice-floating p:first-of-type:before,.sui-2-6-0 .sui-wrap .sui-notice-top.sui-notice-success p:first-of-type:before,.sui-2-6-0 .sui-wrap .sui-notice.sui-notice-success p:first-of-type:before{content:"_";color:#1abc9c}.sui-2-6-0 .sui-wrap .sui-notice-top.sui-notice-warning,.sui-2-6-0 .sui-wrap .sui-notice-warning.sui-notice-floating,.sui-2-6-0 .sui-wrap .sui-notice.sui-notice-warning{border-left:2px solid #fecf2f}.sui-2-6-0 .sui-wrap .sui-notice-top.sui-notice-warning p:first-of-type:before,.sui-2-6-0 .sui-wrap .sui-notice-warning.sui-notice-floating p:first-of-type:before,.sui-2-6-0 .sui-wrap .sui-notice.sui-notice-warning p:first-of-type:before{content:"!";color:#fecf2f}.sui-2-6-0 .sui-wrap .sui-notice-error.sui-notice-floating,.sui-2-6-0 .sui-wrap .sui-notice-top.sui-notice-error,.sui-2-6-0 .sui-wrap .sui-notice.sui-notice-error{border-left:2px solid #ff6d6d}.sui-2-6-0 .sui-wrap .sui-notice-error.sui-notice-floating p:first-of-type:before,.sui-2-6-0 .sui-wrap .sui-notice-top.sui-notice-error p:first-of-type:before,.sui-2-6-0 .sui-wrap .sui-notice.sui-notice-error p:first-of-type:before{content:"!";color:#ff6d6d}.sui-2-6-0 .sui-wrap .sui-notice-purple.sui-notice-floating,.sui-2-6-0 .sui-wrap .sui-notice-top.sui-notice-purple,.sui-2-6-0 .sui-wrap .sui-notice.sui-notice-purple{border-left:2px solid #8d00b1}.sui-2-6-0 .sui-wrap .sui-notice-purple.sui-notice-floating p:first-of-type:before,.sui-2-6-0 .sui-wrap .sui-notice-top.sui-notice-purple p:first-of-type:before,.sui-2-6-0 .sui-wrap .sui-notice.sui-notice-purple p:first-of-type:before{color:#8d00b1}.sui-2-6-0 .sui-wrap .sui-notice-orange.sui-notice-floating,.sui-2-6-0 .sui-wrap .sui-notice-top.sui-notice-orange,.sui-2-6-0 .sui-wrap .sui-notice.sui-notice-orange{border-left:2px solid #ff7e41}.sui-2-6-0 .sui-wrap .sui-notice-orange.sui-notice-floating p:first-of-type:before,.sui-2-6-0 .sui-wrap .sui-notice-top.sui-notice-orange p:first-of-type:before,.sui-2-6-0 .sui-wrap .sui-notice.sui-notice-orange p:first-of-type:before{color:#ff7e41}.sui-2-6-0 .sui-wrap .sui-notice-loading.sui-notice-floating,.sui-2-6-0 .sui-wrap .sui-notice-top.sui-notice-loading,.sui-2-6-0 .sui-wrap .sui-notice.sui-notice-loading{border-width:0;background-color:#f2f2f2}.sui-2-6-0 .sui-wrap .sui-notice-loading.sui-notice-floating p:first-of-type:before,.sui-2-6-0 .sui-wrap .sui-notice-top.sui-notice-loading p:first-of-type:before,.sui-2-6-0 .sui-wrap .sui-notice.sui-notice-loading p:first-of-type:before{content:"N";animation:spin 1.3s linear infinite}.sui-2-6-0 .sui-wrap .sui-notice{position:relative;display:block;margin:30px 0;border:1px solid #e6e6e6;border-left:2px solid #888;border-radius:4px;padding:15px 20px 15px 50px;background-color:#fff}.sui-2-6-0 .sui-wrap .sui-notice p{margin:15px 0;font:400 13px/22px Roboto,Arial,sans-serif;letter-spacing:-.25px}.sui-2-6-0 .sui-wrap .sui-notice p:first-child,.sui-2-6-0 .sui-wrap .sui-notice p:first-of-type{margin-top:0}.sui-2-6-0 .sui-wrap .sui-notice p:last-child,.sui-2-6-0 .sui-wrap .sui-notice p:last-of-type{margin-bottom:0}.sui-2-6-0 .sui-wrap .sui-notice p:first-of-type:before{top:18px;left:22px}.sui-2-6-0 .sui-wrap .sui-notice,.sui-2-6-0 .sui-wrap .sui-notice p{color:#333}.sui-2-6-0 .sui-wrap .sui-notice p strong,.sui-2-6-0 .sui-wrap .sui-notice strong{font-weight:500}.sui-2-6-0 .sui-wrap .sui-notice .sui-notice-dismiss{display:block;margin:6px 0 -5px}.sui-2-6-0 .sui-wrap .sui-notice .sui-notice-dismiss a{margin-left:-10px;padding:5px 10px;color:#888;font-size:12px;font-weight:500;text-transform:uppercase;text-decoration:none}.sui-2-6-0 .sui-wrap .sui-notice .sui-notice-dismiss a:active,.sui-2-6-0 .sui-wrap .sui-notice .sui-notice-dismiss a:hover{color:#333}.sui-2-6-0 .sui-wrap .sui-notice:first-child{margin-top:0}.sui-2-6-0 .sui-wrap .sui-notice:last-child{margin-bottom:0}.sui-2-6-0 .sui-wrap .sui-notice.sui-notice-icon-tick p:first-of-type:before{content:"_"}.sui-2-6-0 .sui-wrap .sui-notice .sui-notice-buttons{margin-top:5px}.sui-2-6-0 .sui-wrap .sui-notice.sui-no-notice-icon{padding:15px 20px}.sui-2-6-0 .sui-wrap .sui-notice.sui-no-notice-icon p:first-of-type:before{content:none;margin:0;padding:0}.sui-2-6-0 .sui-wrap .sui-notice.sui-no-notice-icon .sui-notice-buttons{margin-left:0}.sui-2-6-0 .sui-wrap .sui-notice-floating,.sui-2-6-0 .sui-wrap .sui-notice-top{width:100%;max-width:600px;display:block;position:fixed;z-index:99999;top:17px;left:50%;margin:0;margin-left:80px;border-radius:4px;border-left:2px solid #888;padding:15px 20px 15px 50px;background-color:#fff;box-shadow:0 5px 25px 0 rgba(0,0,0,.15);transform:translateX(-50%)}.sui-2-6-0 .sui-wrap .sui-notice-floating .sui-notice-content,.sui-2-6-0 .sui-wrap .sui-notice-top .sui-notice-content{position:relative}.sui-2-6-0 .sui-wrap .sui-notice-floating p,.sui-2-6-0 .sui-wrap .sui-notice-top p{position:relative;margin:15px 10px 15px 0;color:#666;font:400 13px/22px Roboto,Arial,sans-serif;letter-spacing:-.19px}.sui-2-6-0 .sui-wrap .sui-notice-floating p:first-of-type:before,.sui-2-6-0 .sui-wrap .sui-notice-top p:first-of-type:before{top:2px;left:-28px}.sui-2-6-0 .sui-wrap .sui-notice-floating p strong,.sui-2-6-0 .sui-wrap .sui-notice-top p strong{color:#333;font-weight:500}.sui-2-6-0 .sui-wrap .sui-notice-floating p:first-child,.sui-2-6-0 .sui-wrap .sui-notice-floating p:first-of-type,.sui-2-6-0 .sui-wrap .sui-notice-top p:first-child,.sui-2-6-0 .sui-wrap .sui-notice-top p:first-of-type{margin-top:0}.sui-2-6-0 .sui-wrap .sui-notice-floating p:last-child,.sui-2-6-0 .sui-wrap .sui-notice-floating p:last-of-type,.sui-2-6-0 .sui-wrap .sui-notice-top p:last-child,.sui-2-6-0 .sui-wrap .sui-notice-top p:last-of-type{margin-bottom:0}.sui-2-6-0 .sui-wrap .sui-can-dismiss.sui-notice-floating,.sui-2-6-0 .sui-wrap .sui-notice-top.sui-can-dismiss{display:-ms-flexbox;display:flex}.sui-2-6-0 .sui-wrap .sui-can-dismiss.sui-notice-floating .sui-notice-content,.sui-2-6-0 .sui-wrap .sui-notice-top.sui-can-dismiss .sui-notice-content{-ms-flex:1;flex:1;-ms-flex-item-align:center;align-self:center}.sui-2-6-0 .sui-wrap .sui-can-dismiss.sui-notice-floating .sui-notice-dismiss,.sui-2-6-0 .sui-wrap .sui-notice-top.sui-can-dismiss .sui-notice-dismiss{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex:0 0 60px;flex:0 0 60px;margin:-15px -20px -15px 0}.sui-2-6-0 .sui-wrap .sui-can-dismiss.sui-notice-floating .sui-notice-dismiss a,.sui-2-6-0 .sui-wrap .sui-notice-top.sui-can-dismiss .sui-notice-dismiss a{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;-ms-flex:1 1 auto;flex:1 1 auto;border-radius:0 4px 4px 0;background-color:#f8f8f8;color:#888;font:500 11px/13px Roboto,Arial,sans-serif;text-transform:uppercase;text-align:center;transition:.3s ease}.sui-2-6-0 .sui-wrap .sui-can-dismiss.sui-notice-floating .sui-notice-dismiss a:before,.sui-2-6-0 .sui-wrap .sui-notice-top.sui-can-dismiss .sui-notice-dismiss a:before{color:#888;font-size:13px}.sui-2-6-0 .sui-wrap .sui-can-dismiss.sui-notice-floating .sui-notice-dismiss a:active,.sui-2-6-0 .sui-wrap .sui-can-dismiss.sui-notice-floating .sui-notice-dismiss a:hover,.sui-2-6-0 .sui-wrap .sui-notice-top.sui-can-dismiss .sui-notice-dismiss a:active,.sui-2-6-0 .sui-wrap .sui-notice-top.sui-can-dismiss .sui-notice-dismiss a:hover{background-color:#e6e6e6}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-notice-floating,.sui-2-6-0 .sui-wrap .sui-notice-top{width:90%;top:23px;margin-left:0}}.sui-2-6-0 .sui-wrap .sui-notice-floating{width:auto;display:-ms-flexbox;display:flex;padding:11px 20px 12px 50px}.sui-2-6-0 .sui-wrap .sui-notice-floating p{margin:15px 20px 15px 0}.sui-2-6-0 .sui-wrap .sui-notice-floating .sui-notice-content{-ms-flex:1;flex:1;-ms-flex-item-align:center;align-self:center}.sui-2-6-0 .sui-wrap .sui-notice-floating .sui-notice-buttons{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.sui-2-6-0.wp-admin.folded .sui-notice-top,.sui-2-6-0.wp-admin.folded .sui-wrap .sui-notice-floating{margin-left:18px}@media (max-width:782px){.sui-2-6-0.wp-admin.folded .sui-notice-top,.sui-2-6-0.wp-admin.folded .sui-wrap .sui-notice-floating{margin-left:0}}.sui-2-6-0 .sui-wrap .sui-header{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;position:relative;margin-bottom:30px;line-height:1}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-header h1{-ms-flex:0 0 100%;flex:0 0 100%}}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-header .sui-actions-right{margin-top:10px;margin-right:auto;margin-left:0}}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-header .sui-actions-left{margin-top:10px;margin-right:0;margin-left:0}}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-header.sui-header-inline h1+*{margin-left:10px}}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-header.sui-header-inline h1{-ms-flex:1;flex:1}}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-header.sui-header-inline .sui-actions-left,.sui-2-6-0 .sui-wrap .sui-header.sui-header-inline .sui-actions-right{-ms-flex:0 0 auto;flex:0 0 auto;margin-top:0;margin-right:0}}@media (min-width:1200px){.sui-2-6-0 .sui-wrap .sui-header.sui-with-floating-input h1{padding-right:260px}}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-header.sui-with-floating-input{margin-bottom:15px}}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-header{margin-bottom:20px}}.sui-2-6-0 .sui-wrap .sui-header-title{color:#333;margin:0;text-align:left;font-weight:700;max-width:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sui-2-6-0 .sui-wrap .sui-summary{padding:10px 20px}.sui-2-6-0 .sui-wrap .sui-summary .sui-summary-image-space,.sui-2-6-0 .sui-wrap .sui-summary .sui-summary-segment{padding:10px 0}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-summary .sui-summary-image-space,.sui-2-6-0 .sui-wrap .sui-summary .sui-summary-segment{padding:0 15px}}.sui-2-6-0 .sui-wrap .sui-summary .sui-summary-image-space{display:none}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-summary .sui-summary-image-space{min-width:222px;min-height:212px;-ms-flex:0 0 222px;flex:0 0 222px}}.sui-2-6-0 .sui-wrap .sui-summary .sui-summary-segment{display:block}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-summary .sui-summary-segment .sui-list{padding-right:15px;padding-left:15px}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-summary .sui-summary-segment .sui-summary-details{padding-right:30px;padding-left:30px}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-summary .sui-summary-segment:first-child .sui-list,.sui-2-6-0 .sui-wrap .sui-summary .sui-summary-segment:first-child .sui-summary-details{padding-left:0}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-summary .sui-summary-segment:last-child .sui-list,.sui-2-6-0 .sui-wrap .sui-summary .sui-summary-segment:last-child .sui-summary-details{padding-right:0}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-summary .sui-summary-segment{overflow:hidden;-ms-flex:1;flex:1;text-overflow:ellipsis;white-space:nowrap}}.sui-2-6-0 .sui-wrap .sui-summary .sui-summary-details{color:#333;font-size:13px;line-height:22px;font-family:Roboto,Arial,sans-serif;letter-spacing:-.25px;text-align:center}.sui-2-6-0 .sui-wrap .sui-summary .sui-summary-details span{display:inline-block}.sui-2-6-0 .sui-wrap .sui-summary .sui-summary-details .sui-summary-sub{display:block;margin-top:0;margin-bottom:5px;color:#888}.sui-2-6-0 .sui-wrap .sui-summary .sui-summary-details .sui-summary-sub:last-child{margin-bottom:0}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-summary .sui-summary-details .sui-summary-sub:last-child{margin-bottom:0}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-summary .sui-summary-details .sui-summary-sub{margin-bottom:24px;white-space:normal}}.sui-2-6-0 .sui-wrap .sui-summary .sui-summary-details .sui-summary-percent{margin-left:-5px}.sui-2-6-0 .sui-wrap .sui-summary .sui-summary-details .sui-summary-large{font-size:50px;line-height:55px}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-summary .sui-summary-details .sui-summary-large+.sui-summary-sub{margin-top:-1px}}.sui-2-6-0 .sui-wrap .sui-summary .sui-summary-details .sui-summary-detail{display:block;font-size:15px;font-weight:500}.sui-2-6-0 .sui-wrap .sui-summary .sui-summary-details .sui-summary-detail img{position:relative;vertical-align:middle;top:-1px;margin-right:6px}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-summary .sui-summary-details .sui-summary-detail img{float:left;vertical-align:unset;top:1px}}.sui-2-6-0 .sui-wrap .sui-summary .sui-summary-details .sui-summary-detail+.sui-summary-sub{margin-top:5px}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-summary .sui-summary-details .sui-summary-detail{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}}.sui-2-6-0 .sui-wrap .sui-summary .sui-summary-details [class*=sui-icon-]{position:relative;top:-22px;left:5px;font-size:16px}.sui-2-6-0 .sui-wrap .sui-summary .sui-summary-details [class*=sui-icon-]+.sui-summary-percent{margin-left:-20px}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-summary .sui-summary-details{padding-top:30px;padding-bottom:30px;text-align:left}}.sui-2-6-0 .sui-wrap .sui-summary .sui-list li span{white-space:normal}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-summary .sui-list{padding-top:30px;padding-bottom:30px}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-summary.sui-summary-sm .sui-summary-image-space{min-width:222px;min-height:151px;-ms-flex:0 0 222px;flex:0 0 222px}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-summary:not(.sui-unbranded):not(.sui-summary-sm) .sui-summary-image-space{display:block}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-summary:not(.sui-unbranded):not(.sui-summary-sm){background-image:url(../images/forminator-summary@2x.png);background-size:192px 182px;background-position:30px bottom;background-repeat:no-repeat}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-summary:not(.sui-unbranded).sui-summary-sm .sui-summary-image-space{display:block}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-summary:not(.sui-unbranded).sui-summary-sm{background-image:url(../images/forminator-summary-sm@2x.png);background-size:192px 121px;background-position:30px bottom;background-repeat:no-repeat}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-summary.sui-unbranded .sui-summary-image-space:first-child+.sui-summary-segment .sui-list,.sui-2-6-0 .sui-wrap .sui-summary.sui-unbranded .sui-summary-image-space:first-child+.sui-summary-segment .sui-summary-details{padding-left:0}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-summary.sui-unbranded .sui-summary-image-space{display:none}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-summary.sui-rebranded:not(.sui-summary-sm) .sui-summary-image-space{background-size:contain;background-position:50%;background-repeat:no-repeat}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-summary.sui-rebranded:not(.sui-summary-sm){background-image:unset!important}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-summary.sui-rebranded.sui-summary-sm .sui-summary-image-space{background-size:contain;background-position:50%;background-repeat:no-repeat}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-summary.sui-rebranded.sui-summary-sm{background-image:unset!important}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-summary{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:0 15px}}.sui-2-6-0 .sui-wrap .sui-list{margin:20px 0;padding:0;border:0}.sui-2-6-0 .sui-wrap .sui-list,.sui-2-6-0 .sui-wrap .sui-list li{list-style:none}.sui-2-6-0 .sui-wrap .sui-list li{display:-ms-flexbox;display:flex;margin:0;padding:9px 0;border:0;border-bottom:1px solid #e6e6e6;color:#888;font-size:13px;line-height:22px;font-family:Roboto,Arial,sans-serif;font-weight:500;letter-spacing:-.25px}.sui-2-6-0 .sui-wrap .sui-list li [class*=sui-list-]{padding:0 10px}.sui-2-6-0 .sui-wrap .sui-list li [class*=sui-list-]:first-child{padding-left:0}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-list li [class*=sui-list-]:first-child{padding-left:0}}.sui-2-6-0 .sui-wrap .sui-list li [class*=sui-list-]:last-child{padding-right:0}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-list li [class*=sui-list-]:last-child{padding-right:0}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-list li [class*=sui-list-]{padding:0 15px}}.sui-2-6-0 .sui-wrap .sui-list li .sui-list-label{-ms-flex:1;flex:1;color:#333}.sui-2-6-0 .sui-wrap .sui-list li .sui-list-detail{-ms-flex:0 0 auto;flex:0 0 auto;text-align:right}.sui-2-6-0 .sui-wrap .sui-list li:first-child{padding-top:0}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-list li:first-child{padding-top:0}}.sui-2-6-0 .sui-wrap .sui-list li:last-child{padding-bottom:0;border-bottom:0}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-list li:last-child{padding-bottom:0}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-list li{padding:19px 0}}.sui-2-6-0 .sui-wrap .sui-list:first-child{margin-top:0}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-list:first-child{margin-top:0}}.sui-2-6-0 .sui-wrap .sui-list:last-child{margin-bottom:0}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-list:last-child{margin-bottom:0}}.sui-2-6-0 .sui-wrap .sui-list ol,.sui-2-6-0 .sui-wrap .sui-list ul{display:none}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-list{margin:30px 0}}.sui-2-6-0 .sui-wrap .sui-tooltip{position:relative}.sui-2-6-0 .sui-wrap .sui-tooltip:after,.sui-2-6-0 .sui-wrap .sui-tooltip:before{content:" ";opacity:0;-webkit-backface-visibility:hidden;backface-visibility:hidden;pointer-events:none;position:absolute;z-index:1;transition:.2s}.sui-2-6-0 .sui-wrap .sui-tooltip:before{left:50%;bottom:100%;border:5px solid transparent;border-top-color:#333;transform:translateX(-50%)}.sui-2-6-0 .sui-wrap .sui-tooltip:after{content:attr(data-tooltip);min-width:var(--tooltip-width,40px);left:50%;bottom:100%;margin-bottom:10px;padding:12px;border-radius:4px;background-color:#333;box-sizing:border-box;transform:translateX(-50%);color:#fff;font:500 12px/18px Roboto,Arial,sans-serif;letter-spacing:-.25px;text-transform:none;text-align:var(--tooltip-text-align,center)}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-tooltip:after{white-space:nowrap}}.sui-2-6-0 .sui-wrap .sui-tooltip.sui-tooltip-constrained:after{min-width:var(--tooltip-width,240px);white-space:normal}.sui-2-6-0 .sui-wrap .sui-tooltip.sui-tooltip-top-left:after{left:0;transform:translateX(0)}.sui-2-6-0 .sui-wrap .sui-tooltip.sui-tooltip-top-right:after{right:0;left:unset;transform:translateX(0)}.sui-2-6-0 .sui-wrap .sui-tooltip.sui-tooltip-bottom-left:before,.sui-2-6-0 .sui-wrap .sui-tooltip.sui-tooltip-bottom-right:before,.sui-2-6-0 .sui-wrap .sui-tooltip.sui-tooltip-bottom:before{top:100%;bottom:unset;border-top-color:transparent;border-bottom-color:#333}.sui-2-6-0 .sui-wrap .sui-tooltip.sui-tooltip-bottom-left:after,.sui-2-6-0 .sui-wrap .sui-tooltip.sui-tooltip-bottom-right:after,.sui-2-6-0 .sui-wrap .sui-tooltip.sui-tooltip-bottom:after{top:100%;bottom:unset;margin-top:10px;margin-bottom:0}.sui-2-6-0 .sui-wrap .sui-tooltip.sui-tooltip-bottom-left:after{left:0;transform:translate(0)}.sui-2-6-0 .sui-wrap .sui-tooltip.sui-tooltip-bottom-right:after{left:unset;right:0;transform:translate(0)}.sui-2-6-0 .sui-wrap .sui-tooltip.sui-tooltip-left:before{top:50%;right:100%;bottom:unset;left:unset;border-top-color:transparent;border-left-color:#333;transform:translateY(-50%)}.sui-2-6-0 .sui-wrap .sui-tooltip.sui-tooltip-left:after{top:50%;right:100%;bottom:unset;left:unset;margin-right:10px;margin-bottom:0;transform:translateY(-50%)}.sui-2-6-0 .sui-wrap .sui-tooltip.sui-tooltip-right:before{top:50%;bottom:unset;left:100%;border-top-color:transparent;border-right-color:#333;transform:translateY(-50%)}.sui-2-6-0 .sui-wrap .sui-tooltip.sui-tooltip-right:after{top:50%;bottom:unset;left:100%;margin-left:10px;margin-bottom:0;transform:translateY(-50%)}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-tooltip.sui-tooltip-mobile:after{min-width:var(--tooltip-width-mobile,120px);white-space:normal}}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-tooltip.sui-tooltip-top-left-mobile:before,.sui-2-6-0 .sui-wrap .sui-tooltip.sui-tooltip-top-mobile:before,.sui-2-6-0 .sui-wrap .sui-tooltip.sui-tooltip-top-right-mobile:before{top:unset;bottom:100%;left:50%;right:unset;border-top-color:#333;border-right-color:transparent;border-bottom-color:transparent;border-left-color:transparent;transform:translateX(-50%)}}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-tooltip.sui-tooltip-top-left-mobile:after,.sui-2-6-0 .sui-wrap .sui-tooltip.sui-tooltip-top-mobile:after,.sui-2-6-0 .sui-wrap .sui-tooltip.sui-tooltip-top-right-mobile:after{min-width:var(--tooltip-width-mobile,120px);top:unset;bottom:100%;margin:0 0 10px;white-space:normal}}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-tooltip.sui-tooltip-top-mobile:after{right:unset;left:50%;transform:translateX(-50%)}}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-tooltip.sui-tooltip-top-left-mobile:after{right:unset;left:0;transform:translateX(0)}}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-tooltip.sui-tooltip-top-right-mobile:after{right:0;left:unset;transform:translateX(0)}}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-tooltip.sui-tooltip-bottom-left-mobile:before,.sui-2-6-0 .sui-wrap .sui-tooltip.sui-tooltip-bottom-mobile:before,.sui-2-6-0 .sui-wrap .sui-tooltip.sui-tooltip-bottom-right-mobile:before{top:100%;bottom:unset;left:50%;right:unset;border-top-color:transparent;border-right-color:transparent;border-bottom-color:#333;border-left-color:transparent;transform:translateX(-50%)}}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-tooltip.sui-tooltip-bottom-left-mobile:after,.sui-2-6-0 .sui-wrap .sui-tooltip.sui-tooltip-bottom-mobile:after,.sui-2-6-0 .sui-wrap .sui-tooltip.sui-tooltip-bottom-right-mobile:after{min-width:var(--tooltip-width-mobile,120px);top:100%;bottom:unset;margin:10px 0 0;white-space:normal}}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-tooltip.sui-tooltip-bottom-mobile:after{right:unset;left:50%;transform:translateX(-50%)}}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-tooltip.sui-tooltip-bottom-left-mobile:after{right:unset;left:0;transform:translateX(0)}}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-tooltip.sui-tooltip-bottom-right-mobile:after{right:0;left:unset;transform:translateX(0)}}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-tooltip.sui-tooltip-left-mobile:before{top:50%;right:100%;bottom:unset;left:unset;border-top-color:transparent;border-right-color:transparent;border-bottom-color:transparent;border-left-color:#333;transform:translateY(-50%)}}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-tooltip.sui-tooltip-left-mobile:after{min-width:var(--tooltip-width-mobile,120px);top:50%;right:100%;bottom:unset;left:unset;margin:0 10px 0 0;transform:translateY(-50%);white-space:normal}}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-tooltip.sui-tooltip-right-mobile:before{top:50%;right:unset;bottom:unset;left:100%;border-top-color:transparent;border-right-color:#333;border-bottom-color:transparent;border-left-color:transparent;transform:translateY(-50%)}}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-tooltip.sui-tooltip-right-mobile:after{min-width:var(--tooltip-width-mobile,120px);top:50%;right:unset;bottom:unset;left:100%;margin:0 0 0 10px;transform:translateY(-50%);white-space:normal}}.sui-2-6-0 .sui-wrap .sui-tooltip:hover:after,.sui-2-6-0 .sui-wrap .sui-tooltip:hover:before{opacity:1;-webkit-backface-visibility:visible;backface-visibility:visible}.sui-2-6-0 .select-container{cursor:pointer;display:block;position:relative;z-index:1;border:1px solid #ddd;border-radius:4px;background-color:#fafafa;text-align:left;transition-property:background;transition-duration:.3s}.sui-2-6-0 .select-container select{display:none}.sui-2-6-0 .select-container .dropdown-handle{width:39px;display:block;position:absolute;z-index:1011;top:0;right:0;padding:0;line-height:38px;text-align:center;transition-property:color,border-color;transition-duration:.3s}.sui-2-6-0 .select-container .dropdown-handle [class*=sui-icon-]{height:38px;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin:0!important;font-size:12px!important;transition:transform .2s linear}.sui-2-6-0 .select-container .dropdown-handle [class*=sui-icon-]:before{display:block;-ms-flex:0 0 auto;flex:0 0 auto}.sui-2-6-0 .select-container .select-list-container{zoom:1;display:block;position:relative;padding-right:39px}.sui-2-6-0 .select-container .select-list-container .list-value{width:100%;height:auto;cursor:pointer;overflow:hidden;display:block;position:relative;padding:8px 8px 8px 14px;border:0;border-radius:0;background-color:transparent;background-clip:padding-box;color:#333;font:500 15px/22px Roboto,Arial,sans-serif;letter-spacing:-.25px;text-align:left;text-decoration:none;text-overflow:ellipsis;white-space:nowrap;transition-property:color;transition-duration:.3s}.sui-2-6-0 .select-container .select-list-container .list-value:active,.sui-2-6-0 .select-container .select-list-container .list-value:focus,.sui-2-6-0 .select-container .select-list-container .list-value:hover{outline:none;box-shadow:none}.sui-2-6-0 .select-container .select-list-container ul.list-results{width:0;max-height:200px;overflow-y:auto;display:none;position:absolute;z-index:1010;top:38px;right:-9999px;left:-9999px;margin:0 -1px;padding:10px 0;border:1px solid #ddd;border-radius:4px;background-color:#fff;box-shadow:0 3px 7px 0 rgba(0,0,0,.07);transition-property:opacity,border-color;transition-duration:.3s}.sui-2-6-0 .select-container .select-list-container ul.list-results,.sui-2-6-0 .select-container .select-list-container ul.list-results li,.sui-2-6-0 .select-container .select-list-container ul.list-results ul{-webkit-padding-start:0;padding-inline-start:0;list-style:none}.sui-2-6-0 .select-container .select-list-container ul.list-results li{cursor:pointer;margin:0;padding:5px 14px;color:#888;font:500 15px/25px Roboto,Arial,sans-serif;letter-spacing:-.25px;word-wrap:break-word;transition:.3s ease}.sui-2-6-0 .select-container .select-list-container ul.list-results li [class*=sui-icon-]{margin-right:7px;text-align:center}.sui-2-6-0 .select-container .select-list-container ul.list-results li [class*=sui-icon-]:before{color:inherit}.sui-2-6-0 .select-container .select-list-container ul.list-results li.current{background-color:#888;color:#fff}.sui-2-6-0 .select-container .select-list-container ul.list-results li:not(.current):hover{background-color:rgba(51,51,51,.05);color:#666}.sui-2-6-0 .select-container .select-list-container ul.list-results li.sui-disabled{cursor:not-allowed;opacity:.5;pointer-events:none}.sui-2-6-0 .select-container .select-list-container ul.list-results .optgroup{cursor:default}.sui-2-6-0 .select-container .select-list-container ul.list-results .optgroup li.optgroup-label{cursor:default;pointer-events:none;color:#aaa;font-size:12px;font-weight:500}.sui-2-6-0 .select-container .select-list-container ul.list-results .optgroup li.optgroup-label:hover{background-color:transparent}.sui-2-6-0 .select-container .select-list-container ul.list-results .optgroup li:not(.optgroup-label){cursor:pointer;padding-left:28px}.sui-2-6-0 .select-container .select-list-container ul.list-results:active,.sui-2-6-0 .select-container .select-list-container ul.list-results:focus,.sui-2-6-0 .select-container .select-list-container ul.list-results:hover{outline:none;box-shadow:none}.sui-2-6-0 .select-container:hover{background-color:#fff}.sui-2-6-0 .select-container.active{z-index:13;background-color:#fff}.sui-2-6-0 .select-container.active .dropdown-handle [class*=sui-icon-]{transform:rotate(180deg)}.sui-2-6-0 .select-container.active .select-list-container .list-results{width:auto;display:block;left:0;right:0;transition-duration:0ms}.sui-2-6-0 .select-container.sui-mobile-nav{margin-bottom:30px;background-color:#fff}.sui-2-6-0 .select-container.sui-mobile-nav .dropdown-handle{background-color:#fff;font-size:13px}.sui-2-6-0 .select-container.sui-mobile-nav.active .dropdown-handle{background-color:transparent;font-size:13px}@media (max-width:782px){.sui-2-6-0 .select-container.sui-mobile-nav{margin-bottom:20px}}.sui-2-6-0 .select-container.sui-select-sm .dropdown-handle{width:29px;line-height:28px}.sui-2-6-0 .select-container.sui-select-sm .dropdown-handle [class*=sui-icon-]{height:28px}.sui-2-6-0 .select-container.sui-select-sm .select-list-container{padding-right:29px}.sui-2-6-0 .select-container.sui-select-sm .select-list-container .list-value{padding:6px 7px 6px 11px;font-size:13px;line-height:16px}.sui-2-6-0 .select-container.sui-select-sm .select-list-container .list-results{top:28px;padding:7px 0}.sui-2-6-0 .select-container.sui-select-sm .select-list-container .list-results li{font-size:13px;line-height:20px}.sui-2-6-0 .select-container.sui-select-inline{width:auto;max-width:100%;min-width:120px;display:-ms-inline-flexbox;display:inline-flex;margin-right:10px}.sui-2-6-0 .select-container.sui-select-inline .select-list-container{-ms-flex:0 0 100%;flex:0 0 100%}.sui-2-6-0 .select-container.sui-select-inline:last-child{margin-right:0}.sui-2-6-0 .select-container.sui-select-colors .select-list-container .list-value{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding-top:5px;padding-left:5px;padding-bottom:5px}.sui-2-6-0 .select-container.sui-select-colors .select-list-container .list-value span{width:30px;height:30px;display:block;margin-right:10px;border:1px solid transparent;border-radius:2px}.sui-2-6-0 .select-container.sui-select-colors .select-list-container .list-value span[data-color="#FFF"],.sui-2-6-0 .select-container.sui-select-colors .select-list-container .list-value span[data-color="#FFFFFF"],.sui-2-6-0 .select-container.sui-select-colors .select-list-container .list-value span[data-color=white]{border-color:#2c2e2f}.sui-2-6-0 .select-container.sui-select-colors .select-list-container .list-results li{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding-left:9px;padding-right:9px;font-size:13px;line-height:20px}.sui-2-6-0 .select-container.sui-select-colors .select-list-container .list-results li span{width:20px;height:20px;display:block;margin-right:10px;border:1px solid transparent;border-radius:2px}.sui-2-6-0 .select-container.sui-select-colors .select-list-container .list-results li span[data-color="#FFF"],.sui-2-6-0 .select-container.sui-select-colors .select-list-container .list-results li span[data-color="#FFFFFF"],.sui-2-6-0 .select-container.sui-select-colors .select-list-container .list-results li span[data-color=white]{border-color:#2c2e2f}.sui-2-6-0 .list-table>tbody>.select-open td,.sui-2-6-0 .list-table>tbody>.select-open th,.sui-2-6-0 .list-table>tfoot>.select-open td,.sui-2-6-0 .list-table>tfoot>.select-open th,.sui-2-6-0 .list-table>thead>.select-open td,.sui-2-6-0 .list-table>thead>.select-open th{z-index:9}.sui-2-6-0 .sui-wrap .sui-tag{height:auto;min-height:26px;cursor:default;display:inline-block;margin:0 3px;padding:0 16px;border:2px solid transparent;border-radius:13px;background-color:#f2f2f2;color:#333;font:500 12px/22px Roboto,Arial,sans-serif;letter-spacing:-.25px;text-align:center}.sui-2-6-0 .sui-wrap .sui-tag.sui-tag-truncated{max-width:100%}.sui-2-6-0 .sui-wrap .sui-tag.sui-tag-truncated span{max-width:100%;overflow:hidden;display:block;text-overflow:ellipsis;white-space:nowrap}.sui-2-6-0 .sui-wrap .sui-tag.sui-tag-error,.sui-2-6-0 .sui-wrap .sui-tag.sui-tag-red{background-color:#ff6d6d;color:#fff}.sui-2-6-0 .sui-wrap .sui-tag.sui-tag-warning,.sui-2-6-0 .sui-wrap .sui-tag.sui-tag-yellow{background-color:#fecf2f;color:#333}.sui-2-6-0 .sui-wrap .sui-tag.sui-tag-green,.sui-2-6-0 .sui-wrap .sui-tag.sui-tag-success,.sui-2-6-0 .sui-wrap .sui-tag.sui-tag-upgrade,.sui-2-6-0 .sui-wrap .sui-tag.sui-tag-upsell{background-color:#1abc9c;color:#fff}.sui-2-6-0 .sui-wrap .sui-tag.sui-tag-blue,.sui-2-6-0 .sui-wrap .sui-tag.sui-tag-branded{background-color:#17a8e3;color:#fff}.sui-2-6-0 .sui-wrap .sui-tag.sui-tag-purple{background-color:#8d00b1;color:#fff}.sui-2-6-0 .sui-wrap .sui-tag.sui-tag-disabled,.sui-2-6-0 .sui-wrap .sui-tag.sui-tag-inactive{background-color:#f2f2f2;color:#aaa}.sui-2-6-0 .sui-wrap .sui-tag.sui-tag-uppercase{text-transform:uppercase}.sui-2-6-0 .sui-wrap .sui-tag.sui-tag-beta,.sui-2-6-0 .sui-wrap .sui-tag.sui-tag-pro{min-height:12px;padding:2px 8px 1px;border:0;border-radius:6px;font-size:8px;line-height:9px;text-align:center;text-transform:uppercase}.sui-2-6-0 .sui-wrap .sui-tag.sui-tag-pro{background-color:#8d00b1;color:#fff}.sui-2-6-0 .sui-wrap .sui-tag.sui-tag-beta{background-color:#ff7e41;color:#fff}.sui-2-6-0 .sui-wrap .sui-tag.sui-tag-sm{min-height:18px;padding:2px 10px;font-size:10px;line-height:12px;font-weight:700}.sui-2-6-0 .sui-wrap .sui-tag.sui-tag-ghost.sui-tag-error,.sui-2-6-0 .sui-wrap .sui-tag.sui-tag-ghost.sui-tag-red{border-color:#ffe5e9;background-color:transparent;color:#ff6d6d}.sui-2-6-0 .sui-wrap .sui-tag.sui-tag-ghost.sui-tag-warning,.sui-2-6-0 .sui-wrap .sui-tag.sui-tag-ghost.sui-tag-yellow{border-color:#fff5d5;background-color:transparent;color:#fecf2f}.sui-2-6-0 .sui-wrap .sui-tag.sui-tag-ghost.sui-tag-green,.sui-2-6-0 .sui-wrap .sui-tag.sui-tag-ghost.sui-tag-success,.sui-2-6-0 .sui-wrap .sui-tag.sui-tag-ghost.sui-tag-upgrade,.sui-2-6-0 .sui-wrap .sui-tag.sui-tag-ghost.sui-tag-upsell{border-color:#d1f1ea;background-color:transparent;color:#1abc9c}.sui-2-6-0 .sui-wrap .sui-tag.sui-tag-ghost.sui-tag-blue,.sui-2-6-0 .sui-wrap .sui-tag.sui-tag-ghost.sui-tag-branded{border-color:#e1f6ff;background-color:transparent;color:#17a8e3}.sui-2-6-0 .sui-wrap .sui-tag.sui-tag-ghost.sui-tag-purple{border-color:#f9e1ff;background-color:transparent;color:#8d00b1}.sui-2-6-0 .sui-wrap .sui-tag:first-child{margin-left:0}.sui-2-6-0 .sui-wrap .sui-tag:last-child{margin-right:0}.sui-2-6-0 .sui-wrap .sui-label,.sui-2-6-0 .sui-wrap .sui-label-inline{display:-ms-inline-flexbox;display:inline-flex;padding:0;border:0;color:#888;font:500 12px/16px Roboto,Arial,sans-serif}.sui-2-6-0 .sui-wrap .sui-form-control,.sui-2-6-0 .sui-wrap .sui-multi-checkbox{width:100%;height:40px;margin:0;padding:9px 14px;border:1px solid #ddd;border-radius:4px;background-color:#fafafa;background-image:none;color:#333;font:500 15px/20px Roboto,Arial,sans-serif;letter-spacing:-.25px;transition:.3s ease-in-out}.sui-2-6-0 .sui-wrap .sui-form-control,.sui-2-6-0 .sui-wrap .sui-form-control:active,.sui-2-6-0 .sui-wrap .sui-form-control:focus,.sui-2-6-0 .sui-wrap .sui-form-control:hover,.sui-2-6-0 .sui-wrap .sui-multi-checkbox,.sui-2-6-0 .sui-wrap .sui-multi-checkbox:active,.sui-2-6-0 .sui-wrap .sui-multi-checkbox:focus,.sui-2-6-0 .sui-wrap .sui-multi-checkbox:hover{outline:none;box-shadow:none}.sui-2-6-0 .sui-wrap .sui-form-control:focus,.sui-2-6-0 .sui-wrap .sui-form-control:hover,.sui-2-6-0 .sui-wrap .sui-multi-checkbox:focus,.sui-2-6-0 .sui-wrap .sui-multi-checkbox:hover{border-color:#ddd;background-color:#fff}.sui-2-6-0 .sui-wrap .sui-form-control:focus,.sui-2-6-0 .sui-wrap .sui-multi-checkbox:focus{background-color:#fff;color:#333}.sui-2-6-0 .sui-wrap .sui-form-control::-ms-input-placeholder,.sui-2-6-0 .sui-wrap .sui-multi-checkbox::-ms-input-placeholder{color:#aaa}.sui-2-6-0 .sui-wrap .sui-form-control::placeholder,.sui-2-6-0 .sui-wrap .sui-multi-checkbox::placeholder{color:#aaa}.sui-2-6-0 .sui-wrap .sui-disabled.sui-form-control,.sui-2-6-0 .sui-wrap .sui-disabled.sui-multi-checkbox,.sui-2-6-0 .sui-wrap .sui-form-control[disabled],.sui-2-6-0 .sui-wrap .sui-multi-checkbox[disabled],fieldset[disabled] .sui-2-6-0 .sui-wrap .sui-form-control,fieldset[disabled] .sui-2-6-0 .sui-wrap .sui-multi-checkbox{cursor:not-allowed}.sui-2-6-0 .sui-wrap .sui-disabled.sui-form-control,.sui-2-6-0 .sui-wrap .sui-disabled.sui-form-control:focus,.sui-2-6-0 .sui-wrap .sui-disabled.sui-form-control:hover,.sui-2-6-0 .sui-wrap .sui-disabled.sui-multi-checkbox,.sui-2-6-0 .sui-wrap .sui-disabled.sui-multi-checkbox:focus,.sui-2-6-0 .sui-wrap .sui-disabled.sui-multi-checkbox:hover,.sui-2-6-0 .sui-wrap .sui-form-control[disabled],.sui-2-6-0 .sui-wrap .sui-form-control[disabled]:focus,.sui-2-6-0 .sui-wrap .sui-form-control[disabled]:hover,.sui-2-6-0 .sui-wrap .sui-multi-checkbox[disabled],.sui-2-6-0 .sui-wrap .sui-multi-checkbox[disabled]:focus,.sui-2-6-0 .sui-wrap .sui-multi-checkbox[disabled]:hover,fieldset[disabled] .sui-2-6-0 .sui-wrap .sui-form-control,fieldset[disabled] .sui-2-6-0 .sui-wrap .sui-form-control:focus,fieldset[disabled] .sui-2-6-0 .sui-wrap .sui-form-control:hover,fieldset[disabled] .sui-2-6-0 .sui-wrap .sui-multi-checkbox,fieldset[disabled] .sui-2-6-0 .sui-wrap .sui-multi-checkbox:focus,fieldset[disabled] .sui-2-6-0 .sui-wrap .sui-multi-checkbox:hover{border-color:#f2f2f2;background-color:#f2f2f2;color:#aaa}.sui-2-6-0 .sui-wrap .sui-form-control::-ms-expand,.sui-2-6-0 .sui-wrap .sui-multi-checkbox::-ms-expand{border:0;background-color:transparent}.sui-2-6-0 .sui-wrap label{cursor:default}.sui-2-6-0 .sui-wrap label[for]{cursor:pointer}.sui-2-6-0 .sui-wrap .sui-label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;margin:0 0 5px}.sui-2-6-0 .sui-wrap .sui-label .sui-tag{margin-left:5px}.sui-2-6-0 .sui-wrap .sui-label .sui-tag.sui-left{margin-right:5px;margin-left:0}.sui-2-6-0 .sui-wrap .sui-label:last-child{margin:0}.sui-2-6-0 .sui-wrap .sui-label-link{margin-right:0;margin-left:auto;color:#888;font-weight:400}.sui-2-6-0 .sui-wrap .sui-label-inline{margin:0}.sui-2-6-0 .sui-wrap .sui-label-note{margin-right:0;margin-left:auto}.sui-2-6-0 .sui-wrap .sui-form-control,.sui-2-6-0 .sui-wrap .sui-multi-checkbox{display:block}.sui-2-6-0 .sui-wrap .sui-form-control.sui-input-sm,.sui-2-6-0 .sui-wrap .sui-input-sm.sui-multi-checkbox{max-width:80px}.sui-2-6-0 .sui-wrap .sui-form-control.sui-input-md,.sui-2-6-0 .sui-wrap .sui-input-md.sui-multi-checkbox{max-width:240px}.sui-2-6-0 .sui-wrap .sui-field-has-prefix.sui-multi-checkbox,.sui-2-6-0 .sui-wrap .sui-field-has-suffix.sui-multi-checkbox,.sui-2-6-0 .sui-wrap .sui-form-control.sui-field-has-prefix,.sui-2-6-0 .sui-wrap .sui-form-control.sui-field-has-suffix{width:auto;display:inline-block}.sui-2-6-0 .sui-wrap .sui-multi-checkbox{height:auto;max-height:114px;overflow-y:auto;padding:1px}.sui-2-6-0 .sui-wrap .sui-multi-checkbox label{margin:1px 0}.sui-2-6-0 .sui-wrap .sui-multi-checkbox label input:checked+span{background-color:#17a8e3;color:#fff}.sui-2-6-0 .sui-wrap .sui-multi-checkbox label span{display:block;padding:10px}.sui-2-6-0 .sui-wrap .sui-multi-checkbox label:first-child{margin-top:0}.sui-2-6-0 .sui-wrap .sui-multi-checkbox label:first-child span{border-radius:3px 3px 0 0}.sui-2-6-0 .sui-wrap .sui-multi-checkbox label:last-child{margin-bottom:0}.sui-2-6-0 .sui-wrap .sui-multi-checkbox label:last-child span{border-radius:0 0 3px 3px}.sui-2-6-0 .sui-wrap .fui-table--apps tbody tr.fui-app--promote .fui-app--content .fui-app--description,.sui-2-6-0 .sui-wrap .sui-description,.sui-2-6-0 .sui-wrap .sui-multi-checkbox label{display:block;margin-top:5px;color:#888;font-size:13px;line-height:22px;font-weight:400;letter-spacing:-.25px}.sui-2-6-0 .sui-wrap .fui-table--apps tbody tr.fui-app--promote .fui-app--content .sui-toggle-description.fui-app--description,.sui-2-6-0 .sui-wrap .sui-description.sui-toggle-description,.sui-2-6-0 .sui-wrap .sui-multi-checkbox label.sui-toggle-description{margin-left:48px}.sui-2-6-0 .sui-wrap .fui-table--apps tbody tr.fui-app--promote .fui-app--content .sui-checkbox-description.fui-app--description,.sui-2-6-0 .sui-wrap .fui-table--apps tbody tr.fui-app--promote .fui-app--content .sui-radio-description.fui-app--description,.sui-2-6-0 .sui-wrap .sui-description.sui-checkbox-description,.sui-2-6-0 .sui-wrap .sui-description.sui-radio-description,.sui-2-6-0 .sui-wrap .sui-multi-checkbox label.sui-checkbox-description,.sui-2-6-0 .sui-wrap .sui-multi-checkbox label.sui-radio-description{margin:0 27px 5px}.sui-2-6-0 .sui-wrap .fui-table--apps tbody tr.fui-app--promote .fui-app--content .fui-app--description+.sui-form-field,.sui-2-6-0 .sui-wrap .fui-table--apps tbody tr.fui-app--promote .fui-app--content .fui-app--description+.sui-form-field-inline,.sui-2-6-0 .sui-wrap .sui-description+.sui-form-field,.sui-2-6-0 .sui-wrap .sui-description+.sui-form-field-inline,.sui-2-6-0 .sui-wrap .sui-multi-checkbox label+.sui-form-field,.sui-2-6-0 .sui-wrap .sui-multi-checkbox label+.sui-form-field-inline{margin-top:20px}.sui-2-6-0 .sui-wrap .sui-error-message{display:block;margin-top:8px;color:#ff6d6d;font-size:12px;line-height:16px;font-weight:500}.sui-2-6-0 .sui-wrap .sui-form-field.sui-input-sm{max-width:80px}.sui-2-6-0 .sui-wrap .sui-form-field.sui-input-md{max-width:240px}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-form-field>.sui-row [class^=sui-col]{padding-right:5px;padding-left:5px}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-form-field>.sui-row:first-child{margin-top:0}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-form-field>.sui-row{margin:10px -5px 0}}.sui-2-6-0 .sui-wrap .sui-form-field:last-child{margin-bottom:0}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-form-field:last-child{margin-bottom:0}}.sui-2-6-0 .sui-wrap .sui-form-field.sui-form-field-error .sui-form-control,.sui-2-6-0 .sui-wrap .sui-form-field.sui-form-field-error .sui-multi-checkbox,.sui-2-6-0 .sui-wrap .sui-form-field.sui-has_error .sui-form-control,.sui-2-6-0 .sui-wrap .sui-form-field.sui-has_error .sui-multi-checkbox{border-bottom:2px solid #ff6d6d}.sui-2-6-0 .sui-wrap .sui-form-field.sui-form-field-error .sui-control-with-icon [class*=sui-icon-]:before,.sui-2-6-0 .sui-wrap .sui-form-field.sui-has_error .sui-control-with-icon [class*=sui-icon-]:before{color:#ff6d6d}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-form-field{margin-bottom:20px}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-form-field{margin-bottom:30px}}.sui-2-6-0 .sui-wrap .sui-field-prefix,.sui-2-6-0 .sui-wrap .sui-field-suffix{display:inline-block;color:#888;font-size:13px;line-height:22px}.sui-2-6-0 .sui-wrap .sui-field-prefix{margin-right:10px}.sui-2-6-0 .sui-wrap .sui-field-suffix{margin-left:10px}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-form-field-inline>.select-container:first-child,.sui-2-6-0 .sui-wrap .sui-form-field-inline>.sui-form-field:first-child{margin-left:0}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-form-field-inline>.select-container:last-child,.sui-2-6-0 .sui-wrap .sui-form-field-inline>.sui-form-field:last-child{margin-right:0}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-form-field-inline>.select-container,.sui-2-6-0 .sui-wrap .sui-form-field-inline>.sui-form-field{-ms-flex:0 0 auto;flex:0 0 auto;margin:0 10px}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-form-field-inline>.sui-form-field{-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-form-field-inline>.sui-label,.sui-2-6-0 .sui-wrap .sui-form-field-inline>p,.sui-2-6-0 .sui-wrap .sui-form-field-inline>span{-ms-flex:0 0 auto;flex:0 0 auto;margin:0}}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-form-field-inline:last-child{margin-bottom:0}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-form-field-inline:last-child{margin-bottom:0}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-form-field-inline{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;margin-bottom:30px}}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-form-field-inline{margin-bottom:20px}}.sui-2-6-0 .sui-wrap .sui-control-with-icon{position:relative}.sui-2-6-0 .sui-wrap .sui-control-with-icon .sui-form-control,.sui-2-6-0 .sui-wrap .sui-control-with-icon .sui-multi-checkbox,.sui-2-6-0 .sui-wrap .sui-control-with-icon select.sui-select+.select2-container .select2-selection__rendered{padding-left:40px}.sui-2-6-0 .sui-wrap .sui-control-with-icon [class*=sui-icon-]{width:16px;height:16px;pointer-events:none;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;position:absolute;top:11px;left:14px}.sui-2-6-0 .sui-wrap .sui-control-with-icon [class*=sui-icon-]:before{color:#aaa;display:block}.sui-2-6-0 .sui-wrap .sui-control-with-icon.sui-right-icon .sui-form-control,.sui-2-6-0 .sui-wrap .sui-control-with-icon.sui-right-icon .sui-multi-checkbox{padding-right:40px;padding-left:14px}.sui-2-6-0 .sui-wrap .sui-control-with-icon.sui-right-icon [class*=sui-icon-]{right:14px;left:auto;color:#888}.sui-2-6-0 .sui-wrap .sui-with-button{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.sui-2-6-0 .sui-wrap .sui-with-button .sui-button{-ms-flex:0 0 auto;flex:0 0 auto}.sui-2-6-0 .sui-wrap .sui-with-button .sui-form-control,.sui-2-6-0 .sui-wrap .sui-with-button .sui-multi-checkbox{-ms-flex:1;flex:1;margin:0 5px}.sui-2-6-0 .sui-wrap .sui-with-button .sui-form-control:first-child,.sui-2-6-0 .sui-wrap .sui-with-button .sui-multi-checkbox:first-child{margin-left:0}.sui-2-6-0 .sui-wrap .sui-with-button .sui-form-control:last-child,.sui-2-6-0 .sui-wrap .sui-with-button .sui-multi-checkbox:last-child{margin-right:0}.sui-2-6-0 .sui-wrap .sui-with-button.sui-inside,.sui-2-6-0 .sui-wrap .sui-with-button.sui-with-button-inside{display:block;position:relative}.sui-2-6-0 .sui-wrap .sui-with-button.sui-inside .sui-button,.sui-2-6-0 .sui-wrap .sui-with-button.sui-inside .sui-button-icon,.sui-2-6-0 .sui-wrap .sui-with-button.sui-with-button-inside .sui-button,.sui-2-6-0 .sui-wrap .sui-with-button.sui-with-button-inside .sui-button-icon{position:absolute;top:5px;right:5px}.sui-2-6-0 .sui-wrap .sui-with-button.sui-inside .sui-button-lg,.sui-2-6-0 .sui-wrap .sui-with-button.sui-with-button-inside .sui-button-lg{top:0;right:0;border-top-left-radius:0;border-bottom-left-radius:0}.sui-2-6-0 .sui-wrap .sui-with-button.sui-inside .sui-form-control,.sui-2-6-0 .sui-wrap .sui-with-button.sui-inside .sui-multi-checkbox,.sui-2-6-0 .sui-wrap .sui-with-button.sui-with-button-inside .sui-form-control,.sui-2-6-0 .sui-wrap .sui-with-button.sui-with-button-inside .sui-multi-checkbox{margin:0;padding-right:90px}.sui-2-6-0 .sui-wrap .sui-with-button.sui-with-button-icon{display:block;position:relative}.sui-2-6-0 .sui-wrap .sui-with-button.sui-with-button-icon .sui-button,.sui-2-6-0 .sui-wrap .sui-with-button.sui-with-button-icon .sui-button-icon{position:absolute;top:5px;right:5px}.sui-2-6-0 .sui-wrap .sui-with-button.sui-with-button-icon .sui-button-lg{top:0;right:0}.sui-2-6-0 .sui-wrap .sui-with-button.sui-with-button-icon .sui-form-control,.sui-2-6-0 .sui-wrap .sui-with-button.sui-with-button-icon .sui-multi-checkbox{margin:0;padding-right:40px}.sui-2-6-0 .sui-wrap .sui-input-group{width:100%;display:-ms-flexbox;display:flex;-ms-flex-align:stretch;align-items:stretch;position:relative}.sui-2-6-0 .sui-wrap .sui-password-group{position:relative}.sui-2-6-0 .sui-wrap .sui-password-group .sui-password-toggle{width:30px;height:30px;cursor:pointer;position:absolute;top:50%;right:7px;padding:0;border:0;border-radius:4px;background:transparent;color:#888;font-size:15px;line-height:1em;transform:translateY(-50%)}.sui-2-6-0 .sui-wrap .sui-password-group .sui-password-toggle:active,.sui-2-6-0 .sui-wrap .sui-password-group .sui-password-toggle:focus,.sui-2-6-0 .sui-wrap .sui-password-group .sui-password-toggle:hover{outline:0}.sui-2-6-0 .sui-wrap .sui-password-group .sui-password-toggle:hover{background-color:rgba(0,0,0,.03)}.sui-2-6-0 .sui-wrap .sui-password-group .sui-password-toggle:hover [class*=sui-icon-]:before{color:#666}.sui-2-6-0 .sui-wrap .sui-date{position:relative}.sui-2-6-0 .sui-wrap .sui-date .sui-form-control:first-child,.sui-2-6-0 .sui-wrap .sui-date .sui-multi-checkbox:first-child{padding-right:40px}.sui-2-6-0 .sui-wrap .sui-date .sui-form-control:last-child,.sui-2-6-0 .sui-wrap .sui-date .sui-multi-checkbox:last-child{padding-left:40px}.sui-2-6-0 .sui-wrap .sui-date [class*=sui-icon-]{width:30px;height:30px;pointer-events:none;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;position:absolute;top:5px}.sui-2-6-0 .sui-wrap .sui-date [class*=sui-icon-]:before{display:block}.sui-2-6-0 .sui-wrap .sui-date [class*=sui-icon-]:first-child{left:5px}.sui-2-6-0 .sui-wrap .sui-date [class*=sui-icon-]:last-child{right:5px}.sui-2-6-0 .sui-wrap .sui-multi-date{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.sui-2-6-0 .sui-wrap .sui-multi-date .sui-form-field{-ms-flex:1;flex:1}.sui-2-6-0 .sui-wrap .sui-multi-date .sui-form-field+button{-ms-flex:0 0 auto;flex:0 0 auto;margin-left:10px}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-multi-date .sui-form-field{margin-bottom:0}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-multi-date .sui-form-field{margin-bottom:0}}.sui-2-6-0 .sui-wrap .sui-multi-date:not(:last-child){margin-bottom:10px}.sui-2-6-0 .sui-wrap .sui-insert-variables{position:relative}.sui-2-6-0 .sui-wrap .sui-insert-variables .sui-form-control,.sui-2-6-0 .sui-wrap .sui-insert-variables .sui-multi-checkbox{padding-right:53px}.sui-2-6-0 .sui-wrap .sui-insert-variables .select-container{position:absolute;top:0;right:0;border:0;background-color:transparent;pointer-events:none}.sui-2-6-0 .sui-wrap .sui-insert-variables .select-container .dropdown-handle{display:none}.sui-2-6-0 .sui-wrap .sui-insert-variables .select-container .select-list-container{padding-right:0;pointer-events:auto}.sui-2-6-0 .sui-wrap .sui-insert-variables .select-container .select-list-container .list-value{width:40px;height:40px;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;position:relative;padding:0;border:1px solid #ddd;border-left-color:transparent;border-radius:0 4px 4px 0;color:transparent;font-size:16px;transition:.2s ease}.sui-2-6-0 .sui-wrap .sui-insert-variables .select-container .select-list-container .list-value:hover{border-left-color:#ddd;background-color:#f2f2f2}.sui-2-6-0 .sui-wrap .sui-insert-variables .select-container .select-list-container .list-value:hover:before{color:#666}.sui-2-6-0 .sui-wrap .sui-insert-variables .select-container .select-list-container .list-value:before{content:"@";width:16px;height:16px;display:block;position:absolute}.sui-2-6-0 .sui-wrap .sui-insert-variables .select-container .select-list-container .list-results{width:320px;left:auto;margin-right:0;border-color:#ddd;background-color:#fff}.sui-2-6-0 .sui-wrap .sui-insert-variables .select-container .select-list-container .list-results li.sui-element-flex{display:-ms-flexbox;display:flex}.sui-2-6-0 .sui-wrap .sui-insert-variables .select-container .select-list-container .list-results li.sui-element-flex span{pointer-events:none;overflow:hidden;display:block;text-overflow:ellipsis;white-space:nowrap;-ms-flex:1;flex:1}.sui-2-6-0 .sui-wrap .sui-insert-variables .select-container .select-list-container .list-results li.sui-element-flex span+span{-ms-flex:0 0 auto;flex:0 0 auto;margin-left:5px;color:#aaa;font-size:12px}.sui-2-6-0 .sui-wrap .sui-insert-variables .select-container .select-list-container .list-results .current{background-color:transparent;color:#888}.sui-2-6-0 .sui-wrap .sui-insert-variables .select-container .select-list-container .list-results .current:hover{background-color:#f8f8f8;color:#333}.sui-2-6-0 .sui-wrap .sui-insert-variables .select-container.active .select-list-container .list-value{z-index:1011;border-bottom-color:#fff;border-left-color:#ddd;background-color:#fff;border-bottom-right-radius:0}.sui-2-6-0 .sui-wrap .sui-insert-variables .select-container.active .select-list-container .list-value:before{color:#333}.sui-2-6-0 .sui-wrap .sui-insert-variables .select-container.active .select-list-container .list-results{top:38px;border-top-right-radius:0}.sui-2-6-0 .sui-wrap .sui-insert-variables .sui-variables+.select2{width:auto!important;height:auto!important;display:block;position:absolute;top:0;right:0}.sui-2-6-0 .sui-wrap .sui-insert-variables .sui-variables+.select2 *{display:block;outline:none}.sui-2-6-0 .sui-wrap .sui-insert-variables .sui-variables+.select2 .select2-selection--single{height:auto;border:1px solid #ddd;border-left-color:transparent;border-radius:0 4px 4px 0;background-color:transparent;transition:.2s ease}.sui-2-6-0 .sui-wrap .sui-insert-variables .sui-variables+.select2 .select2-selection--single .select2-selection__arrow{width:38px;height:38px;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;position:relative;top:auto;right:auto}.sui-2-6-0 .sui-wrap .sui-insert-variables .sui-variables+.select2 .select2-selection--single .select2-selection__arrow:before{content:"@";display:block;margin:0 auto;color:#888;font-size:16px}.sui-2-6-0 .sui-wrap .sui-insert-variables .sui-variables+.select2 .select2-selection--single .select2-selection__arrow b{display:none}.sui-2-6-0 .sui-wrap .sui-insert-variables .sui-variables+.select2 .select2-selection--single:hover{border-left-color:#ddd;background-color:#f2f2f2}.sui-2-6-0 .sui-wrap .sui-insert-variables .sui-variables+.select2 .select2-selection--single:hover .select2-selection__arrow:before{color:#666}.sui-2-6-0 .sui-wrap .sui-insert-variables .sui-variables+.select2.select2-container--open .select2-selection--single{border-left-color:#ddd;background-color:#fff;border-bottom-right-radius:0}.sui-2-6-0 .sui-wrap .sui-insert-variables .sui-variables+.select2.select2-container--open .select2-selection--single .select2-selection__arrow:before{color:#333}.sui-2-6-0 .sui-wrap .sui-insert-variables textarea.sui-form-control+.select-container .select-list-container .list-value,.sui-2-6-0 .sui-wrap .sui-insert-variables textarea.sui-multi-checkbox+.select-container .select-list-container .list-value{border-color:transparent}.sui-2-6-0 .sui-wrap .sui-insert-variables textarea.sui-form-control+.select-container.active .select-list-container .list-value,.sui-2-6-0 .sui-wrap .sui-insert-variables textarea.sui-form-control+.select-container .select-list-container .list-value:hover,.sui-2-6-0 .sui-wrap .sui-insert-variables textarea.sui-multi-checkbox+.select-container.active .select-list-container .list-value,.sui-2-6-0 .sui-wrap .sui-insert-variables textarea.sui-multi-checkbox+.select-container .select-list-container .list-value:hover{border-left-color:transparent;background-color:transparent}.sui-2-6-0 .sui-wrap textarea.sui-form-control,.sui-2-6-0 .sui-wrap textarea.sui-multi-checkbox{max-width:100%;height:auto;resize:vertical;line-height:20px}.sui-2-6-0 .sui-wrap select.sui-form-control,.sui-2-6-0 .sui-wrap select.sui-multi-checkbox{cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAs0lEQVQ4T6WS2w0CIRBF59KA2oklaAdbgpbgB48SIBThduKWYClrA2CGgEEXNWH5moR7Zu48QJ0PnRytA6WUe67svb//clDrUkWt9UxEMYRw/AYzJIS4sd45t0ugMeZERNcY49yCCwRgS0Rna+346rGGAVz4s06aW0gQx2/DUUoNAEYAG86cxezkAWCw1k5lBoupZltThomhEMLhs/fmOgrM2VvQwmq9in8rWncAPWfXXfEJ6RpWD7sJ1JwAAAAASUVORK5CYII=);background-repeat:no-repeat;background-position:center right 10px;line-height:1}.sui-2-6-0 .sui-wrap .sui-checkbox,.sui-2-6-0 .sui-wrap .sui-radio{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-ms-flex-align:start;align-items:flex-start}.sui-2-6-0 .sui-wrap .sui-checkbox input+span,.sui-2-6-0 .sui-wrap .sui-radio input+span{width:16px;height:16px;cursor:pointer;display:block;-ms-flex-negative:0;flex-shrink:0;position:relative;margin:3px 0;border:1px solid #ddd;border-radius:4px;background-color:#fafafa;transition:.3s ease}.sui-2-6-0 .sui-wrap .sui-checkbox input+span:before,.sui-2-6-0 .sui-wrap .sui-radio input+span:before{opacity:0;transition:.3s ease}.sui-2-6-0 .sui-wrap .fui-table--apps tbody tr.fui-app--promote .fui-app--content .sui-checkbox input+span+.fui-app--description,.sui-2-6-0 .sui-wrap .fui-table--apps tbody tr.fui-app--promote .fui-app--content .sui-radio input+span+.fui-app--description,.sui-2-6-0 .sui-wrap .sui-checkbox .fui-table--apps tbody tr.fui-app--promote .fui-app--content input+span+.fui-app--description,.sui-2-6-0 .sui-wrap .sui-checkbox input+span+.sui-description,.sui-2-6-0 .sui-wrap .sui-checkbox input+span+span,.sui-2-6-0 .sui-wrap .sui-radio .fui-table--apps tbody tr.fui-app--promote .fui-app--content input+span+.fui-app--description,.sui-2-6-0 .sui-wrap .sui-radio input+span+.sui-description,.sui-2-6-0 .sui-wrap .sui-radio input+span+span{cursor:pointer;margin:0 0 0 10px;color:#666;font-size:15px;line-height:22px;font-weight:500}.sui-2-6-0 .sui-wrap .fui-table--apps tbody tr.fui-app--promote .fui-app--content .sui-checkbox input+span+.sui-description-sm.fui-app--description,.sui-2-6-0 .sui-wrap .fui-table--apps tbody tr.fui-app--promote .fui-app--content .sui-radio input+span+.sui-description-sm.fui-app--description,.sui-2-6-0 .sui-wrap .sui-checkbox .fui-table--apps tbody tr.fui-app--promote .fui-app--content input+span+.sui-description-sm.fui-app--description,.sui-2-6-0 .sui-wrap .sui-checkbox input+span+.sui-description.sui-description-sm,.sui-2-6-0 .sui-wrap .sui-checkbox input+span+span.sui-description-sm,.sui-2-6-0 .sui-wrap .sui-radio .fui-table--apps tbody tr.fui-app--promote .fui-app--content input+span+.sui-description-sm.fui-app--description,.sui-2-6-0 .sui-wrap .sui-radio input+span+.sui-description.sui-description-sm,.sui-2-6-0 .sui-wrap .sui-radio input+span+span.sui-description-sm{font-size:13px}.sui-2-6-0 .sui-wrap .sui-checkbox input+span~.sui-tag,.sui-2-6-0 .sui-wrap .sui-radio input+span~.sui-tag{margin-top:auto;margin-bottom:auto;margin-left:10px}.sui-2-6-0 .sui-wrap .sui-checkbox input:checked+span,.sui-2-6-0 .sui-wrap .sui-radio input:checked+span{border-color:#17a8e3;background-color:#17a8e3}.sui-2-6-0 .sui-wrap .sui-checkbox input:checked+span:before,.sui-2-6-0 .sui-wrap .sui-radio input:checked+span:before{opacity:1}.sui-2-6-0 .sui-wrap .sui-checkbox input.sui-disabled+span,.sui-2-6-0 .sui-wrap .sui-checkbox input:disabled+span,.sui-2-6-0 .sui-wrap .sui-checkbox input[disabled]+span,.sui-2-6-0 .sui-wrap .sui-radio input.sui-disabled+span,.sui-2-6-0 .sui-wrap .sui-radio input:disabled+span,.sui-2-6-0 .sui-wrap .sui-radio input[disabled]+span{cursor:not-allowed;border-color:#f2f2f2;background-color:#f2f2f2}.sui-2-6-0 .sui-wrap .fui-table--apps tbody tr.fui-app--promote .fui-app--content .sui-checkbox input.sui-disabled+span+.fui-app--description,.sui-2-6-0 .sui-wrap .fui-table--apps tbody tr.fui-app--promote .fui-app--content .sui-checkbox input:disabled+span+.fui-app--description,.sui-2-6-0 .sui-wrap .fui-table--apps tbody tr.fui-app--promote .fui-app--content .sui-checkbox input[disabled]+span+.fui-app--description,.sui-2-6-0 .sui-wrap .fui-table--apps tbody tr.fui-app--promote .fui-app--content .sui-radio input.sui-disabled+span+.fui-app--description,.sui-2-6-0 .sui-wrap .fui-table--apps tbody tr.fui-app--promote .fui-app--content .sui-radio input:disabled+span+.fui-app--description,.sui-2-6-0 .sui-wrap .fui-table--apps tbody tr.fui-app--promote .fui-app--content .sui-radio input[disabled]+span+.fui-app--description,.sui-2-6-0 .sui-wrap .sui-checkbox .fui-table--apps tbody tr.fui-app--promote .fui-app--content input.sui-disabled+span+.fui-app--description,.sui-2-6-0 .sui-wrap .sui-checkbox .fui-table--apps tbody tr.fui-app--promote .fui-app--content input:disabled+span+.fui-app--description,.sui-2-6-0 .sui-wrap .sui-checkbox .fui-table--apps tbody tr.fui-app--promote .fui-app--content input[disabled]+span+.fui-app--description,.sui-2-6-0 .sui-wrap .sui-checkbox input.sui-disabled+span+.sui-description,.sui-2-6-0 .sui-wrap .sui-checkbox input.sui-disabled+span+span,.sui-2-6-0 .sui-wrap .sui-checkbox input:disabled+span+.sui-description,.sui-2-6-0 .sui-wrap .sui-checkbox input:disabled+span+span,.sui-2-6-0 .sui-wrap .sui-checkbox input[disabled]+span+.sui-description,.sui-2-6-0 .sui-wrap .sui-checkbox input[disabled]+span+span,.sui-2-6-0 .sui-wrap .sui-radio .fui-table--apps tbody tr.fui-app--promote .fui-app--content input.sui-disabled+span+.fui-app--description,.sui-2-6-0 .sui-wrap .sui-radio .fui-table--apps tbody tr.fui-app--promote .fui-app--content input:disabled+span+.fui-app--description,.sui-2-6-0 .sui-wrap .sui-radio .fui-table--apps tbody tr.fui-app--promote .fui-app--content input[disabled]+span+.fui-app--description,.sui-2-6-0 .sui-wrap .sui-radio input.sui-disabled+span+.sui-description,.sui-2-6-0 .sui-wrap .sui-radio input.sui-disabled+span+span,.sui-2-6-0 .sui-wrap .sui-radio input:disabled+span+.sui-description,.sui-2-6-0 .sui-wrap .sui-radio input:disabled+span+span,.sui-2-6-0 .sui-wrap .sui-radio input[disabled]+span+.sui-description,.sui-2-6-0 .sui-wrap .sui-radio input[disabled]+span+span{cursor:not-allowed}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-checkbox:last-child,.sui-2-6-0 .sui-wrap .sui-radio:last-child{margin-bottom:0}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-checkbox:last-child,.sui-2-6-0 .sui-wrap .sui-radio:last-child{margin-right:0}}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-checkbox,.sui-2-6-0 .sui-wrap .sui-radio{display:-ms-flexbox;display:flex;margin:0 0 10px}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-checkbox,.sui-2-6-0 .sui-wrap .sui-radio{display:-ms-inline-flexbox;display:inline-flex;margin:0 15px 0 0}}.sui-2-6-0 .sui-wrap .sui-radio input+span{position:relative;border-radius:50%}.sui-2-6-0 .sui-wrap .sui-radio input+span:before{content:" ";width:6px;height:6px;display:block;position:absolute;top:4px;left:4px;border-radius:16px;background-color:#fff}.sui-2-6-0 .sui-wrap .sui-radio input.sui-disabled+span:before,.sui-2-6-0 .sui-wrap .sui-radio input:disabled+span:before,.sui-2-6-0 .sui-wrap .sui-radio input[disabled]+span:before{background-color:#aaa}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-radio.sui-radio-stacked:last-child{margin:0}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-radio.sui-radio-stacked{display:-ms-flexbox;display:flex;margin:0 0 10px}}.sui-2-6-0 .sui-wrap .fui-table--apps tbody tr.fui-app--promote .fui-app--content .sui-radio.sui-radio-sm input+span+.fui-app--description,.sui-2-6-0 .sui-wrap .sui-radio.sui-radio-sm .fui-table--apps tbody tr.fui-app--promote .fui-app--content input+span+.fui-app--description,.sui-2-6-0 .sui-wrap .sui-radio.sui-radio-sm input+span+.sui-description,.sui-2-6-0 .sui-wrap .sui-radio.sui-radio-sm input+span+span{font-size:13px}.sui-2-6-0 .sui-wrap .sui-radio-image{-ms-flex-direction:column;flex-direction:column;-ms-flex-align:center;align-items:center}.sui-2-6-0 .sui-wrap .sui-radio-image img{display:block;margin:0;padding:0;border:0}.sui-2-6-0 .sui-wrap .sui-radio-image img+.sui-radio{margin-top:15px}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-radio-image+*{margin-top:20px}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-radio-image+*{margin-left:20px}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-radio-image.sui-radio-stacked+*{margin-top:30px;margin-left:0}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-radio-image.sui-radio-stacked{display:-ms-inline-flexbox;display:inline-flex}}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-radio-image{display:-ms-flexbox;display:flex}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-radio-image{display:-ms-inline-flexbox;display:inline-flex}}.sui-2-6-0 .sui-wrap .sui-checkbox input+span:before{content:"(";width:14px;height:14px;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;color:#fff;font-size:10px;text-align:center}.sui-2-6-0 .sui-wrap .sui-checkbox input.sui-disabled+span:before,.sui-2-6-0 .sui-wrap .sui-checkbox input:disabled+span:before,.sui-2-6-0 .sui-wrap .sui-checkbox input[disabled]+span:before{color:#aaa}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-checkbox.sui-checkbox-stacked:last-child{margin:0}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-checkbox.sui-checkbox-stacked{display:-ms-flexbox;display:flex;margin:0 0 10px}}.sui-2-6-0 .sui-wrap .fui-table--apps tbody tr.fui-app--promote .fui-app--content .sui-checkbox.sui-checkbox-sm input+span+.fui-app--description,.sui-2-6-0 .sui-wrap .sui-checkbox.sui-checkbox-sm .fui-table--apps tbody tr.fui-app--promote .fui-app--content input+span+.fui-app--description,.sui-2-6-0 .sui-wrap .sui-checkbox.sui-checkbox-sm input+span+.sui-description,.sui-2-6-0 .sui-wrap .sui-checkbox.sui-checkbox-sm input+span+span{font-size:13px}.sui-2-6-0 .sui-wrap .sui-checkbox-image{-ms-flex-direction:column;flex-direction:column;-ms-flex-align:center;align-items:center}.sui-2-6-0 .sui-wrap .sui-checkbox-image img{display:block;margin:0;padding:0;border:0}.sui-2-6-0 .sui-wrap .sui-checkbox-image img+.sui-checkbox{margin-top:15px}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-checkbox-image+*{margin-top:20px}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-checkbox-image+*{margin-left:20px}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-checkbox-image.sui-checkbox-stacked+*{margin-top:30px;margin-left:0}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-checkbox-image.sui-checkbox-stacked{display:-ms-inline-flexbox;display:inline-flex}}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-checkbox-image{display:-ms-flexbox;display:flex}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-checkbox-image{display:-ms-inline-flexbox;display:inline-flex}}.sui-2-6-0 .sui-wrap .sui-upload{max-width:100%;display:-ms-flexbox;display:flex}.sui-2-6-0 .sui-wrap .sui-upload button{cursor:pointer;display:block;transition:.3s ease}.sui-2-6-0 .sui-wrap .sui-upload button,.sui-2-6-0 .sui-wrap .sui-upload button:active,.sui-2-6-0 .sui-wrap .sui-upload button:focus,.sui-2-6-0 .sui-wrap .sui-upload button:hover{outline:none;box-shadow:none}.sui-2-6-0 .sui-wrap .sui-upload .sui-upload-image{width:40px;height:40px;-ms-flex:0 0 auto;flex:0 0 auto;position:relative;margin:0;padding:1px;border:1px solid #e6e6e6;border-radius:4px}.sui-2-6-0 .sui-wrap .sui-upload .sui-upload-image [class*=sui-image-]{width:36px;height:36px;display:block;border-radius:3px}.sui-2-6-0 .sui-wrap .sui-upload .sui-upload-image .sui-image-mask{background-color:#ddd;background-image:linear-gradient(45deg,#fff 25%,transparent 0,transparent 75%,#fff 0,#fff),linear-gradient(45deg,#fff 25%,transparent 0,transparent 75%,#fff 0,#fff);background-size:12px 12px;background-position:0 0,6px 6px}.sui-2-6-0 .sui-wrap .sui-upload .sui-upload-image .sui-image-preview{cursor:pointer;display:none;position:absolute;top:1px;left:1px;background-color:transparent;background-size:cover;background-repeat:no-repeat;background-position:50%}.sui-2-6-0 .sui-wrap .sui-upload .sui-upload-image .sui-image-preview:before{content:"\A2";opacity:0;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;position:absolute;top:0;right:0;bottom:0;left:0;border-radius:3px;color:#fff;font-size:12px;line-height:12px;background-color:rgba(0,0,0,.5);transition:.2s ease}.sui-2-6-0 .sui-wrap .sui-upload .sui-upload-image .sui-image-preview,.sui-2-6-0 .sui-wrap .sui-upload .sui-upload-image .sui-image-preview:active,.sui-2-6-0 .sui-wrap .sui-upload .sui-upload-image .sui-image-preview:focus,.sui-2-6-0 .sui-wrap .sui-upload .sui-upload-image .sui-image-preview:hover{outline:none;box-shadow:none}.sui-2-6-0 .sui-wrap .sui-upload .sui-upload-image .sui-image-preview:active:before,.sui-2-6-0 .sui-wrap .sui-upload .sui-upload-image .sui-image-preview:focus:before,.sui-2-6-0 .sui-wrap .sui-upload .sui-upload-image .sui-image-preview:hover:before{opacity:1}.sui-2-6-0 .sui-wrap .sui-upload .sui-upload-image~.sui-upload-button,.sui-2-6-0 .sui-wrap .sui-upload .sui-upload-image~.sui-upload-file{margin-left:5px}.sui-2-6-0 .sui-wrap .sui-upload .sui-upload-image~.sui-upload-file{max-width:calc(100% - 45px);cursor:auto;padding-left:19px}.sui-2-6-0 .sui-wrap .sui-upload .sui-upload-image~.sui-upload-file:before{content:unset}.sui-2-6-0 .sui-wrap .sui-upload .sui-upload-image~.sui-upload-file:active,.sui-2-6-0 .sui-wrap .sui-upload .sui-upload-image~.sui-upload-file:hover{background-color:#fff}.sui-2-6-0 .sui-wrap .sui-upload .sui-upload-file{max-width:100%;cursor:pointer;-ms-flex:0 0 auto;flex:0 0 auto;display:none;position:relative;padding:11px 61px 11px 41px;border:1px solid #ddd;border-radius:4px;background-color:#fff;transition:.3s ease}.sui-2-6-0 .sui-wrap .sui-upload .sui-upload-file:before{content:"\C6";width:29px;display:block;position:absolute;left:14px;font-size:16px;line-height:16px;text-align:center}.sui-2-6-0 .sui-wrap .sui-upload .sui-upload-file span{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:block;color:#333;font:500 12px/16px Roboto,Arial,sans-serif;letter-spacing:-.25px}.sui-2-6-0 .sui-wrap .sui-upload .sui-upload-file span:focus{outline:none;box-shadow:none}.sui-2-6-0 .sui-wrap .sui-upload .sui-upload-file button{width:39px;position:absolute;top:0;right:0;bottom:0;border:0 solid #ddd;border-left-width:1px;border-radius:0 3px 3px 0;background-color:#fff;font-size:12px;text-align:center}.sui-2-6-0 .sui-wrap .sui-upload .sui-upload-file button [class*=sui-icon-],.sui-2-6-0 .sui-wrap .sui-upload .sui-upload-file button [class*=sui-icon-]:before{display:block}.sui-2-6-0 .sui-wrap .sui-upload .sui-upload-file button:active,.sui-2-6-0 .sui-wrap .sui-upload .sui-upload-file button:focus,.sui-2-6-0 .sui-wrap .sui-upload .sui-upload-file button:hover{background-color:rgba(51,51,51,.04)}.sui-2-6-0 .sui-wrap .sui-upload .sui-upload-file:active,.sui-2-6-0 .sui-wrap .sui-upload .sui-upload-file:hover{background-color:#fafafa}.sui-2-6-0 .sui-wrap .sui-upload .sui-upload-button{margin:0;padding:11px 19px;border:1px dashed #ddd;border-radius:4px;background-color:transparent;color:#aaa;font:500 12px/16px Roboto,Arial,sans-serif;letter-spacing:-.25px}.sui-2-6-0 .sui-wrap .sui-upload .sui-upload-button:active,.sui-2-6-0 .sui-wrap .sui-upload .sui-upload-button:focus,.sui-2-6-0 .sui-wrap .sui-upload .sui-upload-button:hover{border-color:#aaa;background-color:#fafafa}.sui-2-6-0 .sui-wrap .sui-upload .sui-upload-button [class*=sui-icon-]{width:24px;margin-left:-4px;color:#888;font-size:16px;line-height:16px;vertical-align:bottom;text-align:center}.sui-2-6-0 .sui-wrap .sui-upload .sui-upload-button [class*=sui-icon-]:before{display:block;color:inherit}.sui-2-6-0 .sui-wrap .sui-upload.sui-has_file .sui-upload-file,.sui-2-6-0 .sui-wrap .sui-upload.sui-has_file .sui-upload-image .sui-image-preview{display:block}.sui-2-6-0 .sui-wrap .sui-upload.sui-has_file .sui-upload-button{display:none}.sui-2-6-0 .sui-wrap .sui-upload+.sui-notice,.sui-2-6-0 .sui-wrap .sui-upload+.sui-upload{margin-top:10px}.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap{display:block}.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .sui-colorpicker{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .sui-colorpicker .sui-colorpicker-value{display:block;position:relative}.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .sui-colorpicker .sui-colorpicker-value button,.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .sui-colorpicker .sui-colorpicker-value input,.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .sui-colorpicker .sui-colorpicker-value span[role=button]{display:block;margin:0;border:1px solid #ddd;border-radius:4px}.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .sui-colorpicker .sui-colorpicker-value button,.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .sui-colorpicker .sui-colorpicker-value button:focus,.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .sui-colorpicker .sui-colorpicker-value button:hover,.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .sui-colorpicker .sui-colorpicker-value input,.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .sui-colorpicker .sui-colorpicker-value input:focus,.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .sui-colorpicker .sui-colorpicker-value input:hover,.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .sui-colorpicker .sui-colorpicker-value span[role=button],.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .sui-colorpicker .sui-colorpicker-value span[role=button]:focus,.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .sui-colorpicker .sui-colorpicker-value span[role=button]:hover{outline:none;box-shadow:none}.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .sui-colorpicker .sui-colorpicker-value button,.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .sui-colorpicker .sui-colorpicker-value span[role=button]{width:30px;height:30px;cursor:pointer;position:absolute;top:0;padding:0}.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .sui-colorpicker .sui-colorpicker-value button,.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .sui-colorpicker .sui-colorpicker-value input{background-color:#fafafa}.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .sui-colorpicker .sui-colorpicker-value span[role=button]{left:0;background-color:#ddd;background-image:linear-gradient(45deg,#fff 25%,transparent 0,transparent 75%,#fff 0,#fff),linear-gradient(45deg,#fff 25%,transparent 0,transparent 75%,#fff 0,#fff);background-size:12px 12px;background-position:0 0,6px 6px}.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .sui-colorpicker .sui-colorpicker-value span[role=button] span{width:26px;height:26px;display:block;position:absolute;top:1px;left:1px;border-radius:2px}.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .sui-colorpicker .sui-colorpicker-value span[role=button],.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .sui-colorpicker .sui-colorpicker-value span[role=button]:focus,.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .sui-colorpicker .sui-colorpicker-value span[role=button]:hover{box-shadow:inset 0 0 0 1px #fff}.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .sui-colorpicker .sui-colorpicker-value input{width:100%;height:30px;padding:6px 40px;color:#333;font:500 12px/16px Roboto,Arial,sans-serif;letter-spacing:-.25px}.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .sui-colorpicker .sui-colorpicker-value button{right:0;border-top-left-radius:0;border-bottom-left-radius:0}.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .sui-colorpicker .sui-colorpicker-value button [class*=sui-icon-]{font-size:12px}.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .sui-colorpicker .sui-button{margin-left:5px}.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .sui-colorpicker.sui-colorpicker-hex .sui-colorpicker-value{-ms-flex:0 1 135px;flex:0 1 135px}.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .sui-colorpicker.sui-colorpicker-rgba .sui-colorpicker-value{-ms-flex:0 1 215px;flex:0 1 215px}.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .wp-picker-container{display:none;margin:5px 0 0;padding:9px;border:1px solid #ddd;border-radius:4px;background-color:#fff;box-shadow:0 3px 7px 0 rgba(0,0,0,.07)}.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .wp-picker-container .wp-picker-input-wrap,.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .wp-picker-container .wp-picker-input-wrap .sui-colorpicker-input,.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .wp-picker-container .wp-picker-input-wrap label,.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .wp-picker-container .wp-picker-input-wrap span{display:block}.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .wp-picker-container .wp-picker-input-wrap .sui-colorpicker-input{width:100%!important;height:30px;margin:0;padding:6px 11px;border:1px solid #ddd;border-radius:4px;background-color:#fafafa;color:#333;font:500 12px/16px Roboto,Arial,sans-serif;letter-spacing:-.25px}.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .wp-picker-container .wp-picker-input-wrap .sui-colorpicker-input,.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .wp-picker-container .wp-picker-input-wrap .sui-colorpicker-input:focus,.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .wp-picker-container .wp-picker-input-wrap .sui-colorpicker-input:hover{outline:none;box-shadow:none}.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .wp-picker-container .wp-picker-holder .iris-picker{width:auto!important;height:auto!important;position:relative;margin:10px 0 0;padding:0!important;border:0}.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .wp-picker-container .wp-picker-holder .iris-picker .iris-picker-inner{display:-ms-flexbox;display:flex;position:unset}@media (-ms-high-contrast:active),(-ms-high-contrast:none){.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .wp-picker-container .wp-picker-holder .iris-picker .iris-picker-inner{position:relative;display:block}}.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .wp-picker-container .wp-picker-holder .iris-picker .iris-palette-container{display:-ms-flexbox;display:flex;left:0;bottom:0}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .wp-picker-container .wp-picker-holder .iris-picker .iris-palette-container{position:relative;margin-top:10px;-ms-flex-pack:justify;justify-content:space-between}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .wp-picker-container .wp-picker-holder .iris-picker .iris-palette-container{width:160px}}@media (-ms-high-contrast:active),(-ms-high-contrast:none){.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .wp-picker-container .wp-picker-holder .iris-picker .iris-palette-container{margin-left:10px}}.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .wp-picker-container .wp-picker-holder .iris-picker .iris-palette,.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .wp-picker-container .wp-picker-holder .iris-picker .iris-slider,.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .wp-picker-container .wp-picker-holder .iris-picker .iris-square{float:none;box-shadow:none}.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .wp-picker-container .wp-picker-holder .iris-picker .iris-square{width:auto!important;height:auto!important;margin-right:0;border-radius:4px}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .wp-picker-container .wp-picker-holder .iris-picker .iris-square{margin-bottom:30px}}.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .wp-picker-container .wp-picker-holder .iris-picker .iris-square-inner{box-shadow:none}.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .wp-picker-container .wp-picker-holder .iris-picker .iris-square-inner.iris-square-horiz{position:unset;display:block}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .wp-picker-container .wp-picker-holder .iris-picker .iris-square-inner.iris-square-horiz{width:140px;height:140px}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .wp-picker-container .wp-picker-holder .iris-picker .iris-square-inner.iris-square-horiz{width:160px;height:160px}}@media (-ms-high-contrast:active),(-ms-high-contrast:none){.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .wp-picker-container .wp-picker-holder .iris-picker .iris-square-inner.iris-square-horiz{position:relative}}@media (-ms-high-contrast:active),(-ms-high-contrast:none){.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .wp-picker-container .wp-picker-holder .iris-picker .iris-square{display:inline-block}}.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .wp-picker-container .wp-picker-holder .iris-picker .iris-slider{width:20px!important;margin-left:10px!important;border-radius:2px}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .wp-picker-container .wp-picker-holder .iris-picker .iris-slider{height:140px!important}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .wp-picker-container .wp-picker-holder .iris-picker .iris-slider{height:190px!important}}@media (-ms-high-contrast:active),(-ms-high-contrast:none){.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .wp-picker-container .wp-picker-holder .iris-picker .iris-slider{display:inline-block}}.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .wp-picker-container .wp-picker-holder .iris-picker .iris-slider-offset{top:10px;bottom:0}.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .wp-picker-container .wp-picker-holder .iris-picker .ui-slider-handle{height:10px;opacity:1;right:-2px;left:-2px;border-width:2px;border-color:#fff;border-radius:4px;box-shadow:0 1px 3px 1px rgba(0,0,0,.3)}.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .wp-picker-container .wp-picker-holder .iris-picker .ui-slider-handle:before{content:unset}.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .wp-picker-container .wp-picker-holder .iris-picker .iris-palette{width:auto!important;min-width:20px;max-width:20px;height:20px!important;display:block;-ms-flex:0 0 20px;flex:0 0 20px;border:1px solid #e6e6e6}.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .wp-picker-container .wp-picker-holder .iris-picker .iris-palette:first-child{margin-left:0!important}.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .wp-picker-container .wp-picker-holder .iris-picker .iris-palette:nth-child(n+8){display:none;margin-left:0!important}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .wp-picker-container .wp-picker-holder .iris-picker .iris-palette{margin-left:3.33333px!important}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .wp-picker-container .wp-picker-holder .iris-picker .iris-palette{margin-left:3.33333px!important}}.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .wp-picker-container .wp-picker-holder .iris-picker .iris-square-value{width:0;height:0}.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .wp-picker-container .wp-picker-holder .iris-picker .iris-square-handle{width:16px;height:16px;opacity:1;top:-8px;left:-8px;border-width:3px;border-color:#fff;border-radius:100%;box-shadow:0 1px 5px 0 rgba(0,0,0,.3)}.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .wp-picker-container .wp-picker-holder .iris-picker .iris-square-handle:after{content:unset}.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .wp-picker-container.wp-picker-active{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-direction:column;flex-direction:column}@media (-ms-high-contrast:active),(-ms-high-contrast:none){.sui-2-6-0 .sui-wrap .sui-colorpicker-wrap .wp-picker-container.wp-picker-active{width:262px;position:relative;display:block}}.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>.sui-tabs-menu,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>[data-tabs]{display:-ms-flexbox;display:flex;margin:0;padding:0;border-top:1px solid #e6e6e6;list-style:none}.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>.sui-tabs-menu .sui-tab-item,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>.sui-tabs-menu>*,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>[data-tabs] .sui-tab-item,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>[data-tabs]>*{cursor:pointer;margin:0 10px;padding:14px 0 12px;border:0;background-color:transparent;font:500 13px/22px Roboto,Arial,sans-serif;letter-spacing:-.25px;text-transform:uppercase;text-decoration:none}.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>.sui-tabs-menu .sui-tab-item,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>.sui-tabs-menu .sui-tab-item:active,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>.sui-tabs-menu .sui-tab-item:focus,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>.sui-tabs-menu .sui-tab-item:hover,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>.sui-tabs-menu .sui-tab-item:visited,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>.sui-tabs-menu>*,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>.sui-tabs-menu>:active,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>.sui-tabs-menu>:focus,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>.sui-tabs-menu>:hover,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>.sui-tabs-menu>:visited,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>[data-tabs] .sui-tab-item,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>[data-tabs] .sui-tab-item:active,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>[data-tabs] .sui-tab-item:focus,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>[data-tabs] .sui-tab-item:hover,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>[data-tabs] .sui-tab-item:visited,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>[data-tabs]>*,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>[data-tabs]>:active,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>[data-tabs]>:focus,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>[data-tabs]>:hover,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>[data-tabs]>:visited{outline:none;border-bottom:2px solid transparent}.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>.sui-tabs-menu .sui-tab-item,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>.sui-tabs-menu .sui-tab-item:visited,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>.sui-tabs-menu>*,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>.sui-tabs-menu>:visited,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>[data-tabs] .sui-tab-item,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>[data-tabs] .sui-tab-item:visited,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>[data-tabs]>*,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>[data-tabs]>:visited{color:#888}.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>.sui-tabs-menu .sui-tab-item:active,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>.sui-tabs-menu .sui-tab-item:focus,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>.sui-tabs-menu .sui-tab-item:hover,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>.sui-tabs-menu>:active,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>.sui-tabs-menu>:focus,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>.sui-tabs-menu>:hover,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>[data-tabs] .sui-tab-item:active,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>[data-tabs] .sui-tab-item:focus,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>[data-tabs] .sui-tab-item:hover,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>[data-tabs]>:active,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>[data-tabs]>:focus,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>[data-tabs]>:hover{color:#333}.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>.sui-tabs-menu .sui-tab-item:first-child,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>.sui-tabs-menu>:first-child,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>[data-tabs] .sui-tab-item:first-child,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>[data-tabs]>:first-child{margin-left:0}.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>.sui-tabs-menu .sui-tab-item:last-child,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>.sui-tabs-menu>:last-child,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>[data-tabs] .sui-tab-item:last-child,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>[data-tabs]>:last-child{margin-right:0}.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>.sui-tabs-menu .sui-tab-item.active,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>.sui-tabs-menu>.active,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>[data-tabs] .sui-tab-item.active,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>[data-tabs]>.active{color:#333;border-bottom-color:#333}.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>.sui-tabs-content>*,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>.sui-tabs-content>.sui-tab-content,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>[data-panes]>*,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>[data-panes]>.sui-tab-content{display:none;margin-top:-1px;padding:20px 0 0;border-top:1px solid #e6e6e6}.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>.sui-tabs-content>.active,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>.sui-tabs-content>.sui-tab-content.active,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>[data-panes]>.active,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>[data-panes]>.sui-tab-content.active{display:block}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>.sui-tabs-content>*,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>.sui-tabs-content>.sui-tab-content,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>[data-panes]>*,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs)>[data-panes]>.sui-tab-content{padding:30px 0 0}}.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs).sui-tabs-flushed>.sui-tabs-menu,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs).sui-tabs-flushed>[data-tabs]{border-top-width:0}.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs).sui-tabs-overflow{border:1px solid #e6e6e6;border-radius:4px;position:relative}.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs).sui-tabs-overflow>.sui-tabs-menu,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs).sui-tabs-overflow>[data-tabs]{overflow:auto;margin-right:20px;margin-left:20px;border-top-width:0;scrollbar-width:none;scrollbar-height:none}.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs).sui-tabs-overflow>.sui-tabs-menu::-webkit-scrollbar,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs).sui-tabs-overflow>[data-tabs]::-webkit-scrollbar{width:0;height:0;background:transparent}.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs).sui-tabs-overflow>.sui-tabs-menu .sui-tab-item,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs).sui-tabs-overflow>.sui-tabs-menu>*,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs).sui-tabs-overflow>[data-tabs] .sui-tab-item,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs).sui-tabs-overflow>[data-tabs]>*{-ms-flex:0 0 auto;flex:0 0 auto}.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs).sui-tabs-overflow>.sui-tabs-content>*,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs).sui-tabs-overflow>.sui-tabs-content>.sui-tab-content,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs).sui-tabs-overflow>[data-panes]>*,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs).sui-tabs-overflow>[data-panes]>.sui-tab-content{padding-right:20px;padding-bottom:20px;padding-left:20px}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs).sui-tabs-overflow>.sui-tabs-content>*,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs).sui-tabs-overflow>.sui-tabs-content>.sui-tab-content,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs).sui-tabs-overflow>[data-panes]>*,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs).sui-tabs-overflow>[data-panes]>.sui-tab-content{padding-right:30px;padding-bottom:30px;padding-left:30px}}.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs).sui-tabs-overflow .sui-tabs-navigation{position:absolute;width:100%;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;height:50px;-ms-flex-align:center;align-items:center;top:1px;pointer-events:none;opacity:1}.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs).sui-tabs-overflow .sui-tabs-navigation--left,.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs).sui-tabs-overflow .sui-tabs-navigation--right{background:hsla(0,0%,100%,.8);pointer-events:all;transition:all .2s}.sui-2-6-0 .sui-wrap .sui-tabs:not(.sui-side-tabs).sui-tabs-overflow .sui-tabs-navigation--hidden{visibility:hidden;opacity:0}.sui-2-6-0 .sui-wrap .sui-side-tabs{margin:0 0 20px}.sui-2-6-0 .sui-wrap .sui-side-tabs>.sui-tabs-menu,.sui-2-6-0 .sui-wrap .sui-side-tabs>[data-tabs]{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:0;padding:0;list-style:none}.sui-2-6-0 .sui-wrap .sui-side-tabs>.sui-tabs-menu .sui-tab-item,.sui-2-6-0 .sui-wrap .sui-side-tabs>.sui-tabs-menu>*,.sui-2-6-0 .sui-wrap .sui-side-tabs>[data-tabs] .sui-tab-item,.sui-2-6-0 .sui-wrap .sui-side-tabs>[data-tabs]>*{cursor:pointer;-ms-flex:0 0 auto;flex:0 0 auto;margin:0 1px 0 0;padding:9px 20px;border:0;font:500 13px/22px Roboto,Arial,sans-serif;letter-spacing:-.25px;text-decoration:none}.sui-2-6-0 .sui-wrap .sui-side-tabs>.sui-tabs-menu .sui-tab-item,.sui-2-6-0 .sui-wrap .sui-side-tabs>.sui-tabs-menu .sui-tab-item:active,.sui-2-6-0 .sui-wrap .sui-side-tabs>.sui-tabs-menu .sui-tab-item:focus,.sui-2-6-0 .sui-wrap .sui-side-tabs>.sui-tabs-menu .sui-tab-item:hover,.sui-2-6-0 .sui-wrap .sui-side-tabs>.sui-tabs-menu .sui-tab-item:visited,.sui-2-6-0 .sui-wrap .sui-side-tabs>.sui-tabs-menu>*,.sui-2-6-0 .sui-wrap .sui-side-tabs>.sui-tabs-menu>:active,.sui-2-6-0 .sui-wrap .sui-side-tabs>.sui-tabs-menu>:focus,.sui-2-6-0 .sui-wrap .sui-side-tabs>.sui-tabs-menu>:hover,.sui-2-6-0 .sui-wrap .sui-side-tabs>.sui-tabs-menu>:visited,.sui-2-6-0 .sui-wrap .sui-side-tabs>[data-tabs] .sui-tab-item,.sui-2-6-0 .sui-wrap .sui-side-tabs>[data-tabs] .sui-tab-item:active,.sui-2-6-0 .sui-wrap .sui-side-tabs>[data-tabs] .sui-tab-item:focus,.sui-2-6-0 .sui-wrap .sui-side-tabs>[data-tabs] .sui-tab-item:hover,.sui-2-6-0 .sui-wrap .sui-side-tabs>[data-tabs] .sui-tab-item:visited,.sui-2-6-0 .sui-wrap .sui-side-tabs>[data-tabs]>*,.sui-2-6-0 .sui-wrap .sui-side-tabs>[data-tabs]>:active,.sui-2-6-0 .sui-wrap .sui-side-tabs>[data-tabs]>:focus,.sui-2-6-0 .sui-wrap .sui-side-tabs>[data-tabs]>:hover,.sui-2-6-0 .sui-wrap .sui-side-tabs>[data-tabs]>:visited{outline:none;background-color:#f8f8f8;color:#666}.sui-2-6-0 .sui-wrap .sui-side-tabs>.sui-tabs-menu .sui-tab-item:first-child,.sui-2-6-0 .sui-wrap .sui-side-tabs>.sui-tabs-menu>:first-child,.sui-2-6-0 .sui-wrap .sui-side-tabs>[data-tabs] .sui-tab-item:first-child,.sui-2-6-0 .sui-wrap .sui-side-tabs>[data-tabs]>:first-child{border-radius:4px 0 0 4px}.sui-2-6-0 .sui-wrap .sui-side-tabs>.sui-tabs-menu .sui-tab-item:last-child,.sui-2-6-0 .sui-wrap .sui-side-tabs>.sui-tabs-menu>:last-child,.sui-2-6-0 .sui-wrap .sui-side-tabs>[data-tabs] .sui-tab-item:last-child,.sui-2-6-0 .sui-wrap .sui-side-tabs>[data-tabs]>:last-child{margin:0;border-radius:0 4px 4px 0}.sui-2-6-0 .sui-wrap .sui-side-tabs>.sui-tabs-menu .sui-tab-item.active,.sui-2-6-0 .sui-wrap .sui-side-tabs>.sui-tabs-menu>.active,.sui-2-6-0 .sui-wrap .sui-side-tabs>[data-tabs] .sui-tab-item.active,.sui-2-6-0 .sui-wrap .sui-side-tabs>[data-tabs]>.active{background-color:#e1f6ff;color:#17a8e3}.sui-2-6-0 .sui-wrap .sui-side-tabs>.sui-tabs-content>*,.sui-2-6-0 .sui-wrap .sui-side-tabs>.sui-tabs-content>.sui-tab-content,.sui-2-6-0 .sui-wrap .sui-side-tabs>[data-panes]>*,.sui-2-6-0 .sui-wrap .sui-side-tabs>[data-panes]>.sui-tab-content{display:none;margin:10px 0 0}.sui-2-6-0 .sui-wrap .sui-side-tabs>.sui-tabs-content>.sui-tab-boxed,.sui-2-6-0 .sui-wrap .sui-side-tabs>.sui-tabs-content>.sui-tab-content.sui-tab-boxed,.sui-2-6-0 .sui-wrap .sui-side-tabs>[data-panes]>.sui-tab-boxed,.sui-2-6-0 .sui-wrap .sui-side-tabs>[data-panes]>.sui-tab-content.sui-tab-boxed{padding:20px;border:1px solid #e6e6e6;border-radius:4px}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-side-tabs>.sui-tabs-content>.sui-tab-boxed,.sui-2-6-0 .sui-wrap .sui-side-tabs>.sui-tabs-content>.sui-tab-content.sui-tab-boxed,.sui-2-6-0 .sui-wrap .sui-side-tabs>[data-panes]>.sui-tab-boxed,.sui-2-6-0 .sui-wrap .sui-side-tabs>[data-panes]>.sui-tab-content.sui-tab-boxed{padding:30px}}.sui-2-6-0 .sui-wrap .sui-side-tabs>.sui-tabs-content>.active,.sui-2-6-0 .sui-wrap .sui-side-tabs>.sui-tabs-content>.sui-tab-content.active,.sui-2-6-0 .sui-wrap .sui-side-tabs>[data-panes]>.active,.sui-2-6-0 .sui-wrap .sui-side-tabs>[data-panes]>.sui-tab-content.active{display:block}.sui-2-6-0 .sui-wrap .sui-side-tabs>.sui-tabs-content.sui-tabs-content-lg>*,.sui-2-6-0 .sui-wrap .sui-side-tabs>.sui-tabs-content.sui-tabs-content-lg>.sui-tab-content,.sui-2-6-0 .sui-wrap .sui-side-tabs>[data-panes].sui-tabs-content-lg>*,.sui-2-6-0 .sui-wrap .sui-side-tabs>[data-panes].sui-tabs-content-lg>.sui-tab-content{margin-top:30px}.sui-2-6-0 .sui-wrap .sui-side-tabs:last-child{margin:0}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-side-tabs:last-child{margin:0}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-side-tabs{margin:0 0 30px}}.sui-2-6-0 .sui-wrap .sui-box-body>.sui-tabs-flushed>.sui-tabs-menu,.sui-2-6-0 .sui-wrap .sui-box-body>.sui-tabs-flushed>[data-tabs]{padding:0 20px}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box-body>.sui-tabs-flushed>.sui-tabs-menu,.sui-2-6-0 .sui-wrap .sui-box-body>.sui-tabs-flushed>[data-tabs]{padding:0 30px}}.sui-2-6-0 .sui-wrap .sui-box-body>.sui-tabs-flushed>.sui-tabs-content>*,.sui-2-6-0 .sui-wrap .sui-box-body>.sui-tabs-flushed>.sui-tabs-content>.sui-tab-content,.sui-2-6-0 .sui-wrap .sui-box-body>.sui-tabs-flushed>[data-panes]>*,.sui-2-6-0 .sui-wrap .sui-box-body>.sui-tabs-flushed>[data-panes]>.sui-tab-content{padding:20px}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box-body>.sui-tabs-flushed>.sui-tabs-content>*,.sui-2-6-0 .sui-wrap .sui-box-body>.sui-tabs-flushed>.sui-tabs-content>.sui-tab-content,.sui-2-6-0 .sui-wrap .sui-box-body>.sui-tabs-flushed>[data-panes]>*,.sui-2-6-0 .sui-wrap .sui-box-body>.sui-tabs-flushed>[data-panes]>.sui-tab-content{padding:30px}}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-box-body>.sui-tabs-flushed{margin:-20px!important}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box-body>.sui-tabs-flushed{margin:-30px!important}}.sui-2-6-0 .sui-wrap{position:relative}.sui-2-6-0 .sui-wrap .sui-row-with-sidenav{width:100%;display:table;table-layout:fixed;clear:both;margin-bottom:30px}.sui-2-6-0 .sui-wrap .sui-row-with-sidenav .sui-sidenav{vertical-align:top}.sui-2-6-0 .sui-wrap .sui-row-with-sidenav .sui-sidenav .sui-vertical-tabs{margin:15px 0 0;padding:0;border:0;list-style:none}.sui-2-6-0 .sui-wrap .sui-row-with-sidenav .sui-sidenav .sui-vertical-tabs .sui-vertical-tab{height:30px;position:relative;margin:0 0 6px;padding:5px 15px;line-height:1.5em;list-style:none}.sui-2-6-0 .sui-wrap .sui-row-with-sidenav .sui-sidenav .sui-vertical-tabs .sui-vertical-tab.current{background-color:#e6e6e6;border-radius:20px}.sui-2-6-0 .sui-wrap .sui-row-with-sidenav .sui-sidenav .sui-vertical-tabs .sui-vertical-tab.current a{color:#333}.sui-2-6-0 .sui-wrap .sui-row-with-sidenav .sui-sidenav .sui-vertical-tabs .sui-vertical-tab .sui-tag,.sui-2-6-0 .sui-wrap .sui-row-with-sidenav .sui-sidenav .sui-vertical-tabs .sui-vertical-tab i{position:absolute;top:2px;right:3px}.sui-2-6-0 .sui-wrap .sui-row-with-sidenav .sui-sidenav .sui-vertical-tabs .sui-vertical-tab [class*=sui-icon-]{top:6px;right:7px}.sui-2-6-0 .sui-wrap .sui-row-with-sidenav .sui-sidenav .sui-vertical-tabs .sui-vertical-tab [class*=sui-icon-]:before{font-size:16px}.sui-2-6-0 .sui-wrap .sui-row-with-sidenav .sui-sidenav .sui-vertical-tabs a{display:block;color:#666;font-weight:500;transition:.3s ease}.sui-2-6-0 .sui-wrap .sui-row-with-sidenav .sui-sidenav .sui-vertical-tabs a:focus,.sui-2-6-0 .sui-wrap .sui-row-with-sidenav .sui-sidenav .sui-vertical-tabs a:hover{color:#333}.sui-2-6-0 .sui-wrap .sui-row-with-sidenav .sui-sidenav .sui-vertical-tabs.sui-alt-design .sui-vertical-tab{height:auto;padding:0;background-color:transparent;line-height:auto}.sui-2-6-0 .sui-wrap .sui-row-with-sidenav .sui-sidenav .sui-vertical-tabs.sui-alt-design .sui-vertical-tab a{padding:5px 15px;border-radius:20px;background-color:transparent}.sui-2-6-0 .sui-wrap .sui-row-with-sidenav .sui-sidenav .sui-vertical-tabs.sui-alt-design .sui-vertical-tab a.current{background-color:#e6e6e6;color:#333}@media (max-width:1199px){.sui-2-6-0 .sui-wrap .sui-row-with-sidenav .sui-sidenav .sui-vertical-tabs{margin-bottom:15px}}@media (min-width:1200px){.sui-2-6-0 .sui-wrap .sui-row-with-sidenav .sui-sidenav .sui-vertical-tabs{margin-bottom:30px}}@media (max-width:1199px){.sui-2-6-0 .sui-wrap .sui-row-with-sidenav .sui-sidenav .sui-with-floating-input{left:0!important}}@media (min-width:1200px){.sui-2-6-0 .sui-wrap .sui-row-with-sidenav .sui-sidenav .sui-with-floating-input{width:240px;position:absolute;top:0;left:230px;margin:0}}.sui-2-6-0 .sui-wrap .sui-row-with-sidenav .sui-sidenav .sui-sidenav-settings .sui-form-field{margin:0 0 10px}.sui-2-6-0 .sui-wrap .sui-row-with-sidenav .sui-sidenav .sui-sidenav-settings .sui-form-field .sui-mobile-nav{margin-bottom:0}.sui-2-6-0 .sui-wrap .sui-row-with-sidenav .sui-sidenav .sui-sidenav-settings .sui-form-field:last-child{margin:0}@media (max-width:1199px){.sui-2-6-0 .sui-wrap .sui-row-with-sidenav .sui-sidenav .sui-sidenav-settings{margin-bottom:20px}}@media (min-width:1200px){.sui-2-6-0 .sui-wrap .sui-row-with-sidenav .sui-sidenav .sui-sidenav-settings{padding-left:15px}}@media (max-width:1199px){.sui-2-6-0 .sui-wrap .sui-row-with-sidenav .sui-sidenav .sui-sidenav-hide-md{display:none}}@media (min-width:1200px){.sui-2-6-0 .sui-wrap .sui-row-with-sidenav .sui-sidenav .sui-sidenav-hide-lg{display:none}}@media (max-width:1199px){.sui-2-6-0 .sui-wrap .sui-row-with-sidenav .sui-sidenav{width:100%;display:block}}@media (min-width:1200px){.sui-2-6-0 .sui-wrap .sui-row-with-sidenav .sui-sidenav{width:220px;display:table-cell;padding-right:30px}}@media (min-width:1200px){.sui-2-6-0 .sui-wrap .sui-row-with-sidenav .sui-sidenav-sticky{position:-webkit-sticky!important;position:sticky!important;top:47px;z-index:11}}.sui-2-6-0 .sui-wrap .sui-row-with-sidenav>div:not(.sui-sidenav){display:block;position:relative;vertical-align:top;margin-bottom:0}@media (max-width:1100px){.sui-2-6-0 .sui-wrap .sui-row-with-sidenav{display:block}}.sui-2-6-0 .sui-wrap .sui-dropdown{position:relative;display:inline-block;margin:0 10px}.sui-2-6-0 .sui-wrap .sui-dropdown ul{min-width:170px;display:none;position:absolute;z-index:10;top:100%;right:-10px;left:auto;margin:15px 0 0;padding:10px 0;border:1px solid #ddd;border-radius:4px;background-color:#fff;box-shadow:0 3px 7px 0 rgba(0,0,0,.07);transition:.3s ease}.sui-2-6-0 .sui-wrap .sui-dropdown ul:after,.sui-2-6-0 .sui-wrap .sui-dropdown ul:before{content:" ";width:0;position:absolute;right:15px;border-width:0 8px 10px;border-style:solid;border-top-color:#ddd}.sui-2-6-0 .sui-wrap .sui-dropdown ul:before{z-index:10;top:-10px;border-color:#ddd transparent}.sui-2-6-0 .sui-wrap .sui-dropdown ul:after{z-index:11;top:-8px;border-color:#fff transparent}.sui-2-6-0 .sui-wrap .sui-dropdown ul,.sui-2-6-0 .sui-wrap .sui-dropdown ul li{list-style:none}.sui-2-6-0 .sui-wrap .sui-dropdown ul li{display:block;margin:0;border:0}.sui-2-6-0 .sui-wrap .sui-dropdown ul li>span,.sui-2-6-0 .sui-wrap .sui-dropdown ul li>span:active,.sui-2-6-0 .sui-wrap .sui-dropdown ul li>span:focus,.sui-2-6-0 .sui-wrap .sui-dropdown ul li>span:hover,.sui-2-6-0 .sui-wrap .sui-dropdown ul li a,.sui-2-6-0 .sui-wrap .sui-dropdown ul li a:active,.sui-2-6-0 .sui-wrap .sui-dropdown ul li a:focus,.sui-2-6-0 .sui-wrap .sui-dropdown ul li a:hover,.sui-2-6-0 .sui-wrap .sui-dropdown ul li button,.sui-2-6-0 .sui-wrap .sui-dropdown ul li button:active,.sui-2-6-0 .sui-wrap .sui-dropdown ul li button:focus,.sui-2-6-0 .sui-wrap .sui-dropdown ul li button:hover{margin:0;padding:0 8px;border:0;outline:none;box-shadow:none}.sui-2-6-0 .sui-wrap .sui-dropdown ul li a,.sui-2-6-0 .sui-wrap .sui-dropdown ul li button{width:100%;cursor:pointer;display:block;font:500 13px/30px Roboto,Arial,sans-serif;text-align:left;transition:.3s ease}.sui-2-6-0 .sui-wrap .sui-dropdown ul li a,.sui-2-6-0 .sui-wrap .sui-dropdown ul li a:focus,.sui-2-6-0 .sui-wrap .sui-dropdown ul li a:visited,.sui-2-6-0 .sui-wrap .sui-dropdown ul li button,.sui-2-6-0 .sui-wrap .sui-dropdown ul li button:focus,.sui-2-6-0 .sui-wrap .sui-dropdown ul li button:visited{background-color:transparent;color:#888}.sui-2-6-0 .sui-wrap .sui-dropdown ul li a:active,.sui-2-6-0 .sui-wrap .sui-dropdown ul li a:hover,.sui-2-6-0 .sui-wrap .sui-dropdown ul li button:active,.sui-2-6-0 .sui-wrap .sui-dropdown ul li button:hover{background-color:#f2f2f2;color:#333}.sui-2-6-0 .sui-wrap .sui-dropdown ul li a:active [class*=sui-icon-]:before,.sui-2-6-0 .sui-wrap .sui-dropdown ul li a:hover [class*=sui-icon-]:before,.sui-2-6-0 .sui-wrap .sui-dropdown ul li button:active [class*=sui-icon-]:before,.sui-2-6-0 .sui-wrap .sui-dropdown ul li button:hover [class*=sui-icon-]:before{color:#333}.sui-2-6-0 .sui-wrap .sui-dropdown ul li a.sui-option-red,.sui-2-6-0 .sui-wrap .sui-dropdown ul li a.sui-option-red:focus,.sui-2-6-0 .sui-wrap .sui-dropdown ul li a.sui-option-red:visited,.sui-2-6-0 .sui-wrap .sui-dropdown ul li button.sui-option-red,.sui-2-6-0 .sui-wrap .sui-dropdown ul li button.sui-option-red:focus,.sui-2-6-0 .sui-wrap .sui-dropdown ul li button.sui-option-red:visited{background-color:transparent;color:#ff6d6d}.sui-2-6-0 .sui-wrap .sui-dropdown ul li a.sui-option-red:active,.sui-2-6-0 .sui-wrap .sui-dropdown ul li a.sui-option-red:hover,.sui-2-6-0 .sui-wrap .sui-dropdown ul li button.sui-option-red:active,.sui-2-6-0 .sui-wrap .sui-dropdown ul li button.sui-option-red:hover{background-color:#ffe5e9}.sui-2-6-0 .sui-wrap .sui-dropdown ul li a.sui-option-red [class*=sui-icon-]:before,.sui-2-6-0 .sui-wrap .sui-dropdown ul li button.sui-option-red [class*=sui-icon-]:before{color:inherit}.sui-2-6-0 .sui-wrap .sui-dropdown ul li [class*=sui-icon-]{width:24px;margin-right:4px;font-size:12px;text-align:center}.sui-2-6-0 .sui-wrap .sui-dropdown ul li [class*=sui-icon-]:before{display:block;color:#888;transition:.3s ease}.sui-2-6-0 .sui-wrap .sui-dropdown ul li.active,.sui-2-6-0 .sui-wrap .sui-dropdown ul li.current{background-color:#f2f2f2;color:#333}.sui-2-6-0 .sui-wrap .sui-dropdown ul li.active [class*=sui-icon-]:before,.sui-2-6-0 .sui-wrap .sui-dropdown ul li.current [class*=sui-icon-]:before{color:#333}.sui-2-6-0 .sui-wrap .sui-dropdown ul li.sui-dropdown-label{border-bottom:1px solid #e6e6e6;line-height:30px;cursor:default;color:#666}.sui-2-6-0 .sui-wrap .sui-dropdown ul li form{display:block;margin:0;padding:0;border:0}.sui-2-6-0 .sui-wrap .sui-dropdown:first-child{margin-left:0}.sui-2-6-0 .sui-wrap .sui-dropdown:last-child{margin-right:0}.sui-2-6-0 .sui-wrap .sui-dropdown.sui-dropdown-right ul{right:unset;left:-10px}.sui-2-6-0 .sui-wrap .sui-dropdown.sui-dropdown-right ul:after,.sui-2-6-0 .sui-wrap .sui-dropdown.sui-dropdown-right ul:before{right:unset;left:15px}.sui-2-6-0 .sui-wrap .sui-dropdown.sui-dropdown-center ul,.sui-2-6-0 .sui-wrap .sui-dropdown.sui-dropdown-center ul:after,.sui-2-6-0 .sui-wrap .sui-dropdown.sui-dropdown-center ul:before{right:unset;left:50%;transform:translateX(-50%)}.sui-2-6-0 .sui-wrap .sui-dropdown.wds-item-loading{font-size:18px}.sui-2-6-0 .sui-wrap .sui-dropdown.wds-item-loading .sui-dropdown-anchor{visibility:hidden}.sui-2-6-0 .sui-wrap .sui-dropdown.open .sui-dropdown-anchor,.sui-2-6-0 .sui-wrap .sui-dropdown.open .sui-dropdown-anchor:active,.sui-2-6-0 .sui-wrap .sui-dropdown.open .sui-dropdown-anchor:focus,.sui-2-6-0 .sui-wrap .sui-dropdown.open .sui-dropdown-anchor:hover,.sui-2-6-0 .sui-wrap .sui-dropdown.open .sui-dropdown-anchor:visited{background-color:#f2f2f2;color:#333}.sui-2-6-0 .sui-wrap .sui-dropdown.open ul{display:block}@keyframes sui1{to{stroke-dasharray:2.63894 262.89378}}@keyframes sui2{to{stroke-dasharray:5.27788 525.78757}}@keyframes sui3{to{stroke-dasharray:7.91681 788.68135}}@keyframes sui4{to{stroke-dasharray:10.55575 1051.57513}}@keyframes sui5{to{stroke-dasharray:13.19469 1314.46891}}@keyframes sui6{to{stroke-dasharray:15.83363 1577.3627}}@keyframes sui7{to{stroke-dasharray:18.47256 1840.25648}}@keyframes sui8{to{stroke-dasharray:21.1115 2103.15026}}@keyframes sui9{to{stroke-dasharray:23.75044 2366.04405}}@keyframes sui10{to{stroke-dasharray:26.38938 2628.93783}}@keyframes sui11{to{stroke-dasharray:29.02832 2891.83161}}@keyframes sui12{to{stroke-dasharray:31.66725 3154.72539}}@keyframes sui13{to{stroke-dasharray:34.30619 3417.61918}}@keyframes sui14{to{stroke-dasharray:36.94513 3680.51296}}@keyframes sui15{to{stroke-dasharray:39.58407 3943.40674}}@keyframes sui16{to{stroke-dasharray:42.22301 4206.30053}}@keyframes sui17{to{stroke-dasharray:44.86194 4469.19431}}@keyframes sui18{to{stroke-dasharray:47.50088 4732.08809}}@keyframes sui19{to{stroke-dasharray:50.13982 4994.98188}}@keyframes sui20{to{stroke-dasharray:52.77876 5257.87566}}@keyframes sui21{to{stroke-dasharray:55.41769 5520.76944}}@keyframes sui22{to{stroke-dasharray:58.05663 5783.66322}}@keyframes sui23{to{stroke-dasharray:60.69557 6046.55701}}@keyframes sui24{to{stroke-dasharray:63.33451 6309.45079}}@keyframes sui25{to{stroke-dasharray:65.97345 6572.34457}}@keyframes sui26{to{stroke-dasharray:68.61238 6835.23836}}@keyframes sui27{to{stroke-dasharray:71.25132 7098.13214}}@keyframes sui28{to{stroke-dasharray:73.89026 7361.02592}}@keyframes sui29{to{stroke-dasharray:76.5292 7623.9197}}@keyframes sui30{to{stroke-dasharray:79.16813 7886.81349}}@keyframes sui31{to{stroke-dasharray:81.80707 8149.70727}}@keyframes sui32{to{stroke-dasharray:84.44601 8412.60105}}@keyframes sui33{to{stroke-dasharray:87.08495 8675.49484}}@keyframes sui34{to{stroke-dasharray:89.72389 8938.38862}}@keyframes sui35{to{stroke-dasharray:92.36282 9201.2824}}@keyframes sui36{to{stroke-dasharray:95.00176 9464.17618}}@keyframes sui37{to{stroke-dasharray:97.6407 9727.06997}}@keyframes sui38{to{stroke-dasharray:100.27964 9989.96375}}@keyframes sui39{to{stroke-dasharray:102.91858 10252.85753}}@keyframes sui40{to{stroke-dasharray:105.55751 10515.75132}}@keyframes sui41{to{stroke-dasharray:108.19645 10778.6451}}@keyframes sui42{to{stroke-dasharray:110.83539 11041.53888}}@keyframes sui43{to{stroke-dasharray:113.47433 11304.43266}}@keyframes sui44{to{stroke-dasharray:116.11326 11567.32645}}@keyframes sui45{to{stroke-dasharray:118.7522 11830.22023}}@keyframes sui46{to{stroke-dasharray:121.39114 12093.11401}}@keyframes sui47{to{stroke-dasharray:124.03008 12356.0078}}@keyframes sui48{to{stroke-dasharray:126.66902 12618.90158}}@keyframes sui49{to{stroke-dasharray:129.30795 12881.79536}}@keyframes sui50{to{stroke-dasharray:131.94689 13144.68915}}@keyframes sui51{to{stroke-dasharray:134.58583 13407.58293}}@keyframes sui52{to{stroke-dasharray:137.22477 13670.47671}}@keyframes sui53{to{stroke-dasharray:139.8637 13933.37049}}@keyframes sui54{to{stroke-dasharray:142.50264 14196.26428}}@keyframes sui55{to{stroke-dasharray:145.14158 14459.15806}}@keyframes sui56{to{stroke-dasharray:147.78052 14722.05184}}@keyframes sui57{to{stroke-dasharray:150.41946 14984.94563}}@keyframes sui58{to{stroke-dasharray:153.05839 15247.83941}}@keyframes sui59{to{stroke-dasharray:155.69733 15510.73319}}@keyframes sui60{to{stroke-dasharray:158.33627 15773.62697}}@keyframes sui61{to{stroke-dasharray:160.97521 16036.52076}}@keyframes sui62{to{stroke-dasharray:163.61415 16299.41454}}@keyframes sui63{to{stroke-dasharray:166.25308 16562.30832}}@keyframes sui64{to{stroke-dasharray:168.89202 16825.20211}}@keyframes sui65{to{stroke-dasharray:171.53096 17088.09589}}@keyframes sui66{to{stroke-dasharray:174.1699 17350.98967}}@keyframes sui67{to{stroke-dasharray:176.80883 17613.88345}}@keyframes sui68{to{stroke-dasharray:179.44777 17876.77724}}@keyframes sui69{to{stroke-dasharray:182.08671 18139.67102}}@keyframes sui70{to{stroke-dasharray:184.72565 18402.5648}}@keyframes sui71{to{stroke-dasharray:187.36459 18665.45859}}@keyframes sui72{to{stroke-dasharray:190.00352 18928.35237}}@keyframes sui73{to{stroke-dasharray:192.64246 19191.24615}}@keyframes sui74{to{stroke-dasharray:195.2814 19454.13993}}@keyframes sui75{to{stroke-dasharray:197.92034 19717.03372}}@keyframes sui76{to{stroke-dasharray:200.55928 19979.9275}}@keyframes sui77{to{stroke-dasharray:203.19821 20242.82128}}@keyframes sui78{to{stroke-dasharray:205.83715 20505.71507}}@keyframes sui79{to{stroke-dasharray:208.47609 20768.60885}}@keyframes sui80{to{stroke-dasharray:211.11503 21031.50263}}@keyframes sui81{to{stroke-dasharray:213.75396 21294.39642}}@keyframes sui82{to{stroke-dasharray:216.3929 21557.2902}}@keyframes sui83{to{stroke-dasharray:219.03184 21820.18398}}@keyframes sui84{to{stroke-dasharray:221.67078 22083.07776}}@keyframes sui85{to{stroke-dasharray:224.30972 22345.97155}}@keyframes sui86{to{stroke-dasharray:226.94865 22608.86533}}@keyframes sui87{to{stroke-dasharray:229.58759 22871.75911}}@keyframes sui88{to{stroke-dasharray:232.22653 23134.6529}}@keyframes sui89{to{stroke-dasharray:234.86547 23397.54668}}@keyframes sui90{to{stroke-dasharray:237.5044 23660.44046}}@keyframes sui91{to{stroke-dasharray:240.14334 23923.33424}}@keyframes sui92{to{stroke-dasharray:242.78228 24186.22803}}@keyframes sui93{to{stroke-dasharray:245.42122 24449.12181}}@keyframes sui94{to{stroke-dasharray:248.06016 24712.01559}}@keyframes sui95{to{stroke-dasharray:250.69909 24974.90938}}@keyframes sui96{to{stroke-dasharray:253.33803 25237.80316}}@keyframes sui97{to{stroke-dasharray:255.97697 25500.69694}}@keyframes sui98{to{stroke-dasharray:258.61591 25763.59072}}@keyframes sui99{to{stroke-dasharray:261.25485 26026.48451}}@keyframes sui100{to{stroke-dasharray:263.89378 26289.37829}}.sui-2-6-0 .sui-wrap .sui-circle-score{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;height:30px;width:auto;opacity:0;transition:all .4s}.sui-2-6-0 .sui-wrap .sui-circle-score svg{height:100%;transform:rotate(-90deg);transform-origin:center}.sui-2-6-0 .sui-wrap .sui-circle-score svg circle{fill:none;stroke-linecap:butt}.sui-2-6-0 .sui-wrap .sui-circle-score svg circle:first-child{stroke:#f2f2f2}.sui-2-6-0 .sui-wrap .sui-circle-score svg circle:last-child{stroke:#1abc9c}.sui-2-6-0 .sui-wrap .sui-circle-score.loaded{opacity:1}.sui-2-6-0 .sui-wrap .sui-circle-score-label{margin-left:10px;font-weight:500}.sui-2-6-0 .sui-wrap .sui-circle-score-sm{height:30px}.sui-2-6-0 .sui-wrap .sui-circle-score-lg{height:120px}.sui-2-6-0 .sui-wrap .sui-circle-score-lg .sui-circle-score-label{display:none}.sui-2-6-0 .sui-wrap .sui-grade-aplus svg circle:last-child,.sui-2-6-0 .sui-wrap .sui-grade-a svg circle:last-child,.sui-2-6-0 .sui-wrap .sui-grade-b svg circle:last-child,.sui-2-6-0 .sui-wrap .sui-grade-success svg circle:last-child{stroke:#1abc9c}.sui-2-6-0 .sui-wrap .sui-grade-c svg circle:last-child,.sui-2-6-0 .sui-wrap .sui-grade-d svg circle:last-child,.sui-2-6-0 .sui-wrap .sui-grade-warning svg circle:last-child{stroke:#fecf2f}.sui-2-6-0 .sui-wrap .sui-grade-error svg circle:last-child,.sui-2-6-0 .sui-wrap .sui-grade-e svg circle:last-child,.sui-2-6-0 .sui-wrap .sui-grade-f svg circle:last-child{stroke:#ff6d6d}.sui-2-6-0 .sui-wrap .sui-grade-disabled svg circle:last-child,.sui-2-6-0 .sui-wrap .sui-grade-dismissed svg circle:last-child{stroke:#aaa}.sui-2-6-0 .sui-wrap .sui-grade-default svg circle:last-child{stroke:#666}.sui-2-6-0 .sui-wrap .sui-footer{margin-top:40px;color:#aaa;font:500 12px/22px Roboto,Arial,sans-serif;letter-spacing:-.25px;text-align:center}.sui-2-6-0 .sui-wrap .sui-footer [class*=sui-icon-]{margin:0 3px;font-size:11px}.sui-2-6-0 .sui-wrap .sui-footer [class*=sui-icon-]:before{display:block;color:#aaa}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-footer{margin-top:60px}}.sui-2-6-0 .sui-wrap .sui-footer-nav,.sui-2-6-0 .sui-wrap .sui-footer-social{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin:20px 0 0;text-align:center}.sui-2-6-0 .sui-wrap .sui-footer-nav,.sui-2-6-0 .sui-wrap .sui-footer-nav li,.sui-2-6-0 .sui-wrap .sui-footer-social,.sui-2-6-0 .sui-wrap .sui-footer-social li{padding:0;border:0;list-style:none}.sui-2-6-0 .sui-wrap .sui-footer-nav li,.sui-2-6-0 .sui-wrap .sui-footer-social li{display:-ms-inline-flexbox;display:inline-flex;margin:0;color:#aaa;font:400 12px/16px Roboto,Arial,sans-serif}.sui-2-6-0 .sui-wrap .sui-footer-nav li a,.sui-2-6-0 .sui-wrap .sui-footer-social li a{display:block;color:#aaa;font-weight:400;transition:all .3s ease}.sui-2-6-0 .sui-wrap .sui-footer-nav li a [class*=sui-icon-],.sui-2-6-0 .sui-wrap .sui-footer-social li a [class*=sui-icon-]{width:30px;text-align:center}.sui-2-6-0 .sui-wrap .sui-footer-nav li a [class*=sui-icon-]:before,.sui-2-6-0 .sui-wrap .sui-footer-social li a [class*=sui-icon-]:before{display:block;color:inherit}.sui-2-6-0 .sui-wrap .sui-footer-nav li a,.sui-2-6-0 .sui-wrap .sui-footer-nav li a:active,.sui-2-6-0 .sui-wrap .sui-footer-nav li a:hover,.sui-2-6-0 .sui-wrap .sui-footer-social li a,.sui-2-6-0 .sui-wrap .sui-footer-social li a:active,.sui-2-6-0 .sui-wrap .sui-footer-social li a:hover{outline:none;box-shadow:none}.sui-2-6-0 .sui-wrap .sui-footer-nav li a:active,.sui-2-6-0 .sui-wrap .sui-footer-nav li a:hover,.sui-2-6-0 .sui-wrap .sui-footer-social li a:active,.sui-2-6-0 .sui-wrap .sui-footer-social li a:hover{color:#666}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-footer-nav,.sui-2-6-0 .sui-wrap .sui-footer-social{-ms-flex-wrap:wrap;flex-wrap:wrap}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-footer-nav,.sui-2-6-0 .sui-wrap .sui-footer-social{margin-top:30px}}.sui-2-6-0 .sui-wrap .sui-footer-nav li:not(:last-child):after{content:"/";margin-right:6px;margin-left:6px}.sui-2-6-0 .sui-wrap .sui-footer-social li{margin:0 5px}.sui-2-6-0 .sui-wrap .sui-footer-social li:first-child{margin-left:0}.sui-2-6-0 .sui-wrap .sui-footer-social li:last-child{margin-right:0}.sui-2-6-0 .sui-wrap #sui-cross-sell-footer>div{width:100%;text-align:center;border-bottom:1px solid #e6e6e6;line-height:.1em;margin:10px 0 40px}.sui-2-6-0 .sui-wrap #sui-cross-sell-footer>div>span{position:relative;color:#888;background-color:#f1f1f1;padding:0 30px;font-size:16px;top:8px}.sui-2-6-0 .sui-wrap #sui-cross-sell-footer h3{font-size:22px;font-weight:700;line-height:30px;text-transform:none}.sui-2-6-0 .sui-wrap .sui-cross-sell-modules{margin-top:30px}@media (min-width:600px) and (max-width:783px){.sui-2-6-0 .sui-wrap .sui-cross-sell-modules .sui-col-md-4{display:-ms-flexbox;display:flex}}.sui-2-6-0 .sui-wrap .sui-cross-sell-modules [class*=sui-cross-]{min-height:150px;border-radius:4px 4px 0 0;background-size:cover;background-position:50%}.sui-2-6-0 .sui-wrap .sui-cross-sell-modules [class*=sui-cross-]>span{width:56px;height:56px;display:block;border:3px solid #fff;border-radius:50%;position:relative;top:80px;left:15px;box-shadow:0 1px 10px 0 rgba(0,0,0,.25)}@media (min-width:600px) and (max-width:783px){.sui-2-6-0 .sui-wrap .sui-cross-sell-modules [class*=sui-cross-]>span{top:110px}}@media (max-width:600px){.sui-2-6-0 .sui-wrap .sui-cross-sell-modules [class*=sui-cross-]>span{z-index:1;top:45px;left:50%;transform:translateX(-50%)}}@media (min-width:600px) and (max-width:783px){.sui-2-6-0 .sui-wrap .sui-cross-sell-modules [class*=sui-cross-]{width:180px;-ms-flex:none;flex:none;border-radius:4px 0 0 4px}}@media (max-width:600px){.sui-2-6-0 .sui-wrap .sui-cross-sell-modules [class*=sui-cross-]{height:80px;min-height:auto}}.sui-2-6-0 .sui-wrap .sui-cross-sell-modules .sui-cross-1{background-image:url(../images/plugins-hummingbird.jpg)}.sui-2-6-0 .sui-wrap .sui-cross-sell-modules .sui-cross-1>span{background:url(../images/plugins-hummingbird-icon.png) no-repeat 50%;background-size:50px 50px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min--moz-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2),only screen and (min-resolution:2dppx),only screen and (min-resolution:192dpi){.sui-2-6-0 .sui-wrap .sui-cross-sell-modules .sui-cross-1>span{background-image:url(../images/plugins-hummingbird-icon@2x.png)}}.sui-2-6-0 .sui-wrap .sui-cross-sell-modules .sui-cross-2{background-image:url(../images/plugins-defender.jpg)}.sui-2-6-0 .sui-wrap .sui-cross-sell-modules .sui-cross-2>span{background:url(../images/plugins-defender-icon.png) no-repeat 50%;background-size:50px 50px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min--moz-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2),only screen and (min-resolution:2dppx),only screen and (min-resolution:192dpi){.sui-2-6-0 .sui-wrap .sui-cross-sell-modules .sui-cross-2>span{background-image:url(../images/plugins-defender-icon@2x.png)}}.sui-2-6-0 .sui-wrap .sui-cross-sell-modules .sui-cross-3{background-image:url(../images/plugins-smartcrawl.jpg)}.sui-2-6-0 .sui-wrap .sui-cross-sell-modules .sui-cross-3>span{background:url(../images/plugins-smartcrawl-icon.png) no-repeat 50%;background-size:50px 50px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min--moz-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2),only screen and (min-resolution:2dppx),only screen and (min-resolution:192dpi){.sui-2-6-0 .sui-wrap .sui-cross-sell-modules .sui-cross-3>span{background-image:url(../images/plugins-smartcrawl-icon@2x.png)}}.sui-2-6-0 .sui-wrap .sui-cross-sell-modules .sui-box{margin-bottom:0}.sui-2-6-0 .sui-wrap .sui-cross-sell-modules .sui-box h3{margin-top:0;font-size:18px;line-height:30px;font-weight:700;text-transform:none}@media (min-width:600px) and (max-width:783px){.sui-2-6-0 .sui-wrap .sui-cross-sell-modules .sui-box h3{margin:0;min-height:auto}}@media (max-width:600px){.sui-2-6-0 .sui-wrap .sui-cross-sell-modules .sui-box h3{min-height:auto}}.sui-2-6-0 .sui-wrap .sui-cross-sell-modules .sui-box .sui-box-body{padding:30px;border-radius:0 0 4px 4px;text-align:center}.sui-2-6-0 .sui-wrap .sui-cross-sell-modules .sui-box .sui-box-body p{margin-bottom:30px;color:#888;font-size:13px;line-height:22px}@media (min-width:600px) and (max-width:783px){.sui-2-6-0 .sui-wrap .sui-cross-sell-modules .sui-box .sui-box-body p{margin-bottom:14px}}@media (max-width:600px){.sui-2-6-0 .sui-wrap .sui-cross-sell-modules .sui-box .sui-box-body p{margin-bottom:20px}}@media (min-width:600px) and (max-width:783px){.sui-2-6-0 .sui-wrap .sui-cross-sell-modules .sui-box .sui-box-body{text-align:left}}@media (max-width:600px){.sui-2-6-0 .sui-wrap .sui-cross-sell-modules .sui-box .sui-box-body{padding:26px 20px 20px}}@media (min-width:600px) and (max-width:783px){.sui-2-6-0 .sui-wrap .sui-cross-sell-modules .sui-box{border-radius:0 4px 4px 0}}.sui-2-6-0 .sui-wrap .sui-cross-sell-bottom{text-align:center;margin-top:50px}.sui-2-6-0 .sui-wrap .sui-cross-sell-bottom h3{font-size:22px;font-weight:700;line-height:30px;text-transform:none}.sui-2-6-0 .sui-wrap .sui-cross-sell-bottom p{max-width:500px;margin:20px auto 30px}.sui-2-6-0 .sui-wrap .sui-cross-sell-bottom .sui-button{margin:0}.sui-2-6-0 .sui-wrap .sui-cross-sell-bottom img{display:block;height:auto;max-width:100%;margin:30px auto 0}.sui-2-6-0 #wpfooter{display:none}.sui-2-6-0 .sui-wrap .sui-progress{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.sui-2-6-0 .sui-wrap .sui-progress .sui-progress-icon{width:26px;text-align:center}.sui-2-6-0 .sui-wrap .sui-progress .sui-progress-icon [class*=sui-icon-]{display:block;font-size:16px}.sui-2-6-0 .sui-wrap .sui-progress .sui-progress-icon [class*=sui-icon-]:before{display:block}.sui-2-6-0 .sui-wrap .sui-progress .sui-progress-icon+.sui-progress-text{margin-left:0}.sui-2-6-0 .sui-wrap .sui-progress .sui-progress-icon+.sui-progress-bar{margin-left:5px}.sui-2-6-0 .sui-wrap .sui-progress .sui-progress-text{min-width:40px;-ms-flex:0 0 auto;flex:0 0 auto;color:#888;font:700 12px/20px Roboto,Arial,sans-serif;letter-spacing:-.25px;text-align:center}.sui-2-6-0 .sui-wrap .sui-progress .sui-progress-text span{display:block}.sui-2-6-0 .sui-wrap .sui-progress .sui-progress-text+.sui-progress-bar{margin-left:5px}.sui-2-6-0 .sui-wrap .sui-progress .sui-progress-bar{height:10px;overflow:hidden;-ms-flex:1;flex:1;border-radius:5px;background-color:#e6e6e6}.sui-2-6-0 .sui-wrap .sui-progress .sui-progress-bar span{height:100%;display:block;background-color:#17a8e3}.sui-2-6-0 .sui-wrap .sui-progress-block{width:100%;max-width:100%;min-height:60px;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:14px;border:1px solid #e6e6e6;border-radius:4px;background-color:#fff}.sui-2-6-0 .sui-wrap .sui-progress-block .sui-progress{-ms-flex:1;flex:1}.sui-2-6-0 .sui-wrap .sui-progress-block .sui-progress+.sui-button,.sui-2-6-0 .sui-wrap .sui-progress-block .sui-progress+.sui-button-icon{margin-left:10px}.sui-2-6-0 .sui-wrap .sui-progress-block .sui-button,.sui-2-6-0 .sui-wrap .sui-progress-block .sui-button-icon{-ms-flex:0 0 auto;flex:0 0 auto}.sui-2-6-0 .sui-wrap .sui-progress-block .sui-button-icon [class*=sui-icon-],.sui-2-6-0 .sui-wrap .sui-progress-block a.sui-button-icon [class*=sui-icon-],.sui-2-6-0 .sui-wrap .sui-progress-block button.sui-button-icon [class*=sui-icon-]{font-size:16px}.sui-2-6-0 .sui-wrap .sui-progress-block+.sui-progress-state{margin-top:10px}.sui-2-6-0 .sui-wrap .sui-progress-state{display:block;color:#888;font:400 13px/22px Roboto,Arial,sans-serif;letter-spacing:-.25px;text-align:center}.sui-2-6-0 .sui-wrap .sui-progress-state span{display:block}.sui-2-6-0 .sui-wrap .sui-table{width:100%;table-layout:fixed;margin:20px 0;border-collapse:unset;border-spacing:unset;border:1px solid #e6e6e6;border-radius:4px;color:#666;font-size:13px;line-height:22px;letter-spacing:-.25px}.sui-2-6-0 .sui-wrap .sui-table tbody>tr>.sui-accordion-item-title,.sui-2-6-0 .sui-wrap .sui-table tbody>tr>.sui-table-item-title,.sui-2-6-0 .sui-wrap .sui-table tbody>tr>th,.sui-2-6-0 .sui-wrap .sui-table tfoot>tr>.sui-accordion-item-title,.sui-2-6-0 .sui-wrap .sui-table tfoot>tr>.sui-table-item-title,.sui-2-6-0 .sui-wrap .sui-table tfoot>tr>th,.sui-2-6-0 .sui-wrap .sui-table thead>tr>.sui-accordion-item-title,.sui-2-6-0 .sui-wrap .sui-table thead>tr>.sui-table-item-title,.sui-2-6-0 .sui-wrap .sui-table thead>tr>th{color:#333;text-align:left}.sui-2-6-0 .sui-wrap .sui-table tbody>tr>td,.sui-2-6-0 .sui-wrap .sui-table tbody>tr>th,.sui-2-6-0 .sui-wrap .sui-table tfoot>tr>td,.sui-2-6-0 .sui-wrap .sui-table tfoot>tr>th,.sui-2-6-0 .sui-wrap .sui-table thead>tr>td,.sui-2-6-0 .sui-wrap .sui-table thead>tr>th{height:40px;vertical-align:middle;padding:5px 9px;border:0;border-bottom:1px solid #e6e6e6}.sui-2-6-0 .sui-wrap .sui-table tbody>tr>td:first-child,.sui-2-6-0 .sui-wrap .sui-table tbody>tr>th:first-child,.sui-2-6-0 .sui-wrap .sui-table tfoot>tr>td:first-child,.sui-2-6-0 .sui-wrap .sui-table tfoot>tr>th:first-child,.sui-2-6-0 .sui-wrap .sui-table thead>tr>td:first-child,.sui-2-6-0 .sui-wrap .sui-table thead>tr>th:first-child{padding-left:19px}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-table tbody>tr>td:first-child,.sui-2-6-0 .sui-wrap .sui-table tbody>tr>th:first-child,.sui-2-6-0 .sui-wrap .sui-table tfoot>tr>td:first-child,.sui-2-6-0 .sui-wrap .sui-table tfoot>tr>th:first-child,.sui-2-6-0 .sui-wrap .sui-table thead>tr>td:first-child,.sui-2-6-0 .sui-wrap .sui-table thead>tr>th:first-child{padding-left:29px}}.sui-2-6-0 .sui-wrap .sui-table tbody>tr>td:last-child,.sui-2-6-0 .sui-wrap .sui-table tbody>tr>th:last-child,.sui-2-6-0 .sui-wrap .sui-table tfoot>tr>td:last-child,.sui-2-6-0 .sui-wrap .sui-table tfoot>tr>th:last-child,.sui-2-6-0 .sui-wrap .sui-table thead>tr>td:last-child,.sui-2-6-0 .sui-wrap .sui-table thead>tr>th:last-child{padding-right:19px}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-table tbody>tr>td:last-child,.sui-2-6-0 .sui-wrap .sui-table tbody>tr>th:last-child,.sui-2-6-0 .sui-wrap .sui-table tfoot>tr>td:last-child,.sui-2-6-0 .sui-wrap .sui-table tfoot>tr>th:last-child,.sui-2-6-0 .sui-wrap .sui-table thead>tr>td:last-child,.sui-2-6-0 .sui-wrap .sui-table thead>tr>th:last-child{padding-right:29px}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-table tbody>tr>td,.sui-2-6-0 .sui-wrap .sui-table tbody>tr>th,.sui-2-6-0 .sui-wrap .sui-table tfoot>tr>td,.sui-2-6-0 .sui-wrap .sui-table tfoot>tr>th,.sui-2-6-0 .sui-wrap .sui-table thead>tr>td,.sui-2-6-0 .sui-wrap .sui-table thead>tr>th{height:60px;padding-right:14px;padding-left:14px}}.sui-2-6-0 .sui-wrap .sui-table tbody:last-child>tr:last-child>td,.sui-2-6-0 .sui-wrap .sui-table tbody:last-child>tr:last-child>th,.sui-2-6-0 .sui-wrap .sui-table tfoot:last-child>tr:last-child>td,.sui-2-6-0 .sui-wrap .sui-table tfoot:last-child>tr:last-child>th,.sui-2-6-0 .sui-wrap .sui-table thead:last-child>tr:last-child>td,.sui-2-6-0 .sui-wrap .sui-table thead:last-child>tr:last-child>th{border-bottom:0}.sui-2-6-0 .sui-wrap .sui-table thead tr th{font-weight:700;white-space:nowrap}.sui-2-6-0 .sui-wrap .sui-table tbody tr td .sui-toggle,.sui-2-6-0 .sui-wrap .sui-table tbody tr th .sui-toggle{vertical-align:text-top}.sui-2-6-0 .sui-wrap .sui-table tbody tr td>[class*=sui-icon-],.sui-2-6-0 .sui-wrap .sui-table tbody tr th>[class*=sui-icon-]{margin-right:10px;font-size:10px}.sui-2-6-0 .sui-wrap .sui-table tbody tr td>[class*=sui-icon-].sui-icon-right,.sui-2-6-0 .sui-wrap .sui-table tbody tr th>[class*=sui-icon-].sui-icon-right{margin-right:0;margin-left:10px}.sui-2-6-0 .sui-wrap .sui-table tbody tr .sui-accordion-item-title,.sui-2-6-0 .sui-wrap .sui-table tbody tr .sui-table-item-title,.sui-2-6-0 .sui-wrap .sui-table tbody tr th{font-weight:500}.sui-2-6-0 .sui-wrap .sui-table tbody tr .sui-accordion-item-title>[class*=sui-icon-],.sui-2-6-0 .sui-wrap .sui-table tbody tr .sui-table-item-title>[class*=sui-icon-]{margin-right:10px;font-size:16px;vertical-align:middle}.sui-2-6-0 .sui-wrap .sui-table tbody tr .sui-accordion-item-title>[class*=sui-icon-]:before,.sui-2-6-0 .sui-wrap .sui-table tbody tr .sui-table-item-title>[class*=sui-icon-]:before{display:inline-block;line-height:22px}.sui-2-6-0 .sui-wrap .sui-table tbody tr .sui-accordion-item-title>[class*=sui-icon-].sui-icon-right,.sui-2-6-0 .sui-wrap .sui-table tbody tr .sui-table-item-title>[class*=sui-icon-].sui-icon-right{margin-right:0;margin-left:10px}.sui-2-6-0 .sui-wrap .sui-table tbody tr.sui-error .sui-accordion-item-title,.sui-2-6-0 .sui-wrap .sui-table tbody tr.sui-error .sui-table-item-title,.sui-2-6-0 .sui-wrap .sui-table tbody tr.sui-error th,.sui-2-6-0 .sui-wrap .sui-table tbody tr.sui-success .sui-accordion-item-title,.sui-2-6-0 .sui-wrap .sui-table tbody tr.sui-success .sui-table-item-title,.sui-2-6-0 .sui-wrap .sui-table tbody tr.sui-success th,.sui-2-6-0 .sui-wrap .sui-table tbody tr.sui-warning .sui-accordion-item-title,.sui-2-6-0 .sui-wrap .sui-table tbody tr.sui-warning .sui-table-item-title,.sui-2-6-0 .sui-wrap .sui-table tbody tr.sui-warning th{color:#333}.sui-2-6-0 .sui-wrap .sui-table tbody tr.sui-error td,.sui-2-6-0 .sui-wrap .sui-table tbody tr.sui-success td,.sui-2-6-0 .sui-wrap .sui-table tbody tr.sui-warning td{color:#666}.sui-2-6-0 .sui-wrap .sui-table tbody tr.sui-default{box-shadow:inset 3px 0 0 #666}.sui-2-6-0 .sui-wrap .sui-table tbody tr.sui-error{box-shadow:inset 3px 0 0 #ff6d6d}.sui-2-6-0 .sui-wrap .sui-table tbody tr.sui-warning{box-shadow:inset 3px 0 0 #fecf2f}.sui-2-6-0 .sui-wrap .sui-table tbody tr.sui-success{box-shadow:inset 3px 0 0 #1abc9c}.sui-2-6-0 .sui-wrap .sui-table.sui-table-with-title,.sui-2-6-0 .sui-wrap .sui-table:first-child{margin-top:0}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-table.sui-table-with-title,.sui-2-6-0 .sui-wrap .sui-table:first-child{margin-top:0}}.sui-2-6-0 .sui-wrap .sui-table:last-child{margin-bottom:0}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-table:last-child{margin-bottom:0}}.sui-2-6-0 .sui-wrap .sui-table.sui-table-flushed{margin:0;border:0;border-radius:0;border-collapse:collapse}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-table{margin:30px 0}}.sui-2-6-0 .sui-wrap .sui-table-title{margin:5px 0;color:#333;font:700 13px/22px Roboto,Arial,sans-serif;letter-spacing:0}.sui-2-6-0 .sui-wrap .sui-box-body+.sui-table.sui-table-flushed>tbody:first-child>tr:first-child>td,.sui-2-6-0 .sui-wrap .sui-box-body+.sui-table.sui-table-flushed>tbody:first-child>tr:first-child>th,.sui-2-6-0 .sui-wrap .sui-box-body+.sui-table.sui-table-flushed>tfoot:first-child>tr:first-child>td,.sui-2-6-0 .sui-wrap .sui-box-body+.sui-table.sui-table-flushed>tfoot:first-child>tr:first-child>th,.sui-2-6-0 .sui-wrap .sui-box-body+.sui-table.sui-table-flushed>thead:first-child>tr:first-child>td,.sui-2-6-0 .sui-wrap .sui-box-body+.sui-table.sui-table-flushed>thead:first-child>tr:first-child>th{height:auto;padding-top:0}.sui-2-6-0 .sui-wrap .sui-field-list{border:1px solid #e6e6e6;border-radius:4px}.sui-2-6-0 .sui-wrap .sui-field-list-header{padding:20px 30px}.sui-2-6-0 .sui-wrap .sui-field-list-item{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:15px 30px;border-top:1px solid #e6e6e6}.sui-2-6-0 .sui-wrap .sui-field-list-item-label{margin-right:auto;margin-left:0}.sui-2-6-0 .sui-wrap .sui-field-list-title{margin:0;color:#333;font-size:13px;line-height:30px;font-family:Roboto,Arial,sans-serif;font-weight:500;text-transform:capitalize}.sui-2-6-0 .sui-wrap .sui-accordion .sui-accordion-item-body,.sui-2-6-0 .sui-wrap .sui-accordion .sui-accordion-item-content{font-size:13px;line-height:22px}.sui-2-6-0 .sui-wrap .sui-accordion .sui-accordion-item-body p,.sui-2-6-0 .sui-wrap .sui-accordion .sui-accordion-item-content p{font-size:13px;line-height:22px;margin:5px 0 10px}.sui-2-6-0 .sui-wrap .sui-accordion .sui-accordion-item-body .sui-accordion-body-header,.sui-2-6-0 .sui-wrap .sui-accordion .sui-accordion-item-content .sui-accordion-body-header{display:block;font-size:13px;line-height:22px;font-weight:700;margin:5px 0}.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-footer,.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-header,.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-item-header,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-footer,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-header,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-item-header{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;font-size:13px;line-height:22px;font-family:Roboto,Arial,sans-serif;font-weight:400;letter-spacing:-.25px}.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-footer>div,.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-header>div,.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-item-header>div,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-footer>div,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-header>div,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-item-header>div{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex:1;flex:1;padding:0 9px}.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-footer>div:first-child,.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-header>div:first-child,.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-item-header>div:first-child,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-footer>div:first-child,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-header>div:first-child,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-item-header>div:first-child{padding-left:19px}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-footer>div:first-child,.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-header>div:first-child,.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-item-header>div:first-child,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-footer>div:first-child,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-header>div:first-child,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-item-header>div:first-child{padding-left:29px}}.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-footer>div:last-child,.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-header>div:last-child,.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-item-header>div:last-child,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-footer>div:last-child,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-header>div:last-child,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-item-header>div:last-child{padding-right:19px}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-footer>div:last-child,.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-header>div:last-child,.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-item-header>div:last-child,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-footer>div:last-child,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-header>div:last-child,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-item-header>div:last-child{padding-right:29px}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-footer>div,.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-header>div,.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-item-header>div,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-footer>div,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-header>div,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-item-header>div{padding-right:14px;padding-left:14px}}.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-footer>[class^=sui-accordion-col-],.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-header>[class^=sui-accordion-col-],.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-item-header>[class^=sui-accordion-col-],.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-footer>[class^=sui-accordion-col-],.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-header>[class^=sui-accordion-col-],.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-item-header>[class^=sui-accordion-col-]{-ms-flex:0 0 auto;flex:0 0 auto}.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-footer .sui-accordion-col-1,.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-header .sui-accordion-col-1,.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-item-header .sui-accordion-col-1,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-footer .sui-accordion-col-1,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-header .sui-accordion-col-1,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-item-header .sui-accordion-col-1{min-width:8.33333%;-ms-flex-preferred-size:8.33333%;flex-basis:8.33333%}.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-footer .sui-accordion-col-2,.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-header .sui-accordion-col-2,.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-item-header .sui-accordion-col-2,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-footer .sui-accordion-col-2,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-header .sui-accordion-col-2,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-item-header .sui-accordion-col-2{min-width:16.66667%;-ms-flex-preferred-size:16.66667%;flex-basis:16.66667%}.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-footer .sui-accordion-col-3,.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-header .sui-accordion-col-3,.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-item-header .sui-accordion-col-3,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-footer .sui-accordion-col-3,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-header .sui-accordion-col-3,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-item-header .sui-accordion-col-3{min-width:25%;-ms-flex-preferred-size:25%;flex-basis:25%}.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-footer .sui-accordion-col-4,.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-header .sui-accordion-col-4,.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-item-header .sui-accordion-col-4,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-footer .sui-accordion-col-4,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-header .sui-accordion-col-4,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-item-header .sui-accordion-col-4{min-width:33.33333%;-ms-flex-preferred-size:33.33333%;flex-basis:33.33333%}.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-footer .sui-accordion-col-5,.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-header .sui-accordion-col-5,.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-item-header .sui-accordion-col-5,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-footer .sui-accordion-col-5,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-header .sui-accordion-col-5,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-item-header .sui-accordion-col-5{min-width:41.66667%;-ms-flex-preferred-size:41.66667%;flex-basis:41.66667%}.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-footer .sui-accordion-col-6,.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-header .sui-accordion-col-6,.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-item-header .sui-accordion-col-6,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-footer .sui-accordion-col-6,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-header .sui-accordion-col-6,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-item-header .sui-accordion-col-6{min-width:50%;-ms-flex-preferred-size:50%;flex-basis:50%}.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-footer .sui-accordion-col-7,.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-header .sui-accordion-col-7,.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-item-header .sui-accordion-col-7,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-footer .sui-accordion-col-7,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-header .sui-accordion-col-7,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-item-header .sui-accordion-col-7{min-width:58.33333%;-ms-flex-preferred-size:58.33333%;flex-basis:58.33333%}.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-footer .sui-accordion-col-8,.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-header .sui-accordion-col-8,.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-item-header .sui-accordion-col-8,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-footer .sui-accordion-col-8,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-header .sui-accordion-col-8,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-item-header .sui-accordion-col-8{min-width:66.66667%;-ms-flex-preferred-size:66.66667%;flex-basis:66.66667%}.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-footer .sui-accordion-col-9,.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-header .sui-accordion-col-9,.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-item-header .sui-accordion-col-9,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-footer .sui-accordion-col-9,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-header .sui-accordion-col-9,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-item-header .sui-accordion-col-9{min-width:75%;-ms-flex-preferred-size:75%;flex-basis:75%}.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-footer .sui-accordion-col-10,.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-header .sui-accordion-col-10,.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-item-header .sui-accordion-col-10,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-footer .sui-accordion-col-10,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-header .sui-accordion-col-10,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-item-header .sui-accordion-col-10{min-width:83.33333%;-ms-flex-preferred-size:83.33333%;flex-basis:83.33333%}.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-footer .sui-accordion-col-11,.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-header .sui-accordion-col-11,.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-item-header .sui-accordion-col-11,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-footer .sui-accordion-col-11,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-header .sui-accordion-col-11,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-item-header .sui-accordion-col-11{min-width:91.66667%;-ms-flex-preferred-size:91.66667%;flex-basis:91.66667%}.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-footer .sui-accordion-col-12,.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-header .sui-accordion-col-12,.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-item-header .sui-accordion-col-12,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-footer .sui-accordion-col-12,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-header .sui-accordion-col-12,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-item-header .sui-accordion-col-12{min-width:100%;-ms-flex-preferred-size:100%;flex-basis:100%}.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-item .sui-accordion-item-header,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-item .sui-accordion-item-header{cursor:pointer}.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-item .sui-accordion-item-header .sui-accordion-open-indicator [class*=sui-icon-],.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-item .sui-accordion-item-header .sui-accordion-open-indicator [class*=sui-icon-]{transition:.2s linear}.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-item .sui-accordion-item-body,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-item .sui-accordion-item-body{display:none}.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-item.sui-accordion-item--open>.sui-accordion-item-header .sui-accordion-open-indicator [class*=sui-icon-],.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-item.sui-accordion-item--open>.sui-accordion-item-header .sui-accordion-open-indicator [class*=sui-icon-]{transform:rotate(180deg)}.sui-2-6-0 .sui-wrap .sui-accordion-block:not(.sui-builder-fields) .sui-accordion-item.sui-accordion-item--open>.sui-accordion-item-body,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-builder-fields) .sui-accordion-item.sui-accordion-item--open>.sui-accordion-item-body{display:block}.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields){margin:20px 0;border:1px solid #e6e6e6;border-radius:4px}.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields) .sui-accordion-footer,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields) .sui-accordion-header,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields) .sui-accordion-item-header{min-height:40px;padding:5px 0}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields) .sui-accordion-footer,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields) .sui-accordion-header,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields) .sui-accordion-item-header{min-height:60px}}.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields) .sui-accordion-header{border-bottom:1px solid #e6e6e6}.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields) .sui-accordion-header>div{overflow:hidden;color:#333;font-weight:700;text-overflow:ellipsis;white-space:nowrap}.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields) .sui-accordion-header:last-child{border-bottom-width:0}.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields) .sui-accordion-item{border-bottom:1px solid #e6e6e6}.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields) .sui-accordion-item .sui-accordion-item-header{color:#666;transition:.3s ease}.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields) .sui-accordion-item .sui-accordion-item-header>div span{-ms-flex:0 1 auto;flex:0 1 auto}.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields) .sui-accordion-item .sui-accordion-item-header [class*=sui-icon-]{margin-right:10px;font-size:12px}.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields) .sui-accordion-item .sui-accordion-item-header [class*=sui-icon-]:before{display:block}.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields) .sui-accordion-item .sui-accordion-item-header [class*=sui-icon-].sui-icon-right{margin-right:0;margin-left:10px}.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields) .sui-accordion-item .sui-accordion-item-header .sui-accordion-item-title{color:#333;font-weight:500}.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields) .sui-accordion-item .sui-accordion-item-header .sui-accordion-item-title .sui-toggle{-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-align:start;align-items:flex-start}.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields) .sui-accordion-item .sui-accordion-item-header .sui-accordion-item-title .sui-toggle+span{margin-left:10px}.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields) .sui-accordion-item .sui-accordion-item-header .sui-accordion-item-title [class*=sui-icon-]{font-size:16px}.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields) .sui-accordion-item .sui-accordion-item-header .sui-accordion-item-title .sui-accordion-open-indicator [class*=sui-icon-]{font-size:12px}.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields) .sui-accordion-item .sui-accordion-item-header .sui-accordion-open-indicator{-ms-flex-item-align:start;align-self:flex-start;margin-right:0;margin-left:auto}.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields) .sui-accordion-item .sui-accordion-item-header .sui-accordion-open-indicator [class*=sui-icon-]{margin:0}.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields) .sui-accordion-item .sui-accordion-item-header .sui-tag+.sui-accordion-open-indicator{margin-left:10px}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields) .sui-accordion-item .sui-accordion-item-header .sui-tag+.sui-accordion-open-indicator{margin-left:20px}}.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields) .sui-accordion-item .sui-accordion-item-header:focus,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields) .sui-accordion-item .sui-accordion-item-header:hover{background-color:#f8f8f8}.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields) .sui-accordion-item .sui-accordion-item-body{padding:0 19px 19px;background-color:#f8f8f8}.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields) .sui-accordion-item .sui-accordion-item-body .sui-box:last-child{margin-bottom:0}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields) .sui-accordion-item .sui-accordion-item-body{padding:0 29px 29px}}.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields) .sui-accordion-item:first-child .sui-accordion-item-header{border-top-left-radius:3px;border-top-right-radius:3px}.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields) .sui-accordion-item:last-child{border-bottom:0}.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields) .sui-accordion-item:last-child .sui-accordion-item-body,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields) .sui-accordion-item:last-child .sui-accordion-item-header{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields) .sui-accordion-item.sui-default>.sui-accordion-item-body,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields) .sui-accordion-item.sui-default>.sui-accordion-item-header{box-shadow:inset 3px 0 #666}.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields) .sui-accordion-item.sui-error>.sui-accordion-item-body,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields) .sui-accordion-item.sui-error>.sui-accordion-item-header{box-shadow:inset 3px 0 #ff6d6d}.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields) .sui-accordion-item.sui-warning>.sui-accordion-item-body,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields) .sui-accordion-item.sui-warning>.sui-accordion-item-header{box-shadow:inset 3px 0 #fecf2f}.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields) .sui-accordion-item.sui-success>.sui-accordion-item-body,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields) .sui-accordion-item.sui-success>.sui-accordion-item-header{box-shadow:inset 3px 0 #1abc9c}.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields) .sui-accordion-item.sui-accordion-item--open>.sui-accordion-item-header{border-bottom-right-radius:0;border-bottom-left-radius:0;background-color:#f8f8f8}.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields) .sui-accordion-item.sui-accordion-item--disabled .sui-accordion-item-header{cursor:default;background-color:#f8f8f8}.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields) .sui-accordion-item.sui-accordion-item--disabled .sui-accordion-item-header,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields) .sui-accordion-item.sui-accordion-item--disabled .sui-accordion-item-header .sui-accordion-item-title{color:#aaa}.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields) .sui-accordion-item.sui-accordion-item--disabled .sui-accordion-item-header,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields) .sui-accordion-item.sui-accordion-item--disabled .sui-accordion-item-header .sui-accordion-open-indicator{pointer-events:none}.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields) .sui-accordion-item.sui-accordion-item--disabled .sui-accordion-item-header .sui-toggle{pointer-events:auto}.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields) .sui-accordion-item.sui-accordion-item--disabled .sui-accordion-item-header .sui-circle-score svg circle:last-child{stroke:#ddd}.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields) .sui-accordion-item.sui-accordion-item--disabled .sui-accordion-item-header [class*=sui-icon-]:before{color:#ddd}.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields) .sui-accordion-item.sui-accordion-item--disabled.sui-error .sui-accordion-item-header,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields) .sui-accordion-item.sui-accordion-item--disabled.sui-success .sui-accordion-item-header,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields) .sui-accordion-item.sui-accordion-item--disabled.sui-warning .sui-accordion-item-header{box-shadow:inset 3px 0 #ddd}.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields) .sui-accordion-item.sui-accordion-item--disabled.sui-accordion-item--open>.sui-accordion-item-body{display:none}.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields).sui-accordion-flushed{margin:0;border-right-width:0;border-left-width:0;border-radius:0}.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields).sui-accordion-flushed:first-child{border-top-width:0}.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields).sui-accordion-flushed:last-child{border-bottom-width:0}.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields).sui-accordion-flushed:not(:first-child) .sui-accordion-item:first-child .sui-accordion-item-header{border-top-left-radius:0;border-top-right-radius:0}.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields).sui-accordion-flushed:not(:last-child) .sui-accordion-item:last-child .sui-accordion-item-body,.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields).sui-accordion-flushed:not(:last-child) .sui-accordion-item:last-child .sui-accordion-item-header{border-bottom-right-radius:0;border-bottom-left-radius:0}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields).sui-accordion-flushed{margin:0}}.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields):first-child{margin-top:0}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields):first-child{margin-top:0}}.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields):last-child{margin-bottom:0}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields):last-child{margin-bottom:0}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-accordion:not(.sui-table):not(.sui-accordion-block):not(.sui-builder-fields){margin-top:30px;margin-bottom:30px}}.sui-2-6-0 .sui-wrap .sui-accordion.sui-table>tbody>.sui-accordion-item{cursor:pointer;transition:background-color .3s}.sui-2-6-0 .sui-wrap .sui-accordion.sui-table>tbody>.sui-accordion-item td,.sui-2-6-0 .sui-wrap .sui-accordion.sui-table>tbody>.sui-accordion-item th{transition:background-color .3s}.sui-2-6-0 .sui-wrap .sui-accordion.sui-table>tbody>.sui-accordion-item td.sui-table-item-title .sui-toggle .sui-toggle-slider,.sui-2-6-0 .sui-wrap .sui-accordion.sui-table>tbody>.sui-accordion-item th.sui-table-item-title .sui-toggle .sui-toggle-slider{margin-right:10px}.sui-2-6-0 .sui-wrap .sui-accordion.sui-table>tbody>.sui-accordion-item td.sui-table-item-title .sui-accordion-open-indicator [class*=sui-icon-],.sui-2-6-0 .sui-wrap .sui-accordion.sui-table>tbody>.sui-accordion-item th.sui-table-item-title .sui-accordion-open-indicator [class*=sui-icon-]{height:22px;line-height:22px}.sui-2-6-0 .sui-wrap .sui-accordion.sui-table>tbody>.sui-accordion-item td.sui-table-item-title .sui-accordion-open-indicator [class*=sui-icon-]:before,.sui-2-6-0 .sui-wrap .sui-accordion.sui-table>tbody>.sui-accordion-item th.sui-table-item-title .sui-accordion-open-indicator [class*=sui-icon-]:before{line-height:22px}.sui-2-6-0 .sui-wrap .sui-accordion.sui-table>tbody>.sui-accordion-item .sui-accordion-open-indicator{float:right;margin-left:10px}.sui-2-6-0 .sui-wrap .sui-accordion.sui-table>tbody>.sui-accordion-item .sui-accordion-open-indicator [class*=sui-icon-]{display:block;margin-right:0;font-size:12px}.sui-2-6-0 .sui-wrap .sui-accordion.sui-table>tbody>.sui-accordion-item:focus,.sui-2-6-0 .sui-wrap .sui-accordion.sui-table>tbody>.sui-accordion-item:hover{background-color:#f8f8f8}.sui-2-6-0 .sui-wrap .sui-accordion.sui-table>tbody>.sui-accordion-item.sui-default+.sui-accordion-item-content{box-shadow:inset 3px 0 0 #666}.sui-2-6-0 .sui-wrap .sui-accordion.sui-table>tbody>.sui-accordion-item.sui-error+.sui-accordion-item-content{box-shadow:inset 3px 0 0 #ff6d6d}.sui-2-6-0 .sui-wrap .sui-accordion.sui-table>tbody>.sui-accordion-item.sui-warning+.sui-accordion-item-content{box-shadow:inset 3px 0 0 #fecf2f}.sui-2-6-0 .sui-wrap .sui-accordion.sui-table>tbody>.sui-accordion-item.sui-success+.sui-accordion-item-content{box-shadow:inset 3px 0 0 #1abc9c}.sui-2-6-0 .sui-wrap .sui-accordion.sui-table>tbody>.sui-accordion-item.sui-accordion-item--open{background-color:#f8f8f8}.sui-2-6-0 .sui-wrap .sui-accordion.sui-table>tbody>.sui-accordion-item.sui-accordion-item--open td,.sui-2-6-0 .sui-wrap .sui-accordion.sui-table>tbody>.sui-accordion-item.sui-accordion-item--open th{border-bottom-color:transparent}.sui-2-6-0 .sui-wrap .sui-accordion.sui-table>tbody>.sui-accordion-item.sui-accordion-item--open .sui-accordion-open-indicator i{transform:rotate(180deg)}.sui-2-6-0 .sui-wrap .sui-accordion.sui-table>tbody>.sui-accordion-item.sui-accordion-item--open+.sui-accordion-item-content{display:table-row}.sui-2-6-0 .sui-wrap .sui-accordion.sui-table>tbody>.sui-accordion-item.sui-accordion-item--disabled{pointer-events:none;background-color:#f8f8f8}.sui-2-6-0 .sui-wrap .sui-accordion.sui-table>tbody>.sui-accordion-item.sui-accordion-item--disabled td,.sui-2-6-0 .sui-wrap .sui-accordion.sui-table>tbody>.sui-accordion-item.sui-accordion-item--disabled th{color:#aaa}.sui-2-6-0 .sui-wrap .sui-accordion.sui-table>tbody>.sui-accordion-item.sui-accordion-item--disabled td .sui-toggle,.sui-2-6-0 .sui-wrap .sui-accordion.sui-table>tbody>.sui-accordion-item.sui-accordion-item--disabled th .sui-toggle{pointer-events:auto}.sui-2-6-0 .sui-wrap .sui-accordion.sui-table>tbody>.sui-accordion-item.sui-accordion-item--disabled td .sui-circle-score svg circle:last-child,.sui-2-6-0 .sui-wrap .sui-accordion.sui-table>tbody>.sui-accordion-item.sui-accordion-item--disabled th .sui-circle-score svg circle:last-child{stroke:#ddd}.sui-2-6-0 .sui-wrap .sui-accordion.sui-table>tbody>.sui-accordion-item.sui-accordion-item--disabled td [class*=sui-icon-]:before,.sui-2-6-0 .sui-wrap .sui-accordion.sui-table>tbody>.sui-accordion-item.sui-accordion-item--disabled th [class*=sui-icon-]:before{color:#ddd}.sui-2-6-0 .sui-wrap .sui-accordion.sui-table>tbody>.sui-accordion-item.sui-accordion-item--disabled.sui-error,.sui-2-6-0 .sui-wrap .sui-accordion.sui-table>tbody>.sui-accordion-item.sui-accordion-item--disabled.sui-success,.sui-2-6-0 .sui-wrap .sui-accordion.sui-table>tbody>.sui-accordion-item.sui-accordion-item--disabled.sui-warning{box-shadow:inset 3px 0 0 #ddd}.sui-2-6-0 .sui-wrap .sui-accordion.sui-table>tbody>.sui-accordion-item.sui-accordion-item--disabled+.sui-accordion-item-content{display:none}.sui-2-6-0 .sui-wrap .sui-accordion.sui-table>tbody>.sui-accordion-item-content{display:none;background-color:#f8f8f8}.sui-2-6-0 .sui-wrap .sui-accordion.sui-table>tbody>.sui-accordion-item-content td,.sui-2-6-0 .sui-wrap .sui-accordion.sui-table>tbody>.sui-accordion-item-content th{padding:0 20px 20px}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-accordion.sui-table>tbody>.sui-accordion-item-content td,.sui-2-6-0 .sui-wrap .sui-accordion.sui-table>tbody>.sui-accordion-item-content th{padding:0 30px 30px}}.sui-2-6-0 .sui-wrap .sui-accordion.sui-table>tbody .sui-table-item-last.sui-accordion-item,.sui-2-6-0 .sui-wrap .sui-accordion.sui-table>tbody .sui-table-item-last.sui-accordion-item-content{border-radius:0 0 4px 4px}.sui-2-6-0 .sui-wrap .sui-accordion.sui-table>tbody .sui-table-item-last.sui-accordion-item.sui-accordion-item--open{border-radius:0}.sui-2-6-0 .sui-wrap .sui-accordion.sui-table>tbody .sui-table-item-first{border-radius:4px 4px 0 0}.sui-2-6-0 .sui-wrap .sui-accordion-block .sui-accordion-item{margin:0 0 20px;border-radius:4px;background-color:#fff;box-shadow:0 2px 0 0 #e6e6e6}.sui-2-6-0 .sui-wrap .sui-accordion-block .sui-accordion-item .sui-accordion-item-header{min-height:60px;padding:15px 0;color:#888;font-size:13px;line-height:22px;font-family:Roboto,Arial,sans-serif;letter-spacing:-.25px}.sui-2-6-0 .sui-wrap .sui-accordion-block .sui-accordion-item .sui-accordion-item-header strong{margin-right:10px;color:#333}.sui-2-6-0 .sui-wrap .sui-accordion-block .sui-accordion-item .sui-accordion-item-header .sui-accordion-item-title{color:#333;font-size:22px;line-height:30px;font-family:Roboto,Arial,sans-serif;font-weight:700}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-accordion-block .sui-accordion-item .sui-accordion-item-header .sui-accordion-item-title .sui-tag{display:block;bottom:17px;left:9px;position:absolute}}.sui-2-6-0 .sui-wrap .sui-accordion-block .sui-accordion-item .sui-accordion-item-header .sui-accordion-item-title.sui-trim-title{overflow:hidden;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;text-overflow:ellipsis;white-space:nowrap}.sui-2-6-0 .sui-wrap .sui-accordion-block .sui-accordion-item .sui-accordion-item-header .sui-accordion-item-title.sui-trim-title span{-ms-flex:0 0 auto;flex:0 0 auto}.sui-2-6-0 .sui-wrap .sui-accordion-block .sui-accordion-item .sui-accordion-item-header .sui-accordion-item-title.sui-trim-title .sui-trim-text{overflow:hidden;display:block;-ms-flex:0 1 auto;flex:0 1 auto;-ms-flex-align:center;align-items:center;text-overflow:ellipsis;white-space:nowrap}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-accordion-block .sui-accordion-item .sui-accordion-item-header .sui-mobile-visible{display:none}}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-accordion-block .sui-accordion-item .sui-accordion-item-header .sui-accordion-item-date,.sui-2-6-0 .sui-wrap .sui-accordion-block .sui-accordion-item .sui-accordion-item-header .sui-desktop-visible{display:none}}.sui-2-6-0 .sui-wrap .sui-accordion-block .sui-accordion-item .sui-accordion-item-header .sui-button,.sui-2-6-0 .sui-wrap .sui-accordion-block .sui-accordion-item .sui-accordion-item-header .sui-button-icon,.sui-2-6-0 .sui-wrap .sui-accordion-block .sui-accordion-item .sui-accordion-item-header .sui-dropdown{margin:0 5px}.sui-2-6-0 .sui-wrap .sui-accordion-block .sui-accordion-item .sui-accordion-item-header .sui-button-icon .sui-button-icon,.sui-2-6-0 .sui-wrap .sui-accordion-block .sui-accordion-item .sui-accordion-item-header .sui-button .sui-button-icon,.sui-2-6-0 .sui-wrap .sui-accordion-block .sui-accordion-item .sui-accordion-item-header .sui-dropdown .sui-button-icon{margin:0}.sui-2-6-0 .sui-wrap .sui-accordion-block .sui-accordion-item .sui-accordion-item-header .sui-button-icon:first-child,.sui-2-6-0 .sui-wrap .sui-accordion-block .sui-accordion-item .sui-accordion-item-header .sui-button:first-child,.sui-2-6-0 .sui-wrap .sui-accordion-block .sui-accordion-item .sui-accordion-item-header .sui-dropdown:first-child{margin-left:0}.sui-2-6-0 .sui-wrap .sui-accordion-block .sui-accordion-item .sui-accordion-item-header .sui-button-icon:last-child,.sui-2-6-0 .sui-wrap .sui-accordion-block .sui-accordion-item .sui-accordion-item-header .sui-button:last-child,.sui-2-6-0 .sui-wrap .sui-accordion-block .sui-accordion-item .sui-accordion-item-header .sui-dropdown:last-child{margin-right:0}.sui-2-6-0 .sui-wrap .sui-accordion-block .sui-accordion-item .sui-accordion-item-header .sui-tag{margin-left:10px}.sui-2-6-0 .sui-wrap .sui-accordion-block .sui-accordion-item .sui-accordion-item-header .sui-tag.sui-tag-right{margin-right:10px;margin-left:0}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-accordion-block .sui-accordion-item .sui-accordion-item-header .sui-accordion-col-auto:not(:first-child){margin-top:10px}}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-accordion-block .sui-accordion-item .sui-accordion-item-header .sui-accordion-col-auto{-ms-flex:0 0 100%;flex:0 0 100%;-ms-flex-pack:end;justify-content:flex-end}}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-accordion-block .sui-accordion-item .sui-accordion-item-header{-ms-flex-wrap:wrap;flex-wrap:wrap;position:relative}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-accordion-block .sui-accordion-item .sui-accordion-item-header{min-height:90px}}.sui-2-6-0 .sui-wrap .sui-accordion-block .sui-accordion-item .sui-accordion-item-body{padding:0 20px 20px}.sui-2-6-0 .sui-wrap .sui-accordion-block .sui-accordion-item .sui-accordion-item-body .sui-accordion-item-data{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:0 -5px;padding:0}.sui-2-6-0 .sui-wrap .sui-accordion-block .sui-accordion-item .sui-accordion-item-body .sui-accordion-item-data,.sui-2-6-0 .sui-wrap .sui-accordion-block .sui-accordion-item .sui-accordion-item-body .sui-accordion-item-data li{border:0;list-style:none}.sui-2-6-0 .sui-wrap .sui-accordion-block .sui-accordion-item .sui-accordion-item-body .sui-accordion-item-data li{font-size:13px;line-height:22px;font-family:Roboto,Arial,sans-serif;letter-spacing:-.25px;transition:.3s ease;text-align:center}.sui-2-6-0 .sui-wrap .sui-accordion-block .sui-accordion-item .sui-accordion-item-body .sui-accordion-item-data li span,.sui-2-6-0 .sui-wrap .sui-accordion-block .sui-accordion-item .sui-accordion-item-body .sui-accordion-item-data li strong{display:block}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-accordion-block .sui-accordion-item .sui-accordion-item-body .sui-accordion-item-data li span,.sui-2-6-0 .sui-wrap .sui-accordion-block .sui-accordion-item .sui-accordion-item-body .sui-accordion-item-data li strong{margin-right:20px}}.sui-2-6-0 .sui-wrap .sui-accordion-block .sui-accordion-item .sui-accordion-item-body .sui-accordion-item-data li strong{color:#333;font-weight:500}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-accordion-block .sui-accordion-item .sui-accordion-item-body .sui-accordion-item-data li[data-col=large]{min-width:200px}}.sui-2-6-0 .sui-wrap .sui-accordion-block .sui-accordion-item .sui-accordion-item-body .sui-accordion-item-data li:last-child{margin:0}@media (max-width:782px){.sui-2-6-0 .sui-wrap .sui-accordion-block .sui-accordion-item .sui-accordion-item-body .sui-accordion-item-data li{min-width:50%;-ms-flex:0 0 50%;flex:0 0 50%;padding:10px 5px}}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-accordion-block .sui-accordion-item .sui-accordion-item-body .sui-accordion-item-data li{-ms-flex:0 0 auto;flex:0 0 auto;margin:0;padding:0 5px;text-align:left}}.sui-2-6-0 .sui-wrap .sui-accordion-block .sui-accordion-item .sui-accordion-item-body .sui-accordion-item-data.sui-onload li>*{display:block;margin-right:0;background-color:#f8f8f8;color:transparent}.sui-2-6-0 .sui-wrap .sui-accordion-block .sui-accordion-item .sui-accordion-item-body .sui-accordion-item-data.sui-onload li>:first-child{border-radius:4px 4px 0 0}.sui-2-6-0 .sui-wrap .sui-accordion-block .sui-accordion-item .sui-accordion-item-body .sui-accordion-item-data.sui-onload li>:last-child{border-radius:0 0 4px 4px}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-accordion-block .sui-accordion-item .sui-accordion-item-body{padding:0 30px 30px}}.sui-2-6-0 .sui-wrap .sui-accordion-block .sui-accordion-item:last-child{margin:0}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-accordion-block .sui-accordion-item:last-child{margin:0}}.sui-2-6-0 .sui-wrap .sui-accordion-block .sui-accordion-item.sui-accordion-item--open .sui-accordion-item-header .sui-accordion-item-date{display:none}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-accordion-block .sui-accordion-item{margin:0 0 30px}}.sui-2-6-0 .sui-wrap .sui-box .sui-box-header+.sui-accordion-flushed{border-top-width:0}.sui-2-6-0 .sui-wrap .sui-box .sui-box-body>.sui-accordion-flushed:not(.sui-accordion-block){margin-right:-20px;margin-left:-20px}@media (min-width:783px){.sui-2-6-0 .sui-wrap .sui-box .sui-box-body>.sui-accordion-flushed:not(.sui-accordion-block){margin-right:-30px;margin-left:-30px}}.sui-2-6-0 .sui-wrap .sui-box .sui-box-body .sui-side-tabs .sui-tab-content>.sui
|
|