Forminator Payment, Quiz and Contact Form Plugin - Version 1.14.0

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 Icon 128x128 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

Files changed (89) hide show
  1. addons/pro/activecampaign/activecampaign.php +3 -0
  2. addons/pro/activecampaign/class-forminator-addon-activecampaign-form-hooks.php +15 -0
  3. addons/pro/activecampaign/class-forminator-addon-activecampaign-quiz-hooks.php +763 -0
  4. addons/pro/activecampaign/class-forminator-addon-activecampaign-quiz-settings-exception.php +68 -0
  5. addons/pro/activecampaign/class-forminator-addon-activecampaign-quiz-settings.php +777 -0
  6. addons/pro/activecampaign/class-forminator-addon-activecampaign.php +114 -0
  7. addons/pro/activecampaign/views/quiz-settings/map-fields.php +87 -0
  8. addons/pro/activecampaign/views/quiz-settings/pick-name.php +36 -0
  9. addons/pro/activecampaign/views/quiz-settings/select-list.php +39 -0
  10. addons/pro/activecampaign/views/quiz-settings/setup-options.php +160 -0
  11. addons/pro/aweber/aweber.php +3 -0
  12. addons/pro/aweber/class-forminator-addon-aweber-quiz-hooks.php +805 -0
  13. addons/pro/aweber/class-forminator-addon-aweber-quiz-settings-exception.php +68 -0
  14. addons/pro/aweber/class-forminator-addon-aweber-quiz-settings.php +723 -0
  15. addons/pro/aweber/class-forminator-addon-aweber.php +113 -0
  16. addons/pro/aweber/views/quiz-settings/map-fields.php +100 -0
  17. addons/pro/aweber/views/quiz-settings/pick-name.php +34 -0
  18. addons/pro/aweber/views/quiz-settings/setup-list.php +54 -0
  19. addons/pro/aweber/views/quiz-settings/setup-options.php +105 -0
  20. addons/pro/campaignmonitor/campaignmonitor.php +3 -0
  21. addons/pro/campaignmonitor/class-forminator-addon-campaignmonitor-quiz-hooks.php +710 -0
  22. addons/pro/campaignmonitor/class-forminator-addon-campaignmonitor-quiz-settings-exception.php +68 -0
  23. addons/pro/campaignmonitor/class-forminator-addon-campaignmonitor-quiz-settings.php +710 -0
  24. addons/pro/campaignmonitor/class-forminator-addon-campaignmonitor.php +114 -0
  25. addons/pro/campaignmonitor/views/quiz-settings/map-fields.php +109 -0
  26. addons/pro/campaignmonitor/views/quiz-settings/pick-name.php +47 -0
  27. addons/pro/campaignmonitor/views/quiz-settings/setup-list.php +57 -0
  28. addons/pro/campaignmonitor/views/quiz-settings/setup-options.php +105 -0
  29. addons/pro/googlesheet/class-forminator-addon-googlesheet-quiz-hooks.php +106 -48
  30. addons/pro/googlesheet/views/settings/setup-client.php +33 -97
  31. addons/pro/gutenberg/library/blocks/class-forminator-gfblock-forms.php +4 -0
  32. addons/pro/hubspot/class-forminator-addon-hubspot-quiz-hooks.php +737 -0
  33. addons/pro/hubspot/class-forminator-addon-hubspot-quiz-settings-exception.php +68 -0
  34. addons/pro/hubspot/class-forminator-addon-hubspot-quiz-settings.php +582 -0
  35. addons/pro/hubspot/class-forminator-addon-hubspot.php +126 -13
  36. addons/pro/hubspot/hubspot.php +3 -0
  37. addons/pro/hubspot/views/quiz-settings/create-contact.php +297 -0
  38. addons/pro/hubspot/views/quiz-settings/create-ticket.php +337 -0
  39. addons/pro/mailchimp/class-forminator-addon-mailchimp-quiz-hooks.php +1120 -0
  40. addons/pro/mailchimp/class-forminator-addon-mailchimp-quiz-settings-exception.php +79 -0
  41. addons/pro/mailchimp/class-forminator-addon-mailchimp-quiz-settings.php +833 -0
  42. addons/pro/mailchimp/class-forminator-addon-mailchimp.php +124 -0
  43. addons/pro/mailchimp/mailchimp.php +4 -0
  44. addons/pro/slack/class-forminator-addon-slack-form-settings.php +1 -1
  45. addons/pro/slack/class-forminator-addon-slack-poll-settings.php +1 -1
  46. addons/pro/slack/class-forminator-addon-slack-quiz-hooks.php +102 -4
  47. addons/pro/slack/class-forminator-addon-slack-quiz-settings.php +6 -1
  48. addons/pro/slack/lib/class-forminator-addon-slack-wp-api.php +18 -10
  49. addons/pro/slack/views/quiz-settings/setup-message.php +8 -1
  50. addons/pro/trello/class-forminator-addon-trello-form-hooks.php +69 -64
  51. addons/pro/trello/class-forminator-addon-trello-form-settings.php +13 -8
  52. addons/pro/trello/class-forminator-addon-trello-poll-hooks.php +5 -0
  53. addons/pro/trello/class-forminator-addon-trello-poll-settings.php +5 -0
  54. addons/pro/trello/class-forminator-addon-trello-quiz-hooks.php +29 -14
  55. addons/pro/trello/class-forminator-addon-trello-quiz-settings.php +10 -0
  56. addons/pro/trello/views/form-settings/setup-card.php +149 -100
  57. addons/pro/trello/views/poll-settings/setup-card.php +74 -45
  58. addons/pro/trello/views/quiz-settings/setup-card.php +81 -40
  59. admin/abstracts/class-admin-import-mediator.php +1 -4
  60. admin/abstracts/class-admin-module.php +11 -0
  61. admin/abstracts/class-admin-page.php +4 -2
  62. admin/classes/class-admin-ajax.php +56 -52
  63. admin/classes/class-admin-data.php +11 -20
  64. admin/classes/class-admin-l10n.php +16 -3
  65. admin/classes/thirdparty-importers/class-importer-cf7.php +1 -0
  66. admin/classes/thirdparty-importers/class-importer-gravity.php +21 -41
  67. admin/classes/thirdparty-importers/class-importer-ninja.php +23 -52
  68. admin/locale.php +409 -312
  69. admin/pages/entries-page.php +4 -0
  70. admin/views/custom-form/list/content.php +36 -9
  71. admin/views/custom-form/popup/import-gravityforms.php +1 -1
  72. admin/views/custom-form/popup/import-ninjaforms.php +1 -1
  73. admin/views/dashboard/content.php +21 -13
  74. admin/views/dashboard/new-feature-notice.php +14 -45
  75. admin/views/dashboard/widgets/widget-cform.php +123 -126
  76. admin/views/dashboard/widgets/widget-poll.php +1 -5
  77. admin/views/dashboard/widgets/widget-quiz.php +32 -17
  78. admin/views/dashboard/widgets/widget-upgrade.php +21 -25
  79. admin/views/poll/list/content.php +13 -2
  80. admin/views/quiz/entries/content-leads-none.php +218 -0
  81. admin/views/quiz/entries/content-leads.php +538 -0
  82. admin/views/quiz/entries/content.php +169 -293
  83. admin/views/quiz/entries/filter.php +206 -0
  84. admin/views/quiz/list/content.php +263 -21
  85. admin/views/settings/dashboard/forms.php +1 -1
  86. admin/views/settings/dashboard/polls.php +1 -1
  87. admin/views/settings/dashboard/quizzes.php +1 -1
  88. admin/views/settings/tab-dashboard.php +1 -1
  89. 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 = '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,9 +69,9 @@ class Forminator_Addon_Googlesheet_Quiz_Hooks extends Forminator_Addon_Quiz_Hook
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,9 +87,9 @@ class Forminator_Addon_Googlesheet_Quiz_Hooks extends Forminator_Addon_Quiz_Hook
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,8 +111,8 @@ class Forminator_Addon_Googlesheet_Quiz_Hooks extends Forminator_Addon_Quiz_Hook
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,10 +134,10 @@ class Forminator_Addon_Googlesheet_Quiz_Hooks extends Forminator_Addon_Quiz_Hook
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,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 $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,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 $connection_settings
182
- * @param int $quiz_id current Quiz ID
183
- * @param array $submitted_data
184
- * @param array $quiz_entry_fields
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 $header_fields sheet headers
198
- * @param array $connection_settings
199
- * @param int $quiz_id current Quiz ID
200
- * @param array $submitted_data
201
- * @param array $quiz_entry_fields
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 $header_fields sheet headers
220
- * @param array $connection_settings
221
- * @param int $quiz_id current Quiz ID
222
- * @param array $submitted_data
223
- * @param array $quiz_entry_fields
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
- && is_array( $quiz_entry['value'][0] )
251
- && isset( $quiz_entry['value'][0]['value'] )
252
- && is_array( $quiz_entry['value'][0]['value'] ) ) {
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( self::GSHEET_DATE_COLUMN_NAME, self::GSHEET_QUESTION_COLUMN_NAME, self::GSHEET_ANSWER_COLUMN_NAME, self::GSHEET_RESULT_COLUMN_NAME );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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 $export_headers headers to be displayed on export file
576
- * @param int $quiz_id current Quiz ID
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 $addon_meta_data
612
- * @param int $quiz_id current Quiz ID
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 $export_columns column to be exported
632
- * @param int $quiz_id current Quiz ID
633
- * @param Forminator_Form_Entry_Model $entry_model Form Entry Model
634
- * @param array $addon_meta_data meta data saved by addon on entry fields
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 $addon_meta_data
672
- * @param int $quiz_id current Form ID
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( 'Setup Google Client to be used by Forminator to communicating with Google Sheets server.', Forminator::DOMAIN ); ?>
 
 
 
 
 
 
 
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
- <div class="sui-border-frame sui-description">
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 &gt; 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 &gt; 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
- </div>
 
 
177
 
178
- </form>
 
 
 
 
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 = '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
  private $_token = '';
31
 
32
  private $_auth_error_message = '';
33
 
34
- const TARGET_TYPE_PUBLIC_CHANNEL = 'public_channel';
35
  const TARGET_TYPE_PRIVATE_CHANNEL = 'private_channel';
36
- const TARGET_TYPE_DIRECT_MESSAGE = '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( __( ' HubSpot is not connected', Forminator::DOMAIN ) );
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 = $this->get_settings_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'] = $token;
504
- $settings['user'] = $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 = 'groups';
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 = 'groups';
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
- $attachments = $this->get_quiz_data_as_attachments( $submitted_data, $quiz_entry_fields );
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
- && is_array( $quiz_entry['value'][0] )
290
- && isset( $quiz_entry['value'][0]['value'] )
291
- && is_array( $quiz_entry['value'][0]['value'] ) ) {
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 = 'groups';
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
- $args = array_merge( $default_args, $args );
 
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' => 50,
298
  );
