Passed
Push — master ( db8e1f...bd5de3 )
by Stiofan
06:53 queued 01:25
created

WP_Super_Duper::output_title()   D

Complexity

Conditions 19

Size

Total Lines 42
Code Lines 28

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 19
eloc 28
nop 2
dl 0
loc 42
rs 4.5166
c 0
b 0
f 0

How to fix   Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
if ( ! defined( 'ABSPATH' ) ) {
3
	exit;
4
}
5
6
if ( ! class_exists( 'WP_Super_Duper' ) ) {
7
8
	define( 'SUPER_DUPER_VER', '1.2.4' );
9
10
	/**
11
	 * A Class to be able to create a Widget, Shortcode or Block to be able to output content for WordPress.
12
	 *
13
	 * Should not be called direct but extended instead.
14
	 *
15
	 * Class WP_Super_Duper
16
	 * @since 1.0.16 change log moved to file change-log.txt - CHANGED
17
	 * @ver 1.1.1
18
	 */
19
	class WP_Super_Duper extends WP_Widget {
20
21
		public $version = SUPER_DUPER_VER;
22
		public $font_awesome_icon_version = "5.11.2";
23
		public $block_code;
24
		public $options;
25
		public $base_id;
26
		public $settings_hash;
27
		public $arguments = array();
28
		public $instance = array();
29
		private $class_name;
30
31
		/**
32
		 * The relative url to the current folder.
33
		 *
34
		 * @var string
35
		 */
36
		public $url = '';
37
38
		/**
39
		 * Take the array options and use them to build.
40
		 */
41
		public function __construct( $options ) {
42
			global $sd_widgets;
43
44
			$sd_widgets[ $options['base_id'] ] = array(
45
				'name'       => $options['name'],
46
				'class_name' => $options['class_name'],
47
				'output_types' => !empty($options['output_types']) ? $options['output_types'] : array()
48
			);
49
			$this->base_id                     = $options['base_id'];
50
			// lets filter the options before we do anything
51
			$options       = apply_filters( "wp_super_duper_options", $options );
52
			$options       = apply_filters( "wp_super_duper_options_{$this->base_id}", $options );
53
			$options       = $this->add_name_from_key( $options );
54
			$this->options = $options;
55
56
			$this->base_id   = $options['base_id'];
57
			$this->arguments = isset( $options['arguments'] ) ? $options['arguments'] : array();
58
59
			// nested blocks can't work as a widget
60
			if(!empty($this->options['nested-block'])){
61
				if(empty($this->options['output_types'])){
62
					$this->options['output_types'] = array('shortcode','block');
63
				}elseif (($key = array_search('widget', $this->options['output_types'])) !== false) {
64
					unset($this->options['output_types'][$key]);
65
				}
66
			}
67
68
			// init parent
69
			if(empty($this->options['output_types']) || in_array('widget',$this->options['output_types'])){
70
				parent::__construct( $options['base_id'], $options['name'], $options['widget_ops'] );
71
			}
72
73
74
			if ( isset( $options['class_name'] ) ) {
75
				// register widget
76
				$this->class_name = $options['class_name'];
77
78
				// register shortcode, this needs to be done even for blocks and widgets
79
				$this->register_shortcode();
80
81
82
				// Fusion Builder (avada) support
83
				if ( function_exists( 'fusion_builder_map' ) ) {
84
					add_action( 'init', array( $this, 'register_fusion_element' ) );
85
				}
86
87
				// register block
88
				if(empty($this->options['output_types']) || in_array('block',$this->options['output_types'])){
89
					add_action( 'admin_enqueue_scripts', array( $this, 'register_block' ) );
90
				}
91
			}
92
93
			// add the CSS and JS we need ONCE
94
			global $sd_widget_scripts;
95
96
			if ( ! $sd_widget_scripts ) {
97
				wp_add_inline_script( 'admin-widgets', $this->widget_js() );
98
				wp_add_inline_script( 'customize-controls', $this->widget_js() );
99
				wp_add_inline_style( 'widgets', $this->widget_css() );
100
101
				// maybe add elementor editor styles
102
				add_action( 'elementor/editor/after_enqueue_styles', array( $this, 'elementor_editor_styles' ) );
103
104
				$sd_widget_scripts = true;
105
106
				// add shortcode insert button once
107
				add_action( 'media_buttons', array( $this, 'shortcode_insert_button' ) );
108
				// generatepress theme sections compatibility
109
				if ( function_exists( 'generate_sections_sections_metabox' ) ) {
110
					add_action( 'generate_sections_metabox', array( $this, 'shortcode_insert_button_script' ) );
111
				}
112
				/* Load script on Divi theme builder page */
113
				if ( function_exists( 'et_builder_is_tb_admin_screen' ) && et_builder_is_tb_admin_screen() ) {
114
					add_thickbox();
115
					add_action( 'admin_footer', array( $this, 'shortcode_insert_button_script' ) );
116
				}
117
118
				if ( $this->is_preview() ) {
119
					add_action( 'wp_footer', array( $this, 'shortcode_insert_button_script' ) );
120
					// this makes the insert button work for elementor
121
					add_action( 'elementor/editor/after_enqueue_scripts', array(
122
						$this,
123
						'shortcode_insert_button_script'
124
					) ); // for elementor
125
				}
126
				// this makes the insert button work for cornerstone
127
				add_action( 'wp_print_footer_scripts', array( __CLASS__, 'maybe_cornerstone_builder' ) );
128
129
				add_action( 'wp_ajax_super_duper_get_widget_settings', array( __CLASS__, 'get_widget_settings' ) );
130
				add_action( 'wp_ajax_super_duper_get_picker', array( __CLASS__, 'get_picker' ) );
131
132
				// add generator text to head
133
				add_action( 'admin_head', array( $this, 'generator' ), 99 );
134
				add_action( 'wp_head', array( $this, 'generator' ), 99 );
135
			}
136
137
			do_action( 'wp_super_duper_widget_init', $options, $this );
138
		}
139
140
		/**
141
		 * The register widget function
142
		 * @return void
143
		 */
144
		public function _register() {
145
			if(empty($this->options['output_types']) || in_array('widget',$this->options['output_types'])){
146
				parent::_register();
147
			}
148
		}
149
150
		/**
151
		 * Add our widget CSS to elementor editor.
152
		 */
153
		public function elementor_editor_styles() {
154
			wp_add_inline_style( 'elementor-editor', $this->widget_css( false ) );
155
		}
156
157
		public function register_fusion_element() {
158
159
			$options = $this->options;
160
161
			if ( $this->base_id ) {
162
163
				$params = $this->get_fusion_params();
164
165
				$args = array(
166
					'name'            => $options['name'],
167
					'shortcode'       => $this->base_id,
168
					'icon'            => $options['block-icon'] ? $options['block-icon'] : 'far fa-square',
169
					'allow_generator' => true,
170
				);
171
172
				if ( ! empty( $params ) ) {
173
					$args['params'] = $params;
174
				}
175
176
				fusion_builder_map( $args );
0 ignored issues
show
Bug introduced by
The function fusion_builder_map was not found. Maybe you did not declare it correctly or list all dependencies? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

176
				/** @scrutinizer ignore-call */ 
177
    fusion_builder_map( $args );
Loading history...
177
			}
178
179
		}
180
181
		public function get_fusion_params() {
182
			$params    = array();
183
			$arguments = $this->get_arguments();
184
185
			if ( ! empty( $arguments ) ) {
186
				foreach ( $arguments as $key => $val ) {
187
					$param = array();
188
					// type
189
					$param['type'] = str_replace(
190
						array(
191
							"text",
192
							"number",
193
							"email",
194
							"color",
195
							"checkbox"
196
						),
197
						array(
198
							"textfield",
199
							"textfield",
200
							"textfield",
201
							"colorpicker",
202
							"select",
203
204
						),
205
						$val['type'] );
206
207
					// multiselect
208
					if ( $val['type'] == 'multiselect' || ( ( $param['type'] == 'select' || $val['type'] == 'select' ) && ! empty( $val['multiple'] ) ) ) {
209
						$param['type']     = 'multiple_select';
210
						$param['multiple'] = true;
211
					}
212
213
					// heading
214
					$param['heading'] = isset( $val['title'] ) ? $val['title'] : '';
215
216
					// description
217
					$param['description'] = isset( $val['desc'] ) ? $val['desc'] : '';
218
219
					// param_name
220
					$param['param_name'] = $key;
221
222
					// Default
223
					$param['default'] = isset( $val['default'] ) ? $val['default'] : '';
224
225
					// Group
226
					if ( isset( $val['group'] ) ) {
227
						$param['group'] = $val['group'];
228
					}
229
230
					// value
231
					if ( $val['type'] == 'checkbox' ) {
232
						if ( isset( $val['default'] ) && $val['default'] == '0' ) {
233
							unset( $param['default'] );
234
						}
235
						$param['value'] = array( '0' => __( "No", 'ayecode-connect' ), '1' => __( "Yes", 'ayecode-connect' ) );
236
					} elseif ( $param['type'] == 'select' || $param['type'] == 'multiple_select' ) {
237
						$param['value'] = isset( $val['options'] ) ? $val['options'] : array();
238
					} else {
239
						$param['value'] = isset( $val['default'] ) ? $val['default'] : '';
240
					}
241
242
					// setup the param
243
					$params[] = $param;
244
245
				}
246
			}
247
248
249
			return $params;
250
		}
251
252
		/**
253
		 * Maybe insert the shortcode inserter button in the footer if we are in the cornerstone builder
254
		 */
255
		public static function maybe_cornerstone_builder() {
256
			if ( did_action( 'cornerstone_before_boot_app' ) ) {
257
				self::shortcode_insert_button_script();
258
			}
259
		}
260
261
		/**
262
		 * A function to ge the shortcode builder picker html.
263
		 *
264
		 * @param string $editor_id
265
		 *
266
		 * @return string
267
		 */
268
		public static function get_picker( $editor_id = '' ) {
269
270
			ob_start();
271
			if ( isset( $_POST['editor_id'] ) ) {
272
				$editor_id = esc_attr( $_POST['editor_id'] );
273
			} elseif ( isset( $_REQUEST['et_fb'] ) ) {
274
				$editor_id = 'main_content_content_vb_tiny_mce';
275
			}
276
277
			global $sd_widgets;
278
279
//			print_r($sd_widgets);exit;
280
			?>
281
282
			<div class="sd-shortcode-left-wrap">
283
				<?php
284
				ksort( $sd_widgets );
285
				//				print_r($sd_widgets);exit;
286
				if ( ! empty( $sd_widgets ) ) {
287
					echo '<select class="widefat" onchange="sd_get_shortcode_options(this);">';
288
					echo "<option>" . __( 'Select shortcode', 'ayecode-connect' ) . "</option>";
289
					foreach ( $sd_widgets as $shortcode => $class ) {
290
						if(!empty($class['output_types']) && !in_array('shortcode', $class['output_types'])){ continue; }
291
						echo "<option value='" . esc_attr( $shortcode ) . "'>" . esc_attr( $shortcode ) . " (" . esc_attr( $class['name'] ) . ")</option>";
292
					}
293
					echo "</select>";
294
295
				}
296
				?>
297
				<div class="sd-shortcode-settings"></div>
298
299
			</div>
300
301
			<div class="sd-shortcode-right-wrap">
302
				<textarea id='sd-shortcode-output' disabled></textarea>
303
				<div id='sd-shortcode-output-actions'>
304
					<?php if ( $editor_id != '' ) { ?>
305
						<button class="button sd-insert-shortcode-button"
306
								onclick="sd_insert_shortcode(<?php if ( ! empty( $editor_id ) ) {
307
									echo "'" . $editor_id . "'";
308
								} ?>)"><?php _e( 'Insert shortcode', 'ayecode-connect' ); ?></button>
309
					<?php } ?>
310
					<button class="button"
311
							onclick="sd_copy_to_clipboard()"><?php _e( 'Copy shortcode' ); ?></button>
312
				</div>
313
			</div>
314
			<?php
315
316
			$html = ob_get_clean();
317
318
			if ( wp_doing_ajax() ) {
319
				echo $html;
320
				$should_die = true;
321
322
				// some builder get the editor via ajax so we should not die on those occasions
323
				$dont_die = array(
324
					'parent_tag',// WP Bakery
325
					'avia_request' // enfold
326
				);
327
328
				foreach ( $dont_die as $request ) {
329
					if ( isset( $_REQUEST[ $request ] ) ) {
330
						$should_die = false;
331
					}
332
				}
333
334
				if ( $should_die ) {
335
					wp_die();
336
				}
337
338
			} else {
339
				return $html;
340
			}
341
342
			return '';
343
344
		}
345
346
		/**
347
		 * Output the version in the header.
348
		 */
349
		public function generator() {
350
			$file = str_replace( array( "/", "\\" ), "/", realpath( __FILE__ ) );
351
			$plugins_dir = str_replace( array( "/", "\\" ), "/", realpath( WP_PLUGIN_DIR ) );
352
353
			// Find source plugin/theme of SD
354
			$source = array();
355
			if ( strpos( $file, $plugins_dir ) !== false ) {
356
				$source = explode( "/", plugin_basename( $file ) );
357
			} else if ( function_exists( 'get_theme_root' ) ) {
358
				$themes_dir = str_replace( array( "/", "\\" ), "/", realpath( get_theme_root() ) );
359
360
				if ( strpos( $file, $themes_dir ) !== false ) {
361
					$source = explode( "/", ltrim( str_replace( $themes_dir, "", $file ), "/" ) );
362
				}
363
			}
364
365
			echo '<meta name="generator" content="WP Super Duper v' . esc_attr( $this->version ) . '"' . ( ! empty( $source[0] ) ? ' data-sd-source="' . esc_attr( $source[0] ) . '"' : '' ) . ' />';
366
		}
367
368
		/**
369
		 * Get widget settings.
370
		 *
371
		 * @since 1.0.0
372
		 */
373
		public static function get_widget_settings() {
374
			global $sd_widgets;
375
376
			$shortcode = isset( $_REQUEST['shortcode'] ) && $_REQUEST['shortcode'] ? sanitize_title_with_dashes( $_REQUEST['shortcode'] ) : '';
377
			if ( ! $shortcode ) {
378
				wp_die();
379
			}
380
			$widget_args = isset( $sd_widgets[ $shortcode ] ) ? $sd_widgets[ $shortcode ] : '';
381
			if ( ! $widget_args ) {
382
				wp_die();
383
			}
384
			$class_name = isset( $widget_args['class_name'] ) && $widget_args['class_name'] ? $widget_args['class_name'] : '';
385
			if ( ! $class_name ) {
386
				wp_die();
387
			}
388
389
			// invoke an instance method
390
			$widget = new $class_name;
391
392
			ob_start();
393
			$widget->form( array() );
394
			$form = ob_get_clean();
395
			echo "<form id='$shortcode'>" . $form . "<div class=\"widget-control-save\"></div></form>";
396
			echo "<style>" . $widget->widget_css() . "</style>";
397
			echo "<script>" . $widget->widget_js() . "</script>";
398
			?>
399
			<?php
400
			wp_die();
401
		}
402
403
		/**
404
		 * Insert shortcode builder button to classic editor (not inside Gutenberg, not needed).
405
		 *
406
		 * @param string $editor_id Optional. Shortcode editor id. Default null.
407
		 * @param string $insert_shortcode_function Optional. Insert shortcode function. Default null.
408
		 *
409
		 *@since 1.0.0
410
		 *
411
		 */
412
		public static function shortcode_insert_button( $editor_id = '', $insert_shortcode_function = '' ) {
413
			global $sd_widgets, $shortcode_insert_button_once;
414
			if ( $shortcode_insert_button_once ) {
415
				return;
416
			}
417
			add_thickbox();
418
419
420
			/**
421
			 * Cornerstone makes us play dirty tricks :/
422
			 * All media_buttons are removed via JS unless they are two specific id's so we wrap our content in this ID so it is not removed.
423
			 */
424
			if ( function_exists( 'cornerstone_plugin_init' ) && ! is_admin() ) {
425
				echo '<span id="insert-media-button">';
426
			}
427
428
			echo self::shortcode_button( 'this', 'true' );
429
430
			// see opening note
431
			if ( function_exists( 'cornerstone_plugin_init' ) && ! is_admin() ) {
432
				echo '</span>'; // end #insert-media-button
433
			}
434
435
			// Add separate script for generatepress theme sections
436
			if ( function_exists( 'generate_sections_sections_metabox' ) && did_action( 'generate_sections_metabox' ) ) {
437
			} else {
438
				self::shortcode_insert_button_script( $editor_id, $insert_shortcode_function );
439
			}
440
441
			$shortcode_insert_button_once = true;
442
		}
443
444
		/**
445
		 * Gets the shortcode insert button html.
446
		 *
447
		 * @param string $id
448
		 * @param string $search_for_id
449
		 *
450
		 * @return mixed
451
		 */
452
		public static function shortcode_button( $id = '', $search_for_id = '' ) {
453
			ob_start();
454
			?>
455
			<span class="sd-lable-shortcode-inserter">
456
				<a onclick="sd_ajax_get_picker(<?php echo $id;
457
				if ( $search_for_id ) {
458
					echo "," . $search_for_id;
459
				} ?>);" href="#TB_inline?width=100%&height=550&inlineId=super-duper-content-ajaxed"
460
				   class="thickbox button super-duper-content-open" title="Add Shortcode">
461
					<span style="vertical-align: middle;line-height: 18px;font-size: 20px;"
462
						  class="dashicons dashicons-screenoptions"></span>
463
				</a>
464
				<div id="super-duper-content-ajaxed" style="display:none;">
465
					<span>Loading</span>
466
				</div>
467
			</span>
468
469
			<?php
470
			$html = ob_get_clean();
471
472
			// remove line breaks so we can use it in js
473
			return preg_replace( "/\r|\n/", "", trim( $html ) );
474
		}
475
476
		/**
477
		 * Makes SD work with the siteOrigin page builder.
478
		 *
479
		 * @return mixed
480
		 *@since 1.0.6
481
		 */
482
		public static function siteorigin_js() {
483
			ob_start();
484
			?>
485
			<script>
486
				/**
487
				 * Check a form to see what items should be shown or hidden.
488
				 */
489
				function sd_so_show_hide(form) {
490
					jQuery(form).find(".sd-argument").each(function () {
491
492
						var $element_require = jQuery(this).data('element_require');
493
494
						if ($element_require) {
495
496
							$element_require = $element_require.replace("&#039;", "'"); // replace single quotes
497
							$element_require = $element_require.replace("&quot;", '"'); // replace double quotes
498
499
							if (eval($element_require)) {
500
								jQuery(this).removeClass('sd-require-hide');
501
							} else {
502
								jQuery(this).addClass('sd-require-hide');
503
							}
504
						}
505
					});
506
				}
507
508
				/**
509
				 * Toggle advanced settings visibility.
510
				 */
511
				function sd_so_toggle_advanced($this) {
512
					var form = jQuery($this).parents('form,.form,.so-content');
513
					form.find('.sd-advanced-setting').toggleClass('sd-adv-show');
514
					return false;// prevent form submit
515
				}
516
517
				/**
518
				 * Initialise a individual widget.
519
				 */
520
				function sd_so_init_widget($this, $selector) {
521
					if (!$selector) {
522
						$selector = 'form';
523
					}
524
					// only run once.
525
					if (jQuery($this).data('sd-widget-enabled')) {
526
						return;
527
					} else {
528
						jQuery($this).data('sd-widget-enabled', true);
529
					}
530
531
					var $button = '<button title="<?php _e( 'Advanced Settings', 'ayecode-connect' );?>" class="button button-primary right sd-advanced-button" onclick="sd_so_toggle_advanced(this);return false;"><i class="fas fa-sliders-h" aria-hidden="true"></i></button>';
532
					var form = jQuery($this).parents('' + $selector + '');
533
534
					if (jQuery($this).val() == '1' && jQuery(form).find('.sd-advanced-button').length == 0) {
535
						jQuery(form).append($button);
536
					}
537
538
					// show hide on form change
539
					jQuery(form).on("change", function () {
540
						sd_so_show_hide(form);
541
					});
542
543
					// show hide on load
544
					sd_so_show_hide(form);
545
				}
546
547
				jQuery(function () {
548
					jQuery(document).on('open_dialog', function (w, e) {
549
						setTimeout(function () {
550
							if (jQuery('.so-panels-dialog-wrapper:visible .so-content.panel-dialog .sd-show-advanced').length) {
551
								if (jQuery('.so-panels-dialog-wrapper:visible .so-content.panel-dialog .sd-show-advanced').val() == '1') {
552
									sd_so_init_widget('.so-panels-dialog-wrapper:visible .so-content.panel-dialog .sd-show-advanced', 'div');
553
								}
554
							}
555
						}, 200);
556
					});
557
				});
558
			</script>
559
			<?php
560
			$output = ob_get_clean();
561
562
			/*
563
			 * We only add the <script> tags for code highlighting, so we strip them from the output.
564
			 */
565
566
			return str_replace( array(
567
				'<script>',
568
				'</script>'
569
			), '', $output );
570
		}
571
572
		/**
573
		 * Output the JS and CSS for the shortcode insert button.
574
		 *
575
		 * @param string $editor_id
576
		 * @param string $insert_shortcode_function
577
		 *
578
		 *@since 1.0.6
579
		 *
580
		 */
581
		public static function shortcode_insert_button_script( $editor_id = '', $insert_shortcode_function = '' ) {
582
			?>
583
			<style>
584
				.sd-shortcode-left-wrap {
585
					float: left;
586
					width: 60%;
587
				}
588
589
				.sd-shortcode-left-wrap .gd-help-tip {
590
					float: none;
591
				}
592
593
				.sd-shortcode-left-wrap .widefat {
594
					border-spacing: 0;
595
					width: 100%;
596
					clear: both;
597
					margin: 0;
598
					border: 1px solid #ddd;
599
					box-shadow: inset 0 1px 2px rgba(0, 0, 0, .07);
600
					background-color: #fff;
601
					color: #32373c;
602
					outline: 0;
603
					transition: 50ms border-color ease-in-out;
604
					padding: 3px 5px;
605
				}
606
607
				.sd-shortcode-left-wrap input[type=checkbox].widefat {
608
					border: 1px solid #b4b9be;
609
					background: #fff;
610
					color: #555;
611
					clear: none;
612
					cursor: pointer;
613
					display: inline-block;
614
					line-height: 0;
615
					height: 16px;
616
					margin: -4px 4px 0 0;
617
					margin-top: 0;
618
					outline: 0;
619
					padding: 0 !important;
620
					text-align: center;
621
					vertical-align: middle;
622
					width: 16px;
623
					min-width: 16px;
624
					-webkit-appearance: none;
625
					box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);
626
					transition: .05s border-color ease-in-out;
627
				}
628
629
				.sd-shortcode-left-wrap input[type=checkbox]:checked:before {
630
					content: "\f147";
631
					margin: -3px 0 0 -4px;
632
					color: #1e8cbe;
633
					float: left;
634
					display: inline-block;
635
					vertical-align: middle;
636
					width: 16px;
637
					font: normal 21px/1 dashicons;
638
					speak: none;
639
					-webkit-font-smoothing: antialiased;
640
					-moz-osx-font-smoothing: grayscale;
641
				}
642
643
				#sd-shortcode-output-actions button,
644
				.sd-advanced-button {
645
					color: #555;
646
					border-color: #ccc;
647
					background: #f7f7f7;
648
					box-shadow: 0 1px 0 #ccc;
649
					vertical-align: top;
650
					display: inline-block;
651
					text-decoration: none;
652
					font-size: 13px;
653
					line-height: 26px;
654
					height: 28px;
655
					margin: 0;
656
					padding: 0 10px 1px;
657
					cursor: pointer;
658
					border-width: 1px;
659
					border-style: solid;
660
					-webkit-appearance: none;
661
					border-radius: 3px;
662
					white-space: nowrap;
663
					box-sizing: border-box;
664
				}
665
666
				button.sd-advanced-button {
667
					background: #0073aa;
668
					border-color: #006799;
669
					box-shadow: inset 0 2px 0 #006799;
670
					vertical-align: top;
671
					color: #fff;
672
					text-decoration: none;
673
					text-shadow: 0 -1px 1px #006799, 1px 0 1px #006799, 0 1px 1px #006799, -1px 0 1px #006799;
674
					float: right;
675
					margin-right: 3px !important;
676
					font-size: 20px !important;
677
				}
678
679
				.sd-shortcode-right-wrap {
680
					float: right;
681
					width: 35%;
682
				}
683
684
				#sd-shortcode-output {
685
					background: rgba(255, 255, 255, .5);
686
					border-color: rgba(222, 222, 222, .75);
687
					box-shadow: inset 0 1px 2px rgba(0, 0, 0, .04);
688
					color: rgba(51, 51, 51, .5);
689
					overflow: auto;
690
					padding: 2px 6px;
691
					line-height: 1.4;
692
					resize: vertical;
693
				}
694
695
				#sd-shortcode-output {
696
					height: 250px;
697
					width: 100%;
698
				}
699
700
				<?php if ( function_exists( 'generate_sections_sections_metabox' ) ) { ?>
701
				.generate-sections-modal #custom-media-buttons > .sd-lable-shortcode-inserter {
702
					display: inline;
703
				}
704
				<?php } ?>
705
				<?php if ( function_exists( 'et_builder_is_tb_admin_screen' ) && et_builder_is_tb_admin_screen() ) { ?>
706
				body.divi_page_et_theme_builder div#TB_window.gd-tb-window{z-index:9999999}
707
				<?php } ?>
708
			</style>
709
			<?php
710
			if ( class_exists( 'SiteOrigin_Panels' ) ) {
711
				echo "<script>" . self::siteorigin_js() . "</script>";
712
			}
713
			?>
714
			<script>
715
				<?php
716
				if(! empty( $insert_shortcode_function )){
717
					echo $insert_shortcode_function;
718
				}else{
719
720
				/**
721
				 * Function for super duper insert shortcode.
722
				 *
723
				 * @since 1.0.0
724
				 */
725
				?>
726
				function sd_insert_shortcode($editor_id) {
727
					$shortcode = jQuery('#TB_ajaxContent #sd-shortcode-output').val();
728
					if ($shortcode) {
729
						if (!$editor_id) {
730
							<?php
731
							if ( isset( $_REQUEST['et_fb'] ) ) {
732
								echo '$editor_id = "#main_content_content_vb_tiny_mce";';
733
							} elseif ( isset( $_REQUEST['action'] ) && $_REQUEST['action'] == 'elementor' ) {
734
								echo '$editor_id = "#elementor-controls .wp-editor-container textarea";';
735
							} else {
736
								echo '$editor_id = "#wp-content-editor-container textarea";';
737
							}
738
							?>
739
						} else {
740
							$editor_id = '#' + $editor_id;
741
						}
742
						tmceActive = jQuery($editor_id).attr("aria-hidden") == "true" ? true : false;
743
						/* GeneratePress */
744
						if (jQuery('#generate-sections-modal-dialog ' + $editor_id).length) {
745
							$editor_id = '#generate-sections-modal-dialog ' + $editor_id;
746
							tmceActive = jQuery($editor_id).closest('.wp-editor-wrap').hasClass('tmce-active') ? true : false;
747
						}
748
						if (typeof tinyMCE !== 'undefined' && tinyMCE.activeEditor && tmceActive) {
749
							tinyMCE.execCommand('mceInsertContent', false, $shortcode);
750
						} else {
751
							var $txt = jQuery($editor_id);
752
							var caretPos = $txt[0].selectionStart;
753
							var textAreaTxt = $txt.val();
754
							var txtToAdd = $shortcode;
755
							var textareaValue = textAreaTxt.substring(0, caretPos) + txtToAdd + textAreaTxt.substring(caretPos);
756
							$txt.focus().val(textareaValue).change().keydown().blur().keyup().keypress().trigger('input').trigger('change');
757
758
							// set Divi react input value
759
							var input = document.getElementById("main_content_content_vb_tiny_mce");
760
							if (input) {
761
								sd_setNativeValue(input, textareaValue);
762
							}
763
764
						}
765
						tb_remove();
766
					}
767
				}
768
769
				/*
770
				 Set the value of elements controlled via react.
771
				 */
772
				function sd_setNativeValue(element, value) {
773
					let lastValue = element.value;
774
					element.value = value;
775
					let event = new Event("input", {target: element, bubbles: true});
776
					// React 15
777
					event.simulated = true;
778
					// React 16
779
					let tracker = element._valueTracker;
780
					if (tracker) {
781
						tracker.setValue(lastValue);
782
					}
783
					element.dispatchEvent(event);
784
				}
785
				<?php }?>
786
787
				/*
788
				 Copies the shortcode to the clipboard.
789
				 */
790
				function sd_copy_to_clipboard() {
791
					/* Get the text field */
792
					var copyText = document.querySelector("#TB_ajaxContent #sd-shortcode-output");
793
					//un-disable the field
794
					copyText.disabled = false;
795
					/* Select the text field */
796
					copyText.select();
797
					/* Copy the text inside the text field */
798
					document.execCommand("Copy");
799
					//re-disable the field
800
					copyText.disabled = true;
801
					/* Alert the copied text */
802
					alert("Copied the text: " + copyText.value);
803
				}
804
805
				/*
806
				 Gets the shortcode options.
807
				 */
