PluginProbe
AutomatorWP – No-Code Workflow Automation, Integration & Webhooks Plugin, now with AI / 6.0.0
AutomatorWP – No-Code Workflow Automation, Integration & Webhooks Plugin, now with AI v6.0.0
6.0.3 6.0.2 6.0.1 6.0.0 5.8.6 5.8.5 5.8.4 5.8.3 5.8.2 5.8.1 5.8.0 5.7.9.2 5.7.9.1 5.7.8 5.7.9 5.7.6 5.7.7 5.7.5 5.7.4 5.7.3 5.7.2 5.7.1 trunk 5.6.0 5.6.1 All 34 releases
automatorwp / includes / automation-ui.php

automation-ui.php in AutomatorWP – No-Code Workflow Automation, Integration & Webhooks Plugin, now with AI 6.0.0, at includes/automation-ui.php

1,426 lines 55.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Automation UI
4 *
5 * @package AutomatorWP\Automation_UI
6 * @author AutomatorWP <[email protected]>, Ruben Garcia <[email protected]>
7 * @since 1.0.0
8 */
9 // Exit if accessed directly
10 if( !defined( 'ABSPATH' ) ) exit;
11
12 /**
13 * Render automation type dialog
14 *
15 * @since 1.3.0
16 */
17 function automatorwp_render_automation_type_dialog() {
18
19 if( ! isset( $_GET['page'] ) ) {
20 return;
21 }
22
23 $allowed_pages = array(
24 'automatorwp_automations',
25 'edit_automatorwp_automations',
26 );
27
28 // Only render on allowed pages
29 if( ! in_array( $_GET['page'], $allowed_pages ) ) {
30 return;
31 }
32
33 $types = automatorwp_get_automation_types(); ?>
34
35 <div class="automatorwp-automation-type-dialog-wrapper" style="display: none;">
36
37 <div class="automatorwp-automation-type-dialog">
38 <h2 class="automatorwp-automation-type-dialog-title"><?php esc_html_e( 'Automation type', 'automatorwp' ); ?></h2>
39 <div class="automatorwp-automation-types">
40 <?php foreach( $types as $type => $args ) :
41 if( in_array( $type, automatorwp_get_automation_loop_types() ) ) continue; ?>
42 <div class="automatorwp-automation-type automatorwp-automation-type-<?php echo $type; ?>" data-type="<?php echo $type; ?>">
43 <img src="<?php echo $args['image']; ?>" alt="<?php echo $args['label']; ?>">
44 <div class="automatorwp-automation-type-description">
45 <strong><?php echo $args['label']; ?></strong>
46 <span><?php echo $args['desc']; ?></span>
47 </div>
48 </div>
49 <?php endforeach; ?>
50 </div>
51 <h3 class="automatorwp-automation-type-dialog-automation-loop-title">
52 <?php esc_html_e( 'Loop Automations', 'automatorwp' ); ?>
53 <span class="cmb-tooltip">
54 <i class="dashicons dashicons-cmb-tooltip"></i>
55 <span class="cmb-tooltip-desc cmb-tooltip-top"><?php _e( 'Designed to run actions on a <b>group of elements</b>. Can be run <b>manually</b>, on a <b>specific date</b> or on a <b>recurring</b> basis.', 'automatorwp' ); ?></span>
56 </span>
57 </h3>
58 <div class="automatorwp-automation-types automatorwp-automation-loop-types">
59 <?php foreach( $types as $type => $args ) :
60 if( ! in_array( $type, automatorwp_get_automation_loop_types() ) ) continue; ?>
61 <div class="automatorwp-automation-type automatorwp-automation-type-<?php echo $type; ?>" data-type="<?php echo $type; ?>">
62 <img src="<?php echo $args['image']; ?>" alt="<?php echo $args['label']; ?>">
63 <div class="automatorwp-automation-type-description">
64 <strong><?php echo $args['label']; ?></strong>
65 <span><?php echo $args['desc']; ?></span>
66 </div>
67 </div>
68 <?php endforeach; ?>
69 </div>
70 <div class="automatorwp-notice-warning">
71 <?php echo __( '<strong>Note:</strong> Automation type cannot be changed later. ', 'automatorwp' ); ?>
72 </div>
73 <div class="automatorwp-dialog-bottom automatorwp-automation-type-dialog-bottom">
74 <div class="automatorwp-dialog-buttons automatorwp-automation-type-dialog-buttons">
75 <button type="button" class="button button-primary automatorwp-automation-type-dialog-confirm"><?php _e( 'Confirm', 'automatorwp' ); ?></button>
76 <button type="button" data-dialog="automatorwp-automation-type-dialog" class="button automatorwp-button-danger automatorwp-dialog-cancel automatorwp-automation-type-dialog-cancel"><?php _e( 'Cancel', 'automatorwp' ); ?></button>
77 </div>
78 </div>
79 </div>
80
81 </div>
82
83 <?php
84
85 }
86 add_action( 'admin_footer', 'automatorwp_render_automation_type_dialog' );
87
88 /**
89 * Render automation url export dialog
90 *
91 * @since 1.4.8
92 */
93 function automatorwp_render_automation_url_export_dialog() {
94
95 if( ! isset( $_GET['page'] ) ) {
96 return;
97 }
98
99 $allowed_pages = array(
100 'automatorwp_automations',
101 'edit_automatorwp_automations',
102 );
103
104 // Only render on allowed pages
105 if( ! in_array( $_GET['page'], $allowed_pages ) ) {
106 return;
107 } ?>
108
109 <div class="automatorwp-automation-url-export-dialog-wrapper" style="display: none;">
110
111 <div class="automatorwp-automation-url-export-dialog">
112 <h2><?php _e( 'Export automation', 'automatorwp' ); ?></h2>
113 <div class="automatorwp-automation-url-export-dialog-input">
114 <label><?php _e( 'Enter you website URL:', 'automatorwp' ); ?></label>
115 <input type="text" placeholder="https://website.com">
116 <div class="automatorwp-notice-error" style="display: none;"><?php _e( 'Please, enter a valid URL.', 'automatorwp' ); ?></div>
117 </div>
118 <div class="automatorwp-automation-url-export-dialog-url">
119 <label><?php _e( 'Exportable URL:', 'automatorwp' ); ?></label>
120 <input type="text">
121 <div class="automatorwp-automation-url-export-dialog-url-copy">
122 <div class="automatorwp-automation-url-export-dialog-url-copy-icon"><span class="dashicons dashicons-admin-page"></span></div>
123 <div class="automatorwp-automation-url-export-dialog-url-copy-text">
124 <span class="automatorwp-automation-url-export-dialog-url-copy-text-copy"><?php _e( 'Copy URL', 'automatorwp' ); ?></span>
125 <span class="automatorwp-automation-url-export-dialog-url-copy-text-copied" style="display: none;"><?php _e( 'Copied!', 'automatorwp' ); ?></span>
126 </div>
127 </div>
128 <span class="automatorwp-automation-url-export-dialog-desc"><?php _e( 'Copy this URL and place it on your browser to automatically import this automation on your website.', 'automatorwp' ); ?></span>
129 </div>
130 <div class="automatorwp-dialog-bottom automatorwp-automation-url-export-dialog-bottom">
131 <div class="automatorwp-dialog-buttons automatorwp-automation-url-export-dialog-buttons">
132 <button type="button" class="button button-primary automatorwp-automation-url-export-dialog-confirm">
133 <span class="automatorwp-automation-url-export-dialog-confirm-default-text"><?php _e( 'Generate URL to export', 'automatorwp' ); ?></span>
134 <span class="automatorwp-automation-url-export-dialog-confirm-generating-text" style="display: none;"><?php _e( 'Generating URL', 'automatorwp' ); ?>...</span>
135 <span class="automatorwp-automation-url-export-dialog-confirm-success-text" style="display: none;"><?php _e( 'Done', 'automatorwp' ); ?></span>
136 </button>
137 <button type="button" data-dialog="automatorwp-automation-url-export-dialog" class="button automatorwp-button-danger automatorwp-dialog-cancel automatorwp-automation-url-export-dialog-cancel"><?php _e( 'Cancel', 'automatorwp' ); ?></button>
138 </div>
139 </div>
140 </div>
141
142 </div>
143
144 <?php
145
146 }
147 add_action( 'admin_footer', 'automatorwp_render_automation_url_export_dialog' );
148
149 /**
150 * Render automation type dialog
151 *
152 * @since 1.3.0
153 *
154 * @param string $classes
155 *
156 * @return string
157 */
158 function automatorwp_automation_ui_admin_body_class( $classes ) {
159
160 global $ct_table;
161
162 if( ! isset( $_GET['page'] ) ) {
163 return $classes;
164 }
165
166 // Only add class on allowed pages
167 if( $_GET['page'] !== 'edit_automatorwp_automations' ) {
168 return $classes;
169 }
170
171 if( $ct_table->name !== 'automatorwp_automations' ) {
172 return $classes;
173 }
174
175 $primary_key = $ct_table->db->primary_key;
176
177 if( ! isset( $_GET[$primary_key] ) ) {
178 return $classes;
179 }
180
181 $automation_id = (int) $_GET[$primary_key];
182 $automation = $ct_table->db->get( $automation_id );
183
184 $classes .= ' edit-' . $automation->type . '-automation ';
185
186 $classes = apply_filters( 'automatorwp_automation_ui_admin_body_class', $classes, $automation );
187
188 return $classes;
189
190 }
191 add_filter( 'admin_body_class', 'automatorwp_automation_ui_admin_body_class' );
192
193 /**
194 * Automation UI meta boxes
195 *
196 * @since 1.0.0
197 */
198 function automatorwp_automation_ui_add_meta_boxes() {
199
200 add_meta_box( 'automatorwp_triggers', __( 'Triggers', 'automatorwp' ), 'automatorwp_automation_ui_triggers_meta_box', 'automatorwp_automations', 'normal', 'default' );
201 add_meta_box( 'automatorwp_actions', __( 'Actions', 'automatorwp' ), 'automatorwp_automation_ui_actions_meta_box', 'automatorwp_automations', 'normal', 'default' );
202
203 }
204 add_action( 'add_meta_boxes', 'automatorwp_automation_ui_add_meta_boxes' );
205
206 /**
207 * Renders the triggers meta box
208 *
209 * @since 1.0.0
210 *
211 * @param stdClass $automation The automation object
212 * @param string $type Type to render form
213 */
214 function automatorwp_automation_ui_triggers_meta_box( $automation, $type ) {
215
216 global $automatorwp_triggers_current_position;
217
218 $automatorwp_triggers_current_position = 0;
219
220 $triggers = automatorwp_get_automation_triggers( $automation->id );
221
222 ?>
223 <?php // Section title and subtitle ?>
224 <div class="automatorwp-title"><?php _e( 'Triggers', 'automatorwp' ); ?></div>
225 <div class="automatorwp-subtitle"><?php _e( 'When this happens...', 'automatorwp' ); ?></div>
226
227 <?php // Sequential ?>
228 <div class="automatorwp-sequential-field cmb2-switch">
229 <label for="sequential"><?php _e( 'Sequential', 'automatorwp' ); ?> <?php echo cmb_tooltip_get_html( __( 'Check this option to force users to complete triggers in order.', 'automatorwp' ) ) ?></label>
230 <div class="cmb-td">
231 <input type="checkbox" id="sequential" name="sequential" class="automatorwp-auto-save" value="1" <?php checked( $automation->sequential, 1 ); ?> />
232 <label for="sequential"><span class="cmb2-metabox-description"></span></label>
233 </div>
234 </div>
235
236 <?php // Triggers ?>
237 <div class="automatorwp-automation-items automatorwp-triggers">
238
239 <?php $triggers = automatorwp_check_automation_required_triggers( $automation, $triggers ); ?>
240
241 <?php foreach( $triggers as $trigger ) : ?>
242
243 <?php automatorwp_automation_item_edit_html( $trigger, 'trigger', $automation ); ?>
244
245 <?php endforeach; ?>
246
247 </div>
248
249 <?php automatorwp_automation_ui_add_item_form( $automation, 'trigger' ); ?>
250
251 <?php // Anonymous automation notice ?>
252 <div class="automatorwp-automation-ui-anonymous-notice"><span class="dashicons dashicons-info"></span> <?php _e( 'Anonymous automations only support one trigger per automation.', 'automatorwp' ); ?></div>
253 <?php // Add Trigger ?>
254 <button type="button" class="button automatorwp-button-success automatorwp-add-trigger"><span class="dashicons dashicons-plus"></span><?php _e( 'Add Trigger', 'automatorwp' ); ?></button>
255 <?php // Add Filter ?>
256 <button type="button" class="button button-primary automatorwp-add-filter"><span class="dashicons dashicons-filter"></span><?php _e( 'Add Filter', 'automatorwp' ); ?></button>
257 <?php // Box spinner ?>
258 <div class="automatorwp-spinner automatorwp-box-spinner" style="display: none;">
259 <span class="spinner is-active"></span>
260 <span class="spinner-label"><?php _e( 'Saving...', 'automatorwp' ); ?></span>
261 </div>
262 <?php
263 }
264
265 /**
266 * Renders the actions meta box
267 *
268 * @since 1.0.0
269 *
270 * @param stdClass $automation The automation object
271 * @param string $type Type to render form
272 */
273 function automatorwp_automation_ui_actions_meta_box( $automation, $type ) {
274
275 $actions = automatorwp_get_automation_actions( $automation->id );
276
277 ?>
278 <?php // Section title and subtitle ?>
279 <div class="automatorwp-title"><?php _e( 'Actions', 'automatorwp' ); ?></div>
280 <div class="automatorwp-subtitle"><?php _e( 'Do this...', 'automatorwp' ); ?></div>
281
282 <?php // Actions ?>
283 <div class="automatorwp-automation-items automatorwp-actions">
284
285 <?php $actions = automatorwp_check_automation_required_actions( $automation, $actions ); ?>
286
287 <?php foreach( $actions as $action ) : ?>
288
289 <?php automatorwp_automation_item_edit_html( $action, 'action', $automation ); ?>
290
291 <?php endforeach; ?>
292
293 </div>
294
295 <?php automatorwp_automation_ui_add_item_form( $automation, 'action' ); ?>
296
297 <?php // Add Action ?>
298 <button type="button" class="button automatorwp-button-success automatorwp-add-action"><span class="dashicons dashicons-plus"></span><?php _e( 'Add Action', 'automatorwp' ); ?></button>
299 <?php // Add Filter ?>
300 <button type="button" class="button button-primary automatorwp-add-filter"><span class="dashicons dashicons-filter"></span><?php _e( 'Add Filter', 'automatorwp' ); ?></button>
301 <?php // Box spinner ?>
302 <div class="automatorwp-spinner automatorwp-box-spinner" style="display: none;">
303 <span class="spinner is-active"></span>
304 <span class="spinner-label"><?php _e( 'Saving...', 'automatorwp' ); ?></span>
305 </div>
306 <?php
307 }
308
309 /**
310 * Automation UI add item form
311 *
312 * @since 1.0.0
313 *
314 * @param stdClass $automation The automation object
315 * @param string $item_type The item type (trigger|action)
316 */
317 function automatorwp_automation_ui_add_item_form( $automation, $item_type ) {
318
319 $choices_filters = array(
320 'show_in_selector' => true,
321 );
322
323 if( $item_type === 'trigger' ) {
324 $choices_filters['anonymous'] = (bool) ( $automation->type === 'anonymous' );
325 }
326
327 // Sort integrations
328 $integrations = AutomatorWP()->integrations;
329 ksort( $integrations );
330
331 ?>
332
333 <div class="automatorwp-add-item-form" style="display: none;">
334
335 <div class="automatorwp-automation-item-details">
336 <div class="automatorwp-integration-icon"></div>
337 </div>
338
339 <div class="automatorwp-automation-item-content">
340
341 <?php
342 /**
343 * Available action at top of the add item content
344 *
345 * @since 1.57
346 *
347 * @param stdClass $automation The automation object
348 * @param string $item_type The item type
349 */
350 do_action( 'automatorwp_automation_ui_add_item_content_top', $automation, $item_type ); ?>
351
352 <div class="automatorwp-automation-item-actions">
353 <div class="automatorwp-automation-item-action automatorwp-automation-item-action-close" title="<?php echo esc_attr( __( 'Close', 'automatorwp') ); ?>"><span class="dashicons dashicons-no-alt"></span></div>
354 </div>
355
356 <div class="automatorwp-select-integration automatorwp-form">
357
358 <div class="automatorwp-select-integration-label"><?php _e( 'Select an integration', 'automatorwp' ); ?></div>
359
360 <select class="automatorwp-all-integrations-choices">
361 <option value=""><?php echo esc_html( $item_type === 'trigger' ? __( 'Search for triggers', 'automatorwp' ) : __( 'Search for actions', 'automatorwp' ) ); ?></option>
362 <?php foreach( $integrations as $integration => $args ) : ?>
363
364 <?php // Skip filters
365 if( $integration === 'filter' ) continue; ?>
366
367 <?php switch ( $item_type ) {
368 case 'trigger':
369 $choices = automatorwp_get_integration_triggers( $integration, $choices_filters );
370 break;
371 case 'action':
372 $choices = automatorwp_get_integration_actions( $integration, $choices_filters );
373 break;
374 default:
375 $choices = array();
376 break;
377 }
378
379 // Skip integrations without triggers or actions
380 if( ! empty( $choices ) ) : ?>
381 <optgroup label="<?php echo esc_attr( $args['label'] ); ?>" data-icon="<?php echo esc_attr( $args['icon'] ); ?>">
382
383 <?php foreach( $choices as $trigger => $args ) :
384
385 if( empty( $args['select_option'] ) && empty( $args['label'] ) ) {
386 continue;
387 } ?>
388 <option value="<?php echo esc_attr( $trigger ); ?>" data-text="<?php echo esc_attr( $args['select_option'] ); ?>"><?php echo $args['label']; ?></option>
389 <?php endforeach; ?>
390
391 </optgroup>
392
393 <?php endif; ?>
394
395 <?php endforeach; ?>
396 </select>
397
398 <div class="automatorwp-integrations">
399
400 <?php foreach( $integrations as $integration => $args ) : ?>
401
402 <?php // Skip filters
403 if( $integration === 'filter' ) continue; ?>
404
405 <?php switch ( $item_type ) {
406 case 'trigger':
407 $choices = automatorwp_get_integration_triggers( $integration, $choices_filters );
408 break;
409 case 'action':
410 $choices = automatorwp_get_integration_actions( $integration, $choices_filters );
411 break;
412 default:
413 $choices = array();
414 break;
415 }
416
417 // Skip integrations without triggers or actions
418 if( ! empty( $choices ) ) : ?>
419
420 <div class="automatorwp-integration"
421 data-integration="<?php echo esc_attr( $integration ); ?>"
422 data-label="<?php echo esc_attr( $args['label'] ); ?>"
423 data-icon="<?php echo esc_attr( $args['icon'] ); ?>">
424 <div class="automatorwp-integration-icon">
425 <img src="<?php echo esc_attr( $args['icon'] ); ?>" alt="<?php echo esc_attr( $args['label'] ); ?>">
426 </div>
427 <div class="automatorwp-integration-label"><?php echo $args['label']; ?></div>
428 </div>
429
430 <?php endif; ?>
431
432 <?php
433 /**
434 * Available action to extend integration markup
435 *
436 * @since 1.0.0
437 *
438 * @param string $integration The integration name
439 * @param array $integration_args Integration arguments
440 * @param stdClass $automation The automation object
441 * @param string $item_type The item type
442 */
443 do_action( 'automatorwp_automation_ui_after_integration_choice', $integration, $args, $automation, $item_type ); ?>
444
445 <?php endforeach; ?>
446
447 </div>
448
449 </div>
450
451 <div class="automatorwp-integration-choices-container" style="display: none;">
452
453 <?php if ( $item_type === 'trigger' ) : ?>
454
455 <div class="automatorwp-select-trigger-label"><?php _e( 'Select a trigger', 'automatorwp' ); ?></div>
456
457 <?php foreach( $integrations as $integration => $args ) : ?>
458
459 <?php // Skip filters
460 if( $integration === 'filter' ) continue; ?>
461
462 <select class="automatorwp-integration-choices"
463 data-integration="<?php echo esc_attr( $integration ); ?>"
464 data-placeholder="<?php echo esc_attr( __( 'Search for triggers', 'automatorwp' ) ); ?>"
465 style="display: none;">
466
467 <option value=""></option>
468 <?php foreach( automatorwp_get_integration_triggers( $integration, $choices_filters ) as $trigger => $args ) :
469
470 if( empty( $args['select_option'] ) && empty( $args['label'] ) ) {
471 continue;
472 } ?>
473 <option value="<?php echo esc_attr( $trigger ); ?>" data-text="<?php echo esc_attr( $args['select_option'] ); ?>"><?php echo $args['label']; ?></option>
474 <?php endforeach; ?>
475
476 <?php
477 /**
478 * Available action to extend integration triggers choices
479 *
480 * @since 1.2.4
481 *
482 * @param string $integration The integration name
483 * @param array $integration_args Integration arguments
484 * @param stdClass $automation The automation object
485 * @param string $item_type The item type
486 */
487 do_action( 'automatorwp_automation_ui_after_integration_triggers_choices', $integration, $args, $automation, $item_type ); ?>
488
489 </select>
490
491 <?php endforeach; ?>
492
493 <?php elseif ( $item_type === 'action' ) : ?>
494
495 <div class="automatorwp-select-action-label"><?php _e( 'Select an action', 'automatorwp' ); ?></div>
496
497 <?php foreach( $integrations as $integration => $args ) : ?>
498
499 <select class="automatorwp-integration-choices"
500 data-integration="<?php echo esc_attr( $integration ); ?>"
501 data-placeholder="<?php echo esc_attr( __( 'Search for actions', 'automatorwp' ) ); ?>"
502 style="display: none;">
503
504 <option value=""></option>
505 <?php foreach( automatorwp_get_integration_actions( $integration, $choices_filters ) as $action => $args ) :
506
507 if( empty( $args['select_option'] ) && empty( $args['label'] ) ) {
508 continue;
509 } ?>
510 <option value="<?php echo esc_attr( $action ); ?>" data-text="<?php echo esc_attr( $args['select_option'] ); ?>"><?php echo $args['label']; ?></option>
511 <?php endforeach; ?>
512
513 <?php
514 /**
515 * Available action to extend integration actions choices
516 *
517 * @since 1.2.4
518 *
519 * @param string $integration The integration name
520 * @param array $integration_args Integration arguments
521 * @param stdClass $automation The automation object
522 * @param string $item_type The item type
523 */
524 do_action( 'automatorwp_automation_ui_after_integration_actions_choices', $integration, $args, $automation, $item_type ); ?>
525
526 </select>
527
528 <?php endforeach; ?>
529
530 <?php endif; ?>
531
532 <button type="button" class="button button-compact automatorwp-button-danger automatorwp-cancel-choice-select"><?php _e( 'Cancel', 'automatorwp' ); ?></button>
533
534 </div>
535
536 <?php
537 /**
538 * Available action at bottom of the add item content
539 *
540 * @since 1.57
541 *
542 * @param stdClass $automation The automation object
543 * @param string $item_type The item type (trigger|action)
544 */
545 do_action( 'automatorwp_automation_ui_add_item_content_bottom', $automation, $item_type ); ?>
546
547 </div>
548
549 </div>
550
551 <?php
552
553 }
554
555 /**
556 * Get the object type args
557 *
558 * @since 1.0.0
559 *
560 * @param stdClass $object The trigger/action object
561 * @param string $item_type The item type (trigger|action)
562 *
563 * @return array
564 */
565 function automatorwp_automation_item_type_args( $object, $item_type ) {
566
567 $type_args = array();
568
569 if( $item_type === 'trigger' ) {
570 $type_args = automatorwp_get_trigger( $object->type );
571 } else if( $item_type === 'action' ) {
572 $type_args = automatorwp_get_action( $object->type );
573 }
574
575 /**
576 * Get the object type args
577 *
578 * @since 1.0.0
579 *
580 * @param array $type_args The trigger/action args
581 * @param stdClass $object The trigger/action object
582 * @param string $item_type The item type (trigger|action)
583 *
584 * @return array
585 */
586 return apply_filters( 'automatorwp_automation_item_type_args', $type_args, $object, $item_type );
587
588 }
589
590 /**
591 * Renders the trigger/action edit HTML
592 *
593 * @since 1.0.0
594 *
595 * @param stdClass $object The trigger/action object
596 * @param string $item_type The item type (trigger|action)
597 * @param stdClass $automation The automation object
598 */
599 function automatorwp_automation_item_edit_html( $object, $item_type, $automation ) {
600
601 global $automatorwp_triggers_current_position;
602
603 // Check item type
604 if( ! in_array( $item_type, array( 'trigger', 'action' ) ) ) {
605 return;
606 }
607
608 // Check type args
609 $type_args = automatorwp_automation_item_type_args( $object, $item_type );
610
611 if( ! $type_args ) {
612 automatorwp_automation_missing_integration_item_edit_html( $object, $item_type, $automation );
613 return;
614 }
615
616 // Check integration
617 $integration = automatorwp_get_integration( $type_args['integration'] );
618
619 if( ! $integration ) {
620 automatorwp_automation_missing_integration_item_edit_html( $object, $item_type, $automation );
621 return;
622 }
623
624 if( $item_type === 'action' && $object->type === 'automatorwp_anonymous_user' ) {
625 $integration['icon'] = AUTOMATORWP_URL . 'assets/img/automatorwp-anonymous.svg';
626 }
627
628 // Setup the item classes
629 $classes = array(
630 'automatorwp-automation-item',
631 'automatorwp-' . $item_type,
632 'automatorwp-' . $item_type . '-' . str_replace( '_', '-', $object->type ),
633 );
634
635 if( $object->type === 'filter' ) {
636 $classes[] = 'automatorwp-automation-item-filter';
637 }
638
639 // Setup the item actions
640 $actions = array(
641 'move-up' => array(
642 'label' => __( 'Move up', 'automatorwp'),
643 'icon' => 'arrow-up-alt2'
644 ),
645 'move-down' => array(
646 'label' => __( 'Move down', 'automatorwp'),
647 'icon' => 'arrow-down-alt2'
648 ),
649 'delete' => array(
650 'label' => __( 'Delete', 'automatorwp'),
651 'icon' => 'trash'
652 ),
653 );
654
655 // Anonymous
656 if( $automation->type === 'anonymous' ) {
657 if( $item_type === 'trigger' ) {
658 $classes[] = 'automatorwp-no-grab';
659 unset( $actions['move-up'] );
660 unset( $actions['move-down'] );
661 } else if( $object->type === 'automatorwp_anonymous_user' ) {
662 $classes[] = 'automatorwp-no-grab';
663 unset( $actions['move-up'] );
664 unset( $actions['move-down'] );
665 unset( $actions['delete'] );
666 }
667 }
668
669 /**
670 * Filter to modify the integration args of the trigger/action edit HTML
671 *
672 * @since 1.0.0
673 *
674 * @param array $integration The integration args
675 * @param stdClass $object The trigger/action object
676 * @param string $item_type The item type (trigger|action)
677 * @param stdClass $automation The automation object
678 *
679 * @return array
680 */
681 $integration = apply_filters( 'automatorwp_automation_item_edit_html_integration', $integration, $object, $item_type, $automation );
682
683 /**
684 * Filter to modify the CSS classes of the trigger/action edit HTML
685 *
686 * @since 1.3.0
687 *
688 * @param array $classes The trigger/action CSS classes
689 * @param stdClass $object The trigger/action object
690 * @param string $item_type The item type (trigger|action)
691 * @param stdClass $automation The automation object
692 *
693 * @return array
694 */
695 $classes = apply_filters( 'automatorwp_automations_ui_item_edit_html_classes', $classes, $object, $item_type, $automation );
696
697 /**
698 * Filter to modify the actions of the trigger/action edit HTML
699 *
700 * @since 1.3.0
701 *
702 * @param array $actions The trigger/action actions
703 * @param stdClass $object The trigger/action object
704 * @param string $item_type The item type (trigger|action)
705 * @param stdClass $automation The automation object
706 *
707 * @return array
708 */
709 $actions = apply_filters( 'automatorwp_automations_ui_item_edit_html_actions', $actions, $object, $item_type, $automation );
710
711 ?>
712 <div id="automatorwp-item-<?php echo esc_attr( $object->id ); ?>" class="<?php echo implode( ' ', $classes ); ?>">
713
714 <div class="automatorwp-automation-item-details">
715 <div class="automatorwp-integration-icon">
716 <img src="<?php echo esc_attr( $integration['icon'] ); ?>" title="<?php echo esc_attr( $integration['label'] ); ?>" alt="<?php echo esc_attr( $integration['label'] ); ?>">
717 </div>
718 </div>
719
720 <div class="automatorwp-automation-item-content">
721
722 <?php if( ! empty( $actions ) ) : ?>
723 <div class="automatorwp-automation-item-actions">
724 <?php foreach( $actions as $action => $action_args ) : ?>
725 <div class="automatorwp-automation-item-action automatorwp-automation-item-action-<?php echo $action; ?> cmb-tooltip">
726 <span class="dashicons dashicons-<?php echo $action_args['icon']; ?>"></span>
727 <span class="cmb-tooltip-desc cmb-tooltip-top"><?php echo esc_html( $action_args['label'] ); ?></span>
728 </div>
729 <?php endforeach; ?>
730
731 </div>
732 <?php endif; ?>
733
734 <div class="automatorwp-integration-label"><?php echo $integration['label']; ?></div>
735
736 <?php
737
738 $position = ( is_int( $automatorwp_triggers_current_position ) ? $automatorwp_triggers_current_position + 1 : $object->position + 1 );
739
740 if( $object->type !== 'filter' && is_int( $automatorwp_triggers_current_position ) ) {
741 $automatorwp_triggers_current_position++;
742 }
743
744 ?>
745
746 <div class="automatorwp-automation-item-position" style="<?php echo ( $automation->sequential ? '' : 'display: none;' ); ?>"><?php echo $position; ?>.</div>
747 <div class="automatorwp-automation-item-label"><?php echo automatorwp_parse_automation_item_edit_label( $object, $item_type ); ?></div>
748
749 <?php
750 /**
751 * After item label
752 *
753 * @since 1.0.0
754 *
755 * @param stdClass $object The trigger/action object
756 * @param string $item_type The object type (trigger|action)
757 */
758 do_action( 'automatorwp_automation_ui_after_item_label', $object, $item_type ); ?>
759
760 <?php // Render the options form ?>
761 <?php foreach( $type_args['options'] as $option => $args ) : ?>
762
763 <div class="automatorwp-option-form-container" data-option="<?php echo esc_attr( $option ); ?>" data-from="<?php echo esc_attr( ( isset( $args['from'] ) ? $args['from'] : '' ) ); ?>" style="display: none;">
764
765 <?php
766 /**
767 * After option from
768 *
769 * @since 1.0.0
770 *
771 * @param stdClass $object The trigger/action object
772 * @param string $item_type The object type (trigger|action)
773 * @param string $option The option key
774 * @param array $args The option arguments
775 */
776 do_action( 'automatorwp_automation_ui_after_option_form', $object, $item_type, $option, $args ); ?>
777
778 <?php
779 // Get the option form
780 $cmb2 = automatorwp_get_automation_item_option_form( $object, $item_type, $option, $automation );
781
782 if( $cmb2 ) {
783
784 ct_setup_table( "automatorwp_{$item_type}s" );
785
786 // Render the form
787 CMB2_Hookup::enqueue_cmb_css();
788 CMB2_Hookup::enqueue_cmb_js();
789 $cmb2->show_form();
790
791 ct_reset_setup_table();
792 }
793 ?>
794
795 <?php
796 /**
797 * Before option from
798 *
799 * @since 1.0.0
800 *
801 * @param stdClass $object The trigger/action object
802 * @param string $item_type The object type (trigger|action)
803 * @param string $option The option key
804 * @param array $args The option arguments
805 */
806 do_action( 'automatorwp_automation_ui_before_option_form', $object, $item_type, $option, $args ); ?>
807
808 <button type="button" class="button button-compact button-primary automatorwp-save-option-form"><?php _e( 'Save', 'automatorwp' ); ?></button>
809 <button type="button" class="button button-compact automatorwp-button-danger automatorwp-cancel-option-form"><?php _e( 'Cancel', 'automatorwp' ); ?></button>
810
811 <div class="automatorwp-spinner" style="display: none;">
812 <span class="spinner is-active"></span>
813 <span class="spinner-label"><?php _e( 'Saving...', 'automatorwp' ); ?></span>
814 </div>
815
816 </div>
817
818 <?php endforeach; ?>
819
820 </div>
821
822 <?php // Hidden fields ?>
823 <input type="hidden" class="id" value="<?php echo esc_attr( $object->id ); ?>"/>
824 <input type="hidden" class="type" value="<?php echo esc_attr( $object->type ); ?>"/>
825 <input type="hidden" class="status" value="<?php echo esc_attr( $object->status ); ?>"/>
826 <input type="hidden" class="position" value="<?php echo esc_attr( $object->position ); ?>"/>
827
828 </div>
829 <?php
830
831 }
832
833 /**
834 * Creates if the required triggers exists
835 *
836 * @since 2.2.2
837 *
838 * @param stdClass $automation The automation object
839 * @param array $triggers The automation triggers
840 *
841 * @return array
842 */
843 function automatorwp_check_automation_required_triggers( $automation, $triggers ) {
844
845 return apply_filters( 'automatorwp_check_automation_required_triggers', $triggers, $automation );
846
847 }
848
849 /**
850 * Creates if the required actions exists
851 *
852 * @since 1.3.0
853 *
854 * @param stdClass $automation The automation object
855 * @param array $actions The automation actions
856 *
857 * @return array
858 */
859 function automatorwp_check_automation_required_actions( $automation, $actions ) {
860
861 if( $automation->type === 'anonymous' ) {
862
863 $create = false;
864
865 // Check if the first action is the action required for anonymous automations
866 if( ! isset( $actions[0] ) ) {
867 $create = true;
868 }
869
870 if( isset( $actions[0] ) && $actions[0]->type !== 'automatorwp_anonymous_user' ) {
871 $create = true;
872 }
873
874 if( $create ) {
875 ct_setup_table( 'automatorwp_actions' );
876
877 $action_data = array(
878 'automation_id' => $automation->id,
879 'title' => sprintf( __( 'Actions will be run on %1$s', 'automatorwp' ), '{user}' ),
880 'type' => 'automatorwp_anonymous_user',
881 'status' => 'active',
882 'position' => '0',
883 'date' => date( 'Y-m-d H:i:s', current_time( 'timestamp' ) ),
884 );
885
886 // Insert the new action
887 $action_id = ct_insert_object( $action_data );
888
889 if( $action_id ) {
890 $action_data['id'] = $action_id;
891
892 $action_data = (object) $action_data;
893
894 // Prepend the new action at start of the actions list
895 array_unshift( $actions, $action_data );
896 }
897
898 ct_reset_setup_table();
899 }
900
901 }
902
903 return apply_filters( 'automatorwp_check_automation_required_actions', $actions, $automation );
904
905 }
906
907 /**
908 * Renders the trigger/action missing integration edit HTML
909 *
910 * @since 1.1.2
911 *
912 * @param stdClass $object The trigger/action object
913 * @param string $item_type The item type (trigger|action)
914 * @param stdClass $automation The automation object
915 */
916 function automatorwp_automation_missing_integration_item_edit_html( $object, $item_type, $automation ) {
917
918 if( $item_type === 'trigger' ) {
919 $warning_message = __( 'Trigger disabled because plugin associated couldn\'t be found. Please, re-install the plugin associated or remove this trigger.', 'automatorwp' );
920 } else {
921 $warning_message = __( 'Action disabled because plugin associated couldn\'t be found. Please, re-install the plugin associated or remove this action.', 'automatorwp' );
922
923 }
924
925 ?>
926 <div id="automatorwp-item-<?php echo esc_attr( $object->id ); ?>" class="automatorwp-automation-item automatorwp-automation-missing-integration-item automatorwp-<?php echo esc_attr( $item_type ); ?>">
927
928 <div class="automatorwp-automation-item-details">
929 <div class="automatorwp-integration-icon">
930 <img src="<?php echo esc_attr( AUTOMATORWP_URL . 'assets/img/integration-missing.svg' ); ?>" title="<?php echo esc_attr( __( 'Missing plugin', 'automatorwp' ) ); ?>">
931 </div>
932 </div>
933
934 <div class="automatorwp-automation-item-content">
935
936 <div class="automatorwp-automation-item-actions">
937 <div class="automatorwp-automation-item-action automatorwp-automation-item-action-delete" title="<?php echo esc_attr( __( 'Delete', 'automatorwp') ); ?>"><span class="dashicons dashicons-trash"></span></div>
938 </div>
939
940 <div class="automatorwp-integration-label"><?php echo __( 'Missing plugin', 'automatorwp' ); ?></div>
941
942 <div class="automatorwp-automation-item-position" style="<?php echo ( $automation->sequential ? '' : 'display: none;' ); ?>"><?php echo $object->position + 1; ?>.</div>
943 <div class="automatorwp-automation-item-label"><?php echo $object->title; ?></div>
944
945 <div class="automatorwp-notice-warning"><?php echo $warning_message; ?></div>
946
947 <?php
948 /**
949 * After missing integration item label
950 *
951 * @since 1.1.2
952 *
953 * @param stdClass $object The trigger/action object
954 * @param string $item_type The object type (trigger|action)
955 */
956 do_action( 'automatorwp_automation_ui_after_missing_integration_item_label', $object, $item_type ); ?>
957
958 </div>
959
960 <?php // Hidden fields ?>
961 <input type="hidden" class="id" value="<?php echo esc_attr( $object->id ); ?>"/>
962 <input type="hidden" class="type" value="<?php echo esc_attr( $object->type ); ?>"/>
963 <input type="hidden" class="status" value="<?php echo esc_attr( $object->status ); ?>"/>
964 <input type="hidden" class="position" value="<?php echo esc_attr( $object->position ); ?>"/>
965
966 </div>
967 <?php
968
969 }
970
971 /**
972 * Parses the trigger/action edit label
973 *
974 * @since 1.0.0
975 *
976 * @param stdClass $object The trigger object
977 * @param string $item_type The item type (trigger|action)
978 * @param string $context The context this function is executed
979 *
980 * @return string
981 */
982 function automatorwp_parse_automation_item_edit_label( $object, $item_type, $context = 'edit' ) {
983
984 $type_args = automatorwp_automation_item_type_args( $object, $item_type );
985
986 if( ! $type_args ) {
987 return '';
988 }
989
990 /**
991 * Filter to dynamically change the edit label
992 *
993 * @since 1.0.0
994 *
995 * @param string $label The edit label
996 * @param stdClass $object The trigger/action object
997 * @param string $item_type The item type (trigger|action)
998 * @param string $context The context this function is executed
999 * @param array $type_args The type parameters
1000 *
1001 * @return string
1002 */
1003 $label = apply_filters( 'automatorwp_parse_automation_item_edit_label', $type_args['edit_label'], $object, $item_type, $context, $type_args );
1004
1005 return automatorwp_parse_automation_item_label( $object, $item_type, $label, $context );
1006
1007 }
1008
1009 /**
1010 * Parses the trigger/action log label
1011 *
1012 * @since 1.0.0
1013 *
1014 * @param stdClass $object The trigger/action object
1015 * @param string $item_type The item type (trigger|action)
1016 * @param string $context The context this function is executed
1017 *
1018 * @return string
1019 */
1020 function automatorwp_parse_automation_item_log_label( $object, $item_type, $context = 'edit' ) {
1021
1022 $type_args = automatorwp_automation_item_type_args( $object, $item_type );
1023
1024 if( ! $type_args ) {
1025 return '';
1026 }
1027
1028 /**
1029 * Filter to dynamically change the log label
1030 *
1031 * @since 1.0.0
1032 *
1033 * @param string $label The edit label
1034 * @param stdClass $object The trigger/action object
1035 * @param string $item_type The item type (trigger|action)
1036 * @param string $context The context this function is executed
1037 * @param array $type_args The type parameters
1038 *
1039 * @return string
1040 */
1041 $label = apply_filters( 'automatorwp_parse_automation_item_log_label', $type_args['log_label'], $object, $item_type, $context, $type_args );
1042
1043 return automatorwp_parse_automation_item_label( $object, $item_type, $label, $context );
1044
1045 }
1046
1047 /**
1048 * Parses the trigger/action label given
1049 *
1050 * @since 1.0.0
1051 *
1052 * @param stdClass $object The trigger object
1053 * @param string $item_type The item type (trigger|action)
1054 * @param string $label The label to parse
1055 * @param string $context The context this function is executed
1056 *
1057 * @return string
1058 */
1059 function automatorwp_parse_automation_item_label( $object, $item_type, $label, $context = 'edit' ) {
1060
1061 $type_args = automatorwp_automation_item_type_args( $object, $item_type );
1062
1063 if( ! $type_args ) {
1064 return '';
1065 }
1066
1067 $replacements = array();
1068
1069 foreach( $type_args['options'] as $option => $args ) {
1070 $replacements['{' . $option . '}'] = automatorwp_get_automation_item_option_replacement( $object, $item_type, $option, $context );
1071 }
1072
1073 /**
1074 * Trigger/action label replacements
1075 *
1076 * @since 1.0.0
1077 *
1078 * @param array $replacements The replacements to apply
1079 * @param stdClass $object The trigger object
1080 * @param string $item_type The item type (trigger|action)
1081 * @param string $label The label to parse
1082 * @param string $context The context this function is executed
1083 *
1084 * @return array
1085 */
1086 $replacements = apply_filters( 'automatorwp_parse_automation_item_label_replacements', $replacements, $object, $item_type, $label, $context );
1087
1088 $tags = array_keys( $replacements );
1089
1090 $label_parsed = str_replace( $tags, $replacements, $label );
1091
1092 /**
1093 * Trigger/action label parsed
1094 *
1095 * @since 1.0.0
1096 *
1097 * @param string $label_parsed The label parsed
1098 * @param stdClass $object The trigger object
1099 * @param string $item_type The item type (trigger|action)
1100 * @param string $label The originallabel to parse
1101 * @param string $context The context this function is executed
1102 * @param array $tags The tags applied
1103 * @param array $replacements The replacements applied
1104 *
1105 * @return string
1106 */
1107 return apply_filters( 'automatorwp_parse_automation_item_label', $label_parsed, $object, $item_type, $label, $context, $tags, $replacements );
1108
1109 }
1110
1111 /**
1112 * Get the option replacement
1113 *
1114 * @since 1.0.0
1115 *
1116 * @param stdClass $object The trigger/action object
1117 * @param string $item_type The item type (trigger|action)
1118 * @param string $option The option name
1119 * @param string $context The context this function is executed
1120 *
1121 * @return string
1122 */
1123 function automatorwp_get_automation_item_option_replacement( $object, $item_type, $option, $context = 'edit' ) {
1124
1125 global $automatorwp_event;
1126
1127 // Check item type
1128 if( ! in_array( $item_type, array( 'trigger', 'action' ) ) ) {
1129 return false;
1130 }
1131
1132 // Check type args
1133 $type_args = automatorwp_automation_item_type_args( $object, $item_type );
1134
1135 if( ! $type_args ) {
1136 return '';
1137 }
1138
1139 // Bail if this type hasn't any option
1140 if( ! isset( $type_args['options'][$option] ) ) {
1141 return '';
1142 }
1143
1144 $option_args = $type_args['options'][$option];
1145
1146 $field_id = ( isset( $option_args['from'] ) ? $option_args['from'] : '' );
1147 $value = '';
1148
1149 // If not isset the from field, try to get a default value
1150 if( ! isset( $option_args['fields'][$field_id] ) ) {
1151
1152 if( isset( $option_args['default'] ) && ! empty( $option_args['default'] ) ) {
1153 $value = $option_args['default'];
1154 }
1155
1156 } else {
1157
1158 ct_setup_table( "automatorwp_{$item_type}s" );
1159
1160 $field = $option_args['fields'][$field_id];
1161 $value = ct_get_object_meta( $object->id, $field_id, true );
1162
1163 if( ( $value === '' || is_null( $value ) ) && isset( $field['default'] ) ) {
1164 $value = $field['default'];
1165 }
1166
1167 // Ensure the field value and escaped_value keys
1168 $field['object_id'] = $object->id;
1169 $field['value'] = $value;
1170 $field['escaped_value'] = $value;
1171
1172 // Select field
1173 if( in_array( $field['type'], array( 'select', 'automatorwp_select', 'automatorwp_select_filter' ) ) ) {
1174
1175 // Get the field options
1176 $field_options = automatorwp_get_field_options( $field );
1177
1178 // Try to get the displayed value
1179 $found = automatorwp_get_array_key_value( $value, $field_options );
1180
1181 if( $found ) {
1182 $value = $found;
1183 }
1184 }
1185
1186 // Array values
1187 if( is_array( $value ) ) {
1188
1189 // Get the field options
1190 $field_options = automatorwp_get_field_options( $field );
1191
1192 // Replace values by the options label
1193 if( count( $field_options ) ) {
1194 foreach( $value as $i => $v ) {
1195 // Try to get the displayed value
1196 $found = automatorwp_get_array_key_value( $v, $field_options );
1197
1198 if( isset( $found ) ) {
1199 $value[$i] = $found;
1200 }
1201 }
1202 }
1203
1204 /* translators: The ampersand character who represents the word "and" */
1205 $and = __( '&', 'automatorwp' );
1206 $value = automatorwp_implode_array( ', ', " {$and} ", $value );
1207 }
1208
1209 // Fallback to default option if exists
1210 if( ( $value === '' || is_null( $value ) ) && isset( $option_args['default'] ) && ! empty( $option_args['default'] ) ) {
1211 $value = $option_args['default'];
1212 }
1213
1214 ct_reset_setup_table();
1215
1216 }
1217
1218 /**
1219 * Filters the option value for replacement on labels
1220 *
1221 * @since 1.0.0
1222 *
1223 * @param string $value The option value
1224 * @param stdClass $object The trigger/action object
1225 * @param string $item_type The item type (trigger|action)
1226 * @param string $option The option name
1227 * @param string $context The context this function is executed
1228 *
1229 * @return string
1230 */
1231 $value = apply_filters( 'automatorwp_get_automation_item_option_replacement', $value, $object, $item_type, $option, $context );
1232
1233 if( $context === 'edit' ) {
1234
1235 $option_class = 'button button-compact button-primary';
1236
1237 if( $object->type === 'filter' ) {
1238 $option_class = 'button button-compact';
1239 }
1240
1241 /**
1242 * Filters the option button class
1243 *
1244 * @since 1.2.4
1245 *
1246 * @param string $option_class The option class
1247 * @param stdClass $object The trigger/action object
1248 * @param string $item_type The item type (trigger|action)
1249 * @param string $option The option name
1250 * @param string $context The context this function is executed
1251 *
1252 * @return string
1253 */
1254 $option_class = apply_filters( 'automatorwp_get_automation_item_option_button_class', $option_class, $object, $item_type, $option, $context );
1255
1256 $value = '<span class="' . esc_attr__( $option_class ) . ' automatorwp-option" data-option="' . $option . '">' . $value . '</span>';
1257 } else if( $context === 'view' ) {
1258
1259 $automation = automatorwp_get_trigger_automation( $object->id );
1260
1261 if( is_object( $automation ) ) {
1262
1263 $user_id = ( isset( $automatorwp_event['user_id'] ) ? $automatorwp_event['user_id'] : 0 );
1264
1265 $value = automatorwp_parse_automation_tags( $automation->id, $user_id, $value );
1266 }
1267
1268
1269 }
1270
1271 return $value;
1272
1273 }
1274
1275 /**
1276 * Gets a CMB2 object from a trigger/action option
1277 *
1278 * @since 1.0.0
1279 *
1280 * @param stdClass $object The trigger/action object
1281 * @param string $item_type The item type (trigger|action)
1282 * @param string $option Option form to render
1283 * @param stdClass $automation The automation object
1284 *
1285 * @return CMB2|false
1286 */
1287 function automatorwp_get_automation_item_option_form( $object, $item_type, $option, $automation ) {
1288
1289 // Check item type
1290 if( ! in_array( $item_type, array( 'trigger', 'action' ) ) ) {
1291 return false;
1292 }
1293
1294 // Check type args
1295 $type_args = automatorwp_automation_item_type_args( $object, $item_type );
1296
1297 if( ! $type_args ) {
1298 return false;
1299 }
1300
1301 // Bail if this type hasn't any option
1302 if( ! isset( $type_args['options'][$option] ) ) {
1303 return false;
1304 }
1305
1306 $args = $type_args['options'][$option];
1307
1308 /**
1309 * Filter to override the trigger/action option fields
1310 *
1311 * @since 1.0.0
1312 *
1313 * @param array $fields The option fields
1314 * @param stdClass $object The trigger/action object
1315 * @param string $item_type The item type (trigger|action)
1316 * @param string $option Option form to render
1317 * @param stdClass $automation The automation object
1318 *
1319 * @return array
1320 */
1321 $fields = apply_filters( 'automatorwp_get_automation_item_option_form_fields', $args['fields'], $object, $item_type, $option, $automation );
1322
1323 ct_setup_table( "automatorwp_{$item_type}s" );
1324
1325 // Setup the CMB2 form
1326 $cmb2 = new CMB2( array(
1327 'id' => $option .'_form',
1328 'object_types' => array( 'automatorwp_triggers', 'automatorwp_actions' ),
1329 'classes' => 'automatorwp-form automatorwp-option-form',
1330 'hookup' => false,
1331 ), $object->id );
1332
1333 // Setup the options fields
1334 foreach ( $fields as $field_id => $field ) {
1335
1336 $field['id'] = $field_id;
1337
1338 if( $field['type'] === 'group' ) {
1339 // Group fields
1340
1341 // Setup field arguments on each group field
1342 foreach ( $field['fields'] as $field_group_id => $field_group ) {
1343
1344 $field_group['id'] = $field_group_id;
1345
1346 $field['fields'][$field_group_id] = automatorwp_automation_item_option_field_args( $object, $item_type, $option, $automation, $field_id . '[' .$field_group_id . ']', $field_group );
1347
1348 }
1349
1350 } else {
1351 // Single fields
1352
1353 $field = automatorwp_automation_item_option_field_args( $object, $item_type, $option, $automation, $field_id, $field );
1354
1355 }
1356
1357 // Add the field to the form
1358 $cmb2->add_field( $field );
1359
1360 }
1361
1362 ct_reset_setup_table();
1363
1364 return $cmb2;
1365
1366 }
1367
1368 /**
1369 * Gets a CMB2 object from a trigger option
1370 *
1371 * @since 1.0.0
1372 *
1373 * @param stdClass $object The trigger/action object
1374 * @param string $item_type The item type (trigger|action)
1375 * @param string $option Option form to render
1376 * @param stdClass $automation The automation object
1377 * @param string $field_id The field ID
1378 * @param array $field The field parameters
1379 *
1380 * @return array
1381 */
1382 function automatorwp_automation_item_option_field_args( $object, $item_type, $option, $automation, $field_id, $field ) {
1383
1384 $repeatable = ( isset( $field['repeatable'] ) && $field['repeatable'] === true );
1385
1386 // Prevent to render field names to avoid conflicts on the main form
1387 $field['attributes']['name'] = '';
1388
1389 // Update id attribute to avoid id collisions
1390 $field['attributes']['id'] = $field_id . '-' . $object->id;
1391 $field['attributes']['data-option'] = $field_id . ( $repeatable ? '[]' : '' );
1392
1393 // Setup the fields tags selector
1394
1395 // Set a specific sanitization callback for fields that support HTML and URLs
1396 if( in_array( $field['type'], array( 'textarea', 'wysiwyg', 'oembed', 'file' ) ) ) {
1397 $field['sanitization_cb'] = 'automatorwp_textarea_sanitization_cb';
1398 }
1399
1400 // Check if field type is compatible with tags selector
1401 if( in_array( $field['type'], array( 'text', 'textarea', 'wysiwyg', 'file' ) ) ) {
1402 $field['after_field'] = automatorwp_get_tags_selector_html( $automation, $object, $item_type );
1403 }
1404
1405 // If field is required, update its label with the required mark
1406 if( isset( $field['required'] ) && $field['required'] && isset( $field['name'] ) ) {
1407 $field['name'] .= '<span class="automatorwp-field-required">*</span>';
1408 }
1409
1410 /**
1411 * Filter available to process custom field parameters
1412 *
1413 * @since 1.0.0
1414 *
1415 * @param array $field The field parameters
1416 * @param stdClass $object The trigger/action object
1417 * @param string $item_type The item type (trigger|action)
1418 * @param string $option Option form to render
1419 * @param stdClass $automation The automation object
1420 * @param string $field_id The field ID
1421 *
1422 * @return array
1423 */
1424 return apply_filters( 'automatorwp_automation_item_option_field_args', $field, $object, $item_type, $option, $automation, $field_id );
1425
1426 }