PluginProbe
Charitable – Donation & Fundraising Platform (Donation Forms, Recurring Donations & Fundraising Campaigns) / 1.8.13
Charitable – Donation & Fundraising Platform (Donation Forms, Recurring Donations & Fundraising Campaigns) v1.8.13
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 1.7.0.9 All 211 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.13, at includes/admin/campaign-builder/class-builder-form-fields.php

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