808
				function sd_get_shortcode_options($this) {
809
					$short_code = jQuery($this).val();
810
					if ($short_code) {
811
						var data = {
812
							'action': 'super_duper_get_widget_settings',
813
							'shortcode': $short_code,
814
							'attributes': 123,
815
							'post_id': 321,
816
							'_ajax_nonce': '<?php echo wp_create_nonce( 'super_duper_output_shortcode' );?>'
817
						};
818
819
						if (typeof ajaxurl === 'undefined') {
820
							var ajaxurl = "<?php echo admin_url( 'admin-ajax.php' );?>";
821
						}
822
823
						jQuery.post(ajaxurl, data, function (response) {
824
							jQuery('#TB_ajaxContent .sd-shortcode-settings').html(response);
825
826
							jQuery('#' + $short_code).on('change', 'select', function () {
827
								sd_build_shortcode($short_code);
828
							}); // take care of select tags
829
830
							jQuery('#' + $short_code).on('change keypress keyup', 'input,textarea', function () {
831
								sd_build_shortcode($short_code);
832
							});
833
834
							sd_build_shortcode($short_code);
835
836
							// resize the window to fit
837
							setTimeout(function () {
838
								jQuery('#TB_ajaxContent').css('width', 'auto').css('height', '75vh');
839
							}, 200);
840
841
							return response;
842
						});
843
					}
844
				}
845
846
				/*
847
				 Builds and inserts the shortcode into the viewer.
848
				 */
849
				function sd_build_shortcode($id) {
850
					var multiSelects = {};
851
					var multiSelectsRemove = [];
852
853
					$output = "[" + $id;
854
855
					$form_data = jQuery("#" + $id).serializeArray();
856
857
					// run checks for multiselects
858
					jQuery.each($form_data, function (index, element) {
859
						if (element && element.value) {
860
							$field_name = element.name.substr(element.name.indexOf("][") + 2);
861
							$field_name = $field_name.replace("]", "");
862
							// check if its a multiple
863
							if ($field_name.includes("[]")) {
864
								multiSelectsRemove[multiSelectsRemove.length] = index;
865
								$field_name = $field_name.replace("[]", "");
866
								if ($field_name in multiSelects) {
867
									multiSelects[$field_name] = multiSelects[$field_name] + "," + element.value;
868
								} else {
869
									multiSelects[$field_name] = element.value;
870
								}
871
							}
872
						}
873
					});
874
875
					// fix multiselects if any are found
876
					if (multiSelectsRemove.length) {
877
878
						// remove all multiselects
879
						multiSelectsRemove.reverse();
880
						multiSelectsRemove.forEach(function (index) {
881
							$form_data.splice(index, 1);
882
						});
883
884
						$ms_arr = [];
885
						// add multiselets back
886
						jQuery.each(multiSelects, function (index, value) {
887
							$ms_arr[$ms_arr.length] = {"name": "[][" + index + "]", "value": value};
888
						});
889
						$form_data = $form_data.concat($ms_arr);
890
					}
891
892
					if ($form_data) {
893
						$content = '';
894
						$form_data.forEach(function (element) {
895
							if (element.value) {
896
								$field_name = element.name.substr(element.name.indexOf("][") + 2);
897
								$field_name = $field_name.replace("]", "");
898
								if ($field_name == 'html') {
899
									$content = element.value;
900
								} else {
901
									$output = $output + " " + $field_name + '="' + element.value + '"';
902
								}
903
							}
904
						});
905
					}
906
					$output = $output + "]";
907
908
					// check for content field
909
					if ($content) {
910
						$output = $output + $content + "[/" + $id + "]";
911
					}
912
913
					jQuery('#TB_ajaxContent #sd-shortcode-output').html($output);
914
				}
915
916
				/*
917
				 Delay the init of the textareas for 1 second.
918
				 */
919
				(function () {
920
					setTimeout(function () {
921
						sd_init_textareas();
922
					}, 1000);
923
				})();
924
925
				/*
926
				 Init the textareas to be able to show the shortcode builder button.
927
				 */
928
				function sd_init_textareas() {
929
					// General textareas
930
					jQuery(document).on('focus', 'textarea', function () {
931
						if (jQuery(this).hasClass('wp-editor-area')) {
932
							// insert the shortcode button to the textarea lable if not there already
933
							if (!(jQuery(this).parent().find('.sd-lable-shortcode-inserter').length || (jQuery(this).closest('.wp-editor-wrap').length && jQuery(this).closest('.wp-editor-wrap').find('.sd-lable-shortcode-inserter').length))) {
934
								jQuery(this).parent().find('.quicktags-toolbar').append(sd_shortcode_button(jQuery(this).attr('id')));
935
							}
936
						} else {
937
							// insert the shortcode button to the textarea lable if not there already
938
							if (!jQuery("label[for='" + jQuery(this).attr('id') + "']").find('.sd-lable-shortcode-inserter').length) {
939
								jQuery("label[for='" + jQuery(this).attr('id') + "']").append(sd_shortcode_button(jQuery(this).attr('id')));
940
							}
941
						}
942
					});
943
944
					// The below tries to add the shortcode builder button to the builders own raw/shortcode sections.
945
946
					// DIVI
947
					jQuery(document).on('focusin', '.et-fb-codemirror', function () {
948
						// insert the shortcode button to the textarea lable if not there already
949
						if (!jQuery(this).closest('.et-fb-form__group').find('.sd-lable-shortcode-inserter').length) {
950
							jQuery(this).closest('.et-fb-form__group').find('.et-fb-form__label-text').append(sd_shortcode_button());
951
						}
952
					});
953
954
					// Beaver
955
					jQuery(document).on('focusin', '.fl-code-field', function () {
956
						// insert the shortcode button to the textarea lable if not there already
957
						if (!jQuery(this).closest('.fl-field-control-wrapper').find('.sd-lable-shortcode-inserter').length) {
958
							jQuery(this).closest('.fl-field-control-wrapper').prepend(sd_shortcode_button());
959
						}
960
					});
961
962
					// Fusion builder (avada)
963
					jQuery(document).on('focusin', '.CodeMirror.cm-s-default', function () {
964
						// insert the shortcode button to the textarea lable if not there already
965
						if (!jQuery(this).parent().find('.sd-lable-shortcode-inserter').length) {
966
							jQuery(sd_shortcode_button()).insertBefore(this);
967
						}
968
					});
969
970
					// Avia builder (enfold)
971
					jQuery(document).on('focusin', '#aviaTBcontent', function () {
972
						// insert the shortcode button to the textarea lable if not there already
973
						if (!jQuery(this).parent().parent().find('.avia-name-description ').find('.sd-lable-shortcode-inserter').length) {
974
							jQuery(this).parent().parent().find('.avia-name-description strong').append(sd_shortcode_button(jQuery(this).attr('id')));
975
						}
976
					});
977
978
					// Cornerstone textareas
979
					jQuery(document).on('focusin', '.cs-control.cs-control-textarea', function () {
980
						// insert the shortcode button to the textarea lable if not there already
981
						if (!jQuery(this).find('.cs-control-header label').find('.sd-lable-shortcode-inserter').length) {
982
							jQuery(this).find('.cs-control-header label').append(sd_shortcode_button());
983
						}
984
					});
985
986
					// Cornerstone main bar
987
					setTimeout(function () {
988
						// insert the shortcode button to the textarea lable if not there already
989
						if (!jQuery('.cs-bar-btns').find('.sd-lable-shortcode-inserter').length) {
990
							jQuery('<li style="text-align: center;padding: 5px;list-style: none;">' + sd_shortcode_button() + '</li>').insertBefore('.cs-action-toggle-custom-css');
991
						}
992
					}, 2000);
993
994
995
					// WP Bakery, code editor does not render shortcodes.
996
//					jQuery(document).on('focusin', '.wpb-textarea_raw_html', function () {
997
//						// insert the shortcode button to the textarea lable if not there already
998
//						if(!jQuery(this).parent().parent().find('.wpb_element_label').find('.sd-lable-shortcode-inserter').length){
999
//							jQuery(this).parent().parent().find('.wpb_element_label').append(sd_shortcode_button());
1000
//						}
1001
//					});
1002
				}
1003
1004
				/**
1005
				 * Gets the html for the picker via ajax and updates it on the fly.
1006
				 *
1007
				 * @param $id
1008
				 * @param $search
1009
				 */
1010
				function sd_ajax_get_picker($id, $search) {
1011
					if ($search) {
1012
						$this = $id;
1013
						$id = jQuery($this).closest('.wp-editor-wrap').find('.wp-editor-container textarea').attr('id');
1014
					}
1015
1016
					var data = {
1017
						'action': 'super_duper_get_picker',
1018
						'editor_id': $id,
1019
						'_ajax_nonce': '<?php echo wp_create_nonce( 'super_duper_picker' );?>'
1020
					};
1021
1022
					if (!ajaxurl) {
1023
						var ajaxurl = "<?php echo admin_url( 'admin-ajax.php' ); ?>";
1024
					}
1025
1026
					jQuery.post(ajaxurl, data, function (response) {
1027
						jQuery('#TB_ajaxContent').closest('#TB_window').addClass('gd-tb-window');
1028
						jQuery('#TB_ajaxContent').html(response);
1029
						//return response;
1030
					}).then(function (env) {
1031
						jQuery('body').on('thickbox:removed', function () {
1032
							jQuery('#super-duper-content-ajaxed').html('');
1033
						});
1034
					});
1035
				}
1036
1037
				/**
1038
				 * Get the html for the shortcode inserter button depending on if a textarea id is available.
1039
				 *
1040
				 * @param $id string The textarea id.
1041
				 * @returns {string}
1042
				 */
1043
				function sd_shortcode_button($id) {
1044
					if ($id) {
1045
						return '<?php echo self::shortcode_button( "\\''+\$id+'\\'" );?>';
1046
					} else {
1047
						return '<?php echo self::shortcode_button();?>';
1048
					}
1049
				}
1050
			</script>
1051
			<?php
1052
		}
1053
1054
		/**
1055
		 * Gets some CSS for the widgets screen.
1056
		 *
1057
		 * @param bool $advanced If we should include advanced CSS.
1058
		 *
1059
		 * @return mixed
1060
		 */
1061
		public function widget_css( $advanced = true ) {
1062
			ob_start();
1063
			?>
1064
			<style>
1065
				<?php if( $advanced ){ ?>
1066
				.sd-advanced-setting {
1067
					display: none;
1068
				}
1069
1070
				.sd-advanced-setting.sd-adv-show {
1071
					display: block;
1072
				}
1073
1074
				.sd-argument.sd-require-hide,
1075
				.sd-advanced-setting.sd-require-hide {
1076
					display: none;
1077
				}
1078
1079
				button.sd-advanced-button {
1080
					margin-right: 3px !important;
1081
					font-size: 20px !important;
1082
				}
1083
1084
				<?php } ?>
1085
1086
				button.sd-toggle-group-button {
1087
					background-color: #f3f3f3;
1088
					color: #23282d;
1089
					cursor: pointer;
1090
					padding: 10px;
1091
					width: 100%;
1092
					border: none;
1093
					text-align: left;
1094
					outline: none;
1095
					font-size: 13px;
1096
					font-weight: bold;
1097
					margin-bottom: 1px;
1098
				}
1099
				.elementor-control .sd-argument select[multiple]{height:100px}
1100
				.elementor-control .sd-argument select[multiple] option{padding:3px}
1101
			</style>
1102
			<?php
1103
			$output = ob_get_clean();
1104
1105
			/*
1106
			 * We only add the <script> tags for code highlighting, so we strip them from the output.
1107
			 */
1108
1109
			return str_replace( array(
1110
				'<style>',
1111
				'</style>'
1112
			), '', $output );
1113
		}
1114
1115
		/**
1116
		 * Gets some JS for the widgets screen.
1117
		 *
1118
		 * @return mixed
1119
		 */
1120
		public function widget_js() {
1121
			ob_start();
1122
			?>
1123
			<script>
1124
1125
				/**
1126
				 * Toggle advanced settings visibility.
1127
				 */
1128
				function sd_toggle_advanced($this) {
1129
					var form = jQuery($this).parents('form,.form');
1130
					form.find('.sd-advanced-setting').toggleClass('sd-adv-show');
1131
					return false;// prevent form submit
1132
				}
1133
1134
				/**
1135
				 * Check a form to see what items should be shown or hidden.
1136
				 */
1137
				function sd_show_hide(form) {
1138
					jQuery(form).find(".sd-argument").each(function () {
1139
1140
						var $element_require = jQuery(this).data('element_require');
1141
1142
						if ($element_require) {
1143
1144
							$element_require = $element_require.replace("&#039;", "'"); // replace single quotes
1145
							$element_require = $element_require.replace("&quot;", '"'); // replace double quotes
1146
1147
							if (eval($element_require)) {
1148
								jQuery(this).removeClass('sd-require-hide');
1149
							} else {
1150
								jQuery(this).addClass('sd-require-hide');
1151
							}
1152
						}
1153
					});
1154
				}
1155
1156
				/**
1157
				 * Initialise widgets from the widgets screen.
1158
				 */
1159
				function sd_init_widgets($selector) {
1160
					jQuery(".sd-show-advanced").each(function (index) {
1161
						sd_init_widget(this, $selector);
1162
					});
1163
				}
1164
1165
				/**
1166
				 * Initialise a individual widget.
1167
				 */
1168
				function sd_init_widget($this, $selector, $form) {
1169
					if (!$selector) {
1170
						$selector = 'form';
1171
					}
1172
					// Only run once.
1173
					if (jQuery($this).data('sd-widget-enabled')) {
1174
						return;
1175
					} else {
1176
						jQuery($this).data('sd-widget-enabled', true);
1177
					}
1178
1179
					var $button = '<button title="<?php _e( 'Advanced Settings', 'ayecode-connect' );?>" style="line-height: 28px;" class="button button-primary right sd-advanced-button" onclick="sd_toggle_advanced(this);return false;"><span class="dashicons dashicons-admin-settings" style="width: 28px;font-size: 28px;"></span></button>';
1180
					var form = $form ? $form : jQuery($this).parents('' + $selector + '');
1181
1182
					if (jQuery($this).val() == '1' && jQuery(form).find('.sd-advanced-button').length == 0) {
1183
						console.log('add advanced button');
1184
						if (jQuery(form).find('.widget-control-save').length > 0) {
1185
							jQuery(form).find('.widget-control-save').after($button);
1186
						} else {
1187
							jQuery(form).find('.sd-show-advanced').after($button);
1188
						}
1189
					} else {
1190
						console.log('no advanced button, ' + jQuery($this).val() + ', ' + jQuery(form).find('.sd-advanced-button').length);
1191
					}
1192
1193
					/* Show hide on form change */
1194
					jQuery(form).on("change", function() {
1195
						sd_show_hide(form);
1196
					});
1197
1198
					/* Show hide on load */
1199
					sd_show_hide(form);
1200
				}
1201
1202
				/**
1203
				 * Init a customizer widget.
1204
				 */
1205
				function sd_init_customizer_widget(section) {
1206
					if (section.expanded) {
1207
						section.expanded.bind(function (isExpanding) {
1208
							if (isExpanding) {
1209
								// is it a SD widget?
1210
								if (jQuery(section.container).find('.sd-show-advanced').length) {
1211
									// init the widget
1212
									sd_init_widget(jQuery(section.container).find('.sd-show-advanced'), ".form");
1213
								}
1214
							}
1215
						});
1216
					}
1217
				}
1218
1219
				/**
1220
				 * If on widgets screen.
1221
				 */
1222
				jQuery(function () {
1223
					// if not in customizer.
1224
					if (!wp.customize) {
1225
						sd_init_widgets("form");
1226
					}
1227
1228
					/* Init on widget added */
1229
					jQuery(document).on('widget-added', function (e, widget) {
1230
						/* Is it a SD widget? */
1231
						if (jQuery(widget).find('.sd-show-advanced').length) {
1232
							var widgetId = jQuery(widget).find('[name="widget-id"]').length ? ': ' + jQuery(widget).find('[name="widget-id"]').val() : '';
1233
							console.log('widget added' + widgetId);
1234
							/* Init the widget */
1235
							sd_init_widget(jQuery(widget).find('.sd-show-advanced'), "form", jQuery(widget).find('.sd-show-advanced').closest('form'));
1236
						}
1237
					});
1238
1239
					/* Init on widget updated */
1240
					jQuery(document).on('widget-updated', function (e, widget) {
1241
						/* Is it a SD widget? */
1242
						if (jQuery(widget).find('.sd-show-advanced').length) {
1243
							var widgetId = jQuery(widget).find('[name="widget-id"]').length ? ': ' + jQuery(widget).find('[name="widget-id"]').val() : '';
1244
							console.log('widget updated' + widgetId);
1245
							/* Init the widget */
1246
							sd_init_widget(jQuery(widget).find('.sd-show-advanced'), "form", jQuery(widget).find('.sd-show-advanced').closest('form'));
1247
						}
1248
					});
1249
				});
1250
1251
				/**
1252
				 * We need to run this before jQuery is ready
1253
				 */
1254
				if (wp.customize) {
1255
					wp.customize.bind('ready', function () {
1256
1257
						// init widgets on load
1258
						wp.customize.control.each(function (section) {
1259
							sd_init_customizer_widget(section);
1260
						});
1261
1262
						// init widgets on add
1263
						wp.customize.control.bind('add', function (section) {
1264
							sd_init_customizer_widget(section);
1265
						});
1266
1267
					});
1268
1269
				}
1270
				<?php do_action( 'wp_super_duper_widget_js', $this ); ?>
1271
			</script>
1272
			<?php
1273
			$output = ob_get_clean();
1274
1275
			/*
1276
			 * We only add the <script> tags for code highlighting, so we strip them from the output.
1277
			 */
1278
1279
			return str_replace( array(
1280
				'<script>',
1281
				'</script>'
1282
			), '', $output );
1283
		}
1284
1285
1286
		/**
1287
		 * Set the name from the argument key.
1288
		 *
1289
		 * @param $options
1290
		 *
1291
		 * @return mixed
1292
		 */
1293
		private function add_name_from_key( $options, $arguments = false ) {
1294
			if ( ! empty( $options['arguments'] ) ) {
1295
				foreach ( $options['arguments'] as $key => $val ) {
1296
					$options['arguments'][ $key ]['name'] = $key;
1297
				}
1298
			} elseif ( $arguments && is_array( $options ) && ! empty( $options ) ) {
1299
				foreach ( $options as $key => $val ) {
1300
					$options[ $key ]['name'] = $key;
1301
				}
1302
			}
1303
1304
			return $options;
1305
		}
1306
1307
		/**
1308
		 * Register the parent shortcode.
1309
		 *
1310
		 * @since 1.0.0
1311
		 */
1312
		public function register_shortcode() {
1313
			add_shortcode( $this->base_id, array( $this, 'shortcode_output' ) );
1314
			add_action( 'wp_ajax_super_duper_output_shortcode', array( $this, 'render_shortcode' ) );
1315
		}
1316
1317
		/**
1318
		 * Render the shortcode via ajax so we can return it to Gutenberg.
1319
		 *
1320
		 * @since 1.0.0
1321
		 */
1322
		public function render_shortcode() {
1323
			check_ajax_referer( 'super_duper_output_shortcode', '_ajax_nonce', true );
1324
			if ( ! current_user_can( 'manage_options' ) ) {
1325
				wp_die();
1326
			}
1327
1328
			// we might need the $post value here so lets set it.
1329
			if ( isset( $_POST['post_id'] ) && $_POST['post_id'] ) {
1330
				$post_obj = get_post( absint( $_POST['post_id'] ) );
1331
				if ( ! empty( $post_obj ) && empty( $post ) ) {
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $post seems to never exist and therefore empty should always be true.
Loading history...
1332
					global $post;
1333
					$post = $post_obj;
1334
				}
1335
			}
1336
1337
			if ( isset( $_POST['shortcode'] ) && $_POST['shortcode'] ) {
1338
				$is_preview = $this->is_preview();
1339
				$shortcode_name   = sanitize_title_with_dashes( $_POST['shortcode'] );
1340
				$attributes_array = isset( $_POST['attributes'] ) && $_POST['attributes'] ? $_POST['attributes'] : array();
1341
				$attributes       = '';
1342
				if ( ! empty( $attributes_array ) ) {
1343
					foreach ( $attributes_array as $key => $value ) {
1344
						if ( is_array( $value ) ) {
1345
							$value = implode( ",", $value );
1346
						}
1347
1348
						if ( ! empty( $value ) ) {
1349
							$value = wp_unslash( $value );
1350
1351
							// Encode [ and ].
1352
							if ( $is_preview ) {
1353
								$value = $this->encode_shortcodes( $value );
1354
							}
1355
						}
1356
						$attributes .= " " . esc_attr( sanitize_title_with_dashes( $key ) ) . "='" . esc_attr( $value ) . "' ";
1357
					}
1358
				}
1359
1360
				$shortcode = "[" . esc_attr( $shortcode_name ) . " " . $attributes . "]";
1361
1362
				$content = do_shortcode( $shortcode );
1363
1364
				// Decode [ and ].
1365
				if ( ! empty( $content ) && $is_preview ) {
1366
					$content = $this->decode_shortcodes( $content );
1367
				}
1368
1369
				echo $content;
1370
			}
1371
			wp_die();
1372
		}
1373
1374
		/**
1375
		 * Output the shortcode.
1376
		 *
1377
		 * @param array $args
1378
		 * @param string $content
1379
		 *
1380
		 * @return string
1381
		 */
1382
		public function shortcode_output( $args = array(), $content = '' ) {
1383
			$_instance = $args;
1384
1385
			$args = $this->argument_values( $args );
1386
1387
			// add extra argument so we know its a output to gutenberg
1388
			//$args
1389
			$args = $this->string_to_bool( $args );
1390
1391
			// if we have a enclosed shortcode we add it to the special `html` argument
1392
			if ( ! empty( $content ) ) {
1393
				$args['html'] = $content;
1394
			}
1395
1396
			if ( ! $this->is_preview() ) {
1397
				/**
1398
				 * Filters the settings for a particular widget args.
1399
				 *
1400
				 * @param array          $args      The current widget instance's settings.
1401
				 * @param WP_Super_Duper $widget    The current widget settings.
1402
				 * @param array          $_instance An array of default widget arguments.
1403
				 *
1404
				 *@since 1.0.28
1405
				 *
1406
				 */
1407
				$args = apply_filters( 'wp_super_duper_widget_display_callback', $args, $this, $_instance );
1408
1409
				if ( ! is_array( $args ) ) {
1410
					return $args;
1411
				}
1412
			}
1413
1414
			$class = isset( $this->options['widget_ops']['classname'] ) ? esc_attr( $this->options['widget_ops']['classname'] ) : '';
1415
			$class .= " sdel-".$this->get_instance_hash();
1416
1417
			$class = apply_filters( 'wp_super_duper_div_classname', $class, $args, $this );
1418
			$class = apply_filters( 'wp_super_duper_div_classname_' . $this->base_id, $class, $args, $this );
1419
1420
			$attrs = apply_filters( 'wp_super_duper_div_attrs', '', $args, $this );
0 ignored issues
show
Unused Code introduced by
The assignment to $attrs is dead and can be removed.
Loading history...
1421
			$attrs = apply_filters( 'wp_super_duper_div_attrs_' . $this->base_id, '', $args, $this );
1422
1423
			$shortcode_args = array();
1424
			$output         = '';
1425
			$no_wrap        = isset( $this->options['no_wrap'] ) && $this->options['no_wrap'] ? true : false;
1426
			if ( isset( $args['no_wrap'] ) && $args['no_wrap'] ) {
1427
				$no_wrap = true;
1428
			}
1429
			$main_content = $this->output( $args, $shortcode_args, $content );
0 ignored issues
show
Bug introduced by
Are you sure the assignment to $main_content is correct as $this->output($args, $shortcode_args, $content) targeting WP_Super_Duper::output() seems to always return null.

This check looks for function or method calls that always return null and whose return value is assigned to a variable.

class A
{
    function getObject()
    {
        return null;
    }

}

$a = new A();
$object = $a->getObject();

The method getObject() can return nothing but null, so it makes no sense to assign that value to a variable.

The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes.

Loading history...
1430
			if ( $main_content && ! $no_wrap ) {
0 ignored issues
show
introduced by
$main_content is defined implicitly as null, thus it is always evaluated to false.
Loading history...
1431
				// wrap the shortcode in a div with the same class as the widget
1432
				$output .= '<div class="' . $class . '" ' . $attrs . '>';
1433
				if ( ! empty( $args['title'] ) ) {
1434
					// if its a shortcode and there is a title try to grab the title wrappers
1435
					$shortcode_args = array( 'before_title' => '', 'after_title' => '' );
1436
					if ( empty( $instance ) ) {
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $instance does not exist. Did you maybe mean $_instance?
Loading history...
1437
						global $wp_registered_sidebars;
1438
						if ( ! empty( $wp_registered_sidebars ) ) {
1439
							foreach ( $wp_registered_sidebars as $sidebar ) {
1440
								if ( ! empty( $sidebar['before_title'] ) ) {
1441
									$shortcode_args['before_title'] = $sidebar['before_title'];
1442
									$shortcode_args['after_title']  = $sidebar['after_title'];
1443
									break;
1444
								}
1445
							}
1446
						}
1447
					}
1448
					$output .= $this->output_title( $shortcode_args, $args );
1449
				}
1450
				$output .= $main_content;
1451
				$output .= '</div>';
1452
			} elseif ( $main_content && $no_wrap ) {
0 ignored issues
show
introduced by
$main_content is defined implicitly as null, thus it is always evaluated to false.
Loading history...
1453
				$output .= $main_content;
1454
			}
1455
1456
			// if preview show a placeholder if empty
1457
			if ( $this->is_preview() && $output == '' ) {
1458
				$output = $this->preview_placeholder_text( "{{" . $this->base_id . "}}" );
1459
			}
1460
1461
			return apply_filters( 'wp_super_duper_widget_output', $output, $args, $shortcode_args, $this );
1462
		}
1463
1464
		/**
1465
		 * Placeholder text to show if output is empty and we are on a preview/builder page.
1466
		 *
1467
		 * @param string $name
1468
		 *
1469
		 * @return string
1470
		 */
1471
		public function preview_placeholder_text( $name = '' ) {
1472
			return "<div style='background:#0185ba33;padding: 10px;border: 4px #ccc dashed;'>" . wp_sprintf( __( 'Placeholder for: %s', 'ayecode-connect' ), $name ) . "</div>";
1473
		}
1474
1475
		/**
1476
		 * Sometimes booleans values can be turned to strings, so we fix that.
1477
		 *
1478
		 * @param $options
1479
		 *
1480
		 * @return mixed
1481
		 */
1482
		public function string_to_bool( $options ) {
1483
			// convert bool strings to booleans
1484
			foreach ( $options as $key => $val ) {
1485
				if ( $val == 'false' ) {
1486
					$options[ $key ] = false;
1487
				} elseif ( $val == 'true' ) {
1488
					$options[ $key ] = true;
1489
				}
1490
			}
1491
1492
			return $options;
1493
		}
1494
1495
		/**
1496
		 * Get the argument values that are also filterable.
1497
		 *
1498
		 * @param $instance
1499
		 *
1500
		 * @return array
1501
		 *@since 1.0.12 Don't set checkbox default value if the value is empty.
1502
		 *
1503
		 */
1504
		public function argument_values( $instance ) {
1505
			$argument_values = array();
1506
1507
			// set widget instance
1508
			$this->instance = $instance;
1509
1510
			if ( empty( $this->arguments ) ) {
1511
				$this->arguments = $this->get_arguments();
1512
			}
1513
1514
			if ( ! empty( $this->arguments ) ) {
1515
				foreach ( $this->arguments as $key => $args ) {
1516
					// set the input name from the key
1517
					$args['name'] = $key;
1518
					//
1519
					$argument_values[ $key ] = isset( $instance[ $key ] ) ? $instance[ $key ] : '';
1520
					if ( $args['type'] == 'checkbox' && $argument_values[ $key ] == '' ) {
1521
						// don't set default for an empty checkbox
1522
					} elseif ( $argument_values[ $key ] == '' && isset( $args['default'] ) ) {
1523
						$argument_values[ $key ] = $args['default'];
1524
					}
1525
				}
1526
			}
1527
1528
			return $argument_values;
1529
		}
1530
1531
		/**
1532
		 * Set arguments in super duper.
1533
		 *
1534
		 * @return array Set arguments.
1535
		 *@since 1.0.0
1536
		 *
1537
		 */
1538
		public function set_arguments() {
1539
			return $this->arguments;
1540
		}
1541
1542
		/**
1543
		 * Get arguments in super duper.
1544
		 *
1545
		 * @return array Get arguments.
1546
		 *@since 1.0.0
1547
		 *
1548
		 */
1549
		public function get_arguments() {
1550
			if ( empty( $this->arguments ) ) {
1551
				$this->arguments = $this->set_arguments();
1552
			}
1553
1554
			$this->arguments = apply_filters( 'wp_super_duper_arguments', $this->arguments, $this->options, $this->instance );
1555
			$this->arguments = $this->add_name_from_key( $this->arguments, true );
1556
1557
			return $this->arguments;
1558
		}
1559
1560
		/**
1561
		 * This is the main output class for all 3 items, widget, shortcode and block, it is extended in the calling class.
1562
		 *
1563
		 * @param array $args
1564
		 * @param array $widget_args
1565
		 * @param string $content
1566
		 */
