/**
  * Provides a way for a step to process a token action before anything else. If feedback is returned it is displayed and nothing else with be rendered.
  *
  * @param $action
  * @param $token
  * @param $form
  * @param $entry
  *
  * @return bool|string|void|WP_Error
  */
 public function maybe_process_token_action($action, $token, $form, $entry)
 {
     $feedback = parent::maybe_process_token_action($action, $token, $form, $entry);
     if ($feedback) {
         return $feedback;
     }
     if (!in_array($action, array('approve', 'reject'))) {
         return false;
     }
     $entry_id = rgars($token, 'scopes/entry_id');
     if (empty($entry_id) || $entry_id != $entry['id']) {
         return new WP_Error('incorrect_entry_id', esc_html__('Error: incorrect entry.', 'gravityflow'));
     }
     $step_id = rgars($token, 'scopes/step_id');
     if (empty($step_id) || $step_id != $this->get_id()) {
         return new WP_Error('step_already_processed', esc_html__('Error: step already processed.', 'gravityflow'));
     }
     $assignee_key = sanitize_text_field($token['sub']);
     $assignee = new Gravity_Flow_Assignee($assignee_key, $this);
     $new_status = false;
     switch ($token['scopes']['action']) {
         case 'approve':
             $new_status = 'approved';
             break;
         case 'reject':
             $new_status = 'rejected';
             break;
     }
     $feedback = $this->process_assignee_status($assignee, $new_status, $form);
     return $feedback;
 }
 /**
  * @param Gravity_Flow_Step $step
  *
  * @return array
  */
 function get_assignees_array($step)
 {
     $assignees = $step ? $step->get_assignees() : array();
     $response = array();
     foreach ($assignees as $assignee) {
         $response[] = $this->get_assignee_array($assignee);
     }
     return $response;
 }
 /**
  * @param int $form_id
  * @param Gravity_Flow_Step $current_step
  * @param array $steps
  *
  * @return bool|Gravity_Flow_Step
  */
 public function get_next_step_in_list($form, $current_step, $entry, $steps = array())
 {
     $form_id = absint($form['id']);
     if (empty($steps)) {
         $steps = $this->get_steps($form_id, $entry);
     }
     $current_step_id = $current_step->get_id();
     $next_step = false;
     foreach ($steps as $step) {
         if ($next_step) {
             if ($step->is_active() && $step->is_condition_met($form)) {
                 return $step;
             }
         }
         if ($next_step == false && $current_step_id == $step->get_id()) {
             $next_step = true;
         }
     }
     return false;
 }
 /**
  * Replace the workflow_note merge tag and the tags in the base step class.
  *
  * @param string $text The text with merge tags.
  * @param Gravity_Flow_Assignee $assignee
  *
  * @return mixed
  */
 public function replace_variables($text, $assignee)
 {
     $text = parent::replace_variables($text, $assignee);
     $comment = rgpost('gravityflow_note');
     $text = str_replace('{workflow_note}', $comment, $text);
     return $text;
 }
    /**
     * @param $form
     * @param $entry
     * @param null|Gravity_Flow_Step $current_step
     * @param array $args
     */
    public static function entry_detail($form, $entry, $current_step = null, $args = array())
    {
        $form_id = absint($form['id']);
        $form = apply_filters('gform_pre_render', $form);
        $form = apply_filters('gform_pre_render_' . $form_id, $form);
        $defaults = array('display_empty_fields' => true, 'check_permissions' => true, 'show_header' => true, 'timeline' => true, 'display_instructions' => true);
        $args = array_merge($defaults, $args);
        $display_empty_fields = (bool) $args['display_empty_fields'];
        $check_view_entry_permissions = (bool) $args['check_permissions'];
        $show_header = (bool) $args['show_header'];
        $show_timeline = (bool) $args['timeline'];
        $display_instructions = (bool) $args['display_instructions'];
        ?>

		<script type="text/javascript">

			if ( typeof ajaxurl == 'undefined' ) {
				ajaxurl = <?php 
        echo json_encode(admin_url('admin-ajax.php'));
        ?>
;
			}

			function DeleteFile(leadId, fieldId, deleteButton) {
				if (confirm(<?php 
        echo json_encode(__("Would you like to delete this file? 'Cancel' to stop. 'OK' to delete", 'gravityflow'));
        ?>
)) {
					var fileIndex = jQuery(deleteButton).parent().index();
					var mysack = new sack("<?php 
        echo admin_url('admin-ajax.php');
        ?>
");
					mysack.execute = 1;
					mysack.method = 'POST';
					mysack.setVar("action", "rg_delete_file");
					mysack.setVar("rg_delete_file", "<?php 
        echo wp_create_nonce('rg_delete_file');
        ?>
");
					mysack.setVar("lead_id", leadId);
					mysack.setVar("field_id", fieldId);
					mysack.setVar("file_index", fileIndex);
					mysack.onError = function () {
						alert(<?php 
        echo json_encode(__('Ajax error while deleting file.', 'gravityflow'));
        ?>
)
					};
					mysack.runAJAX();

					return true;
				}
			}

			function EndDeleteFile(fieldId, fileIndex) {
				var previewFileSelector = "#preview_existing_files_" + fieldId + " .ginput_preview";
				var $previewFiles = jQuery(previewFileSelector);
				var rr = $previewFiles.eq(fileIndex);
				$previewFiles.eq(fileIndex).remove();
				var $visiblePreviewFields = jQuery(previewFileSelector);
				if ($visiblePreviewFields.length == 0) {
					jQuery('#preview_' + fieldId).hide();
					jQuery('#upload_' + fieldId).show('slow');
				}
			}

			function ToggleShowEmptyFields() {
				if (jQuery("#gentry_display_empty_fields").is(":checked")) {
					createCookie("gf_display_empty_fields", true, 10000);
					document.location = document.location.href;
				}
				else {
					eraseCookie("gf_display_empty_fields");
					document.location = document.location.href;
				}
			}

			function createCookie(name, value, days) {
				if (days) {
					var date = new Date();
					date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
					var expires = "; expires=" + date.toGMTString();
				}
				else var expires = "";
				document.cookie = name + "=" + value + expires + "; path=/";
			}

			function eraseCookie(name) {
				createCookie(name, "", -1);
			}


		</script>

		<div class="wrap gf_entry_wrap gravityflow_workflow_wrap gravityflow_workflow_detail">

			<?php 
        if ($show_header) {
            ?>
			<h2 class="gf_admin_page_title">
				<img width="45" height="22" src="<?php 
            echo gravity_flow()->get_base_url();
            ?>
/images/gravityflow-icon-blue-grad.svg" style="margin-right:5px;"/>
				<span><?php 
            echo esc_html__('Workflow Entry #', 'gravityflow') . absint($entry['id']);
            ?>
</span><span class="gf_admin_page_subtitle"><span class='gf_admin_page_formname'><?php 
            esc_html_e('Workflow Form', 'gravityflow');
            ?>
: <?php 
            esc_html_e($form['title']);
            ?>
</span></span>
			</h2>

			<div id="gf_form_toolbar">
				<ul id="gf_form_toolbar_links">

					<?php 
            $menu_items = gravity_flow()->get_toolbar_menu_items();
            echo GFForms::format_toolbar_menu_items($menu_items);
            ?>
				</ul>
			</div>

			<?php 
        }
        if ($check_view_entry_permissions) {
            // Check view permissions
            global $current_user;
            if ($entry['created_by'] != $current_user->ID) {
                $user_status = false;
                if ($current_step) {
                    $user_status = $current_step->get_user_status();
                    if (!$user_status) {
                        $user_roles = gravity_flow()->get_user_roles();
                        foreach ($user_roles as $user_role) {
                            $user_status = $current_step->get_role_status($user_role);
                        }
                    }
                }
                $full_access = GFAPI::current_user_can_any(array('gform_full_access', 'gravityflow_status_view_all'));
                if (!($user_status || $full_access)) {
                    $permission_denied_message = esc_attr__("You don't have permission to view this entry.", 'gravityflow');
                    $permission_denied_message = apply_filters('gravityflow_permission_denied_message_entry_detail', $permission_denied_message, $current_step);
                    echo $permission_denied_message;
                    return;
                }
            }
        }
        $url = remove_query_arg(array('gworkflow_token', 'new_status'));
        ?>
			<div class="gform_wrapper">
				<form method="post" id="entry_form" enctype='multipart/form-data' action="<?php 
        echo esc_url($url);
        ?>
">
					<?php 
        wp_nonce_field('gforms_save_entry', 'gforms_save_entry');
        ?>
					<div id="poststuff" class="metabox-holder has-right-sidebar">

						<div id="side-info-column" class="inner-sidebar">
							<?php 
        gravity_flow()->workflow_entry_detail_status_box($form, $entry, $current_step);
        if (is_user_logged_in() || $check_view_entry_permissions) {
            ?>

							<!-- begin print button -->
							<div class="detail-view-print">
								<a href="javascript:;"
								   onclick="var notes_qs = jQuery('#gform_print_notes').is(':checked') ? '&notes=1' : ''; var url='<?php 
            echo admin_url('admin-ajax.php');
            ?>
?action=gravityflow_print_entries&lid=<?php 
            echo absint($entry['id']);
            ?>
' + notes_qs; printPage(url);"
								   class="button"><?php 
            esc_html_e('Print', 'gravityflow');
            ?>
</a>

									<?php 
            if ($show_timeline) {
                ?>

									<input type="checkbox" name="print_notes" value="print_notes" checked="checked"
									       id="gform_print_notes"/>
									<label for="print_notes"><?php 
                esc_html_e('include timeline', 'gravityflow');
                ?>
</label>
									<?php 
            }
            ?>

							</div>
							<!-- end print button -->

							<?php 
        }
        ?>
						</div>

						<div id="post-body" class="has-sidebar">
							<div id="post-body-content" class="has-sidebar-content">
								<?php 
        do_action('gravityflow_entry_detail_content_before', $form, $entry);
        $editable_fields = array();
        if ($current_step) {
            $current_user_status = $current_step->get_user_status();
            $current_role_status = false;
            if ($current_step) {
                foreach (gravity_flow()->get_user_roles() as $role) {
                    $current_role_status = $current_step->get_role_status($role);
                    if ($current_role_status == 'pending') {
                        break;
                    }
                }
            }
            $can_update = $current_step && ($current_user_status == 'pending' || $current_role_status == 'pending');
            $editable_fields = $can_update ? $current_step->get_editable_fields() : array();
            if ($can_update && $display_instructions && $current_step->instructionsEnable) {
                $instructions = $current_step->instructionsValue;
                $instructions = GFCommon::replace_variables($instructions, $form, $entry, false, true, true);
                $instructions = $current_step->replace_variables($instructions, null);
                $instructions = wp_kses_post($instructions);
                ?>
										<div class="postbox">
											<div class="inside">
												<?php 
                echo $instructions;
                ?>
											</div>

										</div>

										<?php 
            }
        }
        self::entry_detail_grid($form, $entry, $display_empty_fields, $editable_fields, $current_step);
        do_action('gravityflow_entry_detail', $form, $entry);
        if ($show_timeline) {
            ?>
									<div class="postbox">
										<h3>
											<label for="name"><?php 
            esc_html_e('Timeline', 'gravityflow');
            ?>
</label>
										</h3>

										<div class="inside">
											<?php 
            self::timeline($entry, $form);
            ?>
										</div>

									</div>

								<?php 
        }
        ?>

							</div>
						</div>

					</div>

				</form>
			</div>
		</div>
		<?php 
    }