PluginProbe
Charitable – Donation & Fundraising Platform (Donation Forms, Recurring Donations & Fundraising Campaigns) / 1.8.11.1
Charitable – Donation & Fundraising Platform (Donation Forms, Recurring Donations & Fundraising Campaigns) v1.8.11.1
1.8.13.1 1.8.13 1.8.12.3 1.8.12.2 1.8.12.1 1.8.12 1.8.11.3 1.8.11.2 1.8.11.1 1.8.11 1.6.6 1.6.60 1.6.7 1.6.8 1.6.9 1.7.0 1.7.0.1 1.7.0.11 1.7.0.12 1.7.0.14 1.7.0.2 1.7.0.3 1.7.0.5 1.7.0.6 1.7.0.7 All 212 releases
charitable / includes / admin / campaign-builder / class-builder-form-fields.php

class-builder-form-fields.php in Charitable – Donation & Fundraising Platform (Donation Forms, Recurring Donations & Fundraising Campaigns) 1.8.11.1, at includes/admin/campaign-builder/class-builder-form-fields.php

1,806 lines 73.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Load the field types.
4 *
5 * @package Charitable
6 * @author David Bisset
7 * @copyright Copyright (c) 2023, WP Charitable LLC
8 * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License
9 * @since 1.8.0
10 * @version 1.8.9.1
11 */
12 class Charitable_Builder_Form_Fields {
13
14 /**
15 * The ID slug for the panel.
16 *
17 * @since 1.8.0
18 *
19 * @var string
20 */
21 public $id_slug = 'charitable-panel-field-settings';
22
23 /**
24 * Primary class constructor.
25 *
26 * @since 1.8.0
27 */
28 public function __construct() {
29
30 $this->init();
31 }
32
33 /**
34 * Load and init the base field class.
35 *
36 * @since 1.8.0
37 */
38 public function init() {
39 }
40
41 /**
42 * Hooks.
43 *
44 * @since 1.7.7
45 */
46 private function hooks() {
47 }
48
49 /**
50 * Load default field types.
51 *
52 * @since 1.0.0
53 */
54 public function load() {
55 }
56
57 /**
58 * Produce tooltip HTML w/ icon.
59 *
60 * @since 1.8.0
61 *
62 * @param array $tooltip_text Tooltip text.
63 *
64 * @return string
65 */
66 public function get_tooltip_html( $tooltip_text = false ) {
67
68 if ( false === $tooltip_text ) {
69 return false;
70 }
71
72 $html = charitable_get_tooltip_html( $tooltip_text );
73
74 return $html;
75 }
76
77 /**
78 * Output a hidden field for the form settings in the left sidebar.
79 *
80 * @since 1.8.0
81 *
82 * @param string $value Field value.
83 * @param array $args Field params.
84 *
85 * @return string
86 */
87 public function generate_hidden_field( $value = false, $args = false ) {
88
89 $defaults = array(
90 'name' => '',
91 'id' => '',
92 'field_id' => '', // data.
93 );
94
95 $params = array_replace_recursive( $defaults, $args );
96 $field_id_attr = ( isset( $params['field_id'] ) && '' !== $params['field_id'] ) ? 'data-field-id="' . intval( $params['field_id'] ) . '"' : false;
97
98 if ( is_array( $params['name'] ) && isset( $params['name'][2] ) ) {
99 $name = implode( '][', $params['name'] ) . ']';
100 $params['name'] = str_replace( $params['name'][0] . ']', $params['name'][0], $name );
101 } elseif ( is_array( $params['name'] ) ) {
102 $params['name'] = implode( '-', $params['name'] );
103 }
104
105 $html = '<div id="' . $this->id_slug . '-' . $params['id'] . '-wrap" class="charitable-panel-field charitable-panel-field-hidden" ' . $field_id_attr . '>';
106 $html .= '<input id="' . $this->id_slug . '-' . $params['id'] . '" type="hidden" name="' . $params['name'] . '" value="' . $value . '"/>';
107 $html .= '</div>';
108
109 return $html;
110 }
111
112 /**
113 * Output a generic text div/area for the form settings in the left sidebar.
114 *
115 * @since 1.8.0
116 * @version 1.8.1.12 - detect $icon is a jpg, png, or gif.
117 *
118 * @param string $value Field value.
119 * @param string $label Feld label.
120 * @param array $args Field params.
121 *
122 * @return string
123 */
124 public function generate_text( $value = false, $label = false, $args = false ) {
125
126 $defaults = array(
127 'name' => '',
128 'id' => '',
129 'class' => '',
130 'container_class' => '',
131 'placeholder' => '',
132 'tooltip' => false,
133 'icon' => false,
134 'fa_icon' => false,
135 'default' => false,
136 'add_commas' => false,
137 'type' => 'text', // could also be "url", etc.
138 'field_id' => '', // data.
139 );
140
141 $params = array_replace_recursive( $defaults, $args );
142
143 $params['container_class'] .= ( isset( $params['icon'] ) && false !== $params['icon'] ) ? ' has-icon' : false;
144 $icon = ( isset( $params['icon'] ) && false !== $params['icon'] ) ? charitable()->get_path( 'assets', false ) . $params['icon'] : false;
145 $fa_icon = ( isset( $params['fa_icon'] ) && false !== $params['fa_icon'] ) ? '<i class="' . $params['fa_icon'] . ' errspan"></i>' : false;
146 $field_id_attr = ( isset( $params['field_id'] ) && '' !== $params['field_id'] ) ? 'data-field-id="' . intval( $params['field_id'] ) . '"' : false;
147 $description = ( isset( $params['description'] ) && false !== $params['description'] ) ? '<p class="charitable-campaign-builder-field-textarea-description">' . esc_html( $params['description'] ) . '</p>' : false;
148 $tooltip_html = ( isset( $params['tooltip'] ) && false !== $params['tooltip'] ) ? $this->get_tooltip_html( $params['tooltip'] ) : false;
149 $conditional_attr = ( isset( $params['conditional'] ) && '' !== $params['conditional'] ) ? 'data-conditional-id="' . intval( $params['conditional'] ) . '"' : false;
150 $value = false === $value && isset( $params['default'] ) && false !== $params['default'] ? esc_html( $params['default'] ) : $value;
151 $toggle_value = false;
152
153 $container_classes = explode( ' ', $params['container_class'] );
154 $container_classes = array_unique( $container_classes );
155 $params['container_class'] = implode( ' ', $container_classes );
156
157 if ( is_array( $value ) && key_exists( $params['name'][2], $value ) ) {
158 $value = $value[ $params['name'][2] ];
159 } elseif ( is_array( $value ) ) {
160 $value = reset( $value );
161 }
162
163 if ( is_array( $params['name'] ) && isset( $params['name'][2] ) ) {
164 $toggle_value = $params['name'][2];
165 $name = implode( '][', $params['name'] ) . ']';
166 $params['name'] = str_replace( $params['name'][0] . ']', $params['name'][0], $name );
167 } elseif ( is_array( $params['name'] ) ) {
168 $params['name'] = implode( '-', $params['name'] );
169 }
170
171 // santitize and remove all kinds of quotes from the input field text value.
172 $value = str_replace( array( '"', "'", '&#8220;', '&#8221;', '&#8216;', '&#8217;' ), '', $value );
173 $value = esc_html( $value );
174
175 if ( true === $params['add_commas'] && '' !== $value ) {
176 $value = Charitable_Currency::get_instance()->get_sanitized_and_localized_amount( $value );
177 }
178
179 $field_id_attr .= isset( $toggle_value ) && '' !== $toggle_value ? ' data-ajax-label="' . $toggle_value . '"' : false;
180
181 // If the toggle is a css_class, add another css class so it's easier for us to target this.
182 if ( 'css_class' === $toggle_value ) {
183 $params['class'] .= ' charitable-custom-css-field';
184 }
185
186 $html = '<div id="' . $this->id_slug . '-' . $params['id'] . '-wrap" class="charitable-panel-field charitable-panel-field-text ' . $params['container_class'] . '" ' . $field_id_attr . ' ' . $conditional_attr . '>
187 <label for="' . $this->id_slug . '-' . $params['id'] . '">' . $label . ' ' . $tooltip_html . '</label>
188 <div class="charitable-internal">';
189
190 // Is icon a jpg, png, or gif?
191 if ( ! empty( $icon ) && false !== $icon ) :
192 if ( strpos( $icon, '.jpg' ) || strpos( $icon, '.png' ) || strpos( $icon, '.gif' ) ) {
193 $html .= '<img class="charitable-currency-symbol-image" src="' . $icon . '" alt="' . $label . '" />';
194 } elseif ( false !== $icon ) {
195 $html .= '<span class="charitable-currency-symbol">' . $params['icon'] . '</span>';
196 }
197 endif;
198
199 $html .= '
200 <input type="' . $params['type'] . '" id="' . $this->id_slug . '-' . $params['id'] . '" name="' . $params['name'] . '" value="' . $value . '" class="' . $params['class'] . '" ' . $field_id_attr . ' placeholder="' . $params['placeholder'] . '" />
201 ' . $description . '
202 </div>
203 </div>';
204
205 return $html;
206 }
207
208 /**
209 * Output a toggle switch for the form settings in the left sidebar.
210 *
211 * @since 1.8.0
212 *
213 * @param string $value Field value.
214 * @param string $label Feld label.
215 * @param array $args Field params.
216 *
217 * @return string
218 */
219 public function generate_toggle( $value = false, $label = false, $args = false ) {
220
221 $defaults = array(
222 'name' => '',
223 'id' => '',
224 'class' => '',
225 'container_class' => '',
226 'field_id' => '',
227 'title' => '',
228 'visibility' => false,
229 'checked_value' => '1',
230 );
231
232 $params = array_replace_recursive( $defaults, $args );
233
234 if ( is_array( $value ) ) {
235 $value = reset( $value );
236 }
237
238 if ( is_array( $params['name'] ) ) {
239 $toggle_value = $params['name'][2];
240 $name = implode( '][', $params['name'] ) . ']';
241 $params['name'] = str_replace( $params['name'][0] . ']', $params['name'][0], $name );
242 }
243
244 $checked = ( $value !== false && $value === $params['checked_value'] ) ? 'checked="checked"' : false;
245 $field_id_attr = isset( $params['field_id'] ) && '' !== $params['field_id'] ? 'data-field-id="' . intval( $params['field_id'] ) . '"' : false;
246 $field_id_attr .= isset( $toggle_value ) && '' !== $toggle_value ? ' data-ajax-label="' . $toggle_value . '"' : false;
247 $params['container_class'] = $this->maybe_add_visibility_classes( $params['container_class'], $params['visibility'] );
248
249 $css_classes = explode( ' ', $params['class'] );
250 $css_classes = array_unique( $css_classes );
251 $params['class'] = implode( ' ', $css_classes );
252
253 $css_container_classes = ! empty( $params['container_class'] ) ? explode( ' ', $params['container_class'] ) : array();
254 $css_container_classes = array_unique( $css_container_classes );
255 $params['container_class'] = implode( ' ', $css_container_classes );
256
257 $html = isset( $params['title'] ) && '' !== $params['title'] ? '<h5 class="charitable-campaign-builder-setting-subheading">' . esc_html( $params['title'] ) . '</h5>' : false;
258
259 $html .= '<div data-field-id="' . $params['field_id'] . '" id="' . $this->id_slug . '-' . $params['id'] . '-wrap" class="charitable-panel-field charitable-panel-field-toggle ' . $params['container_class'] . '" ' . $field_id_attr . '>
260 <span class="charitable-toggle-control">
261 <input type="checkbox" id="' . $this->id_slug . '-' . $params['id'] . '" name="' . $params['name'] . '" value="' . $params['checked_value'] . '" class="' . $params['class'] . '" ' . $checked . ' />
262 <label class="charitable-toggle-control-icon" for="' . $this->id_slug . '-' . $params['id'] . '"></label>
263 <label for="' . $this->id_slug . '-' . $params['id'] . '">' . $label . '</label>
264 </span>
265 </div>';
266
267 return $html;
268 }
269
270 /**
271 * Output a toggle switch for the form settings in the left sidebar.
272 *
273 * @since 1.8.0
274 * @since 1.8.4.5 - bug fix for saving when $values is present.
275 *
276 * @param mixed $value Field value.
277 * @param string $label Feld label.
278 * @param array $args Field params.
279 *
280 * @return string
281 */
282 public function generate_toggles( $value = false, $label = false, $args = false ) {
283
284 $defaults = array(
285 'name' => '',
286 'id' => '',
287 'class' => 'charitable-checkbox-for-toggle',
288 'container_class' => '',
289 'field_id' => '',
290 'type' => 'toggle',
291 'default' => array(),
292 'checked_value' => 'true',
293 'use_defaults' => true,
294 );
295
296 $params = array_replace_recursive( $defaults, $args );
297
298 if ( is_array( $params['name'] ) ) {
299 $name = implode( '][', $params['name'] ) . ']';
300 $params['name'] = str_replace( $params['name'][0] . ']', $params['name'][0], $name );
301 }
302
303 $field_id_attr = '' !== $params['field_id'] ? 'data-field-id="' . intval( $params['field_id'] ) . '"' : false;
304
305 $css_container_classes = isset( $params['container_class'] ) ? explode( ' ', $params['container_class'] ) : array();
306 $css_container_classes = array_unique( $css_container_classes );
307 $params['container_class'] = implode( ' ', $css_container_classes );
308
309 $html = '<div data-field-id="' . $params['field_id'] . '" id="' . $this->id_slug . '-' . $params['id'] . '-wrap" ' . $field_id_attr . ' class="charitable-panel-field charitable-panel-field-toggle ' . $params['container_class'] . '">
310 <label for="' . $this->id_slug . '-' . $params['id'] . '">' . $label . '</label>';
311
312 foreach ( $params['options'] as $text => $box_id ) {
313
314 // If there is any value, we need to check if the box_id is in the value.
315
316 if ( ! empty( $value ) && is_array( $value ) ) {
317 if ( key_exists( $box_id, $value ) ) {
318 $checked = 'checked="checked"';
319 } else {
320 $checked = false;
321 }
322 } elseif ( is_array( $params['default'] ) && in_array( $box_id, $params['default'] ) ) {
323 $checked = 'checked="checked"';
324 } else {
325 $checked = false;
326 }
327
328 $toggle_name = $params['name'] . '[' . $box_id . ']';
329
330 $html .= '<span class="charitable-toggle-control" ' . $field_id_attr . ' data-ajax-label="' . $box_id . '" data-field-type="' . $params['type'] . '">
331 <input type="checkbox" id="' . $this->id_slug . '-' . $box_id . '-' . $params['id'] . '" name="' . $toggle_name . '" value="' . $box_id . '" class="' . $params['class'] . '" ' . $checked . ' ' . $field_id_attr . ' />
332 <label class="charitable-toggle-control-icon" for="' . $this->id_slug . '-' . $box_id . '-' . $params['id'] . '"></label>
333 <label for="' . $this->id_slug . '-' . $box_id . '-' . $params['id'] . '">' . $text . '</label>
334 </span>';
335 }
336
337 $html .= '
338 </div>';
339
340 return $html;
341 }
342
343 /**
344 * Output a generic checkbox for the form settings in the left sidebar.
345 *
346 * @since 1.8.0
347 *
348 * @param string $value Field value.
349 * @param string $label Feld label.
350 * @param array $args Field params.
351 *
352 * @return string
353 */
354 public function generate_checkbox( $value = false, $label = false, $args = false ) {
355
356 $defaults = array(
357 'name' => '',
358 'id' => '',
359 'class' => '',
360 );
361
362 $params = array_replace_recursive( $defaults, $args );
363
364 if ( is_array( $value ) ) {
365 $value = reset( $value );
366 }
367
368 if ( is_array( $params['name'] ) ) {
369 $name = implode( '][', $params['name'] ) . ']';
370 $params['name'] = str_replace( $params['name'][0] . ']', $params['name'][0], $name );
371 }
372
373 $checked = ( $value !== false && $value == $params['checked_value'] ) ? 'checked="checked"' : false;
374
375 $html = '<div id="' . $this->id_slug . '-' . $params['id'] . '-wrap" class="charitable-panel-field charitable-panel-field-checkbox" data-field-id="' . $params['field_id'] . '">
376 <input type="checkbox" id="' . $this->id_slug . '-' . $params['id'] . '" name="' . $params['name'] . '" value="' . $params['checked_value'] . '" class="' . $params['class'] . '" ' . $checked . ' />
377 <label for="' . $this->id_slug . '-' . $params['id'] . '">' . $label . '</label>
378 </div>';
379
380 return $html;
381 }
382
383 /**
384 * Output a generic set of checkboxes for the form settings in the left sidebar.
385 *
386 * @since 1.8.0
387 * @version 1.8.2 added tooltips, container_class.
388 *
389 * @param string $value Field value.
390 * @param string $label Feld label.
391 * @param array $args Field params.
392 *
393 * @return string
394 */
395 public function generate_checkboxes( $value = false, $label = false, $args = false ) {
396
397 $defaults = array(
398 'name' => '',
399 'id' => '',
400 'class' => '',
401 'container_class' => '',
402 'field_id' => '',
403 'tooltip' => false,
404 'visibility' => false,
405 'defaults' => array(),
406 );
407
408 $params = array_replace_recursive( $defaults, $args );
409 $extra_css = $this->maybe_add_visibility_classes( $params['class'], $params['visibility'] );
410
411 if ( ! is_array( $value ) && false !== $value ) {
412 $value = array( $value );
413 } elseif ( ! is_array( $value ) ) {
414 $value = array();
415 }
416
417 if ( is_array( $params['name'] ) ) {
418 $name = implode( '][', $params['name'] ) . ']';
419 $params['name'] = str_replace( $params['name'][0] . ']', $params['name'][0], $name );
420 }
421
422
423
424 $css_container_classes = isset( $params['container_class'] ) ? explode( ' ', $params['container_class'] ) : array();
425 $css_container_classes = array_unique( $css_container_classes );
426 $params['container_class'] = implode( ' ', $css_container_classes );
427 $params['container_class'] .= $extra_css;
428
429 $field_id_attr = '' !== $params['field_id'] ? 'data-field-id="' . intval( $params['field_id'] ) . '"' : false;
430 $description = ( isset( $params['description'] ) && false !== $params['description'] ) ? '<p class="charitable-campaign-builder-field-checkbox-description">' . esc_html( $params['description'] ) . '</p>' : false;
431 $tooltip_html = ( isset( $params['tooltip'] ) && false !== $params['tooltip'] ) ? $this->get_tooltip_html( $params['tooltip'] ) : false;
432
433 $html = '<div id="' . $this->id_slug . '-' . $params['id'] . '-wrap" class="charitable-panel-field charitable-panel-field-checkboxes ' . $params['container_class'] . '" ' . $field_id_attr . '>
434 <label for="' . $this->id_slug . '-' . $params['id'] . '"> ' . $label . ' ' . $tooltip_html . '</label>' . $description;
435
436 foreach ( $params['options'] as $text => $box_id ) {
437
438 $checked = ( empty( $value ) && ! empty( $defaults ) && in_array( $box_id, $params['defaults'] ) )
439 || ( $value !== false && key_exists( $box_id, $value ) && $value[ $box_id ] !== false ) ? 'checked="checked"' : false;
440
441 $html .= '<p ' . $field_id_attr . '><input id="' . $params['name'] . '-' . $box_id . '" type="checkbox" ' . $checked . ' name="' . $params['name'] . '[' . $box_id . ']" value="1" /><label for="' . $params['name'] . '-' . $box_id . '">' . $text . '</label></p>';
442
443 }
444
445 $html .= '
446 </div>';
447
448 return $html;
449 }
450
451
452 /**
453 * Output a generic set of radio buttons for the form settings in the left sidebar.
454 *
455 * @since 1.8.0
456 * @version 1.8.4.5
457 *
458 * @param string $value Field value.
459 * @param string $label Feld label.
460 * @param array $args Field params.
461 *
462 * @return string
463 */
464 public function generate_radio_options( $value = false, $label = false, $args = false ) {
465
466 $defaults = array(
467 'name' => '',
468 'id' => '',
469 'class' => '',
470 'container_class' => '',
471 'tooltip' => false,
472 'visibility' => false,
473 'field_id' => '', // data.
474 );
475
476 $params = array_replace_recursive( $defaults, $args );
477 $extra_css = $this->maybe_add_visibility_classes( $params['class'], $params['visibility'] );
478
479 if ( ! is_array( $value ) ) {
480 $value = array( $value );
481 }
482
483 if ( is_array( $params['name'] ) ) {
484 $toggle_value = $params['name'][2];
485 $name = implode( '][', $params['name'] ) . ']';
486 $params['name'] = str_replace( $params['name'][0] . ']', $params['name'][0], $name );
487 }
488
489 $field_id_attr = ( isset( $params['field_id'] ) && '' !== $params['field_id'] ) ? 'data-field-id="' . intval( $params['field_id'] ) . '"' : false;
490 $field_id_attr .= isset( $toggle_value ) && '' !== $toggle_value ? ' data-ajax-label="' . $toggle_value . '"' : false;
491 $description = ( isset( $params['description'] ) && false !== $params['description'] ) ? '<p class="charitable-campaign-builder-field-textarea-description">' . esc_html( $params['description'] ) . '</p>' : false;
492 $tooltip_html = ( isset( $params['tooltip'] ) && false !== $params['tooltip'] ) ? $this->get_tooltip_html( $params['tooltip'] ) : false;
493
494 $css_classes = explode( ' ', $params['class'] );
495 $css_classes = array_unique( $css_classes );
496 $params['class'] = implode( ' ', $css_classes );
497
498 $css_container_classes = isset( $params['container_class'] ) ? explode( ' ', $params['container_class'] ) : array();
499 $css_container_classes = array_unique( $css_container_classes );
500 $params['container_class'] = implode( ' ', $css_container_classes );
501 $params['container_class'] .= $extra_css;
502
503 $html = '<div id="' . $this->id_slug . '-' . $params['id'] . '-wrap" class="charitable-panel-field charitable-panel-field-radio-options ' . $params['container_class'] . '" ' . $field_id_attr . '>
504 <label for="' . $this->id_slug . '-' . $params['id'] . '">' . $label . ' ' . $tooltip_html . '</label>';
505
506 foreach ( $params['options'] as $text => $box_id ) {
507 // For radio buttons, we just need to check if the value matches the box_id.
508 $checked = ( $value[0] === $box_id ) ? 'checked="checked"' : '';
509 // Only fall back to default if no value is set.
510 if ( empty( $value[0] ) && ! empty( $params['option_default'] ) && $box_id === $params['option_default'] ) {
511 $checked = 'checked="checked"';
512 }
513
514 $input_id = str_replace( '[', '-', $params['name'] );
515 $input_id = str_replace( ']', '-', $input_id );
516 $input_id = str_replace( '--', '-', $input_id );
517
518 $html .= '<p ' . $field_id_attr . '><input id="' . $input_id . '-' . $box_id . '" type="radio" ' . $checked . ' name="' . $params['name'] . '" value="' . $box_id . '" /><label for="' . $input_id . '-' . $box_id . '">' . $text . '</label></p>';
519 }
520
521 $html .= $description . '
522 </div>';
523
524 return $html;
525 }
526
527 /**
528 * Output a generic dropdown for the form settings in the left sidebar.
529 *
530 * @since 1.8.0
531 *
532 * @param string $value Field value.
533 * @param string $label Feld label.
534 * @param array $args Field params.
535 *
536 * @return string
537 */
538 public function generate_dropdown( $value = false, $label = false, $args = false ) {
539
540 $defaults = array(
541 'name' => '',
542 'id' => '',
543 'class' => '',
544 'container_class' => '',
545 'default' => false,
546 'visibility' => false,
547 'options' => false,
548 );
549
550 $params = array_replace_recursive( $defaults, $args );
551
552 if ( is_array( $value ) ) {
553 $value = reset( $value );
554 }
555
556 if ( is_array( $params['name'] ) ) {
557 $toggle_value = $params['name'][2];
558 $name = implode( '][', $params['name'] ) . ']';
559 $params['name'] = str_replace( $params['name'][0] . ']', $params['name'][0], $name );
560 }
561
562 $field_id_attr = isset( $params['field_id'] ) && '' !== $params['field_id'] ? 'data-field-id="' . intval( $params['field_id'] ) . '"' : false;
563 $field_id_attr .= isset( $toggle_value ) && '' !== $toggle_value ? ' data-ajax-label="' . $toggle_value . '"' : false;
564 $selected_value = isset( $params['selected_value'] ) ? esc_html( $params['selected_value'] ) : $value;
565 $default_value = isset( $params['default'] ) && false !== $params['default'] ? esc_html( $params['default'] ) : false;
566 $params['container_class'] = $this->maybe_add_visibility_classes( $params['class'], $params['visibility'] );
567
568 $css_classes = explode( ' ', $params['class'] );
569 $css_classes = array_unique( $css_classes );
570 $params['class'] = implode( ' ', $css_classes );
571
572 $css_container_classes = isset( $params['container_class'] ) ? explode( ' ', $params['container_class'] ) : array();
573 $css_container_classes = array_unique( $css_container_classes );
574 $params['container_class'] = implode( ' ', $css_container_classes );
575
576 $tooltip_html = ( isset( $params['tooltip'] ) && false !== $params['tooltip'] ) ? $this->get_tooltip_html( $params['tooltip'] ) : false;
577
578 $html = '<div id="' . $this->id_slug . '-' . $params['id'] . '-wrap" class="charitable-panel-field charitable-panel-field-dropdown ' . $params['container_class'] . '" ' . $field_id_attr . '>
579 <label for="' . $this->id_slug . '-' . $params['id'] . '">' . $label . ' ' . $tooltip_html . '</label>';
580
581 if ( false !== $params['options'] && is_array( $params['options'] ) && count( $params['options'] ) > 0 ) {
582
583 $html .= '<select id="' . $this->id_slug . '-' . $params['id'] . '" name="' . $params['name'] . '">';
584 foreach ( $params['options'] as $option_value => $text ) {
585 $selected = ( $selected_value === '' && $default_value && $option_value === $default_value ) ? 'selected="selected"' : false;
586 $selected = ( false === $selected && $selected_value && $option_value === $selected_value ) ? 'selected="selected"' : false;
587 $html .= '<option value="' . $option_value . '" ' . $selected . '>' . $text . '</option>';
588 }
589 $html .= '</select>';
590
591 } elseif ( ! empty( $params['not_available'] ) ) {
592
593 $html .= '<p>' . esc_html( $params['not_available'] ) . '</p>';
594
595 }
596
597 $html .= '
598 </div>';
599
600 return $html;
601 }
602
603 /**
604 * Output a generic textbox for the form settings in the left sidebar.
605 *
606 * @since 1.8.0
607 *
608 * @param string $value Field value.
609 * @param string $label Feld label.
610 * @param array $args Field params.
611 *
612 * @return string
613 */
614 public function generate_textbox( $value = false, $label = false, $args = false ) {
615
616 $defaults = array(
617 'name' => '',
618 'id' => '',
619 'class' => '',
620 'container_class' => array(),
621 'placeholder' => '',
622 'description' => '',
623 'rows' => 10,
624 'field_id' => '',
625 'visibility' => false,
626 'hidden' => false,
627 'html' => false,
628 'code' => false,
629 'special' => false,
630 );
631
632 $params = array_replace_recursive( $defaults, $args );
633
634 if ( is_array( $value ) ) {
635 $value = reset( $value );
636 }
637
638 if ( is_array( $params['name'] ) ) {
639 $name = implode( '][', $params['name'] ) . ']';
640 $params['name'] = str_replace( $params['name'][0] . ']', $params['name'][0], $name );
641 }
642
643 if ( $params['html'] ) {
644 // add to class so quill can pick it up.
645 $params['class'] .= ' campaign-builder-htmleditor';
646 }
647
648 if ( $params['code'] ) {
649 // add to class so the js can pick it up.
650 $params['class'] .= ' campaign-builder-codeeditor';
651 }
652
653 // convert into an array to remove duplicates, then convert back to a string.
654 $css_classes = explode( ' ', $params['class'] );
655 $css_classes = array_unique( $css_classes );
656 $params['class'] = implode( ' ', $css_classes );
657
658 $css_container_classes = isset( $params['container_class'] ) && ! empty( $params['container_class'] ) ? explode( ' ', $params['container_class'] ) : array();
659 $css_container_classes = array_unique( $css_container_classes );
660 $params['container_classes'] = implode( ' ', $css_container_classes );
661 if ( $params['hidden'] ) { // if hidden is true, then this is output is deliberately hidden from the user. This is different from "visibility" which is used for conditional logic.
662 $params['container_classes'] .= ' charitable-hidden';
663 }
664
665 $field_id_attr = ( isset( $params['field_id'] ) && '' !== $params['field_id'] ) ? 'data-field-id="' . intval( $params['field_id'] ) . '"' : false;
666 $description = ( isset( $params['description'] ) && '' !== trim( $params['description'] ) ) ? '<p class="charitable-campaign-builder-field-textarea-description">' . esc_html( $params['description'] ) . '</p>' : false;
667 $tooltip_html = ( isset( $params['tooltip'] ) && false !== $params['tooltip'] ) ? $this->get_tooltip_html( $params['tooltip'] ) : false;
668
669 if ( false !== $params['special'] ) {
670
671 if ( 'campaign_description' === $params['special'] && '' === trim( $value ) ) {
672
673 $value = '
674
675 <p><em><strong>This is an example of a campaign description.</strong> It should summarize thoughtfully what your campaign is about and what your goal(s) are. If this is the only campaign of your site you can link to a more detailed About page that introduces into more detail. The description here might say something like this:</em></p>
676 <p><br/></p>
677 <p>Hi there! This campaign is to raise money for equipment, uniforms, and various other supplies for our local school sport team, The Tigers.</p>
678 <p><br/></p>
679 <p>...or something like this:</p>
680 <p><br/></p>
681 <p>The Tigers basebase team was founded in 1971 and has been providing fun after school activities for young children in the Dalls, Texas USA public schools ever since. The campaign is run by Mr. and Mrs. Smith and employs about 5 people including coaches and staff.</p>
682 <p><br/></p>
683 <p>Since this is a new campaign, you as a Charitable admin should update this content by clicking on this block in the preview area in the campaign builder. 😄</p>
684 <p><br/></p>
685
686
687 ';
688
689 }
690
691 }
692
693 if ( $args['html'] ) {
694
695 $html = '<div id="' . $this->id_slug . '-' . $params['id'] . '-wrap" class="charitable-panel-field charitable-panel-field-textarea ' . $params['container_classes'] . '" ' . $field_id_attr . ' data-special-type="' . $params['special'] . '">
696 <label for="' . $this->id_slug . '-' . $params['id'] . '">' . $label . ' ' . $tooltip_html . '</label>' . $description . '
697 <div data-textarea-name="' . $params['name'] . '" id="' . $this->id_slug . '-' . $params['id'] . '" class="' . $params['class'] . '">' . $value . '</div>
698 <input type="hidden" value="' . htmlentities( $value ) . '" name="' . $params['name'] . '" />
699 </div>';
700
701 } elseif ( $args['code'] ) {
702
703 $html = '<div id="' . $this->id_slug . '-' . $params['id'] . '-wrap" class="charitable-panel-field charitable-panel-field-textarea ' . $params['container_classes'] . '" ' . $field_id_attr . '>
704 <label for="' . $this->id_slug . '-' . $params['id'] . '">' . $label . ' ' . $tooltip_html . '</label>' . $description . '
705 <textarea id="' . $this->id_slug . '-' . $params['id'] . '" name="' . $params['name'] . '" placeholder="" class="' . $params['class'] . '" rows="' . $params['rows'] . '">' . $value . '</textarea>
706 </div>';
707
708 } else {
709
710 $html = '<div id="' . $this->id_slug . '-' . $params['id'] . '-wrap" class="charitable-panel-field ' . $params['container_classes'] . ' charitable-panel-field-textarea" ' . $field_id_attr . '>
711 <label for="' . $this->id_slug . '-' . $params['id'] . '">' . $label . ' ' . $tooltip_html . '</label>' . $description . '
712 <textarea id="' . $this->id_slug . '-' . $params['id'] . '" name="' . $params['name'] . '" placeholder="" class="' . $params['class'] . '" rows="' . $params['rows'] . '">' . $value . '</textarea>
713 </div>';
714
715 }
716
717 return apply_filters( 'charitable_campaign_builder_form_field_textbox', $html, $value, $label, $args );
718 }
719
720 /**
721 * Output a generic date picker for the form settings in the left sidebar.
722 *
723 * @since 1.8.0
724 *
725 * @param string $value Field value.
726 * @param string $label Feld label.
727 * @param array $args Field params.
728 *
729 * @return string
730 */
731 public function generate_date( $value = false, $label = false, $args = false ) {
732
733 $defaults = array(
734 'name' => '',
735 'id' => '',
736 'class' => '',
737 'placeholder' => '',
738 'date-format' => 'F j, Y',
739 'data-date' => '',
740 'label-below' => '',
741 'visibility' => false,
742 'icon' => false,
743 'container_class' => '',
744 );
745
746 $params = array_replace_recursive( $defaults, $args );
747
748 if ( is_array( $value ) ) {
749 $value = reset( $value );
750 }
751
752 if ( $value === '0' || $value === 0 ) { // todo: adding this while we figure some things out.
753 $value = false;
754 }
755
756 if ( false !== $value && '' !== trim( $value ) && ! charitable_is_valid_timestamp( $value ) ) {
757 $value = date( $params['date-format'], strtotime( $value ) ); // phpcs:ignore WordPress.DateTime.RestrictedFunctions.date_date
758 }
759
760 if ( is_array( $params['name'] ) ) {
761 $name = implode( '][', $params['name'] ) . ']';
762 $params['name'] = str_replace( $params['name'][0] . ']', $params['name'][0], $name );
763 }
764
765 $params['container_class'] .= ( isset( $params['icon'] ) && false !== $params['icon'] ) ? 'has-icon' : false;
766
767 $container_classes = explode( ' ', $params['container_class'] );
768 $container_classes = array_unique( $container_classes );
769 $params['container_class'] = implode( ' ', $container_classes );
770 $tooltip_html = ( isset( $params['tooltip'] ) && false !== $params['tooltip'] ) ? $this->get_tooltip_html( $params['tooltip'] ) : false;
771
772 $icon = ( isset( $params['icon'] ) && false !== $params['icon'] ) ? charitable()->get_path( 'assets', false ) . $params['icon'] : false;
773
774 $html = '<div id="' . $this->id_slug . '-' . $params['id'] . '-wrap" class="charitable-panel-field charitable-panel-field-date ' . $params['container_class'] . '">
775 <label for="' . $this->id_slug . '-' . $params['id'] . '">' . $label . ' ' . $tooltip_html . '</label>
776 <div class="charitable-internal">
777 <div class="charitable-date-field-icon"><img src="' . $icon . '" class="" /></div>
778 </div>
779 <input type="text" id="' . $this->id_slug . '-' . $params['id'] . '" name="' . $params['name'] . '" value="' . $value . '" class="' . $params['class'] . '" placeholder="' . $params['placeholder'] . '" />
780 ' . $params['label_below'] . '
781 </div>';
782
783 return $html;
784 }
785
786 /**
787 * Output a number slider for the form settings in the left sidebar.
788 *
789 * @since 1.8.0
790 *
791 * @param string $value Field value.
792 * @param string $label Feld label.
793 * @param array $args Field params.
794 *
795 * @return string
796 */
797 public function generate_number_slider( $value = false, $label = false, $args = false ) {
798
799 $defaults = array(
800 'name' => '',
801 'id' => '',
802 'css_class' => '',
803 'placeholder' => '',
804 'tooltip' => false,
805 'icon' => false,
806 'min' => 0,
807 'max' => 100,
808 'step' => 10,
809 'min_actual' => '',
810 'symbol' => '%',
811 'field_id' => '', // data.
812 'field_type' => '',
813 'visibility' => false,
814 );
815
816 $params = array_replace_recursive( $defaults, $args );
817 $container_classes = ( false !== $params['icon'] ) ? 'has-icon' : false;
818 $tooltip_html = ( false !== $params['tooltip'] ) ? $this->get_tooltip_html( $params['tooltip'] ) : false;
819
820 // css classes.
821 $css_classes = array();
822 $css_classes[] = $params['field_type'];
823 if ( ! empty( $params['css_class'] ) ) {
824 $css_classes[] = esc_attr( $params['css_class'] );
825 }
826 $css_classes = implode( ' ', $css_classes );
827
828 if ( is_array( $value ) && key_exists( $params['name'][2], $value ) ) {
829 $value = $value[ $params['name'][2] ];
830 } elseif ( is_array( $value ) ) {
831 $value = reset( $value );
832 }
833
834 if ( is_array( $params['name'] ) ) {
835 $name = implode( '][', $params['name'] ) . ']';
836 $params['name'] = str_replace( $params['name'][0] . ']', $params['name'][0], $name );
837 }
838
839 $html = '<div id="' . $this->id_slug . '-' . $params['id'] . '-wrap" class="charitable-panel-field charitable-panel-field-number-slider ' . $container_classes . '" data-field-id="' . $params['field_id'] . '">';
840 $html .= '<label for="' . $this->id_slug . '-' . $params['id'] . '">' . $label . ' ' . $tooltip_html . '</label>
841 <div class="charitable-internal">';
842 $html .= '<input type="range" readonly
843 class="charitable-number-slider ' . $css_classes . '"
844 id="' . $this->id_slug . '-' . $params['id'] . '"
845 name="' . esc_html( $params['name'] ) . '"
846 value="' . $value . '"
847 min="' . intval( $params['min'] ) . '"
848 max="' . intval( $params['max'] ) . '"
849 min-actual="' . intval( $params['min_actual'] ) . '"
850 step="' . $params['step'] . '">
851
852 <div
853 id="charitable-number-slider-hint-' . $params['id'] . '"
854 data-hint="' . $value . '"
855 data-symbol="' . $params['symbol'] . '"
856 class="charitable-number-slider-hint">' . $value . '
857 ' . $params['symbol'] . '<small>minimum</small>
858 </div>';
859 $html .= '</div></div>';
860
861 return $html;
862 }
863
864 /**
865 * Output an upload field for the form settings in the left sidebar.
866 *
867 * @since 1.8.0
868 *
869 * @param string $value Field value.
870 * @param string $label Feld label.
871 * @param array $args Field params.
872 *
873 * @return string
874 */
875 public function generate_uploader( $value = false, $label = false, $args = false ) {
876
877 $defaults = array(
878 'name' => '',
879 'id' => '',
880 'class' => '',
881 'tooltip' => false,
882 'icon' => false,
883 'field_id' => '', // data.
884 'field_type' => '',
885 'size' => 'regular',
886 'description' => '',
887 'button_label' => esc_html__( 'Attach File', 'charitable' ),
888 'button_text' => esc_html__( 'Attach', 'charitable' ),
889 );
890
891 $params = array_replace_recursive( $defaults, $args );
892 $container_classes = ( false !== $params['icon'] ) ? 'has-icon' : false;
893 $icon = ( false !== $params['icon'] ) ? '<i class="' . $params['icon'] . ' errspan"></i>' : false;
894 $tooltip_html = ( false !== $params['tooltip'] ) ? $this->get_tooltip_html( $params['tooltip'] ) : false;
895 $button_label = ( false !== $params['button_label'] ) ? esc_html( $params['button_label'] ) : esc_html__( 'Attach File', 'charitable' );
896 $placeholder = ( false !== $params['placeholder'] ) ? esc_html( $params['placeholder'] ) : false;
897 $description = ( false !== $params['description'] ) ? '<p class="charitable-campaign-builder-field-uploader-description">' . esc_html( $params['description'] ) . '</p>' : false;
898
899 $css_classes = array();
900 $css_classes[] = $params['field_type'];
901 $css_classes[] = ( isset( $params['size'] ) && ! is_null( $params['size'] ) ) ? $params['size'] : 'regular';
902 $css_classes = implode( ' ', $css_classes );
903
904 if ( is_array( $value ) && key_exists( $params['name'][2], $value ) ) {
905 $value = $value[ $params['name'][2] ];
906 } elseif ( is_array( $value ) ) {
907 $value = reset( $value );
908 }
909
910 if ( is_array( $params['name'] ) ) {
911 $name = implode( '][', $params['name'] ) . ']';
912 $params['name'] = str_replace( $params['name'][0] . ']', $params['name'][0], $name );
913 }
914
915 $html = '<div id="' . $this->id_slug . '-' . $params['id'] . '-wrap" class="charitable-panel-field charitable-panel-field-uploader ' . $container_classes . '" data-field-id="' . $params['field_id'] . '">';
916 $html .= '<label for="' . $this->id_slug . '-' . $params['id'] . '">' . $label . ' ' . $tooltip_html . '</label>';
917 $html .= ( false !== $description ) ? $description : false;
918 $html .= '<div class="charitable-internal">';
919 $html .= '<input type="url" class="charitable-uploader ' . $css_classes . '" id="' . $this->id_slug . '-' . $params['id'] . '" name="' . $params['name'] . '" placeholder="' . $placeholder . '" value="' . esc_attr( stripslashes( $value ) ) . '"/>';
920 $html .= '<p><input type="button" data-uploader-title="' . $button_label . '" data-uploader-button-text="' . $button_label . '" class="charitable-campaign-builder-upload-button charitable-campaign-builder-button-secondary" value="' . $button_label . '"/>';
921 $html .= '<button class="charitable-campaign-builder-clear-button charitable-campaign-builder-button-secondary">' . __( 'Clear', 'charitable' ) . '</button>';
922 $html .= '</div></div>';
923
924 return $html;
925 }
926
927 /**
928 * Output a generic align (left/center/right) field for the form settings in the left sidebar.
929 *
930 * @since 1.8.0
931 *
932 * @param string $value Field value.
933 * @param string $label Feld label.
934 * @param array $args Field params.
935 *
936 * @return string
937 */
938 public function generate_align( $value = false, $label = false, $args = false ) {
939
940 $defaults = array(
941 'name' => '',
942 'id' => '',
943 'class' => '',
944 'default' => 'center',
945 'align_left_icon' => 'fa fa-align-left',
946 'align_center_icon' => 'fa fa-align-center',
947 'align_right_icon' => 'fa fa-align-right',
948 );
949
950 $params = array_replace_recursive( $defaults, $args );
951
952 if ( is_array( $value ) ) {
953 $value = reset( $value );
954 }
955
956 if ( false === $value && false !== $params['default'] ) {
957 $value = $params['default'];
958 }
959
960 // Build the align icons, include active state.
961 $align_types = array( 'left', 'center', 'right' );
962
963 if ( is_array( $params['name'] ) ) {
964 $name = implode( '][', $params['name'] ) . ']';
965 $params['name'] = str_replace( $params['name'][0] . ']', $params['name'][0], $name );
966 }
967
968 $html = '<div id="' . $this->id_slug . '-' . $params['id'] . '-wrap" class="charitable-panel-field charitable-panel-field-align ' . $params['class'] . '" data-field-id="' . $params['field_id'] . '">
969 <label for="' . $this->id_slug . '-' . $params['id'] . '">' . $label . '</label>';
970
971 foreach ( $align_types as $align_type ) {
972 $active = ( $value === $align_type ) ? 'active' : false;
973 $html .= '<span class="' . $active . '"><a title="' . $align_type . '" href="#" data-align-value="' . $align_type . '"><i class="' . $params[ 'align_' . $align_type . '_icon' ] . '"></i></a></span>';
974 }
975
976 $html .= '<input type="hidden" value="' . $value . '" name="' . $params['name'] . '" />';
977
978 $html .= '</div>';
979
980 return $html;
981 }
982
983 /**
984 * Output a UI that is meant to multiple select for tags. Forked from the generate_dropdown.
985 *
986 * @since 1.8.0
987 *
988 * @param string $value Field value.
989 * @param string $label Feld label.
990 * @param array $args Field params.
991 *
992 * @return string
993 */
994 public function generate_tag_selector( $value = false, $label = false, $args = false ) {
995
996 $defaults = array(
997 'name' => '',
998 'id' => '',
999 'class' => '',
1000 'container_class' => '',
1001 'default' => false,
1002 'visibility' => false,
1003 'options' => false,
1004 'tooltip' => false,
1005 );
1006
1007 $params = array_replace_recursive( $defaults, $args );
1008
1009 if ( is_array( $params['name'] ) ) {
1010 $toggle_value = $params['name'][2];
1011 $name = implode( '][', $params['name'] ) . ']';
1012 $params['name'] = str_replace( $params['name'][0] . ']', $params['name'][0], $name );
1013 }
1014
1015 $field_id_attr = isset( $params['field_id'] ) && '' !== $params['field_id'] ? 'data-field-id="' . intval( $params['field_id'] ) . '"' : false;
1016 $field_id_attr .= isset( $toggle_value ) && '' !== $toggle_value ? ' data-ajax-label="' . $toggle_value . '"' : false;
1017 $selected_value = isset( $params['selected_value'] ) ? esc_html( $params['selected_value'] ) : $value;
1018 $default_value = isset( $params['default'] ) && false !== $params['default'] ? esc_html( $params['default'] ) : false;
1019 $tooltip_html = ( isset( $params['tooltip'] ) && false !== $params['tooltip'] ) ? $this->get_tooltip_html( $params['tooltip'] ) : false;
1020 $params['container_class'] = $this->maybe_add_visibility_classes( $params['class'], $params['visibility'] );
1021
1022 $css_classes = explode( ' ', $params['class'] );
1023 $css_classes = array_unique( $css_classes );
1024 $params['class'] = implode( ' ', $css_classes );
1025
1026 $css_container_classes = isset( $params['container_class'] ) ? explode( ' ', $params['container_class'] ) : array();
1027 $css_container_classes = array_unique( $css_container_classes );
1028 $params['container_class'] = implode( ' ', $css_container_classes );
1029
1030 $html = '<div id="' . $this->id_slug . '-' . $params['id'] . '-wrap" class="charitable-panel-field charitable-panel-field-dropdown ' . $params['container_class'] . '" ' . $field_id_attr . '>
1031 <label for="' . $this->id_slug . '-' . $params['id'] . '">' . $label . ' ' . $tooltip_html . '</label>';
1032
1033 if ( empty( $params['options'] ) ) {
1034
1035 $html .= '<p><em><small>There are currently no Charitable specific tags. <a target="_blank" href="' . admin_url( 'edit-tags.php?taxonomy=campaign_tag&post_type=campaign' ) . '">Click here</a> to start adding some or <a href="https://wpcharitable.com/documentation/charitable-tags-and-categories">read our documentation for more</a>.</small></em></p>';
1036
1037 }
1038
1039 if ( false !== $params['options'] && is_array( $params['options'] ) && count( $params['options'] ) > 0 ) {
1040
1041 if ( empty( $params['options'] ) ) {
1042
1043 $html .= '<p><em><small>There are currently no Charitable specific tags. <a target="_blank" href="' . admin_url( 'edit-tags.php?taxonomy=campaign_tag&post_type=campaign' ) . '">Click here</a> to start adding some or <a href="https://wpcharitable.com/documentation/charitable-tags-and-categories">read our documentation for more</a>.</small></em></p>';
1044
1045 } else {
1046
1047 $html .= '<select id="' . $this->id_slug . '-' . $params['id'] . '" class="campaign-tag-field" name="' . $params['name'] . '" multiple="multiple">';
1048 foreach ( $params['options'] as $option_value => $text ) {
1049
1050 $selected = is_array( $value ) && in_array( $option_value, $value, true ) ? 'selected="selected"' : false;
1051
1052 $html .= '<option value="' . $option_value . '" ' . $selected . '>' . $text . '</option>';
1053 }
1054 $html .= '</select>';
1055
1056 }
1057
1058 }
1059
1060 $html .= '
1061 </div>';
1062
1063 return $html;
1064 }
1065
1066 /**
1067 * Output a user/author/creator dropdown for the form settings in the left sidebar.
1068 *
1069 * @since 1.8.0
1070 *
1071 * @param string $value Field value.
1072 * @param string $label Feld label.
1073 * @param array $args Field params.
1074 *
1075 * @return string
1076 */
1077 public function generate_user_dropdown( $value = false, $label = false, $args = false ) {
1078
1079 $defaults = array(
1080 'name' => '',
1081 'id' => '',
1082 'class' => '',
1083 'container_class' => '',
1084 'default' => false,
1085 'visibility' => false,
1086 'options' => false,
1087 'tooltip' => false,
1088 );
1089
1090 $params = array_replace_recursive( $defaults, $args );
1091
1092 if ( is_array( $value ) ) {
1093 $value = reset( $value );
1094 }
1095
1096 if ( is_array( $params['name'] ) ) {
1097 $toggle_value = $params['name'][2];
1098 $name = implode( '][', $params['name'] ) . ']';
1099 $params['name'] = str_replace( $params['name'][0] . ']', $params['name'][0], $name );
1100 }
1101
1102 $field_id_attr = isset( $params['field_id'] ) && '' !== $params['field_id'] ? 'data-field-id="' . intval( $params['field_id'] ) . '"' : false;
1103 $field_id_attr .= isset( $toggle_value ) && '' !== $toggle_value ? ' data-ajax-label="' . $toggle_value . '"' : false;
1104 $selected_value = isset( $params['selected_value'] ) ? esc_html( $params['selected_value'] ) : $value;
1105 $default_value = isset( $params['default'] ) && false !== $params['default'] ? esc_html( $params['default'] ) : false;
1106 $tooltip_html = ( isset( $params['tooltip'] ) && false !== $params['tooltip'] ) ? $this->get_tooltip_html( wp_strip_all_tags( $params['tooltip'] ) ) : false;
1107 $params['container_class'] = $this->maybe_add_visibility_classes( $params['class'], $params['visibility'] );
1108
1109 $css_classes = explode( ' ', $params['class'] );
1110 $css_classes = array_unique( $css_classes );
1111 $params['class'] = implode( ' ', $css_classes );
1112
1113 $css_container_classes = isset( $params['container_class'] ) ? explode( ' ', $params['container_class'] ) : array();
1114 $css_container_classes = array_unique( $css_container_classes );
1115 $params['container_class'] = implode( ' ', $css_container_classes );
1116
1117 $html = '<div id="' . $this->id_slug . '-' . $params['id'] . '-wrap" class="charitable-panel-field charitable-panel-field-dropdown ' . $params['container_class'] . '" ' . $field_id_attr . '>
1118 <label for="' . $this->id_slug . '-' . $params['id'] . '">' . $label . ' ' . $tooltip_html . '</label>';
1119
1120 if ( false !== $params['options'] && is_array( $params['options'] ) && count( $params['options'] ) > 0 ) {
1121
1122 $html .= '<select id="' . $this->id_slug . '-' . $params['id'] . '" name="' . $params['name'] . '">';
1123 foreach ( $params['options'] as $option_value => $user_data ) {
1124
1125 $text = esc_html( $user_data['text'] );
1126 $avatar = ! empty( $user_data['avatar'] ) ? esc_url( $user_data['avatar'] ) : false;
1127 $meta = ! empty( $user_data['meta'] ) ? ( $user_data['meta'] ) : false;
1128
1129 $selected = ( isset( $selected_value ) && $option_value !== false && intval( $option_value ) === intval( $selected_value ) ) ? 'selected="selected"' : false;
1130 $selected = ( false === $selected && false !== $default_value && $option_value === $default_value ) ? 'selected="selected"' : $selected;
1131 $html .= '<option data-avatar="' . $avatar . '" data-meta="' . $meta . '" value="' . $option_value . '" ' . $selected . '>' . $text . '</option>';
1132 }
1133 $html .= '</select>';
1134
1135 }
1136
1137 $html .= '
1138 </div>';
1139
1140 return $html;
1141 }
1142
1143 /**
1144 * Output a user/author/creator dropdown for the form settings in the left sidebar.
1145 *
1146 * @since 1.8.0
1147 *
1148 * @param string $campaign_data Campaign data.
1149 * @param string $label Feld label.
1150 * @param array $args Field params.
1151 *
1152 * @return string
1153 */
1154 public function generate_user_dropdown_mini( $campaign_data = false, $label = false, $args = false ) {
1155
1156 $defaults = array(
1157 'name' => '',
1158 'id' => '',
1159 'class' => '',
1160 'container_class' => '',
1161 'default' => false,
1162 'visibility' => false,
1163 'options' => false,
1164 );
1165
1166 $params = array_replace_recursive( $defaults, $args );
1167
1168 // get a default value.
1169 $value = ! empty( $campaign_data['settings']['general']['campaign_creator_id'] ) ? intval( $campaign_data['settings']['general']['campaign_creator_id'] ) : false;
1170
1171 if ( is_array( $params['name'] ) ) {
1172 $toggle_value = $params['name'][2];
1173 $name = implode( '][', $params['name'] ) . ']';
1174 $params['name'] = str_replace( $params['name'][0] . ']', $params['name'][0], $name );
1175 }
1176
1177 $field_id_attr = isset( $params['field_id'] ) && '' !== $params['field_id'] ? 'data-field-id="' . intval( $params['field_id'] ) . '"' : false;
1178 $field_id_attr .= isset( $toggle_value ) && '' !== $toggle_value ? ' data-ajax-label="' . $toggle_value . '"' : false;
1179 $selected_value = isset( $params['selected_value'] ) ? esc_html( $params['selected_value'] ) : $value;
1180 $default_value = isset( $params['default'] ) && false !== $params['default'] ? esc_html( $params['default'] ) : false;
1181
1182 $css_classes = explode( ' ', $params['class'] );
1183 $css_classes = array_unique( $css_classes );
1184 $params['class'] = implode( ' ', $css_classes );
1185
1186 $css_container_classes = isset( $params['container_class'] ) ? explode( ' ', $params['container_class'] ) : array();
1187 $css_container_classes = array_unique( $css_container_classes );
1188 $params['container_class'] = implode( ' ', $css_container_classes );
1189
1190 $html = '<div id="' . $this->id_slug . '-' . $params['id'] . '-wrap" class="charitable-panel-field charitable-panel-field-dropdown ' . $params['container_class'] . '" ' . $field_id_attr . '>
1191 <label for="' . $this->id_slug . '-' . $params['id'] . '">' . $label . '</label>';
1192
1193 if ( false !== $params['options'] && is_array( $params['options'] ) && count( $params['options'] ) > 0 ) {
1194
1195 $html .= '<select id="' . $this->id_slug . '-' . $params['id'] . '" name="' . $params['name'] . '">';
1196 foreach ( $params['options'] as $option_value => $user_data ) {
1197
1198 $text = esc_html( $user_data['text'] );
1199 $avatar = ! empty( $user_data['avatar'] ) ? esc_url( $user_data['avatar'] ) : false;
1200 $meta = ! empty( $user_data['meta'] ) ? ( $user_data['meta'] ) : false;
1201 $selected = ( isset( $selected_value ) && $value !== false && $option_value == $selected_value ) ? 'selected="selected"' : false;
1202 $selected = ( false === $selected && ( 0 === intval( $selected_value ) || false === $selected_value ) && false !== $default_value && $option_value == $default_value ) ? 'selected="selected"' : $selected;
1203 $html .= '<option data-avatar="' . $avatar . '" data-meta="' . $meta . '" value="' . $option_value . '" ' . $selected . '>' . $text . '</option>';
1204 }
1205 $html .= '</select>';
1206
1207 }
1208
1209 $html .= '
1210 </div>';
1211
1212 return $html;
1213 }
1214
1215 /**
1216 * Output a generic div for the form settings in the left sidebar.
1217 *
1218 * @since 1.8.0
1219 *
1220 * @param string $value Field value.
1221 * @param string $label Feld label.
1222 * @param array $args Field params.
1223 *
1224 * @return string
1225 */
1226 public function generate_div( $value = false, $label = false, $args = false ) {
1227
1228 $defaults = array(
1229 'name' => '',
1230 'id' => '',
1231 'class' => '',
1232 );
1233
1234 $params = array_replace_recursive( $defaults, $args );
1235
1236 if ( is_array( $value ) ) {
1237 $value = reset( $value );
1238 }
1239
1240 if ( is_array( $params['name'] ) ) {
1241 $name = implode( '][', $params['name'] ) . ']';
1242 $params['name'] = str_replace( $params['name'][0] . ']', $params['name'][0], $name );
1243 }
1244
1245 $html = '<div id="' . $this->id_slug . '-' . $params['id'] . '-wrap" class="charitable-panel-field charitable-panel-field-div">
1246 <label for="' . $this->id_slug . '-' . $params['id'] . '">' . $label . '</label>
1247 <div id="' . $this->id_slug . '-' . $params['id'] . '" class="' . $params['class'] . '"></div>
1248 </div>';
1249
1250 return $html;
1251 }
1252
1253 /**
1254 * Output a Charitable categories checkbox area for the form settings in the left sidebar.
1255 *
1256 * @since 1.8.0
1257 *
1258 * @param string $value Field value.
1259 * @param string $label Feld label.
1260 * @param array $args Field params.
1261 *
1262 * @return string
1263 * @version 1.8.9.1
1264 */
1265 public function generate_categories( $value = false, $label = false, $args = false ) {
1266
1267 $defaults = array(
1268 'name' => '',
1269 'id' => '',
1270 'class' => '',
1271 'tooltip' => false,
1272 );
1273
1274 $params = array_replace_recursive( $defaults, $args );
1275
1276 $categories_terms = get_terms(
1277 array(
1278 'taxonomy' => 'campaign_category',
1279 'hide_empty' => 0,
1280 )
1281 );
1282
1283 $tooltip_html = ( isset( $params['tooltip'] ) && false !== $params['tooltip'] ) ? $this->get_tooltip_html( wp_strip_all_tags( $params['tooltip'] ) ) : false;
1284
1285 $html = '<div id="' . $this->id_slug . '-' . $params['id'] . '-wrap" class="charitable-panel-field charitable-panel-field-categories">
1286 <label for="' . $this->id_slug . '-' . $params['id'] . '">' . $label . ' ' . $tooltip_html . '</label>';
1287
1288 if ( empty( $categories_terms ) ) {
1289
1290 $html .= '<p><em><small>There are currently no Charitable campaign categories. <a target="_blank" href="' . admin_url( 'edit-tags.php?taxonomy=campaign_category&post_type=campaign' ) . '">Click here</a> to start adding some or <a href="https://wpcharitable.com/documentation/charitable-tags-and-categories">read our documentation for more</a>.</small></em></p>';
1291
1292 } else {
1293
1294 $html .= '<ul class="charitable-category-list">';
1295
1296 foreach ( $categories_terms as $category_term ) :
1297
1298 if ( is_array( $params['name'] ) ) {
1299 // convert array( 'settings', $settings_tab_slug, 'name' ) to settings['tab_slug']['name'].
1300 $name = implode( '][', $params['name'] ) . ']';
1301 $name = str_replace( $params['name'][0] . ']', $params['name'][0], $name );
1302 $name = substr( $name, 0, -1 ) . '-' . $category_term->term_id . ']';
1303 }
1304
1305 // Get the value of this option.
1306 $checked = in_array( $category_term->term_id, $value ) ? 'checked="checked"' : false;
1307
1308 $html .= '
1309 <li>
1310 <input type="checkbox" ' . $checked . ' value="' . $category_term->term_id . '" name="' . $name . '" id="' . $this->id_slug . '-category-' . $category_term->term_id . '" /><label for="' . $this->id_slug . '-category-' . $category_term->term_id . '">' . $category_term->name . '</label>
1311 </li>';
1312
1313 endforeach;
1314 $html .= '</ul>';
1315
1316 }
1317
1318 $html .= '</div>';
1319
1320 return $html;
1321 }
1322
1323 /**
1324 * Output a campaign creator/author for the form settings in the left sidebar.
1325 *
1326 * @since 1.8.0
1327 *
1328 * @param string $value Field value.
1329 * @param string $label Feld label.
1330 * @param array $args Field params.
1331 *
1332 * @return string
1333 * @version 1.8.9.1
1334 */
1335 public function generate_campaign_creator_info( $value = false, $label = false, $args = false ) {
1336
1337 $defaults = array(
1338 'name' => '',
1339 'id' => '',
1340 'class' => '',
1341 'creator_id' => 0,
1342 );
1343
1344 $params = array_replace_recursive( $defaults, $args );
1345
1346 $html = '<div id="' . $this->id_slug . '-' . $params['id'] . '-wrap" class="charitable-panel-field charitable-panel-field-categories">
1347 <label>' . $label . '</label>';
1348
1349 ob_start();
1350
1351 // make sure this is a number/ID.
1352 $params['creator_id'] = intval( $params['creator_id'] );
1353
1354 if ( $params['creator_id'] ) :
1355
1356 $creator = new Charitable_User( $params['creator_id'] );
1357 ?>
1358 <div id="campaign-creator" class="charitable-campaign-creator-info-container">
1359 <div class="creator-avatar charitable-campaign-creator-avatar">
1360 <?php echo $creator->get_avatar(); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
1361 </div><!--.creator-avatar-->
1362 <div class="charitable-campaign-creator-info">
1363 <?php if ( false === $creator ) : ?>
1364
1365 <?php else : ?>
1366
1367 <h3 class="creator-name"><a href="<?php echo esc_url( admin_url( 'user-edit.php?user_id=' . $creator->ID ) ); ?>"><?php printf( '%s (%s %d)', esc_html( $creator->display_name ), esc_html__( 'User ID', 'charitable' ), esc_html( $creator->ID ) ); ?></a></h3>
1368 <p class="joined-on"><?php printf( '%s <span>%s</span>', esc_html_x( 'Joined on', 'joined on date', 'charitable' ), esc_html( date_i18n( 'F Y', strtotime( $creator->user_registered ) ) ) ); ?></p>
1369 <ul>
1370 <li><a target="_blank" class="public-profile-link" href="<?php echo esc_url( get_author_posts_url( $creator->ID ) ); ?>"><?php esc_html_e( 'Public Profile', 'charitable' ); ?></a></li><li><a target="_blank" class="edit-profile-link" href="<?php echo esc_url( admin_url( 'user-edit.php?user_id=' . $creator->ID ) ); ?>"><?php esc_html_e( 'Edit Profile', 'charitable' ); ?></a></li>
1371 </ul>
1372
1373 <?php endif; ?>
1374 </div><!--.creator-facts-->
1375 </div><!--#campaign-creator-->
1376 <?php
1377 endif;
1378
1379 $html .= ob_get_clean();
1380
1381 $html .= '</div>';
1382
1383 return $html;
1384 }
1385
1386 /**
1387 * Output a donation amounts area for the form settings in the left sidebar.
1388 *
1389 * @since 1.8.0
1390 *
1391 * @param string $value Field value.
1392 * @param string $label Feld label.
1393 * @param array $args Field params.
1394 *
1395 * @return string
1396 */
1397 public function generate_donation_amounts( $value = false, $label = false, $args = false ) {
1398
1399 $defaults = array(
1400 'name' => '',
1401 'id' => '',
1402 'class' => '',
1403 'type' => '', // for this field, this might be recurring... otherwise blank by default.
1404 'visibility' => false,
1405 'donation_description_label' => esc_html__( 'donation', 'charitable' ),
1406 'from' => false, // field if it's coming from preview field/block.
1407 'button_label' => esc_html__( 'Add a Suggested Amount', 'charitable' ),
1408 'default' => false, // this is the index of the row id if there is a default value.
1409 'data_add_row' => 'suggested-amount',
1410 'data_delete_row' => 'suggested-amount',
1411 );
1412
1413 $params = array_replace_recursive( $defaults, $args );
1414
1415 $field_id_attr = isset( $params['field_id'] ) && '' !== $params['field_id'] ? 'data-field-id="' . intval( $params['field_id'] ) . '"' : false;
1416 $params['class'] = $this->maybe_add_visibility_classes( $params['class'], $params['visibility'] );
1417
1418 $html = '<div id="' . $this->id_slug . '-' . $params['id'] . '-wrap" class="charitable-panel-field charitable-panel-field-donation-amounts ' . $params['class'] . '" ' . $field_id_attr . '>';
1419
1420 $donations_table_css = ! empty( $params['type'] ) ? esc_attr( $params['type'] ) . '-' : false;
1421
1422 $html .= '<table id="' . $params['id'] . '" class="widefat charitable-campaign-suggested-' . $donations_table_css . 'donations-table charitable-campaign-suggested-donations">
1423 <thead>';
1424
1425 // Only show this in the mean settings menu, not the settings for the block.
1426 if ( 'field' !== $params['from'] ) {
1427
1428 $html .= '<tr class="table-header">
1429 <th colspan="5"><label for="campaign_suggested_donations">' . $label . '</label></th>
1430 </tr>';
1431
1432 }
1433
1434 $html .= '
1435 <tr>
1436 <th class="spacer"></th>
1437 <th class="default_amount-col">Default</th>
1438 <th class="amount-col">Amount</th>
1439 <th class="description-col">Description (optional)</th>
1440 <th class="remove-col"></th>
1441 </tr>
1442 </thead>';
1443
1444 if ( is_array( $params['name'] ) ) {
1445 // convert array( 'settings', $settings_tab_slug, 'name' ) to settings['tab_slug']['name'].
1446 $name = implode( '][', $params['name'] ) . ']';
1447 $params['name'] = str_replace( $params['name'][0] . ']', $params['name'][0], $name );
1448 }
1449
1450 // get a default value.
1451 $campaign_suggested_donations_default = isset( $params['default'] ) ? intval( $params['default'] ) : false;
1452
1453 // get the donation description label.
1454 $donation_description_label = esc_html( $params['donation_description_label'] ) . '.';
1455
1456 // check and see if this is a new campaign, and if so add some defaults.
1457 if ( false === $value && ! isset( $_GET['campaign_id'] ) ) { // phpcs:ignore
1458
1459 $value = array(
1460
1461 1 => array(
1462 'amount' => 5,
1463 'description' => esc_html__( 'This is a small ', 'charitable' ) . $donation_description_label,
1464 ),
1465 2 => array(
1466 'amount' => 10,
1467 'description' => esc_html__( 'This is a slightly larger ', 'charitable' ) . $donation_description_label,
1468 ),
1469 3 => array(
1470 'amount' => 15,
1471 'description' => esc_html__( 'This is a larger (and default) ', 'charitable' ) . $donation_description_label,
1472 ),
1473 4 => array(
1474 'amount' => 20,
1475 'description' => esc_html__( 'This is a large ', 'charitable' ) . $donation_description_label,
1476 ),
1477 );
1478
1479 $campaign_suggested_donations_default = 3;
1480
1481 }
1482
1483 $html .= '<tbody class="ui-sortable">';
1484
1485 if ( false === $value ) { // used to have || $index === 0.
1486
1487 $html .= '<tr class="no-suggested-amounts ">
1488 <td colspan="5" class="no-amounts-yet">No suggested amounts have been created yet.</td>
1489 </tr>';
1490
1491 }
1492
1493 $default_field_name = ( 'recurring' === $params['type'] ) ? 'campaign_suggested_recurring_donations_default' : 'campaign_suggested_donations_default';
1494
1495 $html .= '
1496 <tr data-index="0" class="to-copy hidden">
1497 <td class="reorder-col"><span class="charitable-icon charitable-icon-donations-grab handle"></span></td>
1498 <td class="default_amount-col"><input type="radio" class="campaign_suggested_donations" name="' . $name . '[' . $default_field_name . '][]" value="0">
1499 </td>
1500
1501 <td class="amount-col"><input autocomplete="off" type="text" class="campaign_suggested_donations" name="' . $name . '[0][amount]" value="" placeholder="Amount">
1502 </td>
1503
1504 <td class="description-col"><input type="text" class="campaign_suggested_donations" name="' . $name . '[0][description]" value="" placeholder="Optional Description">
1505 </td>
1506
1507 <td class="remove-col"><span class="dashicons-before dashicons-dismiss charitable-delete-row" data-charitable-delete-row="' . $params['data_delete_row'] . '"></span></td>
1508 </tr>';
1509
1510 if ( false === $value ) { // used to have || $index === 0.
1511
1512 // do nothing.
1513
1514 } elseif ( is_array( $value ) && ! empty( $value ) ) {
1515
1516 foreach ( $value as $key_id => $donation_info ) {
1517
1518 $amount = isset( $donation_info['amount'] ) ? charitable_format_money( $donation_info['amount'] ) : false;
1519 $description = isset( $donation_info['description'] ) ? esc_html( $donation_info['description'] ) : false;
1520 $selected = $key_id == $campaign_suggested_donations_default ? 'checked="checked"' : false;
1521
1522 $html .= '
1523 <tr data-index="' . $key_id . '" class="">
1524 <td class="reorder-col"><span class="charitable-icon charitable-icon-donations-grab handle"></span></td>
1525 <td class="default_amount-col"><input type="radio" class="campaign_suggested_donations" name="' . $name . '[' . $default_field_name . '][]" value="' . $key_id . '" ' . $selected . '>
1526 </td>
1527 <td class="amount-col"><input autocomplete="off" type="text" class="campaign_suggested_donations" name="' . $name . '[' . $key_id . '][amount]" value="' . $amount . '" placeholder="Amount">
1528 </td>
1529 <td class="description-col"><input type="text" class="campaign_suggested_donations" name="' . $name . '[' . $key_id . '][description]" value="' . $description . '" placeholder="Optional Description">
1530 </td>
1531 <td class="remove-col"><span class="dashicons-before dashicons-dismiss charitable-delete-row"></span></td>
1532 </tr>';
1533 }
1534
1535 }
1536
1537 $html .= '</tbody>
1538 <tfoot>
1539 <tr>
1540 <td colspan="5"><a class="charitable-button" href="#" data-charitable-add-row="' . $params['data_add_row'] . '">+ ' . $params['button_label'] . '</a> <a class="charitable-clear-defaults" href="javascript:void(0);">Clear Defaults</a></td>
1541 </tr>
1542 </tfoot>
1543 </table>
1544 </div>';
1545
1546 return $html;
1547 }
1548
1549 /**
1550 * Output a donation amounts area for the form settings in the left sidebar.
1551 *
1552 * @since 1.8.0
1553 *
1554 * @param array $campaign_data Campaign data.
1555 * @param string $label Feld label.
1556 * @param array $args Field params.
1557 *
1558 * @return string
1559 */
1560 public function generate_donation_amounts_mini( $campaign_data = false, $label = false, $args = false ) {
1561
1562 $defaults = array(
1563 'name' => '',
1564 'id' => '',
1565 'class' => '',
1566 'visibility' => false,
1567 'from' => false, // field if it's coming from preview field/block.
1568 'button_label' => esc_html__( 'Add a Suggested Amount', 'charitable' ),
1569 'default' => false, // this is the index of the row id if there is a default value.
1570 );
1571
1572 $params = array_replace_recursive( $defaults, $args );
1573
1574 $field_id_attr = isset( $params['field_id'] ) && '' !== $params['field_id'] ? 'data-field-id="' . intval( $params['field_id'] ) . '"' : false;
1575 $params['class'] = $this->maybe_add_visibility_classes( $params['class'], $params['visibility'] );
1576
1577 $html = '<div id="' . $this->id_slug . '-' . $params['id'] . '-wrap" class="charitable-panel-field charitable-panel-field-donation-amounts-clone ' . $params['class'] . '" ' . $field_id_attr . '><label for="' . $this->id_slug . '-' . $params['id'] . '">Suggested Donation Amounts</label>';
1578
1579 $html .= '<table id="' . $params['id'] . '" class="widefat charitable-campaign-suggested-donations-table charitable-campaign-suggested-donations-mini">
1580 <thead>';
1581
1582 // Only show this in the mean settings menu, not the settings for the block.
1583 if ( 'field' !== $params['from'] ) {
1584
1585 $html .= '<tr class="table-header">
1586 <th colspan="5"><label for="campaign_suggested_donations">' . $label . '</label></th>
1587 </tr>';
1588
1589 }
1590
1591 $html .= '
1592 <tr>
1593 <th class="spacer"></th>
1594 <th class="default_amount-col">Default</th>
1595 <th class="amount-col">Amount</th>
1596 <th class="description-col">Description (optional)</th>
1597 <th class="remove-col"></th>
1598 </tr>
1599 </thead>';
1600
1601 if ( is_array( $params['name'] ) ) {
1602 // convert array( 'settings', $settings_tab_slug, 'name' ) to settings['tab_slug']['name'].
1603 $name = implode( '][', $params['name'] ) . ']';
1604 $params['name'] = str_replace( $params['name'][0] . ']', $params['name'][0], $name );
1605 }
1606
1607 // get a default value.
1608 $campaign_suggested_donations_default = ! empty( $campaign_data['settings']['donation-options']['suggested_donations_default'] ) ? intval( $campaign_data['settings']['donation-options']['suggested_donations_default'] ) : false;
1609
1610 if ( ! empty( $campaign_data['settings']['donation-options']['donation_amounts'] ) ) {
1611 $value = $campaign_data['settings']['donation-options']['donation_amounts'];
1612 } else {
1613 $value = false;
1614 }
1615
1616 // check and see if this is a new campaign, and if so add some defaults.
1617 if ( ( false === $campaign_data || empty( $campaign_data['settings']['donation-options'] ) ) && ! isset( $_GET['campaign_id'] ) ) { // phpcs:ignore
1618
1619 $value = array(
1620
1621 1 => array(
1622 'amount' => 5,
1623 'description' => esc_html__( 'This is a small donation.', 'charitable' ),
1624 ),
1625 2 => array(
1626 'amount' => 10,
1627 'description' => esc_html__( 'This is a slightly larger donation.', 'charitable' ),
1628 ),
1629 3 => array(
1630 'amount' => 15,
1631 'description' => esc_html__( 'This is a larger (and default) donation.', 'charitable' ),
1632 ),
1633 4 => array(
1634 'amount' => 20,
1635 'description' => esc_html__( 'This is a large donation.', 'charitable' ),
1636 ),
1637 );
1638
1639 $campaign_suggested_donations_default = 3;
1640
1641 }
1642
1643 $index = is_array( $value ) ? count( $value ) : 0;
1644
1645 $html .= '<tbody class="ui-sortable">';
1646
1647 if ( false === $campaign_data || $index === 0 ) {
1648
1649 $html .= '<tr class="no-suggested-amounts ">
1650 <td colspan="5" class="no-amounts-yet">No suggested amounts have been created yet.</td>
1651 </tr>';
1652
1653 }
1654
1655 $html .= '
1656 <tr data-index="0" class="to-copy hidden">
1657 <td class="reorder-col"><span class="charitable-icon charitable-icon-donations-grab handle"></span></td>
1658 <td class="default_amount-col"><input type="radio" class="campaign_suggested_donations" name="' . $name . '[campaign_suggested_donations_default][]" value="0">
1659 </td>
1660
1661 <td class="amount-col"><input autocomplete="off" type="text" class="campaign_suggested_donations" name="' . $name . '[0][amount]" value="" placeholder="Amount">
1662 </td>
1663
1664 <td class="description-col"><input type="text" class="campaign_suggested_donations" name="' . $name . '[0][description]" value="" placeholder="Optional Description">
1665 </td>
1666
1667 <td class="remove-col"><span class="dashicons-before dashicons-dismiss charitable-delete-row"></span></td>
1668 </tr>';
1669
1670 if ( is_array( $value ) && ! empty( $value ) ) {
1671
1672 foreach ( $value as $key_id => $donation_info ) {
1673
1674 $amount = isset( $donation_info['amount'] ) ? charitable_format_money( $donation_info['amount'] ) : false;
1675 $description = isset( $donation_info['description'] ) ? esc_html( $donation_info['description'] ) : false;
1676 $selected = $key_id === $campaign_suggested_donations_default ? 'checked="checked"' : false;
1677
1678 $html .= '
1679 <tr data-index="' . $key_id . '" class="">
1680 <td class="reorder-col"><span class="charitable-icon charitable-icon-donations-grab handle"></span></td>
1681 <td class="default_amount-col"><input type="radio" class="campaign_suggested_donations" name="' . $name . '[campaign_suggested_donations_default][]" value="' . $key_id . '" ' . $selected . '>
1682 </td>
1683 <td class="amount-col"><input autocomplete="off" type="text" class="campaign_suggested_donations" name="' . $name . '[' . $key_id . '][amount]" value="' . $amount . '" placeholder="Amount">
1684 </td>
1685 <td class="description-col"><input type="text" class="campaign_suggested_donations" name="' . $name . '[' . $key_id . '][description]" value="' . $description . '" placeholder="Optional Description">
1686 </td>
1687 <td class="remove-col"><span class="dashicons-before dashicons-dismiss charitable-delete-row"></span></td>
1688 </tr>';
1689 }
1690
1691 }
1692
1693 $html .= '</tbody>
1694 <tfoot>
1695 <tr>
1696 <td colspan="5"><a class="charitable-button" href="#" data-charitable-add-row="suggested-amount">+ ' . $params['button_label'] . '</a></td>
1697 </tr>
1698 </tfoot>
1699 </table>
1700 </div>';
1701
1702 return $html;
1703 }
1704
1705 /**
1706 * Output a generic dividing bar for the form settings in the left sidebar.
1707 *
1708 * @since 1.8.0
1709 *
1710 * @param string $value Field value.
1711 * @param string $label Feld label.
1712 * @param array $args Field params.
1713 *
1714 * @return string
1715 */
1716 public function generate_divider( $value = false, $label = false, $args = array() ) {
1717
1718 $defaults = array(
1719 'name' => '',
1720 'id' => '',
1721 'class' => '',
1722 'creator_id' => '',
1723 );
1724
1725 $params = array_replace_recursive( $defaults, $args );
1726
1727 $field_id_attr = '' !== $params['field_id'] ? 'data-field-id="' . intval( $params['field_id'] ) . '"' : false;
1728
1729 $html = '<hr class="charitable-panel-field charitable-panel-field-divider" ' . $field_id_attr . ' />';
1730
1731 return $html;
1732 }
1733
1734 /**
1735 * Output a headline.
1736 *
1737 * @since 1.8.0
1738 *
1739 * @param string $value Field value.
1740 * @param string $label Feld label.
1741 * @param array $args Field params.
1742 *
1743 * @return string
1744 */
1745 public function generate_headline( $text = '', $args = array() ) {
1746
1747 $defaults = array(
1748 'name' => '',
1749 'id' => '',
1750 'class' => '',
1751 'field_id' => '',
1752 );
1753
1754 $params = array_replace_recursive( $defaults, $args );
1755
1756 $field_id_attr = '' !== trim( $params['field_id'] ) ? 'data-field-id="' . intval( $params['field_id'] ) . '"' : false;
1757
1758 $html = '<h4 class="charitable-panel-field charitable-panel-field-headline ' . $params['class'] . '" ' . $field_id_attr . '>' . esc_html( $text ) . '</h4>';
1759
1760 return $html;
1761 }
1762
1763 /**
1764 * Add visibility classes to the CSS classes array if the field is conditionally visible.
1765 *
1766 * @since 1.8.0
1767 *
1768 * @param array $css_classes The CSS classes array.
1769 * @param array $params_visibility The visibility parameters.
1770 *
1771 * @return array The updated CSS classes array.
1772 */
1773 public function maybe_add_visibility_classes( $css_classes, $params_visibility ) {
1774
1775 if ( ! empty( $params_visibility ) ) {
1776 // if there's items in the area, assume it's hidden at start.
1777 $visible = false;
1778
1779 // is there any conditions where the field could be visible upon load?
1780 if ( ! empty( $params_visibility['show'] ) ) {
1781 $visible_count = 0;
1782
1783 // all conditions in this array need to be true for visible to be true.
1784 foreach ( $params_visibility['show'] as $element_value => $required_value ) {
1785 if ( $element_value === $required_value ) {
1786
1787 ++$visible_count;
1788 }
1789 }
1790
1791 if ( $visible_count === count( $params_visibility['show'] ) ) {
1792 $visible = true;
1793 }
1794
1795 }
1796
1797 $css_classes .= ( false === $visible ) ? 'charitable-hidden' : '';
1798
1799 }
1800
1801 return $css_classes;
1802 }
1803 }
1804
1805 new Charitable_Builder_Form_Fields();
1806