1567
		public function output( $args = array(), $widget_args = array(), $content = '' ) {
0 ignored issues
show
Unused Code introduced by
The parameter $widget_args is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

1567
		public function output( $args = array(), /** @scrutinizer ignore-unused */ $widget_args = array(), $content = '' ) {

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
1568
1569
		}
1570
1571
		/**
1572
		 * Add the dynamic block code inline when the wp-block in enqueued.
1573
		 */
1574
		public function register_block() {
1575
			wp_add_inline_script( 'wp-blocks', $this->block() );
1576
			if ( class_exists( 'SiteOrigin_Panels' ) ) {
1577
				wp_add_inline_script( 'wp-blocks', $this->siteorigin_js() );
1578
			}
1579
		}
1580
1581
		/**
1582
		 * Check if we need to show advanced options.
1583
		 *
1584
		 * @return bool
1585
		 */
1586
		public function block_show_advanced() {
1587
1588
			$show      = false;
1589
			$arguments = $this->get_arguments();
1590
1591
			if ( ! empty( $arguments ) ) {
1592
				foreach ( $arguments as $argument ) {
1593
					if ( isset( $argument['advanced'] ) && $argument['advanced'] ) {
1594
						$show = true;
1595
						break; // no need to continue if we know we have it
1596
					}
1597
				}
1598
			}
1599
1600
			return $show;
1601
		}
1602
1603
		/**
1604
		 * Get the url path to the current folder.
1605
		 *
1606
		 * @return string
1607
		 */
1608
		public function get_url() {
1609
			$url = $this->url;
1610
1611
			if ( ! $url ) {
1612
				$content_dir = wp_normalize_path( untrailingslashit( WP_CONTENT_DIR ) );
1613
				$content_url = untrailingslashit( WP_CONTENT_URL );
1614
1615
				// Replace http:// to https://.
1616
				if ( strpos( $content_url, 'http://' ) === 0 && strpos( plugins_url(), 'https://' ) === 0 ) {
1617
					$content_url = str_replace( 'http://', 'https://', $content_url );
1618
				}
1619
1620
				// Check if we are inside a plugin
1621
				$file_dir = str_replace( "/includes", "", wp_normalize_path( dirname( __FILE__ ) ) );
1622
				$url = str_replace( $content_dir, $content_url, $file_dir );
1623
				$url = trailingslashit( $url );
1624
				$this->url = $url;
1625
			}
1626
1627
			return $url;
1628
		}
1629
1630
		/**
1631
		 * Get the url path to the current folder.
1632
		 *
1633
		 * @return string
1634
		 */
1635
		public function get_url_old() {
1636
1637
			$url = $this->url;
1638
1639
			if ( ! $url ) {
1640
				// check if we are inside a plugin
1641
				$file_dir = str_replace( "/includes", "", dirname( __FILE__ ) );
1642
1643
				$dir_parts = explode( "/wp-content/", $file_dir );
1644
				$url_parts = explode( "/wp-content/", plugins_url() );
1645
1646
				if ( ! empty( $url_parts[0] ) && ! empty( $dir_parts[1] ) ) {
1647
					$url       = trailingslashit( $url_parts[0] . "/wp-content/" . $dir_parts[1] );
1648
					$this->url = $url;
1649
				}
1650
			}
1651
1652
1653
			return $url;
1654
		}
1655
1656
		/**
1657
		 * Generate the block icon.
1658
		 *
1659
		 * Enables the use of Font Awesome icons.
1660
		 *
1661
		 * @note xlink:href is actually deprecated but href is not supported by all so we use both.
1662
		 *
1663
		 * @param $icon
1664
		 *
1665
		 * @return string
1666
		 *@since 1.1.0
1667
		 */
1668
		public function get_block_icon( $icon ) {
1669
1670
			// check if we have a Font Awesome icon
1671
			$fa_type = '';
1672
			if ( substr( $icon, 0, 7 ) === "fas fa-" ) {
1673
				$fa_type = 'solid';
1674
			} elseif ( substr( $icon, 0, 7 ) === "far fa-" ) {
1675
				$fa_type = 'regular';
1676
			} elseif ( substr( $icon, 0, 7 ) === "fab fa-" ) {
1677
				$fa_type = 'brands';
1678
			} else {
1679
				$icon = "'" . $icon . "'";
1680
			}
1681
1682
			// set the icon if we found one
1683
			if ( $fa_type ) {
1684
				$fa_icon = str_replace( array( "fas fa-", "far fa-", "fab fa-" ), "", $icon );
1685
				$icon    = "el('svg',{width: 20, height: 20, viewBox: '0 0 20 20'},el('use', {'xlink:href': '" . $this->get_url() . "icons/" . $fa_type . ".svg#" . $fa_icon . "','href': '" . $this->get_url() . "icons/" . $fa_type . ".svg#" . $fa_icon . "'}))";
1686
			}
1687
1688
			return $icon;
1689
		}
1690
1691
		public function group_arguments( $arguments ) {
1692
			if ( ! empty( $arguments ) ) {
1693
				$temp_arguments = array();
1694
				$general        = __( "General", 'ayecode-connect' );
1695
				$add_sections   = false;
1696
				foreach ( $arguments as $key => $args ) {
1697
					if ( isset( $args['group'] ) ) {
1698
						$temp_arguments[ $args['group'] ][ $key ] = $args;
1699
						$add_sections                             = true;
1700
					} else {
1701
						$temp_arguments[ $general ][ $key ] = $args;
1702
					}
1703
				}
1704
1705
				// only add sections if more than one
1706
				if ( $add_sections ) {
1707
					$arguments = $temp_arguments;
1708
				}
1709
			}
1710
1711
			return $arguments;
1712
		}
1713
1714
		/**
1715
		 * Parse used group tabs.
1716
		 *
1717
		 * @since 1.1.17
1718
		 */
1719
		public function group_block_tabs( $tabs, $arguments ) {
1720
			if ( ! empty( $tabs ) && ! empty( $arguments ) ) {
1721
				$has_sections = false;
1722
1723
				foreach ( $this->arguments as $key => $args ) {
1724
					if ( isset( $args['group'] ) ) {
1725
						$has_sections = true;
1726
						break;
1727
					}
1728
				}
1729
1730
				if ( ! $has_sections ) {
1731
					return $tabs;
1732
				}
1733
1734
				$new_tabs = array();
1735
1736
				foreach ( $tabs as $tab_key => $tab ) {
1737
					$new_groups = array();
1738
1739
					if ( ! empty( $tab['groups'] ) && is_array( $tab['groups'] ) ) {
1740
						foreach ( $tab['groups'] as $group ) {
1741
							if ( isset( $arguments[ $group ] ) ) {
1742
								$new_groups[] = $group;
1743
							}
1744
						}
1745
					}
1746
1747
					if ( ! empty( $new_groups ) ) {
1748
						$tab['groups'] = $new_groups;
1749
1750
						$new_tabs[ $tab_key ] = $tab;
1751
					}
1752
				}
1753
1754
				$tabs = $new_tabs;
1755
			}
1756
1757
			return $tabs;
1758
		}
1759
1760
		/**
1761
		 * Output the JS for building the dynamic Guntenberg block.
1762
		 *
1763
		 * @return mixed
1764
		 *@since 1.0.9 Save numbers as numbers and not strings.
1765
		 * @since 1.1.0 Font Awesome classes can be used for icons.
1766
		 * @since 1.0.4 Added block_wrap property which will set the block wrapping output element ie: div, span, p or empty for no wrap.
1767
		 */
1768
		public function block() {
1769
			global $sd_is_js_functions_loaded, $aui_bs5;
1770
1771
			$show_advanced = $this->block_show_advanced();
1772
1773
			ob_start();
1774
			?>
1775
			<script>
1776
			<?php
1777
			if ( ! $sd_is_js_functions_loaded ) {
1778
				$sd_is_js_functions_loaded = true;
1779
			?>
1780
function sd_show_view_options($this){
1781
	if(jQuery($this).html().length){
1782
		jQuery($this).html('');
1783
	}else{
1784
		jQuery($this).html('<div class="position-absolute d-flex flex-column bg-white p-1 rounded border shadow-lg " style="top:-80px;left:-5px;"><div class="dashicons dashicons-desktop mb-1" onclick="sd_set_view_type(\'Desktop\');"></div><div class="dashicons dashicons-tablet mb-1" onclick="sd_set_view_type(\'Tablet\');"></div><div class="dashicons dashicons-smartphone" onclick="sd_set_view_type(\'Mobile\');"></div></div>');
1785
	}
1786
}
1787
1788
function sd_set_view_type($device){
1789
	wp.data.dispatch('core/edit-site') ? wp.data.dispatch('core/edit-site').__experimentalSetPreviewDeviceType($device) : wp.data.dispatch('core/edit-post').__experimentalSetPreviewDeviceType($device);
1790
}
1791
1792
jQuery(function(){
1793
	sd_block_visibility_init();
1794
});
1795
function sd_block_visibility_init() {
1796
	jQuery(document).off('change', '.bs-vc-modal-form').on('change', '.bs-vc-modal-form', function() {
1797
		try {
1798
			aui_conditional_fields('.bs-vc-modal-form');
1799
		} catch(err) {
1800
			console.log(err.message);
1801
		}
1802
	});
1803
1804
	jQuery(document).off('click', '.bs-vc-save').on('click', '.bs-vc-save', function() {
1805
		var $bsvcModal = jQuery(this).closest('.bs-vc-modal'), $bsvcForm = $bsvcModal.find('.bs-vc-modal-form'), vOutput = jQuery('#bsvc_output', $bsvcForm).val(), rawValue = '', oVal = {}, oOut = {}, iRule = 0;
1806
		jQuery(this).addClass('disabled');
1807
		jQuery('.bs-vc-modal-form .bs-vc-rule-sets .bs-vc-rule').each(function(){
1808
			vRule = jQuery(this).find('.bsvc_rule').val(), oRule = {};
1809
			if (vRule == 'logged_in' || vRule == 'logged_out' || vRule == 'post_author') {
1810
				oRule.type = vRule;
1811
			} else if (vRule == 'user_roles') {
1812
				oRule.type = vRule;
1813
				if (jQuery(this).find('.bsvc_user_roles:checked').length) {
1814
					var user_roles = jQuery(this).find('.bsvc_user_roles:checked').map(function() {
1815
						return jQuery(this).val();
1816
					}).get();
1817
					if (user_roles && user_roles.length) {
1818
						oRule.user_roles = user_roles.join(",");
1819
					}
1820
				}
1821
			} else if (vRule == 'gd_field') {
1822
				if (jQuery(this).find('.bsvc_gd_field ').val() && jQuery(this).find('.bsvc_gd_field_condition').val()) {
1823
					oRule.type = vRule;
1824
					oRule.field = jQuery(this).find('.bsvc_gd_field ').val();
1825
					oRule.condition = jQuery(this).find('.bsvc_gd_field_condition').val();
1826
					if (oRule.condition != 'is_empty' && oRule.condition != 'is_not_empty') {
1827
						oRule.search = jQuery(this).find('.bsvc_gd_field_search').val();
1828
					}
1829
				}
1830
			}
1831
			if (Object.keys(oRule).length > 0) {
1832
				iRule++;
1833
				oVal['rule'+iRule] = oRule;
1834
			}
1835
		});
1836
		if (vOutput == 'hide') {
1837
			oOut.type = vOutput;
1838
		} else if (vOutput == 'message') {
1839
			if (jQuery('#bsvc_message', $bsvcForm).val()) {
1840
				oOut.type = vOutput;
1841
				oOut.message = jQuery('#bsvc_message', $bsvcForm).val();
1842
				if (jQuery('#bsvc_message_type', $bsvcForm).val()) {
1843
					oOut.message_type = jQuery('#bsvc_message_type', $bsvcForm).val();
1844
				}
1845
			}
1846
		} else if (vOutput == 'page') {
1847
			if (jQuery('#bsvc_page', $bsvcForm).val()) {
1848
				oOut.type = vOutput;
1849
				oOut.page = jQuery('#bsvc_page', $bsvcForm).val();
1850
			}
1851
		} else if (vOutput == 'template_part') {
1852
			if (jQuery('#bsvc_tmpl_part', $bsvcForm).val()) {
1853
				oOut.type = vOutput;
1854
				oOut.template_part = jQuery('#bsvc_tmpl_part', $bsvcForm).val();
1855
			}
1856
		}
1857
		if (Object.keys(oOut).length > 0) {
1858
			oVal.output = oOut;
1859
		}
1860
		if (Object.keys(oVal).length > 0) {
1861
			rawValue = JSON.stringify(oVal);
1862
		}
1863
		$bsvcModal.find('[name="bsvc_raw_value"]').val(rawValue).trigger('change');
1864
		$bsvcModal.find('.bs-vc-close').trigger('click');
1865
	});
1866
	jQuery(document).off('click', '.bs-vc-add-rule').on('click', '.bs-vc-add-rule', function() {
1867
		var bsvcTmpl = jQuery('.bs-vc-rule-template').html();
1868
		var c = parseInt(jQuery('.bs-vc-modal-form .bs-vc-rule-sets .bs-vc-rule:last').data('bs-index'));
1869
		if (c > 0) {
1870
			c++;
1871
		} else {
1872
			c = 1;
1873
		}
1874
		bsvcTmpl = bsvcTmpl.replace(/BSVCINDEX/g, c);
1875
		jQuery('.bs-vc-modal-form .bs-vc-rule-sets').append(bsvcTmpl);
1876
		jQuery('.bs-vc-modal-form .bs-vc-rule-sets .bs-vc-rule:last').find('select').each(function(){
1877
			if (!jQuery(this).hasClass('no-select2')) {
1878
				jQuery(this).addClass('aui-select2');
1879
			}
1880
		});
1881
		if (!jQuery(this).hasClass('bs-vc-rendering')) {
1882
			if(typeof aui_init_select2 == 'function') {
1883
				aui_init_select2();
1884
			}
1885
			if(typeof aui_conditional_fields == 'function') {
1886
				aui_conditional_fields('.bs-vc-modal-form');
1887
			}
1888
		}
1889
	});
1890
	jQuery(document).off('click', '.bs-vc-remove-rule').on('click', '.bs-vc-remove-rule', function() {
1891
		jQuery(this).closest('.bs-vc-rule').remove();
1892
	});
1893
}
1894
function sd_block_visibility_render_fields(oValue) {
1895
	if (typeof oValue == 'object' && oValue.rule1 && typeof oValue.rule1 == 'object') {
1896
		for(k = 1; k <= Object.keys(oValue).length; k++) {
1897
			if (oValue['rule' + k] && oValue['rule' + k].type) {
1898
				var oRule = oValue['rule' + k];
1899
				jQuery('.bs-vc-modal-form .bs-vc-add-rule').addClass('bs-vc-rendering').trigger('click');
1900
				var elRule = jQuery('.bs-vc-modal-form .bs-vc-rule-sets .bs-vc-rule:last');
1901
				jQuery('select.bsvc_rule', elRule).val(oRule.type);
1902
				if (oRule.type == 'user_roles' && oRule.user_roles) {
1903
					var user_roles = oRule.user_roles;
1904
					if (typeof user_roles == 'string') {
1905
						user_roles = user_roles.split(",");
1906
					}
1907
					if (user_roles.length) {
1908
						jQuery.each(user_roles, function(i, role){
1909
							elRule.find("input[value='" + role + "']").prop('checked', true);
1910
						});
1911
					}
1912
					jQuery('select.bsvc_user_roles', elRule).val(oRule.user_roles);
1913
				} else if (oRule.type == 'gd_field') {
1914
					if (oRule.field) {
1915
						jQuery('select.bsvc_gd_field', elRule).val(oRule.field);
1916
						if (oRule.condition) {
1917
							jQuery('select.bsvc_gd_field_condition', elRule).val(oRule.condition);
1918
							if (typeof oRule.search != 'undefined' && oRule.condition != 'is_empty' && oRule.condition != 'is_not_empty') {
1919
								jQuery('input.bsvc_gd_field_search', elRule).val(oRule.search);
1920
							}
1921
						}
1922
					}
1923
				}
1924
				jQuery('.bs-vc-modal-form .bs-vc-add-rule').removeClass('bs-vc-rendering');
1925
			}
1926
		}
1927
1928
		if (oValue.output && oValue.output.type) {
1929
			jQuery('.bs-vc-modal-form #bsvc_output').val(oValue.output.type);
1930
			if (oValue.output.type == 'message' && typeof oValue.output.message != 'undefined') {
1931
				jQuery('.bs-vc-modal-form #bsvc_message').val(oValue.output.message);
1932
				if (typeof oValue.output.message_type != 'undefined') {
1933
					jQuery('.bs-vc-modal-form #bsvc_message_type').val(oValue.output.message_type);
1934
				}
1935
			} else if (oValue.output.type == 'page' && typeof oValue.output.page != 'undefined') {
1936
				jQuery('.bs-vc-modal-form #bsvc_page').val(oValue.output.page);
1937
			} else if (oValue.output.type == 'template_part' && typeof oValue.output.template_part != 'undefined') {
1938
				jQuery('.bs-vc-modal-form #bsvc_template_part').val(oValue.output.template_part);
1939
			}
1940
		}
1941
	}
1942
}
1943
/**
1944
 * Try to auto-recover blocks.
1945
 */
1946
function sd_auto_recover_blocks() {
1947
	var recursivelyRecoverInvalidBlockList = blocks => {
1948
		const _blocks = [...blocks]
1949
		let recoveryCalled = false
1950
		const recursivelyRecoverBlocks = willRecoverBlocks => {
1951
			willRecoverBlocks.forEach(_block => {
1952
				if (!_block.isValid) {
1953
					recoveryCalled = true
1954
					const newBlock = recoverBlock(_block)
1955
					for (const key in newBlock) {
1956
						_block[key] = newBlock[key]
1957
					}
1958
				}
1959
				if (_block.innerBlocks.length) {
1960
					recursivelyRecoverBlocks(_block.innerBlocks)
1961
				}
1962
			})
1963
		}
1964
		recursivelyRecoverBlocks(_blocks)
1965
		return [_blocks, recoveryCalled]
1966
	}
1967
	var recoverBlock = ({ name, attributes, innerBlocks }) => wp.blocks.createBlock(name, attributes, innerBlocks);
1968
	var recoverBlocks = blocks => {
1969
		return blocks.map(_block => {
1970
			const block = _block;
1971
			// If the block is a reusable block, recover the Stackable blocks inside it.
1972
			if (_block.name === 'core/block') {
1973
				const { attributes: { ref } } = _block
1974
				const parsedBlocks = wp.blocks.parse(wp.data.select('core').getEntityRecords('postType', 'wp_block', { include: [ref] })?.[0]?.content?.raw) || []
1975
				const [recoveredBlocks, recoveryCalled] = recursivelyRecoverInvalidBlockList(parsedBlocks)
1976
				if (recoveryCalled) {
1977
					console.log('Stackable notice: block ' + block.name + ' (' + block.clientId + ') was auto-recovered, you should not see this after saving your page.');
1978
					return { blocks: recoveredBlocks, isReusable: true, ref }
1979
				}
1980
			} else if (_block.name === 'core/template-part' && _block.attributes && _block.attributes.theme) {
1981
				var tmplPart = wp.data.select('core').getEntityRecord('postType', 'wp_template_part', _block.attributes.theme + '//' + _block.attributes.slug);
1982
				var tmplPartBlocks = block.innerBlocks && block.innerBlocks.length ? block.innerBlocks : wp.blocks.parse(tmplPart?.content?.raw) || [];
1983
				if (tmplPartBlocks && tmplPartBlocks.length && tmplPartBlocks.some(block => !block.isValid)) {
1984
					block.innerBlocks = tmplPartBlocks;
1985
					block.tmplPartId = _block.attributes.theme + '//' + _block.attributes.slug;
1986
				}
1987
			}
1988
			if (block.innerBlocks && block.innerBlocks.length) {
1989
				if (block.tmplPartId) {
1990
					console.log('Template part ' + block.tmplPartId + ' block ' + block.name + ' (' + block.clientId + ') starts');
1991
				}
1992
				const newInnerBlocks = recoverBlocks(block.innerBlocks)
1993
				if (newInnerBlocks.some(block => block.recovered)) {
1994
					block.innerBlocks = newInnerBlocks
1995
					block.replacedClientId = block.clientId
1996
					block.recovered = true
1997
				}
1998
				if (block.tmplPartId) {
1999
					console.log('Template part ' + block.tmplPartId + ' block ' + block.name + ' (' + block.clientId + ') ends');
2000
				}
2001
			}
2002
			if (!block.isValid) {
2003
				const newBlock = recoverBlock(block)
2004
				newBlock.replacedClientId = block.clientId
2005
				newBlock.recovered = true
2006
				console.log('Stackable notice: block ' + block.name + ' (' + block.clientId + ') was auto-recovered, you should not see this after saving your page.');
2007
				return newBlock
2008
			}
2009
			return block
2010
		})
2011
	}
2012
	// Recover all the blocks that we can find.
2013
	var sdBlockEditor = wp.data.select('core/block-editor');
2014
	var mainBlocks = sdBlockEditor ? recoverBlocks(sdBlockEditor.getBlocks()) : null;
2015
	// Replace the recovered blocks with the new ones.
2016
	if (mainBlocks) {
2017
		mainBlocks.forEach(block => {
2018
			if (block.isReusable && block.ref) {
2019
				// Update the reusable blocks.
2020
				wp.data.dispatch('core').editEntityRecord('postType', 'wp_block', block.ref, {
2021
					content: wp.blocks.serialize(block.blocks)
2022
				}).then(() => {
2023
					// But don't save them, let the user do the saving themselves. Our goal is to get rid of the block error visually.
2024
				})
2025
			}
2026
			if (block.recovered && block.replacedClientId) {
2027
				wp.data.dispatch('core/block-editor').replaceBlock(block.replacedClientId, block)
2028
			}
2029
		})
2030
	}
2031
}
2032
2033
/**
2034
 * Try to auto-recover OUR blocks if traditional way fails.
2035
 */
2036
function sd_auto_recover_blocks_fallback(editTmpl) {
2037
	console.log('sd_auto_recover_blocks_fallback()');
2038
	var $bsRecoverBtn = jQuery(".edit-site-visual-editor__editor-canvas").contents().find('div[class*=" wp-block-blockstrap-"] .block-editor-warning__actions  .block-editor-warning__action .components-button.is-primary').not(":contains('Keep as HTML')");
2039
	if ($bsRecoverBtn.length) {
2040
		if(jQuery('.edit-site-layout.is-full-canvas').length || jQuery('.edit-site-layout.is-edit-mode').length){
2041
			$bsRecoverBtn.removeAttr('disabled').trigger('click');
2042
		}
2043
	}
2044
}
2045
2046
<?php if( !isset( $_REQUEST['sd-block-recover-debug'] ) ){ ?>
2047
// Wait will window is loaded before calling.
2048
window.onload = function() {
2049
	sd_auto_recover_blocks();
2050
	// fire a second time incase of load delays.
2051
	setTimeout(function() {
2052
		sd_auto_recover_blocks();
2053
	}, 5000);
2054
2055
	setTimeout(function() {
2056
		sd_auto_recover_blocks_fallback();
2057
	}, 6000);
2058
2059
	setTimeout(function() {
2060
		sd_auto_recover_blocks_fallback();
2061
	}, 10000);
2062
2063
	setTimeout(function() {
2064
		sd_auto_recover_blocks_fallback();
2065
	}, 15000);
2066
2067
	setTimeout(function() {
2068
		sd_auto_recover_blocks_fallback();
2069
	}, 20000);
2070
2071
	setTimeout(function() {
2072
		sd_auto_recover_blocks_fallback();
2073
	}, 30000);
2074
2075
	setTimeout(function() {
2076
		sd_auto_recover_blocks_fallback();
2077
	}, 60000);
2078
2079
	jQuery('.edit-site-page-panels__edit-template-button, .edit-site-visual-editor__editor-canvas').on('click', function() {
2080
		setTimeout(function() {
2081
			sd_auto_recover_blocks_fallback(true);
2082
			jQuery('.edit-site-page-panels__edit-template-button, .edit-site-visual-editor__editor-canvas').addClass('bs-edit-tmpl-clicked');
2083
		}, 100);
2084
	});
2085
};
2086
<?php } ?>
2087
2088
// fire when URL changes also.
2089
let lastUrl = location.href;
2090
new MutationObserver(() => {
2091
	const url = location.href;
2092
	if (url !== lastUrl) {
2093
		lastUrl = url;
2094
		sd_auto_recover_blocks();
2095
		// fire a second time incase of load delays.
2096
		setTimeout(function() {
2097
			sd_auto_recover_blocks();
2098
			sd_auto_recover_blocks_fallback();
2099
		}, 2000);
2100
2101
		setTimeout(function() {
2102
		sd_auto_recover_blocks_fallback();
2103
		}, 10000);
2104
2105
		setTimeout(function() {
2106
		sd_auto_recover_blocks_fallback();
2107
		}, 15000);
2108
2109
		setTimeout(function() {
2110
		sd_auto_recover_blocks_fallback();
2111
		}, 20000);
2112
2113
	}
2114
}).observe(document, {
2115
	subtree: true,
2116
	childList: true
2117
});
2118
2119
2120
			/**
2121
			*
2122
* @param $args
2123
* @returns {*|{}}
2124
*/
2125
			function sd_build_aui_styles($args){
2126
2127
				$styles = {};
2128
				// background color
2129
				if ( $args['bg'] !== undefined && $args['bg'] !== '' ) {
2130
				   if( $args['bg'] == 'custom-color' ){
2131
					   $styles['background-color']=  $args['bg_color'];
2132
				   }else  if( $args['bg'] == 'custom-gradient' ){
2133
					   $styles['background-image']=  $args['bg_gradient'];
2134
2135
						// use background on text
2136
						 if( $args['bg_on_text'] !== undefined && $args['bg_on_text'] ){
2137
							$styles['backgroundClip'] = "text";
2138
							$styles['WebkitBackgroundClip'] = "text";
2139
							$styles['text-fill-color'] = "transparent";
2140
							$styles['WebkitTextFillColor'] = "transparent";
2141
						 }
2142
				   }
2143
2144
				}
2145
2146
				let $bg_image = $args['bg_image'] !== undefined && $args['bg_image'] !== '' ? $args['bg_image'] : '';
2147
2148
				// maybe use featured image.
2149
				if( $args['bg_image_use_featured'] !== undefined && $args['bg_image_use_featured'] ){
2150
					$bg_image = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxzdmcgYmFzZVByb2ZpbGU9InRpbnkiIGhlaWdodD0iNDAwIiB2ZXJzaW9uPSIxLjIiIHdpZHRoPSI0MDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6ZXY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLWV2ZW50cyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPjxkZWZzIC8+PHJlY3QgZmlsbD0iI2QzZDNkMyIgaGVpZ2h0PSI0MDAiIHdpZHRoPSI0MDAiIHg9IjAiIHk9IjAiIC8+PGxpbmUgc3Ryb2tlPSJ3aGl0ZSIgc3Ryb2tlLXdpZHRoPSIxMCIgeDE9IjAiIHgyPSI0MDAiIHkxPSIwIiB5Mj0iNDAwIiAvPjxsaW5lIHN0cm9rZT0id2hpdGUiIHN0cm9rZS13aWR0aD0iMTAiIHgxPSIwIiB4Mj0iNDAwIiB5MT0iNDAwIiB5Mj0iMCIgLz48cmVjdCBmaWxsPSIjZDNkM2QzIiBoZWlnaHQ9IjUwIiB3aWR0aD0iMjE4LjAiIHg9IjkxLjAiIHk9IjE3NS4wIiAvPjx0ZXh0IGZpbGw9IndoaXRlIiBmb250LXNpemU9IjMwIiBmb250LXdlaWdodD0iYm9sZCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjAwLjAiIHk9IjIwNy41Ij5QTEFDRUhPTERFUjwvdGV4dD48L3N2Zz4=';
2151
				}
2152
2153
				if( $bg_image !== undefined && $bg_image !== '' ){
2154
					var hasImage = true
2155
					if($styles['background-color'] !== undefined && $args['bg'] == 'custom-color'){
2156
						   $styles['background-image'] = "url("+$bg_image+")";
2157
						   $styles['background-blend-mode'] =  "overlay";
2158
					}else if($styles['background-image'] !== undefined && $args['bg'] == 'custom-gradient'){
2159
						   $styles['background-image'] +=  ",url("+$bg_image+")";
2160
					}else if($args['bg'] !== undefined && $args['bg'] != '' && $args['bg'] != 'transparent' ){
2161
						   // do nothing as we already have a preset
2162
						   hasImage = false;
2163
					}else{
2164
						   $styles['background-image'] = "url("+$bg_image+")";
2165
					}
2166
2167
					if( hasImage){
2168
						 $styles['background-size'] = "cover";
2169
2170
						 if( $args['bg_image_fixed'] !== undefined && $args['bg_image_fixed'] ){
2171
							 $styles['background-attachment'] = "fixed";
2172
						 }
2173
					}
2174
2175
					if( hasImage && $args['bg_image_xy'].x !== undefined && $args['bg_image_xy'].x >=0 ){
2176
						  $styles['background-position'] =  ($args['bg_image_xy'].x * 100 ) + "% " + ( $args['bg_image_xy'].y * 100) + "%";
2177
					}
2178
				}
2179
2180
2181
2182
				// sticky offset top
2183
				if( $args['sticky_offset_top'] !== undefined && $args['sticky_offset_top'] !== '' ){
2184
					$styles['top'] =  $args['sticky_offset_top'];
2185
				}
2186
2187
				// sticky offset bottom
2188
				if( $args['sticky_offset_bottom'] !== undefined && $args['sticky_offset_bottom'] !== '' ){
2189
					$styles['bottom'] =  $args['sticky_offset_bottom'];
2190
				}
2191
2192
				// font size
2193
				if( $args['font_size'] === undefined || $args['font_size'] === 'custom' ){
2194
					if( $args['font_size_custom'] !== undefined && $args['font_size_custom'] !== '' ){
2195
						$styles['fontSize'] =  $args['font_size_custom'] + "rem";
2196
					}
2197
				}
2198
2199
				// font color
2200
				if( $args['text_color'] === undefined || $args['text_color'] === 'custom' ){
2201
					if( $args['text_color_custom'] !== undefined && $args['text_color_custom'] !== '' ){
2202
						$styles['color'] =  $args['text_color_custom'];
2203
					}
2204
				}
2205
2206
				// font line height
2207
				if( $args['font_line_height'] !== undefined && $args['font_line_height'] !== '' ){
2208
					$styles['lineHeight'] =  $args['font_line_height'];
2209
				}
2210
2211
				// max height
2212
				if( $args['max_height'] !== undefined && $args['max_height'] !== '' ){
2213
					$styles['maxHeight'] =  $args['max_height'];
2214
				}
2215
2216
				return $styles;
2217
2218
			}
2219
2220
			function sd_build_aui_class($args){
2221
2222
				$classes = [];
2223
2224
				<?php
2225
				if($aui_bs5){
2226
					?>
2227
				$aui_bs5 = true;
2228
				$p_ml = 'ms-';
2229
				$p_mr = 'me-';
2230
2231
				$p_pl = 'ps-';
2232
				$p_pr = 'pe-';
2233
					<?php
2234
				}else{
2235
						?>
2236
				$aui_bs5 = false;
2237
				$p_ml = 'ml-';
2238
				$p_mr = 'mr-';
2239
2240
				$p_pl = 'pl-';
2241
				$p_pr = 'pr-';
2242
					<?php
2243
				}
2244
				?>
2245
2246
				// margins
2247
				if ( $args['mt'] !== undefined && $args['mt'] !== '' ) { $classes.push( "mt-" + $args['mt'] );  $mt = $args['mt']; }else{$mt = null;}
2248
				if ( $args['mr'] !== undefined && $args['mr'] !== '' ) { $classes.push( $p_mr + $args['mr'] );  $mr = $args['mr']; }else{$mr = null;}
2249
				if ( $args['mb'] !== undefined && $args['mb'] !== '' ) { $classes.push( "mb-" + $args['mb'] );  $mb = $args['mb']; }else{$mb = null;}
2250
				if ( $args['ml'] !== undefined && $args['ml'] !== '' ) { $classes.push( $p_ml + $args['ml'] );  $ml = $args['ml']; }else{$ml = null;}
2251
2252
				// margins tablet
2253
				if ( $args['mt_md'] !== undefined && $args['mt_md'] !== '' ) { $classes.push( "mt-md-" + $args['mt_md'] );  $mt_md = $args['mt_md']; }else{$mt_md = null;}
2254
				if ( $args['mr_md'] !== undefined && $args['mr_md'] !== '' ) { $classes.push( $p_mr + "md-" + $args['mr_md'] );  $mt_md = $args['mr_md']; }else{$mr_md = null;}
2255
				if ( $args['mb_md'] !== undefined && $args['mb_md'] !== '' ) { $classes.push( "mb-md-" + $args['mb_md'] );  $mt_md = $args['mb_md']; }else{$mb_md = null;}
2256
				if ( $args['ml_md'] !== undefined && $args['ml_md'] !== '' ) { $classes.push( $p_ml + "md-" + $args['ml_md'] );  $mt_md = $args['ml_md']; }else{$ml_md = null;}
2257
2258
				// margins desktop
2259
				if ( $args['mt_lg'] !== undefined && $args['mt_lg'] !== '' ) { if($mt == null && $mt_md == null){ $classes.push( "mt-" + $args['mt_lg'] ); }else{$classes.push( "mt-lg-" + $args['mt_lg'] ); } }
2260
				if ( $args['mr_lg'] !== undefined && $args['mr_lg'] !== '' ) { if($mr == null && $mr_md == null){ $classes.push( $p_mr + $args['mr_lg'] ); }else{$classes.push( $p_mr + "lg-" + $args['mr_lg'] ); } }
2261
				if ( $args['mb_lg'] !== undefined && $args['mb_lg'] !== '' ) { if($mb == null && $mb_md == null){ $classes.push( "mb-" + $args['mb_lg'] ); }else{$classes.push( "mb-lg-" + $args['mb_lg'] ); } }
2262
				if ( $args['ml_lg'] !== undefined && $args['ml_lg'] !== '' ) { if($ml == null && $ml_md == null){ $classes.push( $p_ml + $args['ml_lg'] ); }else{$classes.push( $p_ml + "lg-" + $args['ml_lg'] ); } }
2263
2264
				// padding
2265
				if ( $args['pt'] !== undefined && $args['pt'] !== '' ) { $classes.push( "pt-" + $args['pt'] ); $pt = $args['pt']; }else{$pt = null;}
2266
				if ( $args['pr'] !== undefined && $args['pr'] !== '' ) { $classes.push( $p_pr + $args['pr'] ); $pr = $args['pt']; }else{$pr = null;}
2267
				if ( $args['pb'] !== undefined && $args['pb'] !== '' ) { $classes.push( "pb-" + $args['pb'] ); $pb = $args['pt']; }else{$pb = null;}
2268
				if ( $args['pl'] !== undefined && $args['pl'] !== '' ) { $classes.push( $p_pl + $args['pl'] ); $pl = $args['pt']; }else{$pl = null;}
2269
2270
				// padding tablet
2271
				if ( $args['pt_md'] !== undefined && $args['pt_md'] !== '' ) { $classes.push( "pt-md-" + $args['pt_md'] ); $pt_md = $args['pt_md']; }else{$pt_md = null;}
2272
				if ( $args['pr_md'] !== undefined && $args['pr_md'] !== '' ) { $classes.push( $p_pr + "md-" + $args['pr_md'] ); $pr_md = $args['pt_md']; }else{$pr_md = null;}
2273
				if ( $args['pb_md'] !== undefined && $args['pb_md'] !== '' ) { $classes.push( "pb-md-" + $args['pb_md'] ); $pb_md = $args['pt_md']; }else{$pb_md = null;}
2274
				if ( $args['pl_md'] !== undefined && $args['pl_md'] !== '' ) { $classes.push( $p_pl + "md-" + $args['pl_md'] ); $pl_md = $args['pt_md']; }else{$pl_md = null;}
2275
2276
				// padding desktop
2277
				if ( $args['pt_lg'] !== undefined && $args['pt_lg'] !== '' ) { if($pt == null && $pt_md == null){ $classes.push( "pt-" + $args['pt_lg'] ); }else{$classes.push( "pt-lg-" + $args['pt_lg'] ); } }
2278
				if ( $args['pr_lg'] !== undefined && $args['pr_lg'] !== '' ) { if($pr == null && $pr_md == null){ $classes.push( $p_pr + $args['pr_lg'] ); }else{$classes.push( $p_pr + "lg-" + $args['pr_lg'] ); } }
2279
				if ( $args['pb_lg'] !== undefined && $args['pb_lg'] !== '' ) { if($pb == null && $pb_md == null){ $classes.push( "pb-" + $args['pb_lg'] ); }else{$classes.push( "pb-lg-" + $args['pb_lg'] ); } }
2280
				if ( $args['pl_lg'] !== undefined && $args['pl_lg'] !== '' ) { if($pl == null && $pl_md == null){ $classes.push( $p_pl + $args['pl_lg'] ); }else{$classes.push( $p_pl + "lg-" + $args['pl_lg'] ); } }
2281
2282
				// row cols, mobile, tablet, desktop
2283
				if ( $args['row_cols'] !== undefined && $args['row_cols'] !== '' ) { $classes.push( "row-cols-" + $args['row_cols'] );  $row_cols = $args['row_cols']; }else{$row_cols = null;}
2284
				if ( $args['row_cols_md'] !== undefined && $args['row_cols_md'] !== '' ) { $classes.push( "row-cols-md-" + $args['row_cols_md'] );  $row_cols_md = $args['row_cols_md']; }else{$row_cols_md = null;}
2285
				if ( $args['row_cols_lg'] !== undefined && $args['row_cols_lg'] !== '' ) { if($row_cols == null && $row_cols_md == null){ $classes.push( "row-cols-" + $args['row_cols_lg'] ); }else{$classes.push( "row-cols-lg-" + $args['row_cols_lg'] ); } }
2286
2287
				// columns , mobile, tablet, desktop
2288
				if ( $args['col'] !== undefined && $args['col'] !== '' ) { $classes.push( "col-" + $args['col'] );  $col = $args['col']; }else{$col = null;}
2289
				if ( $args['col_md'] !== undefined && $args['col_md'] !== '' ) { $classes.push( "col-md-" + $args['col_md'] );  $col_md = $args['col_md']; }else{$col_md = null;}
2290
				if ( $args['col_lg'] !== undefined && $args['col_lg'] !== '' ) { if($col == null && $col_md == null){ $classes.push( "col-" + $args['col_lg'] ); }else{$classes.push( "col-lg-" + $args['col_lg'] ); } }
2291
2292
2293
				// border
2294
				if ( $args['border'] === undefined || $args['border']=='')  { }
2295
				else if ( $args['border'] !== undefined && ( $args['border']=='none' || $args['border']==='0') ) { $classes.push( "border-0" ); }
2296
				else if ( $args['border'] !== undefined ) {
2297
					if($aui_bs5 && $args['border_type'] !== undefined){
2298
						$args['border_type'] = $args['border_type'].replace('-left','-start').replace('-right','-end');
2299
					}
2300
					$border_class = 'border';
2301
					if ( $args['border_type'] !== undefined && ! $args['border_type'].includes( '-0' )  ) {
2302
						$border_class = '';
2303
					}
2304
					$classes.push( $border_class + " border-" + $args['border'] );
2305
				}
2306
2307
				// border radius type
2308
			  //  if ( $args['rounded'] !== undefined && $args['rounded'] !== '' ) { $classes.push($args['rounded']); }
2309
2310
				// border radius size
2311
				if( $args['rounded_size'] !== undefined && ( $args['rounded_size']==='sm' || $args['rounded_size']==='lg' ) ){
2312
					if ( $args['rounded_size'] !== undefined && $args['rounded_size'] !== '' ) {
2313
						$classes.push("rounded-" + $args['rounded_size']);
2314
						// if we set a size then we need to remove "rounded" if set
2315
						var index = $classes.indexOf("rounded");
2316
						if (index !== -1) {
2317
						  $classes.splice(index, 1);
2318
						}
2319
					}
2320
				}else{
2321
					// rounded_size , mobile, tablet, desktop
2322
					if ( $args['rounded_size'] !== undefined && $args['rounded_size'] !== '' ) { $classes.push( "rounded-" + $args['rounded_size'] );  $rounded_size = $args['rounded_size']; }else{$rounded_size = null;}
2323
					if ( $args['rounded_size_md'] !== undefined && $args['rounded_size_md'] !== '' ) { $classes.push( "rounded-md-" + $args['rounded_size_md'] );  $rounded_size_md = $args['rounded_size_md']; }else{$rounded_size_md = null;}
2324
					if ( $args['rounded_size_lg'] !== undefined && $args['rounded_size_lg'] !== '' ) { if($rounded_size == null && $rounded_size_md == null){ $classes.push( "rounded-" + $args['rounded_size_lg'] ); }else{$classes.push( "rounded-lg-" + $args['rounded_size_lg'] ); } }
2325
				}
2326
2327
2328
				// shadow
2329
			   // if ( $args['shadow'] !== undefined && $args['shadow'] !== '' ) { $classes.push($args['shadow']); }
2330
2331
				// background
2332
				if ( $args['bg'] !== undefined  && $args['bg'] !== '' ) { $classes.push("bg-" + $args['bg']); }
2333
2334
                // background image fixed bg_image_fixed
2335
                if ( $args['bg_image_fixed'] !== undefined  && $args['bg_image_fixed'] !== '' ) { $classes.push("bg-image-fixed"); }
2336
2337
				// text_color
2338
				if ( $args['text_color'] !== undefined && $args['text_color'] !== '' ) { $classes.push( "text-" + $args['text_color']); }
2339
2340
				// text_align
2341
				if ( $args['text_justify'] !== undefined && $args['text_justify'] ) { $classes.push('text-justify'); }
2342
				else{
2343
					if ( $args['text_align'] !== undefined && $args['text_align'] !== '' ) {
2344
						if($aui_bs5){ $args['text_align'] = $args['text_align'].replace('-left','-start').replace('-right','-end'); }
2345
						$classes.push($args['text_align']); $text_align = $args['text_align'];
2346
					}else{$text_align = null;}
2347
					if ( $args['text_align_md'] !== undefined && $args['text_align_md'] !== '' ) {
2348
						if($aui_bs5){ $args['text_align_md'] = $args['text_align_md'].replace('-left','-start').replace('-right','-end'); }
2349
						$classes.push($args['text_align_md']); $text_align_md = $args['text_align_md'];
2350
					}else{$text_align_md = null;}
2351
					if ( $args['text_align_lg'] !== undefined && $args['text_align_lg'] !== '' ) {
2352
						if($aui_bs5){ $args['text_align_lg'] = $args['text_align_lg'].replace('-left','-start').replace('-right','-end'); }
2353
						if($text_align  == null && $text_align_md == null){ $classes.push($args['text_align_lg'].replace("-lg", ""));
2354
						}else{$classes.push($args['text_align_lg']);} }
2355
				}
2356
2357
				// display
2358
				  if ( $args['display'] !== undefined && $args['display'] !== '' ) { $classes.push($args['display']); $display = $args['display']; }else{$display = null;}
2359
				if ( $args['display_md'] !== undefined && $args['display_md'] !== '' ) { $classes.push($args['display_md']); $display_md = $args['display_md']; }else{$display_md = null;}
2360
				if ( $args['display_lg'] !== undefined && $args['display_lg'] !== '' ) { if($display  == null && $display_md == null){ $classes.push($args['display_lg'].replace("-lg", "")); }else{$classes.push($args['display_lg']);} }
2361
2362
				// bgtus - background transparent until scroll
2363
				if ( $args['bgtus'] !== undefined && $args['bgtus'] ) { $classes.push("bg-transparent-until-scroll"); }
2364
2365
				// cscos - change color scheme on scroll
2366
				if ( $args['bgtus'] !== undefined && $args['bgtus'] && $args['cscos'] !== undefined && $args['cscos'] ) { $classes.push("color-scheme-flip-on-scroll"); }
2367
2368
				// hover animations
2369
				if ( $args['hover_animations'] !== undefined && $args['hover_animations'] ) { $classes.push($args['hover_animations'].toString().replace(',',' ')); }
2370
2371
				// absolute_position
2372
				if ( $args['absolute_position'] !== undefined ) {
2373
					if ( 'top-left' === $args['absolute_position'] ) {
2374
						$classes.push('start-0 top-0');
2375
					} else if ( 'top-center' === $args['absolute_position'] ) {
2376
						$classes.push('start-50 top-0 translate-middle');
2377
					} else if ( 'top-right' === $args['absolute_position'] ) {
2378
						$classes.push('end-0 top-0');
2379
					} else if ( 'center-left' === $args['absolute_position'] ) {
2380
						$classes.push('start-0 bottom-50');
2381
					} else if ( 'center' === $args['absolute_position'] ) {
2382
						$classes.push('start-50 top-50 translate-middle');
2383
					} else if ( 'center-right' === $args['absolute_position'] ) {
2384
						$classes.push('end-0 top-50');
2385
					} else if ( 'bottom-left' === $args['absolute_position'] ) {
2386
						$classes.push('start-0 bottom-0');
2387
					} else if ( 'bottom-center' === $args['absolute_position'] ) {
2388
						$classes.push('start-50 bottom-0 translate-middle');
2389
					} else if ( 'bottom-right' === $args['absolute_position'] ) {
2390
						$classes.push('end-0 bottom-0');
2391
					}
2392
				}
2393
2394
				// build classes from build keys
2395
				$build_keys = sd_get_class_build_keys();
2396
				if ( $build_keys.length ) {
2397
					$build_keys.forEach($key => {
2398
2399
						if($key.endsWith("-MTD")){
2400
2401
							$k = $key.replace("-MTD","");
2402
2403
							// Mobile, Tablet, Desktop
2404
							if ( $args[$k] !== undefined && $args[$k] !== '' ) { $classes.push( $args[$k] );  $v = $args[$k]; }else{$v = null;}
2405
							if ( $args[$k + '_md'] !== undefined && $args[$k + '_md'] !== '' ) { $classes.push( $args[$k + '_md'] );  $v_md = $args[$k + '_md']; }else{$v_md = null;}
2406
							if ( $args[$k + '_lg'] !== undefined && $args[$k + '_lg'] !== '' ) { if($v == null && $v_md == null){ $classes.push( $args[$k + '_lg'].replace('-lg','') ); }else{$classes.push( $args[$k + '_lg'] ); } }
2407
2408
						}else{
2409
							if ( $key == 'font_size' && ( $args[ $key ] == 'custom' || $args[ $key ] === '0' ) ) {
2410
							 return;
2411
							}
2412
							if ( $args[$key] !== undefined && $args[$key] !== '' ) { $classes.push($args[$key]); }
2413
						}
2414
2415
					});
2416
				}
2417
2418
				return $classes.join(" ");
2419
			}
2420
2421
			function sd_get_class_build_keys(){
2422
				return <?php echo json_encode(sd_get_class_build_keys());?>;
0 ignored issues
show
Bug introduced by
Are you sure the usage of sd_get_class_build_keys() is correct as it seems to always return null.

This check looks for function or method calls that always return null and whose return value is used.

class A
{
    function getObject()
    {
        return null;
    }

}

$a = new A();
if ($a->getObject()) {

The method getObject() can return nothing but null, so it makes no sense to use the return value.

The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes.

Loading history...
2423
			}
2424
2425
			<?php
2426
2427
2428
			}
2429
2430
			if(method_exists($this,'block_global_js')){
2431
					echo $this->block_global_js();
2432
			}
2433
			?>
2434
2435
jQuery(function() {
2436
2437
				/**
2438
				 * BLOCK: Basic
2439
				 *
2440
				 * Registering a basic block with Gutenberg.
2441
				 * Simple block, renders and saves the same content without any interactivity.
2442
				 *
2443
				 * Styles:
2444
				 *        editor.css — Editor styles for the block.
2445
				 *        style.css  — Editor & Front end styles for the block.
2446
				 */
2447
				(function (blocksx, elementx, blockEditor) {
2448
					if (typeof blockEditor === 'undefined') {
2449
						return;<?php /* Yoast SEO load blocks.js without block-editor.js on post edit pages */ ?>
2450
					}
2451
					var __ = wp.i18n.__; // The __() for internationalization.
2452
					var el = wp.element.createElement; // The wp.element.createElement() function to create elements.
2453
					var editable = wp.blocks.Editable;
2454
					var blocks = wp.blocks;
2455
					var registerBlockType = wp.blocks.registerBlockType; // The registerBlockType() to register blocks.
2456
					var is_fetching = false;
2457
					var prev_attributes = [];
2458
2459
					var InnerBlocks = blockEditor.InnerBlocks;
2460
2461
					var term_query_type = '';
2462
					var post_type_rest_slugs = <?php if(! empty( $this->arguments ) && isset($this->arguments['post_type']['onchange_rest']['values'])){echo "[".json_encode($this->arguments['post_type']['onchange_rest']['values'])."]";}else{echo "[]";} ?>;
2463
					const taxonomies_<?php echo str_replace("-","_", $this->id);?> = [{label: "Please wait", value: 0}];
2464
					const sort_by_<?php echo str_replace("-","_", $this->id);?> = [{label: "Please wait", value: 0}];
2465
					const MediaUpload = wp.blockEditor.MediaUpload;
2466
2467
					/**
2468
					 * Register Basic Block.
2469
					 *
2470
					 * Registers a new block provided a unique name and an object defining its
2471
					 * behavior. Once registered, the block is made available as an option to any
2472
					 * editor interface where blocks are implemented.
2473
					 *
2474
					 * @param  {string}   name     Block name.
2475
					 * @param  {Object}   settings Block settings.
2476
					 * @return {?WPBlock}          The block, if it has been successfully
2477
					 *                             registered; otherwise `undefined`.
2478
					 */
2479
					registerBlockType('<?php echo str_replace( "_", "-", sanitize_title_with_dashes( $this->options['textdomain'] ) . '/' . sanitize_title_with_dashes( $this->options['class_name'] ) );  ?>', { // Block name. Block names must be string that contains a namespace prefix. Example: my-plugin/my-custom-block.
2480
						apiVersion: <?php echo isset($this->options['block-api-version']) ? absint($this->options['block-api-version']) : 2 ; ?>,
2481
						title: '<?php echo addslashes( $this->options['name'] ); ?>', // Block title.
2482
						description: '<?php echo addslashes( $this->options['widget_ops']['description'] )?>', // Block title.
2483
						icon: <?php echo $this->get_block_icon( $this->options['block-icon'] );?>,//'<?php echo isset( $this->options['block-icon'] ) ? esc_attr( $this->options['block-icon'] ) : 'shield-alt';?>', // Block icon from Dashicons → https://developer.wordpress.org/resource/dashicons/.
2484
						supports: {
2485
							<?php
2486
							if(!isset($this->options['block-supports']['renaming'])){
2487
								$this->options['block-supports']['renaming'] = false;
2488
							}
2489
							if ( isset( $this->options['block-supports'] ) ) {
2490
								echo $this->array_to_attributes( $this->options['block-supports'] );
2491
							}
2492
							?>
2493
						},
2494
						__experimentalLabel( attributes, { context } ) {
2495
							var visibility_html = attributes && attributes.visibility_conditions ? ' &#128065;' : '';
2496
							var metadata_name = attributes && attributes.metadata && attributes.metadata.name ? attributes.metadata.name : '';
2497
							var label_name = <?php echo !empty($this->options['block-label']) ? $this->options['block-label'] : "'" . esc_attr( addslashes( $this->options['name'] ) ) . "'"; ?>;
2498
							return metadata_name ? metadata_name + visibility_html  : label_name + visibility_html;
2499
						},
2500
						category: '<?php echo isset( $this->options['block-category'] ) ? esc_attr( $this->options['block-category'] ) : 'common';?>', // Block category — Group blocks together based on common traits E.g. common, formatting, layout widgets, embed.
2501
						<?php if ( isset( $this->options['block-keywords'] ) ) {
2502
						echo "keywords : " . $this->options['block-keywords'] . ",";
2503
						}
2504
2505
2506
						// block hover preview.
2507
						$example_args = array();
2508
						if(!empty($this->arguments)){
2509
							foreach($this->arguments as $key => $a_args){
2510
								if(isset($a_args['example'])){
2511
									$example_args[$key] = $a_args['example'];
2512
								}
2513
							}
2514
						}
2515
						$viewport_width = isset($this->options['example']['viewportWidth']) ? 'viewportWidth: '.absint($this->options['example']['viewportWidth']) : '';
2516
						$example_inner_blocks = !empty($this->options['example']['innerBlocks']) && is_array($this->options['example']['innerBlocks']) ? 'innerBlocks: ' . wp_json_encode($this->options['example']['innerBlocks']) : '';
0 ignored issues
show
Bug introduced by
Are you sure wp_json_encode($this->op...ample']['innerBlocks']) of type false|string can be used in concatenation? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

2516
						$example_inner_blocks = !empty($this->options['example']['innerBlocks']) && is_array($this->options['example']['innerBlocks']) ? 'innerBlocks: ' . /** @scrutinizer ignore-type */ wp_json_encode($this->options['example']['innerBlocks']) : '';
Loading history...
2517
						if( isset( $this->options['example'] ) && $this->options['example'] === false ){
2518
							// no preview if set to false
2519
						}elseif( !empty( $example_args ) ){
2520
							echo "example : {attributes:{".$this->array_to_attributes( $example_args )."},$viewport_width},";
2521
						}elseif( !empty( $this->options['example'] ) ){
2522
							unset($this->options['example']['viewportWidth']);
2523
							unset($this->options['example']['innerBlocks']);
2524
							$example_atts = $this->array_to_attributes( $this->options['example'] );
2525
							$example_parts = array();
2526
							if($example_atts){
2527
								$example_parts[] = rtrim($example_atts,",");
2528
							}
2529
							if($viewport_width){
2530
								$example_parts[] = $viewport_width;
2531
							}
2532
							if($example_inner_blocks){
2533
								$example_parts[] = $example_inner_blocks;
2534
							}
2535
							if(!empty($example_parts)){
2536
								echo "example : {".implode(',', $example_parts)."},";
2537
							}
2538
						}else{
2539
							echo 'example : {viewportWidth: 500},';
2540
						}
2541
2542
2543
2544
						// limit to parent
2545
						if( !empty( $this->options['parent'] ) ){
2546
							echo "parent : " . wp_json_encode( $this->options['parent'] ) . ",";
0 ignored issues
show
Bug introduced by
Are you sure wp_json_encode($this->options['parent']) of type false|string can be used in concatenation? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

2546
							echo "parent : " . /** @scrutinizer ignore-type */ wp_json_encode( $this->options['parent'] ) . ",";
Loading history...
2547
						}
2548
2549
						// limit allowed blocks
2550
						if( !empty( $this->options['allowed-blocks'] ) ){
2551
							echo "allowedBlocks : " . wp_json_encode( $this->options['allowed-blocks'] ) . ",";
0 ignored issues
show
Bug introduced by
Are you sure wp_json_encode($this->options['allowed-blocks']) of type false|string can be used in concatenation? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

2551
							echo "allowedBlocks : " . /** @scrutinizer ignore-type */ wp_json_encode( $this->options['allowed-blocks'] ) . ",";
Loading history...
2552
						}
2553
2554
						// maybe set no_wrap
2555
						$no_wrap = isset( $this->options['no_wrap'] ) && $this->options['no_wrap'] ? true : false;
2556
						if ( isset( $this->arguments['no_wrap'] ) && $this->arguments['no_wrap'] ) {
2557
							$no_wrap = true;
2558
						}
2559
						if ( $no_wrap ) {
2560
							$this->options['block-wrap'] = '';
2561
						}
2562
2563
						// maybe load the drag/drop functions.
2564
						$img_drag_drop = false;
2565
2566
						$show_alignment = false;
2567
						// align feature
2568
						/*echo "supports: {";
2569
						echo "	align: true,";
2570
						echo "  html: false";
2571
						echo "},";*/
2572
2573
2574
							echo "attributes : {";
2575
2576
							if ( $show_advanced ) {
2577
								echo "show_advanced: {";
2578
								echo "	type: 'boolean',";
2579
								echo "  default: false,";
2580
								echo "},";
2581
							}
2582
2583
							// block wrap element
2584
							if ( ! empty( $this->options['block-wrap'] ) ) { //@todo we should validate this?
2585
								echo "block_wrap: {";
2586
								echo "	type: 'string',";
2587
								echo "  default: '" . esc_attr( $this->options['block-wrap'] ) . "',";
2588
								echo "},";
2589
							}
2590
2591
2592
							if ( ! empty( $this->arguments ) ) {
2593
2594
								foreach ( $this->arguments as $key => $args ) {
2595
2596
									if( $args['type'] == 'image' ||  $args['type'] == 'images' ){
2597
										$img_drag_drop = true;
2598
									}
2599
2600
									// set if we should show alignment
2601
									if ( $key == 'alignment' ) {
2602
										$show_alignment = true;
2603
									}
2604
2605
									$extra = '';
0 ignored issues
show
Unused Code introduced by
The assignment to $extra is dead and can be removed.
Loading history...
2606
2607
									if ( $args['type'] == 'notice' ||  $args['type'] == 'tab' ) {
2608
										continue;
2609
									}
2610
									elseif ( $args['type'] == 'checkbox' ) {
2611
										$type    = 'boolean';
2612
										$default = isset( $args['default'] ) && $args['default'] ? 'true' : 'false';
2613
									} elseif ( $args['type'] == 'number' ) {
2614
										$type    = 'number';
2615
										$default = isset( $args['default'] ) ? "'" . $args['default'] . "'" : "''";
2616
									} elseif ( $args['type'] == 'select' && ! empty( $args['multiple'] ) ) {
2617
										$type = 'array';
2618
										if ( isset( $args['default'] ) && is_array( $args['default'] ) ) {
2619
											$default = ! empty( $args['default'] ) ? "['" . implode( "','", $args['default'] ) . "']" : "[]";
2620
										} else {
2621
											$default = isset( $args['default'] ) ? "'" . $args['default'] . "'" : "''";
2622
										}
2623
									} elseif ( $args['type'] == 'tagselect' ) {
2624
										$type    = 'array';
2625
										$default = isset( $args['default'] ) ? "'" . $args['default'] . "'" : "''";
2626
									} elseif ( $args['type'] == 'multiselect' ) {
2627
										$type    = 'array';
2628
										$default = isset( $args['default'] ) ? "'" . $args['default'] . "'" : "''";
2629
									} elseif ( $args['type'] == 'image_xy' ) {
2630
										$type    = 'object';
2631
										$default = isset( $args['default'] ) ? "'" . $args['default'] . "'" : "''";
2632
									} elseif ( $args['type'] == 'image' ) {
2633
										$type    = 'string';
2634
										$default = isset( $args['default'] ) ? "'" . $args['default'] . "'" : "''";
2635
2636
										// add a field for ID
2637
	//                                    echo $key . "_id : {";
2638
	//                                    echo "type : 'number',";
2639
	//                                    echo "},";
2640
	//                                    echo $key . "_xy : {";
2641
	//                                    echo "type : 'object',";
2642
	//                                    echo "},";
2643
2644
									} else {
2645
										$type    = !empty($args['hidden_type']) ? esc_attr($args['hidden_type']) : 'string';
2646
										$default = isset( $args['default'] ) ? "'" . $args['default'] . "'" : "''";
2647
2648
									}
2649
									echo $key . " : {";
2650
									echo "type : '$type',";
2651
									echo "default : $default,";
2652
									echo "},";
2653
								}
2654
							}
2655
2656
							echo "content : {type : 'string',default: 'Please select the attributes in the block settings'},";
2657
							echo "sd_shortcode : {type : 'string',default: ''},";
2658
2659
							if(!empty($this->options['nested-block']) || !empty($this->arguments['html']) ){
2660
								echo "sd_shortcode_close : {type : 'string',default: ''},";
2661
							}
2662
2663
							echo "className: { type: 'string', default: '' },";
2664
2665
							echo "},";
2666
2667
2668
2669
						?>
2670
2671
						// The "edit" property must be a valid function.
2672
						edit: function (props) {
2673
2674
2675
<?php
2676
// only include the drag/drop functions if required.
2677
if( $img_drag_drop ){
2678
2679
?>
2680
2681
function enableDragSort(listClass) {
2682
	setTimeout(function(){
2683
		 const sortableLists = document.getElementsByClassName(listClass);
2684
		 Array.prototype.map.call(sortableLists, (list) => {enableDragList(list)});
2685
	}, 300);
2686
}
2687
2688
function enableDragList(list) {
2689
  Array.prototype.map.call(list.children, (item) => {enableDragItem(item)});
2690
}
2691
2692
function enableDragItem(item) {
2693
  item.setAttribute('draggable', true)
2694
  item.ondrag = handleDrag;
2695
  item.ondragend = handleDrop;
2696
}
2697
2698
function handleDrag(item) {
2699
  const selectedItem = item.target,
2700
		list = selectedItem.parentNode,
2701
		x = event.clientX,
2702
		y = event.clientY;
2703
2704
  selectedItem.classList.add('drag-sort-active');
2705
  let swapItem = document.elementFromPoint(x, y) === null ? selectedItem : document.elementFromPoint(x, y);
2706
2707
  if (list === swapItem.parentNode) {
2708
	swapItem = swapItem !== selectedItem.nextSibling ? swapItem : swapItem.nextSibling;
2709
	list.insertBefore(selectedItem, swapItem);
2710
  }
2711
}
2712
2713
function handleDrop(item) {
2714
2715
	item.target.classList.remove('drag-sort-active');
2716
2717
	const newOrder = [];
2718
	let $parent = item.target.parentNode;
2719
	let $field = $parent.dataset.field;
2720
	let $imgs = JSON.parse('[' + props.attributes[$field] + ']');
2721
	item.target.parentNode.classList.add('xxx');
2722
	$children = $parent.children;
2723
2724
	Object.keys($children).forEach(function(key) {
2725
	  let $nKey = $children[key].dataset.index
2726
	  newOrder.push($imgs[$nKey]);
2727
	});
2728
2729
	// @todo find out why we need to empty the value first otherwise the order is wrong.
2730
	props.setAttributes({ [$field]: '' });
2731
	setTimeout(function(){
2732
		props.setAttributes({ [$field]: JSON.stringify(newOrder).replace('[','').replace(']','') });
2733
	}, 100);
2734
2735
}
2736
<?php } ?>
2737
2738
							if (typeof(props.attributes.styleid) !== 'undefined'){
2739
								if(props.attributes.styleid==''){ props.setAttributes({ 'styleid': 'block-'+(Math.random() + 1).toString(36).substring(2) } ); }
2740
							}
2741
2742
							<?php
2743
							if(!empty($this->options['block-edit-raw'])) {
2744
								echo $this->options['block-edit-raw']; // strings have to be in single quotes, may cause issues
2745
							}else{
2746
							?>
2747
2748
function hasSelectedInnerBlock(props) {
2749
	const select = wp.data.select('core/editor');
2750
	const selected = select.getBlockSelectionStart();
2751
	const inner = select.getBlock(props.clientId).innerBlocks;
2752
	for (let i = 0; i < inner.length; i++) {
2753
		if (inner[i].clientId === selected || inner[i].innerBlocks.length && hasSelectedInnerBlock(inner[i])) {
2754
			return true;
2755
		}
2756
	}
2757
	return false;
2758
};
2759
2760
const parentBlocksIDs = wp.data.select( 'core/block-editor' ).getBlockParents(props.clientId);
2761
const parentBlocks = wp.data.select('core/block-editor').getBlocksByClientId(parentBlocksIDs);
2762
// const isParentOfSelectedBlock = useSelect( ( select ) => wp.data.select( 'core/block-editor' ).hasSelectedInnerBlock( props.clientId, true ) ):
2763
	const block = wp.data.select('core/block-editor').getBlocksByClientId(props.clientId);//.[0].innerBlocks;
2764
	const childBlocks = block[0] == null ? '' : block[0].innerBlocks;
2765
2766
	var $value = '';
2767
	<?php
2768
	// if we have a post_type and a category then link them
2769
	if( isset($this->arguments['post_type']) && isset($this->arguments['category']) && !empty($this->arguments['category']['post_type_linked']) ){
2770
	?>
2771
	if(typeof(prev_attributes[props.clientId]) != 'undefined'){
2772
		$pt = props.attributes.post_type;
2773
		if(post_type_rest_slugs.length){
2774
			$value = post_type_rest_slugs[0][$pt];
2775
		}
2776
		var run = false;
2777
2778
		if($pt != term_query_type){
2779
			run = true;
2780
			term_query_type = $pt;
2781
		}
2782
<?php
2783
	$cat_path = '';
2784
	if ( ! empty( $this->arguments['post_type']['onchange_rest']['path'] ) ) {
2785
		$cat_path = esc_js( strip_tags( $this->arguments['post_type']['onchange_rest']['path'] ) );
2786
		$cat_path = str_replace( array( '&quot;', '&#039;' ), array( '"', "'" ), $cat_path );
2787
	}
2788
?>
2789
		/* taxonomies */
2790
		if($value && 'post_type' in prev_attributes[props.clientId] && 'category' in prev_attributes[props.clientId] && run){
2791
			if (!window.gdCPTCats) {
2792
				window.gdCPTCats = [];
2793
			}
2794
			var gdCatPath = "<?php echo ( ! empty( $cat_path ) ? $cat_path : "/wp/v2/" + $value + "/categories/?per_page=100" ); ?>";
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $value seems to be never defined.
Loading history...
2795
			if (window.gdCPTCats[gdCatPath]) {
2796
				terms = window.gdCPTCats[gdCatPath];
2797
				while (taxonomies_<?php echo str_replace("-","_", $this->id);?>.length) {
2798
					taxonomies_<?php echo str_replace("-","_", $this->id);?>.pop();
2799
				}
2800
				taxonomies_<?php echo str_replace("-","_", $this->id);?>.push({label: "All", value: 0});
2801
				jQuery.each( terms, function( key, val ) {
2802
					taxonomies_<?php echo str_replace("-","_", $this->id);?>.push({label: val.name, value: val.id});
2803
				});
2804
2805
				/* Setting the value back and fourth fixes the no update issue that sometimes happens where it won't update the options. */
2806
				var $old_cat_value = props.attributes.category
2807
				props.setAttributes({category: [0] });
2808
				props.setAttributes({category: $old_cat_value });
2809
			} else {
2810
				wp.apiFetch({path: gdCatPath}).then(terms => {
2811
					window.gdCPTCats[gdCatPath] = terms;
2812
					while (taxonomies_<?php echo str_replace("-","_", $this->id);?>.length) {
2813
						taxonomies_<?php echo str_replace("-","_", $this->id);?>.pop();
2814
					}
2815
					taxonomies_<?php echo str_replace("-","_", $this->id);?>.push({label: "All", value: 0});
2816
					jQuery.each( terms, function( key, val ) {
2817
						taxonomies_<?php echo str_replace("-","_", $this->id);?>.push({label: val.name, value: val.id});
2818
					});
2819
2820
					/* Setting the value back and fourth fixes the no update issue that sometimes happens where it won't update the options. */
2821
					var $old_cat_value = props.attributes.category
2822
					props.setAttributes({category: [0] });
2823
					props.setAttributes({category: $old_cat_value });
2824
2825
					return taxonomies_<?php echo str_replace("-","_", $this->id);?>;
2826
				});
2827
			}
2828
		}
2829
2830
		/* sort_by */
2831
		if($value && 'post_type' in prev_attributes[props.clientId] && 'sort_by' in prev_attributes[props.clientId] && run){
2832
			if (!window.gdCPTSort) {
2833
				window.gdCPTSort = [];
2834
			}
2835
			if (window.gdCPTSort[$pt]) {
2836
				response = window.gdCPTSort[$pt];
2837
				while (sort_by_<?php echo str_replace("-","_", $this->id);?>.length) {
2838
					sort_by_<?php echo str_replace("-","_", $this->id);?>.pop();
2839
				}
2840
2841
				jQuery.each( response, function( key, val ) {
2842
					sort_by_<?php echo str_replace("-","_", $this->id);?>.push({label: val, value: key});
2843
				});
2844
2845
				// setting the value back and fourth fixes the no update issue that sometimes happens where it won't update the options.
2846
				var $old_sort_by_value = props.attributes.sort_by
2847
				props.setAttributes({sort_by: [0] });
2848
				props.setAttributes({sort_by: $old_sort_by_value });
2849
			} else {
2850
				var data = {
2851
					'action': 'geodir_get_sort_options',
2852
					'post_type': $pt
2853
				};
2854
				jQuery.post(ajaxurl, data, function(response) {
2855
					response = JSON.parse(response);
2856
					window.gdCPTSort[$pt] = response;
2857
					while (sort_by_<?php echo str_replace("-","_", $this->id);?>.length) {
2858
						sort_by_<?php echo str_replace("-","_", $this->id);?>.pop();
2859
					}
2860
2861
					jQuery.each( response, function( key, val ) {
2862
						sort_by_<?php echo str_replace("-","_", $this->id);?>.push({label: val, value: key});
2863
					});
2864
2865
					// setting the value back and fourth fixes the no update issue that sometimes happens where it won't update the options.
2866
					var $old_sort_by_value = props.attributes.sort_by
2867
					props.setAttributes({sort_by: [0] });
2868
					props.setAttributes({sort_by: $old_sort_by_value });
2869
2870
					return sort_by_<?php echo str_replace("-","_", $this->id);?>;
2871
				});
2872
			}
2873
		}
2874
	}
2875
	<?php } ?>
2876
<?php
2877
$current_screen = function_exists('get_current_screen') ? get_current_screen() : '';
0 ignored issues
show
Bug introduced by
Are you sure the usage of get_current_screen() is correct as it seems to always return null.

This check looks for function or method calls that always return null and whose return value is used.

class A
{
    function getObject()
    {
        return null;
    }

}

$a = new A();
if ($a->getObject()) {

The method getObject() can return nothing but null, so it makes no sense to use the return value.

The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes.

Loading history...
2878
if(!empty($current_screen->base) && $current_screen->base==='widgets'){
0 ignored issues
show
Bug introduced by
The property base does not exist on string.
Loading history...
2879
	echo 'const { deviceType } = "";';
2880
}else{
2881
?>
2882
/** Get device type const. */
2883
const { deviceType } = wp.data.useSelect != 'undefined' ?  wp.data.useSelect(select => {
2884
	const { __experimentalGetPreviewDeviceType } = select('core/edit-site') ? select('core/edit-site') : select('core/edit-post') ? select('core/edit-post') : ''; // For sie editor https://github.com/WordPress/gutenberg/issues/39248
2885
	return {
2886
		deviceType: __experimentalGetPreviewDeviceType(),
2887
	}
2888
}, []) : '';
2889
<?php } ?>
2890
							var content = props.attributes.content;
2891
                            var shortcode = '';
2892
2893
							function onChangeContent($type) {
2894
// console.log(deviceType);
2895
								$refresh = false;
2896
								// Set the old content the same as the new one so we only compare all other attributes
2897
								if(typeof(prev_attributes[props.clientId]) != 'undefined'){
2898
									prev_attributes[props.clientId].content = props.attributes.content;
2899
								}else if(props.attributes.content === ""){
2900
									// if first load and content empty then refresh
2901
									$refresh = true;
2902
								}
2903
2904
								if ( ( !is_fetching &&  JSON.stringify(prev_attributes[props.clientId]) != JSON.stringify(props.attributes) ) || $refresh  ) {
2905
2906
									is_fetching = true;
2907
2908
									var data = {
2909
										'action': 'super_duper_output_shortcode',
2910
										'shortcode': '<?php echo $this->options['base_id'];?>',
2911
										'attributes': props.attributes,
2912
										'block_parent_name': parentBlocks.length ? parentBlocks[parentBlocks.length - 1].name : '',
2913
										'post_id': <?php global $post; if ( isset( $post->ID ) ) {
2914
										echo $post->ID;
2915
									}else{echo '0';}?>,
2916
										'_ajax_nonce': '<?php echo wp_create_nonce( 'super_duper_output_shortcode' );?>'
2917
									};
2918
2919
									jQuery.post(ajaxurl, data, function (response) {
2920
										return response;
2921
									}).then(function (env) {
2922
2923
										// if the content is empty then we place some placeholder text
2924
										if (env == '') {
2925
											env = "<div style='background:#0185ba33;padding: 10px;border: 4px #ccc dashed;'>" + "<?php _e( 'Placeholder for:', 'ayecode-connect' );?> " + props.name + "</div>";
2926
										}
2927
2928
										 <?php
2929
										if(!empty($this->options['nested-block'])){
2930
											?>
2931
											// props.setAttributes({content: env});
2932
										is_fetching = false;
2933
										prev_attributes[props.clientId] = props.attributes;
2934
											 <?php
2935
										}else{
2936
										?>
2937
										props.setAttributes({content: env});
2938
										is_fetching = false;
2939
										prev_attributes[props.clientId] = props.attributes;
2940
										<?php
2941
										}
2942
										?>
2943
2944
2945
										// if AUI is active call the js init function
2946
										if (typeof aui_init === "function") {
2947
											aui_init();
2948
										}
2949
									});
2950
2951
2952
								}
2953
2954
2955
2956
								return props.attributes.content;
2957
2958
							}
2959
2960
							<?php
2961
							if(!empty($this->options['block-edit-js'])) {
2962
								echo  $this->options['block-edit-js'] ; // strings have to be in single quotes, may cause issues
2963
							}
2964
2965
2966
2967
2968
							if(empty($this->options['block-save-return'])){
2969
							?>
2970
								///////////////////////////////////////////////////////////////////////
2971
2972
									 // build the shortcode.
2973
								shortcode = "[<?php echo $this->options['base_id'];?>";
2974
								<?php
2975
2976
								if(! empty( $this->arguments )){
2977
2978
								foreach($this->arguments as $key => $args){
2979
								   // if($args['type']=='tabs'){continue;}
2980
2981
								   // don't add metadata arguments
2982
								   if (substr($key, 0, 9 ) === 'metadata_') {
2983
									   continue;
2984
								   }
2985
								?>
2986
								if (props.attributes.hasOwnProperty("<?php echo esc_attr( $key );?>")) {
2987
									if ('<?php echo esc_attr( $key );?>' == 'html') {
2988
									} else if ('<?php echo esc_attr( $args['type'] );?>' == 'image_xy') {
2989
										shortcode += props.attributes.<?php echo esc_attr( $key );?>.length && ( props.attributes.<?php echo esc_attr( $key );?>.x.length || props.attributes.<?php echo esc_attr( $key );?>.y.length ) ? " <?php echo esc_attr( $key );?>='{x:" + props.attributes.<?php echo esc_attr( $key );?>.x + ",y:"+props.attributes.<?php echo esc_attr( $key );?>.y +"}' " : "";
2990
									} else {
2991
										//shortcode += props.attributes.<?php echo esc_attr( $key );?>.length ? " <?php echo esc_attr( $key );?>='" + props.attributes.<?php echo esc_attr( $key );?>.toString().replace('\'','&#39;') + "' " : "";
2992
										shortcode +=  " <?php echo esc_attr( $key );?>='" + props.attributes.<?php echo esc_attr( $key );?>.toString().replace('\'','&#39;') + "' ";
2993
									}
2994
								}
2995
								<?php
2996
								}
2997
								}
2998
2999
								?>
3000
								shortcode += "]";
3001
3002
								if(shortcode){
3003
3004
									props.setAttributes({sd_shortcode: shortcode});
3005
3006
									<?php
3007
									if(!empty($this->options['nested-block']) || !empty($this->arguments['html']) ){
3008
										echo "props.setAttributes({sd_shortcode_close: '[/".esc_attr( $this->options['base_id'] )."]'});";
3009
									}
3010
									?>
3011
								}
3012
3013
3014
							///////////////////////////////////////////////////////////////////////
3015
							<?php
3016
							} // end nested block check
3017
							?>
3018
3019
							return [
3020
3021
								el(wp.blockEditor.BlockControls, {key: 'controls'},
3022
3023
									<?php if($show_alignment){?>
3024
									el(
3025
										wp.blockEditor.AlignmentToolbar,
3026
										{
3027
											value: props.attributes.alignment,
3028
											onChange: function (alignment) {
3029
												props.setAttributes({alignment: alignment})
3030
											}
3031
										}
3032
									)
3033
									<?php }?>
3034
3035
								),
3036
3037
								el(wp.blockEditor.InspectorControls, {key: 'inspector'},
3038
3039
									<?php
3040
3041
									if(! empty( $this->arguments )){
3042
3043
									if ( $show_advanced ) {
3044
									?>
3045
									el('div', {
3046
											style: {'padding-left': '16px','padding-right': '16px'}
3047
										},
3048
										el(
3049
											wp.components.ToggleControl,
3050
											{
3051
												label: 'Show Advanced Settings?',
3052
												checked: props.attributes.show_advanced,
3053
												onChange: function (show_advanced) {
3054
													props.setAttributes({show_advanced: !props.attributes.show_advanced})
3055
												}
3056
											}
3057
										)
3058
									)
3059
									,
3060
									<?php
3061
									}
3062
3063
									$arguments = $this->group_arguments( $this->arguments );
3064
									$block_group_tabs = ! empty( $this->options['block_group_tabs'] ) ? $this->group_block_tabs( $this->options['block_group_tabs'], $arguments ) : array();
3065
3066
									// Do we have sections?
3067
									$has_sections = $arguments == $this->arguments ? false : true;
3068
3069
									if($has_sections){
3070
									$panel_count = 0;
3071
									$open_tab = '';
3072
3073
									$open_tab_groups = array();
3074
									$used_tabs = array();
3075
3076
									foreach ( $arguments as $key => $args ) {
3077
										$close_tab = false;
3078
										$close_tabs = false;
3079
3080
										 if ( ! empty( $block_group_tabs ) ) {
3081
											foreach ( $block_group_tabs as $tab_name => $tab_args ) {
3082
												if ( in_array( $key, $tab_args['groups'] ) ) {
3083
													$open_tab_groups[] = $key;
3084
3085
													if ( $open_tab != $tab_name ) {
3086
														$tab_args['tab']['tabs_open'] = $open_tab == '' ? true : false;
3087
														$tab_args['tab']['open'] = true;
3088
3089
														$this->block_tab_start( '', $tab_args );
3090
														$open_tab = $tab_name;
3091
														$used_tabs[] = $tab_name;
3092
													}
3093
3094
													if ( $open_tab_groups == $tab_args['groups'] ) {
3095
														$close_tab = true;
3096
														$open_tab_groups = array();
3097
3098
														if ( $used_tabs == array_keys( $block_group_tabs ) ) {
3099
															$close_tabs = true;
3100
														}
3101
													}
3102
												}
3103
											}
3104
										}
3105
										?>
3106
										el(wp.components.PanelBody, {
3107
												title: '<?php esc_attr_e( $key ); ?>',
3108
												initialOpen: <?php if ( $panel_count ) {
3109
												echo "false";
3110
											} else {
3111
												echo "true";
3112
											}?>
3113
											},
3114
											<?php
3115
											foreach ( $args as $k => $a ) {
3116
												$this->block_tab_start( $k, $a );
3117
												$this->block_row_start( $k, $a );
3118
												$this->build_block_arguments( $k, $a );
3119
												$this->block_row_end( $k, $a );
3120
												$this->block_tab_end( $k, $a );
3121
											}
3122
											?>
3123
										),
3124
										<?php
3125
										$panel_count ++;
3126
3127
										if($close_tab || $close_tabs){
3128
											$tab_args = array(
3129
												'tab'	=> array(
3130
													'tabs_close' => $close_tabs,
3131
												'close' => true,
3132
												)
3133
3134
											);
3135
											$this->block_tab_end( '', $tab_args );
3136
//											echo '###close'; print_r($tab_args);
3137
											$panel_count = 0;
3138
										}
3139
//
3140
3141
									}
3142
									}else {
3143
									?>
3144
									el(wp.components.PanelBody, {
3145
											title: '<?php esc_attr_e( "Settings", 'ayecode-connect' ); ?>',
3146
											initialOpen: true
3147
										},
3148
										<?php
3149
										foreach ( $this->arguments as $key => $args ) {
3150
											$this->block_row_start( $key, $args );
3151
											$this->build_block_arguments( $key, $args );
3152
											$this->block_row_end( $key, $args );
3153
										}
3154
										?>
3155
									),
3156
									<?php
3157
									}
3158
3159
									}
3160
									?>
3161
3162
								),
3163
3164
								<?php
3165
								// If the user sets block-output array then build it
3166
								if ( ! empty( $this->options['block-output'] ) ) {
3167
								$this->block_element( $this->options['block-output'] );
3168
							}elseif(!empty($this->options['block-edit-return'])){
3169
								   echo $this->options['block-edit-return'];
3170
							}else{
3171
								// if no block-output is set then we try and get the shortcode html output via ajax.
3172
								$block_edit_wrap_tag = !empty($this->options['block_edit_wrap_tag']) ? esc_attr($this->options['block_edit_wrap_tag']) : 'div';
3173
								?>
3174
								el('<?php echo esc_attr($block_edit_wrap_tag); ?>', wp.blockEditor.useBlockProps({
3175
									dangerouslySetInnerHTML: {__html: onChangeContent()},
3176
									className: props.className,
3177
									<?php //if(isset($this->arguments['visibility_conditions'])){ echo 'dataVisibilityConditionSD: props.visibility_conditions ? true : false,';} //@todo we need to implement this in the other outputs also ?>
3178
									style: {'minHeight': '30px'}
3179
								}))
3180
								<?php
3181
								}
3182
								?>
3183
							]; // end return
3184
3185
							<?php
3186
							} // end block-edit-raw else
3187
							?>
3188
						},
3189
3190
						// The "save" property must be specified and must be a valid function.
3191
						save: function (props) {
3192
3193
							var attr = props.attributes;
3194
							var align = '';
3195
3196
							// build the shortcode.
3197
							var content = "[<?php echo $this->options['base_id'];?>";
3198
							$html = '';
3199
							<?php
3200
3201
							if(! empty( $this->arguments )){
3202
3203
							foreach($this->arguments as $key => $args){
3204
							   // if($args['type']=='tabs'){continue;}
3205
3206
							   // don't add metadata arguments
3207
							   if (substr($key, 0, 9 ) === 'metadata_') {
3208
								   continue;
3209
							   }
3210
							?>
3211
							if (attr.hasOwnProperty("<?php echo esc_attr( $key );?>")) {
3212
								if ('<?php echo esc_attr( $key );?>' == 'html') {
3213
									$html = attr.<?php echo esc_attr( $key );?>;
3214
								} else if ('<?php echo esc_attr( $args['type'] );?>' == 'image_xy') {
3215
									content += " <?php echo esc_attr( $key );?>='{x:" + attr.<?php echo esc_attr( $key );?>.x + ",y:"+attr.<?php echo esc_attr( $key );?>.y +"}' ";
3216
								} else {
3217
									content += " <?php echo esc_attr( $key );?>='" + attr.<?php echo esc_attr( $key );?>.toString().replace('\'','&#39;') + "' ";
3218
								}
3219
							}
3220
							<?php
3221
							}
3222
							}
3223
3224
							?>
3225
							content += "]";
3226
							 content = '';
3227
3228
							<?php
3229
//                            if(!empty($this->options['nested-block'])){
3230
//                                ?>
3231
//                                $html = 'el( InnerBlocks.Content )';
3232
//                                <?php
3233
//                            }
3234
							?>
3235
							// if has html element
3236
							if ($html) {
3237
								//content += $html + "[/<?php echo $this->options['base_id'];?>]";
3238
							}
3239
3240
							// @todo should we add inline style here or just css classes?
3241
							if (attr.alignment) {
3242
								if (attr.alignment == 'left') {
3243
									align = 'alignleft';
3244
								}
3245
								if (attr.alignment == 'center') {
3246
									align = 'aligncenter';
3247
								}
3248
								if (attr.alignment == 'right') {
3249
									align = 'alignright';
3250
								}
3251
							}
3252
3253
							<?php
3254
//							if(!empty($this->options['nested-block'])){
3255
//                                ?x>
3256
//                              return el(
3257
//                                    'div',
3258
//                                    { className: props.className,
3259
//                                        style: {'minHeight': '300px','position':'relative','overflow':'hidden','backgroundImage': 'url(https://s.w.org/images/core/5.5/don-quixote-06.jpg)'}
3260
//                                    },
3261
//                                    el( InnerBlocks.Content ),
3262
//                                    el('div', {dangerouslySetInnerHTML: {__html: content}, className: align})
3263
//                                );
3264
//                                <x?php
3265
//							}else
3266
3267
							if(!empty($this->options['block-output'])){
3268
//                               echo "return";
3269
//                               $this->block_element( $this->options['block-output'], true );
3270
//                               echo ";";
3271
3272
							   ?>
3273
							  return el(
3274
								   '',
3275
								   {},
3276
								  // el('', {dangerouslySetInnerHTML: {__html: content}}),
3277
								   <?php $this->block_element( $this->options['block-output'], true ); ?>
3278
								  // el('', {dangerouslySetInnerHTML: {__html: "[/<?php echo $this->options['base_id'];?>]"}})
3279
							   );
3280
								<?php
3281
3282
							}elseif(!empty($this->options['block-save-return'])){
3283
								   echo 'return ' . $this->options['block-save-return'];
3284
							}elseif(!empty($this->options['nested-block'])){
3285
								?>
3286
							  return el(
3287
								   '',
3288
								   {},
3289
								   el('', {dangerouslySetInnerHTML: {__html: content+"\n"}}),
3290
								   InnerBlocks.Content ? el( InnerBlocks.Content ) : '', // @todo i think we need a comma here
3291
								 //  el('', {dangerouslySetInnerHTML: {__html: "[/<?php echo $this->options['base_id'];?>]"}})
3292
							   );
3293
								<?php
3294
							}elseif(!empty( $this->options['block-save-return'] ) ){
3295
								echo "return ". $this->options['block-edit-return'].";";
3296
							}elseif(isset( $this->options['block-wrap'] ) && $this->options['block-wrap'] == ''){
3297
							?>
3298
							return content;
3299
							<?php
3300
							}else{
3301
							?>
3302
							var block_wrap = 'div';
3303
							if (attr.hasOwnProperty("block_wrap")) {
3304
								block_wrap = attr.block_wrap;
3305
							}
3306
							return el(block_wrap, wp.blockEditor.useBlockProps.save( {dangerouslySetInnerHTML: {__html: content}, className: align} ));
3307
							<?php
3308
							}
3309
							?>
3310
3311
3312
						}
3313
					});
3314
				})(
3315
					window.wp.blocks,
3316
	window.wp.element,
3317
	window.wp.blockEditor
3318
				);
3319
3320
				});
3321
			</script>
3322
			<?php
3323
			$output = ob_get_clean();
3324
3325
			/*
3326
			 * We only add the <script> tags for code highlighting, so we strip them from the output.
3327
			 */
3328
3329
			return str_replace( array(
3330
				'<script>',
3331
				'</script>'
3332
			), '', $output );
3333
		}
3334
3335
3336
3337
		public function block_row_start($key, $args){
0 ignored issues
show
Unused Code introduced by
The parameter $key is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

3337
		public function block_row_start(/** @scrutinizer ignore-unused */ $key, $args){

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
3338
3339
			// check for row
3340
			if(!empty($args['row'])){
3341
3342
				if(!empty($args['row']['open'])){
3343
3344
				// element require
3345
				$element_require = ! empty( $args['element_require'] ) ? $this->block_props_replace( $args['element_require'], true ) . " && " : "";
3346
				$device_type = ! empty( $args['device_type'] ) ? esc_attr($args['device_type']) : '';
3347
				$device_type_require = ! empty( $args['device_type'] ) ? " deviceType == '" . esc_attr($device_type) . "' && " : '';
3348
				$device_type_icon = '';
3349
				if($device_type=='Desktop'){
3350
					$device_type_icon = '<span class="dashicons dashicons-desktop" style="font-size: 18px;" onclick="sd_show_view_options(this);"></span>';
3351
				}elseif($device_type=='Tablet'){
3352
					$device_type_icon = '<span class="dashicons dashicons-tablet" style="font-size: 18px;" onclick="sd_show_view_options(this);"></span>';
3353
				}elseif($device_type=='Mobile'){
3354
					$device_type_icon = '<span class="dashicons dashicons-smartphone" style="font-size: 18px;" onclick="sd_show_view_options(this);"></span>';
3355
				}
3356
				echo $element_require;
3357
				echo $device_type_require;
3358
3359
					if(false){?><script><?php }?>
3360
						el('div', {
3361
								className: 'bsui components-base-control',
3362
							},
3363
							<?php if(!empty($args['row']['title'])){ ?>
3364
							el('label', {
3365
									className: 'components-base-control__label position-relative',
3366
									style: {width:"100%"}
3367
								},
3368
								el('span',{dangerouslySetInnerHTML: {__html: '<?php echo addslashes( $args['row']['title'] ) ?>'}}),
3369
								<?php if($device_type_icon){ ?>
3370
									deviceType == '<?php echo $device_type;?>' && el('span',{dangerouslySetInnerHTML: {__html: '<?php echo $device_type_icon; ?>'},title: deviceType + ": Set preview mode to change",style: {right:"0",position:"absolute",color:"var(--wp-admin-theme-color)"}})
3371
								<?php
3372
								}
3373
								?>
3374
3375
3376
							),
3377
							<?php }?>
3378
							<?php if(!empty($args['row']['desc'])){ ?>
3379
							el('p', {
3380
									className: 'components-base-control__help mb-0',
3381
								},
3382
								'<?php echo addslashes( $args['row']['desc'] ); ?>'
3383
							),
3384
							<?php }?>
3385
							el(
3386
								'div',
3387
								{
3388
									className: 'row mb-n2 <?php if(!empty($args['row']['class'])){ echo esc_attr($args['row']['class']);} ?>',
3389
								},
3390
								el(
3391
									'div',
3392
									{
3393
										className: 'col pr-2 pe-2',
3394
									},
3395
3396
					<?php
3397
					if(false){?></script><?php }
3398
				}elseif(!empty($args['row']['close'])){
3399
					if(false){?><script><?php }?>
3400
						el(
3401
							'div',
3402
							{
3403
								className: 'col pl-0 ps-0',
3404
							},
3405
					<?php
3406
					if(false){?></script><?php }
3407
				}else{
3408
					if(false){?><script><?php }?>
3409
						el(
3410
							'div',
3411
							{
3412
								className: 'col pl-0 ps-0 pr-2 pe-2',
3413
							},
3414
					<?php
3415
					if(false){?></script><?php }
3416
				}
3417
3418
			}
3419
3420
		}
3421
3422
		public function block_row_end($key, $args){
0 ignored issues
show
Unused Code introduced by
The parameter $key is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

3422
		public function block_row_end(/** @scrutinizer ignore-unused */ $key, $args){

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
3423
3424
			if(!empty($args['row'])){
3425
				// maybe close
3426
				if(!empty($args['row']['close'])){
3427
					echo "))";
3428
				}
3429
3430
				echo "),";
3431
			}
3432
		}
3433
3434
		public function block_tab_start($key, $args){
0 ignored issues
show
Unused Code introduced by
The parameter $key is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

3434
		public function block_tab_start(/** @scrutinizer ignore-unused */ $key, $args){

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
3435
3436
			// check for row
3437
			if(!empty($args['tab'])){
3438
3439
				if(!empty($args['tab']['tabs_open'])){
3440
3441
					if(false){?><script><?php }?>
3442
3443
el('div',{className: 'bsui'},
3444
3445
						el('hr', {className: 'm-0'}), el(
3446
									wp.components.TabPanel,
3447
									{
3448
										activeClass: 'is-active',
3449
										className: 'btn-groupx',
3450
										initialTabName: '<?php echo addslashes( esc_attr( $args['tab']['key']) ); ?>',
3451
										tabs: [
3452
3453
					<?php
3454
					if(false){?></script><?php }
3455
				}
3456
3457
				if(!empty($args['tab']['open'])){
3458
3459
					if(false){?><script><?php }?>
3460
							{
3461
												name: '<?php echo addslashes( esc_attr( $args['tab']['key']) ); ?>',
3462
												title: el('div', {dangerouslySetInnerHTML: {__html: '<?php echo addslashes( esc_attr( $args['tab']['title']) ); ?>'}}),
3463
												className: '<?php echo addslashes( esc_attr( $args['tab']['class']) ); ?>',
3464
												content: el('div',{}, <?php if(!empty($args['tab']['desc'])){ ?>el('p', {
3465
									className: 'components-base-control__help mb-0',
3466
									dangerouslySetInnerHTML: {__html:'<?php echo addslashes( $args['tab']['desc'] ); ?>'}
3467
								}),<?php }
3468
					if(false){?></script><?php }
3469
				}
3470
3471
			}
3472
3473
		}
3474
3475
		public function block_tab_end($key, $args){
0 ignored issues
show
Unused Code introduced by
The parameter $key is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

3475
		public function block_tab_end(/** @scrutinizer ignore-unused */ $key, $args){

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
3476
3477
			if(!empty($args['tab'])){
3478
				// maybe close
3479
				if(!empty($args['tab']['close'])){
3480
					echo ")}, /* tab close */";
3481
				}
3482
3483
				if(!empty($args['tab']['tabs_close'])){
3484
					if(false){?><script><?php }?>
3485
						]}, ( tab ) => {
3486
								return tab.content;
3487
							}
3488
						)), /* tabs close */
3489
					<?php if(false){ ?></script><?php }
3490
				}
3491
			}
3492
		}
3493
3494
		public function build_block_arguments( $key, $args ) {
3495
			$custom_attributes = ! empty( $args['custom_attributes'] ) ? $this->array_to_attributes( $args['custom_attributes'] ) : '';
3496
			$options           = '';
3497
			$extra             = '';
3498
			$require           = '';
0 ignored issues
show
Unused Code introduced by
The assignment to $require is dead and can be removed.
Loading history...
3499
			$inside_elements   = '';
3500
			$after_elements	   = '';
3501
3502
			// `content` is a protected and special argument
3503
			if ( $key == 'content' ) {
3504
				return;
3505
			}
3506
3507
			$device_type = ! empty( $args['device_type'] ) ? esc_attr($args['device_type']) : '';
3508
			$device_type_require = ! empty( $args['device_type'] ) ? " deviceType == '" . esc_attr($device_type) . "' && " : '';
3509
			$device_type_icon = '';
3510
			if($device_type=='Desktop'){
3511
				$device_type_icon = '<span class="dashicons dashicons-desktop" style="font-size: 18px;" onclick="sd_show_view_options(this);"></span>';
3512
			}elseif($device_type=='Tablet'){
3513
				$device_type_icon = '<span class="dashicons dashicons-tablet" style="font-size: 18px;" onclick="sd_show_view_options(this);"></span>';
3514
			}elseif($device_type=='Mobile'){
3515
				$device_type_icon = '<span class="dashicons dashicons-smartphone" style="font-size: 18px;" onclick="sd_show_view_options(this);"></span>';
3516
			}
3517
3518
			// icon
3519
			$icon = '';
3520
			if( !empty( $args['icon'] ) ){
3521
				$icon .= "el('div', {";
3522
									$icon .= "dangerouslySetInnerHTML: {__html: '".self::get_widget_icon( esc_attr($args['icon']))."'},";
0 ignored issues
show
Bug Best Practice introduced by
The method WP_Super_Duper::get_widget_icon() is not static, but was called statically. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

3522
									$icon .= "dangerouslySetInnerHTML: {__html: '".self::/** @scrutinizer ignore-call */ get_widget_icon( esc_attr($args['icon']))."'},";
Loading history...
3523
									$icon .= "className: 'text-center',";
3524
									$icon .= "title: '".addslashes( $args['title'] )."',";
3525
								$icon .= "}),";
3526
3527
				// blank title as its added to the icon.
3528
				$args['title'] = '';
3529
			}
3530
3531
			// require advanced
3532
			$require_advanced = ! empty( $args['advanced'] ) ? "props.attributes.show_advanced && " : "";
3533
3534
			// element require
3535
			$element_require = ! empty( $args['element_require'] ) ? $this->block_props_replace( $args['element_require'], true ) . " && " : "";
3536
3537
3538
			$onchange  = "props.setAttributes({ $key: $key } )";
3539
			$onchangecomplete  = "";
3540
			$value     = "props.attributes.$key";
3541
			$text_type = array( 'text', 'password', 'number', 'email', 'tel', 'url', 'colorx','range' );
3542
			if ( in_array( $args['type'], $text_type ) ) {
3543
				$type = 'TextControl';
3544
				// Save numbers as numbers and not strings
3545
				if ( $args['type'] == 'number' ) {
3546
					$onchange = "props.setAttributes({ $key: $key ? Number($key) : '' } )";
3547
				}
3548
3549
				if (substr($key, 0, 9 ) === 'metadata_') {
3550
					$real_key = str_replace('metadata_','', $key );
3551
					$onchange = "props.setAttributes({ metadata: { $real_key: $key } } )";
3552
					$value     = "props.attributes.metadata && props.attributes.metadata.$real_key ? props.attributes.metadata.$real_key : ''";
3553
				}
3554
			}
3555
//			else if ( $args['type'] == 'popup' ) {
3556
//				$type = 'TextControl';
3557
//				$args['type'] == 'text';
3558
//				$after_elements .= "el( wp.components.Button, {
3559
//                          className: 'components-button components-circular-option-picker__clear is-primary is-smallx',
3560
//                          onClick: function(){
3561
//							  aui_modal('','<input id=\'zzz\' value= />');
3562
//							  const source = document.getElementById('zzz');
3563
//							  source.value = props.attributes.$key;
3564
//							  source.addEventListener('input', function(e){props.setAttributes({ $key: e.target.value });});
3565
//                          }
3566
//                        },
3567
//                        'test'
3568
//                        ),";
3569
//
3570
//				$value     = "props.attributes.$key ? props.attributes.$key : ''";
3571
//			}
3572
			else if ( $args['type'] == 'styleid' ) {
3573
				$type = 'TextControl';
3574
				$args['type'] == 'text';
3575
				// Save numbers as numbers and not strings
3576
				$value     = "props.attributes.$key ? props.attributes.$key : ''";
3577
			}else if ( $args['type'] == 'notice' ) {
3578
3579
				$notice_message = !empty($args['desc']) ? addslashes($args['desc']) : '';
3580
				$notice_status = !empty($args['status']) ? esc_attr($args['status']) : 'info';
3581
3582
				$notice = "el('div',{className:'bsui'},el(wp.components.Notice, {status: '$notice_status',isDismissible: false,className: 'm-0 pr-0 pe-0 mb-3'},el('div',{dangerouslySetInnerHTML: {__html: '$notice_message'}}))),";
3583
				echo $notice_message ? $element_require . $notice : '';
3584
				return;
3585
			}
3586
			/*
3587
			 * https://www.wptricks.com/question/set-current-tab-on-a-gutenberg-tabpanel-component-from-outside-that-component/ es5 layout
3588
						elseif($args['type']=='tabs'){
3589
							?>
3590
								el(
3591
									wp.components.TabPanel,
3592
									{
3593
										activeClass: 'active-tab',
3594
										initialTabName: deviceType,
3595
										tabs: [
3596
											{
3597
												name: 'Desktop',
3598
												title: el('div', {dangerouslySetInnerHTML: {__html: '<i class="fas fa-desktop"></i>'}}),
3599
												className: 'tab-one' + deviceType == 'Desktop' ? ' active-tab' : '',
3600
												content: el('div', {dangerouslySetInnerHTML: {__html: 'ddd'}})
3601
											},
3602
											{
3603
												name: 'Tablet',
3604
												title: el('div', {dangerouslySetInnerHTML: {__html: '<i class="fas fa-tablet-alt"></i>'}}),
3605
												className: 'tab-two' + deviceType == 'Tablet' ? ' active-tab' : '',
3606
												content: el('div', {dangerouslySetInnerHTML: {__html: 'ttt'}})
3607
											},
3608
											{
3609
												name: 'Mobile',
3610
												title: el('div', {dangerouslySetInnerHTML: {__html: '<i class="fas fa-mobile-alt"></i>'}}),
3611
												className: 'tab-two' + deviceType == 'Mobile' ? ' active-tab' : '',
3612
												content: el('div', {dangerouslySetInnerHTML: {__html: 'mmm'}})
3613
											},
3614
										],
3615
									},
3616
									( tab ) => {
3617
3618
// @todo https://github.com/WordPress/gutenberg/issues/39248
3619
									if(tab.name=='Desktop'){
3620
									wp.data.dispatch('core/edit-post').__experimentalSetPreviewDeviceType('Desktop');
3621
wp.data.select('core/edit-post').__experimentalGetPreviewDeviceType();
3622
									}else if(tab.name=='Tablet'){
3623
									wp.data.dispatch('core/edit-post').__experimentalSetPreviewDeviceType('Tablet');
3624
wp.data.select('core/edit-post').__experimentalGetPreviewDeviceType();
3625
									}else if(tab.name=='Mobile'){
3626
									wp.data.dispatch('core/edit-post').__experimentalSetPreviewDeviceType('Mobile');
3627
wp.data.select('core/edit-post').__experimentalGetPreviewDeviceType();
3628
									}
3629
3630
									return tab.content;
3631
3632
								}
3633
								),
3634
3635
							<?php
3636
							return;
3637
						}
3638
*/
3639
			elseif ( $args['type'] == 'color' ) {
3640
				$type = 'ColorPicker';
3641
				$onchange = "";
3642
				$extra = "color: $value,";
3643
				if(!empty($args['disable_alpha'])){
3644
					$extra .= "disableAlpha: true,";
3645
				}
3646
				$onchangecomplete = "onChangeComplete: function($key) {
3647
				value =  $key.rgb.a && $key.rgb.a < 1 ? \"rgba(\"+$key.rgb.r+\",\"+$key.rgb.g+\",\"+$key.rgb.b+\",\"+$key.rgb.a+\")\" : $key.hex;
3648
						props.setAttributes({
3649
							$key: value
3650
						});
3651
					},";
3652
			}elseif ( $args['type'] == 'gradient' ) {
3653
				$type = 'GradientPicker';
3654
				$extra .= "gradients: [{
3655
			name: 'Vivid cyan blue to vivid purple',
3656
			gradient:
3657
				'linear-gradient(135deg,rgba(6,147,227,1) 0%,rgb(155,81,224) 100%)',
3658
			slug: 'vivid-cyan-blue-to-vivid-purple',
3659
		},
3660
		{
3661
			name: 'Light green cyan to vivid green cyan',
3662
			gradient:
3663
				'linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%)',
3664
			slug: 'light-green-cyan-to-vivid-green-cyan',
3665
		},
3666
		{
3667
			name: 'Luminous vivid amber to luminous vivid orange',
3668
			gradient:
3669
				'linear-gradient(135deg,rgba(252,185,0,1) 0%,rgba(255,105,0,1) 100%)',
3670
			slug: 'luminous-vivid-amber-to-luminous-vivid-orange',
3671
		},
3672
		{
3673
			name: 'Luminous vivid orange to vivid red',
3674
			gradient:
3675
				'linear-gradient(135deg,rgba(255,105,0,1) 0%,rgb(207,46,46) 100%)',
3676
			slug: 'luminous-vivid-orange-to-vivid-red',
3677
		},
3678
		{
3679
			name: 'Very light gray to cyan bluish gray',
3680
			gradient:
3681
				'linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%)',
3682
			slug: 'very-light-gray-to-cyan-bluish-gray',
3683
		},
3684
		{
3685
			name: 'Cool to warm spectrum',
3686
			gradient:
3687
				'linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%)',
3688
			slug: 'cool-to-warm-spectrum',
3689
		}],";
3690
3691
			}elseif ( $args['type'] == 'image' ) {
3692
//                print_r($args);
3693
3694
				$img_preview = isset($args['focalpoint']) && !$args['focalpoint'] ? " props.attributes.$key && el('img', { src: props.attributes.$key,style: {maxWidth:'100%',background: '#ccc'}})," : " ( props.attributes.$key ||  props.attributes.{$key}_use_featured ) && el(wp.components.FocalPointPicker,{
3695
							url:  props.attributes.{$key}_use_featured === true ? 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxzdmcgYmFzZVByb2ZpbGU9InRpbnkiIGhlaWdodD0iNDAwIiB2ZXJzaW9uPSIxLjIiIHdpZHRoPSI0MDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6ZXY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLWV2ZW50cyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPjxkZWZzIC8+PHJlY3QgZmlsbD0iI2QzZDNkMyIgaGVpZ2h0PSI0MDAiIHdpZHRoPSI0MDAiIHg9IjAiIHk9IjAiIC8+PGxpbmUgc3Ryb2tlPSJ3aGl0ZSIgc3Ryb2tlLXdpZHRoPSIxMCIgeDE9IjAiIHgyPSI0MDAiIHkxPSIwIiB5Mj0iNDAwIiAvPjxsaW5lIHN0cm9rZT0id2hpdGUiIHN0cm9rZS13aWR0aD0iMTAiIHgxPSIwIiB4Mj0iNDAwIiB5MT0iNDAwIiB5Mj0iMCIgLz48cmVjdCBmaWxsPSIjZDNkM2QzIiBoZWlnaHQ9IjUwIiB3aWR0aD0iMjE4LjAiIHg9IjkxLjAiIHk9IjE3NS4wIiAvPjx0ZXh0IGZpbGw9IndoaXRlIiBmb250LXNpemU9IjMwIiBmb250LXdlaWdodD0iYm9sZCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjAwLjAiIHk9IjIwNy41Ij5QTEFDRUhPTERFUjwvdGV4dD48L3N2Zz4='  : props.attributes.$key,
3696
							value: props.attributes.{$key}_xy.x !== undefined && props.attributes.{$key}_xy.x >= 0 ? props.attributes.{$key}_xy  : {x: 0.5,y: 0.5,},
3697
//                            value: props.attributes.{$key}_xy,
3698
							onChange: function(focalPoint){
3699
							console.log(props.attributes);
3700
											  return props.setAttributes({
3701
												  {$key}_xy: focalPoint
3702
												});
3703
									},
3704
									// @todo for some reason this does not work as expected.
3705
//                         onDrag: function(focalPointTemp){
3706
//                                  return props.setAttributes({
3707
//                                      {$key}_xy: focalPointTemp
3708
//                                    });
3709
//                        }
3710
3711
3712
						}), ";
3713
3714
3715
				$value = '""';
3716
				$type = 'MediaUpload';
3717
				$extra .= "onSelect: function(media){
3718
					  return props.setAttributes({
3719
						  $key: media.url,
3720
						  {$key}_id: media.id
3721
						});
3722
					  },";
3723
				   $extra .= "type: 'image',";
3724
				   $extra .= "render: function (obj) {
3725
						return el( 'div',{},
3726
						( !props.attributes.$key && !props.attributes.{$key}_use_featured ) && el( wp.components.Button, {
3727
						  className: 'components-button components-circular-option-picker__clear is-primary is-smallx',
3728
						  onClick: obj.open
3729
						},
3730
						'Upload Image'
3731
						),
3732
					   $img_preview
3733
						props.attributes.$key && el( wp.components.Button, {
3734
									  className: 'components-button components-circular-option-picker__clear is-secondary is-small',
3735
									  style: {margin:'8px 0',display: 'block'},
3736
									  onClick: function(){
3737
											  return props.setAttributes({
3738
												  $key: '',
3739
												  {$key}_id: ''
3740
												});
3741
									}
3742
									},
3743
									props.attributes.$key? 'Clear' : ''
3744
							)
3745
					   )
3746
3747
3748
3749
					  }";
3750
				$onchange = "";
3751
3752
				//$inside_elements = ",el('div',{},'file upload')";
3753
			} else if ( $args['type'] == 'images' ) {
3754
				$img_preview = "props.attributes.$key && (function() {
3755
	let uploads = JSON.parse('['+props.attributes.$key+']');
3756
	let images = [];
3757
	uploads.map((upload, index) => (
3758
		images.push( el('div',{ className: 'col p-2', draggable: 'true', 'data-index': index },
3759
			el('img', {
3760
				src: (upload.sizes && upload.sizes.thumbnail ? upload.sizes.thumbnail.url : upload.url),
3761
				style: { maxWidth:'100%', background: '#ccc', pointerEvents:'none' }
3762
			}),
3763
			el('i',{
3764
				className: 'fas fa-times-circle text-danger position-absolute  ml-n2 mt-n1 bg-white rounded-circle c-pointer',
3765
				onClick: function() {
3766
					aui_confirm('".esc_attr__('Are you sure?')."', '".esc_attr__('Delete')."', '".esc_attr__('Cancel')."', true).then(function(confirmed) {
3767
						if (confirmed) {
3768
							let new_uploads = JSON.parse('['+props.attributes.$key+']');
3769
							new_uploads.splice(index, 1);
3770
								return props.setAttributes({ {$key}: JSON.stringify( new_uploads ).replace('[','').replace(']','') });
3771
							}
3772
					});
3773
				}},
3774
			'')
3775
		))
3776
	));
3777
	return images;
3778
})(),";
3779
3780
3781
				$value = '""';
3782
				$type = 'MediaUpload';
3783
				$extra .= "onSelect: function(media){
3784
	let slim_images = props.attributes.$key ? JSON.parse('['+props.attributes.$key+']') : [];
3785
	if(media.length){
3786
		for (var i=0; i < media.length; i++) {
3787
			slim_images.push({id: media[i].id, caption: media[i].caption, description: media[i].description,title: media[i].title,alt: media[i].alt,sizes: media[i].sizes, url: media[i].url});
3788
		}
3789
	}
3790
	var slimImagesV = JSON.stringify(slim_images);
3791
	if (slimImagesV) {
3792
		slimImagesV = slimImagesV.replace('[','').replace(']','').replace(/'/g, '&#39;');
3793
	}
3794
	return props.setAttributes({ $key: slimImagesV});
3795
},";
3796
				$extra .= "type: 'image',";
3797
				$extra .= "multiple: true,";
3798
				$extra .= "render: function (obj) {
3799
	/* Init the sort */
3800
	enableDragSort('sd-sortable');
3801
	return el( 'div',{},
3802
		el( wp.components.Button, {
3803
				className: 'components-button components-circular-option-picker__clear is-primary is-smallx',
3804
				onClick: obj.open
3805
			},
3806
			'Upload Images'
3807
		),
3808
		el('div',{
3809
				className: 'row row-cols-3 px-2 sd-sortable',
3810
				'data-field':'$key'
3811
			},
3812
			$img_preview
3813
		),
3814
		props.attributes.$key && el( wp.components.Button, {
3815
				className: 'components-button components-circular-option-picker__clear is-secondary is-small',
3816
				style: {margin:'8px 0'},
3817
				onClick: function(){
3818
					return props.setAttributes({ $key: '' });
3819
				}
3820
			},
3821
			props.attributes.$key ? 'Clear All' : ''
3822
		)
3823
	)
3824
}";
3825
				$onchange = "";
3826
3827
				//$inside_elements = ",el('div',{},'file upload')";
3828
			}
3829
			elseif ( $args['type'] == 'checkbox' ) {
3830
				$type = 'CheckboxControl';
3831
				$extra .= "checked: props.attributes.$key,";
3832
				$onchange = "props.setAttributes({ $key: ! props.attributes.$key } )";
3833
			} elseif ( $args['type'] == 'textarea' ) {
3834
				$type = 'TextareaControl';
3835
3836
			} elseif ( $args['type'] == 'select' || $args['type'] == 'multiselect' ) {
3837
				$type = 'SelectControl';
3838
3839
				if($args['name'] == 'category' && !empty($args['post_type_linked'])){
3840
					$options .= "options: taxonomies_".str_replace("-","_", $this->id).",";
3841
				}elseif($args['name'] == 'sort_by' && !empty($args['post_type_linked'])){
3842
					$options .= "options: sort_by_".str_replace("-","_", $this->id).",";
3843
				}else {
3844
3845
					if ( ! empty( $args['options'] ) ) {
3846
						$options .= "options: [";
3847
						foreach ( $args['options'] as $option_val => $option_label ) {
3848
							$options .= "{ value: '" . esc_attr( $option_val ) . "', label: '" . esc_js( addslashes( $option_label ) ) . "' },";
3849
						}
3850
						$options .= "],";
3851
					}
3852
				}
3853
				if ( isset( $args['multiple'] ) && $args['multiple'] ) { //@todo multiselect does not work at the moment: https://github.com/WordPress/gutenberg/issues/5550
3854
					$extra .= ' multiple:true,style:{height:"auto",paddingRight:"8px","overflow-y":"auto"}, ';
3855
				}
3856
3857
				if($args['type'] == 'multiselect' ||  ( isset( $args['multiple'] ) && $args['multiple'] ) ){
3858
					$after_elements	 .= "props.attributes.$key && el( wp.components.Button, {
3859
									  className: 'components-button components-circular-option-picker__clear is-secondary is-small',
3860
									  style: {margin:'-8px 0 8px 0',display: 'block'},
3861
									  onClick: function(){
3862
											  return props.setAttributes({
3863
												  $key: '',
3864
												});
3865
									}
3866
									},
3867
									'Clear'
3868
							),";
3869
				}
3870
			} elseif ( $args['type'] == 'tagselect' ) {
3871
//				$type = 'FormTokenField';
3872
//
3873
//				if ( ! empty( $args['options'] ) ) {
3874
//						$options .= "suggestions: [";
3875
//						foreach ( $args['options'] as $option_val => $option_label ) {
3876
//							$options .= "{ value: '" . esc_attr( $option_val ) . "', title: '" . addslashes( $option_label ) . "' },";
3877
////							$options .= "'" . esc_attr( $option_val ) . "':'" . addslashes( $option_label ) . "',";
3878
//						}
3879
//						$options .= "],";
3880
//				}
3881
//
3882
//				$onchangex  = "{ ( selectedItems ) => {
3883
//						// Build array of selected posts.
3884
//						let selectedPostsArray = [];
3885
//						selectedPosts.map(
3886
//							( postName ) => {
3887
//								const matchingPost = posts.find( ( post ) => {
3888
//									return post.title.raw === postName;
3889
//
3890
//								} );
3891
//								if ( matchingPost !== undefined ) {
3892
//									selectedPostsArray.push( matchingPost.id );
3893
//								}
3894
//							}
3895
//						)
3896
//
3897
//						setAttributes( { selectedPosts: selectedPostsArray } );
3898
//					} } ";
3899
//				$onchange  = '';// "props.setAttributes({ $key: [ props.attributes.$key ] } )";
3900
//
3901
////				$options  = "";
3902
//				$value     = "[]";
3903
//				$extra .= ' __experimentalExpandOnFocus: true,';
3904
3905
			} else if ( $args['type'] == 'alignment' ) {
3906
				$type = 'AlignmentToolbar'; // @todo this does not seem to work but cant find a example
3907
			} else if ( $args['type'] == 'margins' ) {
3908
3909
			} else if ( $args['type'] == 'visibility_conditions' && ( function_exists( 'wp_is_block_theme' ) && wp_is_block_theme() ) ) {
3910
				$type = 'TextControl';
3911
				$value = "(props.attributes.$key ? props.attributes.$key : '')";
3912
				$args['type'] = 'text';
3913
				$options .= 'disabled:true,';
3914
				$bsvc_title = esc_attr( addslashes( $args['title'] ) );
3915
				$bsvc_body = $this->block_visibility_fields( $args );
3916
				// @TODO reset button
3917
				$bsvc_footer = '<button type="button" class="btn btn-danger d-none">' . __( 'Reset', 'ayecode-connect' ) . '</button><button type="button" class="btn btn-secondary bs-vc-close text-white" data-bs-dismiss="modal">' . __( 'Close', 'ayecode-connect' ) . '</button><button type="button" class="btn btn-primary bs-vc-save">' . __( 'Save Rules', 'ayecode-connect' ) . '</button>';
3918
				$after_elements .= "el('div', {className: 'components-base-control bs-vc-button-wrap'}, el(wp.components.Button, {
3919
						className: 'components-button components-circular-option-picker__clear is-primary is-smallx',
3920
						onClick: function() {
3921
							var sValue = props.attributes." . $key . ";
3922
							var oValue;
3923
							try {oValue = JSON.parse(sValue);} catch(err) {}
3924
							jQuery(document).off('show.bs.modal', '.bs-vc-modal').on('show.bs.modal', '.bs-vc-modal', function (e) {
3925
								if (e.target && jQuery(e.target).hasClass('bs-vc-modal')) {
3926
									sd_block_visibility_render_fields(oValue);
3927
									if (!jQuery('.bs-vc-modal-form .bs-vc-rule-sets .bs-vc-rule').length) {
3928
										jQuery('.bs-vc-modal-form .bs-vc-add-rule').trigger('click');
3929
									}
3930
									if(typeof aui_init_select2 == 'function') {
3931
										aui_init_select2();
3932
									}
3933
									jQuery('.bs-vc-modal-form').trigger('change');
3934
								}
3935
							});
3936
							aui_modal('" . $bsvc_title . "', '" . addslashes( $bsvc_body ) . "', '" . $bsvc_footer . "', true, 'bs-vc-modal', 'modal-lg', '');
3937
							jQuery(document).off('change', '#bsvc_raw_value').on('change', '#bsvc_raw_value', function(e) {
3938
								props.setAttributes({" . $key . ": e.target.value});
3939
							});
3940
						}
3941
					},
3942
					'" . addslashes( ! empty( $args['button_title'] ) ? $args['button_title'] : $args['title'] ) . "'
3943
				) ),";
3944
			} else {
3945
				return;// if we have not implemented the control then don't break the JS.
3946
			}
3947
3948
			// color input does not show the labels so we add them
3949
			if($args['type']=='color'){
3950
				// add show only if advanced
3951
				echo $require_advanced;
3952
				// add setting require if defined
3953
				echo $element_require;
3954
				echo "el('div', {style: {'marginBottom': '8px'}}, '".addslashes( $args['title'] )."'),";
3955
			}
3956
3957
			// add show only if advanced
3958
			echo $require_advanced;
3959
			// add setting require if defined
3960
			echo $element_require;
3961
			echo $device_type_require;
3962
3963
			// icon
3964
			echo $icon;
3965
			?>
3966
			el( <?php echo $args['type'] == 'image' || $args['type'] == 'images' ? $type  : "wp.components.".$type; ?>, {
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $type does not seem to be defined for all execution paths leading up to this point.
Loading history...
3967
			label: <?php if ( empty( $args['title'] ) ) { echo "''"; } else if ( empty( $args['row'] ) && ! empty( $args['device_type'] ) ) { ?>el('label',{className:'components-base-control__label',style:{width:"100%"}},el('span',{dangerouslySetInnerHTML: {__html: '<?php echo addslashes( $args['title'] ) ?>'}}),<?php if ( $device_type_icon ) { ?>deviceType == '<?php echo $device_type;?>' && el('span',{dangerouslySetInnerHTML: {__html: '<?php echo $device_type_icon; ?>'},title: deviceType + ": Set preview mode to change",style: {right:"0",position:"absolute",color:"var(--wp-admin-theme-color)"}})<?php } ?>)<?php
3968
			} else { ?>'<?php echo addslashes( trim( esc_html( $args['title'] ) ) ); ?>'<?php } ?>,
3969
			help: <?php echo ( isset( $args['desc'] ) ? "el('span', {dangerouslySetInnerHTML: {__html: '" . trim( wp_kses_post( addslashes( $args['desc'] ) ) ) . "'}})" : "''" ); ?>,
3970
			value: <?php echo $value; ?>,
3971
			<?php if ( $type == 'TextControl' && $args['type'] != 'text' ) {
3972
				echo "type: '" . addslashes( $args['type'] ) . "',";
3973
			} ?>
3974
			<?php if ( ! empty( $args['placeholder'] ) ) {
3975
				echo "placeholder: '" . esc_js( addslashes( trim( esc_html( $args['placeholder'] ) ) ) ) . "',";
3976
			} ?>
3977
			<?php echo $options; ?>
3978
			<?php echo $extra; ?>
3979
			<?php echo $custom_attributes; ?>
3980
			<?php echo $onchangecomplete; ?>
3981
			<?php if ( $onchange ) { ?>
3982
			onChange: function ( <?php echo $key; ?> ) {
3983
				<?php echo $onchange; ?>
3984
			}
3985
			<?php } ?>
3986
		} <?php echo $inside_elements; ?> ),
3987
			<?php
3988
			echo $after_elements;
3989
		}
