/** * 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') ? '¬es=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 }