Elementor Essential Addons - Version 2.3.0

Version Description

  • Caldera Forms element added
  • HTML support added for Flip Box content
  • Few minor bug fixed and improvements
Download this release

Release Info

Developer re_enter_rupok
Plugin Icon 128x128 Elementor Essential Addons
Version 2.3.0
Comparing to
See all releases

Code changes from version 2.2.5 to 2.3.0

admin/assets/css/admin.css CHANGED
@@ -93,6 +93,14 @@ p.desc {
93
  padding-bottom: 15px;
94
  border-bottom: 1px solid rgba( 0,0,0,0.1 );
95
  }
 
 
 
 
 
 
 
 
96
  .eael-form-control {
97
  width: 100%;
98
  }
@@ -235,11 +243,11 @@ textarea.eael-form-control {
235
  }
236
 
237
  .eael-btn.eael-demo-btn {
238
- background-color: #E74C3C;
239
  color: #fff;
240
  }
241
  .eael-btn.eael-demo-btn:hover, .eael-btn.eael-demo-btn:focus {
242
- background-color: #f54;
243
  color: #fff;
244
  }
245
 
@@ -337,4 +345,4 @@ textarea.eael-form-control {
337
  .eael-save-btn-wrap .eael-btn.save-now:hover,
338
  .eael-header-bar .eael-btn.save-now:hover {
339
  background: #ff5544;
340
- }
93
  padding-bottom: 15px;
94
  border-bottom: 1px solid rgba( 0,0,0,0.1 );
95
  }
96
+ .eael-settings-tab p.eael-elements-control-notice {
97
+ color: #42418e;
98
+ font-size: 16px;
99
+ border: 1px solid #42418e;
100
+ padding: 10px;
101
+ text-align: center;
102
+ display: block;
103
+ }
104
  .eael-form-control {
105
  width: 100%;
106
  }
243
  }
244
 
245
  .eael-btn.eael-demo-btn {
246
+ background-color: #42418e;
247
  color: #fff;
248
  }
249
  .eael-btn.eael-demo-btn:hover, .eael-btn.eael-demo-btn:focus {
250
+ background-color: #FF0188;
251
  color: #fff;
252
  }
253
 
345
  .eael-save-btn-wrap .eael-btn.save-now:hover,