3990
3991
		/**
3992
		 * Convert an array of attributes to block string.
3993
		 *
3994
		 * @param $custom_attributes
3995
		 *
3996
		 * @return string
3997
		 *@todo there is prob a faster way to do this, also we could add some validation here.
3998
		 *
3999
		 */
4000
		public function array_to_attributes( $custom_attributes, $html = false ) {
4001
			$attributes = '';
4002
			if ( ! empty( $custom_attributes ) ) {
4003
4004
				foreach ( $custom_attributes as $key => $val ) {
4005
					if(is_array($val)){
4006
						$attributes .= $key.': {'.$this->array_to_attributes( $val, $html ).'},';
4007
					}else{
4008
						$attributes .= $html ?  " $key='$val' " : "'$key': '$val',";
4009
					}
4010
				}
4011
4012
			}
4013
4014
			return $attributes;
4015
		}
4016
4017
4018
4019
		/**
4020
		 * A self looping function to create the output for JS block elements.
4021
		 *
4022
		 * This is what is output in the WP Editor visual view.
4023
		 *
4024
		 * @param $args
4025
		 */
4026
		public function block_element( $args, $save = false ) {
4027
4028
//            print_r($args);echo '###';exit;
4029
4030
			if ( ! empty( $args ) ) {
4031
				foreach ( $args as $element => $new_args ) {
4032
4033
					if ( is_array( $new_args ) ) { // its an element
4034
4035
4036
						if ( isset( $new_args['element'] ) ) {
4037
4038
							if ( isset( $new_args['element_require'] ) ) {
4039
								echo str_replace( array(
4040
										"'+",
4041
										"+'"
4042
									), '', $this->block_props_replace( $new_args['element_require'] ) ) . " &&  ";
4043
								unset( $new_args['element_require'] );
4044
							}
4045
4046
							if($new_args['element']=='InnerBlocks'){
4047
								echo "\n el( InnerBlocks, {";
4048
							}elseif($new_args['element']=='innerBlocksProps'){
4049
								$element = isset($new_args['inner_element']) ? esc_attr($new_args['inner_element']) : 'div';
4050
							  //  echo "\n el( 'section', wp.blockEditor.useInnerBlocksProps( blockProps, {";
4051
//                                echo $save ? "\n el( '$element', wp.blockEditor.useInnerBlocksProps.save( " : "\n el( '$element', wp.blockEditor.useInnerBlocksProps( ";
4052
								echo $save ? "\n el( '$element', wp.blockEditor.useInnerBlocksProps.save( " : "\n el( '$element', wp.blockEditor.useInnerBlocksProps( ";
4053
								echo $save ? "wp.blockEditor.useBlockProps.save( {" : "wp.blockEditor.useBlockProps( {";
4054
								echo !empty($new_args['blockProps']) ? $this->block_element( $new_args['blockProps'],$save ) : '';
4055
4056
								echo "} ), {";
4057
								echo !empty($new_args['innerBlocksProps']) && !$save ? $this->block_element( $new_args['innerBlocksProps'],$save ) : '';
4058
							//    echo '###';
4059
4060
							  //  echo '###';
4061
							}elseif($new_args['element']=='BlocksProps'){
4062
4063
								if ( isset($new_args['if_inner_element']) ) {
4064
									$element = $new_args['if_inner_element'];
4065
								}else {
4066
									$element = isset($new_args['inner_element']) ? "'".esc_attr($new_args['inner_element'])."'" : "'div'";
4067
								}
4068
4069
								unset($new_args['inner_element']);
4070
								echo $save ? "\n el( $element, wp.blockEditor.useBlockProps.save( {" : "\n el( $element, wp.blockEditor.useBlockProps( {";
4071
								echo !empty($new_args['blockProps']) ? $this->block_element( $new_args['blockProps'],$save ) : '';
4072
4073
4074
							   // echo "} ),";
4075
4076
							}else{
4077
								echo "\n el( '" . $new_args['element'] . "', {";
4078
							}
4079
4080
4081
							// get the attributes
4082
							foreach ( $new_args as $new_key => $new_value ) {
4083
4084
4085
								if ( $new_key == 'element' || $new_key == 'content'|| $new_key == 'if_content' || $new_key == 'element_require' || $new_key == 'element_repeat' || is_array( $new_value ) ) {
4086
									// do nothing
4087
								} else {
4088
									echo $this->block_element( array( $new_key => $new_value ),$save );
4089
								}
4090
							}
4091
4092
							echo $new_args['element']=='BlocksProps' ? '} ),' : "},";// end attributes
4093
4094
							// get the content
4095
							$first_item = 0;
4096
							foreach ( $new_args as $new_key => $new_value ) {
4097
								if ( $new_key === 'content' || $new_key === 'if_content' || is_array( $new_value ) ) {
4098
4099
									if ( $new_key === 'content' ) {
4100
										echo "'" . $this->block_props_replace( wp_slash( $new_value ) ) . "'";
4101
									}else if ( $new_key === 'if_content' ) {
4102
										echo  $this->block_props_replace(  $new_value  );
4103
									}
4104
4105
									if ( is_array( $new_value ) ) {
4106
4107
										if ( isset( $new_value['element_require'] ) ) {
4108
											echo str_replace( array(
4109
													"'+",
4110
													"+'"
4111
												), '', $this->block_props_replace( $new_value['element_require'] ) ) . " &&  ";
4112
											unset( $new_value['element_require'] );
4113
										}
4114
4115
										if ( isset( $new_value['element_repeat'] ) ) {
4116
											$x = 1;
4117
											while ( $x <= absint( $new_value['element_repeat'] ) ) {
4118
												$this->block_element( array( '' => $new_value ),$save );
4119
												$x ++;
4120
											}
4121
										} else {
4122
											$this->block_element( array( '' => $new_value ),$save );
4123
										}
4124
									}
4125
									$first_item ++;
4126
								}
4127
							}
4128
4129
							if($new_args['element']=='innerBlocksProps' || $new_args['element']=='xBlocksProps'){
4130
								echo "))";// end content
4131
							}else{
4132
								echo ")";// end content
4133
							}
4134
4135
4136
							echo ", \n";
4137
4138
						}
4139
					} else {
4140
4141
						if ( substr( $element, 0, 3 ) === "if_" ) {
4142
							$extra = '';
0 ignored issues
show
Unused Code introduced by
The assignment to $extra is dead and can be removed.
Loading history...
4143
							if( strpos($new_args, '[%WrapClass%]') !== false ){
4144
								$new_args = str_replace('[%WrapClass%]"','" + sd_build_aui_class(props.attributes)',$new_args);
4145
								$new_args = str_replace('[%WrapClass%]','+ sd_build_aui_class(props.attributes)',$new_args);
4146
							}
4147
							echo str_replace( "if_", "", $element ) . ": " . $this->block_props_replace( $new_args, true ) . ",";
4148
						} elseif ( $element == 'style' &&  strpos($new_args, '[%WrapStyle%]') !== false ) {
4149
							$new_args = str_replace('[%WrapStyle%]','',$new_args);
4150
							echo $element . ": {..." . $this->block_props_replace( $new_args ) . " , ...sd_build_aui_styles(props.attributes) },";
4151
//                            echo $element . ": " . $this->block_props_replace( $new_args ) . ",";
4152
						} elseif ( $element == 'style' ) {
4153
							echo $element . ": " . $this->block_props_replace( $new_args ) . ",";
4154
						} elseif ( ( $element == 'class' || $element == 'className'  ) &&  strpos($new_args, '[%WrapClass%]') !== false ) {
4155
							$new_args = str_replace('[%WrapClass%]','',$new_args);
4156
							echo $element . ": '" . $this->block_props_replace( $new_args ) . "' + sd_build_aui_class(props.attributes),";
4157
						} elseif ( $element == 'template' && $new_args ) {
4158
							echo $element . ": $new_args,";
4159
						} else {
4160
							echo $element . ": '" . $this->block_props_replace( $new_args ) . "',";
4161
						}
4162
4163
					}
4164
				}
4165
			}
4166
		}