299
- $args = array_merge( $default_args, $args );
 
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' => 50,
324
  );
325
- $args = array_merge( $default_args, $args );
 
326
 
327
  return $this->request(
328
  'GET',
329
- 'channels.list',
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
- $args = array_merge( $default_args, $args );
 
351
 
352
  return $this->request(
353
  'GET',
354
- 'groups.list',
355
  $args
356
  );
357
  }
@@ -374,7 +380,8 @@ class Forminator_Addon_Slack_Wp_Api {
374
  'channel' => $channel,
375
  'text' => $text,
376
  );
377
- $args = array_merge( $default_args, $args );
 
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
- $args = array_merge( $default_args, $args );
 
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; ?></select>
 
 
 
 
 
 
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 $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,9 +80,9 @@ class Forminator_Addon_Trello_Form_Hooks extends Forminator_Addon_Form_Hooks_Abs
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,8 +104,8 @@ class Forminator_Addon_Trello_Form_Hooks extends Forminator_Addon_Form_Hooks_Abs
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,10 +127,10 @@ class Forminator_Addon_Trello_Form_Hooks extends Forminator_Addon_Form_Hooks_Abs
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,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 $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,13 +187,13 @@ class Forminator_Addon_Trello_Form_Hooks extends Forminator_Addon_Form_Hooks_Abs
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,13 +222,13 @@ class Forminator_Addon_Trello_Form_Hooks extends Forminator_Addon_Form_Hooks_Abs
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,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 $args
273
- * @param int $form_id Current Form id
274
- * @param string $connection_id ID of current connection
275
- * @param array $submitted_data
276
- * @param array $connection_settings current connection setting, contains options of like `name`, `list_id` etc
277
- * @param array $form_settings Displayed Form settings
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 $form_fields all fields on form
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 field 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 $addon_meta_data
456
- * @param int $form_id current Form ID
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 $export_headers headers to be displayed on export file
596
- * @param int $form_id current Form ID
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 $addon_meta_data
632
- * @param int $form_id current Form ID
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 $export_columns column to be exported
652
- * @param int $form_id current Form ID
653
- * @param Forminator_Form_Entry_Model $entry_model Form Entry Model
654
- * @param array $addon_meta_data meta data saved by addon on entry fields
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 $addon_meta_data
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 $addon_meta_data
747
- * @param int $form_id current Form ID
748
- * @param Forminator_Form_Entry_Model $entry_model Forminator 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 $form_id current Form ID
765
- * @param Forminator_Form_Entry_Model $entry_model Forminator Entry Model
766
- * @param array $addon_meta_data addon meta data
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 $args
867
- * @param string $card_id
868
- * @param string $card_delete_mode
869
- * @param array $addon_meta_datum
870
- * @param int $form_id
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 $args args sent to Trello API
900
- * @param string $card_id
901
- * @param string $card_delete_mode
902
- * @param array $addon_meta_datum
903
- * @param int $form_id
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
- 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,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
- 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,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
- 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,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
- Forminator_Addon_Abstract::get_button_markup( esc_html__( 'Save', Forminator::DOMAIN ), 'sui-button-primary forminator-addon-finish' ) .
639
- '</div>';
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
- . '**' . ( $is_correct ? __( 'Yes', Forminator::DOMAIN ) : __( 'No', Forminator::DOMAIN ) ) . '**'
343
- . "\n";
344
  }
