PluginProbe
Bricksable for Bricks Builder / 1.3.8
Bricksable for Bricks Builder v1.3.8
1.2.9 1.3.0 1.3.2 1.3.3 1.3.4 1.3.5 1.3.6 1.3.7 1.3.8 1.3.9 1.4.0 1.4.1 1.4.2 1.4.3 1.4.31 1.4.32 1.5.0 1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 All 132 releases
bricksable / includes / elements / element-content-toggle.php

element-content-toggle.php in Bricksable for Bricks Builder 1.3.8, at includes/elements/element-content-toggle.php

553 lines 18.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 use Bricksable\Classes\Bricksable_Helpers;
3
4 if ( ! defined( 'ABSPATH' ) ) {
5 exit; // Exit if accessed directly.
6 }
7
8 class Bricksable_Content_Toggle extends \Bricks\Element {
9 public $category = 'bricksable';
10 public $name = 'ba-content-toggle';
11 public $icon = 'ti-layout-menu-separated';
12 public $scripts = array( 'bricksableContentToggle' );
13
14 public function get_label() {
15 return esc_html__( 'Content Toggle', 'bricksable' );
16 }
17
18 public function set_control_groups() {
19 $this->control_groups['content'] = array(
20 'title' => esc_html__( 'Tab Content', 'bricksable' ),
21 'tab' => 'content',
22 );
23
24 $this->control_groups['switcher_settings'] = array(
25 'title' => esc_html__( 'Switcher Settings', 'bricksable' ),
26 'tab' => 'content',
27 );
28
29 $this->control_groups['label_settings'] = array(
30 'title' => esc_html__( 'Label Settings', 'bricksable' ),
31 'tab' => 'content',
32 );
33
34 $this->control_groups['content_settings'] = array(
35 'title' => esc_html__( 'Content Settings', 'bricksable' ),
36 'tab' => 'content',
37 );
38 }
39 public function set_controls() {
40 // Delete control '_typography'.
41 unset( $this->controls['_typography'] );
42
43 $this->controls['content_toggle_item'] = array(
44 'tab' => 'content',
45 'group' => 'content',
46 'label' => esc_html__( 'Content Toggle', 'bricksable' ),
47 'type' => 'repeater',
48 'titleProperty' => 'label',
49 'placeholder' => esc_html__( 'Tab Content', 'bricksable' ),
50 'fields' => array(
51 'label' => array(
52 'type' => 'text',
53 'hasDynamicData' => 'text',
54 ),
55 'content_type' => array(
56 'label' => esc_html__( 'Content Type', 'bricksable' ),
57 'type' => 'select',
58 'options' => array(
59 'content' => esc_html__( 'Content', 'bricksable' ),
60 'templates' => esc_html__( 'Templates', 'bricksable' ),
61 ),
62 'clearable' => false,
63 'pasteStyles' => false,
64 'placeholder' => esc_html__( 'Content', 'bricksable' ),
65 ),
66 'content_template' => array(
67 'label' => esc_html__( 'Template', 'bricksable' ),
68 'type' => 'select',
69 'options' => bricks_is_builder() ? Bricksable_Helpers::get_templates_list( get_the_ID() ) : array(),
70 'searchable' => true,
71 'placeholder' => esc_html__( 'Select template', 'bricksable' ),
72 'required' => array( 'content_type', '=', 'templates' ),
73 'description' => esc_html__( 'Note: A reload is required in order to get the styles of the template.', 'bricksable' ),
74 ),
75 'content' => array(
76 'label' => esc_html__( 'Content', 'bricksable' ),
77 'type' => 'textarea',
78 'hasDynamicData' => 'text',
79 'required' => array( 'content_type', '=', 'content' ),
80 ),
81 ),
82 'default' => array(
83 array(
84 'label' => esc_html__( 'Monthly', 'bricksable' ),
85 'content_type' => 'content',
86 'content' => 'Lorem ipsum dolor ist amte. Consectetuer adipiscing eilt. Aenean commodo ligula egget dolor. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.',
87 ),
88 array(
89 'label' => esc_html__( 'Yearly', 'bricksable' ),
90 'content_type' => 'content',
91 'content' => 'Lorem ipsum dolor ist amte. Consectetuer adipiscing eilt. Aenean commodo ligula egget dolor. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.',
92 ),
93 ),
94 );
95
96 $this->controls['toggle_style'] = array(
97 'tab' => 'content',
98 'group' => 'content',
99 'label' => esc_html__( 'Toggle Style', 'bricksable' ),
100 'type' => 'select',
101 'options' => array(
102 'animated' => esc_html__( 'Animated Tab Style', 'bricksable' ),
103 'tab' => esc_html__( 'Normal Tab Style', 'bricksable' ),
104 ),
105 'inline' => true,
106 'reset' => true,
107 'default' => 'animated',
108 'placeholder' => esc_html__( 'Animated Tab Style', 'bricksable' ),
109 );
110
111 // Switcher.
112 $this->controls['switcher_text_align'] = array(
113 'tab' => 'content',
114 'group' => 'switcher_settings',
115 'label' => esc_html__( 'Text align', 'bricksable' ),
116 'type' => 'text-align',
117 'css' => array(
118 array(
119 'property' => 'text-align',
120 'selector' => '.ba-content-toggle-wrapper',
121 ),
122 ),
123 'default' => 'center',
124 'inline' => true,
125 'placeholder' => esc_html__( 'Center', 'bricksable' ),
126 );
127
128 $this->controls['switcher_background_color'] = array(
129 'tab' => 'content',
130 'group' => 'switcher_settings',
131 'label' => esc_html__( 'Switcher Background Color', 'bricksable' ),
132 'type' => 'color',
133 'inline' => true,
134 'small' => true,
135 'css' => array(
136 array(
137 'property' => 'background-color',
138 'selector' => '.ba-content-toggle-switcher',
139 ),
140 ),
141 'default' => array(
142 'hex' => '#f7f7fb',
143 ),
144 'pasteStyles' => false,
145 'description' => esc_html__( 'Define the switcher background color.', 'bricksable' ),
146 );
147
148 $this->controls['switcher_bottom_gap'] = array(
149 'tab' => 'content',
150 'group' => 'switcher_settings',
151 'label' => esc_html__( 'Bottom Gap', 'bricksable' ),
152 'type' => 'slider',
153 'css' => array(
154 array(
155 'property' => 'margin-bottom',
156 'selector' => '.ba-content-toggle-switcher',
157 ),
158 ),
159 'units' => array(
160 'px' => array(
161 'min' => 1,
162 'max' => 150,
163 'step' => 1,
164 ),
165 ),
166 'default' => '15px',
167 'description' => esc_html__( 'Set the bottom gap distance between the switcher and content container.', 'bricksable' ),
168 );
169
170 $this->controls['switcher_border'] = array(
171 'tab' => 'content',
172 'group' => 'switcher_settings',
173 'label' => esc_html__( 'Border', 'bricksable' ),
174 'type' => 'border',
175 'css' => array(
176 array(
177 'property' => 'border',
178 'selector' => '.ba-content-toggle-switcher',
179 ),
180 ),
181 'default' => array(
182 'width' => array(
183 'top' => 1,
184 'right' => 1,
185 'bottom' => 1,
186 'left' => 1,
187 ),
188 'style' => 'solid',
189 'color' => array(
190 'hex' => '#e5e5e5',
191 ),
192 'radius' => array(
193 'top' => 50,
194 'right' => 50,
195 'bottom' => 50,
196 'left' => 50,
197 ),
198 ),
199 'inline' => true,
200 'small' => true,
201 );
202 $this->controls['switcher_box_shadow'] = array(
203 'tab' => 'content',
204 'group' => 'switcher_settings',
205 'label' => esc_html__( 'Box Shadow', 'bricksable' ),
206 'type' => 'box-shadow',
207 'css' => array(
208 array(
209 'property' => 'box-shadow',
210 'selector' => '.ba-content-toggle-switcher',
211 ),
212 ),
213 );
214 $this->controls['switcher_padding'] = array(
215 'tab' => 'content',
216 'group' => 'switcher_settings',
217 'label' => esc_html__( 'Padding', 'bricksable' ),
218 'type' => 'dimensions',
219 'css' => array(
220 array(
221 'property' => 'padding',
222 'selector' => '.ba-content-toggle-switcher',
223 ),
224 ),
225 'default' => array(
226 'top' => 5,
227 'right' => 5,
228 'bottom' => 5,
229 'left' => 5,
230 ),
231 );
232
233 // Label.
234 $this->controls['label_active_background'] = array(
235 'tab' => 'content',
236 'group' => 'label_settings',
237 'label' => esc_html__( 'Label Active Background', 'bricksable' ),
238 'type' => 'background',
239 'css' => array(
240 array(
241 'property' => 'background',
242 'selector' => '.ba-content-toggle-slider, .ba-content-toggle-style-tab .ba-content-toggle-item.active',
243 ),
244 ),
245 'exclude' => array(
246 'parallax',
247 'attachment',
248 'videoUrl',
249 'videoScale',
250 ),
251 'inline' => true,
252 'small' => true,
253 'default' => array(
254 'color' => array(
255 'hex' => '#29b5a8',
256 ),
257 ),
258 );
259 $this->controls['label_active_typography'] = array(
260 'tab' => 'content',
261 'group' => 'label_settings',
262 'label' => esc_html__( 'Label Active Typography', 'bricksable' ),
263 'type' => 'typography',
264 'css' => array(
265 array(
266 'property' => 'typography',
267 'selector' => '.ba-content-toggle-item.active .ba-content-label-title',
268 ),
269 ),
270 'default' => array(
271 'color' => array(
272 'hex' => '#ffffff',
273 ),
274 ),
275 'rerender' => true,
276 'inline' => true,
277 );
278 $this->controls['label_typography'] = array(
279 'tab' => 'content',
280 'group' => 'label_settings',
281 'label' => esc_html__( 'Label Typography', 'bricksable' ),
282 'type' => 'typography',
283 'css' => array(
284 array(
285 'property' => 'typography',
286 'selector' => '.ba-content-toggle-item .ba-content-label-title',
287 ),
288 ),
289 'inline' => true,
290 'rerender' => true,
291 );
292 $this->controls['label_padding'] = array(
293 'tab' => 'content',
294 'group' => 'label_settings',
295 'label' => esc_html__( 'Label Padding', 'bricksable' ),
296 'type' => 'dimensions',
297 'css' => array(
298 array(
299 'property' => 'padding',
300 'selector' => '.ba-content-toggle-item',
301 ),
302 ),
303 'default' => array(
304 'top' => 7,
305 'right' => 15,
306 'bottom' => 7,
307 'left' => 15,
308 ),
309 );
310
311 // Content Settings.
312 $this->controls['content_animationSeparator'] = array(
313 'type' => 'separator',
314 'tab' => 'content',
315 'group' => 'content_settings',
316 'label' => esc_html__( 'Animation', 'bricksable' ),
317 );
318
319 $this->controls['content_animation'] = array(
320 'tab' => 'content',
321 'group' => 'content_settings',
322 'label' => esc_html__( 'Entry animation', 'bricksable' ),
323 'type' => 'select',
324 'searchable' => true,
325 'options' => array(
326 'bounce' => esc_html__( 'bounce', 'bricksable' ),
327 'flash' => esc_html__( 'flash', 'bricksable' ),
328 'pulse' => esc_html__( 'pulse', 'bricksable' ),
329 'rubberBand' => esc_html__( 'rubberBand', 'bricksable' ),
330 'shake' => esc_html__( 'shake', 'bricksable' ),
331 'swing' => esc_html__( 'swing', 'bricksable' ),
332 'tada' => esc_html__( 'tada', 'bricksable' ),
333 'wobble' => esc_html__( 'wobble', 'bricksable' ),
334 'jello' => esc_html__( 'jello', 'bricksable' ),
335 'bounceIn' => esc_html__( 'bounceIn', 'bricksable' ),
336 'bounceInDown' => esc_html__( 'bounceInDown', 'bricksable' ),
337 'bounceInLeft' => esc_html__( 'bounceInLeft', 'bricksable' ),
338 'bounceInRight' => esc_html__( 'bounceInRight', 'bricksable' ),
339 'bounceInUp' => esc_html__( 'bounceInUp', 'bricksable' ),
340 'fadeIn' => esc_html__( 'fadeIn', 'bricksable' ),
341 'fadeInDown' => esc_html__( 'fadeInDown', 'bricksable' ),
342 'fadeInDownBig' => esc_html__( 'fadeInDownBig', 'bricksable' ),
343 'fadeInLeft' => esc_html__( 'fadeInLeft', 'bricksable' ),
344 'fadeInLeftBig' => esc_html__( 'fadeInLeftBig', 'bricksable' ),
345 'fadeInRight' => esc_html__( 'fadeInRight', 'bricksable' ),
346 'fadeInRightBig' => esc_html__( 'fadeInRightBig', 'bricksable' ),
347 'fadeInUp' => esc_html__( 'fadeInUp', 'bricksable' ),
348 'fadeInUpBig' => esc_html__( 'fadeInUpBig', 'bricksable' ),
349 'flip' => esc_html__( 'flip', 'bricksable' ),
350 'flipInX' => esc_html__( 'flipInX', 'bricksable' ),
351 'flipInY' => esc_html__( 'flipInY', 'bricksable' ),
352 'lightSpeedIn' => esc_html__( 'lightSpeedIn', 'bricksable' ),
353 'rotateIn' => esc_html__( 'rotateIn', 'bricksable' ),
354 'rotateInDownLeft' => esc_html__( 'rotateInDownLeft', 'bricksable' ),
355 'rotateInDownRight' => esc_html__( 'rotateInDownRight', 'bricksable' ),
356 'rotateInUpLeft' => esc_html__( 'rotateInUpLeft', 'bricksable' ),
357 'rotateInUpRight' => esc_html__( 'rotateInUpRight', 'bricksable' ),
358 'slideInUp' => esc_html__( 'slideInUp', 'bricksable' ),
359 'slideInDown' => esc_html__( 'slideInDown', 'bricksable' ),
360 'slideInLeft' => esc_html__( 'slideInLeft', 'bricksable' ),
361 'slideInRight' => esc_html__( 'slideInRight', 'bricksable' ),
362 'zoomIn' => esc_html__( 'zoomIn', 'bricksable' ),
363 'zoomInDown' => esc_html__( 'zoomInDown', 'bricksable' ),
364 'zoomInLeft' => esc_html__( 'zoomInLeft', 'bricksable' ),
365 'zoomInRight' => esc_html__( 'zoomInRight', 'bricksable' ),
366 'zoomInUp' => esc_html__( 'zoomInUp', 'bricksable' ),
367 'jackInTheBox' => esc_html__( 'jackInTheBox', 'bricksable' ),
368 'rollIn' => esc_html__( 'rollIn', 'bricksable' ),
369 ),
370 'inline' => true,
371 'default' => 'fadeIn',
372 'placeholder' => esc_html__( 'fadeIn', 'bricksable' ),
373 );
374
375 $this->controls['content_animationDuration'] = array(
376 'tab' => 'content',
377 'group' => 'content_settings',
378 'label' => esc_html__( 'Animation duration', 'bricksable' ),
379 'type' => 'select',
380 'searchable' => true,
381 'options' => array(
382 'very-slow' => esc_html__( 'Very slow', 'bricksable' ),
383 'slow' => esc_html__( 'Slow', 'bricksable' ),
384 'normal' => esc_html__( 'Normal', 'bricksable' ),
385 'fast' => esc_html__( 'Fast', 'bricksable' ),
386 'very-fast' => esc_html__( 'Very fast', 'bricksable' ),
387 'custom' => esc_html__( 'Custom', 'bricksable' ),
388 ),
389 'inline' => true,
390 'placeholder' => esc_html__( 'Normal', 'bricksable' ) . ' (1s)',
391 'required' => array( 'content_animation', '!=', '' ),
392 );
393
394 $this->controls['content_animationDurationCustom'] = array(
395 'tab' => 'content',
396 'group' => 'content_settings',
397 'label' => esc_html__( 'Animation duration', 'bricksable' ) . ' (' . esc_html__( 'Custom', 'bricksable' ) . ')',
398 'type' => 'text',
399 'css' => array(
400 array(
401 'property' => 'animation-duration',
402 'selector' => '.ba-content-toggle-tab-item',
403 ),
404 ),
405 'description' => esc_html__( 'For example: "1s" or "500ms"', 'bricksable' ),
406 'inline' => true,
407 'required' => array( 'content_animationDuration', '=', 'custom' ),
408 );
409
410 $this->controls['content_animationDelay'] = array(
411 'tab' => 'content',
412 'group' => 'content_settings',
413 'label' => esc_html__( 'Animation delay', 'bricksable' ),
414 'type' => 'text',
415 'css' => array(
416 array(
417 'property' => 'animation-delay',
418 'selector' => '.ba-content-toggle-tab-item',
419 ),
420 ),
421 'inline' => true,
422 'description' => esc_html__( 'For example: "1s" or "500ms" or "-2.5s"', 'bricksable' ),
423 'placeholder' => 0,
424 'required' => array( 'content_animation', '!=', '' ),
425 );
426 }
427
428 public function enqueue_scripts() {
429 wp_enqueue_script( 'ba-content-toggle' );
430 }
431
432 public function render() {
433 $settings = $this->settings;
434
435 $wrapper_classes = array(
436 'ba-content-toggle-wrapper',
437 );
438
439 $this->set_attribute( 'wrapper', 'div' );
440 $this->set_attribute( 'wrapper', 'class', $wrapper_classes );
441
442 // Render.
443 //phpcs:ignore
444 $output = '<' . $this->render_attributes( 'wrapper' ) . '>';
445
446 $toggle_style = isset( $settings['toggle_style'] ) ? $settings['toggle_style'] : 'animated';
447
448 $label_classes = array(
449 'ba-content-toggle-switcher',
450 'ba-content-toggle-style-' . $settings['toggle_style'],
451 );
452
453 $this->set_attribute( 'label-wrapper', 'div' );
454 $this->set_attribute( 'label-wrapper', 'class', $label_classes );
455
456 $output .= '<' . $this->render_attributes( 'label-wrapper' ) . '>';
457
458 foreach ( $settings['content_toggle_item'] as $index => $item ) {
459 $content_toggle_item_classes = array(
460 'ba-content-toggle-item',
461 );
462 if ( 0 === $index ) {
463 $content_toggle_item_classes[] = 'active';
464 $content_toggle_item_aria = 'true';
465 } else {
466 $content_toggle_item_aria = 'false';
467 }
468
469 $this->set_attribute( "content-toggle-item-$index", 'div' );
470 $this->set_attribute( "content-toggle-item-$index", 'aria-hidden', $content_toggle_item_aria );
471 $this->set_attribute( "content-toggle-item-$index", 'class', $content_toggle_item_classes );
472
473 $content_toggle_label_title_classes = array(
474 'ba-content-label-title',
475 );
476
477 $this->set_attribute( "content-toggle-label-title-$index", 'span' );
478 $this->set_attribute( "content-toggle-label-title-$index", 'class', $content_toggle_label_title_classes );
479
480 // Label.
481 if ( isset( $item['label'] ) ) {
482 $output .= '<' . $this->render_attributes( "content-toggle-item-$index" ) . '><' . $this->render_attributes( "content-toggle-label-title-$index" ) . '>' . $item['label'] . '</span></div>';
483 }
484 }
485 // Slider.
486 if ( 'animated' === $settings['toggle_style'] ) {
487 $output .= '<div class="ba-content-toggle-slider"></div>';
488 }
489
490 $output .= '</div>';
491 $output .= '</div>';
492
493 // Content.
494 $content_wrapper_classes = array(
495 'ba-content-toggle-tab',
496 );
497
498 $this->set_attribute( 'content-wrapper', 'div' );
499 $this->set_attribute( 'content-wrapper', 'class', $content_wrapper_classes );
500
501 $output .= '<' . $this->render_attributes( 'content-wrapper' ) . '>';
502 foreach ( $settings['content_toggle_item'] as $index => $item ) {
503 $content_toggle_tab_classes = array(
504 'ba-content-toggle-tab-item',
505 isset( $settings['content_animationDuration'] ) && '' !== $settings['content_animationDuration'] ? 'animation-duration-' . $settings['content_animationDuration'] : '',
506 );
507
508 if ( 0 === $index ) {
509 $content_toggle_tab_classes[] = 'show-content';
510 $content_toggle_tab_aria = 'true';
511 } else {
512 $content_toggle_tab_aria = 'false';
513 }
514
515 $this->set_attribute( "content-toggle-tab-$index", 'div' );
516 $this->set_attribute( "content-toggle-tab-$index", 'class', $content_toggle_tab_classes );
517 $this->set_attribute( "content-toggle-tab-$index", 'aria-hidden', $content_toggle_tab_aria );
518 if ( isset( $settings['content_animation'] ) && '' !== $settings['content_animation'] ) {
519 $this->set_attribute( "content-toggle-tab-$index", 'data-animation', $settings['content_animation'] );
520 }
521
522 $output .= '<' . $this->render_attributes( "content-toggle-tab-$index" ) . '>';
523
524 // Template.
525 if ( isset( $item['content_type'] ) && 'templates' === $item['content_type'] ) {
526
527 $template_id = ! empty( $item['content_template'] ) ? intval( $item['content_template'] ) : false;
528 if ( ! $template_id ) {
529 return $this->render_element_placeholder(
530 array(
531 'title' => esc_html__( 'No template selected.', 'bricksable' ),
532 )
533 );
534 }
535
536 $output .= do_shortcode( '[bricks_template id="' . $template_id . '" ]' );
537 } else {
538 if ( isset( $item['content'] ) ) {
539 $output .= $item['content'];
540 }
541 }
542
543 $output .= '</div>';
544 }
545
546 $output .= '</div>';
547
548 //phpcs:ignore
549 echo $output;
550
551 }
552 }
553