4167
4168
		/**
4169
		 * Replace block attributes placeholders with the proper naming.
4170
		 *
4171
		 * @param $string
4172
		 *
4173
		 * @return mixed
4174
		 */
4175
		public function block_props_replace( $string, $no_wrap = false ) {
4176
			if ( $no_wrap ) {
4177
				$string = str_replace( array( "[%", "%]", "%:checked]" ), array( "props.attributes.", "", "" ), $string );
4178
			} else {
4179
				$string = str_replace( array( "![%", "[%", "%]", "%:checked]" ), array( "'+!props.attributes.", "'+props.attributes.", "+'", "+'" ), $string );
4180
			}
4181
4182
			return $string;
4183
		}
4184
4185
		/**
4186
		 * Outputs the content of the widget
4187
		 *
4188
		 * @param array $args
4189
		 * @param array $instance
4190
		 */
4191
		public function widget( $args, $instance ) {
4192
			if ( ! is_array( $args ) ) {
0 ignored issues
show
introduced by
The condition is_array($args) is always true.
Loading history...
4193
				$args = array();
4194
			}
4195
4196
			// Get the filtered values
4197
			$argument_values = $this->argument_values( $instance );
4198
			$argument_values = $this->string_to_bool( $argument_values );
4199
			$output          = $this->output( $argument_values, $args );
0 ignored issues
show
Bug introduced by
Are you sure the assignment to $output is correct as $this->output($argument_values, $args) targeting WP_Super_Duper::output() seems to always return null.

This check looks for function or method calls that always return null and whose return value is assigned to a variable.

class A
{
    function getObject()
    {
        return null;
    }

}

$a = new A();
$object = $a->getObject();

The method getObject() can return nothing but null, so it makes no sense to assign that value to a variable.

The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes.

Loading history...
4200
4201
			$no_wrap = false;
4202
			if ( isset( $argument_values['no_wrap'] ) && $argument_values['no_wrap'] ) {
4203
				$no_wrap = true;
4204
			}
4205
4206
			ob_start();
4207
			if ( $output && ! $no_wrap ) {
0 ignored issues
show
introduced by
$output is defined implicitly as null, thus it is always evaluated to false.
Loading history...
4208
4209
				$class_original = $this->options['widget_ops']['classname'];
4210
				$class = $this->options['widget_ops']['classname']." sdel-".$this->get_instance_hash();
4211
4212
				// Before widget
4213
				$before_widget = ! empty( $args['before_widget'] ) ? $args['before_widget'] : '';
4214
				$before_widget = $before_widget ? str_replace( $class_original, $class, $before_widget ) : $before_widget;
4215
				$before_widget = apply_filters( 'wp_super_duper_before_widget', $before_widget, $args, $instance, $this );
4216
				$before_widget = apply_filters( 'wp_super_duper_before_widget_' . $this->base_id, $before_widget, $args, $instance, $this );
4217
4218
				// After widget
4219
				$after_widget = ! empty( $args['after_widget'] ) ? $args['after_widget'] : '';
4220
				$after_widget = apply_filters( 'wp_super_duper_after_widget', $after_widget, $args, $instance, $this );
4221
				$after_widget = apply_filters( 'wp_super_duper_after_widget_' . $this->base_id, $after_widget, $args, $instance, $this );
4222
4223
				echo $before_widget;
4224
				// elementor strips the widget wrapping div so we check for and add it back if needed
4225
				if ( $this->is_elementor_widget_output() ) {
4226
					// Filter class & attrs for elementor widget output.
4227
					$class = apply_filters( 'wp_super_duper_div_classname', $class, $args, $this );
4228
					$class = apply_filters( 'wp_super_duper_div_classname_' . $this->base_id, $class, $args, $this );
4229
4230
					$attrs = apply_filters( 'wp_super_duper_div_attrs', '', $args, $this );
0 ignored issues
show
Unused Code introduced by
The assignment to $attrs is dead and can be removed.
Loading history...
4231
					$attrs = apply_filters( 'wp_super_duper_div_attrs_' . $this->base_id, '', $args, $this );
4232
4233
					echo "<span class='" . esc_attr( $class  ) . "' " . $attrs . ">";
4234
				}
4235
				echo $this->output_title( $args, $instance );
4236
				echo $output;
4237
				if ( $this->is_elementor_widget_output() ) {
4238
					echo "</span>";
4239
				}
4240
				echo $after_widget;
4241
			} elseif ( $this->is_preview() && $output == '' ) {// if preview show a placeholder if empty
4242
				$output = $this->preview_placeholder_text( "{{" . $this->base_id . "}}" );
4243
				echo $output;
4244
			} elseif ( $output && $no_wrap ) {
0 ignored issues
show
introduced by
$output is defined implicitly as null, thus it is always evaluated to false.
Loading history...
4245
				echo $output;
4246
			}
4247
			$output = ob_get_clean();
4248
4249
			$output = apply_filters( 'wp_super_duper_widget_output', $output, $instance, $args, $this );
4250
4251
			echo $output;
4252
		}