346
  .eael-header-bar .eael-btn.save-now:hover {
347
  background: #ff5544;
348
+ }
admin/settings.php CHANGED
@@ -14,7 +14,7 @@ class Eael_Admin_Settings {
14
  * @var array
15
  * @since 2.3.0
16
  */
17
- public $eael_default_keys = [ 'contact-form-7', 'count-down', 'creative-btn', 'fancy-text', 'img-comparison', 'instagram-gallery', 'interactive-promo', 'lightbox', 'post-block', 'post-grid', 'post-timeline', 'product-grid', 'team-members', 'testimonial-slider', 'testimonials', 'testimonials', 'weforms', 'static-product', 'call-to-action', 'flip-box', 'info-box', 'dual-header', 'price-table', 'flip-carousel', 'interactive-cards', 'ninja-form', 'gravity-form' ];
18
 
19
  /**
20
  * Will Contain All Components Default Values
@@ -156,6 +156,7 @@ class Eael_Admin_Settings {
156
  <div id="elements" class="eael-settings-tab">
157
  <div class="row">
158
  <div class="col-full">
 
159
  <table class="form-table">
160
  <tr>
161
  <td>
@@ -298,6 +299,14 @@ class Eael_Admin_Settings {
298
  <p class="desc"><?php _e( 'Activate / Deactivate Gravity Form', 'essential-addons-elementor' ); ?></p>
299
  <input type="checkbox" id="gravity-form" name="gravity-form" <?php checked( 1, $this->eael_get_settings['gravity-form'], true ); ?> >
300
  <label for="gravity-form"></label>
 
 
 
 
 
 
 
 
301
  </div>
302
  </td>
303
  </tr>
@@ -433,6 +442,20 @@ class Eael_Admin_Settings {
433
  </div>
434
  </td>
435
  </tr>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
436
  </table>
437
  <div class="eael-save-btn-wrap">
438
  <input type="submit" value="Save settings" class="button eael-btn"/>
@@ -515,6 +538,8 @@ class Eael_Admin_Settings {
515
  'price-table' => intval( $settings['price-table'] ? 1 : 0 ),
516
  'ninja-form' => intval( $settings['ninja-form'] ? 1 : 0 ),
517
  'gravity-form' => intval( $settings['gravity-form'] ? 1 : 0 ),
 
 
518
  );
519
  update_option( 'eael_save_settings', $this->eael_settings );
520
  return true;
14
  * @var array
15
  * @since 2.3.0
16
  */
17
+ public $eael_default_keys = [ 'contact-form-7', 'count-down', 'creative-btn', 'fancy-text', 'img-comparison', 'instagram-gallery', 'interactive-promo', 'lightbox', 'post-block', 'post-grid', 'post-timeline', 'product-grid', 'team-members', 'testimonial-slider', 'testimonials', 'testimonials', 'weforms', 'static-product', 'call-to-action', 'flip-box', 'info-box', 'dual-header', 'price-table', 'flip-carousel', 'interactive-cards', 'ninja-form', 'gravity-form', 'caldera-form', 'wisdom_registered_setting' ];
18
 
19
  /**
20
  * Will Contain All Components Default Values
156
  <div id="elements" class="eael-settings-tab">
157
  <div class="row">
158
  <div class="col-full">
159
+ <p class="eael-elements-control-notice">You can disable the elements you are not using on your site. That will disable all associated assets of those widgets to improve your site loading.</p>
160
  <table class="form-table">
161
  <tr>
162
  <td>
299
  <p class="desc"><?php _e( 'Activate / Deactivate Gravity Form', 'essential-addons-elementor' ); ?></p>
300
  <input type="checkbox" id="gravity-form" name="gravity-form" <?php checked( 1, $this->eael_get_settings['gravity-form'], true ); ?> >
301
  <label for="gravity-form"></label>
302
+ </div>
303
+ </td>
304
+ <td>
305
+ <div class="eael-checkbox">
306
+ <p class="title"><?php _e( 'Caldera Form', 'essential-addons-elementor' ) ?></p>
307
+ <p class="desc"><?php _e( 'Activate / Deactivate Caldera Form', 'essential-addons-elementor' ); ?></p>
308
+ <input type="checkbox" id="caldera-form" name="caldera-form" <?php checked( 1, $this->eael_get_settings['caldera-form'], true ); ?> >
309
+ <label for="caldera-form"></label>
310
  </div>
311
  </td>
312
  </tr>
442
  </div>
443
  </td>
444
  </tr>
445
+ <tr>
446
+ <td>
447
+ <div class="eael-checkbox">
448
+ <p class="title">
449
+ <?php _e( 'Data Table', 'essential-addons-elementor' ) ?>
450
+ </p>
451
+ <p class="desc">
452
+ <?php _e( 'Activate / Deactivate Data Table', 'essential-addons-elementor' ); ?>
453
+ </p>
454
+ <input type="checkbox" id="data-table" name="data-table" disabled>
455
+ <label for="data-table" class="<?php if( (bool) $this->is_pro === false ) : echo 'eael-get-pro'; endif; ?>"></label>
456
+ </div>
457
+ </td>
458
+ </tr>
459
  </table>
460
  <div class="eael-save-btn-wrap">
461
  <input type="submit" value="Save settings" class="button eael-btn"/>
538
  'price-table' => intval( $settings['price-table'] ? 1 : 0 ),
539
  'ninja-form' => intval( $settings['ninja-form'] ? 1 : 0 ),
540
  'gravity-form' => intval( $settings['gravity-form'] ? 1 : 0 ),
541
+ 'caldera-form' => intval( $settings['gravity-form'] ? 1 : 0 ),
542
+ 'wisdom_registered_setting' => 1,
543
  );
544
  update_option( 'eael_save_settings', $this->eael_settings );
545
  return true;
assets/css/essential-addons-elementor.css CHANGED
@@ -1449,6 +1449,7 @@ body:not(.x-ethos):not(.x-integrity):not(.x-renew):not(.x-icon) .eael-product-ca
1449
  .eael-ninja-container ul.wpuf-form li .wpuf-fields input[type="text"], .eael-ninja-container .nf-field .nf-field-element input[type="password"], .eael-ninja-container ul.wpuf-form li .wpuf-fields input[type="email"], .eael-ninja-container .nf-field .nf-field-element input[type="url"], .eael-ninja-container ul.wpuf-form li .wpuf-fields input[type="number"], .eael-ninja-container .nf-field .nf-field-element textarea {
1450
  max-width: 100%;
1451
  }
 
1452
  /* Post Grid Style */
1453
 
1454
  .eael-grid-post {
@@ -2807,4 +2808,21 @@ h2.eael-elements-flip-box-heading {
2807
  font-size: 24px;
2808
  line-height: 40px;
2809
  margin: 0px;
2810
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1449
  .eael-ninja-container ul.wpuf-form li .wpuf-fields input[type="text"], .eael-ninja-container .nf-field .nf-field-element input[type="password"], .eael-ninja-container ul.wpuf-form li .wpuf-fields input[type="email"], .eael-ninja-container .nf-field .nf-field-element input[type="url"], .eael-ninja-container ul.wpuf-form li .wpuf-fields input[type="number"], .eael-ninja-container .nf-field .nf-field-element textarea {
1450
  max-width: 100%;
1451
  }
1452
+
1453
  /* Post Grid Style */
1454
 
1455
  .eael-grid-post {
2808
  font-size: 24px;
2809
  line-height: 40px;
2810
  margin: 0px;
2811
+ }
2812
+
2813
+
2814
+ /**
2815
+ * Caldera Contact Form Styler
2816
+ */
2817
+ .eael-caldera-form-align-left,
2818
+ .eael-caldera-form-btn-align-left {
2819
+ text-align: left;
2820
+ }
2821
+ .eael-caldera-form-align-right,
2822
+ .eael-caldera-form-btn-align-right {
2823
+ text-align: right;
2824
+ }
2825
+ .eael-caldera-form-align-center,
2826
+ .eael-caldera-form-btn-align-center {
2827
+ text-align: center;
2828
+ }
elements/caldera-forms/caldera-forms.php ADDED
@@ -0,0 +1,665 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Elementor;
3
+
4
+ if ( ! defined( 'ABSPATH' ) ) exit; // If this file is called directly, abort.
5
+
6
+
7
+ class Widget_Eael_Caldera_Form extends Widget_Base {
8
+
9
+ public function get_name() {
10
+ return 'eael-caldera-form';
11
+ }
12
+
13
+ public function get_title() {
14
+ return esc_html__( 'EA Caldera Form', 'essential-addons-elementor' );
15
+ }
16
+
17
+ public function get_icon() {
18
+ return 'fa fa-envelope-o';
19
+ }
20
+
21
+ public function get_categories() {
22
+ return [ 'essential-addons-elementor' ];
23
+ }
24
+
25
+ protected function _register_controls() {
26
+
27
+
28
+ $this->start_controls_section(
29
+ 'eael_section_caldera_form',
30
+ [
31
+ 'label' => esc_html__( 'Caldera Form', 'essential-addons-elementor' )
32
+ ]
33
+ );
34
+
35
+
36
+
37
+ $this->add_control(
38
+ 'eael_caldera_form',
39
+ [
40
+ 'label' => esc_html__( 'Select your caldera form', 'essential-addons-elementor' ),
41
+ 'label_block' => true,
42
+ 'type' => Controls_Manager::SELECT,
43
+ 'options' => eael_select_caldera_form(),
44
+ ]
45
+ );
46
+
47
+
48
+ $this->end_controls_section();
49
+
50
+
51
+ $this->start_controls_section(
52
+ 'eael_section_caldera_form_styles',
53
+ [
54
+ 'label' => esc_html__( 'Form Container Styles', 'essential-addons-elementor' ),
55
+ 'tab' => Controls_Manager::TAB_STYLE
56
+ ]
57
+ );
58
+
59
+ $this->add_control(
60
+ 'eael_caldera_form_background',
61
+ [
62
+ 'label' => esc_html__( 'Form Background Color', 'essential-addons-elementor' ),
63
+ 'type' => Controls_Manager::COLOR,
64
+ 'selectors' => [
65
+ '{{WRAPPER}} .eael-caldera-form-container' => 'background: {{VALUE}};',
66
+ ],
67
+ ]
68
+ );
69
+
70
+ $this->add_responsive_control(
71
+ 'eael_caldera_form_alignment',
72
+ [
73
+ 'label' => esc_html__( 'Form Alignment', 'essential-addons-elementor' ),
74
+ 'type' => Controls_Manager::CHOOSE,
75
+ 'label_block' => true,
76
+ 'options' => [
77
+ 'default' => [
78
+ 'title' => __( 'Default', 'essential-addons-elementor' ),
79
+ 'icon' => 'fa fa-ban',
80
+ ],
81
+ 'left' => [
82
+ 'title' => esc_html__( 'Left', 'essential-addons-elementor' ),
83
+ 'icon' => 'fa fa-align-left',
84
+ ],
85
+ 'center' => [
86
+ 'title' => esc_html__( 'Center', 'essential-addons-elementor' ),
87
+ 'icon' => 'fa fa-align-center',
88
+ ],
89
+ 'right' => [
90
+ 'title' => esc_html__( 'Right', 'essential-addons-elementor' ),
91
+ 'icon' => 'fa fa-align-right',
92
+ ],
93
+ ],
94
+ 'default' => 'default',
95
+ 'prefix_class' => 'eael-caldera-form-align-',
96
+ ]
97
+ );
98
+
99
+ $this->add_responsive_control(
100
+ 'eael_caldera_form_width',
101
+ [
102
+ 'label' => esc_html__( 'Form Width', 'essential-addons-elementor' ),
103
+ 'type' => Controls_Manager::SLIDER,
104
+ 'size_units' => [ 'px', 'em', '%' ],
105
+ 'range' => [
106
+ 'px' => [
107
+ 'min' => 10,
108
+ 'max' => 1500,
109
+ ],
110
+ 'em' => [
111
+ 'min' => 1,
112
+ 'max' => 80,
113
+ ],
114
+ ],
115
+ 'selectors' => [
116
+ '{{WRAPPER}} .eael-caldera-form-container' => 'width: {{SIZE}}{{UNIT}};',
117
+ ],
118
+ ]
119
+ );
120
+
121
+ $this->add_responsive_control(
122
+ 'eael_caldera_form_max_width',
123
+ [
124
+ 'label' => esc_html__( 'Form Max Width', 'essential-addons-elementor' ),
125
+ 'type' => Controls_Manager::SLIDER,
126
+ 'size_units' => [ 'px', 'em', '%' ],
127
+ 'range' => [
128
+ 'px' => [
129
+ 'min' => 10,
130
+ 'max' => 1500,
131
+ ],
132
+ 'em' => [
133
+ 'min' => 1,
134
+ 'max' => 80,
135
+ ],
136
+ ],
137
+ 'selectors' => [
138
+ '{{WRAPPER}} .eael-caldera-form-container' => 'max-width: {{SIZE}}{{UNIT}};',
139
+ ],
140
+ ]
141
+ );
142
+
143
+
144
+ $this->add_responsive_control(
145
+ 'eael_caldera_form_margin',
146
+ [
147
+ 'label' => esc_html__( 'Form Margin', 'essential-addons-elementor' ),
148
+ 'type' => Controls_Manager::DIMENSIONS,
149
+ 'size_units' => [ 'px', 'em', '%' ],
150
+ 'selectors' => [
151
+ '{{WRAPPER}} .eael-caldera-form-container' => 'margin: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
152
+ ],
153
+ ]
154
+ );
155
+
156
+ $this->add_responsive_control(
157
+ 'eael_caldera_form_padding',
158
+ [
159
+ 'label' => esc_html__( 'Form Padding', 'essential-addons-elementor' ),
160
+ 'type' => Controls_Manager::DIMENSIONS,
161
+ 'size_units' => [ 'px', 'em', '%' ],
162
+ 'selectors' => [
163
+ '{{WRAPPER}} .eael-caldera-form-container' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
164
+ ],
165
+ ]
166
+ );
167
+
168
+
169
+ $this->add_control(
170
+ 'eael_caldera_form_border_radius',
171
+ [
172
+ 'label' => esc_html__( 'Border Radius', 'essential-addons-elementor' ),
173
+ 'type' => Controls_Manager::DIMENSIONS,
174
+ 'separator' => 'before',
175
+ 'size_units' => [ 'px' ],
176
+ 'selectors' => [
177
+ '{{WRAPPER}} .eael-caldera-form-container' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
178
+ ],
179
+ ]
180
+ );
181
+
182
+
183
+ $this->add_group_control(
184
+ Group_Control_Border::get_type(),
185
+ [
186
+ 'name' => 'eael_caldera_form_border',
187
+ 'selector' => '{{WRAPPER}} .eael-caldera-form-container',
188
+ ]
189
+ );
190
+
191
+
192
+ $this->add_group_control(
193
+ Group_Control_Box_Shadow::get_type(),
194
+ [
195
+ 'name' => 'eael_caldera_form_box_shadow',
196
+ 'selector' => '{{WRAPPER}} .eael-caldera-form-container',
197
+ ]
198
+ );
199
+
200
+ $this->end_controls_section();
201
+
202
+
203
+
204
+ $this->start_controls_section(
205
+ 'eael_section_caldera_form_field_styles',
206
+ [
207
+ 'label' => esc_html__( 'Form Fields Styles', 'essential-addons-elementor' ),
208
+ 'tab' => Controls_Manager::TAB_STYLE
209
+ ]
210
+ );
211
+
212
+ $this->add_control(
213
+ 'eael_caldera_form_input_background',
214
+ [
215
+ 'label' => esc_html__( 'Input Field Background', 'essential-addons-elementor' ),
216
+ 'type' => Controls_Manager::COLOR,
217
+ 'default' => '#f2f2f2',
218
+ 'selectors' => [
219
+ '{{WRAPPER}} .eael-caldera-form-container input.form-control, {{WRAPPER}} .eael-caldera-form-container form input[type="text"], {{WRAPPER}} .eael-caldera-form-container form input[type="password"], {{WRAPPER}} .eael-caldera-form-container form input[type="email"], {{WRAPPER}} .eael-caldera-form-container form input[type="url"], {{WRAPPER}} .eael-caldera-form-container form input[type="date"], {{WRAPPER}} .eael-caldera-form-container form input[type="month"], {{WRAPPER}} .eael-caldera-form-container form input[type="time"], {{WRAPPER}} .eael-caldera-form-container form input[type="datetime"], {{WRAPPER}} .eael-caldera-form-container form input[type="datetime-local"], {{WRAPPER}} .eael-caldera-form-container form input[type="week"], {{WRAPPER}} .eael-caldera-form-container form input[type="number"], {{WRAPPER}} .eael-caldera-form-container form input[type="search"], {{WRAPPER}} .eael-caldera-form-container form input[type="tel"], {{WRAPPER}} .eael-caldera-form-container form input[type="color"], {{WRAPPER}} .eael-caldera-form-container form select, {{WRAPPER}} .eael-caldera-form-container form textarea' => 'background: {{VALUE}};',
220
+ ],
221
+ ]
222
+ );
223
+
224
+
225
+ $this->add_responsive_control(
226
+ 'eael_caldera_form_input_width',
227
+ [
228
+ 'label' => esc_html__( 'Input Width', 'essential-addons-elementor' ),
229
+ 'type' => Controls_Manager::SLIDER,
230
+ 'size_units' => [ 'px', 'em', '%' ],
231
+ 'range' => [
232
+ 'px' => [
233
+ 'min' => 10,
234
+ 'max' => 1500,
235
+ ],
236
+ 'em' => [
237
+ 'min' => 1,
238
+ 'max' => 80,
239
+ ],
240
+ ],
241
+ 'selectors' => [
242
+ '{{WRAPPER}} .eael-caldera-form-container input.form-control, {{WRAPPER}} .eael-caldera-form-container form input[type="text"], {{WRAPPER}} .eael-caldera-form-container form input[type="password"], {{WRAPPER}} .eael-caldera-form-container form input[type="email"], {{WRAPPER}} .eael-caldera-form-container form input[type="url"], {{WRAPPER}} .eael-caldera-form-container form input[type="date"], {{WRAPPER}} .eael-caldera-form-container form input[type="month"], {{WRAPPER}} .eael-caldera-form-container form input[type="time"], {{WRAPPER}} .eael-caldera-form-container form input[type="datetime"], {{WRAPPER}} .eael-caldera-form-container form input[type="datetime-local"], {{WRAPPER}} .eael-caldera-form-container form input[type="week"], {{WRAPPER}} .eael-caldera-form-container form input[type="number"], {{WRAPPER}} .eael-caldera-form-container form input[type="search"], {{WRAPPER}} .eael-caldera-form-container form input[type="tel"], {{WRAPPER}} .eael-caldera-form-container form input[type="color"], {{WRAPPER}} .eael-caldera-form-container form select, {{WRAPPER}} .eael-caldera-form-container form textarea' => 'width: {{SIZE}}{{UNIT}};',
243
+ ],
244
+ ]
245
+ );
246
+
247
+ $this->add_responsive_control(
248
+ 'eael_caldera_form_textarea_width',
249
+ [
250
+ 'label' => esc_html__( 'Textarea Width', 'essential-addons-elementor' ),
251
+ 'type' => Controls_Manager::SLIDER,
252
+ 'size_units' => [ 'px', 'em', '%' ],
253
+ 'range' => [
254
+ 'px' => [
255
+ 'min' => 10,
256
+ 'max' => 1500,
257
+ ],
258
+ 'em' => [
259
+ 'min' => 1,
260
+ 'max' => 80,
261
+ ],
262
+ ],
263
+ 'selectors' => [
264
+ '{{WRAPPER}} .eael-caldera-form-container form textarea' => 'width: {{SIZE}}{{UNIT}};',
265
+ ],
266
+ ]
267
+ );
268
+
269
+ $this->add_responsive_control(
270
+ 'eael_caldera_form_input_padding',
271
+ [
272
+ 'label' => esc_html__( 'Fields Padding', 'essential-addons-elementor' ),
273
+ 'type' => Controls_Manager::DIMENSIONS,
274
+ 'size_units' => [ 'px', 'em', '%' ],
275
+ 'selectors' => [
276
+ '{{WRAPPER}} .eael-caldera-form-container input.form-control, {{WRAPPER}} .eael-caldera-form-container form input[type="text"], {{WRAPPER}} .eael-caldera-form-container form input[type="password"], {{WRAPPER}} .eael-caldera-form-container form input[type="email"], {{WRAPPER}} .eael-caldera-form-container form input[type="url"], {{WRAPPER}} .eael-caldera-form-container form input[type="date"], {{WRAPPER}} .eael-caldera-form-container form input[type="month"], {{WRAPPER}} .eael-caldera-form-container form input[type="time"], {{WRAPPER}} .eael-caldera-form-container form input[type="datetime"], {{WRAPPER}} .eael-caldera-form-container form input[type="datetime-local"], {{WRAPPER}} .eael-caldera-form-container form input[type="week"], {{WRAPPER}} .eael-caldera-form-container form input[type="number"], {{WRAPPER}} .eael-caldera-form-container form input[type="search"], {{WRAPPER}} .eael-caldera-form-container form input[type="tel"], {{WRAPPER}} .eael-caldera-form-container form input[type="color"], {{WRAPPER}} .eael-caldera-form-container form select, {{WRAPPER}} .eael-caldera-form-container form textarea' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
277
+ ],
278
+ ]
279
+ );
280
+
281
+
282
+
283
+ $this->add_control(
284
+ 'eael_caldera_form_input_border_radius',
285
+ [
286
+ 'label' => esc_html__( 'Border Radius', 'essential-addons-elementor' ),
287
+ 'type' => Controls_Manager::DIMENSIONS,
288
+ 'separator' => 'before',
289
+ 'size_units' => [ 'px' ],
290
+ 'selectors' => [
291
+ '{{WRAPPER}} .eael-caldera-form-container input.form-control, {{WRAPPER}} .eael-caldera-form-container form input[type="text"], {{WRAPPER}} .eael-caldera-form-container form input[type="password"], {{WRAPPER}} .eael-caldera-form-container form input[type="email"], {{WRAPPER}} .eael-caldera-form-container form input[type="url"], {{WRAPPER}} .eael-caldera-form-container form input[type="date"], {{WRAPPER}} .eael-caldera-form-container form input[type="month"], {{WRAPPER}} .eael-caldera-form-container form input[type="time"], {{WRAPPER}} .eael-caldera-form-container form input[type="datetime"], {{WRAPPER}} .eael-caldera-form-container form input[type="datetime-local"], {{WRAPPER}} .eael-caldera-form-container form input[type="week"], {{WRAPPER}} .eael-caldera-form-container form input[type="number"], {{WRAPPER}} .eael-caldera-form-container form input[type="search"], {{WRAPPER}} .eael-caldera-form-container form input[type="tel"], {{WRAPPER}} .eael-caldera-form-container form input[type="color"], {{WRAPPER}} .eael-caldera-form-container form select, {{WRAPPER}} .eael-caldera-form-container form textarea' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
292
+ ],
293
+ ]
294
+ );
295
+
296
+
297
+ $this->add_group_control(
298
+ Group_Control_Border::get_type(),
299
+ [
300
+ 'name' => 'eael_caldera_form_input_border',
301
+ 'selector' => '{{WRAPPER}} .eael-caldera-form-container input.form-control, {{WRAPPER}} .eael-caldera-form-container form input[type="text"], {{WRAPPER}} .eael-caldera-form-container form input[type="password"], {{WRAPPER}} .eael-caldera-form-container form input[type="email"], {{WRAPPER}} .eael-caldera-form-container form input[type="url"], {{WRAPPER}} .eael-caldera-form-container form input[type="date"], {{WRAPPER}} .eael-caldera-form-container form input[type="month"], {{WRAPPER}} .eael-caldera-form-container form input[type="time"], {{WRAPPER}} .eael-caldera-form-container form input[type="datetime"], {{WRAPPER}} .eael-caldera-form-container form input[type="datetime-local"], {{WRAPPER}} .eael-caldera-form-container form input[type="week"], {{WRAPPER}} .eael-caldera-form-container form input[type="number"], {{WRAPPER}} .eael-caldera-form-container form input[type="search"], {{WRAPPER}} .eael-caldera-form-container form input[type="tel"], {{WRAPPER}} .eael-caldera-form-container form input[type="color"], {{WRAPPER}} .eael-caldera-form-container form select, {{WRAPPER}} .eael-caldera-form-container form textarea',
302
+ ]
303
+ );
304
+
305
+
306
+ $this->add_group_control(
307
+ Group_Control_Box_Shadow::get_type(),
308
+ [
309
+ 'name' => 'eael_caldera_form_input_box_shadow',
310
+ 'selector' => '{{WRAPPER}} .eael-caldera-form-container input.form-control, {{WRAPPER}} .eael-caldera-form-container form input[type="text"], {{WRAPPER}} .eael-caldera-form-container form input[type="password"], {{WRAPPER}} .eael-caldera-form-container form input[type="email"], {{WRAPPER}} .eael-caldera-form-container form input[type="url"], {{WRAPPER}} .eael-caldera-form-container form input[type="date"], {{WRAPPER}} .eael-caldera-form-container form input[type="month"], {{WRAPPER}} .eael-caldera-form-container form input[type="time"], {{WRAPPER}} .eael-caldera-form-container form input[type="datetime"], {{WRAPPER}} .eael-caldera-form-container form input[type="datetime-local"], {{WRAPPER}} .eael-caldera-form-container form input[type="week"], {{WRAPPER}} .eael-caldera-form-container form input[type="number"], {{WRAPPER}} .eael-caldera-form-container form input[type="search"], {{WRAPPER}} .eael-caldera-form-container form input[type="tel"], {{WRAPPER}} .eael-caldera-form-container form input[type="color"], {{WRAPPER}} .eael-caldera-form-container form select, {{WRAPPER}} .eael-caldera-form-container form textarea',
311
+ ]
312
+ );
313
+
314
+ $this->add_control(
315
+ 'eael_caldera_form_focus_heading',
316
+ [
317
+ 'type' => Controls_Manager::HEADING,
318
+ 'label' => esc_html__( 'Focus State Style', 'essential-addons-elementor' ),
319
+ 'separator' => 'before',
320
+ ]
321
+ );
322
+
323
+
324
+ $this->add_group_control(
325
+ Group_Control_Box_Shadow::get_type(),
326
+ [
327
+ 'name' => 'eael_caldera_form_input_focus_box_shadow',
328
+ 'selector' => '{{WRAPPER}} .eael-caldera-form-container input.form-control, {{WRAPPER}} .eael-caldera-form-container form input[type="text"], {{WRAPPER}} .eael-caldera-form-container form input[type="password"], {{WRAPPER}} .eael-caldera-form-container form input[type="email"], {{WRAPPER}} .eael-caldera-form-container form input[type="url"], {{WRAPPER}} .eael-caldera-form-container form input[type="date"], {{WRAPPER}} .eael-caldera-form-container form input[type="month"], {{WRAPPER}} .eael-caldera-form-container form input[type="time"], {{WRAPPER}} .eael-caldera-form-container form input[type="datetime"], {{WRAPPER}} .eael-caldera-form-container form input[type="datetime-local"], {{WRAPPER}} .eael-caldera-form-container form input[type="week"], {{WRAPPER}} .eael-caldera-form-container form input[type="number"], {{WRAPPER}} .eael-caldera-form-container form input[type="search"], {{WRAPPER}} .eael-caldera-form-container form input[type="tel"], {{WRAPPER}} .eael-caldera-form-container form input[type="color"], {{WRAPPER}} .eael-caldera-form-container form select, {{WRAPPER}} .eael-caldera-form-container form textarea',
329
+ ]
330
+ );
331
+
332
+ $this->add_control(
333
+ 'eael_caldera_form_input_focus_border',
334
+ [
335
+ 'label' => esc_html__( 'Border Color', 'essential-addons-elementor' ),
336
+ 'type' => Controls_Manager::COLOR,
337
+ 'selectors' => [
338
+ 'body {{WRAPPER}} .eael-caldera-form-container input.form-control, {{WRAPPER}} .eael-caldera-form-container form input[type="text"]:focus, {{WRAPPER}} .eael-caldera-form-container form input[type="password"]:focus, {{WRAPPER}} .eael-caldera-form-container form input[type="email"]:focus, {{WRAPPER}} .eael-caldera-form-container form input[type="url"]:focus, {{WRAPPER}} .eael-caldera-form-container form input[type="date"]:focus, {{WRAPPER}} .eael-caldera-form-container form input[type="month"]:focus, {{WRAPPER}} .eael-caldera-form-container form input[type="time"]:focus, {{WRAPPER}} .eael-caldera-form-container form input[type="datetime"]:focus, {{WRAPPER}} .eael-caldera-form-container form input[type="datetime-local"]:focus, {{WRAPPER}} .eael-caldera-form-container form input[type="week"]:focus, {{WRAPPER}} .eael-caldera-form-container form input[type="number"]:focus, {{WRAPPER}} .eael-caldera-form-container form input[type="search"]:focus, {{WRAPPER}} .eael-caldera-form-container form input[type="tel"]:focus, {{WRAPPER}} .eael-caldera-form-container form input[type="color"]:focus, {{WRAPPER}} .eael-caldera-form-container form select:focus, {{WRAPPER}} .eael-caldera-form-container form textarea:focus' => 'border-color: {{VALUE}};',
339
+ ],
340
+ ]
341
+ );
342
+
343
+
344
+
345
+ $this->end_controls_section();
346
+
347
+
348
+ $this->start_controls_section(
349
+ 'eael_section_caldera_form_typography',
350
+ [
351
+ 'label' => esc_html__( 'Color & Typography', 'essential-addons-elementor' ),
352
+ 'tab' => Controls_Manager::TAB_STYLE
353
+ ]
354
+ );
355
+
356
+
357
+ $this->add_control(
358
+ 'eael_caldera_form_label_color',
359
+ [
360
+ 'label' => esc_html__( 'Label Color', 'essential-addons-elementor' ),
361
+ 'type' => Controls_Manager::COLOR,
362
+ 'selectors' => [
363
+ '{{WRAPPER}} .eael-caldera-form-container, {{WRAPPER}} .eael-caldera-form-container .caldera-form label' => 'color: {{VALUE}};',
364
+ ],
365
+ ]
366
+ );
367
+
368
+ $this->add_control(
369
+ 'eael_caldera_form_field_color',
370
+ [
371
+ 'label' => esc_html__( 'Field Font Color', 'essential-addons-elementor' ),
372
+ 'type' => Controls_Manager::COLOR,
373
+ 'selectors' => [
374
+ '{{WRAPPER}} .eael-caldera-form-container input.form-control, {{WRAPPER}} .eael-caldera-form-container textarea.form-control' => 'color: {{VALUE}};',
375
+ ],
376
+ ]
377
+ );
378
+
379
+ $this->add_control(
380
+ 'eael_caldera_form_placeholder_color',
381
+ [
382
+ 'label' => esc_html__( 'Placeholder Font Color', 'essential-addons-elementor' ),
383
+ 'type' => Controls_Manager::COLOR,
384
+ 'selectors' => [
385
+ '{{WRAPPER}} .eael-caldera-form-container ::-webkit-input-placeholder' => 'color: {{VALUE}};',
386
+ '{{WRAPPER}} .eael-caldera-form-container ::-moz-placeholder' => 'color: {{VALUE}};',
387
+ '{{WRAPPER}} .eael-caldera-form-container ::-ms-input-placeholder' => 'color: {{VALUE}};',
388
+ ],
389
+ ]
390
+ );
391
+
392
+
393
+ $this->add_control(
394
+ 'eael_caldera_form_label_heading',
395
+ [
396
+ 'type' => Controls_Manager::HEADING,
397
+ 'label' => esc_html__( 'Label Typography', 'essential-addons-elementor' ),
398
+ 'separator' => 'before',
399
+ ]
400
+ );
401
+
402
+ $this->add_group_control(
403
+ Group_Control_Typography::get_type(),
404
+ [
405
+ 'name' => 'eael_caldera_form_label_typography',
406
+ 'selector' => '{{WRAPPER}} .eael-caldera-form-container, {{WRAPPER}} .eael-caldera-form-container .caldera-form label',
407
+ ]
408
+ );
409
+
410
+
411
+ $this->add_control(
412
+ 'eael_caldera_form_heading_input_field',
413
+ [
414
+ 'type' => Controls_Manager::HEADING,
415
+ 'label' => esc_html__( 'Input Fields Typography', 'essential-addons-elementor' ),
416
+ 'separator' => 'before',
417
+ ]
418
+ );
419
+
420
+ $this->add_group_control(
421
+ Group_Control_Typography::get_type(),
422
+ [
423
+ 'name' => 'eael_caldera_form_input_field_typography',
424
+ 'selector' => '{{WRAPPER}} .eael-caldera-form-container input.form-control, {{WRAPPER}} .eael-caldera-form-container textarea.form-control',
425
+ ]
426
+ );
427
+
428
+ $this->end_controls_section();
429
+
430
+
431
+
432
+ $this->start_controls_section(
433
+ 'eael_section_caldera_form_submit_button_styles',
434
+ [
435
+ 'label' => esc_html__( 'Submit Button Styles', 'essential-addons-elementor' ),
436
+ 'tab' => Controls_Manager::TAB_STYLE
437
+ ]
438
+ );
439
+
440
+ $this->add_responsive_control(
441
+ 'eael_caldera_form_submit_btn_width',
442
+ [
443
+ 'label' => esc_html__( 'Button Width', 'essential-addons-elementor' ),
444
+ 'type' => Controls_Manager::SLIDER,
445
+ 'size_units' => [ 'px', 'em', '%' ],
446
+ 'range' => [
447
+ 'px' => [
448
+ 'min' => 10,
449
+ 'max' => 1500,
450
+ ],
451
+ 'em' => [
452
+ 'min' => 1,
453
+ 'max' => 80,
454
+ ],
455
+ ],
456
+ 'selectors' => [
457
+ '{{WRAPPER}} .eael-caldera-form-container input[type="submit"]' => 'width: {{SIZE}}{{UNIT}};',
458
+ ],
459
+ ]
460
+ );
461
+
462
+ $this->add_responsive_control(
463
+ 'eael_caldera_form_submit_btn_alignment',
464
+ [
465
+ 'label' => esc_html__( 'Button Alignment', 'essential-addons-elementor' ),
466
+ 'type' => Controls_Manager::CHOOSE,
467
+ 'label_block' => true,
468
+ 'options' => [
469
+ 'default' => [
470
+ 'title' => __( 'Default', 'essential-addons-elementor' ),
471
+ 'icon' => 'fa fa-ban',
472
+ ],
473
+ 'left' => [
474
+ 'title' => esc_html__( 'Left', 'essential-addons-elementor' ),
475
+ 'icon' => 'fa fa-align-left',
476
+ ],
477
+ 'center' => [
478
+ 'title' => esc_html__( 'Center', 'essential-addons-elementor' ),
479
+ 'icon' => 'fa fa-align-center',
480
+ ],
481
+ 'right' => [
482
+ 'title' => esc_html__( 'Right', 'essential-addons-elementor' ),
483
+ 'icon' => 'fa fa-align-right',
484
+ ],
485
+ ],
486
+ 'default' => 'default',
487
+ 'prefix_class' => 'eael-caldera-form-btn-align-',
488
+ ]
489
+ );
490
+
491
+ $this->add_group_control(
492
+ Group_Control_Typography::get_type(),
493
+ [
494
+ 'name' => 'eael_caldera_form_submit_btn_typography',
495
+ 'scheme' => Scheme_Typography::TYPOGRAPHY_1,
496
+ 'selector' => '{{WRAPPER}} .eael-caldera-form-container input[type="submit"]',
497
+ ]
498
+ );
499
+
500
+ $this->add_responsive_control(
501
+ 'eael_caldera_form_submit_btn_margin',
502
+ [
503
+ 'label' => esc_html__( 'Margin', 'essential-addons-elementor' ),
504
+ 'type' => Controls_Manager::DIMENSIONS,
505
+ 'size_units' => [ 'px', 'em', '%' ],
506
+ 'selectors' => [
507
+ '{{WRAPPER}} .eael-caldera-form-container input[type="submit"]' => 'margin: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
508
+ ],
509
+ ]
510
+ );
511
+
512
+
513
+ $this->add_responsive_control(
514
+ 'eael_caldera_form_submit_btn_padding',
515
+ [
516
+ 'label' => esc_html__( 'Padding', 'essential-addons-elementor' ),
517
+ 'type' => Controls_Manager::DIMENSIONS,
518
+ 'size_units' => [ 'px', 'em', '%' ],
519
+ 'selectors' => [
520
+ '{{WRAPPER}} .eael-caldera-form-container input[type="submit"]' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
521
+ ],
522
+ ]
523
+ );
524
+
525
+
526
+
527
+ $this->start_controls_tabs( 'eael_caldera_form_submit_button_tabs' );
528
+
529
+ $this->start_controls_tab( 'normal', [ 'label' => esc_html__( 'Normal', 'essential-addons-elementor' ) ] );
530
+
531
+ $this->add_control(
532
+ 'eael_caldera_form_submit_btn_text_color',
533
+ [
534
+ 'label' => esc_html__( 'Text Color', 'essential-addons-elementor' ),
535
+ 'type' => Controls_Manager::COLOR,
536
+ 'default' => '#fff',
537
+ 'selectors' => [
538
+ '{{WRAPPER}} .eael-caldera-form-container input[type="submit"]' => 'color: {{VALUE}};',
539
+ ],
540
+ ]
541
+ );
542
+
543
+
544
+
545
+ $this->add_control(
546
+ 'eael_caldera_form_submit_btn_background_color',
547
+ [
548
+ 'label' => esc_html__( 'Background Color', 'essential-addons-elementor' ),
549
+ 'type' => Controls_Manager::COLOR,
550
+ 'default' => '#a3bf5e',
551
+ 'selectors' => [
552
+ '{{WRAPPER}} .eael-caldera-form-container input[type="submit"]' => 'background-color: {{VALUE}};',
553
+ ],
554
+ ]
555
+ );
556
+
557
+ $this->add_group_control(
558
+ Group_Control_Border::get_type(),
559
+ [
560
+ 'name' => 'eael_caldera_form_submit_btn_border',
561
+ 'selector' => '{{WRAPPER}} .eael-caldera-form-container input[type="submit"]',
562
+ ]
563
+ );
564
+
565
+ $this->add_control(
566
+ 'eael_caldera_form_submit_btn_border_radius',
567
+ [
568
+ 'label' => esc_html__( 'Border Radius', 'essential-addons-elementor' ),
569
+ 'type' => Controls_Manager::SLIDER,
570
+ 'range' => [
571
+ 'px' => [
572
+ 'max' => 100,
573
+ ],
574
+ ],
575
+ 'selectors' => [
576
+ '{{WRAPPER}} .eael-caldera-form-container input[type="submit"]' => 'border-radius: {{SIZE}}px;',
577
+ ],
578
+ ]
579
+ );
580
+
581
+
582
+
583
+ $this->end_controls_tab();
584
+
585
+ $this->start_controls_tab( 'eael_caldera_form_submit_btn_hover', [ 'label' => esc_html__( 'Hover', 'essential-addons-elementor' ) ] );
586
+
587
+ $this->add_control(
588
+ 'eael_caldera_form_submit_btn_hover_text_color',
589
+ [
590
+ 'label' => esc_html__( 'Text Color', 'essential-addons-elementor' ),
591
+ 'type' => Controls_Manager::COLOR,
592
+ 'selectors' => [
593
+ '{{WRAPPER}} .eael-caldera-form-container input[type="submit"]:hover' => 'color: {{VALUE}};',
594
+ ],
595
+ ]
596
+ );
597
+
598
+ $this->add_control(
599
+ 'eael_caldera_form_submit_btn_hover_background_color',
600
+ [
601
+ 'label' => esc_html__( 'Background Color', 'essential-addons-elementor' ),
602
+ 'type' => Controls_Manager::COLOR,
603
+ 'selectors' => [
604
+ '{{WRAPPER}} .eael-caldera-form-container input[type="submit"]:hover' => 'background-color: {{VALUE}};',
605
+ ],
606
+ ]
607
+ );
608
+
609
+ $this->add_control(
610
+ 'eael_caldera_form_submit_btn_hover_border_color',
611
+ [
612
+ 'label' => esc_html__( 'Border Color', 'essential-addons-elementor' ),
613
+ 'type' => Controls_Manager::COLOR,
614
+ 'selectors' => [
615
+ '{{WRAPPER}} .eael-caldera-form-container input[type="submit"]:hover' => 'border-color: {{VALUE}};',
616
+ ],
617
+ ]
618
+ );
619
+
620
+ $this->end_controls_tab();
621
+
622
+ $this->end_controls_tabs();
623
+
624
+
625
+ $this->add_group_control(
626
+ Group_Control_Box_Shadow::get_type(),
627
+ [
628
+ 'name' => 'eael_caldera_form_submit_btn_box_shadow',
629
+ 'selector' => '{{WRAPPER}} .eael-caldera-form-container input[type="submit"]',
630
+ ]
631
+ );
632
+
633
+
634
+ $this->end_controls_section();
635
+
636
+
637
+ }
638
+
639
+
640
+ protected function render( ) {
641
+
642
+ $settings = $this->get_settings();
643
+
644
+ ?>
645
+ <?php if ( ! empty( $settings['eael_caldera_form'] ) ) : ?>
646
+ <div class="eael-caldera-form-container">
647
+ <?php echo do_shortcode( '[caldera_form id="' . $settings['eael_caldera_form'] . '" ]' ); ?>
648
+ </div>
649
+ <?php endif; ?>
650
+
651
+ <?php
652
+
653
+ }
654
+
655
+ protected function content_template() {''
656
+
657
+ ?>
658
+
659
+
660
+ <?php
661
+ }
662
+ }
663
+
664
+
665
+ Plugin::instance()->widgets_manager->register_widget_type( new Widget_Eael_Caldera_Form() );
elements/flipbox/flipbox.php CHANGED
@@ -387,7 +387,7 @@ class Widget_Eael_Flip_Box extends Widget_Base {
387
  * -------------------------------------------
388
  */
389
  $this->start_controls_section(
390
- 'eael_section_flipbox_imgae_style_settings',
391
  [
392
  'label' => esc_html__( 'Image Style', 'essential-addons-elementor' ),
393
  'tab' => Controls_Manager::TAB_STYLE,
@@ -718,7 +718,7 @@ class Widget_Eael_Flip_Box extends Widget_Base {
718
  </div>
719
  <h2 class="eael-elements-flip-box-heading"><?php echo esc_html__( $settings['eael_flipbox_front_title'], 'essential-addons-elementor' ); ?></h2>
720
  <div class="eael-elements-flip-box-content">
721
- <p><?php echo esc_html__( $settings['eael_flipbox_front_text'], 'essential-addons-elementor' ); ?></p>
722
  </div>
723
  </div>
724
  </div>
@@ -730,7 +730,7 @@ class Widget_Eael_Flip_Box extends Widget_Base {
730
  <div class="eael-elements-flip-box-padding">
731
  <h2 class="eael-elements-flip-box-heading"><?php echo esc_html__( $settings['eael_flipbox_back_title'], 'essential-addons-elementor' ); ?></h2>
732
  <div class="eael-elements-flip-box-content">
733
- <p><?php echo esc_html__( $settings['eael_flipbox_back_text'], 'essential-addons-elementor' ); ?></p>
734
  </div>
735
  </div>
736
  </div>
387
  * -------------------------------------------
388
  */
389
  $this->start_controls_section(
390
+ 'eael_section_flipbox_image_style_settings',
391
  [
392
  'label' => esc_html__( 'Image Style', 'essential-addons-elementor' ),
393
  'tab' => Controls_Manager::TAB_STYLE,
718
  </div>
719
  <h2 class="eael-elements-flip-box-heading"><?php echo esc_html__( $settings['eael_flipbox_front_title'], 'essential-addons-elementor' ); ?></h2>
720
  <div class="eael-elements-flip-box-content">
721
+ <p><?php echo __( $settings['eael_flipbox_front_text'], 'essential-addons-elementor' ); ?></p>
722
  </div>
723
  </div>
724
  </div>
730
  <div class="eael-elements-flip-box-padding">
731
  <h2 class="eael-elements-flip-box-heading"><?php echo esc_html__( $settings['eael_flipbox_back_title'], 'essential-addons-elementor' ); ?></h2>
732
  <div class="eael-elements-flip-box-content">
733
+ <p><?php echo __( $settings['eael_flipbox_back_text'], 'essential-addons-elementor' ); ?></p>
734
  </div>
735
  </div>
736
  </div>
essential_adons_elementor.php CHANGED
@@ -4,7 +4,7 @@
4
  * Description: The ultimate elements library for Elementor page builder plugin for WordPress.
5
  * Plugin URI: https://essential-addons.com/elementor/
6
  * Author: Codetic
7
- * Version: 2.2.5
8
  * Author URI: http://www.codetic.net
9
  *
10
  * Text Domain: essential-addons-elementor
@@ -18,11 +18,12 @@ define( 'ESSENTIAL_ADDONS_EL_PATH', plugin_dir_path( __FILE__ ) );
18
 
19
  require_once ESSENTIAL_ADDONS_EL_PATH.'includes/elementor-helper.php';
20
  require_once ESSENTIAL_ADDONS_EL_PATH.'includes/queries.php';
 
21
  require_once ESSENTIAL_ADDONS_EL_PATH.'admin/settings.php';
22
 
23
  function add_eael_elements(){
24
 
25
- $eael_default_keys = [ 'contact-form-7', 'count-down', 'creative-btn', 'fancy-text', 'img-comparison', 'instagram-gallery', 'interactive-promo', 'lightbox', 'post-block', 'post-grid', 'post-timeline', 'product-grid', 'team-members', 'testimonial-slider', 'testimonials', 'testimonials', 'weforms', 'static-product', 'call-to-action', 'flip-box', 'info-box', 'dual-header', 'price-table', 'flip-carousel', 'interactive-cards', 'ninja-form', 'gravity-form' ];
26
  $eael_default_settings = array_fill_keys( $eael_default_keys, true );
27
 
28
  $is_component_active = get_option( 'eael_save_settings', $eael_default_settings );
@@ -85,7 +86,9 @@ function add_eael_elements(){
85
  if( class_exists( 'GFForms' ) && $is_component_active['gravity-form'] ) {
86
  require_once ESSENTIAL_ADDONS_EL_PATH.'elements/gravity-form/gravity-form.php';
87
  }
88
-
 
 
89
  }
90
  add_action('elementor/widgets/widgets_registered','add_eael_elements');
91
 
@@ -150,4 +153,23 @@ function eael_redirect() {
150
  wp_redirect("admin.php?page=eael-settings");
151
  }
152
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
153
  }
4
  * Description: The ultimate elements library for Elementor page builder plugin for WordPress.
5
  * Plugin URI: https://essential-addons.com/elementor/
6
  * Author: Codetic
7
+ * Version: 2.3.0
8
  * Author URI: http://www.codetic.net
9
  *
10
  * Text Domain: essential-addons-elementor
18
 
19
  require_once ESSENTIAL_ADDONS_EL_PATH.'includes/elementor-helper.php';
20
  require_once ESSENTIAL_ADDONS_EL_PATH.'includes/queries.php';
21
+ require_once ESSENTIAL_ADDONS_EL_PATH.'includes/class-plugin-usage-tracker.php';
22
  require_once ESSENTIAL_ADDONS_EL_PATH.'admin/settings.php';
23
 
24
  function add_eael_elements(){
25
 
26
+ $eael_default_keys = [ 'contact-form-7', 'count-down', 'creative-btn', 'fancy-text', 'img-comparison', 'instagram-gallery', 'interactive-promo', 'lightbox', 'post-block', 'post-grid', 'post-timeline', 'product-grid', 'team-members', 'testimonial-slider', 'testimonials', 'testimonials', 'weforms', 'static-product', 'call-to-action', 'flip-box', 'info-box', 'dual-header', 'price-table', 'flip-carousel', 'interactive-cards', 'ninja-form', 'gravity-form', 'caldera-form', 'wisdom_registered_setting' ];
27
  $eael_default_settings = array_fill_keys( $eael_default_keys, true );
28
 
29
  $is_component_active = get_option( 'eael_save_settings', $eael_default_settings );
86
  if( class_exists( 'GFForms' ) && $is_component_active['gravity-form'] ) {
87
  require_once ESSENTIAL_ADDONS_EL_PATH.'elements/gravity-form/gravity-form.php';
88
  }
89
+ if( class_exists( 'Caldera_Forms' ) && $is_component_active['caldera-form'] ) {
90
+ require_once ESSENTIAL_ADDONS_EL_PATH.'elements/caldera-forms/caldera-forms.php';
91
+ }
92
  }
93
  add_action('elementor/widgets/widgets_registered','add_eael_elements');
94
 
153
  wp_redirect("admin.php?page=eael-settings");
154
  }
155
  }
156
+ }
157
+
158
+ // Optional usage tracker
159
+
160
+ if( ! class_exists( 'Plugin_Usage_Tracker') ) {
161
+ require_once dirname( __FILE__ ) . '/includes/class-plugin-usage-tracker.php';
162
+ }
163
+ if( ! function_exists( 'essential_addons_elementor_lite_start_plugin_tracking' ) ) {
164
+ function essential_addons_elementor_lite_start_plugin_tracking() {
165
+ $wisdom = new Plugin_Usage_Tracker(
166
+ __FILE__,
167
+ 'https://wpdeveloper.net',
168
+ array(),
169
+ true,
170
+ true,
171
+ 1
172
+ );
173
+ }
174
+ essential_addons_elementor_lite_start_plugin_tracking();
175
  }
includes/class-plugin-usage-tracker.php ADDED
@@ -0,0 +1,849 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * This is the class that sends all the data back to the home site
4
+ * It also handles opting in and deactivation
5
+ * @version 1.1.1
6
+ */
7
+
8
+ // Exit if accessed directly
9
+ if ( ! defined( 'ABSPATH' ) ) {
10
+ exit;
11
+ }
12
+
13
+ if( ! class_exists( 'Plugin_Usage_Tracker') ) {
14
+
15
+ class Plugin_Usage_Tracker {
16
+
17
+ private $wisdom_version = '1.1.1';
18
+ private $home_url = '';
19
+ private $plugin_file = '';
20
+ private $plugin_name = '';
21
+ private $options = array();
22
+ private $require_optin = true;
23
+ private $include_goodbye_form = true;
24
+ private $marketing = false;
25
+ private $collect_email = false;
26
+
27
+ /**
28
+ * Class constructor
29
+ *
30
+ * @param $_home_url The URL to the site we're sending data to
31
+ * @param $_plugin_file The file path for this plugin
32
+ * @param $_options Plugin options to track
33
+ * @param $_require_optin Whether user opt-in is required (always required on WordPress.org)
34
+ * @param $_include_goodbye_form Whether to include a form when the user deactivates
35
+ * @param $_marketing Marketing method:
36
+ * 0: Don't collect email addresses
37
+ * 1: Request permission same time as tracking opt-in
38
+ * 2: Request permission after opt-in
39
+ */
40
+ public function __construct(
41
+ $_plugin_file,
42
+ $_home_url,
43
+ $_options,
44
+ $_require_optin=true,
45
+ $_include_goodbye_form=true,
46
+ $_marketing=false ) {
47
+
48
+ $this->plugin_file = $_plugin_file;
49
+ $this->home_url = trailingslashit( $_home_url );
50
+ $this->plugin_name = basename( $this->plugin_file, '.php' );
51
+ $this->options = $_options;
52
+ $this->require_optin = $_require_optin;
53
+ $this->include_goodbye_form = $_include_goodbye_form;
54
+ $this->marketing = $_marketing;
55
+
56
+ // Schedule some tracking when activated
57
+ register_activation_hook( $this->plugin_file, array( $this, 'schedule_tracking' ) );
58
+ // Deactivation hook
59
+ register_deactivation_hook( $this->plugin_file, array( $this, 'deactivate_this_plugin' ) );
60
+
61
+ // Get it going
62
+ $this->init();
63
+
64
+ }
65
+
66
+ public function init() {
67
+ // Check marketing
68
+ if( $this->marketing == 3 ) {
69
+ $this->set_can_collect_email( true, $this->plugin_name );
70
+ }
71
+
72
+ // Check whether opt-in is required
73
+ // If not, then tracking is allowed
74
+ if( ! $this->require_optin ) {
75
+ $this->set_is_tracking_allowed( true );
76
+ $this->update_block_notice();
77
+ $this->do_tracking();
78
+ }
79
+
80
+ // Hook our do_tracking function to the daily action
81
+ // add_filter( 'cron_schedules', array( $this, 'add_weekly_cron_schedule' ) );
82
+ add_action( 'put_do_weekly_action', array( $this, 'do_tracking' ) );
83
+
84
+ // Use this action for local testing
85
+ // add_action( 'admin_init', array( $this, 'do_tracking' ) );
86
+
87
+ // Display the admin notice on activation
88
+ add_action( 'admin_notices', array( $this, 'optin_notice' ) );
89
+ add_action( 'admin_notices', array( $this, 'marketing_notice' ) );
90
+
91
+ // Deactivation
92
+ add_filter( 'plugin_action_links_' . plugin_basename( $this->plugin_file ), array( $this, 'filter_action_links' ) );
93
+ add_action( 'admin_footer-plugins.php', array( $this, 'goodbye_ajax' ) );
94
+ add_action( 'wp_ajax_goodbye_form', array( $this, 'goodbye_form_callback' ) );
95
+
96
+ }
97
+
98
+ /**
99
+ * Add weekly option to the cron schedule
100
+ *
101
+ * @since 1.1.2
102
+ */
103
+ public function add_weekly_cron_schedule( $schedules ) {
104
+ $schedules['weekly'] = array(
105
+ 'interval' => 604800,
106
+ 'display' => __( 'Once weekly', 'put-usage-tracker' )
107
+ );
108
+ return $schedules;
109
+ }
110
+
111
+ /**
112
+ * When the plugin is activated
113
+ * Create scheduled event
114
+ * And check if tracking is enabled - perhaps the plugin has been reactivated
115
+ *
116
+ * @since 1.0.0
117
+ */
118
+ public function schedule_tracking() {
119
+ // For historical reasons, this is called 'weekly' but is in fact daily
120
+ if ( ! wp_next_scheduled( 'put_do_weekly_action' ) ) {
121
+ wp_schedule_event( time(), 'daily', 'put_do_weekly_action' );
122
+ }
123
+ // Run tracking here in case plugin has been reactivated
124
+ $this->do_tracking();
125
+ }
126
+
127
+ /**
128
+ * This is our function to get everything going
129
+ * Check that user has opted in
130
+ * Collect data
131
+ * Then send it back
132
+ *
133
+ * @since 1.0.0
134
+ */
135
+ public function do_tracking() {
136
+ // If the home site hasn't been defined, we just drop out. Nothing much we can do.
137
+ if ( ! $this->home_url ) {
138
+ return;
139
+ }
140
+
141
+ // Check to see if the user has opted in to tracking
142
+ $allow_tracking = $this->get_is_tracking_allowed();
143
+ if( ! $allow_tracking ) {
144
+ return;
145
+ }
146
+
147
+ // Check to see if it's time to track
148
+ $track_time = $this->get_is_time_to_track();
149
+ if( ! $track_time ) {
150
+ return;
151
+ }
152
+
153
+ // Get our data
154
+ $body = $this->get_data();
155
+
156
+ // Send the data
157
+ $this->send_data( $body );
158
+
159
+ }
160
+
161
+ /**
162
+ * Send the data to the home site
163
+ *
164
+ * @since 1.0.0
165
+ */
166
+ public function send_data( $body ) {
167
+
168
+ $request = wp_remote_post(
169
+ esc_url( $this->home_url . '?usage_tracker=hello' ),
170
+ array(
171
+ 'method' => 'POST',
172
+ 'timeout' => 20,
173
+ 'redirection' => 5,
174
+ 'httpversion' => '1.1',
175
+ 'blocking' => true,
176
+ 'body' => $body,
177
+ 'user-agent' => 'PUT/1.0.0; ' . get_bloginfo( 'url' )
178
+ )
179
+ );
180
+
181
+ $this->set_track_time();
182
+
183
+ if( is_wp_error( $request ) ) {
184
+ return $request;
185
+ }
186
+
187
+ }
188
+
189
+ /**
190
+ * Here we collect most of the data
191
+ *
192
+ * @since 1.0.0
193
+ */
194
+ public function get_data() {
195
+
196
+ // Use this to pass error messages back if necessary
197
+ $body['message'] = '';
198
+
199
+ // Use this array to send data back
200
+ $body = array(
201
+ 'plugin_slug' => sanitize_text_field( $this->plugin_name ),
202
+ 'url' => get_bloginfo( 'url' ),
203
+ 'site_name' => get_bloginfo( 'name' ),
204
+ 'site_version' => get_bloginfo( 'version' ),
205
+ 'site_language' => get_bloginfo( 'language' ),
206
+ 'charset' => get_bloginfo( 'charset' ),
207
+ 'wisdom_version' => $this->wisdom_version,
208
+ 'php_version' => phpversion(),
209
+ 'multisite' => is_multisite(),
210
+ 'file_location' => __FILE__
211
+ );
212
+
213
+ // Collect the email if the correct option has been set
214
+ if( $this->get_can_collect_email() ) {
215
+ $body['email'] = get_bloginfo( 'admin_email' );
216
+ }
217
+ $body['marketing_method'] = $this->marketing;
218
+
219
+ $body['server'] = isset( $_SERVER['SERVER_SOFTWARE'] ) ? $_SERVER['SERVER_SOFTWARE'] : '';
220
+
221
+ // Retrieve current plugin information
222
+ if( ! function_exists( 'get_plugins' ) ) {
223
+ include ABSPATH . '/wp-admin/includes/plugin.php';
224
+ }
225
+
226
+ $plugins = array_keys( get_plugins() );
227
+ $active_plugins = get_option( 'active_plugins', array() );
228
+
229
+ foreach ( $plugins as $key => $plugin ) {
230
+ if ( in_array( $plugin, $active_plugins ) ) {
231
+ // Remove active plugins from list so we can show active and inactive separately
232
+ unset( $plugins[$key] );
233
+ }
234
+ }
235
+
236
+ $body['active_plugins'] = $active_plugins;
237
+ $body['inactive_plugins'] = $plugins;
238
+
239
+ // Check text direction
240
+ $body['text_direction'] = 'LTR';
241
+ if( function_exists( 'is_rtl' ) ) {
242
+ if( is_rtl() ) {
243
+ $body['text_direction'] = 'RTL';
244
+ }
245
+ } else {
246
+ $body['text_direction'] = 'not set';
247
+ }
248
+
249
+ /**
250
+ * Get our plugin data
251
+ * Currently we grab plugin name and version
252
+ * Or, return a message if the plugin data is not available
253
+ * @since 1.0.0
254
+ */
255
+ $plugin = $this->plugin_data();
256
+ if( empty( $plugin ) ) {
257
+ // We can't find the plugin data
258
+ // Send a message back to our home site
259
+ $body['message'] .= __( 'We can\'t detect any plugin information. This is most probably because you have not included the code in the plugin main file.', 'plugin-usage-tracker' );
260
+ $body['status'] = 'Data not found'; // Never translated
261
+ } else {
262
+ if( isset( $plugin['Name'] ) ) {
263
+ $body['plugin'] = sanitize_text_field( $plugin['Name'] );
264
+ }
265
+ if( isset( $plugin['Version'] ) ) {
266
+ $body['version'] = sanitize_text_field( $plugin['Version'] );
267
+ }
268
+ $body['status'] = 'Active'; // Never translated
269
+ }
270
+
271
+ /**
272
+ * Get our plugin options
273
+ * @since 1.0.0
274
+ */
275
+ $options = $this->options;
276
+ $plugin_options = array();
277
+ if( ! empty( $options ) && is_array( $options ) ) {
278
+ foreach( $options as $option ) {
279
+ $fields = get_option( $option );
280
+ // Check for permission to send this option
281
+ if( isset( $fields['wisdom_registered_setting'] ) ) {
282
+ foreach( $fields as $key=>$value ) {
283
+ $plugin_options[$key] = $value;
284
+ }
285
+ }
286
+ }
287
+ }
288
+ $body['plugin_options'] = $this->options; // Returns array
289
+ $body['plugin_options_fields'] = $plugin_options; // Returns object
290
+
291
+ /**
292
+ * Get our theme data
293
+ * Currently we grab theme name and version
294
+ * @since 1.0.0
295
+ */
296
+ $theme = wp_get_theme();
297
+ if( $theme->Name ) {
298
+ $body['theme'] = sanitize_text_field( $theme->Name );
299
+ }
300
+ if( $theme->Version ) {
301
+ $body['theme_version'] = sanitize_text_field( $theme->Version );
302
+ }
303
+
304
+ // Return the data
305
+ return $body;
306
+
307
+ }
308
+
309
+ /**
310
+ * Return plugin data
311
+ * @since 1.0.0
312
+ */
313
+ public function plugin_data() {
314
+ // Being cautious here
315
+ if( ! function_exists( 'get_plugin_data' ) ) {
316
+ include ABSPATH . '/wp-admin/includes/plugin.php';
317
+ }
318
+ // Retrieve current plugin information
319
+ $plugin = get_plugin_data( $this->plugin_file );
320
+ return $plugin;
321
+ }
322
+
323
+ /**
324
+ * Deactivating plugin
325
+ * @since 1.0.0
326
+ */
327
+ public function deactivate_this_plugin() {
328
+ // Check to see if the user has opted in to tracking
329
+ $allow_tracking = $this->get_is_tracking_allowed();
330
+ if( ! $allow_tracking ) {
331
+ return;
332
+ }
333
+ $body = $this->get_data();
334
+ $body['status'] = 'Deactivated'; // Never translated
335
+ $body['deactivated_date'] = time();
336
+
337
+ // Add deactivation form data
338
+ if( false !== get_option( 'wisdom_deactivation_reason_' . $this->plugin_name ) ) {
339
+ $body['deactivation_reason'] = get_option( 'wisdom_deactivation_reason_' . $this->plugin_name );
340
+ }
341
+ if( false !== get_option( 'wisdom_deactivation_details_' . $this->plugin_name ) ) {
342
+ $body['deactivation_details'] = get_option( 'wisdom_deactivation_details_' . $this->plugin_name );
343
+ }
344
+
345
+ $this->send_data( $body );
346
+ // Clear scheduled update
347
+ wp_clear_scheduled_hook( 'put_do_weekly_action' );
348
+ }
349
+
350
+ /**
351
+ * Is tracking allowed?
352
+ * @since 1.0.0
353
+ */
354
+ public function get_is_tracking_allowed() {
355
+ // First, check if the user has changed their mind and opted out of tracking
356
+ if( $this->has_user_opted_out() ) {
357
+ $this->set_is_tracking_allowed( false, $this->plugin_name );
358
+ return false;
359
+ }
360
+ // The wisdom_allow_tracking option is an array of plugins that are being tracked
361
+ $allow_tracking = get_option( 'wisdom_allow_tracking' );
362
+ // If this plugin is in the array, then tracking is allowed
363
+ if( isset( $allow_tracking[$this->plugin_name] ) ) {
364
+ return true;
365
+ }
366
+ return false;
367
+ }
368
+
369
+ /**
370
+ * Set if tracking is allowed
371
+ * Option is an array of all plugins with tracking permitted
372
+ * More than one plugin may be using the tracker
373
+ * @since 1.0.0
374
+ * @param $is_allowed Boolean true if tracking is allowed, false if not
375
+ */
376
+ public function set_is_tracking_allowed( $is_allowed, $plugin=null ) {
377
+ if( empty( $plugin ) ) {
378
+ $plugin = $this->plugin_name;
379
+ }
380
+ // The wisdom_allow_tracking option is an array of plugins that are being tracked
381
+ $allow_tracking = get_option( 'wisdom_allow_tracking' );
382
+
383
+ // If the user has decided to opt out
384
+ if( $this->has_user_opted_out() ) {
385
+ if( isset( $allow_tracking[$plugin] ) ) {
386
+ unset( $allow_tracking[$plugin] );
387
+ }
388
+ } else if( $is_allowed || ! $this->require_optin ) {
389
+ // If the user has agreed to allow tracking or if opt-in is not required
390
+ if( empty( $allow_tracking ) || ! is_array( $allow_tracking ) ) {
391
+ // If nothing exists in the option yet, start a new array with the plugin name
392
+ $allow_tracking = array( $plugin => $plugin );
393
+ } else {
394
+ // Else add the plugin name to the array
395
+ $allow_tracking[$plugin] = $plugin;
396
+ }
397
+ } else {
398
+ if( isset( $allow_tracking[$plugin] ) ) {
399
+ unset( $allow_tracking[$plugin] );
400
+ }
401
+ }
402
+ update_option( 'wisdom_allow_tracking', $allow_tracking );
403
+ }
404
+
405
+ /**
406
+ * Has the user opted out of allowing tracking?
407
+ * @since 1.1.0
408
+ * @return Boolean
409
+ */
410
+ public function has_user_opted_out() {
411
+ // Iterate through the options that are being tracked looking for wisdom_opt_out setting
412
+ if( ! empty( $this->options ) ) {
413
+ foreach( $this->options as $option_name ) {
414
+ // Check each option
415
+ $options = get_option( $option_name );
416
+ // If we find the setting, return true
417
+ if( ! empty( $options['wisdom_opt_out'] ) ) {
418
+ return true;
419
+ }
420
+ }
421
+ }
422
+ return false;
423
+ }
424
+
425
+ /**
426
+ * Check if it's time to track
427
+ * @since 1.1.1
428
+ */
429
+ public function get_is_time_to_track() {
430
+ // Let's see if we're due to track this plugin yet
431
+ $track_times = get_option( 'wisdom_last_track_time', array() );
432
+ if( ! isset( $track_times[$this->plugin_name] ) ) {
433
+ // If we haven't set a time for this plugin yet, then we must track it
434
+ return true;
435
+ } else {
436
+ // If the time is set, let's see if it's more than a day ago
437
+ if( $track_times[$this->plugin_name] < strtotime( '-1 day' ) ) {
438
+ return true;
439
+ }
440
+ }
441
+ return false;
442
+ }
443
+
444
+ /**
445
+ * Record the time we send tracking data
446
+ * @since 1.1.1
447
+ */
448
+ public function set_track_time() {
449
+ // We've tracked, so record the time
450
+ $track_times = get_option( 'wisdom_last_track_time', array() );
451
+ // Set different times according to plugin, in case we are tracking multiple plugins
452
+ $track_times[$this->plugin_name] = time();
453
+ update_option( 'wisdom_last_track_time', $track_times );
454
+ }
455
+
456
+ /**
457
+ * Set if we should block the opt-in notice for this plugin
458
+ * Option is an array of all plugins that have received a response from the user
459
+ * @since 1.0.0
460
+ */
461
+ public function update_block_notice( $plugin=null ) {
462
+ if( empty( $plugin ) ) {
463
+ $plugin = $this->plugin_name;
464
+ }
465
+ $block_notice = get_option( 'wisdom_block_notice' );
466
+ if( empty( $block_notice ) || ! is_array( $block_notice ) ) {
467
+ // If nothing exists in the option yet, start a new array with the plugin name
468
+ $block_notice = array( $plugin => $plugin );
469
+ } else {
470
+ // Else add the plugin name to the array
471
+ $block_notice[$plugin] = $plugin;
472
+ }
473
+ update_option( 'wisdom_block_notice', $block_notice );
474
+ }
475
+
476
+ /**
477
+ * Can we collect the email address?
478
+ * @since 1.0.0
479
+ */
480
+ public function get_can_collect_email() {
481
+ // The wisdom_collect_email option is an array of plugins that are being tracked
482
+ $collect_email = get_option( 'wisdom_collect_email' );
483
+ // If this plugin is in the array, then we can collect the email address
484
+ if( isset( $collect_email[$this->plugin_name] ) ) {
485
+ return true;
486
+ }
487
+ return false;
488
+ }
489
+
490
+ /**
491
+ * Set if user has allowed us to collect their email address
492
+ * Option is an array of all plugins with email collection permitted
493
+ * More than one plugin may be using the tracker
494
+ * @since 1.0.0
495
+ * @param $can_collect Boolean true if collection is allowed, false if not
496
+ */
497
+ public function set_can_collect_email( $can_collect, $plugin=null ) {
498
+ if( empty( $plugin ) ) {
499
+ $plugin = $this->plugin_name;
500
+ }
501
+ // The wisdom_collect_email option is an array of plugins that are being tracked
502
+ $collect_email = get_option( 'wisdom_collect_email' );
503
+ // If the user has agreed to allow tracking or if opt-in is not required
504
+ if( $can_collect ) {
505
+ if( empty( $collect_email ) || ! is_array( $collect_email ) ) {
506
+ // If nothing exists in the option yet, start a new array with the plugin name
507
+ $collect_email = array( $plugin => $plugin );
508
+ } else {
509
+ // Else add the plugin name to the array
510
+ $collect_email[$plugin] = $plugin;
511
+ }
512
+ } else {
513
+ if( isset( $collect_email[$plugin] ) ) {
514
+ unset( $collect_email[$plugin] );
515
+ }
516
+ }
517
+ update_option( 'wisdom_collect_email', $collect_email );
518
+ }
519
+
520
+ /**
521
+ * Display the admin notice to users to allow them to opt in
522
+ *
523
+ * @since 1.0.0
524
+ */
525
+ public function optin_notice() {
526
+ // Check for plugin args
527
+ if( isset( $_GET['plugin'] ) && isset( $_GET['plugin_action'] ) ) {
528
+ $plugin = sanitize_text_field( $_GET['plugin'] );
529
+ $action = sanitize_text_field( $_GET['plugin_action'] );
530
+ if( $action == 'yes' ) {
531
+ $this->set_is_tracking_allowed( true, $plugin );
532
+ $this->do_tracking(); // Run this straightaway
533
+ } else {
534
+ $this->set_is_tracking_allowed( false, $plugin );
535
+ }
536
+ $this->update_block_notice( $plugin );
537
+ }
538
+
539
+ // Check whether to block the notice, e.g. because we're in a local environment
540
+ // wisdom_block_notice works the same as wisdom_allow_tracking, an array of plugin names
541
+ $block_notice = get_option( 'wisdom_block_notice' );
542
+ if( isset( $block_notice[$this->plugin_name] ) ) {
543
+ return;
544
+ }
545
+
546
+ if ( ! current_user_can( 'manage_options' ) ) {
547
+ return;
548
+ }
549
+
550
+ // @credit EDD
551
+ // Don't bother asking user to opt in if they're in local dev
552
+ if ( stristr( network_site_url( '/' ), 'local' ) !== false || stristr( network_site_url( '/' ), 'localhost' ) !== false || stristr( network_site_url( '/' ), ':8888' ) !== false ) {
553
+ $this->update_block_notice();
554
+ } else {
555
+
556
+ // Display the notice requesting permission to track
557
+ // Retrieve current plugin information
558
+ $plugin = $this->plugin_data();
559
+ $plugin_name = $plugin['Name'];
560
+
561
+ // Args to add to query if user opts in to tracking
562
+ $yes_args = array(
563
+ 'plugin' => $this->plugin_name,
564
+ 'plugin_action' => 'yes'
565
+ );
566
+
567
+ // Decide how to request permission to collect email addresses
568
+ if( $this->marketing == 1 ) {
569
+ // Option 1 combines permissions to track and collect email
570
+ $yes_args['marketing_optin'] = 'yes';
571
+ } else if( $this->marketing == 2 ) {
572
+ // Option 2 enables a second notice that fires after the user opts in to tracking
573
+ $yes_args['marketing'] = 'yes';
574
+ }
575
+ $url_yes = add_query_arg( $yes_args );
576
+ $url_no = add_query_arg( array(
577
+ 'plugin' => $this->plugin_name,
578
+ 'plugin_action' => 'no'
579
+ ) );
580
+
581
+ // Decide on notice text
582
+ if( $this->marketing != 1 ) {
583
+ // Standard notice text
584
+ $notice_text = __( 'Thank you for installing our plugin. We would like to track its usage on your site. We don\'t record any sensitive data, only information regarding the WordPress environment and plugin settings, which we will use to help us make improvements to the plugin. Tracking is completely optional.', 'plugin-usage-tracker' );
585
+ } else {
586
+ // If we have option 1 for marketing, we include reference to sending product information here
587
+ $notice_text = __( 'Want to help make <strong>Essential Addons for Elementor</strong> even more awesome? You can get a <strong>25% discount coupon</strong> for Pro upgrade if you allow. <a class="insights-data-we-collect" href="#">What we collect.</a>', 'plugin-usage-tracker' );
588
+ }
589
+ // And we allow you to filter the text anyway
590
+ $notice_text = apply_filters( 'wisdom_notice_text_' . esc_attr( $this->plugin_name ), $notice_text ); ?>
591
+
592
+ <div class="notice notice-info updated put-dismiss-notice">
593
+ <p><?php echo __( $notice_text ); ?></p>
594
+ <div class="eael-insights-data" style="display: none;">
595
+ <p><?php echo __( 'We collect non-sensitive diagnostic data and plugin usage information. Your site URL, WordPress & PHP version, plugins & themes and email address to send you the discount coupon. This data lets us make sure this plugin always stays compatible with the most popular plugins and themes. No spam, I promise.' ); ?></p>
596
+ </div>
597
+ <p>
598
+ <a href="<?php echo esc_url( $url_yes ); ?>" class="button-primary"><?php _e( 'Allow', 'plugin-usage-tracker' ); ?></a>
599
+ <a href="<?php echo esc_url( $url_no ); ?>" class="button-secondary"><?php _e( 'No Thanks', 'plugin-usage-tracker' ); ?></a>
600
+ </p>
601
+ <?php echo "<script type='text/javascript'>jQuery('.insights-data-we-collect').on('click', function(e) {
602
+ e.preventDefault();
603
+ jQuery('.eael-insights-data').slideToggle('fast');
604
+ });
605
+ </script>";?>
606
+ </div>
607
+ <?php
608
+ }
609
+
610
+ }
611
+
612
+ /**
613
+ * Display the marketing notice to users if enabled
614
+ * Only displays after the user has opted in to tracking
615
+ *
616
+ * @since 1.0.0
617
+ */
618
+ public function marketing_notice() {
619
+ // Check if user has opted in to marketing
620
+ if( isset( $_GET['marketing_optin'] ) ) {
621
+ // Set marketing optin
622
+ $this->set_can_collect_email( sanitize_text_field( $_GET['marketing_optin'] ), $this->plugin_name );
623
+ // Do tracking
624
+ $this->do_tracking();
625
+ } else if( isset( $_GET['marketing'] ) && $_GET['marketing']=='yes' ) {
626
+ // Display the notice requesting permission to collect email address
627
+ // Retrieve current plugin information
628
+ $plugin = $this->plugin_data();
629
+ $plugin_name = $plugin['Name'];
630
+
631
+ $url_yes = add_query_arg( array(
632
+ 'plugin' => $this->plugin_name,
633
+ 'marketing_optin' => 'yes'
634
+ ) );
635
+ $url_no = add_query_arg( array(
636
+ 'plugin' => $this->plugin_name,
637
+ 'marketing_optin' => 'no'
638
+ ) );
639
+
640
+ $marketing_text = __( 'Thank you for opting in to tracking. Would you like to receive occasional news about this plugin, including details of new features and special offers?', 'plugin-usage-tracker' );
641
+ $marketing_text = apply_filters( 'wisdom_marketing_text_' . esc_attr( $this->plugin_name ), $marketing_text ); ?>
642
+
643
+ <div class="notice notice-info updated put-dismiss-notice">
644
+ <p><?php echo '<strong>' . esc_html( $plugin_name ) . '</strong>'; ?></p>
645
+ <p><?php echo esc_html( $marketing_text ); ?></p>
646
+ <p>
647
+ <a href="<?php echo esc_url( $url_yes ); ?>" data-putnotice="yes" class="button-secondary"><?php _e( 'Yes Please', 'plugin-usage-tracker' ); ?></a>
648
+ <a href="<?php echo esc_url( $url_no ); ?>" data-putnotice="no" class="button-secondary"><?php _e( 'No Thank You', 'plugin-usage-tracker' ); ?></a>
649
+ </p>
650
+ </div>
651
+ <?php }
652
+ }
653
+
654
+ /**
655
+ * Filter the deactivation link to allow us to present a form when the user deactivates the plugin
656
+ * @since 1.0.0
657
+ */
658
+ public function filter_action_links( $links ) {
659
+ // Check to see if the user has opted in to tracking
660
+ if( ! $this->get_is_tracking_allowed() ) {
661
+ return $links;
662
+ }
663
+ if( isset( $links['deactivate'] ) && $this->include_goodbye_form ) {
664
+ $deactivation_link = $links['deactivate'];
665
+ // Insert an onClick action to allow form before deactivating
666
+ $deactivation_link = str_replace( '<a ', '<div class="put-goodbye-form-wrapper"><span class="put-goodbye-form" id="put-goodbye-form-' . esc_attr( $this->plugin_name ) . '"></span></div><a onclick="javascript:event.preventDefault();" id="put-goodbye-link-' . esc_attr( $this->plugin_name ) . '" ', $deactivation_link );
667
+ $links['deactivate'] = $deactivation_link;
668
+ }
669
+ return $links;
670
+ }
671
+
672
+ /*
673
+ * Form text strings
674
+ * These are non-filterable and used as fallback in case filtered strings aren't set correctly
675
+ * @since 1.0.0
676
+ */
677
+ public function form_default_text() {
678
+ $form = array();
679
+ $form['heading'] = __( 'Sorry to see you go', 'plugin-usage-tracker' );
680
+ $form['body'] = __( 'Before you deactivate the plugin, would you quickly give us your reason for doing so?', 'plugin-usage-tracker' );
681
+ $form['options'] = array(
682
+ __( 'Set up is too difficult', 'plugin-usage-tracker' ),
683
+ __( 'Lack of documentation', 'plugin-usage-tracker' ),
684
+ __( 'Not the features I wanted', 'plugin-usage-tracker' ),
685
+ __( 'Found a better plugin', 'plugin-usage-tracker' ),
686
+ __( 'Installed by mistake', 'plugin-usage-tracker' ),
687
+ __( 'Only required temporarily', 'plugin-usage-tracker' ),
688
+ __( 'Didn\'t work', 'plugin-usage-tracker' )
689
+ );
690
+ $form['details'] = __( 'Details (optional)', 'plugin-usage-tracker' );
691
+ return $form;
692
+ }
693
+
694
+ /**
695
+ * Form text strings
696
+ * These can be filtered
697
+ * The filter hook must be unique to the plugin
698
+ * @since 1.0.0
699
+ */
700
+ public function form_filterable_text() {
701
+ $form = $this->form_default_text();
702
+ return apply_filters( 'wisdom_form_text_' . esc_attr( $this->plugin_name ), $form );
703
+ }
704
+
705
+ /**
706
+ * Form text strings
707
+ * These can be filtered
708
+ * @since 1.0.0
709
+ */
710
+ public function goodbye_ajax() {
711
+ // Get our strings for the form
712
+ $form = $this->form_filterable_text();
713
+ if( ! isset( $form['heading'] ) || ! isset( $form['body'] ) || ! isset( $form['options'] ) || ! is_array( $form['options'] ) || ! isset( $form['details'] ) ) {
714
+ // If the form hasn't been filtered correctly, we revert to the default form
715
+ $form = $this->form_default_text();
716
+ }
717
+ // Build the HTML to go in the form
718
+ $html = '<div class="put-goodbye-form-head"><strong>' . esc_html( $form['heading'] ) . '</strong></div>';
719
+ $html .= '<div class="put-goodbye-form-body"><p>' . esc_html( $form['body'] ) . '</p>';
720
+ if( is_array( $form['options'] ) ) {
721
+ $html .= '<div class="put-goodbye-options"><p>';
722
+ foreach( $form['options'] as $option ) {
723
+ $html .= '<input type="checkbox" name="put-goodbye-options[]" id="' . str_replace( " ", "", esc_attr( $option ) ) . '" value="' . esc_attr( $option ) . '"> <label for="' . str_replace( " ", "", esc_attr( $option ) ) . '">' . esc_attr( $option ) . '</label><br>';
724
+ }
725
+ $html .= '</p><label for="put-goodbye-reasons">' . esc_html( $form['details'] ) .'</label><textarea name="put-goodbye-reasons" id="put-goodbye-reasons" rows="2" style="width:100%"></textarea>';
726
+ $html .= '</div><!-- .put-goodbye-options -->';
727
+ }
728
+ $html .= '</div><!-- .put-goodbye-form-body -->';
729
+ $html .= '<p class="deactivating-spinner"><span class="spinner"></span> ' . __( 'Submitting form', 'plugin-usage-tracker' ) . '</p>';
730
+ ?>
731
+ <div class="put-goodbye-form-bg"></div>
732
+ <style type="text/css">
733
+ .put-form-active .put-goodbye-form-bg {
734
+ background: rgba( 0, 0, 0, .5 );
735
+ position: fixed;
736
+ top: 0;
737
+ left: 0;
738
+ width: 100%;
739
+ height: 100%;
740
+ }
741
+ .put-goodbye-form-wrapper {
742
+ position: relative;
743
+ z-index: 999;
744
+ display: none;
745
+ }
746
+ .put-form-active .put-goodbye-form-wrapper {
747
+ display: block;
748
+ }
749
+ .put-goodbye-form {
750
+ display: none;
751
+ }
752
+ .put-form-active .put-goodbye-form {
753
+ position: absolute;
754
+ bottom: 30px;
755
+ left: 0;
756
+ max-width: 400px;
757
+ background: #fff;
758
+ white-space: normal;
759
+ }
760
+ .put-goodbye-form-head {
761
+ background: #0073aa;
762
+ color: #fff;
763
+ padding: 8px 18px;
764
+ }
765
+ .put-goodbye-form-body {
766
+ padding: 8px 18px;
767
+ color: #444;
768
+ }
769
+ .deactivating-spinner {
770
+ display: none;
771
+ }
772
+ .deactivating-spinner .spinner {
773
+ float: none;
774
+ margin: 4px 4px 0 18px;
775
+ vertical-align: bottom;
776
+ visibility: visible;
777
+ }
778
+ .put-goodbye-form-footer {
779
+ padding: 8px 18px;
780
+ }
781
+ </style>
782
+ <script>
783
+ jQuery(document).ready(function($){
784
+ $("#put-goodbye-link-<?php echo esc_attr( $this->plugin_name ); ?>").on("click",function(){
785
+ // We'll send the user to this deactivation link when they've completed or dismissed the form
786
+ var url = document.getElementById("put-goodbye-link-<?php echo esc_attr( $this->plugin_name ); ?>");
787
+ $('body').toggleClass('put-form-active');
788
+ $("#put-goodbye-form-<?php echo esc_attr( $this->plugin_name ); ?>").fadeIn();
789
+ $("#put-goodbye-form-<?php echo esc_attr( $this->plugin_name ); ?>").html( '<?php echo $html; ?>' + '<div class="put-goodbye-form-footer"><p><a id="put-submit-form" class="button primary" href="#"><?php _e( 'Submit and Deactivate', 'plugin-usage-tracker' ); ?></a>&nbsp;<a class="secondary button" href="'+url+'"><?php _e( 'Just Deactivate', 'plugin-usage-tracker' ); ?></a></p></div>');
790
+ $('#put-submit-form').on('click', function(e){
791
+ // As soon as we click, the body of the form should disappear
792
+ $("#put-goodbye-form-<?php echo esc_attr( $this->plugin_name ); ?> .put-goodbye-form-body").fadeOut();
793
+ $("#put-goodbye-form-<?php echo esc_attr( $this->plugin_name ); ?> .put-goodbye-form-footer").fadeOut();
794
+ // Fade in spinner
795
+ $("#put-goodbye-form-<?php echo esc_attr( $this->plugin_name ); ?> .deactivating-spinner").fadeIn();
796
+ e.preventDefault();
797
+ var values = new Array();
798
+ $.each($("input[name='put-goodbye-options[]']:checked"), function(){
799
+ values.push($(this).val());
800
+ });
801
+ var details = $('#put-goodbye-reasons').val();
802
+ var data = {
803
+ 'action': 'goodbye_form',
804
+ 'values': values,
805
+ 'details': details,
806
+ 'security': "<?php echo wp_create_nonce ( 'wisdom_goodbye_form' ); ?>",
807
+ 'dataType': "json"
808
+ }
809
+ $.post(
810
+ ajaxurl,
811
+ data,
812
+ function(response){
813
+ // Redirect to original deactivation URL
814
+ window.location.href = url;
815
+ }
816
+ );
817
+ });
818
+ // If we click outside the form, the form will close
819
+ $('.put-goodbye-form-bg').on('click',function(){
820
+ $("#put-goodbye-form-<?php echo esc_attr( $this->plugin_name ); ?>").fadeOut();
821
+ $('body').removeClass('put-form-active');
822
+ });
823
+ });
824
+ });
825
+ </script>
826
+ <?php }
827
+
828
+ /**
829
+ * AJAX callback when the form is submitted
830
+ * @since 1.0.0
831
+ */
832
+ public function goodbye_form_callback() {
833
+ check_ajax_referer( 'wisdom_goodbye_form', 'security' );
834
+ if( isset( $_POST['values'] ) ) {
835
+ $values = json_encode( wp_unslash( $_POST['values'] ) );
836
+ update_option( 'wisdom_deactivation_reason_' . $this->plugin_name, $values );
837
+ }
838
+ if( isset( $_POST['details'] ) ) {
839
+ $details = sanitize_text_field( $_POST['details'] );
840
+ update_option( 'wisdom_deactivation_details_' . $this->plugin_name, $details );
841
+ }
842
+ $this->do_tracking(); // Run this straightaway
843
+ echo 'success';
844
+ wp_die();
845
+ }
846
+
847
+ }
848
+
849
+ }
includes/queries.php CHANGED
@@ -293,3 +293,20 @@ function eael_select_ninja_form() {
293
  }
294
  return $options;
295
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
293
  }
294
  return $options;
295
  }
296
+
297
+ /**
298
+ * Get Caldera Form List
299
+ * @return array
300
+ */
301
+ function eael_select_caldera_form() {
302
+ global $wpdb;
303
+ $eael_cf_table_name = $wpdb->prefix.'cf_forms';
304
+ $forms = $wpdb->get_results( "SELECT * FROM $eael_cf_table_name" );
305
+ foreach( $forms as $form ) {
306
+ $unserialize = unserialize( $form->config );
307
+ $form_title = $unserialize['name'];
308
+ $options[$form->form_id] = $form_title;
309
+ }
310
+ return $options;
311
+ }
312
+
readme.txt CHANGED
@@ -2,8 +2,8 @@
2
  Contributors: Codetic, re_enter_rupok, Asif2BD, robicse11128
3
  Tags: elementor, elements, addons, elementor addon, elementor widget, page builder, builder, visual editor, wordpress page builder
4
  Requires at least: 4.0
5
- Tested up to: 4.9
6
- Stable tag: 2.2.5
7
  License: GPLv3
8
  License URI: https://opensource.org/licenses/GPL-3.0
9
 
@@ -20,7 +20,7 @@ Ultimate elements library for Elementor WordPress Page Builder. Lots of useful
20
 
21
  ### Features
22
 
23
- * 17+ Stunning Elements (Free)
24
  * Fully Customizable
25
  * Unlimited Design Options
26
  * Elements Control option
@@ -40,6 +40,7 @@ Ultimate elements library for Elementor WordPress Page Builder. Lots of useful
40
  * [Contact Form 7](https://essential-addons.com/elementor/contact-form-7/)
41
  * [Gravity Forms](https://essential-addons.com/elementor/gravity-forms/)
42
  * [Ninja Forms](https://essential-addons.com/elementor/ninja-forms/)
 
43
  * [weForms](https://essential-addons.com/elementor/weforms/)
44
  * [Info Box](https://essential-addons.com/elementor/info-box/)
45
  * [Flip Box](https://essential-addons.com/elementor/flip-box/)
@@ -61,6 +62,7 @@ Ultimate elements library for Elementor WordPress Page Builder. Lots of useful
61
  * [Flip Carousel](https://essential-addons.com/elementor/flip-carousel/)
62
  * [Interactive Cards](https://essential-addons.com/elementor/interactive-cards/)
63
  * [Content Timeline](https://essential-addons.com/elementor/content-timeline/)
 
64
 
65
 
66
  More coming soon (weekly update) ...
@@ -95,6 +97,12 @@ Your existing elements/content will work with premium version. So you won't lose
95
 
96
  == Changelog ==
97
 
 
 
 
 
 
 
98
  = 2.2.5 =
99
 
100
  - Few minor bug fixed and improvements
2
  Contributors: Codetic, re_enter_rupok, Asif2BD, robicse11128
3
  Tags: elementor, elements, addons, elementor addon, elementor widget, page builder, builder, visual editor, wordpress page builder
4
  Requires at least: 4.0
5
+ Tested up to: 4.9.1
6
+ Stable tag: 2.3.0
7
  License: GPLv3
8
  License URI: https://opensource.org/licenses/GPL-3.0
9
 
20
 
21
  ### Features
22
 
23
+ * 18+ Stunning Elements (Free)
24
  * Fully Customizable
25
  * Unlimited Design Options
26
  * Elements Control option
40
  * [Contact Form 7](https://essential-addons.com/elementor/contact-form-7/)
41
  * [Gravity Forms](https://essential-addons.com/elementor/gravity-forms/)
42
  * [Ninja Forms](https://essential-addons.com/elementor/ninja-forms/)
43
+ * [Caldera Forms](https://essential-addons.com/elementor/caldera-forms/)
44
  * [weForms](https://essential-addons.com/elementor/weforms/)
45
  * [Info Box](https://essential-addons.com/elementor/info-box/)
46
  * [Flip Box](https://essential-addons.com/elementor/flip-box/)
62
  * [Flip Carousel](https://essential-addons.com/elementor/flip-carousel/)
63
  * [Interactive Cards](https://essential-addons.com/elementor/interactive-cards/)
64
  * [Content Timeline](https://essential-addons.com/elementor/content-timeline/)
65
+ * [Data Table](https://essential-addons.com/elementor/table/)
66
 
67
 
68
  More coming soon (weekly update) ...
97
 
98
  == Changelog ==
99
 
100
+ = 2.3.0 =
101
+
102
+ - Caldera Forms element added
103
+ - HTML support added for Flip Box content
104
+ - Few minor bug fixed and improvements
105
+
106
  = 2.2.5 =
107
 
108
  - Few minor bug fixed and improvements