345
  } elseif ( 'nowrong' === $this->quiz->quiz_type ) {
346
  if ( isset( $quiz_entry['value'][0] )
347
- && is_array( $quiz_entry['value'][0] )
348
- && isset( $quiz_entry['value'][0]['value'] )
349
- && is_array( $quiz_entry['value'][0]['value'] ) ) {
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
- . '**' . $total_correct . '**'
415
- . "\n";
416
  $markdown .= __( 'Total Answers : ', Forminator::DOMAIN )
417
- . '**' . $total_answers . '**'
418
- . "\n";
419
 
420
  } elseif ( 'nowrong' === $this->quiz->quiz_type ) {
421
  if ( isset( $quiz_entry['value'][0] )
422
- && is_array( $quiz_entry['value'][0] )
423
- && isset( $quiz_entry['value'][0]['value'] )
424
- && is_array( $quiz_entry['value'][0]['value'] ) ) {
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
- . "\n";
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
- <h3 class="sui-box-title" id="dialogTitle2"><?php echo esc_html( __( 'Customize Fields', Forminator::DOMAIN ) ); ?></h3>
30
 
31
- <p><?php esc_html_e( 'Set up how you want your cards to be created in Trello.', Forminator::DOMAIN ); ?></p>
32
 
33
  <?php if ( ! empty( $vars['error_message'] ) ) : ?>
34
- <span class="sui-notice sui-notice-error"><p><?php echo esc_html( $vars['error_message'] ); ?></p></span>
35
  <?php endif; ?>
36
 
37
  </div>
38
 
39
  <form>
40
 
41
- <div id="trello-card-name-settings" class="sui-row">
42
 
43
- <div class="sui-col-12">
44
 
45
- <div class="sui-form-field <?php echo esc_attr( ! empty( $vars['card_name_error'] ) ? 'sui-form-field-error' : '' ); ?>">
46
 
47
- <label class="sui-label"><?php esc_html_e( 'Card Name', Forminator::DOMAIN ); ?></label>
48
 
49
- <div class="sui-insert-variables">
50
 
51
- <input id="card_name"
52
- class="sui-form-control"
53
- name="card_name"
54
- placeholder="<?php echo esc_attr( __( 'Card Name', Forminator::DOMAIN ) ); ?>"
55
- value="<?php echo esc_attr( $vars['card_name'] ); ?>">
56
 
57
- <select data-textarea-id="card_name"><?php foreach ( $vars['fields'] as $field ) : ?>
58
- <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>
59
- <?php endforeach; ?></select>
60
 
61
- </div>
62
 
63
  <?php if ( ! empty( $vars['card_name_error'] ) ) : ?>
64
- <span class="sui-error-message"><?php echo esc_html( $vars['card_name_error'] ); ?></span>
65
  <?php endif; ?>
66
 
67
- </div>
68
 
69
- </div>
70
 
71
- </div>
72
 
73
- <div id="trello-card-description-settings" class="sui-row">
74
 
75
- <div class="sui-col-12">
76
 
77
- <div class="sui-form-field <?php echo esc_attr( ! empty( $vars['card_description_error'] ) ? 'sui-form-field-error' : '' ); ?>">
78
 
79
- <label class="sui-label" for="card_description"><?php esc_html_e( 'Card Description', Forminator::DOMAIN ); ?></label>
80
 
81
- <div class="sui-insert-variables">
82
 
83
- <textarea class="sui-form-control" name="card_description" id="card_description" rows="7"><?php echo esc_html( $vars['card_description'] ); ?></textarea>
84
 
85
- <select data-textarea-id="card_description"><?php foreach ( $vars['fields'] as $field ) : ?>
86
- <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>
87
- <?php endforeach; ?></select>
88
 
89
- </div>
90
 
91
  <?php if ( ! empty( $vars['card_description_error'] ) ) : ?>
92
- <span class="sui-error-message"><?php echo esc_html( $vars['card_description_error'] ); ?></span>
93
  <?php endif; ?>
94
 
95
- <span class="sui-description">
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
- </div>
101
-
102
- </div>
103
-
104
- </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
105
 
106
- <div class="sui-row">
107
- <div class="sui-col-md-4">
108
- <div class="sui-form-field <?php echo esc_attr( ! empty( $vars['position_error'] ) ? 'sui-form-field-error' : '' ); ?>">
109
- <label class="sui-label" for="position"><?php esc_html_e( 'Position', Forminator::DOMAIN ); ?></label>
110
- <select name="position" class="sui-select" id="position">
 
111
  <?php foreach ( $vars['positions'] as $pos_id => $pos_name ) : ?>
112
- <option value="<?php echo esc_attr( $pos_id ); ?>" <?php selected( $vars['position'], $pos_id ); ?>><?php echo esc_html( $pos_name ); ?></option>
113
  <?php endforeach; ?>
114
- </select>
115
  <?php if ( ! empty( $vars['position_error'] ) ) : ?>
116
- <span class="sui-error-message"><?php echo esc_html( $vars['position_error'] ); ?></span>
117
  <?php endif; ?>
118
 
119
- </div>
120
- </div>
121
-
122
- <div class="sui-col-md-8">
123
- <div class="sui-form-field <?php echo esc_attr( ! empty( $vars['label_ids_error'] ) ? 'sui-form-field-error' : '' ); ?>">
124
- <label class="sui-label" for="label_ids"><?php esc_html_e( 'Labels', Forminator::DOMAIN ); ?></label>
125
- <select class="sui-select fui-multi-select" name="label_ids[]" id="label_ids"
126
- multiple="multiple"
127
- data-reorder="1"
128
- data-tags="false"
129
- data-token-separators="[',']"
130
- data-placeholder="<?php esc_html_e( 'Enter label name', Forminator::DOMAIN ); ?>"
131
- data-allow-clear="false">
 
132
  <?php foreach ( $vars['label_ids'] as $label_id ) : ?>
133
  <?php if ( isset( $vars['labels'][ $label_id ] ) ) : ?>
134
- <option
135
- value="<?php echo esc_attr( $label_id ); ?>"
136
- selected="selected"
137
- data-color="<?php echo esc_attr( $vars['labels'][ $label_id ]['color'] ); ?>"
138
- style="background-color: <?php echo esc_attr( $vars['labels'][ $label_id ]['color'] ); ?>;"
139
- ><?php echo esc_html( $vars['labels'][ $label_id ]['name'] ); ?></option>
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
- <option
146
- value="<?php echo esc_attr( $label_id ); ?>"
147
- data-color="<?php echo esc_attr( $label['color'] ); ?>"
148
- style="background-color: <?php echo esc_attr( $vars['labels'][ $label_id ]['color'] ); ?>;"
149
- ><?php echo esc_html( $label['name'] ); ?></option>
 
 
150
  <?php endif; ?>
151
  <?php endforeach; ?>
152
- </select>
153
  <?php if ( ! empty( $vars['label_ids_error'] ) ) : ?>
154
- <span class="sui-error-message"><?php echo esc_html( $vars['label_ids_error'] ); ?></span>
155
  <?php endif; ?>
156
- </div>
157
- </div>
158
- </div>
159
-
160
- <div class="sui-row">
161
- <div class="sui-col-md-12">
162
- <div class="sui-form-field <?php echo esc_attr( ! empty( $vars['member_ids_error'] ) ? 'sui-form-field-error' : '' ); ?>">
163
- <label class="sui-label" for="member_ids"><?php esc_html_e( 'Members', Forminator::DOMAIN ); ?></label>
164
- <select class="sui-select fui-multi-select" name="member_ids[]" id="member_ids"
165
- multiple="multiple"
166
- data-reorder="1"
167
- data-tags="false"
168
- data-token-separators="[',']"
169
- data-placeholder="<?php esc_html_e( 'Enter member name', Forminator::DOMAIN ); ?>"
170
- data-allow-clear="false">
 
171
  <?php foreach ( $vars['member_ids'] as $member_id ) : ?>
172
  <?php if ( isset( $vars['members'][ $member_id ] ) ) : ?>
173
- <option
174
- value="<?php echo esc_attr( $member_id ); ?>"
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
- <option
183
- value="<?php echo esc_attr( $member_id ); ?>"
184
- ><?php echo esc_html( $name ); ?></option>
185
  <?php endif; ?>
186
  <?php endforeach; ?>
187
- </select>
188
  <?php if ( ! empty( $vars['member_ids_error'] ) ) : ?>
189
- <span class="sui-error-message"><?php echo esc_html( $vars['member_ids_error'] ); ?></span>
190
  <?php endif; ?>
191
- </div>
192
 
193
 
194
- </div>
195
- </div>
196
 
197
- <input type="hidden" name="multi_id" value="<?php echo esc_attr( $vars['multi_id'] ); ?>">
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-4">
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">
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
112
  <?php foreach ( $vars['positions'] as $pos_id => $pos_name ) : ?>
113
- <option value="<?php echo esc_attr( $pos_id ); ?>" <?php selected( $vars['position'], $pos_id ); ?>><?php echo esc_html( $pos_name ); ?></option>
114
  <?php endforeach; ?>
115
- </select>
116
  <?php if ( ! empty( $vars['position_error'] ) ) : ?>
117
- <span class="sui-error-message"><?php echo esc_html( $vars['position_error'] ); ?></span>
118
  <?php endif; ?>
119
 
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">
@@ -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; ?></select>
 
 
 
 
 
 
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; ?></select>
 
 
 
 
 
 
89
 
90
  </div>
91
 
@@ -105,7 +118,22 @@ foreach ( $template_vars as $key => $val ) {
105
  </div>
106
 
107
  <div class="sui-row">
108
- <div class="sui-col-md-4">
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
- if ( $referer ) {
 
 
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 = 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
 
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( 'forminator_poll_action_' . $action, $id, $type, $status, $questions, $results );
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
- $args = array(
72
- 'sort_order' => 'DESC',
73
- 'sort_column' => 'ID',
74
- 'hierarchical' => 1,
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' => wp_create_nonce( 'forminator_dismiss_notification' ),
 
 
 
 
 
 
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 a name for your new quiz, then start adding questions and answers!'),
 
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' => __( 'Choose Quiz Type', Forminator::DOMAIN ),
138
- 'choose_quiz_description' => __( "Let's start by choosing an appropriate quiz type based on your goal.", Forminator::DOMAIN ),
 
 
 
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
- if( 'email' === $action['toType'] ){
134
 
135
- if( isset( $action['to'] ) && '{admin_email}' === $action['to'] && false === $settings['use-admin-email'] ){
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:169
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:170
11
- "Use Default Colors" => array( null, __("Use Default Colors", "forminator" ), ), // src/form/components/appearance/colors.js:184
12
- "Custom" => array( null, __("Custom", "forminator" ), ), // src/form/components/appearance/colors.js:187
13
- "Element" => array( null, __("Element", "forminator" ), ), // src/form/components/appearance/colors.js:192
14
- "Form Container" => array( null, __("Form Container", "forminator" ), ), // src/form/components/appearance/colors.js:197
15
- "Submission Indicator" => array( null, __("Submission Indicator", "forminator" ), ), // src/form/components/appearance/colors.js:205
16
- "Response Success" => array( null, __("Response Success", "forminator" ), ), // src/form/components/appearance/colors.js:213
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:215
18
- "Response Error" => array( null, __("Response Error", "forminator" ), ), // src/form/components/appearance/colors.js:224
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:226
20
- "Pagination Steps" => array( null, __("Pagination Steps", "forminator" ), ), // src/form/components/appearance/colors.js:238
21
- "Pagination Progress Bar" => array( null, __("Pagination Progress Bar", "forminator" ), ), // src/form/components/appearance/colors.js:246
22
- "Fields Basics" => array( null, __("Fields Basics", "forminator" ), ), // src/form/components/appearance/colors.js:256
23
- "Section" => array( null, __("Section", "forminator" ), ), // src/form/components/appearance/colors.js:264
24
- "Input and Textarea" => array( null, __("Input and Textarea", "forminator" ), ), // src/form/components/appearance/colors.js:272
25
- "Input Extras" => array( null, __("Input Extras", "forminator" ), ), // src/form/components/appearance/colors.js:284
26
- "Radio and Checkbox" => array( null, __("Radio and Checkbox", "forminator" ), ), // src/form/components/appearance/colors.js:297
27
- "Select" => array( null, __("Select", "forminator" ), ), // src/form/components/appearance/colors.js:313
28
- "Dropdown List" => array( null, __("Dropdown List", "forminator" ), ), // src/form/components/appearance/colors.js:319
29
- "Dropdown Search" => array( null, __("Dropdown Search", "forminator" ), ), // src/form/components/appearance/colors.js:329
30
- "Multi Select" => array( null, __("Multi Select", "forminator" ), ), // src/form/components/appearance/colors.js:341
31
- "Calendar Basics" => array( null, __("Calendar Basics", "forminator" ), ), // src/form/components/appearance/colors.js:352
32
- "Calendar Table" => array( null, __("Calendar Table", "forminator" ), ), // src/form/components/appearance/colors.js:359
33
- "File Upload" => array( null, __("File Upload", "forminator" ), ), // src/form/components/appearance/colors.js:371
34
- "E-Signature" => array( null, __("E-Signature", "forminator" ), ), // src/form/components/appearance/colors.js:385
35
- "Button Back" => array( null, __("Button Back", "forminator" ), ), // src/form/components/appearance/colors.js:407
36
- "Button Next" => array( null, __("Button Next", "forminator" ), ), // src/form/components/appearance/colors.js:414
37
- "Submit Button" => array( null, __("Submit Button", "forminator" ), ), // src/form/components/appearance/colors.js:424
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
- "Suffix color" => array( null, __("Suffix color", "forminator" ), ), // src/form/components/appearance/colors/inputs-extra.js:48
87
- "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:96
 
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:140
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:141
122
- "Use Theme Fonts" => array( null, __("Use Theme Fonts", "forminator" ), ), // src/form/components/appearance/fonts.js:156
123
- "Response Message" => array( null, __("Response Message", "forminator" ), ), // src/form/components/appearance/fonts.js:168
124
- "Fields Label" => array( null, __("Fields Label", "forminator" ), ), // src/form/components/appearance/fonts.js:217
125
- "Fields Description" => array( null, __("Fields Description", "forminator" ), ), // src/form/components/appearance/fonts.js:231
126
- "Fields Error Message" => array( null, __("Fields Error Message", "forminator" ), ), // src/form/components/appearance/fonts.js:245
127
- "Section Title" => array( null, __("Section Title", "forminator" ), ), // src/form/components/appearance/fonts.js:262
128
- "Section Subtitle" => array( null, __("Section Subtitle", "forminator" ), ), // src/form/components/appearance/fonts.js:276
129
- "Input Suffix" => array( null, __("Input Suffix", "forminator" ), ), // src/form/components/appearance/fonts.js:307
130
- "Dropdown" => array( null, __("Dropdown", "forminator" ), ), // src/form/components/appearance/fonts.js:365
131
- "Calendar" => array( null, __("Calendar", "forminator" ), ), // src/form/components/appearance/fonts.js:383
132
- "Single File Upload" => array( null, __("Single File Upload", "forminator" ), ), // src/form/components/appearance/fonts.js:414
133
- "Upload Button" => array( null, __("Upload Button", "forminator" ), ), // src/form/components/appearance/fonts.js:427
134
- "File Name" => array( null, __("File Name", "forminator" ), ), // src/form/components/appearance/fonts.js:438
135
- "Multiple Files Upload" => array( null, __("Multiple Files Upload", "forminator" ), ), // src/form/components/appearance/fonts.js:454
136
- "Upload Panel" => array( null, __("Upload Panel", "forminator" ), ), // src/form/components/appearance/fonts.js:467
137
- "File Size" => array( null, __("File Size", "forminator" ), ), // src/form/components/appearance/fonts.js:489
138
- "E-Signature Placeholder" => array( null, __("E-Signature Placeholder", "forminator" ), ), // src/form/components/appearance/fonts.js:505
139
- "Pagination Buttons" => array( null, __("Pagination Buttons", "forminator" ), ), // src/form/components/appearance/fonts.js:523
 
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
- "Email Notifications" => array( null, __("Email Notifications", "forminator" ), ), // src/form/components/behaviour.js:95
 
 
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:65
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:67
212
- "Inline Message" => array( null, __("Inline Message", "forminator" ), ), // src/form/components/behaviour/submission.js:74
213
- "Display a success message after form submitted." => array( null, __("Display a success message after form submitted.", "forminator" ), ), // src/form/components/behaviour/submission.js:81
214
- "Auto-close success message after" => array( null, __("Auto-close success message after", "forminator" ), ), // src/form/components/behaviour/submission.js:139
215
- "E.g. 5" => array( null, __("E.g. 5", "forminator" ), ), // src/form/components/behaviour/submission.js:146
216
- "seconds." => array( null, __("seconds.", "forminator" ), ), // src/form/components/behaviour/submission.js:155
217
- "Redirect user to a URL" => array( null, __("Redirect user to a URL", "forminator" ), ), // src/form/components/behaviour/submission.js:165
218
- "https://www.mywebsite.com" => array( null, __("https://www.mywebsite.com", "forminator" ), ), // src/form/components/behaviour/submission.js:171
219
- "Redirect URL" => array( null, __("Redirect URL", "forminator" ), ), // src/form/components/behaviour/submission.js:173
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:175
221
- "Redirection Option" => array( null, __("Redirection Option", "forminator" ), ), // src/form/components/behaviour/submission.js:202
222
- "Redirect on the same tab" => array( null, __("Redirect on the same tab", "forminator" ), ), // src/form/components/behaviour/submission.js:206
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:207
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:208
225
- "Hide form" => array( null, __("Hide form", "forminator" ), ), // src/form/components/behaviour/submission.js:218
226
- "Submit Message" => array( null, __("Submit Message", "forminator" ), ), // src/form/components/behaviour/submission.js:230
227
- "Method" => array( null, __("Method", "forminator" ), ), // src/form/components/behaviour/submission.js:272
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:273
229
- "Ajax" => array( null, __("Ajax", "forminator" ), ), // src/form/components/behaviour/submission.js:281
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:286
231
- "Page Reload" => array( null, __("Page Reload", "forminator" ), ), // src/form/components/behaviour/submission.js:298
232
- "Validation" => array( null, __("Validation", "forminator" ), ), // src/form/components/behaviour/submission.js:305
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:306
234
- "On Submit" => array( null, __("On Submit", "forminator" ), ), // src/form/components/behaviour/submission.js:316
235
- "Server Side" => array( null, __("Server Side", "forminator" ), ), // src/form/components/behaviour/submission.js:317
236
- "Enable inline validation (as user types)" => array( null, __("Enable inline validation (as user types)", "forminator" ), ), // src/form/components/behaviour/submission.js:321
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:331
238
- "Show Loader" => array( null, __("Show Loader", "forminator" ), ), // src/form/components/behaviour/submission.js:341
239
- "E.g. Submitting..." => array( null, __("E.g. Submitting...", "forminator" ), ), // src/form/components/behaviour/submission.js:346
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:349
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:58
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:72
273
- "By default, the calculation field is read-only. You can also hide the field if you dont 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 dont want to show the calculated result on the form.", "forminator" ), ), // src/form/components/fields/calculation.js:80
274
- "Read-only" => array( null, __("Read-only", "forminator" ), ), // src/form/components/fields/calculation.js:91
275
- "Hidden" => array( null, __("Hidden", "forminator" ), ), // src/form/components/fields/calculation.js:101
276
- "Decimal Places" => array( null, __("Decimal Places", "forminator" ), ), // src/form/components/fields/calculation.js:113
277
- "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:121
278
- "decimals" => array( null, __("decimals", "forminator" ), ), // src/form/components/fields/calculation.js:146
279
- "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:165
 
 
 
 
 
 
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:62
310
- "Enter default value" => array( null, __("Enter default value", "forminator" ), ), // src/form/components/fields/currency.js:63
311
- "Currency" => array( null, __("Currency", "forminator" ), ), // src/form/components/fields/currency.js:92
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:100
313
- "Decimal Points" => array( null, __("Decimal Points", "forminator" ), ), // src/form/components/fields/currency.js:127
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:135
315
- "Limit" => array( null, __("Limit", "forminator" ), ), // src/form/components/fields/currency.js:171
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:175
317
- "Min" => array( null, __("Min", "forminator" ), ), // src/form/components/fields/currency.js:190
318
- "Max" => array( null, __("Max", "forminator" ), ), // src/form/components/fields/currency.js:199
319
- "Min value should be less than Max value." => array( null, __("Min value should be less than Max value.", "forminator" ), ), // src/form/components/fields/currency.js:205
 
 
 
 
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:370
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:372
342
- "Today" => array( null, __("Today", "forminator" ), ), // src/form/components/fields/date.js:383
343
- "Future Date" => array( null, __("Future Date", "forminator" ), ), // src/form/components/fields/date.js:388
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:74
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:75
365
- "Minimum" => array( null, __("Minimum", "forminator" ), ), // src/form/components/fields/number.js:85
366
- "Maximum" => array( null, __("Maximum", "forminator" ), ), // src/form/components/fields/number.js:93
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
- "Validation Type" => array( null, __("Validation Type", "forminator" ), ), // src/form/components/fields/phone.js:61
441
- "National" => array( null, __("National", "forminator" ), ), // src/form/components/fields/phone.js:64
442
- "International" => array( null, __("International", "forminator" ), ), // src/form/components/fields/phone.js:65
443
- "Limit characters" => array( null, __("Limit characters", "forminator" ), ), // src/form/components/fields/phone.js:66
444
- "Limit to:" => array( null, __("Limit to:", "forminator" ), ), // src/form/components/fields/phone.js:73
445
- "10" => array( null, __("10", "forminator" ), ), // src/form/components/fields/phone.js:75
446
- "Select country" => array( null, __("Select country", "forminator" ), ), // src/form/components/fields/phone.js:84
 
 
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:245
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:248
455
- "Assigned post type" => array( null, __("Assigned post type", "forminator" ), ), // src/form/components/fields/postdata.js:255
456
- "post" => array( null, __("post", "forminator" ), ), // src/form/components/fields/postdata.js:256
457
- "Default status" => array( null, __("Default status", "forminator" ), ), // src/form/components/fields/postdata.js:275
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:279
459
- "Status" => array( null, __("Status", "forminator" ), ), // src/form/components/fields/postdata.js:288
460
- "pending" => array( null, __("pending", "forminator" ), ), // src/form/components/fields/postdata.js:289
461
- "Draft" => array( null, __("Draft", "forminator" ), ), // src/form/components/fields/postdata.js:294
462
- "Pending Review" => array( null, __("Pending Review", "forminator" ), ), // src/form/components/fields/postdata.js:297
463
- "Published" => array( null, __("Published", "forminator" ), ), // src/form/components/fields/postdata.js:300
464
- "Default author" => array( null, __("Default author", "forminator" ), ), // src/form/components/fields/postdata.js:309
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:312
466
- "Always assign posts to this user" => array( null, __("Always assign posts to this user", "forminator" ), ), // src/form/components/fields/postdata.js:341
467
- "Taxonomies limits" => array( null, __("Taxonomies limits", "forminator" ), ), // src/form/components/fields/postdata.js:354
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:357
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:30
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:31
475
- "PNG" => array( null, __("PNG", "forminator" ), ), // src/form/components/fields/signature.js:41
476
- "JPG" => array( null, __("JPG", "forminator" ), ), // src/form/components/fields/signature.js:42
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:54
478
- "Stroke thickness" => array( null, __("Stroke thickness", "forminator" ), ), // src/form/components/fields/signature.js:76
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:77
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:115
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:140
489
- "Auto" => array( null, __("Auto", "forminator" ), ), // src/form/components/fields/stripe.js:146
490
- "English (en)" => array( null, __("English (en)", "forminator" ), ), // src/form/components/fields/stripe.js:147
491
- "Simplified Chinese (zh)" => array( null, __("Simplified Chinese (zh)", "forminator" ), ), // src/form/components/fields/stripe.js:148
492
- "Danish (da)" => array( null, __("Danish (da)", "forminator" ), ), // src/form/components/fields/stripe.js:149
493
- "Dutch (nl)" => array( null, __("Dutch (nl)", "forminator" ), ), // src/form/components/fields/stripe.js:150
494
- "Finnish (fi)" => array( null, __("Finnish (fi)", "forminator" ), ), // src/form/components/fields/stripe.js:151
495
- "French (fr)" => array( null, __("French (fr)", "forminator" ), ), // src/form/components/fields/stripe.js:152
496
- "German (de)" => array( null, __("German (de)", "forminator" ), ), // src/form/components/fields/stripe.js:153
497
- "Italian (it)" => array( null, __("Italian (it)", "forminator" ), ), // src/form/components/fields/stripe.js:154
498
- "Japanese (ja)" => array( null, __("Japanese (ja)", "forminator" ), ), // src/form/components/fields/stripe.js:155
499
- "Norwegian (no)" => array( null, __("Norwegian (no)", "forminator" ), ), // src/form/components/fields/stripe.js:156
500
- "Spanish (es)" => array( null, __("Spanish (es)", "forminator" ), ), // src/form/components/fields/stripe.js:157
501
- "Swedish (sv)" => array( null, __("Swedish (sv)", "forminator" ), ), // src/form/components/fields/stripe.js:158
502
- "Card icon" => array( null, __("Card icon", "forminator" ), ), // src/form/components/fields/stripe.js:169
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:170
504
- "Postal code" => array( null, __("Postal code", "forminator" ), ), // src/form/components/fields/stripe.js:187
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:188
506
- "Prefill (optional)" => array( null, __("Prefill (optional)", "forminator" ), ), // src/form/components/fields/stripe.js:208
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:230
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:255
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:277
510
- "Test" => array( null, __("Test", "forminator" ), ), // src/form/components/fields/stripe.js:283
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:292
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:347
513
- "Payment Receipt" => array( null, __("Payment Receipt", "forminator" ), ), // src/form/components/fields/stripe.js:417
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:425
515
- "Email address" => array( null, __("Email address", "forminator" ), ), // src/form/components/fields/stripe.js:454
516
- "E.g. john@doe.com" => array( null, __("E.g. john@doe.com", "forminator" ), ), // src/form/components/fields/stripe.js:456
517
- "Select an email field" => array( null, __("Select an email field", "forminator" ), ), // src/form/components/fields/stripe.js:458
518
- "Payment Details (optional)" => array( null, __("Payment Details (optional)", "forminator" ), ), // src/form/components/fields/stripe.js:483
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:491
520
- "Statement decipher" => array( null, __("Statement decipher", "forminator" ), ), // src/form/components/fields/stripe.js:501
521
- "E.g. Company Name" => array( null, __("E.g. Company Name", "forminator" ), ), // src/form/components/fields/stripe.js:504
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:507
523
- "Up to 22 characters only" => array( null, __("Up to 22 characters only", "forminator" ), ), // src/form/components/fields/stripe.js:512
524
- "Payment description" => array( null, __("Payment description", "forminator" ), ), // src/form/components/fields/stripe.js:519
525
- "Enter your payment description here" => array( null, __("Enter your payment description here", "forminator" ), ), // src/form/components/fields/stripe.js:520
526
- "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:523
527
- "Card Validation" => array( null, __("Card Validation", "forminator" ), ), // src/form/components/fields/stripe.js:533
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:539
529
- "Billing Details" => array( null, __("Billing Details", "forminator" ), ), // src/form/components/fields/stripe.js:551
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:559
531
- "Customer name (optional)" => array( null, __("Customer name (optional)", "forminator" ), ), // src/form/components/fields/stripe.js:583
532
- "Select a name field" => array( null, __("Select a name field", "forminator" ), ), // src/form/components/fields/stripe.js:585
533
- "Customer email address (optional)" => array( null, __("Customer email address (optional)", "forminator" ), ), // src/form/components/fields/stripe.js:600
534
- "Select an name field" => array( null, __("Select an name field", "forminator" ), ), // src/form/components/fields/stripe.js:602
535
- "Billing address (optional)" => array( null, __("Billing address (optional)", "forminator" ), ), // src/form/components/fields/stripe.js:617
536
- "Select an address field" => array( null, __("Select an address field", "forminator" ), ), // src/form/components/fields/stripe.js:619
537
- "Meta Data" => array( null, __("Meta Data", "forminator" ), ), // src/form/components/fields/stripe.js:643
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:651
539
- "MetaData" => array( null, __("MetaData", "forminator" ), ), // src/form/components/fields/stripe.js:692
540
- "Additional CSS Classes" => array( null, __("Additional CSS Classes", "forminator" ), ), // src/form/components/fields/stripe.js:708
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:711
542
- "Base class" => array( null, __("Base class", "forminator" ), ), // src/form/components/fields/stripe.js:727
543
- "Complete" => array( null, __("Complete", "forminator" ), ), // src/form/components/fields/stripe.js:735
544
- "Empty" => array( null, __("Empty", "forminator" ), ), // src/form/components/fields/stripe.js:743
545
- "Focused" => array( null, __("Focused", "forminator" ), ), // src/form/components/fields/stripe.js:751
546
- "Invalid" => array( null, __("Invalid", "forminator" ), ), // src/form/components/fields/stripe.js:759
547
- "Autofilled (Chrome and Safari only)" => array( null, __("Autofilled (Chrome and Safari only)", "forminator" ), ), // src/form/components/fields/stripe.js:767
548
- "Max characters" => array( null, __("Max characters", "forminator" ), ), // src/form/components/fields/text.js:80
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:81
550
- "Character limit" => array( null, __("Character limit", "forminator" ), ), // src/form/components/fields/text.js:89
551
- "E.g. 100" => array( null, __("E.g. 100", "forminator" ), ), // src/form/components/fields/text.js:96
552
- "Characters" => array( null, __("Characters", "forminator" ), ), // src/form/components/fields/text.js:106
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:88
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:89
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:221
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:224
567
- "Hour" => array( null, __("Hour", "forminator" ), ), // src/form/components/fields/time.js:233
568
- "Minute" => array( null, __("Minute", "forminator" ), ), // src/form/components/fields/time.js:244
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:265
570
- "Specific Hours" => array( null, __("Specific Hours", "forminator" ), ), // src/form/components/fields/time.js:282
571
- "Start Time" => array( null, __("Start Time", "forminator" ), ), // src/form/components/fields/time.js:285
572
- "AM" => array( null, __("AM", "forminator" ), ), // src/form/components/fields/time.js:317
573
- "PM" => array( null, __("PM", "forminator" ), ), // src/form/components/fields/time.js:318
574
- "End Time" => array( null, __("End Time", "forminator" ), ), // src/form/components/fields/time.js:323
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:368
576
- "Default time" => array( null, __("Default time", "forminator" ), ), // src/form/components/fields/time.js:385
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:390
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:450
579
- "Limit number of files" => array( null, __("Limit number of files", "forminator" ), ), // src/form/components/fields/upload.js:76
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:80
581
- "Unlimited" => array( null, __("Unlimited", "forminator" ), ), // src/form/components/fields/upload.js:94
582
- "File upload limit" => array( null, __("File upload limit", "forminator" ), ), // src/form/components/fields/upload.js:110
583
- "Filesize limit per file" => array( null, __("Filesize limit per file", "forminator" ), ), // src/form/components/fields/upload.js:125
584
- "Filesize limit" => array( null, __("Filesize limit", "forminator" ), ), // src/form/components/fields/upload.js:126
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:131
586
- "Upload limit per file" => array( null, __("Upload limit per file", "forminator" ), ), // src/form/components/fields/upload.js:148
587
- "MB" => array( null, __("MB", "forminator" ), ), // src/form/components/fields/upload.js:177
588
- "KB" => array( null, __("KB", "forminator" ), ), // src/form/components/fields/upload.js:178
589
- "B" => array( null, __("B", "forminator" ), ), // src/form/components/fields/upload.js:179
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:191
591
- "Upload method" => array( null, __("Upload method", "forminator" ), ), // src/form/components/fields/upload.js:206
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:210
593
- "AJAX" => array( null, __("AJAX", "forminator" ), ), // src/form/components/fields/upload.js:225
594
- "On form submission" => array( null, __("On form submission", "forminator" ), ), // src/form/components/fields/upload.js:226
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:9
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:35
600
- "Give your form a name" => array( null, __("Give your form a name", "forminator" ), ), // src/form/components/header/title.js:39
601
- "Please, enter a valid name." => array( null, __("Please, enter a valid name.", "forminator" ), ), // src/form/components/header/title.js:56
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:71
634
- "Save Draft" => array( null, __("Save Draft", "forminator" ), ), // src/form/components/meta/buttons.js:73
635
- "Update" => array( null, __("Update", "forminator" ), ), // src/form/components/meta/buttons.js:88
636
- "Publish" => array( null, __("Publish", "forminator" ), ), // src/form/components/meta/buttons.js:90
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:228
665
- "Add Email Notification" => array( null, __("Add Email Notification", "forminator" ), ), // src/form/components/modals/notification.js:266
666
- "Email" => array( null, __("Email", "forminator" ), ), // src/form/components/modals/notification.js:291
667
- "Recipients" => array( null, __("Recipients", "forminator" ), ), // src/form/components/modals/notification.js:300
668
- "Advanced" => array( null, __("Advanced", "forminator" ), ), // src/form/components/modals/notification.js:309
669
- "Conditions" => array( null, __("Conditions", "forminator" ), ), // src/form/components/modals/notification.js:318
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:345
671
- "E.g. Sales Team Notification" => array( null, __("E.g. Sales Team Notification", "forminator" ), ), // src/form/components/modals/notification.js:350
672
- "E.g. New Form Submission" => array( null, __("E.g. New Form Submission", "forminator" ), ), // src/form/components/modals/notification.js:364
673
- "Subject" => array( null, __("Subject", "forminator" ), ), // src/form/components/modals/notification.js:367
674
- "Email subject can't be empty" => array( null, __("Email subject can't be empty", "forminator" ), ), // src/form/components/modals/notification.js:370
675
- "Body" => array( null, __("Body", "forminator" ), ), // src/form/components/modals/notification.js:401
676
- "Email body can't be empty" => array( null, __("Email body can't be empty", "forminator" ), ), // src/form/components/modals/notification.js:403
677
- "Attachments" => array( null, __("Attachments", "forminator" ), ), // src/form/components/modals/notification.js:415
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:416
679
- "Uploaded files" => array( null, __("Uploaded files", "forminator" ), ), // src/form/components/modals/notification.js:423
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:441
681
- "E.g. sales@website.com" => array( null, __("E.g. sales@website.com", "forminator" ), ), // src/form/components/modals/notification.js:475
682
- "Separate multiple emails with a comma" => array( null, __("Separate multiple emails with a comma", "forminator" ), ), // src/form/components/modals/notification.js:481
683
- "Email Routing" => array( null, __("Email Routing", "forminator" ), ), // src/form/components/modals/notification.js:501
684
- "Enter from name here" => array( null, __("Enter from name here", "forminator" ), ), // src/form/components/modals/notification.js:528
685
- "From Name" => array( null, __("From Name", "forminator" ), ), // src/form/components/modals/notification.js:529
686
- "Enter from email here" => array( null, __("Enter from email here", "forminator" ), ), // src/form/components/modals/notification.js:550
687
- "From Email" => array( null, __("From Email", "forminator" ), ), // src/form/components/modals/notification.js:551
688
- "Enter reply-to email here" => array( null, __("Enter reply-to email here", "forminator" ), ), // src/form/components/modals/notification.js:572
689
- "Reply-to Email" => array( null, __("Reply-to Email", "forminator" ), ), // src/form/components/modals/notification.js:573
690
- "Enter CC email here" => array( null, __("Enter CC email here", "forminator" ), ), // src/form/components/modals/notification.js:594
691
- "CC Emails" => array( null, __("CC Emails", "forminator" ), ), // src/form/components/modals/notification.js:595
692
- "Enter BCC email here" => array( null, __("Enter BCC email here", "forminator" ), ), // src/form/components/modals/notification.js:616
693
- "BCC Emails" => array( null, __("BCC Emails", "forminator" ), ), // src/form/components/modals/notification.js:617
694
- "Discard Changes" => array( null, __("Discard Changes", "forminator" ), ), // src/form/components/modals/notification.js:662
695
- "Add" => array( null, __("Add", "forminator" ), ), // src/form/components/modals/notification.js:674
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
- "Navigate" => array( null, __("Navigate", "forminator" ), ), // src/form/components/navigation/menu.js:92
 
 
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
- "this field if" => array( null, __("this field if", "forminator" ), ), // src/form/components/settings/visibility.js:149
947
- "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:178
948
- "Rules" => array( null, __("Rules", "forminator" ), ), // src/form/components/settings/visibility.js:189
949
- "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:203
 
 
 
 
 
 
 
 
 
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:9
 
 
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:45
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:9
1108
- "Give your quiz a name" => array( null, __("Give your quiz a name", "forminator" ), ), // src/quiz/global/components/header/title.js:32
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
- "Quiz result color" => array( null, __("Quiz result color", "forminator" ), ), // src/quiz/knowledge/components/appearance/colors/basic.js:39
 
 
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:31
1163
- "Quiz Description" => array( null, __("Quiz Description", "forminator" ), ), // src/quiz/knowledge/components/appearance/fonts/fonts-table.js:38
1164
- "Answer" => array( null, __("Answer", "forminator" ), ), // src/quiz/knowledge/components/appearance/fonts/fonts-table.js:52
1165
- "Answer Result Message" => array( null, __("Answer Result Message", "forminator" ), ), // src/quiz/knowledge/components/appearance/fonts/fonts-table.js:59
1166
- "Social Share Title" => array( null, __("Social Share Title", "forminator" ), ), // src/quiz/knowledge/components/appearance/fonts/fonts-table.js:80
1167
- "Social Share Icons" => array( null, __("Social Share Icons", "forminator" ), ), // src/quiz/knowledge/components/appearance/fonts/fonts-table.js:87
 
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:329
1224
- "is having" => array( null, __("is having", "forminator" ), ), // src/utils.js:863
1225
- "is" => array( null, __("is", "forminator" ), ), // src/utils.js:866
1226
- "is not having" => array( null, __("is not having", "forminator" ), ), // src/utils.js:870
1227
- "is not" => array( null, __("is not", "forminator" ), ), // src/utils.js:873
1228
- "day is" => array( null, __("day is", "forminator" ), ), // src/utils.js:877
1229
- "day is not" => array( null, __("day is not", "forminator" ), ), // src/utils.js:879
1230
- "month is not" => array( null, __("month is not", "forminator" ), ), // src/utils.js:881
1231
- "month is" => array( null, __("month is", "forminator" ), ), // src/utils.js:883
1232
- "is greater than" => array( null, __("is greater than", "forminator" ), ), // src/utils.js:885
1233
- "is less than" => array( null, __("is less than", "forminator" ), ), // src/utils.js:887
1234
- "contains" => array( null, __("contains", "forminator" ), ), // src/utils.js:889
1235
- "starts with" => array( null, __("starts with", "forminator" ), ), // src/utils.js:891
1236
- "ends with" => array( null, __("ends with", "forminator" ), ), // src/utils.js:893
 
 
 
 
 
 
 
 
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 = $this->countModules();
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 = array();
416
  $default_array = array();
417
 
418
  for ( $h = 30; $h >= 0; $h-- ) {
419
- $time = strtotime( '-' . $h . ' days' );
420
- $date = date( 'Y-m-d', $time );// phpcs:ignore
421
  $default_array[ $date ] = 0;
422
- $days_array[] = date( 'M j, Y', $time );// phpcs:ignore
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 = Forminator_Form_Entry_Model::get_form_latest_entries_count_grouped_by_day( $module['id'], $sql_month_start_date );
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="fui-row fui-row-dynamic">
6
 
7
- <?php $this->template( 'dashboard/widgets/widget-cform' ); ?>
8
 
9
- <?php if ( ! FORMINATOR_PRO ) {
10
- $this->template( 'dashboard/widgets/widget-upgrade' );
11
- } ?>
12
 
13
- <?php $this->template( 'dashboard/widgets/widget-quiz' ); ?>
14
 
15
- <?php $this->template( 'dashboard/widgets/widget-poll' ); ?>
16
 
17
- <?php
18
- $notice_dismissed = get_option( 'forminator_dismiss_feature_113', false );
19
- $version_upgraded = get_option( 'forminator_version_upgraded', false );
20
 
21
- if ( ! $notice_dismissed && $version_upgraded ) { ?>
 
 
22
 
23
- <?php $this->template( 'dashboard/new-feature-notice' ); ?>
24
 
25
- <?php } ?>
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/e-sign.png';
3
- $banner_2x = forminator_plugin_url() . 'assets/images/e-sign@2x.png';
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="forminator_dismiss_feature_113" data-nonce="<?php echo esc_attr( wp_create_nonce( 'forminator_dismiss_notification' ) ); ?>">
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
- <img
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( 'E-Signatures added!', Forminator::DOMAIN ); ?></h2>
48
 
49
- <p class="sui-description"><?php printf( esc_html__( 'That\'s right, we\'ve just added the ability to %sreceive signatures%s in your forms!', Forminator::DOMAIN ), '<strong>', '</strong>' ); ?></p>
50
 
51
- <p class="sui-description"><?php printf( esc_html__( 'Have an online application that requires a signature or a contract you need your customers to sign? Insert the %sE-Signature%s field into your form so that your customers can use their mouse, trackpad or finger (on touch devices) to leave a signature before submitting the form.', Forminator::DOMAIN ), '<strong>', '</strong>' ); ?></p>
52
 
53
- <?php } else { ?>
54
 
55
- <h2 class="sui-box-title" sui-content-size="380"><?php esc_html_e( 'Multi-file Uploader & Datepicker Limits', Forminator::DOMAIN ); ?></h2>
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-body" sui-spacing-bottom="0">
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%">&nbsp;</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="fui-col-6">
22
 
23
- <div class="sui-box">
24
 
25
- <div class="sui-box-header">
26
 
27
- <h3 class="sui-box-title"><i class="sui-icon-clipboard-notes" aria-hidden="true"></i><?php esc_html_e( 'Forms', Forminator::DOMAIN ); ?></h3>
28
-
29
- </div>
30
-
31
- <div class="sui-box-body">
32
 
33
- <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>
34
 
35
- <?php if ( 0 === forminator_cforms_total() ) { ?>
36
 
37
- <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>
 
38
 
39
- <?php } ?>
40
 
41
- </div>
42
-
43
- <?php if ( 0 < forminator_cforms_total() ) { ?>
44
 
45
- <table class="sui-table sui-table-flushed">
46
 
47
- <thead>
48
 
49
- <tr>
50
 
51
- <th><?php esc_html_e( 'Name', Forminator::DOMAIN ); ?></th>
52
 
53
- <th class="fui-col-status"><?php esc_html_e( 'Status', Forminator::DOMAIN ); ?></th>
54
 
55
- </tr>
56
 
57
- </thead>
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
- <li>
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
- <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>
119
 
120
- <li><form method="post">
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
- <?php if ( Forminator::is_import_export_feature_enabled() ) : ?>
130
 
131
- <li><a href="#"
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
- <?php endif; ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
141
 
142
- <li>
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
- </ul>
 
 
 
 
 
 
 
 
 
154
 
155
- </div>
156
 
157
- </td>
158
 
159
- </tr>
160
 
161
- <?php } ?>
162
 
163
- </tbody>
164
 
165
- </table>
166
 
167
- <div class="sui-box-footer">
168
 
169
- <button class="sui-button sui-button-blue wpmudev-open-modal"
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
- <div class="sui-actions-right">
175
- <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>
176
- </div>
 
177
 
 
 
178
  </div>
179
 
180
- <?php } ?>
181
 
182
- </div>
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><form method="post">
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
- <button type="submit">
128
- <i class="sui-icon-page-multiple" aria-hidden="true"></i> <?php esc_html_e( 'Duplicate', Forminator::DOMAIN ); ?>
129
- </button>
 
 
 
 
 
 
130
  </form></li>
131
 
132
  <?php if ( Forminator::is_import_export_feature_enabled() ) : ?>
133
-
134
- <li><button class="wpmudev-open-modal"
135
- data-modal="export_quiz"
136
- data-modal-title=""
137
- data-form-id="<?php echo esc_attr( $module['id'] ); ?>"
138
- data-nonce="<?php echo esc_attr( wp_create_nonce( 'forminator_popup_export_quiz' ) ); ?>">
139
- <i class="sui-icon-cloud-migration" aria-hidden="true"></i> <?php esc_html_e( 'Export', Forminator::DOMAIN ); ?>
140
- </button></li>
 
 
 
 
 
 
 
 
 
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="fui-col-6">
2
 
3
- <div class="sui-box">
4
 
5
- <div class="sui-box-header">
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
- <div class="sui-box-body">
16
 
17
- <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>
18
 
19
- <ul class="sui-list-pro">
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
- <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">
31
- <?php esc_html_e( 'Try Pro for FREE today!', Forminator::DOMAIN ); ?>
32
- </a></p>
 
 
 
 
 
 
 
33
 
34
- </div>
 
 
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 = forminator_plugin_url();
4
- $entries = $this->get_table();
5
- $form_type = $this->get_form_type();
6
- $count = $this->get_total_entries();
7
- $entries_per_page = $this->get_per_page();
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="post" class="sui-box">
17
 
18
- <?php wp_nonce_field( 'forminator_quiz_bulk_action', 'forminatorEntryNonce' ); ?>
19
 
20
- <div class="sui-box-body">
21
 
22
- <?php $this->template( 'quiz/entries/prompt' ); ?>
23
 
24
- <input type="hidden" name="form_id" value="<?php echo esc_attr( $this->form_id ); ?>"/>
25
 
26
- <div class="sui-box-search">
27
 
28
- <div class="sui-search-left">
 
 
29
 
30
- <?php $this->bulk_actions(); ?>
31
 
32
- </div>
33
 
34
- <div class="sui-search-right">
 
 
35
 
36
- <div class="sui-pagination-wrap">
37
 
38
- <span class="sui-pagination-results">
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
- <?php $this->paginate(); ?>
51
 
52
- </div>
53
 
54
- </div>
55
 
56
- </div>
 
 
 
 
 
 
 
 
 
 
 
 
57
 
58
- </div>
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
- </tr>
 
 
173
 
174
- <?php endforeach; ?>
175
 
176
- <?php $integrations_data = $this->get_integrations_data_from_entry( $entry ); ?>
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
- </tbody>
201
 
202
- </table>
203
 
204
- <div class="sui-box-footer">
205
 
206
- <p><?php echo sprintf( __( "You got <strong>%s / %s</strong> correct answers.", Forminator::DOMAIN ), $right, $total ); // phpcs:ignore ?></p>
207
- </div>
208
 
209
- <?php
210
- } else {
211
 
212
- $meta = $entry->meta_data['entry']['value'][0]['value'];
213
- ?>
214
 
215
- <?php if ( isset( $meta['answers'] ) && is_array( $meta['answers'] ) ) : ?>
216
 
217
- <table class="sui-table">
 
 
 
 
 
 
 
 
 
 
 
 
218
 
219
- <thead>
 
 
 
 
 
 
 
 
 
 
 
 
220
 
221
- <tr>
 
 
 
 
 
 
 
 
 
 
 
 
222
 
223
- <th><?php esc_html_e( 'Question', Forminator::DOMAIN ); ?></th>
 
 
 
 
 
 
 
 
 
 
 
 
 
224
 
225
- <th><?php esc_html_e( 'Answer', Forminator::DOMAIN ); ?></th>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
226
 
227
- </tr>
228
 
229
- </thead>
230
 
231
- <tbody>
 
 
232
 
233
- <?php foreach ( $meta['answers'] as $answer ) : ?>
234
-
235
- <tr>
236
-
237
- <td><?php echo esc_html( $answer['question'] ); ?></td>
238
-
239
- <td><?php echo esc_html( $answer['answer'] ); ?></td>
240
-
241
- </tr>
242
-
243
- <?php endforeach; ?>
244
-
245
- <?php $integrations_data = $this->get_integrations_data_from_entry( $entry ); ?>
246
- <?php if ( ! empty( $integrations_data ) ) : ?>
247
- <?php foreach ( $integrations_data as $integrations_datum ) : ?>
248
- <tr>
249
- <td><?php echo $integrations_datum['label']; // phpcs:ignore -- html output intended ?></td>
250
- <td>
251
- <?php
252
- $sub_entries = isset( $integrations_datum['sub_entries'] ) ? $integrations_datum['sub_entries'] : array();
253
- ?>
254
- <?php if ( ! empty( $sub_entries ) && is_array( $sub_entries ) ) : ?>
255
- <?php foreach ( $sub_entries as $sub_entry ) : ?>
256
- <div class="">
257
- <span class="sui-settings-label"><?php echo esc_html( $sub_entry['label'] ); ?></span>
258
- <span class="sui-description"><?php echo( $sub_entry['value'] ); // phpcs:ignore -- html output intended ?></span>
259
- </div>
260
- <?php endforeach; ?>
261
- <?php else : ?>
262
- <?php echo( $integrations_datum['value'] ); // phpcs:ignore -- html output intended ?>
263
- <?php endif; ?>
264
- </td>
265
- </tr>
266
- <?php endforeach; ?>
267
- <?php endif; ?>
268
-
269
-
270
- </tbody>
271
-
272
- </table>
273
-
274
- <?php endif; ?>
275
-
276
- <div class="sui-box-footer">
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 havent received any submissions for this quiz yet. When you do, youll be able to view all the data here.', Forminator::DOMAIN ); ?></p>
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 ( $this->getModules() as $module ) {
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><form method="post">
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
- <button type="submit"><i class="sui-icon-page-multiple" aria-hidden="true"></i> <?php esc_html_e( 'Duplicate', Forminator::DOMAIN ); ?></button>
 
 
 
 
 
 
 
 
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
- <li><a href="#"
238
- class="wpmudev-open-modal"
239
- data-modal="export_quiz"
240
- data-modal-title=""
241
- data-form-id="<?php echo esc_attr( $module['id'] ); ?>"
242
- data-nonce="<?php echo esc_attr( wp_create_nonce( 'forminator_popup_export_quiz' ) ); ?>">
243
- <i class="sui-icon-cloud-migration" aria-hidden="true"></i> <?php esc_html_e( 'Export', Forminator::DOMAIN ); ?>
244
- </a></li>
 
 
 
 
 
 
 
 
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
- <strong><?php esc_html_e( 'Submissions', Forminator::DOMAIN ); ?></strong>
287
- <a href="<?php echo admin_url( 'admin.php?page=forminator-quiz-view&form_id=' . $module['id'] ); // phpcs:ignore ?>"><?php echo esc_html( $module['entries'] ); ?></a>
 
 
 
 
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 ( $this->getModules() as $module ) {
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, we display forms with any status. However, you can display forms having a specific status only on the dashboard.', Forminator::DOMAIN ); ?></span>
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, we display polls with any status. However, you can display polls having a specific status only on the dashboard.', Forminator::DOMAIN ); ?></span>
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, we display quizzes with any status. However, you can display quizzes having a specific status only on the dashboard.', Forminator::DOMAIN ); ?></span>
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 with their preferred status you want to see on your dashboard for each module type.', Forminator::DOMAIN ); ?></span>
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