4253
4254
		/**
4255
		 * Tests if the current output is inside a elementor container.
4256
		 *
4257
		 * @return bool
4258
		 *@since 1.0.4
4259
		 */
4260
		public function is_elementor_widget_output() {
4261
			$result = false;
4262
			if ( defined( 'ELEMENTOR_VERSION' ) && isset( $this->number ) && $this->number == 'REPLACE_TO_ID' ) {
4263
				$result = true;
4264
			}
4265
4266
			return $result;
4267
		}
4268
4269
		/**
4270
		 * Tests if the current output is inside a elementor preview.
4271
		 *
4272
		 * @return bool
4273
		 *@since 1.0.4
4274
		 */
4275
		public function is_elementor_preview() {
4276
			$result = false;
4277
			if ( isset( $_REQUEST['elementor-preview'] ) || ( is_admin() && isset( $_REQUEST['action'] ) && $_REQUEST['action'] == 'elementor' ) || ( isset( $_REQUEST['action'] ) && $_REQUEST['action'] == 'elementor_ajax' ) ) {
4278
				$result = true;
4279
			}
4280
4281
			return $result;
4282
		}
4283
4284
		/**
4285
		 * Tests if the current output is inside a Divi preview.
4286
		 *
4287
		 * @return bool
4288
		 *@since 1.0.6
4289
		 */
4290
		public function is_divi_preview() {
4291
			$result = false;
4292
			if ( isset( $_REQUEST['et_fb'] ) || isset( $_REQUEST['et_pb_preview'] ) || ( is_admin() && isset( $_REQUEST['action'] ) && $_REQUEST['action'] == 'elementor' ) ) {
4293
				$result = true;
4294
			}
4295
4296
			return $result;
4297
		}
4298
4299
		/**
4300
		 * Tests if the current output is inside a Beaver builder preview.
4301
		 *
4302
		 * @return bool
4303
		 *@since 1.0.6
4304
		 */
4305
		public function is_beaver_preview() {
4306
			$result = false;
4307
			if ( isset( $_REQUEST['fl_builder'] ) ) {
4308
				$result = true;
4309
			}
4310
4311
			return $result;
4312
		}
4313
4314
		/**
4315
		 * Tests if the current output is inside a siteorigin builder preview.
4316
		 *
4317
		 * @return bool
4318
		 *@since 1.0.6
4319
		 */
4320
		public function is_siteorigin_preview() {
4321
			$result = false;
4322
			if ( ! empty( $_REQUEST['siteorigin_panels_live_editor'] ) ) {
4323
				$result = true;
4324
			}
4325
4326
			return $result;
4327
		}
4328
4329
		/**
4330
		 * Tests if the current output is inside a cornerstone builder preview.
4331
		 *
4332
		 * @return bool
4333
		 *@since 1.0.8
4334
		 */
4335
		public function is_cornerstone_preview() {
4336
			$result = false;
4337
			if ( ! empty( $_REQUEST['cornerstone_preview'] ) || basename( $_SERVER['REQUEST_URI'] ) == 'cornerstone-endpoint' ) {
4338
				$result = true;
4339
			}
4340
4341
			return $result;
4342
		}
4343
4344
		/**
4345
		 * Tests if the current output is inside a fusion builder preview.
4346
		 *
4347
		 * @return bool
4348
		 *@since 1.1.0
4349
		 */
4350
		public function is_fusion_preview() {
4351
			$result = false;
4352
			if ( ! empty( $_REQUEST['fb-edit'] ) || ! empty( $_REQUEST['fusion_load_nonce'] ) ) {
4353
				$result = true;
4354
			}
4355
4356
			return $result;
4357
		}
4358
4359
		/**
4360
		 * Tests if the current output is inside a Oxygen builder preview.
4361
		 *
4362
		 * @return bool
4363
		 *@since 1.0.18
4364
		 */
4365
		public function is_oxygen_preview() {
4366
			$result = false;
4367
			if ( ! empty( $_REQUEST['ct_builder'] ) || ( ! empty( $_REQUEST['action'] ) && ( substr( $_REQUEST['action'], 0, 11 ) === "oxy_render_" || substr( $_REQUEST['action'], 0, 10 ) === "ct_render_" ) ) ) {
4368
				$result = true;
4369
			}
4370
4371
			return $result;
4372
		}
4373
4374
		/**
4375
		 * Check for Kallyas theme Zion builder preview.
4376
		 *
4377
		 * @since 1.1.22
4378
		 *
4379
		 * @return bool True when preview page otherwise false.
4380
		 */
4381
		public function is_kallyas_zion_preview() {
4382
			$result = false;
4383
4384
			if ( function_exists( 'znhg_kallyas_theme_config' ) && ! empty( $_REQUEST['zn_pb_edit'] ) ) {
4385
				$result = true;
4386
			}
4387
4388
			return $result;
4389
		}
4390
4391
		/**
4392
		 * Check for Bricks theme builder preview.
4393
		 *
4394
		 * @since 1.1.31
4395
		 *
4396
		 * @return bool True when preview page otherwise false.
4397
		 */
4398
		public function is_bricks_preview() {
4399
			$result = false;
4400
4401
			if ( function_exists( 'bricks_is_builder' ) && ( bricks_is_builder() || bricks_is_builder_call() ) ) {
0 ignored issues
show
Bug introduced by
The function bricks_is_builder_call was not found. Maybe you did not declare it correctly or list all dependencies? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

4401
			if ( function_exists( 'bricks_is_builder' ) && ( bricks_is_builder() || /** @scrutinizer ignore-call */ bricks_is_builder_call() ) ) {
Loading history...
4402
				$result = true;
4403
			}
4404
4405
			return $result;
4406
		}
4407
4408
		/**
4409
		 * General function to check if we are in a preview situation.
4410
		 *
4411
		 * @return bool
4412
		 *@since 1.0.6
4413
		 */
4414
		public function is_preview() {
4415
			$preview = false;
4416
			if ( $this->is_divi_preview() ) {
4417
				$preview = true;
4418
			} elseif ( $this->is_elementor_preview() ) {
4419
				$preview = true;
4420
			} elseif ( $this->is_beaver_preview() ) {
4421
				$preview = true;
4422
			} elseif ( $this->is_siteorigin_preview() ) {
4423
				$preview = true;
4424
			} elseif ( $this->is_cornerstone_preview() ) {
4425
				$preview = true;
4426
			} elseif ( $this->is_fusion_preview() ) {
4427
				$preview = true;
4428
			} elseif ( $this->is_oxygen_preview() ) {
4429
				$preview = true;
4430
			} elseif( $this->is_kallyas_zion_preview() ) {
4431
				$preview = true;
4432
			} elseif( $this->is_block_content_call() ) {
4433
				$preview = true;
4434
			} elseif( $this->is_bricks_preview() ) {
4435
				$preview = true;
4436
			}
4437
4438
			return $preview;
4439
		}
4440
4441
		/**
4442
		 * Output the super title.
4443
		 *
4444
		 * @param $args
4445
		 * @param array $instance
4446
		 *
4447
		 * @return string
4448
		 */
4449
		public function output_title( $args, $instance = array() ) {
4450
			$output = '';
4451
			if ( ! empty( $instance['title'] ) ) {
4452
				/** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */
4453
				$title  = apply_filters( 'widget_title', $instance['title'], $instance, $this->id_base );
4454
4455
				if ( empty( $instance['widget_title_tag'] ) ) {
4456
					if ( ! isset( $args['before_title'] ) ) {
4457
						$args['before_title'] = '';
4458
					}
4459
4460
					if ( ! isset( $args['after_title'] ) ) {
4461
						$args['after_title'] = '';
4462
					}
4463
4464
					$output = $args['before_title'] . $title . $args['after_title'];
4465
				} else {
4466
					$title_tag = esc_attr( $instance['widget_title_tag'] );
4467
4468
					// classes
4469
					$title_classes = array();
4470
					$title_classes[] = !empty( $instance['widget_title_size_class'] ) ? sanitize_html_class( $instance['widget_title_size_class'] ) : '';
4471
					$title_classes[] = !empty( $instance['widget_title_align_class'] ) ? sanitize_html_class( $instance['widget_title_align_class'] ) : '';
4472
					$title_classes[] = !empty( $instance['widget_title_color_class'] ) ? "text-".sanitize_html_class( $instance['widget_title_color_class'] ) : '';
4473
					$title_classes[] = !empty( $instance['widget_title_border_class'] ) ? sanitize_html_class( $instance['widget_title_border_class'] ) : '';
4474
					$title_classes[] = !empty( $instance['widget_title_border_color_class'] ) ? "border-".sanitize_html_class( $instance['widget_title_border_color_class'] ) : '';
4475
					$title_classes[] = !empty( $instance['widget_title_mt_class'] ) ? "mt-".absint( $instance['widget_title_mt_class'] ) : '';
4476
					$title_classes[] = !empty( $instance['widget_title_mr_class'] ) ? "mr-".absint( $instance['widget_title_mr_class'] ) : '';
4477
					$title_classes[] = !empty( $instance['widget_title_mb_class'] ) ? "mb-".absint( $instance['widget_title_mb_class'] ) : '';
4478
					$title_classes[] = !empty( $instance['widget_title_ml_class'] ) ? "ml-".absint( $instance['widget_title_ml_class'] ) : '';
4479
					$title_classes[] = !empty( $instance['widget_title_pt_class'] ) ? "pt-".absint( $instance['widget_title_pt_class'] ) : '';
4480
					$title_classes[] = !empty( $instance['widget_title_pr_class'] ) ? "pr-".absint( $instance['widget_title_pr_class'] ) : '';
4481
					$title_classes[] = !empty( $instance['widget_title_pb_class'] ) ? "pb-".absint( $instance['widget_title_pb_class'] ) : '';
4482
					$title_classes[] = !empty( $instance['widget_title_pl_class'] ) ? "pl-".absint( $instance['widget_title_pl_class'] ) : '';
4483
4484
					$class = !empty( $title_classes ) ? implode(" ",$title_classes) : '';
4485
					$output = "<$title_tag class='$class' >$title</$title_tag>";
4486
				}
4487
4488
			}
4489
4490
			return $output;
4491
		}
4492
4493
		/**
4494
		 * Outputs the options form inputs for the widget.
4495
		 *
4496
		 * @param array $instance The widget options.
4497
		 */
4498
		public function form( $instance ) {
4499
4500
			// set widget instance
4501
			$this->instance = $instance;
4502
4503
			// set it as a SD widget
4504
			echo $this->widget_advanced_toggle();
4505
4506
			echo "<p>" . esc_attr( $this->options['widget_ops']['description'] ) . "</p>";
4507
			$arguments_raw = $this->get_arguments();
4508
4509
			if ( is_array( $arguments_raw ) ) {
0 ignored issues
show
introduced by
The condition is_array($arguments_raw) is always true.
Loading history...
4510
4511
				$arguments = $this->group_arguments( $arguments_raw );
4512
4513
				// Do we have sections?
4514
				$has_sections = $arguments == $arguments_raw ? false : true;
4515
4516
4517
				if ( $has_sections ) {
4518
					$panel_count = 0;
4519
					foreach ( $arguments as $key => $args ) {
4520
4521
						?>
4522
						<script>
4523
							//							jQuery(this).find("i").toggleClass("fas fa-chevron-up fas fa-chevron-down");jQuery(this).next().toggle();
4524
						</script>
4525
						<?php
4526
4527
						$hide       = $panel_count ? ' style="display:none;" ' : '';
4528
						$icon_class = $panel_count ? 'fas fa-chevron-up' : 'fas fa-chevron-down';
4529
						echo "<button onclick='jQuery(this).find(\"i\").toggleClass(\"fas fa-chevron-up fas fa-chevron-down\");jQuery(this).next().slideToggle();' type='button' class='sd-toggle-group-button sd-input-group-toggle" . sanitize_title_with_dashes( $key ) . "'>" . esc_attr( $key ) . " <i style='float:right;' class='" . $icon_class . "'></i></button>";
4530
						echo "<div class='sd-toggle-group sd-input-group-" . sanitize_title_with_dashes( $key ) . "' $hide>";
4531
4532
						foreach ( $args as $k => $a ) {
4533
4534
							$this->widget_inputs_row_start($k, $a);
4535
							$this->widget_inputs( $a, $instance );
4536
							$this->widget_inputs_row_end($k, $a);
4537
4538
						}
4539
4540
						echo "</div>";
4541
4542
						$panel_count ++;
4543
4544
					}
4545
				} else {
4546
					foreach ( $arguments as $key => $args ) {
4547
						$this->widget_inputs_row_start($key, $args);
4548
						$this->widget_inputs( $args, $instance );
4549
						$this->widget_inputs_row_end($key, $args);
4550
					}
4551
				}
4552
4553
			}
4554
		}
4555
4556
		public function widget_inputs_row_start( $key, $args ) {
0 ignored issues
show
Unused Code introduced by
The parameter $key is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

4556
		public function widget_inputs_row_start( /** @scrutinizer ignore-unused */ $key, $args ) {

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
4557
			if ( ! empty( $args['row'] ) ) {
4558
				// Maybe open
4559
				if ( ! empty( $args['row']['open'] ) ) {
4560
					?>
4561
					<div class='bsui sd-argument' data-argument='<?php echo esc_attr( $args['row']['key'] ); ?>' data-element_require='<?php echo ( ! empty( $args['row']['element_require'] ) ? $this->convert_element_require( $args['row']['element_require'] ) : '' ); ?>'>
4562
					<?php if ( ! empty( $args['row']['title'] ) ) { ?>
4563
					<?php
4564
						if ( isset( $args['row']['icon'] ) ) {
4565
							$args['row']['icon'] = '';
4566
						}
4567
4568
						if ( ! isset( $args['row']['device_type'] ) && isset( $args['device_type'] ) ) {
4569
							$args['row']['device_type'] = $args['device_type'];
4570
						}
4571
					?>
4572
					<label class="mb-0"><?php echo $this->widget_field_title( $args['row'] ); ?><?php echo $this->widget_field_desc( $args['row'] ); ?></label>
4573
					<?php } ?>
4574
					<div class='row<?php echo ( ! empty( $args['row']['class'] ) ? ' ' . esc_attr( $args['row']['class'] ) : '' ); ?>'>
4575
					<div class='col pr-2'>
4576
					<?php
4577
				} else if ( ! empty( $args['row']['close'] ) ) {
4578
					echo "<div class='col pl-0 ps-0'>";
4579
				} else {
4580
					echo "<div class='col pl-0 ps-0 pr-2 pe-2'>";
4581
				}
4582
			}
4583
		}
4584
4585
		public function widget_inputs_row_end( $key, $args ) {
0 ignored issues
show
Unused Code introduced by
The parameter $key is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

4585
		public function widget_inputs_row_end( /** @scrutinizer ignore-unused */ $key, $args ) {

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
4586
			if ( ! empty( $args['row'] ) ) {
4587
				// Maybe close
4588
				if ( ! empty( $args['row']['close'] ) ) {
4589
					echo "</div></div>";
4590
				}
4591
				echo "</div>";
4592
			}
4593
		}
4594
4595
		/**
4596
		 * Get the hidden input that when added makes the advanced button show on widget settings.
4597
		 *
4598
		 * @return string
4599
		 */
4600
		public function widget_advanced_toggle() {
4601
4602
			$output = '';
4603
			if ( $this->block_show_advanced() ) {
4604
				$val = 1;
4605
			} else {
4606
				$val = 0;
4607
			}
4608
4609
			$output .= "<input type='hidden'  class='sd-show-advanced' value='$val' />";
4610
4611
			return $output;
4612
		}
4613
4614
		/**
4615
		 * Convert require element.
4616
		 *
4617
		 * @param string $input Input element.
4618
		 *
4619
		 * @return string $output
4620
		 *@since 1.0.0
4621
		 *
4622
		 */
4623
		public function convert_element_require( $input ) {
4624
			$input = str_replace( "'", '"', $input );// we only want double quotes
4625
4626
			$output = esc_attr( str_replace( array( "[%", "%]", "%:checked]" ), array(
4627
				"jQuery(form).find('[data-argument=\"",
4628
				"\"]').find('input,select,textarea').val()",
4629
				"\"]').find('input:checked').val()"
4630
			), $input ) );
4631
4632
			return $output;
4633
		}
4634
4635
		/**
4636
		 * Builds the inputs for the widget options.
4637
		 *
4638
		 * @param $args
4639
		 * @param $instance
4640
		 */
4641
		public function widget_inputs( $args, $instance ) {
4642
4643
			$class             = "";
4644
			$element_require   = "";
4645
			$custom_attributes = "";
4646
4647
			// get value
4648
			if ( isset( $instance[ $args['name'] ] ) ) {
4649
				$value = $instance[ $args['name'] ];
4650
			} elseif ( ! isset( $instance[ $args['name'] ] ) && ! empty( $args['default'] ) ) {
4651
				$value = is_array( $args['default'] ) ? array_map( "esc_html", $args['default'] ) : esc_html( $args['default'] );
4652
			} else {
4653
				$value = '';
4654
			}
4655
4656
			// get placeholder
4657
			if ( ! empty( $args['placeholder'] ) ) {
4658
				$placeholder = "placeholder='" . esc_html( $args['placeholder'] ) . "'";
4659
			} else {
4660
				$placeholder = '';
4661
			}
4662
4663
			// get if advanced
4664
			if ( isset( $args['advanced'] ) && $args['advanced'] ) {
4665
				$class .= " sd-advanced-setting ";
4666
			}
4667
4668
			// element_require
4669
			if ( isset( $args['element_require'] ) && $args['element_require'] ) {
4670
				$element_require = $args['element_require'];
4671
			}
4672
4673
			// custom_attributes
4674
			if ( isset( $args['custom_attributes'] ) && $args['custom_attributes'] ) {
4675
				$custom_attributes = $this->array_to_attributes( $args['custom_attributes'], true );
4676
			}
4677
4678
			// before wrapper
4679
			?>
4680
			<p class="sd-argument <?php echo esc_attr( $class ); ?>" data-argument='<?php echo esc_attr( $args['name'] ); ?>' data-element_require='<?php if ( $element_require ) { echo $this->convert_element_require( $element_require );} ?>'>
4681
			<?php
4682
			switch ( $args['type'] ) {
4683
				//array('text','password','number','email','tel','url','color')
4684
				case "text":
4685
				case "password":
4686
				case "number":
4687
				case "email":
4688
				case "tel":
4689
				case "url":
4690
				case "color":
4691
					?>
4692
					<label for="<?php echo esc_attr( $this->get_field_id( $args['name'] ) ); ?>"><?php echo $this->widget_field_title( $args );?><?php echo $this->widget_field_desc( $args ); ?></label>
4693
					<input <?php echo $placeholder; ?> class="widefat" <?php echo $custom_attributes; ?> id="<?php echo esc_attr( $this->get_field_id( $args['name'] ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( $args['name'] ) ); ?>" type="<?php echo esc_attr( $args['type'] ); ?>" value="<?php echo esc_attr( $value ); ?>">
4694
					<?php
4695
4696
					break;
4697
				case "select":
4698
					$multiple = isset( $args['multiple'] ) && $args['multiple'] ? true : false;
4699
					if ( $multiple ) {
4700
						if ( empty( $value ) ) {
4701
							$value = array();
4702
						}
4703
					}
4704
					?>
4705
					<label for="<?php echo esc_attr( $this->get_field_id( $args['name'] ) ); ?>"><?php echo $this->widget_field_title( $args ); ?><?php echo $this->widget_field_desc( $args ); ?></label>
4706
					<select <?php echo $placeholder; ?> class="widefat" <?php echo $custom_attributes; ?> id="<?php echo esc_attr( $this->get_field_id( $args['name'] ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( $args['name'] ) ); if ( $multiple ) { echo "[]"; } ?>"
4707
						<?php if ( $multiple ) {
4708
							echo "multiple";
4709
						} //@todo not implemented yet due to gutenberg not supporting it
4710
						?>>
4711
						<?php
4712
4713
						if ( ! empty( $args['options'] ) ) {
4714
							foreach ( $args['options'] as $val => $label ) {
4715
								if ( $multiple ) {
4716
									$selected = in_array( $val, $value ) ? 'selected="selected"' : '';
4717
								} else {
4718
									$selected = selected( $value, $val, false );
4719
								}
4720
								echo "<option value='$val' " . $selected . ">$label</option>";
4721
							}
4722
						}
4723
						?>
4724
					</select>
4725
					<?php
4726
					break;
4727
				case "checkbox":
4728
					?>
4729
					<input <?php echo $placeholder; ?> <?php checked( 1, $value, true ) ?> <?php echo $custom_attributes; ?> class="widefat" id="<?php echo esc_attr( $this->get_field_id( $args['name'] ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( $args['name'] ) ); ?>" type="checkbox" value="1">
4730
					<label for="<?php echo esc_attr( $this->get_field_id( $args['name'] ) ); ?>"><?php echo $this->widget_field_title( $args );?><?php echo $this->widget_field_desc( $args ); ?></label>
4731
					<?php
4732
					break;
4733
				case "textarea":
4734
					?>
4735
					<label for="<?php echo esc_attr( $this->get_field_id( $args['name'] ) ); ?>"><?php echo $this->widget_field_title( $args ); ?><?php echo $this->widget_field_desc( $args ); ?></label>
4736
					<textarea <?php echo $placeholder; ?> class="widefat" <?php echo $custom_attributes; ?> id="<?php echo esc_attr( $this->get_field_id( $args['name'] ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( $args['name'] ) ); ?>"><?php echo esc_attr( $value ); ?></textarea>
4737
					<?php
4738
4739
					break;
4740
				case "hidden":
4741
					?>
4742
					<input id="<?php echo esc_attr( $this->get_field_id( $args['name'] ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( $args['name'] ) ); ?>" type="hidden" value="<?php echo esc_attr( $value ); ?>">
4743
					<?php
4744
					break;
4745
				default:
4746
					echo "No input type found!"; // @todo we need to add more input types.
4747
			}
4748
			// after wrapper
4749
			?></p><?php
4750
		}
4751
4752
		public function get_widget_icon($icon = 'box-top', $title = ''){
4753
			if($icon=='box-top'){
4754
				return '<svg title="'.esc_attr($title).'" width="20px" height="20px" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" role="img" aria-hidden="true" focusable="false"><rect x="2.714" y="5.492" width="1.048" height="9.017" fill="#555D66"></rect><rect x="16.265" y="5.498" width="1.023" height="9.003" fill="#555D66"></rect><rect x="5.518" y="2.186" width="8.964" height="2.482" fill="#272B2F"></rect><rect x="5.487" y="16.261" width="9.026" height="1.037" fill="#555D66"></rect></svg>';
4755
			}elseif($icon=='box-right'){
4756
				return '<svg title="'.esc_attr($title).'" width="20px" height="20px" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" role="img" aria-hidden="true" focusable="false"><rect x="2.714" y="5.492" width="1.046" height="9.017" fill="#555D66"></rect><rect x="15.244" y="5.498" width="2.518" height="9.003" fill="#272B2F"></rect><rect x="5.518" y="2.719" width="8.964" height="0.954" fill="#555D66"></rect><rect x="5.487" y="16.308" width="9.026" height="0.99" fill="#555D66"></rect></svg>';
4757
			}elseif($icon=='box-bottom'){
4758
				return '<svg title="'.esc_attr($title).'" width="20px" height="20px" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" role="img" aria-hidden="true" focusable="false"><rect x="2.714" y="5.492" width="1" height="9.017" fill="#555D66"></rect><rect x="16.261" y="5.498" width="1.027" height="9.003" fill="#555D66"></rect><rect x="5.518" y="2.719" width="8.964" height="0.968" fill="#555D66"></rect><rect x="5.487" y="15.28" width="9.026" height="2.499" fill="#272B2F"></rect></svg>';
4759
			}elseif($icon=='box-left'){
4760
				return '<svg title="'.esc_attr($title).'" width="20px" height="20px" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" role="img" aria-hidden="true" focusable="false"><rect x="2.202" y="5.492" width="2.503" height="9.017" fill="#272B2F"></rect><rect x="16.276" y="5.498" width="1.012" height="9.003" fill="#555D66"></rect><rect x="5.518" y="2.719" width="8.964" height="0.966" fill="#555D66"></rect><rect x="5.487" y="16.303" width="9.026" height="0.995" fill="#555D66"></rect></svg>';
4761
			}
4762
		}
4763
4764
		/**
4765
		 * Get the widget input description html.
4766
		 *
4767
		 * @param $args
4768
		 *
4769
		 * @return string
4770
		 * @todo, need to make its own tooltip script
4771
		 */
4772
		public function widget_field_desc( $args ) {
4773
4774
			$description = '';
4775
			if ( isset( $args['desc'] ) && $args['desc'] ) {
4776
				if ( isset( $args['desc_tip'] ) && $args['desc_tip'] ) {
4777
					$description = $this->desc_tip( $args['desc'] );
4778
				} else {
4779
					$description = '<span class="description">' . wp_kses_post( $args['desc'] ) . '</span>';
4780
				}
4781
			}
4782
4783
			return $description;
4784
		}
4785
4786
		/**
4787
		 * Get the widget input title html.
4788
		 *
4789
		 * @param $args
4790
		 *
4791
		 * @return string
4792
		 */
4793
		public function widget_field_title( $args ) {
4794
			$title = '';
4795
4796
			if ( isset( $args['title'] ) && $args['title'] ) {
4797
				if ( ! empty( $args['device_type'] ) ) {
4798
					$args['title'] .= ' (' . $args['device_type'] . ')'; // Append device type to title.
4799
				}
4800
4801
				if ( isset( $args['icon'] ) && $args['icon'] ) {
4802
					$title = self::get_widget_icon( $args['icon'], $args['title']  );
0 ignored issues
show
Bug Best Practice introduced by
The method WP_Super_Duper::get_widget_icon() is not static, but was called statically. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

4802
					/** @scrutinizer ignore-call */ 
4803
     $title = self::get_widget_icon( $args['icon'], $args['title']  );
Loading history...
4803
				} else {
4804
					$title = esc_attr( $args['title'] );
4805
				}
4806
			}
4807
4808
			return $title;
4809
		}
4810
4811
		/**
4812
		 * Get the tool tip html.
4813
		 *
4814
		 * @param $tip
4815
		 * @param bool $allow_html
4816
		 *
4817
		 * @return string
4818
		 */
4819
		function desc_tip( $tip, $allow_html = false ) {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
4820
			if ( $allow_html ) {
4821
				$tip = $this->sanitize_tooltip( $tip );
4822
			} else {
4823
				$tip = esc_attr( $tip );
4824
			}
4825
4826
			return '<span class="gd-help-tip dashicons dashicons-editor-help" title="' . $tip . '"></span>';
4827
		}
4828
4829
		/**
4830
		 * Sanitize a string destined to be a tooltip.
4831
		 *
4832
		 * @param string $var
4833
		 *
4834
		 * @return string
4835
		 */
4836
		public function sanitize_tooltip( $var ) {
4837
			return htmlspecialchars( wp_kses( html_entity_decode( $var ), array(
4838
				'br'     => array(),
4839
				'em'     => array(),
4840
				'strong' => array(),
4841
				'small'  => array(),
4842
				'span'   => array(),
4843
				'ul'     => array(),
4844
				'li'     => array(),
4845
				'ol'     => array(),
4846
				'p'      => array(),
4847
			) ) );
4848
		}
4849
4850
		/**
4851
		 * Processing widget options on save
4852
		 *
4853
		 * @param array $new_instance The new options
4854
		 * @param array $old_instance The previous options
4855
		 *
4856
		 * @return array
4857
		 * @todo we should add some sanitation here.
4858
		 */
4859
		public function update( $new_instance, $old_instance ) {
4860
4861
			//save the widget
4862
			$instance = array_merge( (array) $old_instance, (array) $new_instance );
4863
4864
			// set widget instance
4865
			$this->instance = $instance;
4866
4867
			if ( empty( $this->arguments ) ) {
4868
				$this->get_arguments();
4869
			}
4870
4871
			// check for checkboxes
4872
			if ( ! empty( $this->arguments ) ) {
4873
				foreach ( $this->arguments as $argument ) {
4874
					if ( isset( $argument['type'] ) && $argument['type'] == 'checkbox' && ! isset( $new_instance[ $argument['name'] ] ) ) {
4875
						$instance[ $argument['name'] ] = '0';
4876
					}
4877
				}
4878
			}
4879
4880
			return $instance;
4881
		}
4882
4883
		/**
4884
		 * Checks if the current call is a ajax call to get the block content.
4885
		 *
4886
		 * This can be used in your widget to return different content as the block content.
4887
		 *
4888
		 * @return bool
4889
		 *@since 1.0.3
4890
		 */
4891
		public function is_block_content_call() {
4892
			$result = false;
4893
			if ( wp_doing_ajax() && isset( $_REQUEST['action'] ) && $_REQUEST['action'] == 'super_duper_output_shortcode' ) {
4894
				$result = true;
4895
			}
4896
4897
			return $result;
4898
		}
4899
4900
		/**
4901
		 * Get an instance hash that will be unique to the type and settings.
4902
		 *
4903
		 * @return string
4904
		 *@since 1.0.20
4905
		 */
4906
		public function get_instance_hash(){
4907
			$instance_string = $this->base_id.serialize($this->instance);
4908
			return hash('crc32b',$instance_string);
4909
		}
4910
4911
		/**
4912
		 * Generate and return inline styles from CSS rules that will match the unique class of the instance.
4913
		 *
4914
		 * @param array $rules
4915
		 *
4916
		 * @return string
4917
		 *@since 1.0.20
4918
		 */
4919
		public function get_instance_style($rules = array()){
4920
			$css = '';
4921
4922
			if(!empty($rules)){
4923
				$rules = array_unique($rules);
4924
				$instance_hash = $this->get_instance_hash();
4925
				$css .= "<style>";
4926
				foreach($rules as $rule){
4927
					$css .= ".sdel-$instance_hash $rule";
4928
				}
4929
				$css .= "</style>";
4930
			}
4931
4932
			return $css;
4933
		}
4934
4935
		/**
4936
		 * Encode shortcodes tags.
4937
		 *
4938
		 * @param string $content Content to search for shortcode tags.
4939
		 *
4940
*@return string Content with shortcode tags removed.
4941
		 *@since 1.0.28
4942
		 *
4943
		 */
4944
		public function encode_shortcodes( $content ) {
4945
			// Avoids existing encoded tags.
4946
			$trans   = array(
4947
				'&#91;' => '&#091;',
4948
				'&#93;' => '&#093;',
4949
				'&amp;#91;' => '&#091;',
4950
				'&amp;#93;' => '&#093;',
4951
				'&lt;' => '&0lt;',
4952
				'&gt;' => '&0gt;',
4953
				'&amp;lt;' => '&0lt;',
4954
				'&amp;gt;' => '&0gt;',
4955
			);
4956
4957
			$content = strtr( $content, $trans );
4958
4959
			$trans   = array(
4960
				'[' => '&#91;',
4961
				']' => '&#93;',
4962
				'<' => '&lt;',
4963
				'>' => '&gt;',
4964
				'"' => '&quot;',
4965
				"'" => '&#39;',
4966
			);
4967
4968
			$content = strtr( $content, $trans );
4969
4970
			return $content;
4971
		}
4972
4973
		/**
4974
		 * Remove encoded shortcod tags.
4975
		 *
4976
		 * @param string $content Content to search for shortcode tags.
4977
		 *
4978
*@return string Content with decoded shortcode tags.
4979
		 *@since 1.0.28
4980
		 *
4981
		 */
4982
		public function decode_shortcodes( $content ) {
4983
			$trans   = array(
4984
				'&#91;' => '[',
4985
				'&#93;' => ']',
4986
				'&amp;#91;' => '[',
4987
				'&amp;#93;' => ']',
4988
				'&lt;' => '<',
4989
				'&gt;' => '>',
4990
				'&amp;lt;' => '<',
4991
				'&amp;gt;' => '>',
4992
				'&quot;' => '"',
4993
				'&apos;' => "'",
4994
			);
4995
4996
			$content = strtr( $content, $trans );
4997
4998
			$trans   = array(
4999
				'&#091;' => '&#91;',
5000
				'&#093;' => '&#93;',
5001
				'&amp;#091;' => '&#91;',
5002
				'&amp;#093;' => '&#93;',
5003
				'&0lt;' => '&lt;',
5004
				'&0gt;' => '&gt;',
5005
				'&amp;0lt;' => '&lt;',
5006
				'&amp;0gt;' => '&gt;',
5007
			);
5008
5009
			$content = strtr( $content, $trans );
5010
5011
			return $content;
5012
		}
5013
5014
		public function block_visibility_fields( $args ) {
5015
			$value = ! empty( $args['value'] ) ? esc_attr( $args['value'] ) : '';
5016
			$content = '<div class="bs-vc-rule-template d-none">';
5017
				$content .= '<div class="p-3 pb-0 mb-3 border border-1 rounded-1 position-relative bs-vc-rule" data-bs-index="BSVCINDEX" >';
5018
					$content .= '<div class="row">';
5019
						$content .= '<div class="col-sm-12">';
5020
							$content .= '<div class="bs-rule-action position-absolute top-0 end-0 p-2 zindex-5"><span class="text-danger c-pointer bs-vc-remove-rule" title="' . esc_attr__( 'Remove Rule', 'ayecode-connect' ) . '"><i class="fas fa-circle-minus fs-6"></i></span></div>';
5021
							$content .= aui()->select(
5022
								array(
5023
									'id'          => 'bsvc_rule_BSVCINDEX',
5024
									'name'        => 'bsvc_rule_BSVCINDEX',
5025
									'label'       => __( 'Rule', 'ayecode-connect' ),
5026
									'placeholder' => __( 'Select Rule...', 'ayecode-connect' ),
5027
									'class'       => 'bsvc_rule form-select-sm no-select2 mw-100',
5028
									'options'     => sd_visibility_rules_options(),
5029
									'default'     => '',
5030
									'value'       => '',
5031
									'label_type'  => '',
5032
									'select2'     => false,
5033
									'input_group_left' => __( 'Rule:', 'ayecode-connect' ),
5034
									'extra_attributes' => array(
5035
										'data-minimum-results-for-search' => '-1'
5036
									)
5037
								)
5038
							);
5039
5040
						$content .= '</div>';
5041
5042
						if ( class_exists( 'GeoDirectory' ) ) {
5043
							$content .= '<div class="col-md-7 col-sm-12">';
5044
5045
								$content .= aui()->select(
5046
									array(
5047
										'id'          => 'bsvc_gd_field_BSVCINDEX',
5048
										'name'        => 'bsvc_gd_field_BSVCINDEX',
5049
										'label'       => __( 'FIELD', 'ayecode-connect' ),
5050
										'placeholder' => __( 'FIELD', 'ayecode-connect' ),
5051
										'class'       => 'bsvc_gd_field form-select-sm no-select2 mw-100',
5052
										'options'     => sd_visibility_gd_field_options(),
5053
										'default'     => '',
5054
										'value'       => '',
5055
										'label_type'  => '',
5056
										'select2'     => false,
5057
										'element_require'  => '[%bsvc_rule_BSVCINDEX%]=="gd_field"',
5058
										'extra_attributes' => array(
5059
											'data-minimum-results-for-search' => '-1'
5060
										)
5061
									)
5062
								);
5063
5064
							$content .= '</div>';
5065
							$content .= '<div class="col-md-5 col-sm-12">';
5066
5067
								$content .= aui()->select(
5068
									array(
5069
										'id'          => 'bsvc_gd_field_condition_BSVCINDEX',
5070
										'name'        => 'bsvc_gd_field_condition_BSVCINDEX',
5071
										'label'       => __( 'CONDITION', 'ayecode-connect' ),
5072
										'placeholder' => __( 'CONDITION', 'ayecode-connect' ),
5073
										'class'       => 'bsvc_gd_field_condition form-select-sm no-select2 mw-100',
5074
										'options'     => sd_visibility_field_condition_options(),
5075
										'default'     => '',
5076
										'value'       => '',
5077
										'label_type'  => '',
5078
										'select2'     => false,
5079
										'element_require'  => '[%bsvc_rule_BSVCINDEX%]=="gd_field"',
5080
										'extra_attributes' => array(
5081
											'data-minimum-results-for-search' => '-1'
5082
										)
5083
									)
5084
								);
5085
5086
							$content .= '</div>';
5087
							$content .= '<div class="col-sm-12">';
5088
5089
								$content .= aui()->input(
5090
									array(
5091
										'type'            => 'text',
5092
										'id'              => 'bsvc_gd_field_search_BSVCINDEX',
5093
										'name'            => 'bsvc_gd_field_search_BSVCINDEX',
5094
										'label'           => __( 'VALUE TO MATCH', 'ayecode-connect' ),
5095
										'class'           => 'bsvc_gd_field_search form-control-sm',
5096
										'placeholder'     => __( 'VALUE TO MATCH', 'ayecode-connect' ),
5097
										'label_type'      => '',
5098
										'value'           => '',
5099
										'element_require' => '([%bsvc_rule_BSVCINDEX%]=="gd_field" && [%bsvc_gd_field_condition_BSVCINDEX%] && [%bsvc_gd_field_condition_BSVCINDEX%]!="is_empty" && [%bsvc_gd_field_condition_BSVCINDEX%]!="is_not_empty")'
5100
									)
5101
								);
5102
5103
							$content .= '</div>';
5104
						}
5105
5106
					$content .= '</div>';
5107
5108
					$content .= '<div class="row aui-conditional-field" data-element-require="jQuery(form).find(\'[name=bsvc_rule_BSVCINDEX]\').val()==\'user_roles\'" data-argument="bsvc_user_roles_BSVCINDEX_1"><label for="bsvc_user_roles_BSVCINDEX_1" class="form-label mb-3">' . __( 'Select User Roles:', 'ayecode-connect' ) . '</label>';
5109
						$role_options = sd_user_roles_options();
5110
5111
						$role_option_i = 0;
5112
						foreach ( $role_options as $role_option_key => $role_option_name ) {
5113
							$role_option_i++;
5114
5115
							$content .= '<div class="col-sm-6">';
5116
							$content .= aui()->input(
5117
								array(
5118
									'id'               => 'bsvc_user_roles_BSVCINDEX_' . $role_option_i,
5119
									'name'             => 'bsvc_user_roles_BSVCINDEX[]',
5120
									'type'             => 'checkbox',
5121
									'label'            => $role_option_name,
5122
									'label_type'       => 'hidden',
5123
									'class'            => 'bsvc_user_roles',
5124
									'value'            => $role_option_key,
5125
									'switch'           => 'md',
5126
									'no_wrap'          => true
5127
								)
5128
							);
5129
							$content .= '</div>';
5130
						}
5131
					$content .= '</div>';
5132
				$content .= '</div>';
5133
			$content .= '</div>';
5134
			$content .= '<form id="bs-vc-modal-form" class="bs-vc-modal-form">';
5135
			$content .= '<div class="bs-vc-rule-sets"></div>';
5136
			$content .= '<div class="row"><div class="col-sm-12 text-center pt-1 pb-4"><button type="button" class="btn btn-sm btn-primary d-block w-100 bs-vc-add-rule"><i class="fas fa-plus"></i> ' . __( 'Add Rule', 'ayecode-connect' ) . '</button></div></div>';
5137
			$content .= '<div class="row"><div class="col-md-6 col-sm-12">';
5138
			$content .= aui()->select(
5139
				array(
5140
					'id'          => 'bsvc_output',
5141
					'name'        => 'bsvc_output',
5142
					'label'       => __( 'What should happen if rules met.', 'ayecode-connect' ),
5143
					'placeholder' => __( 'Default Output', 'ayecode-connect' ),
5144
					'class'       => 'bsvc_output form-select-sm no-select2 mw-100',
5145
					'options'     => sd_visibility_output_options(),
5146
					'default'     => '',
5147
					'value'       => '',
5148
					'label_type'  => 'top',
5149
					'select2'     => false,
5150
					'extra_attributes' => array(
5151
						'data-minimum-results-for-search' => '-1'
5152
					)
5153
				)
5154
			);
5155
5156
			$content .= '</div><div class="col-md-6 col-sm-12">';
5157
5158
			$content .= aui()->select(
5159
				array(
5160
					'id'              => 'bsvc_page',
5161
					'name'            => 'bsvc_page',
5162
					'label'           => __( 'Page Content', 'ayecode-connect' ),
5163
					'placeholder'     => __( 'Select Page ID...', 'ayecode-connect' ),
5164
					'class'           => 'bsvc_page form-select-sm no-select2 mw-100',
5165
					'options'         => sd_template_page_options(),
5166
					'default'         => '',
5167
					'value'           => '',
5168
					'label_type'      => 'top',
5169
					'select2'         => false,
5170
					'element_require' => '[%bsvc_output%]=="page"'
5171
				)
5172
			);
5173
5174
			$content .= aui()->select(
5175
				array(
5176
					'id'          => 'bsvc_tmpl_part',
5177
					'name'        => 'bsvc_tmpl_part',
5178
					'label'       => __( 'Template Part', 'ayecode-connect' ),
5179
					'placeholder' => __( 'Select Template Part...', 'ayecode-connect' ),
5180
					'class'       => 'bsvc_tmpl_part form-select-sm no-select2 mw-100',
5181
					'options'     => sd_template_part_options(),
5182
					'default'     => '',
5183
					'value'       => '',
5184
					'label_type'  => 'top',
5185
					'select2'     => false,
5186
					'element_require'  => '[%bsvc_output%]=="template_part"',
5187
					'extra_attributes' => array(
5188
						'data-minimum-results-for-search' => '-1'
5189
					)
5190
				)
5191
			);
5192
5193
			$content .= aui()->select(
5194
				array(
5195
					'id'               => 'bsvc_message_type',
5196
					'name'             => 'bsvc_message_type',
5197
					'label'            => __( 'Custom Message Type', 'ayecode-connect' ),
5198
					'placeholder'      => __( 'Default (none)', 'ayecode-connect' ),
5199
					'class'            => 'bsvc_message_type form-select-sm no-select2 mw-100',
5200
					'options'          => sd_aui_colors(),
5201
					'default'          => '',
5202
					'value'            => '',
5203
					'label_type'       => 'top',
5204
					'select2'          => false,
5205
					'element_require'  => '[%bsvc_output%]=="message"',
5206
					'extra_attributes' => array(
5207
						'data-minimum-results-for-search' => '-1'
5208
					)
5209
				)
5210
			);
5211
5212
			$content .= '</div><div class="col-sm-12">';
5213
5214
			$content .= aui()->input(
5215
				array(
5216
					'type'            => 'text',
5217
					'id'              => 'bsvc_message',
5218
					'name'            => 'bsvc_message',
5219
					'label'           => '',
5220
					'class'           => 'bsvc_message form-control-sm',
5221
					'placeholder'     => __( 'CUSTOM MESSAGE TO SHOW', 'ayecode-connect' ),
5222
					'label_type'      => '',
5223
					'value'           => '',
5224
					'form_group_class' => ' ',
5225
					'element_require' => '[%bsvc_output%]=="message"',
5226
				)
5227
			);
5228
5229
			$content .= '</div></div></form><input type="hidden" id="bsvc_raw_value" name="bsvc_raw_value" value="' . $value . '">';
5230
5231
			return $content;
5232
		}
5233
	}
5234
}
5235